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