2
* lftp - file transfer program
4
* Copyright (c) 1996-2014 by Alexander V. Lukyanov (lav@yars.free.net)
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 3 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
20
#ifndef TORRENTTRACKER_H
21
#define TORRENTTRACKER_H
26
class TorrentTracker : public SMTask, protected ProtoLog
29
friend class TrackerBackend;
33
xarray_p<xstring> tracker_urls;
35
SMTaskRef<TrackerBackend> backend;
37
Timer tracker_timeout_timer;
43
TorrentTracker(Torrent *p,const char *url);
44
void AddURL(const char *url);
50
void SendTrackerRequest(const char *event);
52
void SetError(const char *e);
53
bool Failed() const { return error!=0 || tracker_urls.count()==0; }
54
const char *ErrorText() const { return error->Text(); }
57
void CreateTrackerBackend();
58
const char *GetLogContext() { return GetURL(); }
62
const char *NextRequestIn() const {
63
return tracker_timer.TimeLeft().toString(
64
TimeInterval::TO_STR_TRANSLATE|TimeInterval::TO_STR_TERSE);
66
const char *GetURL() const {
67
return tracker_urls[current_tracker]->get();
69
const char *Status() const;
70
bool IsActive() const;
71
void TrackerRequestFinished() { tracker_timer.Reset(); }
72
void SetInterval(unsigned i) {
76
LogNote(4,"Tracker interval is %u",i);
78
void SetTrackerID(const xstring& id) {
82
bool AddPeerCompact(const char *a,int len) const;
83
bool AddPeer(const xstring& addr,int port) const;
87
class TrackerBackend : public SMTask, protected ProtoLog
90
TorrentTracker *master;
91
void SetError(const char *e) { master->SetError(e); }
93
const char *GetURL() const { return master->GetURL(); }
94
const xstring& GetInfoHash() const;
95
const xstring& GetMyPeerId() const;
97
unsigned long long GetTotalSent() const;
98
unsigned long long GetTotalRecv() const;
99
unsigned long long GetTotalLeft() const;
100
bool HasMetadata() const;
101
bool Complete() const;
102
int GetWantedPeersCount() const;
103
const xstring& GetMyKey() const;
104
unsigned GetMyKeyNum() const;
105
const char *GetTrackerId() const;
106
void SetTrackerID(const xstring& id) const { master->SetTrackerID(id); }
107
void SetInterval(unsigned i) const { master->SetInterval(i); }
108
bool AddPeerCompact(const char *a,int len) const { return master->AddPeerCompact(a,len); }
109
bool AddPeer(const xstring& addr,int port) const { return master->AddPeer(addr,port); }
110
void NextTracker() const { master->NextTracker(); }
111
bool ShuttingDown() const;
112
void Started() const;
113
void TrackerRequestFinished() const;
114
const char *GetLogContext() { return master->GetLogContext(); }
117
TrackerBackend(TorrentTracker *m) : master(m) {}
118
virtual ~TrackerBackend() {}
119
virtual bool IsActive() const = 0;
120
virtual void SendTrackerRequest(const char *event) = 0;
121
virtual const char *Status() const = 0;
123
class HttpTracker : public TrackerBackend
125
FileAccessRef t_session;
126
SMTaskRef<IOBuffer> tracker_reply;
127
int HandleTrackerReply();
129
bool IsActive() const { return tracker_reply!=0; }
130
void SendTrackerRequest(const char *event);
131
HttpTracker(TorrentTracker *m,ParsedURL *u)
132
: TrackerBackend(m), t_session(FileAccess::New(u)) {}
135
const char *Status() const { return t_session->CurrentStatus(); }
137
class UdpTracker : public TrackerBackend, protected Networker
142
SMTaskRef<Resolver> resolver;
144
xarray<sockaddr_u> peer;
148
int sock; // udp socket for packet exchange
151
int try_number; // timeout = 60 * 2^try_number
153
bool has_connection_id;
154
unsigned long long connection_id;
172
connect_magic=0x41727101980ULL,
174
static const char *EventToString(event_t e);
176
unsigned transaction_id;
177
action_t current_action;
178
event_t current_event;
180
bool SendPacket(Buffer& req);
181
bool SendConnectRequest();
182
bool SendEventRequest();
185
unsigned NewTransactionId() { return transaction_id=random(); }
188
UdpTracker(TorrentTracker *m,ParsedURL *u)
190
hostname(u->host.get()), portname(u->port.get()),
191
peer_curr(0), sock(-1), timeout_timer(60), try_number(0),
192
has_connection_id(false), connection_id(0),
193
current_action(a_none), current_event(ev_idle) {}
199
bool IsActive() const { return current_event!=ev_idle; }
200
void SendTrackerRequest(const char *event);
201
const char *Status() const;
204
#endif // TORRENTTRACKER_H