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