1269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org/* 2269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * 4269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * Use of this source code is governed by a BSD-style license 5269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * in the file PATENTS. All contributing project authors may 8269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org */ 10269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 11269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifndef WEBRTC_LIBJINGLE_XMPP_XMPPENGINEIMPL_H_ 12269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#define WEBRTC_LIBJINGLE_XMPP_XMPPENGINEIMPL_H_ 13269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 14269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include <sstream> 15269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include <vector> 16269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/libjingle/xmpp/xmppengine.h" 17269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/libjingle/xmpp/xmppstanzaparser.h" 18269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 19269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgnamespace buzz { 20269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 21269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass XmppLoginTask; 22269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass XmppEngine; 23269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass XmppIqEntry; 24269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass SaslHandler; 25269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass SaslMechanism; 26269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 27269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org//! The XMPP connection engine. 28269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org//! This engine implements the client side of the 'core' XMPP protocol. 29269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org//! To use it, register an XmppOutputHandler to handle socket output 30269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org//! and pass socket input to HandleInput. Then application code can 31269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org//! set up the connection with a user, password, and other settings, 32269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org//! and then call Connect() to initiate the connection. 33269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org//! An application can listen for events and receive stanzas by 34269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org//! registering an XmppStanzaHandler via AddStanzaHandler(). 35269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass XmppEngineImpl : public XmppEngine { 36269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org public: 37269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppEngineImpl(); 38269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual ~XmppEngineImpl(); 39269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 40269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // SOCKET INPUT AND OUTPUT ------------------------------------------------ 41269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 42269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Registers the handler for socket output 43269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus SetOutputHandler(XmppOutputHandler *pxoh); 44269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 45269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Provides socket input to the engine 46269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus HandleInput(const char* bytes, size_t len); 47269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 48269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Advises the engine that the socket has closed 49269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus ConnectionClosed(int subcode); 50269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 51269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // SESSION SETUP --------------------------------------------------------- 52269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 53269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Indicates the (bare) JID for the user to use. 54269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus SetUser(const Jid& jid); 55269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 56269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Get the login (bare) JID. 57269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual const Jid& GetUser(); 58269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 59269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Indicates the autentication to use. Takes ownership of the object. 60269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus SetSaslHandler(SaslHandler* sasl_handler); 61269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 62269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Sets whether TLS will be used within the connection (default true). 63269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus SetTls(TlsOptions use_tls); 64269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 65269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Sets an alternate domain from which we allows TLS certificates. 66269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! This is for use in the case where a we want to allow a proxy to 67269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! serve up its own certificate rather than one owned by the underlying 68269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! domain. 69269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus SetTlsServer(const std::string& proxy_hostname, 70269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const std::string& proxy_domain); 71269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 72269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Gets whether TLS will be used within the connection. 73269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual TlsOptions GetTls(); 74269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 75269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Sets the request resource name, if any (optional). 76269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Note that the resource name may be overridden by the server; after 77269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! binding, the actual resource name is available as part of FullJid(). 78269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus SetRequestedResource(const std::string& resource); 79269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 80269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Gets the request resource name. 81269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual const std::string& GetRequestedResource(); 82269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 83269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Sets language 84269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual void SetLanguage(const std::string& lang) { 85269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org lang_ = lang; 86269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 87269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 88269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // SESSION MANAGEMENT --------------------------------------------------- 89269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 90269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Set callback for state changes. 91269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus SetSessionHandler(XmppSessionHandler* handler); 92269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 93269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Initiates the XMPP connection. 94269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! After supplying connection settings, call this once to initiate, 95269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! (optionally) encrypt, authenticate, and bind the connection. 96269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus Connect(); 97269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 98269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! The current engine state. 99269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual State GetState() { return state_; } 100269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 101269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Returns true if the connection is encrypted (under TLS) 102269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual bool IsEncrypted() { return encrypted_; } 103269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 104269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! The error code. 105269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Consult this after XmppOutputHandler.OnClose(). 106269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual Error GetError(int *subcode) { 107269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org if (subcode) { 108269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *subcode = subcode_; 109269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 110269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org return error_code_; 111269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 112269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 113269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! The stream:error stanza, when the error is XmppEngine::ERROR_STREAM. 114269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Notice the stanza returned is owned by the XmppEngine and 115269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! is deleted when the engine is destroyed. 116269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual const XmlElement* GetStreamError() { return stream_error_.get(); } 117269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 118269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Closes down the connection. 119269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Sends CloseConnection to output, and disconnects and registered 120269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! session handlers. After Disconnect completes, it is guaranteed 121269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! that no further callbacks will be made. 122269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus Disconnect(); 123269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 124269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // APPLICATION USE ------------------------------------------------------- 125269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 126269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Adds a listener for session events. 127269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Stanza delivery is chained to session handlers; the first to 128269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! return 'true' is the last to get each stanza. 129269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus AddStanzaHandler(XmppStanzaHandler* handler, 130269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppEngine::HandlerLevel level); 131269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 132269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Removes a listener for session events. 133269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus RemoveStanzaHandler(XmppStanzaHandler* handler); 134269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 135269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Sends a stanza to the server. 136269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus SendStanza(const XmlElement* stanza); 137269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 138269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Sends raw text to the server 139269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus SendRaw(const std::string& text); 140269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 141269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Sends an iq to the server, and registers a callback for the result. 142269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Returns the cookie passed to the result handler. 143269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus SendIq(const XmlElement* stanza, 144269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppIqHandler* iq_handler, 145269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppIqCookie* cookie); 146269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 147269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Unregisters an iq callback handler given its cookie. 148269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! No callback will come to this handler after it's unregistered. 149269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus RemoveIqHandler(XmppIqCookie cookie, 150269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppIqHandler** iq_handler); 151269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 152269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Forms and sends an error in response to the given stanza. 153269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Swaps to and from, sets type to "error", and adds error information 154269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! based on the passed code. Text is optional and may be STR_EMPTY. 155269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus SendStanzaError(const XmlElement* pelOriginal, 156269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppStanzaError code, 157269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const std::string& text); 158269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 159269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! The fullly bound JID. 160269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! This JID is only valid after binding has succeeded. If the value 161269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! is JID_NULL, the binding has not succeeded. 162269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual const Jid& FullJid() { return bound_jid_; } 163269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 164269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! The next unused iq id for this connection. 165269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! Call this when building iq stanzas, to ensure that each iq 166269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org //! gets its own unique id. 167269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual std::string NextId(); 168269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 169269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org private: 170269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org friend class XmppLoginTask; 171269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org friend class XmppIqEntry; 172269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 173269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void IncomingStanza(const XmlElement *stanza); 174269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void IncomingStart(const XmlElement *stanza); 175269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void IncomingEnd(bool isError); 176269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 177269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void InternalSendStart(const std::string& domainName); 178269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void InternalSendStanza(const XmlElement* stanza); 179269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org std::string ChooseBestSaslMechanism( 180269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const std::vector<std::string>& mechanisms, bool encrypted); 181269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org SaslMechanism* GetSaslMechanism(const std::string& name); 182269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void SignalBound(const Jid& fullJid); 183269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void SignalStreamError(const XmlElement* streamError); 184269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void SignalError(Error errorCode, int subCode); 185269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org bool HasError(); 186269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void DeleteIqCookies(); 187269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org bool HandleIqResponse(const XmlElement* element); 188269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void StartTls(const std::string& domain); 189269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void RaiseReset() { raised_reset_ = true; } 190269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 191269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org class StanzaParseHandler : public XmppStanzaParseHandler { 192269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org public: 193269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org StanzaParseHandler(XmppEngineImpl* outer) : outer_(outer) {} 194269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual ~StanzaParseHandler() {} 195269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 196269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual void StartStream(const XmlElement* stream) { 197269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org outer_->IncomingStart(stream); 198269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 199269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual void Stanza(const XmlElement* stanza) { 200269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org outer_->IncomingStanza(stanza); 201269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 202269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual void EndStream() { 203269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org outer_->IncomingEnd(false); 204269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 205269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual void XmlError() { 206269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org outer_->IncomingEnd(true); 207269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 208269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 209269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org private: 210269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppEngineImpl* const outer_; 211269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org }; 212269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 213269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org class EnterExit { 214269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org public: 215269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org EnterExit(XmppEngineImpl* engine); 216269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org ~EnterExit(); 217269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org private: 218269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppEngineImpl* engine_; 219269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org State state_; 220269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org }; 221269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 222269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org friend class StanzaParseHandler; 223269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org friend class EnterExit; 224269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 225269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org StanzaParseHandler stanza_parse_handler_; 226269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppStanzaParser stanza_parser_; 227269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 228269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // state 229269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org int engine_entered_; 230269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org Jid user_jid_; 231269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org std::string password_; 232269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org std::string requested_resource_; 233269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org TlsOptions tls_option_; 234269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org std::string tls_server_hostname_; 235269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org std::string tls_server_domain_; 236269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::scoped_ptr<XmppLoginTask> login_task_; 237269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org std::string lang_; 238269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 239269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org int next_id_; 240269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org Jid bound_jid_; 241269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org State state_; 242269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org bool encrypted_; 243269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org Error error_code_; 244269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org int subcode_; 245269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::scoped_ptr<XmlElement> stream_error_; 246269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org bool raised_reset_; 247269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppOutputHandler* output_handler_; 248269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppSessionHandler* session_handler_; 249269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 250269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmlnsStack xmlns_stack_; 251269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 252269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org typedef std::vector<XmppStanzaHandler*> StanzaHandlerVector; 253269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::scoped_ptr<StanzaHandlerVector> stanza_handlers_[HL_COUNT]; 254269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 255269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org typedef std::vector<XmppIqEntry*> IqEntryVector; 256269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::scoped_ptr<IqEntryVector> iq_entries_; 257269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 258269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::scoped_ptr<SaslHandler> sasl_handler_; 259269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 260269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::scoped_ptr<std::stringstream> output_; 261269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org}; 262269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 263269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} // namespace buzz 264269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 265269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif // WEBRTC_LIBJINGLE_XMPP_XMPPENGINEIMPL_H_ 266