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