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