1// Copyright (c) 2012 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 REMOTING_JINGLE_GLUE_SIGNAL_STRATEGY_H_
6#define REMOTING_JINGLE_GLUE_SIGNAL_STRATEGY_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "base/memory/scoped_ptr.h"
12
13namespace buzz {
14class XmlElement;
15}  // namespace buzz
16
17namespace remoting {
18
19class SignalStrategy {
20 public:
21  enum State {
22    // Connection is being established.
23    CONNECTING,
24
25    // Signalling is connected.
26    CONNECTED,
27
28    // Connection is closed due to an error or because Disconnect()
29    // was called.
30    DISCONNECTED,
31  };
32
33  enum Error {
34    OK,
35    AUTHENTICATION_FAILED,
36    NETWORK_ERROR,
37  };
38
39  // Callback interface for signaling event. Event handlers are not
40  // allowed to destroy SignalStrategy, but may add or remove other
41  // listeners.
42  class Listener {
43   public:
44    virtual ~Listener() {}
45
46    // Called after state of the connection has changed. If the state
47    // is DISCONNECTED, then GetError() can be used to get the reason
48    // for the disconnection.
49    virtual void OnSignalStrategyStateChange(State state) = 0;
50
51    // Must return true if the stanza was handled, false
52    // otherwise. The signal strategy must not be deleted from a
53    // handler of this message.
54    virtual bool OnSignalStrategyIncomingStanza(
55        const buzz::XmlElement* stanza) = 0;
56  };
57
58  SignalStrategy() {}
59  virtual ~SignalStrategy() {}
60
61  // Starts connection attempt. If connection is currently active
62  // disconnects it and opens a new connection (implicit disconnect
63  // triggers CLOSED notification). Connection is finished
64  // asynchronously.
65  virtual void Connect() = 0;
66
67  // Disconnects current connection if connected. Triggers CLOSED
68  // notification.
69  virtual void Disconnect() = 0;
70
71  // Returns current state.
72  virtual State GetState() const = 0;
73
74  // Returns the last error. Set when state changes to DISCONNECT.
75  virtual Error GetError() const = 0;
76
77  // Returns local JID or an empty string when not connected.
78  virtual std::string GetLocalJid() const = 0;
79
80  // Add a |listener| that can listen to all incoming
81  // messages. Doesn't take ownership of the |listener|. All listeners
82  // must be removed before this object is destroyed.
83  virtual void AddListener(Listener* listener) = 0;
84
85  // Remove a |listener| previously added with AddListener().
86  virtual void RemoveListener(Listener* listener) = 0;
87
88  // Sends a raw XMPP stanza.
89  virtual bool SendStanza(scoped_ptr<buzz::XmlElement> stanza) = 0;
90
91  // Returns new ID that should be used for the next outgoing IQ
92  // request.
93  virtual std::string GetNextId() = 0;
94
95 private:
96  DISALLOW_COPY_AND_ASSIGN(SignalStrategy);
97};
98
99}  // namespace remoting
100
101#endif  // REMOTING_JINGLE_GLUE_SIGNAL_STRATEGY_H_
102