Send hash to filter.
[doldaconnect.git] / daemon / transfer.c
index 15bd5d2..d335b64 100644 (file)
@@ -36,6 +36,7 @@
 #include "auth.h"
 #include "transfer.h"
 #include "module.h"
+#include "client.h"
 
 static void killfilter(struct transfer *transfer);
 
@@ -82,6 +83,8 @@ void freetransfer(struct transfer *transfer)
        free(transfer->actdesc);
     if(transfer->filterbuf != NULL)
        free(transfer->filterbuf);
+    if(transfer->hash != NULL)
+       freehash(transfer->hash);
     if(transfer->localend != NULL)
     {
        transfer->localend->readcb = NULL;
@@ -154,6 +157,18 @@ void transferdetach(struct transfer *transfer)
     }
 }
 
+struct transfer *finddownload(wchar_t *peerid)
+{
+    struct transfer *transfer;
+
+    for(transfer = transfers; transfer != NULL; transfer = transfer->next)
+    {
+       if((transfer->dir == TRNSD_DOWN) && (transfer->iface == NULL) && !wcscmp(peerid, transfer->peerid))
+           break;
+    }
+    return(transfer);
+}
+
 struct transfer *newupload(struct fnetnode *fn, struct fnet *fnet, wchar_t *nickid, struct transferiface *iface, void *data)
 {
     struct transfer *transfer;
@@ -295,6 +310,12 @@ void transferprepul(struct transfer *transfer, size_t size, size_t start, size_t
     transfersetlocalend(transfer, lesk);
 }
 
+void transferstartdl(struct transfer *transfer, struct socket *sk)
+{
+    transfersetstate(transfer, TRNS_MAIN);
+    socksettos(sk, confgetint("transfer", "dltos"));
+}
+
 void transferstartul(struct transfer *transfer, struct socket *sk)
 {
     transfersetstate(transfer, TRNS_MAIN);
@@ -434,6 +455,14 @@ void transfersetpath(struct transfer *transfer, wchar_t *path)
     CBCHAINDOCB(transfer, trans_ac, transfer, L"path");
 }
 
+void transfersethash(struct transfer *transfer, struct hash *hash)
+{
+    if(transfer->hash != NULL)
+       freehash(transfer->hash);
+    transfer->hash = hash;
+    CBCHAINDOCB(transfer, trans_ac, transfer, L"hash");
+}
+
 int slotsleft(void)
 {
     struct transfer *transfer;
@@ -653,6 +682,19 @@ int forkfilter(struct transfer *transfer)
        addtobuf(argv, filename);
        addtobuf(argv, buf);
        addtobuf(argv, peerid);
+       if(transfer->hash)
+       {
+           if((buf = icwcstombs(unparsehash(transfer->hash), NULL)) != NULL)
+           {
+               /* XXX: I am very doubtful of this, but it can just as
+                * well be argued that all data should be presented as
+                * key-value pairs. */
+               addtobuf(argv, "hash");
+               addtobuf(argv, buf);
+           } else {
+               flog(LOG_WARNING, "could not convert hash to local charset");
+           }
+       }
        for(ta = transfer->args; ta != NULL; ta = ta->next)
        {
            if((rec = icwcstombs(ta->rec, NULL)) == NULL)