|
@@ -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;
|
|
|
}
|
|
|
|