data_in_ = tintbin(NOW,bin64_t::NONE);
if (!ok)
return bin64_t::NONE;
+ bin64_t cover = transfer().ack_out().cover(pos);
for(int i=0; i<transfer().cb_installed; i++)
- transfer().callbacks[i](transfer().fd(),pos); // FIXME FIXME FIXME
+ if (cover.layer()>=transfer().callbacks[i].agg)
+ transfer().callbacks[i].cb(transfer().fd(),pos); // FIXME
data_in_.bin = pos;
if (pos!=bin64_t::NONE) {
if (last_data_in_time_) {
class PiecePicker;
class CongestionController;
class PeerSelector;
- typedef void (*TransferProgressCallback) (int transfer, bin64_t bin);
+ struct TransferProgressCallback {
+ typedef void (*callback_t) (int transfer, bin64_t bin);
+ /** The function to invoke. */
+ callback_t cb;
+ /** aggregation level (do not report smaller events). */
+ uint8_t agg;
+ TransferProgressCallback(callback_t callback) : cb(callback), agg(0) {}
+ TransferProgressCallback() : cb(NULL), agg(0) {}
+ };
/** A class representing single file transfer. */
if (!trans)
return;
for(int i=0; i<trans->cb_installed; i++)
- if (trans->callbacks[i]==cb)
+ if (trans->callbacks[i].cb==cb.cb)
trans->callbacks[i]=trans->callbacks[--trans->cb_installed];
}