diff options
Diffstat (limited to 'kopete/protocols/msn/transport.h')
-rw-r--r-- | kopete/protocols/msn/transport.h | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/kopete/protocols/msn/transport.h b/kopete/protocols/msn/transport.h new file mode 100644 index 00000000..c5554b54 --- /dev/null +++ b/kopete/protocols/msn/transport.h @@ -0,0 +1,170 @@ +/* + transport.h - Peer to peer transport + + Copyright (c) 2005 by Gregg Edghill <[email protected]> + + Kopete (c) 2002-2005 by the Kopete developers <[email protected]> + + ************************************************************************* + * * + * 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 <tqobject.h> +#include <tqguardedptr.h> +#include <tqvaluelist.h> +//END + +//BEGIN KDE Includes +#include <tdesocketaddress.h> +//END + +namespace KNetwork { +class KClientSocketBase; +} + +class MSNSwitchBoardSocket; + +namespace PeerToPeer { + +class MessageFormatter; +class TransportBridge; + +enum TransportBridgeType +{ + Tcp = 1, + Udp = 2 +}; + +/** + @author Gregg Edghill <[email protected]> */ +/** @brief Represents the protocol used to send and receive message between peers. */ +class Transport : public TQObject +{ + Q_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<TQString, KNetwork::KInetSocketAddress> mAddresses; + /** @brief The list the connected transport bridges. */ + TQValueList<TransportBridge*> mBridges; + /** @brief The default transport bridge (relay). */ + TQGuardedPtr<MSNSwitchBoardSocket> mDefaultBridge; + /** @brief Message formatter used to ser/deser message. */ + MessageFormatter *mFormatter; +}; + +/** @brief Represents the channel connecting two peers. */ +class TransportBridge : public TQObject +{ + Q_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 +{ + Q_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 |