| OLD | NEW | 
|---|
| 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/file_system_operation_runner.h" | 5 #include "storage/browser/fileapi/file_system_operation_runner.h" | 
| 6 | 6 | 
| 7 #include "base/bind.h" | 7 #include "base/bind.h" | 
| 8 #include "base/message_loop/message_loop_proxy.h" | 8 #include "base/message_loop/message_loop_proxy.h" | 
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" | 
| 10 #include "net/url_request/url_request_context.h" | 10 #include "net/url_request/url_request_context.h" | 
| 11 #include "webkit/browser/blob/blob_url_request_job_factory.h" | 11 #include "storage/browser/blob/blob_url_request_job_factory.h" | 
| 12 #include "webkit/browser/fileapi/file_observers.h" | 12 #include "storage/browser/fileapi/file_observers.h" | 
| 13 #include "webkit/browser/fileapi/file_stream_writer.h" | 13 #include "storage/browser/fileapi/file_stream_writer.h" | 
| 14 #include "webkit/browser/fileapi/file_system_context.h" | 14 #include "storage/browser/fileapi/file_system_context.h" | 
| 15 #include "webkit/browser/fileapi/file_system_operation.h" | 15 #include "storage/browser/fileapi/file_system_operation.h" | 
| 16 #include "webkit/browser/fileapi/file_writer_delegate.h" | 16 #include "storage/browser/fileapi/file_writer_delegate.h" | 
| 17 #include "webkit/common/blob/shareable_file_reference.h" | 17 #include "storage/common/blob/shareable_file_reference.h" | 
| 18 | 18 | 
| 19 namespace fileapi { | 19 namespace storage { | 
| 20 | 20 | 
| 21 typedef FileSystemOperationRunner::OperationID OperationID; | 21 typedef FileSystemOperationRunner::OperationID OperationID; | 
| 22 | 22 | 
| 23 class FileSystemOperationRunner::BeginOperationScoper | 23 class FileSystemOperationRunner::BeginOperationScoper | 
| 24     : public base::SupportsWeakPtr< | 24     : public base::SupportsWeakPtr< | 
| 25           FileSystemOperationRunner::BeginOperationScoper> { | 25           FileSystemOperationRunner::BeginOperationScoper> { | 
| 26  public: | 26  public: | 
| 27   BeginOperationScoper() {} | 27   BeginOperationScoper() {} | 
|  | 28 | 
| 28  private: | 29  private: | 
| 29   DISALLOW_COPY_AND_ASSIGN(BeginOperationScoper); | 30   DISALLOW_COPY_AND_ASSIGN(BeginOperationScoper); | 
| 30 }; | 31 }; | 
| 31 | 32 | 
| 32 FileSystemOperationRunner::OperationHandle::OperationHandle() {} | 33 FileSystemOperationRunner::OperationHandle::OperationHandle() { | 
| 33 FileSystemOperationRunner::OperationHandle::~OperationHandle() {} | 34 } | 
|  | 35 FileSystemOperationRunner::OperationHandle::~OperationHandle() { | 
|  | 36 } | 
| 34 | 37 | 
| 35 FileSystemOperationRunner::~FileSystemOperationRunner() { | 38 FileSystemOperationRunner::~FileSystemOperationRunner() { | 
| 36 } | 39 } | 
| 37 | 40 | 
| 38 void FileSystemOperationRunner::Shutdown() { | 41 void FileSystemOperationRunner::Shutdown() { | 
| 39   operations_.Clear(); | 42   operations_.Clear(); | 
| 40 } | 43 } | 
| 41 | 44 | 
| 42 OperationID FileSystemOperationRunner::CreateFile( | 45 OperationID FileSystemOperationRunner::CreateFile( | 
| 43     const FileSystemURL& url, | 46     const FileSystemURL& url, | 
| 44     bool exclusive, | 47     bool exclusive, | 
| 45     const StatusCallback& callback) { | 48     const StatusCallback& callback) { | 
| 46   base::File::Error error = base::File::FILE_OK; | 49   base::File::Error error = base::File::FILE_OK; | 
| 47   FileSystemOperation* operation = | 50   FileSystemOperation* operation = | 
| 48       file_system_context_->CreateFileSystemOperation(url, &error); | 51       file_system_context_->CreateFileSystemOperation(url, &error); | 
| 49 | 52 | 
| 50   BeginOperationScoper scope; | 53   BeginOperationScoper scope; | 
| 51   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 54   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 52   if (!operation) { | 55   if (!operation) { | 
| 53     DidFinish(handle, callback, error); | 56     DidFinish(handle, callback, error); | 
| 54     return handle.id; | 57     return handle.id; | 
| 55   } | 58   } | 
| 56   PrepareForWrite(handle.id, url); | 59   PrepareForWrite(handle.id, url); | 
| 57   operation->CreateFile( | 60   operation->CreateFile(url, | 
| 58       url, exclusive, | 61                         exclusive, | 
| 59       base::Bind(&FileSystemOperationRunner::DidFinish, AsWeakPtr(), | 62                         base::Bind(&FileSystemOperationRunner::DidFinish, | 
| 60                  handle, callback)); | 63                                    AsWeakPtr(), | 
|  | 64                                    handle, | 
|  | 65                                    callback)); | 
| 61   return handle.id; | 66   return handle.id; | 
| 62 } | 67 } | 
| 63 | 68 | 
| 64 OperationID FileSystemOperationRunner::CreateDirectory( | 69 OperationID FileSystemOperationRunner::CreateDirectory( | 
| 65     const FileSystemURL& url, | 70     const FileSystemURL& url, | 
| 66     bool exclusive, | 71     bool exclusive, | 
| 67     bool recursive, | 72     bool recursive, | 
| 68     const StatusCallback& callback) { | 73     const StatusCallback& callback) { | 
| 69   base::File::Error error = base::File::FILE_OK; | 74   base::File::Error error = base::File::FILE_OK; | 
| 70   FileSystemOperation* operation = | 75   FileSystemOperation* operation = | 
| 71       file_system_context_->CreateFileSystemOperation(url, &error); | 76       file_system_context_->CreateFileSystemOperation(url, &error); | 
| 72   BeginOperationScoper scope; | 77   BeginOperationScoper scope; | 
| 73   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 78   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 74   if (!operation) { | 79   if (!operation) { | 
| 75     DidFinish(handle, callback, error); | 80     DidFinish(handle, callback, error); | 
| 76     return handle.id; | 81     return handle.id; | 
| 77   } | 82   } | 
| 78   PrepareForWrite(handle.id, url); | 83   PrepareForWrite(handle.id, url); | 
| 79   operation->CreateDirectory( | 84   operation->CreateDirectory(url, | 
| 80       url, exclusive, recursive, | 85                              exclusive, | 
| 81       base::Bind(&FileSystemOperationRunner::DidFinish, AsWeakPtr(), | 86                              recursive, | 
| 82                  handle, callback)); | 87                              base::Bind(&FileSystemOperationRunner::DidFinish, | 
|  | 88                                         AsWeakPtr(), | 
|  | 89                                         handle, | 
|  | 90                                         callback)); | 
| 83   return handle.id; | 91   return handle.id; | 
| 84 } | 92 } | 
| 85 | 93 | 
| 86 OperationID FileSystemOperationRunner::Copy( | 94 OperationID FileSystemOperationRunner::Copy( | 
| 87     const FileSystemURL& src_url, | 95     const FileSystemURL& src_url, | 
| 88     const FileSystemURL& dest_url, | 96     const FileSystemURL& dest_url, | 
| 89     CopyOrMoveOption option, | 97     CopyOrMoveOption option, | 
| 90     const CopyProgressCallback& progress_callback, | 98     const CopyProgressCallback& progress_callback, | 
| 91     const StatusCallback& callback) { | 99     const StatusCallback& callback) { | 
| 92   base::File::Error error = base::File::FILE_OK; | 100   base::File::Error error = base::File::FILE_OK; | 
| 93   FileSystemOperation* operation = | 101   FileSystemOperation* operation = | 
| 94       file_system_context_->CreateFileSystemOperation(dest_url, &error); | 102       file_system_context_->CreateFileSystemOperation(dest_url, &error); | 
| 95   BeginOperationScoper scope; | 103   BeginOperationScoper scope; | 
| 96   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 104   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 97   if (!operation) { | 105   if (!operation) { | 
| 98     DidFinish(handle, callback, error); | 106     DidFinish(handle, callback, error); | 
| 99     return handle.id; | 107     return handle.id; | 
| 100   } | 108   } | 
| 101   PrepareForWrite(handle.id, dest_url); | 109   PrepareForWrite(handle.id, dest_url); | 
| 102   PrepareForRead(handle.id, src_url); | 110   PrepareForRead(handle.id, src_url); | 
| 103   operation->Copy( | 111   operation->Copy(src_url, | 
| 104       src_url, dest_url, option, | 112                   dest_url, | 
| 105       progress_callback.is_null() ? | 113                   option, | 
| 106           CopyProgressCallback() : | 114                   progress_callback.is_null() | 
| 107           base::Bind(&FileSystemOperationRunner::OnCopyProgress, AsWeakPtr(), | 115                       ? CopyProgressCallback() | 
| 108                      handle, progress_callback), | 116                       : base::Bind(&FileSystemOperationRunner::OnCopyProgress, | 
| 109       base::Bind(&FileSystemOperationRunner::DidFinish, AsWeakPtr(), | 117                                    AsWeakPtr(), | 
| 110                  handle, callback)); | 118                                    handle, | 
|  | 119                                    progress_callback), | 
|  | 120                   base::Bind(&FileSystemOperationRunner::DidFinish, | 
|  | 121                              AsWeakPtr(), | 
|  | 122                              handle, | 
|  | 123                              callback)); | 
| 111   return handle.id; | 124   return handle.id; | 
| 112 } | 125 } | 
| 113 | 126 | 
| 114 OperationID FileSystemOperationRunner::Move( | 127 OperationID FileSystemOperationRunner::Move(const FileSystemURL& src_url, | 
| 115     const FileSystemURL& src_url, | 128                                             const FileSystemURL& dest_url, | 
| 116     const FileSystemURL& dest_url, | 129                                             CopyOrMoveOption option, | 
| 117     CopyOrMoveOption option, | 130                                             const StatusCallback& callback) { | 
| 118     const StatusCallback& callback) { |  | 
| 119   base::File::Error error = base::File::FILE_OK; | 131   base::File::Error error = base::File::FILE_OK; | 
| 120   FileSystemOperation* operation = | 132   FileSystemOperation* operation = | 
| 121       file_system_context_->CreateFileSystemOperation(dest_url, &error); | 133       file_system_context_->CreateFileSystemOperation(dest_url, &error); | 
| 122   BeginOperationScoper scope; | 134   BeginOperationScoper scope; | 
| 123   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 135   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 124   if (!operation) { | 136   if (!operation) { | 
| 125     DidFinish(handle, callback, error); | 137     DidFinish(handle, callback, error); | 
| 126     return handle.id; | 138     return handle.id; | 
| 127   } | 139   } | 
| 128   PrepareForWrite(handle.id, dest_url); | 140   PrepareForWrite(handle.id, dest_url); | 
| 129   PrepareForWrite(handle.id, src_url); | 141   PrepareForWrite(handle.id, src_url); | 
| 130   operation->Move( | 142   operation->Move(src_url, | 
| 131       src_url, dest_url, option, | 143                   dest_url, | 
| 132       base::Bind(&FileSystemOperationRunner::DidFinish, AsWeakPtr(), | 144                   option, | 
| 133                  handle, callback)); | 145                   base::Bind(&FileSystemOperationRunner::DidFinish, | 
|  | 146                              AsWeakPtr(), | 
|  | 147                              handle, | 
|  | 148                              callback)); | 
| 134   return handle.id; | 149   return handle.id; | 
| 135 } | 150 } | 
| 136 | 151 | 
| 137 OperationID FileSystemOperationRunner::DirectoryExists( | 152 OperationID FileSystemOperationRunner::DirectoryExists( | 
| 138     const FileSystemURL& url, | 153     const FileSystemURL& url, | 
| 139     const StatusCallback& callback) { | 154     const StatusCallback& callback) { | 
| 140   base::File::Error error = base::File::FILE_OK; | 155   base::File::Error error = base::File::FILE_OK; | 
| 141   FileSystemOperation* operation = | 156   FileSystemOperation* operation = | 
| 142       file_system_context_->CreateFileSystemOperation(url, &error); | 157       file_system_context_->CreateFileSystemOperation(url, &error); | 
| 143   BeginOperationScoper scope; | 158   BeginOperationScoper scope; | 
| 144   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 159   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 145   if (!operation) { | 160   if (!operation) { | 
| 146     DidFinish(handle, callback, error); | 161     DidFinish(handle, callback, error); | 
| 147     return handle.id; | 162     return handle.id; | 
| 148   } | 163   } | 
| 149   PrepareForRead(handle.id, url); | 164   PrepareForRead(handle.id, url); | 
| 150   operation->DirectoryExists( | 165   operation->DirectoryExists(url, | 
| 151       url, | 166                              base::Bind(&FileSystemOperationRunner::DidFinish, | 
| 152       base::Bind(&FileSystemOperationRunner::DidFinish, AsWeakPtr(), | 167                                         AsWeakPtr(), | 
| 153                  handle, callback)); | 168                                         handle, | 
|  | 169                                         callback)); | 
| 154   return handle.id; | 170   return handle.id; | 
| 155 } | 171 } | 
| 156 | 172 | 
| 157 OperationID FileSystemOperationRunner::FileExists( | 173 OperationID FileSystemOperationRunner::FileExists( | 
| 158     const FileSystemURL& url, | 174     const FileSystemURL& url, | 
| 159     const StatusCallback& callback) { | 175     const StatusCallback& callback) { | 
| 160   base::File::Error error = base::File::FILE_OK; | 176   base::File::Error error = base::File::FILE_OK; | 
| 161   FileSystemOperation* operation = | 177   FileSystemOperation* operation = | 
| 162       file_system_context_->CreateFileSystemOperation(url, &error); | 178       file_system_context_->CreateFileSystemOperation(url, &error); | 
| 163   BeginOperationScoper scope; | 179   BeginOperationScoper scope; | 
| 164   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 180   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 165   if (!operation) { | 181   if (!operation) { | 
| 166     DidFinish(handle, callback, error); | 182     DidFinish(handle, callback, error); | 
| 167     return handle.id; | 183     return handle.id; | 
| 168   } | 184   } | 
| 169   PrepareForRead(handle.id, url); | 185   PrepareForRead(handle.id, url); | 
| 170   operation->FileExists( | 186   operation->FileExists(url, | 
| 171       url, | 187                         base::Bind(&FileSystemOperationRunner::DidFinish, | 
| 172       base::Bind(&FileSystemOperationRunner::DidFinish, AsWeakPtr(), | 188                                    AsWeakPtr(), | 
| 173                  handle, callback)); | 189                                    handle, | 
|  | 190                                    callback)); | 
| 174   return handle.id; | 191   return handle.id; | 
| 175 } | 192 } | 
| 176 | 193 | 
| 177 OperationID FileSystemOperationRunner::GetMetadata( | 194 OperationID FileSystemOperationRunner::GetMetadata( | 
| 178     const FileSystemURL& url, | 195     const FileSystemURL& url, | 
| 179     const GetMetadataCallback& callback) { | 196     const GetMetadataCallback& callback) { | 
| 180   base::File::Error error = base::File::FILE_OK; | 197   base::File::Error error = base::File::FILE_OK; | 
| 181   FileSystemOperation* operation = | 198   FileSystemOperation* operation = | 
| 182       file_system_context_->CreateFileSystemOperation(url, &error); | 199       file_system_context_->CreateFileSystemOperation(url, &error); | 
| 183   BeginOperationScoper scope; | 200   BeginOperationScoper scope; | 
| 184   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 201   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 185   if (!operation) { | 202   if (!operation) { | 
| 186     DidGetMetadata(handle, callback, error, base::File::Info()); | 203     DidGetMetadata(handle, callback, error, base::File::Info()); | 
| 187     return handle.id; | 204     return handle.id; | 
| 188   } | 205   } | 
| 189   PrepareForRead(handle.id, url); | 206   PrepareForRead(handle.id, url); | 
| 190   operation->GetMetadata( | 207   operation->GetMetadata(url, | 
| 191       url, | 208                          base::Bind(&FileSystemOperationRunner::DidGetMetadata, | 
| 192       base::Bind(&FileSystemOperationRunner::DidGetMetadata, AsWeakPtr(), | 209                                     AsWeakPtr(), | 
| 193                  handle, callback)); | 210                                     handle, | 
|  | 211                                     callback)); | 
| 194   return handle.id; | 212   return handle.id; | 
| 195 } | 213 } | 
| 196 | 214 | 
| 197 OperationID FileSystemOperationRunner::ReadDirectory( | 215 OperationID FileSystemOperationRunner::ReadDirectory( | 
| 198     const FileSystemURL& url, | 216     const FileSystemURL& url, | 
| 199     const ReadDirectoryCallback& callback) { | 217     const ReadDirectoryCallback& callback) { | 
| 200   base::File::Error error = base::File::FILE_OK; | 218   base::File::Error error = base::File::FILE_OK; | 
| 201   FileSystemOperation* operation = | 219   FileSystemOperation* operation = | 
| 202       file_system_context_->CreateFileSystemOperation(url, &error); | 220       file_system_context_->CreateFileSystemOperation(url, &error); | 
| 203   BeginOperationScoper scope; | 221   BeginOperationScoper scope; | 
| 204   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 222   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 205   if (!operation) { | 223   if (!operation) { | 
| 206     DidReadDirectory(handle, callback, error, std::vector<DirectoryEntry>(), | 224     DidReadDirectory( | 
| 207                      false); | 225         handle, callback, error, std::vector<DirectoryEntry>(), false); | 
| 208     return handle.id; | 226     return handle.id; | 
| 209   } | 227   } | 
| 210   PrepareForRead(handle.id, url); | 228   PrepareForRead(handle.id, url); | 
| 211   operation->ReadDirectory( | 229   operation->ReadDirectory( | 
| 212       url, | 230       url, | 
| 213       base::Bind(&FileSystemOperationRunner::DidReadDirectory, AsWeakPtr(), | 231       base::Bind(&FileSystemOperationRunner::DidReadDirectory, | 
| 214                  handle, callback)); | 232                  AsWeakPtr(), | 
|  | 233                  handle, | 
|  | 234                  callback)); | 
| 215   return handle.id; | 235   return handle.id; | 
| 216 } | 236 } | 
| 217 | 237 | 
| 218 OperationID FileSystemOperationRunner::Remove( | 238 OperationID FileSystemOperationRunner::Remove(const FileSystemURL& url, | 
| 219     const FileSystemURL& url, bool recursive, | 239                                               bool recursive, | 
| 220     const StatusCallback& callback) { | 240                                               const StatusCallback& callback) { | 
| 221   base::File::Error error = base::File::FILE_OK; | 241   base::File::Error error = base::File::FILE_OK; | 
| 222   FileSystemOperation* operation = | 242   FileSystemOperation* operation = | 
| 223       file_system_context_->CreateFileSystemOperation(url, &error); | 243       file_system_context_->CreateFileSystemOperation(url, &error); | 
| 224   BeginOperationScoper scope; | 244   BeginOperationScoper scope; | 
| 225   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 245   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 226   if (!operation) { | 246   if (!operation) { | 
| 227     DidFinish(handle, callback, error); | 247     DidFinish(handle, callback, error); | 
| 228     return handle.id; | 248     return handle.id; | 
| 229   } | 249   } | 
| 230   PrepareForWrite(handle.id, url); | 250   PrepareForWrite(handle.id, url); | 
| 231   operation->Remove( | 251   operation->Remove(url, | 
| 232       url, recursive, | 252                     recursive, | 
| 233       base::Bind(&FileSystemOperationRunner::DidFinish, AsWeakPtr(), | 253                     base::Bind(&FileSystemOperationRunner::DidFinish, | 
| 234                  handle, callback)); | 254                                AsWeakPtr(), | 
|  | 255                                handle, | 
|  | 256                                callback)); | 
| 235   return handle.id; | 257   return handle.id; | 
| 236 } | 258 } | 
| 237 | 259 | 
| 238 OperationID FileSystemOperationRunner::Write( | 260 OperationID FileSystemOperationRunner::Write( | 
| 239     const net::URLRequestContext* url_request_context, | 261     const net::URLRequestContext* url_request_context, | 
| 240     const FileSystemURL& url, | 262     const FileSystemURL& url, | 
| 241     scoped_ptr<webkit_blob::BlobDataHandle> blob, | 263     scoped_ptr<storage::BlobDataHandle> blob, | 
| 242     int64 offset, | 264     int64 offset, | 
| 243     const WriteCallback& callback) { | 265     const WriteCallback& callback) { | 
| 244   base::File::Error error = base::File::FILE_OK; | 266   base::File::Error error = base::File::FILE_OK; | 
| 245   FileSystemOperation* operation = | 267   FileSystemOperation* operation = | 
| 246       file_system_context_->CreateFileSystemOperation(url, &error); | 268       file_system_context_->CreateFileSystemOperation(url, &error); | 
| 247 | 269 | 
| 248   BeginOperationScoper scope; | 270   BeginOperationScoper scope; | 
| 249   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 271   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 250   if (!operation) { | 272   if (!operation) { | 
| 251     DidWrite(handle, callback, error, 0, true); | 273     DidWrite(handle, callback, error, 0, true); | 
| 252     return handle.id; | 274     return handle.id; | 
| 253   } | 275   } | 
| 254 | 276 | 
| 255   scoped_ptr<FileStreamWriter> writer( | 277   scoped_ptr<FileStreamWriter> writer( | 
| 256       file_system_context_->CreateFileStreamWriter(url, offset)); | 278       file_system_context_->CreateFileStreamWriter(url, offset)); | 
| 257   if (!writer) { | 279   if (!writer) { | 
| 258     // Write is not supported. | 280     // Write is not supported. | 
| 259     DidWrite(handle, callback, base::File::FILE_ERROR_SECURITY, 0, true); | 281     DidWrite(handle, callback, base::File::FILE_ERROR_SECURITY, 0, true); | 
| 260     return handle.id; | 282     return handle.id; | 
| 261   } | 283   } | 
| 262 | 284 | 
| 263   FileWriterDelegate::FlushPolicy flush_policy = | 285   FileWriterDelegate::FlushPolicy flush_policy = | 
| 264       file_system_context_->ShouldFlushOnWriteCompletion(url.type()) | 286       file_system_context_->ShouldFlushOnWriteCompletion(url.type()) | 
| 265           ? FileWriterDelegate::FLUSH_ON_COMPLETION | 287           ? FileWriterDelegate::FLUSH_ON_COMPLETION | 
| 266           : FileWriterDelegate::NO_FLUSH_ON_COMPLETION; | 288           : FileWriterDelegate::NO_FLUSH_ON_COMPLETION; | 
| 267   scoped_ptr<FileWriterDelegate> writer_delegate( | 289   scoped_ptr<FileWriterDelegate> writer_delegate( | 
| 268       new FileWriterDelegate(writer.Pass(), flush_policy)); | 290       new FileWriterDelegate(writer.Pass(), flush_policy)); | 
| 269 | 291 | 
| 270   scoped_ptr<net::URLRequest> blob_request( | 292   scoped_ptr<net::URLRequest> blob_request( | 
| 271       webkit_blob::BlobProtocolHandler::CreateBlobRequest( | 293       storage::BlobProtocolHandler::CreateBlobRequest( | 
| 272           blob.Pass(), | 294           blob.Pass(), url_request_context, writer_delegate.get())); | 
| 273           url_request_context, |  | 
| 274           writer_delegate.get())); |  | 
| 275 | 295 | 
| 276   PrepareForWrite(handle.id, url); | 296   PrepareForWrite(handle.id, url); | 
| 277   operation->Write( | 297   operation->Write( | 
| 278       url, writer_delegate.Pass(), blob_request.Pass(), | 298       url, | 
| 279       base::Bind(&FileSystemOperationRunner::DidWrite, AsWeakPtr(), | 299       writer_delegate.Pass(), | 
| 280                  handle, callback)); | 300       blob_request.Pass(), | 
|  | 301       base::Bind( | 
|  | 302           &FileSystemOperationRunner::DidWrite, AsWeakPtr(), handle, callback)); | 
| 281   return handle.id; | 303   return handle.id; | 
| 282 } | 304 } | 
| 283 | 305 | 
| 284 OperationID FileSystemOperationRunner::Truncate( | 306 OperationID FileSystemOperationRunner::Truncate( | 
| 285     const FileSystemURL& url, int64 length, | 307     const FileSystemURL& url, | 
|  | 308     int64 length, | 
| 286     const StatusCallback& callback) { | 309     const StatusCallback& callback) { | 
| 287   base::File::Error error = base::File::FILE_OK; | 310   base::File::Error error = base::File::FILE_OK; | 
| 288   FileSystemOperation* operation = | 311   FileSystemOperation* operation = | 
| 289       file_system_context_->CreateFileSystemOperation(url, &error); | 312       file_system_context_->CreateFileSystemOperation(url, &error); | 
| 290   BeginOperationScoper scope; | 313   BeginOperationScoper scope; | 
| 291   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 314   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 292   if (!operation) { | 315   if (!operation) { | 
| 293     DidFinish(handle, callback, error); | 316     DidFinish(handle, callback, error); | 
| 294     return handle.id; | 317     return handle.id; | 
| 295   } | 318   } | 
| 296   PrepareForWrite(handle.id, url); | 319   PrepareForWrite(handle.id, url); | 
| 297   operation->Truncate( | 320   operation->Truncate(url, | 
| 298       url, length, | 321                       length, | 
| 299       base::Bind(&FileSystemOperationRunner::DidFinish, AsWeakPtr(), | 322                       base::Bind(&FileSystemOperationRunner::DidFinish, | 
| 300                  handle, callback)); | 323                                  AsWeakPtr(), | 
|  | 324                                  handle, | 
|  | 325                                  callback)); | 
| 301   return handle.id; | 326   return handle.id; | 
| 302 } | 327 } | 
| 303 | 328 | 
| 304 void FileSystemOperationRunner::Cancel( | 329 void FileSystemOperationRunner::Cancel(OperationID id, | 
| 305     OperationID id, | 330                                        const StatusCallback& callback) { | 
| 306     const StatusCallback& callback) { |  | 
| 307   if (ContainsKey(finished_operations_, id)) { | 331   if (ContainsKey(finished_operations_, id)) { | 
| 308     DCHECK(!ContainsKey(stray_cancel_callbacks_, id)); | 332     DCHECK(!ContainsKey(stray_cancel_callbacks_, id)); | 
| 309     stray_cancel_callbacks_[id] = callback; | 333     stray_cancel_callbacks_[id] = callback; | 
| 310     return; | 334     return; | 
| 311   } | 335   } | 
| 312   FileSystemOperation* operation = operations_.Lookup(id); | 336   FileSystemOperation* operation = operations_.Lookup(id); | 
| 313   if (!operation) { | 337   if (!operation) { | 
| 314     // There is no operation with |id|. | 338     // There is no operation with |id|. | 
| 315     callback.Run(base::File::FILE_ERROR_INVALID_OPERATION); | 339     callback.Run(base::File::FILE_ERROR_INVALID_OPERATION); | 
| 316     return; | 340     return; | 
| 317   } | 341   } | 
| 318   operation->Cancel(callback); | 342   operation->Cancel(callback); | 
| 319 } | 343 } | 
| 320 | 344 | 
| 321 OperationID FileSystemOperationRunner::TouchFile( | 345 OperationID FileSystemOperationRunner::TouchFile( | 
| 322     const FileSystemURL& url, | 346     const FileSystemURL& url, | 
| 323     const base::Time& last_access_time, | 347     const base::Time& last_access_time, | 
| 324     const base::Time& last_modified_time, | 348     const base::Time& last_modified_time, | 
| 325     const StatusCallback& callback) { | 349     const StatusCallback& callback) { | 
| 326   base::File::Error error = base::File::FILE_OK; | 350   base::File::Error error = base::File::FILE_OK; | 
| 327   FileSystemOperation* operation = | 351   FileSystemOperation* operation = | 
| 328       file_system_context_->CreateFileSystemOperation(url, &error); | 352       file_system_context_->CreateFileSystemOperation(url, &error); | 
| 329   BeginOperationScoper scope; | 353   BeginOperationScoper scope; | 
| 330   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 354   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 331   if (!operation) { | 355   if (!operation) { | 
| 332     DidFinish(handle, callback, error); | 356     DidFinish(handle, callback, error); | 
| 333     return handle.id; | 357     return handle.id; | 
| 334   } | 358   } | 
| 335   PrepareForWrite(handle.id, url); | 359   PrepareForWrite(handle.id, url); | 
| 336   operation->TouchFile( | 360   operation->TouchFile(url, | 
| 337       url, last_access_time, last_modified_time, | 361                        last_access_time, | 
| 338       base::Bind(&FileSystemOperationRunner::DidFinish, AsWeakPtr(), | 362                        last_modified_time, | 
| 339                  handle, callback)); | 363                        base::Bind(&FileSystemOperationRunner::DidFinish, | 
|  | 364                                   AsWeakPtr(), | 
|  | 365                                   handle, | 
|  | 366                                   callback)); | 
| 340   return handle.id; | 367   return handle.id; | 
| 341 } | 368 } | 
| 342 | 369 | 
| 343 OperationID FileSystemOperationRunner::OpenFile( | 370 OperationID FileSystemOperationRunner::OpenFile( | 
| 344     const FileSystemURL& url, | 371     const FileSystemURL& url, | 
| 345     int file_flags, | 372     int file_flags, | 
| 346     const OpenFileCallback& callback) { | 373     const OpenFileCallback& callback) { | 
| 347   base::File::Error error = base::File::FILE_OK; | 374   base::File::Error error = base::File::FILE_OK; | 
| 348   FileSystemOperation* operation = | 375   FileSystemOperation* operation = | 
| 349       file_system_context_->CreateFileSystemOperation(url, &error); | 376       file_system_context_->CreateFileSystemOperation(url, &error); | 
| 350   BeginOperationScoper scope; | 377   BeginOperationScoper scope; | 
| 351   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 378   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 352   if (!operation) { | 379   if (!operation) { | 
| 353     DidOpenFile(handle, callback, base::File(error), base::Closure()); | 380     DidOpenFile(handle, callback, base::File(error), base::Closure()); | 
| 354     return handle.id; | 381     return handle.id; | 
| 355   } | 382   } | 
| 356   if (file_flags & | 383   if (file_flags & | 
| 357       (base::File::FLAG_CREATE | base::File::FLAG_OPEN_ALWAYS | | 384       (base::File::FLAG_CREATE | base::File::FLAG_OPEN_ALWAYS | | 
| 358        base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_OPEN_TRUNCATED | | 385        base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_OPEN_TRUNCATED | | 
| 359        base::File::FLAG_WRITE | base::File::FLAG_EXCLUSIVE_WRITE | | 386        base::File::FLAG_WRITE | base::File::FLAG_EXCLUSIVE_WRITE | | 
| 360        base::File::FLAG_DELETE_ON_CLOSE | | 387        base::File::FLAG_DELETE_ON_CLOSE | base::File::FLAG_WRITE_ATTRIBUTES)) { | 
| 361        base::File::FLAG_WRITE_ATTRIBUTES)) { |  | 
| 362     PrepareForWrite(handle.id, url); | 388     PrepareForWrite(handle.id, url); | 
| 363   } else { | 389   } else { | 
| 364     PrepareForRead(handle.id, url); | 390     PrepareForRead(handle.id, url); | 
| 365   } | 391   } | 
| 366   operation->OpenFile( | 392   operation->OpenFile(url, | 
| 367       url, file_flags, | 393                       file_flags, | 
| 368       base::Bind(&FileSystemOperationRunner::DidOpenFile, AsWeakPtr(), | 394                       base::Bind(&FileSystemOperationRunner::DidOpenFile, | 
| 369                  handle, callback)); | 395                                  AsWeakPtr(), | 
|  | 396                                  handle, | 
|  | 397                                  callback)); | 
| 370   return handle.id; | 398   return handle.id; | 
| 371 } | 399 } | 
| 372 | 400 | 
| 373 OperationID FileSystemOperationRunner::CreateSnapshotFile( | 401 OperationID FileSystemOperationRunner::CreateSnapshotFile( | 
| 374     const FileSystemURL& url, | 402     const FileSystemURL& url, | 
| 375     const SnapshotFileCallback& callback) { | 403     const SnapshotFileCallback& callback) { | 
| 376   base::File::Error error = base::File::FILE_OK; | 404   base::File::Error error = base::File::FILE_OK; | 
| 377   FileSystemOperation* operation = | 405   FileSystemOperation* operation = | 
| 378       file_system_context_->CreateFileSystemOperation(url, &error); | 406       file_system_context_->CreateFileSystemOperation(url, &error); | 
| 379   BeginOperationScoper scope; | 407   BeginOperationScoper scope; | 
| 380   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 408   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 381   if (!operation) { | 409   if (!operation) { | 
| 382     DidCreateSnapshot(handle, callback, error, base::File::Info(), | 410     DidCreateSnapshot( | 
| 383                       base::FilePath(), NULL); | 411         handle, callback, error, base::File::Info(), base::FilePath(), NULL); | 
| 384     return handle.id; | 412     return handle.id; | 
| 385   } | 413   } | 
| 386   PrepareForRead(handle.id, url); | 414   PrepareForRead(handle.id, url); | 
| 387   operation->CreateSnapshotFile( | 415   operation->CreateSnapshotFile( | 
| 388       url, | 416       url, | 
| 389       base::Bind(&FileSystemOperationRunner::DidCreateSnapshot, AsWeakPtr(), | 417       base::Bind(&FileSystemOperationRunner::DidCreateSnapshot, | 
| 390                  handle, callback)); | 418                  AsWeakPtr(), | 
|  | 419                  handle, | 
|  | 420                  callback)); | 
| 391   return handle.id; | 421   return handle.id; | 
| 392 } | 422 } | 
| 393 | 423 | 
| 394 OperationID FileSystemOperationRunner::CopyInForeignFile( | 424 OperationID FileSystemOperationRunner::CopyInForeignFile( | 
| 395     const base::FilePath& src_local_disk_path, | 425     const base::FilePath& src_local_disk_path, | 
| 396     const FileSystemURL& dest_url, | 426     const FileSystemURL& dest_url, | 
| 397     const StatusCallback& callback) { | 427     const StatusCallback& callback) { | 
| 398   base::File::Error error = base::File::FILE_OK; | 428   base::File::Error error = base::File::FILE_OK; | 
| 399   FileSystemOperation* operation = | 429   FileSystemOperation* operation = | 
| 400       file_system_context_->CreateFileSystemOperation(dest_url, &error); | 430       file_system_context_->CreateFileSystemOperation(dest_url, &error); | 
| 401   BeginOperationScoper scope; | 431   BeginOperationScoper scope; | 
| 402   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 432   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 403   if (!operation) { | 433   if (!operation) { | 
| 404     DidFinish(handle, callback, error); | 434     DidFinish(handle, callback, error); | 
| 405     return handle.id; | 435     return handle.id; | 
| 406   } | 436   } | 
| 407   operation->CopyInForeignFile( | 437   operation->CopyInForeignFile(src_local_disk_path, | 
| 408       src_local_disk_path, dest_url, | 438                                dest_url, | 
| 409       base::Bind(&FileSystemOperationRunner::DidFinish, AsWeakPtr(), | 439                                base::Bind(&FileSystemOperationRunner::DidFinish, | 
| 410                  handle, callback)); | 440                                           AsWeakPtr(), | 
|  | 441                                           handle, | 
|  | 442                                           callback)); | 
| 411   return handle.id; | 443   return handle.id; | 
| 412 } | 444 } | 
| 413 | 445 | 
| 414 OperationID FileSystemOperationRunner::RemoveFile( | 446 OperationID FileSystemOperationRunner::RemoveFile( | 
| 415     const FileSystemURL& url, | 447     const FileSystemURL& url, | 
| 416     const StatusCallback& callback) { | 448     const StatusCallback& callback) { | 
| 417   base::File::Error error = base::File::FILE_OK; | 449   base::File::Error error = base::File::FILE_OK; | 
| 418   FileSystemOperation* operation = | 450   FileSystemOperation* operation = | 
| 419       file_system_context_->CreateFileSystemOperation(url, &error); | 451       file_system_context_->CreateFileSystemOperation(url, &error); | 
| 420   BeginOperationScoper scope; | 452   BeginOperationScoper scope; | 
| 421   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 453   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 422   if (!operation) { | 454   if (!operation) { | 
| 423     DidFinish(handle, callback, error); | 455     DidFinish(handle, callback, error); | 
| 424     return handle.id; | 456     return handle.id; | 
| 425   } | 457   } | 
| 426   operation->RemoveFile( | 458   operation->RemoveFile(url, | 
| 427       url, | 459                         base::Bind(&FileSystemOperationRunner::DidFinish, | 
| 428       base::Bind(&FileSystemOperationRunner::DidFinish, AsWeakPtr(), | 460                                    AsWeakPtr(), | 
| 429                  handle, callback)); | 461                                    handle, | 
|  | 462                                    callback)); | 
| 430   return handle.id; | 463   return handle.id; | 
| 431 } | 464 } | 
| 432 | 465 | 
| 433 OperationID FileSystemOperationRunner::RemoveDirectory( | 466 OperationID FileSystemOperationRunner::RemoveDirectory( | 
| 434     const FileSystemURL& url, | 467     const FileSystemURL& url, | 
| 435     const StatusCallback& callback) { | 468     const StatusCallback& callback) { | 
| 436   base::File::Error error = base::File::FILE_OK; | 469   base::File::Error error = base::File::FILE_OK; | 
| 437   FileSystemOperation* operation = | 470   FileSystemOperation* operation = | 
| 438       file_system_context_->CreateFileSystemOperation(url, &error); | 471       file_system_context_->CreateFileSystemOperation(url, &error); | 
| 439   BeginOperationScoper scope; | 472   BeginOperationScoper scope; | 
| 440   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 473   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 441   if (!operation) { | 474   if (!operation) { | 
| 442     DidFinish(handle, callback, error); | 475     DidFinish(handle, callback, error); | 
| 443     return handle.id; | 476     return handle.id; | 
| 444   } | 477   } | 
| 445   operation->RemoveDirectory( | 478   operation->RemoveDirectory(url, | 
| 446       url, | 479                              base::Bind(&FileSystemOperationRunner::DidFinish, | 
| 447       base::Bind(&FileSystemOperationRunner::DidFinish, AsWeakPtr(), | 480                                         AsWeakPtr(), | 
| 448                  handle, callback)); | 481                                         handle, | 
|  | 482                                         callback)); | 
| 449   return handle.id; | 483   return handle.id; | 
| 450 } | 484 } | 
| 451 | 485 | 
| 452 OperationID FileSystemOperationRunner::CopyFileLocal( | 486 OperationID FileSystemOperationRunner::CopyFileLocal( | 
| 453     const FileSystemURL& src_url, | 487     const FileSystemURL& src_url, | 
| 454     const FileSystemURL& dest_url, | 488     const FileSystemURL& dest_url, | 
| 455     CopyOrMoveOption option, | 489     CopyOrMoveOption option, | 
| 456     const CopyFileProgressCallback& progress_callback, | 490     const CopyFileProgressCallback& progress_callback, | 
| 457     const StatusCallback& callback) { | 491     const StatusCallback& callback) { | 
| 458   base::File::Error error = base::File::FILE_OK; | 492   base::File::Error error = base::File::FILE_OK; | 
| 459   FileSystemOperation* operation = | 493   FileSystemOperation* operation = | 
| 460       file_system_context_->CreateFileSystemOperation(src_url, &error); | 494       file_system_context_->CreateFileSystemOperation(src_url, &error); | 
| 461   BeginOperationScoper scope; | 495   BeginOperationScoper scope; | 
| 462   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 496   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 463   if (!operation) { | 497   if (!operation) { | 
| 464     DidFinish(handle, callback, error); | 498     DidFinish(handle, callback, error); | 
| 465     return handle.id; | 499     return handle.id; | 
| 466   } | 500   } | 
| 467   operation->CopyFileLocal( | 501   operation->CopyFileLocal(src_url, | 
| 468       src_url, dest_url, option, progress_callback, | 502                            dest_url, | 
| 469       base::Bind(&FileSystemOperationRunner::DidFinish, AsWeakPtr(), | 503                            option, | 
| 470                  handle, callback)); | 504                            progress_callback, | 
|  | 505                            base::Bind(&FileSystemOperationRunner::DidFinish, | 
|  | 506                                       AsWeakPtr(), | 
|  | 507                                       handle, | 
|  | 508                                       callback)); | 
| 471   return handle.id; | 509   return handle.id; | 
| 472 } | 510 } | 
| 473 | 511 | 
| 474 OperationID FileSystemOperationRunner::MoveFileLocal( | 512 OperationID FileSystemOperationRunner::MoveFileLocal( | 
| 475     const FileSystemURL& src_url, | 513     const FileSystemURL& src_url, | 
| 476     const FileSystemURL& dest_url, | 514     const FileSystemURL& dest_url, | 
| 477     CopyOrMoveOption option, | 515     CopyOrMoveOption option, | 
| 478     const StatusCallback& callback) { | 516     const StatusCallback& callback) { | 
| 479   base::File::Error error = base::File::FILE_OK; | 517   base::File::Error error = base::File::FILE_OK; | 
| 480   FileSystemOperation* operation = | 518   FileSystemOperation* operation = | 
| 481       file_system_context_->CreateFileSystemOperation(src_url, &error); | 519       file_system_context_->CreateFileSystemOperation(src_url, &error); | 
| 482   BeginOperationScoper scope; | 520   BeginOperationScoper scope; | 
| 483   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 521   OperationHandle handle = BeginOperation(operation, scope.AsWeakPtr()); | 
| 484   if (!operation) { | 522   if (!operation) { | 
| 485     DidFinish(handle, callback, error); | 523     DidFinish(handle, callback, error); | 
| 486     return handle.id; | 524     return handle.id; | 
| 487   } | 525   } | 
| 488   operation->MoveFileLocal( | 526   operation->MoveFileLocal(src_url, | 
| 489       src_url, dest_url, option, | 527                            dest_url, | 
| 490       base::Bind(&FileSystemOperationRunner::DidFinish, AsWeakPtr(), | 528                            option, | 
| 491                  handle, callback)); | 529                            base::Bind(&FileSystemOperationRunner::DidFinish, | 
|  | 530                                       AsWeakPtr(), | 
|  | 531                                       handle, | 
|  | 532                                       callback)); | 
| 492   return handle.id; | 533   return handle.id; | 
| 493 } | 534 } | 
| 494 | 535 | 
| 495 base::File::Error FileSystemOperationRunner::SyncGetPlatformPath( | 536 base::File::Error FileSystemOperationRunner::SyncGetPlatformPath( | 
| 496     const FileSystemURL& url, | 537     const FileSystemURL& url, | 
| 497     base::FilePath* platform_path) { | 538     base::FilePath* platform_path) { | 
| 498   base::File::Error error = base::File::FILE_OK; | 539   base::File::Error error = base::File::FILE_OK; | 
| 499   scoped_ptr<FileSystemOperation> operation( | 540   scoped_ptr<FileSystemOperation> operation( | 
| 500       file_system_context_->CreateFileSystemOperation(url, &error)); | 541       file_system_context_->CreateFileSystemOperation(url, &error)); | 
| 501   if (!operation.get()) | 542   if (!operation.get()) | 
| 502     return error; | 543     return error; | 
| 503   return operation->SyncGetPlatformPath(url, platform_path); | 544   return operation->SyncGetPlatformPath(url, platform_path); | 
| 504 } | 545 } | 
| 505 | 546 | 
| 506 FileSystemOperationRunner::FileSystemOperationRunner( | 547 FileSystemOperationRunner::FileSystemOperationRunner( | 
| 507     FileSystemContext* file_system_context) | 548     FileSystemContext* file_system_context) | 
| 508     : file_system_context_(file_system_context) {} | 549     : file_system_context_(file_system_context) { | 
|  | 550 } | 
| 509 | 551 | 
| 510 void FileSystemOperationRunner::DidFinish( | 552 void FileSystemOperationRunner::DidFinish(const OperationHandle& handle, | 
| 511     const OperationHandle& handle, | 553                                           const StatusCallback& callback, | 
| 512     const StatusCallback& callback, | 554                                           base::File::Error rv) { | 
| 513     base::File::Error rv) { |  | 
| 514   if (handle.scope) { | 555   if (handle.scope) { | 
| 515     finished_operations_.insert(handle.id); | 556     finished_operations_.insert(handle.id); | 
| 516     base::MessageLoopProxy::current()->PostTask( | 557     base::MessageLoopProxy::current()->PostTask( | 
| 517         FROM_HERE, base::Bind(&FileSystemOperationRunner::DidFinish, | 558         FROM_HERE, | 
| 518                               AsWeakPtr(), handle, callback, rv)); | 559         base::Bind(&FileSystemOperationRunner::DidFinish, | 
|  | 560                    AsWeakPtr(), | 
|  | 561                    handle, | 
|  | 562                    callback, | 
|  | 563                    rv)); | 
| 519     return; | 564     return; | 
| 520   } | 565   } | 
| 521   callback.Run(rv); | 566   callback.Run(rv); | 
| 522   FinishOperation(handle.id); | 567   FinishOperation(handle.id); | 
| 523 } | 568 } | 
| 524 | 569 | 
| 525 void FileSystemOperationRunner::DidGetMetadata( | 570 void FileSystemOperationRunner::DidGetMetadata( | 
| 526     const OperationHandle& handle, | 571     const OperationHandle& handle, | 
| 527     const GetMetadataCallback& callback, | 572     const GetMetadataCallback& callback, | 
| 528     base::File::Error rv, | 573     base::File::Error rv, | 
| 529     const base::File::Info& file_info) { | 574     const base::File::Info& file_info) { | 
| 530   if (handle.scope) { | 575   if (handle.scope) { | 
| 531     finished_operations_.insert(handle.id); | 576     finished_operations_.insert(handle.id); | 
| 532     base::MessageLoopProxy::current()->PostTask( | 577     base::MessageLoopProxy::current()->PostTask( | 
| 533         FROM_HERE, base::Bind(&FileSystemOperationRunner::DidGetMetadata, | 578         FROM_HERE, | 
| 534                               AsWeakPtr(), handle, callback, rv, file_info)); | 579         base::Bind(&FileSystemOperationRunner::DidGetMetadata, | 
|  | 580                    AsWeakPtr(), | 
|  | 581                    handle, | 
|  | 582                    callback, | 
|  | 583                    rv, | 
|  | 584                    file_info)); | 
| 535     return; | 585     return; | 
| 536   } | 586   } | 
| 537   callback.Run(rv, file_info); | 587   callback.Run(rv, file_info); | 
| 538   FinishOperation(handle.id); | 588   FinishOperation(handle.id); | 
| 539 } | 589 } | 
| 540 | 590 | 
| 541 void FileSystemOperationRunner::DidReadDirectory( | 591 void FileSystemOperationRunner::DidReadDirectory( | 
| 542     const OperationHandle& handle, | 592     const OperationHandle& handle, | 
| 543     const ReadDirectoryCallback& callback, | 593     const ReadDirectoryCallback& callback, | 
| 544     base::File::Error rv, | 594     base::File::Error rv, | 
| 545     const std::vector<DirectoryEntry>& entries, | 595     const std::vector<DirectoryEntry>& entries, | 
| 546     bool has_more) { | 596     bool has_more) { | 
| 547   if (handle.scope) { | 597   if (handle.scope) { | 
| 548     finished_operations_.insert(handle.id); | 598     finished_operations_.insert(handle.id); | 
| 549     base::MessageLoopProxy::current()->PostTask( | 599     base::MessageLoopProxy::current()->PostTask( | 
| 550         FROM_HERE, base::Bind(&FileSystemOperationRunner::DidReadDirectory, | 600         FROM_HERE, | 
| 551                               AsWeakPtr(), handle, callback, rv, | 601         base::Bind(&FileSystemOperationRunner::DidReadDirectory, | 
| 552                               entries, has_more)); | 602                    AsWeakPtr(), | 
|  | 603                    handle, | 
|  | 604                    callback, | 
|  | 605                    rv, | 
|  | 606                    entries, | 
|  | 607                    has_more)); | 
| 553     return; | 608     return; | 
| 554   } | 609   } | 
| 555   callback.Run(rv, entries, has_more); | 610   callback.Run(rv, entries, has_more); | 
| 556   if (rv != base::File::FILE_OK || !has_more) | 611   if (rv != base::File::FILE_OK || !has_more) | 
| 557     FinishOperation(handle.id); | 612     FinishOperation(handle.id); | 
| 558 } | 613 } | 
| 559 | 614 | 
| 560 void FileSystemOperationRunner::DidWrite( | 615 void FileSystemOperationRunner::DidWrite(const OperationHandle& handle, | 
| 561     const OperationHandle& handle, | 616                                          const WriteCallback& callback, | 
| 562     const WriteCallback& callback, | 617                                          base::File::Error rv, | 
| 563     base::File::Error rv, | 618                                          int64 bytes, | 
| 564     int64 bytes, | 619                                          bool complete) { | 
| 565     bool complete) { |  | 
| 566   if (handle.scope) { | 620   if (handle.scope) { | 
| 567     finished_operations_.insert(handle.id); | 621     finished_operations_.insert(handle.id); | 
| 568     base::MessageLoopProxy::current()->PostTask( | 622     base::MessageLoopProxy::current()->PostTask( | 
| 569         FROM_HERE, base::Bind(&FileSystemOperationRunner::DidWrite, AsWeakPtr(), | 623         FROM_HERE, | 
| 570                               handle, callback, rv, bytes, complete)); | 624         base::Bind(&FileSystemOperationRunner::DidWrite, | 
|  | 625                    AsWeakPtr(), | 
|  | 626                    handle, | 
|  | 627                    callback, | 
|  | 628                    rv, | 
|  | 629                    bytes, | 
|  | 630                    complete)); | 
| 571     return; | 631     return; | 
| 572   } | 632   } | 
| 573   callback.Run(rv, bytes, complete); | 633   callback.Run(rv, bytes, complete); | 
| 574   if (rv != base::File::FILE_OK || complete) | 634   if (rv != base::File::FILE_OK || complete) | 
| 575     FinishOperation(handle.id); | 635     FinishOperation(handle.id); | 
| 576 } | 636 } | 
| 577 | 637 | 
| 578 void FileSystemOperationRunner::DidOpenFile( | 638 void FileSystemOperationRunner::DidOpenFile( | 
| 579     const OperationHandle& handle, | 639     const OperationHandle& handle, | 
| 580     const OpenFileCallback& callback, | 640     const OpenFileCallback& callback, | 
| 581     base::File file, | 641     base::File file, | 
| 582     const base::Closure& on_close_callback) { | 642     const base::Closure& on_close_callback) { | 
| 583   if (handle.scope) { | 643   if (handle.scope) { | 
| 584     finished_operations_.insert(handle.id); | 644     finished_operations_.insert(handle.id); | 
| 585     base::MessageLoopProxy::current()->PostTask( | 645     base::MessageLoopProxy::current()->PostTask( | 
| 586         FROM_HERE, base::Bind(&FileSystemOperationRunner::DidOpenFile, | 646         FROM_HERE, | 
| 587                               AsWeakPtr(), handle, callback, Passed(&file), | 647         base::Bind(&FileSystemOperationRunner::DidOpenFile, | 
| 588                               on_close_callback)); | 648                    AsWeakPtr(), | 
|  | 649                    handle, | 
|  | 650                    callback, | 
|  | 651                    Passed(&file), | 
|  | 652                    on_close_callback)); | 
| 589     return; | 653     return; | 
| 590   } | 654   } | 
| 591   callback.Run(file.Pass(), on_close_callback); | 655   callback.Run(file.Pass(), on_close_callback); | 
| 592   FinishOperation(handle.id); | 656   FinishOperation(handle.id); | 
| 593 } | 657 } | 
| 594 | 658 | 
| 595 void FileSystemOperationRunner::DidCreateSnapshot( | 659 void FileSystemOperationRunner::DidCreateSnapshot( | 
| 596     const OperationHandle& handle, | 660     const OperationHandle& handle, | 
| 597     const SnapshotFileCallback& callback, | 661     const SnapshotFileCallback& callback, | 
| 598     base::File::Error rv, | 662     base::File::Error rv, | 
| 599     const base::File::Info& file_info, | 663     const base::File::Info& file_info, | 
| 600     const base::FilePath& platform_path, | 664     const base::FilePath& platform_path, | 
| 601     const scoped_refptr<webkit_blob::ShareableFileReference>& file_ref) { | 665     const scoped_refptr<storage::ShareableFileReference>& file_ref) { | 
| 602   if (handle.scope) { | 666   if (handle.scope) { | 
| 603     finished_operations_.insert(handle.id); | 667     finished_operations_.insert(handle.id); | 
| 604     base::MessageLoopProxy::current()->PostTask( | 668     base::MessageLoopProxy::current()->PostTask( | 
| 605         FROM_HERE, base::Bind(&FileSystemOperationRunner::DidCreateSnapshot, | 669         FROM_HERE, | 
| 606                               AsWeakPtr(), handle, callback, rv, file_info, | 670         base::Bind(&FileSystemOperationRunner::DidCreateSnapshot, | 
| 607                               platform_path, file_ref)); | 671                    AsWeakPtr(), | 
|  | 672                    handle, | 
|  | 673                    callback, | 
|  | 674                    rv, | 
|  | 675                    file_info, | 
|  | 676                    platform_path, | 
|  | 677                    file_ref)); | 
| 608     return; | 678     return; | 
| 609   } | 679   } | 
| 610   callback.Run(rv, file_info, platform_path, file_ref); | 680   callback.Run(rv, file_info, platform_path, file_ref); | 
| 611   FinishOperation(handle.id); | 681   FinishOperation(handle.id); | 
| 612 } | 682 } | 
| 613 | 683 | 
| 614 void FileSystemOperationRunner::OnCopyProgress( | 684 void FileSystemOperationRunner::OnCopyProgress( | 
| 615     const OperationHandle& handle, | 685     const OperationHandle& handle, | 
| 616     const CopyProgressCallback& callback, | 686     const CopyProgressCallback& callback, | 
| 617     FileSystemOperation::CopyProgressType type, | 687     FileSystemOperation::CopyProgressType type, | 
| 618     const FileSystemURL& source_url, | 688     const FileSystemURL& source_url, | 
| 619     const FileSystemURL& dest_url, | 689     const FileSystemURL& dest_url, | 
| 620     int64 size) { | 690     int64 size) { | 
| 621   if (handle.scope) { | 691   if (handle.scope) { | 
| 622     base::MessageLoopProxy::current()->PostTask( | 692     base::MessageLoopProxy::current()->PostTask( | 
| 623         FROM_HERE, base::Bind( | 693         FROM_HERE, | 
| 624             &FileSystemOperationRunner::OnCopyProgress, | 694         base::Bind(&FileSystemOperationRunner::OnCopyProgress, | 
| 625             AsWeakPtr(), handle, callback, type, source_url, dest_url, size)); | 695                    AsWeakPtr(), | 
|  | 696                    handle, | 
|  | 697                    callback, | 
|  | 698                    type, | 
|  | 699                    source_url, | 
|  | 700                    dest_url, | 
|  | 701                    size)); | 
| 626     return; | 702     return; | 
| 627   } | 703   } | 
| 628   callback.Run(type, source_url, dest_url, size); | 704   callback.Run(type, source_url, dest_url, size); | 
| 629 } | 705 } | 
| 630 | 706 | 
| 631 void FileSystemOperationRunner::PrepareForWrite(OperationID id, | 707 void FileSystemOperationRunner::PrepareForWrite(OperationID id, | 
| 632                                                 const FileSystemURL& url) { | 708                                                 const FileSystemURL& url) { | 
| 633   if (file_system_context_->GetUpdateObservers(url.type())) { | 709   if (file_system_context_->GetUpdateObservers(url.type())) { | 
| 634     file_system_context_->GetUpdateObservers(url.type())->Notify( | 710     file_system_context_->GetUpdateObservers(url.type()) | 
| 635         &FileUpdateObserver::OnStartUpdate, MakeTuple(url)); | 711         ->Notify(&FileUpdateObserver::OnStartUpdate, MakeTuple(url)); | 
| 636   } | 712   } | 
| 637   write_target_urls_[id].insert(url); | 713   write_target_urls_[id].insert(url); | 
| 638 } | 714 } | 
| 639 | 715 | 
| 640 void FileSystemOperationRunner::PrepareForRead(OperationID id, | 716 void FileSystemOperationRunner::PrepareForRead(OperationID id, | 
| 641                                                const FileSystemURL& url) { | 717                                                const FileSystemURL& url) { | 
| 642   if (file_system_context_->GetAccessObservers(url.type())) { | 718   if (file_system_context_->GetAccessObservers(url.type())) { | 
| 643     file_system_context_->GetAccessObservers(url.type())->Notify( | 719     file_system_context_->GetAccessObservers(url.type()) | 
| 644         &FileAccessObserver::OnAccess, MakeTuple(url)); | 720         ->Notify(&FileAccessObserver::OnAccess, MakeTuple(url)); | 
| 645   } | 721   } | 
| 646 } | 722 } | 
| 647 | 723 | 
| 648 FileSystemOperationRunner::OperationHandle | 724 FileSystemOperationRunner::OperationHandle | 
| 649 FileSystemOperationRunner::BeginOperation( | 725 FileSystemOperationRunner::BeginOperation( | 
| 650     FileSystemOperation* operation, | 726     FileSystemOperation* operation, | 
| 651     base::WeakPtr<BeginOperationScoper> scope) { | 727     base::WeakPtr<BeginOperationScoper> scope) { | 
| 652   OperationHandle handle; | 728   OperationHandle handle; | 
| 653   handle.id = operations_.Add(operation); | 729   handle.id = operations_.Add(operation); | 
| 654   handle.scope = scope; | 730   handle.scope = scope; | 
| 655   return handle; | 731   return handle; | 
| 656 } | 732 } | 
| 657 | 733 | 
| 658 void FileSystemOperationRunner::FinishOperation(OperationID id) { | 734 void FileSystemOperationRunner::FinishOperation(OperationID id) { | 
| 659   OperationToURLSet::iterator found = write_target_urls_.find(id); | 735   OperationToURLSet::iterator found = write_target_urls_.find(id); | 
| 660   if (found != write_target_urls_.end()) { | 736   if (found != write_target_urls_.end()) { | 
| 661     const FileSystemURLSet& urls = found->second; | 737     const FileSystemURLSet& urls = found->second; | 
| 662     for (FileSystemURLSet::const_iterator iter = urls.begin(); | 738     for (FileSystemURLSet::const_iterator iter = urls.begin(); | 
| 663         iter != urls.end(); ++iter) { | 739          iter != urls.end(); | 
|  | 740          ++iter) { | 
| 664       if (file_system_context_->GetUpdateObservers(iter->type())) { | 741       if (file_system_context_->GetUpdateObservers(iter->type())) { | 
| 665         file_system_context_->GetUpdateObservers(iter->type())->Notify( | 742         file_system_context_->GetUpdateObservers(iter->type()) | 
| 666             &FileUpdateObserver::OnEndUpdate, MakeTuple(*iter)); | 743             ->Notify(&FileUpdateObserver::OnEndUpdate, MakeTuple(*iter)); | 
| 667       } | 744       } | 
| 668     } | 745     } | 
| 669     write_target_urls_.erase(found); | 746     write_target_urls_.erase(found); | 
| 670   } | 747   } | 
| 671 | 748 | 
| 672   // IDMap::Lookup fails if the operation is NULL, so we don't check | 749   // IDMap::Lookup fails if the operation is NULL, so we don't check | 
| 673   // operations_.Lookup(id) here. | 750   // operations_.Lookup(id) here. | 
| 674 | 751 | 
| 675   operations_.Remove(id); | 752   operations_.Remove(id); | 
| 676   finished_operations_.erase(id); | 753   finished_operations_.erase(id); | 
| 677 | 754 | 
| 678   // Dispatch stray cancel callback if exists. | 755   // Dispatch stray cancel callback if exists. | 
| 679   std::map<OperationID, StatusCallback>::iterator found_cancel = | 756   std::map<OperationID, StatusCallback>::iterator found_cancel = | 
| 680       stray_cancel_callbacks_.find(id); | 757       stray_cancel_callbacks_.find(id); | 
| 681   if (found_cancel != stray_cancel_callbacks_.end()) { | 758   if (found_cancel != stray_cancel_callbacks_.end()) { | 
| 682     // This cancel has been requested after the operation has finished, | 759     // This cancel has been requested after the operation has finished, | 
| 683     // so report that we failed to stop it. | 760     // so report that we failed to stop it. | 
| 684     found_cancel->second.Run(base::File::FILE_ERROR_INVALID_OPERATION); | 761     found_cancel->second.Run(base::File::FILE_ERROR_INVALID_OPERATION); | 
| 685     stray_cancel_callbacks_.erase(found_cancel); | 762     stray_cancel_callbacks_.erase(found_cancel); | 
| 686   } | 763   } | 
| 687 } | 764 } | 
| 688 | 765 | 
| 689 }  // namespace fileapi | 766 }  // namespace storage | 
| OLD | NEW | 
|---|