OLD | NEW |
(Empty) | |
| 1 // Copyright 2015 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/file_system_plugin/provid
ed_file_system_adapter.h" |
| 6 |
| 7 using extensions::api::file_system_provider::ProviderError; |
| 8 |
| 9 namespace chromeos { |
| 10 namespace file_system_provider { |
| 11 |
| 12 //static |
| 13 RequestType |
| 14 ProvidedFileSystemAdapter::OperationTypeFromExtensionEvent( |
| 15 const std::string& extension_operation) { |
| 16 using namespace extensions::api::file_system_provider; |
| 17 if (extension_operation==OnGetMetadataRequested::kEventName ) |
| 18 return GET_METADATA; |
| 19 else if (extension_operation==OnReadDirectoryRequested::kEventName ) |
| 20 return READ_DIRECTORY; |
| 21 else if (extension_operation==OnOpenFileRequested::kEventName) |
| 22 return OPEN_FILE; |
| 23 else if (extension_operation==OnReadFileRequested::kEventName) |
| 24 return READ_FILE; |
| 25 else if (extension_operation==OnWriteFileRequested::kEventName) |
| 26 return WRITE_FILE; |
| 27 else if (extension_operation==OnCloseFileRequested::kEventName) |
| 28 return CLOSE_FILE; |
| 29 else if (extension_operation==OnAbortRequested::kEventName) |
| 30 return ABORT; |
| 31 else if (extension_operation==OnAddWatcherRequested::kEventName) |
| 32 return ADD_WATCHER; |
| 33 else if (extension_operation==OnRemoveWatcherRequested::kEventName) |
| 34 return REMOVE_WATCHER; |
| 35 else if (extension_operation==OnConfigureRequested::kEventName) |
| 36 return CONFIGURE; |
| 37 else if (extension_operation==OnCopyEntryRequested::kEventName) |
| 38 return COPY_ENTRY; |
| 39 else if (extension_operation==OnMoveEntryRequested::kEventName) |
| 40 return MOVE_ENTRY; |
| 41 else if (extension_operation==OnCreateDirectoryRequested::kEventName) |
| 42 return CREATE_DIRECTORY; |
| 43 else if (extension_operation==OnCreateFileRequested::kEventName) |
| 44 return CREATE_FILE; |
| 45 else if (extension_operation==OnDeleteEntryRequested::kEventName) |
| 46 return DELETE_ENTRY; |
| 47 else if (extension_operation==OnUnmountRequested::kEventName) |
| 48 return REQUEST_UNMOUNT; |
| 49 else if (extension_operation==OnTruncateRequested::kEventName) |
| 50 return TRUNCATE; |
| 51 |
| 52 return ABORT; |
| 53 NOTREACHED(); |
| 54 } |
| 55 |
| 56 // Translate the error returned by the extensions decoders to base::File errors |
| 57 base::File::Error PP_ProviderErrorToFileError( |
| 58 ProviderError error) { |
| 59 switch (error) { |
| 60 case ProviderError::PROVIDER_ERROR_OK: |
| 61 return base::File::FILE_OK; |
| 62 case ProviderError::PROVIDER_ERROR_FAILED: |
| 63 return base::File::FILE_ERROR_FAILED; |
| 64 case ProviderError::PROVIDER_ERROR_IN_USE: |
| 65 return base::File::FILE_ERROR_IN_USE; |
| 66 case ProviderError::PROVIDER_ERROR_EXISTS: |
| 67 return base::File::FILE_ERROR_EXISTS; |
| 68 case ProviderError::PROVIDER_ERROR_NOT_FOUND: |
| 69 return base::File::FILE_ERROR_NOT_FOUND; |
| 70 case ProviderError::PROVIDER_ERROR_ACCESS_DENIED: |
| 71 return base::File::FILE_ERROR_ACCESS_DENIED; |
| 72 case ProviderError::PROVIDER_ERROR_TOO_MANY_OPENED: |
| 73 return base::File::FILE_ERROR_TOO_MANY_OPENED; |
| 74 case ProviderError::PROVIDER_ERROR_NO_MEMORY: |
| 75 return base::File::FILE_ERROR_NO_MEMORY; |
| 76 case ProviderError::PROVIDER_ERROR_NO_SPACE: |
| 77 return base::File::FILE_ERROR_NO_SPACE; |
| 78 case ProviderError::PROVIDER_ERROR_NOT_A_DIRECTORY: |
| 79 return base::File::FILE_ERROR_NOT_A_DIRECTORY; |
| 80 case ProviderError::PROVIDER_ERROR_INVALID_OPERATION: |
| 81 return base::File::FILE_ERROR_INVALID_OPERATION; |
| 82 case ProviderError::PROVIDER_ERROR_SECURITY: |
| 83 return base::File::FILE_ERROR_SECURITY; |
| 84 case ProviderError::PROVIDER_ERROR_ABORT: |
| 85 return base::File::FILE_ERROR_ABORT; |
| 86 case ProviderError::PROVIDER_ERROR_NOT_A_FILE: |
| 87 return base::File::FILE_ERROR_NOT_A_FILE; |
| 88 case ProviderError::PROVIDER_ERROR_NOT_EMPTY: |
| 89 return base::File::FILE_ERROR_NOT_EMPTY; |
| 90 case ProviderError::PROVIDER_ERROR_INVALID_URL: |
| 91 return base::File::FILE_ERROR_INVALID_URL; |
| 92 case ProviderError::PROVIDER_ERROR_IO: |
| 93 return base::File::FILE_ERROR_IO; |
| 94 case ProviderError::PROVIDER_ERROR_NONE: |
| 95 NOTREACHED(); |
| 96 } |
| 97 return base::File::FILE_ERROR_FAILED; |
| 98 } |
| 99 |
| 100 bool ProvidedFileSystemAdapter::PushSuccessResponse( |
| 101 int32_t operation_type, |
| 102 scoped_ptr<base::ListValue> response) { |
| 103 switch(operation_type) { |
| 104 case READ_DIRECTORY: { |
| 105 using extensions::api:: |
| 106 file_system_provider_internal::ReadDirectoryRequestedSuccess:: |
| 107 Params; |
| 108 scoped_ptr<Params> params(Params::Create(*response)); |
| 109 if(!params.get()) |
| 110 return false; |
| 111 |
| 112 const bool has_more = params->has_more; |
| 113 const int32_t request_id = params->request_id; |
| 114 if ( base::File::FILE_OK!= |
| 115 provided_file_system_impl_->GetRequestManager()->FulfillRequest( |
| 116 request_id, |
| 117 chromeos::file_system_provider::RequestValue:: |
| 118 CreateForReadDirectorySuccess(params.Pass()), |
| 119 has_more) |
| 120 ) |
| 121 return false; |
| 122 } |
| 123 break; |
| 124 case GET_METADATA: { |
| 125 using extensions::api::file_system_provider_internal:: |
| 126 GetMetadataRequestedSuccess::Params; |
| 127 scoped_ptr<Params> params(Params::Create(*response)); |
| 128 if(!params.get()) |
| 129 return false; |
| 130 |
| 131 const int32_t request_id =params->request_id; |
| 132 if (base::File::FILE_OK!= |
| 133 provided_file_system_impl_->GetRequestManager()->FulfillRequest( |
| 134 request_id, |
| 135 chromeos::file_system_provider::RequestValue:: |
| 136 CreateForGetMetadataSuccess(params.Pass()), |
| 137 false) |
| 138 ) |
| 139 return false; |
| 140 } |
| 141 break; |
| 142 case READ_FILE: { |
| 143 using extensions::api::file_system_provider_internal:: |
| 144 ReadFileRequestedSuccess::Params; |
| 145 scoped_ptr<Params> params(Params::Create(*response)); |
| 146 if (!params.get()) |
| 147 return false; |
| 148 |
| 149 const bool has_more = params->has_more; |
| 150 const int32_t request_id = params->request_id; |
| 151 if (base::File::FILE_OK!= |
| 152 provided_file_system_impl_->GetRequestManager()->FulfillRequest( |
| 153 request_id, |
| 154 chromeos::file_system_provider::RequestValue:: |
| 155 CreateForReadFileSuccess(params.Pass()), |
| 156 has_more) ) |
| 157 return false; |
| 158 } |
| 159 break; |
| 160 case REQUEST_UNMOUNT: { |
| 161 using extensions::api::file_system_provider_internal:: |
| 162 UnmountRequestedSuccess::Params; |
| 163 scoped_ptr<Params> params(Params::Create(*response)); |
| 164 if(!params.get()) |
| 165 return false; |
| 166 const int32_t request_id = params->request_id; |
| 167 if (base::File::FILE_OK!= |
| 168 provided_file_system_impl_->GetRequestManager()->FulfillRequest( |
| 169 request_id, |
| 170 chromeos::file_system_provider::RequestValue:: |
| 171 CreateForUnmountSuccess( params.Pass()), |
| 172 false) |
| 173 ) |
| 174 return false; |
| 175 } |
| 176 break; |
| 177 default: { |
| 178 using extensions::api::file_system_provider_internal:: |
| 179 OperationRequestedSuccess::Params; |
| 180 scoped_ptr<Params> params(Params::Create(*response)); |
| 181 if(!params.get()) |
| 182 return false; |
| 183 |
| 184 const int32_t request_id = params->request_id; |
| 185 if (base::File::FILE_OK!= |
| 186 provided_file_system_impl_->GetRequestManager()->FulfillRequest( |
| 187 request_id, |
| 188 chromeos::file_system_provider::RequestValue:: |
| 189 CreateForOperationSuccess(params.Pass()), |
| 190 false) |
| 191 ) |
| 192 return false; |
| 193 } |
| 194 break; |
| 195 } |
| 196 return true; |
| 197 } |
| 198 |
| 199 bool ProvidedFileSystemAdapter::PushErrorResponse( |
| 200 scoped_ptr<base::ListValue> reponse) { |
| 201 |
| 202 using extensions::api::file_system_provider_internal:: |
| 203 OperationRequestedError::Params; |
| 204 |
| 205 scoped_ptr<Params> params(Params::Create(*reponse)); |
| 206 if(!params.get()) |
| 207 return false; |
| 208 |
| 209 const base::File::Error error = PP_ProviderErrorToFileError(params->error); |
| 210 |
| 211 const int32_t request_id = params->request_id; |
| 212 if( base::File::FILE_OK!= |
| 213 provided_file_system_impl_->GetRequestManager()->RejectRequest( |
| 214 request_id, |
| 215 chromeos::file_system_provider::RequestValue:: |
| 216 CreateForOperationError(params.Pass()), |
| 217 error) |
| 218 ) |
| 219 return false; |
| 220 return true; |
| 221 } |
| 222 |
| 223 storage::WatcherManager::ChangeType ParseChangeType( |
| 224 const extensions::api::file_system_provider::ChangeType& change_type) { |
| 225 switch (change_type) { |
| 226 case extensions::api::file_system_provider::CHANGE_TYPE_CHANGED: |
| 227 return storage::WatcherManager::CHANGED; |
| 228 case extensions::api::file_system_provider::CHANGE_TYPE_DELETED: |
| 229 return storage::WatcherManager::DELETED; |
| 230 default: |
| 231 break; |
| 232 } |
| 233 NOTREACHED(); |
| 234 return storage::WatcherManager::CHANGED; |
| 235 } |
| 236 |
| 237 // Convert the change from the IDL type to a native type. The reason IDL types |
| 238 // are not used is since they are imperfect, eg. paths are stored as strings. |
| 239 ProvidedFileSystemObserver::Change ParseChange( |
| 240 const extensions::api::file_system_provider::Change& change) { |
| 241 ProvidedFileSystemObserver::Change result; |
| 242 result.entry_path = base::FilePath::FromUTF8Unsafe(change.entry_path); |
| 243 result.change_type = ParseChangeType(change.change_type); |
| 244 return result; |
| 245 } |
| 246 |
| 247 // Converts a list of child changes from the IDL type to a native type. |
| 248 scoped_ptr<ProvidedFileSystemObserver::Changes> ParseChanges( |
| 249 const std::vector< |
| 250 linked_ptr<extensions::api::file_system_provider::Change>>& changes) { |
| 251 scoped_ptr<ProvidedFileSystemObserver::Changes> results( |
| 252 new ProvidedFileSystemObserver::Changes); |
| 253 for (const auto& change : changes) { |
| 254 results->push_back(ParseChange(*change)); |
| 255 } |
| 256 return results; |
| 257 } |
| 258 |
| 259 bool ProvidedFileSystemAdapter::PushChangeNotificationResponse( |
| 260 scoped_ptr<base::ListValue> response, |
| 261 StatusCallback callback) { |
| 262 using extensions::api::file_system_provider::Notify::Params; |
| 263 scoped_ptr<Params> params(Params::Create(*response)); |
| 264 if (!params.get()) |
| 265 return false; |
| 266 |
| 267 provided_file_system_impl_->Notify( |
| 268 base::FilePath::FromUTF8Unsafe(params->options.observed_path), |
| 269 params->options.recursive, ParseChangeType(params->options.change_type), |
| 270 params->options.changes.get() |
| 271 ? ParseChanges(*params->options.changes.get()) |
| 272 : make_scoped_ptr(new ProvidedFileSystemObserver::Changes), |
| 273 params->options.tag.get() ? *params->options.tag.get() : "", |
| 274 callback ); |
| 275 return true; |
| 276 } |
| 277 |
| 278 ProvidedFileSystemInterface* |
| 279 ProvidedFileSystemAdapter::GetProvidedFileSystem() { |
| 280 return provided_file_system_impl_.get(); |
| 281 } |
| 282 |
| 283 ProvidedFileSystemAdapter::ProvidedFileSystemAdapter( |
| 284 scoped_ptr<ProvidedFileSystemInterface> file_system) |
| 285 : provided_file_system_impl_(file_system.Pass()) { |
| 286 |
| 287 } |
| 288 |
| 289 ProvidedFileSystemAdapter::~ProvidedFileSystemAdapter() {} |
| 290 |
| 291 } // namespace file_system_provider |
| 292 } // namespace chromeos |
OLD | NEW |