if (bin!=bin64_t(0,0)) // need the first packet
return;
swift::RemoveProgressCallback(transfer,&HttpGwFirstProgressCallback);
- swift::AddProgressCallback(transfer,&HttpGwSwiftProgressCallback);
+ swift::AddProgressCallback(transfer,&HttpGwSwiftProgressCallback,0);
for (int httpc=0; httpc<http_gw_reqs_open; httpc++) {
http_gw_t * req = http_requests + httpc;
if (req->transfer==transfer && req->tosend==0) { // FIXME states
if (swift::Size(file)) {
HttpGwFirstProgressCallback(file,bin64_t(0,0));
} else {
- swift::AddProgressCallback(file,&HttpGwFirstProgressCallback);
+ swift::AddProgressCallback(file,&HttpGwFirstProgressCallback,0);
sckrwecb_t install (http_conn,NULL,NULL,HttpGwCloseConnection);
swift::Datagram::Listen3rdPartySocket(install);
}
return bin64_t::NONE;
bin64_t cover = transfer().ack_out().cover(pos);
for(int i=0; i<transfer().cb_installed; i++)
- if (cover.layer()>=transfer().callbacks[i].agg)
- transfer().callbacks[i].cb(transfer().fd(),pos); // FIXME
+ if (cover.layer()>=transfer().cb_agg[i])
+ transfer().callbacks[i](transfer().fd(),pos); // FIXME
data_in_.bin = pos;
if (pos!=bin64_t::NONE) {
if (last_data_in_time_) {
class PiecePicker;
class CongestionController;
class PeerSelector;
- 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, uint8_t aggregate=0)
- : cb(callback), agg(aggregate) {}
- TransferProgressCallback() : cb(NULL), agg(0) {}
- };
+ typedef void (*ProgressCallback) (int transfer, bin64_t bin);
/** A class representing single file transfer. */
tint init_time_;
#define SWFT_MAX_TRANSFER_CB 8
- TransferProgressCallback callbacks[SWFT_MAX_TRANSFER_CB];
+ ProgressCallback callbacks[SWFT_MAX_TRANSFER_CB];
+ uint8_t cb_agg[SWFT_MAX_TRANSFER_CB];
int cb_installed;
public:
friend uint64_t SeqComplete (int fdes);
friend int Open (const char* filename, const Sha1Hash& hash) ;
friend void Close (int fd) ;
- friend void AddProgressCallback (int transfer,TransferProgressCallback cb);
- friend void RemoveProgressCallback (int transfer,TransferProgressCallback cb);
+ friend void AddProgressCallback (int transfer,ProgressCallback cb,uint8_t agg);
+ friend void RemoveProgressCallback (int transfer,ProgressCallback cb);
friend void ExternallyRetrieved (int transfer,bin64_t piece);
};
/***/
int Find (Sha1Hash hash);
- void AddProgressCallback (int transfer,TransferProgressCallback cb);
- void RemoveProgressCallback (int transfer,TransferProgressCallback cb);
+ void AddProgressCallback (int transfer,ProgressCallback cb,uint8_t agg);
+ void RemoveProgressCallback (int transfer,ProgressCallback cb);
void ExternallyRetrieved (int transfer,bin64_t piece);
//uint32_t Width (const tbinvec& v);
i32 = 0;
bin.to_coarse_bitmap(i16,bin64_t(2,0),1);
EXPECT_EQ(3,i32&3);
+
+ uint64_t bigint;
+ bigint = 0;
+ binmap_t bm;
+ bm.set(bin64_t(6,0));
+ bm.to_coarse_bitmap((uint16_t*)&bigint,bin64_t(6,0),0);
+ EXPECT_EQ( 0xffffffffffffffffULL, bigint );
}
}
-void swift::AddProgressCallback (int transfer, TransferProgressCallback cb) {
+void swift::AddProgressCallback (int transfer,ProgressCallback cb,uint8_t agg) {
FileTransfer* trans = FileTransfer::file(transfer);
if (!trans)
return;
+ trans->cb_agg[trans->cb_installed] = agg;
trans->callbacks[trans->cb_installed++] = cb;
}
}
-void swift::RemoveProgressCallback (int transfer, TransferProgressCallback cb) {
+void swift::RemoveProgressCallback (int transfer, ProgressCallback cb) {
FileTransfer* trans = FileTransfer::file(transfer);
if (!trans)
return;
for(int i=0; i<trans->cb_installed; i++)
- if (trans->callbacks[i].cb==cb.cb)
+ if (trans->callbacks[i]==cb)
trans->callbacks[i]=trans->callbacks[--trans->cb_installed];
}