1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_BROWSER_SYNC_GLUE_TYPED_URL_CHANGE_PROCESSOR_H_ 6#define CHROME_BROWSER_SYNC_GLUE_TYPED_URL_CHANGE_PROCESSOR_H_ 7#pragma once 8 9#include "chrome/browser/sync/glue/change_processor.h" 10 11#include "base/basictypes.h" 12#include "base/memory/scoped_ptr.h" 13#include "base/time.h" 14#include "chrome/browser/sync/glue/sync_backend_host.h" 15#include "content/common/notification_observer.h" 16#include "content/common/notification_registrar.h" 17#include "content/common/notification_type.h" 18 19class MessageLoop; 20class NotificationService; 21 22namespace history { 23class HistoryBackend; 24struct URLsDeletedDetails; 25struct URLsModifiedDetails; 26struct URLVisitedDetails; 27class URLRow; 28}; 29 30namespace browser_sync { 31 32class TypedUrlModelAssociator; 33class UnrecoverableErrorHandler; 34 35// This class is responsible for taking changes from the history backend and 36// applying them to the sync_api 'syncable' model, and vice versa. All 37// operations and use of this class are from the UI thread. 38class TypedUrlChangeProcessor : public ChangeProcessor, 39 public NotificationObserver { 40 public: 41 TypedUrlChangeProcessor(TypedUrlModelAssociator* model_associator, 42 history::HistoryBackend* history_backend, 43 UnrecoverableErrorHandler* error_handler); 44 virtual ~TypedUrlChangeProcessor(); 45 46 // NotificationObserver implementation. 47 // History -> sync_api model change application. 48 virtual void Observe(NotificationType type, 49 const NotificationSource& source, 50 const NotificationDetails& details); 51 52 // sync_api model -> WebDataService change application. 53 virtual void ApplyChangesFromSyncModel( 54 const sync_api::BaseTransaction* trans, 55 const sync_api::SyncManager::ChangeRecord* changes, 56 int change_count); 57 58 protected: 59 virtual void StartImpl(Profile* profile); 60 virtual void StopImpl(); 61 62 private: 63 void StartObserving(); 64 void StopObserving(); 65 66 void HandleURLsModified(history::URLsModifiedDetails* details); 67 void HandleURLsDeleted(history::URLsDeletedDetails* details); 68 void HandleURLsVisited(history::URLVisitedDetails* details); 69 70 // The two models should be associated according to this ModelAssociator. 71 TypedUrlModelAssociator* model_associator_; 72 73 // The model we are processing changes from. This is owned by the 74 // WebDataService which is kept alive by our data type controller 75 // holding a reference. 76 history::HistoryBackend* history_backend_; 77 78 NotificationRegistrar notification_registrar_; 79 80 bool observing_; 81 82 MessageLoop* expected_loop_; 83 84 scoped_ptr<NotificationService> notification_service_; 85 86 DISALLOW_COPY_AND_ASSIGN(TypedUrlChangeProcessor); 87}; 88 89} // namespace browser_sync 90 91#endif // CHROME_BROWSER_SYNC_GLUE_TYPED_URL_CHANGE_PROCESSOR_H_ 92