| Index: webrtc/libjingle/xmpp/xmppengineimpl.h
|
| diff --git a/webrtc/libjingle/xmpp/xmppengineimpl.h b/webrtc/libjingle/xmpp/xmppengineimpl.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e1f3061f90d265cf0a9db1d8f42154ff8478ab8f
|
| --- /dev/null
|
| +++ b/webrtc/libjingle/xmpp/xmppengineimpl.h
|
| @@ -0,0 +1,267 @@
|
| +/*
|
| + * Copyright 2004 The WebRTC Project Authors. All rights reserved.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license
|
| + * that can be found in the LICENSE file in the root of the source
|
| + * tree. An additional intellectual property rights grant can be found
|
| + * in the file PATENTS. All contributing project authors may
|
| + * be found in the AUTHORS file in the root of the source tree.
|
| + */
|
| +
|
| +#ifndef WEBRTC_LIBJINGLE_XMPP_XMPPENGINEIMPL_H_
|
| +#define WEBRTC_LIBJINGLE_XMPP_XMPPENGINEIMPL_H_
|
| +
|
| +#include <memory>
|
| +#include <sstream>
|
| +#include <vector>
|
| +
|
| +#include "webrtc/libjingle/xmpp/xmppengine.h"
|
| +#include "webrtc/libjingle/xmpp/xmppstanzaparser.h"
|
| +
|
| +namespace buzz {
|
| +
|
| +class XmppLoginTask;
|
| +class XmppEngine;
|
| +class XmppIqEntry;
|
| +class SaslHandler;
|
| +class SaslMechanism;
|
| +
|
| +//! The XMPP connection engine.
|
| +//! This engine implements the client side of the 'core' XMPP protocol.
|
| +//! To use it, register an XmppOutputHandler to handle socket output
|
| +//! and pass socket input to HandleInput. Then application code can
|
| +//! set up the connection with a user, password, and other settings,
|
| +//! and then call Connect() to initiate the connection.
|
| +//! An application can listen for events and receive stanzas by
|
| +//! registering an XmppStanzaHandler via AddStanzaHandler().
|
| +class XmppEngineImpl : public XmppEngine {
|
| + public:
|
| + XmppEngineImpl();
|
| + virtual ~XmppEngineImpl();
|
| +
|
| + // SOCKET INPUT AND OUTPUT ------------------------------------------------
|
| +
|
| + //! Registers the handler for socket output
|
| + virtual XmppReturnStatus SetOutputHandler(XmppOutputHandler *pxoh);
|
| +
|
| + //! Provides socket input to the engine
|
| + virtual XmppReturnStatus HandleInput(const char* bytes, size_t len);
|
| +
|
| + //! Advises the engine that the socket has closed
|
| + virtual XmppReturnStatus ConnectionClosed(int subcode);
|
| +
|
| + // SESSION SETUP ---------------------------------------------------------
|
| +
|
| + //! Indicates the (bare) JID for the user to use.
|
| + virtual XmppReturnStatus SetUser(const Jid& jid);
|
| +
|
| + //! Get the login (bare) JID.
|
| + virtual const Jid& GetUser();
|
| +
|
| + //! Indicates the autentication to use. Takes ownership of the object.
|
| + virtual XmppReturnStatus SetSaslHandler(SaslHandler* sasl_handler);
|
| +
|
| + //! Sets whether TLS will be used within the connection (default true).
|
| + virtual XmppReturnStatus SetTls(TlsOptions use_tls);
|
| +
|
| + //! Sets an alternate domain from which we allows TLS certificates.
|
| + //! This is for use in the case where a we want to allow a proxy to
|
| + //! serve up its own certificate rather than one owned by the underlying
|
| + //! domain.
|
| + virtual XmppReturnStatus SetTlsServer(const std::string& proxy_hostname,
|
| + const std::string& proxy_domain);
|
| +
|
| + //! Gets whether TLS will be used within the connection.
|
| + virtual TlsOptions GetTls();
|
| +
|
| + //! Sets the request resource name, if any (optional).
|
| + //! Note that the resource name may be overridden by the server; after
|
| + //! binding, the actual resource name is available as part of FullJid().
|
| + virtual XmppReturnStatus SetRequestedResource(const std::string& resource);
|
| +
|
| + //! Gets the request resource name.
|
| + virtual const std::string& GetRequestedResource();
|
| +
|
| + //! Sets language
|
| + virtual void SetLanguage(const std::string& lang) {
|
| + lang_ = lang;
|
| + }
|
| +
|
| + // SESSION MANAGEMENT ---------------------------------------------------
|
| +
|
| + //! Set callback for state changes.
|
| + virtual XmppReturnStatus SetSessionHandler(XmppSessionHandler* handler);
|
| +
|
| + //! Initiates the XMPP connection.
|
| + //! After supplying connection settings, call this once to initiate,
|
| + //! (optionally) encrypt, authenticate, and bind the connection.
|
| + virtual XmppReturnStatus Connect();
|
| +
|
| + //! The current engine state.
|
| + virtual State GetState() { return state_; }
|
| +
|
| + //! Returns true if the connection is encrypted (under TLS)
|
| + virtual bool IsEncrypted() { return encrypted_; }
|
| +
|
| + //! The error code.
|
| + //! Consult this after XmppOutputHandler.OnClose().
|
| + virtual Error GetError(int *subcode) {
|
| + if (subcode) {
|
| + *subcode = subcode_;
|
| + }
|
| + return error_code_;
|
| + }
|
| +
|
| + //! The stream:error stanza, when the error is XmppEngine::ERROR_STREAM.
|
| + //! Notice the stanza returned is owned by the XmppEngine and
|
| + //! is deleted when the engine is destroyed.
|
| + virtual const XmlElement* GetStreamError() { return stream_error_.get(); }
|
| +
|
| + //! Closes down the connection.
|
| + //! Sends CloseConnection to output, and disconnects and registered
|
| + //! session handlers. After Disconnect completes, it is guaranteed
|
| + //! that no further callbacks will be made.
|
| + virtual XmppReturnStatus Disconnect();
|
| +
|
| + // APPLICATION USE -------------------------------------------------------
|
| +
|
| + //! Adds a listener for session events.
|
| + //! Stanza delivery is chained to session handlers; the first to
|
| + //! return 'true' is the last to get each stanza.
|
| + virtual XmppReturnStatus AddStanzaHandler(XmppStanzaHandler* handler,
|
| + XmppEngine::HandlerLevel level);
|
| +
|
| + //! Removes a listener for session events.
|
| + virtual XmppReturnStatus RemoveStanzaHandler(XmppStanzaHandler* handler);
|
| +
|
| + //! Sends a stanza to the server.
|
| + virtual XmppReturnStatus SendStanza(const XmlElement* stanza);
|
| +
|
| + //! Sends raw text to the server
|
| + virtual XmppReturnStatus SendRaw(const std::string& text);
|
| +
|
| + //! Sends an iq to the server, and registers a callback for the result.
|
| + //! Returns the cookie passed to the result handler.
|
| + virtual XmppReturnStatus SendIq(const XmlElement* stanza,
|
| + XmppIqHandler* iq_handler,
|
| + XmppIqCookie* cookie);
|
| +
|
| + //! Unregisters an iq callback handler given its cookie.
|
| + //! No callback will come to this handler after it's unregistered.
|
| + virtual XmppReturnStatus RemoveIqHandler(XmppIqCookie cookie,
|
| + XmppIqHandler** iq_handler);
|
| +
|
| + //! Forms and sends an error in response to the given stanza.
|
| + //! Swaps to and from, sets type to "error", and adds error information
|
| + //! based on the passed code. Text is optional and may be STR_EMPTY.
|
| + virtual XmppReturnStatus SendStanzaError(const XmlElement* pelOriginal,
|
| + XmppStanzaError code,
|
| + const std::string& text);
|
| +
|
| + //! The fullly bound JID.
|
| + //! This JID is only valid after binding has succeeded. If the value
|
| + //! is JID_NULL, the binding has not succeeded.
|
| + virtual const Jid& FullJid() { return bound_jid_; }
|
| +
|
| + //! The next unused iq id for this connection.
|
| + //! Call this when building iq stanzas, to ensure that each iq
|
| + //! gets its own unique id.
|
| + virtual std::string NextId();
|
| +
|
| + private:
|
| + friend class XmppLoginTask;
|
| + friend class XmppIqEntry;
|
| +
|
| + void IncomingStanza(const XmlElement *stanza);
|
| + void IncomingStart(const XmlElement *stanza);
|
| + void IncomingEnd(bool isError);
|
| +
|
| + void InternalSendStart(const std::string& domainName);
|
| + void InternalSendStanza(const XmlElement* stanza);
|
| + std::string ChooseBestSaslMechanism(
|
| + const std::vector<std::string>& mechanisms, bool encrypted);
|
| + SaslMechanism* GetSaslMechanism(const std::string& name);
|
| + void SignalBound(const Jid& fullJid);
|
| + void SignalStreamError(const XmlElement* streamError);
|
| + void SignalError(Error errorCode, int subCode);
|
| + bool HasError();
|
| + void DeleteIqCookies();
|
| + bool HandleIqResponse(const XmlElement* element);
|
| + void StartTls(const std::string& domain);
|
| + void RaiseReset() { raised_reset_ = true; }
|
| +
|
| + class StanzaParseHandler : public XmppStanzaParseHandler {
|
| + public:
|
| + StanzaParseHandler(XmppEngineImpl* outer) : outer_(outer) {}
|
| + virtual ~StanzaParseHandler() {}
|
| +
|
| + virtual void StartStream(const XmlElement* stream) {
|
| + outer_->IncomingStart(stream);
|
| + }
|
| + virtual void Stanza(const XmlElement* stanza) {
|
| + outer_->IncomingStanza(stanza);
|
| + }
|
| + virtual void EndStream() {
|
| + outer_->IncomingEnd(false);
|
| + }
|
| + virtual void XmlError() {
|
| + outer_->IncomingEnd(true);
|
| + }
|
| +
|
| + private:
|
| + XmppEngineImpl* const outer_;
|
| + };
|
| +
|
| + class EnterExit {
|
| + public:
|
| + EnterExit(XmppEngineImpl* engine);
|
| + ~EnterExit();
|
| + private:
|
| + XmppEngineImpl* engine_;
|
| + State state_;
|
| + };
|
| +
|
| + friend class StanzaParseHandler;
|
| + friend class EnterExit;
|
| +
|
| + StanzaParseHandler stanza_parse_handler_;
|
| + XmppStanzaParser stanza_parser_;
|
| +
|
| + // state
|
| + int engine_entered_;
|
| + Jid user_jid_;
|
| + std::string password_;
|
| + std::string requested_resource_;
|
| + TlsOptions tls_option_;
|
| + std::string tls_server_hostname_;
|
| + std::string tls_server_domain_;
|
| + std::unique_ptr<XmppLoginTask> login_task_;
|
| + std::string lang_;
|
| +
|
| + int next_id_;
|
| + Jid bound_jid_;
|
| + State state_;
|
| + bool encrypted_;
|
| + Error error_code_;
|
| + int subcode_;
|
| + std::unique_ptr<XmlElement> stream_error_;
|
| + bool raised_reset_;
|
| + XmppOutputHandler* output_handler_;
|
| + XmppSessionHandler* session_handler_;
|
| +
|
| + XmlnsStack xmlns_stack_;
|
| +
|
| + typedef std::vector<XmppStanzaHandler*> StanzaHandlerVector;
|
| + std::unique_ptr<StanzaHandlerVector> stanza_handlers_[HL_COUNT];
|
| +
|
| + typedef std::vector<XmppIqEntry*> IqEntryVector;
|
| + std::unique_ptr<IqEntryVector> iq_entries_;
|
| +
|
| + std::unique_ptr<SaslHandler> sasl_handler_;
|
| +
|
| + std::unique_ptr<std::stringstream> output_;
|
| +};
|
| +
|
| +} // namespace buzz
|
| +
|
| +#endif // WEBRTC_LIBJINGLE_XMPP_XMPPENGINEIMPL_H_
|
|
|