summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync/glue/autofill_change_processor2.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/sync/glue/autofill_change_processor2.h')
-rwxr-xr-xchrome/browser/sync/glue/autofill_change_processor2.h172
1 files changed, 172 insertions, 0 deletions
diff --git a/chrome/browser/sync/glue/autofill_change_processor2.h b/chrome/browser/sync/glue/autofill_change_processor2.h
new file mode 100755
index 0000000..25d7f51
--- /dev/null
+++ b/chrome/browser/sync/glue/autofill_change_processor2.h
@@ -0,0 +1,172 @@
+// Copyright (c) 2010 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_PROCESSOR2_H_
+#define CHROME_BROWSER_SYNC_GLUE_AUTOFILL_CHANGE_PROCESSOR2_H_
+#pragma once
+
+#include <string>
+#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 "chrome/common/notification_observer.h"
+#include "chrome/common/notification_registrar.h"
+
+class AutofillCreditCardChange;
+class AutofillEntry;
+class AutofillProfileChange;
+class PersonalDataManager;
+class WebDatabase;
+
+namespace browser_sync {
+
+class AutofillModelAssociator2;
+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 AutofillChangeProcessor2 : public ChangeProcessor,
+ public NotificationObserver {
+ public:
+ AutofillChangeProcessor2(AutofillModelAssociator2* model_associator,
+ WebDatabase* web_database,
+ PersonalDataManager* personal_data,
+ UnrecoverableErrorHandler* error_handler);
+ virtual ~AutofillChangeProcessor2();
+
+ // 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);
+ // As above, for autofill profiles.
+ static void WriteAutofillProfile(const AutoFillProfile& profile,
+ 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(
+ const sync_pb::AutofillProfileSpecifics& profile,
+ int64 sync_id);
+
+ // If the chrome model tries to add an AutoFillProfile with a label that
+ // is already in use, we perform a move-aside by calling-back into the chrome
+ // model and overwriting the label with a unique value we can apply for sync.
+ // This method should be called on an ADD notification from the chrome model.
+ // |tag| contains the unique sync client tag identifier for |profile|, which
+ // is derived from the profile label using ProfileLabelToTag.
+ // |existing_unique_label| is the current label of the object, if any; this
+ // is an allowed value, because it's taken by the item in question.
+ // For new items, set |existing_unique_label| to the empty string.
+ void ChangeProfileLabelIfAlreadyTaken(
+ sync_api::BaseTransaction* trans,
+ const string16& existing_unique_label,
+ AutoFillProfile* profile,
+ std::string* tag);
+
+ // Reassign the label of the profile, write this back to the web database,
+ // and update |tag| with the tag corresponding to the new label.
+ void OverrideProfileLabel(
+ const string16& new_label,
+ AutoFillProfile* profile_to_update,
+ std::string* tag_to_update);
+
+ // Helper to create a sync node with tag |tag|, storing |profile| as
+ // the node's AutofillSpecifics.
+ void AddAutofillProfileSyncNode(
+ sync_api::WriteTransaction* trans,
+ const sync_api::BaseNode& autofill,
+ const std::string& tag,
+ const AutoFillProfile* profile);
+
+ // Helper to post a task to the UI loop to inform the PersonalDataManager
+ // it needs to refresh itself.
+ void PostOptimisticRefreshTask();
+
+ // The two models should be associated according to this ModelAssociator.
+ AutofillModelAssociator2* 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(AutofillChangeProcessor2);
+};
+
+} // namespace browser_sync
+
+#endif // CHROME_BROWSER_SYNC_GLUE_AUTOFILL_CHANGE_PROCESSOR2_H_
+