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