Index: sync/internal_api/attachments/attachment_service_impl.cc |
diff --git a/sync/internal_api/attachments/attachment_service_impl.cc b/sync/internal_api/attachments/attachment_service_impl.cc |
deleted file mode 100644 |
index b9e1c7ea2f0b33206fabad9a0ad01c421f277092..0000000000000000000000000000000000000000 |
--- a/sync/internal_api/attachments/attachment_service_impl.cc |
+++ /dev/null |
@@ -1,337 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "sync/internal_api/public/attachments/attachment_service_impl.h" |
- |
-#include <iterator> |
-#include <utility> |
- |
-#include "base/bind.h" |
-#include "base/location.h" |
-#include "base/macros.h" |
-#include "base/single_thread_task_runner.h" |
-#include "base/threading/thread_task_runner_handle.h" |
-#include "base/time/time.h" |
-#include "sync/api/attachments/attachment.h" |
-#include "sync/internal_api/public/attachments/fake_attachment_downloader.h" |
-#include "sync/internal_api/public/attachments/fake_attachment_uploader.h" |
- |
-namespace syncer { |
- |
-// GetOrDownloadAttachments starts multiple parallel DownloadAttachment calls. |
-// GetOrDownloadState tracks completion of these calls and posts callback for |
-// consumer once all attachments are either retrieved or reported unavailable. |
-class AttachmentServiceImpl::GetOrDownloadState |
- : public base::RefCounted<GetOrDownloadState>, |
- public base::NonThreadSafe { |
- public: |
- // GetOrDownloadState gets parameter from values passed to |
- // AttachmentService::GetOrDownloadAttachments. |
- // |attachment_ids| is a list of attachmens to retrieve. |
- // |callback| will be posted on current thread when all attachments retrieved |
- // or confirmed unavailable. |
- GetOrDownloadState(const AttachmentIdList& attachment_ids, |
- const GetOrDownloadCallback& callback); |
- |
- // Attachment was just retrieved. Add it to retrieved attachments. |
- void AddAttachment(const Attachment& attachment); |
- |
- // Both reading from local store and downloading attachment failed. |
- // Add it to unavailable set. |
- void AddUnavailableAttachmentId(const AttachmentId& attachment_id); |
- |
- private: |
- friend class base::RefCounted<GetOrDownloadState>; |
- virtual ~GetOrDownloadState(); |
- |
- // If all attachment requests completed then post callback to consumer with |
- // results. |
- void PostResultIfAllRequestsCompleted(); |
- |
- GetOrDownloadCallback callback_; |
- |
- // Requests for these attachments are still in progress. |
- AttachmentIdSet in_progress_attachments_; |
- |
- AttachmentIdSet unavailable_attachments_; |
- std::unique_ptr<AttachmentMap> retrieved_attachments_; |
- |
- DISALLOW_COPY_AND_ASSIGN(GetOrDownloadState); |
-}; |
- |
-AttachmentServiceImpl::GetOrDownloadState::GetOrDownloadState( |
- const AttachmentIdList& attachment_ids, |
- const GetOrDownloadCallback& callback) |
- : callback_(callback), retrieved_attachments_(new AttachmentMap()) { |
- std::copy( |
- attachment_ids.begin(), |
- attachment_ids.end(), |
- std::inserter(in_progress_attachments_, in_progress_attachments_.end())); |
- PostResultIfAllRequestsCompleted(); |
-} |
- |
-AttachmentServiceImpl::GetOrDownloadState::~GetOrDownloadState() { |
- DCHECK(CalledOnValidThread()); |
-} |
- |
-void AttachmentServiceImpl::GetOrDownloadState::AddAttachment( |
- const Attachment& attachment) { |
- DCHECK(CalledOnValidThread()); |
- DCHECK(retrieved_attachments_->find(attachment.GetId()) == |
- retrieved_attachments_->end()); |
- retrieved_attachments_->insert( |
- std::make_pair(attachment.GetId(), attachment)); |
- DCHECK(in_progress_attachments_.find(attachment.GetId()) != |
- in_progress_attachments_.end()); |
- in_progress_attachments_.erase(attachment.GetId()); |
- PostResultIfAllRequestsCompleted(); |
-} |
- |
-void AttachmentServiceImpl::GetOrDownloadState::AddUnavailableAttachmentId( |
- const AttachmentId& attachment_id) { |
- DCHECK(CalledOnValidThread()); |
- DCHECK(unavailable_attachments_.find(attachment_id) == |
- unavailable_attachments_.end()); |
- unavailable_attachments_.insert(attachment_id); |
- DCHECK(in_progress_attachments_.find(attachment_id) != |
- in_progress_attachments_.end()); |
- in_progress_attachments_.erase(attachment_id); |
- PostResultIfAllRequestsCompleted(); |
-} |
- |
-void |
-AttachmentServiceImpl::GetOrDownloadState::PostResultIfAllRequestsCompleted() { |
- if (in_progress_attachments_.empty()) { |
- // All requests completed. Let's notify consumer. |
- GetOrDownloadResult result = |
- unavailable_attachments_.empty() ? GET_SUCCESS : GET_UNSPECIFIED_ERROR; |
- base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, |
- base::Bind(callback_, result, base::Passed(&retrieved_attachments_))); |
- } |
-} |
- |
-AttachmentServiceImpl::AttachmentServiceImpl( |
- std::unique_ptr<AttachmentStoreForSync> attachment_store, |
- std::unique_ptr<AttachmentUploader> attachment_uploader, |
- std::unique_ptr<AttachmentDownloader> attachment_downloader, |
- Delegate* delegate, |
- const base::TimeDelta& initial_backoff_delay, |
- const base::TimeDelta& max_backoff_delay) |
- : attachment_store_(std::move(attachment_store)), |
- attachment_uploader_(std::move(attachment_uploader)), |
- attachment_downloader_(std::move(attachment_downloader)), |
- delegate_(delegate), |
- weak_ptr_factory_(this) { |
- DCHECK(CalledOnValidThread()); |
- DCHECK(attachment_store_.get()); |
- |
- // TODO(maniscalco): Observe network connectivity change events. When the |
- // network becomes disconnected, consider suspending queue dispatch. When |
- // connectivity is restored, consider clearing any dispatch backoff (bug |
- // 411981). |
- upload_task_queue_.reset(new TaskQueue<AttachmentId>( |
- base::Bind(&AttachmentServiceImpl::BeginUpload, |
- weak_ptr_factory_.GetWeakPtr()), |
- initial_backoff_delay, |
- max_backoff_delay)); |
- |
- net::NetworkChangeNotifier::AddNetworkChangeObserver(this); |
-} |
- |
-AttachmentServiceImpl::~AttachmentServiceImpl() { |
- DCHECK(CalledOnValidThread()); |
- net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this); |
-} |
- |
-// Static. |
-std::unique_ptr<syncer::AttachmentService> |
-AttachmentServiceImpl::CreateForTest() { |
- std::unique_ptr<syncer::AttachmentStore> attachment_store = |
- AttachmentStore::CreateInMemoryStore(); |
- std::unique_ptr<AttachmentUploader> attachment_uploader( |
- new FakeAttachmentUploader); |
- std::unique_ptr<AttachmentDownloader> attachment_downloader( |
- new FakeAttachmentDownloader()); |
- std::unique_ptr<syncer::AttachmentService> attachment_service( |
- new syncer::AttachmentServiceImpl( |
- attachment_store->CreateAttachmentStoreForSync(), |
- std::move(attachment_uploader), std::move(attachment_downloader), |
- NULL, base::TimeDelta(), base::TimeDelta())); |
- return attachment_service; |
-} |
- |
-void AttachmentServiceImpl::GetOrDownloadAttachments( |
- const AttachmentIdList& attachment_ids, |
- const GetOrDownloadCallback& callback) { |
- DCHECK(CalledOnValidThread()); |
- scoped_refptr<GetOrDownloadState> state( |
- new GetOrDownloadState(attachment_ids, callback)); |
- // SetModelTypeReference() makes attachments visible for model type. |
- // Needed when attachment doesn't have model type reference, but still |
- // available in local store. |
- attachment_store_->SetModelTypeReference(attachment_ids); |
- attachment_store_->Read(attachment_ids, |
- base::Bind(&AttachmentServiceImpl::ReadDone, |
- weak_ptr_factory_.GetWeakPtr(), state)); |
-} |
- |
-void AttachmentServiceImpl::ReadDone( |
- const scoped_refptr<GetOrDownloadState>& state, |
- const AttachmentStore::Result& result, |
- std::unique_ptr<AttachmentMap> attachments, |
- std::unique_ptr<AttachmentIdList> unavailable_attachment_ids) { |
- // Add read attachments to result. |
- for (AttachmentMap::const_iterator iter = attachments->begin(); |
- iter != attachments->end(); |
- ++iter) { |
- state->AddAttachment(iter->second); |
- } |
- |
- AttachmentIdList::const_iterator iter = unavailable_attachment_ids->begin(); |
- AttachmentIdList::const_iterator end = unavailable_attachment_ids->end(); |
- if (result != AttachmentStore::STORE_INITIALIZATION_FAILED && |
- attachment_downloader_.get()) { |
- // Try to download locally unavailable attachments. |
- for (; iter != end; ++iter) { |
- attachment_downloader_->DownloadAttachment( |
- *iter, |
- base::Bind(&AttachmentServiceImpl::DownloadDone, |
- weak_ptr_factory_.GetWeakPtr(), |
- state, |
- *iter)); |
- } |
- } else { |
- // No downloader so all locally unavailable attachments are unavailable. |
- for (; iter != end; ++iter) { |
- state->AddUnavailableAttachmentId(*iter); |
- } |
- } |
-} |
- |
-void AttachmentServiceImpl::WriteDone( |
- const scoped_refptr<GetOrDownloadState>& state, |
- const Attachment& attachment, |
- const AttachmentStore::Result& result) { |
- switch (result) { |
- case AttachmentStore::SUCCESS: |
- state->AddAttachment(attachment); |
- break; |
- case AttachmentStore::UNSPECIFIED_ERROR: |
- case AttachmentStore::STORE_INITIALIZATION_FAILED: |
- state->AddUnavailableAttachmentId(attachment.GetId()); |
- break; |
- } |
-} |
- |
-void AttachmentServiceImpl::UploadDone( |
- const AttachmentUploader::UploadResult& result, |
- const AttachmentId& attachment_id) { |
- DCHECK(CalledOnValidThread()); |
- AttachmentIdList ids; |
- ids.push_back(attachment_id); |
- switch (result) { |
- case AttachmentUploader::UPLOAD_SUCCESS: |
- attachment_store_->DropSyncReference(ids); |
- upload_task_queue_->MarkAsSucceeded(attachment_id); |
- if (delegate_) { |
- delegate_->OnAttachmentUploaded(attachment_id); |
- } |
- break; |
- case AttachmentUploader::UPLOAD_TRANSIENT_ERROR: |
- upload_task_queue_->MarkAsFailed(attachment_id); |
- upload_task_queue_->AddToQueue(attachment_id); |
- break; |
- case AttachmentUploader::UPLOAD_UNSPECIFIED_ERROR: |
- // TODO(pavely): crbug/372622: Deal with UploadAttachment failures. |
- attachment_store_->DropSyncReference(ids); |
- upload_task_queue_->MarkAsFailed(attachment_id); |
- break; |
- } |
-} |
- |
-void AttachmentServiceImpl::DownloadDone( |
- const scoped_refptr<GetOrDownloadState>& state, |
- const AttachmentId& attachment_id, |
- const AttachmentDownloader::DownloadResult& result, |
- std::unique_ptr<Attachment> attachment) { |
- switch (result) { |
- case AttachmentDownloader::DOWNLOAD_SUCCESS: { |
- AttachmentList attachment_list; |
- attachment_list.push_back(*attachment.get()); |
- attachment_store_->Write( |
- attachment_list, |
- base::Bind(&AttachmentServiceImpl::WriteDone, |
- weak_ptr_factory_.GetWeakPtr(), state, *attachment.get())); |
- break; |
- } |
- case AttachmentDownloader::DOWNLOAD_TRANSIENT_ERROR: |
- case AttachmentDownloader::DOWNLOAD_UNSPECIFIED_ERROR: |
- state->AddUnavailableAttachmentId(attachment_id); |
- break; |
- } |
-} |
- |
-void AttachmentServiceImpl::BeginUpload(const AttachmentId& attachment_id) { |
- DCHECK(CalledOnValidThread()); |
- AttachmentIdList attachment_ids; |
- attachment_ids.push_back(attachment_id); |
- attachment_store_->Read(attachment_ids, |
- base::Bind(&AttachmentServiceImpl::ReadDoneNowUpload, |
- weak_ptr_factory_.GetWeakPtr())); |
-} |
- |
-void AttachmentServiceImpl::UploadAttachments( |
- const AttachmentIdList& attachment_ids) { |
- DCHECK(CalledOnValidThread()); |
- if (!attachment_uploader_.get()) { |
- return; |
- } |
- attachment_store_->SetSyncReference(attachment_ids); |
- |
- for (auto iter = attachment_ids.begin(); iter != attachment_ids.end(); |
- ++iter) { |
- upload_task_queue_->AddToQueue(*iter); |
- } |
-} |
- |
-void AttachmentServiceImpl::OnNetworkChanged( |
- net::NetworkChangeNotifier::ConnectionType type) { |
- if (type != net::NetworkChangeNotifier::CONNECTION_NONE) { |
- upload_task_queue_->ResetBackoff(); |
- } |
-} |
- |
-void AttachmentServiceImpl::ReadDoneNowUpload( |
- const AttachmentStore::Result& result, |
- std::unique_ptr<AttachmentMap> attachments, |
- std::unique_ptr<AttachmentIdList> unavailable_attachment_ids) { |
- DCHECK(CalledOnValidThread()); |
- if (!unavailable_attachment_ids->empty()) { |
- // TODO(maniscalco): We failed to read some attachments. What should we do |
- // now? |
- AttachmentIdList::const_iterator iter = unavailable_attachment_ids->begin(); |
- AttachmentIdList::const_iterator end = unavailable_attachment_ids->end(); |
- for (; iter != end; ++iter) { |
- upload_task_queue_->Cancel(*iter); |
- } |
- attachment_store_->DropSyncReference(*unavailable_attachment_ids); |
- } |
- |
- AttachmentMap::const_iterator iter = attachments->begin(); |
- AttachmentMap::const_iterator end = attachments->end(); |
- for (; iter != end; ++iter) { |
- attachment_uploader_->UploadAttachment( |
- iter->second, |
- base::Bind(&AttachmentServiceImpl::UploadDone, |
- weak_ptr_factory_.GetWeakPtr())); |
- } |
-} |
- |
-void AttachmentServiceImpl::SetTimerForTest( |
- std::unique_ptr<base::Timer> timer) { |
- upload_task_queue_->SetTimerForTest(std::move(timer)); |
-} |
- |
-} // namespace syncer |