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