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_mount.h" 6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <string> 8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/format_macros.h" 11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_interface.h" 12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h" 13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/extensions/file_manager/private_api_util.h" 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/fileapi_util.h" 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/volume_manager.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/drive/event_logger.h" 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/extensions/api/file_manager_private.h" 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chromeos/disks/disk_mount_manager.h" 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "google_apis/drive/task_util.h" 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/shell_dialogs/selected_file_info.h" 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using chromeos::disks::DiskMountManager; 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using content::BrowserThread; 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace file_manager_private = extensions::api::file_manager_private; 27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace extensions { 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace { 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Does chmod o+r for the given path to ensure the file is readable from avfs. 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void EnsureReadableFilePermissionOnBlockingPool( 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::FilePath& path, 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::Callback<void(drive::FileError, const base::FilePath&)>& 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback) { 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int mode = 0; 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!base::GetPosixFilePermissions(path, &mode) || 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) !base::SetPosixFilePermissions(path, mode | S_IROTH)) { 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback.Run(drive::FILE_ERROR_ACCESS_DENIED, base::FilePath()); 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback.Run(drive::FILE_ERROR_OK, path); 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool FileManagerPrivateAddMountFunction::RunAsync() { 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci using file_manager_private::AddMount::Params; 50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const scoped_ptr<Params> params(Params::Create(*args_)); 51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile()); 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (logger) { 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) logger->Log(logging::LOG_INFO, 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "%s[%d] called. (source: '%s')", 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) name().c_str(), 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_id(), 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params->source.empty() ? "(none)" : params->source.c_str()); 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) set_log_on_completion(true); 62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const base::FilePath path = file_manager::util::GetLocalPathFromURL( 641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) render_view_host(), GetProfile(), GURL(params->source)); 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (path.empty()) 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Check if the source path is under Drive cache directory. 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (drive::util::IsUnderDriveMountPoint(path)) { 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) drive::FileSystemInterface* file_system = 721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) drive::util::GetFileSystemByProfile(GetProfile()); 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!file_system) 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) // Ensure that the cache file exists. 7734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) const base::FilePath drive_path = drive::util::ExtractDrivePath(path); 7834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) file_system->GetFile( 7934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) drive_path, 8034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) base::Bind(&FileManagerPrivateAddMountFunction::RunAfterGetDriveFile, 8134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) this, 8234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) drive_path)); 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) file_manager::VolumeManager* volume_manager = 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) file_manager::VolumeManager::Get(GetProfile()); 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(volume_manager); 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool is_under_downloads = false; 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::vector<file_manager::VolumeInfo> volumes = 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) volume_manager->GetVolumeInfoList(); 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (size_t i = 0; i < volumes.size(); ++i) { 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (volumes[i].type == file_manager::VOLUME_TYPE_DOWNLOADS_DIRECTORY && 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) volumes[i].mount_path.IsParent(path)) { 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) is_under_downloads = true; 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) break; 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (is_under_downloads) { 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // For files under downloads, change the file permission and make it 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // readable from avfs/fuse if needed. 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) BrowserThread::PostBlockingPoolTask( 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FROM_HERE, 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&EnsureReadableFilePermissionOnBlockingPool, 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path, 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) google_apis::CreateRelayCallback( 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&FileManagerPrivateAddMountFunction:: 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RunAfterMarkCacheFileAsMounted, 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) this, 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path.BaseName())))); 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RunAfterMarkCacheFileAsMounted( 113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path.BaseName(), drive::FILE_ERROR_OK, path); 114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 11934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)void FileManagerPrivateAddMountFunction::RunAfterGetDriveFile( 12034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) const base::FilePath& drive_path, 12134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) drive::FileError error, 12234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) const base::FilePath& cache_path, 12334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) scoped_ptr<drive::ResourceEntry> entry) { 12434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) DCHECK_CURRENTLY_ON(BrowserThread::UI); 12534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 12634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) if (error != drive::FILE_ERROR_OK) { 12734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) SendResponse(false); 12834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) return; 12934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) } 13034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 13134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) drive::FileSystemInterface* const file_system = 13234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) drive::util::GetFileSystemByProfile(GetProfile()); 13334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) if (!file_system) { 13434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) SendResponse(false); 13534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) return; 13634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) } 13734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 13834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) file_system->MarkCacheFileAsMounted( 13934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) drive_path, 14034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) base::Bind( 14134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) &FileManagerPrivateAddMountFunction::RunAfterMarkCacheFileAsMounted, 14234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) this, 14334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) drive_path.BaseName())); 14434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)} 14534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid FileManagerPrivateAddMountFunction::RunAfterMarkCacheFileAsMounted( 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const base::FilePath& display_name, 148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) drive::FileError error, 149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::FilePath& file_path) { 150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (error != drive::FILE_ERROR_OK) { 153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SendResponse(false); 154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Pass back the actual source path of the mount point. 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetResult(new base::StringValue(file_path.AsUTF8Unsafe())); 159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SendResponse(true); 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // MountPath() takes a std::string. 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DiskMountManager* disk_mount_manager = DiskMountManager::GetInstance(); 163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) disk_mount_manager->MountPath( 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_path.AsUTF8Unsafe(), 1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(display_name.Extension()).AsUTF8Unsafe(), 1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) display_name.AsUTF8Unsafe(), 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) chromeos::MOUNT_TYPE_ARCHIVE); 168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool FileManagerPrivateRemoveMountFunction::RunAsync() { 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci using file_manager_private::RemoveMount::Params; 172d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const scoped_ptr<Params> params(Params::Create(*args_)); 173d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile()); 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (logger) { 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) logger->Log(logging::LOG_INFO, 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "%s[%d] called. (volume_id: '%s')", 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) name().c_str(), 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_id(), 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params->volume_id.c_str()); 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) set_log_on_completion(true); 184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) using file_manager::VolumeManager; 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) using file_manager::VolumeInfo; 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VolumeManager* volume_manager = VolumeManager::Get(GetProfile()); 188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(volume_manager); 189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VolumeInfo volume_info; 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!volume_manager->FindVolumeInfoById(params->volume_id, &volume_info)) 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(tbarzic): Send response when callback is received, it would make more 195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // sense than remembering issued unmount requests in file manager and showing 196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // errors for them when MountCompleted event is received. 197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch switch (volume_info.type) { 198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case file_manager::VOLUME_TYPE_REMOVABLE_DISK_PARTITION: 199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case file_manager::VOLUME_TYPE_MOUNTED_ARCHIVE_FILE: { 200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DiskMountManager::GetInstance()->UnmountPath( 201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch volume_info.mount_path.value(), 202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chromeos::UNMOUNT_OPTIONS_NONE, 203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DiskMountManager::UnmountPathCallback()); 204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case file_manager::VOLUME_TYPE_PROVIDED: { 207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chromeos::file_system_provider::Service* service = 208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chromeos::file_system_provider::Service::Get(GetProfile()); 209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(service); 210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // TODO(mtomasz): Pass a more detailed error than just a bool. 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!service->RequestUnmount(volume_info.extension_id, 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) volume_info.file_system_id)) { 213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch default: 218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Requested unmounting a device which is not unmountable. 219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; 220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 222a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SendResponse(true); 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 225a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool FileManagerPrivateGetVolumeMetadataListFunction::RunAsync() { 227a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (args_->GetSize()) 228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 229a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::vector<file_manager::VolumeInfo>& volume_info_list = 2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) file_manager::VolumeManager::Get(GetProfile())->GetVolumeInfoList(); 23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string log_string; 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<linked_ptr<file_manager_private::VolumeMetadata> > result; 23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < volume_info_list.size(); ++i) { 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci linked_ptr<file_manager_private::VolumeMetadata> volume_metadata( 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new file_manager_private::VolumeMetadata); 2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file_manager::util::VolumeInfoToVolumeMetadata( 2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GetProfile(), volume_info_list[i], volume_metadata.get()); 2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.push_back(volume_metadata); 24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!log_string.empty()) 24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) log_string += ", "; 24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) log_string += volume_info_list[i].mount_path.AsUTF8Unsafe(); 244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 245a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile()); 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (logger) { 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) logger->Log(logging::LOG_INFO, 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "%s[%d] succeeded. (results: '[%s]', %" PRIuS " mount points)", 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) name().c_str(), request_id(), log_string.c_str(), 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result.size()); 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 253a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) results_ = 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci file_manager_private::GetVolumeMetadataList::Results::Create(result); 256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SendResponse(true); 257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return true; 258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 260424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} // namespace extensions 261