1 /*
2  * File    : PEPeerManager
3  * Created : 5 Oct. 2003
4  * By      : parg
5  *
6  * Azureus - a Java Bittorrent client
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details ( see the LICENSE file ).
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
22 
23 package org.gudy.azureus2.core3.peer;
24 
25 /**
26  * @author parg
27  * @author MjrTom
28  *			2005/Oct/08: pieceAdded => addPiece to simplify new piece-picking, getAvgAvail
29  *
30  */
31 
32 import java.util.*;
33 
34 import org.gudy.azureus2.core3.disk.*;
35 import org.gudy.azureus2.core3.peer.impl.PEPeerTransport;
36 import org.gudy.azureus2.core3.peer.util.PeerIdentityDataID;
37 import org.gudy.azureus2.core3.tracker.client.TRTrackerAnnouncerResponse;
38 import org.gudy.azureus2.core3.util.DirectByteBuffer;
39 import org.gudy.azureus2.core3.util.IndentWriter;
40 import org.gudy.azureus2.plugins.peers.PeerDescriptor;
41 
42 import com.aelitis.azureus.core.networkmanager.LimitedRateGroup;
43 import com.aelitis.azureus.core.peermanager.peerdb.PeerExchangerItem;
44 import com.aelitis.azureus.core.peermanager.piecepicker.PiecePicker;
45 import com.aelitis.azureus.core.tracker.TrackerPeerSource;
46 
47 
48 public interface
49 PEPeerManager
50 {
getDiskManager()51 	public DiskManager getDiskManager();
getPiecePicker()52 	public PiecePicker getPiecePicker();
53 
getAdapter()54 	public PEPeerManagerAdapter	getAdapter();
55 
56 	public void
start()57 	start();
58 
59 	public void
stopAll()60 	stopAll();
61 
62 	public byte[]
getHash()63 	getHash();
64 
65 	public String
getDisplayName()66 	getDisplayName();
67 
68 	public PeerIdentityDataID
getPeerIdentityDataID()69 	getPeerIdentityDataID();
70 
71 	public byte[]
getPeerId()72 	getPeerId();
73 
getAvailability()74 	public int[] getAvailability();
75 
getAvailability(int pieceNumber)76 	public int getAvailability(int pieceNumber);
77 
getAvgAvail()78 	public float getAvgAvail();
79 
getMinAvailability()80 	public float getMinAvailability();
81 
getMinAvailability( int file_index )82 	public float getMinAvailability( int file_index );
83 
getAvailWentBadTime()84 	public long getAvailWentBadTime();
85 
getBytesUnavailable()86 	public long getBytesUnavailable();
87 
hasDownloadablePiece()88 	public boolean hasDownloadablePiece();
89 
getBytesQueuedForUpload()90     public int	getBytesQueuedForUpload();
getNbPeersWithUploadQueued()91     public int	getNbPeersWithUploadQueued();
getNbPeersWithUploadBlocked()92     public int	getNbPeersWithUploadBlocked();
getNbPeersUnchoked()93     public int	getNbPeersUnchoked();
94 
95     /** Often better to use getPiece(pieceNumber)
96      */
getPieces()97 	public PEPiece[]	getPieces();
98 
99     /** @return PEPiece or null if piece not currently active
100      */
getPiece(int pieceNumber)101 	public PEPiece		getPiece(int pieceNumber);
102 
103 
104 	public PEPeerManagerStats
getStats()105 	getStats();
106 
107 	public void
processTrackerResponse( TRTrackerAnnouncerResponse response )108 	processTrackerResponse(
109 		TRTrackerAnnouncerResponse	response );
110 
getNbPeers()111 	public int getNbPeers();
112 
getNbSeeds()113 	public int getNbSeeds();
114 
getPieceLength(int pieceNumber)115 	public int getPieceLength(int pieceNumber);
116 
getRemaining()117 	public long getRemaining();
118 
getHiddenBytes()119 	public long getHiddenBytes();
120 
getETA( boolean smoothed )121 	public long getETA( boolean smoothed );
122 
getElapsedTime()123 	public String getElapsedTime();
124 
125 	// Time Started in ms
getTimeStarted( boolean mono_time )126 	public long getTimeStarted( boolean mono_time );
127 
getTimeStartedSeeding( boolean mono_time )128 	public long getTimeStartedSeeding( boolean mono_time );
129 
130 	public void
addListener( PEPeerManagerListener l )131 	addListener(
132 		PEPeerManagerListener	l );
133 
134 	public void
removeListener( PEPeerManagerListener l )135 	removeListener(
136 		PEPeerManagerListener	l );
137 
addPiece(PEPiece piece, int pieceNumber, PEPeer for_peer )138 	public void addPiece(PEPiece piece, int pieceNumber, PEPeer for_peer );
139 
needsMD5CheckOnCompletion(int pieceNumber)140   public boolean needsMD5CheckOnCompletion(int pieceNumber);
141 
142   public boolean
isSeeding()143   isSeeding();
144 
145   public boolean
isMetadataDownload()146   isMetadataDownload();
147 
148   public int
getTorrentInfoDictSize()149   getTorrentInfoDictSize();
150 
151   public void
setTorrentInfoDictSize( int size )152   setTorrentInfoDictSize(
153 	int	size );
154 
155   public boolean
isSuperSeedMode()156   isSuperSeedMode();
157 
158   public boolean
canToggleSuperSeedMode()159   canToggleSuperSeedMode();
160 
161   public void
setSuperSeedMode( boolean on )162   setSuperSeedMode( boolean on );
163 
164   public boolean
seedPieceRecheck()165   seedPieceRecheck();
166 
getNbRemoteTCPConnections()167   public int getNbRemoteTCPConnections();
getNbRemoteUDPConnections()168   public int getNbRemoteUDPConnections();
getNbRemoteUTPConnections()169   public int getNbRemoteUTPConnections();
170 
getLastRemoteConnectionTime()171   public long getLastRemoteConnectionTime();
172 
173   public int
getMaxNewConnectionsAllowed( String network )174   getMaxNewConnectionsAllowed( String network );
175 
176   public boolean
hasPotentialConnections()177   hasPotentialConnections();
178 
179   /**
180    * Data bytes received.
181    * @param l
182    */
dataBytesReceived( PEPeer peer, int l )183 	public void	dataBytesReceived( PEPeer peer, int	l );
184 
185   /**
186    * Data bytes sent.
187    * @param l
188    */
dataBytesSent( PEPeer peer, int l )189 	public void	dataBytesSent( PEPeer peer, int	l );
190 
191   /**
192    * Protocol bytes sent.
193    * @param length
194    */
protocolBytesSent( PEPeer peer, int length )195   public void protocolBytesSent( PEPeer peer, int length );
196 
197   /**
198    * Protocol bytes received.
199    * @param length
200    */
protocolBytesReceived( PEPeer peer, int length )201   public void protocolBytesReceived( PEPeer peer, int length );
202 
203 
204 
205 	public void
discarded( PEPeer peer, int l )206 	discarded(
207 		PEPeer peer,
208 		int		l );
209 
210 	public PEPeerStats
createPeerStats( PEPeer owner )211 	createPeerStats(
212 		PEPeer	owner );
213 
214 	public List<PEPeer>
getPeers()215 	getPeers();
216 
217 	public List<PEPeer>
getPeers( String address )218 	getPeers(
219 		String	address );
220 
221 	public int
getPendingPeerCount()222 	getPendingPeerCount();
223 
224 	public PeerDescriptor[]
getPendingPeers()225    	getPendingPeers();
226 
227 	public PeerDescriptor[]
getPendingPeers( String address )228 	getPendingPeers(
229 		String	address );
230 
231 	public void
addPeer( PEPeer peer )232 	addPeer(
233 		PEPeer	peer );
234 
235 
236   /**
237    * Add a new peer, using the default internal PEPeer implementation
238    * (like for peers given in announce reply), using the given address
239    * and port.
240    * @param ip_address of peer to inject
241    * @param tcp_port of peer to inject
242    * @param udp_port of peer to inject (0 if unknown)
243    * @param use_crypto use encrypted transport
244    */
245 
246 	public void
addPeer( String ip_address, int tcp_port, int udp_port, boolean use_crypto, Map user_data )247 	addPeer(
248 		String 		ip_address,
249 		int 		tcp_port,
250 		int			udp_port,
251 		boolean 	use_crypto,
252 		Map			user_data );
253 
254 	public void
peerDiscovered( String peer_source, String ip_address, int tcp_port, int udp_port, boolean use_crypto )255 	peerDiscovered(
256 		String		peer_source,
257 		String 		ip_address,
258 		int			tcp_port,
259 		int			udp_port,
260 		boolean 	use_crypto );
261 
262 	public void
removePeer( PEPeer peer )263 	removePeer(
264 		PEPeer	peer );
265 
266 	public void
removePeer( PEPeer peer, String reason )267 	removePeer(
268 		PEPeer	peer,
269 		String	reason );
270 
271 	public void
peerAdded(PEPeer pc)272 	peerAdded(PEPeer pc);
273 
274 	public void
peerRemoved(PEPeer pc)275 	peerRemoved(PEPeer pc);
276 
277 	public DiskManagerReadRequest
createDiskManagerRequest( int pieceNumber, int offset, int length )278 	createDiskManagerRequest(
279 	   int pieceNumber,
280 	   int offset,
281 	   int length );
282 
283 	public void
requestCanceled( DiskManagerReadRequest item )284 	requestCanceled(
285 		DiskManagerReadRequest	item );
286 
287 	public boolean
requestExists( String peer_ip, int piece_number, int offset, int length )288 	requestExists(
289 		String			peer_ip,
290 		int				piece_number,
291 		int				offset,
292 		int				length );
293 
294 	public boolean
validatePieceReply( PEPeerTransport originator, int pieceNumber, int offset, DirectByteBuffer data )295 	validatePieceReply(
296 		PEPeerTransport		originator,
297 		int 				pieceNumber,
298 		int 				offset,
299 		DirectByteBuffer 	data );
300 
301 	public void
writeBlock( int pieceNumber, int offset, DirectByteBuffer data, Object sender, boolean cancel)302 	writeBlock(
303 		int 				pieceNumber,
304 		int 				offset,
305 		DirectByteBuffer 	data,
306 		Object 				sender,			// either a PEPeer or a String
307         boolean     		cancel);
308 
309 //  public void writeBlockAndCancelOutstanding(int pieceNumber, int offset, DirectByteBuffer data,PEPeer sender);
310 
isWritten( int piece_number, int offset )311   public boolean isWritten( int piece_number, int offset );
312 
313   /**
314    * Are we in end-game mode?
315    * @return true if in end game mode, false if not
316    */
isInEndGameMode()317   public boolean isInEndGameMode();
318 
319   /**
320    * Notify the manager that the given peer connection has been closed.
321    * @param peer closed
322    */
peerConnectionClosed( PEPeerTransport peer, boolean connect_failed, boolean network_failed )323   public void peerConnectionClosed( PEPeerTransport peer, boolean connect_failed, boolean network_failed );
324 
325 
326 
327   /**
328    * Register a peer connection for peer exchange handling.
329    * NOTE: Creation could fail if the peer is not eligible for peer exchange (like if it's remote port is unknown).
330    * @param base_peer exchaning with
331    * @return peer database connection item, or null if creation failed
332    */
createPeerExchangeConnection( PEPeerTransport base_peer )333   public PeerExchangerItem createPeerExchangeConnection( PEPeerTransport base_peer );
334 
335 
336   /**
337    * Notify that the given peer connection represents our own client.
338    * @param self peer
339    */
peerVerifiedAsSelf( PEPeerTransport self )340   public void peerVerifiedAsSelf( PEPeerTransport self );
341 
342 
343   /**
344    * Get the limited rate group used for upload limiting.
345    * @return upload limit group
346    */
getUploadLimitedRateGroup()347   public LimitedRateGroup getUploadLimitedRateGroup();
348 
349   /**
350    * Get the limited rate group used for download limiting.
351    * @return download limit group
352    */
getDownloadLimitedRateGroup()353   public LimitedRateGroup getDownloadLimitedRateGroup();
354 
getUploadRateLimitBytesPerSecond()355   public int getUploadRateLimitBytesPerSecond();
356 
getDownloadRateLimitBytesPerSecond()357   public int getDownloadRateLimitBytesPerSecond();
358 
359   /** To retreive arbitrary objects against this object. */
getData(String key)360   public Object getData (String key);
361   /** To store arbitrary objects against this object. */
setData(String key, Object value)362   public void setData (String key, Object value);
363 
364 
365   /**
366    * Get the average completion percentage of connected peers.
367    * @return average percent complete in thousand notation
368    */
getAverageCompletionInThousandNotation()369   public int getAverageCompletionInThousandNotation();
370 
371 	/**
372 	 * Locate an existing transport via peer id byte identity.
373 	 * @param peer_id to look for
374 	 * @return transport with matching identity, or null if no match is found
375 	 */
getTransportFromIdentity( byte[] peer_id )376 	public PEPeerTransport getTransportFromIdentity( byte[] peer_id );
377 
378 	/**
379 	 * Locate an existing transport via [IP] Address.
380 	 * @param peer String to look for
381 	 * @return PEPeerTransport with matching address String, or null if no match is found
382 	 */
getTransportFromAddress(String peer)383 	public PEPeerTransport getTransportFromAddress(String peer);
384 
385 	public boolean
getPreferUDP()386 	getPreferUDP();
387 
388 	public void
setPreferUDP( boolean prefer )389 	setPreferUDP(
390 		boolean	prefer );
391 
392 	public void
addRateLimiter( LimitedRateGroup group, boolean upload )393 	addRateLimiter(
394 		LimitedRateGroup	group,
395 		boolean				upload );
396 
397 	public void
removeRateLimiter( LimitedRateGroup group, boolean upload )398 	removeRateLimiter(
399 		LimitedRateGroup	group,
400 		boolean				upload );
401 
402 	public TrackerPeerSource
getTrackerPeerSource()403 	getTrackerPeerSource();
404 
405 	public boolean
isPeerSourceEnabled( String peer_source )406 	isPeerSourceEnabled(
407 		String	peer_source );
408 
409 	public boolean
isNetworkEnabled( String network )410 	isNetworkEnabled(
411 		String	network );
412 
413 	public int
getPartitionID()414 	getPartitionID();
415 
416 	public boolean
isDestroyed()417 	isDestroyed();
418 
419 	public void
generateEvidence( IndentWriter writer )420 	generateEvidence(
421 		IndentWriter		writer );
422 
423 	public void
setStatsReceiver( StatsReceiver receiver )424 	setStatsReceiver(
425 		StatsReceiver	receiver );
426 
427 	public interface
428 	StatsReceiver
429 	{
430 		public void
receiveStats( PEPeer peer, Map stats )431 		receiveStats(
432 			PEPeer		peer,
433 			Map			stats );
434 	}
435 
436 }
437