Chromium Code Reviews| Index: net/disk_cache/simple/simple_backend_impl.cc |
| diff --git a/net/disk_cache/simple/simple_backend_impl.cc b/net/disk_cache/simple/simple_backend_impl.cc |
| index ffdc9b185b366ef95a2f1b6ca91a89714e6423f5..a211c634ca095cc4b1bb466b990a298bedb64f1f 100644 |
| --- a/net/disk_cache/simple/simple_backend_impl.cc |
| +++ b/net/disk_cache/simple/simple_backend_impl.cc |
| @@ -473,20 +473,77 @@ int SimpleBackendImpl::DoomEntriesSince( |
| return DoomEntriesBetween(initial_time, Time(), callback); |
| } |
| -int SimpleBackendImpl::OpenNextEntry(void** iter, |
| - Entry** next_entry, |
| - const CompletionCallback& callback) { |
| - CompletionCallback get_next_entry = |
| - base::Bind(&SimpleBackendImpl::GetNextEntryInIterator, AsWeakPtr(), iter, |
| - next_entry, callback); |
| - return index_->ExecuteWhenReady(get_next_entry); |
| -} |
| +class SimpleBackendImpl::SimpleIterator : public Iterator { |
| + public: |
| + explicit SimpleIterator(base::WeakPtr<SimpleBackendImpl> backend) |
| + : backend_(backend), |
| + weak_factory_(this) {} |
| + |
| + // From Backend::Iterator: |
| + virtual int OpenNextEntry(Entry** next_entry, |
| + const CompletionCallback& callback) OVERRIDE { |
| + CompletionCallback open_next_entry_impl = |
| + base::Bind(&SimpleIterator::OpenNextEntryImpl, |
| + weak_factory_.GetWeakPtr(), next_entry, callback); |
| + return backend_->index_->ExecuteWhenReady(open_next_entry_impl); |
| + } |
| + |
| + void OpenNextEntryImpl(Entry** next_entry, |
|
pasko
2014/09/12 08:10:26
This has a lot in common with SimpleBackendImpl::G
gavinp
2014/09/12 14:15:32
You're right, that would have been a good way to p
|
| + const CompletionCallback& callback, |
| + int index_initialization_error_code) { |
| + if (!backend_) { |
| + callback.Run(net::ERR_FAILED); |
| + return; |
| + } |
| + if (index_initialization_error_code != net::OK) { |
| + callback.Run(index_initialization_error_code); |
| + return; |
| + } |
| + if (!hashes_to_enumerate_) |
| + hashes_to_enumerate_ = backend_->index()->GetAllHashes().Pass(); |
| + |
| + while (!hashes_to_enumerate_->empty()) { |
| + uint64 entry_hash = hashes_to_enumerate_->back(); |
| + hashes_to_enumerate_->pop_back(); |
| + if (backend_->index()->Has(entry_hash)) { |
| + *next_entry = NULL; |
| + CompletionCallback continue_iteration = base::Bind( |
| + &SimpleIterator::CheckIterationReturnValue, |
| + weak_factory_.GetWeakPtr(), |
| + next_entry, |
| + callback); |
| + int error_code_open = backend_->OpenEntryFromHash(entry_hash, |
| + next_entry, |
| + continue_iteration); |
| + if (error_code_open == net::ERR_IO_PENDING) |
| + return; |
| + if (error_code_open != net::ERR_FAILED) { |
| + callback.Run(error_code_open); |
| + return; |
| + } |
| + } |
| + } |
| + callback.Run(net::ERR_FAILED); |
| + } |
| -void SimpleBackendImpl::EndEnumeration(void** iter) { |
| - SimpleIndex::HashList* entry_list = |
| - static_cast<SimpleIndex::HashList*>(*iter); |
| - delete entry_list; |
| - *iter = NULL; |
| + void CheckIterationReturnValue(Entry** entry, |
| + const CompletionCallback& callback, |
| + int error_code) { |
| + if (error_code == net::ERR_FAILED) { |
| + OpenNextEntry(entry, callback); |
| + return; |
| + } |
| + callback.Run(error_code); |
| + } |
| + |
| + private: |
| + base::WeakPtr<SimpleBackendImpl> backend_; |
| + scoped_ptr<std::vector<uint64> > hashes_to_enumerate_; |
| + base::WeakPtrFactory<SimpleIterator> weak_factory_; |
| +}; |
| + |
| +scoped_ptr<Backend::Iterator> SimpleBackendImpl::CreateIterator() { |
| + return scoped_ptr<Iterator>(new SimpleIterator(AsWeakPtr())); |
| } |
| void SimpleBackendImpl::GetStats( |
| @@ -614,45 +671,6 @@ int SimpleBackendImpl::DoomEntryFromHash(uint64 entry_hash, |
| return net::ERR_IO_PENDING; |
| } |
| -void SimpleBackendImpl::GetNextEntryInIterator( |
| - void** iter, |
| - Entry** next_entry, |
| - const CompletionCallback& callback, |
| - int error_code) { |
| - if (error_code != net::OK) { |
| - callback.Run(error_code); |
| - return; |
| - } |
| - if (*iter == NULL) { |
| - *iter = index()->GetAllHashes().release(); |
| - } |
| - SimpleIndex::HashList* entry_list = |
| - static_cast<SimpleIndex::HashList*>(*iter); |
| - while (entry_list->size() > 0) { |
| - uint64 entry_hash = entry_list->back(); |
| - entry_list->pop_back(); |
| - if (index()->Has(entry_hash)) { |
| - *next_entry = NULL; |
| - CompletionCallback continue_iteration = base::Bind( |
| - &SimpleBackendImpl::CheckIterationReturnValue, |
| - AsWeakPtr(), |
| - iter, |
| - next_entry, |
| - callback); |
| - int error_code_open = OpenEntryFromHash(entry_hash, |
| - next_entry, |
| - continue_iteration); |
| - if (error_code_open == net::ERR_IO_PENDING) |
| - return; |
| - if (error_code_open != net::ERR_FAILED) { |
| - callback.Run(error_code_open); |
| - return; |
| - } |
| - } |
| - } |
| - callback.Run(net::ERR_FAILED); |
| -} |
| - |
| void SimpleBackendImpl::OnEntryOpenedFromHash( |
| uint64 hash, |
| Entry** entry, |
| @@ -706,18 +724,6 @@ void SimpleBackendImpl::OnEntryOpenedFromKey( |
| callback.Run(final_code); |
| } |
| -void SimpleBackendImpl::CheckIterationReturnValue( |
| - void** iter, |
| - Entry** entry, |
| - const CompletionCallback& callback, |
| - int error_code) { |
| - if (error_code == net::ERR_FAILED) { |
| - OpenNextEntry(iter, entry, callback); |
| - return; |
| - } |
| - callback.Run(error_code); |
| -} |
| - |
| void SimpleBackendImpl::DoomEntriesComplete( |
| scoped_ptr<std::vector<uint64> > entry_hashes, |
| const net::CompletionCallback& callback, |