Home | History | Annotate | Download | only in fileapi
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/chromeos/file_system_provider/fileapi/provider_async_file_util.h"
      6 
      7 #include "base/callback.h"
      8 #include "base/files/file.h"
      9 #include "base/files/file_path.h"
     10 #include "base/logging.h"
     11 #include "chrome/browser/chromeos/file_system_provider/mount_path_util.h"
     12 #include "chrome/browser/chromeos/file_system_provider/provided_file_system_interface.h"
     13 #include "content/public/browser/browser_thread.h"
     14 #include "webkit/browser/fileapi/file_system_operation_context.h"
     15 #include "webkit/browser/fileapi/file_system_url.h"
     16 #include "webkit/common/blob/shareable_file_reference.h"
     17 
     18 using content::BrowserThread;
     19 
     20 namespace chromeos {
     21 namespace file_system_provider {
     22 namespace internal {
     23 namespace {
     24 
     25 // Executes GetFileInfo on the UI thread.
     26 void GetFileInfoOnUIThread(
     27     scoped_ptr<fileapi::FileSystemOperationContext> context,
     28     const fileapi::FileSystemURL& url,
     29     const fileapi::AsyncFileUtil::GetFileInfoCallback& callback) {
     30   util::FileSystemURLParser parser(url);
     31   if (!parser.Parse()) {
     32     callback.Run(base::File::FILE_ERROR_INVALID_OPERATION, base::File::Info());
     33     return;
     34   }
     35 
     36   parser.file_system()->GetMetadata(parser.file_path(), callback);
     37 }
     38 
     39 // Routes the response of GetFileInfo back to the IO thread.
     40 void OnGetFileInfo(const fileapi::AsyncFileUtil::GetFileInfoCallback& callback,
     41                    base::File::Error result,
     42                    const base::File::Info& file_info) {
     43   BrowserThread::PostTask(
     44       BrowserThread::IO, FROM_HERE, base::Bind(callback, result, file_info));
     45 }
     46 
     47 // Executes ReadDirectory on the UI thread.
     48 void ReadDirectoryOnUIThread(
     49     scoped_ptr<fileapi::FileSystemOperationContext> context,
     50     const fileapi::FileSystemURL& url,
     51     const fileapi::AsyncFileUtil::ReadDirectoryCallback& callback) {
     52   util::FileSystemURLParser parser(url);
     53   if (!parser.Parse()) {
     54     callback.Run(base::File::FILE_ERROR_INVALID_OPERATION,
     55                  fileapi::AsyncFileUtil::EntryList(),
     56                  false /* has_more */);
     57     return;
     58   }
     59 
     60   parser.file_system()->ReadDirectory(parser.file_path(), callback);
     61 }
     62 
     63 // Routes the response of ReadDirectory back to the IO thread.
     64 void OnReadDirectory(
     65     const fileapi::AsyncFileUtil::ReadDirectoryCallback& callback,
     66     base::File::Error result,
     67     const fileapi::AsyncFileUtil::EntryList& entry_list,
     68     bool has_more) {
     69   BrowserThread::PostTask(BrowserThread::IO,
     70                           FROM_HERE,
     71                           base::Bind(callback, result, entry_list, has_more));
     72 }
     73 
     74 }  // namespace
     75 
     76 ProviderAsyncFileUtil::ProviderAsyncFileUtil() {}
     77 
     78 ProviderAsyncFileUtil::~ProviderAsyncFileUtil() {}
     79 
     80 void ProviderAsyncFileUtil::CreateOrOpen(
     81     scoped_ptr<fileapi::FileSystemOperationContext> context,
     82     const fileapi::FileSystemURL& url,
     83     int file_flags,
     84     const CreateOrOpenCallback& callback) {
     85   DCHECK_CURRENTLY_ON(BrowserThread::IO);
     86   if ((file_flags & base::File::FLAG_CREATE) ||
     87       (file_flags & base::File::FLAG_OPEN_ALWAYS) ||
     88       (file_flags & base::File::FLAG_CREATE_ALWAYS) ||
     89       (file_flags & base::File::FLAG_OPEN_TRUNCATED)) {
     90     callback.Run(base::File(base::File::FILE_ERROR_ACCESS_DENIED),
     91                  base::Closure());
     92     return;
     93   }
     94 
     95   NOTIMPLEMENTED();
     96   callback.Run(base::File(base::File::FILE_ERROR_INVALID_OPERATION),
     97                base::Closure());
     98 }
     99 
    100 void ProviderAsyncFileUtil::EnsureFileExists(
    101     scoped_ptr<fileapi::FileSystemOperationContext> context,
    102     const fileapi::FileSystemURL& url,
    103     const EnsureFileExistsCallback& callback) {
    104   DCHECK_CURRENTLY_ON(BrowserThread::IO);
    105   callback.Run(base::File::FILE_ERROR_ACCESS_DENIED, false /* created */);
    106 }
    107 
    108 void ProviderAsyncFileUtil::CreateDirectory(
    109     scoped_ptr<fileapi::FileSystemOperationContext> context,
    110     const fileapi::FileSystemURL& url,
    111     bool exclusive,
    112     bool recursive,
    113     const StatusCallback& callback) {
    114   DCHECK_CURRENTLY_ON(BrowserThread::IO);
    115   callback.Run(base::File::FILE_ERROR_ACCESS_DENIED);
    116 }
    117 
    118 void ProviderAsyncFileUtil::GetFileInfo(
    119     scoped_ptr<fileapi::FileSystemOperationContext> context,
    120     const fileapi::FileSystemURL& url,
    121     const GetFileInfoCallback& callback) {
    122   DCHECK_CURRENTLY_ON(BrowserThread::IO);
    123   BrowserThread::PostTask(BrowserThread::UI,
    124                           FROM_HERE,
    125                           base::Bind(&GetFileInfoOnUIThread,
    126                                      base::Passed(&context),
    127                                      url,
    128                                      base::Bind(&OnGetFileInfo, callback)));
    129 }
    130 
    131 void ProviderAsyncFileUtil::ReadDirectory(
    132     scoped_ptr<fileapi::FileSystemOperationContext> context,
    133     const fileapi::FileSystemURL& url,
    134     const ReadDirectoryCallback& callback) {
    135   DCHECK_CURRENTLY_ON(BrowserThread::IO);
    136   BrowserThread::PostTask(BrowserThread::UI,
    137                           FROM_HERE,
    138                           base::Bind(&ReadDirectoryOnUIThread,
    139                                      base::Passed(&context),
    140                                      url,
    141                                      base::Bind(&OnReadDirectory, callback)));
    142 }
    143 
    144 void ProviderAsyncFileUtil::Touch(
    145     scoped_ptr<fileapi::FileSystemOperationContext> context,
    146     const fileapi::FileSystemURL& url,
    147     const base::Time& last_access_time,
    148     const base::Time& last_modified_time,
    149     const StatusCallback& callback) {
    150   DCHECK_CURRENTLY_ON(BrowserThread::IO);
    151   callback.Run(base::File::FILE_ERROR_ACCESS_DENIED);
    152 }
    153 
    154 void ProviderAsyncFileUtil::Truncate(
    155     scoped_ptr<fileapi::FileSystemOperationContext> context,
    156     const fileapi::FileSystemURL& url,
    157     int64 length,
    158     const StatusCallback& callback) {
    159   DCHECK_CURRENTLY_ON(BrowserThread::IO);
    160   callback.Run(base::File::FILE_ERROR_ACCESS_DENIED);
    161 }
    162 
    163 void ProviderAsyncFileUtil::CopyFileLocal(
    164     scoped_ptr<fileapi::FileSystemOperationContext> context,
    165     const fileapi::FileSystemURL& src_url,
    166     const fileapi::FileSystemURL& dest_url,
    167     CopyOrMoveOption option,
    168     const CopyFileProgressCallback& progress_callback,
    169     const StatusCallback& callback) {
    170   DCHECK_CURRENTLY_ON(BrowserThread::IO);
    171   callback.Run(base::File::FILE_ERROR_ACCESS_DENIED);
    172 }
    173 
    174 void ProviderAsyncFileUtil::MoveFileLocal(
    175     scoped_ptr<fileapi::FileSystemOperationContext> context,
    176     const fileapi::FileSystemURL& src_url,
    177     const fileapi::FileSystemURL& dest_url,
    178     CopyOrMoveOption option,
    179     const StatusCallback& callback) {
    180   DCHECK_CURRENTLY_ON(BrowserThread::IO);
    181   callback.Run(base::File::FILE_ERROR_ACCESS_DENIED);
    182 }
    183 
    184 void ProviderAsyncFileUtil::CopyInForeignFile(
    185     scoped_ptr<fileapi::FileSystemOperationContext> context,
    186     const base::FilePath& src_file_path,
    187     const fileapi::FileSystemURL& dest_url,
    188     const StatusCallback& callback) {
    189   DCHECK_CURRENTLY_ON(BrowserThread::IO);
    190   callback.Run(base::File::FILE_ERROR_ACCESS_DENIED);
    191 }
    192 
    193 void ProviderAsyncFileUtil::DeleteFile(
    194     scoped_ptr<fileapi::FileSystemOperationContext> context,
    195     const fileapi::FileSystemURL& url,
    196     const StatusCallback& callback) {
    197   DCHECK_CURRENTLY_ON(BrowserThread::IO);
    198   callback.Run(base::File::FILE_ERROR_ACCESS_DENIED);
    199 }
    200 
    201 void ProviderAsyncFileUtil::DeleteDirectory(
    202     scoped_ptr<fileapi::FileSystemOperationContext> context,
    203     const fileapi::FileSystemURL& url,
    204     const StatusCallback& callback) {
    205   DCHECK_CURRENTLY_ON(BrowserThread::IO);
    206   callback.Run(base::File::FILE_ERROR_ACCESS_DENIED);
    207 }
    208 
    209 void ProviderAsyncFileUtil::DeleteRecursively(
    210     scoped_ptr<fileapi::FileSystemOperationContext> context,
    211     const fileapi::FileSystemURL& url,
    212     const StatusCallback& callback) {
    213   DCHECK_CURRENTLY_ON(BrowserThread::IO);
    214   callback.Run(base::File::FILE_ERROR_ACCESS_DENIED);
    215 }
    216 
    217 void ProviderAsyncFileUtil::CreateSnapshotFile(
    218     scoped_ptr<fileapi::FileSystemOperationContext> context,
    219     const fileapi::FileSystemURL& url,
    220     const CreateSnapshotFileCallback& callback) {
    221   DCHECK_CURRENTLY_ON(BrowserThread::IO);
    222   NOTIMPLEMENTED();
    223   callback.Run(base::File::FILE_ERROR_INVALID_OPERATION,
    224                base::File::Info(),
    225                base::FilePath(),
    226                scoped_refptr<webkit_blob::ShareableFileReference>());
    227 }
    228 
    229 }  // namespace internal
    230 }  // namespace file_system_provider
    231 }  // namespace chromeos
    232