• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_DRIVER_H_
6 #define COMPONENTS_GCM_DRIVER_GCM_DRIVER_H_
7 
8 #include <map>
9 #include <string>
10 #include <vector>
11 
12 #include "base/callback.h"
13 #include "base/macros.h"
14 #include "base/threading/thread_checker.h"
15 #include "components/gcm_driver/default_gcm_app_handler.h"
16 #include "components/gcm_driver/gcm_client.h"
17 
18 namespace gcm {
19 
20 class GCMAppHandler;
21 
22 // Bridge between GCM users in Chrome and the platform-specific implementation.
23 class GCMDriver {
24  public:
25   typedef std::map<std::string, GCMAppHandler*> GCMAppHandlerMap;
26   typedef base::Callback<void(const std::string& registration_id,
27                               GCMClient::Result result)> RegisterCallback;
28   typedef base::Callback<void(const std::string& message_id,
29                               GCMClient::Result result)> SendCallback;
30   typedef base::Callback<void(GCMClient::Result result)> UnregisterCallback;
31   typedef base::Callback<void(const GCMClient::GCMStatistics& stats)>
32       GetGCMStatisticsCallback;
33 
34   GCMDriver();
35   virtual ~GCMDriver();
36 
37   // Registers |sender_id| for an app. A registration ID will be returned by
38   // the GCM server.
39   // |app_id|: application ID.
40   // |sender_ids|: list of IDs of the servers that are allowed to send the
41   //               messages to the application. These IDs are assigned by the
42   //               Google API Console.
43   // |callback|: to be called once the asynchronous operation is done.
44   void Register(const std::string& app_id,
45                 const std::vector<std::string>& sender_ids,
46                 const RegisterCallback& callback);
47 
48   // Unregisters an app from using GCM.
49   // |app_id|: application ID.
50   // |callback|: to be called once the asynchronous operation is done.
51   void Unregister(const std::string& app_id,
52                   const UnregisterCallback& callback);
53 
54   // Sends a message to a given receiver.
55   // |app_id|: application ID.
56   // |receiver_id|: registration ID of the receiver party.
57   // |message|: message to be sent.
58   // |callback|: to be called once the asynchronous operation is done.
59   void Send(const std::string& app_id,
60             const std::string& receiver_id,
61             const GCMClient::OutgoingMessage& message,
62             const SendCallback& callback);
63 
app_handlers()64   const GCMAppHandlerMap& app_handlers() const { return app_handlers_; }
65 
66   // This method must be called before destroying the GCMDriver. Once it has
67   // been called, no other GCMDriver methods may be used.
68   virtual void Shutdown();
69 
70   // Call this method when the user signs in to a GAIA account.
71   // TODO(jianli): To be removed when sign-in enforcement is dropped.
72   virtual void OnSignedIn() = 0;
73 
74   // Removes all the cached and persisted GCM data. If the GCM service is
75   // restarted after the purge, a new Android ID will be obtained.
76   virtual void Purge() = 0;
77 
78   // Adds a handler for a given app.
79   virtual void AddAppHandler(const std::string& app_id, GCMAppHandler* handler);
80 
81   // Remove the handler for a given app.
82   virtual void RemoveAppHandler(const std::string& app_id);
83 
84   // Returns the handler for the given app.
85   GCMAppHandler* GetAppHandler(const std::string& app_id);
86 
87   // Enables/disables GCM service.
88   virtual void Enable() = 0;
89   virtual void Disable() = 0;
90 
91   // For testing purpose. Always NULL on Android.
92   virtual GCMClient* GetGCMClientForTesting() const = 0;
93 
94   // Returns true if the service was started.
95   virtual bool IsStarted() const = 0;
96 
97   // Returns true if the gcm client has an open and active connection.
98   virtual bool IsConnected() const = 0;
99 
100   // Get GCM client internal states and statistics.
101   // If clear_logs is true then activity logs will be cleared before the stats
102   // are returned.
103   virtual void GetGCMStatistics(const GetGCMStatisticsCallback& callback,
104                                 bool clear_logs) = 0;
105 
106   // Enables/disables GCM activity recording, and then returns the stats.
107   virtual void SetGCMRecording(const GetGCMStatisticsCallback& callback,
108                                bool recording) = 0;
109 
110  protected:
111   // Ensures that the GCM service starts (if necessary conditions are met).
112   virtual GCMClient::Result EnsureStarted() = 0;
113 
114   // Platform-specific implementation of Register.
115   virtual void RegisterImpl(const std::string& app_id,
116                             const std::vector<std::string>& sender_ids) = 0;
117 
118   // Platform-specific implementation of Unregister.
119   virtual void UnregisterImpl(const std::string& app_id) = 0;
120 
121   // Platform-specific implementation of Send.
122   virtual void SendImpl(const std::string& app_id,
123                         const std::string& receiver_id,
124                         const GCMClient::OutgoingMessage& message) = 0;
125 
126   // Runs the Register callback.
127   void RegisterFinished(const std::string& app_id,
128                         const std::string& registration_id,
129                         GCMClient::Result result);
130 
131   // Runs the Unregister callback.
132   void UnregisterFinished(const std::string& app_id,
133                           GCMClient::Result result);
134 
135   // Runs the Send callback.
136   void SendFinished(const std::string& app_id,
137                     const std::string& message_id,
138                     GCMClient::Result result);
139 
140   bool HasRegisterCallback(const std::string& app_id);
141 
142   void ClearCallbacks();
143 
144  private:
145   // Should be called when an app with |app_id| is trying to un/register.
146   // Checks whether another un/registration is in progress.
147   bool IsAsyncOperationPending(const std::string& app_id) const;
148 
149   // Callback map (from app_id to callback) for Register.
150   std::map<std::string, RegisterCallback> register_callbacks_;
151 
152   // Callback map (from app_id to callback) for Unregister.
153   std::map<std::string, UnregisterCallback> unregister_callbacks_;
154 
155   // Callback map (from <app_id, message_id> to callback) for Send.
156   std::map<std::pair<std::string, std::string>, SendCallback> send_callbacks_;
157 
158   // App handler map (from app_id to handler pointer).
159   // The handler is not owned.
160   GCMAppHandlerMap app_handlers_;
161 
162   // The default handler when no app handler can be found in the map.
163   DefaultGCMAppHandler default_app_handler_;
164 
165   DISALLOW_COPY_AND_ASSIGN(GCMDriver);
166 };
167 
168 }  // namespace gcm
169 
170 #endif  // COMPONENTS_GCM_DRIVER_GCM_DRIVER_H_
171