15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef REMOTING_JINGLE_GLUE_SIGNAL_STRATEGY_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define REMOTING_JINGLE_GLUE_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) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // REMOTING_JINGLE_GLUE_SIGNAL_STRATEGY_H_ 102