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_GCM_DRIVER_GCM_CLIENT_H_ 6 #define COMPONENTS_GCM_DRIVER_GCM_CLIENT_H_ 7 8 #include <map> 9 #include <string> 10 #include <vector> 11 12 #include "base/basictypes.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "components/gcm_driver/gcm_activity.h" 15 16 template <class T> class scoped_refptr; 17 18 class GURL; 19 20 namespace base { 21 class FilePath; 22 class SequencedTaskRunner; 23 } 24 25 namespace net { 26 class IPEndPoint; 27 class URLRequestContextGetter; 28 } 29 30 namespace gcm { 31 32 class Encryptor; 33 34 // Interface that encapsulates the network communications with the Google Cloud 35 // Messaging server. This interface is not supposed to be thread-safe. 36 class GCMClient { 37 public: 38 enum Result { 39 // Successful operation. 40 SUCCESS, 41 // Invalid parameter. 42 INVALID_PARAMETER, 43 // GCM is disabled. 44 GCM_DISABLED, 45 // Profile not signed in. 46 NOT_SIGNED_IN, 47 // Previous asynchronous operation is still pending to finish. Certain 48 // operation, like register, is only allowed one at a time. 49 ASYNC_OPERATION_PENDING, 50 // Network socket error. 51 NETWORK_ERROR, 52 // Problem at the server. 53 SERVER_ERROR, 54 // Exceeded the specified TTL during message sending. 55 TTL_EXCEEDED, 56 // Other errors. 57 UNKNOWN_ERROR 58 }; 59 60 enum ChromePlatform { 61 PLATFORM_WIN, 62 PLATFORM_MAC, 63 PLATFORM_LINUX, 64 PLATFORM_CROS, 65 PLATFORM_IOS, 66 PLATFORM_ANDROID, 67 PLATFORM_UNKNOWN 68 }; 69 70 enum ChromeChannel { 71 CHANNEL_STABLE, 72 CHANNEL_BETA, 73 CHANNEL_DEV, 74 CHANNEL_CANARY, 75 CHANNEL_UNKNOWN 76 }; 77 78 struct ChromeBuildInfo { 79 ChromeBuildInfo(); 80 ~ChromeBuildInfo(); 81 82 ChromePlatform platform; 83 ChromeChannel channel; 84 std::string version; 85 }; 86 87 // Message data consisting of key-value pairs. 88 typedef std::map<std::string, std::string> MessageData; 89 90 // Message to be delivered to the other party. 91 struct OutgoingMessage { 92 OutgoingMessage(); 93 ~OutgoingMessage(); 94 95 // Message ID. 96 std::string id; 97 // In seconds. 98 int time_to_live; 99 MessageData data; 100 101 static const int kMaximumTTL = 4 * 7 * 24 * 60 * 60; // 4 weeks. 102 }; 103 104 // Message being received from the other party. 105 struct IncomingMessage { 106 IncomingMessage(); 107 ~IncomingMessage(); 108 109 MessageData data; 110 std::string collapse_key; 111 std::string sender_id; 112 }; 113 114 // Detailed information of the Send Error event. 115 struct SendErrorDetails { 116 SendErrorDetails(); 117 ~SendErrorDetails(); 118 119 std::string message_id; 120 MessageData additional_data; 121 Result result; 122 }; 123 124 // Internal states and activity statistics of a GCM client. 125 struct GCMStatistics { 126 public: 127 GCMStatistics(); 128 ~GCMStatistics(); 129 130 bool is_recording; 131 bool gcm_client_created; 132 std::string gcm_client_state; 133 bool connection_client_created; 134 std::string connection_state; 135 uint64 android_id; 136 std::vector<std::string> registered_app_ids; 137 int send_queue_size; 138 int resend_queue_size; 139 140 RecordedActivities recorded_activities; 141 }; 142 143 // A delegate interface that allows the GCMClient instance to interact with 144 // its caller, i.e. notifying asynchronous event. 145 class Delegate { 146 public: 147 // Called when the registration completed successfully or an error occurs. 148 // |app_id|: application ID. 149 // |registration_id|: non-empty if the registration completed successfully. 150 // |result|: the type of the error if an error occured, success otherwise. 151 virtual void OnRegisterFinished(const std::string& app_id, 152 const std::string& registration_id, 153 Result result) = 0; 154 155 // Called when the unregistration completed. 156 // |app_id|: application ID. 157 // |result|: result of the unregistration. 158 virtual void OnUnregisterFinished(const std::string& app_id, 159 GCMClient::Result result) = 0; 160 161 // Called when the message is scheduled to send successfully or an error 162 // occurs. 163 // |app_id|: application ID. 164 // |message_id|: ID of the message being sent. 165 // |result|: the type of the error if an error occured, success otherwise. 166 virtual void OnSendFinished(const std::string& app_id, 167 const std::string& message_id, 168 Result result) = 0; 169 170 // Called when a message has been received. 171 // |app_id|: application ID. 172 // |message|: message received. 173 virtual void OnMessageReceived(const std::string& app_id, 174 const IncomingMessage& message) = 0; 175 176 // Called when some messages have been deleted from the server. 177 // |app_id|: application ID. 178 virtual void OnMessagesDeleted(const std::string& app_id) = 0; 179 180 // Called when a message failed to send to the server. 181 // |app_id|: application ID. 182 // |send_error_detials|: Details of the send error event, like mesasge ID. 183 virtual void OnMessageSendError( 184 const std::string& app_id, 185 const SendErrorDetails& send_error_details) = 0; 186 187 // Called when the GCM becomes ready. To get to this state, GCMClient 188 // finished loading from the GCM store and retrieved the device check-in 189 // from the server if it hadn't yet. 190 virtual void OnGCMReady() = 0; 191 192 // Called when activities are being recorded and a new activity has just 193 // been recorded. 194 virtual void OnActivityRecorded() = 0; 195 196 // Called when a new connection is established and a successful handshake 197 // has been performed. 198 virtual void OnConnected(const net::IPEndPoint& ip_endpoint) = 0; 199 200 // Called when the connection is interrupted. 201 virtual void OnDisconnected() = 0; 202 }; 203 204 GCMClient(); 205 virtual ~GCMClient(); 206 207 // Begins initialization of the GCM Client. This will not trigger a 208 // connection. 209 // |chrome_build_info|: chrome info, i.e., version, channel and etc. 210 // |store_path|: path to the GCM store. 211 // |blocking_task_runner|: for running blocking file tasks. 212 // |url_request_context_getter|: for url requests. 213 // |delegate|: the delegate whose methods will be called asynchronously in 214 // response to events and messages. 215 virtual void Initialize( 216 const ChromeBuildInfo& chrome_build_info, 217 const base::FilePath& store_path, 218 const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner, 219 const scoped_refptr<net::URLRequestContextGetter>& 220 url_request_context_getter, 221 scoped_ptr<Encryptor> encryptor, 222 Delegate* delegate) = 0; 223 224 // Starts the GCM service by first loading the data from the persistent store. 225 // This will then kick off the check-in if the check-in info is not found in 226 // the store. 227 virtual void Start() = 0; 228 229 // Stops using the GCM service. This will not erase the persisted data. 230 virtual void Stop() = 0; 231 232 // Checks out of the GCM service. This will erase all the cached and persisted 233 // data. 234 virtual void CheckOut() = 0; 235 236 // Registers the application for GCM. Delegate::OnRegisterFinished will be 237 // called asynchronously upon completion. 238 // |app_id|: application ID. 239 // |sender_ids|: list of IDs of the servers that are allowed to send the 240 // messages to the application. These IDs are assigned by the 241 // Google API Console. 242 virtual void Register(const std::string& app_id, 243 const std::vector<std::string>& sender_ids) = 0; 244 245 // Unregisters the application from GCM when it is uninstalled. 246 // Delegate::OnUnregisterFinished will be called asynchronously upon 247 // completion. 248 // |app_id|: application ID. 249 virtual void Unregister(const std::string& app_id) = 0; 250 251 // Sends a message to a given receiver. Delegate::OnSendFinished will be 252 // called asynchronously upon completion. 253 // |app_id|: application ID. 254 // |receiver_id|: registration ID of the receiver party. 255 // |message|: message to be sent. 256 virtual void Send(const std::string& app_id, 257 const std::string& receiver_id, 258 const OutgoingMessage& message) = 0; 259 260 // Enables or disables internal activity recording. 261 virtual void SetRecording(bool recording) = 0; 262 263 // Clear all recorded GCM activity logs. 264 virtual void ClearActivityLogs() = 0; 265 266 // Gets internal states and statistics. 267 virtual GCMStatistics GetStatistics() const = 0; 268 }; 269 270 } // namespace gcm 271 272 #endif // COMPONENTS_GCM_DRIVER_GCM_CLIENT_H_ 273