1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file. 4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/extensions/file_manager/private_api_util.h" 6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string> 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/files/file_path.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop.h" 11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/drive.pb.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/drive_integration_service.h" 13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_errors.h" 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_interface.h" 15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h" 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/app_id.h" 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/fileapi_util.h" 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/chromeos/file_manager/filesystem_api_util.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/file_manager/path_util.h" 206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/chromeos/file_manager/snapshot_manager.h" 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/volume_manager.h" 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/fileapi/file_system_backend.h" 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/extensions/api/file_browser_private.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/child_process_security_policy.h" 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/shell_dialogs/selected_file_info.h" 27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_context.h" 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_url.h" 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace file_browser_private = extensions::api::file_browser_private; 31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace file_manager { 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace util { 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace { 35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// The struct is used for GetSelectedFileInfo(). 37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)struct GetSelectedFileInfoParams { 383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch GetSelectedFileInfoLocalPathOption local_path_option; 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetSelectedFileInfoCallback callback; 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::vector<base::FilePath> file_paths; 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::vector<ui::SelectedFileInfo> selected_files; 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// The callback type for GetFileNativeLocalPathFor{Opening,Saving}. It receives 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// the resolved local path when successful, and receives empty path for failure. 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)typedef base::Callback<void(const base::FilePath&)> LocalPathCallback; 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Converts a callback from Drive file system to LocalPathCallback. 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void OnDriveGetFile(const base::FilePath& path, 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const LocalPathCallback& callback, 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) drive::FileError error, 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::FilePath& local_file_path, 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<drive::ResourceEntry> entry) { 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (error != drive::FILE_ERROR_OK) 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DLOG(ERROR) << "Failed to get " << path.value() << " with: " << error; 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback.Run(local_file_path); 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Gets a resolved local file path of a non native |path| for file opening. 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void GetFileNativeLocalPathForOpening(Profile* profile, 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::FilePath& path, 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const LocalPathCallback& callback) { 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (drive::util::IsUnderDriveMountPoint(path)) { 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) drive::FileSystemInterface* file_system = 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) drive::util::GetFileSystemByProfile(profile); 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!file_system) { 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DLOG(ERROR) << "Drive file selected while disabled: " << path.value(); 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback.Run(base::FilePath()); 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) file_system->GetFile(drive::util::ExtractDrivePath(path), 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&OnDriveGetFile, path, callback)); 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) VolumeManager::Get(profile)->snapshot_manager()->CreateManagedSnapshot( 776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) path, callback); 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Gets a resolved local file path of a non native |path| for file saving. 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void GetFileNativeLocalPathForSaving(Profile* profile, 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::FilePath& path, 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const LocalPathCallback& callback) { 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (drive::util::IsUnderDriveMountPoint(path)) { 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) drive::FileSystemInterface* file_system = 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) drive::util::GetFileSystemByProfile(profile); 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!file_system) { 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DLOG(ERROR) << "Drive file selected while disabled: " << path.value(); 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback.Run(base::FilePath()); 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) file_system->GetFileForSaving(drive::util::ExtractDrivePath(path), 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&OnDriveGetFile, path, callback)); 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(kinaba): For now, the only writable non-local volume is Drive. 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NOTREACHED(); 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback.Run(base::FilePath()); 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Forward declarations of helper functions for GetSelectedFileInfo(). 103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ContinueGetSelectedFileInfo(Profile* profile, 104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<GetSelectedFileInfoParams> params, 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::FilePath& local_file_path); 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Part of GetSelectedFileInfo(). 108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void GetSelectedFileInfoInternal(Profile* profile, 109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<GetSelectedFileInfoParams> params) { 110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(profile); 111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (size_t i = params->selected_files.size(); 113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) i < params->file_paths.size(); ++i) { 114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::FilePath& file_path = params->file_paths[i]; 115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (file_manager::util::IsUnderNonNativeLocalPath(profile, file_path)) { 117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // When the caller of the select file dialog wants local file paths, and 118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // the selected path does not point to a native local path (e.g., Drive, 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // MTP, or provided file system), we should resolve the path. 120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch switch (params->local_path_option) { 121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case NO_LOCAL_PATH_RESOLUTION: 122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) break; // No special handling needed. 123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case NEED_LOCAL_PATH_FOR_OPENING: 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetFileNativeLocalPathForOpening( 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile, 126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) file_path, 127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(&ContinueGetSelectedFileInfo, 128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch profile, 129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Passed(¶ms))); 130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; // Remaining work is done in ContinueGetSelectedFileInfo. 131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case NEED_LOCAL_PATH_FOR_SAVING: 132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetFileNativeLocalPathForSaving( 133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) profile, 134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) file_path, 135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(&ContinueGetSelectedFileInfo, 136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch profile, 137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Passed(¶ms))); 138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; // Remaining work is done in ContinueGetSelectedFileInfo. 139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) params->selected_files.push_back( 142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ui::SelectedFileInfo(file_path, base::FilePath())); 143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params->callback.Run(params->selected_files); 145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Part of GetSelectedFileInfo(). 148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ContinueGetSelectedFileInfo(Profile* profile, 149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<GetSelectedFileInfoParams> params, 150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::FilePath& local_path) { 151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const int index = params->selected_files.size(); 152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::FilePath& file_path = params->file_paths[index]; 153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params->selected_files.push_back(ui::SelectedFileInfo(file_path, local_path)); 154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetSelectedFileInfoInternal(profile, params.Pass()); 155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace 158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void VolumeInfoToVolumeMetadata( 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Profile* profile, 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const VolumeInfo& volume_info, 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_browser_private::VolumeMetadata* volume_metadata) { 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(volume_metadata); 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) volume_metadata->volume_id = volume_info.volume_id; 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(kinaba): fill appropriate information once multi-profile support is 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // implemented. 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) volume_metadata->profile.display_name = profile->GetProfileName(); 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) volume_metadata->profile.is_current_profile = true; 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!volume_info.source_path.empty()) { 1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->source_path.reset( 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new std::string(volume_info.source_path.AsUTF8Unsafe())); 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (volume_info.type == VOLUME_TYPE_PROVIDED) { 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) volume_metadata->extension_id.reset( 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new std::string(volume_info.extension_id)); 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) volume_metadata->file_system_id.reset( 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new std::string(volume_info.file_system_id)); 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) volume_metadata->volume_label.reset( 186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new std::string(volume_info.volume_label)); 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (volume_info.type) { 18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case VOLUME_TYPE_GOOGLE_DRIVE: 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->volume_type = 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_browser_private::VOLUME_TYPE_DRIVE; 1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case VOLUME_TYPE_DOWNLOADS_DIRECTORY: 1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->volume_type = 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_browser_private::VOLUME_TYPE_DOWNLOADS; 1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case VOLUME_TYPE_REMOVABLE_DISK_PARTITION: 1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->volume_type = 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_browser_private::VOLUME_TYPE_REMOVABLE; 2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case VOLUME_TYPE_MOUNTED_ARCHIVE_FILE: 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) volume_metadata->volume_type = file_browser_private::VOLUME_TYPE_ARCHIVE; 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case VOLUME_TYPE_CLOUD_DEVICE: 2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->volume_type = 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_browser_private::VOLUME_TYPE_CLOUD_DEVICE; 2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch case VOLUME_TYPE_PROVIDED: 209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch volume_metadata->volume_type = file_browser_private::VOLUME_TYPE_PROVIDED; 210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch break; 211e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch case VOLUME_TYPE_MTP: 212e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch volume_metadata->volume_type = file_browser_private::VOLUME_TYPE_MTP; 213e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch break; 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case VOLUME_TYPE_TESTING: 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) volume_metadata->volume_type = 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) file_browser_private::VOLUME_TYPE_TESTING; 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case NUM_VOLUME_TYPE: 219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Fill device_type iff the volume is removable partition. 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (volume_info.type == VOLUME_TYPE_REMOVABLE_DISK_PARTITION) { 2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (volume_info.device_type) { 2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::DEVICE_TYPE_UNKNOWN: 2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->device_type = 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_browser_private::DEVICE_TYPE_UNKNOWN; 2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::DEVICE_TYPE_USB: 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) volume_metadata->device_type = file_browser_private::DEVICE_TYPE_USB; 2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::DEVICE_TYPE_SD: 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) volume_metadata->device_type = file_browser_private::DEVICE_TYPE_SD; 2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::DEVICE_TYPE_OPTICAL_DISC: 2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::DEVICE_TYPE_DVD: 2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->device_type = 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_browser_private::DEVICE_TYPE_OPTICAL; 2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::DEVICE_TYPE_MOBILE: 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) volume_metadata->device_type = file_browser_private::DEVICE_TYPE_MOBILE; 2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) volume_metadata->device_path.reset( 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new std::string(volume_info.system_path_prefix.AsUTF8Unsafe())); 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) volume_metadata->is_parent_device.reset( 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new bool(volume_info.is_parent)); 2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->device_type = 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_browser_private::DEVICE_TYPE_NONE; 2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->is_read_only = volume_info.is_read_only; 2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (volume_info.mount_condition) { 2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::disks::MOUNT_CONDITION_NONE: 2584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->mount_condition = 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_browser_private::MOUNT_CONDITION_NONE; 2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::disks::MOUNT_CONDITION_UNKNOWN_FILESYSTEM: 2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->mount_condition = 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_browser_private::MOUNT_CONDITION_UNKNOWN; 2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::disks::MOUNT_CONDITION_UNSUPPORTED_FILESYSTEM: 2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->mount_condition = 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_browser_private::MOUNT_CONDITION_UNSUPPORTED; 2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::FilePath GetLocalPathFromURL(content::RenderViewHost* render_view_host, 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Profile* profile, 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url) { 275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(render_view_host); 276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(profile); 277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<fileapi::FileSystemContext> file_system_context = 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) util::GetFileSystemContextForRenderViewHost(profile, render_view_host); 280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const fileapi::FileSystemURL filesystem_url( 282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) file_system_context->CrackURL(url)); 283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath path; 284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!chromeos::FileSystemBackend::CanHandleURL(filesystem_url)) 285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return base::FilePath(); 286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return filesystem_url.path(); 287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 289a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void GetSelectedFileInfo(content::RenderViewHost* render_view_host, 290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) Profile* profile, 291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::vector<GURL>& file_urls, 2923240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch GetSelectedFileInfoLocalPathOption local_path_option, 293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetSelectedFileInfoCallback callback) { 294a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(render_view_host); 295a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(profile); 296a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 297a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<GetSelectedFileInfoParams> params(new GetSelectedFileInfoParams); 2983240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch params->local_path_option = local_path_option; 299a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params->callback = callback; 300a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 301a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (size_t i = 0; i < file_urls.size(); ++i) { 302a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const GURL& file_url = file_urls[i]; 303a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::FilePath path = GetLocalPathFromURL( 304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) render_view_host, profile, file_url); 305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!path.empty()) { 306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DVLOG(1) << "Selected: file path: " << path.value(); 307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params->file_paths.push_back(path); 308a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoop::current()->PostTask( 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FROM_HERE, 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&GetSelectedFileInfoInternal, profile, base::Passed(¶ms))); 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SetupProfileFileAccessPermissions(int render_view_process_id, 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Profile* profile) { 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath paths[] = { 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drive::util::GetDriveMountPointPath(profile), 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) util::GetDownloadsFolderForProfile(profile), 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < arraysize(paths); ++i) { 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::ChildProcessSecurityPolicy::GetInstance( 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) )->GrantCreateReadWriteFile(render_view_process_id, paths[i]); 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)drive::EventLogger* GetLogger(Profile* profile) { 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drive::DriveIntegrationService* service = 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drive::DriveIntegrationServiceFactory::FindForProfileRegardlessOfStates( 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile); 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return service ? service->event_logger() : NULL; 333a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 334a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 335a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace util 336a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace file_manager 337