Sophie

Sophie

distrib > * > 2009.0 > i586 > by-pkgid > f7923d36dd7fbf3adfe05985579c21f5 > files > 18

bitstormlite-debug-0.2p-3mdv2009.0.i586.rpm

/***************************************************************************
 *   Copyright (C) 2005-2006 Gao Xianchao                                  *
 *                 2007 Gao Xianchao gnap_an linux_lyb ahlongxp            *
 *                                                                         *
 *   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.             *
 ***************************************************************************/

/*
 * Author:	gxc
 * Create data:	2005-10-14 20:09
 */
 
#ifndef PEERLINK_H_
#define PEERLINK_H_

#include <string>
#include <list>
#include "BitStorm.h"
#include "Socket.h"
#include "BitSet.h"
#include "PieceRequest.h"

typedef struct
{
	unsigned int index;
	unsigned int offset;
	unsigned int len;
} TPeerPieceRequest;
typedef std::list<TPeerPieceRequest> TPeerPieceRequestList;

class CPeerLink : 
	public IPeerLink,
	public ITimerCallback,
	public CSocket,
	public IRateMeasureClient
{
public:
	CPeerLink();
	virtual ~CPeerLink();
private:
	TPeerState _state;
	IPeerManager* _manager;
	std::string _ip;
	unsigned int _port;
	std::string _id;
	bool _accepted;
	unsigned int _connectTimeoutTimer;
	
	CPieceRequest _pieceRequest;
	
	std::string _sendBuffer;
	std::string _recvBuffer;
	
	CBitSet _bitSet;
	bool _bitSetRecved;
	
	bool _handShaked;
	
	bool _amChoking;
	bool _amInterested;
	bool _peerChoking;
	bool _peerInterested;
	
	unsigned int _downloadCount;
	unsigned int _uploadCount;
	unsigned int _lastCountSpeedTime;
	unsigned int _lastDownloadCount;
	unsigned int _lastUploadCount;
	unsigned int _uploadSpeed;
	unsigned int _downloadSpeed;
	
	TPeerPieceRequestList _peerRequestList;
	
	bool _canRead;
	bool _canWrite;
	unsigned int _writePriority;
	unsigned int _readPriority;
private:
	void sendData(const void* data, size_t len);
	int processRecvData();
	void sendHandshake();	
	void sendBitfield();
	void sendChoke(bool choke);
	void sendInterested(bool interested);
	void sendHave(unsigned int pieceIndex);
	void sendPieceRequest(unsigned int pieceIndex, unsigned int offset, unsigned int len);
	void sendPieceData(unsigned int pieceIndex, unsigned int offset, std::string& data);
	void sendPieceCancel(unsigned int pieceIndex, unsigned int offset, unsigned int len);
	bool checkHandshake(std::string info);
	
	int processCmd(unsigned cmd, void* data, size_t dataLen);
	
	int processCmdChoke(void* data, size_t dataLen);
	int processCmdUnchoke(void* data, size_t dataLen);
	int processCmdInterested(void* data, size_t dataLen);
	int processCmdNotInterested(void* data, size_t dataLen);
	int processCmdHave(void* data, size_t dataLen);
	int processCmdBitfield(void* data, size_t dataLen);
	int processCmdRequest(void* data, size_t dataLen);
	int processCmdPiece(void* data, size_t dataLen);
	int processCmdCancel(void* data, size_t dataLen);
	
	void getNewPieceTask();
	void doPieceRequest();
	void doPieceSend();
public:	
	int handleRead();
	int handleWrite();
	void handleClose();	
	
	void blockWrite(bool block);
	void blockRead(bool block);
	void setWritePriority(unsigned int Priority);
	unsigned int getWritePriority();	
	void setReadPriority(unsigned int Priority);
	unsigned int getReadPriority();		
	bool canWrite();
	bool canRead();
	int doWrite(unsigned int count);
	int doRead(unsigned int count);	
	
	void onTimer(unsigned int id);
	
	void setPeerManager(IPeerManager* manager);
	TPeerState getState();
		
	void connect(const char* ip, unsigned short port);
	void attach(int handle, const char* ip, unsigned short port, IPeerManager* manager);
	bool isAccepted();
	void closeLink();
	const char* getIP();
	unsigned short getPort();
	void notifyHavePiece(unsigned int pieceIndex);
	void cancelPieceRequest(unsigned int pieceIndex);
	
	bool peerChoked();
	bool peerInterested();
	void chokePeer(bool chocke);
	unsigned int getDownloadCount();
	unsigned int getUploadCount();	
	
	void countSpeed();
	bool checkNeedClose();
	unsigned int getUploadSpeed();
	unsigned int getDownloadSpeed();	
	
	void onConnect();
	void onConnectFailed();	
	void onConnectClosed();
	void onSendComplete();
	void onDownloadComplete();
};

#endif /*PEERLINK_H_*/