summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync/glue/model_associator.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/sync/glue/model_associator.h')
-rw-r--r--chrome/browser/sync/glue/model_associator.h141
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