• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_SYNC_GLUE_AUTOFILL_MODEL_ASSOCIATOR_H_
6 #define CHROME_BROWSER_SYNC_GLUE_AUTOFILL_MODEL_ASSOCIATOR_H_
7 #pragma once
8 
9 #include <map>
10 #include <set>
11 #include <string>
12 #include <vector>
13 
14 #include "base/basictypes.h"
15 #include "base/memory/ref_counted.h"
16 #include "base/synchronization/lock.h"
17 #include "chrome/browser/autofill/personal_data_manager.h"
18 #include "chrome/browser/sync/engine/syncapi.h"
19 #include "chrome/browser/sync/glue/model_associator.h"
20 #include "chrome/browser/sync/protocol/autofill_specifics.pb.h"
21 #include "chrome/browser/webdata/autofill_entry.h"
22 
23 class AutofillProfile;
24 
25 class ProfileSyncService;
26 class WebDatabase;
27 
28 namespace sync_api {
29 class WriteTransaction;
30 }
31 
32 namespace browser_sync {
33 
34 class AutofillChangeProcessor;
35 class UnrecoverableErrorHandler;
36 
37 extern const char kAutofillTag[];
38 extern const char kAutofillProfileNamespaceTag[];
39 extern const char kAutofillEntryNamespaceTag[];
40 
41 // Contains all model association related logic:
42 // * Algorithm to associate autofill model and sync model.
43 // We do not check if we have local data before this run; we always
44 // merge and sync.
45 class AutofillModelAssociator
46     : public PerDataTypeAssociatorInterface<std::string, std::string> {
47  public:
model_type()48   static syncable::ModelType model_type() { return syncable::AUTOFILL; }
49   AutofillModelAssociator(ProfileSyncService* sync_service,
50                           WebDatabase* web_database,
51                           PersonalDataManager* data_manager);
52   virtual ~AutofillModelAssociator();
53 
54   // PerDataTypeAssociatorInterface implementation.
55   //
56   // Iterates through the sync model looking for matched pairs of items.
57   virtual bool AssociateModels();
58 
59   // Clears all associations.
60   virtual bool DisassociateModels();
61 
62   // The has_nodes out param is true if the sync model has nodes other
63   // than the permanent tagged nodes.
64   virtual bool SyncModelHasUserCreatedNodes(bool* has_nodes);
65 
66   // See ModelAssociator interface.
67   virtual void AbortAssociation();
68 
69   // See ModelAssociator interface.
70   virtual bool CryptoReadyIfNecessary();
71 
72   // Not implemented.
73   virtual const std::string* GetChromeNodeFromSyncId(int64 sync_id);
74 
75   // Not implemented.
76   virtual bool InitSyncNodeFromChromeId(const std::string& node_id,
77                                         sync_api::BaseNode* sync_node);
78 
79   // Returns the sync id for the given autofill name, or sync_api::kInvalidId
80   // if the autofill name is not associated to any sync id.
81   virtual int64 GetSyncIdFromChromeId(const std::string& node_id);
82 
83   // Associates the given autofill name with the given sync id.
84   virtual void Associate(const std::string* node, int64 sync_id);
85 
86   // Remove the association that corresponds to the given sync id.
87   virtual void Disassociate(int64 sync_id);
88 
89   // Returns whether a node with the given permanent tag was found and update
90   // |sync_id| with that node's id.
91   virtual bool GetSyncIdForTaggedNode(const std::string& tag, int64* sync_id);
92 
93   static std::string KeyToTag(const string16& name, const string16& value);
94 
95   static bool MergeTimestamps(const sync_pb::AutofillSpecifics& autofill,
96                               const std::vector<base::Time>& timestamps,
97                               std::vector<base::Time>* new_timestamps);
98   static bool FillProfileWithServerData(
99       AutofillProfile* merge_into,
100       const sync_pb::AutofillProfileSpecifics& specifics);
101 
102   // TODO(georgey) : add the same processing for CC info (already in protocol
103   // buffers).
104 
105   // Is called to determine if we need to upgrade to the new
106   // autofillprofile2 data type. If so we need to sync up autofillprofile
107   // first to the latest available changes on the server and then upgrade
108   // to autofillprofile2.
109   virtual bool HasNotMigratedYet(const sync_api::BaseTransaction* trans);
110 
111  protected:
112   // Given a profile from sync db it tries to match the profile against
113   // one in web db. it ignores the guid and compares the actual data.
114   AutofillProfile* FindCorrespondingNodeFromWebDB(
115       const sync_pb::AutofillProfileSpecifics& profile,
116       const std::vector<AutofillProfile*>& all_profiles_from_db);
117 
118  private:
119   typedef std::map<std::string, int64> AutofillToSyncIdMap;
120   typedef std::map<int64, std::string> SyncIdToAutofillMap;
121 
122   // A convenience wrapper of a bunch of state we pass around while associating
123   // models, and send to the WebDatabase for persistence.
124   struct DataBundle;
125 
126   // Helper to query WebDatabase for the current autofill state.
127   bool LoadAutofillData(std::vector<AutofillEntry>* entries,
128                         std::vector<AutofillProfile*>* profiles);
129 
130   // We split up model association first by autofill sub-type (entries, and
131   // profiles.  There is a Traverse* method for each of these.
132   bool TraverseAndAssociateChromeAutofillEntries(
133       sync_api::WriteTransaction* write_trans,
134       const sync_api::ReadNode& autofill_root,
135       const std::vector<AutofillEntry>& all_entries_from_db,
136       std::set<AutofillKey>* current_entries,
137       std::vector<AutofillEntry>* new_entries);
138   bool TraverseAndAssociateChromeAutofillProfiles(
139       sync_api::WriteTransaction* write_trans,
140       const sync_api::ReadNode& autofill_root,
141       const std::vector<AutofillProfile*>& all_profiles_from_db,
142       std::set<string16>* current_profiles,
143       std::vector<AutofillProfile*>* updated_profiles);
144 
145   // Once the above traversals are complete, we traverse the sync model to
146   // associate all remaining nodes.
147   bool TraverseAndAssociateAllSyncNodes(
148       sync_api::WriteTransaction* write_trans,
149       const sync_api::ReadNode& autofill_root,
150       DataBundle* bundle,
151       const std::vector<AutofillProfile*>& all_profiles_from_db);
152 
153   // Helper to persist any changes that occured during model association to
154   // the WebDatabase.
155   bool SaveChangesToWebData(const DataBundle& bundle);
156 
157   // Helper to insert an AutofillEntry into the WebDatabase (e.g. in response
158   // to encountering a sync node that doesn't exist yet locally).
159   void AddNativeEntryIfNeeded(const sync_pb::AutofillSpecifics& autofill,
160                               DataBundle* bundle,
161                               const sync_api::ReadNode& node);
162 
163   // Helper to insert an AutofillProfile into the WebDatabase (e.g. in response
164   // to encountering a sync node that doesn't exist yet locally).
165   void AddNativeProfileIfNeeded(
166       const sync_pb::AutofillProfileSpecifics& profile,
167       DataBundle* bundle,
168       const sync_api::ReadNode& node,
169       const std::vector<AutofillProfile*>& all_profiles_from_db);
170 
171   // Called at various points in model association to determine if the
172   // user requested an abort.
173   bool IsAbortPending();
174 
175   ProfileSyncService* sync_service_;
176   WebDatabase* web_database_;
177   PersonalDataManager* personal_data_;
178   int64 autofill_node_id_;
179 
180   AutofillToSyncIdMap id_map_;
181   SyncIdToAutofillMap id_map_inverse_;
182 
183   // Abort association pending flag and lock.  If this is set to true
184   // (via the AbortAssociation method), return from the
185   // AssociateModels method as soon as possible.
186   base::Lock abort_association_pending_lock_;
187   bool abort_association_pending_;
188   int number_of_entries_created_;
189 
190   DISALLOW_COPY_AND_ASSIGN(AutofillModelAssociator);
191 };
192 
193 }  // namespace browser_sync
194 
195 #endif  // CHROME_BROWSER_SYNC_GLUE_AUTOFILL_MODEL_ASSOCIATOR_H_
196