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 CHROME_BROWSER_SERVICES_GCM_PUSH_MESSAGING_SERVICE_IMPL_H_
6#define CHROME_BROWSER_SERVICES_GCM_PUSH_MESSAGING_SERVICE_IMPL_H_
7
8#include "base/compiler_specific.h"
9#include "base/memory/weak_ptr.h"
10#include "components/gcm_driver/gcm_app_handler.h"
11#include "components/gcm_driver/gcm_client.h"
12#include "content/public/browser/push_messaging_service.h"
13#include "content/public/common/push_messaging_status.h"
14
15class Profile;
16
17namespace user_prefs {
18class PrefRegistrySyncable;
19}
20
21namespace gcm {
22
23class GCMProfileService;
24struct PushMessagingApplicationId;
25
26class PushMessagingServiceImpl : public content::PushMessagingService,
27                                 public GCMAppHandler {
28 public:
29  // Register profile-specific prefs for GCM.
30  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
31
32  // If any Service Workers are using push, starts GCM and adds an app handler.
33  static void InitializeForProfile(Profile* profile);
34
35  PushMessagingServiceImpl(GCMProfileService* gcm_profile_service,
36                           Profile* profile);
37  virtual ~PushMessagingServiceImpl();
38
39  // GCMAppHandler implementation.
40  virtual void ShutdownHandler() OVERRIDE;
41  virtual void OnMessage(const std::string& app_id,
42                         const GCMClient::IncomingMessage& message) OVERRIDE;
43  virtual void OnMessagesDeleted(const std::string& app_id) OVERRIDE;
44  virtual void OnSendError(
45      const std::string& app_id,
46      const GCMClient::SendErrorDetails& send_error_details) OVERRIDE;
47  virtual void OnSendAcknowledged(const std::string& app_id,
48                                  const std::string& message_id) OVERRIDE;
49  virtual bool CanHandle(const std::string& app_id) const OVERRIDE;
50
51  // content::PushMessagingService implementation:
52  virtual void Register(
53      const GURL& origin,
54      int64 service_worker_registration_id,
55      const std::string& sender_id,
56      int renderer_id,
57      int render_frame_id,
58      bool user_gesture,
59      const content::PushMessagingService::RegisterCallback& callback) OVERRIDE;
60
61 private:
62  void DeliverMessageCallback(const PushMessagingApplicationId& application_id,
63                              const GCMClient::IncomingMessage& message,
64                              content::PushMessagingStatus status);
65
66  void RegisterEnd(
67      const content::PushMessagingService::RegisterCallback& callback,
68      const std::string& registration_id,
69      content::PushMessagingStatus status);
70
71  void DidRegister(
72      const content::PushMessagingService::RegisterCallback& callback,
73      const std::string& registration_id,
74      GCMClient::Result result);
75
76  void DidRequestPermission(
77      const PushMessagingApplicationId& application_id,
78      const std::string& sender_id,
79      const content::PushMessagingService::RegisterCallback& callback,
80      bool allow);
81
82  GCMProfileService* gcm_profile_service_;  // It owns us.
83
84  Profile* profile_;  // It owns our owner.
85
86  base::WeakPtrFactory<PushMessagingServiceImpl> weak_factory_;
87
88  DISALLOW_COPY_AND_ASSIGN(PushMessagingServiceImpl);
89};
90
91}  // namespace gcm
92
93#endif  // CHROME_BROWSER_SERVICES_GCM_PUSH_MESSAGING_SERVICE_IMPL_H_
94