1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef COMPONENTS_INVALIDATION_GCM_INVALIDATION_BRIDGE_H_
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define COMPONENTS_INVALIDATION_GCM_INVALIDATION_BRIDGE_H_
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/callback.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/weak_ptr.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/threading/non_thread_safe.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/gcm_driver/gcm_app_handler.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/gcm_driver/gcm_client.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/gcm_driver/gcm_connection_observer.h"
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/gcm_network_channel_delegate.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "google_apis/gaia/oauth2_token_service.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass IdentityProvider;
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace base {
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class SingleThreadTaskRunner;
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace base
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace gcm {
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class GCMDriver;
2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace gcm
2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace invalidation {
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// GCMInvalidationBridge and GCMInvalidationBridge::Core implement functions
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// needed for GCMNetworkChannel. GCMInvalidationBridge lives on UI thread while
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Core lives on IO thread. Core implements GCMNetworkChannelDelegate and posts
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// all function calls to GCMInvalidationBridge which does actual work to perform
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// them.
3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class GCMInvalidationBridge : public gcm::GCMAppHandler,
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              public gcm::GCMConnectionObserver,
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                              public OAuth2TokenService::Consumer,
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                              public base::NonThreadSafe {
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  class Core;
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GCMInvalidationBridge(gcm::GCMDriver* gcm_driver,
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                        IdentityProvider* identity_provider);
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual ~GCMInvalidationBridge();
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // OAuth2TokenService::Consumer implementation.
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void OnGetTokenSuccess(const OAuth2TokenService::Request* request,
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 const std::string& access_token,
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 const base::Time& expiration_time) OVERRIDE;
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request,
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 const GoogleServiceAuthError& error) OVERRIDE;
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // gcm::GCMAppHandler implementation.
5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void ShutdownHandler() OVERRIDE;
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnMessage(
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const std::string& app_id,
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const gcm::GCMClient::IncomingMessage& message) OVERRIDE;
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void OnMessagesDeleted(const std::string& app_id) OVERRIDE;
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void OnSendError(
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const std::string& app_id,
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const gcm::GCMClient::SendErrorDetails& send_error_details) OVERRIDE;
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void OnSendAcknowledged(const std::string& app_id,
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  const std::string& message_id) OVERRIDE;
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // gcm::GCMConnectionObserver implementation.
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnConnected(const net::IPEndPoint& ip_endpoint) OVERRIDE;
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnDisconnected() OVERRIDE;
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<syncer::GCMNetworkChannelDelegate> CreateDelegate();
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void CoreInitializationDone(
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::WeakPtr<Core> core,
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_refptr<base::SingleThreadTaskRunner> core_thread_task_runner);
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Functions reflecting GCMNetworkChannelDelegate interface. These are called
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // on UI thread to perform actual work.
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void RequestToken(
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::GCMNetworkChannelDelegate::RequestTokenCallback callback);
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void InvalidateToken(const std::string& token);
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Register(syncer::GCMNetworkChannelDelegate::RegisterCallback callback);
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void SubscribeForIncomingMessages();
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void RegisterFinished(
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      syncer::GCMNetworkChannelDelegate::RegisterCallback callback,
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const std::string& registration_id,
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gcm::GCMClient::Result result);
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gcm::GCMDriver* const gcm_driver_;
920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  IdentityProvider* const identity_provider_;
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::WeakPtr<Core> core_;
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> core_thread_task_runner_;
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Fields related to RequestToken function.
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<OAuth2TokenService::Request> access_token_request_;
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  syncer::GCMNetworkChannelDelegate::RequestTokenCallback
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      request_token_callback_;
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool subscribed_for_incoming_messages_;
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::WeakPtrFactory<GCMInvalidationBridge> weak_factory_;
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GCMInvalidationBridge);
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace invalidation
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // COMPONENTS_INVALIDATION_GCM_INVALIDATION_BRIDGE_H_
111