chrome_invalidation_client.h revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
1// Copyright (c) 2010 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// A simple wrapper around invalidation::InvalidationClient that
6// handles all the startup/shutdown details and hookups.
7
8#ifndef CHROME_BROWSER_SYNC_NOTIFIER_CHROME_INVALIDATION_CLIENT_H_
9#define CHROME_BROWSER_SYNC_NOTIFIER_CHROME_INVALIDATION_CLIENT_H_
10#pragma once
11
12#include <string>
13
14#include "base/basictypes.h"
15#include "base/scoped_callback_factory.h"
16#include "base/scoped_ptr.h"
17#include "base/threading/non_thread_safe.h"
18#include "base/weak_ptr.h"
19#include "chrome/browser/sync/notifier/chrome_system_resources.h"
20#include "chrome/browser/sync/notifier/state_writer.h"
21#include "chrome/browser/sync/syncable/model_type.h"
22#include "google/cacheinvalidation/invalidation-client.h"
23
24namespace talk_base {
25class Task;
26}  // namespace
27
28namespace sync_notifier {
29
30class CacheInvalidationPacketHandler;
31class RegistrationManager;
32
33// TODO(akalin): Hook this up to a NetworkChangeNotifier so we can
34// properly notify invalidation_client_.
35
36class ChromeInvalidationClient
37    : public invalidation::InvalidationListener,
38      public StateWriter {
39 public:
40  class Listener {
41   public:
42    virtual ~Listener();
43
44    virtual void OnInvalidate(syncable::ModelType model_type,
45                              const std::string& payload) = 0;
46
47    virtual void OnInvalidateAll() = 0;
48  };
49
50  ChromeInvalidationClient();
51
52  // Calls Stop().
53  virtual ~ChromeInvalidationClient();
54
55  // Does not take ownership of |listener| or |state_writer|.
56  // |base_task| must still be non-NULL.
57  void Start(
58      const std::string& client_id, const std::string& client_info,
59      const std::string& state, Listener* listener,
60      StateWriter* state_writer, base::WeakPtr<talk_base::Task> base_task);
61
62  void Stop();
63
64  // Changes the task used to |base_task|, which must still be
65  // non-NULL.  Must only be called between calls to Start() and
66  // Stop().
67  void ChangeBaseTask(base::WeakPtr<talk_base::Task> base_task);
68
69  // Register the sync types that we're interested in getting
70  // notifications for.  Must only be called between calls to Start()
71  // and Stop().
72  void RegisterTypes();
73
74  // invalidation::InvalidationListener implementation.
75  //
76  // TODO(akalin): Move these into a private inner class.
77
78  virtual void Invalidate(const invalidation::Invalidation& invalidation,
79                          invalidation::Closure* callback);
80
81  virtual void InvalidateAll(invalidation::Closure* callback);
82
83  virtual void RegistrationStateChanged(
84      const invalidation::ObjectId& object_id,
85      invalidation::RegistrationState new_state,
86      const invalidation::UnknownHint& unknown_hint);
87
88  virtual void AllRegistrationsLost(invalidation::Closure* callback);
89
90  virtual void RegistrationLost(const invalidation::ObjectId& object_id,
91                                invalidation::Closure* callback);
92
93  // StateWriter implementation.
94  virtual void WriteState(const std::string& state);
95
96 private:
97  friend class ChromeInvalidationClientTest;
98
99  // Should only be called between calls to Start() and Stop().
100  void HandleOutboundPacket(
101      invalidation::NetworkEndpoint* const& network_endpoint);
102
103  base::NonThreadSafe non_thread_safe_;
104  ChromeSystemResources chrome_system_resources_;
105  base::ScopedCallbackFactory<ChromeInvalidationClient>
106      scoped_callback_factory_;
107  scoped_ptr<invalidation::NetworkCallback> handle_outbound_packet_callback_;
108  Listener* listener_;
109  StateWriter* state_writer_;
110  scoped_ptr<invalidation::InvalidationClient> invalidation_client_;
111  scoped_ptr<CacheInvalidationPacketHandler>
112      cache_invalidation_packet_handler_;
113  scoped_ptr<RegistrationManager> registration_manager_;
114
115  DISALLOW_COPY_AND_ASSIGN(ChromeInvalidationClient);
116};
117
118}  // namespace sync_notifier
119
120#endif  // CHROME_BROWSER_SYNC_NOTIFIER_CHROME_INVALIDATION_CLIENT_H_
121