| 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/sync_file_system/local/local_file_sync_service.h" | 5 #include "chrome/browser/sync_file_system/local/local_file_sync_service.h" | 
| 6 | 6 | 
| 7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" | 
| 8 #include "chrome/browser/extensions/extension_service.h" | 8 #include "chrome/browser/extensions/extension_service.h" | 
| 9 #include "chrome/browser/extensions/extension_system.h" | 9 #include "chrome/browser/extensions/extension_system.h" | 
| 10 #include "chrome/browser/profiles/profile.h" | 10 #include "chrome/browser/profiles/profile.h" | 
| 11 #include "chrome/browser/sync_file_system/file_change.h" | 11 #include "chrome/browser/sync_file_system/file_change.h" | 
| 12 #include "chrome/browser/sync_file_system/local/local_file_change_tracker.h" | 12 #include "chrome/browser/sync_file_system/local/local_file_change_tracker.h" | 
| 13 #include "chrome/browser/sync_file_system/local/local_file_sync_context.h" | 13 #include "chrome/browser/sync_file_system/local/local_file_sync_context.h" | 
| 14 #include "chrome/browser/sync_file_system/local/sync_file_system_backend.h" | 14 #include "chrome/browser/sync_file_system/local/sync_file_system_backend.h" | 
| 15 #include "chrome/browser/sync_file_system/local_change_processor.h" | 15 #include "chrome/browser/sync_file_system/local_change_processor.h" | 
| 16 #include "chrome/browser/sync_file_system/logger.h" | 16 #include "chrome/browser/sync_file_system/logger.h" | 
| 17 #include "chrome/browser/sync_file_system/sync_file_metadata.h" | 17 #include "chrome/browser/sync_file_system/sync_file_metadata.h" | 
| 18 #include "content/public/browser/browser_context.h" | 18 #include "content/public/browser/browser_context.h" | 
| 19 #include "content/public/browser/browser_thread.h" | 19 #include "content/public/browser/browser_thread.h" | 
| 20 #include "content/public/browser/site_instance.h" | 20 #include "content/public/browser/site_instance.h" | 
| 21 #include "content/public/browser/storage_partition.h" | 21 #include "content/public/browser/storage_partition.h" | 
| 22 #include "url/gurl.h" | 22 #include "url/gurl.h" | 
| 23 #include "webkit/browser/fileapi/file_system_context.h" | 23 #include "webkit/browser/fileapi/file_system_context.h" | 
| 24 #include "webkit/browser/fileapi/file_system_url.h" | 24 #include "webkit/browser/fileapi/file_system_url.h" | 
|  | 25 #include "webkit/common/blob/scoped_file.h" | 
| 25 | 26 | 
| 26 using content::BrowserThread; | 27 using content::BrowserThread; | 
| 27 using fileapi::FileSystemURL; | 28 using fileapi::FileSystemURL; | 
| 28 | 29 | 
| 29 namespace sync_file_system { | 30 namespace sync_file_system { | 
| 30 | 31 | 
| 31 namespace { | 32 namespace { | 
| 32 | 33 | 
| 33 void PrepareForProcessRemoteChangeCallbackAdapter( | 34 void PrepareForProcessRemoteChangeCallbackAdapter( | 
| 34     const RemoteChangeProcessor::PrepareChangeCallback& callback, | 35     const RemoteChangeProcessor::PrepareChangeCallback& callback, | 
| 35     SyncStatusCode status, | 36     SyncStatusCode status, | 
| 36     const LocalFileSyncInfo& sync_file_info) { | 37     const LocalFileSyncInfo& sync_file_info, | 
|  | 38     scoped_ptr<webkit_blob::ScopedFile> snapshot) { | 
| 37   callback.Run(status, sync_file_info.metadata, sync_file_info.changes); | 39   callback.Run(status, sync_file_info.metadata, sync_file_info.changes); | 
| 38 } | 40 } | 
| 39 | 41 | 
| 40 }  // namespace | 42 }  // namespace | 
| 41 | 43 | 
| 42 LocalFileSyncService::OriginChangeMap::OriginChangeMap() | 44 LocalFileSyncService::OriginChangeMap::OriginChangeMap() | 
| 43     : next_(change_count_map_.end()) {} | 45     : next_(change_count_map_.end()) {} | 
| 44 LocalFileSyncService::OriginChangeMap::~OriginChangeMap() {} | 46 LocalFileSyncService::OriginChangeMap::~OriginChangeMap() {} | 
| 45 | 47 | 
| 46 bool LocalFileSyncService::OriginChangeMap::NextOriginToProcess(GURL* origin) { | 48 bool LocalFileSyncService::OriginChangeMap::NextOriginToProcess(GURL* origin) { | 
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 90     disabled_origins_.erase(origin); | 92     disabled_origins_.erase(origin); | 
| 91   else | 93   else | 
| 92     disabled_origins_.insert(origin); | 94     disabled_origins_.insert(origin); | 
| 93 } | 95 } | 
| 94 | 96 | 
| 95 // LocalFileSyncService ------------------------------------------------------- | 97 // LocalFileSyncService ------------------------------------------------------- | 
| 96 | 98 | 
| 97 LocalFileSyncService::LocalFileSyncService(Profile* profile) | 99 LocalFileSyncService::LocalFileSyncService(Profile* profile) | 
| 98     : profile_(profile), | 100     : profile_(profile), | 
| 99       sync_context_(new LocalFileSyncContext( | 101       sync_context_(new LocalFileSyncContext( | 
|  | 102           profile_->GetPath(), | 
| 100           BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI).get(), | 103           BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI).get(), | 
| 101           BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO) | 104           BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO) | 
| 102               .get())), | 105               .get())), | 
| 103       local_change_processor_(NULL) { | 106       local_change_processor_(NULL) { | 
| 104   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 107   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| 105   sync_context_->AddOriginChangeObserver(this); | 108   sync_context_->AddOriginChangeObserver(this); | 
| 106 } | 109 } | 
| 107 | 110 | 
| 108 LocalFileSyncService::~LocalFileSyncService() { | 111 LocalFileSyncService::~LocalFileSyncService() { | 
| 109   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 112   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 355   DVLOG(1) << "Local sync is finished with: " << status | 358   DVLOG(1) << "Local sync is finished with: " << status | 
| 356            << " on " << url.DebugString(); | 359            << " on " << url.DebugString(); | 
| 357   DCHECK(!local_sync_callback_.is_null()); | 360   DCHECK(!local_sync_callback_.is_null()); | 
| 358   SyncFileCallback callback = local_sync_callback_; | 361   SyncFileCallback callback = local_sync_callback_; | 
| 359   local_sync_callback_.Reset(); | 362   local_sync_callback_.Reset(); | 
| 360   callback.Run(status, url); | 363   callback.Run(status, url); | 
| 361 } | 364 } | 
| 362 | 365 | 
| 363 void LocalFileSyncService::DidGetFileForLocalSync( | 366 void LocalFileSyncService::DidGetFileForLocalSync( | 
| 364     SyncStatusCode status, | 367     SyncStatusCode status, | 
| 365     const LocalFileSyncInfo& sync_file_info) { | 368     const LocalFileSyncInfo& sync_file_info, | 
|  | 369     scoped_ptr<webkit_blob::ScopedFile> snapshot) { | 
| 366   DCHECK(!local_sync_callback_.is_null()); | 370   DCHECK(!local_sync_callback_.is_null()); | 
| 367   if (status != SYNC_STATUS_OK) { | 371   if (status != SYNC_STATUS_OK) { | 
| 368     RunLocalSyncCallback(status, sync_file_info.url); | 372     RunLocalSyncCallback(status, sync_file_info.url); | 
| 369     return; | 373     return; | 
| 370   } | 374   } | 
| 371   if (sync_file_info.changes.empty()) { | 375   if (sync_file_info.changes.empty()) { | 
| 372     // There's a slight chance this could happen. | 376     // There's a slight chance this could happen. | 
| 373     SyncFileCallback callback = local_sync_callback_; | 377     SyncFileCallback callback = local_sync_callback_; | 
| 374     local_sync_callback_.Reset(); | 378     local_sync_callback_.Reset(); | 
| 375     ProcessLocalChange(callback); | 379     ProcessLocalChange(callback); | 
| 376     return; | 380     return; | 
| 377   } | 381   } | 
| 378 | 382 | 
| 379   FileChange next_change = sync_file_info.changes.front(); | 383   FileChange next_change = sync_file_info.changes.front(); | 
| 380   DVLOG(1) << "ProcessLocalChange: " << sync_file_info.url.DebugString() | 384   DVLOG(1) << "ProcessLocalChange: " << sync_file_info.url.DebugString() | 
| 381            << " change:" << next_change.DebugString(); | 385            << " change:" << next_change.DebugString(); | 
| 382 | 386 | 
| 383   local_change_processor_->ApplyLocalChange( | 387   local_change_processor_->ApplyLocalChange( | 
| 384       next_change, | 388       next_change, | 
| 385       sync_file_info.local_file_path, | 389       sync_file_info.local_file_path, | 
| 386       sync_file_info.metadata, | 390       sync_file_info.metadata, | 
| 387       sync_file_info.url, | 391       sync_file_info.url, | 
| 388       base::Bind(&LocalFileSyncService::ProcessNextChangeForURL, | 392       base::Bind(&LocalFileSyncService::ProcessNextChangeForURL, | 
| 389                  AsWeakPtr(), sync_file_info, | 393                  AsWeakPtr(), base::Passed(&snapshot), sync_file_info, | 
| 390                  next_change, sync_file_info.changes.PopAndGetNewList())); | 394                  next_change, sync_file_info.changes.PopAndGetNewList())); | 
| 391 } | 395 } | 
| 392 | 396 | 
| 393 void LocalFileSyncService::ProcessNextChangeForURL( | 397 void LocalFileSyncService::ProcessNextChangeForURL( | 
|  | 398     scoped_ptr<webkit_blob::ScopedFile> snapshot, | 
| 394     const LocalFileSyncInfo& sync_file_info, | 399     const LocalFileSyncInfo& sync_file_info, | 
| 395     const FileChange& processed_change, | 400     const FileChange& processed_change, | 
| 396     const FileChangeList& changes, | 401     const FileChangeList& changes, | 
| 397     SyncStatusCode status) { | 402     SyncStatusCode status) { | 
| 398   DVLOG(1) << "Processed one local change: " | 403   DVLOG(1) << "Processed one local change: " | 
| 399            << sync_file_info.url.DebugString() | 404            << sync_file_info.url.DebugString() | 
| 400            << " change:" << processed_change.DebugString() | 405            << " change:" << processed_change.DebugString() | 
| 401            << " status:" << status; | 406            << " status:" << status; | 
| 402 | 407 | 
| 403   if (status == SYNC_STATUS_RETRY) { | 408   if (status == SYNC_STATUS_RETRY) { | 
| 404     local_change_processor_->ApplyLocalChange( | 409     local_change_processor_->ApplyLocalChange( | 
| 405         processed_change, | 410         processed_change, | 
| 406         sync_file_info.local_file_path, | 411         sync_file_info.local_file_path, | 
| 407         sync_file_info.metadata, | 412         sync_file_info.metadata, | 
| 408         sync_file_info.url, | 413         sync_file_info.url, | 
| 409         base::Bind(&LocalFileSyncService::ProcessNextChangeForURL, | 414         base::Bind(&LocalFileSyncService::ProcessNextChangeForURL, | 
| 410                    AsWeakPtr(), sync_file_info, processed_change, changes)); | 415                    AsWeakPtr(), base::Passed(&snapshot), | 
|  | 416                    sync_file_info, processed_change, changes)); | 
| 411     return; | 417     return; | 
| 412   } | 418   } | 
| 413 | 419 | 
| 414   if (status == SYNC_FILE_ERROR_NOT_FOUND && | 420   if (status == SYNC_FILE_ERROR_NOT_FOUND && | 
| 415       processed_change.change() == FileChange::FILE_CHANGE_DELETE) { | 421       processed_change.change() == FileChange::FILE_CHANGE_DELETE) { | 
| 416     // This must be ok (and could happen). | 422     // This must be ok (and could happen). | 
| 417     status = SYNC_STATUS_OK; | 423     status = SYNC_STATUS_OK; | 
| 418   } | 424   } | 
| 419 | 425 | 
| 420   const FileSystemURL& url = sync_file_info.url; | 426   const FileSystemURL& url = sync_file_info.url; | 
| 421   if (status != SYNC_STATUS_OK || changes.empty()) { | 427   if (status != SYNC_STATUS_OK || changes.empty()) { | 
| 422     DCHECK(ContainsKey(origin_to_contexts_, url.origin())); | 428     DCHECK(ContainsKey(origin_to_contexts_, url.origin())); | 
| 423     sync_context_->CommitChangeStatusForURL( | 429     sync_context_->CommitChangeStatusForURL( | 
| 424         origin_to_contexts_[url.origin()], url, status, | 430         origin_to_contexts_[url.origin()], url, status, | 
| 425         base::Bind(&LocalFileSyncService::RunLocalSyncCallback, | 431         base::Bind(&LocalFileSyncService::RunLocalSyncCallback, | 
| 426                   AsWeakPtr(), status, url)); | 432                   AsWeakPtr(), status, url)); | 
| 427     return; | 433     return; | 
| 428   } | 434   } | 
| 429 | 435 | 
| 430   FileChange next_change = changes.front(); | 436   FileChange next_change = changes.front(); | 
| 431   local_change_processor_->ApplyLocalChange( | 437   local_change_processor_->ApplyLocalChange( | 
| 432       changes.front(), | 438       changes.front(), | 
| 433       sync_file_info.local_file_path, | 439       sync_file_info.local_file_path, | 
| 434       sync_file_info.metadata, | 440       sync_file_info.metadata, | 
| 435       url, | 441       url, | 
| 436       base::Bind(&LocalFileSyncService::ProcessNextChangeForURL, | 442       base::Bind(&LocalFileSyncService::ProcessNextChangeForURL, | 
| 437                  AsWeakPtr(), sync_file_info, | 443                  AsWeakPtr(), base::Passed(&snapshot), sync_file_info, | 
| 438                  next_change, changes.PopAndGetNewList())); | 444                  next_change, changes.PopAndGetNewList())); | 
| 439 } | 445 } | 
| 440 | 446 | 
| 441 }  // namespace sync_file_system | 447 }  // namespace sync_file_system | 
| OLD | NEW | 
|---|