1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef REMOTING_SIGNALING_SIGNAL_STRATEGY_H_
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define REMOTING_SIGNALING_SIGNAL_STRATEGY_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace buzz {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class XmlElement;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace buzz
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SignalStrategy {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum State {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Connection is being established.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CONNECTING,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Signalling is connected.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CONNECTED,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Connection is closed due to an error or because Disconnect()
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // was called.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISCONNECTED,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Error {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OK,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AUTHENTICATION_FAILED,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NETWORK_ERROR,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback interface for signaling event. Event handlers are not
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // allowed to destroy SignalStrategy, but may add or remove other
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // listeners.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Listener {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Listener() {}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called after state of the connection has changed. If the state
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // is DISCONNECTED, then GetError() can be used to get the reason
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // for the disconnection.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnSignalStrategyStateChange(State state) = 0;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Must return true if the stanza was handled, false
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // otherwise. The signal strategy must not be deleted from a
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // handler of this message.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool OnSignalStrategyIncomingStanza(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const buzz::XmlElement* stanza) = 0;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SignalStrategy() {}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SignalStrategy() {}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts connection attempt. If connection is currently active
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disconnects it and opens a new connection (implicit disconnect
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // triggers CLOSED notification). Connection is finished
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // asynchronously.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Connect() = 0;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disconnects current connection if connected. Triggers CLOSED
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notification.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Disconnect() = 0;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns current state.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual State GetState() const = 0;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the last error. Set when state changes to DISCONNECT.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual Error GetError() const = 0;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns local JID or an empty string when not connected.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetLocalJid() const = 0;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a |listener| that can listen to all incoming
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // messages. Doesn't take ownership of the |listener|. All listeners
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // must be removed before this object is destroyed.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddListener(Listener* listener) = 0;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove a |listener| previously added with AddListener().
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RemoveListener(Listener* listener) = 0;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends a raw XMPP stanza.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SendStanza(scoped_ptr<buzz::XmlElement> stanza) = 0;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns new ID that should be used for the next outgoing IQ
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetNextId() = 0;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SignalStrategy);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // REMOTING_SIGNALING_SIGNAL_STRATEGY_H_
102