iphoto_file_util.cc revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
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/media_galleries/fileapi/iphoto_file_util.h"
6
7#include <set>
8#include <string>
9#include <vector>
10
11#include "base/bind_helpers.h"
12#include "base/file_util.h"
13#include "base/strings/utf_string_conversions.h"
14#include "chrome/browser/media_galleries/fileapi/iphoto_data_provider.h"
15#include "chrome/browser/media_galleries/fileapi/media_path_filter.h"
16#include "chrome/browser/media_galleries/imported_media_gallery_registry.h"
17#include "content/public/browser/browser_thread.h"
18#include "webkit/browser/fileapi/file_system_operation_context.h"
19#include "webkit/browser/fileapi/file_system_url.h"
20#include "webkit/browser/fileapi/native_file_util.h"
21#include "webkit/common/blob/shareable_file_reference.h"
22#include "webkit/common/fileapi/file_system_util.h"
23
24namespace iphoto {
25
26namespace {
27
28base::PlatformFileError MakeDirectoryFileInfo(
29    base::PlatformFileInfo* file_info) {
30  base::PlatformFileInfo result;
31  result.is_directory = true;
32  *file_info = result;
33  return base::PLATFORM_FILE_OK;
34}
35
36}  // namespace
37
38IPhotoFileUtil::IPhotoFileUtil(MediaPathFilter* media_path_filter)
39    : NativeMediaFileUtil(media_path_filter),
40      weak_factory_(this),
41      imported_registry_(NULL) {
42}
43
44IPhotoFileUtil::~IPhotoFileUtil() {
45}
46
47void IPhotoFileUtil::GetFileInfoOnTaskRunnerThread(
48    scoped_ptr<fileapi::FileSystemOperationContext> context,
49    const fileapi::FileSystemURL& url,
50    const GetFileInfoCallback& callback) {
51  GetDataProvider()->RefreshData(
52      base::Bind(&IPhotoFileUtil::GetFileInfoWithFreshDataProvider,
53                 weak_factory_.GetWeakPtr(), base::Passed(&context), url,
54                 callback));
55}
56
57void IPhotoFileUtil::ReadDirectoryOnTaskRunnerThread(
58    scoped_ptr<fileapi::FileSystemOperationContext> context,
59    const fileapi::FileSystemURL& url,
60    const ReadDirectoryCallback& callback) {
61  GetDataProvider()->RefreshData(
62      base::Bind(&IPhotoFileUtil::ReadDirectoryWithFreshDataProvider,
63                 weak_factory_.GetWeakPtr(), base::Passed(&context), url,
64                 callback));
65}
66
67void IPhotoFileUtil::CreateSnapshotFileOnTaskRunnerThread(
68    scoped_ptr<fileapi::FileSystemOperationContext> context,
69    const fileapi::FileSystemURL& url,
70    const CreateSnapshotFileCallback& callback) {
71  GetDataProvider()->RefreshData(
72      base::Bind(&IPhotoFileUtil::CreateSnapshotFileWithFreshDataProvider,
73                 weak_factory_.GetWeakPtr(), base::Passed(&context), url,
74                 callback));
75}
76
77void IPhotoFileUtil::GetFileInfoWithFreshDataProvider(
78    scoped_ptr<fileapi::FileSystemOperationContext> context,
79    const fileapi::FileSystemURL& url,
80    const GetFileInfoCallback& callback,
81    bool valid_parse) {
82  if (!valid_parse) {
83    if (!callback.is_null()) {
84      content::BrowserThread::PostTask(
85          content::BrowserThread::IO,
86          FROM_HERE,
87          base::Bind(callback, base::PLATFORM_FILE_ERROR_IO,
88                     base::PlatformFileInfo()));
89    }
90    return;
91  }
92  NativeMediaFileUtil::GetFileInfoOnTaskRunnerThread(context.Pass(), url,
93                                                     callback);
94}
95
96void IPhotoFileUtil::ReadDirectoryWithFreshDataProvider(
97    scoped_ptr<fileapi::FileSystemOperationContext> context,
98    const fileapi::FileSystemURL& url,
99    const ReadDirectoryCallback& callback,
100    bool valid_parse) {
101  if (!valid_parse) {
102    if (!callback.is_null()) {
103      content::BrowserThread::PostTask(
104          content::BrowserThread::IO,
105          FROM_HERE,
106          base::Bind(callback, base::PLATFORM_FILE_ERROR_IO, EntryList(),
107                     false));
108    }
109    return;
110  }
111  NativeMediaFileUtil::ReadDirectoryOnTaskRunnerThread(context.Pass(), url,
112                                                       callback);
113}
114
115void IPhotoFileUtil::CreateSnapshotFileWithFreshDataProvider(
116    scoped_ptr<fileapi::FileSystemOperationContext> context,
117    const fileapi::FileSystemURL& url,
118    const CreateSnapshotFileCallback& callback,
119    bool valid_parse) {
120  if (!valid_parse) {
121    if (!callback.is_null()) {
122      base::PlatformFileInfo file_info;
123      base::FilePath platform_path;
124      scoped_refptr<webkit_blob::ShareableFileReference> file_ref;
125      content::BrowserThread::PostTask(
126          content::BrowserThread::IO,
127          FROM_HERE,
128          base::Bind(callback, base::PLATFORM_FILE_ERROR_IO, file_info,
129                     platform_path, file_ref));
130    }
131    return;
132  }
133  NativeMediaFileUtil::CreateSnapshotFileOnTaskRunnerThread(context.Pass(), url,
134                                                            callback);
135}
136
137// TODO(gbillock): Right now, returns an always-empty FS. Document virtual FS.
138base::PlatformFileError IPhotoFileUtil::GetFileInfoSync(
139    fileapi::FileSystemOperationContext* context,
140    const fileapi::FileSystemURL& url,
141    base::PlatformFileInfo* file_info,
142    base::FilePath* platform_path) {
143  std::vector<std::string> components;
144  fileapi::VirtualPath::GetComponentsUTF8Unsafe(url.path(), &components);
145
146  if (components.size() == 0)
147    return MakeDirectoryFileInfo(file_info);
148
149  return base::PLATFORM_FILE_ERROR_NOT_FOUND;
150}
151
152base::PlatformFileError IPhotoFileUtil::ReadDirectorySync(
153    fileapi::FileSystemOperationContext* context,
154    const fileapi::FileSystemURL& url,
155    EntryList* file_list) {
156  DCHECK(file_list->empty());
157  std::vector<std::string> components;
158  fileapi::VirtualPath::GetComponentsUTF8Unsafe(url.path(), &components);
159
160  if (components.size() == 0) {
161    return base::PLATFORM_FILE_OK;
162  }
163
164  return base::PLATFORM_FILE_ERROR_NOT_FOUND;
165}
166
167base::PlatformFileError IPhotoFileUtil::CreateSnapshotFileSync(
168    fileapi::FileSystemOperationContext* context,
169    const fileapi::FileSystemURL& url,
170    base::PlatformFileInfo* file_info,
171    base::FilePath* platform_path,
172    scoped_refptr<webkit_blob::ShareableFileReference>* file_ref) {
173  DCHECK(!url.path().IsAbsolute());
174
175  return base::PLATFORM_FILE_ERROR_NOT_FOUND;
176}
177
178base::PlatformFileError IPhotoFileUtil::GetLocalFilePath(
179    fileapi::FileSystemOperationContext* context,
180    const fileapi::FileSystemURL& url,
181    base::FilePath* local_file_path) {
182  return base::PLATFORM_FILE_ERROR_NOT_FOUND;
183}
184
185IPhotoDataProvider* IPhotoFileUtil::GetDataProvider() {
186  if (!imported_registry_)
187    imported_registry_ = ImportedMediaGalleryRegistry::GetInstance();
188  return imported_registry_->IPhotoDataProvider();
189}
190
191}  // namespace iphoto
192