autofill_profile_model_associator.cc revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
1201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// found in the LICENSE file.
4201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
5201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/sync/glue/autofill_profile_model_associator.h"
6201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
7201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/utf_string_conversions.h"
821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/sync/glue/autofill_profile_change_processor.h"
921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/sync/glue/do_optimistic_refresh_task.h"
10201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/sync/profile_sync_service.h"
11201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/webdata/web_database.h"
12201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
13201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochusing sync_api::ReadNode;
14201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochnamespace browser_sync {
15201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst char kAutofillProfileTag[] = "google_chrome_autofill_profiles";
17201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
18201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochAutofillProfileModelAssociator::AutofillProfileModelAssociator(
19201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    ProfileSyncService* sync_service,
20201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    WebDatabase* web_database,
21201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    PersonalDataManager* personal_data)
22201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    : sync_service_(sync_service),
23201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      web_database_(web_database),
24201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      personal_data_(personal_data),
25201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      autofill_node_id_(sync_api::kInvalidId),
2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      abort_association_pending_(false),
2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      number_of_profiles_created_(0) {
28201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
29201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(sync_service_);
30201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(web_database_);
31201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(personal_data_);
32201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
33201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
34201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochAutofillProfileModelAssociator::~AutofillProfileModelAssociator() {
35201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
36201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
37201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenAutofillProfileModelAssociator::AutofillProfileModelAssociator() {}
3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
40201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::TraverseAndAssociateChromeAutoFillProfiles(
41201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::WriteTransaction* write_trans,
42201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_api::ReadNode& autofill_root,
43201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const std::vector<AutoFillProfile*>& all_profiles_from_db,
44201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::set<std::string>* current_profiles,
45201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::vector<AutoFillProfile*>* updated_profiles,
46201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::vector<AutoFillProfile*>* new_profiles,
47201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::vector<std::string>* profiles_to_delete) {
48201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (MigrationLoggingEnabled()) {
5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    VLOG(1) << "[AUTOFILL MIGRATION]"
5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            << "Printing profiles from web db";
5221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
5321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    for (std::vector<AutoFillProfile*>::const_iterator ix =
5421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        all_profiles_from_db.begin(); ix != all_profiles_from_db.end(); ++ix) {
5521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      AutoFillProfile* p = *ix;
5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      VLOG(1) << "[AUTOFILL MIGRATION]  "
5721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              << p->GetFieldText(AutoFillType(NAME_FIRST))
5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              << p->GetFieldText(AutoFillType(NAME_LAST))
5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              << p->guid();
6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    }
6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (MigrationLoggingEnabled()) {
6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    VLOG(1) << "[AUTOFILL MIGRATION]"
6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            << "Looking for the above data in sync db..";
6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
67201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Alias the all_profiles_from_db so we fit in 80 characters
68201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  const std::vector<AutoFillProfile*>& profiles(all_profiles_from_db);
69201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (std::vector<AutoFillProfile*>::const_iterator ix = profiles.begin();
70201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      ix != profiles.end();
71201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      ++ix) {
72201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::string guid((*ix)->guid());
73201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
74201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    ReadNode node(write_trans);
75201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (node.InitByClientTagLookup(syncable::AUTOFILL_PROFILE, guid)) {
7621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      if (MigrationLoggingEnabled()) {
7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        VLOG(1) << "[AUTOFILL MIGRATION]"
7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                << " Found in sync db: "
7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                << (*ix)->GetFieldText(AutoFillType(NAME_FIRST))
8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                << (*ix)->GetFieldText(AutoFillType(NAME_LAST))
8121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                << (*ix)->guid()
8221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                << " so associating";
8321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      }
84201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      const sync_pb::AutofillProfileSpecifics& autofill(
85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          node.GetAutofillProfileSpecifics());
86201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      if (OverwriteProfileWithServerData(*ix, autofill)) {
87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        updated_profiles->push_back(*ix);
88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      }
89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      Associate(&guid, node.GetId());
90201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      current_profiles->insert(guid);
91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    } else {
92201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      MakeNewAutofillProfileSyncNodeIfNeeded(write_trans,
93201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          autofill_root,
94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          (**ix),
95201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          new_profiles,
96201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          current_profiles,
97201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          profiles_to_delete);
98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
99201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
10021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return true;
10121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
102201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
10321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool AutofillProfileModelAssociator::GetSyncIdForTaggedNode(
10421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const std::string& tag,
10521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    int64* sync_id) {
10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  sync_api::ReadTransaction trans(
10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      sync_service_->backend()->GetUserShareHandle());
10821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  sync_api::ReadNode sync_node(&trans);
10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (!sync_node.InitByTagLookup(tag.c_str()))
11021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return false;
11121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  *sync_id = sync_node.GetId();
112201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
113201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
115201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::LoadAutofillData(
116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::vector<AutoFillProfile*>* profiles) {
117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (IsAbortPending())
118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
119201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
120201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!web_database_->GetAutoFillProfiles(profiles))
121201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
122201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
123201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
126201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::AssociateModels() {
127201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  VLOG(1) << "Associating Autofill Models";
128201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
129201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  {
130201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AutoLock lock(abort_association_pending_lock_);
131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    abort_association_pending_ = false;
132201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
134201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ScopedVector<AutoFillProfile> profiles;
135201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
136201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!LoadAutofillData(&profiles.get())) {
137201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    LOG(ERROR) << "Could not get the autofill data from WebDatabase.";
138201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
139201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
140201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
14121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (MigrationLoggingEnabled()) {
14221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    VLOG(1) << "[AUTOFILL MIGRATION]"
14321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            << " Now associating to the new autofill profile model associator"
14421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            << " root node";
14521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
146201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DataBundle bundle;
147201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  {
148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // The write transaction lock is held inside this block.
149201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // We do all the web db operations outside this block.
150201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::WriteTransaction trans(
151201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        sync_service_->backend()->GetUserShareHandle());
152201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
153201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::ReadNode autofill_root(&trans);
154201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!autofill_root.InitByTagLookup(kAutofillProfileTag)) {
155201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      LOG(ERROR) << "Server did not create the top-level autofill node. We "
156201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                 << "might be running against an out-of-date server.";
157201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
158201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
159201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
160201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!TraverseAndAssociateChromeAutoFillProfiles(&trans, autofill_root,
161201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            profiles.get(), &bundle.current_profiles,
162201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            &bundle.updated_profiles,
163201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            &bundle.new_profiles,
164201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            &bundle.profiles_to_delete) ||
165201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        !TraverseAndAssociateAllSyncNodes(&trans, autofill_root, &bundle)) {
166201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
167201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
168201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
169201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
170201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!SaveChangesToWebData(bundle)) {
171201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    LOG(ERROR) << "Failed to update autofill entries.";
172201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
173201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
174201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
17521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (sync_service_->backend()->GetAutofillMigrationState() !=
17621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen     syncable::MIGRATED) {
17721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    syncable::AutofillMigrationDebugInfo debug_info;
17821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    debug_info.autofill_profile_added_during_migration =
17921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        number_of_profiles_created_;
18021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    sync_service_->backend()->SetAutofillMigrationDebugInfo(
18121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        syncable::AutofillMigrationDebugInfo::PROFILES_ADDED,
18221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        debug_info);
18321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    sync_service()->backend()->SetAutofillMigrationState(
18421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        syncable::MIGRATED);
18521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
18621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
18721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
18821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      new DoOptimisticRefreshForAutofill(personal_data_));
189201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
190201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
191201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
192201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::DisassociateModels() {
193201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  id_map_.clear();
194201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  id_map_inverse_.clear();
195201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
196201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
197201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
198201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Helper to compare the local value and cloud value of a field, merge into
199201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// the local value if they differ, and return whether the merge happened.
200201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::MergeField(FormGroup* f,
201201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AutoFillFieldType t,
202201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const std::string& specifics_field) {
203201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (UTF16ToUTF8(f->GetFieldText(AutoFillType(t))) == specifics_field)
204201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
205201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  f->SetInfo(AutoFillType(t), UTF8ToUTF16(specifics_field));
206201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
207201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
208201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::SyncModelHasUserCreatedNodes(
209201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    bool *has_nodes) {
210201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  CHECK_NE(has_nodes, reinterpret_cast<bool*>(NULL));
211201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  sync_api::ReadTransaction trans(
212201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      sync_service_->backend()->GetUserShareHandle());
213201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
214201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  sync_api::ReadNode node(&trans);
215201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
21621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (!node.InitByTagLookup(kAutofillProfileTag)) {
217201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    LOG(ERROR) << "Sever did not create a top level node"
218201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch               << "Out of data server or autofill type not enabled";
219201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
220201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
221201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
222201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  *has_nodes = sync_api::kInvalidId != node.GetFirstChildId();
223201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
224201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
225201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// static
226201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::OverwriteProfileWithServerData(
227201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AutoFillProfile* merge_into,
228201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_pb::AutofillProfileSpecifics& specifics) {
229201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool diff = false;
230201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  AutoFillProfile* p = merge_into;
231201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  const sync_pb::AutofillProfileSpecifics& s(specifics);
232201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, NAME_FIRST, s.name_first()) || diff;
233201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, NAME_LAST, s.name_last()) || diff;
234201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, NAME_MIDDLE, s.name_middle()) || diff;
235201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_LINE1, s.address_home_line1()) || diff;
236201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_LINE2, s.address_home_line2()) || diff;
237201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_CITY, s.address_home_city()) || diff;
238201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_STATE, s.address_home_state()) || diff;
239201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_COUNTRY, s.address_home_country()) || diff;
240201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_ZIP, s.address_home_zip()) || diff;
241201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, EMAIL_ADDRESS, s.email_address()) || diff;
242201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, COMPANY_NAME, s.company_name()) || diff;
243201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, PHONE_FAX_WHOLE_NUMBER, s.phone_fax_whole_number())
244201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      || diff;
245201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, PHONE_HOME_WHOLE_NUMBER, s.phone_home_whole_number())
246201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      || diff;
247201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return diff;
248201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
249201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
250201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
251201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochint64 AutofillProfileModelAssociator::FindSyncNodeWithProfile(
252201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::WriteTransaction* trans,
253201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_api::BaseNode& autofill_root,
254201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const AutoFillProfile& profile_from_db) {
255201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int64 sync_child_id = autofill_root.GetFirstChildId();
256201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  while (sync_child_id != sync_api::kInvalidId) {
257201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    ReadNode read_node(trans);
258201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AutoFillProfile p;
25921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (!read_node.InitByIdLookup(sync_child_id)) {
260201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      LOG(ERROR) << "unable to find the id given by getfirst child " <<
261201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        sync_child_id;
262201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return sync_api::kInvalidId;
263201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
264201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_pb::AutofillProfileSpecifics& autofill_specifics(
265201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        read_node.GetAutofillProfileSpecifics());
266201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    OverwriteProfileWithServerData(&p, autofill_specifics);
267201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (p.Compare(profile_from_db) == 0) {
268201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return sync_child_id;
269201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
270201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_child_id = read_node.GetSuccessorId();
271201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
272201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
273201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return sync_api::kInvalidId;
274201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
275201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::MakeNewAutofillProfileSyncNodeIfNeeded(
276201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::WriteTransaction* trans,
277201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_api::BaseNode& autofill_root,
278201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const AutoFillProfile& profile,
279201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::vector<AutoFillProfile*>* new_profiles,
280201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::set<std::string>* current_profiles,
281201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::vector<std::string>* profiles_to_delete) {
282201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
283201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int64 sync_node_id = FindSyncNodeWithProfile(trans, autofill_root, profile);
284201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (sync_node_id != sync_api::kInvalidId) {
285201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // In case of duplicates throw away the local profile and apply the
286201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // server profile.(The only difference between the 2 profiles are the guids)
287201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    profiles_to_delete->push_back(profile.guid());
288201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::ReadNode read_node(trans);
289201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!read_node.InitByIdLookup(sync_node_id)) {
290201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      LOG(ERROR);
291201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
292201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
293201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_pb::AutofillProfileSpecifics& autofill_specifics(
294201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        read_node.GetAutofillProfileSpecifics());
295201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AutoFillProfile* p = new AutoFillProfile(autofill_specifics.guid());
296201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    OverwriteProfileWithServerData(p, autofill_specifics);
297201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    new_profiles->push_back(p);
298201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::string guid = autofill_specifics.guid();
299201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    Associate(&guid, sync_node_id);
300201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    current_profiles->insert(autofill_specifics.guid());
30121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (MigrationLoggingEnabled()) {
30221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      VLOG(1) << "[AUTOFILL MIGRATION]"
30321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              << "Found in sync db but with a different guid: "
30421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              << UTF16ToUTF8(profile.GetFieldText(AutoFillType(NAME_FIRST)))
30521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              << UTF16ToUTF8(profile.GetFieldText(AutoFillType(NAME_LAST)))
30621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              << "New guid " << autofill_specifics.guid()
30721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              << " so associating";
30821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    }
309201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  } else {
310201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::WriteNode node(trans);
311201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!node.InitUniqueByCreation(
312201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch             syncable::AUTOFILL_PROFILE, autofill_root, profile.guid())) {
313201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      LOG(ERROR) << "Failed to create autofill sync node.";
314201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
315201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
316201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    node.SetTitle(UTF8ToWide(profile.guid()));
31721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (MigrationLoggingEnabled()) {
31821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      VLOG(1) << "[AUTOFILL MIGRATION]"
31921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              << "NOT Found in sync db  "
32021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              << UTF16ToUTF8(profile.GetFieldText(AutoFillType(NAME_FIRST)))
32121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              << UTF16ToUTF8(profile.GetFieldText(AutoFillType(NAME_LAST)))
32221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              << profile.guid()
32321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              << " so creating a new sync node.";
32421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    }
32521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    AutofillProfileChangeProcessor::WriteAutofillProfile(profile, &node);
32621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    current_profiles->insert(profile.guid());
32721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    number_of_profiles_created_++;
328201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
329201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
330201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
331201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
332201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
333201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::TraverseAndAssociateAllSyncNodes(
334201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::WriteTransaction* write_trans,
335201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_api::ReadNode& autofill_root,
336201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    DataBundle* bundle) {
337201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
338201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
33921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (MigrationLoggingEnabled()) {
34021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    VLOG(1) << "[AUTOFILL MIGRATION] "
34121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            << " Iterating over sync nodes of autofill profile root node";
34221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
343201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int64 sync_child_id = autofill_root.GetFirstChildId();
344201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  while (sync_child_id != sync_api::kInvalidId) {
345201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    ReadNode sync_child(write_trans);
346201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!sync_child.InitByIdLookup(sync_child_id)) {
347201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      LOG(ERROR) << "Failed to fetch child node.";
348201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
349201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
350201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_pb::AutofillProfileSpecifics& autofill(
351201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        sync_child.GetAutofillProfileSpecifics());
352201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
353201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AddNativeProfileIfNeeded(autofill, bundle, sync_child);
354201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
355201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_child_id = sync_child.GetSuccessorId();
356201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
357201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
358201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
359201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
360201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::AddNativeProfileIfNeeded(
361201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_pb::AutofillProfileSpecifics& profile,
362201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    DataBundle* bundle,
363201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_api::ReadNode& node) {
364201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
365201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
36621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (MigrationLoggingEnabled()) {
36721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    VLOG(1) << "[AUTOFILL MIGRATION] "
36821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            << "Trying to lookup "
36921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            << profile.name_first()
37021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            << " "
37121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            << profile.name_last()
37221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            << " in the web db";
37321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
374201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (bundle->current_profiles.find(profile.guid()) ==
375201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      bundle->current_profiles.end()) {
376201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::string guid(profile.guid());
377201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    Associate(&guid, node.GetId());
378201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AutoFillProfile* p = new AutoFillProfile(profile.guid());
379201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    OverwriteProfileWithServerData(p, profile);
380201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    bundle->new_profiles.push_back(p);
38121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (MigrationLoggingEnabled()) {
38221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      VLOG(1) << "[AUTOFILL MIGRATION] "
38321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              << " Did not find one so creating it on web db";
38421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    }
38521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else {
38621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (MigrationLoggingEnabled()) {
38721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      VLOG(1) << "[AUTOFILL MIGRATION] "
38821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              << " Found it on web db. Moving on ";
38921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    }
390201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
391201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
392201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
393201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::SaveChangesToWebData(
394201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const DataBundle& bundle) {
395201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
396201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
397201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (IsAbortPending())
398201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
399201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
400201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (size_t i = 0; i < bundle.new_profiles.size(); i++) {
401201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (IsAbortPending())
402201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
403201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!web_database_->AddAutoFillProfile(*bundle.new_profiles[i]))
404201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
405201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
406201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
407201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (size_t i = 0; i < bundle.updated_profiles.size(); i++) {
408201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (IsAbortPending())
409201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
410201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!web_database_->UpdateAutoFillProfile(*bundle.updated_profiles[i]))
411201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
412201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
413201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
414201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (size_t i = 0; i< bundle.profiles_to_delete.size(); ++i) {
415201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (IsAbortPending())
416201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
417201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!web_database_->RemoveAutoFillProfile(bundle.profiles_to_delete[i]))
418201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
419201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
420201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
421201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
422201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
42321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool AutofillProfileModelAssociator::InitSyncNodeFromChromeId(
42421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const std::string& node_id,
42521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    sync_api::BaseNode* sync_node) {
42621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return false;
42721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
42821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
429201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::Associate(
430201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const std::string* autofill,
431201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    int64 sync_id) {
432201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
433201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK_NE(sync_api::kInvalidId, sync_id);
434201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(id_map_.find(*autofill) == id_map_.end());
435201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(id_map_inverse_.find(sync_id) == id_map_inverse_.end());
436201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  id_map_[*autofill] = sync_id;
437201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  id_map_inverse_[sync_id] = *autofill;
438201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
439201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
440201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::Disassociate(int64 sync_id) {
441201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
442201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  SyncIdToAutofillMap::iterator iter = id_map_inverse_.find(sync_id);
443201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (iter == id_map_inverse_.end())
444201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
445201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  CHECK(id_map_.erase(iter->second));
446201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  id_map_inverse_.erase(iter);
447201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
448201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
449201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochint64 AutofillProfileModelAssociator::GetSyncIdFromChromeId(
45021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const std::string& autofill) {
451201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  AutofillToSyncIdMap::const_iterator iter = id_map_.find(autofill);
452201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return iter == id_map_.end() ? sync_api::kInvalidId : iter->second;
453201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
454201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
455201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::AbortAssociation() {
456201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
457201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  AutoLock lock(abort_association_pending_lock_);
458201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  abort_association_pending_ = true;
459201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
460201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
46121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst std::string* AutofillProfileModelAssociator::GetChromeNodeFromSyncId(
46221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    int64 sync_id) {
46321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  SyncIdToAutofillMap::const_iterator iter = id_map_inverse_.find(sync_id);
46421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return iter == id_map_inverse_.end() ? NULL : &(iter->second);
46521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
46621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
467201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::IsAbortPending() {
468201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  AutoLock lock(abort_association_pending_lock_);
469201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return abort_association_pending_;
470201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
471201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
47221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool AutofillProfileModelAssociator::MigrationLoggingEnabled() {
47321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // TODO(lipalani) enable logging via a command line flag.
47421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return false;
47521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
47621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
477201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}  // namespace browser_sync
478201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
479