1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file. 4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#ifndef CLOUD_PRINT_GCP20_PROTOTYPE_CLOUD_PRINT_XMPP_LISTENER_H_ 6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define CLOUD_PRINT_GCP20_PROTOTYPE_CLOUD_PRINT_XMPP_LISTENER_H_ 7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <string> 9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/basictypes.h" 11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/compiler_specific.h" 12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/memory/ref_counted.h" 13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "base/memory/weak_ptr.h" 15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "jingle/notifier/listener/push_client_observer.h" 16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace base { 18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class SingleThreadTaskRunner; 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace base 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace net { 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class URLRequestContextGetter; 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace net 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace notifier { 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class PushClient; 32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace notifier 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochclass CloudPrintXmppListener 363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch : public base::SupportsWeakPtr<CloudPrintXmppListener>, 373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch public notifier::PushClientObserver { 38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) class Delegate { 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual ~Delegate() {} 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Invoked when XMPP connection was established. 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnXmppConnected() = 0; 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Invoked when server rejected our credentials. 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnXmppAuthError() = 0; 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Invoked when server is unavailable. 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnXmppNetworkError() = 0; 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Invoked when new printjob was received. 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnXmppNewPrintJob(const std::string& device_id) = 0; 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Invoked when local settings was updated. 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnXmppNewLocalSettings(const std::string& device_id) = 0; 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Invoked when printer was deleted from the server. 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnXmppDeleteNotification(const std::string& device_id) = 0; 60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }; 61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CloudPrintXmppListener( 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& robot_email, 643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch int standard_ping_interval, 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> task_runner, 66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) Delegate* delegate); 67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual ~CloudPrintXmppListener(); 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Connects to the server. 71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void Connect(const std::string& access_token); 72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Update ping interval when new local_settings was received. 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void set_ping_interval(int interval); 753240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // notifier::PushClientObserver methods: 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnNotificationsEnabled() OVERRIDE; 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnNotificationsDisabled( 80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) notifier::NotificationsDisabledReason reason) OVERRIDE; 81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnIncomingNotification( 82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const notifier::Notification& notification) OVERRIDE; 83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void OnPingResponse() OVERRIDE; 84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Stops listening and sending pings. 863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch void Disconnect(); 873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Schedules ping (unless it was already scheduled). 893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch void SchedulePing(); 903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Sends ping. 923240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch void SendPing(); 933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Checks if ping was received. 953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch void OnPingTimeoutReached(); 96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Credentials: 98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string robot_email_; 99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string access_token_; 100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Internal listener. 102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<notifier::PushClient> push_client_; 103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1043240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Interval between pings in regular workflow. 1053240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch int standard_ping_interval_; 1063240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 1073240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Number of timeouts posted to MessageLoop. Is used for controlling "fake" 1083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // timeout calls. 1093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch int ping_timeouts_posted_; 1103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 1113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Number of responses awaiting from XMPP server. Is used for controlling 1123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // number of failed pings. 1133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch int ping_responses_pending_; 1143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 1153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Is used for preventing multiple pings at the moment. 1163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch bool ping_scheduled_; 1173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 1183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_refptr<net::URLRequestContextGetter> context_getter_; 1193240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) Delegate* delegate_; 121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CloudPrintXmppListener); 123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif // CLOUD_PRINT_GCP20_PROTOTYPE_CLOUD_PRINT_XMPP_LISTENER_H_ 126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 127