sync_file_system_service.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync_file_system/sync_file_system_service.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_dependency_manager.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync_file_system/local_file_sync_service.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync_file_system/remote_file_sync_service.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/fileapi/file_system_context.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/fileapi/syncable/sync_file_metadata.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/fileapi/syncable/sync_status_code.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using fileapi::ConflictFileInfoCallback;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using fileapi::FileSystemURL;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using fileapi::SyncFileMetadata;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using fileapi::SyncStatusCallback;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using fileapi::SyncStatusCode;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sync_file_system {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncFileSystemService::Shutdown() {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  local_file_service_->Shutdown();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  local_file_service_.reset();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  remote_file_service_.reset();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_ = NULL;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncFileSystemService::~SyncFileSystemService() {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!profile_);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncFileSystemService::InitializeForApp(
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fileapi::FileSystemContext* file_system_context,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& service_name,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& app_origin,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SyncStatusCallback& callback) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(local_file_service_);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(app_origin == app_origin.GetOrigin());
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(kinuko,tzik): Instantiate the remote_file_service for the given
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |service_name| if it hasn't been initialized.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  local_file_service_->MaybeInitializeFileSystemContext(
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      app_origin, service_name, file_system_context, callback);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remote_file_service_) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(tzik): Handle errors in the completion callback.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    remote_file_service_->RegisterOriginForTrackingChanges(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        app_origin, fileapi::SyncStatusCallback());
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncFileSystemService::GetConflictFiles(
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& app_origin,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& service_name,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const fileapi::SyncFileSetCallback& callback) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(app_origin == app_origin.GetOrigin());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(kinuko): Implement.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncFileSystemService::GetConflictFileInfo(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& app_origin,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& service_name,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FileSystemURL& url,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ConflictFileInfoCallback& callback) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(local_file_service_);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(app_origin == app_origin.GetOrigin());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(kinuko): Implement.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncFileSystemService::OnLocalChangeAvailable(int64 pending_changes) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GE(pending_changes, 0);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_local_changes_ = pending_changes;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncFileSystemService::OnRemoteChangeAvailable(int64 pending_changes) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GE(pending_changes, 0);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_remote_changes_ = pending_changes;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncFileSystemService::SyncFileSystemService(Profile* profile)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : profile_(profile),
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_local_changes_(0),
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_remote_changes_(0) {}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncFileSystemService::Initialize(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<LocalFileSyncService> local_file_service,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<RemoteFileSyncService> remote_file_service) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(local_file_service);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile_);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  local_file_service_ = local_file_service.Pass();
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  remote_file_service_ = remote_file_service.Pass();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(tzik): Uncomment this line after RemoteChangeObserver lands.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // remote_file_service_->AddObserver(this);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SyncFileSystemServiceFactory -----------------------------------------------
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncFileSystemService* SyncFileSystemServiceFactory::GetForProfile(
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<SyncFileSystemService*>(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetInstance()->GetServiceForProfile(profile, true));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncFileSystemServiceFactory* SyncFileSystemServiceFactory::GetInstance() {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Singleton<SyncFileSystemServiceFactory>::get();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncFileSystemServiceFactory::SyncFileSystemServiceFactory()
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ProfileKeyedServiceFactory("SyncFileSystemService",
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 ProfileDependencyManager::GetInstance()) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncFileSystemServiceFactory::~SyncFileSystemServiceFactory() {}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProfileKeyedService* SyncFileSystemServiceFactory::BuildServiceInstanceFor(
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile) const {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncFileSystemService* service = new SyncFileSystemService(profile);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(kinuko): Set up mock services if it is called for testing.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LocalFileSyncService> local_file_service(
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new LocalFileSyncService);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<RemoteFileSyncService> remote_file_service;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(tzik): Instantiate DriveFileSyncService.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->Initialize(local_file_service.Pass(),
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      remote_file_service.Pass());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return service;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace sync_file_system
158