sync_file_system_backend.cc revision 3551c9c881056c480085172ff9840cab31610854
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::FileSystemFileUtil* SyncFileSystemBackend::GetFileUtil( 65 fileapi::FileSystemType type) { 66 DCHECK(delegate_); 67 return delegate_->sync_file_util(); 68} 69 70fileapi::AsyncFileUtil* SyncFileSystemBackend::GetAsyncFileUtil( 71 fileapi::FileSystemType type) { 72 DCHECK(delegate_); 73 return delegate_->file_util(); 74} 75 76fileapi::CopyOrMoveFileValidatorFactory* 77SyncFileSystemBackend::GetCopyOrMoveFileValidatorFactory( 78 fileapi::FileSystemType type, 79 base::PlatformFileError* error_code) { 80 DCHECK(error_code); 81 *error_code = base::PLATFORM_FILE_OK; 82 return NULL; 83} 84 85fileapi::FileSystemOperation* 86SyncFileSystemBackend::CreateFileSystemOperation( 87 const fileapi::FileSystemURL& url, 88 fileapi::FileSystemContext* context, 89 base::PlatformFileError* error_code) const { 90 DCHECK(CanHandleType(url.type())); 91 DCHECK(context); 92 DCHECK(error_code); 93 94 DCHECK(delegate_); 95 scoped_ptr<fileapi::FileSystemOperationContext> operation_context = 96 delegate_->CreateFileSystemOperationContext(url, context, error_code); 97 if (!operation_context) 98 return NULL; 99 100 if (url.type() == fileapi::kFileSystemTypeSyncableForInternalSync) { 101 return new fileapi::FileSystemOperationImpl( 102 url, context, operation_context.Pass()); 103 } 104 105 return new SyncableFileSystemOperation( 106 url, context, operation_context.Pass()); 107} 108 109scoped_ptr<webkit_blob::FileStreamReader> 110SyncFileSystemBackend::CreateFileStreamReader( 111 const fileapi::FileSystemURL& url, 112 int64 offset, 113 const base::Time& expected_modification_time, 114 fileapi::FileSystemContext* context) const { 115 DCHECK(CanHandleType(url.type())); 116 DCHECK(delegate_); 117 return delegate_->CreateFileStreamReader( 118 url, offset, expected_modification_time, context); 119} 120 121scoped_ptr<fileapi::FileStreamWriter> 122SyncFileSystemBackend::CreateFileStreamWriter( 123 const fileapi::FileSystemURL& url, 124 int64 offset, 125 fileapi::FileSystemContext* context) const { 126 DCHECK(CanHandleType(url.type())); 127 DCHECK(delegate_); 128 return delegate_->CreateFileStreamWriter( 129 url, offset, context, fileapi::kFileSystemTypeSyncableForInternalSync); 130} 131 132fileapi::FileSystemQuotaUtil* SyncFileSystemBackend::GetQuotaUtil() { 133 return delegate_; 134} 135 136// static 137SyncFileSystemBackend* SyncFileSystemBackend::GetBackend( 138 const fileapi::FileSystemContext* file_system_context) { 139 DCHECK(file_system_context); 140 return static_cast<SyncFileSystemBackend*>( 141 file_system_context->GetFileSystemBackend( 142 fileapi::kFileSystemTypeSyncable)); 143} 144 145void SyncFileSystemBackend::SetLocalFileChangeTracker( 146 scoped_ptr<LocalFileChangeTracker> tracker) { 147 DCHECK(!change_tracker_); 148 DCHECK(tracker); 149 change_tracker_ = tracker.Pass(); 150 151 DCHECK(delegate_); 152 delegate_->AddFileUpdateObserver( 153 fileapi::kFileSystemTypeSyncable, 154 change_tracker_.get(), 155 delegate_->file_task_runner()); 156 delegate_->AddFileChangeObserver( 157 fileapi::kFileSystemTypeSyncable, 158 change_tracker_.get(), 159 delegate_->file_task_runner()); 160} 161 162void SyncFileSystemBackend::set_sync_context( 163 LocalFileSyncContext* sync_context) { 164 DCHECK(!sync_context_); 165 sync_context_ = sync_context; 166} 167 168} // namespace sync_file_system 169