comparison src/gtk/transfer.c @ 367:d5409bf03ff1

2003-1-18 Brian Masney <masneyb@gftp.org> * lib/protocols.c (gftp_parse_url) - if the URL is the local filesystem, skip over the whitespace at the beginning. * lib/rfc959.c (rfc959_syst) - allow the string MVS and OS/MVS for the MVS directory listings. * src/gtk/gtkui_transfer.c src/gtk/transfer.c src/gtk/gftpui.c - started to move the transfer functionality into the uicommon directory. Added the text and GTK+ UI specific transfer functions. * src/gtk/Makefile.am po/POTFILES.in - added gtkui_transfer.c * src/gtk/dnd.c src/gtk/gtkui_transfer.c src/gtk/view_dialog.c - s/add_file_transfer/gtkui_common_add_file_transfer/ * src/gtk/gftp-gtk.c src/gtk/gftp-gtk.h - removed transfer_mutex * src/gtk/gtkui.c src/text/textui.c - added gftpui_add_file_to_transfer() * src/uicommon/gftpui_callbacks.c src/uicommon/gftpui.c - in all of the thread callback functions, don't alter the return value in the function. Return it as is.
author masneyb
date Sun, 18 Jan 2004 20:09:28 +0000
parents 7cb3327f96f7
children af541d789f4c
comparison
equal deleted inserted replaced
366:2e408d9918d4 367:d5409bf03ff1
18 /*****************************************************************************/ 18 /*****************************************************************************/
19 19
20 #include <gftp-gtk.h> 20 #include <gftp-gtk.h>
21 static const char cvsid[] = "$Id$"; 21 static const char cvsid[] = "$Id$";
22 22
23 static GtkWidget * dialog;
24 static int num_transfers_in_progress = 0; 23 static int num_transfers_in_progress = 0;
25 24
26 int 25 int
27 ftp_list_files (gftp_window_data * wdata, int usecache) 26 ftp_list_files (gftp_window_data * wdata, int usecache)
28 { 27 {
54 53
55 return (1); 54 return (1);
56 } 55 }
57 56
58 57
59 static void
60 try_connect_again (gftp_request * request, gftp_dialog_data * ddata)
61 {
62 gftp_set_password (request, gtk_entry_get_text (GTK_ENTRY (ddata->edit)));
63 request->stopable = 0;
64 }
65
66
67 static void
68 dont_connect_again (gftp_request * request, gftp_dialog_data * ddata)
69 {
70 request->stopable = 0;
71 }
72
73
74 static void *
75 connect_thread (void *data)
76 {
77 int ret, sj;
78 intptr_t retries, sleep_time, network_timeout;
79 static int conn_num;
80 gftp_request * request;
81
82 request = data;
83
84 gftp_lookup_request_option (request, "retries", &retries);
85 gftp_lookup_request_option (request, "sleep_time", &sleep_time);
86 gftp_lookup_request_option (request, "network_timeout", &network_timeout);
87
88 conn_num = 0;
89 if (gftpui_common_use_threads (request))
90 {
91 sj = sigsetjmp (gftpui_common_jmp_environment, 1);
92 gftpui_common_use_jmp_environment = 1;
93 }
94 else
95 sj = 0;
96
97 ret = 0;
98 if (sj != 0)
99 {
100 ret = 0;
101 gftp_disconnect (request);
102 }
103
104 while (sj != 1 && (retries == 0 || conn_num < retries))
105 {
106 conn_num++;
107 if (network_timeout > 0)
108 alarm (network_timeout);
109 ret = gftp_connect (request);
110 alarm (0);
111
112 if (ret == GFTP_EFATAL)
113 {
114 ret = 0;
115 break;
116 }
117 else if (ret == 0)
118 {
119 ret = 1;
120 break;
121 }
122 else if (retries == 0 || conn_num < retries)
123 {
124 request->logging_function (gftp_logging_misc, request,
125 _("Waiting %d seconds until trying to connect again\n"),
126 sleep_time);
127 alarm (sleep_time);
128 pause ();
129 }
130 }
131
132 if (gftpui_common_use_threads (request))
133 gftpui_common_use_jmp_environment = 0;
134
135 request->stopable = 0;
136 if (request->wakeup_main_thread[1] > 0)
137 write (request->wakeup_main_thread[1], " ", 1);
138 return (GINT_TO_POINTER (ret));
139 }
140
141
142 int 58 int
143 ftp_connect (gftp_window_data * wdata, gftp_request * request, int getdir) 59 ftp_connect (gftp_window_data * wdata, gftp_request * request, int getdir)
144 { 60 {
145 int success;
146 void *ret;
147
148 ret = 0;
149 if (wdata->request == request) 61 if (wdata->request == request)
150 { 62 gtk_label_set (GTK_LABEL (wdata->hoststxt), _("Connecting..."));
151 gtk_label_set (GTK_LABEL (wdata->hoststxt), _("Connecting...")); 63
152 } 64 return (gftpui_common_cmd_open (wdata, request, NULL));
153
154 if (request->need_userpass && request->username != NULL &&
155 *request->username != '\0' &&
156 (request->password == NULL || *request->password == '\0'))
157 {
158 if (wdata && wdata->request == request)
159 {
160 request->stopable = 1;
161 MakeEditDialog (_("Enter Password"),
162 _("Please enter your password for this site"), NULL,
163 0, NULL, gftp_dialog_button_connect,
164 try_connect_again, request,
165 dont_connect_again, request);
166
167 while (request->stopable)
168 {
169 GDK_THREADS_LEAVE ();
170 #if GTK_MAJOR_VERSION == 1
171 g_main_iteration (TRUE);
172 #else
173 g_main_context_iteration (NULL, TRUE);
174 #endif
175 }
176
177 if (request->password == NULL || *request->password == '\0')
178 return (0);
179 }
180 else
181 gftp_set_password (request, "");
182 }
183
184 if (wdata && wdata->request == request && gftpui_common_use_threads (request))
185 {
186 request->stopable = 1;
187 if (wdata)
188 gtk_clist_freeze (GTK_CLIST (wdata->listbox));
189 gtk_widget_set_sensitive (stop_btn, 1);
190 pthread_create (&wdata->tid, NULL, connect_thread, request);
191
192 while (request->stopable)
193 {
194 GDK_THREADS_LEAVE ();
195 #if GTK_MAJOR_VERSION == 1
196 g_main_iteration (TRUE);
197 #else
198 g_main_context_iteration (NULL, TRUE);
199 #endif
200 }
201 pthread_join (wdata->tid, &ret);
202
203 gtk_widget_set_sensitive (stop_btn, 0);
204 if (wdata)
205 gtk_clist_thaw (GTK_CLIST (wdata->listbox));
206 }
207 else
208 ret = connect_thread (request);
209
210 success = GPOINTER_TO_INT (ret);
211 memset (&wdata->tid, 0, sizeof (wdata->tid));
212
213 if (!GFTP_IS_CONNECTED (wdata->request))
214 disconnect (wdata);
215 else if (success)
216 {
217 ftp_list_files (wdata, 1);
218 if (!GFTP_IS_CONNECTED (wdata->request))
219 disconnect (wdata);
220 }
221
222 return (success);
223 } 65 }
224 66
225 67
226 void 68 void
227 get_files (gpointer data) 69 get_files (gpointer data)
330 gftp_swap_socks (towdata->request, transfer->toreq); 172 gftp_swap_socks (towdata->request, transfer->toreq);
331 } 173 }
332 174
333 if (transfer->files != NULL) 175 if (transfer->files != NULL)
334 { 176 {
335 add_file_transfer (transfer->fromreq, transfer->toreq, 177 gftpui_common_add_file_transfer (transfer->fromreq, transfer->toreq,
336 transfer->fromwdata, transfer->towdata, 178 transfer->fromwdata, transfer->towdata,
337 transfer->files, 0); 179 transfer->files);
338 g_free (transfer); 180 g_free (transfer);
339 } 181 }
340 else 182 else
341 free_tdata (transfer); 183 free_tdata (transfer);
342 } 184 }
375 (transfer->toreq && gftpui_common_use_threads (transfer->toreq))) 217 (transfer->toreq && gftpui_common_use_threads (transfer->toreq)))
376 gftpui_common_use_jmp_environment = 0; 218 gftpui_common_use_jmp_environment = 0;
377 219
378 transfer->fromreq->stopable = 0; 220 transfer->fromreq->stopable = 0;
379 return (GINT_TO_POINTER (success)); 221 return (GINT_TO_POINTER (success));
380 }
381
382
383 static void
384 _gftp_setup_fds (gftp_transfer * tdata, gftp_file * curfle,
385 int *fromfd, int *tofd)
386 {
387 *tofd = -1;
388 *fromfd = -1;
389
390 if (curfle->is_fd)
391 {
392 if (tdata->toreq->protonum == GFTP_LOCAL_NUM)
393 *tofd = curfle->fd;
394 else if (tdata->fromreq->protonum == GFTP_LOCAL_NUM)
395 *fromfd = curfle->fd;
396 }
397 }
398
399
400 static void
401 _gftp_done_with_fds (gftp_transfer * tdata, gftp_file * curfle)
402 {
403 if (curfle->is_fd)
404 {
405 if (tdata->toreq->protonum == GFTP_LOCAL_NUM)
406 tdata->toreq->datafd = -1;
407 else
408 tdata->fromreq->datafd = -1;
409 }
410 }
411
412
413 void *
414 gftp_gtk_transfer_files (void *data)
415 {
416 int i, mode, tofd, fromfd;
417 intptr_t preserve_permissions;
418 gftp_transfer * transfer;
419 char buf[8192];
420 off_t fromsize, total;
421 gftp_file * curfle;
422 ssize_t num_read, ret;
423
424 pthread_detach (pthread_self ());
425 transfer = data;
426 transfer->curfle = transfer->files;
427 gettimeofday (&transfer->starttime, NULL);
428 memcpy (&transfer->lasttime, &transfer->starttime,
429 sizeof (transfer->lasttime));
430
431 gftp_lookup_request_option (transfer->fromreq, "preserve_permissions",
432 &preserve_permissions);
433
434 while (transfer->curfle != NULL)
435 {
436 num_read = -1;
437 g_static_mutex_lock (&transfer->structmutex);
438 curfle = transfer->curfle->data;
439 transfer->current_file_number++;
440 g_static_mutex_unlock (&transfer->structmutex);
441
442 if (curfle->transfer_action == GFTP_TRANS_ACTION_SKIP)
443 {
444 g_static_mutex_lock (&transfer->structmutex);
445 transfer->next_file = 1;
446 transfer->curfle = transfer->curfle->next;
447 g_static_mutex_unlock (&transfer->structmutex);
448 continue;
449 }
450
451 fromsize = -1;
452 if (gftp_connect (transfer->fromreq) == 0 &&
453 gftp_connect (transfer->toreq) == 0)
454 {
455 if (curfle->isdir)
456 {
457 if (transfer->toreq->mkdir != NULL)
458 {
459 transfer->toreq->mkdir (transfer->toreq, curfle->destfile);
460 if (!GFTP_IS_CONNECTED (transfer->toreq))
461 break;
462 }
463
464 g_static_mutex_lock (&transfer->structmutex);
465 transfer->next_file = 1;
466 transfer->curfle = transfer->curfle->next;
467 g_static_mutex_unlock (&transfer->structmutex);
468 continue;
469 }
470
471 _gftp_setup_fds (transfer, curfle, &fromfd, &tofd);
472
473 if (curfle->size == 0)
474 {
475 curfle->size = gftp_get_file_size (transfer->fromreq, curfle->file);
476 transfer->total_bytes += curfle->size;
477 }
478
479 if (GFTP_IS_CONNECTED (transfer->fromreq) &&
480 GFTP_IS_CONNECTED (transfer->toreq))
481 {
482 fromsize = gftp_transfer_file (transfer->fromreq, curfle->file,
483 fromfd,
484 curfle->transfer_action == GFTP_TRANS_ACTION_RESUME ?
485 curfle->startsize : 0,
486 transfer->toreq, curfle->destfile, tofd,
487 curfle->transfer_action == GFTP_TRANS_ACTION_RESUME ?
488 curfle->startsize : 0);
489 }
490 }
491
492 if (!GFTP_IS_CONNECTED (transfer->fromreq) ||
493 !GFTP_IS_CONNECTED (transfer->toreq))
494 {
495 transfer->fromreq->logging_function (gftp_logging_misc,
496 transfer->fromreq,
497 _("Error: Remote site disconnected after trying to transfer file\n"));
498 }
499 else if (fromsize < 0)
500 {
501 g_static_mutex_lock (&transfer->structmutex);
502 curfle->transfer_action = GFTP_TRANS_ACTION_SKIP;
503 transfer->next_file = 1;
504 transfer->curfle = transfer->curfle->next;
505 g_static_mutex_unlock (&transfer->structmutex);
506 continue;
507 }
508 else
509 {
510 g_static_mutex_lock (&transfer->structmutex);
511 transfer->curtrans = 0;
512 transfer->curresumed = curfle->transfer_action == GFTP_TRANS_ACTION_RESUME ? curfle->startsize : 0;
513 transfer->resumed_bytes += transfer->curresumed;
514 g_static_mutex_unlock (&transfer->structmutex);
515
516 total = 0;
517 i = 0;
518 while (!transfer->cancel &&
519 (num_read = gftp_get_next_file_chunk (transfer->fromreq,
520 buf, sizeof (buf))) > 0)
521 {
522 total += num_read;
523 gftp_calc_kbs (transfer, num_read);
524
525 if ((ret = gftp_put_next_file_chunk (transfer->toreq, buf,
526 num_read)) < 0)
527 {
528 num_read = (int) ret;
529 break;
530 }
531 }
532 }
533
534 if (transfer->cancel)
535 {
536 if (gftp_abort_transfer (transfer->fromreq) != 0)
537 gftp_disconnect (transfer->fromreq);
538
539 if (gftp_abort_transfer (transfer->toreq) != 0)
540 gftp_disconnect (transfer->toreq);
541 }
542 else if (num_read < 0)
543 {
544 transfer->fromreq->logging_function (gftp_logging_misc,
545 transfer->fromreq,
546 _("Could not download %s from %s\n"),
547 curfle->file,
548 transfer->fromreq->hostname);
549
550 if (gftp_get_transfer_status (transfer, num_read) == GFTP_ERETRYABLE)
551 continue;
552
553 break;
554 }
555 else
556 {
557 _gftp_done_with_fds (transfer, curfle);
558 if (gftp_end_transfer (transfer->fromreq) != 0)
559 {
560 if (gftp_get_transfer_status (transfer, -1) == GFTP_ERETRYABLE)
561 continue;
562
563 break;
564 }
565 gftp_end_transfer (transfer->toreq);
566
567 transfer->fromreq->logging_function (gftp_logging_misc,
568 transfer->fromreq,
569 _("Successfully transferred %s at %.2f KB/s\n"),
570 curfle->file, transfer->kbs);
571 }
572
573 if (!curfle->is_fd && preserve_permissions)
574 {
575 if (curfle->attribs)
576 {
577 mode = gftp_parse_attribs (curfle->attribs);
578 if (mode != 0)
579 gftp_chmod (transfer->toreq, curfle->destfile, mode);
580 }
581
582 if (curfle->datetime != 0)
583 gftp_set_file_time (transfer->toreq, curfle->destfile,
584 curfle->datetime);
585 }
586
587 g_static_mutex_lock (&transfer->structmutex);
588 transfer->curtrans = 0;
589 transfer->next_file = 1;
590 curfle->transfer_done = 1;
591 transfer->curfle = transfer->curfle->next;
592 g_static_mutex_unlock (&transfer->structmutex);
593
594 if (transfer->cancel && !transfer->skip_file)
595 break;
596 transfer->cancel = 0;
597 transfer->fromreq->cancel = 0;
598 transfer->toreq->cancel = 0;
599 }
600 transfer->done = 1;
601 return (NULL);
602 }
603
604
605 gftp_transfer *
606 add_file_transfer (gftp_request * fromreq, gftp_request * toreq,
607 gftp_window_data * fromwdata, gftp_window_data * towdata,
608 GList * files, int copy_req)
609 {
610 int dialog;
611 intptr_t append_transfers, one_transfer;
612 gftp_curtrans_data * transdata;
613 GList * templist, *curfle;
614 gftp_transfer * tdata;
615 gftp_file * tempfle;
616 char *pos, *text[2];
617
618 for (templist = files; templist != NULL; templist = templist->next)
619 {
620 tempfle = templist->data;
621 if (tempfle->startsize > 0)
622 break;
623 }
624 dialog = templist != NULL;
625
626 gftp_lookup_request_option (fromreq, "append_transfers",
627 &append_transfers);
628 gftp_lookup_request_option (fromreq, "one_transfer",
629 &one_transfer);
630
631 tdata = NULL;
632 if (append_transfers && one_transfer)
633 {
634 pthread_mutex_lock (&transfer_mutex);
635 for (templist = gftp_file_transfers; templist != NULL; templist = templist->next)
636 {
637 tdata = templist->data;
638 g_static_mutex_lock (&tdata->structmutex);
639 if (compare_request (tdata->fromreq, fromreq, 0) &&
640 compare_request (tdata->toreq, toreq, 0) &&
641 tdata->curfle != NULL)
642 {
643 if (!copy_req)
644 {
645 gftp_request_destroy (fromreq, 1);
646 gftp_request_destroy (toreq, 1);
647 }
648 fromreq = NULL;
649 toreq = NULL;
650
651 for (curfle = tdata->curfle;
652 curfle != NULL && curfle->next != NULL;
653 curfle = curfle->next);
654 if (curfle == NULL)
655 {
656 curfle = files;
657 files->prev = NULL;
658 }
659 else
660 {
661 curfle->next = files;
662 files->prev = curfle;
663 }
664
665 for (curfle = files; curfle != NULL; curfle = curfle->next)
666 {
667 tempfle = curfle->data;
668 if (tempfle->isdir)
669 tdata->numdirs++;
670 else
671 tdata->numfiles++;
672 if ((pos = strrchr (tempfle->file, '/')) == NULL)
673 pos = tempfle->file;
674 else
675 pos++;
676
677 text[0] = pos;
678 if (tempfle->transfer_action == GFTP_TRANS_ACTION_SKIP)
679 text[1] = _("Skipped");
680 else
681 {
682 tdata->total_bytes += tempfle->size;
683 text[1] = _("Waiting...");
684 }
685
686 tempfle->user_data = gtk_ctree_insert_node (GTK_CTREE (dlwdw),
687 tdata->user_data, NULL, text, 5,
688 NULL, NULL, NULL, NULL,
689 FALSE, FALSE);
690 transdata = g_malloc (sizeof (*transdata));
691 transdata->transfer = tdata;
692 transdata->curfle = curfle;
693 gtk_ctree_node_set_row_data (GTK_CTREE (dlwdw), tempfle->user_data,
694 transdata);
695 }
696 g_static_mutex_unlock (&tdata->structmutex);
697 break;
698 }
699 g_static_mutex_unlock (&tdata->structmutex);
700 }
701 pthread_mutex_unlock (&transfer_mutex);
702 }
703 else
704 templist = NULL;
705
706 if (templist == NULL)
707 {
708 tdata = gftp_tdata_new ();
709 if (copy_req)
710 {
711 tdata->fromreq = copy_request (fromreq, 0);
712 tdata->toreq = copy_request (toreq, 0);
713 }
714 else
715 {
716 tdata->fromreq = fromreq;
717 tdata->toreq = toreq;
718 }
719
720 tdata->fromwdata = fromwdata;
721 tdata->towdata = towdata;
722 if (!dialog)
723 tdata->show = tdata->ready = 1;
724 tdata->files = files;
725 for (curfle = files; curfle != NULL; curfle = curfle->next)
726 {
727 tempfle = curfle->data;
728 if (tempfle->isdir)
729 tdata->numdirs++;
730 else
731 tdata->numfiles++;
732 }
733
734 pthread_mutex_lock (&transfer_mutex);
735 gftp_file_transfers = g_list_append (gftp_file_transfers, tdata);
736 pthread_mutex_unlock (&transfer_mutex);
737
738 if (dialog)
739 gftp_gtk_ask_transfer (tdata);
740 }
741
742 return (tdata);
743 } 222 }
744 223
745 224
746 static void 225 static void
747 remove_file (char *filename) 226 remove_file (char *filename)
795 ve_proc->remote_filename = NULL; 274 ve_proc->remote_filename = NULL;
796 tempfle->file = ve_proc->filename; 275 tempfle->file = ve_proc->filename;
797 ve_proc->filename = NULL; 276 ve_proc->filename = NULL;
798 tempfle->done_rm = 1; 277 tempfle->done_rm = 1;
799 newfile = g_list_append (NULL, tempfle); 278 newfile = g_list_append (NULL, tempfle);
800 tdata = add_file_transfer (ve_proc->fromwdata->request, ve_proc->torequest, 279 tdata = gftpui_common_add_file_transfer (ve_proc->fromwdata->request,
801 ve_proc->fromwdata, ve_proc->towdata, newfile, 1); 280 ve_proc->torequest,
281 ve_proc->fromwdata,
282 ve_proc->towdata, newfile);
802 free_edit_data (ve_proc); 283 free_edit_data (ve_proc);
803 284
804 if (tdata != NULL) 285 if (tdata != NULL)
805 tdata->conn_error_no_timeout = 1; 286 tdata->conn_error_no_timeout = 1;
806 } 287 }
970 static void 451 static void
971 show_transfer (gftp_transfer * tdata) 452 show_transfer (gftp_transfer * tdata)
972 { 453 {
973 GdkPixmap * closedir_pixmap, * opendir_pixmap; 454 GdkPixmap * closedir_pixmap, * opendir_pixmap;
974 GdkBitmap * closedir_bitmap, * opendir_bitmap; 455 GdkBitmap * closedir_bitmap, * opendir_bitmap;
975 gftp_curtrans_data * transdata; 456 gftpui_common_curtrans_data * transdata;
976 gftp_file * tempfle; 457 gftp_file * tempfle;
977 char *pos, *text[2]; 458 char *pos, *text[2];
978 GList * templist; 459 GList * templist;
979 460
980 gftp_get_pixmap (dlwdw, "open_dir.xpm", &opendir_pixmap, &opendir_bitmap); 461 gftp_get_pixmap (dlwdw, "open_dir.xpm", &opendir_pixmap, &opendir_bitmap);
1048 529
1049 530
1050 static void 531 static void
1051 transfer_done (GList * node) 532 transfer_done (GList * node)
1052 { 533 {
1053 gftp_curtrans_data * transdata; 534 gftpui_common_curtrans_data * transdata;
1054 gftp_request * fromreq; 535 gftp_request * fromreq;
1055 gftp_transfer * tdata; 536 gftp_transfer * tdata;
1056 gftp_file * tempfle; 537 gftp_file * tempfle;
1057 GList * templist; 538 GList * templist;
1058 539
1107 } 588 }
1108 589
1109 gtk_ctree_remove_node (GTK_CTREE (dlwdw), tdata->user_data); 590 gtk_ctree_remove_node (GTK_CTREE (dlwdw), tdata->user_data);
1110 } 591 }
1111 592
1112 pthread_mutex_lock (&transfer_mutex); 593 g_static_mutex_lock (&gftpui_common_transfer_mutex);
1113 gftp_file_transfers = g_list_remove_link (gftp_file_transfers, node); 594 gftp_file_transfers = g_list_remove_link (gftp_file_transfers, node);
595 g_static_mutex_unlock (&gftpui_common_transfer_mutex);
596
1114 gdk_window_set_title (gtk_widget_get_parent_window (GTK_WIDGET(dlwdw)), 597 gdk_window_set_title (gtk_widget_get_parent_window (GTK_WIDGET(dlwdw)),
1115 gftp_version); 598 gftp_version);
1116 pthread_mutex_unlock (&transfer_mutex);
1117 599
1118 free_tdata (tdata); 600 free_tdata (tdata);
601 }
602
603
604 static void *
605 _gftpui_transfer_files (void *data)
606 {
607 int ret;
608
609 pthread_detach (pthread_self ());
610 ret = gftpui_common_transfer_files (data);
611 return (GINT_TO_POINTER(ret));
1119 } 612 }
1120 613
1121 614
1122 static void 615 static void
1123 create_transfer (gftp_transfer * tdata) 616 create_transfer (gftp_transfer * tdata)
1145 num_transfers_in_progress++; 638 num_transfers_in_progress++;
1146 tdata->started = 1; 639 tdata->started = 1;
1147 tdata->stalled = 1; 640 tdata->stalled = 1;
1148 gtk_ctree_node_set_text (GTK_CTREE (dlwdw), tdata->user_data, 1, 641 gtk_ctree_node_set_text (GTK_CTREE (dlwdw), tdata->user_data, 1,
1149 _("Connecting...")); 642 _("Connecting..."));
1150 pthread_create (&tid, NULL, gftp_gtk_transfer_files, tdata); 643 pthread_create (&tid, NULL, _gftpui_transfer_files, tdata);
1151 } 644 }
1152 } 645 }
1153 646
1154 647
1155 static void 648 static void
1333 826
1334 827
1335 void 828 void
1336 start_transfer (gpointer data) 829 start_transfer (gpointer data)
1337 { 830 {
1338 gftp_curtrans_data * transdata; 831 gftpui_common_curtrans_data * transdata;
1339 GtkCTreeNode * node; 832 GtkCTreeNode * node;
1340 833
1341 if (GTK_CLIST (dlwdw)->selection == NULL) 834 if (GTK_CLIST (dlwdw)->selection == NULL)
1342 { 835 {
1343 ftp_log (gftp_logging_misc, NULL, 836 ftp_log (gftp_logging_misc, NULL,
1355 848
1356 849
1357 void 850 void
1358 stop_transfer (gpointer data) 851 stop_transfer (gpointer data)
1359 { 852 {
1360 gftp_curtrans_data * transdata; 853 gftpui_common_curtrans_data * transdata;
1361 GtkCTreeNode * node; 854 GtkCTreeNode * node;
1362 855
1363 if (GTK_CLIST (dlwdw)->selection == NULL) 856 if (GTK_CLIST (dlwdw)->selection == NULL)
1364 { 857 {
1365 ftp_log (gftp_logging_misc, NULL, 858 ftp_log (gftp_logging_misc, NULL,
1387 880
1388 881
1389 void 882 void
1390 skip_transfer (gpointer data) 883 skip_transfer (gpointer data)
1391 { 884 {
1392 gftp_curtrans_data * transdata; 885 gftpui_common_curtrans_data * transdata;
1393 GtkCTreeNode * node; 886 GtkCTreeNode * node;
1394 gftp_file * curfle; 887 gftp_file * curfle;
1395 char *file; 888 char *file;
1396 889
1397 if (GTK_CLIST (dlwdw)->selection == NULL) 890 if (GTK_CLIST (dlwdw)->selection == NULL)
1428 921
1429 922
1430 void 923 void
1431 remove_file_transfer (gpointer data) 924 remove_file_transfer (gpointer data)
1432 { 925 {
1433 gftp_curtrans_data * transdata; 926 gftpui_common_curtrans_data * transdata;
1434 GtkCTreeNode * node; 927 GtkCTreeNode * node;
1435 gftp_file * curfle; 928 gftp_file * curfle;
1436 929
1437 if (GTK_CLIST (dlwdw)->selection == NULL) 930 if (GTK_CLIST (dlwdw)->selection == NULL)
1438 { 931 {
1482 975
1483 void 976 void
1484 move_transfer_up (gpointer data) 977 move_transfer_up (gpointer data)
1485 { 978 {
1486 GList * firstentry, * secentry, * lastentry; 979 GList * firstentry, * secentry, * lastentry;
1487 gftp_curtrans_data * transdata; 980 gftpui_common_curtrans_data * transdata;
1488 GtkCTreeNode * node; 981 GtkCTreeNode * node;
1489 982
1490 if (GTK_CLIST (dlwdw)->selection == NULL) 983 if (GTK_CLIST (dlwdw)->selection == NULL)
1491 { 984 {
1492 ftp_log (gftp_logging_misc, NULL, 985 ftp_log (gftp_logging_misc, NULL,
1537 ((gftp_file *) transdata->curfle->next->data)->user_data: NULL); 1030 ((gftp_file *) transdata->curfle->next->data)->user_data: NULL);
1538 } 1031 }
1539 g_static_mutex_unlock (&transdata->transfer->structmutex); 1032 g_static_mutex_unlock (&transdata->transfer->structmutex);
1540 } 1033 }
1541 1034
1035
1542 void 1036 void
1543 move_transfer_down (gpointer data) 1037 move_transfer_down (gpointer data)
1544 { 1038 {
1545 GList * firstentry, * secentry, * lastentry; 1039 GList * firstentry, * secentry, * lastentry;
1546 gftp_curtrans_data * transdata; 1040 gftpui_common_curtrans_data * transdata;
1547 GtkCTreeNode * node; 1041 GtkCTreeNode * node;
1548 1042
1549 if (GTK_CLIST (dlwdw)->selection == NULL) 1043 if (GTK_CLIST (dlwdw)->selection == NULL)
1550 { 1044 {
1551 ftp_log (gftp_logging_misc, NULL, 1045 ftp_log (gftp_logging_misc, NULL,
1596 ((gftp_file *) transdata->curfle->next->data)->user_data: NULL); 1090 ((gftp_file *) transdata->curfle->next->data)->user_data: NULL);
1597 } 1091 }
1598 g_static_mutex_unlock (&transdata->transfer->structmutex); 1092 g_static_mutex_unlock (&transdata->transfer->structmutex);
1599 } 1093 }
1600 1094
1601
1602 static void
1603 trans_selectall (GtkWidget * widget, gpointer data)
1604 {
1605 gftp_transfer * tdata;
1606 tdata = data;
1607
1608 gtk_clist_select_all (GTK_CLIST (tdata->clist));
1609 }
1610
1611
1612 static void
1613 trans_unselectall (GtkWidget * widget, gpointer data)
1614 {
1615 gftp_transfer * tdata;
1616 tdata = data;
1617
1618 gtk_clist_unselect_all (GTK_CLIST (tdata->clist));
1619 }
1620
1621
1622 static void
1623 overwrite (GtkWidget * widget, gpointer data)
1624 {
1625 GList * templist, * filelist;
1626 gftp_transfer * tdata;
1627 gftp_file * tempfle;
1628 int curpos;
1629
1630 tdata = data;
1631 curpos = 0;
1632 filelist = tdata->files;
1633 templist = GTK_CLIST (tdata->clist)->selection;
1634 while (templist != NULL)
1635 {
1636 templist = get_next_selection (templist, &filelist, &curpos);
1637 tempfle = filelist->data;
1638 tempfle->transfer_action = GFTP_TRANS_ACTION_OVERWRITE;
1639 gtk_clist_set_text (GTK_CLIST (tdata->clist), curpos, 3, _("Overwrite"));
1640 }
1641 }
1642
1643
1644 static void
1645 resume (GtkWidget * widget, gpointer data)
1646 {
1647 GList * templist, * filelist;
1648 gftp_transfer * tdata;
1649 gftp_file * tempfle;
1650 int curpos;
1651
1652 tdata = data;
1653 curpos = 0;
1654 filelist = tdata->files;
1655 templist = GTK_CLIST (tdata->clist)->selection;
1656 while (templist != NULL)
1657 {
1658 templist = get_next_selection (templist, &filelist, &curpos);
1659 tempfle = filelist->data;
1660 tempfle->transfer_action = GFTP_TRANS_ACTION_RESUME;
1661 gtk_clist_set_text (GTK_CLIST (tdata->clist), curpos, 3, _("Resume"));
1662 }
1663 }
1664
1665
1666 static void
1667 skip (GtkWidget * widget, gpointer data)
1668 {
1669 GList * templist, * filelist;
1670 gftp_transfer * tdata;
1671 gftp_file * tempfle;
1672 int curpos;
1673
1674 tdata = data;
1675 curpos = 0;
1676 filelist = tdata->files;
1677 templist = GTK_CLIST (tdata->clist)->selection;
1678 while (templist != NULL)
1679 {
1680 templist = get_next_selection (templist, &filelist, &curpos);
1681 tempfle = filelist->data;
1682 tempfle->transfer_action = GFTP_TRANS_ACTION_SKIP;
1683 gtk_clist_set_text (GTK_CLIST (tdata->clist), curpos, 3, _("Skip"));
1684 }
1685 }
1686
1687
1688 static void
1689 ok (GtkWidget * widget, gpointer data)
1690 {
1691 gftp_transfer * tdata;
1692 gftp_file * tempfle;
1693 GList * templist;
1694
1695 tdata = data;
1696 g_static_mutex_lock (&tdata->structmutex);
1697 for (templist = tdata->files; templist != NULL; templist = templist->next)
1698 {
1699 tempfle = templist->data;
1700 if (tempfle->transfer_action != GFTP_TRANS_ACTION_SKIP)
1701 break;
1702 }
1703
1704 if (templist == NULL)
1705 {
1706 tdata->show = 0;
1707 tdata->ready = tdata->done = 1;
1708 }
1709 else
1710 tdata->show = tdata->ready = 1;
1711 g_static_mutex_unlock (&tdata->structmutex);
1712 }
1713
1714
1715 static void
1716 cancel (GtkWidget * widget, gpointer data)
1717 {
1718 gftp_transfer * tdata;
1719
1720 tdata = data;
1721 g_static_mutex_lock (&tdata->structmutex);
1722 tdata->show = 0;
1723 tdata->done = tdata->ready = 1;
1724 g_static_mutex_unlock (&tdata->structmutex);
1725 }
1726
1727
1728 #if GTK_MAJOR_VERSION > 1
1729 static void
1730 transfer_action (GtkWidget * widget, gint response, gpointer user_data)
1731 {
1732 switch (response)
1733 {
1734 case GTK_RESPONSE_OK:
1735 ok (widget, user_data);
1736 gtk_widget_destroy (widget);
1737 break;
1738 case GTK_RESPONSE_CANCEL:
1739 cancel (widget, user_data);
1740 /* no break */
1741 default:
1742 gtk_widget_destroy (widget);
1743 }
1744 }
1745 #endif
1746
1747
1748 void
1749 gftp_gtk_ask_transfer (gftp_transfer * tdata)
1750 {
1751 char *dltitles[4], *add_data[4] = { NULL, NULL, NULL, NULL },
1752 tempstr[50], temp1str[50], *pos;
1753 GtkWidget * tempwid, * scroll, * hbox;
1754 int i;
1755 intptr_t overwrite_default;
1756 gftp_file * tempfle;
1757 GList * templist;
1758 size_t len;
1759
1760 dltitles[0] = _("Filename");
1761 dltitles[1] = tdata->fromreq->hostname;
1762 dltitles[2] = tdata->toreq->hostname;
1763 dltitles[3] = _("Action");
1764
1765 #if GTK_MAJOR_VERSION == 1
1766 dialog = gtk_dialog_new ();
1767 gtk_grab_add (dialog);
1768 gtk_window_set_title (GTK_WINDOW (dialog), _("Transfer Files"));
1769 gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area), 5);
1770 gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->action_area), 35);
1771 gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (dialog)->action_area), TRUE);
1772
1773 gtk_signal_connect_object (GTK_OBJECT (dialog), "delete_event",
1774 GTK_SIGNAL_FUNC (gtk_widget_destroy),
1775 GTK_OBJECT (dialog));
1776 #else
1777 dialog = gtk_dialog_new_with_buttons (_("Transfer Files"), NULL, 0,
1778 GTK_STOCK_OK,
1779 GTK_RESPONSE_OK,
1780 GTK_STOCK_CANCEL,
1781 GTK_RESPONSE_CANCEL,
1782 NULL);
1783 #endif
1784 gtk_window_set_wmclass (GTK_WINDOW(dialog), "transfer", "gFTP");
1785 gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
1786 gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 10);
1787 gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 5);
1788
1789 tempwid = gtk_label_new (_("The following file(s) exist on both the local and remote computer\nPlease select what you would like to do"));
1790 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), tempwid, FALSE,
1791 FALSE, 0);
1792 gtk_widget_show (tempwid);
1793
1794 scroll = gtk_scrolled_window_new (NULL, NULL);
1795 gtk_widget_set_size_request (scroll, 450, 200);
1796
1797 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
1798 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1799 tdata->clist = gtk_clist_new_with_titles (4, dltitles);
1800 gtk_container_add (GTK_CONTAINER (scroll), tdata->clist);
1801
1802 #if GTK_MAJOR_VERSION == 1
1803 gtk_clist_set_selection_mode (GTK_CLIST (tdata->clist),
1804 GTK_SELECTION_EXTENDED);
1805 #else
1806 gtk_clist_set_selection_mode (GTK_CLIST (tdata->clist),
1807 GTK_SELECTION_MULTIPLE);
1808 #endif
1809 gtk_clist_set_column_width (GTK_CLIST (tdata->clist), 0, 100);
1810 gtk_clist_set_column_justification (GTK_CLIST (tdata->clist), 1,
1811 GTK_JUSTIFY_RIGHT);
1812 gtk_clist_set_column_width (GTK_CLIST (tdata->clist), 1, 85);
1813 gtk_clist_set_column_justification (GTK_CLIST (tdata->clist), 2,
1814 GTK_JUSTIFY_RIGHT);
1815 gtk_clist_set_column_width (GTK_CLIST (tdata->clist), 2, 85);
1816 gtk_clist_set_column_width (GTK_CLIST (tdata->clist), 3, 85);
1817 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scroll, TRUE, TRUE,
1818 0);
1819 gtk_widget_show (tdata->clist);
1820 gtk_widget_show (scroll);
1821
1822 gftp_lookup_request_option (tdata->fromreq, "overwrite_default",
1823 &overwrite_default);
1824
1825 for (templist = tdata->files; templist != NULL;
1826 templist = templist->next)
1827 {
1828 tempfle = templist->data;
1829 if (tempfle->startsize == 0 || tempfle->isdir)
1830 {
1831 tempfle->shown = 0;
1832 continue;
1833 }
1834 tempfle->shown = 1;
1835
1836 pos = tempfle->destfile;
1837 len = strlen (tdata->toreq->directory);
1838 if (strncmp (pos, tdata->toreq->directory, len) == 0)
1839 pos = tempfle->destfile + len + 1;
1840 add_data[0] = pos;
1841
1842 if (overwrite_default)
1843 {
1844 add_data[3] = _("Overwrite");
1845 tempfle->transfer_action = GFTP_TRANS_ACTION_OVERWRITE;
1846 }
1847 else if (tempfle->startsize == tempfle->size)
1848 {
1849 add_data[3] = _("Skip");
1850 tempfle->transfer_action = GFTP_TRANS_ACTION_SKIP;
1851 }
1852 else if (tempfle->startsize > tempfle->size)
1853 {
1854 add_data[3] = _("Overwrite");
1855 tempfle->transfer_action = GFTP_TRANS_ACTION_OVERWRITE;
1856 }
1857 else
1858 {
1859 add_data[3] = _("Resume");
1860 tempfle->transfer_action = GFTP_TRANS_ACTION_RESUME;
1861 }
1862
1863 add_data[1] = insert_commas (tempfle->size, tempstr, sizeof (tempstr));
1864 add_data[2] = insert_commas (tempfle->startsize, temp1str,
1865 sizeof (temp1str));
1866
1867 i = gtk_clist_append (GTK_CLIST (tdata->clist), add_data);
1868 gtk_clist_set_row_data (GTK_CLIST (tdata->clist), i, tempfle);
1869 }
1870
1871 gtk_clist_select_all (GTK_CLIST (tdata->clist));
1872
1873 hbox = gtk_hbox_new (TRUE, 20);
1874 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, TRUE, TRUE, 0);
1875 gtk_widget_show (hbox);
1876
1877 tempwid = gtk_button_new_with_label (_("Overwrite"));
1878 gtk_box_pack_start (GTK_BOX (hbox), tempwid, TRUE, TRUE, 0);
1879 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked",
1880 GTK_SIGNAL_FUNC (overwrite), (gpointer) tdata);
1881 gtk_widget_show (tempwid);
1882
1883 tempwid = gtk_button_new_with_label (_("Resume"));
1884 gtk_box_pack_start (GTK_BOX (hbox), tempwid, TRUE, TRUE, 0);
1885 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked",
1886 GTK_SIGNAL_FUNC (resume), (gpointer) tdata);
1887 gtk_widget_show (tempwid);
1888
1889 tempwid = gtk_button_new_with_label (_("Skip File"));
1890 gtk_box_pack_start (GTK_BOX (hbox), tempwid, TRUE, TRUE, 0);
1891 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", GTK_SIGNAL_FUNC (skip),
1892 (gpointer) tdata);
1893 gtk_widget_show (tempwid);
1894
1895 hbox = gtk_hbox_new (TRUE, 20);
1896 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, TRUE, TRUE, 0);
1897 gtk_widget_show (hbox);
1898
1899 tempwid = gtk_button_new_with_label (_("Select All"));
1900 gtk_box_pack_start (GTK_BOX (hbox), tempwid, TRUE, TRUE, 0);
1901 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked",
1902 GTK_SIGNAL_FUNC (trans_selectall), (gpointer) tdata);
1903 gtk_widget_show (tempwid);
1904
1905 tempwid = gtk_button_new_with_label (_("Deselect All"));
1906 gtk_box_pack_start (GTK_BOX (hbox), tempwid, TRUE, TRUE, 0);
1907 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked",
1908 GTK_SIGNAL_FUNC (trans_unselectall), (gpointer) tdata);
1909 gtk_widget_show (tempwid);
1910
1911 #if GTK_MAJOR_VERSION == 1
1912 tempwid = gtk_button_new_with_label (_("OK"));
1913 GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT);
1914 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid,
1915 TRUE, TRUE, 0);
1916 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", GTK_SIGNAL_FUNC (ok),
1917 (gpointer) tdata);
1918 gtk_signal_connect_object (GTK_OBJECT (tempwid), "clicked",
1919 GTK_SIGNAL_FUNC (gtk_widget_destroy),
1920 GTK_OBJECT (dialog));
1921 gtk_widget_grab_default (tempwid);
1922 gtk_widget_show (tempwid);
1923
1924 tempwid = gtk_button_new_with_label (_(" Cancel "));
1925 GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT);
1926 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid,
1927 TRUE, TRUE, 0);
1928 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked",
1929 GTK_SIGNAL_FUNC (cancel), (gpointer) tdata);
1930 gtk_signal_connect_object (GTK_OBJECT (tempwid), "clicked",
1931 GTK_SIGNAL_FUNC (gtk_widget_destroy),
1932 GTK_OBJECT (dialog));
1933 gtk_widget_show (tempwid);
1934 #else
1935 g_signal_connect (GTK_OBJECT (dialog), "response",
1936 G_CALLBACK (transfer_action), (gpointer) tdata);
1937 #endif
1938
1939 gtk_widget_show (dialog);
1940 dialog = NULL;
1941 }
1942