Skip to content

Commit

Permalink
2006-12-24 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Browse files Browse the repository at this point in the history
	Rewritten a portion of bittorrent implementation:
	
	* src/BtMessageValidator.h: New class.
	* src/BtBitfieldMessageValidator.h: New class.
	* src/BtHandshakeMessageValidator.h: New class.
	* src/BtRequestMessageValidator.h: New class.
	* src/BtSuggestPieceMessageValidator.h: New class.
	* src/BtAllowedFastMessageValidator.h: New class.
	* src/BtRejectMessageValidator.h: New class.
	* src/BtCancelMessageValidator.h: New class.
	* src/BtPieceMessageValidator.h: New class.
	* src/BtHaveMessageValidator.h: New class.
	* src/BtEventListener.h: New class.
	* src/AbstractBtEventListener.h: New class.
	* src/BtEvent.h: New class.
	* src/BtChokingEvent.h: New class.
	* src/BtChokedEvent.h: New class.
	* src/BtCancelSendingPieceEvent.h: New class.
	* src/BtAbortOutstandingRequestEvent.h: New class.
	* src/Randomizer.h: New class.
	* src/SimpleRandomizer.h: New class.
	* src/BtMessage.h: New class.
	* src/AbstractBtMessage.h: New class.
	* src/SimpleBtMessage.h: New class.
	* src/BtHaveMessage.h: New class.
	* src/BtInterestedMessage.h: New class.
	* src/BtAllowedFastMessage.h: New class.
	* src/BtUnchokeMessage.h: New class.
	* src/BtCancelMessage.h: New class.
	* src/BtNotInterestedMessage.h: New class.
	* src/BtChokeMessage.h: New class.
	* src/BtHaveNoneMessage.h: New class.
	* src/BtHandshakeMessage.h: New class.
	* src/BtSuggestPieceMessage.h: New class.
	* src/BtHaveMessage.h: New class.
	* src/BtPieceMessage.h: New class.
	* src/BtHaveAllMessage.h: New class.
	* src/BtKeepAliveMessage.h: New class.
	* src/BtPortMessage.h: New class.
	* src/BtRejectMessage.h: New class.
	* src/BtBitfieldMessage.h: New class.
	* src/BtRequestMessage.h: New class.
	* src/DefaultBtRequestFactory.h: New class.
	* src/DefaultBtMessageReceiver.h: New class.
	* src/BtInteractive.h: New class.
	* src/BtMessageDispatcher.h: New class.
	* src/DefaultBtMessageDispatcher.h: New class.
	* src/DefaultBtInteractive.h: New class.
	* src/BitfieldManFactory.h: New class.
	* src/HandleRegistry.h: New class.
	* src/BtMessageFactory.h: New class.
	* src/BtMessageReceiver.h: New class.
	* src/DefaultBtMessageFactory.h: New class.
	* src/PeerObject.h: New class.
	* src/BtRequestFactory.h: New class.
  • Loading branch information
tatsuhiro-t committed Dec 24, 2006
1 parent 458cc27 commit 9c3e8fb
Show file tree
Hide file tree
Showing 162 changed files with 11,206 additions and 662 deletions.
58 changes: 58 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,61 @@
2006-12-24 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

Rewritten a portion of bittorrent implementation:

