1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/chromeos/extensions/file_manager/private_api_mount.h"
9 #include "base/format_macros.h"
10 #include "chrome/browser/chromeos/drive/file_system_interface.h"
11 #include "chrome/browser/chromeos/drive/file_system_util.h"
12 #include "chrome/browser/chromeos/extensions/file_manager/private_api_util.h"
13 #include "chrome/browser/chromeos/file_manager/fileapi_util.h"
14 #include "chrome/browser/chromeos/file_manager/volume_manager.h"
15 #include "chrome/browser/drive/event_logger.h"
16 #include "chrome/browser/profiles/profile.h"
17 #include "chrome/common/extensions/api/file_browser_private.h"
18 #include "chromeos/disks/disk_mount_manager.h"
19 #include "content/public/browser/browser_thread.h"
20 #include "ui/shell_dialogs/selected_file_info.h"
22 using chromeos::disks::DiskMountManager;
23 using content::BrowserThread;
24 namespace file_browser_private = extensions::api::file_browser_private;
26 namespace extensions {
28 bool FileBrowserPrivateAddMountFunction::RunAsync() {
29 using file_browser_private::AddMount::Params;
30 const scoped_ptr<Params> params(Params::Create(*args_));
31 EXTENSION_FUNCTION_VALIDATE(params);
33 drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
35 logger->Log(logging::LOG_INFO,
36 "%s[%d] called. (source: '%s')",
39 params->source.empty() ? "(none)" : params->source.c_str());
41 set_log_on_completion(true);
43 const base::FilePath path = file_manager::util::GetLocalPathFromURL(
44 render_view_host(), GetProfile(), GURL(params->source));
49 // Check if the source path is under Drive cache directory.
50 if (drive::util::IsUnderDriveMountPoint(path)) {
51 drive::FileSystemInterface* file_system =
52 drive::util::GetFileSystemByProfile(GetProfile());
56 file_system->MarkCacheFileAsMounted(
57 drive::util::ExtractDrivePath(path),
59 &FileBrowserPrivateAddMountFunction::RunAfterMarkCacheFileAsMounted,
60 this, path.BaseName()));
62 RunAfterMarkCacheFileAsMounted(
63 path.BaseName(), drive::FILE_ERROR_OK, path);
68 void FileBrowserPrivateAddMountFunction::RunAfterMarkCacheFileAsMounted(
69 const base::FilePath& display_name,
70 drive::FileError error,
71 const base::FilePath& file_path) {
72 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
74 if (error != drive::FILE_ERROR_OK) {
79 // Pass back the actual source path of the mount point.
80 SetResult(new base::StringValue(file_path.AsUTF8Unsafe()));
83 // MountPath() takes a std::string.
84 DiskMountManager* disk_mount_manager = DiskMountManager::GetInstance();
85 disk_mount_manager->MountPath(
86 file_path.AsUTF8Unsafe(),
87 base::FilePath(display_name.Extension()).AsUTF8Unsafe(),
88 display_name.AsUTF8Unsafe(),
89 chromeos::MOUNT_TYPE_ARCHIVE);
92 bool FileBrowserPrivateRemoveMountFunction::RunAsync() {
93 using file_browser_private::RemoveMount::Params;
94 const scoped_ptr<Params> params(Params::Create(*args_));
95 EXTENSION_FUNCTION_VALIDATE(params);
97 drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
99 logger->Log(logging::LOG_INFO,
100 "%s[%d] called. (volume_id: '%s')",
103 params->volume_id.c_str());
105 set_log_on_completion(true);
107 using file_manager::VolumeManager;
108 using file_manager::VolumeInfo;
109 VolumeManager* volume_manager = VolumeManager::Get(GetProfile());
110 DCHECK(volume_manager);
112 VolumeInfo volume_info;
113 if (!volume_manager->FindVolumeInfoById(params->volume_id, &volume_info))
116 // TODO(tbarzic): Send response when callback is received, it would make more
117 // sense than remembering issued unmount requests in file manager and showing
118 // errors for them when MountCompleted event is received.
119 switch (volume_info.type) {
120 case file_manager::VOLUME_TYPE_REMOVABLE_DISK_PARTITION:
121 case file_manager::VOLUME_TYPE_MOUNTED_ARCHIVE_FILE: {
122 DiskMountManager::GetInstance()->UnmountPath(
123 volume_info.mount_path.value(),
124 chromeos::UNMOUNT_OPTIONS_NONE,
125 DiskMountManager::UnmountPathCallback());
128 case file_manager::VOLUME_TYPE_PROVIDED: {
129 chromeos::file_system_provider::Service* service =
130 chromeos::file_system_provider::Service::Get(GetProfile());
132 // TODO(mtomasz): Pass a more detailed error than just a bool.
133 if (!service->RequestUnmount(volume_info.file_system_id))
138 // Requested unmounting a device which is not unmountable.
146 bool FileBrowserPrivateGetVolumeMetadataListFunction::RunAsync() {
147 if (args_->GetSize())
150 const std::vector<file_manager::VolumeInfo>& volume_info_list =
151 file_manager::VolumeManager::Get(GetProfile())->GetVolumeInfoList();
153 std::string log_string;
154 std::vector<linked_ptr<file_browser_private::VolumeMetadata> > result;
155 for (size_t i = 0; i < volume_info_list.size(); ++i) {
156 linked_ptr<file_browser_private::VolumeMetadata> volume_metadata(
157 new file_browser_private::VolumeMetadata);
158 file_manager::util::VolumeInfoToVolumeMetadata(
159 GetProfile(), volume_info_list[i], volume_metadata.get());
160 result.push_back(volume_metadata);
161 if (!log_string.empty())
163 log_string += volume_info_list[i].mount_path.AsUTF8Unsafe();
166 drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
168 logger->Log(logging::LOG_INFO,
169 "%s[%d] succeeded. (results: '[%s]', %" PRIuS " mount points)",
170 name().c_str(), request_id(), log_string.c_str(),
175 file_browser_private::GetVolumeMetadataList::Results::Create(result);
180 } // namespace extensions