1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// found in the LICENSE file.
4a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef COMPONENTS_INVALIDATION_TICL_INVALIDATION_SERVICE_H_
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define COMPONENTS_INVALIDATION_TICL_INVALIDATION_SERVICE_H_
7a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <string>
923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/compiler_specific.h"
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/macros.h"
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/memory/ref_counted.h"
13a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
14a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/threading/non_thread_safe.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/values.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/invalidation_handler.h"
180de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "components/invalidation/invalidation_logger.h"
190de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "components/invalidation/invalidation_service.h"
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/invalidator_registrar.h"
210de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "components/invalidation/ticl_settings_provider.h"
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h"
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "google_apis/gaia/identity_provider.h"
24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "google_apis/gaia/oauth2_token_service.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/backoff_entry.h"
26a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace gcm {
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class GCMDriver;
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
30a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace net {
320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass URLRequestContextGetter;
330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
35a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace syncer {
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass InvalidationStateTracker;
37a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class Invalidator;
38a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
39a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
40a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace invalidation {
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class GCMInvalidationBridge;
42a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
43a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// This InvalidationService wraps the C++ Invalidation Client (TICL) library.
44a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// It provides invalidations for desktop platforms (Win, Mac, Linux).
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class TiclInvalidationService : public base::NonThreadSafe,
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                public InvalidationService,
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                public OAuth2TokenService::Consumer,
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                public OAuth2TokenService::Observer,
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                public IdentityProvider::Observer,
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                public TiclSettingsProvider::Observer,
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                public syncer::InvalidationHandler {
52a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) public:
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enum InvalidationNetworkChannel {
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    PUSH_CLIENT_CHANNEL = 0,
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    GCM_NETWORK_CHANNEL = 1,
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // This enum is used in UMA_HISTOGRAM_ENUMERATION. Insert new values above
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // this line.
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    NETWORK_CHANNELS_COUNT = 2
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  };
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TiclInvalidationService(
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const std::string& user_agent,
640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      scoped_ptr<IdentityProvider> identity_provider,
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      scoped_ptr<TiclSettingsProvider> settings_provider,
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gcm::GCMDriver* gcm_driver,
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const scoped_refptr<net::URLRequestContextGetter>& request_context);
68a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual ~TiclInvalidationService();
69a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void Init(
710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      scoped_ptr<syncer::InvalidationStateTracker> invalidation_state_tracker);
72a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // InvalidationService implementation.
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // It is an error to have registered handlers when the service is destroyed.
75a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void RegisterInvalidationHandler(
76a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      syncer::InvalidationHandler* handler) OVERRIDE;
77a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void UpdateRegisteredInvalidationIds(
78a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      syncer::InvalidationHandler* handler,
79a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      const syncer::ObjectIdSet& ids) OVERRIDE;
80a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void UnregisterInvalidationHandler(
81a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      syncer::InvalidationHandler* handler) OVERRIDE;
82a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual syncer::InvalidatorState GetInvalidatorState() const OVERRIDE;
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual std::string GetInvalidatorClientId() const OVERRIDE;
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual InvalidationLogger* GetInvalidationLogger() OVERRIDE;
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void RequestDetailedStatus(
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Callback<void(const base::DictionaryValue&)> caller) const OVERRIDE;
870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual IdentityProvider* GetIdentityProvider() OVERRIDE;
88a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void RequestAccessToken();
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // OAuth2TokenService::Consumer implementation
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnGetTokenSuccess(
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const OAuth2TokenService::Request* request,
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const std::string& access_token,
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const base::Time& expiration_time) OVERRIDE;
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnGetTokenFailure(
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const OAuth2TokenService::Request* request,
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const GoogleServiceAuthError& error) OVERRIDE;
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // OAuth2TokenService::Observer implementation
10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void OnRefreshTokenAvailable(const std::string& account_id) OVERRIDE;
10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void OnRefreshTokenRevoked(const std::string& account_id) OVERRIDE;
10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // IdentityProvider::Observer implementation.
1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void OnActiveAccountLogout() OVERRIDE;
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // TiclSettingsProvider::Observer implementation.
1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void OnUseGCMChannelChanged() OVERRIDE;
1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
110a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // syncer::InvalidationHandler implementation.
111a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void OnInvalidatorStateChange(
112a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      syncer::InvalidatorState state) OVERRIDE;
113a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void OnIncomingInvalidation(
114a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      const syncer::ObjectIdInvalidationMap& invalidation_map) OVERRIDE;
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual std::string GetOwnerName() const OVERRIDE;
116a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
117a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) protected:
118a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Initializes with an injected invalidator.
1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void InitForTest(
1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      scoped_ptr<syncer::InvalidationStateTracker> invalidation_state_tracker,
1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      syncer::Invalidator* invalidator);
122a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private:
124a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  friend class TiclInvalidationServiceTestDelegate;
1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  friend class TiclProfileSettingsProviderTest;
126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
127a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  bool IsReadyToStart();
128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool IsStarted() const;
129a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void StartInvalidator(InvalidationNetworkChannel network_channel);
131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void UpdateInvalidationNetworkChannel();
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void UpdateInvalidatorCredentials();
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void StopInvalidator();
134a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const std::string user_agent_;
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<IdentityProvider> identity_provider_;
1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<TiclSettingsProvider> settings_provider_;
139a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
140a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  scoped_ptr<syncer::InvalidatorRegistrar> invalidator_registrar_;
1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<syncer::InvalidationStateTracker> invalidation_state_tracker_;
142a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  scoped_ptr<syncer::Invalidator> invalidator_;
143a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // TiclInvalidationService needs to remember access token in order to
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // invalidate it with OAuth2TokenService.
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string access_token_;
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // TiclInvalidationService needs to hold reference to access_token_request_
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // for the duration of request in order to receive callbacks.
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<OAuth2TokenService::Request> access_token_request_;
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::OneShotTimer<TiclInvalidationService> request_access_token_retry_timer_;
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::BackoffEntry request_access_token_backoff_;
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  InvalidationNetworkChannel network_channel_type_;
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gcm::GCMDriver* gcm_driver_;
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<GCMInvalidationBridge> gcm_invalidation_bridge_;
1570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_refptr<net::URLRequestContextGetter> request_context_;
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The invalidation logger object we use to record state changes
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // and invalidations.
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InvalidationLogger logger_;
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Keep a copy of the important parameters used in network channel creation
16423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // for debugging.
16523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::DictionaryValue network_channel_options_;
16623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
167a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TiclInvalidationService);
168a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)};
169a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace invalidation
171a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // COMPONENTS_INVALIDATION_TICL_INVALIDATION_SERVICE_H_
173