Home | History | Annotate | Download | only in file_system_provider
      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/extensions/file_system_provider/file_system_provider_api.h"
      6 
      7 #include "chrome/browser/chromeos/file_system_provider/provided_file_system_interface.h"
      8 #include "chrome/browser/chromeos/file_system_provider/request_manager.h"
      9 #include "chrome/browser/chromeos/file_system_provider/request_value.h"
     10 #include "chrome/browser/chromeos/file_system_provider/service.h"
     11 #include "chrome/common/extensions/api/file_system_provider_internal.h"
     12 
     13 using chromeos::file_system_provider::ProvidedFileSystemInterface;
     14 using chromeos::file_system_provider::RequestManager;
     15 using chromeos::file_system_provider::RequestValue;
     16 using chromeos::file_system_provider::Service;
     17 
     18 namespace extensions {
     19 
     20 const char kNotFoundErrorName[] = "NotFoundError";
     21 const char kSecurityErrorName[] = "SecurityError";
     22 
     23 const char kEmptyNameErrorMessage[] = "Empty display name is not allowed.";
     24 const char kEmptyIdErrorMessage[] = "Empty file system Id s not allowed.";
     25 const char kMountFailedErrorMessage[] = "Mounting the file system failed.";
     26 const char kUnmountFailedErrorMessage[] = "Unmounting the file system failed.";
     27 const char kResponseFailedErrorMessage[] =
     28     "Sending a response for the request failed.";
     29 
     30 base::DictionaryValue* CreateError(const std::string& name,
     31                                    const std::string& message) {
     32   base::DictionaryValue* error = new base::DictionaryValue();
     33   error->SetString("name", name);
     34   error->SetString("message", message);
     35   return error;
     36 }
     37 
     38 base::File::Error ProviderErrorToFileError(
     39     api::file_system_provider::ProviderError error) {
     40   switch (error) {
     41     case api::file_system_provider::PROVIDER_ERROR_OK:
     42       return base::File::FILE_OK;
     43     case api::file_system_provider::PROVIDER_ERROR_FAILED:
     44       return base::File::FILE_ERROR_FAILED;
     45     case api::file_system_provider::PROVIDER_ERROR_IN_USE:
     46       return base::File::FILE_ERROR_IN_USE;
     47     case api::file_system_provider::PROVIDER_ERROR_EXISTS:
     48       return base::File::FILE_ERROR_EXISTS;
     49     case api::file_system_provider::PROVIDER_ERROR_NOT_FOUND:
     50       return base::File::FILE_ERROR_NOT_FOUND;
     51     case api::file_system_provider::PROVIDER_ERROR_ACCESS_DENIED:
     52       return base::File::FILE_ERROR_ACCESS_DENIED;
     53     case api::file_system_provider::PROVIDER_ERROR_TOO_MANY_OPENED:
     54       return base::File::FILE_ERROR_TOO_MANY_OPENED;
     55     case api::file_system_provider::PROVIDER_ERROR_NO_MEMORY:
     56       return base::File::FILE_ERROR_NO_MEMORY;
     57     case api::file_system_provider::PROVIDER_ERROR_NO_SPACE:
     58       return base::File::FILE_ERROR_NO_SPACE;
     59     case api::file_system_provider::PROVIDER_ERROR_NOT_A_DIRECTORY:
     60       return base::File::FILE_ERROR_NOT_A_DIRECTORY;
     61     case api::file_system_provider::PROVIDER_ERROR_INVALID_OPERATION:
     62       return base::File::FILE_ERROR_INVALID_OPERATION;
     63     case api::file_system_provider::PROVIDER_ERROR_SECURITY:
     64       return base::File::FILE_ERROR_SECURITY;
     65     case api::file_system_provider::PROVIDER_ERROR_ABORT:
     66       return base::File::FILE_ERROR_ABORT;
     67     case api::file_system_provider::PROVIDER_ERROR_NOT_A_FILE:
     68       return base::File::FILE_ERROR_NOT_A_FILE;
     69     case api::file_system_provider::PROVIDER_ERROR_NOT_EMPTY:
     70       return base::File::FILE_ERROR_NOT_EMPTY;
     71     case api::file_system_provider::PROVIDER_ERROR_INVALID_URL:
     72       return base::File::FILE_ERROR_INVALID_URL;
     73     case api::file_system_provider::PROVIDER_ERROR_IO:
     74       return base::File::FILE_ERROR_IO;
     75     case api::file_system_provider::PROVIDER_ERROR_NONE:
     76       NOTREACHED();
     77   }
     78   return base::File::FILE_ERROR_FAILED;
     79 }
     80 
     81 FileSystemProviderInternalFunction::FileSystemProviderInternalFunction()
     82     : request_id_(0), request_manager_(NULL) {
     83 }
     84 
     85 void FileSystemProviderInternalFunction::RejectRequest(
     86     base::File::Error error) {
     87   if (!request_manager_->RejectRequest(request_id_, error))
     88     SetErrorResponse(kSecurityErrorName, kResponseFailedErrorMessage);
     89 }
     90 
     91 void FileSystemProviderInternalFunction::FulfillRequest(
     92     scoped_ptr<RequestValue> value,
     93     bool has_more) {
     94   if (!request_manager_->FulfillRequest(request_id_, value.Pass(), has_more))
     95     SetErrorResponse(kSecurityErrorName, kResponseFailedErrorMessage);
     96 }
     97 
     98 bool FileSystemProviderInternalFunction::RunSync() {
     99   DCHECK(args_);
    100   if (!Parse())
    101     return true;
    102 
    103   SendResponse(RunWhenValid());
    104   return true;
    105 }
    106 
    107 bool FileSystemProviderInternalFunction::Parse() {
    108   std::string file_system_id;
    109 
    110   if (!args_->GetString(0, &file_system_id) ||
    111       !args_->GetInteger(1, &request_id_)) {
    112     bad_message_ = true;
    113     SendResponse(false);
    114     return false;
    115   }
    116 
    117   Service* service = Service::Get(GetProfile());
    118   if (!service) {
    119     SendResponse(false);
    120     return false;
    121   }
    122 
    123   ProvidedFileSystemInterface* file_system =
    124       service->GetProvidedFileSystem(extension_id(), file_system_id);
    125   if (!file_system) {
    126     SetErrorResponse(kNotFoundErrorName, kResponseFailedErrorMessage);
    127     SendResponse(true);
    128     return false;
    129   }
    130 
    131   request_manager_ = file_system->GetRequestManager();
    132   return true;
    133 }
    134 
    135 void FileSystemProviderInternalFunction::SetErrorResponse(
    136     const std::string& name,
    137     const std::string& message) {
    138   base::ListValue* result = new base::ListValue();
    139   result->Append(CreateError(name, message));
    140   SetResult(result);
    141 }
    142 
    143 }  // namespace extensions
    144