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