// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_SYNC_GLUE_AUTOFILL_CHANGE_PROCESSOR_H_ #define CHROME_BROWSER_SYNC_GLUE_AUTOFILL_CHANGE_PROCESSOR_H_ #pragma once #include <vector> #include "chrome/browser/autofill/autofill_profile.h" #include "chrome/browser/autofill/credit_card.h" #include "chrome/browser/autofill/personal_data_manager.h" #include "chrome/browser/sync/engine/syncapi.h" #include "chrome/browser/sync/glue/change_processor.h" #include "chrome/browser/sync/glue/sync_backend_host.h" #include "chrome/browser/sync/protocol/autofill_specifics.pb.h" #include "chrome/browser/webdata/web_data_service.h" #include "content/common/notification_observer.h" #include "content/common/notification_registrar.h" class AutofillCreditCardChange; class AutofillEntry; class AutofillProfileChange; class PersonalDataManager; class WebDatabase; namespace browser_sync { class AutofillModelAssociator; class UnrecoverableErrorHandler; // This class is responsible for taking changes from the web data service and // applying them to the sync_api 'syncable' model, and vice versa. All // operations and use of this class are from the DB thread. class AutofillChangeProcessor : public ChangeProcessor, public NotificationObserver { public: AutofillChangeProcessor(AutofillModelAssociator* model_associator, WebDatabase* web_database, PersonalDataManager* personal_data, UnrecoverableErrorHandler* error_handler); virtual ~AutofillChangeProcessor(); // NotificationObserver implementation. // WebDataService -> sync_api model change application. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); // sync_api model -> WebDataService change application. virtual void ApplyChangesFromSyncModel( const sync_api::BaseTransaction* trans, const sync_api::SyncManager::ChangeRecord* changes, int change_count); // Commit any changes from ApplyChangesFromSyncModel buffered in // autofill_changes_. virtual void CommitChangesFromSyncModel(); // Copy the properties of the given Autofill entry into the sync // node. static void WriteAutofillEntry(const AutofillEntry& entry, sync_api::WriteNode* node); // TODO(georgey) : add the same processing for CC info (already in protocol // buffers). protected: virtual void StartImpl(Profile* profile); virtual void StopImpl(); private: void StartObserving(); void StopObserving(); // A function to remove the sync node for an autofill entry or profile. void RemoveSyncNode(const std::string& tag, sync_api::WriteTransaction* trans); // These two methods are dispatched to by Observe depending on the type. void ObserveAutofillEntriesChanged(AutofillChangeList* changes, sync_api::WriteTransaction* trans, const sync_api::ReadNode& autofill_root); void ObserveAutofillProfileChanged(AutofillProfileChange* change, sync_api::WriteTransaction* trans, const sync_api::ReadNode& autofill_root); // The following methods are the implementation of ApplyChangeFromSyncModel // for the respective autofill subtypes. void ApplySyncAutofillEntryChange( sync_api::SyncManager::ChangeRecord::Action action, const sync_pb::AutofillSpecifics& autofill, std::vector<AutofillEntry>* new_entries, int64 sync_id); void ApplySyncAutofillProfileChange( sync_api::SyncManager::ChangeRecord::Action action, const sync_pb::AutofillProfileSpecifics& profile, int64 sync_id); // Delete is a special case of change application. void ApplySyncAutofillEntryDelete( const sync_pb::AutofillSpecifics& autofill); void ApplySyncAutofillProfileDelete( int64 sync_id); // Helper to post a task to the UI loop to inform the PersonalDataManager // it needs to refresh itself. void PostOptimisticRefreshTask(); // Called to see if we need to upgrade to the new autofill2 profile. bool HasNotMigratedYet(const sync_api::BaseTransaction* trans); // The two models should be associated according to this ModelAssociator. AutofillModelAssociator* model_associator_; // The model we are processing changes from. This is owned by the // WebDataService which is kept alive by our data type controller // holding a reference. WebDatabase* web_database_; // We periodically tell the PersonalDataManager to refresh as we make // changes to the autofill data in the WebDatabase. PersonalDataManager* personal_data_; NotificationRegistrar notification_registrar_; bool observing_; // Record of changes from ApplyChangesFromSyncModel. These are then processed // in CommitChangesFromSyncModel. struct AutofillChangeRecord; std::vector<AutofillChangeRecord> autofill_changes_; DISALLOW_COPY_AND_ASSIGN(AutofillChangeProcessor); }; } // namespace browser_sync #endif // CHROME_BROWSER_SYNC_GLUE_AUTOFILL_CHANGE_PROCESSOR_H_