Index: chrome/browser/sync_file_system/sync_file_system_service.cc |
diff --git a/chrome/browser/sync_file_system/sync_file_system_service.cc b/chrome/browser/sync_file_system/sync_file_system_service.cc |
index e4df2aa917bdf65d93ee6fde6f7831edf4c15180..7ab12cd3de829420c3a4234ebd269185703da7d8 100644 |
--- a/chrome/browser/sync_file_system/sync_file_system_service.cc |
+++ b/chrome/browser/sync_file_system/sync_file_system_service.cc |
@@ -7,12 +7,14 @@ |
#include "base/bind.h" |
#include "base/logging.h" |
#include "base/memory/ref_counted.h" |
+#include "base/stl_util.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/profiles/profile_dependency_manager.h" |
#include "chrome/browser/sync_file_system/local_file_sync_service.h" |
#include "content/public/browser/browser_thread.h" |
#include "googleurl/src/gurl.h" |
#include "webkit/fileapi/file_system_context.h" |
+#include "webkit/fileapi/file_system_url.h" |
#include "webkit/fileapi/syncable/sync_status_code.h" |
using content::BrowserThread; |
@@ -22,6 +24,9 @@ namespace sync_file_system { |
void SyncFileSystemService::Shutdown() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ pending_providers_.clear(); |
+ STLDeleteValues(&remote_file_providers_); |
+ |
local_file_service_->Shutdown(); |
local_file_service_.reset(); |
@@ -31,6 +36,36 @@ void SyncFileSystemService::Shutdown() { |
SyncFileSystemService::~SyncFileSystemService() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK(!profile_); |
+ DCHECK(remote_file_providers_.empty()); |
+} |
+ |
+void SyncFileSystemService::OnRemoteChangeAvailable( |
+ RemoteFileProvider* remote_file_provider) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DCHECK(remote_file_provider); |
+ |
+ pending_providers_.insert(remote_file_provider); |
+ MayStartRemoteSync(); |
+} |
+ |
+void SyncFileSystemService::RegisterRemoteFileProvider( |
+ const std::string& service_name, |
+ scoped_ptr<RemoteFileProvider> remote_file_provider) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DCHECK(remote_file_provider); |
+ |
+ std::pair<RemoteFileProviderMap::iterator, bool> inserted |
+ = remote_file_providers_.insert( |
+ std::make_pair(service_name, remote_file_provider.get())); |
+ if (!inserted.second) { |
+ NOTREACHED(); |
+ pending_providers_.erase(inserted.first->second); |
+ delete inserted.first->second; |
+ inserted.first->second = remote_file_provider.get(); |
+ } |
+ |
+ remote_file_provider->SetObserver(this); |
+ ignore_result(remote_file_provider.release()); |
} |
void SyncFileSystemService::InitializeForApp( |
@@ -38,7 +73,8 @@ void SyncFileSystemService::InitializeForApp( |
const std::string& service_name, |
const GURL& app_url, |
const StatusCallback& callback) { |
- DCHECK(local_file_service_.get()); |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DCHECK(local_file_service_); |
// TODO(kinuko,tzik): Instantiate the remote_file_service for the given |
// |service_name| if it hasn't been initialized. |
@@ -46,21 +82,87 @@ void SyncFileSystemService::InitializeForApp( |
local_file_service_->MaybeInitializeFileSystemContext( |
app_url, file_system_context, callback); |
- // TODO(tzik): Hook up remote service initialization code. |
+ DCHECK(ContainsKey(remote_file_providers_, service_name) && |
+ remote_file_providers_[service_name]); |
+ remote_file_providers_[service_name]->RegisterOrigin(app_url.GetOrigin()); |
} |
SyncFileSystemService::SyncFileSystemService(Profile* profile) |
- : profile_(profile) {} |
+ : profile_(profile), |
+ sync_is_running_(false) {} |
void SyncFileSystemService::Initialize( |
scoped_ptr<LocalFileSyncService> local_file_service) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(local_file_service.get()); |
+ DCHECK(local_file_service); |
DCHECK(profile_); |
local_file_service_ = local_file_service.Pass(); |
} |
+void SyncFileSystemService::MayStartRemoteSync() { |
kinuko
2012/10/17 09:22:57
May -> Maybe ?
tzik
2012/10/18 07:18:08
Done.
|
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ |
+ if (sync_is_running_) |
+ return; |
+ |
+ RemoteFileProvider* provider = NULL; |
+ while (true) { |
+ if (pending_providers_.empty()) |
+ return; |
+ provider = *pending_providers_.begin(); |
+ if (provider->HasRemoteChange()) |
+ break; |
+ else |
+ pending_providers_.erase(pending_providers_.begin()); |
+ } |
+ DCHECK(provider); |
+ |
+ sync_is_running_ = true; |
+ |
+ scoped_ptr<RemoteChange> change = provider->GetRemoteChange(); |
+ |
+ // TODO(tzik): Disable writing for |url|. |
+ fileapi::FileSystemURL url = change->url(); |
+ if (change->deleted()) { |
+ provider->DeleteFile( |
+ url, base::Bind(&SyncFileSystemService::DidDeleteFile, AsWeakPtr(), |
+ url)); |
+ } else { |
+ provider->DownloadFile( |
+ url, |
+ base::Bind(&SyncFileSystemService::DidDownloadFile, AsWeakPtr(), |
+ base::Passed(&change))); |
+ } |
+} |
+ |
+void SyncFileSystemService::DidDownloadFile( |
+ scoped_ptr<RemoteChange> change, |
+ fileapi::SyncStatusCode status, |
+ const FilePath& file_path) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ NOTIMPLEMENTED(); |
+ |
+ // TODO(tzik): Do follows on correct thread. |
+ // On FILE thread: |
+ // CopyInForeightFile(file_path, change->url()); |
+ // DeleteFile(file_path); |
+ // |
+ // On UI thread: |
+ // remote_file_provider->ChangeApplied(*change); |
+ // EnableWriting(change->url); |
+ // sync_is_running_ = false; |
+ // MayStartRemoteSync(); |
+} |
+ |
+void SyncFileSystemService::DidDeleteFile(const fileapi::FileSystemURL& url, |
+ fileapi::SyncStatusCode status) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ sync_is_running_ = false; |
+ // Enable writing for |url|. |
+ MayStartRemoteSync(); |
+} |
+ |
// SyncFileSystemServiceFactory ----------------------------------------------- |
// static |
@@ -92,6 +194,9 @@ ProfileKeyedService* SyncFileSystemServiceFactory::BuildServiceInstanceFor( |
new LocalFileSyncService); |
service->Initialize(local_file_service.Pass()); |
+ |
+ // TODO(tzik): Instantiate DriveFileProvider and register it to |service|. |
+ |
return service; |
} |