Index: components/sync_driver/non_blocking_data_type_controller.cc |
diff --git a/components/sync_driver/non_blocking_data_type_controller.cc b/components/sync_driver/non_blocking_data_type_controller.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..92a62ef0337d52031f0919a422a04e9dec25e340 |
--- /dev/null |
+++ b/components/sync_driver/non_blocking_data_type_controller.cc |
@@ -0,0 +1,137 @@ |
+// Copyright (c) 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 "components/sync_driver/non_blocking_data_type_controller.h" |
+ |
+#include "base/bind.h" |
+#include "base/bind_helpers.h" |
+#include "base/location.h" |
+#include "sync/internal_api/public/non_blocking_type_processor.h" |
+ |
+namespace browser_sync { |
+ |
+NonBlockingDataTypeController::NonBlockingDataTypeController( |
+ syncer::ModelType type, bool is_preferred) |
+ : type_(type), |
+ current_state_(DISCONNECTED), |
+ is_preferred_(is_preferred) {} |
+ |
+NonBlockingDataTypeController::~NonBlockingDataTypeController() {} |
+ |
+void NonBlockingDataTypeController::InitializeProcessor( |
+ scoped_refptr<base::SequencedTaskRunner> task_runner, |
+ base::WeakPtr<syncer::NonBlockingTypeProcessor> processor) { |
+ DCHECK(!IsTypeProcessorConnected()); |
+ task_runner_ = task_runner; |
+ processor_ = processor; |
+ DCHECK(IsTypeProcessorConnected()); |
+ |
+ UpdateState(); |
+} |
+ |
+void NonBlockingDataTypeController::InitializeSyncCoreProxy( |
+ scoped_ptr<syncer::SyncCoreProxy> proxy) { |
+ DCHECK(!IsSyncBackendConnected()); |
+ proxy_ = proxy.Pass(); |
+ |
+ UpdateState(); |
+} |
+ |
+void NonBlockingDataTypeController::ClearSyncCoreProxy() { |
+ // Never had a sync core proxy to begin with. No change. |
+ if (!proxy_) |
+ return; |
+ proxy_.reset(); |
+ |
+ UpdateState(); |
+} |
+ |
+void NonBlockingDataTypeController::SetIsPreferred(bool is_preferred) { |
+ is_preferred_ = is_preferred; |
+ |
+ UpdateState(); |
+} |
+ |
+void NonBlockingDataTypeController::UpdateState() { |
+ // Return immediately if no updates are necessary. |
+ if (GetDesiredState() == current_state_) { |
+ return; |
+ } |
+ |
+ // Return immediately if the processor is not ready yet. |
+ if (!IsTypeProcessorConnected()) { |
+ return; |
+ } |
+ |
+ // Send the appropriate state transition request to the processor. |
+ switch (GetDesiredState()) { |
+ case ENABLED: |
+ SendEnableSignal(); |
+ return; |
+ case DISABLED: |
+ SendDisableSignal(); |
+ return; |
+ case DISCONNECTED: |
+ SendDisconnectSignal(); |
+ return; |
+ } |
+ NOTREACHED(); |
+ return; |
+} |
+ |
+void NonBlockingDataTypeController::SendEnableSignal() { |
+ DCHECK_EQ(ENABLED, GetDesiredState()); |
+ DVLOG(1) << "Enabling non-blocking sync type " << ModelTypeToString(type_); |
+ |
+ task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&syncer::NonBlockingTypeProcessor::Enable, |
+ processor_, |
+ base::Owned(proxy_->Clone().release()))); |
+ current_state_ = ENABLED; |
+} |
+ |
+void NonBlockingDataTypeController::SendDisableSignal() { |
+ DCHECK_EQ(DISABLED, GetDesiredState()); |
+ DVLOG(1) << "Disabling non-blocking sync type " << ModelTypeToString(type_); |
+ task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&syncer::NonBlockingTypeProcessor::Disable, processor_)); |
+ current_state_ = DISABLED; |
+} |
+ |
+void NonBlockingDataTypeController::SendDisconnectSignal() { |
+ DCHECK_EQ(DISCONNECTED, GetDesiredState()); |
+ DVLOG(1) << "Disconnecting non-blocking sync type " |
+ << ModelTypeToString(type_); |
+ task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&syncer::NonBlockingTypeProcessor::Disconnect, processor_)); |
+ current_state_ = DISCONNECTED; |
+} |
+ |
+bool NonBlockingDataTypeController::IsPreferred() const { |
+ return is_preferred_; |
+} |
+ |
+bool NonBlockingDataTypeController::IsTypeProcessorConnected() const { |
+ return task_runner_ != NULL; |
+} |
+ |
+bool NonBlockingDataTypeController::IsSyncBackendConnected() const { |
+ return proxy_; |
+} |
+ |
+NonBlockingDataTypeController::TypeProcessorState |
+NonBlockingDataTypeController::GetDesiredState() const { |
+ if (!IsPreferred()) { |
+ return DISABLED; |
+ } else if (!IsSyncBackendConnected() || !IsTypeProcessorConnected()) { |
+ return DISCONNECTED; |
+ } else { |
+ return ENABLED; |
+ } |
+} |
+ |
+} // namespace browser_sync |