15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved. 25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be 35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file. 45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef COMPONENTS_GCM_DRIVER_GCM_DRIVER_H_ 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define COMPONENTS_GCM_DRIVER_GCM_DRIVER_H_ 75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include <map> 95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include <string> 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include <vector> 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/callback.h" 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/macros.h" 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/threading/thread_checker.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/gcm_driver/default_gcm_app_handler.h" 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/gcm_driver/gcm_client.h" 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace gcm { 195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass GCMAppHandler; 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass GCMConnectionObserver; 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct AccountMapping; 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Bridge between GCM users in Chrome and the platform-specific implementation. 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class GCMDriver { 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) typedef std::map<std::string, GCMAppHandler*> GCMAppHandlerMap; 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu typedef base::Callback<void(const std::string& registration_id, 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GCMClient::Result result)> RegisterCallback; 305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu typedef base::Callback<void(const std::string& message_id, 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GCMClient::Result result)> SendCallback; 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu typedef base::Callback<void(GCMClient::Result result)> UnregisterCallback; 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu typedef base::Callback<void(const GCMClient::GCMStatistics& stats)> 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetGCMStatisticsCallback; 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Returns true if the GCM is allowed for all users. 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static bool IsAllowedForAllUsers(); 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GCMDriver(); 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~GCMDriver(); 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Registers |sender_id| for an app. A registration ID will be returned by 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // the GCM server. 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // |app_id|: application ID. 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // |sender_ids|: list of IDs of the servers that are allowed to send the 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // messages to the application. These IDs are assigned by the 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Google API Console. 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // |callback|: to be called once the asynchronous operation is done. 4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void Register(const std::string& app_id, 5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::vector<std::string>& sender_ids, 5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const RegisterCallback& callback); 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Unregisters an app from using GCM. 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // |app_id|: application ID. 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // |callback|: to be called once the asynchronous operation is done. 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void Unregister(const std::string& app_id, 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const UnregisterCallback& callback); 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Sends a message to a given receiver. 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // |app_id|: application ID. 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // |receiver_id|: registration ID of the receiver party. 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // |message|: message to be sent. 635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // |callback|: to be called once the asynchronous operation is done. 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void Send(const std::string& app_id, 6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& receiver_id, 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const GCMClient::OutgoingMessage& message, 6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const SendCallback& callback); 6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const GCMAppHandlerMap& app_handlers() const { return app_handlers_; } 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // This method must be called before destroying the GCMDriver. Once it has 7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // been called, no other GCMDriver methods may be used. 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void Shutdown(); 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 751675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch // Called when the user signs in to or out of a GAIA account. 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void OnSignedIn() = 0; 771675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch virtual void OnSignedOut() = 0; 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Removes all the cached and persisted GCM data. If the GCM service is 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // restarted after the purge, a new Android ID will be obtained. 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void Purge() = 0; 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Adds a handler for a given app. 8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void AddAppHandler(const std::string& app_id, GCMAppHandler* handler); 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Remove the handler for a given app. 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void RemoveAppHandler(const std::string& app_id); 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Returns the handler for the given app. 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GCMAppHandler* GetAppHandler(const std::string& app_id); 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Adds a connection state observer. 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void AddConnectionObserver(GCMConnectionObserver* observer) = 0; 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Removes a connection state observer. 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void RemoveConnectionObserver(GCMConnectionObserver* observer) = 0; 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Enables/disables GCM service. 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void Enable() = 0; 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void Disable() = 0; 10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // For testing purpose. Always NULL on Android. 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual GCMClient* GetGCMClientForTesting() const = 0; 1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Returns true if the service was started. 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual bool IsStarted() const = 0; 1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Returns true if the gcm client has an open and active connection. 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual bool IsConnected() const = 0; 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Get GCM client internal states and statistics. 1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // If clear_logs is true then activity logs will be cleared before the stats 1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // are returned. 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void GetGCMStatistics(const GetGCMStatisticsCallback& callback, 11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool clear_logs) = 0; 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Enables/disables GCM activity recording, and then returns the stats. 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void SetGCMRecording(const GetGCMStatisticsCallback& callback, 11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool recording) = 0; 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Updates the |account_mapping| information in persistent store. 12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void UpdateAccountMapping(const AccountMapping& account_mapping) = 0; 12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Removes the account mapping information reated to |account_id| from 12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // persistent store. 12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void RemoveAccountMapping(const std::string& account_id) = 0; 12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected: 12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Ensures that the GCM service starts (if necessary conditions are met). 13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual GCMClient::Result EnsureStarted() = 0; 1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Platform-specific implementation of Register. 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void RegisterImpl(const std::string& app_id, 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::vector<std::string>& sender_ids) = 0; 1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Platform-specific implementation of Unregister. 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void UnregisterImpl(const std::string& app_id) = 0; 1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Platform-specific implementation of Send. 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void SendImpl(const std::string& app_id, 14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& receiver_id, 14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const GCMClient::OutgoingMessage& message) = 0; 1435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Runs the Register callback. 1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void RegisterFinished(const std::string& app_id, 1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& registration_id, 1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GCMClient::Result result); 14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Runs the Unregister callback. 15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void UnregisterFinished(const std::string& app_id, 15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GCMClient::Result result); 15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Runs the Send callback. 1545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void SendFinished(const std::string& app_id, 1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& message_id, 1565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GCMClient::Result result); 1575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool HasRegisterCallback(const std::string& app_id); 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void ClearCallbacks(); 1615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private: 16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Should be called when an app with |app_id| is trying to un/register. 16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Checks whether another un/registration is in progress. 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool IsAsyncOperationPending(const std::string& app_id) const; 1665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Callback map (from app_id to callback) for Register. 1685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::map<std::string, RegisterCallback> register_callbacks_; 1695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Callback map (from app_id to callback) for Unregister. 1715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::map<std::string, UnregisterCallback> unregister_callbacks_; 1725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Callback map (from <app_id, message_id> to callback) for Send. 1745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::map<std::pair<std::string, std::string>, SendCallback> send_callbacks_; 1755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // App handler map (from app_id to handler pointer). 17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The handler is not owned. 17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GCMAppHandlerMap app_handlers_; 1795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The default handler when no app handler can be found in the map. 18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DefaultGCMAppHandler default_app_handler_; 1825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GCMDriver); 1845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 1855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace gcm 1875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // COMPONENTS_GCM_DRIVER_GCM_DRIVER_H_ 189