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