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
|
/***************************************************************************
* Copyright (C) 2005 by Joris Guisson *
* joris.guisson@gmail.com *
* *
* 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. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef BTUDPTRACKERSOCKET_H
#define BTUDPTRACKERSOCKET_H
#include <tqobject.h>
#include <tqmap.h>
#include <tqcstring.h>
#include <util/constants.h>
namespace KNetwork
{
class KDatagramSocket;
class TDESocketAddress;
}
namespace bt
{
enum Action
{
CONNECT = 0,
ANNOUNCE = 1,
SCRAPE = 2,
ERROR = 3
};
/**
* @author Joris Guisson
*
* Class which handles communication with one or more UDP trackers.
*/
class UDPTrackerSocket : public TQObject
{
Q_OBJECT
public:
UDPTrackerSocket();
virtual ~UDPTrackerSocket();
/**
* Send a connect message. As a response to this, the connectRecieved
* signal will be emitted, classes recieving this signal should check if
* the transaction_id is the same.
* @param tid The transaction_id
* @param addr The address to send to
*/
void sendConnect(Int32 tid,const KNetwork::TDESocketAddress & addr);
/**
* Send an announce message. As a response to this, the announceRecieved
* signal will be emitted, classes recieving this signal should check if
* the transaction_id is the same.
* @param tid The transaction_id
* @param data The data to send (connect input structure, in UDP Tracker specifaction)
* @param addr The address to send to
*/
void sendAnnounce(Int32 tid,const Uint8* data,const KNetwork::TDESocketAddress & addr);
/**
* If a transaction times out, this should be used to cancel it.
* @param tid
*/
void cancelTransaction(Int32 tid);
/**
* Compute a free transaction_id.
* @return A free transaction_id
*/
Int32 newTransactionID();
/**
* Set the port ot use.
* @param p The port
*/
static void setPort(Uint16 p);
/// Get the port in use.
static Uint16 getPort();
private slots:
void dataReceived();
signals:
/**
* Emitted when a connect message is received.
* @param tid The transaction_id
* @param connection_id The connection_id returned
*/
void connectRecieved(Int32 tid,Int64 connection_id);
/**
* Emitted when an announce message is received.
* @param tid The transaction_id
* @param buf The data
*/
void announceRecieved(Int32 tid,const TQByteArray & buf);
/**
* Signal emitted, when an error occurs during a transaction.
* @param tid The transaction_id
* @param error_string Potential error string
*/
void error(Int32 tid,const TQString & error_string);
private:
void handleConnect(const TQByteArray & buf);
void handleAnnounce(const TQByteArray & buf);
void handleError(const TQByteArray & buf);
private:
Uint16 udp_port;
KNetwork::KDatagramSocket* sock;
TQMap<Int32,Action> transactions;
static Uint16 port;
};
}
#endif
|