callback granularity
authorVictor Grishchenko <victor.grishchenko@gmail.com>
Mon, 31 May 2010 12:33:15 +0000 (14:33 +0200)
committerVictor Grishchenko <victor.grishchenko@gmail.com>
Mon, 31 May 2010 12:33:15 +0000 (14:33 +0200)
sendrecv.cpp
swift.h
transfer.cpp

index bed623e..045abb3 100644 (file)
@@ -325,8 +325,10 @@ bin64_t Channel::OnData (Datagram& dgram) {  // TODO: HAVE NONE for corrupted da
     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_) {
diff --git a/swift.h b/swift.h
index 8589a89..77f8b6b 100644 (file)
--- a/swift.h
+++ b/swift.h
@@ -123,7 +123,15 @@ namespace swift {
     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. */
index 2f1cb91..827b2cb 100644 (file)
@@ -61,7 +61,7 @@ void swift::RemoveProgressCallback (int transfer, TransferProgressCallback cb) {
     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];
 }