1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 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"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/guid.h"
13201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
14201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochusing sync_api::ReadNode;
15201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochnamespace browser_sync {
16201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst char kAutofillProfileTag[] = "google_chrome_autofill_profiles";
18201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
19201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochAutofillProfileModelAssociator::AutofillProfileModelAssociator(
20201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    ProfileSyncService* sync_service,
21201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    WebDatabase* web_database,
22201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    PersonalDataManager* personal_data)
23201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    : sync_service_(sync_service),
24201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      web_database_(web_database),
25201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      personal_data_(personal_data),
26201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      autofill_node_id_(sync_api::kInvalidId),
2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      abort_association_pending_(false),
2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      number_of_profiles_created_(0) {
29201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
30201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(sync_service_);
31201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(web_database_);
32201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(personal_data_);
33201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
34201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
35201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochAutofillProfileModelAssociator::~AutofillProfileModelAssociator() {
36201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
37201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
38201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
39dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenAutofillProfileModelAssociator::AutofillProfileModelAssociator()
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    : sync_service_(NULL),
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      web_database_(NULL),
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      personal_data_(NULL),
43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      autofill_node_id_(0),
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      abort_association_pending_(false),
45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      number_of_profiles_created_(0) {
46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillProfileModelAssociator::TraverseAndAssociateChromeAutofillProfiles(
49201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::WriteTransaction* write_trans,
50201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_api::ReadNode& autofill_root,
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const std::vector<AutofillProfile*>& all_profiles_from_db,
52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::set<std::string>* current_profiles,
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::vector<AutofillProfile*>* updated_profiles,
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::vector<AutofillProfile*>* new_profiles,
55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::vector<std::string>* profiles_to_delete) {
56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (VLOG_IS_ON(2)) {
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    VLOG(2) << "[AUTOFILL MIGRATION]"
5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            << "Printing profiles from web db";
6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    for (std::vector<AutofillProfile*>::const_iterator ix =
6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        all_profiles_from_db.begin(); ix != all_profiles_from_db.end(); ++ix) {
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      AutofillProfile* p = *ix;
64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      VLOG(2) << "[AUTOFILL MIGRATION]  "
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              << p->GetInfo(NAME_FIRST)
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              << p->GetInfo(NAME_LAST)
6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen              << p->guid();
6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    }
6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  VLOG(1) << "[AUTOFILL MIGRATION]"
723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << "Looking for the above data in sync db..";
733f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
74201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Alias the all_profiles_from_db so we fit in 80 characters
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::vector<AutofillProfile*>& profiles(all_profiles_from_db);
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (std::vector<AutofillProfile*>::const_iterator ix = profiles.begin();
77201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      ix != profiles.end();
78201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      ++ix) {
79201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::string guid((*ix)->guid());
80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (guid::IsValidGUID(guid) == false) {
81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      DCHECK(false) << "Guid in the web db is invalid " << guid;
82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      continue;
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
84201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    ReadNode node(write_trans);
863f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    if (node.InitByClientTagLookup(syncable::AUTOFILL_PROFILE, guid) &&
873f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen        // The following check is to ensure the given sync node is not already
883f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen        // associated with another profile. That could happen if the user has
893f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen        // the same profile duplicated.
903f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen        current_profiles->find(guid) == current_profiles->end()) {
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      VLOG(2) << "[AUTOFILL MIGRATION]"
923f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen              << " Found in sync db: "
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              << (*ix)->GetInfo(NAME_FIRST)
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              << (*ix)->GetInfo(NAME_LAST)
953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen              << (*ix)->guid()
963f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen              << " so associating with node id " << node.GetId();
97201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      const sync_pb::AutofillProfileSpecifics& autofill(
98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          node.GetAutofillProfileSpecifics());
99201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      if (OverwriteProfileWithServerData(*ix, autofill)) {
100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        updated_profiles->push_back(*ix);
101201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      }
102201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      Associate(&guid, node.GetId());
103201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      current_profiles->insert(guid);
104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    } else {
105201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      MakeNewAutofillProfileSyncNodeIfNeeded(write_trans,
106201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          autofill_root,
107201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          (**ix),
108201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          new_profiles,
109201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          current_profiles,
110201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          profiles_to_delete);
111201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
112201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
11321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return true;
11421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
115201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool AutofillProfileModelAssociator::GetSyncIdForTaggedNode(
11721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const std::string& tag,
11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    int64* sync_id) {
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  sync_api::ReadTransaction trans(sync_service_->GetUserShare());
12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  sync_api::ReadNode sync_node(&trans);
12121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (!sync_node.InitByTagLookup(tag.c_str()))
12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return false;
12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  *sync_id = sync_node.GetId();
124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
126201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
127201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::LoadAutofillData(
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::vector<AutofillProfile*>* profiles) {
129201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (IsAbortPending())
130201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!web_database_->GetAutofillTable()->GetAutofillProfiles(profiles))
133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
134201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
135201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
136201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
137201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
138201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::AssociateModels() {
139201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  VLOG(1) << "Associating Autofill Models";
140201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
141201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  {
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    base::AutoLock lock(abort_association_pending_lock_);
143201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    abort_association_pending_ = false;
144201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
145201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ScopedVector<AutofillProfile> profiles;
147201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!LoadAutofillData(&profiles.get())) {
149201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    LOG(ERROR) << "Could not get the autofill data from WebDatabase.";
150201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
151201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
152201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  VLOG(1) << "[AUTOFILL MIGRATION]"
1543f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << " Now associating to the new autofill profile model associator"
1553f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << " root node";
156201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DataBundle bundle;
157201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  {
158201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // The write transaction lock is held inside this block.
159201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // We do all the web db operations outside this block.
16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    sync_api::WriteTransaction trans(sync_service_->GetUserShare());
161201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
162201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::ReadNode autofill_root(&trans);
163201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!autofill_root.InitByTagLookup(kAutofillProfileTag)) {
164201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      LOG(ERROR) << "Server did not create the top-level autofill node. We "
165201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                 << "might be running against an out-of-date server.";
166201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
167201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
168201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!TraverseAndAssociateChromeAutofillProfiles(&trans, autofill_root,
170201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            profiles.get(), &bundle.current_profiles,
171201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            &bundle.updated_profiles,
172201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            &bundle.new_profiles,
173201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            &bundle.profiles_to_delete) ||
174201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        !TraverseAndAssociateAllSyncNodes(&trans, autofill_root, &bundle)) {
175201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
176201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
177201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
178201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
179201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!SaveChangesToWebData(bundle)) {
180201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    LOG(ERROR) << "Failed to update autofill entries.";
181201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
182201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
183201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (sync_service_->GetAutofillMigrationState() !=
18521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen     syncable::MIGRATED) {
18621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    syncable::AutofillMigrationDebugInfo debug_info;
18721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    debug_info.autofill_profile_added_during_migration =
18821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        number_of_profiles_created_;
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    sync_service_->SetAutofillMigrationDebugInfo(
19021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        syncable::AutofillMigrationDebugInfo::PROFILES_ADDED,
19121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        debug_info);
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    sync_service_->SetAutofillMigrationState(
19321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        syncable::MIGRATED);
19421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
19521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
19621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
19721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      new DoOptimisticRefreshForAutofill(personal_data_));
198201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
199201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
200201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
201201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::DisassociateModels() {
202dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
203201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  id_map_.clear();
204201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  id_map_inverse_.clear();
205201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
206201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
207201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
208201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Helper to compare the local value and cloud value of a field, merge into
209201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// the local value if they differ, and return whether the merge happened.
210201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::MergeField(FormGroup* f,
211dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AutofillFieldType t,
212201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const std::string& specifics_field) {
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (UTF16ToUTF8(f->GetInfo(t)) == specifics_field)
214201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  f->SetInfo(t, UTF8ToUTF16(specifics_field));
216201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
217201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
218201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::SyncModelHasUserCreatedNodes(
219201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    bool *has_nodes) {
220201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  CHECK_NE(has_nodes, reinterpret_cast<bool*>(NULL));
22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  sync_api::ReadTransaction trans(sync_service_->GetUserShare());
222201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
223201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  sync_api::ReadNode node(&trans);
224201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
22521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (!node.InitByTagLookup(kAutofillProfileTag)) {
226201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    LOG(ERROR) << "Sever did not create a top level node"
227201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch               << "Out of data server or autofill type not enabled";
228201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
229201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
230201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
231201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  *has_nodes = sync_api::kInvalidId != node.GetFirstChildId();
232201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
233201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
234201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// static
235201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::OverwriteProfileWithServerData(
236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutofillProfile* merge_into,
237201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_pb::AutofillProfileSpecifics& specifics) {
238201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool diff = false;
239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutofillProfile* p = merge_into;
240201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  const sync_pb::AutofillProfileSpecifics& s(specifics);
241201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, NAME_FIRST, s.name_first()) || diff;
242201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, NAME_LAST, s.name_last()) || diff;
243201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, NAME_MIDDLE, s.name_middle()) || diff;
244201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_LINE1, s.address_home_line1()) || diff;
245201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_LINE2, s.address_home_line2()) || diff;
246201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_CITY, s.address_home_city()) || diff;
247201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_STATE, s.address_home_state()) || diff;
248201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_COUNTRY, s.address_home_country()) || diff;
249201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, ADDRESS_HOME_ZIP, s.address_home_zip()) || diff;
250201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, EMAIL_ADDRESS, s.email_address()) || diff;
251201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, COMPANY_NAME, s.company_name()) || diff;
252201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, PHONE_FAX_WHOLE_NUMBER, s.phone_fax_whole_number())
253201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      || diff;
254201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  diff = MergeField(p, PHONE_HOME_WHOLE_NUMBER, s.phone_home_whole_number())
255201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      || diff;
256201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return diff;
257201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
258201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
259201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
260201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochint64 AutofillProfileModelAssociator::FindSyncNodeWithProfile(
261201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::WriteTransaction* trans,
262201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_api::BaseNode& autofill_root,
263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const AutofillProfile& profile_from_db,
2643f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    std::set<std::string>* current_profiles) {
265201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int64 sync_child_id = autofill_root.GetFirstChildId();
266201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  while (sync_child_id != sync_api::kInvalidId) {
267201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    ReadNode read_node(trans);
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutofillProfile p;
26921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (!read_node.InitByIdLookup(sync_child_id)) {
270201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      LOG(ERROR) << "unable to find the id given by getfirst child " <<
271201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        sync_child_id;
272201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return sync_api::kInvalidId;
273201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
274201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_pb::AutofillProfileSpecifics& autofill_specifics(
275201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        read_node.GetAutofillProfileSpecifics());
2763f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    // This find should be fast as the set uses tree.
2783f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    if (current_profiles->find(autofill_specifics.guid())
2793f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen        == current_profiles->end()) {
2803f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      OverwriteProfileWithServerData(&p, autofill_specifics);
2813f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      if (p.Compare(profile_from_db) == 0) {
2823f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen        return sync_child_id;
2833f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      }
284201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
285201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_child_id = read_node.GetSuccessorId();
286201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
287201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
288201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return sync_api::kInvalidId;
289201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
290201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::MakeNewAutofillProfileSyncNodeIfNeeded(
291201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::WriteTransaction* trans,
292201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_api::BaseNode& autofill_root,
293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const AutofillProfile& profile,
294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::vector<AutofillProfile*>* new_profiles,
295201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::set<std::string>* current_profiles,
296201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::vector<std::string>* profiles_to_delete) {
297201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
2983f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  int64 sync_node_id = FindSyncNodeWithProfile(trans,
2993f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      autofill_root,
3003f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      profile,
3013f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      current_profiles);
302201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (sync_node_id != sync_api::kInvalidId) {
303201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // In case of duplicates throw away the local profile and apply the
304201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // server profile.(The only difference between the 2 profiles are the guids)
305201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    profiles_to_delete->push_back(profile.guid());
306201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::ReadNode read_node(trans);
307201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!read_node.InitByIdLookup(sync_node_id)) {
308201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      LOG(ERROR);
309201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
310201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
311201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_pb::AutofillProfileSpecifics& autofill_specifics(
312201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        read_node.GetAutofillProfileSpecifics());
313dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (guid::IsValidGUID(autofill_specifics.guid()) == false) {
314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      NOTREACHED() << "Guid in the web db is invalid " <<
315dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          autofill_specifics.guid();
316dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return false;
317dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutofillProfile* p = new AutofillProfile(autofill_specifics.guid());
319201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    OverwriteProfileWithServerData(p, autofill_specifics);
320201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    new_profiles->push_back(p);
321201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::string guid = autofill_specifics.guid();
322201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    Associate(&guid, sync_node_id);
323201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    current_profiles->insert(autofill_specifics.guid());
324dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    VLOG(2) << "[AUTOFILL MIGRATION]"
3253f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << "Found in sync db but with a different guid: "
326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            << UTF16ToUTF8(profile.GetInfo(NAME_FIRST))
327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            << UTF16ToUTF8(profile.GetInfo(NAME_LAST))
3283f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << "New guid " << autofill_specifics.guid() << " sync node id "
3293f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << sync_node_id << " so associating. Profile to be deleted "
3303f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << profile.guid();
331201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  } else {
332201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::WriteNode node(trans);
333dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
334dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // The profile.guid() is expected to be a valid guid. The caller is expected
335dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // to pass in a valid profile object with a valid guid. Having to check in
336dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // 2 places(the caller and here) is not optimal.
337201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!node.InitUniqueByCreation(
338201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch             syncable::AUTOFILL_PROFILE, autofill_root, profile.guid())) {
339201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      LOG(ERROR) << "Failed to create autofill sync node.";
340201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
341201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
342201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    node.SetTitle(UTF8ToWide(profile.guid()));
343dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    VLOG(2) << "[AUTOFILL MIGRATION]"
3443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << "NOT Found in sync db  "
345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            << UTF16ToUTF8(profile.GetInfo(NAME_FIRST))
346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            << UTF16ToUTF8(profile.GetInfo(NAME_LAST))
3473f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << profile.guid()
3483f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << " so creating a new sync node. Sync node id "
3493f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << node.GetId();
35021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    AutofillProfileChangeProcessor::WriteAutofillProfile(profile, &node);
35121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    current_profiles->insert(profile.guid());
3523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    std::string guid = profile.guid();
3533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    Associate(&guid, node.GetId());
35421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    number_of_profiles_created_++;
355201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
356201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
357201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
358201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
359201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::TraverseAndAssociateAllSyncNodes(
360201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_api::WriteTransaction* write_trans,
361201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_api::ReadNode& autofill_root,
362201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    DataBundle* bundle) {
363201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
3643f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  VLOG(1) << "[AUTOFILL MIGRATION] "
3653f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << " Iterating over sync nodes of autofill profile root node";
366201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
367201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int64 sync_child_id = autofill_root.GetFirstChildId();
368201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  while (sync_child_id != sync_api::kInvalidId) {
369201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    ReadNode sync_child(write_trans);
370201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!sync_child.InitByIdLookup(sync_child_id)) {
371201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      LOG(ERROR) << "Failed to fetch child node.";
372201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
373201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
374201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_pb::AutofillProfileSpecifics& autofill(
375201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        sync_child.GetAutofillProfileSpecifics());
376201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
377201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AddNativeProfileIfNeeded(autofill, bundle, sync_child);
378201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
379201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    sync_child_id = sync_child.GetSuccessorId();
380201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
381201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
382201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
383201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
384201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::AddNativeProfileIfNeeded(
385201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_pb::AutofillProfileSpecifics& profile,
386201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    DataBundle* bundle,
387201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const sync_api::ReadNode& node) {
388201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
389201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
390dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  VLOG(2) << "[AUTOFILL MIGRATION] "
3913f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << "Trying to lookup "
3923f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << profile.name_first()
3933f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << " "
3943f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << profile.name_last()
3953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << "sync node id " << node.GetId()
3963f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << " Guid " << profile.guid()
3973f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen          << " in the web db";
3983f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
399dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (guid::IsValidGUID(profile.guid()) == false) {
400dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(false) << "Guid in the sync db is invalid " << profile.guid();
401dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
402dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
403dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
404201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (bundle->current_profiles.find(profile.guid()) ==
405201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      bundle->current_profiles.end()) {
406201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::string guid(profile.guid());
407201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    Associate(&guid, node.GetId());
408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AutofillProfile* p = new AutofillProfile(profile.guid());
409201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    OverwriteProfileWithServerData(p, profile);
410201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    bundle->new_profiles.push_back(p);
411dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    VLOG(2) << "[AUTOFILL MIGRATION] "
4123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << " Did not find one so creating it on web db";
41321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else {
414dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    VLOG(2) << "[AUTOFILL MIGRATION] "
4153f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            << " Found it on web db. Moving on ";
416201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
417201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
418201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
419201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::SaveChangesToWebData(
420201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const DataBundle& bundle) {
421201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
422201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
423201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (IsAbortPending())
424201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
425201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
426201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (size_t i = 0; i < bundle.new_profiles.size(); i++) {
427201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (IsAbortPending())
428201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!web_database_->GetAutofillTable()->AddAutofillProfile(
430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        *bundle.new_profiles[i]))
431201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
432201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
433201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
434201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (size_t i = 0; i < bundle.updated_profiles.size(); i++) {
435201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (IsAbortPending())
436201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!web_database_->GetAutofillTable()->UpdateAutofillProfile(
438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        *bundle.updated_profiles[i]))
439201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
440201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
441201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
442201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (size_t i = 0; i< bundle.profiles_to_delete.size(); ++i) {
443201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (IsAbortPending())
444201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!web_database_->GetAutofillTable()->RemoveAutofillProfile(
446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        bundle.profiles_to_delete[i]))
447201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
448201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
449201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
450201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
451201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
45221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool AutofillProfileModelAssociator::InitSyncNodeFromChromeId(
45321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const std::string& node_id,
45421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    sync_api::BaseNode* sync_node) {
45521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return false;
45621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
45721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
458201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::Associate(
459201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const std::string* autofill,
460201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    int64 sync_id) {
461201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
462201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK_NE(sync_api::kInvalidId, sync_id);
463201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(id_map_.find(*autofill) == id_map_.end());
464201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(id_map_inverse_.find(sync_id) == id_map_inverse_.end());
465201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  id_map_[*autofill] = sync_id;
466201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  id_map_inverse_[sync_id] = *autofill;
467201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
468201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
469201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::Disassociate(int64 sync_id) {
470201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
471201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  SyncIdToAutofillMap::iterator iter = id_map_inverse_.find(sync_id);
472201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (iter == id_map_inverse_.end())
473201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
474201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  CHECK(id_map_.erase(iter->second));
475201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  id_map_inverse_.erase(iter);
476201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
477201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
478201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochint64 AutofillProfileModelAssociator::GetSyncIdFromChromeId(
47921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const std::string& autofill) {
480201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  AutofillToSyncIdMap::const_iterator iter = id_map_.find(autofill);
481201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return iter == id_map_.end() ? sync_api::kInvalidId : iter->second;
482201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
483201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
484201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::AbortAssociation() {
485201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
48672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::AutoLock lock(abort_association_pending_lock_);
487201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  abort_association_pending_ = true;
488201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
489201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
49021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst std::string* AutofillProfileModelAssociator::GetChromeNodeFromSyncId(
49121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    int64 sync_id) {
49221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  SyncIdToAutofillMap::const_iterator iter = id_map_inverse_.find(sync_id);
49321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return iter == id_map_inverse_.end() ? NULL : &(iter->second);
49421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
49521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
496201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::IsAbortPending() {
49772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::AutoLock lock(abort_association_pending_lock_);
498201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return abort_association_pending_;
499201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
500201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
50172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenAutofillProfileModelAssociator::DataBundle::DataBundle() {}
50272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
50372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenAutofillProfileModelAssociator::DataBundle::~DataBundle() {
50472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  STLDeleteElements(&new_profiles);
50572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
50672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
507ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillProfileModelAssociator::CryptoReadyIfNecessary() {
508ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // We only access the cryptographer while holding a transaction.
509ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  sync_api::ReadTransaction trans(sync_service_->GetUserShare());
510ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  syncable::ModelTypeSet encrypted_types;
511ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  sync_service_->GetEncryptedDataTypes(&encrypted_types);
512ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return encrypted_types.count(syncable::AUTOFILL_PROFILE) == 0 ||
513ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         sync_service_->IsCryptographerReady(&trans);
514ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
51572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
516201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}  // namespace browser_sync
517201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
518