Mercurial > pidgin
comparison src/toc.c @ 1459:d6340f73e94b
[gaim-migrate @ 1469]
multi-file file receive
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Thu, 01 Feb 2001 12:02:13 +0000 |
parents | c6f9d0cdaa00 |
children | 1a24237f5865 |
comparison
equal
deleted
inserted
replaced
1458:6933fd960557 | 1459:d6340f73e94b |
---|---|
44 #include "pixmaps/aol_icon.xpm" | 44 #include "pixmaps/aol_icon.xpm" |
45 #include "pixmaps/away_icon.xpm" | 45 #include "pixmaps/away_icon.xpm" |
46 #include "pixmaps/dt_icon.xpm" | 46 #include "pixmaps/dt_icon.xpm" |
47 #include "pixmaps/free_icon.xpm" | 47 #include "pixmaps/free_icon.xpm" |
48 | 48 |
49 #define REVISION "gaim:$Revision: 1467 $" | 49 #define REVISION "gaim:$Revision: 1469 $" |
50 | 50 |
51 #define TYPE_SIGNON 1 | 51 #define TYPE_SIGNON 1 |
52 #define TYPE_DATA 2 | 52 #define TYPE_DATA 2 |
53 #define TYPE_ERROR 3 | 53 #define TYPE_ERROR 3 |
54 #define TYPE_SIGNOFF 4 | 54 #define TYPE_SIGNOFF 4 |
357 /* Client sends TOC toc_init_done message */ | 357 /* Client sends TOC toc_init_done message */ |
358 debug_printf("* Client sends TOC toc_init_done message\n"); | 358 debug_printf("* Client sends TOC toc_init_done message\n"); |
359 g_snprintf(snd, sizeof snd, "toc_init_done"); | 359 g_snprintf(snd, sizeof snd, "toc_init_done"); |
360 sflap_send(gc, snd, -1, TYPE_DATA); | 360 sflap_send(gc, snd, -1, TYPE_DATA); |
361 | 361 |
362 g_snprintf(snd, sizeof snd, "toc_set_caps %s", FILE_SEND_UID); | 362 g_snprintf(snd, sizeof snd, "toc_set_caps %s %s", FILE_SEND_UID, FILE_GET_UID); |
363 sflap_send(gc, snd, -1, TYPE_DATA); | 363 sflap_send(gc, snd, -1, TYPE_DATA); |
364 | 364 |
365 return; | 365 return; |
366 } | 366 } |
367 | 367 |
631 debug_printf("English translation of RVOUS_PROPOSE: %s requests Send File (i.e." | 631 debug_printf("English translation of RVOUS_PROPOSE: %s requests Send File (i.e." |
632 " send a file to you); %s:%d (verified_ip:port), %d files at" | 632 " send a file to you); %s:%d (verified_ip:port), %d files at" |
633 " total size of %ld bytes.\n", user, vip, port, files, totalsize); | 633 " total size of %ld bytes.\n", user, vip, port, files, totalsize); |
634 accept_file_dialog(ft); | 634 accept_file_dialog(ft); |
635 } else if (!strcmp(uuid, FILE_GET_UID)) { | 635 } else if (!strcmp(uuid, FILE_GET_UID)) { |
636 /* they want us to send a file | 636 /* they want us to send a file */ |
637 int unk[4], i; | 637 int unk[4], i; |
638 char *messages[4], *tmp; | 638 char *messages[4], *tmp; |
639 struct ft_request *ft; | 639 struct ft_request *ft; |
640 | 640 |
641 for (i = 0; i < 4; i++) { | 641 for (i = 0; i < 4; i++) { |
661 g_free(tmp); | 661 g_free(tmp); |
662 for (i--; i >= 0; i--) | 662 for (i--; i >= 0; i--) |
663 g_free(messages[i]); | 663 g_free(messages[i]); |
664 | 664 |
665 accept_file_dialog(ft); | 665 accept_file_dialog(ft); |
666 */ | |
667 } else if (!strcmp(uuid, VOICE_UID)) { | 666 } else if (!strcmp(uuid, VOICE_UID)) { |
668 /* oh goody. voice over ip. fun stuff. */ | 667 /* oh goody. voice over ip. fun stuff. */ |
669 } else if (!strcmp(uuid, B_ICON_UID)) { | 668 } else if (!strcmp(uuid, B_ICON_UID)) { |
670 /* buddy icon... */ | 669 /* buddy icon... */ |
671 } else if (!strcmp(uuid, IMAGE_UID)) { | 670 } else if (!strcmp(uuid, IMAGE_UID)) { |
1293 char *ip; | 1292 char *ip; |
1294 int port; | 1293 int port; |
1295 long size; | 1294 long size; |
1296 | 1295 |
1297 GtkWidget *window; | 1296 GtkWidget *window; |
1297 int files; | |
1298 char *filename; | |
1298 FILE *file; | 1299 FILE *file; |
1299 int recvsize; | 1300 int recvsize; |
1300 | 1301 |
1301 gint inpa; | 1302 gint inpa; |
1302 }; | 1303 }; |
1342 struct file_transfer *ft = data; | 1343 struct file_transfer *ft = data; |
1343 | 1344 |
1344 if (cond & GDK_INPUT_EXCEPTION) { | 1345 if (cond & GDK_INPUT_EXCEPTION) { |
1345 gdk_input_remove(ft->inpa); | 1346 gdk_input_remove(ft->inpa); |
1346 close(source); | 1347 close(source); |
1348 g_free(ft->filename); | |
1347 g_free(ft->user); | 1349 g_free(ft->user); |
1348 g_free(ft->ip); | 1350 g_free(ft->ip); |
1349 g_free(ft->cookie); | 1351 g_free(ft->cookie); |
1350 fclose(ft->file); | 1352 if (ft->file) |
1353 fclose(ft->file); | |
1351 g_free(ft); | 1354 g_free(ft); |
1352 return; | 1355 return; |
1353 } | 1356 } |
1354 | 1357 |
1355 if (ft->hdr.hdrtype != 0x202) { | 1358 if (ft->hdr.hdrtype != 0x202) { |
1363 memcpy(ft->hdr.bcookie, buf, 8); | 1366 memcpy(ft->hdr.bcookie, buf, 8); |
1364 g_free(buf); | 1367 g_free(buf); |
1365 ft->hdr.encrypt = 0; ft->hdr.compress = 0; | 1368 ft->hdr.encrypt = 0; ft->hdr.compress = 0; |
1366 debug_header(ft); | 1369 debug_header(ft); |
1367 write(source, ft, 256); | 1370 write(source, ft, 256); |
1371 | |
1372 if (ft->files == 1) { | |
1373 ft->file = fopen(ft->filename, "w"); | |
1374 if (!ft->file) { | |
1375 buf = g_strdup_printf("Could not open %s for writing!", ft->filename); | |
1376 do_error_dialog(buf, _("Error")); | |
1377 g_free(buf); | |
1378 gdk_input_remove(ft->inpa); | |
1379 close(source); | |
1380 g_free(ft->filename); | |
1381 g_free(ft->user); | |
1382 g_free(ft->ip); | |
1383 g_free(ft->cookie); | |
1384 g_free(ft); | |
1385 } | |
1386 } else { | |
1387 buf = g_strdup_printf("%s/%s", ft->filename, ft->hdr.name); | |
1388 ft->file = fopen(buf, "w"); | |
1389 g_free(buf); | |
1390 if (!ft->file) { | |
1391 buf = g_strdup_printf("Could not open %s/%s for writing!", ft->filename, | |
1392 ft->hdr.name); | |
1393 do_error_dialog(buf, _("Error")); | |
1394 g_free(buf); | |
1395 gdk_input_remove(ft->inpa); | |
1396 close(source); | |
1397 g_free(ft->filename); | |
1398 g_free(ft->user); | |
1399 g_free(ft->ip); | |
1400 g_free(ft->cookie); | |
1401 g_free(ft); | |
1402 } | |
1403 } | |
1368 | 1404 |
1369 return; | 1405 return; |
1370 } | 1406 } |
1371 | 1407 |
1372 rt = read(source, buf, MIN(ntohl(ft->hdr.size) - ft->recvsize, 1024)); | 1408 rt = read(source, buf, MIN(ntohl(ft->hdr.size) - ft->recvsize, 1024)); |
1375 gdk_input_remove(ft->inpa); | 1411 gdk_input_remove(ft->inpa); |
1376 close(source); | 1412 close(source); |
1377 g_free(ft->user); | 1413 g_free(ft->user); |
1378 g_free(ft->ip); | 1414 g_free(ft->ip); |
1379 g_free(ft->cookie); | 1415 g_free(ft->cookie); |
1380 fclose(ft->file); | 1416 if (ft->file) |
1417 fclose(ft->file); | |
1381 g_free(ft); | 1418 g_free(ft); |
1382 return; | 1419 return; |
1383 } | 1420 } |
1384 ft->recvsize += rt; | 1421 ft->recvsize += rt; |
1385 for (i = 0; i < rt; i++) | 1422 for (i = 0; i < rt; i++) |
1392 ft->hdr.recvcsum = ft->hdr.checksum; /* uh... */ | 1429 ft->hdr.recvcsum = ft->hdr.checksum; /* uh... */ |
1393 ft->hdr.nrecvd = htons(ntohs(ft->hdr.nrecvd) + 1); | 1430 ft->hdr.nrecvd = htons(ntohs(ft->hdr.nrecvd) + 1); |
1394 ft->hdr.flags = 0; | 1431 ft->hdr.flags = 0; |
1395 write(source, ft, 256); | 1432 write(source, ft, 256); |
1396 ft->recvsize = 0; | 1433 ft->recvsize = 0; |
1397 if (ft->hdr.filesleft != 0) { | 1434 fclose(ft->file); |
1398 char *msg = g_strdup_printf("%s tried to send you more than one file, but" | 1435 if (ft->hdr.filesleft == 0) { |
1399 " currently that is not possible.", ft->user); | 1436 gdk_input_remove(ft->inpa); |
1400 do_error_dialog(msg, "Error"); | 1437 close(source); |
1401 g_free(msg); | 1438 g_free(ft->filename); |
1439 g_free(ft->user); | |
1440 g_free(ft->ip); | |
1441 g_free(ft->cookie); | |
1442 g_free(ft); | |
1402 } | 1443 } |
1403 gdk_input_remove(ft->inpa); | |
1404 close(source); | |
1405 g_free(ft->user); | |
1406 g_free(ft->ip); | |
1407 g_free(ft->cookie); | |
1408 fclose(ft->file); | |
1409 g_free(ft); | |
1410 } | 1444 } |
1411 } | 1445 } |
1412 | 1446 |
1413 static void toc_send_file(gpointer a, struct file_transfer *old_ft) { | 1447 static void toc_send_file(gpointer a, struct file_transfer *old_ft) { |
1414 struct file_transfer *ft; | 1448 struct file_transfer *ft; |
1418 char *buf; | 1452 char *buf; |
1419 | 1453 |
1420 if (file_is_dir(dirname, old_ft->window)) | 1454 if (file_is_dir(dirname, old_ft->window)) |
1421 return; | 1455 return; |
1422 ft = g_new0(struct file_transfer, 1); | 1456 ft = g_new0(struct file_transfer, 1); |
1423 ft->file = fopen(dirname, "w"); | 1457 if (old_ft->files == 1) |
1424 if (!ft->file) { | 1458 ft->filename = g_strdup(dirname); |
1425 do_error_dialog(_("Could not open file for writing!"), _("Error")); | 1459 else |
1426 g_free(ft); | 1460 ft->filename = g_dirname(dirname); |
1427 gtk_widget_destroy(old_ft->window); | |
1428 return; | |
1429 } | |
1430 | |
1431 ft->cookie = g_strdup(old_ft->cookie); | 1461 ft->cookie = g_strdup(old_ft->cookie); |
1432 ft->user = g_strdup(old_ft->user); | 1462 ft->user = g_strdup(old_ft->user); |
1433 ft->ip = g_strdup(old_ft->ip); | 1463 ft->ip = g_strdup(old_ft->ip); |
1464 ft->files = old_ft->files; | |
1434 ft->port = old_ft->port; | 1465 ft->port = old_ft->port; |
1435 ft->gc = old_ft->gc; | 1466 ft->gc = old_ft->gc; |
1436 user = ft->gc->user; | 1467 user = ft->gc->user; |
1437 gtk_widget_destroy(old_ft->window); | 1468 gtk_widget_destroy(old_ft->window); |
1438 | 1469 |
1445 user->proto_opt[USEROPT_SOCKSHOST], | 1476 user->proto_opt[USEROPT_SOCKSHOST], |
1446 atoi(user->proto_opt[USEROPT_SOCKSPORT]), | 1477 atoi(user->proto_opt[USEROPT_SOCKSPORT]), |
1447 atoi(user->proto_opt[USEROPT_PROXYTYPE])); | 1478 atoi(user->proto_opt[USEROPT_PROXYTYPE])); |
1448 if (fd < 0) { | 1479 if (fd < 0) { |
1449 do_error_dialog(_("Could not connect for transfer!"), _("Error")); | 1480 do_error_dialog(_("Could not connect for transfer!"), _("Error")); |
1481 g_free(ft->filename); | |
1450 g_free(ft->cookie); | 1482 g_free(ft->cookie); |
1451 g_free(ft->user); | 1483 g_free(ft->user); |
1452 g_free(ft->ip); | 1484 g_free(ft->ip); |
1453 g_free(ft); | 1485 g_free(ft); |
1454 return; | 1486 return; |
1475 ft->gc = fr->gc; | 1507 ft->gc = fr->gc; |
1476 ft->user = g_strdup(fr->user); | 1508 ft->user = g_strdup(fr->user); |
1477 ft->cookie = g_strdup(fr->cookie); | 1509 ft->cookie = g_strdup(fr->cookie); |
1478 ft->ip = g_strdup(fr->ip); | 1510 ft->ip = g_strdup(fr->ip); |
1479 ft->port = fr->port; | 1511 ft->port = fr->port; |
1512 ft->files = fr->files; | |
1480 | 1513 |
1481 ft->window = window = gtk_file_selection_new(_("Gaim - Save As...")); | 1514 ft->window = window = gtk_file_selection_new(_("Gaim - Save As...")); |
1482 g_snprintf(buf, sizeof(buf), "%s/%s", g_get_home_dir(), fr->filename ? fr->filename : ""); | 1515 g_snprintf(buf, sizeof(buf), "%s/%s", g_get_home_dir(), fr->filename ? fr->filename : ""); |
1483 gtk_file_selection_set_filename(GTK_FILE_SELECTION(window), buf); | 1516 gtk_file_selection_set_filename(GTK_FILE_SELECTION(window), buf); |
1484 gtk_signal_connect(GTK_OBJECT(window), "destroy", | 1517 gtk_signal_connect(GTK_OBJECT(window), "destroy", |