- if(hub == NULL)
- qstrf(sk, "$MyNick %s|", icswcstombs(confgetstr("cli", "defnick"), DCCHARSET, "DoldaConnectUser-IN"));
- else
- qstrf(sk, "$MyNick %s|", hub->nativenick);
-#ifdef DCPP_MASQUERADE
- qstrf(sk, "$Lock EXTENDEDPROTOCOLABCABCABCABCABCABC Pk=DCPLUSPLUS0.674ABCABC|");
-#else
- qstrf(sk, "$Lock EXTENDEDPROTOCOLABCABCABCABCABCABC Pk=DOLDA%sABCABCABC|", VERSION);
-#endif
- } else if(!strcmp(cmd, "$Direction")) {
- if(peer->wcsname == NULL)
- {
- freedcpeer(peer);
- return;
- }
- if(peer->direction == TRNSD_UP)
- {
- transfer = newupload(peer->fn, &dcnet, peer->wcsname, &dctransfer, peer);
- transfersetnick(transfer, peer->wcsname);
- peer->transfer = transfer;
- } else {
- for(transfer = transfers; transfer != NULL; transfer = transfer->next)
- {
- if((transfer->dir == TRNSD_DOWN) && (transfer->state == TRNS_WAITING) && !wcscmp(peer->wcsname, transfer->peerid))
- break;
- }
- if(transfer == NULL)
- {
- freedcpeer(peer);
- return;
- }
- peer->transfer = transfer;
- transferattach(transfer, &dctransfer, peer);
- transfersetnick(transfer, peer->wcsname);
- transfersetstate(transfer, TRNS_HS);
- }
- if(peer->extended)
- {
-#ifdef DCPP_MASQUERADE
- qstr(sk, "$Supports MiniSlots XmlBZList ADCGet TTHL TTHF GetZBlock ZLIG |");
-#else
- qstr(sk, "$Supports MiniSlots XmlBZList ADCGet TTHL TTHF GetZBlock ZLIG|");
-#endif
- }
- qstrf(sk, "$Direction %s %i|", (peer->direction == TRNSD_UP)?"Upload":"Download", rand() % 10000);
- if(peer->key != NULL)
- qstrf(sk, "$Key %s|", peer->key);
- if(peer->direction == TRNSD_DOWN)
- {
- if((mbsbuf = icwcstombs(peer->transfer->path, DCCHARSET)) == NULL)
- {
- /* I believe that NOTFOUND should be used
- * since giving a path that cannot be
- * represented in the protocol's charset is
- * literally the same as giving a path that
- * the client doesn't have. */
- transferseterror(peer->transfer, TRNSE_NOTFOUND);
- freedcpeer(peer);
- return;
- }
- if(peer->transfer->size == -1)
- {
- /* The transfer will be restarted later from
- * cmd_filelength when it detects that the sizes
- * don't match. */
- qstrf(sk, "$Get %s$1|", mbsbuf);
- } else {
- if(forkfilter(transfer))
- {
- flog(LOG_WARNING, "could not fork filter for transfer %i: %s", transfer->id, strerror(errno));
- freedcpeer(peer);
- free(mbsbuf);
- return;
- }
- peer->mbspath = sstrdup(mbsbuf);
- CBREG(transfer, trans_filterout, (int (*)(struct transfer *, wchar_t *, wchar_t *, void *))trresumecb, NULL, peer);
- }
- free(mbsbuf);
- }
- } else if(!strcmp(cmd, "$FileLength")) {
- if(peer->transfer == NULL)
- {
- freedcpeer(peer);
- return;
- }
- transfersetstate(peer->transfer, TRNS_MAIN);
- socksettos(peer->sk, confgetint("transfer", "dltos"));
- peer->state = PEER_TRNS;
- peer->sk->readcb = (void (*)(struct socket *, void *))transread;
- peer->sk->errcb = (void (*)(struct socket *, int, void *))transerr;
- qstr(peer->sk, "$Send|");