Index: chrome/browser/sync/engine/syncer.h |
=================================================================== |
--- chrome/browser/sync/engine/syncer.h (revision 0) |
+++ chrome/browser/sync/engine/syncer.h (revision 0) |
@@ -0,0 +1,234 @@ |
+// Copyright (c) 2009 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 entry. |
+ |
+#ifndef CHROME_BROWSER_SYNC_ENGINE_SYNCER_H_ |
+#define CHROME_BROWSER_SYNC_ENGINE_SYNCER_H_ |
+ |
+#include <string> |
+#include <utility> |
+#include <vector> |
+ |
+#include "base/basictypes.h" |
+#include "base/scoped_ptr.h" |
+#include "chrome/browser/sync/engine/client_command_channel.h" |
+#include "chrome/browser/sync/engine/conflict_resolver.h" |
+#include "chrome/browser/sync/engine/syncer_types.h" |
+#include "chrome/browser/sync/engine/syncproto.h" |
+#include "chrome/browser/sync/syncable/directory_event.h" |
+#include "chrome/browser/sync/util/event_sys-inl.h" |
+#include "chrome/browser/sync/util/event_sys.h" |
+#include "chrome/browser/sync/util/pthread_helpers.h" |
+#include "testing/gtest/include/gtest/gtest_prod.h" // For FRIEND_TEST |
+ |
+namespace syncable { |
+class Directory; |
+class DirectoryManager; |
+class Entry; |
+class Id; |
+class MutableEntry; |
+class WriteTransaction; |
+} // namespace syncable |
+ |
+namespace browser_sync { |
+ |
+class ModelSafeWorker; |
+class ServerConnectionManager; |
+class SyncProcessState; |
+class SyncerSession; |
+class URLFactory; |
+struct HttpResponse; |
+ |
+static const int kDefaultMaxCommitBatchSize = 25; |
+ |
+enum SyncerStep { |
+ SYNCER_BEGIN, |
+ DOWNLOAD_UPDATES, |
+ PROCESS_CLIENT_COMMAND, |
+ VERIFY_UPDATES, |
+ PROCESS_UPDATES, |
+ APPLY_UPDATES, |
+ BUILD_COMMIT_REQUEST, |
+ POST_COMMIT_MESSAGE, |
+ PROCESS_COMMIT_RESPONSE, |
+ BUILD_AND_PROCESS_CONFLICT_SETS, |
+ RESOLVE_CONFLICTS, |
+ APPLY_UPDATES_TO_RESOLVE_CONFLICTS, |
+ SYNCER_END |
+}; |
+ |
+// A Syncer provides a control interface for driving the individual steps |
+// of the sync cycle. Each cycle (hopefully) moves the client into closer |
+// synchronization with the server. The individual steps are modeled |
+// as SyncerCommands, and the ordering of the steps is expressed using |
+// the SyncerStep enum. |
+// |
+// A Syncer instance expects to run on a dedicated thread. Calls |
+// to SyncShare() may take an unbounded amount of time, as SyncerCommands |
+// may block on network i/o, on lock contention, or on tasks posted to |
+// other threads. |
+class Syncer { |
+ public: |
+ typedef std::vector<int64> UnsyncedMetaHandles; |
+ typedef void (*TestCallbackFunction)(syncable::Directory* dir); |
+ |
+ // The constructor may be called from a thread that is not the Syncer's |
+ // dedicated thread, to allow some flexibility in the setup. |
+ Syncer( |
+ syncable::DirectoryManager* dirman, |
+ const PathString &account_name, |
+ ServerConnectionManager* connection_manager, |
+ ModelSafeWorker* model_safe_worker); |
+ |
+ ~Syncer(); |
+ |
+ // Called by other threads to tell the syncer to stop what it's doing |
+ // and return early from SyncShare, if possible. |
+ bool ExitRequested() { return early_exit_requested_; } |
+ void RequestEarlyExit() { early_exit_requested_ = true; } |
+ |
+ // SyncShare(...) variants cause one sync cycle to occur. The return value |
+ // indicates whether we should sync again. |
+ // The zero-argument version of SyncShare is provided for unit tests. |
+ // When |sync_process_state| is provided, it is used as the syncer state |
+ // for the sync cycle. It is treated as an input/output parameter. |
+ // When |first_step| and |last_step| are provided, this means to perform |
+ // a partial sync cycle, stopping after |last_step| is performed. |
+ bool SyncShare(); |
+ bool SyncShare(SyncProcessState *sync_process_state); |
+ bool SyncShare(SyncerStep first_step, SyncerStep last_step); |
+ |
+ // Limit the batch size of commit operations to a specified number of items. |
+ void set_max_commit_batch_size(int x) { max_commit_batch_size_ = x; } |
+ |
+ ConflictResolver* conflict_resolver() { return &resolver_; } |
+ |
+ PathString account_name() { return account_name_; } |
+ |
+ SyncerEventChannel* channel() const { return syncer_event_channel_.get(); } |
+ |
+ ShutdownChannel* shutdown_channel() const { return shutdown_channel_.get(); } |
+ |
+ ModelSafeWorker* model_safe_worker() { return model_safe_worker_; } |
+ |
+ // Syncer will take ownership of this channel and it will be destroyed along |
+ // with the Syncer instance. |
+ void set_shutdown_channel(ShutdownChannel* channel) { |
+ shutdown_channel_.reset(channel); |
+ } |
+ |
+ void set_command_channel(ClientCommandChannel* channel) { |
+ command_channel_ = channel; |
+ } |
+ |
+ // Volatile reader for the source member of the syncer session object. The |
+ // value is set to the SYNC_CYCLE_CONTINUATION value to signal that it has |
+ // been read. |
+ sync_pb::GetUpdatesCallerInfo::GET_UPDATES_SOURCE TestAndSetUpdatesSource() { |
+ sync_pb::GetUpdatesCallerInfo::GET_UPDATES_SOURCE old_source = |
+ updates_source_; |
+ set_updates_source(sync_pb::GetUpdatesCallerInfo::SYNC_CYCLE_CONTINUATION); |
+ return old_source; |
+ } |
+ |
+ void set_updates_source( |
+ sync_pb::GetUpdatesCallerInfo::GET_UPDATES_SOURCE source) { |
+ updates_source_ = source; |
+ } |
+ |
+ bool notifications_enabled() const { |
+ return notifications_enabled_; |
+ } |
+ |
+ void set_notifications_enabled(bool state) { |
+ notifications_enabled_ = state; |
+ } |
+ |
+ private: |
+ void RequestNudge(int milliseconds); |
+ |
+ // Implements the PROCESS_CLIENT_COMMAND syncer step. |
+ void ProcessClientCommand(SyncerSession *session); |
+ |
+ void SyncShare(SyncerSession* session); |
+ void SyncShare(SyncerSession* session, |
+ SyncerStep first_step, |
+ SyncerStep last_step); |
+ |
+ PathString account_name_; |
+ bool early_exit_requested_; |
+ |
+ int32 max_commit_batch_size_; |
+ |
+ ServerConnectionManager* connection_manager_; |
+ |
+ ConflictResolver resolver_; |
+ syncable::DirectoryManager* const dirman_; |
+ |
+ // When we're over bandwidth quota, we don't update until past this time. |
+ time_t silenced_until_; |
+ |
+ scoped_ptr<SyncerEventChannel> syncer_event_channel_; |
+ scoped_ptr<ShutdownChannel> shutdown_channel_; |
+ ClientCommandChannel* command_channel_; |
+ |
+ // A worker capable of processing work closures on a thread that is |
+ // guaranteed to be safe for model modifications. This is created and owned |
+ // by the SyncerThread that created us. |
+ ModelSafeWorker* model_safe_worker_; |
+ |
+ // The source of the last nudge. |
+ sync_pb::GetUpdatesCallerInfo::GET_UPDATES_SOURCE updates_source_; |
+ |
+ // True only if the notification channel is authorized and open. |
+ bool notifications_enabled_; |
+ |
+ // A callback hook used in unittests to simulate changes between conflict set |
+ // building and conflict resolution. |
+ TestCallbackFunction pre_conflict_resolution_function_; |
+ |
+ FRIEND_TEST(SyncerTest, NewServerItemInAFolderHierarchyWeHaveDeleted3); |
+ FRIEND_TEST(SyncerTest, TestCommitListOrderingAndNewParent); |
+ FRIEND_TEST(SyncerTest, TestCommitListOrderingAndNewParentAndChild); |
+ FRIEND_TEST(SyncerTest, TestCommitListOrderingCounterexample); |
+ FRIEND_TEST(SyncerTest, TestCommitListOrderingWithNesting); |
+ FRIEND_TEST(SyncerTest, TestCommitListOrderingWithNewItems); |
+ FRIEND_TEST(SyncerTest, TestGetUnsyncedAndSimpleCommit); |
+ |
+ DISALLOW_COPY_AND_ASSIGN(Syncer); |
+}; |
+ |
+// Inline utility functions. |
+ |
+// Given iterator ranges from two collections sorted according to a |
+// common strict weak ordering, return true if the two ranges contain |
+// any common items, and false if they do not. |
+// This function is in this header so that it can be tested. |
+template <class Iterator1, class Iterator2> |
+bool SortedCollectionsIntersect(Iterator1 begin1, Iterator1 end1, |
+ Iterator2 begin2, Iterator2 end2) { |
+ Iterator1 i1 = begin1; |
+ Iterator2 i2 = begin2; |
+ while (i1 != end1 && i2 != end2) { |
+ if (*i1 == *i2) |
+ return true; |
+ if (*i1 > *i2) |
+ ++i2; |
+ else |
+ ++i1; |
+ } |
+ return false; |
+} |
+// Utility function declarations. |
+void SplitServerInformationIntoNewEntry(syncable::WriteTransaction* trans, |
+ syncable::MutableEntry* entry); |
+void CopyServerFields(syncable::Entry* src, syncable::MutableEntry* dest); |
+void ClearServerData(syncable::MutableEntry* entry); |
+ |
+// Get update contents as a string. Intended for logging, and intended |
+// to have a smaller footprint than the protobuf's built-in pretty printer. |
+std::string SyncEntityDebugString(const sync_pb::SyncEntity& entry); |
+ |
+} // namespace browser_sync |
+ |
+#endif // CHROME_BROWSER_SYNC_ENGINE_SYNCER_H_ |
Property changes on: chrome\browser\sync\engine\syncer.h |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |