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