summaryrefslogtreecommitdiff
path: root/chromium/components/gcm_driver/gcm_client.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/gcm_driver/gcm_client.h')
-rw-r--r--chromium/components/gcm_driver/gcm_client.h366
1 files changed, 366 insertions, 0 deletions
diff --git a/chromium/components/gcm_driver/gcm_client.h b/chromium/components/gcm_driver/gcm_client.h
new file mode 100644
index 00000000000..4ee187af8fd
--- /dev/null
+++ b/chromium/components/gcm_driver/gcm_client.h
@@ -0,0 +1,366 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_GCM_DRIVER_GCM_CLIENT_H_
+#define COMPONENTS_GCM_DRIVER_GCM_CLIENT_H_
+
+#include <stdint.h>
+
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/memory/scoped_refptr.h"
+#include "components/gcm_driver/common/gcm_message.h"
+#include "components/gcm_driver/gcm_activity.h"
+#include "components/gcm_driver/registration_info.h"
+#include "google_apis/gaia/core_account_id.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "services/network/public/mojom/proxy_resolving_socket.mojom-forward.h"
+
+namespace base {
+class FilePath;
+class RetainingOneShotTimer;
+class SequencedTaskRunner;
+} // namespace base
+
+namespace net {
+class IPEndPoint;
+} // namespace net
+
+namespace network {
+class NetworkConnectionTracker;
+class SharedURLLoaderFactory;
+} // namespace network
+
+namespace gcm {
+
+struct AccountMapping;
+class Encryptor;
+enum class GCMDecryptionResult;
+
+// Interface that encapsulates the network communications with the Google Cloud
+// Messaging server. This interface is not supposed to be thread-safe.
+class GCMClient {
+ public:
+ // Controls how GCM is being started. At first, GCMClient will be initialized
+ // and GCM store will be loaded. Then GCM connection may or may not be
+ // initiated depending on this enum value.
+ enum StartMode {
+ // GCM should be started only when it is being actually used. If no
+ // registration record is found, GCM will not kick off.
+ DELAYED_START,
+ // GCM should be started immediately.
+ IMMEDIATE_START
+ };
+
+ // Used for UMA. Can add enum values, but never renumber or delete and reuse.
+ enum Result {
+ // Successful operation.
+ SUCCESS,
+ // Invalid parameter.
+ INVALID_PARAMETER,
+ // GCM is disabled.
+ GCM_DISABLED,
+ // Previous asynchronous operation is still pending to finish. Certain
+ // operation, like register, is only allowed one at a time.
+ ASYNC_OPERATION_PENDING,
+ // Network socket error.
+ NETWORK_ERROR,
+ // Problem at the server.
+ SERVER_ERROR,
+ // Exceeded the specified TTL during message sending.
+ TTL_EXCEEDED,
+ // Other errors.
+ UNKNOWN_ERROR,
+
+ // Used for UMA. Keep kMaxValue up to date and sync with histograms.xml.
+ kMaxValue = UNKNOWN_ERROR
+ };
+
+ enum ChromePlatform {
+ PLATFORM_WIN,
+ PLATFORM_MAC,
+ PLATFORM_LINUX,
+ PLATFORM_CROS,
+ PLATFORM_IOS,
+ PLATFORM_ANDROID,
+ PLATFORM_UNSPECIFIED
+ };
+
+ enum ChromeChannel {
+ CHANNEL_STABLE,
+ CHANNEL_BETA,
+ CHANNEL_DEV,
+ CHANNEL_CANARY,
+ CHANNEL_UNKNOWN
+ };
+
+ struct ChromeBuildInfo {
+ ChromeBuildInfo();
+ ~ChromeBuildInfo();
+
+ ChromePlatform platform;
+ ChromeChannel channel;
+ std::string version;
+ std::string product_category_for_subtypes;
+ };
+
+ // Detailed information of the Send Error event.
+ struct SendErrorDetails {
+ SendErrorDetails();
+ SendErrorDetails(const SendErrorDetails& other);
+ ~SendErrorDetails();
+
+ std::string message_id;
+ MessageData additional_data;
+ Result result;
+ };
+
+ // Internal states and activity statistics of a GCM client.
+ struct GCMStatistics {
+ public:
+ GCMStatistics();
+ GCMStatistics(const GCMStatistics& other);
+ ~GCMStatistics();
+
+ bool is_recording;
+ bool gcm_client_created;
+ std::string gcm_client_state;
+ bool connection_client_created;
+ std::string connection_state;
+ base::Time last_checkin;
+ base::Time next_checkin;
+ uint64_t android_id;
+ uint64_t android_secret;
+ std::vector<std::string> registered_app_ids;
+ int send_queue_size;
+ int resend_queue_size;
+
+ RecordedActivities recorded_activities;
+ };
+
+ // Information about account.
+ struct AccountTokenInfo {
+ CoreAccountId account_id;
+ std::string email;
+ std::string access_token;
+ };
+
+ // A delegate interface that allows the GCMClient instance to interact with
+ // its caller, i.e. notifying asynchronous event.
+ class Delegate {
+ public:
+ // Called when the registration completed successfully or an error occurs.
+ // |registration_info|: the specific information required for the
+ // registration.
+ // |registration_id|: non-empty if the registration completed successfully.
+ // |result|: the type of the error if an error occured, success otherwise.
+ virtual void OnRegisterFinished(
+ scoped_refptr<RegistrationInfo> registration_info,
+ const std::string& registration_id,
+ Result result) = 0;
+
+ // Called when the unregistration completed.
+ // |registration_info|: the specific information required for the
+ // registration.
+ // |result|: result of the unregistration.
+ virtual void OnUnregisterFinished(
+ scoped_refptr<RegistrationInfo> registration_info,
+ GCMClient::Result result) = 0;
+
+ // Called when the message is scheduled to send successfully or an error
+ // occurs.
+ // |app_id|: application ID.
+ // |message_id|: ID of the message being sent.
+ // |result|: the type of the error if an error occured, success otherwise.
+ virtual void OnSendFinished(const std::string& app_id,
+ const std::string& message_id,
+ Result result) = 0;
+
+ // Called when a message has been received.
+ // |app_id|: application ID.
+ // |message|: message received.
+ virtual void OnMessageReceived(const std::string& app_id,
+ const IncomingMessage& message) = 0;
+
+ // Called when some messages have been deleted from the server.
+ // |app_id|: application ID.
+ virtual void OnMessagesDeleted(const std::string& app_id) = 0;
+
+ // Called when a message failed to send to the server.
+ // |app_id|: application ID.
+ // |send_error_detials|: Details of the send error event, like mesasge ID.
+ virtual void OnMessageSendError(
+ const std::string& app_id,
+ const SendErrorDetails& send_error_details) = 0;
+
+ // Called when a message was acknowledged by the GCM server.
+ // |app_id|: application ID.
+ // |message_id|: ID of the acknowledged message.
+ virtual void OnSendAcknowledged(const std::string& app_id,
+ const std::string& message_id) = 0;
+
+ // Called when the GCM becomes ready. To get to this state, GCMClient
+ // finished loading from the GCM store and retrieved the device check-in
+ // from the server if it hadn't yet.
+ // |account_mappings|: a persisted list of accounts mapped to this GCM
+ // client.
+ // |last_token_fetch_time|: time of a last successful token fetch.
+ virtual void OnGCMReady(const std::vector<AccountMapping>& account_mappings,
+ const base::Time& last_token_fetch_time) = 0;
+
+ // Called when activities are being recorded and a new activity has just
+ // been recorded.
+ virtual void OnActivityRecorded() = 0;
+
+ // Called when a new connection is established and a successful handshake
+ // has been performed.
+ virtual void OnConnected(const net::IPEndPoint& ip_endpoint) = 0;
+
+ // Called when the connection is interrupted.
+ virtual void OnDisconnected() = 0;
+
+ // Called when the GCM store is reset (e.g. due to corruption), which
+ // changes the device ID, invalidating all prior registrations.
+ virtual void OnStoreReset() = 0;
+ };
+
+ GCMClient();
+ virtual ~GCMClient();
+
+ // Begins initialization of the GCM Client. This will not trigger a
+ // connection. Must be called on |io_task_runner|.
+ // |chrome_build_info|: chrome info, i.e., version, channel and etc.
+ // |store_path|: path to the GCM store.
+ // |remove_account_mappings_with_email_key|: Whether account mappings having
+ // email as account key should be removed while loading. Required
+ // during the migration of account identifier from email to Gaia ID.
+ // |blocking_task_runner|: for running blocking file tasks.
+ // |io_task_runner|: for running IO tasks. When provided, it could be a
+ // wrapper on top of base::ThreadTaskRunnerHandle::Get() to provide power
+ // management featueres so that a delayed task posted to it can wake the
+ // system up from sleep to perform the task.
+ // |get_socket_factory_callback|: a callback that can accept a receiver for a
+ // network::mojom::ProxyResolvingSocketFactory. It needs to be safe to
+ // run on any thread.
+ // |delegate|: the delegate whose methods will be called asynchronously in
+ // response to events and messages.
+ virtual void Initialize(
+ const ChromeBuildInfo& chrome_build_info,
+ const base::FilePath& store_path,
+ bool remove_account_mappings_with_email_key,
+ const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner,
+ scoped_refptr<base::SequencedTaskRunner> io_task_runner,
+ base::RepeatingCallback<void(
+ mojo::PendingReceiver<network::mojom::ProxyResolvingSocketFactory>)>
+ get_socket_factory_callback,
+ const scoped_refptr<network::SharedURLLoaderFactory>& url_loader_factory,
+ network::NetworkConnectionTracker* network_connection_tracker_,
+ std::unique_ptr<Encryptor> encryptor,
+ Delegate* delegate) = 0;
+
+ // This will initiate the GCM connection only if |start_mode| means to start
+ // the GCM immediately or the GCM registration records are found in the store.
+ // Note that it is OK to call Start multiple times and the implementation
+ // should handle it gracefully.
+ virtual void Start(StartMode start_mode) = 0;
+
+ // Stops using the GCM service. This will not erase the persisted data.
+ virtual void Stop() = 0;
+
+ // Registers with the server to access the provided service.
+ // Delegate::OnRegisterFinished will be called asynchronously upon completion.
+ // |registration_info|: the specific information required for the
+ // registration. For GCM, it will contain app id and
+ // sender IDs. For InstanceID, it will contain app_id,
+ // authorized entity and scope.
+ virtual void Register(scoped_refptr<RegistrationInfo> registration_info) = 0;
+
+ // Checks that the provided |registration_id| (aka token for Instance ID
+ // registrations) matches the stored registration info. Also checks sender IDs
+ // match for GCM registrations.
+ virtual bool ValidateRegistration(
+ scoped_refptr<RegistrationInfo> registration_info,
+ const std::string& registration_id) = 0;
+
+ // Unregisters from the server to stop accessing the provided service.
+ // Delegate::OnUnregisterFinished will be called asynchronously upon
+ // completion.
+ // |registration_info|: the specific information required for the
+ // registration. For GCM, it will contain app id (sender
+ // IDs can be ingored). For InstanceID, it will contain
+ // app id, authorized entity and scope.
+ virtual void Unregister(
+ scoped_refptr<RegistrationInfo> registration_info) = 0;
+
+ // Sends a message to a given receiver. Delegate::OnSendFinished will be
+ // called asynchronously upon completion.
+ // |app_id|: application ID.
+ // |receiver_id|: registration ID of the receiver party.
+ // |message|: message to be sent.
+ virtual void Send(const std::string& app_id,
+ const std::string& receiver_id,
+ const OutgoingMessage& message) = 0;
+
+ // Records a decryption failure due to |result| for the |app_id|.
+ virtual void RecordDecryptionFailure(const std::string& app_id,
+ GCMDecryptionResult result) = 0;
+
+ // Enables or disables internal activity recording.
+ virtual void SetRecording(bool recording) = 0;
+
+ // Clear all recorded GCM activity logs.
+ virtual void ClearActivityLogs() = 0;
+
+ // Gets internal states and statistics.
+ virtual GCMStatistics GetStatistics() const = 0;
+
+ // Sets a list of accounts with OAuth2 tokens for the next checkin.
+ // |account_tokens|: list of email addresses, account IDs and OAuth2 access
+ // tokens.
+ virtual void SetAccountTokens(
+ const std::vector<AccountTokenInfo>& account_tokens) = 0;
+
+ // Persists the |account_mapping| in the store.
+ virtual void UpdateAccountMapping(const AccountMapping& account_mapping) = 0;
+
+ // Removes the account mapping related to |account_id| from the persistent
+ // store.
+ virtual void RemoveAccountMapping(const CoreAccountId& account_id) = 0;
+
+ // Sets last token fetch time in persistent store.
+ virtual void SetLastTokenFetchTime(const base::Time& time) = 0;
+
+ // Updates the timer used by the HeartbeatManager for sending heartbeats.
+ virtual void UpdateHeartbeatTimer(
+ std::unique_ptr<base::RetainingOneShotTimer> timer) = 0;
+
+ // Adds the Instance ID data for a specific app to the persistent store.
+ virtual void AddInstanceIDData(const std::string& app_id,
+ const std::string& instance_id,
+ const std::string& extra_data) = 0;
+
+ // Removes the Instance ID data for a specific app from the persistent store.
+ virtual void RemoveInstanceIDData(const std::string& app_id) = 0;
+
+ // Retrieves the Instance ID data for a specific app from the persistent
+ // store.
+ virtual void GetInstanceIDData(const std::string& app_id,
+ std::string* instance_id,
+ std::string* extra_data) = 0;
+
+ // Gets and sets custom heartbeat interval for the MCS connection.
+ // |scope| is used to identify the component that requests a custom interval
+ // to be set, and allows that component to later revoke the setting. It should
+ // be unique.
+ virtual void AddHeartbeatInterval(const std::string& scope,
+ int interval_ms) = 0;
+ virtual void RemoveHeartbeatInterval(const std::string& scope) = 0;
+};
+
+} // namespace gcm
+
+#endif // COMPONENTS_GCM_DRIVER_GCM_CLIENT_H_