/* */ #ifndef _D_DEFAULT_BT_MESSAGE_DISPATCHER_H_ #define _D_DEFAULT_BT_MESSAGE_DISPATCHER_H_ #include "BtMessageDispatcher.h" #include "BtContext.h" #include "PeerStorage.h" #include "PieceStorage.h" #include "RequestSlot.h" #include "BtMessage.h" #include "Peer.h" #include "LogFactory.h" #include "Logger.h" #include "BtRegistry.h" class DefaultBtMessageDispatcher : public BtMessageDispatcher { private: int32_t cuid; BtMessages messageQueue; RequestSlots requestSlots; BtContextHandle btContext; PeerStorageHandle peerStorage; PieceStorageHandle pieceStorage; BtMessageFactoryWeakHandle messageFactory; PeerHandle peer; uint32_t maxUploadSpeedLimit; uint32_t requestTimeout; const Logger* logger; public: DefaultBtMessageDispatcher(): cuid(0), btContext(0), peerStorage(0), pieceStorage(0), peer(0), maxUploadSpeedLimit(0), requestTimeout(0), logger(LogFactory::getInstance()) {} virtual ~DefaultBtMessageDispatcher() {} virtual void addMessageToQueue(const BtMessageHandle& btMessage); virtual void addMessageToQueue(const BtMessages& btMessages); virtual void sendMessages(); virtual void doCancelSendingPieceAction(int32_t index, int32_t begin, uint32_t length); virtual void doCancelSendingPieceAction(const PieceHandle& piece); virtual void doAbortOutstandingRequestAction(const PieceHandle& piece); virtual void doChokedAction(); virtual void doChokingAction(); virtual void checkRequestSlotAndDoNecessaryThing(); virtual bool isSendingInProgress(); virtual uint32_t countMessageInQueue() { return messageQueue.size(); } virtual uint32_t countOutstandingRequest(); virtual bool isOutstandingRequest(int32_t index, int32_t blockIndex); virtual RequestSlot getOutstandingRequest(int32_t index, int32_t begin, uint32_t length) { for(RequestSlots::iterator itr = requestSlots.begin(); itr != requestSlots.end(); itr++) { if(itr->getIndex() == index && itr->getBegin() == begin && itr->getLength() == length) { return *itr; } } return RequestSlot::nullSlot; } virtual void removeOutstandingRequest(const RequestSlot& slot) { RequestSlots temp; remove_copy(requestSlots.begin(), requestSlots.end(), back_inserter(temp), slot); requestSlots = temp; } virtual void addOutstandingRequest(const RequestSlot& requestSlot) { if(!isOutstandingRequest(requestSlot.getIndex(), requestSlot.getBlockIndex())) { requestSlots.push_back(requestSlot); } } BtMessages& getMessageQueue() { return messageQueue; } RequestSlots& getRequestSlots() { return requestSlots; } void setPeer(const PeerHandle& peer) { this->peer = peer; } void setBtContext(const BtContextHandle& btContext) { this->btContext = btContext; this->pieceStorage = PIECE_STORAGE(btContext); this->peerStorage = PEER_STORAGE(btContext); } void setCuid(int32_t cuid) { this->cuid = cuid; } void setMaxUploadSpeedLimit(uint32_t maxUploadSpeedLimit) { this->maxUploadSpeedLimit = maxUploadSpeedLimit; } void setRequestTimeout(uint32_t requestTimeout) { this->requestTimeout = requestTimeout; } void setBtMessageFactory(const BtMessageFactoryWeakHandle& factory) { this->messageFactory = factory; } }; typedef SharedHandle DefaultBtMessageDispatcherHandle; #endif // _D_DEFAULT_BT_MESSAGE_DISPATCHER_H_