Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(557)

Unified Diff: components/sync_driver/non_blocking_data_type_controller.cc

Issue 249843002: Introduce NonBlockingDataTypeController (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix one nit Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698