1f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/* 2f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * libjingle 3f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Copyright 2004--2005, Google Inc. 4f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 5f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Redistribution and use in source and binary forms, with or without 6f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * modification, are permitted provided that the following conditions are met: 7f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 8f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 1. Redistributions of source code must retain the above copyright notice, 9f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer. 10f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright notice, 11f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer in the documentation 12f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * and/or other materials provided with the distribution. 13f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 3. The name of the author may not be used to endorse or promote products 14f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * derived from this software without specific prior written permission. 15f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 16f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 27f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 28f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifndef _xmppengineimpl_h_ 29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define _xmppengineimpl_h_ 30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <sstream> 32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <vector> 33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/xmpp/xmppengine.h" 34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/xmpp/xmppstanzaparser.h" 35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 36f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace buzz { 37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 38f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass XmppLoginTask; 39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass XmppEngine; 40f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass XmppIqEntry; 41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass SaslHandler; 42f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass SaslMechanism; 43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch//! The XMPP connection engine. 46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch//! This engine implements the client side of the 'core' XMPP protocol. 47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch//! To use it, register an XmppOutputHandler to handle socket output 48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch//! and pass socket input to HandleInput. Then application code can 49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch//! set up the connection with a user, password, and other settings, 50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch//! and then call Connect() to initiate the connection. 51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch//! An application can listen for events and receive stanzas by 52f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch//! registering an XmppStanzaHandler via AddStanzaHandler(). 53f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass XmppEngineImpl : public XmppEngine { 54f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochpublic: 55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch XmppEngineImpl(); 56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual ~XmppEngineImpl(); 57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // SOCKET INPUT AND OUTPUT ------------------------------------------------ 59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 60f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Registers the handler for socket output 61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus SetOutputHandler(XmppOutputHandler *pxoh); 62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Provides socket input to the engine 64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus HandleInput(const char * bytes, size_t len); 65f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Advises the engine that the socket has closed 67f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus ConnectionClosed(int subcode); 68f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 69f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // SESSION SETUP --------------------------------------------------------- 70f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 71f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Indicates the (bare) JID for the user to use. 72f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus SetUser(const Jid & jid); 73f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 74f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Get the login (bare) JID. 75f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual const Jid & GetUser(); 76f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 77f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Indicates the autentication to use. Takes ownership of the object. 78f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus SetSaslHandler(SaslHandler * sasl_handler); 79f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 80f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Sets whether TLS will be used within the connection (default true). 81f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus SetUseTls(bool useTls); 82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 83f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Sets an alternate domain from which we allows TLS certificates. 84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! This is for use in the case where a we want to allow a proxy to 85f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! serve up its own certificate rather than one owned by the underlying 86f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! domain. 87f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus SetTlsServer(const std::string & proxy_hostname, 88f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string & proxy_domain); 89f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 90f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Gets whether TLS will be used within the connection. 91f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool GetUseTls(); 92f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 93f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Sets the request resource name, if any (optional). 94f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Note that the resource name may be overridden by the server; after 95f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! binding, the actual resource name is available as part of FullJid(). 96f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus SetRequestedResource(const std::string& resource); 97f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 98f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Gets the request resource name. 99f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual const std::string & GetRequestedResource(); 100f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 101f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Sets language 102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void SetLanguage(const std::string & lang) { 103f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch lang_ = lang; 104f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 105f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 106f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // SESSION MANAGEMENT --------------------------------------------------- 107f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 108f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Set callback for state changes. 109f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus SetSessionHandler(XmppSessionHandler* handler); 110f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 111f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Initiates the XMPP connection. 112f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! After supplying connection settings, call this once to initiate, 113f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! (optionally) encrypt, authenticate, and bind the connection. 114f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus Connect(); 115f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 116f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! The current engine state. 117f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual State GetState() { return state_; } 118f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 119f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Returns true if the connection is encrypted (under TLS) 120f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool IsEncrypted() { return encrypted_; } 121f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 122f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! The error code. 123f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Consult this after XmppOutputHandler.OnClose(). 124f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual Error GetError(int *subcode) { 125f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (subcode) { 126f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *subcode = subcode_; 127f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 128f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return error_code_; 129f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 130f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 131f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! The stream:error stanza, when the error is XmppEngine::ERROR_STREAM. 132f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Notice the stanza returned is owned by the XmppEngine and 133f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! is deleted when the engine is destroyed. 134f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual const XmlElement * GetStreamError() { return stream_error_.get(); } 135f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Closes down the connection. 137f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Sends CloseConnection to output, and disconnects and registered 138f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! session handlers. After Disconnect completes, it is guaranteed 139f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! that no further callbacks will be made. 140f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus Disconnect(); 141f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 142f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // APPLICATION USE ------------------------------------------------------- 143f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 144f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Adds a listener for session events. 145f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Stanza delivery is chained to session handlers; the first to 146f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! return 'true' is the last to get each stanza. 147f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus AddStanzaHandler(XmppStanzaHandler* handler, 148f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch XmppEngine::HandlerLevel level); 149f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 150f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Removes a listener for session events. 151f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus RemoveStanzaHandler(XmppStanzaHandler* handler); 152f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 153f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Sends a stanza to the server. 154f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus SendStanza(const XmlElement * pelStanza); 155f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 156f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Sends raw text to the server 157f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus SendRaw(const std::string & text); 158f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 159f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Sends an iq to the server, and registers a callback for the result. 160f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Returns the cookie passed to the result handler. 161f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus SendIq(const XmlElement* pelStanza, 162f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch XmppIqHandler* iq_handler, 163f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch XmppIqCookie* cookie); 164f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 165f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Unregisters an iq callback handler given its cookie. 166f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! No callback will come to this handler after it's unregistered. 167f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus RemoveIqHandler(XmppIqCookie cookie, 168f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch XmppIqHandler** iq_handler); 169f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 170f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Forms and sends an error in response to the given stanza. 171f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Swaps to and from, sets type to "error", and adds error information 172f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! based on the passed code. Text is optional and may be STR_EMPTY. 173f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual XmppReturnStatus SendStanzaError(const XmlElement * pelOriginal, 174f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch XmppStanzaError code, 175f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string & text); 176f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 177f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! The fullly bound JID. 178f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! This JID is only valid after binding has succeeded. If the value 179f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! is JID_NULL, the binding has not succeeded. 180f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual const Jid & FullJid() { return bound_jid_; } 181f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 182f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! The next unused iq id for this connection. 183f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! Call this when building iq stanzas, to ensure that each iq 184f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch //! gets its own unique id. 185f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual std::string NextId(); 186f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 187f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochprivate: 188f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch friend class XmppLoginTask; 189f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch friend class XmppIqEntry; 190f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 191f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void IncomingStanza(const XmlElement *pelStanza); 192f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void IncomingStart(const XmlElement *pelStanza); 193f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void IncomingEnd(bool isError); 194f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 195f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void InternalSendStart(const std::string & domainName); 196f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void InternalSendStanza(const XmlElement * pelStanza); 197f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string ChooseBestSaslMechanism(const std::vector<std::string> & mechanisms, bool encrypted); 198f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SaslMechanism * GetSaslMechanism(const std::string & name); 199f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void SignalBound(const Jid & fullJid); 200f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void SignalStreamError(const XmlElement * pelStreamError); 201f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void SignalError(Error errorCode, int subCode); 202f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool HasError(); 203f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void DeleteIqCookies(); 204f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool HandleIqResponse(const XmlElement * element); 205f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void StartTls(const std::string & domain); 206f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void RaiseReset() { raised_reset_ = true; } 207f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 208f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch class StanzaParseHandler : public XmppStanzaParseHandler { 209f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 210f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch StanzaParseHandler(XmppEngineImpl * outer) : outer_(outer) {} 211f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual ~StanzaParseHandler() {} 212f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void StartStream(const XmlElement * pelStream) 213f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch { outer_->IncomingStart(pelStream); } 214f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void Stanza(const XmlElement * pelStanza) 215f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch { outer_->IncomingStanza(pelStanza); } 216f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void EndStream() 217f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch { outer_->IncomingEnd(false); } 218f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void XmlError() 219f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch { outer_->IncomingEnd(true); } 220f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch private: 221f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch XmppEngineImpl * const outer_; 222f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch }; 223f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 224f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch class EnterExit { 225f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 226f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch EnterExit(XmppEngineImpl* engine); 227f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ~EnterExit(); 228f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch private: 229f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch XmppEngineImpl* engine_; 230f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch State state_; 231f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Error error_; 232f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 233f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch }; 234f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 235f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch friend class StanzaParseHandler; 236f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch friend class EnterExit; 237f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 238f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch StanzaParseHandler stanzaParseHandler_; 239f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch XmppStanzaParser stanzaParser_; 240f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 241f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 242f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // state 243f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int engine_entered_; 244f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Jid user_jid_; 245f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string password_; 246f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string requested_resource_; 247f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool tls_needed_; 248f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string tls_server_hostname_; 249f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string tls_server_domain_; 250f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch talk_base::scoped_ptr<XmppLoginTask> login_task_; 251f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string lang_; 252f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 253f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int next_id_; 254f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Jid bound_jid_; 255f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch State state_; 256f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool encrypted_; 257f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Error error_code_; 258f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int subcode_; 259f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch talk_base::scoped_ptr<XmlElement> stream_error_; 260f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool raised_reset_; 261f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch XmppOutputHandler* output_handler_; 262f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch XmppSessionHandler* session_handler_; 263f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 264f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch typedef std::vector<XmppStanzaHandler*> StanzaHandlerVector; 265f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch talk_base::scoped_ptr<StanzaHandlerVector> stanza_handlers_[HL_COUNT]; 266f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 267f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch typedef std::vector<XmppIqEntry*> IqEntryVector; 268f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch talk_base::scoped_ptr<IqEntryVector> iq_entries_; 269f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 270f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch talk_base::scoped_ptr<SaslHandler> sasl_handler_; 271f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 272f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch talk_base::scoped_ptr<std::stringstream> output_; 273f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 274f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 275f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 276f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 277f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 278f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif 279