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"
7 #include "base/format_macros.h"
8 #include "chrome/browser/chromeos/drive/file_system_interface.h"
9 #include "chrome/browser/chromeos/drive/file_system_util.h"
10 #include "chrome/browser/chromeos/extensions/file_manager/private_api_util.h"
11 #include "chrome/browser/chromeos/file_manager/fileapi_util.h"
12 #include "chrome/browser/chromeos/file_manager/volume_manager.h"
13 #include "chrome/browser/drive/event_logger.h"
14 #include "chrome/browser/profiles/profile.h"
15 #include "chrome/common/extensions/api/file_browser_private.h"
16 #include "chromeos/disks/disk_mount_manager.h"
17 #include "content/public/browser/browser_thread.h"
18 #include "ui/shell_dialogs/selected_file_info.h"
20 using chromeos::disks::DiskMountManager;
21 using content::BrowserThread;
22 namespace file_browser_private = extensions::api::file_browser_private;
24 namespace extensions {
26 bool FileBrowserPrivateAddMountFunction::RunImpl() {
27 using file_browser_private::AddMount::Params;
28 const scoped_ptr<Params> params(Params::Create(*args_));
29 EXTENSION_FUNCTION_VALIDATE(params);
31 drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
33 logger->Log(logging::LOG_INFO,
34 "%s[%d] called. (source: '%s')",
37 params->source.empty() ? "(none)" : params->source.c_str());
39 set_log_on_completion(true);
41 const base::FilePath path = file_manager::util::GetLocalPathFromURL(
42 render_view_host(), GetProfile(), GURL(params->source));
47 // Check if the source path is under Drive cache directory.
48 if (drive::util::IsUnderDriveMountPoint(path)) {
49 drive::FileSystemInterface* file_system =
50 drive::util::GetFileSystemByProfile(GetProfile());
54 file_system->MarkCacheFileAsMounted(
55 drive::util::ExtractDrivePath(path),
57 &FileBrowserPrivateAddMountFunction::RunAfterMarkCacheFileAsMounted,
58 this, path.BaseName()));
60 RunAfterMarkCacheFileAsMounted(
61 path.BaseName(), drive::FILE_ERROR_OK, path);
66 void FileBrowserPrivateAddMountFunction::RunAfterMarkCacheFileAsMounted(
67 const base::FilePath& display_name,
68 drive::FileError error,
69 const base::FilePath& file_path) {
70 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
72 if (error != drive::FILE_ERROR_OK) {
77 // Pass back the actual source path of the mount point.
78 SetResult(new base::StringValue(file_path.AsUTF8Unsafe()));
81 // MountPath() takes a std::string.
82 DiskMountManager* disk_mount_manager = DiskMountManager::GetInstance();
83 disk_mount_manager->MountPath(
84 file_path.AsUTF8Unsafe(),
85 base::FilePath(display_name.Extension()).AsUTF8Unsafe(),
86 display_name.AsUTF8Unsafe(),
87 chromeos::MOUNT_TYPE_ARCHIVE);
90 bool FileBrowserPrivateRemoveMountFunction::RunImpl() {
91 using file_browser_private::RemoveMount::Params;
92 const scoped_ptr<Params> params(Params::Create(*args_));
93 EXTENSION_FUNCTION_VALIDATE(params);
95 drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
97 logger->Log(logging::LOG_INFO,
98 "%s[%d] called. (volume_id: '%s')",
101 params->volume_id.c_str());
103 set_log_on_completion(true);
105 using file_manager::VolumeManager;
106 using file_manager::VolumeInfo;
107 VolumeManager* volume_manager = VolumeManager::Get(GetProfile());
111 VolumeInfo volume_info;
112 if (!volume_manager->FindVolumeInfoById(params->volume_id, &volume_info))
115 // TODO(tbarzic): Send response when callback is received, it would make more
116 // sense than remembering issued unmount requests in file manager and showing
117 // errors for them when MountCompleted event is received.
118 DiskMountManager::GetInstance()->UnmountPath(
119 volume_info.mount_path.value(),
120 chromeos::UNMOUNT_OPTIONS_NONE,
121 DiskMountManager::UnmountPathCallback());
127 bool FileBrowserPrivateGetVolumeMetadataListFunction::RunImpl() {
128 if (args_->GetSize())
131 const std::vector<file_manager::VolumeInfo>& volume_info_list =
132 file_manager::VolumeManager::Get(GetProfile())->GetVolumeInfoList();
134 std::string log_string;
135 std::vector<linked_ptr<file_browser_private::VolumeMetadata> > result;
136 for (size_t i = 0; i < volume_info_list.size(); ++i) {
137 linked_ptr<file_browser_private::VolumeMetadata> volume_metadata(
138 new file_browser_private::VolumeMetadata);
139 file_manager::util::VolumeInfoToVolumeMetadata(
140 GetProfile(), volume_info_list[i], volume_metadata.get());
141 result.push_back(volume_metadata);
142 if (!log_string.empty())
144 log_string += volume_info_list[i].mount_path.AsUTF8Unsafe();
147 drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
149 logger->Log(logging::LOG_INFO,
150 "%s[%d] succeeded. (results: '[%s]', %" PRIuS " mount points)",
151 name().c_str(), request_id(), log_string.c_str(),
156 file_browser_private::GetVolumeMetadataList::Results::Create(result);
161 } // namespace extensions