Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / extensions / file_manager / private_api_mount.cc
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.
4
5 #include "chrome/browser/chromeos/extensions/file_manager/private_api_mount.h"
6
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"
19
20 using chromeos::disks::DiskMountManager;
21 using content::BrowserThread;
22 namespace file_browser_private = extensions::api::file_browser_private;
23
24 namespace extensions {
25
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);
30
31   drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
32   if (logger) {
33     logger->Log(logging::LOG_INFO,
34                 "%s[%d] called. (source: '%s')",
35                 name().c_str(),
36                 request_id(),
37                 params->source.empty() ? "(none)" : params->source.c_str());
38   }
39   set_log_on_completion(true);
40
41   const base::FilePath path = file_manager::util::GetLocalPathFromURL(
42       render_view_host(), GetProfile(), GURL(params->source));
43
44   if (path.empty())
45     return false;
46
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());
51     if (!file_system)
52       return false;
53
54     file_system->MarkCacheFileAsMounted(
55         drive::util::ExtractDrivePath(path),
56         base::Bind(
57             &FileBrowserPrivateAddMountFunction::RunAfterMarkCacheFileAsMounted,
58             this, path.BaseName()));
59   } else {
60     RunAfterMarkCacheFileAsMounted(
61         path.BaseName(), drive::FILE_ERROR_OK, path);
62   }
63   return true;
64 }
65
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));
71
72   if (error != drive::FILE_ERROR_OK) {
73     SendResponse(false);
74     return;
75   }
76
77   // Pass back the actual source path of the mount point.
78   SetResult(new base::StringValue(file_path.AsUTF8Unsafe()));
79   SendResponse(true);
80
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);
88 }
89
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);
94
95   drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
96   if (logger) {
97     logger->Log(logging::LOG_INFO,
98                 "%s[%d] called. (volume_id: '%s')",
99                 name().c_str(),
100                 request_id(),
101                 params->volume_id.c_str());
102   }
103   set_log_on_completion(true);
104
105   using file_manager::VolumeManager;
106   using file_manager::VolumeInfo;
107   VolumeManager* volume_manager = VolumeManager::Get(GetProfile());
108   if (!volume_manager)
109     return false;
110
111   VolumeInfo volume_info;
112   if (!volume_manager->FindVolumeInfoById(params->volume_id, &volume_info))
113     return false;
114
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());
122
123   SendResponse(true);
124   return true;
125 }
126
127 bool FileBrowserPrivateGetVolumeMetadataListFunction::RunImpl() {
128   if (args_->GetSize())
129     return false;
130
131   const std::vector<file_manager::VolumeInfo>& volume_info_list =
132       file_manager::VolumeManager::Get(GetProfile())->GetVolumeInfoList();
133
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())
143       log_string += ", ";
144     log_string += volume_info_list[i].mount_path.AsUTF8Unsafe();
145   }
146
147   drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
148   if (logger) {
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(),
152                 result.size());
153   }
154
155   results_ =
156       file_browser_private::GetVolumeMetadataList::Results::Create(result);
157   SendResponse(true);
158   return true;
159 }
160
161 }  // namespace extensions