OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 "content/browser/indexed_db/indexed_db_backing_store.h" | 5 #include "content/browser/indexed_db/indexed_db_backing_store.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
10 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
(...skipping 2224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2235 typedef IndexedDBBackingStore::Transaction::WriteDescriptorVec | 2235 typedef IndexedDBBackingStore::Transaction::WriteDescriptorVec |
2236 WriteDescriptorVec; | 2236 WriteDescriptorVec; |
2237 ChainedBlobWriterImpl( | 2237 ChainedBlobWriterImpl( |
2238 int64 database_id, | 2238 int64 database_id, |
2239 IndexedDBBackingStore* backing_store, | 2239 IndexedDBBackingStore* backing_store, |
2240 WriteDescriptorVec* blobs, | 2240 WriteDescriptorVec* blobs, |
2241 scoped_refptr<IndexedDBBackingStore::BlobWriteCallback> callback) | 2241 scoped_refptr<IndexedDBBackingStore::BlobWriteCallback> callback) |
2242 : waiting_for_callback_(false), | 2242 : waiting_for_callback_(false), |
2243 database_id_(database_id), | 2243 database_id_(database_id), |
2244 backing_store_(backing_store), | 2244 backing_store_(backing_store), |
2245 callback_(callback), | 2245 callback_(callback) { |
2246 aborted_(false) { | |
2247 blobs_.swap(*blobs); | 2246 blobs_.swap(*blobs); |
2248 iter_ = blobs_.begin(); | 2247 iter_ = blobs_.begin(); |
2249 backing_store->task_runner()->PostTask( | 2248 backing_store->task_runner()->PostTask( |
2250 FROM_HERE, base::Bind(&ChainedBlobWriterImpl::WriteNextFile, this)); | 2249 FROM_HERE, base::Bind(&ChainedBlobWriterImpl::WriteNextFile, this)); |
2251 } | 2250 } |
2252 | 2251 |
2253 void set_delegate(scoped_ptr<FileWriterDelegate> delegate) override { | 2252 void set_delegate(scoped_ptr<FileWriterDelegate> delegate) override { |
2254 delegate_.reset(delegate.release()); | 2253 delegate_.reset(delegate.release()); |
2255 } | 2254 } |
2256 | 2255 |
2257 void ReportWriteCompletion(bool succeeded, int64 bytes_written) override { | 2256 void ReportWriteCompletion(bool succeeded, int64 bytes_written) override { |
2258 DCHECK(waiting_for_callback_); | 2257 DCHECK(waiting_for_callback_); |
2259 DCHECK(!succeeded || bytes_written >= 0); | 2258 DCHECK(!succeeded || bytes_written >= 0); |
2260 waiting_for_callback_ = false; | 2259 waiting_for_callback_ = false; |
2261 if (delegate_.get()) // Only present for Blob, not File. | 2260 if (delegate_.get()) // Only present for Blob, not File. |
2262 content::BrowserThread::DeleteSoon( | 2261 content::BrowserThread::DeleteSoon( |
2263 content::BrowserThread::IO, FROM_HERE, delegate_.release()); | 2262 content::BrowserThread::IO, FROM_HERE, delegate_.release()); |
2264 if (aborted_) { | 2263 if (aborted_self_ref_.get()) { |
2265 self_ref_ = NULL; | 2264 aborted_self_ref_ = NULL; |
2266 return; | 2265 return; |
2267 } | 2266 } |
2268 if (iter_->size() != -1 && iter_->size() != bytes_written) | 2267 if (iter_->size() != -1 && iter_->size() != bytes_written) |
2269 succeeded = false; | 2268 succeeded = false; |
2270 if (succeeded) { | 2269 if (succeeded) { |
2271 ++iter_; | 2270 ++iter_; |
2272 WriteNextFile(); | 2271 WriteNextFile(); |
2273 } else { | 2272 } else { |
2274 callback_->Run(false); | 2273 callback_->Run(false); |
2275 } | 2274 } |
2276 } | 2275 } |
2277 | 2276 |
2278 void Abort() override { | 2277 void Abort() override { |
2279 if (!waiting_for_callback_) | 2278 if (!waiting_for_callback_) |
2280 return; | 2279 return; |
2281 self_ref_ = this; | 2280 aborted_self_ref_ = this; |
2282 aborted_ = true; | |
2283 } | 2281 } |
2284 | 2282 |
2285 private: | 2283 private: |
2286 ~ChainedBlobWriterImpl() override {} | 2284 ~ChainedBlobWriterImpl() override { DCHECK(!waiting_for_callback_); } |
2287 | 2285 |
2288 void WriteNextFile() { | 2286 void WriteNextFile() { |
2289 DCHECK(!waiting_for_callback_); | 2287 DCHECK(!waiting_for_callback_); |
2290 DCHECK(!aborted_); | 2288 DCHECK(!aborted_self_ref_.get()); |
2291 if (iter_ == blobs_.end()) { | 2289 if (iter_ == blobs_.end()) { |
2292 DCHECK(!self_ref_.get()); | |
2293 callback_->Run(true); | 2290 callback_->Run(true); |
2294 return; | 2291 return; |
2295 } else { | 2292 } else { |
| 2293 waiting_for_callback_ = true; |
2296 if (!backing_store_->WriteBlobFile(database_id_, *iter_, this)) { | 2294 if (!backing_store_->WriteBlobFile(database_id_, *iter_, this)) { |
| 2295 waiting_for_callback_ = false; |
2297 callback_->Run(false); | 2296 callback_->Run(false); |
2298 return; | 2297 return; |
2299 } | 2298 } |
2300 waiting_for_callback_ = true; | |
2301 } | 2299 } |
2302 } | 2300 } |
2303 | 2301 |
2304 bool waiting_for_callback_; | 2302 bool waiting_for_callback_; |
2305 scoped_refptr<ChainedBlobWriterImpl> self_ref_; | 2303 scoped_refptr<ChainedBlobWriterImpl> aborted_self_ref_; |
2306 WriteDescriptorVec blobs_; | 2304 WriteDescriptorVec blobs_; |
2307 WriteDescriptorVec::const_iterator iter_; | 2305 WriteDescriptorVec::const_iterator iter_; |
2308 int64 database_id_; | 2306 int64 database_id_; |
2309 IndexedDBBackingStore* backing_store_; | 2307 IndexedDBBackingStore* backing_store_; |
2310 scoped_refptr<IndexedDBBackingStore::BlobWriteCallback> callback_; | 2308 scoped_refptr<IndexedDBBackingStore::BlobWriteCallback> callback_; |
2311 scoped_ptr<FileWriterDelegate> delegate_; | 2309 scoped_ptr<FileWriterDelegate> delegate_; |
2312 bool aborted_; | |
2313 | 2310 |
2314 DISALLOW_COPY_AND_ASSIGN(ChainedBlobWriterImpl); | 2311 DISALLOW_COPY_AND_ASSIGN(ChainedBlobWriterImpl); |
2315 }; | 2312 }; |
2316 | 2313 |
2317 class LocalWriteClosure : public FileWriterDelegate::DelegateWriteCallback, | 2314 class LocalWriteClosure : public FileWriterDelegate::DelegateWriteCallback, |
2318 public base::RefCountedThreadSafe<LocalWriteClosure> { | 2315 public base::RefCountedThreadSafe<LocalWriteClosure> { |
2319 public: | 2316 public: |
2320 LocalWriteClosure(IndexedDBBackingStore::Transaction::ChainedBlobWriter* | 2317 LocalWriteClosure(IndexedDBBackingStore::Transaction::ChainedBlobWriter* |
2321 chained_blob_writer, | 2318 chained_blob_writer, |
2322 base::SequencedTaskRunner* task_runner) | 2319 base::SequencedTaskRunner* task_runner) |
(...skipping 2099 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4422 | 4419 |
4423 IndexedDBBackingStore::Transaction::WriteDescriptor::WriteDescriptor( | 4420 IndexedDBBackingStore::Transaction::WriteDescriptor::WriteDescriptor( |
4424 const WriteDescriptor& other) = default; | 4421 const WriteDescriptor& other) = default; |
4425 IndexedDBBackingStore::Transaction::WriteDescriptor::~WriteDescriptor() = | 4422 IndexedDBBackingStore::Transaction::WriteDescriptor::~WriteDescriptor() = |
4426 default; | 4423 default; |
4427 IndexedDBBackingStore::Transaction::WriteDescriptor& | 4424 IndexedDBBackingStore::Transaction::WriteDescriptor& |
4428 IndexedDBBackingStore::Transaction::WriteDescriptor:: | 4425 IndexedDBBackingStore::Transaction::WriteDescriptor:: |
4429 operator=(const WriteDescriptor& other) = default; | 4426 operator=(const WriteDescriptor& other) = default; |
4430 | 4427 |
4431 } // namespace content | 4428 } // namespace content |
OLD | NEW |