private_api_util.cc revision f2477e01787aa58f445919b809d89e252beef54f
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) 7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/files/file_path.h" 8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/drive.pb.h" 9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_errors.h" 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_interface.h" 11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/app_id.h" 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/fileapi_util.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/volume_manager.h" 15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/fileapi/file_system_backend.h" 16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_dispatcher.h" 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/extensions/extension_tab_util.h" 18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/extensions/api/file_browser_private.h" 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/browser_context.h" 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/storage_partition.h" 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/web_contents.h" 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/shell_dialogs/selected_file_info.h" 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_context.h" 27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_url.h" 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using content::BrowserThread; 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) 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Forward declarations of helper functions for GetSelectedFileInfo(). 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ContinueGetSelectedFileInfo(Profile* profile, 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<GetSelectedFileInfoParams> params, 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) drive::FileError error, 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::FilePath& local_file_path, 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<drive::ResourceEntry> entry); 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Part of GetSelectedFileInfo(). 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void GetSelectedFileInfoInternal(Profile* profile, 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<GetSelectedFileInfoParams> params) { 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(profile); 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) drive::FileSystemInterface* file_system = 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) drive::util::GetFileSystemByProfile(profile); 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (size_t i = params->selected_files.size(); 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) i < params->file_paths.size(); ++i) { 60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::FilePath& file_path = params->file_paths[i]; 61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!drive::util::IsUnderDriveMountPoint(file_path)) { 633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch params->selected_files.push_back( 643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ui::SelectedFileInfo(file_path, base::FilePath())); 653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } else { 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // |file_system| is NULL if Drive is disabled. 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!file_system) { 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ContinueGetSelectedFileInfo(profile, 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params.Pass(), 70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) drive::FILE_ERROR_FAILED, 71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath(), 72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<drive::ResourceEntry>()); 73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // When the caller of the select file dialog wants local file paths, 76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // we should retrieve Drive files onto the local cache. 77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch switch (params->local_path_option) { 78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case NO_LOCAL_PATH_RESOLUTION: 79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch params->selected_files.push_back( 80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ui::SelectedFileInfo(file_path, base::FilePath())); 81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch break; 82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case NEED_LOCAL_PATH_FOR_OPENING: 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) file_system->GetFile( 84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch drive::util::ExtractDrivePath(file_path), 85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(&ContinueGetSelectedFileInfo, 86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch profile, 87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Passed(¶ms))); 88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; // Remaining work is done in ContinueGetSelectedFileInfo. 89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case NEED_LOCAL_PATH_FOR_SAVING: 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) file_system->GetFileForSaving( 91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch drive::util::ExtractDrivePath(file_path), 92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(&ContinueGetSelectedFileInfo, 93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch profile, 94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Passed(¶ms))); 95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; // Remaining work is done in ContinueGetSelectedFileInfo. 96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params->callback.Run(params->selected_files); 100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Part of GetSelectedFileInfo(). 103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ContinueGetSelectedFileInfo(Profile* profile, 104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<GetSelectedFileInfoParams> params, 105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) drive::FileError error, 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::FilePath& local_file_path, 107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<drive::ResourceEntry> entry) { 108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(profile); 109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const int index = params->selected_files.size(); 111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::FilePath& file_path = params->file_paths[index]; 112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath local_path; 113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (error == drive::FILE_ERROR_OK) { 114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) local_path = local_file_path; 115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } else { 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DLOG(ERROR) << "Failed to get " << file_path.value() 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) << " with error code: " << error; 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params->selected_files.push_back(ui::SelectedFileInfo(file_path, local_path)); 120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetSelectedFileInfoInternal(profile, params.Pass()); 121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace 124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void VolumeInfoToVolumeMetadata( 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Profile* profile, 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const VolumeInfo& volume_info, 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_browser_private::VolumeMetadata* volume_metadata) { 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(volume_metadata); 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(!volume_info.mount_path.empty()); 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Convert mount point path to relative path with the external file system 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // exposed within File API. 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::FilePath relative_mount_path; 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ConvertAbsoluteFilePathToRelativeFileSystemPath( 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile, kFileManagerAppId, base::FilePath(volume_info.mount_path), 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &relative_mount_path)) { 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) volume_metadata->mount_path = "/" + relative_mount_path.AsUTF8Unsafe(); 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) volume_metadata->volume_id = volume_info.volume_id; 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!volume_info.source_path.empty()) { 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->source_path.reset( 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new std::string(volume_info.source_path.AsUTF8Unsafe())); 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (volume_info.type) { 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case VOLUME_TYPE_GOOGLE_DRIVE: 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->volume_type = 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_browser_private::VolumeMetadata::VOLUME_TYPE_DRIVE; 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case VOLUME_TYPE_DOWNLOADS_DIRECTORY: 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->volume_type = 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_browser_private::VolumeMetadata::VOLUME_TYPE_DOWNLOADS; 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case VOLUME_TYPE_REMOVABLE_DISK_PARTITION: 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->volume_type = 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_browser_private::VolumeMetadata::VOLUME_TYPE_REMOVABLE; 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case VOLUME_TYPE_MOUNTED_ARCHIVE_FILE: 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->volume_type = 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_browser_private::VolumeMetadata::VOLUME_TYPE_ARCHIVE; 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Fill device_type iff the volume is removable partition. 1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (volume_info.type == VOLUME_TYPE_REMOVABLE_DISK_PARTITION) { 1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (volume_info.device_type) { 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::DEVICE_TYPE_UNKNOWN: 1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->device_type = 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_browser_private::VolumeMetadata::DEVICE_TYPE_UNKNOWN; 1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::DEVICE_TYPE_USB: 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->device_type = 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_browser_private::VolumeMetadata::DEVICE_TYPE_USB; 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::DEVICE_TYPE_SD: 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->device_type = 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_browser_private::VolumeMetadata::DEVICE_TYPE_SD; 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::DEVICE_TYPE_OPTICAL_DISC: 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::DEVICE_TYPE_DVD: 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->device_type = 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_browser_private::VolumeMetadata::DEVICE_TYPE_OPTICAL; 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::DEVICE_TYPE_MOBILE: 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->device_type = 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_browser_private::VolumeMetadata::DEVICE_TYPE_MOBILE; 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->device_type = 1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_browser_private::VolumeMetadata::DEVICE_TYPE_NONE; 1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->is_read_only = volume_info.is_read_only; 1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (volume_info.mount_condition) { 2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::disks::MOUNT_CONDITION_NONE: 2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->mount_condition = 2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_browser_private::VolumeMetadata::MOUNT_CONDITION_NONE; 2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::disks::MOUNT_CONDITION_UNKNOWN_FILESYSTEM: 2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->mount_condition = 2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_browser_private::VolumeMetadata::MOUNT_CONDITION_UNKNOWN; 2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case chromeos::disks::MOUNT_CONDITION_UNSUPPORTED_FILESYSTEM: 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) volume_metadata->mount_condition = 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_browser_private::VolumeMetadata::MOUNT_CONDITION_UNSUPPORTED; 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)content::WebContents* GetWebContents(ExtensionFunctionDispatcher* dispatcher) { 216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!dispatcher) { 217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LOG(WARNING) << "No dispatcher"; 2181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return NULL; 219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!dispatcher->delegate()) { 221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LOG(WARNING) << "No delegate"; 2221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return NULL; 223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) content::WebContents* web_contents = 225a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dispatcher->delegate()->GetAssociatedWebContents(); 226a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!web_contents) { 227a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LOG(WARNING) << "No associated tab contents"; 2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return NULL; 229a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return web_contents; 2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)int32 GetTabId(ExtensionFunctionDispatcher* dispatcher) { 2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::WebContents* web_contents = GetWebContents(dispatcher); 235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return web_contents ? 236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ExtensionTabUtil::GetTabId(web_contents) : 0; 237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)base::FilePath GetLocalPathFromURL( 240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) content::RenderViewHost* render_view_host, 241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) Profile* profile, 242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const GURL& url) { 243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(render_view_host); 244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(profile); 245a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 246a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<fileapi::FileSystemContext> file_system_context = 2473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) util::GetFileSystemContextForRenderViewHost( 248ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch profile, render_view_host); 249a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 250a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const fileapi::FileSystemURL filesystem_url( 251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) file_system_context->CrackURL(url)); 252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath path; 253a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!chromeos::FileSystemBackend::CanHandleURL(filesystem_url)) 254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return base::FilePath(); 255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return filesystem_url.path(); 256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void GetSelectedFileInfo(content::RenderViewHost* render_view_host, 259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) Profile* profile, 260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::vector<GURL>& file_urls, 2613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch GetSelectedFileInfoLocalPathOption local_path_option, 262a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetSelectedFileInfoCallback callback) { 263a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(render_view_host); 264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(profile); 265a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<GetSelectedFileInfoParams> params(new GetSelectedFileInfoParams); 2673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch params->local_path_option = local_path_option; 268a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params->callback = callback; 269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 270a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (size_t i = 0; i < file_urls.size(); ++i) { 271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const GURL& file_url = file_urls[i]; 272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::FilePath path = GetLocalPathFromURL( 273a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) render_view_host, profile, file_url); 274a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!path.empty()) { 275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DVLOG(1) << "Selected: file path: " << path.value(); 276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params->file_paths.push_back(path); 277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 279a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) BrowserThread::PostTask( 281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&GetSelectedFileInfoInternal, 283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) profile, 284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Passed(¶ms))); 285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace util 288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace file_manager 289