autofill_profile_model_associator.cc revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
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
493f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  if (VLOG_IS_ON(1)) {
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
633f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  VLOG(1) << "[AUTOFILL MIGRATION]"
643f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << "Looking for the above data in sync db..";
653f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
66201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Alias the all_profiles_from_db so we fit in 80 characters
67201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  const std::vector<AutoFillProfile*>& profiles(all_profiles_from_db);
68201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (std::vector<AutoFillProfile*>::const_iterator ix = profiles.begin();
69201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      ix != profiles.end();
70201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      ++ix) {
71201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::string guid((*ix)->guid());
72201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
73201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    ReadNode node(write_trans);
743f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    if (node.InitByClientTagLookup(syncable::AUTOFILL_PROFILE, guid) &&
753f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen        // The following check is to ensure the given sync node is not already
763f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen        // associated with another profile. That could happen if the user has
773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen        // the same profile duplicated.
783f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen        current_profiles->find(guid) == current_profiles->end()) {
793f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
803f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      VLOG(1) << "[AUTOFILL MIGRATION]"
813f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen              << " Found in sync db: "
823f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen              << (*ix)->GetFieldText(AutoFillType(NAME_FIRST))
833f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen              << (*ix)->GetFieldText(AutoFillType(NAME_LAST))
843f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen              << (*ix)->guid()
853f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen              << " so associating with node id " << node.GetId();
86201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      const sync_pb::AutofillProfileSpecifics& autofill(
87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          node.GetAutofillProfileSpecifics());
88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      if (OverwriteProfileWithServerData(*ix, autofill)) {
89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        updated_profiles->push_back(*ix);
90201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      }
91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      Associate(&guid, node.GetId());
92201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      current_profiles->insert(guid);
93201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    } else {
94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      MakeNewAutofillProfileSyncNodeIfNeeded(write_trans,
95201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          autofill_root,
96201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          (**ix),
97201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          new_profiles,
98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          current_profiles,
99201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          profiles_to_delete);
100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
101201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return true;
10321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
10521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool AutofillProfileModelAssociator::GetSyncIdForTaggedNode(
10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const std::string& tag,
10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    int64* sync_id) {
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  sync_api::ReadTransaction trans(sync_service_->GetUserShare());
10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  sync_api::ReadNode sync_node(&trans);
11021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (!sync_node.InitByTagLookup(tag.c_str()))
11121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return false;
11221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  *sync_id = sync_node.GetId();
113201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
115201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::LoadAutofillData(
117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::vector<AutoFillProfile*>* profiles) {
118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (IsAbortPending())
119201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
120201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
121201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!web_database_->GetAutoFillProfiles(profiles))
122201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
123201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
126201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
127201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::AssociateModels() {
128201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  VLOG(1) << "Associating Autofill Models";
129201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
130201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  {
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    base::AutoLock lock(abort_association_pending_lock_);
132201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    abort_association_pending_ = false;
133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
134201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
135201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ScopedVector<AutoFillProfile> profiles;
136201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
137201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!LoadAutofillData(&profiles.get())) {
138201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    LOG(ERROR) << "Could not get the autofill data from WebDatabase.";
139201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
140201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
141201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1423f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  VLOG(1) << "[AUTOFILL MIGRATION]"
1433f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << " Now associating to the new autofill profile model associator"
1443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << " root node";
145201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DataBundle bundle;
146201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  {
147201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // The write transaction lock is held inside this block.
148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // We do all the web db operations outside this block.
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    sync_api::WriteTransaction trans(sync_service_->GetUserShare());
150201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
151201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::ReadNode autofill_root(&trans);
152201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!autofill_root.InitByTagLookup(kAutofillProfileTag)) {
153201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      LOG(ERROR) << "Server did not create the top-level autofill node. We "
154201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                 << "might be running against an out-of-date server.";
155201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
156201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
157201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
158201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!TraverseAndAssociateChromeAutoFillProfiles(&trans, autofill_root,
159201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            profiles.get(), &bundle.current_profiles,
160201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            &bundle.updated_profiles,
161201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            &bundle.new_profiles,
162201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            &bundle.profiles_to_delete) ||
163201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        !TraverseAndAssociateAllSyncNodes(&trans, autofill_root, &bundle)) {
164201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
165201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
166201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
167201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
168201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!SaveChangesToWebData(bundle)) {
169201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    LOG(ERROR) << "Failed to update autofill entries.";
170201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
171201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
172201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (sync_service_->GetAutofillMigrationState() !=
17421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen     syncable::MIGRATED) {
17521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    syncable::AutofillMigrationDebugInfo debug_info;
17621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    debug_info.autofill_profile_added_during_migration =
17721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        number_of_profiles_created_;
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    sync_service_->SetAutofillMigrationDebugInfo(
17921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        syncable::AutofillMigrationDebugInfo::PROFILES_ADDED,
18021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        debug_info);
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    sync_service_->SetAutofillMigrationState(
18221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        syncable::MIGRATED);
18321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
18421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
18521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
18621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      new DoOptimisticRefreshForAutofill(personal_data_));
187201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
188201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
189201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
190201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::DisassociateModels() {
191201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  id_map_.clear();
192201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  id_map_inverse_.clear();
193201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
194201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
195201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
196201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Helper to compare the local value and cloud value of a field, merge into
197201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// the local value if they differ, and return whether the merge happened.
198201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::MergeField(FormGroup* f,
199201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AutoFillFieldType t,
200201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const std::string& specifics_field) {
201201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (UTF16ToUTF8(f->GetFieldText(AutoFillType(t))) == specifics_field)
202201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
203201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  f->SetInfo(AutoFillType(t), UTF8ToUTF16(specifics_field));
204201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
205201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
206201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::SyncModelHasUserCreatedNodes(
207201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    bool *has_nodes) {
208201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  CHECK_NE(has_nodes, reinterpret_cast<bool*>(NULL));
20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  sync_api::ReadTransaction trans(sync_service_->GetUserShare());
210201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
211201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  sync_api::ReadNode node(&trans);
212201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
21321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (!node.InitByTagLookup(kAutofillProfileTag)) {
214201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    LOG(ERROR) << "Sever did not create a top level node"
215201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch               << "Out of data server or autofill type not enabled";
216201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
217201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
218201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
219201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  *has_nodes = sync_api::kInvalidId != node.GetFirstChildId();
220201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
221201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
222201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// static
223201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::OverwriteProfileWithServerData(
224201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AutoFillProfile* merge_into,
225201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_pb::AutofillProfileSpecifics& specifics) {
226201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool diff = false;
227201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  AutoFillProfile* p = merge_into;
228201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  const sync_pb::AutofillProfileSpecifics& s(specifics);
229201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, NAME_FIRST, s.name_first()) || diff;
230201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, NAME_LAST, s.name_last()) || diff;
231201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, NAME_MIDDLE, s.name_middle()) || diff;
232201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_LINE1, s.address_home_line1()) || diff;
233201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_LINE2, s.address_home_line2()) || diff;
234201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_CITY, s.address_home_city()) || diff;
235201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_STATE, s.address_home_state()) || diff;
236201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_COUNTRY, s.address_home_country()) || diff;
237201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_ZIP, s.address_home_zip()) || diff;
238201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, EMAIL_ADDRESS, s.email_address()) || diff;
239201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, COMPANY_NAME, s.company_name()) || diff;
240201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, PHONE_FAX_WHOLE_NUMBER, s.phone_fax_whole_number())
241201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      || diff;
242201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, PHONE_HOME_WHOLE_NUMBER, s.phone_home_whole_number())
243201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      || diff;
244201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return diff;
245201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
246201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
247201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
248201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochint64 AutofillProfileModelAssociator::FindSyncNodeWithProfile(
249201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::WriteTransaction* trans,
250201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_api::BaseNode& autofill_root,
2513f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    const AutoFillProfile& profile_from_db,
2523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    std::set<std::string>* current_profiles) {
253201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int64 sync_child_id = autofill_root.GetFirstChildId();
254201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  while (sync_child_id != sync_api::kInvalidId) {
255201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    ReadNode read_node(trans);
256201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AutoFillProfile p;
25721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (!read_node.InitByIdLookup(sync_child_id)) {
258201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      LOG(ERROR) << "unable to find the id given by getfirst child " <<
259201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        sync_child_id;
260201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return sync_api::kInvalidId;
261201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
262201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_pb::AutofillProfileSpecifics& autofill_specifics(
263201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        read_node.GetAutofillProfileSpecifics());
2643f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2653f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    // This find should be fast as the set uses tree.
2663f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    if (current_profiles->find(autofill_specifics.guid())
2673f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen        == current_profiles->end()) {
2683f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      OverwriteProfileWithServerData(&p, autofill_specifics);
2693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      if (p.Compare(profile_from_db) == 0) {
2703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen        return sync_child_id;
2713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      }
272201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
273201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_child_id = read_node.GetSuccessorId();
274201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
275201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
276201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return sync_api::kInvalidId;
277201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
278201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::MakeNewAutofillProfileSyncNodeIfNeeded(
279201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::WriteTransaction* trans,
280201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_api::BaseNode& autofill_root,
281201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const AutoFillProfile& profile,
282201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::vector<AutoFillProfile*>* new_profiles,
283201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::set<std::string>* current_profiles,
284201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::vector<std::string>* profiles_to_delete) {
285201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
2863f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  int64 sync_node_id = FindSyncNodeWithProfile(trans,
2873f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      autofill_root,
2883f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      profile,
2893f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      current_profiles);
290201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (sync_node_id != sync_api::kInvalidId) {
291201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // In case of duplicates throw away the local profile and apply the
292201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // server profile.(The only difference between the 2 profiles are the guids)
293201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    profiles_to_delete->push_back(profile.guid());
294201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::ReadNode read_node(trans);
295201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!read_node.InitByIdLookup(sync_node_id)) {
296201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      LOG(ERROR);
297201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
298201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
299201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_pb::AutofillProfileSpecifics& autofill_specifics(
300201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        read_node.GetAutofillProfileSpecifics());
301201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AutoFillProfile* p = new AutoFillProfile(autofill_specifics.guid());
302201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    OverwriteProfileWithServerData(p, autofill_specifics);
303201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    new_profiles->push_back(p);
304201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::string guid = autofill_specifics.guid();
305201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    Associate(&guid, sync_node_id);
306201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    current_profiles->insert(autofill_specifics.guid());
3073f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    VLOG(1) << "[AUTOFILL MIGRATION]"
3083f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << "Found in sync db but with a different guid: "
3093f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << UTF16ToUTF8(profile.GetFieldText(AutoFillType(NAME_FIRST)))
3103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << UTF16ToUTF8(profile.GetFieldText(AutoFillType(NAME_LAST)))
3113f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << "New guid " << autofill_specifics.guid() << " sync node id "
3123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << sync_node_id << " so associating. Profile to be deleted "
3133f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << profile.guid();
314201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  } else {
315201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::WriteNode node(trans);
316201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!node.InitUniqueByCreation(
317201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch             syncable::AUTOFILL_PROFILE, autofill_root, profile.guid())) {
318201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      LOG(ERROR) << "Failed to create autofill sync node.";
319201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
320201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
321201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    node.SetTitle(UTF8ToWide(profile.guid()));
3223f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    VLOG(1) << "[AUTOFILL MIGRATION]"
3233f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << "NOT Found in sync db  "
3243f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << UTF16ToUTF8(profile.GetFieldText(AutoFillType(NAME_FIRST)))
3253f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << UTF16ToUTF8(profile.GetFieldText(AutoFillType(NAME_LAST)))
3263f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << profile.guid()
3273f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << " so creating a new sync node. Sync node id "
3283f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << node.GetId();
32921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    AutofillProfileChangeProcessor::WriteAutofillProfile(profile, &node);
33021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    current_profiles->insert(profile.guid());
3313f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    std::string guid = profile.guid();
3323f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    Associate(&guid, node.GetId());
33321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    number_of_profiles_created_++;
334201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
335201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
336201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
337201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
338201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
339201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::TraverseAndAssociateAllSyncNodes(
340201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::WriteTransaction* write_trans,
341201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_api::ReadNode& autofill_root,
342201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    DataBundle* bundle) {
343201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
3443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  VLOG(1) << "[AUTOFILL MIGRATION] "
3453f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << " Iterating over sync nodes of autofill profile root node";
346201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
347201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int64 sync_child_id = autofill_root.GetFirstChildId();
348201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  while (sync_child_id != sync_api::kInvalidId) {
349201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    ReadNode sync_child(write_trans);
350201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!sync_child.InitByIdLookup(sync_child_id)) {
351201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      LOG(ERROR) << "Failed to fetch child node.";
352201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
353201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
354201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_pb::AutofillProfileSpecifics& autofill(
355201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        sync_child.GetAutofillProfileSpecifics());
356201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
357201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AddNativeProfileIfNeeded(autofill, bundle, sync_child);
358201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
359201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_child_id = sync_child.GetSuccessorId();
360201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
361201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
362201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
363201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
364201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::AddNativeProfileIfNeeded(
365201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_pb::AutofillProfileSpecifics& profile,
366201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    DataBundle* bundle,
367201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_api::ReadNode& node) {
368201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
369201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
3703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  VLOG(1) << "[AUTOFILL MIGRATION] "
3713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << "Trying to lookup "
3723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << profile.name_first()
3733f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << " "
3743f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << profile.name_last()
3753f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << "sync node id " << node.GetId()
3763f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << " Guid " << profile.guid()
3773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << " in the web db";
3783f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
379201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (bundle->current_profiles.find(profile.guid()) ==
380201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      bundle->current_profiles.end()) {
381201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::string guid(profile.guid());
382201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    Associate(&guid, node.GetId());
383201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AutoFillProfile* p = new AutoFillProfile(profile.guid());
384201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    OverwriteProfileWithServerData(p, profile);
385201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    bundle->new_profiles.push_back(p);
3863f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    VLOG(1) << "[AUTOFILL MIGRATION] "
3873f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << " Did not find one so creating it on web db";
38821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else {
3893f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    VLOG(1) << "[AUTOFILL MIGRATION] "
3903f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << " Found it on web db. Moving on ";
391201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
392201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
393201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
394201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::SaveChangesToWebData(
395201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const DataBundle& bundle) {
396201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
397201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
398201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (IsAbortPending())
399201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
400201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
401201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (size_t i = 0; i < bundle.new_profiles.size(); i++) {
402201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (IsAbortPending())
403201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
404201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!web_database_->AddAutoFillProfile(*bundle.new_profiles[i]))
405201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
406201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
407201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
408201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (size_t i = 0; i < bundle.updated_profiles.size(); i++) {
409201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (IsAbortPending())
410201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
411201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!web_database_->UpdateAutoFillProfile(*bundle.updated_profiles[i]))
412201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
413201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
414201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
415201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (size_t i = 0; i< bundle.profiles_to_delete.size(); ++i) {
416201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (IsAbortPending())
417201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
418201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!web_database_->RemoveAutoFillProfile(bundle.profiles_to_delete[i]))
419201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
420201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
421201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
422201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
423201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
42421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool AutofillProfileModelAssociator::InitSyncNodeFromChromeId(
42521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const std::string& node_id,
42621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    sync_api::BaseNode* sync_node) {
42721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return false;
42821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
42921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
430201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::Associate(
431201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const std::string* autofill,
432201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    int64 sync_id) {
433201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
434201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK_NE(sync_api::kInvalidId, sync_id);
435201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(id_map_.find(*autofill) == id_map_.end());
436201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(id_map_inverse_.find(sync_id) == id_map_inverse_.end());
437201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  id_map_[*autofill] = sync_id;
438201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  id_map_inverse_[sync_id] = *autofill;
439201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
440201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
441201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::Disassociate(int64 sync_id) {
442201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
443201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  SyncIdToAutofillMap::iterator iter = id_map_inverse_.find(sync_id);
444201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (iter == id_map_inverse_.end())
445201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
446201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  CHECK(id_map_.erase(iter->second));
447201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  id_map_inverse_.erase(iter);
448201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
449201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
450201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochint64 AutofillProfileModelAssociator::GetSyncIdFromChromeId(
45121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const std::string& autofill) {
452201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  AutofillToSyncIdMap::const_iterator iter = id_map_.find(autofill);
453201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return iter == id_map_.end() ? sync_api::kInvalidId : iter->second;
454201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
455201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
456201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::AbortAssociation() {
457201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
45872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::AutoLock lock(abort_association_pending_lock_);
459201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  abort_association_pending_ = true;
460201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
461201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
46221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst std::string* AutofillProfileModelAssociator::GetChromeNodeFromSyncId(
46321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    int64 sync_id) {
46421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  SyncIdToAutofillMap::const_iterator iter = id_map_inverse_.find(sync_id);
46521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return iter == id_map_inverse_.end() ? NULL : &(iter->second);
46621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
46721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
468201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::IsAbortPending() {
46972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::AutoLock lock(abort_association_pending_lock_);
470201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return abort_association_pending_;
471201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
472201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
47372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenAutofillProfileModelAssociator::DataBundle::DataBundle() {}
47472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
47572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenAutofillProfileModelAssociator::DataBundle::~DataBundle() {
47672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  STLDeleteElements(&new_profiles);
47772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
47872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
47972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
480201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}  // namespace browser_sync
481201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
482