| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/extensions/file_manager/private_api_file_syste
m.h" | 5 #include "chrome/browser/chromeos/extensions/file_manager/private_api_file_syste
m.h" |
| 6 | 6 |
| 7 #include <sys/statvfs.h> | 7 #include <sys/statvfs.h> |
| 8 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "base/posix/eintr_wrapper.h" | 10 #include "base/posix/eintr_wrapper.h" |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 // The filesystem seems not supporting statvfs(). Assume it to be a commonly | 78 // The filesystem seems not supporting statvfs(). Assume it to be a commonly |
| 79 // used bound 255, and log the failure. | 79 // used bound 255, and log the failure. |
| 80 LOG(ERROR) << "Cannot statvfs() the name length limit for: " << path; | 80 LOG(ERROR) << "Cannot statvfs() the name length limit for: " << path; |
| 81 return 255; | 81 return 255; |
| 82 } | 82 } |
| 83 return stat.f_namemax; | 83 return stat.f_namemax; |
| 84 } | 84 } |
| 85 | 85 |
| 86 // Returns EventRouter for the |profile_id| if available. | 86 // Returns EventRouter for the |profile_id| if available. |
| 87 file_manager::EventRouter* GetEventRouterByProfileId(void* profile_id) { | 87 file_manager::EventRouter* GetEventRouterByProfileId(void* profile_id) { |
| 88 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 88 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 89 | 89 |
| 90 // |profile_id| needs to be checked with ProfileManager::IsValidProfile | 90 // |profile_id| needs to be checked with ProfileManager::IsValidProfile |
| 91 // before using it. | 91 // before using it. |
| 92 Profile* profile = reinterpret_cast<Profile*>(profile_id); | 92 Profile* profile = reinterpret_cast<Profile*>(profile_id); |
| 93 if (!g_browser_process->profile_manager()->IsValidProfile(profile)) | 93 if (!g_browser_process->profile_manager()->IsValidProfile(profile)) |
| 94 return NULL; | 94 return NULL; |
| 95 | 95 |
| 96 return file_manager::EventRouterFactory::GetForProfile(profile); | 96 return file_manager::EventRouterFactory::GetForProfile(profile); |
| 97 } | 97 } |
| 98 | 98 |
| 99 // Notifies the copy progress to extensions via event router. | 99 // Notifies the copy progress to extensions via event router. |
| 100 void NotifyCopyProgress( | 100 void NotifyCopyProgress( |
| 101 void* profile_id, | 101 void* profile_id, |
| 102 storage::FileSystemOperationRunner::OperationID operation_id, | 102 storage::FileSystemOperationRunner::OperationID operation_id, |
| 103 storage::FileSystemOperation::CopyProgressType type, | 103 storage::FileSystemOperation::CopyProgressType type, |
| 104 const FileSystemURL& source_url, | 104 const FileSystemURL& source_url, |
| 105 const FileSystemURL& destination_url, | 105 const FileSystemURL& destination_url, |
| 106 int64 size) { | 106 int64 size) { |
| 107 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 107 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 108 | 108 |
| 109 file_manager::EventRouter* event_router = | 109 file_manager::EventRouter* event_router = |
| 110 GetEventRouterByProfileId(profile_id); | 110 GetEventRouterByProfileId(profile_id); |
| 111 if (event_router) { | 111 if (event_router) { |
| 112 event_router->OnCopyProgress( | 112 event_router->OnCopyProgress( |
| 113 operation_id, type, | 113 operation_id, type, |
| 114 source_url.ToGURL(), destination_url.ToGURL(), size); | 114 source_url.ToGURL(), destination_url.ToGURL(), size); |
| 115 } | 115 } |
| 116 } | 116 } |
| 117 | 117 |
| 118 // Callback invoked periodically on progress update of Copy(). | 118 // Callback invoked periodically on progress update of Copy(). |
| 119 void OnCopyProgress( | 119 void OnCopyProgress( |
| 120 void* profile_id, | 120 void* profile_id, |
| 121 storage::FileSystemOperationRunner::OperationID* operation_id, | 121 storage::FileSystemOperationRunner::OperationID* operation_id, |
| 122 storage::FileSystemOperation::CopyProgressType type, | 122 storage::FileSystemOperation::CopyProgressType type, |
| 123 const FileSystemURL& source_url, | 123 const FileSystemURL& source_url, |
| 124 const FileSystemURL& destination_url, | 124 const FileSystemURL& destination_url, |
| 125 int64 size) { | 125 int64 size) { |
| 126 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 126 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 127 | 127 |
| 128 BrowserThread::PostTask( | 128 BrowserThread::PostTask( |
| 129 BrowserThread::UI, FROM_HERE, | 129 BrowserThread::UI, FROM_HERE, |
| 130 base::Bind(&NotifyCopyProgress, | 130 base::Bind(&NotifyCopyProgress, |
| 131 profile_id, *operation_id, type, | 131 profile_id, *operation_id, type, |
| 132 source_url, destination_url, size)); | 132 source_url, destination_url, size)); |
| 133 } | 133 } |
| 134 | 134 |
| 135 // Notifies the copy completion to extensions via event router. | 135 // Notifies the copy completion to extensions via event router. |
| 136 void NotifyCopyCompletion( | 136 void NotifyCopyCompletion( |
| 137 void* profile_id, | 137 void* profile_id, |
| 138 storage::FileSystemOperationRunner::OperationID operation_id, | 138 storage::FileSystemOperationRunner::OperationID operation_id, |
| 139 const FileSystemURL& source_url, | 139 const FileSystemURL& source_url, |
| 140 const FileSystemURL& destination_url, | 140 const FileSystemURL& destination_url, |
| 141 base::File::Error error) { | 141 base::File::Error error) { |
| 142 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 142 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 143 | 143 |
| 144 file_manager::EventRouter* event_router = | 144 file_manager::EventRouter* event_router = |
| 145 GetEventRouterByProfileId(profile_id); | 145 GetEventRouterByProfileId(profile_id); |
| 146 if (event_router) | 146 if (event_router) |
| 147 event_router->OnCopyCompleted( | 147 event_router->OnCopyCompleted( |
| 148 operation_id, | 148 operation_id, |
| 149 source_url.ToGURL(), destination_url.ToGURL(), error); | 149 source_url.ToGURL(), destination_url.ToGURL(), error); |
| 150 } | 150 } |
| 151 | 151 |
| 152 // Callback invoked upon completion of Copy() (regardless of succeeded or | 152 // Callback invoked upon completion of Copy() (regardless of succeeded or |
| 153 // failed). | 153 // failed). |
| 154 void OnCopyCompleted( | 154 void OnCopyCompleted( |
| 155 void* profile_id, | 155 void* profile_id, |
| 156 storage::FileSystemOperationRunner::OperationID* operation_id, | 156 storage::FileSystemOperationRunner::OperationID* operation_id, |
| 157 const FileSystemURL& source_url, | 157 const FileSystemURL& source_url, |
| 158 const FileSystemURL& destination_url, | 158 const FileSystemURL& destination_url, |
| 159 base::File::Error error) { | 159 base::File::Error error) { |
| 160 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 160 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 161 | 161 |
| 162 BrowserThread::PostTask( | 162 BrowserThread::PostTask( |
| 163 BrowserThread::UI, FROM_HERE, | 163 BrowserThread::UI, FROM_HERE, |
| 164 base::Bind(&NotifyCopyCompletion, | 164 base::Bind(&NotifyCopyCompletion, |
| 165 profile_id, *operation_id, | 165 profile_id, *operation_id, |
| 166 source_url, destination_url, error)); | 166 source_url, destination_url, error)); |
| 167 } | 167 } |
| 168 | 168 |
| 169 // Starts the copy operation via FileSystemOperationRunner. | 169 // Starts the copy operation via FileSystemOperationRunner. |
| 170 storage::FileSystemOperationRunner::OperationID StartCopyOnIOThread( | 170 storage::FileSystemOperationRunner::OperationID StartCopyOnIOThread( |
| 171 void* profile_id, | 171 void* profile_id, |
| 172 scoped_refptr<storage::FileSystemContext> file_system_context, | 172 scoped_refptr<storage::FileSystemContext> file_system_context, |
| 173 const FileSystemURL& source_url, | 173 const FileSystemURL& source_url, |
| 174 const FileSystemURL& destination_url) { | 174 const FileSystemURL& destination_url) { |
| 175 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 175 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 176 | 176 |
| 177 // Note: |operation_id| is owned by the callback for | 177 // Note: |operation_id| is owned by the callback for |
| 178 // FileSystemOperationRunner::Copy(). It is always called in the next message | 178 // FileSystemOperationRunner::Copy(). It is always called in the next message |
| 179 // loop or later, so at least during this invocation it should alive. | 179 // loop or later, so at least during this invocation it should alive. |
| 180 storage::FileSystemOperationRunner::OperationID* operation_id = | 180 storage::FileSystemOperationRunner::OperationID* operation_id = |
| 181 new storage::FileSystemOperationRunner::OperationID; | 181 new storage::FileSystemOperationRunner::OperationID; |
| 182 *operation_id = file_system_context->operation_runner()->Copy( | 182 *operation_id = file_system_context->operation_runner()->Copy( |
| 183 source_url, | 183 source_url, |
| 184 destination_url, | 184 destination_url, |
| 185 storage::FileSystemOperation::OPTION_PRESERVE_LAST_MODIFIED, | 185 storage::FileSystemOperation::OPTION_PRESERVE_LAST_MODIFIED, |
| 186 base::Bind(&OnCopyProgress, profile_id, base::Unretained(operation_id)), | 186 base::Bind(&OnCopyProgress, profile_id, base::Unretained(operation_id)), |
| 187 base::Bind(&OnCopyCompleted, | 187 base::Bind(&OnCopyCompleted, |
| 188 profile_id, | 188 profile_id, |
| 189 base::Owned(operation_id), | 189 base::Owned(operation_id), |
| 190 source_url, | 190 source_url, |
| 191 destination_url)); | 191 destination_url)); |
| 192 return *operation_id; | 192 return *operation_id; |
| 193 } | 193 } |
| 194 | 194 |
| 195 void OnCopyCancelled(base::File::Error error) { | 195 void OnCopyCancelled(base::File::Error error) { |
| 196 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 196 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 197 | 197 |
| 198 // We just ignore the status if the copy is actually cancelled or not, | 198 // We just ignore the status if the copy is actually cancelled or not, |
| 199 // because failing cancellation means the operation is not running now. | 199 // because failing cancellation means the operation is not running now. |
| 200 DLOG_IF(WARNING, error != base::File::FILE_OK) | 200 DLOG_IF(WARNING, error != base::File::FILE_OK) |
| 201 << "Failed to cancel copy: " << error; | 201 << "Failed to cancel copy: " << error; |
| 202 } | 202 } |
| 203 | 203 |
| 204 // Cancels the running copy operation identified by |operation_id|. | 204 // Cancels the running copy operation identified by |operation_id|. |
| 205 void CancelCopyOnIOThread( | 205 void CancelCopyOnIOThread( |
| 206 scoped_refptr<storage::FileSystemContext> file_system_context, | 206 scoped_refptr<storage::FileSystemContext> file_system_context, |
| 207 storage::FileSystemOperationRunner::OperationID operation_id) { | 207 storage::FileSystemOperationRunner::OperationID operation_id) { |
| 208 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 208 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 209 | 209 |
| 210 file_system_context->operation_runner()->Cancel( | 210 file_system_context->operation_runner()->Cancel( |
| 211 operation_id, base::Bind(&OnCopyCancelled)); | 211 operation_id, base::Bind(&OnCopyCancelled)); |
| 212 } | 212 } |
| 213 | 213 |
| 214 // Converts a status code to a bool value and calls the |callback| with it. | 214 // Converts a status code to a bool value and calls the |callback| with it. |
| 215 void StatusCallbackToResponseCallback( | 215 void StatusCallbackToResponseCallback( |
| 216 const base::Callback<void(bool)>& callback, | 216 const base::Callback<void(bool)>& callback, |
| 217 base::File::Error result) { | 217 base::File::Error result) { |
| 218 callback.Run(result == base::File::FILE_OK); | 218 callback.Run(result == base::File::FILE_OK); |
| 219 } | 219 } |
| 220 | 220 |
| 221 // Calls a response callback (on the UI thread) with a file content hash | 221 // Calls a response callback (on the UI thread) with a file content hash |
| 222 // computed on the IO thread. | 222 // computed on the IO thread. |
| 223 void ComputeChecksumRespondOnUIThread( | 223 void ComputeChecksumRespondOnUIThread( |
| 224 const base::Callback<void(const std::string&)>& callback, | 224 const base::Callback<void(const std::string&)>& callback, |
| 225 const std::string& hash) { | 225 const std::string& hash) { |
| 226 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 226 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 227 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 227 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 228 base::Bind(callback, hash)); | 228 base::Bind(callback, hash)); |
| 229 } | 229 } |
| 230 | 230 |
| 231 // Calls a response callback on the UI thread. | 231 // Calls a response callback on the UI thread. |
| 232 void GetFileMetadataRespondOnUIThread( | 232 void GetFileMetadataRespondOnUIThread( |
| 233 const storage::FileSystemOperation::GetMetadataCallback& callback, | 233 const storage::FileSystemOperation::GetMetadataCallback& callback, |
| 234 base::File::Error result, | 234 base::File::Error result, |
| 235 const base::File::Info& file_info) { | 235 const base::File::Info& file_info) { |
| 236 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 236 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 237 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 237 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 238 base::Bind(callback, result, file_info)); | 238 base::Bind(callback, result, file_info)); |
| 239 } | 239 } |
| 240 | 240 |
| 241 } // namespace | 241 } // namespace |
| 242 | 242 |
| 243 ExtensionFunction::ResponseAction | 243 ExtensionFunction::ResponseAction |
| 244 FileManagerPrivateEnableExternalFileSchemeFunction::Run() { | 244 FileManagerPrivateEnableExternalFileSchemeFunction::Run() { |
| 245 ChildProcessSecurityPolicy::GetInstance()->GrantScheme( | 245 ChildProcessSecurityPolicy::GetInstance()->GrantScheme( |
| 246 render_view_host()->GetProcess()->GetID(), content::kExternalFileScheme); | 246 render_view_host()->GetProcess()->GetID(), content::kExternalFileScheme); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 file_system_url.virtual_path()); | 286 file_system_url.virtual_path()); |
| 287 content::ChildProcessSecurityPolicy::GetInstance() | 287 content::ChildProcessSecurityPolicy::GetInstance() |
| 288 ->GrantCreateReadWriteFile(render_view_host()->GetProcess()->GetID(), | 288 ->GrantCreateReadWriteFile(render_view_host()->GetProcess()->GetID(), |
| 289 file_system_url.path()); | 289 file_system_url.path()); |
| 290 } | 290 } |
| 291 } | 291 } |
| 292 return RespondNow(NoArguments()); | 292 return RespondNow(NoArguments()); |
| 293 } | 293 } |
| 294 | 294 |
| 295 void FileWatchFunctionBase::Respond(bool success) { | 295 void FileWatchFunctionBase::Respond(bool success) { |
| 296 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 296 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 297 | 297 |
| 298 SetResult(new base::FundamentalValue(success)); | 298 SetResult(new base::FundamentalValue(success)); |
| 299 SendResponse(success); | 299 SendResponse(success); |
| 300 } | 300 } |
| 301 | 301 |
| 302 bool FileWatchFunctionBase::RunAsync() { | 302 bool FileWatchFunctionBase::RunAsync() { |
| 303 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 303 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 304 | 304 |
| 305 if (!render_view_host() || !render_view_host()->GetProcess()) | 305 if (!render_view_host() || !render_view_host()->GetProcess()) |
| 306 return false; | 306 return false; |
| 307 | 307 |
| 308 // First param is url of a file to watch. | 308 // First param is url of a file to watch. |
| 309 std::string url; | 309 std::string url; |
| 310 if (!args_->GetString(0, &url) || url.empty()) | 310 if (!args_->GetString(0, &url) || url.empty()) |
| 311 return false; | 311 return false; |
| 312 | 312 |
| 313 scoped_refptr<storage::FileSystemContext> file_system_context = | 313 scoped_refptr<storage::FileSystemContext> file_system_context = |
| 314 file_manager::util::GetFileSystemContextForRenderViewHost( | 314 file_manager::util::GetFileSystemContextForRenderViewHost( |
| 315 GetProfile(), render_view_host()); | 315 GetProfile(), render_view_host()); |
| 316 | 316 |
| 317 const FileSystemURL file_system_url = | 317 const FileSystemURL file_system_url = |
| 318 file_system_context->CrackURL(GURL(url)); | 318 file_system_context->CrackURL(GURL(url)); |
| 319 if (file_system_url.path().empty()) { | 319 if (file_system_url.path().empty()) { |
| 320 Respond(false); | 320 Respond(false); |
| 321 return true; | 321 return true; |
| 322 } | 322 } |
| 323 | 323 |
| 324 PerformFileWatchOperation(file_system_context, file_system_url, | 324 PerformFileWatchOperation(file_system_context, file_system_url, |
| 325 extension_id()); | 325 extension_id()); |
| 326 return true; | 326 return true; |
| 327 } | 327 } |
| 328 | 328 |
| 329 void FileManagerPrivateAddFileWatchFunction::PerformFileWatchOperation( | 329 void FileManagerPrivateAddFileWatchFunction::PerformFileWatchOperation( |
| 330 scoped_refptr<storage::FileSystemContext> file_system_context, | 330 scoped_refptr<storage::FileSystemContext> file_system_context, |
| 331 const storage::FileSystemURL& file_system_url, | 331 const storage::FileSystemURL& file_system_url, |
| 332 const std::string& extension_id) { | 332 const std::string& extension_id) { |
| 333 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 333 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 334 | 334 |
| 335 file_manager::EventRouter* const event_router = | 335 file_manager::EventRouter* const event_router = |
| 336 file_manager::EventRouterFactory::GetForProfile(GetProfile()); | 336 file_manager::EventRouterFactory::GetForProfile(GetProfile()); |
| 337 | 337 |
| 338 storage::WatcherManager* const watcher_manager = | 338 storage::WatcherManager* const watcher_manager = |
| 339 file_system_context->GetWatcherManager(file_system_url.type()); | 339 file_system_context->GetWatcherManager(file_system_url.type()); |
| 340 if (watcher_manager) { | 340 if (watcher_manager) { |
| 341 watcher_manager->AddWatcher( | 341 watcher_manager->AddWatcher( |
| 342 file_system_url, false /* recursive */, | 342 file_system_url, false /* recursive */, |
| 343 base::Bind( | 343 base::Bind( |
| 344 &StatusCallbackToResponseCallback, | 344 &StatusCallbackToResponseCallback, |
| 345 base::Bind(&FileManagerPrivateAddFileWatchFunction::Respond, this)), | 345 base::Bind(&FileManagerPrivateAddFileWatchFunction::Respond, this)), |
| 346 base::Bind(&file_manager::EventRouter::OnWatcherManagerNotification, | 346 base::Bind(&file_manager::EventRouter::OnWatcherManagerNotification, |
| 347 event_router->GetWeakPtr(), file_system_url, extension_id)); | 347 event_router->GetWeakPtr(), file_system_url, extension_id)); |
| 348 return; | 348 return; |
| 349 } | 349 } |
| 350 | 350 |
| 351 // Obsolete. Fallback code if storage::WatcherManager is not implemented. | 351 // Obsolete. Fallback code if storage::WatcherManager is not implemented. |
| 352 event_router->AddFileWatch( | 352 event_router->AddFileWatch( |
| 353 file_system_url.path(), file_system_url.virtual_path(), extension_id, | 353 file_system_url.path(), file_system_url.virtual_path(), extension_id, |
| 354 base::Bind(&FileManagerPrivateAddFileWatchFunction::Respond, this)); | 354 base::Bind(&FileManagerPrivateAddFileWatchFunction::Respond, this)); |
| 355 } | 355 } |
| 356 | 356 |
| 357 void FileManagerPrivateRemoveFileWatchFunction::PerformFileWatchOperation( | 357 void FileManagerPrivateRemoveFileWatchFunction::PerformFileWatchOperation( |
| 358 scoped_refptr<storage::FileSystemContext> file_system_context, | 358 scoped_refptr<storage::FileSystemContext> file_system_context, |
| 359 const storage::FileSystemURL& file_system_url, | 359 const storage::FileSystemURL& file_system_url, |
| 360 const std::string& extension_id) { | 360 const std::string& extension_id) { |
| 361 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 361 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 362 | 362 |
| 363 file_manager::EventRouter* const event_router = | 363 file_manager::EventRouter* const event_router = |
| 364 file_manager::EventRouterFactory::GetForProfile(GetProfile()); | 364 file_manager::EventRouterFactory::GetForProfile(GetProfile()); |
| 365 | 365 |
| 366 storage::WatcherManager* const watcher_manager = | 366 storage::WatcherManager* const watcher_manager = |
| 367 file_system_context->GetWatcherManager(file_system_url.type()); | 367 file_system_context->GetWatcherManager(file_system_url.type()); |
| 368 if (watcher_manager) { | 368 if (watcher_manager) { |
| 369 watcher_manager->RemoveWatcher( | 369 watcher_manager->RemoveWatcher( |
| 370 file_system_url, false /* recursive */, | 370 file_system_url, false /* recursive */, |
| 371 base::Bind(&StatusCallbackToResponseCallback, | 371 base::Bind(&StatusCallbackToResponseCallback, |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 volume_info.mount_path.AsUTF8Unsafe()); | 511 volume_info.mount_path.AsUTF8Unsafe()); |
| 512 SendResponse(true); | 512 SendResponse(true); |
| 513 return true; | 513 return true; |
| 514 } | 514 } |
| 515 | 515 |
| 516 // Obtains file size of URL. | 516 // Obtains file size of URL. |
| 517 void GetFileMetadataOnIOThread( | 517 void GetFileMetadataOnIOThread( |
| 518 scoped_refptr<storage::FileSystemContext> file_system_context, | 518 scoped_refptr<storage::FileSystemContext> file_system_context, |
| 519 const FileSystemURL& url, | 519 const FileSystemURL& url, |
| 520 const storage::FileSystemOperation::GetMetadataCallback& callback) { | 520 const storage::FileSystemOperation::GetMetadataCallback& callback) { |
| 521 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 521 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 522 file_system_context->operation_runner()->GetMetadata( | 522 file_system_context->operation_runner()->GetMetadata( |
| 523 url, base::Bind(&GetFileMetadataRespondOnUIThread, callback)); | 523 url, base::Bind(&GetFileMetadataRespondOnUIThread, callback)); |
| 524 } | 524 } |
| 525 | 525 |
| 526 // Checks if the available space of the |path| is enough for required |bytes|. | 526 // Checks if the available space of the |path| is enough for required |bytes|. |
| 527 bool CheckLocalDiskSpaceOnIOThread(const base::FilePath& path, int64 bytes) { | 527 bool CheckLocalDiskSpaceOnIOThread(const base::FilePath& path, int64 bytes) { |
| 528 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 528 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 529 return bytes <= base::SysInfo::AmountOfFreeDiskSpace(path) - | 529 return bytes <= base::SysInfo::AmountOfFreeDiskSpace(path) - |
| 530 cryptohome::kMinFreeSpaceInBytes; | 530 cryptohome::kMinFreeSpaceInBytes; |
| 531 } | 531 } |
| 532 | 532 |
| 533 bool FileManagerPrivateStartCopyFunction::RunAsync() { | 533 bool FileManagerPrivateStartCopyFunction::RunAsync() { |
| 534 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 534 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 535 | 535 |
| 536 using extensions::api::file_manager_private::StartCopy::Params; | 536 using extensions::api::file_manager_private::StartCopy::Params; |
| 537 const scoped_ptr<Params> params(Params::Create(*args_)); | 537 const scoped_ptr<Params> params(Params::Create(*args_)); |
| 538 EXTENSION_FUNCTION_VALIDATE(params); | 538 EXTENSION_FUNCTION_VALIDATE(params); |
| 539 | 539 |
| 540 if (params->source_url.empty() || params->parent.empty() || | 540 if (params->source_url.empty() || params->parent.empty() || |
| 541 params->new_name.empty()) { | 541 params->new_name.empty()) { |
| 542 // Error code in format of DOMError.name. | 542 // Error code in format of DOMError.name. |
| 543 SetError("EncodingError"); | 543 SetError("EncodingError"); |
| 544 return false; | 544 return false; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 579 | 579 |
| 580 return BrowserThread::PostTask( | 580 return BrowserThread::PostTask( |
| 581 BrowserThread::UI, FROM_HERE, | 581 BrowserThread::UI, FROM_HERE, |
| 582 base::Bind(&FileManagerPrivateStartCopyFunction::RunAfterFreeDiskSpace, | 582 base::Bind(&FileManagerPrivateStartCopyFunction::RunAfterFreeDiskSpace, |
| 583 this, true)); | 583 this, true)); |
| 584 } | 584 } |
| 585 | 585 |
| 586 void FileManagerPrivateStartCopyFunction::RunAfterGetFileMetadata( | 586 void FileManagerPrivateStartCopyFunction::RunAfterGetFileMetadata( |
| 587 base::File::Error result, | 587 base::File::Error result, |
| 588 const base::File::Info& file_info) { | 588 const base::File::Info& file_info) { |
| 589 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 589 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 590 | 590 |
| 591 if (result != base::File::FILE_OK) { | 591 if (result != base::File::FILE_OK) { |
| 592 SetError("NotFoundError"); | 592 SetError("NotFoundError"); |
| 593 SendResponse(false); | 593 SendResponse(false); |
| 594 return; | 594 return; |
| 595 } | 595 } |
| 596 | 596 |
| 597 drive::FileSystemInterface* const drive_file_system = | 597 drive::FileSystemInterface* const drive_file_system = |
| 598 drive::util::GetFileSystemByProfile(GetProfile()); | 598 drive::util::GetFileSystemByProfile(GetProfile()); |
| 599 if (drive_file_system) { | 599 if (drive_file_system) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 610 file_info.size), | 610 file_info.size), |
| 611 base::Bind(&FileManagerPrivateStartCopyFunction::RunAfterFreeDiskSpace, | 611 base::Bind(&FileManagerPrivateStartCopyFunction::RunAfterFreeDiskSpace, |
| 612 this)); | 612 this)); |
| 613 if (!result) | 613 if (!result) |
| 614 SendResponse(false); | 614 SendResponse(false); |
| 615 } | 615 } |
| 616 } | 616 } |
| 617 | 617 |
| 618 void FileManagerPrivateStartCopyFunction::RunAfterFreeDiskSpace( | 618 void FileManagerPrivateStartCopyFunction::RunAfterFreeDiskSpace( |
| 619 bool available) { | 619 bool available) { |
| 620 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 620 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 621 | 621 |
| 622 if (!available) { | 622 if (!available) { |
| 623 SetError("QuotaExceededError"); | 623 SetError("QuotaExceededError"); |
| 624 SendResponse(false); | 624 SendResponse(false); |
| 625 return; | 625 return; |
| 626 } | 626 } |
| 627 | 627 |
| 628 scoped_refptr<storage::FileSystemContext> file_system_context = | 628 scoped_refptr<storage::FileSystemContext> file_system_context = |
| 629 file_manager::util::GetFileSystemContextForRenderViewHost( | 629 file_manager::util::GetFileSystemContextForRenderViewHost( |
| 630 GetProfile(), render_view_host()); | 630 GetProfile(), render_view_host()); |
| 631 const bool result = BrowserThread::PostTaskAndReplyWithResult( | 631 const bool result = BrowserThread::PostTaskAndReplyWithResult( |
| 632 BrowserThread::IO, FROM_HERE, | 632 BrowserThread::IO, FROM_HERE, |
| 633 base::Bind(&StartCopyOnIOThread, GetProfile(), file_system_context, | 633 base::Bind(&StartCopyOnIOThread, GetProfile(), file_system_context, |
| 634 source_url_, destination_url_), | 634 source_url_, destination_url_), |
| 635 base::Bind(&FileManagerPrivateStartCopyFunction::RunAfterStartCopy, | 635 base::Bind(&FileManagerPrivateStartCopyFunction::RunAfterStartCopy, |
| 636 this)); | 636 this)); |
| 637 if (!result) | 637 if (!result) |
| 638 SendResponse(false); | 638 SendResponse(false); |
| 639 } | 639 } |
| 640 | 640 |
| 641 void FileManagerPrivateStartCopyFunction::RunAfterStartCopy( | 641 void FileManagerPrivateStartCopyFunction::RunAfterStartCopy( |
| 642 int operation_id) { | 642 int operation_id) { |
| 643 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 643 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 644 | 644 |
| 645 SetResult(new base::FundamentalValue(operation_id)); | 645 SetResult(new base::FundamentalValue(operation_id)); |
| 646 SendResponse(true); | 646 SendResponse(true); |
| 647 } | 647 } |
| 648 | 648 |
| 649 bool FileManagerPrivateCancelCopyFunction::RunAsync() { | 649 bool FileManagerPrivateCancelCopyFunction::RunAsync() { |
| 650 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 650 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 651 | 651 |
| 652 using extensions::api::file_manager_private::CancelCopy::Params; | 652 using extensions::api::file_manager_private::CancelCopy::Params; |
| 653 const scoped_ptr<Params> params(Params::Create(*args_)); | 653 const scoped_ptr<Params> params(Params::Create(*args_)); |
| 654 EXTENSION_FUNCTION_VALIDATE(params); | 654 EXTENSION_FUNCTION_VALIDATE(params); |
| 655 | 655 |
| 656 scoped_refptr<storage::FileSystemContext> file_system_context = | 656 scoped_refptr<storage::FileSystemContext> file_system_context = |
| 657 file_manager::util::GetFileSystemContextForRenderViewHost( | 657 file_manager::util::GetFileSystemContextForRenderViewHost( |
| 658 GetProfile(), render_view_host()); | 658 GetProfile(), render_view_host()); |
| 659 | 659 |
| 660 // We don't much take care about the result of cancellation. | 660 // We don't much take care about the result of cancellation. |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 773 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 773 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 774 base::Bind(&FileStreamMd5Digester::GetMd5Digest, | 774 base::Bind(&FileStreamMd5Digester::GetMd5Digest, |
| 775 base::Unretained(digester_.get()), | 775 base::Unretained(digester_.get()), |
| 776 base::Passed(&reader), result_callback)); | 776 base::Passed(&reader), result_callback)); |
| 777 | 777 |
| 778 return true; | 778 return true; |
| 779 } | 779 } |
| 780 | 780 |
| 781 void FileManagerPrivateComputeChecksumFunction::Respond( | 781 void FileManagerPrivateComputeChecksumFunction::Respond( |
| 782 const std::string& hash) { | 782 const std::string& hash) { |
| 783 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 783 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 784 SetResult(new base::StringValue(hash)); | 784 SetResult(new base::StringValue(hash)); |
| 785 SendResponse(true); | 785 SendResponse(true); |
| 786 } | 786 } |
| 787 | 787 |
| 788 bool FileManagerPrivateSearchFilesByHashesFunction::RunAsync() { | 788 bool FileManagerPrivateSearchFilesByHashesFunction::RunAsync() { |
| 789 using api::file_manager_private::SearchFilesByHashes::Params; | 789 using api::file_manager_private::SearchFilesByHashes::Params; |
| 790 const scoped_ptr<Params> params(Params::Create(*args_)); | 790 const scoped_ptr<Params> params(Params::Create(*args_)); |
| 791 EXTENSION_FUNCTION_VALIDATE(params); | 791 EXTENSION_FUNCTION_VALIDATE(params); |
| 792 | 792 |
| 793 // TODO(hirono): Check the volume ID and fail the function for volumes other | 793 // TODO(hirono): Check the volume ID and fail the function for volumes other |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 897 return RespondLater(); | 897 return RespondLater(); |
| 898 } | 898 } |
| 899 | 899 |
| 900 void FileManagerPrivateSetEntryTagFunction::OnSetEntryPropertyCompleted( | 900 void FileManagerPrivateSetEntryTagFunction::OnSetEntryPropertyCompleted( |
| 901 drive::FileError result) { | 901 drive::FileError result) { |
| 902 Respond(result == drive::FILE_ERROR_OK ? NoArguments() | 902 Respond(result == drive::FILE_ERROR_OK ? NoArguments() |
| 903 : Error("Failed to set a tag.")); | 903 : Error("Failed to set a tag.")); |
| 904 } | 904 } |
| 905 | 905 |
| 906 } // namespace extensions | 906 } // namespace extensions |
| OLD | NEW |