⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pepeercontrolimpl.java

📁 java 文件下载器。可自定义
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
	{
		if (is_running && !seeding_mode && (prefer_udp || prefer_udp_default))
		{
			int udp = pc.getUDPListenPort();
			if (udp != 0 && udp == pc.getTCPListenPort())
			{
				BloomFilter filter = prefer_udp_bloom;
				if (filter == null)
					filter = prefer_udp_bloom = BloomFilterFactory.createAddOnly(10000);
				if (filter.getEntryCount() < 1000)
					filter.add(pc.getIp().getBytes());
			}
		}
		int piece = pc.getUniqueAnnounce();
		if (piece != -1 && superSeedMode)
		{
			superSeedModeNumberOfAnnounces--;
			superSeedPieces[piece].peerLeft();
		}
		int reserved_piece = pc.getReservedPieceNumber();
		if (reserved_piece >= 0)
		{
			PEPiece pe_piece = pePieces[reserved_piece];
			if (pe_piece != null)
			{
				String reserved_by = pe_piece.getReservedBy();
				if (reserved_by != null && reserved_by.equals(pc.getIp()))
					pe_piece.setReservedBy(null);
			}
		}
		adapter.removePeer(pc);
		ArrayList peer_manager_listeners = peer_manager_listeners_cow;
		for (int i = 0; i < peer_manager_listeners.size(); i++)
			((PEPeerManagerListener)peer_manager_listeners.get(i)).peerRemoved(this, pc);

	}

	public void addPiece(PEPiece piece, int pieceNumber)
	{
		addPiece(piece, pieceNumber, false);
	}

	protected void addPiece(PEPiece piece, int pieceNumber, boolean force_add)
	{
		pePieces[pieceNumber] = (PEPieceImpl)piece;
		nbPiecesActive++;
		if (is_running || force_add)
			adapter.addPiece(piece);
	}

	public void removePiece(PEPiece pePiece, int pieceNumber)
	{
		if (pePiece != null)
			adapter.removePiece(pePiece);
		pePieces[pieceNumber] = null;
		nbPiecesActive--;
	}

	public int getNbActivePieces()
	{
		return nbPiecesActive;
	}

	public String getElapsedTime()
	{
		return TimeFormatter.format((SystemTime.getCurrentTime() - _timeStarted) / 1000L);
	}

	public long getTimeStarted()
	{
		return _timeStarted;
	}

	public long getTimeStartedSeeding()
	{
		return _timeStartedSeeding;
	}

	private byte[] computeMd5Hash(DirectByteBuffer buffer)
	{
		BrokenMd5Hasher md5 = new BrokenMd5Hasher();
		md5.reset();
		int position = buffer.position((byte)8);
		md5.update(buffer.getBuffer((byte)8));
		buffer.position((byte)8, position);
		ByteBuffer md5Result = ByteBuffer.allocate(16);
		md5Result.position(0);
		md5.finalDigest(md5Result);
		byte result[] = new byte[16];
		md5Result.position(0);
		for (int i = 0; i < result.length; i++)
			result[i] = md5Result.get();

		return result;
	}

	private void MD5CheckPiece(PEPiece piece, boolean correct)
	{
		String writers[] = piece.getWriters();
		int offset = 0;
		for (int i = 0; i < writers.length; i++)
		{
			int length = piece.getBlockSize(i);
			String peer = writers[i];
			if (peer != null)
			{
				DirectByteBuffer buffer = disk_mgr.readBlock(piece.getPieceNumber(), offset, length);
				if (buffer != null)
				{
					byte hash[] = computeMd5Hash(buffer);
					buffer.returnToPool();
					buffer = null;
					piece.addWrite(i, peer, hash, correct);
				}
			}
			offset += length;
		}

	}

	public void checkCompleted(DiskManagerCheckRequest request, boolean passed)
	{
		piece_check_result_list_mon.enter();
		piece_check_result_list.add(((Object) (new Object[] {
			request, new Integer(passed ? 1 : 0)
		})));
		piece_check_result_list_mon.exit();
		break MISSING_BLOCK_LABEL_64;
		Exception exception;
		exception;
		piece_check_result_list_mon.exit();
		throw exception;
	}

	public void checkCancelled(DiskManagerCheckRequest request)
	{
		piece_check_result_list_mon.enter();
		piece_check_result_list.add(((Object) (new Object[] {
			request, new Integer(2)
		})));
		piece_check_result_list_mon.exit();
		break MISSING_BLOCK_LABEL_56;
		Exception exception;
		exception;
		piece_check_result_list_mon.exit();
		throw exception;
	}

	public void checkFailed(DiskManagerCheckRequest request, Throwable cause)
	{
		piece_check_result_list_mon.enter();
		piece_check_result_list.add(((Object) (new Object[] {
			request, new Integer(0)
		})));
		piece_check_result_list_mon.exit();
		break MISSING_BLOCK_LABEL_56;
		Exception exception;
		exception;
		piece_check_result_list_mon.exit();
		throw exception;
	}

	public boolean needsMD5CheckOnCompletion(int pieceNumber)
	{
		PEPieceImpl piece = pePieces[pieceNumber];
		if (piece == null)
			return false;
		else
			return piece.getPieceWrites().size() > 0;
	}

	private void processPieceCheckResult(DiskManagerCheckRequest request, int outcome)
	{
		int check_type = ((Integer)request.getUserData()).intValue();
		int pieceNumber;
		pieceNumber = request.getPieceNumber();
		if (check_type != 2)
			break MISSING_BLOCK_LABEL_114;
		if (outcome == 0)
		{
			Debug.out((new StringBuilder()).append(getDisplayName()).append(": Piece #").append(pieceNumber).append(" failed final re-check. Re-downloading...").toString());
			if (!restart_initiated)
			{
				restart_initiated = true;
				adapter.restartDownload(true);
			}
		}
		if (check_type == 3)
			rescan_piece_time = SystemTime.getCurrentTime();
		if (!seeding_mode)
			checkFinished(false);
		return;
		if (check_type != 4 && check_type != 5)
			break MISSING_BLOCK_LABEL_310;
		if (outcome == 0)
		{
			if (check_type == 4)
				Debug.out((new StringBuilder()).append(getDisplayName()).append("Piece #").append(pieceNumber).append(" failed recheck while seeding. Re-downloading...").toString());
			else
				Debug.out((new StringBuilder()).append(getDisplayName()).append("Piece #").append(pieceNumber).append(" failed recheck after being reported as bad. Re-downloading...").toString());
			Logger.log(new LogAlert(this, true, 3, (new StringBuilder()).append("Download '").append(getDisplayName()).append("': piece ").append(pieceNumber).append(" has been corrupted, re-downloading").toString()));
			if (!restart_initiated)
			{
				restart_initiated = true;
				adapter.restartDownload(true);
			}
		}
		if (check_type == 3)
			rescan_piece_time = SystemTime.getCurrentTime();
		if (!seeding_mode)
			checkFinished(false);
		return;
		PEPieceImpl pePiece;
		pePiece = pePieces[pieceNumber];
		if (outcome != 1)
			break MISSING_BLOCK_LABEL_544;
		if (pePiece != null)
		{
			if (needsMD5CheckOnCompletion(pieceNumber))
				MD5CheckPiece(pePiece, true);
			List list = pePiece.getPieceWrites();
			if (list.size() > 0)
			{
label0:
				for (int i = 0; i < pePiece.getNbBlocks(); i++)
				{
					List listPerBlock = pePiece.getPieceWrites(i);
					byte correctHash[] = null;
					Iterator iterPerBlock = listPerBlock.iterator();
					do
					{
						if (!iterPerBlock.hasNext())
							break;
						PEPieceWriteImpl write = (PEPieceWriteImpl)iterPerBlock.next();
						if (write.isCorrect())
							correctHash = write.getHash();
					} while (true);
					if (correctHash == null)
						continue;
					iterPerBlock = listPerBlock.iterator();
					do
					{
						PEPieceWriteImpl write;
						do
						{
							if (!iterPerBlock.hasNext())
								continue label0;
							write = (PEPieceWriteImpl)iterPerBlock.next();
						} while (Arrays.equals(write.getHash(), correctHash));
						badPeerDetected(write.getSender(), pieceNumber);
					} while (true);
				}

			}
		}
		removePiece(pePiece, pieceNumber);
		sendHave(pieceNumber);
		break MISSING_BLOCK_LABEL_1030;
		Exception exception;
		exception;
		removePiece(pePiece, pieceNumber);
		sendHave(pieceNumber);
		throw exception;
		if (outcome == 0)
			if (pePiece != null)
			{
				try
				{
					MD5CheckPiece(pePiece, false);
					String writers[] = pePiece.getWriters();
					List uniqueWriters = new ArrayList();
					int writesPerWriter[] = new int[writers.length];
					for (int i = 0; i < writers.length; i++)
					{
						String writer = writers[i];
						if (writer == null)
							continue;
						int writerId = uniqueWriters.indexOf(writer);
						if (writerId == -1)
						{
							uniqueWriters.add(writer);
							writerId = uniqueWriters.size() - 1;
						}
						writesPerWriter[writerId]++;
					}

					int nbWriters = uniqueWriters.size();
					if (nbWriters == 1)
					{
						String bad_ip = (String)uniqueWriters.get(0);
						PEPeerTransport bad_peer = getTransportFromAddress(bad_ip);
						if (bad_peer != null)
							bad_peer.sendBadPiece(pieceNumber);
						badPeerDetected(bad_ip, pieceNumber);
						pePiece.reset();
					} else
					if (nbWriters > 1)
					{
						int maxWrites = 0;
						String bestWriter = null;
						PEPeerTransport bestWriter_transport = null;
						for (int i = 0; i < uniqueWriters.size(); i++)
						{
							int writes = writesPerWriter[i];
							if (writes <= maxWrites)
								continue;
							String writer = (String)uniqueWriters.get(i);
							PEPeerTransport pt = getTransportFromAddress(writer);
							if (pt != null && pt.getReservedPieceNumber() == -1 && !ip_filter.isInRange(writer, getDisplayName(), getTorrentHash()))
							{
								bestWriter = writer;
								maxWrites = writes;
								bestWriter_transport = pt;
							}
						}

						if (bestWriter != null)
						{
							pePiece.setReservedBy(bestWriter);
							bestWriter_transport.setReservedPieceNumber(pePiece.getPieceNumber());
							pePiece.setRequestable();
							for (int i = 0; i < pePiece.getNbBlocks(); i++)
								if (writers[i] == null || !writers[i].equals(bestWriter))
									pePiece.reDownloadBlock(i);

						} else
						{
							pePiece.reset();
						}
					} else
					{
						pePiece.reset();
					}
					piecePicker.addEndGameChunks(pePiece);
					_stats.hashFailed(pePiece.getLength());
				}
				catch (Throwable e)
				{
					Debug.printStackTrace(e);
					pePiece.reset();
				}
			} else
			{
				Debug.out((new StringBuilder()).append(getDisplayName()).append("Piece #").append(pieceNumber).append(" failed check and no active piece, resetting...").toString());
				dm_pieces[pieceNumber].reset();
			}
		if (check_type == 3)
			rescan_piece_time = SystemTime.getCurrentTime();
		if (!seeding_mode)
			checkFinished(false);
		break MISSING_BLOCK_LABEL_1086;
		Exception exception1;
		exception1;
		if (check_type == 3)
			rescan_piece_time = SystemTime.getCurrentTime();
		if (!seeding_mode)
			checkFinished(false);
		throw exception1;
	}

	private void badPeerDetected(String ip, int piece_number)
	{
		boolean hash_fail = piece_number >= 0;
		PEPeerTransport peer = getTransportFromAddress(ip);
		if (hash_fail && peer != null)
		{
			for (Iterator it = peer_manager_listeners_cow.iterator(); it.hasNext();)
				try
				{
					((PEPeerManagerListener)it.next()).peerSentBadData(this, peer, piece_number);
				}
				catch (Throwable e)
				{
					Debug.printStackTrace(e);
				}

		}
		IpFilterManager filter_manager = IpFilterManagerFactory.getSingleton();
		int nbWarnings = filter_manager.getBadIps().addWarningForIp(ip);
		boolean disconnect_peer = false;
		if (nbWarnings > 2)
		{
			if (COConfigurationManager.getBooleanParameter("Ip Filter Enable Banning"))
			{
				if (ip_filter.ban(ip, getDisplayName(), false))
					checkForBannedConnections();
				if (Logger.isEnabled())
					Logger.log(new LogEvent(peer, LOGID, 3, (new StringBuilder()).append(ip).append(" : has been banned and won't be able ").append("to connect until you restart azureus").toString()));
				disconnect_peer = true;
			}
		} else
		if (!hash_fail)
			disconnect_peer = true;
		if (disconnect_peer && peer != null)
		{
			int ps = peer.getPeerState();
			if (ps != 40 && ps != 50)
				closeAndRemovePeer(peer, (new StringBuilder()).append("has sent too many ").append(hash_fail ? "bad pieces" : "discarded blocks").append(", ").append(2).append(" max.").toString(), true);
		}
	}

	public PEPiece[] getPieces()
	{
		return pePieces;
	}

	public PEPiece getPiece(int pieceNumber)
	{
		return pePieces[pieceNumber];
	}

	public PEPeerStats createPeerStats(PEPeer owner)
	{
		return new PEPeerStatsImpl(owner);
	}

	public DiskManagerReadRequest createDiskManagerRequest(int pieceNumber, int offset, int length)
	{
		return disk_mgr.createReadRequest(pieceNumber, offset, length);
	}

	public boolean requestExists(String peer_ip, int piece_number, int offset, int length)
	{
		ArrayList peer_transports = peer_transports_cow;
		DiskManagerR

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -