| Index: chrome/browser/sync/profile_sync_service.h
|
| ===================================================================
|
| --- chrome/browser/sync/profile_sync_service.h (revision 0)
|
| +++ chrome/browser/sync/profile_sync_service.h (revision 0)
|
| @@ -0,0 +1,368 @@
|
| +// Copyright (c) 2006-2008 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.
|
| +
|
| +#ifdef CHROME_PERSONALIZATION
|
| +
|
| +#ifndef CHROME_BROWSER_SYNC_PROFILE_SYNC_SERVICE_H_
|
| +#define CHROME_BROWSER_SYNC_PROFILE_SYNC_SERVICE_H_
|
| +
|
| +#include <string>
|
| +#include <map>
|
| +#include <vector>
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/file_path.h"
|
| +#include "base/observer_list.h"
|
| +#include "base/scoped_ptr.h"
|
| +#include "chrome/browser/bookmarks/bookmark_model.h"
|
| +#include "chrome/browser/profile.h"
|
| +#include "chrome/browser/sync/glue/model_associator.h"
|
| +#include "chrome/browser/sync/glue/sync_backend_host.h"
|
| +#include "chrome/browser/views/sync/sync_setup_wizard.h"
|
| +#include "googleurl/src/gurl.h"
|
| +
|
| +class CommandLine;
|
| +class MessageLoop;
|
| +class Profile;
|
| +
|
| +namespace browser_sync {
|
| +class ModelAssociator;
|
| +}
|
| +
|
| +// Various UI components such as the New Tab page can be driven by observing
|
| +// the ProfileSyncService through this interface.
|
| +class ProfileSyncServiceObserver {
|
| + public:
|
| + // When one of the following events occurs, OnStateChanged() is called.
|
| + // Observers should query the service to determine what happened.
|
| + // - We initialized successfully.
|
| + // - There was an authentication error and the user needs to reauthenticate.
|
| + // - The sync servers are unavailable at this time.
|
| + // - Credentials are now in flight for authentication.
|
| + virtual void OnStateChanged() = 0;
|
| + protected:
|
| + virtual ~ProfileSyncServiceObserver() { }
|
| +};
|
| +
|
| +// ProfileSyncService is the layer between browser subsystems like bookmarks,
|
| +// and the sync backend.
|
| +class ProfileSyncService : public BookmarkModelObserver,
|
| + public browser_sync::SyncFrontend {
|
| + public:
|
| + typedef ProfileSyncServiceObserver Observer;
|
| + typedef browser_sync::SyncBackendHost::Status Status;
|
| +
|
| + explicit ProfileSyncService(Profile* profile);
|
| + virtual ~ProfileSyncService();
|
| +
|
| + // Initializes the object. This should be called every time an object of this
|
| + // class is constructed.
|
| + void Initialize();
|
| +
|
| + // Enables/disables sync for user.
|
| + virtual void EnableForUser();
|
| + virtual void DisableForUser();
|
| +
|
| + // Whether sync is enabled by user or not.
|
| + bool IsSyncEnabledByUser() const;
|
| +
|
| + // BookmarkModelObserver implementation.
|
| + virtual void Loaded(BookmarkModel* model);
|
| + virtual void BookmarkModelBeingDeleted(BookmarkModel* model) {}
|
| + virtual void BookmarkNodeMoved(BookmarkModel* model,
|
| + const BookmarkNode* old_parent,
|
| + int old_index,
|
| + const BookmarkNode* new_parent,
|
| + int new_index);
|
| + virtual void BookmarkNodeAdded(BookmarkModel* model,
|
| + const BookmarkNode* parent,
|
| + int index);
|
| + virtual void BookmarkNodeRemoved(BookmarkModel* model,
|
| + const BookmarkNode* parent,
|
| + int index,
|
| + const BookmarkNode* node);
|
| + virtual void BookmarkNodeChanged(BookmarkModel* model,
|
| + const BookmarkNode* node);
|
| + virtual void BookmarkNodeFavIconLoaded(BookmarkModel* model,
|
| + const BookmarkNode* node);
|
| + virtual void BookmarkNodeChildrenReordered(BookmarkModel* model,
|
| + const BookmarkNode* node);
|
| +
|
| + // SyncFrontend implementation.
|
| + virtual void OnBackendInitialized();
|
| + virtual void OnSyncCycleCompleted();
|
| + virtual void OnAuthError();
|
| + virtual void ApplyModelChanges(
|
| + const sync_api::BaseTransaction* trans,
|
| + const sync_api::SyncManager::ChangeRecord* changes,
|
| + int change_count);
|
| +
|
| + // Called when a user enters credentials through UI.
|
| + virtual void OnUserSubmittedAuth(const std::string& username,
|
| + const std::string& password);
|
| +
|
| + // Called when a user decides whether to merge and sync or abort.
|
| + virtual void OnUserAcceptedMergeAndSync();
|
| +
|
| + // Called when a user cancels any setup dialog (login, merge and sync, etc).
|
| + virtual void OnUserCancelledDialog();
|
| +
|
| + // Get various information for displaying in the user interface.
|
| + browser_sync::SyncBackendHost::StatusSummary QuerySyncStatusSummary();
|
| + browser_sync::SyncBackendHost::Status QueryDetailedSyncStatus();
|
| +
|
| + AuthErrorState GetAuthErrorState() const {
|
| + return last_auth_error_;
|
| + }
|
| +
|
| + // Displays a dialog for the user to enter GAIA credentials and attempt
|
| + // re-authentication, and returns true if it actually opened the dialog.
|
| + // Returns false if a dialog is already showing, an auth attempt is in
|
| + // progress, the sync system is already authenticated, or some error
|
| + // occurred preventing the action. We make it the duty of ProfileSyncService
|
| + // to open the dialog to easily ensure only one is ever showing.
|
| + bool SetupInProgress() const {
|
| + return !IsSyncEnabledByUser() && WizardIsVisible();
|
| + }
|
| + bool WizardIsVisible() const { return wizard_.IsVisible(); }
|
| + void ShowLoginDialog();
|
| +
|
| + // Pretty-printed strings for a given StatusSummary.
|
| + static std::wstring BuildSyncStatusSummaryText(
|
| + const browser_sync::SyncBackendHost::StatusSummary& summary);
|
| +
|
| + // Returns true if the SyncBackendHost has told us it's ready to accept
|
| + // changes.
|
| + // TODO(timsteele): What happens if the bookmark model is loaded, a change
|
| + // takes place, and the backend isn't initialized yet?
|
| + bool sync_initialized() const { return backend_initialized_; }
|
| +
|
| + bool UIShouldDepictAuthInProgress() const {
|
| + return is_auth_in_progress_;
|
| + }
|
| +
|
| + // A timestamp marking the last time the service observed a transition from
|
| + // the SYNCING state to the READY state. Note that this does not reflect the
|
| + // last time we polled the server to see if there were any changes; the
|
| + // timestamp is only snapped when syncing takes place and we download or
|
| + // upload some bookmark entity.
|
| + const base::Time& last_synced_time() const { return last_synced_time_; }
|
| +
|
| + // Returns a user-friendly string form of last synced time (in minutes).
|
| + std::wstring GetLastSyncedTimeString() const;
|
| +
|
| + // Returns the authenticated username of the sync user, or empty if none
|
| + // exists. It will only exist if the authentication service provider (e.g
|
| + // GAIA) has confirmed the username is authentic.
|
| + virtual string16 GetAuthenticatedUsername() const;
|
| +
|
| + const std::string& last_attempted_user_email() const {
|
| + return last_attempted_user_email_;
|
| + }
|
| +
|
| + // The profile we are syncing for.
|
| + Profile* profile() { return profile_; }
|
| +
|
| + // Adds/removes an observer. ProfileSyncService does not take ownership of
|
| + // the observer.
|
| + void AddObserver(Observer* observer);
|
| + void RemoveObserver(Observer* observer);
|
| +
|
| + protected:
|
| + // Call this after any of the subsystems being synced (the bookmark
|
| + // model and the sync backend) finishes its initialization. When everything
|
| + // is ready, this function will bootstrap the subsystems so that they are
|
| + // initially in sync, and start forwarding changes between the two models.
|
| + void StartProcessingChangesIfReady();
|
| +
|
| + // Various member accessors needed by unit tests.
|
| + browser_sync::SyncBackendHost* backend() { return backend_.get(); }
|
| +
|
| + // Call this when normal operation detects that the bookmark model and the
|
| + // syncer model are inconsistent, or similar. The ProfileSyncService will
|
| + // try to avoid doing any work to avoid crashing or corrupting things
|
| + // further, and will report an error status if queried.
|
| + void SetUnrecoverableError();
|
| +
|
| + // Returns whether processing changes is allowed. Check this before doing
|
| + // any model-modifying operations.
|
| + bool ShouldPushChanges();
|
| +
|
| + // Starts up the backend sync components.
|
| + void StartUp();
|
| + // Shuts down the backend sync components.
|
| + // |sync_disabled| indicates if syncing is being disabled or not.
|
| + void Shutdown(bool sync_disabled);
|
| +
|
| + // Tests need to override this.
|
| + virtual void InitializeBackend();
|
| +
|
| + // Tests need this.
|
| + void set_model_associator(browser_sync::ModelAssociator* manager) {
|
| + model_associator_ = manager;
|
| + }
|
| +
|
| + // We keep track of the last auth error observed so we can cover up the first
|
| + // "expected" auth failure from observers.
|
| + // TODO(timsteele): Same as expecting_first_run_auth_needed_event_. Remove
|
| + // this!
|
| + AuthErrorState last_auth_error_;
|
| +
|
| + // Cache of the last name the client attempted to authenticate.
|
| + std::string last_attempted_user_email_;
|
| +
|
| + private:
|
| + friend class browser_sync::ModelAssociator;
|
| + friend class ProfileSyncServiceTest;
|
| + friend class ProfileSyncServiceTestHarness;
|
| + friend class TestModelAssociator;
|
| + FRIEND_TEST(ProfileSyncServiceTest, UnrecoverableErrorSuspendsService);
|
| +
|
| + enum MoveOrCreate {
|
| + MOVE,
|
| + CREATE,
|
| + };
|
| +
|
| + // Initializes the various settings from the command line.
|
| + void InitSettings();
|
| +
|
| + // Methods to register, load and remove preferences.
|
| + void RegisterPreferences();
|
| + void LoadPreferences();
|
| + void ClearPreferences();
|
| +
|
| + // Treat the |index|th child of |parent| as a newly added node, and create a
|
| + // corresponding node in the sync domain using |trans|. All properties
|
| + // will be transferred to the new node. A node corresponding to |parent|
|
| + // must already exist and be associated for this call to succeed. Returns
|
| + // the ID of the just-created node, or if creation fails, kInvalidID.
|
| + int64 CreateSyncNode(const BookmarkNode* parent,
|
| + int index,
|
| + sync_api::WriteTransaction* trans);
|
| +
|
| + // Create a bookmark node corresponding to |src| if one is not already
|
| + // associated with |src|. Returns the node that was created or updated.
|
| + const BookmarkNode* CreateOrUpdateBookmarkNode(
|
| + sync_api::BaseNode* src,
|
| + BookmarkModel* model);
|
| +
|
| + // Creates a bookmark node under the given parent node from the given sync
|
| + // node. Returns the newly created node.
|
| + const BookmarkNode* CreateBookmarkNode(
|
| + sync_api::BaseNode* sync_node,
|
| + const BookmarkNode* parent,
|
| + int index) const;
|
| +
|
| + // Sets the favicon of the given bookmark node from the given sync node.
|
| + // Returns whether the favicon was set in the bookmark node.
|
| + bool SetBookmarkFavicon(sync_api::BaseNode* sync_node,
|
| + const BookmarkNode* bookmark_node) const;
|
| +
|
| + // Sets the favicon of the given sync node from the given bookmark node.
|
| + void SetSyncNodeFavicon(const BookmarkNode* bookmark_node,
|
| + sync_api::WriteNode* sync_node) const;
|
| +
|
| + // Helper function to determine the appropriate insertion index of sync node
|
| + // |node| under the Bookmark model node |parent|, to make the positions
|
| + // match up between the two models. This presumes that the predecessor of the
|
| + // item (in the bookmark model) has already been moved into its appropriate
|
| + // position.
|
| + int CalculateBookmarkModelInsertionIndex(
|
| + const BookmarkNode* parent,
|
| + const sync_api::BaseNode* node) const;
|
| +
|
| + // Helper function used to fix the position of a sync node so that it matches
|
| + // the position of a corresponding bookmark model node. |parent| and
|
| + // |index| identify the bookmark model position. |dst| is the node whose
|
| + // position is to be fixed. If |operation| is CREATE, treat |dst| as an
|
| + // uncreated node and set its position via InitByCreation(); otherwise,
|
| + // |dst| is treated as an existing node, and its position will be set via
|
| + // SetPosition(). |trans| is the transaction to which |dst| belongs. Returns
|
| + // false on failure.
|
| + bool PlaceSyncNode(MoveOrCreate operation,
|
| + const BookmarkNode* parent,
|
| + int index,
|
| + sync_api::WriteTransaction* trans,
|
| + sync_api::WriteNode* dst);
|
| +
|
| + // Copy properties (but not position) from |src| to |dst|.
|
| + void UpdateSyncNodeProperties(const BookmarkNode* src,
|
| + sync_api::WriteNode* dst);
|
| +
|
| + // Helper function to encode a bookmark's favicon into a PNG byte vector.
|
| + void EncodeFavicon(const BookmarkNode* src,
|
| + std::vector<unsigned char>* dst) const;
|
| +
|
| + // Remove the sync node corresponding to |node|. It shouldn't have
|
| + // any children.
|
| + void RemoveOneSyncNode(sync_api::WriteTransaction* trans,
|
| + const BookmarkNode* node);
|
| +
|
| + // Remove all the sync nodes associated with |node| and its children.
|
| + void RemoveSyncNodeHierarchy(const BookmarkNode* node);
|
| +
|
| + // Whether the sync merge warning should be shown.
|
| + bool MergeAndSyncAcceptanceNeeded() const;
|
| +
|
| + // Sets the last synced time to the current time.
|
| + void UpdateLastSyncedTime();
|
| +
|
| + // The profile whose data we are synchronizing.
|
| + Profile* profile_;
|
| +
|
| + // TODO(ncarter): Put this in a profile, once there is UI for it.
|
| + // This specifies where to find the sync server.
|
| + GURL sync_service_url_;
|
| +
|
| + // Model assocation manager instance.
|
| + scoped_refptr<browser_sync::ModelAssociator> model_associator_;
|
| +
|
| + // The last time we detected a successful transition from SYNCING state.
|
| + // Our backend notifies us whenever we should take a new snapshot.
|
| + base::Time last_synced_time_;
|
| +
|
| + // Our asynchronous backend to communicate with sync components living on
|
| + // other threads.
|
| + scoped_ptr<browser_sync::SyncBackendHost> backend_;
|
| +
|
| + // Whether the SyncBackendHost has been initialized.
|
| + bool backend_initialized_;
|
| +
|
| + // Set to true when the user first enables sync, and we are waiting for
|
| + // syncapi to give us the green light on providing credentials for the first
|
| + // time. It is set back to false as soon as we get this message, and is
|
| + // false all other times so we don't have to persist this value as it will
|
| + // get initialized to false.
|
| + // TODO(timsteele): Remove this by way of starting the wizard when enabling
|
| + // sync *before* initializing the backend. syncapi will need to change, but
|
| + // it means we don't have to wait for the first AuthError; if we ever get
|
| + // one, it is actually an error and this bool isn't needed.
|
| + bool expecting_first_run_auth_needed_event_;
|
| +
|
| + // Various pieces of UI query this value to determine if they should show
|
| + // an "Authenticating.." type of message. We are the only central place
|
| + // all auth attempts funnel through, so it makes sense to provide this.
|
| + // As its name suggests, this should NOT be used for anything other than UI.
|
| + bool is_auth_in_progress_;
|
| +
|
| + // True only after all bootstrapping has succeeded: the bookmark model is
|
| + // loaded, the sync backend is initialized, and the two domains are
|
| + // consistent with one another.
|
| + bool ready_to_process_changes_;
|
| +
|
| + // True if an unrecoverable error (e.g. violation of an assumed invariant)
|
| + // occurred during syncer operation. This value should be checked before
|
| + // doing any work that might corrupt things further.
|
| + bool unrecoverable_error_detected_;
|
| +
|
| + SyncSetupWizard wizard_;
|
| +
|
| + ObserverList<Observer> observers_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ProfileSyncService);
|
| +};
|
| +
|
| +#endif // CHROME_BROWSER_SYNC_PROFILE_SYNC_SERVICE_H_
|
| +
|
| +#endif // CHROME_PERSONALIZATION
|
|
|
| Property changes on: chrome\browser\sync\profile_sync_service.h
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|