/* transport.h - Peer to peer transport Copyright (c) 2005 by Gregg Edghill Kopete (c) 2002-2005 by the Kopete developers ************************************************************************* * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; version 2 of the License. * * * ************************************************************************* */ #ifndef PEERTOPEERTRANSPORT_H #define PEERTOPEERTRANSPORT_H //BEGIN QT Includes #include #include #include //END //BEGIN KDE Includes #include //END namespace KNetwork { class KClientSocketBase; } class MSNSwitchBoardSocket; namespace PeerToPeer { class MessageFormatter; class TransportBridge; enum TransportBridgeType { Tcp = 1, Udp = 2 }; /** @author Gregg Edghill */ /** @brief Represents the protocol used to send and receive message between peers. */ class Transport : public TQObject { TQ_OBJECT public: /** @brief Creates a new instance of the class Transport. */ Transport(TQObject* parent, const char* name = 0l); ~Transport(); /** @brief Get a transport bridge with the specified address, port, type and identifier. */ TransportBridge* getBridge(const TQString& address, TQ_UINT16 port, TransportBridgeType type, const TQString& identifier); /** @brief Sets the default transport bridge. */ void setDefaultBridge(MSNSwitchBoardSocket* mss); private slots: /** @brief Invokes when a message is received on a transport bridge. */ // void slotOnReceive(Message& message); /** @brief Invokes when a message is received on the default transport bridge (relay). */ void slotOnReceive(const TQString& contact, const TQByteArray& bytes); private: /** @brief Known SocketAddresses of peers. */ TQMap mAddresses; /** @brief The list the connected transport bridges. */ TQValueList mBridges; /** @brief The default transport bridge (relay). */ TQGuardedPtr mDefaultBridge; /** @brief Message formatter used to ser/deser message. */ MessageFormatter *mFormatter; }; /** @brief Represents the channel connecting two peers. */ class TransportBridge : public TQObject { TQ_OBJECT public: virtual ~TransportBridge(); protected: /** @brief Creates a new instance of the class TransportBridge with the specified address and formatter. */ TransportBridge(const KNetwork::KInetSocketAddress& to, MessageFormatter* formatter, TQObject* parent, const char* name = 0l); /** @brief Creates a new instance of the class TransportBridge with the specified socket and formatter. */ TransportBridge(KNetwork::KClientSocketBase* socket, MessageFormatter* formatter, TQObject* parent, const char* name = 0l); public: /** @brief Creates a connection between two peers. */ void connect(); /** @brief Disconnects the connection between two peers. */ void disconnect(); protected slots: virtual void slotOnConnect(); virtual void slotOnDisconnect(); virtual void slotOnError(int); virtual void slotOnSocketClose(); virtual void slotOnSocketConnect(); virtual void slotOnSocketReceive(); signals: void bridgeConnect(); void bridgeDisconnect(); void bridgeError(const TQString& e); void bytesReceived(const TQByteArray&); protected: KNetwork::KInetSocketAddress mAddress; bool mConnected; MessageFormatter *mFormatter; TQ_UINT32 mLength; KNetwork::KClientSocketBase *mSocket; bool mVerified; }; class TcpTransportBridge : public TransportBridge { TQ_OBJECT friend class Transport; public: virtual ~TcpTransportBridge(); private: TcpTransportBridge(const KNetwork::KInetSocketAddress& to, MessageFormatter* formatter, TQObject* parent, const char* name = 0l); TcpTransportBridge(KNetwork::KClientSocketBase* socket, MessageFormatter* formatter, TQObject* parent, const char* name = 0l); protected slots: virtual void slotOnConnect(); virtual void slotOnDisconnect(); virtual void slotOnError(int); virtual void slotOnSocketClose(); virtual void slotOnSocketConnect(); virtual void slotOnSocketReceive(); private slots: void slotOnSocketConnectTimeout(); signals: void bridgeConnectTimeout(); private: class Buffer : public TQByteArray { public: Buffer(TQ_UINT32 length = 0); ~Buffer(); public: void write(const TQByteArray& bytes); TQByteArray read(TQ_UINT32 length); }; Buffer mBuffer; TQ_UINT32 mLength; }; } #endif