1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "webkit/browser/fileapi/dragged_file_util.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/file_util.h" 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_context.h" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_operation_context.h" 1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_url.h" 1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/isolated_context.h" 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/native_file_util.h" 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/common/blob/shareable_file_reference.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::PlatformFileError; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::PlatformFileInfo; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace fileapi { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef IsolatedContext::MountPointInfo FileInfo; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Simply enumerate each path from a given fileinfo set. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to enumerate top-level paths of an isolated filesystem. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SetFileEnumerator : public FileSystemFileUtil::AbstractFileEnumerator { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit SetFileEnumerator(const std::vector<FileInfo>& files) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : files_(files) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_iter_ = files_.begin(); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SetFileEnumerator() {} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AbstractFileEnumerator overrides. 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual base::FilePath Next() OVERRIDE { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file_iter_ == files_.end()) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::FilePath(); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath platform_file = (file_iter_++)->path; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NativeFileUtil::GetFileInfo(platform_file, &file_info_); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return platform_file; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int64 Size() OVERRIDE { return file_info_.size; } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsDirectory() OVERRIDE { return file_info_.is_directory; } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual base::Time LastModifiedTime() OVERRIDE { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return file_info_.last_modified; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FileInfo> files_; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FileInfo>::const_iterator file_iter_; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFileInfo file_info_; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------- 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DraggedFileUtil::DraggedFileUtil() {} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PlatformFileError DraggedFileUtil::GetFileInfo( 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformFileInfo* file_info, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* platform_path) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(file_info); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string filesystem_id; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(url.is_valid()); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url.path().empty()) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The root directory case. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For now we leave three time fields (modified/accessed/creation time) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL as it is not really clear what to be set for this virtual directory. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kinuko): Maybe we want to set the time when this filesystem is 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // created (i.e. when the files/directories are dropped). 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_info->is_directory = true; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_info->is_symbolic_link = false; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_info->size = 0; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::PLATFORM_FILE_OK; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFileError error = 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NativeFileUtil::GetFileInfo(url.path(), file_info); 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (base::IsLink(url.path()) && !base::FilePath().IsParent(url.path())) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't follow symlinks unless it's the one that are selected by the user. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::PLATFORM_FILE_ERROR_NOT_FOUND; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error == base::PLATFORM_FILE_OK) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *platform_path = url.path(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DraggedFileUtil::CreateFileEnumerator( 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const FileSystemURL& root) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(root.is_valid()); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!root.path().empty()) 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return LocalFileUtil::CreateFileEnumerator(context, root); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Root path case. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FileInfo> toplevels; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IsolatedContext::GetInstance()->GetDraggedFileInfo( 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.filesystem_id(), &toplevels); 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return scoped_ptr<AbstractFileEnumerator>(new SetFileEnumerator(toplevels)); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace fileapi 109