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