Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(111)

Side by Side Diff: webkit/browser/fileapi/syncable/syncable_file_system_operation.cc

Issue 16413007: Make FileSystemOperation NOT self-destruct (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix browser_tests Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/browser/fileapi/syncable/syncable_file_system_operation.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "webkit/browser/fileapi/syncable/syncable_file_system_operation.h" 5 #include "webkit/browser/fileapi/syncable/syncable_file_system_operation.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "webkit/browser/fileapi/file_system_context.h" 8 #include "webkit/browser/fileapi/file_system_context.h"
9 #include "webkit/browser/fileapi/file_system_operation_context.h" 9 #include "webkit/browser/fileapi/file_system_operation_context.h"
10 #include "webkit/browser/fileapi/file_system_url.h" 10 #include "webkit/browser/fileapi/file_system_url.h"
11 #include "webkit/browser/fileapi/local_file_system_operation.h"
11 #include "webkit/browser/fileapi/sandbox_mount_point_provider.h" 12 #include "webkit/browser/fileapi/sandbox_mount_point_provider.h"
12 #include "webkit/browser/fileapi/syncable/local_file_sync_context.h" 13 #include "webkit/browser/fileapi/syncable/local_file_sync_context.h"
13 #include "webkit/browser/fileapi/syncable/syncable_file_operation_runner.h" 14 #include "webkit/browser/fileapi/syncable/syncable_file_operation_runner.h"
14 #include "webkit/browser/fileapi/syncable/syncable_file_system_util.h" 15 #include "webkit/browser/fileapi/syncable/syncable_file_system_util.h"
15 #include "webkit/common/blob/shareable_file_reference.h" 16 #include "webkit/common/blob/shareable_file_reference.h"
16 17
17 using fileapi::FileSystemURL; 18 using fileapi::FileSystemURL;
18 using fileapi::FileSystemOperationContext; 19 using fileapi::FileSystemOperationContext;
19 using fileapi::LocalFileSystemOperation; 20 using fileapi::LocalFileSystemOperation;
20 21
21 namespace sync_file_system { 22 namespace sync_file_system {
22 23
23 namespace { 24 namespace {
24 25
25 void WriteCallbackAdapter( 26 void WriteCallbackAdapter(
26 const SyncableFileSystemOperation::WriteCallback& callback, 27 const SyncableFileSystemOperation::WriteCallback& callback,
27 base::PlatformFileError status) { 28 base::PlatformFileError status) {
28 callback.Run(status, 0, true); 29 callback.Run(status, 0, true);
29 } 30 }
30 31
31 } // namespace 32 } // namespace
32 33
33 class SyncableFileSystemOperation::QueueableTask 34 class SyncableFileSystemOperation::QueueableTask
34 : public SyncableFileOperationRunner::Task { 35 : public SyncableFileOperationRunner::Task {
35 public: 36 public:
36 QueueableTask(SyncableFileSystemOperation* operation, 37 QueueableTask(base::WeakPtr<SyncableFileSystemOperation> operation,
37 const base::Closure& task) 38 const base::Closure& task)
38 : operation_(operation), task_(task) {} 39 : operation_(operation),
40 task_(task),
41 target_paths_(operation->target_paths_) {}
39 42
40 virtual ~QueueableTask() { 43 virtual ~QueueableTask() {
41 DCHECK(!operation_); 44 DCHECK(!operation_);
42 } 45 }
43 46
44 virtual void Run() OVERRIDE { 47 virtual void Run() OVERRIDE {
45 DCHECK(!task_.is_null()); 48 DCHECK(!task_.is_null());
46 task_.Run(); 49 task_.Run();
47 operation_ = NULL; 50 operation_.reset();
48 } 51 }
49 52
50 virtual void Cancel() OVERRIDE { 53 virtual void Cancel() OVERRIDE {
51 DCHECK(!task_.is_null()); 54 DCHECK(!task_.is_null());
52 DCHECK(operation_); 55 if (operation_)
53 operation_->OnCancelled(); 56 operation_->OnCancelled();
54 task_.Reset(); // This will delete operation_. 57 task_.Reset();
55 operation_ = NULL; 58 operation_.reset();
56 } 59 }
57 60
58 virtual std::vector<FileSystemURL>& target_paths() const OVERRIDE { 61 virtual const std::vector<FileSystemURL>& target_paths() const OVERRIDE {
59 DCHECK(operation_); 62 return target_paths_;
60 return operation_->target_paths_;
61 } 63 }
62 64
63 private: 65 private:
64 SyncableFileSystemOperation* operation_; 66 base::WeakPtr<SyncableFileSystemOperation> operation_;
65 base::Closure task_; 67 base::Closure task_;
68 std::vector<FileSystemURL> target_paths_;
66 DISALLOW_COPY_AND_ASSIGN(QueueableTask); 69 DISALLOW_COPY_AND_ASSIGN(QueueableTask);
67 }; 70 };
68 71
69 SyncableFileSystemOperation::~SyncableFileSystemOperation() {} 72 SyncableFileSystemOperation::~SyncableFileSystemOperation() {}
70 73
71 void SyncableFileSystemOperation::CreateFile( 74 void SyncableFileSystemOperation::CreateFile(
72 const FileSystemURL& url, 75 const FileSystemURL& url,
73 bool exclusive, 76 bool exclusive,
74 const StatusCallback& callback) { 77 const StatusCallback& callback) {
75 DCHECK(CalledOnValidThread()); 78 DCHECK(CalledOnValidThread());
76 if (!operation_runner_.get()) { 79 if (!operation_runner_.get()) {
77 AbortOperation(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND); 80 callback.Run(base::PLATFORM_FILE_ERROR_NOT_FOUND);
78 return; 81 return;
79 } 82 }
80 DCHECK(operation_runner_.get()); 83 DCHECK(operation_runner_.get());
81 target_paths_.push_back(url); 84 target_paths_.push_back(url);
82 completion_callback_ = callback; 85 completion_callback_ = callback;
83 scoped_ptr<SyncableFileOperationRunner::Task> task(new QueueableTask( 86 scoped_ptr<SyncableFileOperationRunner::Task> task(new QueueableTask(
84 this, 87 AsWeakPtr(),
85 base::Bind(&FileSystemOperation::CreateFile, 88 base::Bind(&FileSystemOperation::CreateFile,
86 base::Unretained(NewOperation()), 89 NewOperation()->AsWeakPtr(),
87 url, exclusive, 90 url, exclusive,
88 base::Bind(&self::DidFinish, base::Owned(this))))); 91 base::Bind(&self::DidFinish, AsWeakPtr()))));
89 operation_runner_->PostOperationTask(task.Pass()); 92 operation_runner_->PostOperationTask(task.Pass());
90 } 93 }
91 94
92 void SyncableFileSystemOperation::CreateDirectory( 95 void SyncableFileSystemOperation::CreateDirectory(
93 const FileSystemURL& url, 96 const FileSystemURL& url,
94 bool exclusive, 97 bool exclusive,
95 bool recursive, 98 bool recursive,
96 const StatusCallback& callback) { 99 const StatusCallback& callback) {
97 DCHECK(CalledOnValidThread()); 100 DCHECK(CalledOnValidThread());
98 if (!operation_runner_.get()) { 101 if (!operation_runner_.get()) {
99 AbortOperation(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND); 102 callback.Run(base::PLATFORM_FILE_ERROR_NOT_FOUND);
100 return; 103 return;
101 } 104 }
102 if (!is_directory_operation_enabled_) { 105 if (!is_directory_operation_enabled_) {
103 AbortOperation(callback, base::PLATFORM_FILE_ERROR_INVALID_OPERATION); 106 callback.Run(base::PLATFORM_FILE_ERROR_INVALID_OPERATION);
104 return; 107 return;
105 } 108 }
106 DCHECK(operation_runner_.get()); 109 DCHECK(operation_runner_.get());
107 target_paths_.push_back(url); 110 target_paths_.push_back(url);
108 completion_callback_ = callback; 111 completion_callback_ = callback;
109 scoped_ptr<SyncableFileOperationRunner::Task> task(new QueueableTask( 112 scoped_ptr<SyncableFileOperationRunner::Task> task(new QueueableTask(
110 this, 113 AsWeakPtr(),
111 base::Bind(&FileSystemOperation::CreateDirectory, 114 base::Bind(&FileSystemOperation::CreateDirectory,
112 base::Unretained(NewOperation()), 115 NewOperation()->AsWeakPtr(),
113 url, exclusive, recursive, 116 url, exclusive, recursive,
114 base::Bind(&self::DidFinish, base::Owned(this))))); 117 base::Bind(&self::DidFinish, AsWeakPtr()))));
115 operation_runner_->PostOperationTask(task.Pass()); 118 operation_runner_->PostOperationTask(task.Pass());
116 } 119 }
117 120
118 void SyncableFileSystemOperation::Copy( 121 void SyncableFileSystemOperation::Copy(
119 const FileSystemURL& src_url, 122 const FileSystemURL& src_url,
120 const FileSystemURL& dest_url, 123 const FileSystemURL& dest_url,
121 const StatusCallback& callback) { 124 const StatusCallback& callback) {
122 DCHECK(CalledOnValidThread()); 125 DCHECK(CalledOnValidThread());
123 if (!operation_runner_.get()) { 126 if (!operation_runner_.get()) {
124 AbortOperation(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND); 127 callback.Run(base::PLATFORM_FILE_ERROR_NOT_FOUND);
125 return; 128 return;
126 } 129 }
127 DCHECK(operation_runner_.get()); 130 DCHECK(operation_runner_.get());
128 target_paths_.push_back(dest_url); 131 target_paths_.push_back(dest_url);
129 completion_callback_ = callback; 132 completion_callback_ = callback;
130 scoped_ptr<SyncableFileOperationRunner::Task> task(new QueueableTask( 133 scoped_ptr<SyncableFileOperationRunner::Task> task(new QueueableTask(
131 this, 134 AsWeakPtr(),
132 base::Bind(&FileSystemOperation::Copy, 135 base::Bind(&FileSystemOperation::Copy,
133 base::Unretained(NewOperation()), 136 NewOperation()->AsWeakPtr(),
134 src_url, dest_url, 137 src_url, dest_url,
135 base::Bind(&self::DidFinish, base::Owned(this))))); 138 base::Bind(&self::DidFinish, AsWeakPtr()))));
136 operation_runner_->PostOperationTask(task.Pass()); 139 operation_runner_->PostOperationTask(task.Pass());
137 } 140 }
138 141
139 void SyncableFileSystemOperation::Move( 142 void SyncableFileSystemOperation::Move(
140 const FileSystemURL& src_url, 143 const FileSystemURL& src_url,
141 const FileSystemURL& dest_url, 144 const FileSystemURL& dest_url,
142 const StatusCallback& callback) { 145 const StatusCallback& callback) {
143 DCHECK(CalledOnValidThread()); 146 DCHECK(CalledOnValidThread());
144 if (!operation_runner_.get()) { 147 if (!operation_runner_.get()) {
145 AbortOperation(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND); 148 callback.Run(base::PLATFORM_FILE_ERROR_NOT_FOUND);
146 return; 149 return;
147 } 150 }
148 DCHECK(operation_runner_.get()); 151 DCHECK(operation_runner_.get());
149 target_paths_.push_back(src_url); 152 target_paths_.push_back(src_url);
150 target_paths_.push_back(dest_url); 153 target_paths_.push_back(dest_url);
151 completion_callback_ = callback; 154 completion_callback_ = callback;
152 scoped_ptr<SyncableFileOperationRunner::Task> task(new QueueableTask( 155 scoped_ptr<SyncableFileOperationRunner::Task> task(new QueueableTask(
153 this, 156 AsWeakPtr(),
154 base::Bind(&FileSystemOperation::Move, 157 base::Bind(&FileSystemOperation::Move,
155 base::Unretained(NewOperation()), 158 NewOperation()->AsWeakPtr(),
156 src_url, dest_url, 159 src_url, dest_url,
157 base::Bind(&self::DidFinish, base::Owned(this))))); 160 base::Bind(&self::DidFinish, AsWeakPtr()))));
158 operation_runner_->PostOperationTask(task.Pass()); 161 operation_runner_->PostOperationTask(task.Pass());
159 } 162 }
160 163
161 void SyncableFileSystemOperation::DirectoryExists( 164 void SyncableFileSystemOperation::DirectoryExists(
162 const FileSystemURL& url, 165 const FileSystemURL& url,
163 const StatusCallback& callback) { 166 const StatusCallback& callback) {
164 DCHECK(CalledOnValidThread()); 167 DCHECK(CalledOnValidThread());
165 if (!operation_runner_.get()) {
166 AbortOperation(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND);
167 return;
168 }
169 NewOperation()->DirectoryExists(url, callback); 168 NewOperation()->DirectoryExists(url, callback);
170 delete this;
171 } 169 }
172 170
173 void SyncableFileSystemOperation::FileExists( 171 void SyncableFileSystemOperation::FileExists(
174 const FileSystemURL& url, 172 const FileSystemURL& url,
175 const StatusCallback& callback) { 173 const StatusCallback& callback) {
176 DCHECK(CalledOnValidThread()); 174 DCHECK(CalledOnValidThread());
177 if (!operation_runner_.get()) {
178 AbortOperation(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND);
179 return;
180 }
181 NewOperation()->FileExists(url, callback); 175 NewOperation()->FileExists(url, callback);
182 delete this;
183 } 176 }
184 177
185 void SyncableFileSystemOperation::GetMetadata( 178 void SyncableFileSystemOperation::GetMetadata(
186 const FileSystemURL& url, 179 const FileSystemURL& url,
187 const GetMetadataCallback& callback) { 180 const GetMetadataCallback& callback) {
188 DCHECK(CalledOnValidThread()); 181 DCHECK(CalledOnValidThread());
189 if (!operation_runner_.get()) {
190 callback.Run(base::PLATFORM_FILE_ERROR_NOT_FOUND,
191 base::PlatformFileInfo(),
192 base::FilePath());
193 delete this;
194 return;
195 }
196 NewOperation()->GetMetadata(url, callback); 182 NewOperation()->GetMetadata(url, callback);
197 delete this;
198 } 183 }
199 184
200 void SyncableFileSystemOperation::ReadDirectory( 185 void SyncableFileSystemOperation::ReadDirectory(
201 const FileSystemURL& url, 186 const FileSystemURL& url,
202 const ReadDirectoryCallback& callback) { 187 const ReadDirectoryCallback& callback) {
203 DCHECK(CalledOnValidThread()); 188 DCHECK(CalledOnValidThread());
204 if (!operation_runner_.get()) {
205 callback.Run(base::PLATFORM_FILE_ERROR_NOT_FOUND, FileEntryList(), false);
206 delete this;
207 return;
208 }
209 // This is a read operation and there'd be no hard to let it go even if 189 // This is a read operation and there'd be no hard to let it go even if
210 // directory operation is disabled. (And we should allow this if it's made 190 // directory operation is disabled. (And we should allow this if it's made
211 // on the root directory) 191 // on the root directory)
212 NewOperation()->ReadDirectory(url, callback); 192 NewOperation()->ReadDirectory(url, callback);
213 delete this;
214 } 193 }
215 194
216 void SyncableFileSystemOperation::Remove( 195 void SyncableFileSystemOperation::Remove(
217 const FileSystemURL& url, bool recursive, 196 const FileSystemURL& url, bool recursive,
218 const StatusCallback& callback) { 197 const StatusCallback& callback) {
219 DCHECK(CalledOnValidThread()); 198 DCHECK(CalledOnValidThread());
220 if (!operation_runner_.get()) { 199 if (!operation_runner_.get()) {
221 AbortOperation(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND); 200 callback.Run(base::PLATFORM_FILE_ERROR_NOT_FOUND);
222 return; 201 return;
223 } 202 }
224 DCHECK(operation_runner_.get()); 203 DCHECK(operation_runner_.get());
225 target_paths_.push_back(url); 204 target_paths_.push_back(url);
226 completion_callback_ = callback; 205 completion_callback_ = callback;
227 scoped_ptr<SyncableFileOperationRunner::Task> task(new QueueableTask( 206 scoped_ptr<SyncableFileOperationRunner::Task> task(new QueueableTask(
228 this, 207 AsWeakPtr(),
229 base::Bind(&FileSystemOperation::Remove, 208 base::Bind(&FileSystemOperation::Remove,
230 base::Unretained(NewOperation()), 209 NewOperation()->AsWeakPtr(),
231 url, recursive, 210 url, recursive,
232 base::Bind(&self::DidFinish, base::Owned(this))))); 211 base::Bind(&self::DidFinish, AsWeakPtr()))));
233 operation_runner_->PostOperationTask(task.Pass()); 212 operation_runner_->PostOperationTask(task.Pass());
234 } 213 }
235 214
236 void SyncableFileSystemOperation::Write( 215 void SyncableFileSystemOperation::Write(
237 const net::URLRequestContext* url_request_context, 216 const net::URLRequestContext* url_request_context,
238 const FileSystemURL& url, 217 const FileSystemURL& url,
239 const GURL& blob_url, 218 const GURL& blob_url,
240 int64 offset, 219 int64 offset,
241 const WriteCallback& callback) { 220 const WriteCallback& callback) {
242 DCHECK(CalledOnValidThread()); 221 DCHECK(CalledOnValidThread());
243 if (!operation_runner_.get()) { 222 if (!operation_runner_.get()) {
244 callback.Run(base::PLATFORM_FILE_ERROR_NOT_FOUND, 0, true); 223 callback.Run(base::PLATFORM_FILE_ERROR_NOT_FOUND, 0, true);
245 delete this;
246 return; 224 return;
247 } 225 }
248 DCHECK(operation_runner_.get()); 226 DCHECK(operation_runner_.get());
249 target_paths_.push_back(url); 227 target_paths_.push_back(url);
250 completion_callback_ = base::Bind(&WriteCallbackAdapter, callback); 228 completion_callback_ = base::Bind(&WriteCallbackAdapter, callback);
251 scoped_ptr<SyncableFileOperationRunner::Task> task(new QueueableTask( 229 scoped_ptr<SyncableFileOperationRunner::Task> task(new QueueableTask(
252 this, 230 AsWeakPtr(),
253 NewOperation()->GetWriteClosure( 231 NewOperation()->GetWriteClosure(
254 url_request_context, url, blob_url, offset, 232 url_request_context, url, blob_url, offset,
255 base::Bind(&self::DidWrite, base::Owned(this), callback)))); 233 base::Bind(&self::DidWrite, AsWeakPtr(), callback))));
256 operation_runner_->PostOperationTask(task.Pass()); 234 operation_runner_->PostOperationTask(task.Pass());
257 } 235 }
258 236
259 void SyncableFileSystemOperation::Truncate( 237 void SyncableFileSystemOperation::Truncate(
260 const FileSystemURL& url, int64 length, 238 const FileSystemURL& url, int64 length,
261 const StatusCallback& callback) { 239 const StatusCallback& callback) {
262 DCHECK(CalledOnValidThread()); 240 DCHECK(CalledOnValidThread());
263 if (!operation_runner_.get()) { 241 if (!operation_runner_.get()) {
264 AbortOperation(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND); 242 callback.Run(base::PLATFORM_FILE_ERROR_NOT_FOUND);
265 return; 243 return;
266 } 244 }
267 DCHECK(operation_runner_.get()); 245 DCHECK(operation_runner_.get());
268 target_paths_.push_back(url); 246 target_paths_.push_back(url);
269 completion_callback_ = callback; 247 completion_callback_ = callback;
270 scoped_ptr<SyncableFileOperationRunner::Task> task(new QueueableTask( 248 scoped_ptr<SyncableFileOperationRunner::Task> task(new QueueableTask(
271 this, 249 AsWeakPtr(),
272 base::Bind(&FileSystemOperation::Truncate, 250 base::Bind(&FileSystemOperation::Truncate,
273 base::Unretained(NewOperation()), 251 NewOperation()->AsWeakPtr(),
274 url, length, 252 url, length,
275 base::Bind(&self::DidFinish, base::Owned(this))))); 253 base::Bind(&self::DidFinish, AsWeakPtr()))));
276 operation_runner_->PostOperationTask(task.Pass()); 254 operation_runner_->PostOperationTask(task.Pass());
277 } 255 }
278 256
279 void SyncableFileSystemOperation::TouchFile( 257 void SyncableFileSystemOperation::TouchFile(
280 const FileSystemURL& url, 258 const FileSystemURL& url,
281 const base::Time& last_access_time, 259 const base::Time& last_access_time,
282 const base::Time& last_modified_time, 260 const base::Time& last_modified_time,
283 const StatusCallback& callback) { 261 const StatusCallback& callback) {
284 DCHECK(CalledOnValidThread()); 262 DCHECK(CalledOnValidThread());
285 if (!operation_runner_.get()) {
286 AbortOperation(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND);
287 return;
288 }
289 NewOperation()->TouchFile(url, last_access_time, 263 NewOperation()->TouchFile(url, last_access_time,
290 last_modified_time, callback); 264 last_modified_time, callback);
291 delete this;
292 } 265 }
293 266
294 void SyncableFileSystemOperation::OpenFile( 267 void SyncableFileSystemOperation::OpenFile(
295 const FileSystemURL& url, 268 const FileSystemURL& url,
296 int file_flags, 269 int file_flags,
297 base::ProcessHandle peer_handle, 270 base::ProcessHandle peer_handle,
298 const OpenFileCallback& callback) { 271 const OpenFileCallback& callback) {
299 NOTREACHED(); 272 NOTREACHED();
300 delete this;
301 } 273 }
302 274
303 void SyncableFileSystemOperation::Cancel( 275 void SyncableFileSystemOperation::Cancel(
304 const StatusCallback& cancel_callback) { 276 const StatusCallback& cancel_callback) {
305 DCHECK(CalledOnValidThread()); 277 DCHECK(CalledOnValidThread());
306 DCHECK(inflight_operation_); 278 DCHECK(inflight_operation_);
307 inflight_operation_->Cancel(cancel_callback); 279 inflight_operation_->Cancel(cancel_callback);
308 } 280 }
309 281
310 void SyncableFileSystemOperation::CreateSnapshotFile( 282 void SyncableFileSystemOperation::CreateSnapshotFile(
311 const FileSystemURL& path, 283 const FileSystemURL& path,
312 const SnapshotFileCallback& callback) { 284 const SnapshotFileCallback& callback) {
313 DCHECK(CalledOnValidThread()); 285 DCHECK(CalledOnValidThread());
314 if (!operation_runner_.get()) {
315 callback.Run(base::PLATFORM_FILE_ERROR_NOT_FOUND,
316 base::PlatformFileInfo(),
317 base::FilePath(),
318 NULL);
319 delete this;
320 return;
321 }
322 NewOperation()->CreateSnapshotFile(path, callback); 286 NewOperation()->CreateSnapshotFile(path, callback);
323 delete this;
324 } 287 }
325 288
326 void SyncableFileSystemOperation::CopyInForeignFile( 289 void SyncableFileSystemOperation::CopyInForeignFile(
327 const base::FilePath& src_local_disk_path, 290 const base::FilePath& src_local_disk_path,
328 const FileSystemURL& dest_url, 291 const FileSystemURL& dest_url,
329 const StatusCallback& callback) { 292 const StatusCallback& callback) {
330 DCHECK(CalledOnValidThread()); 293 DCHECK(CalledOnValidThread());
331 if (!operation_runner_.get()) { 294 if (!operation_runner_.get()) {
332 AbortOperation(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND); 295 callback.Run(base::PLATFORM_FILE_ERROR_NOT_FOUND);
333 return; 296 return;
334 } 297 }
335 DCHECK(operation_runner_.get()); 298 DCHECK(operation_runner_.get());
336 target_paths_.push_back(dest_url); 299 target_paths_.push_back(dest_url);
337 completion_callback_ = callback; 300 completion_callback_ = callback;
338 scoped_ptr<SyncableFileOperationRunner::Task> task(new QueueableTask( 301 scoped_ptr<SyncableFileOperationRunner::Task> task(new QueueableTask(
339 this, 302 AsWeakPtr(),
340 base::Bind(&LocalFileSystemOperation::CopyInForeignFile, 303 base::Bind(&LocalFileSystemOperation::CopyInForeignFile,
341 base::Unretained(NewOperation()), 304 NewOperation()->AsWeakPtr(),
342 src_local_disk_path, dest_url, 305 src_local_disk_path, dest_url,
343 base::Bind(&self::DidFinish, base::Owned(this))))); 306 base::Bind(&self::DidFinish, AsWeakPtr()))));
344 operation_runner_->PostOperationTask(task.Pass()); 307 operation_runner_->PostOperationTask(task.Pass());
345 } 308 }
346 309
347 SyncableFileSystemOperation::SyncableFileSystemOperation( 310 SyncableFileSystemOperation::SyncableFileSystemOperation(
348 const FileSystemURL& url, 311 const FileSystemURL& url,
349 fileapi::FileSystemContext* file_system_context, 312 fileapi::FileSystemContext* file_system_context,
350 scoped_ptr<FileSystemOperationContext> operation_context) 313 scoped_ptr<FileSystemOperationContext> operation_context)
351 : LocalFileSystemOperation(url, file_system_context, 314 : LocalFileSystemOperation(url, file_system_context,
352 operation_context.Pass()), 315 operation_context.Pass()),
353 url_(url), 316 url_(url) {
354 inflight_operation_(NULL) {
355 DCHECK(file_system_context); 317 DCHECK(file_system_context);
356 if (!file_system_context->sync_context()) { 318 if (!file_system_context->sync_context()) {
357 // Syncable FileSystem is opened in a file system context which doesn't 319 // Syncable FileSystem is opened in a file system context which doesn't
358 // support (or is not initialized for) the API. 320 // support (or is not initialized for) the API.
359 // Returning here to leave operation_runner_ as NULL. 321 // Returning here to leave operation_runner_ as NULL.
360 return; 322 return;
361 } 323 }
362 operation_runner_ = file_system_context->sync_context()->operation_runner(); 324 operation_runner_ = file_system_context->sync_context()->operation_runner();
363 is_directory_operation_enabled_ = IsSyncFSDirectoryOperationEnabled(); 325 is_directory_operation_enabled_ = IsSyncFSDirectoryOperationEnabled();
364 } 326 }
365 327
366 LocalFileSystemOperation* SyncableFileSystemOperation::NewOperation() { 328 LocalFileSystemOperation* SyncableFileSystemOperation::NewOperation() {
367 DCHECK(operation_context_); 329 DCHECK(operation_context_);
368 inflight_operation_ = new LocalFileSystemOperation( 330 inflight_operation_.reset(new LocalFileSystemOperation(
369 url_, file_system_context(), operation_context_.Pass()); 331 url_, file_system_context(), operation_context_.Pass()));
370 DCHECK(inflight_operation_); 332 DCHECK(inflight_operation_);
371 return inflight_operation_; 333 return inflight_operation_.get();
372 } 334 }
373 335
374 void SyncableFileSystemOperation::DidFinish(base::PlatformFileError status) { 336 void SyncableFileSystemOperation::DidFinish(base::PlatformFileError status) {
375 DCHECK(CalledOnValidThread()); 337 DCHECK(CalledOnValidThread());
376 DCHECK(!completion_callback_.is_null()); 338 DCHECK(!completion_callback_.is_null());
377 if (operation_runner_.get()) 339 if (operation_runner_.get())
378 operation_runner_->OnOperationCompleted(target_paths_); 340 operation_runner_->OnOperationCompleted(target_paths_);
379 completion_callback_.Run(status); 341 completion_callback_.Run(status);
380 } 342 }
381 343
382 void SyncableFileSystemOperation::DidWrite( 344 void SyncableFileSystemOperation::DidWrite(
383 const WriteCallback& callback, 345 const WriteCallback& callback,
384 base::PlatformFileError result, 346 base::PlatformFileError result,
385 int64 bytes, 347 int64 bytes,
386 bool complete) { 348 bool complete) {
387 DCHECK(CalledOnValidThread()); 349 DCHECK(CalledOnValidThread());
388 if (!complete) { 350 if (!complete) {
389 callback.Run(result, bytes, complete); 351 callback.Run(result, bytes, complete);
390 return; 352 return;
391 } 353 }
392 if (operation_runner_.get()) 354 if (operation_runner_.get())
393 operation_runner_->OnOperationCompleted(target_paths_); 355 operation_runner_->OnOperationCompleted(target_paths_);
394 callback.Run(result, bytes, complete); 356 callback.Run(result, bytes, complete);
395 } 357 }
396 358
397 void SyncableFileSystemOperation::OnCancelled() { 359 void SyncableFileSystemOperation::OnCancelled() {
398 DCHECK(!completion_callback_.is_null()); 360 DCHECK(!completion_callback_.is_null());
399 completion_callback_.Run(base::PLATFORM_FILE_ERROR_ABORT); 361 completion_callback_.Run(base::PLATFORM_FILE_ERROR_ABORT);
400 delete inflight_operation_;
401 }
402
403 void SyncableFileSystemOperation::AbortOperation(
404 const StatusCallback& callback,
405 base::PlatformFileError error) {
406 callback.Run(error);
407 delete inflight_operation_;
408 delete this;
409 } 362 }
410 363
411 } // namespace sync_file_system 364 } // namespace sync_file_system
OLDNEW
« no previous file with comments | « webkit/browser/fileapi/syncable/syncable_file_system_operation.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698