tbqueue hint_out_;
FileTransfer* transfer_;
uint64_t twist_;
+ bin64_t range_;
public:
- SeqPiecePicker (FileTransfer* file_to_pick_from) :
+ SeqPiecePicker (FileTransfer* file_to_pick_from) : range_(bin64_t::ALL),
transfer_(file_to_pick_from), ack_hint_out_(), twist_(0) {
ack_hint_out_.range_copy(file().ack_out(),bin64_t::ALL);
}
virtual void Randomize (uint64_t twist) {
twist_ = twist;
}
+
+ virtual void LimitRange (bin64_t range) {
+ range_ = range;
+ }
virtual bin64_t Pick (binmap_t& offer, uint64_t max_width, tint expires) {
while (hint_out_.size() && hint_out_.front().time<NOW-TINT_SEC*3/2) { // FIXME sec
offer.twist(twist_);
ack_hint_out_.twist(twist_);
}
- bin64_t hint = offer.find_filtered (ack_hint_out_,bin64_t::ALL,binmap_t::FILLED);
+ bin64_t hint = offer.find_filtered (ack_hint_out_,range_,binmap_t::FILLED);
if (twist_) {
hint = hint.twisted(twist_);
offer.twist(0);
Sha1Hash data_hash(data,length);
if (!OfferHash(pos, data_hash)) {
- printf("invalid hash for %s: %s\n",pos.str(),data_hash.hex().c_str()); // FIXME
+ //printf("invalid hash for %s: %s\n",pos.str(),data_hash.hex().c_str()); // paranoid
return false;
}
friend void Close (int fd) ;
friend void AddProgressCallback (int transfer,TransferProgressCallback cb);
friend void RemoveProgressCallback (int transfer,TransferProgressCallback cb);
+ friend void ExternallyRetrieved (int transfer,bin64_t piece);
};
* @param expires (not used currently) when to consider request expired
* @return the bin number to request */
virtual bin64_t Pick (binmap_t& offered, uint64_t max_width, tint expires) = 0;
+ virtual void LimitRange (bin64_t range) = 0;
virtual ~PiecePicker() {}
};
void AddProgressCallback (int transfer,TransferProgressCallback cb);
void RemoveProgressCallback (int transfer,TransferProgressCallback cb);
+ void ExternallyRetrieved (int transfer,bin64_t piece);
//uint32_t Width (const tbinvec& v);
uint8_t memo = *buf;
*buf = 'z';
EXPECT_FALSE(leech->OfferData(next, (char*)buf, len));
+ fprintf(stderr,"kidding\n");
*buf = memo;
EXPECT_TRUE(leech->OfferData(next, (char*)buf, len));
}
}
+void swift::ExternallyRetrieved (int transfer,bin64_t piece) {
+ FileTransfer* trans = FileTransfer::file(transfer);
+ if (!trans)
+ return;
+ trans->ack_out().set(piece); // that easy
+}
+
+
void swift::RemoveProgressCallback (int transfer, TransferProgressCallback cb) {
FileTransfer* trans = FileTransfer::file(transfer);
if (!trans)