* src/BtMessageValidator.h: New class.
* src/BtBitfieldMessageValidator.h: New class.
* src/BtHandshakeMessageValidator.h: New class.
* src/BtRequestMessageValidator.h: New class.
* src/BtSuggestPieceMessageValidator.h: New class.
* src/BtAllowedFastMessageValidator.h: New class.
* src/BtRejectMessageValidator.h: New class.
* src/BtCancelMessageValidator.h: New class.
* src/BtPieceMessageValidator.h: New class.
* src/BtHaveMessageValidator.h: New class.
* src/BtEventListener.h: New class.
* src/AbstractBtEventListener.h: New class.
* src/BtEvent.h: New class.
* src/BtChokingEvent.h: New class.
* src/BtChokedEvent.h: New class.
* src/BtCancelSendingPieceEvent.h: New class.
* src/BtAbortOutstandingRequestEvent.h: New class.
* src/Randomizer.h: New class.
* src/SimpleRandomizer.h: New class.
* src/BtMessage.h: New class.
* src/AbstractBtMessage.h: New class.
* src/SimpleBtMessage.h: New class.
* src/BtHaveMessage.h: New class.
* src/BtInterestedMessage.h: New class.
* src/BtAllowedFastMessage.h: New class.
* src/BtUnchokeMessage.h: New class.
* src/BtCancelMessage.h: New class.
* src/BtNotInterestedMessage.h: New class.
* src/BtChokeMessage.h: New class.
* src/BtHaveNoneMessage.h: New class.
* src/BtHandshakeMessage.h: New class.
* src/BtSuggestPieceMessage.h: New class.
* src/BtHaveMessage.h: New class.
* src/BtPieceMessage.h: New class.
* src/BtHaveAllMessage.h: New class.
* src/BtKeepAliveMessage.h: New class.
* src/BtPortMessage.h: New class.
* src/BtRejectMessage.h: New class.
* src/BtBitfieldMessage.h: New class.
* src/BtRequestMessage.h: New class.
* src/DefaultBtRequestFactory.h: New class.
* src/DefaultBtMessageReceiver.h: New class.
* src/BtInteractive.h: New class.
* src/BtMessageDispatcher.h: New class.
* src/DefaultBtMessageDispatcher.h: New class.
* src/DefaultBtInteractive.h: New class.
* src/BitfieldManFactory.h: New class.
* src/HandleRegistry.h: New class.
* src/BtMessageFactory.h: New class.
* src/BtMessageReceiver.h: New class.
* src/DefaultBtMessageFactory.h: New class.
* src/PeerObject.h: New class.
* src/BtRequestFactory.h: New class.

2006-12-01 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

To know root cause of exception:
Expand Down
11 changes: 10 additions & 1 deletion TODO
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,13 @@
* Add Turkish translation.
* Add the message like "you can resume the transfer by invoking aria2 again" when the download stops.
* Add --bt-timeout command line option.
* Fix DefaultBtProgressInfoFile.cc: save(), load()
* Fix DefaultBtProgressInfoFile.cc: save(), load()
* Add a feature that if any existing file is detected, then
do not start downloading and print some useful message to the user.
* Fix Segfaults in BitfieldMan.cc:71
https://sourceforge.net/tracker/index.php?func=detail&aid=1606060&group_id=159897&atid=813673
* Prevent the file to be fragmented. Use PreAllocationDiskWriter
https://sourceforge.net/tracker/index.php?func=detail&aid=1611886&group_id=159897&atid=813673
* Add #include <libgen.h> to DefaultBtContext.h
* int32_t
* remove blockIndex
55 changes: 55 additions & 0 deletions src/AbstractBtEventListener.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_ABSTRACT_BT_EVENT_LISTENER_H_
#define _D_ABSTRACT_BT_EVENT_LISTENER_H_

#include "BtEventListener.h"

class AbstractBtEventListener : public BtEventListener {
public:
virtual ~AbstractBtEventListener() {}

virtual bool canHandle(const BtEventHandle& event) = 0;

virtual void handleEventInternal(const BtEventHandle& event) = 0;

virtual void handleEvent(const BtEventHandle& event) {
if(canHandle(event)) {
handleEventInternal(event);
}
}
};

#endif // _D_ABSTRACT_BT_EVENT_LISTENER_H_
167 changes: 167 additions & 0 deletions src/AbstractBtMessage.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_ABSTRACT_BT_MESSAGE_H_
#define _D_ABSTRACT_BT_MESSAGE_H_

#include "BtMessage.h"
#include "Peer.h"
#include "Piece.h"
#include "LogFactory.h"
#include "Logger.h"
#include "BtEvent.h"
#include "BtEventListener.h"
#include "BtContext.h"
#include "BtRegistry.h"

