private_api_mount.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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 <string>
8
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"
21
22using chromeos::disks::DiskMountManager;
23using content::BrowserThread;
24namespace file_browser_private = extensions::api::file_browser_private;
25
26namespace extensions {
27
28bool FileBrowserPrivateAddMountFunction::RunImpl() {
29  using file_browser_private::AddMount::Params;
30  const scoped_ptr<Params> params(Params::Create(*args_));
31  EXTENSION_FUNCTION_VALIDATE(params);
32
33  drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
34  if (logger) {
35    logger->Log(logging::LOG_INFO,
36                "%s[%d] called. (source: '%s')",
37                name().c_str(),
38                request_id(),
39                params->source.empty() ? "(none)" : params->source.c_str());
40  }
41  set_log_on_completion(true);
42
43  const base::FilePath path = file_manager::util::GetLocalPathFromURL(
44      render_view_host(), GetProfile(), GURL(params->source));
45
46  if (path.empty())
47    return false;
48
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());
53    if (!file_system)
54      return false;
55
56    file_system->MarkCacheFileAsMounted(
57        drive::util::ExtractDrivePath(path),
58        base::Bind(
59            &FileBrowserPrivateAddMountFunction::RunAfterMarkCacheFileAsMounted,
60            this, path.BaseName()));
61  } else {
62    RunAfterMarkCacheFileAsMounted(
63        path.BaseName(), drive::FILE_ERROR_OK, path);
64  }
65  return true;
66}
67
68void FileBrowserPrivateAddMountFunction::RunAfterMarkCacheFileAsMounted(
69    const base::FilePath& display_name,
70    drive::FileError error,
71    const base::FilePath& file_path) {
72  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
73
74  if (error != drive::FILE_ERROR_OK) {
75    SendResponse(false);
76    return;
77  }
78
79  // Pass back the actual source path of the mount point.
80  SetResult(new base::StringValue(file_path.AsUTF8Unsafe()));
81  SendResponse(true);
82
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);
90}
91
92bool FileBrowserPrivateRemoveMountFunction::RunImpl() {
93  using file_browser_private::RemoveMount::Params;
94  const scoped_ptr<Params> params(Params::Create(*args_));
95  EXTENSION_FUNCTION_VALIDATE(params);
96
97  drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
98  if (logger) {
99    logger->Log(logging::LOG_INFO,
100                "%s[%d] called. (volume_id: '%s')",
101                name().c_str(),
102                request_id(),
103                params->volume_id.c_str());
104  }
105  set_log_on_completion(true);
106
107  using file_manager::VolumeManager;
108  using file_manager::VolumeInfo;
109  VolumeManager* volume_manager = VolumeManager::Get(GetProfile());
110  DCHECK(volume_manager);
111
112  VolumeInfo volume_info;
113  if (!volume_manager->FindVolumeInfoById(params->volume_id, &volume_info))
114    return false;
115
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());
126      break;
127    }
128    case file_manager::VOLUME_TYPE_PROVIDED: {
129      chromeos::file_system_provider::Service* service =
130          chromeos::file_system_provider::Service::Get(GetProfile());
131      DCHECK(service);
132      // TODO(mtomasz): Pass a more detailed error than just a bool.
133      if (!service->RequestUnmount(volume_info.file_system_id))
134        return false;
135      break;
136    }
137    default:
138      // Requested unmounting a device which is not unmountable.
139      return false;
140  }
141
142  SendResponse(true);
143  return true;
144}
145
146bool FileBrowserPrivateGetVolumeMetadataListFunction::RunImpl() {
147  if (args_->GetSize())
148    return false;
149
150  const std::vector<file_manager::VolumeInfo>& volume_info_list =
151      file_manager::VolumeManager::Get(GetProfile())->GetVolumeInfoList();
152
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())
162      log_string += ", ";
163    log_string += volume_info_list[i].mount_path.AsUTF8Unsafe();
164  }
165
166  drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
167  if (logger) {
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(),
171                result.size());
172  }
173
174  results_ =
175      file_browser_private::GetVolumeMetadataList::Results::Create(result);
176  SendResponse(true);
177  return true;
178}
179
180}  // namespace extensions
181