private_api_util.cc revision f2477e01787aa58f445919b809d89e252beef54f
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)
7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/files/file_path.h"
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/drive.pb.h"
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_errors.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_interface.h"
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/app_id.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/fileapi_util.h"
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/volume_manager.h"
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/fileapi/file_system_backend.h"
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_dispatcher.h"
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/extensions/extension_tab_util.h"
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/extensions/api/file_browser_private.h"
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/browser_context.h"
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/storage_partition.h"
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/web_contents.h"
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/shell_dialogs/selected_file_info.h"
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_context.h"
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_url.h"
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using content::BrowserThread;
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)
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Forward declarations of helper functions for GetSelectedFileInfo().
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ContinueGetSelectedFileInfo(Profile* profile,
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 scoped_ptr<GetSelectedFileInfoParams> params,
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 drive::FileError error,
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 const base::FilePath& local_file_path,
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 scoped_ptr<drive::ResourceEntry> entry);
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Part of GetSelectedFileInfo().
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void GetSelectedFileInfoInternal(Profile* profile,
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 scoped_ptr<GetSelectedFileInfoParams> params) {
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(profile);
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  drive::FileSystemInterface* file_system =
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      drive::util::GetFileSystemByProfile(profile);
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  for (size_t i = params->selected_files.size();
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)       i < params->file_paths.size(); ++i) {
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const base::FilePath& file_path = params->file_paths[i];
61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (!drive::util::IsUnderDriveMountPoint(file_path)) {
633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      params->selected_files.push_back(
643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch          ui::SelectedFileInfo(file_path, base::FilePath()));
653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    } else {
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // |file_system| is NULL if Drive is disabled.
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      if (!file_system) {
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ContinueGetSelectedFileInfo(profile,
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                    params.Pass(),
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                    drive::FILE_ERROR_FAILED,
71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                    base::FilePath(),
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                    scoped_ptr<drive::ResourceEntry>());
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        return;
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      }
75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      // When the caller of the select file dialog wants local file paths,
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      // we should retrieve Drive files onto the local cache.
77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      switch (params->local_path_option) {
78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        case NO_LOCAL_PATH_RESOLUTION:
79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          params->selected_files.push_back(
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch              ui::SelectedFileInfo(file_path, base::FilePath()));
81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          break;
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        case NEED_LOCAL_PATH_FOR_OPENING:
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          file_system->GetFile(
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch              drive::util::ExtractDrivePath(file_path),
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch              base::Bind(&ContinueGetSelectedFileInfo,
86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                         profile,
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                         base::Passed(&params)));
88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          return;  // Remaining work is done in ContinueGetSelectedFileInfo.
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        case NEED_LOCAL_PATH_FOR_SAVING:
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          file_system->GetFileForSaving(
91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch              drive::util::ExtractDrivePath(file_path),
92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch              base::Bind(&ContinueGetSelectedFileInfo,
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                         profile,
94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                         base::Passed(&params)));
95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          return;  // Remaining work is done in ContinueGetSelectedFileInfo.
96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      }
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch   }
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  params->callback.Run(params->selected_files);
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Part of GetSelectedFileInfo().
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ContinueGetSelectedFileInfo(Profile* profile,
104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 scoped_ptr<GetSelectedFileInfoParams> params,
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 drive::FileError error,
106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 const base::FilePath& local_file_path,
107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 scoped_ptr<drive::ResourceEntry> entry) {
108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(profile);
109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const int index = params->selected_files.size();
111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const base::FilePath& file_path = params->file_paths[index];
112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::FilePath local_path;
113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (error == drive::FILE_ERROR_OK) {
114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    local_path = local_file_path;
115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  } else {
116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    DLOG(ERROR) << "Failed to get " << file_path.value()
117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                << " with error code: " << error;
118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  params->selected_files.push_back(ui::SelectedFileInfo(file_path, local_path));
120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  GetSelectedFileInfoInternal(profile, params.Pass());
121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace
124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void VolumeInfoToVolumeMetadata(
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    Profile* profile,
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const VolumeInfo& volume_info,
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    file_browser_private::VolumeMetadata* volume_metadata) {
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(volume_metadata);
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(!volume_info.mount_path.empty());
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Convert mount point path to relative path with the external file system
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // exposed within File API.
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::FilePath relative_mount_path;
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (ConvertAbsoluteFilePathToRelativeFileSystemPath(
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          profile, kFileManagerAppId, base::FilePath(volume_info.mount_path),
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          &relative_mount_path)) {
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    volume_metadata->mount_path = "/" + relative_mount_path.AsUTF8Unsafe();
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  volume_metadata->volume_id = volume_info.volume_id;
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!volume_info.source_path.empty()) {
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    volume_metadata->source_path.reset(
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        new std::string(volume_info.source_path.AsUTF8Unsafe()));
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  switch (volume_info.type) {
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case VOLUME_TYPE_GOOGLE_DRIVE:
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      volume_metadata->volume_type =
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          file_browser_private::VolumeMetadata::VOLUME_TYPE_DRIVE;
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      break;
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case VOLUME_TYPE_DOWNLOADS_DIRECTORY:
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      volume_metadata->volume_type =
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          file_browser_private::VolumeMetadata::VOLUME_TYPE_DOWNLOADS;
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      break;
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case VOLUME_TYPE_REMOVABLE_DISK_PARTITION:
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      volume_metadata->volume_type =
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          file_browser_private::VolumeMetadata::VOLUME_TYPE_REMOVABLE;
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      break;
16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case VOLUME_TYPE_MOUNTED_ARCHIVE_FILE:
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      volume_metadata->volume_type =
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          file_browser_private::VolumeMetadata::VOLUME_TYPE_ARCHIVE;
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      break;
16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Fill device_type iff the volume is removable partition.
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (volume_info.type == VOLUME_TYPE_REMOVABLE_DISK_PARTITION) {
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (volume_info.device_type) {
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case chromeos::DEVICE_TYPE_UNKNOWN:
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        volume_metadata->device_type =
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            file_browser_private::VolumeMetadata::DEVICE_TYPE_UNKNOWN;
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case chromeos::DEVICE_TYPE_USB:
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        volume_metadata->device_type =
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            file_browser_private::VolumeMetadata::DEVICE_TYPE_USB;
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case chromeos::DEVICE_TYPE_SD:
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        volume_metadata->device_type =
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            file_browser_private::VolumeMetadata::DEVICE_TYPE_SD;
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case chromeos::DEVICE_TYPE_OPTICAL_DISC:
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case chromeos::DEVICE_TYPE_DVD:
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        volume_metadata->device_type =
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            file_browser_private::VolumeMetadata::DEVICE_TYPE_OPTICAL;
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case chromeos::DEVICE_TYPE_MOBILE:
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        volume_metadata->device_type =
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            file_browser_private::VolumeMetadata::DEVICE_TYPE_MOBILE;
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  } else {
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    volume_metadata->device_type =
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        file_browser_private::VolumeMetadata::DEVICE_TYPE_NONE;
1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  volume_metadata->is_read_only = volume_info.is_read_only;
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  switch (volume_info.mount_condition) {
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    case chromeos::disks::MOUNT_CONDITION_NONE:
2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      volume_metadata->mount_condition =
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          file_browser_private::VolumeMetadata::MOUNT_CONDITION_NONE;
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      break;
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    case chromeos::disks::MOUNT_CONDITION_UNKNOWN_FILESYSTEM:
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      volume_metadata->mount_condition =
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          file_browser_private::VolumeMetadata::MOUNT_CONDITION_UNKNOWN;
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      break;
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    case chromeos::disks::MOUNT_CONDITION_UNSUPPORTED_FILESYSTEM:
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      volume_metadata->mount_condition =
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          file_browser_private::VolumeMetadata::MOUNT_CONDITION_UNSUPPORTED;
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      break;
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)content::WebContents* GetWebContents(ExtensionFunctionDispatcher* dispatcher) {
216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!dispatcher) {
217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LOG(WARNING) << "No dispatcher";
2181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return NULL;
219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!dispatcher->delegate()) {
221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LOG(WARNING) << "No delegate";
2221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return NULL;
223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  content::WebContents* web_contents =
225a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      dispatcher->delegate()->GetAssociatedWebContents();
226a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!web_contents) {
227a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LOG(WARNING) << "No associated tab contents";
2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return NULL;
229a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return web_contents;
2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)int32 GetTabId(ExtensionFunctionDispatcher* dispatcher) {
2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  content::WebContents* web_contents = GetWebContents(dispatcher);
235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return web_contents ?
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      extensions::ExtensionTabUtil::GetTabId(web_contents) : 0;
237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)base::FilePath GetLocalPathFromURL(
240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    content::RenderViewHost* render_view_host,
241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    Profile* profile,
242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const GURL& url) {
243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(render_view_host);
244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(profile);
245a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
246a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_refptr<fileapi::FileSystemContext> file_system_context =
2473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      util::GetFileSystemContextForRenderViewHost(
248ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          profile, render_view_host);
249a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
250a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const fileapi::FileSystemURL filesystem_url(
251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      file_system_context->CrackURL(url));
252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::FilePath path;
253a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!chromeos::FileSystemBackend::CanHandleURL(filesystem_url))
254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return base::FilePath();
255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return filesystem_url.path();
256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void GetSelectedFileInfo(content::RenderViewHost* render_view_host,
259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                         Profile* profile,
260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                         const std::vector<GURL>& file_urls,
2613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                         GetSelectedFileInfoLocalPathOption local_path_option,
262a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                         GetSelectedFileInfoCallback callback) {
263a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(render_view_host);
264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(profile);
265a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<GetSelectedFileInfoParams> params(new GetSelectedFileInfoParams);
2673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  params->local_path_option = local_path_option;
268a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  params->callback = callback;
269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
270a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  for (size_t i = 0; i < file_urls.size(); ++i) {
271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const GURL& file_url = file_urls[i];
272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const base::FilePath path = GetLocalPathFromURL(
273a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        render_view_host, profile, file_url);
274a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!path.empty()) {
275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      DVLOG(1) << "Selected: file path: " << path.value();
276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      params->file_paths.push_back(path);
277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
279a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  BrowserThread::PostTask(
281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      base::Bind(&GetSelectedFileInfoInternal,
283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                 profile,
284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                 base::Passed(&params)));
285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace util
288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace file_manager
289