| OLD | NEW |
| (Empty) |
| 1 // Copyright 2013 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 GOOGLE_APIS_GCM_GCM_CLIENT_IMPL_H_ | |
| 6 #define GOOGLE_APIS_GCM_GCM_CLIENT_IMPL_H_ | |
| 7 | |
| 8 #include <map> | |
| 9 #include <string> | |
| 10 #include <vector> | |
| 11 | |
| 12 #include "base/compiler_specific.h" | |
| 13 #include "base/memory/ref_counted.h" | |
| 14 #include "base/memory/weak_ptr.h" | |
| 15 #include "base/stl_util.h" | |
| 16 #include "google_apis/gcm/base/mcs_message.h" | |
| 17 #include "google_apis/gcm/engine/gcm_store.h" | |
| 18 #include "google_apis/gcm/engine/gservices_settings.h" | |
| 19 #include "google_apis/gcm/engine/mcs_client.h" | |
| 20 #include "google_apis/gcm/engine/registration_request.h" | |
| 21 #include "google_apis/gcm/engine/unregistration_request.h" | |
| 22 #include "google_apis/gcm/gcm_client.h" | |
| 23 #include "google_apis/gcm/monitoring/gcm_stats_recorder_impl.h" | |
| 24 #include "google_apis/gcm/protocol/android_checkin.pb.h" | |
| 25 #include "google_apis/gcm/protocol/checkin.pb.h" | |
| 26 #include "net/base/net_log.h" | |
| 27 #include "net/url_request/url_request_context_getter.h" | |
| 28 | |
| 29 class GURL; | |
| 30 | |
| 31 namespace base { | |
| 32 class Clock; | |
| 33 class Time; | |
| 34 } // namespace base | |
| 35 | |
| 36 namespace mcs_proto { | |
| 37 class DataMessageStanza; | |
| 38 } // namespace mcs_proto | |
| 39 | |
| 40 namespace net { | |
| 41 class HttpNetworkSession; | |
| 42 } // namespace net | |
| 43 | |
| 44 namespace gcm { | |
| 45 | |
| 46 class CheckinRequest; | |
| 47 class ConnectionFactory; | |
| 48 class GCMClientImplTest; | |
| 49 | |
| 50 // Helper class for building GCM internals. Allows tests to inject fake versions | |
| 51 // as necessary. | |
| 52 class GCM_EXPORT GCMInternalsBuilder { | |
| 53 public: | |
| 54 GCMInternalsBuilder(); | |
| 55 virtual ~GCMInternalsBuilder(); | |
| 56 | |
| 57 virtual scoped_ptr<base::Clock> BuildClock(); | |
| 58 virtual scoped_ptr<MCSClient> BuildMCSClient( | |
| 59 const std::string& version, | |
| 60 base::Clock* clock, | |
| 61 ConnectionFactory* connection_factory, | |
| 62 GCMStore* gcm_store, | |
| 63 GCMStatsRecorder* recorder); | |
| 64 virtual scoped_ptr<ConnectionFactory> BuildConnectionFactory( | |
| 65 const std::vector<GURL>& endpoints, | |
| 66 const net::BackoffEntry::Policy& backoff_policy, | |
| 67 scoped_refptr<net::HttpNetworkSession> network_session, | |
| 68 net::NetLog* net_log, | |
| 69 GCMStatsRecorder* recorder); | |
| 70 }; | |
| 71 | |
| 72 // Implements the GCM Client. It is used to coordinate MCS Client (communication | |
| 73 // with MCS) and other pieces of GCM infrastructure like Registration and | |
| 74 // Checkins. It also allows for registering user delegates that host | |
| 75 // applications that send and receive messages. | |
| 76 class GCM_EXPORT GCMClientImpl | |
| 77 : public GCMClient, public GCMStatsRecorder::Delegate { | |
| 78 public: | |
| 79 explicit GCMClientImpl(scoped_ptr<GCMInternalsBuilder> internals_builder); | |
| 80 virtual ~GCMClientImpl(); | |
| 81 | |
| 82 // Overridden from GCMClient: | |
| 83 virtual void Initialize( | |
| 84 const ChromeBuildInfo& chrome_build_info, | |
| 85 const base::FilePath& store_path, | |
| 86 const std::vector<std::string>& account_ids, | |
| 87 const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner, | |
| 88 const scoped_refptr<net::URLRequestContextGetter>& | |
| 89 url_request_context_getter, | |
| 90 scoped_ptr<Encryptor> encryptor, | |
| 91 GCMClient::Delegate* delegate) OVERRIDE; | |
| 92 virtual void Start() OVERRIDE; | |
| 93 virtual void Stop() OVERRIDE; | |
| 94 virtual void CheckOut() OVERRIDE; | |
| 95 virtual void Register(const std::string& app_id, | |
| 96 const std::vector<std::string>& sender_ids) OVERRIDE; | |
| 97 virtual void Unregister(const std::string& app_id) OVERRIDE; | |
| 98 virtual void Send(const std::string& app_id, | |
| 99 const std::string& receiver_id, | |
| 100 const OutgoingMessage& message) OVERRIDE; | |
| 101 virtual void SetRecording(bool recording) OVERRIDE; | |
| 102 virtual void ClearActivityLogs() OVERRIDE; | |
| 103 virtual GCMStatistics GetStatistics() const OVERRIDE; | |
| 104 virtual void OnActivityRecorded() OVERRIDE; | |
| 105 | |
| 106 private: | |
| 107 // State representation of the GCMClient. | |
| 108 // Any change made to this enum should have corresponding change in the | |
| 109 // GetStateString(...) function. | |
| 110 enum State { | |
| 111 // Uninitialized. | |
| 112 UNINITIALIZED, | |
| 113 // Initialized, | |
| 114 INITIALIZED, | |
| 115 // GCM store loading is in progress. | |
| 116 LOADING, | |
| 117 // Initial device checkin is in progress. | |
| 118 INITIAL_DEVICE_CHECKIN, | |
| 119 // Ready to accept requests. | |
| 120 READY, | |
| 121 }; | |
| 122 | |
| 123 // The check-in info for the user. Returned by the server. | |
| 124 struct GCM_EXPORT CheckinInfo { | |
| 125 CheckinInfo() : android_id(0), secret(0) {} | |
| 126 bool IsValid() const { return android_id != 0 && secret != 0; } | |
| 127 void Reset() { | |
| 128 android_id = 0; | |
| 129 secret = 0; | |
| 130 } | |
| 131 | |
| 132 uint64 android_id; | |
| 133 uint64 secret; | |
| 134 }; | |
| 135 | |
| 136 // Collection of pending registration requests. Keys are app IDs, while values | |
| 137 // are pending registration requests to obtain a registration ID for | |
| 138 // requesting application. | |
| 139 typedef std::map<std::string, RegistrationRequest*> | |
| 140 PendingRegistrationRequests; | |
| 141 | |
| 142 // Collection of pending unregistration requests. Keys are app IDs, while | |
| 143 // values are pending unregistration requests to disable the registration ID | |
| 144 // currently assigned to the application. | |
| 145 typedef std::map<std::string, UnregistrationRequest*> | |
| 146 PendingUnregistrationRequests; | |
| 147 | |
| 148 friend class GCMClientImplTest; | |
| 149 | |
| 150 // Returns text representation of the enum State. | |
| 151 std::string GetStateString() const; | |
| 152 | |
| 153 // Callbacks for the MCSClient. | |
| 154 // Receives messages and dispatches them to relevant user delegates. | |
| 155 void OnMessageReceivedFromMCS(const gcm::MCSMessage& message); | |
| 156 // Receives confirmation of sent messages or information about errors. | |
| 157 void OnMessageSentToMCS(int64 user_serial_number, | |
| 158 const std::string& app_id, | |
| 159 const std::string& message_id, | |
| 160 MCSClient::MessageSendStatus status); | |
| 161 // Receives information about mcs_client_ errors. | |
| 162 void OnMCSError(); | |
| 163 | |
| 164 // Runs after GCM Store load is done to trigger continuation of the | |
| 165 // initialization. | |
| 166 void OnLoadCompleted(scoped_ptr<GCMStore::LoadResult> result); | |
| 167 // Initializes mcs_client_, which handles the connection to MCS. | |
| 168 void InitializeMCSClient(scoped_ptr<GCMStore::LoadResult> result); | |
| 169 // Complets the first time device checkin. | |
| 170 void OnFirstTimeDeviceCheckinCompleted(const CheckinInfo& checkin_info); | |
| 171 // Starts a login on mcs_client_. | |
| 172 void StartMCSLogin(); | |
| 173 // Resets state to before initialization. | |
| 174 void ResetState(); | |
| 175 // Sets state to ready. This will initiate the MCS login and notify the | |
| 176 // delegates. | |
| 177 void OnReady(); | |
| 178 | |
| 179 // Starts a first time device checkin. | |
| 180 void StartCheckin(); | |
| 181 // Completes the device checkin request by parsing the |checkin_response|. | |
| 182 // Function also cleans up the pending checkin. | |
| 183 void OnCheckinCompleted( | |
| 184 const checkin_proto::AndroidCheckinResponse& checkin_response); | |
| 185 | |
| 186 // Callback passed to GCMStore::SetGServicesSettings. | |
| 187 void SetGServicesSettingsCallback(bool success); | |
| 188 | |
| 189 // Schedules next periodic device checkin and makes sure there is at most one | |
| 190 // pending checkin at a time. This function is meant to be called after a | |
| 191 // successful checkin. | |
| 192 void SchedulePeriodicCheckin(); | |
| 193 // Gets the time until next checkin. | |
| 194 base::TimeDelta GetTimeToNextCheckin() const; | |
| 195 // Callback for setting last checkin time in the |gcm_store_|. | |
| 196 void SetLastCheckinTimeCallback(bool success); | |
| 197 | |
| 198 // Callback for persisting device credentials in the |gcm_store_|. | |
| 199 void SetDeviceCredentialsCallback(bool success); | |
| 200 | |
| 201 // Callback for persisting registration info in the |gcm_store_|. | |
| 202 void UpdateRegistrationCallback(bool success); | |
| 203 | |
| 204 // Completes the registration request. | |
| 205 void OnRegisterCompleted(const std::string& app_id, | |
| 206 const std::vector<std::string>& sender_ids, | |
| 207 RegistrationRequest::Status status, | |
| 208 const std::string& registration_id); | |
| 209 | |
| 210 // Completes the unregistration request. | |
| 211 void OnUnregisterCompleted(const std::string& app_id, | |
| 212 UnregistrationRequest::Status status); | |
| 213 | |
| 214 // Completes the GCM store destroy request. | |
| 215 void OnGCMStoreDestroyed(bool success); | |
| 216 | |
| 217 // Handles incoming data message and dispatches it the delegate of this class. | |
| 218 void HandleIncomingMessage(const gcm::MCSMessage& message); | |
| 219 | |
| 220 // Fires OnMessageReceived event on the delegate of this class, based on the | |
| 221 // details in |data_message_stanza| and |message_data|. | |
| 222 void HandleIncomingDataMessage( | |
| 223 const mcs_proto::DataMessageStanza& data_message_stanza, | |
| 224 MessageData& message_data); | |
| 225 | |
| 226 // Fires OnMessageSendError event on the delegate of this calss, based on the | |
| 227 // details in |data_message_stanza| and |message_data|. | |
| 228 void HandleIncomingSendError( | |
| 229 const mcs_proto::DataMessageStanza& data_message_stanza, | |
| 230 MessageData& message_data); | |
| 231 | |
| 232 // Builder for the GCM internals (mcs client, etc.). | |
| 233 scoped_ptr<GCMInternalsBuilder> internals_builder_; | |
| 234 | |
| 235 // Recorder that logs GCM activities. | |
| 236 GCMStatsRecorderImpl recorder_; | |
| 237 | |
| 238 // State of the GCM Client Implementation. | |
| 239 State state_; | |
| 240 | |
| 241 GCMClient::Delegate* delegate_; | |
| 242 | |
| 243 // Device checkin info (android ID and security token used by device). | |
| 244 CheckinInfo device_checkin_info_; | |
| 245 | |
| 246 // Clock used for timing of retry logic. Passed in for testing. Owned by | |
| 247 // GCMClientImpl. | |
| 248 scoped_ptr<base::Clock> clock_; | |
| 249 | |
| 250 // Information about the chrome build. | |
| 251 // TODO(fgorski): Check if it can be passed in constructor and made const. | |
| 252 ChromeBuildInfo chrome_build_info_; | |
| 253 | |
| 254 // Persistent data store for keeping device credentials, messages and user to | |
| 255 // serial number mappings. | |
| 256 scoped_ptr<GCMStore> gcm_store_; | |
| 257 | |
| 258 scoped_refptr<net::HttpNetworkSession> network_session_; | |
| 259 net::BoundNetLog net_log_; | |
| 260 scoped_ptr<ConnectionFactory> connection_factory_; | |
| 261 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; | |
| 262 | |
| 263 // Controls receiving and sending of packets and reliable message queueing. | |
| 264 scoped_ptr<MCSClient> mcs_client_; | |
| 265 | |
| 266 scoped_ptr<CheckinRequest> checkin_request_; | |
| 267 std::vector<std::string> account_ids_; | |
| 268 | |
| 269 // Cached registration info. | |
| 270 RegistrationInfoMap registrations_; | |
| 271 | |
| 272 // Currently pending registration requests. GCMClientImpl owns the | |
| 273 // RegistrationRequests. | |
| 274 PendingRegistrationRequests pending_registration_requests_; | |
| 275 STLValueDeleter<PendingRegistrationRequests> | |
| 276 pending_registration_requests_deleter_; | |
| 277 | |
| 278 // Currently pending unregistration requests. GCMClientImpl owns the | |
| 279 // UnregistrationRequests. | |
| 280 PendingUnregistrationRequests pending_unregistration_requests_; | |
| 281 STLValueDeleter<PendingUnregistrationRequests> | |
| 282 pending_unregistration_requests_deleter_; | |
| 283 | |
| 284 // G-services settings that were provided by MCS. | |
| 285 GServicesSettings gservices_settings_; | |
| 286 | |
| 287 // Time of the last successful checkin. | |
| 288 base::Time last_checkin_time_; | |
| 289 | |
| 290 // Factory for creating references when scheduling periodic checkin. | |
| 291 base::WeakPtrFactory<GCMClientImpl> periodic_checkin_ptr_factory_; | |
| 292 | |
| 293 // Factory for creating references in callbacks. | |
| 294 base::WeakPtrFactory<GCMClientImpl> weak_ptr_factory_; | |
| 295 | |
| 296 DISALLOW_COPY_AND_ASSIGN(GCMClientImpl); | |
| 297 }; | |
| 298 | |
| 299 } // namespace gcm | |
| 300 | |
| 301 #endif // GOOGLE_APIS_GCM_GCM_CLIENT_IMPL_H_ | |
| OLD | NEW |