Refactor BtBitfieldMessage

dynamic-select-file
Tatsuhiro Tsujikawa 2016-05-16 00:03:02 +09:00
parent dae42d0cd0
commit cef9109070
2 changed files with 13 additions and 24 deletions

View File

@ -48,16 +48,12 @@ namespace aria2 {
const char BtBitfieldMessage::NAME[] = "bitfield";
BtBitfieldMessage::BtBitfieldMessage()
: SimpleBtMessage(ID, NAME), bitfieldLength_(0)
{
}
BtBitfieldMessage::BtBitfieldMessage() : SimpleBtMessage(ID, NAME) {}
BtBitfieldMessage::BtBitfieldMessage(const unsigned char* bitfield,
size_t bitfieldLength)
: SimpleBtMessage(ID, NAME), bitfieldLength_(0)
: SimpleBtMessage(ID, NAME), bitfield_(bitfield, bitfield + bitfieldLength)
{
setBitfield(bitfield, bitfieldLength);
}
BtBitfieldMessage::~BtBitfieldMessage() {}
@ -65,13 +61,7 @@ BtBitfieldMessage::~BtBitfieldMessage() {}
void BtBitfieldMessage::setBitfield(const unsigned char* bitfield,
size_t bitfieldLength)
{
if (bitfield_.get() == bitfield) {
return;
}
bitfieldLength_ = bitfieldLength;
bitfield_ = make_unique<unsigned char[]>(bitfieldLength_);
memcpy(bitfield_.get(), bitfield, bitfieldLength_);
bitfield_.assign(bitfield, bitfield + bitfieldLength);
}
std::unique_ptr<BtBitfieldMessage>
@ -89,9 +79,9 @@ void BtBitfieldMessage::doReceivedAction()
if (isMetadataGetMode()) {
return;
}
getPieceStorage()->updatePieceStats(bitfield_.get(), bitfieldLength_,
getPieceStorage()->updatePieceStats(bitfield_.data(), bitfield_.size(),
getPeer()->getBitfield());
getPeer()->setBitfield(bitfield_.get(), bitfieldLength_);
getPeer()->setBitfield(bitfield_.data(), bitfield_.size());
if (getPeer()->isSeeder() && getPieceStorage()->downloadFinished()) {
throw DL_ABORT_EX(MSG_GOOD_BYE_SEEDER);
}
@ -105,19 +95,19 @@ std::vector<unsigned char> BtBitfieldMessage::createMessage()
* bitfield --- bitfield, bitfieldLength bytes
* total: 5+bitfieldLength bytes
*/
const size_t msgLength = 5 + bitfieldLength_;
const size_t msgLength = 5 + bitfield_.size();
auto msg = std::vector<unsigned char>(msgLength);
bittorrent::createPeerMessageString(msg.data(), msgLength,
1 + bitfieldLength_, ID);
memcpy(msg.data() + 5, bitfield_.get(), bitfieldLength_);
1 + bitfield_.size(), ID);
std::copy(std::begin(bitfield_), std::end(bitfield_), std::begin(msg) + 5);
return msg;
}
std::string BtBitfieldMessage::toString() const
{
std::string s = NAME;
s += " ";
s += util::toHex(bitfield_.get(), bitfieldLength_);
s += ' ';
s += util::toHex(bitfield_.data(), bitfield_.size());
return s;
}

View File

@ -41,8 +41,7 @@ namespace aria2 {
class BtBitfieldMessage : public SimpleBtMessage {
private:
std::unique_ptr<unsigned char[]> bitfield_;
size_t bitfieldLength_;
std::vector<unsigned char> bitfield_;
public:
BtBitfieldMessage();
@ -57,9 +56,9 @@ public:
void setBitfield(const unsigned char* bitfield, size_t bitfieldLength);
const unsigned char* getBitfield() const { return bitfield_.get(); }
const unsigned char* getBitfield() const { return bitfield_.data(); }
size_t getBitfieldLength() const { return bitfieldLength_; }
size_t getBitfieldLength() const { return bitfield_.size(); }
static std::unique_ptr<BtBitfieldMessage> create(const unsigned char* data,
size_t dataLength);