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_util.h"
6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/files/file_path.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop.h"
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/drive.pb.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/drive_integration_service.h"
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_errors.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_interface.h"
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h"
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/app_id.h"
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/fileapi_util.h"
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/chromeos/file_manager/filesystem_api_util.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/file_manager/path_util.h"
206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/chromeos/file_manager/snapshot_manager.h"
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/volume_manager.h"
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/fileapi/file_system_backend.h"
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/extensions/api/file_browser_private.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/child_process_security_policy.h"
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/shell_dialogs/selected_file_info.h"
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_context.h"
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_url.h"
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace file_browser_private = extensions::api::file_browser_private;
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace file_manager {
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace util {
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace {
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// The struct is used for GetSelectedFileInfo().
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)struct GetSelectedFileInfoParams {
383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  GetSelectedFileInfoLocalPathOption local_path_option;
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  GetSelectedFileInfoCallback callback;
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<base::FilePath> file_paths;
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<ui::SelectedFileInfo> selected_files;
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// The callback type for GetFileNativeLocalPathFor{Opening,Saving}. It receives
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// the resolved local path when successful, and receives empty path for failure.
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)typedef base::Callback<void(const base::FilePath&)> LocalPathCallback;
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Converts a callback from Drive file system to LocalPathCallback.
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void OnDriveGetFile(const base::FilePath& path,
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                    const LocalPathCallback& callback,
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                    drive::FileError error,
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                    const base::FilePath& local_file_path,
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                    scoped_ptr<drive::ResourceEntry> entry) {
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (error != drive::FILE_ERROR_OK)
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    DLOG(ERROR) << "Failed to get " << path.value() << " with: " << error;
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  callback.Run(local_file_path);
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Gets a resolved local file path of a non native |path| for file opening.
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void GetFileNativeLocalPathForOpening(Profile* profile,
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                      const base::FilePath& path,
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                      const LocalPathCallback& callback) {
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (drive::util::IsUnderDriveMountPoint(path)) {
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    drive::FileSystemInterface* file_system =
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        drive::util::GetFileSystemByProfile(profile);
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!file_system) {
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      DLOG(ERROR) << "Drive file selected while disabled: " << path.value();
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      callback.Run(base::FilePath());
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return;
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    file_system->GetFile(drive::util::ExtractDrivePath(path),
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         base::Bind(&OnDriveGetFile, path, callback));
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return;
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  VolumeManager::Get(profile)->snapshot_manager()->CreateManagedSnapshot(
776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      path, callback);
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Gets a resolved local file path of a non native |path| for file saving.
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void GetFileNativeLocalPathForSaving(Profile* profile,
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                     const base::FilePath& path,
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                     const LocalPathCallback& callback) {
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (drive::util::IsUnderDriveMountPoint(path)) {
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    drive::FileSystemInterface* file_system =
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        drive::util::GetFileSystemByProfile(profile);
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!file_system) {
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      DLOG(ERROR) << "Drive file selected while disabled: " << path.value();
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      callback.Run(base::FilePath());
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return;
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    file_system->GetFileForSaving(drive::util::ExtractDrivePath(path),
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                  base::Bind(&OnDriveGetFile, path, callback));
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return;
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // TODO(kinaba): For now, the only writable non-local volume is Drive.
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  NOTREACHED();
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  callback.Run(base::FilePath());
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Forward declarations of helper functions for GetSelectedFileInfo().
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ContinueGetSelectedFileInfo(Profile* profile,
104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 scoped_ptr<GetSelectedFileInfoParams> params,
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                 const base::FilePath& local_file_path);
106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Part of GetSelectedFileInfo().
108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void GetSelectedFileInfoInternal(Profile* profile,
109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 scoped_ptr<GetSelectedFileInfoParams> params) {
110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(profile);
111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  for (size_t i = params->selected_files.size();
113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)       i < params->file_paths.size(); ++i) {
114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const base::FilePath& file_path = params->file_paths[i];
115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (file_manager::util::IsUnderNonNativeLocalPath(profile, file_path)) {
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      // When the caller of the select file dialog wants local file paths, and
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      // the selected path does not point to a native local path (e.g., Drive,
119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      // MTP, or provided file system), we should resolve the path.
120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      switch (params->local_path_option) {
121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        case NO_LOCAL_PATH_RESOLUTION:
122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          break;  // No special handling needed.
123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        case NEED_LOCAL_PATH_FOR_OPENING:
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          GetFileNativeLocalPathForOpening(
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              profile,
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              file_path,
127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch              base::Bind(&ContinueGetSelectedFileInfo,
128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                         profile,
129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                         base::Passed(&params)));
130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          return;  // Remaining work is done in ContinueGetSelectedFileInfo.
131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        case NEED_LOCAL_PATH_FOR_SAVING:
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          GetFileNativeLocalPathForSaving(
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              profile,
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              file_path,
135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch              base::Bind(&ContinueGetSelectedFileInfo,
136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                         profile,
137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                         base::Passed(&params)));
138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          return;  // Remaining work is done in ContinueGetSelectedFileInfo.
139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      }
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    params->selected_files.push_back(
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        ui::SelectedFileInfo(file_path, base::FilePath()));
143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  params->callback.Run(params->selected_files);
145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Part of GetSelectedFileInfo().
148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ContinueGetSelectedFileInfo(Profile* profile,
149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 scoped_ptr<GetSelectedFileInfoParams> params,
150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                 const base::FilePath& local_path) {
151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const int index = params->selected_files.size();
152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const base::FilePath& file_path = params->file_paths[index];
153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  params->selected_files.push_back(ui::SelectedFileInfo(file_path, local_path));
154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  GetSelectedFileInfoInternal(profile, params.Pass());
155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace
158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void VolumeInfoToVolumeMetadata(
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    Profile* profile,
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const VolumeInfo& volume_info,
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    file_browser_private::VolumeMetadata* volume_metadata) {
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(volume_metadata);
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  volume_metadata->volume_id = volume_info.volume_id;
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // TODO(kinaba): fill appropriate information once multi-profile support is
168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // implemented.
169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  volume_metadata->profile.display_name = profile->GetProfileName();
170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  volume_metadata->profile.is_current_profile = true;
171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!volume_info.source_path.empty()) {
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    volume_metadata->source_path.reset(
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        new std::string(volume_info.source_path.AsUTF8Unsafe()));
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (volume_info.type == VOLUME_TYPE_PROVIDED) {
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    volume_metadata->extension_id.reset(
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        new std::string(volume_info.extension_id));
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    volume_metadata->file_system_id.reset(
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        new std::string(volume_info.file_system_id));
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  volume_metadata->volume_label.reset(
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new std::string(volume_info.volume_label));
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  switch (volume_info.type) {
18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case VOLUME_TYPE_GOOGLE_DRIVE:
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      volume_metadata->volume_type =
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          file_browser_private::VOLUME_TYPE_DRIVE;
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      break;
19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case VOLUME_TYPE_DOWNLOADS_DIRECTORY:
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      volume_metadata->volume_type =
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          file_browser_private::VOLUME_TYPE_DOWNLOADS;
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      break;
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case VOLUME_TYPE_REMOVABLE_DISK_PARTITION:
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      volume_metadata->volume_type =
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          file_browser_private::VOLUME_TYPE_REMOVABLE;
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      break;
20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case VOLUME_TYPE_MOUNTED_ARCHIVE_FILE:
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      volume_metadata->volume_type = file_browser_private::VOLUME_TYPE_ARCHIVE;
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case VOLUME_TYPE_CLOUD_DEVICE:
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      volume_metadata->volume_type =
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          file_browser_private::VOLUME_TYPE_CLOUD_DEVICE;
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      break;
208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    case VOLUME_TYPE_PROVIDED:
209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      volume_metadata->volume_type = file_browser_private::VOLUME_TYPE_PROVIDED;
210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      break;
211e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    case VOLUME_TYPE_MTP:
212e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      volume_metadata->volume_type = file_browser_private::VOLUME_TYPE_MTP;
213e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      break;
214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case VOLUME_TYPE_TESTING:
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      volume_metadata->volume_type =
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          file_browser_private::VOLUME_TYPE_TESTING;
217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case NUM_VOLUME_TYPE:
219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      NOTREACHED();
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Fill device_type iff the volume is removable partition.
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (volume_info.type == VOLUME_TYPE_REMOVABLE_DISK_PARTITION) {
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (volume_info.device_type) {
2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case chromeos::DEVICE_TYPE_UNKNOWN:
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        volume_metadata->device_type =
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            file_browser_private::DEVICE_TYPE_UNKNOWN;
2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case chromeos::DEVICE_TYPE_USB:
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        volume_metadata->device_type = file_browser_private::DEVICE_TYPE_USB;
2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case chromeos::DEVICE_TYPE_SD:
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        volume_metadata->device_type = file_browser_private::DEVICE_TYPE_SD;
2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case chromeos::DEVICE_TYPE_OPTICAL_DISC:
2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case chromeos::DEVICE_TYPE_DVD:
2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        volume_metadata->device_type =
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            file_browser_private::DEVICE_TYPE_OPTICAL;
2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case chromeos::DEVICE_TYPE_MOBILE:
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        volume_metadata->device_type = file_browser_private::DEVICE_TYPE_MOBILE;
2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    volume_metadata->device_path.reset(
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new std::string(volume_info.system_path_prefix.AsUTF8Unsafe()));
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    volume_metadata->is_parent_device.reset(
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new bool(volume_info.is_parent));
2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  } else {
2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    volume_metadata->device_type =
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        file_browser_private::DEVICE_TYPE_NONE;
2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  volume_metadata->is_read_only = volume_info.is_read_only;
2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  switch (volume_info.mount_condition) {
2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    case chromeos::disks::MOUNT_CONDITION_NONE:
2584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      volume_metadata->mount_condition =
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          file_browser_private::MOUNT_CONDITION_NONE;
2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      break;
2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    case chromeos::disks::MOUNT_CONDITION_UNKNOWN_FILESYSTEM:
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      volume_metadata->mount_condition =
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          file_browser_private::MOUNT_CONDITION_UNKNOWN;
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      break;
2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    case chromeos::disks::MOUNT_CONDITION_UNSUPPORTED_FILESYSTEM:
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      volume_metadata->mount_condition =
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          file_browser_private::MOUNT_CONDITION_UNSUPPORTED;
2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      break;
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::FilePath GetLocalPathFromURL(content::RenderViewHost* render_view_host,
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   Profile* profile,
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   const GURL& url) {
275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(render_view_host);
276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(profile);
277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_refptr<fileapi::FileSystemContext> file_system_context =
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      util::GetFileSystemContextForRenderViewHost(profile, render_view_host);
280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const fileapi::FileSystemURL filesystem_url(
282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      file_system_context->CrackURL(url));
283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::FilePath path;
284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!chromeos::FileSystemBackend::CanHandleURL(filesystem_url))
285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return base::FilePath();
286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return filesystem_url.path();
287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
289a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void GetSelectedFileInfo(content::RenderViewHost* render_view_host,
290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                         Profile* profile,
291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                         const std::vector<GURL>& file_urls,
2923240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                         GetSelectedFileInfoLocalPathOption local_path_option,
293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                         GetSelectedFileInfoCallback callback) {
294a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(render_view_host);
295a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(profile);
296a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
297a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<GetSelectedFileInfoParams> params(new GetSelectedFileInfoParams);
2983240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  params->local_path_option = local_path_option;
299a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  params->callback = callback;
300a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
301a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  for (size_t i = 0; i < file_urls.size(); ++i) {
302a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const GURL& file_url = file_urls[i];
303a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const base::FilePath path = GetLocalPathFromURL(
304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        render_view_host, profile, file_url);
305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!path.empty()) {
306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      DVLOG(1) << "Selected: file path: " << path.value();
307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      params->file_paths.push_back(path);
308a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::MessageLoop::current()->PostTask(
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FROM_HERE,
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&GetSelectedFileInfoInternal, profile, base::Passed(&params)));
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SetupProfileFileAccessPermissions(int render_view_process_id,
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       Profile* profile) {
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::FilePath paths[] = {
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    drive::util::GetDriveMountPointPath(profile),
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    util::GetDownloadsFolderForProfile(profile),
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < arraysize(paths); ++i) {
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content::ChildProcessSecurityPolicy::GetInstance(
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        )->GrantCreateReadWriteFile(render_view_process_id, paths[i]);
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)drive::EventLogger* GetLogger(Profile* profile) {
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  drive::DriveIntegrationService* service =
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      drive::DriveIntegrationServiceFactory::FindForProfileRegardlessOfStates(
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          profile);
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return service ? service->event_logger() : NULL;
333a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
334a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
335a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace util
336a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace file_manager
337