#include "auth.h"
#include "transfer.h"
#include "module.h"
+#include "client.h"
static void killfilter(struct transfer *transfer);
void freetransfer(struct transfer *transfer)
{
- struct transarg *ta;
-
if(transfer == transfers)
transfers = transfer->next;
if(transfer->next != NULL)
CBCHAINFREE(transfer, trans_p);
CBCHAINFREE(transfer, trans_destroy);
CBCHAINFREE(transfer, trans_filterout);
- while((ta = transfer->args) != NULL)
- {
- transfer->args = ta->next;
- free(ta->rec);
- free(ta->val);
- free(ta);
- }
+ while(transfer->args != NULL)
+ freewcspair(transfer->args, &transfer->args);
if(transfer->filter != -1)
killfilter(transfer);
if(transfer->etimer != NULL)
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;
return(new);
}
-void transferaddarg(struct transfer *transfer, wchar_t *rec, wchar_t *val)
-{
- struct transarg *ta;
-
- ta = smalloc(sizeof(*ta));
- ta->rec = swcsdup(rec);
- ta->val = swcsdup(val);
- ta->next = transfer->args;
- transfer->args = ta;
-}
-
void transferattach(struct transfer *transfer, struct transferiface *iface, void *data)
{
if(transfer->iface != NULL)
}
}
+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;
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);
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;
char **argv;
size_t argvsize, argvdata;
struct socket *insock, *outsock;
- struct transarg *ta;
+ struct wcspair *ta;
char *rec, *val;
wfilename = transfer->path;
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)
+ if((rec = icwcstombs(ta->key, NULL)) == NULL)
continue;
if((val = icwcstombs(ta->val, NULL)) == NULL)
continue;