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