1 // Copyright 2014 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 COMPONENTS_INVALIDATION_TICL_INVALIDATION_SERVICE_H_ 6 #define COMPONENTS_INVALIDATION_TICL_INVALIDATION_SERVICE_H_ 7 8 #include <string> 9 10 #include "base/compiler_specific.h" 11 #include "base/macros.h" 12 #include "base/memory/ref_counted.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "base/threading/non_thread_safe.h" 15 #include "base/timer/timer.h" 16 #include "base/values.h" 17 #include "components/invalidation/invalidation_logger.h" 18 #include "components/invalidation/invalidation_service.h" 19 #include "components/invalidation/invalidator_registrar.h" 20 #include "components/invalidation/ticl_settings_provider.h" 21 #include "components/keyed_service/core/keyed_service.h" 22 #include "google_apis/gaia/identity_provider.h" 23 #include "google_apis/gaia/oauth2_token_service.h" 24 #include "net/base/backoff_entry.h" 25 #include "sync/notifier/invalidation_handler.h" 26 27 namespace gcm { 28 class GCMDriver; 29 } 30 31 namespace net { 32 class URLRequestContextGetter; 33 } 34 35 namespace syncer { 36 class InvalidationStateTracker; 37 class Invalidator; 38 } 39 40 namespace invalidation { 41 class GCMInvalidationBridge; 42 43 // This InvalidationService wraps the C++ Invalidation Client (TICL) library. 44 // It provides invalidations for desktop platforms (Win, Mac, Linux). 45 class TiclInvalidationService : public base::NonThreadSafe, 46 public InvalidationService, 47 public OAuth2TokenService::Consumer, 48 public OAuth2TokenService::Observer, 49 public IdentityProvider::Observer, 50 public TiclSettingsProvider::Observer, 51 public syncer::InvalidationHandler { 52 public: 53 enum InvalidationNetworkChannel { 54 PUSH_CLIENT_CHANNEL = 0, 55 GCM_NETWORK_CHANNEL = 1, 56 57 // This enum is used in UMA_HISTOGRAM_ENUMERATION. Insert new values above 58 // this line. 59 NETWORK_CHANNELS_COUNT = 2 60 }; 61 62 TiclInvalidationService( 63 const std::string& user_agent, 64 scoped_ptr<IdentityProvider> identity_provider, 65 scoped_ptr<TiclSettingsProvider> settings_provider, 66 gcm::GCMDriver* gcm_driver, 67 const scoped_refptr<net::URLRequestContextGetter>& request_context); 68 virtual ~TiclInvalidationService(); 69 70 void Init( 71 scoped_ptr<syncer::InvalidationStateTracker> invalidation_state_tracker); 72 73 // InvalidationService implementation. 74 // It is an error to have registered handlers when the service is destroyed. 75 virtual void RegisterInvalidationHandler( 76 syncer::InvalidationHandler* handler) OVERRIDE; 77 virtual void UpdateRegisteredInvalidationIds( 78 syncer::InvalidationHandler* handler, 79 const syncer::ObjectIdSet& ids) OVERRIDE; 80 virtual void UnregisterInvalidationHandler( 81 syncer::InvalidationHandler* handler) OVERRIDE; 82 virtual syncer::InvalidatorState GetInvalidatorState() const OVERRIDE; 83 virtual std::string GetInvalidatorClientId() const OVERRIDE; 84 virtual InvalidationLogger* GetInvalidationLogger() OVERRIDE; 85 virtual void RequestDetailedStatus( 86 base::Callback<void(const base::DictionaryValue&)> caller) const OVERRIDE; 87 virtual IdentityProvider* GetIdentityProvider() OVERRIDE; 88 89 void RequestAccessToken(); 90 91 // OAuth2TokenService::Consumer implementation 92 virtual void OnGetTokenSuccess( 93 const OAuth2TokenService::Request* request, 94 const std::string& access_token, 95 const base::Time& expiration_time) OVERRIDE; 96 virtual void OnGetTokenFailure( 97 const OAuth2TokenService::Request* request, 98 const GoogleServiceAuthError& error) OVERRIDE; 99 100 // OAuth2TokenService::Observer implementation 101 virtual void OnRefreshTokenAvailable(const std::string& account_id) OVERRIDE; 102 virtual void OnRefreshTokenRevoked(const std::string& account_id) OVERRIDE; 103 104 // IdentityProvider::Observer implementation. 105 virtual void OnActiveAccountLogout() OVERRIDE; 106 107 // TiclSettingsProvider::Observer implementation. 108 virtual void OnUseGCMChannelChanged() OVERRIDE; 109 110 // syncer::InvalidationHandler implementation. 111 virtual void OnInvalidatorStateChange( 112 syncer::InvalidatorState state) OVERRIDE; 113 virtual void OnIncomingInvalidation( 114 const syncer::ObjectIdInvalidationMap& invalidation_map) OVERRIDE; 115 virtual std::string GetOwnerName() const OVERRIDE; 116 117 protected: 118 // Initializes with an injected invalidator. 119 void InitForTest( 120 scoped_ptr<syncer::InvalidationStateTracker> invalidation_state_tracker, 121 syncer::Invalidator* invalidator); 122 123 private: 124 friend class TiclInvalidationServiceTestDelegate; 125 friend class TiclProfileSettingsProviderTest; 126 127 bool IsReadyToStart(); 128 bool IsStarted() const; 129 130 void StartInvalidator(InvalidationNetworkChannel network_channel); 131 void UpdateInvalidationNetworkChannel(); 132 void UpdateInvalidatorCredentials(); 133 void StopInvalidator(); 134 135 const std::string user_agent_; 136 137 scoped_ptr<IdentityProvider> identity_provider_; 138 scoped_ptr<TiclSettingsProvider> settings_provider_; 139 140 scoped_ptr<syncer::InvalidatorRegistrar> invalidator_registrar_; 141 scoped_ptr<syncer::InvalidationStateTracker> invalidation_state_tracker_; 142 scoped_ptr<syncer::Invalidator> invalidator_; 143 144 // TiclInvalidationService needs to remember access token in order to 145 // invalidate it with OAuth2TokenService. 146 std::string access_token_; 147 148 // TiclInvalidationService needs to hold reference to access_token_request_ 149 // for the duration of request in order to receive callbacks. 150 scoped_ptr<OAuth2TokenService::Request> access_token_request_; 151 base::OneShotTimer<TiclInvalidationService> request_access_token_retry_timer_; 152 net::BackoffEntry request_access_token_backoff_; 153 154 InvalidationNetworkChannel network_channel_type_; 155 gcm::GCMDriver* gcm_driver_; 156 scoped_ptr<GCMInvalidationBridge> gcm_invalidation_bridge_; 157 scoped_refptr<net::URLRequestContextGetter> request_context_; 158 159 // The invalidation logger object we use to record state changes 160 // and invalidations. 161 InvalidationLogger logger_; 162 163 // Keep a copy of the important parameters used in network channel creation 164 // for debugging. 165 base::DictionaryValue network_channel_options_; 166 167 DISALLOW_COPY_AND_ASSIGN(TiclInvalidationService); 168 }; 169 170 } // namespace invalidation 171 172 #endif // COMPONENTS_INVALIDATION_TICL_INVALIDATION_SERVICE_H_ 173