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