summaryrefslogtreecommitdiffstats
path: root/kopete/protocols/msn/p2p.h
blob: e98e73643e012a3143c7b71dc632621d6429b269 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
    p2p.h - msn p2p protocol

    Copyright (c) 2003-2005 by Olivier Goffart        <ogoffart@ kde.org>
    Copyright (c) 2005      by Gregg Edghill          <[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; either version 2 of the License, or     *
    * (at your option) any later version.                                   *
    *                                                                       *
    *************************************************************************
*/

#ifndef P2P_H
#define P2P_H

// TQt includes
#include <tqobject.h>
#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
	{
		TQ_UINT32 sessionId;
		TQ_UINT32 identifier;
		TQ_INT64  dataOffset;
		TQ_INT64  totalDataSize;
		TQ_UINT32 dataSize;
		TQ_UINT32 flag;
		TQ_UINT32 ackSessionIdentifier;
		TQ_UINT32 ackUniqueIdentifier;
		TQ_INT64  ackDataSize;
	};

	struct Message
	{
		public:
			TQString mimeVersion;
			TQString contentType;
			TQString destination;
			TQString source;
			TransportHeader header;
			TQByteArray body;
			TQ_INT32 applicationIdentifier;
			bool attachApplicationIdentifier;
	};

	class KOPETE_EXPORT Uid
	{
		public: static TQString createUid();
	};

	class KOPETE_EXPORT TransferContext : public TQObject
	{	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(), TQ_INT32 flag=0, TQ_INT32 appId=0);
			void setType(TransferType type);

		public:
			TQ_UINT32 m_sessionId;
			TQ_UINT32 m_identifier;
			TQFile   *m_file;
			TQ_UINT32 m_transactionId;
			TQ_UINT32 m_ackSessionIdentifier;
			TQ_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,TQ_UINT32 sessionId);
			void sendData(const TQByteArray& bytes);
			void sendMessage(P2P::Message& outbound, const TQByteArray& body);
			virtual void readyToSend();

			TQ_UINT32 m_baseIdentifier;
			TransferDirection m_direction;
			P2P::Dispatcher *m_dispatcher;
			bool m_isComplete;
			TQ_INT64 m_offset;
			TQ_INT64 m_totalDataSize;
			P2P::MessageFormatter m_messageFormatter;
			TQString m_recipient;
			TQString m_sender;
			KNetwork::KBufferedSocket *m_socket;
   			CommunicationState m_state;
   			TransferType m_type;
	};
}

#endif