/* * Copyright (c) 2011 Thilo Cestonaro * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2011 Kevin Smith * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. */ #pragma once #include #include #include #include #include #include #include namespace boost { class thread; namespace system { class error_code; } } class BOSHConnectionTest; namespace Swift { class ConnectionFactory; class XMLParserFactory; class TLSContextFactory; class BOSHError : public SessionStream::Error { public: enum Type {BadRequest, HostGone, HostUnknown, ImproperAddressing, InternalServerError, ItemNotFound, OtherRequest, PolicyViolation, RemoteConnectionFailed, RemoteStreamError, SeeOtherURI, SystemShutdown, UndefinedCondition, NoError}; BOSHError(Type type) : SessionStream::Error(SessionStream::Error::ConnectionReadError), type(type) {} Type getType() {return type;} typedef boost::shared_ptr ref; private: Type type; }; class BOSHConnection : public boost::enable_shared_from_this { public: typedef boost::shared_ptr ref; static ref create(const URL& boshURL, ConnectionFactory* connectionFactory, XMLParserFactory* parserFactory, TLSContextFactory* tlsFactory) { return ref(new BOSHConnection(boshURL, connectionFactory, parserFactory, tlsFactory)); } virtual ~BOSHConnection(); virtual void connect(); virtual void disconnect(); virtual void write(const SafeByteArray& data); const std::string& getSID(); void setRID(unsigned long long rid); void setSID(const std::string& sid); void startStream(const std::string& to, unsigned long rid); void terminateStream(); bool isReadyToSend(); void restartStream(); boost::signal onConnectFinished; boost::signal onDisconnected; boost::signal onSessionTerminated; boost::signal onSessionStarted; boost::signal onXMPPDataRead; boost::signal onBOSHDataRead; boost::signal onBOSHDataWritten; boost::signal onHTTPError; private: friend class ::BOSHConnectionTest; BOSHConnection(const URL& boshURL, ConnectionFactory* connectionFactory, XMLParserFactory* parserFactory, TLSContextFactory* tlsFactory); static std::pair createHTTPRequest(const SafeByteArray& data, bool streamRestart, bool terminate, long rid, const std::string& sid, const URL& boshURL); void handleConnectionConnectFinished(bool error); void handleDataRead(boost::shared_ptr data); void handleDisconnected(const boost::optional& error); void write(const SafeByteArray& data, bool streamRestart, bool terminate); /* FIXME: refactor */ BOSHError::Type parseTerminationCondition(const std::string& text); URL boshURL_; ConnectionFactory* connectionFactory_; XMLParserFactory* parserFactory_; boost::shared_ptr connection_; std::string sid_; bool waitingForStartResponse_; unsigned long long rid_; SafeByteArray buffer_; bool pending_; TLSContextFactory* tlsFactory_; bool connectionReady_; }; }