1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_SYNC_GLUE_TYPED_URL_MODEL_ASSOCIATOR_H_ 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_SYNC_GLUE_TYPED_URL_MODEL_ASSOCIATOR_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <map> 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector> 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string16.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/task.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history_types.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/glue/model_associator.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/protocol/typed_url_specifics.pb.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GURL; 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MessageLoop; 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ProfileSyncService; 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace history { 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HistoryBackend; 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass URLRow; 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace sync_api { 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WriteNode; 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WriteTransaction; 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser_sync { 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TypedUrlChangeProcessor; 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass UnrecoverableErrorHandler; 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochextern const char kTypedUrlTag[]; 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Contains all model association related logic: 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * Algorithm to associate typed_url model and sync model. 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * Persisting model associations and loading them back. 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// We do not check if we have local data before this run; we always 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// merge and sync. 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TypedUrlModelAssociator 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : public PerDataTypeAssociatorInterface<std::string, std::string> { 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef std::vector<std::pair<GURL, string16> > TypedUrlTitleVector; 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef std::vector<history::URLRow> TypedUrlVector; 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef std::vector<std::pair<history::URLID, history::URLRow> > 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TypedUrlUpdateVector; 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef std::vector<std::pair<GURL, std::vector<base::Time> > > 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TypedUrlVisitVector; 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static syncable::ModelType model_type() { return syncable::TYPED_URLS; } 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TypedUrlModelAssociator(ProfileSyncService* sync_service, 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch history::HistoryBackend* history_backend); 59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual ~TypedUrlModelAssociator(); 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // PerDataTypeAssociatorInterface implementation. 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Iterates through the sync model looking for matched pairs of items. 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool AssociateModels(); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Delete all typed url nodes. 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool DeleteAllNodes(sync_api::WriteTransaction* trans); 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Clears all associations. 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool DisassociateModels(); 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The has_nodes out param is true if the sync model has nodes other 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // than the permanent tagged nodes. 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool SyncModelHasUserCreatedNodes(bool* has_nodes); 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void AbortAssociation(); 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool CryptoReadyIfNecessary(); 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Not implemented. 8121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual const std::string* GetChromeNodeFromSyncId(int64 sync_id); 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Not implemented. 8421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual bool InitSyncNodeFromChromeId(const std::string& node_id, 8521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen sync_api::BaseNode* sync_node); 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the sync id for the given typed_url name, or sync_api::kInvalidId 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // if the typed_url name is not associated to any sync id. 8921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual int64 GetSyncIdFromChromeId(const std::string& node_id); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Associates the given typed_url name with the given sync id. 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Associate(const std::string* node, int64 sync_id); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Remove the association that corresponds to the given sync id. 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Disassociate(int64 sync_id); 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns whether a node with the given permanent tag was found and update 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |sync_id| with that node's id. 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool GetSyncIdForTaggedNode(const std::string& tag, int64* sync_id); 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool WriteToHistoryBackend(const TypedUrlTitleVector* titles, 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const TypedUrlVector* new_urls, 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const TypedUrlUpdateVector* updated_urls, 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const TypedUrlVisitVector* new_visits, 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const history::VisitVector* deleted_visits); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum { 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DIFF_NONE = 0x0000, 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DIFF_NODE_CHANGED = 0x0001, 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DIFF_TITLE_CHANGED = 0x0002, 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DIFF_ROW_CHANGED = 0x0004, 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DIFF_VISITS_ADDED = 0x0008, 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static int MergeUrls(const sync_pb::TypedUrlSpecifics& typed_url, 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const history::URLRow& url, 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch history::VisitVector* visits, 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch history::URLRow* new_url, 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<base::Time>* new_visits); 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void WriteToSyncNode(const history::URLRow& url, 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const history::VisitVector& visits, 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_api::WriteNode* node); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void DiffVisits(const history::VisitVector& old_visits, 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::TypedUrlSpecifics& new_url, 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<base::Time>* new_visits, 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch history::VisitVector* removed_visits); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef std::map<std::string, int64> TypedUrlToSyncIdMap; 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef std::map<int64, std::string> SyncIdToTypedUrlMap; 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProfileSyncService* sync_service_; 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch history::HistoryBackend* history_backend_; 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 typed_url_node_id_; 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop* expected_loop_; 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TypedUrlToSyncIdMap id_map_; 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SyncIdToTypedUrlMap id_map_inverse_; 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(TypedUrlModelAssociator); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace browser_sync 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_SYNC_GLUE_TYPED_URL_MODEL_ASSOCIATOR_H_ 148