sync_file_system_backend.cc revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
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 3// found in the LICENSE file. 4 5#include "chrome/browser/sync_file_system/local/sync_file_system_backend.h" 6 7#include "base/logging.h" 8#include "chrome/browser/sync_file_system/local/local_file_change_tracker.h" 9#include "chrome/browser/sync_file_system/local/local_file_sync_context.h" 10#include "chrome/browser/sync_file_system/local/syncable_file_system_operation.h" 11#include "chrome/browser/sync_file_system/syncable_file_system_util.h" 12#include "webkit/browser/fileapi/file_system_context.h" 13#include "webkit/browser/fileapi/file_system_file_stream_reader.h" 14#include "webkit/browser/fileapi/file_system_operation_impl.h" 15#include "webkit/browser/fileapi/sandbox_file_stream_writer.h" 16#include "webkit/browser/fileapi/sandbox_quota_observer.h" 17#include "webkit/common/fileapi/file_system_util.h" 18 19namespace sync_file_system { 20 21SyncFileSystemBackend::SyncFileSystemBackend() 22 : delegate_(NULL) { 23} 24 25SyncFileSystemBackend::~SyncFileSystemBackend() { 26 if (change_tracker_) { 27 delegate_->file_task_runner()->DeleteSoon( 28 FROM_HERE, change_tracker_.release()); 29 } 30} 31 32bool SyncFileSystemBackend::CanHandleType( 33 fileapi::FileSystemType type) const { 34 return type == fileapi::kFileSystemTypeSyncable || 35 type == fileapi::kFileSystemTypeSyncableForInternalSync; 36} 37 38void SyncFileSystemBackend::Initialize(fileapi::FileSystemContext* context) { 39 DCHECK(context); 40 DCHECK(!delegate_); 41 delegate_ = context->sandbox_delegate(); 42 43 delegate_->AddFileUpdateObserver( 44 fileapi::kFileSystemTypeSyncable, 45 delegate_->quota_observer(), 46 delegate_->file_task_runner()); 47 delegate_->AddFileUpdateObserver( 48 fileapi::kFileSystemTypeSyncableForInternalSync, 49 delegate_->quota_observer(), 50 delegate_->file_task_runner()); 51} 52 53void SyncFileSystemBackend::OpenFileSystem( 54 const GURL& origin_url, 55 fileapi::FileSystemType type, 56 fileapi::OpenFileSystemMode mode, 57 const OpenFileSystemCallback& callback) { 58 DCHECK(CanHandleType(type)); 59 DCHECK(delegate_); 60 delegate_->OpenFileSystem(origin_url, type, mode, callback, 61 GetSyncableFileSystemRootURI(origin_url)); 62} 63 64fileapi::AsyncFileUtil* SyncFileSystemBackend::GetAsyncFileUtil( 65 fileapi::FileSystemType type) { 66 DCHECK(delegate_); 67 return delegate_->file_util(); 68} 69 70fileapi::CopyOrMoveFileValidatorFactory* 71SyncFileSystemBackend::GetCopyOrMoveFileValidatorFactory( 72 fileapi::FileSystemType type, 73 base::PlatformFileError* error_code) { 74 DCHECK(error_code); 75 *error_code = base::PLATFORM_FILE_OK; 76 return NULL; 77} 78 79fileapi::FileSystemOperation* 80SyncFileSystemBackend::CreateFileSystemOperation( 81 const fileapi::FileSystemURL& url, 82 fileapi::FileSystemContext* context, 83 base::PlatformFileError* error_code) const { 84 DCHECK(CanHandleType(url.type())); 85 DCHECK(context); 86 DCHECK(error_code); 87 88 DCHECK(delegate_); 89 scoped_ptr<fileapi::FileSystemOperationContext> operation_context = 90 delegate_->CreateFileSystemOperationContext(url, context, error_code); 91 if (!operation_context) 92 return NULL; 93 94 if (url.type() == fileapi::kFileSystemTypeSyncableForInternalSync) { 95 return new fileapi::FileSystemOperationImpl( 96 url, context, operation_context.Pass()); 97 } 98 99 return new SyncableFileSystemOperation( 100 url, context, operation_context.Pass()); 101} 102 103scoped_ptr<webkit_blob::FileStreamReader> 104SyncFileSystemBackend::CreateFileStreamReader( 105 const fileapi::FileSystemURL& url, 106 int64 offset, 107 const base::Time& expected_modification_time, 108 fileapi::FileSystemContext* context) const { 109 DCHECK(CanHandleType(url.type())); 110 DCHECK(delegate_); 111 return delegate_->CreateFileStreamReader( 112 url, offset, expected_modification_time, context); 113} 114 115scoped_ptr<fileapi::FileStreamWriter> 116SyncFileSystemBackend::CreateFileStreamWriter( 117 const fileapi::FileSystemURL& url, 118 int64 offset, 119 fileapi::FileSystemContext* context) const { 120 DCHECK(CanHandleType(url.type())); 121 DCHECK(delegate_); 122 return delegate_->CreateFileStreamWriter( 123 url, offset, context, fileapi::kFileSystemTypeSyncableForInternalSync); 124} 125 126fileapi::FileSystemQuotaUtil* SyncFileSystemBackend::GetQuotaUtil() { 127 return delegate_; 128} 129 130// static 131SyncFileSystemBackend* SyncFileSystemBackend::GetBackend( 132 const fileapi::FileSystemContext* file_system_context) { 133 DCHECK(file_system_context); 134 return static_cast<SyncFileSystemBackend*>( 135 file_system_context->GetFileSystemBackend( 136 fileapi::kFileSystemTypeSyncable)); 137} 138 139void SyncFileSystemBackend::SetLocalFileChangeTracker( 140 scoped_ptr<LocalFileChangeTracker> tracker) { 141 DCHECK(!change_tracker_); 142 DCHECK(tracker); 143 change_tracker_ = tracker.Pass(); 144 145 DCHECK(delegate_); 146 delegate_->AddFileUpdateObserver( 147 fileapi::kFileSystemTypeSyncable, 148 change_tracker_.get(), 149 delegate_->file_task_runner()); 150 delegate_->AddFileChangeObserver( 151 fileapi::kFileSystemTypeSyncable, 152 change_tracker_.get(), 153 delegate_->file_task_runner()); 154} 155 156void SyncFileSystemBackend::set_sync_context( 157 LocalFileSyncContext* sync_context) { 158 DCHECK(!sync_context_); 159 sync_context_ = sync_context; 160} 161 162} // namespace sync_file_system 163