diff options
Diffstat (limited to 'chrome/browser/sync/glue/model_associator.h')
-rw-r--r-- | chrome/browser/sync/glue/model_associator.h | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/chrome/browser/sync/glue/model_associator.h b/chrome/browser/sync/glue/model_associator.h new file mode 100644 index 0000000..9d5f825 --- /dev/null +++ b/chrome/browser/sync/glue/model_associator.h @@ -0,0 +1,141 @@ +// Copyright (c) 2006-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 file. + +#ifdef CHROME_PERSONALIZATION + +#ifndef CHROME_BROWSER_SYNC_GLUE_MODEL_ASSOCATOR_H_ +#define CHROME_BROWSER_SYNC_GLUE_MODEL_ASSOCATOR_H_ + +#include <map> +#include <set> +#include <string> + +#include "base/basictypes.h" +#include "base/ref_counted.h" +#include "base/scoped_ptr.h" +#include "base/string16.h" + +class BookmarkNode; + +namespace sync_api { +class BaseNode; +class BaseTransaction; +class ReadNode; +} + +class ProfileSyncService; + +namespace browser_sync { + +// Contains all model assocation related logic: +// * Algorithm to associate bookmark model and sync model. +// * Methods to get a bookmark node for a given sync node and vice versa. +// * Persisting model assocations and loading them back. +class ModelAssociator + : public base::RefCountedThreadSafe<ModelAssociator> { + public: + explicit ModelAssociator(ProfileSyncService* sync_service); + virtual ~ModelAssociator() { } + + // Clears all assocations. + void ClearAll(); + + // Returns sync id for the given bookmark node id. + // Returns sync_api::kInvalidId if the sync node is not found for the given + // bookmark node id. + int64 GetSyncIdFromBookmarkId(int64 node_id) const; + + // Stores bookmark node id for the given sync id in bookmark_id. Returns true + // if the bookmark id was successfully found; false otherwise. + bool GetBookmarkIdFromSyncId(int64 sync_id, int64* bookmark_id) const; + + // Initializes the given sync node from the given bookmark node id. + // Returns false if no sync node was found for the given bookmark node id or + // if the initialization of sync node fails. + bool InitSyncNodeFromBookmarkId(int64 node_id, sync_api::BaseNode* sync_node); + + // Returns the bookmark node for the given sync id. + // Returns NULL if no bookmark node is found for the given sync id. + const BookmarkNode* GetBookmarkNodeFromSyncId(int64 sync_id); + + // Associates the given bookmark node id with the given sync id. + void AssociateIds(int64 node_id, int64 sync_id); + // Disassociate the ids that correspond to the given sync id. + void DisassociateIds(int64 sync_id); + + // Returns whether the bookmark model has user created nodes or not. That is, + // whether there are nodes in the bookmark model except the bookmark bar and + // other bookmarks. + bool BookmarkModelHasUserCreatedNodes() const; + + // Returns whether the sync model has nodes other than the permanent tagged + // nodes. + bool SyncModelHasUserCreatedNodes(); + + // AssociateModels iterates through both the sync and the browser + // bookmark model, looking for matched pairs of items. For any pairs it + // finds, it will call AssociateSyncID. For any unmatched items, + // MergeAndAssociateModels will try to repair the match, e.g. by adding a new + // node. After successful completion, the models should be identical and + // corresponding. Returns true on success. On failure of this step, we + // should abort the sync operation and report an error to the user. + bool AssociateModels(); + + protected: + // Stores the id of the node with the given tag in |sync_id|. + // Returns of that node was found successfully. + // Tests override this. + virtual bool GetSyncIdForTaggedNode(const string16& tag, int64* sync_id); + + // Returns sync service instance. + ProfileSyncService* sync_service() { return sync_service_; } + + private: + typedef std::map<int64, int64> BookmarkIdToSyncIdMap; + typedef std::map<int64, int64> SyncIdToBookmarkIdMap; + typedef std::set<int64> DirtyAssocationsSyncIds; + + // Posts a task to persist dirty assocations. + void PostPersistAssociationsTask(); + // Persists all dirty assocations. + void PersistAssociations(); + + // Loads the persisted assocations into in-memory maps. + // If the persisted associations are out-of-date due to some reason, returns + // false; otehrwise returns true. + bool LoadAssociations(); + + // Matches up the bookmark model and the sync model to build model + // assocations. + bool BuildAssocations(); + + // Associate a top-level node of the bookmark model with a permanent node in + // the sync domain. Such permanent nodes are identified by a tag that is + // well known to the server and the client, and is unique within a particular + // user's share. For example, "other_bookmarks" is the tag for the Other + // Bookmarks folder. The sync nodes are server-created. + bool AssociateTaggedPermanentNode(const BookmarkNode* permanent_node, + const string16& tag); + + // Compare the properties of a pair of nodes from either domain. + bool NodesMatch(const BookmarkNode* bookmark, + const sync_api::BaseNode* sync_node) const; + + ProfileSyncService* sync_service_; + BookmarkIdToSyncIdMap id_map_; + SyncIdToBookmarkIdMap id_map_inverse_; + // Stores sync ids for dirty associations. + DirtyAssocationsSyncIds dirty_assocations_sync_ids_; + + // Indicates whether there is already a pending task to persist dirty model + // associations. + bool task_pending_; + + DISALLOW_COPY_AND_ASSIGN(ModelAssociator); +}; + +} // namespace browser_sync + +#endif // CHROME_BROWSER_SYNC_GLUE_MODEL_ASSOCATOR_H_ +#endif // CHROME_PERSONALIZATION
\ No newline at end of file |