/* * Created on Jul 23, 2005 * Created by Alon Rohter * Copyright (C) 2005, 2006 Aelitis, All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * AELITIS, SAS au capital de 46,603.30 euros * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France. * */ package com.aelitis.azureus.core.peermanager.download.session.impl; import org.gudy.azureus2.core3.util.DirectByteBuffer; import com.aelitis.azureus.core.networkmanager.*; import com.aelitis.azureus.core.peermanager.connection.AZPeerConnection; import com.aelitis.azureus.core.peermanager.download.session.*; import com.aelitis.azureus.core.peermanager.messaging.Message; import com.aelitis.azureus.core.peermanager.messaging.bittorrent.*; public class BTTorrentSession implements TorrentSession { private final TorrentSessionListener listener; private final AZPeerConnection peer; private final IncomingMessageQueue.MessageQueueListener incoming_q_listener = new IncomingMessageQueue.MessageQueueListener() { public boolean messageReceived( Message message ) { //ID_BT_BITFIELD if( message.getID().equals( BTMessage.ID_BT_BITFIELD ) ) { BTBitfield bitf = (BTBitfield)message; listener.receivedSessionBitfield( bitf.getBitfield() ); return true; } //ID_BT_HAVE if( message.getID().equals( BTMessage.ID_BT_HAVE ) ) { BTHave have = (BTHave)message; listener.receivedSessionHave( have.getPieceNumber() ); return true; } //ID_BT_REQUEST if( message.getID().equals( BTMessage.ID_BT_REQUEST ) ) { BTRequest req = (BTRequest)message; listener.receivedSessionRequest( (byte)-1, req.getPieceNumber(), req.getPieceOffset(), req.getLength() ); return true; } //ID_BT_CANCEL if( message.getID().equals( BTMessage.ID_BT_CANCEL ) ) { BTCancel can = (BTCancel)message; listener.receivedSessionCancel( can.getPieceNumber(), can.getPieceOffset(), can.getLength() ); return true; } //ID_BT_PIECE if( message.getID().equals( BTMessage.ID_BT_PIECE ) ) { BTPiece piece = (BTPiece)message; listener.receivedSessionPiece( piece.getPieceNumber(), piece.getPieceOffset(), piece.getPieceData() ); return true; } return false; } public void protocolBytesReceived( int byte_count ) {} public void dataBytesReceived( int byte_count ) {} }; private final OutgoingMessageQueue.MessageQueueListener sent_message_listener = new OutgoingMessageQueue.MessageQueueListener() { public boolean messageAdded( Message message ) { return true; } public void messageSent( Message message ) { if( message.getID().equals( BTMessage.ID_BT_PIECE ) ) { listener.sentSessionPiece( message ); } } public void messageQueued( Message message ) {/*nothing*/} public void messageRemoved( Message message ) {/*nothing*/} public void protocolBytesSent( int byte_count ) {/*ignore*/} public void dataBytesSent( int byte_count ) {/*ignore*/} public void flush(){} }; public BTTorrentSession( AZPeerConnection peer, TorrentSessionListener listener ) { this.peer = peer; this.listener = listener; peer.getNetworkConnection().getIncomingMessageQueue().registerQueueListener( incoming_q_listener ); peer.getNetworkConnection().getOutgoingMessageQueue().registerQueueListener( sent_message_listener ); listener.sessionIsEstablished(); //notify of readiness } public void sendSessionBitfield( DirectByteBuffer bitfield ) { peer.getNetworkConnection().getOutgoingMessageQueue().addMessage( new BTBitfield( bitfield, (byte)1 ), false ); } public void sendSessionRequest( byte unchoke_id, int piece_number, int piece_offset, int length ) { peer.getNetworkConnection().getOutgoingMessageQueue().addMessage( new BTRequest( piece_number, piece_offset, length, (byte)1 ), false ); } public void sendSessionCancel( int piece_number, int piece_offset, int length ) { peer.getNetworkConnection().getOutgoingMessageQueue().addMessage( new BTCancel( piece_number, piece_offset, length, (byte)1 ), false ); } public void sendSessionHave( int[] piece_numbers ) { for( int i=0; i < piece_numbers.length; i++ ) { peer.getNetworkConnection().getOutgoingMessageQueue().addMessage( new BTHave( piece_numbers[i], (byte)1 ), false ); } } public Object sendSessionPiece( int piece_number, int piece_offset, DirectByteBuffer data ) { BTPiece piece = new BTPiece( piece_number, piece_offset, data, (byte)1 ); peer.getNetworkConnection().getOutgoingMessageQueue().addMessage( piece, false ); return piece; } public void endSession( String reason ) { peer.getNetworkConnection().getIncomingMessageQueue().cancelQueueListener( incoming_q_listener ); peer.getNetworkConnection().getOutgoingMessageQueue().cancelQueueListener( sent_message_listener ); } }