Home | History | Annotate | Download | only in gcm
      1 // Copyright 2013 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 CHROME_BROWSER_EXTENSIONS_API_GCM_GCM_API_H_
      6 #define CHROME_BROWSER_EXTENSIONS_API_GCM_GCM_API_H_
      7 
      8 #include "chrome/common/extensions/api/gcm.h"
      9 #include "components/gcm_driver/gcm_client.h"
     10 #include "extensions/browser/extension_function.h"
     11 
     12 namespace gcm {
     13 class GCMDriver;
     14 class GCMProfileService;
     15 }  // namespace gcm
     16 
     17 class Profile;
     18 
     19 namespace extensions {
     20 
     21 class GcmApiFunction : public AsyncExtensionFunction {
     22  public:
     23   GcmApiFunction() {}
     24 
     25  protected:
     26   virtual ~GcmApiFunction() {}
     27 
     28   // ExtensionFunction:
     29   virtual bool RunAsync() OVERRIDE FINAL;
     30 
     31   // Actual implementation of specific functions.
     32   virtual bool DoWork() = 0;
     33 
     34   // Checks that the GCM API is enabled.
     35   bool IsGcmApiEnabled() const;
     36 
     37   gcm::GCMDriver* GetGCMDriver() const;
     38 };
     39 
     40 class GcmRegisterFunction : public GcmApiFunction {
     41  public:
     42   DECLARE_EXTENSION_FUNCTION("gcm.register", GCM_REGISTER);
     43 
     44   GcmRegisterFunction();
     45 
     46  protected:
     47   virtual ~GcmRegisterFunction();
     48 
     49   // Register function implementation.
     50   virtual bool DoWork() OVERRIDE FINAL;
     51 
     52  private:
     53   void CompleteFunctionWithResult(const std::string& registration_id,
     54                                   gcm::GCMClient::Result result);
     55 };
     56 
     57 class GcmUnregisterFunction : public GcmApiFunction {
     58  public:
     59   DECLARE_EXTENSION_FUNCTION("gcm.unregister", GCM_UNREGISTER);
     60 
     61   GcmUnregisterFunction();
     62 
     63  protected:
     64   virtual ~GcmUnregisterFunction();
     65 
     66   // Register function implementation.
     67   virtual bool DoWork() OVERRIDE FINAL;
     68 
     69  private:
     70   void CompleteFunctionWithResult(gcm::GCMClient::Result result);
     71 };
     72 
     73 class GcmSendFunction : public GcmApiFunction {
     74  public:
     75   DECLARE_EXTENSION_FUNCTION("gcm.send", GCM_SEND);
     76 
     77   GcmSendFunction();
     78 
     79  protected:
     80   virtual ~GcmSendFunction();
     81 
     82   // Send function implementation.
     83   virtual bool DoWork() OVERRIDE FINAL;
     84 
     85  private:
     86   void CompleteFunctionWithResult(const std::string& message_id,
     87                                   gcm::GCMClient::Result result);
     88 
     89   // Validates that message data do not carry invalid keys and fit into
     90   // allowable size limits.
     91   bool ValidateMessageData(const gcm::GCMClient::MessageData& data) const;
     92 };
     93 
     94 class GcmJsEventRouter {
     95  public:
     96   explicit GcmJsEventRouter(Profile* profile);
     97 
     98   virtual ~GcmJsEventRouter();
     99 
    100   void OnMessage(const std::string& app_id,
    101                  const gcm::GCMClient::IncomingMessage& message);
    102   void OnMessagesDeleted(const std::string& app_id);
    103   void OnSendError(const std::string& app_id,
    104                    const gcm::GCMClient::SendErrorDetails& send_error_details);
    105 
    106  private:
    107   // The application we route the event to is running in context of the
    108   // |profile_| and the latter outlives the event router.
    109   Profile* profile_;
    110 };
    111 
    112 }  // namespace extensions
    113 
    114 #endif  // CHROME_BROWSER_EXTENSIONS_API_GCM_GCM_API_H_
    115