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