/* p2p.h - msn p2p protocol Copyright (c) 2003-2005 by Olivier Goffart Copyright (c) 2005 by Gregg Edghill ************************************************************************* * * * 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; either version 2 of the License, or * * (at your option) any later version. * * * ************************************************************************* */ #ifndef P2P_H #define P2P_H // Qt includes #include #include "messageformatter.h" #include "kopete_export.h" #include "config.h" namespace Kopete { class Transfer; } namespace Kopete { struct FileTransferInfo; } namespace P2P { class Dispatcher; } namespace KNetwork { class KBufferedSocket; } class TQFile; class KTempFile; /** @author Kopete Developers */ namespace System{ class Guid { public: ~Guid(){} static Guid newGuid(); TQString toString(); private: Guid(){} }; } namespace P2P{ enum TransferType { UserDisplayIcon = 1, File = 2, WebcamType=4}; enum TransferDirection { Incoming = 1, Outgoing = 8}; enum MessageType { BYE, OK, DECLINE, ERROR, INVITE }; enum CommunicationState { Invitation = 1, Negotiation = 2, DataTransfer = 8, Finished = 16 }; struct TransportHeader { Q_UINT32 sessionId; Q_UINT32 identifier; Q_INT64 dataOffset; Q_INT64 totalDataSize; Q_UINT32 dataSize; Q_UINT32 flag; Q_UINT32 ackSessionIdentifier; Q_UINT32 ackUniqueIdentifier; Q_INT64 ackDataSize; }; struct Message { public: TQString mimeVersion; TQString contentType; TQString destination; TQString source; TransportHeader header; TQByteArray body; Q_INT32 applicationIdentifier; bool attachApplicationIdentifier; }; class KOPETE_EXPORT Uid { public: static TQString createUid(); }; class KOPETE_EXPORT TransferContext : public QObject { Q_OBJECT public: virtual ~TransferContext(); void acknowledge(const Message& message); virtual void acknowledged() = 0; void error(); virtual void processMessage(const P2P::Message& message) = 0; void sendDataPreparation(); void sendMessage(MessageType type, const TQString& content=TQString::null, Q_INT32 flag=0, Q_INT32 appId=0); void setType(TransferType type); public: Q_UINT32 m_sessionId; Q_UINT32 m_identifier; TQFile *m_file; Q_UINT32 m_transactionId; Q_UINT32 m_ackSessionIdentifier; Q_UINT32 m_ackUniqueIdentifier; Kopete::Transfer *m_transfer; TQString m_branch; TQString m_callId; TQString m_object; public slots: void abort(); void readyWrite(); protected: TransferContext(const TQString& contact, P2P::Dispatcher *dispatcher,Q_UINT32 sessionId); void sendData(const TQByteArray& bytes); void sendMessage(P2P::Message& outbound, const TQByteArray& body); virtual void readyToSend(); Q_UINT32 m_baseIdentifier; TransferDirection m_direction; P2P::Dispatcher *m_dispatcher; bool m_isComplete; Q_INT64 m_offset; Q_INT64 m_totalDataSize; P2P::MessageFormatter m_messageFormatter; TQString m_recipient; TQString m_sender; KNetwork::KBufferedSocket *m_socket; CommunicationState m_state; TransferType m_type; }; } #endif