Mercurial > pidgin
comparison src/protocols/toc/toc.c @ 3630:9682c0e022c6
[gaim-migrate @ 3753]
Yeah this will probably break a lot of shit knowing my luck. But hey, I really don't care what people thnk.
committer: Tailor Script <tailor@pidgin.im>
| author | Rob Flynn <gaim@robflynn.com> |
|---|---|
| date | Fri, 11 Oct 2002 03:14:01 +0000 |
| parents | bdd0bebd2d04 |
| children | da6e3c984985 |
comparison
equal
deleted
inserted
replaced
| 3629:afc5bb164c5a | 3630:9682c0e022c6 |
|---|---|
| 22 | 22 |
| 23 | 23 |
| 24 #ifdef HAVE_CONFIG_H | 24 #ifdef HAVE_CONFIG_H |
| 25 #include <config.h> | 25 #include <config.h> |
| 26 #endif | 26 #endif |
| 27 | |
| 28 #ifndef _WIN32 | |
| 27 #include <netdb.h> | 29 #include <netdb.h> |
| 28 #include <gtk/gtk.h> | |
| 29 #include <unistd.h> | 30 #include <unistd.h> |
| 30 #include <errno.h> | |
| 31 #include <netinet/in.h> | 31 #include <netinet/in.h> |
| 32 #include <arpa/inet.h> | 32 #include <arpa/inet.h> |
| 33 #include <sys/socket.h> | |
| 34 #else | |
| 35 #include <winsock.h> | |
| 36 #endif | |
| 37 | |
| 38 #include <gtk/gtk.h> | |
| 39 #include <errno.h> | |
| 33 #include <string.h> | 40 #include <string.h> |
| 34 #include <stdlib.h> | 41 #include <stdlib.h> |
| 35 #include <stdio.h> | 42 #include <stdio.h> |
| 36 #include <time.h> | 43 #include <time.h> |
| 37 #include <sys/socket.h> | |
| 38 #include <sys/types.h> | 44 #include <sys/types.h> |
| 39 #include <sys/stat.h> | 45 #include <sys/stat.h> |
| 40 #include "prpl.h" | 46 #include "prpl.h" |
| 41 #include "multi.h" | 47 #include "multi.h" |
| 42 #include "gaim.h" | 48 #include "gaim.h" |
| 43 #include "proxy.h" | 49 #include "proxy.h" |
| 44 | 50 |
| 51 #ifdef _WIN32 | |
| 52 #include "win32dep.h" | |
| 53 #endif | |
| 54 | |
| 45 #include "pixmaps/protocols/oscar/admin_icon.xpm" | 55 #include "pixmaps/protocols/oscar/admin_icon.xpm" |
| 46 #include "pixmaps/protocols/oscar/aol_icon.xpm" | 56 #include "pixmaps/protocols/oscar/aol_icon.xpm" |
| 47 #include "pixmaps/protocols/oscar/away_icon.xpm" | 57 #include "pixmaps/protocols/oscar/away_icon.xpm" |
| 48 #include "pixmaps/protocols/oscar/dt_icon.xpm" | 58 #include "pixmaps/protocols/oscar/dt_icon.xpm" |
| 49 #include "pixmaps/protocols/oscar/free_icon.xpm" | 59 #include "pixmaps/protocols/oscar/free_icon.xpm" |
| 50 #include "pixmaps/protocols/oscar/wireless_icon.xpm" | 60 #include "pixmaps/protocols/oscar/wireless_icon.xpm" |
| 61 | |
| 62 /* for win32 compatability */ | |
| 63 G_MODULE_IMPORT GSList *connections; | |
| 51 | 64 |
| 52 #define REVISION "penguin" | 65 #define REVISION "penguin" |
| 53 | 66 |
| 54 #define TYPE_SIGNON 1 | 67 #define TYPE_SIGNON 1 |
| 55 #define TYPE_DATA 2 | 68 #define TYPE_DATA 2 |
| 132 | 145 |
| 133 static void toc_login_callback(gpointer, gint, GaimInputCondition); | 146 static void toc_login_callback(gpointer, gint, GaimInputCondition); |
| 134 static void toc_callback(gpointer, gint, GaimInputCondition); | 147 static void toc_callback(gpointer, gint, GaimInputCondition); |
| 135 static void accept_file_dialog(struct ft_request *); | 148 static void accept_file_dialog(struct ft_request *); |
| 136 | 149 |
| 150 /* The following were added for win32 port - Herman */ | |
| 151 | |
| 152 int toc_write(int fd, const void *buffer, int len) | |
| 153 { | |
| 154 #ifndef _WIN32 | |
| 155 return write(fd, buffer, len); | |
| 156 #else | |
| 157 return send(fd, buffer, len, 0); | |
| 158 #endif | |
| 159 } | |
| 160 | |
| 161 int toc_read(int fd, void *buffer, int size) | |
| 162 { | |
| 163 #ifndef _WIN32 | |
| 164 return read(fd, buffer, size); | |
| 165 #else | |
| 166 return recv(fd, buffer, size, 0); | |
| 167 #endif | |
| 168 } | |
| 169 | |
| 170 int toc_soc_close( int fd ) | |
| 171 { | |
| 172 #ifndef _WIN32 | |
| 173 return close(fd); | |
| 174 #else | |
| 175 return closesocket(fd); | |
| 176 #endif | |
| 177 } | |
| 178 | |
| 179 | |
| 137 /* ok. this function used to take username/password, and return 0 on success. | 180 /* ok. this function used to take username/password, and return 0 on success. |
| 138 * now, it takes username/password, and returns NULL on error or a new gaim_connection | 181 * now, it takes username/password, and returns NULL on error or a new gaim_connection |
| 139 * on success. */ | 182 * on success. */ |
| 140 static void toc_login(struct aim_user *user) | 183 static void toc_login(struct aim_user *user) |
| 141 { | 184 { |
| 171 struct gaim_connection *gc = data; | 214 struct gaim_connection *gc = data; |
| 172 struct toc_data *tdt; | 215 struct toc_data *tdt; |
| 173 char buf[80]; | 216 char buf[80]; |
| 174 | 217 |
| 175 if (!g_slist_find(connections, data)) { | 218 if (!g_slist_find(connections, data)) { |
| 176 close(source); | 219 toc_soc_close(source); |
| 177 return; | 220 return; |
| 178 } | 221 } |
| 179 | 222 |
| 180 tdt = gc->proto_data; | 223 tdt = gc->proto_data; |
| 181 | 224 |
| 188 | 231 |
| 189 if (tdt->toc_fd == 0) | 232 if (tdt->toc_fd == 0) |
| 190 tdt->toc_fd = source; | 233 tdt->toc_fd = source; |
| 191 | 234 |
| 192 debug_printf("* Client sends \"FLAPON\\r\\n\\r\\n\"\n"); | 235 debug_printf("* Client sends \"FLAPON\\r\\n\\r\\n\"\n"); |
| 193 if (write(tdt->toc_fd, FLAPON, strlen(FLAPON)) < 0) { | 236 if (toc_write(tdt->toc_fd, FLAPON, strlen(FLAPON)) < 0) { |
| 194 hide_login_progress(gc, "Disconnected."); | 237 hide_login_progress(gc, "Disconnected."); |
| 195 signoff(gc); | 238 signoff(gc); |
| 196 return; | 239 return; |
| 197 } | 240 } |
| 198 tdt->state = STATE_FLAPON; | 241 tdt->state = STATE_FLAPON; |
| 209 static void toc_close(struct gaim_connection *gc) | 252 static void toc_close(struct gaim_connection *gc) |
| 210 { | 253 { |
| 211 if (gc->inpa > 0) | 254 if (gc->inpa > 0) |
| 212 gaim_input_remove(gc->inpa); | 255 gaim_input_remove(gc->inpa); |
| 213 gc->inpa = 0; | 256 gc->inpa = 0; |
| 214 close(((struct toc_data *)gc->proto_data)->toc_fd); | 257 toc_soc_close(((struct toc_data *)gc->proto_data)->toc_fd); |
| 215 g_free(gc->proto_data); | 258 g_free(gc->proto_data); |
| 216 } | 259 } |
| 217 | 260 |
| 218 static int escape_message(char *msg) | 261 static int escape_message(char *msg) |
| 219 { | 262 { |
| 325 if (type != TYPE_SIGNON) { | 368 if (type != TYPE_SIGNON) { |
| 326 obuf[slen] = '\0'; | 369 obuf[slen] = '\0'; |
| 327 slen += 1; | 370 slen += 1; |
| 328 } | 371 } |
| 329 | 372 |
| 330 return write(tdt->toc_fd, obuf, slen); | 373 return toc_write(tdt->toc_fd, obuf, slen); |
| 331 } | 374 } |
| 332 | 375 |
| 333 static int wait_reply(struct gaim_connection *gc, char *buffer, size_t buflen) | 376 static int wait_reply(struct gaim_connection *gc, char *buffer, size_t buflen) |
| 334 { | 377 { |
| 335 struct toc_data *tdt = (struct toc_data *)gc->proto_data; | 378 struct toc_data *tdt = (struct toc_data *)gc->proto_data; |
| 336 struct sflap_hdr *hdr; | 379 struct sflap_hdr *hdr; |
| 337 int ret; | 380 int ret; |
| 338 | 381 |
| 339 if (read(tdt->toc_fd, buffer, sizeof(struct sflap_hdr)) < 0) { | 382 if (toc_read(tdt->toc_fd, buffer, sizeof(struct sflap_hdr)) < 0) { |
| 340 debug_printf("error, couldn't read flap header\n"); | 383 debug_printf("error, couldn't read flap header\n"); |
| 341 return -1; | 384 return -1; |
| 342 } | 385 } |
| 343 | 386 |
| 344 hdr = (struct sflap_hdr *)buffer; | 387 hdr = (struct sflap_hdr *)buffer; |
| 352 if (ntohs(hdr->len) > 0) { | 395 if (ntohs(hdr->len) > 0) { |
| 353 int count = 0; | 396 int count = 0; |
| 354 ret = 0; | 397 ret = 0; |
| 355 do { | 398 do { |
| 356 count += ret; | 399 count += ret; |
| 357 ret = read(tdt->toc_fd, | 400 ret = toc_read(tdt->toc_fd, |
| 358 buffer + sizeof(struct sflap_hdr) + count, ntohs(hdr->len) - count); | 401 buffer + sizeof(struct sflap_hdr) + count, ntohs(hdr->len) - count); |
| 359 } while (count + ret < ntohs(hdr->len) && ret > 0); | 402 } while (count + ret < ntohs(hdr->len) && ret > 0); |
| 360 buffer[sizeof(struct sflap_hdr) + count + ret] = '\0'; | 403 buffer[sizeof(struct sflap_hdr) + count + ret] = '\0'; |
| 361 return ret; | 404 return ret; |
| 362 } else | 405 } else |
| 1354 return m; | 1397 return m; |
| 1355 } | 1398 } |
| 1356 | 1399 |
| 1357 static struct prpl *my_protocol = NULL; | 1400 static struct prpl *my_protocol = NULL; |
| 1358 | 1401 |
| 1359 void toc_init(struct prpl *ret) | 1402 G_MODULE_EXPORT void toc_init(struct prpl *ret) |
| 1360 { | 1403 { |
| 1361 struct proto_user_opt *puo; | 1404 struct proto_user_opt *puo; |
| 1362 ret->protocol = PROTO_TOC; | 1405 ret->protocol = PROTO_TOC; |
| 1363 ret->options = OPT_PROTO_CORRECT_TIME; | 1406 ret->options = OPT_PROTO_CORRECT_TIME; |
| 1364 ret->name = g_strdup("TOC"); | 1407 ret->name = g_strdup("TOC"); |
| 1411 my_protocol = ret; | 1454 my_protocol = ret; |
| 1412 } | 1455 } |
| 1413 | 1456 |
| 1414 #ifndef STATIC | 1457 #ifndef STATIC |
| 1415 | 1458 |
| 1416 void *gaim_prpl_init(struct prpl *prpl) | 1459 G_MODULE_EXPORT void gaim_prpl_init(struct prpl *prpl) |
| 1417 { | 1460 { |
| 1418 toc_init(prpl); | 1461 toc_init(prpl); |
| 1419 prpl->plug->desc.api_version = PLUGIN_API_VERSION; | 1462 prpl->plug->desc.api_version = PLUGIN_API_VERSION; |
| 1420 } | 1463 } |
| 1421 | 1464 |
| 1514 | 1557 |
| 1515 if (ft->hdr.hdrtype != 0x202) { | 1558 if (ft->hdr.hdrtype != 0x202) { |
| 1516 char *buf; | 1559 char *buf; |
| 1517 frombase64(ft->cookie, &buf, NULL); | 1560 frombase64(ft->cookie, &buf, NULL); |
| 1518 | 1561 |
| 1519 read(source, ft, 8); | 1562 toc_read(source, ft, 8); |
| 1520 read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | 1563 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); |
| 1521 debug_header(ft); | 1564 debug_header(ft); |
| 1522 | 1565 |
| 1523 ft->hdr.hdrtype = 0x202; | 1566 ft->hdr.hdrtype = 0x202; |
| 1524 memcpy(ft->hdr.bcookie, buf, 8); | 1567 memcpy(ft->hdr.bcookie, buf, 8); |
| 1525 g_free(buf); | 1568 g_free(buf); |
| 1526 ft->hdr.encrypt = 0; ft->hdr.compress = 0; | 1569 ft->hdr.encrypt = 0; ft->hdr.compress = 0; |
| 1527 debug_header(ft); | 1570 debug_header(ft); |
| 1528 write(source, ft, 256); | 1571 toc_write(source, ft, 256); |
| 1529 | 1572 |
| 1530 if (ft->files == 1) { | 1573 if (ft->files == 1) { |
| 1531 ft->file = fopen(ft->filename, "w"); | 1574 ft->file = fopen(ft->filename, "w"); |
| 1532 if (!ft->file) { | 1575 if (!ft->file) { |
| 1533 buf = g_strdup_printf("Could not open %s for writing!", ft->filename); | 1576 buf = g_strdup_printf("Could not open %s for writing!", ft->filename); |
| 1534 do_error_dialog(buf, strerror(errno), GAIM_ERROR); | 1577 do_error_dialog(buf, strerror(errno), GAIM_ERROR); |
| 1535 g_free(buf); | 1578 g_free(buf); |
| 1536 gaim_input_remove(ft->inpa); | 1579 gaim_input_remove(ft->inpa); |
| 1537 close(source); | 1580 toc_soc_close(source); |
| 1538 g_free(ft->filename); | 1581 g_free(ft->filename); |
| 1539 g_free(ft->user); | 1582 g_free(ft->user); |
| 1540 g_free(ft->ip); | 1583 g_free(ft->ip); |
| 1541 g_free(ft->cookie); | 1584 g_free(ft->cookie); |
| 1542 g_free(ft); | 1585 g_free(ft); |
| 1549 buf = g_strdup_printf("Could not open %s/%s for writing!", ft->filename, | 1592 buf = g_strdup_printf("Could not open %s/%s for writing!", ft->filename, |
| 1550 ft->hdr.name); | 1593 ft->hdr.name); |
| 1551 do_error_dialog(buf, strerror(errno), GAIM_ERROR); | 1594 do_error_dialog(buf, strerror(errno), GAIM_ERROR); |
| 1552 g_free(buf); | 1595 g_free(buf); |
| 1553 gaim_input_remove(ft->inpa); | 1596 gaim_input_remove(ft->inpa); |
| 1554 close(source); | 1597 toc_soc_close(source); |
| 1555 g_free(ft->filename); | 1598 g_free(ft->filename); |
| 1556 g_free(ft->user); | 1599 g_free(ft->user); |
| 1557 g_free(ft->ip); | 1600 g_free(ft->ip); |
| 1558 g_free(ft->cookie); | 1601 g_free(ft->cookie); |
| 1559 g_free(ft); | 1602 g_free(ft); |
| 1561 } | 1604 } |
| 1562 | 1605 |
| 1563 return; | 1606 return; |
| 1564 } | 1607 } |
| 1565 | 1608 |
| 1566 rt = read(source, buf, MIN(ntohl(ft->hdr.size) - ft->recvsize, 1024)); | 1609 rt = toc_read(source, buf, MIN(ntohl(ft->hdr.size) - ft->recvsize, 1024)); |
| 1567 if (rt < 0) { | 1610 if (rt < 0) { |
| 1568 do_error_dialog("File transfer failed; other side probably canceled.", NULL, GAIM_ERROR); | 1611 do_error_dialog("File transfer failed; other side probably canceled.", NULL, GAIM_ERROR); |
| 1569 gaim_input_remove(ft->inpa); | 1612 gaim_input_remove(ft->inpa); |
| 1570 close(source); | 1613 toc_soc_close(source); |
| 1571 g_free(ft->user); | 1614 g_free(ft->user); |
| 1572 g_free(ft->ip); | 1615 g_free(ft->ip); |
| 1573 g_free(ft->cookie); | 1616 g_free(ft->cookie); |
| 1574 if (ft->file) | 1617 if (ft->file) |
| 1575 fclose(ft->file); | 1618 fclose(ft->file); |
| 1585 ft->hdr.filesleft = htons(ntohs(ft->hdr.filesleft) - 1); | 1628 ft->hdr.filesleft = htons(ntohs(ft->hdr.filesleft) - 1); |
| 1586 ft->hdr.partsleft = htons(ntohs(ft->hdr.partsleft) - 1); | 1629 ft->hdr.partsleft = htons(ntohs(ft->hdr.partsleft) - 1); |
| 1587 ft->hdr.recvcsum = ft->hdr.checksum; /* uh... */ | 1630 ft->hdr.recvcsum = ft->hdr.checksum; /* uh... */ |
| 1588 ft->hdr.nrecvd = htons(ntohs(ft->hdr.nrecvd) + 1); | 1631 ft->hdr.nrecvd = htons(ntohs(ft->hdr.nrecvd) + 1); |
| 1589 ft->hdr.flags = 0; | 1632 ft->hdr.flags = 0; |
| 1590 write(source, ft, 256); | 1633 toc_write(source, ft, 256); |
| 1591 debug_header(ft); | 1634 debug_header(ft); |
| 1592 ft->recvsize = 0; | 1635 ft->recvsize = 0; |
| 1593 fclose(ft->file); | 1636 fclose(ft->file); |
| 1594 if (ft->hdr.filesleft == 0) { | 1637 if (ft->hdr.filesleft == 0) { |
| 1595 gaim_input_remove(ft->inpa); | 1638 gaim_input_remove(ft->inpa); |
| 1596 close(source); | 1639 toc_soc_close(source); |
| 1597 g_free(ft->filename); | 1640 g_free(ft->filename); |
| 1598 g_free(ft->user); | 1641 g_free(ft->user); |
| 1599 g_free(ft->ip); | 1642 g_free(ft->ip); |
| 1600 g_free(ft->cookie); | 1643 g_free(ft->cookie); |
| 1601 g_free(ft); | 1644 g_free(ft); |
| 1669 if (cond & GAIM_INPUT_WRITE) { | 1712 if (cond & GAIM_INPUT_WRITE) { |
| 1670 int remain = MIN(ntohl(ft->hdr.totsize) - ft->recvsize, 1024); | 1713 int remain = MIN(ntohl(ft->hdr.totsize) - ft->recvsize, 1024); |
| 1671 int i; | 1714 int i; |
| 1672 for (i = 0; i < remain; i++) | 1715 for (i = 0; i < remain; i++) |
| 1673 fscanf(ft->file, "%c", &buf[i]); | 1716 fscanf(ft->file, "%c", &buf[i]); |
| 1674 write(source, buf, remain); | 1717 toc_write(source, buf, remain); |
| 1675 ft->recvsize += remain; | 1718 ft->recvsize += remain; |
| 1676 if (ft->recvsize == ntohl(ft->hdr.totsize)) { | 1719 if (ft->recvsize == ntohl(ft->hdr.totsize)) { |
| 1677 gaim_input_remove(ft->inpa); | 1720 gaim_input_remove(ft->inpa); |
| 1678 ft->inpa = gaim_input_add(source, GAIM_INPUT_READ, | 1721 ft->inpa = gaim_input_add(source, GAIM_INPUT_READ, |
| 1679 toc_get_file_callback, ft); | 1722 toc_get_file_callback, ft); |
| 1683 | 1726 |
| 1684 if (ft->hdr.hdrtype == htons(0x1108)) { | 1727 if (ft->hdr.hdrtype == htons(0x1108)) { |
| 1685 struct tm *fortime; | 1728 struct tm *fortime; |
| 1686 struct stat st; | 1729 struct stat st; |
| 1687 | 1730 |
| 1688 read(source, ft, 8); | 1731 toc_read(source, ft, 8); |
| 1689 read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | 1732 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); |
| 1690 debug_header(ft); | 1733 debug_header(ft); |
| 1691 | 1734 |
| 1692 stat(ft->filename, &st); | 1735 stat(ft->filename, &st); |
| 1693 fortime = localtime(&st.st_mtime); | 1736 fortime = localtime(&st.st_mtime); |
| 1694 g_snprintf(buf, sizeof(buf), "%2d/%2d/%4d %2d:%2d %8ld %s\r\n", | 1737 g_snprintf(buf, sizeof(buf), "%2d/%2d/%4d %2d:%2d %8ld %s\r\n", |
| 1695 fortime->tm_mon + 1, fortime->tm_mday, fortime->tm_year + 1900, | 1738 fortime->tm_mon + 1, fortime->tm_mday, fortime->tm_year + 1900, |
| 1696 fortime->tm_hour + 1, fortime->tm_min + 1, (long)st.st_size, | 1739 fortime->tm_hour + 1, fortime->tm_min + 1, (long)st.st_size, |
| 1697 g_basename(ft->filename)); | 1740 g_basename(ft->filename)); |
| 1698 write(source, buf, ntohl(ft->hdr.size)); | 1741 toc_write(source, buf, ntohl(ft->hdr.size)); |
| 1699 return; | 1742 return; |
| 1700 } | 1743 } |
| 1701 | 1744 |
| 1702 if (ft->hdr.hdrtype == htons(0x1209)) { | 1745 if (ft->hdr.hdrtype == htons(0x1209)) { |
| 1703 read(source, ft, 8); | 1746 toc_read(source, ft, 8); |
| 1704 read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | 1747 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); |
| 1705 debug_header(ft); | 1748 debug_header(ft); |
| 1706 return; | 1749 return; |
| 1707 } | 1750 } |
| 1708 | 1751 |
| 1709 if (ft->hdr.hdrtype == htons(0x120b)) { | 1752 if (ft->hdr.hdrtype == htons(0x120b)) { |
| 1710 read(source, ft, 8); | 1753 toc_read(source, ft, 8); |
| 1711 read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | 1754 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); |
| 1712 debug_header(ft); | 1755 debug_header(ft); |
| 1713 | 1756 |
| 1714 if (ft->hdr.hdrtype != htons(0x120c)) { | 1757 if (ft->hdr.hdrtype != htons(0x120c)) { |
| 1715 g_snprintf(buf, sizeof(buf), "%s decided to cancel the transfer", ft->user); | 1758 g_snprintf(buf, sizeof(buf), "%s decided to cancel the transfer", ft->user); |
| 1716 do_error_dialog(buf, NULL, GAIM_ERROR); | 1759 do_error_dialog(buf, NULL, GAIM_ERROR); |
| 1717 gaim_input_remove(ft->inpa); | 1760 gaim_input_remove(ft->inpa); |
| 1718 close(source); | 1761 toc_soc_close(source); |
| 1719 g_free(ft->filename); | 1762 g_free(ft->filename); |
| 1720 g_free(ft->user); | 1763 g_free(ft->user); |
| 1721 g_free(ft->ip); | 1764 g_free(ft->ip); |
| 1722 g_free(ft->cookie); | 1765 g_free(ft->cookie); |
| 1723 if (ft->file) | 1766 if (ft->file) |
| 1727 } | 1770 } |
| 1728 | 1771 |
| 1729 ft->hdr.hdrtype = 0x0101; | 1772 ft->hdr.hdrtype = 0x0101; |
| 1730 ft->hdr.totfiles = htons(1); ft->hdr.filesleft = htons(1); | 1773 ft->hdr.totfiles = htons(1); ft->hdr.filesleft = htons(1); |
| 1731 ft->hdr.flags = 0x20; | 1774 ft->hdr.flags = 0x20; |
| 1732 write(source, ft, 256); | 1775 toc_write(source, ft, 256); |
| 1733 return; | 1776 return; |
| 1734 } | 1777 } |
| 1735 | 1778 |
| 1736 if (ft->hdr.hdrtype == 0x0101) { | 1779 if (ft->hdr.hdrtype == 0x0101) { |
| 1737 read(source, ft, 8); | 1780 toc_read(source, ft, 8); |
| 1738 read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | 1781 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); |
| 1739 debug_header(ft); | 1782 debug_header(ft); |
| 1740 | 1783 |
| 1741 gaim_input_remove(ft->inpa); | 1784 gaim_input_remove(ft->inpa); |
| 1742 ft->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, | 1785 ft->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, |
| 1743 toc_get_file_callback, ft); | 1786 toc_get_file_callback, ft); |
| 1744 return; | 1787 return; |
| 1745 } | 1788 } |
| 1746 | 1789 |
| 1747 if (ft->hdr.hdrtype == 0x0202) { | 1790 if (ft->hdr.hdrtype == 0x0202) { |
| 1748 read(source, ft, 8); | 1791 toc_read(source, ft, 8); |
| 1749 read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); | 1792 toc_read(source, &ft->hdr.bcookie, MIN(256 - 8, ntohs(ft->hdr.hdrlen) - 8)); |
| 1750 debug_header(ft); | 1793 debug_header(ft); |
| 1751 | 1794 |
| 1752 gaim_input_remove(ft->inpa); | 1795 gaim_input_remove(ft->inpa); |
| 1753 close(source); | 1796 toc_soc_close(source); |
| 1754 g_free(ft->filename); | 1797 g_free(ft->filename); |
| 1755 g_free(ft->user); | 1798 g_free(ft->user); |
| 1756 g_free(ft->ip); | 1799 g_free(ft->ip); |
| 1757 g_free(ft->cookie); | 1800 g_free(ft->cookie); |
| 1758 if (ft->file) | 1801 if (ft->file) |
| 1796 g_snprintf(hdr->idstring, 32, "OFT_Windows ICBMFT V1.1 32"); | 1839 g_snprintf(hdr->idstring, 32, "OFT_Windows ICBMFT V1.1 32"); |
| 1797 hdr->flags = 0x02; | 1840 hdr->flags = 0x02; |
| 1798 hdr->lnameoffset = 0x1A; | 1841 hdr->lnameoffset = 0x1A; |
| 1799 hdr->lsizeoffset = 0x10; | 1842 hdr->lsizeoffset = 0x10; |
| 1800 g_snprintf(hdr->name, 64, "listing.txt"); | 1843 g_snprintf(hdr->name, 64, "listing.txt"); |
| 1801 if (write(src, hdr, 256) < 0) { | 1844 if (toc_write(src, hdr, 256) < 0) { |
| 1802 do_error_dialog(_("Could not write file header. The file will not be transferred."), NULL, GAIM_ERROR); | 1845 do_error_dialog(_("Could not write file header. The file will not be transferred."), NULL, GAIM_ERROR); |
| 1803 fclose(ft->file); | 1846 fclose(ft->file); |
| 1804 g_free(ft->filename); | 1847 g_free(ft->filename); |
| 1805 g_free(ft->cookie); | 1848 g_free(ft->cookie); |
| 1806 g_free(ft->user); | 1849 g_free(ft->user); |
| 1887 ft->ip = g_strdup(fr->ip); | 1930 ft->ip = g_strdup(fr->ip); |
| 1888 ft->port = fr->port; | 1931 ft->port = fr->port; |
| 1889 ft->files = fr->files; | 1932 ft->files = fr->files; |
| 1890 | 1933 |
| 1891 ft->window = window = gtk_file_selection_new(_("Gaim - Save As...")); | 1934 ft->window = window = gtk_file_selection_new(_("Gaim - Save As...")); |
| 1892 g_snprintf(buf, sizeof(buf), "%s/%s", g_get_home_dir(), fr->filename ? fr->filename : ""); | 1935 g_snprintf(buf, sizeof(buf), "%s/%s", gaim_home_dir(), fr->filename ? fr->filename : ""); |
| 1893 gtk_file_selection_set_filename(GTK_FILE_SELECTION(window), buf); | 1936 gtk_file_selection_set_filename(GTK_FILE_SELECTION(window), buf); |
| 1894 gtk_signal_connect(GTK_OBJECT(window), "destroy", | 1937 gtk_signal_connect(GTK_OBJECT(window), "destroy", |
| 1895 GTK_SIGNAL_FUNC(cancel_callback), ft); | 1938 GTK_SIGNAL_FUNC(cancel_callback), ft); |
| 1896 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(ft->window)->cancel_button), "clicked", | 1939 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(ft->window)->cancel_button), "clicked", |
| 1897 GTK_SIGNAL_FUNC(cancel_callback), ft); | 1940 GTK_SIGNAL_FUNC(cancel_callback), ft); |
