#pragma once #include #include #include "Swiften/Network/Connection.h" #include "Swiften/Session/SessionStream.h" namespace Swift { class TLSLayerFactory; class TLSLayer; class WhitespacePingLayer; class PayloadParserFactoryCollection; class PayloadSerializerCollection; class StreamStack; class XMPPLayer; class ConnectionLayer; class BasicSessionStream : public SessionStream, public boost::enable_shared_from_this { public: BasicSessionStream( boost::shared_ptr connection, PayloadParserFactoryCollection* payloadParserFactories, PayloadSerializerCollection* payloadSerializers, TLSLayerFactory* tlsLayerFactory ); ~BasicSessionStream(); void initialize(); virtual void writeHeader(const ProtocolHeader& header); virtual void writeElement(boost::shared_ptr); virtual bool supportsTLSEncryption(); virtual void addTLSEncryption(); virtual void addWhitespacePing(); virtual void resetXMPPParser(); private: void handleXMPPError(); void handleTLSError(); void handleStreamStartReceived(const ProtocolHeader&); void handleElementReceived(boost::shared_ptr); private: boost::shared_ptr connection; PayloadParserFactoryCollection* payloadParserFactories; PayloadSerializerCollection* payloadSerializers; TLSLayerFactory* tlsLayerFactory; boost::shared_ptr xmppLayer; boost::shared_ptr connectionLayer; StreamStack* streamStack; boost::shared_ptr tlsLayer; boost::shared_ptr whitespacePingLayer; }; }