2
* Created on 14-Feb-2005
3
* Created by Paul Gardner
4
* Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved.
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
* AELITIS, SAS au capital de 46,603.30 euros
19
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
23
package org.gudy.azureus2.core3.tracker.client.impl.dht;
28
import org.gudy.azureus2.core3.internat.MessageText;
29
import org.gudy.azureus2.core3.logging.*;
30
import org.gudy.azureus2.core3.torrent.TOTorrent;
31
import org.gudy.azureus2.core3.torrent.TOTorrentException;
32
import org.gudy.azureus2.core3.tracker.client.TRTrackerAnnouncer;
33
import org.gudy.azureus2.core3.tracker.client.TRTrackerAnnouncerDataProvider;
34
import org.gudy.azureus2.core3.tracker.client.TRTrackerAnnouncerException;
35
import org.gudy.azureus2.core3.tracker.client.TRTrackerAnnouncerResponse;
36
import org.gudy.azureus2.core3.tracker.client.TRTrackerAnnouncerResponsePeer;
37
import org.gudy.azureus2.core3.tracker.client.impl.TRTrackerAnnouncerImpl;
38
import org.gudy.azureus2.core3.tracker.client.impl.TRTrackerAnnouncerResponseImpl;
39
import org.gudy.azureus2.core3.tracker.client.impl.TRTrackerAnnouncerResponsePeerImpl;
40
import org.gudy.azureus2.core3.util.Debug;
41
import org.gudy.azureus2.core3.util.HashWrapper;
42
import org.gudy.azureus2.core3.util.SystemTime;
43
import org.gudy.azureus2.plugins.clientid.ClientIDException;
44
import org.gudy.azureus2.plugins.download.DownloadAnnounceResult;
45
import org.gudy.azureus2.plugins.download.DownloadAnnounceResultPeer;
46
import org.gudy.azureus2.pluginsimpl.local.clientid.ClientIDManagerImpl;
54
TRTrackerDHTAnnouncerImpl
55
extends TRTrackerAnnouncerImpl
57
private TOTorrent torrent;
58
private HashWrapper torrent_hash;
59
private byte[] data_peer_id;
61
private String tracker_status_str;
62
private long last_update_time;
64
private int state = TS_INITIALISED;
66
private TRTrackerAnnouncerResponseImpl last_response;
68
private boolean manual;
71
TRTrackerDHTAnnouncerImpl(
76
throws TRTrackerAnnouncerException
84
torrent_hash = torrent.getHashWrapper();
86
}catch( TOTorrentException e ){
88
Debug.printStackTrace(e);
91
data_peer_id = ClientIDManagerImpl.getSingleton().generatePeerID( torrent, false );
93
}catch( ClientIDException e ){
95
throw( new TRTrackerAnnouncerException( "TRTrackerAnnouncer: Peer ID generation fails", e ));
99
new TRTrackerAnnouncerResponseImpl(
100
torrent.getAnnounceURL(),
102
TRTrackerAnnouncerResponse.ST_OFFLINE, 0, "Initialising" );
104
tracker_status_str = MessageText.getString("PeerManager.status.checking") + "...";
108
setAnnounceDataProvider(
109
TRTrackerAnnouncerDataProvider provider )
129
return( torrent.getAnnounceURL());
136
Debug.out( "setTrackerURL not supported for DHT" );
147
TRTrackerAnnouncer other )
149
data_peer_id = other.getPeerId();
172
return( data_peer_id );
176
setRefreshDelayOverrides(
182
getTimeUntilNextUpdate()
184
long elapsed = (SystemTime.getCurrentTime() - last_update_time)/1000;
186
return( (int)(last_response.getTimeToWait()-elapsed));
192
return( (int)(last_update_time/1000));
199
state = TS_DOWNLOADING;
206
boolean already_reported )
208
state = TS_COMPLETED;
232
return( tracker_status_str );
235
public TRTrackerAnnouncerResponse
238
return( last_response );
248
DownloadAnnounceResult result )
250
last_update_time = SystemTime.getCurrentTime();
252
TRTrackerAnnouncerResponseImpl response;
254
if ( result.getResponseType() == DownloadAnnounceResult.RT_ERROR ){
256
tracker_status_str = MessageText.getString("PeerManager.status.error");
258
String reason = result.getError();
260
if ( reason != null ){
262
tracker_status_str += " (" + reason + ")";
265
response = new TRTrackerAnnouncerResponseImpl(
268
TRTrackerAnnouncerResponse.ST_OFFLINE,
269
result.getTimeToWait(),
272
DownloadAnnounceResultPeer[] ext_peers = result.getPeers();
274
TRTrackerAnnouncerResponsePeerImpl[] peers = new TRTrackerAnnouncerResponsePeerImpl[ext_peers.length];
276
for (int i=0;i<ext_peers.length;i++){
278
DownloadAnnounceResultPeer ext_peer = ext_peers[i];
280
if (Logger.isEnabled())
281
Logger.log(new LogEvent(torrent, LOGID, "EXTERNAL PEER DHT: ip="
282
+ ext_peer.getAddress() + ",port=" + ext_peer.getPort() +",prot=" + ext_peer.getProtocol()));
285
byte az_version = TRTrackerAnnouncer.AZ_TRACKER_VERSION_1;
287
peers[i] = new TRTrackerAnnouncerResponsePeerImpl(
288
ext_peer.getSource(),
289
ext_peer.getPeerID(),
290
ext_peer.getAddress(),
292
ext_peer.getUDPPort(),
294
ext_peer.getProtocol(),
299
addToTrackerCache( peers);
301
tracker_status_str = MessageText.getString("PeerManager.status.ok");
303
response = new TRTrackerAnnouncerResponseImpl( result.getURL(), torrent_hash, TRTrackerAnnouncerResponse.ST_ONLINE, result.getTimeToWait(), peers );
306
last_response = response;
308
listeners.dispatch( LDT_TRACKER_RESPONSE, response );
314
if ( last_response.getStatus() != TRTrackerAnnouncerResponse.ST_ONLINE ){
316
TRTrackerAnnouncerResponsePeer[] cached_peers = getPeersFromCache(100);
318
if ( cached_peers.length > 0 ){
320
last_response.setPeers( cached_peers );
322
listeners.dispatch( LDT_TRACKER_RESPONSE, last_response );
2
* Created on 14-Feb-2005
3
* Created by Paul Gardner
4
* Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved.
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
* AELITIS, SAS au capital de 46,603.30 euros
19
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
23
package org.gudy.azureus2.core3.tracker.client.impl.dht;
28
import org.gudy.azureus2.core3.internat.MessageText;
29
import org.gudy.azureus2.core3.logging.*;
30
import org.gudy.azureus2.core3.torrent.TOTorrent;
31
import org.gudy.azureus2.core3.torrent.TOTorrentException;
32
import org.gudy.azureus2.core3.tracker.client.TRTrackerAnnouncer;
33
import org.gudy.azureus2.core3.tracker.client.TRTrackerAnnouncerDataProvider;
34
import org.gudy.azureus2.core3.tracker.client.TRTrackerAnnouncerException;
35
import org.gudy.azureus2.core3.tracker.client.TRTrackerAnnouncerResponse;
36
import org.gudy.azureus2.core3.tracker.client.TRTrackerAnnouncerResponsePeer;
37
import org.gudy.azureus2.core3.tracker.client.impl.TRTrackerAnnouncerImpl;
38
import org.gudy.azureus2.core3.tracker.client.impl.TRTrackerAnnouncerResponseImpl;
39
import org.gudy.azureus2.core3.tracker.client.impl.TRTrackerAnnouncerResponsePeerImpl;
40
import org.gudy.azureus2.core3.util.Debug;
41
import org.gudy.azureus2.core3.util.HashWrapper;
42
import org.gudy.azureus2.core3.util.IndentWriter;
43
import org.gudy.azureus2.core3.util.SystemTime;
44
import org.gudy.azureus2.plugins.clientid.ClientIDException;
45
import org.gudy.azureus2.plugins.download.DownloadAnnounceResult;
46
import org.gudy.azureus2.plugins.download.DownloadAnnounceResultPeer;
47
import org.gudy.azureus2.pluginsimpl.local.clientid.ClientIDManagerImpl;
55
TRTrackerDHTAnnouncerImpl
56
extends TRTrackerAnnouncerImpl
58
private TOTorrent torrent;
59
private HashWrapper torrent_hash;
60
private byte[] data_peer_id;
62
private String tracker_status_str;
63
private long last_update_time;
65
private int state = TS_INITIALISED;
67
private TRTrackerAnnouncerResponseImpl last_response;
69
private boolean manual;
72
TRTrackerDHTAnnouncerImpl(
77
throws TRTrackerAnnouncerException
85
torrent_hash = torrent.getHashWrapper();
87
}catch( TOTorrentException e ){
89
Debug.printStackTrace(e);
92
data_peer_id = ClientIDManagerImpl.getSingleton().generatePeerID( torrent, false );
94
}catch( ClientIDException e ){
96
throw( new TRTrackerAnnouncerException( "TRTrackerAnnouncer: Peer ID generation fails", e ));
100
new TRTrackerAnnouncerResponseImpl(
101
torrent.getAnnounceURL(),
103
TRTrackerAnnouncerResponse.ST_OFFLINE, 0, "Initialising" );
105
tracker_status_str = MessageText.getString("PeerManager.status.checking") + "...";
109
setAnnounceDataProvider(
110
TRTrackerAnnouncerDataProvider provider )
130
return( torrent.getAnnounceURL());
137
Debug.out( "setTrackerURL not supported for DHT" );
148
TRTrackerAnnouncer other )
150
data_peer_id = other.getPeerId();
173
return( data_peer_id );
177
setRefreshDelayOverrides(
183
getTimeUntilNextUpdate()
185
long elapsed = (SystemTime.getCurrentTime() - last_update_time)/1000;
187
return( (int)(last_response.getTimeToWait()-elapsed));
193
return( (int)(last_update_time/1000));
200
state = TS_DOWNLOADING;
207
boolean already_reported )
209
state = TS_COMPLETED;
233
return( tracker_status_str );
236
public TRTrackerAnnouncerResponse
239
return( last_response );
249
DownloadAnnounceResult result )
251
last_update_time = SystemTime.getCurrentTime();
253
TRTrackerAnnouncerResponseImpl response;
255
if ( result.getResponseType() == DownloadAnnounceResult.RT_ERROR ){
257
tracker_status_str = MessageText.getString("PeerManager.status.error");
259
String reason = result.getError();
261
if ( reason != null ){
263
tracker_status_str += " (" + reason + ")";
266
response = new TRTrackerAnnouncerResponseImpl(
269
TRTrackerAnnouncerResponse.ST_OFFLINE,
270
result.getTimeToWait(),
273
DownloadAnnounceResultPeer[] ext_peers = result.getPeers();
275
TRTrackerAnnouncerResponsePeerImpl[] peers = new TRTrackerAnnouncerResponsePeerImpl[ext_peers.length];
277
for (int i=0;i<ext_peers.length;i++){
279
DownloadAnnounceResultPeer ext_peer = ext_peers[i];
281
if (Logger.isEnabled())
282
Logger.log(new LogEvent(torrent, LOGID, "EXTERNAL PEER DHT: ip="
283
+ ext_peer.getAddress() + ",port=" + ext_peer.getPort() +",prot=" + ext_peer.getProtocol()));
286
byte az_version = TRTrackerAnnouncer.AZ_TRACKER_VERSION_1;
288
peers[i] = new TRTrackerAnnouncerResponsePeerImpl(
289
ext_peer.getSource(),
290
ext_peer.getPeerID(),
291
ext_peer.getAddress(),
293
ext_peer.getUDPPort(),
295
ext_peer.getProtocol(),
300
addToTrackerCache( peers);
302
tracker_status_str = MessageText.getString("PeerManager.status.ok");
304
response = new TRTrackerAnnouncerResponseImpl( result.getURL(), torrent_hash, TRTrackerAnnouncerResponse.ST_ONLINE, result.getTimeToWait(), peers );
307
last_response = response;
309
listeners.dispatch( LDT_TRACKER_RESPONSE, response );
315
if ( last_response.getStatus() != TRTrackerAnnouncerResponse.ST_ONLINE ){
317
TRTrackerAnnouncerResponsePeer[] cached_peers = getPeersFromCache(100);
319
if ( cached_peers.length > 0 ){
321
last_response.setPeers( cached_peers );
323
listeners.dispatch( LDT_TRACKER_RESPONSE, last_response );
330
IndentWriter writer )
332
writer.println( "DHT announce: " + (last_response==null?"null":last_response.getString()));