class AbstractBtMessage : public BtMessage {
protected:
bool sendingInProgress;
bool invalidate;
bool uploading;
int32_t id;
int32_t cuid;

BtContextHandle btContext;

PieceStorageHandle pieceStorage;

PeerHandle peer;

BtMessageValidatorHandle validator;
BtEventListeners listeners;
const Logger* logger;
public:
AbstractBtMessage():sendingInProgress(false),
invalidate(false),
uploading(false),
id(0),
cuid(0),
btContext(0),
pieceStorage(0),
peer(0),
validator(0),
logger(LogFactory::getInstance())

{}

virtual bool isSendingInProgress() {
return sendingInProgress;
}

void setSendingInProgress(bool sendingInProgress) {
this->sendingInProgress = sendingInProgress;
}

virtual bool isInvalidate() {
return invalidate;
}

void setInvalidate(bool invalidate) {
this->invalidate = invalidate;
}

virtual bool isUploading() {
return uploading;
}

void setUploading(bool uploading) {
this->uploading = uploading;
}

virtual int32_t getId() {
return id;
}

int32_t getCuid() const {
return cuid;
}

void setCuid(int32_t cuid) {
this->cuid = cuid;
}

PeerHandle getPeer() const {
return peer;
}

void setPeer(const PeerHandle& peer) {
this->peer = peer;
}

virtual void doReceivedAction() {}

virtual bool validate(Errors& errors) {
if(validator.get()) {
return validator->validate(errors);
} else {
return true;
}
}

virtual void onQueued() {}

virtual void handleEvent(const BtEventHandle& event) {
for(BtEventListeners::iterator itr = listeners.begin();
itr != listeners.end(); ++itr) {
(*itr)->handleEvent(event);
}
}

void addEventListener(const BtEventListenerHandle& listener) {
listeners.push_back(listener);
}

void setBtMessageValidator(const BtMessageValidatorHandle& validator) {
this->validator = validator;
}

BtMessageValidatorHandle getBtMessageValidator() const {
return validator;
}

void setBtContext(const BtContextHandle& btContext) {
this->btContext = btContext;
this->pieceStorage = PIECE_STORAGE(btContext);
}

BtContextHandle getBtContext() const {
return btContext;
}

};

typedef SharedHandle<AbstractBtMessage> AbstractBtMessageHandle;

#endif // _D_ABSTRACT_BT_MESSAGE_H_
9 changes: 6 additions & 3 deletions src/BitfieldMan.cc
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@

BitfieldMan::BitfieldMan(int blockLength, long long int totalLength)
:blockLength(blockLength), totalLength(totalLength), filterBitfield(0),
filterEnabled(false) {
filterEnabled(false), randomizer(0) {
if(blockLength > 0 && totalLength > 0) {
blocks = totalLength/blockLength+(totalLength%blockLength ? 1 : 0);
bitfieldLength = blocks/8+(blocks%8 ? 1 : 0);
Expand All @@ -49,7 +49,7 @@ BitfieldMan::BitfieldMan(int blockLength, long long int totalLength)
}
}

BitfieldMan::BitfieldMan(const BitfieldMan& bitfieldMan) {
BitfieldMan::BitfieldMan(const BitfieldMan& bitfieldMan):randomizer(0) {
blockLength = bitfieldMan.blockLength;
totalLength = bitfieldMan.totalLength;
blocks = bitfieldMan.blocks;
Expand All @@ -65,6 +65,7 @@ BitfieldMan::BitfieldMan(const BitfieldMan& bitfieldMan) {
} else {
filterBitfield = 0;
}
this->randomizer = bitfieldMan.randomizer;
}

BitfieldMan::~BitfieldMan() {
Expand Down Expand Up @@ -106,7 +107,9 @@ int
BitfieldMan::getMissingIndexRandomly(const unsigned char* bitfield,
int bitfieldLength) const
{
int byte = (int)(((double)bitfieldLength)*random()/(RAND_MAX+1.0));
int byte = (int)(((double)bitfieldLength)*
randomizer->getRandomNumber()/
(randomizer->getMaxRandomNumber()+1.0));

unsigned char lastMask = 0;
int lastByteLength = totalLength%(blockLength*8);
Expand Down
13 changes: 13 additions & 0 deletions src/BitfieldMan.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#define _D_BITFIELD_MAN_H_

#include "common.h"
#include "Randomizer.h"
#include <deque>

typedef deque<int> BlockIndexes;
Expand All @@ -50,6 +51,8 @@ class BitfieldMan {
int bitfieldLength;
int blocks;
bool filterEnabled;
RandomizerHandle randomizer;

int countSetBit(const unsigned char* bitfield, int len) const;
int getNthBitIndex(const unsigned char bit, int nth) const;
int getMissingIndexRandomly(const unsigned char* bitfield, int len) const;
Expand Down Expand Up @@ -176,6 +179,8 @@ class BitfieldMan {
*/
int countBlock() const;

int getMaxIndex() const { return blocks-1; }

void setBitfield(const unsigned char* bitfield, int bitfieldLength);

void clearAllBit();
Expand All @@ -202,6 +207,14 @@ class BitfieldMan {
* affected by filter
*/
long long int getFilteredCompletedLength() const;

void setRandomizer(const RandomizerHandle& randomizer) {
this->randomizer = randomizer;
}

RandomizerHandle getRandomizer() const {
return randomizer;
}
};

#endif // _D_BITFIELD_MAN_H_
Loading

0 comments on commit 9c3e8fb

Please sign in to comment.