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