| 474 g_list_free(tmp); |
477 g_list_free(tmp); |
| 475 c = g_slist_next(c); |
478 c = g_slist_next(c); |
| 476 } |
479 } |
| 477 } |
480 } |
| 478 } |
481 } |
| |
482 |
| |
483 struct ft_req { |
| |
484 struct gaim_connection *gc; |
| |
485 gboolean send; |
| |
486 gboolean multiple; |
| |
487 guint size; |
| |
488 char *name; |
| |
489 ft_callback cb; |
| |
490 gpointer data; |
| |
491 GtkWidget *fd; |
| |
492 }; |
| |
493 |
| |
494 static void ftrrno(gpointer w, struct ft_req *fr) |
| |
495 { |
| |
496 if (fr->fd && (w != fr->fd)) { |
| |
497 gtk_widget_destroy(fr->fd); |
| |
498 return; |
| |
499 } |
| |
500 if (fr->cb) |
| |
501 fr->cb(fr->gc, NULL, TRUE, fr->data); |
| |
502 if (fr->name) |
| |
503 g_free(fr->name); |
| |
504 g_free(fr); |
| |
505 } |
| |
506 |
| |
507 static void do_exist_dialog(const char *name, unsigned long size, struct ft_req *fr) |
| |
508 { |
| |
509 /* |
| |
510 GtkWidget *window; |
| |
511 GtkWidget *vbox; |
| |
512 GtkWidget *label; |
| |
513 GtkWidget *hbox; |
| |
514 GtkWidget *button; |
| |
515 char buf[8192]; |
| |
516 |
| |
517 g_snprintf(buf, sizeof(buf), "It appears that %s already exists. Do you want to " |
| |
518 "overwrite the file%s or cancel the transfer?", name, |
| |
519 (size <= fr->size) ? ", resume the download," : ""); |
| |
520 |
| |
521 window = gtk_window_new(GTK_WINDOW_DIALOG); |
| |
522 */ |
| |
523 } |
| |
524 |
| |
525 static void ftgotfile(gpointer w, struct ft_req *fr) |
| |
526 { |
| |
527 const char *fname = gtk_file_selection_get_filename(GTK_FILE_SELECTION(fr->fd)); |
| |
528 if (!fr->multiple && file_is_dir(fname, fr->fd)) |
| |
529 return; |
| |
530 |
| |
531 if (!fr->multiple && !fr->send) { |
| |
532 struct stat st; |
| |
533 if (stat(fname, &st) == 0) { |
| |
534 do_exist_dialog(fname, st.st_size, fr); |
| |
535 return; |
| |
536 } |
| |
537 } |
| |
538 |
| |
539 fr->cb(fr->gc, fname, FT_EXIST_DNE, fr->data); |
| |
540 fr->cb = NULL; |
| |
541 |
| |
542 gtk_widget_destroy(fr->fd); |
| |
543 } |
| |
544 |
| |
545 static void ftrrok(gpointer w, struct ft_req *ft) |
| |
546 { |
| |
547 /* ft is going to be free'd as soon as we leave this function, so we'll copy it */ |
| |
548 struct ft_req *fr = g_memdup(ft, sizeof(struct ft_req)); |
| |
549 char buf[256]; |
| |
550 |
| |
551 if (fr->send) |
| |
552 fr->fd = gtk_file_selection_new(_("Gaim - Select File")); |
| |
553 else |
| |
554 fr->fd = gtk_file_selection_new(_("Gaim - Send File")); |
| |
555 |
| |
556 g_snprintf(buf, sizeof(buf), "%s/%s", g_get_home_dir(), fr->name ? fr->name : ""); |
| |
557 gtk_file_selection_set_filename(GTK_FILE_SELECTION(fr->fd), buf); |
| |
558 |
| |
559 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fr->fd)->ok_button), "clicked", |
| |
560 GTK_SIGNAL_FUNC(ftgotfile), fr); |
| |
561 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fr->fd)->cancel_button), "clicked", |
| |
562 GTK_SIGNAL_FUNC(ftrrno), fr); |
| |
563 gtk_signal_connect(GTK_OBJECT(fr->fd), "destroy", GTK_SIGNAL_FUNC(ftrrno), fr); |
| |
564 |
| |
565 gtk_widget_show(fr->fd); |
| |
566 } |
| |
567 |
| |
568 void ft_receive_request(struct gaim_connection *gc, const char *who, gboolean send, gboolean multiple, |
| |
569 char *name, guint size, ft_callback cb, gpointer data) |
| |
570 { |
| |
571 char buf[8192]; |
| |
572 struct ft_req *fr = g_new0(struct ft_req, 1); |
| |
573 |
| |
574 fr->gc = gc; |
| |
575 fr->send = send; |
| |
576 fr->multiple = multiple; |
| |
577 fr->size = size; |
| |
578 if (name) |
| |
579 fr->name = g_strdup(name); |
| |
580 fr->cb = cb; |
| |
581 fr->data = data; |
| |
582 |
| |
583 if (send) |
| |
584 g_snprintf(buf, sizeof(buf), "%s has just asked %s to send a file.", |
| |
585 who, gc->username); |
| |
586 else if (multiple) |
| |
587 g_snprintf(buf, sizeof(buf), "%s has just asked %s to receive some files.", |
| |
588 who, gc->username); |
| |
589 else if (name && size) |
| |
590 g_snprintf(buf, sizeof(buf), "%s has just asked %s to receive %s (%d bytes).", |
| |
591 who, gc->username, name, size); |
| |
592 else if (name) |
| |
593 g_snprintf(buf, sizeof(buf), "%s has just asked %s to receive %s.", |
| |
594 who, gc->username, name); |
| |
595 else |
| |
596 g_snprintf(buf, sizeof(buf), "%s has just asked %s to receive a file.", |
| |
597 who, gc->username); |
| |
598 |
| |
599 do_ask_dialog(buf, fr, ftrrok, ftrrno); |
| |
600 } |