diff --git a/src/include/lib3270/filetransfer.h b/src/include/lib3270/filetransfer.h index d5a23a3..02591ad 100644 --- a/src/include/lib3270/filetransfer.h +++ b/src/include/lib3270/filetransfer.h @@ -141,7 +141,8 @@ struct lib3270_charset charset; // Callbacks - void (*complete)(struct _h3270ft *ft,unsigned long length,double kbytes_sec); + void (*complete)(struct _h3270ft *ft,unsigned long length,double kbytes_sec,const char *msg); + void (*failed)(struct _h3270ft *ft,unsigned long length,double kbytes_sec,const char *msg); void (*message)(struct _h3270ft *ft, const char *msg); void (*update)(struct _h3270ft *ft, unsigned long current, unsigned long length, double kbytes_sec); void (*running)(struct _h3270ft *ft, int is_cut); diff --git a/src/lib3270/ft.c b/src/lib3270/ft.c index 583ed15..8cc549e 100644 --- a/src/lib3270/ft.c +++ b/src/lib3270/ft.c @@ -144,13 +144,19 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); return EBUSY; // Impatient user or hung host -- just clean up. - ft_complete(ft, N_("Cancelled by user") ); + ft_failed(ft, N_("Cancelled by user") ); return 0; } - static void def_complete(H3270FT *ft,unsigned long length,double kbytes_sec) + static void def_complete(H3270FT *ft,unsigned long length,double kbytes_sec,const char *msg) { + ft->message(ft,msg); + } + + static void def_failed(struct _h3270ft *ft,unsigned long length,double kbytes_sec,const char *msg) + { + ft->complete(ft,ft->ft_length,kbytes_sec,msg ? msg : N_("Transfer failed")); } static void def_message(H3270FT *ft, const char *errmsg) @@ -289,6 +295,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); ftHandle->local_file = ft_local_file; ftHandle->state = LIB3270_FT_STATE_AWAIT_ACK; ftHandle->complete = def_complete; + ftHandle->failed = def_failed; ftHandle->message = def_message; ftHandle->update = def_update; ftHandle->running = def_running; @@ -365,7 +372,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); // Sending file if(fseek(ft->local_file,0L,SEEK_END) < 0) { - ft_complete(ft,N_( "Can't get file size" )); + ft_failed(ft,N_( "Can't get file size" )); return errno ? errno : -1; } @@ -459,7 +466,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state); if (!flen || flen < strlen(buffer) - 1) { lib3270_write_log(ft->host, "Unable to send command \"%s\" (flen=%d szBuffer=%d)",buffer,flen,strlen(buffer)); - ft_complete(ft,N_( "Unable to send file-transfer request" )); + ft_failed(ft,N_( "Unable to send file-transfer request" )); return errno = EINVAL; } @@ -484,11 +491,7 @@ void ft_message(H3270FT *ft, const char *msg) ft->message(ft,msg); } -/** - * Pop up a message, end the transfer, release resources. - * - */ -void ft_complete(H3270FT *ft, const char *errmsg) +static double finish(H3270FT *ft) { double kbytes_sec = 0; struct timeval t1; @@ -510,11 +513,17 @@ void ft_complete(H3270FT *ft, const char *errmsg) ft_update_length(ft); - ft->complete(ft,ft->ft_length,kbytes_sec); - - ft_message(ft,errmsg ? errmsg : N_("Transfer complete")); + return kbytes_sec; +} +void ft_complete(H3270FT *ft, const char *errmsg) +{ + ft->complete(ft,ft->ft_length,finish(ft),errmsg ? errmsg : N_("Transfer complete")); +} +void ft_failed(H3270FT *ft, const char *errmsg) +{ + ft->failed(ft,ft->ft_length,finish(ft),errmsg ? errmsg : N_("Transfer failed")); } LIB3270_EXPORT int lib3270_ft_destroy(H3270 *hSession) @@ -528,7 +537,9 @@ LIB3270_EXPORT int lib3270_ft_destroy(H3270 *hSession) return EINVAL; if (session->state != LIB3270_FT_STATE_NONE) + { lib3270_ft_cancel(hSession,1); + } if(session->local_file) { @@ -597,14 +608,14 @@ void ft_aborting(H3270FT *h) static void ft_connected(H3270 *hSession, int ignored, void *dunno) { if (!CONNECTED && lib3270_get_ft_state(hSession) != LIB3270_FT_STATE_NONE) - ft_complete(get_ft_handle(hSession),_("Host disconnected, transfer cancelled")); + ft_failed(get_ft_handle(hSession),_("Host disconnected, transfer cancelled")); } /* Process an abort from no longer being in 3270 mode. */ static void ft_in3270(H3270 *hSession, int ignored, void *dunno) { if (!IN_3270 && lib3270_get_ft_state(hSession) != LIB3270_FT_STATE_NONE) - ft_complete(get_ft_handle(hSession),_("Not in 3270 mode, transfer cancelled")); + ft_failed(get_ft_handle(hSession),_("Not in 3270 mode, transfer cancelled")); } LIB3270_EXPORT LIB3270_FT_STATE lib3270_get_ft_state(H3270 *session) diff --git a/src/lib3270/ft_cut.c b/src/lib3270/ft_cut.c index 6382f69..49e21c0 100644 --- a/src/lib3270/ft_cut.c +++ b/src/lib3270/ft_cut.c @@ -334,7 +334,7 @@ static void cut_control_code(H3270 *hSession) trace_ds(hSession,"XFER_COMPLETE\n"); cut_ack(hSession); hSession->cut_xfer_in_progress = 0; - ft_complete(ft,N_( "Transfer complete" ) ); + ft_complete(ft,NULL); break; case SC_ABORT_FILE: @@ -369,7 +369,7 @@ static void cut_control_code(H3270 *hSession) if (!*buf) strcpy(buf, N_( "Transfer cancelled by host" ) ); } - ft_complete(hSession->ft,buf); + ft_failed(hSession->ft,buf); lib3270_free(buf); break; diff --git a/src/lib3270/ft_dft.c b/src/lib3270/ft_dft.c index fded513..db6419e 100644 --- a/src/lib3270/ft_dft.c +++ b/src/lib3270/ft_dft.c @@ -270,12 +270,12 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) else if (lib3270_get_ft_state(hSession) == FT_ABORT_SENT && ((H3270FT *) hSession->ft)->abort_string != CN) { lib3270_free(msgp); - ft_complete(ft,ft->abort_string); + ft_failed(ft,ft->abort_string); lib3270_free(ft->abort_string); } else { - ft_complete(hSession->ft,(char *)msgp); + ft_failed(hSession->ft,(char *)msgp); lib3270_free(msgp); } } else if (my_length > 0) { diff --git a/src/lib3270/ftc.h b/src/lib3270/ftc.h index 6b12ea1..584de4c 100644 --- a/src/lib3270/ftc.h +++ b/src/lib3270/ftc.h @@ -34,6 +34,7 @@ LIB3270_INTERNAL void ft_aborting(H3270FT *h); LIB3270_INTERNAL void ft_complete(H3270FT *h, const char *errmsg); + LIB3270_INTERNAL void ft_failed(H3270FT *h, const char *errmsg); LIB3270_INTERNAL void ft_message(H3270FT *h, const char *msg); LIB3270_INTERNAL void ft_running(H3270FT *h, Boolean is_cut); LIB3270_INTERNAL void ft_update_length(H3270FT *h); diff --git a/src/pw3270/filetransfer.c b/src/pw3270/filetransfer.c index 8e01ceb..d1e4760 100644 --- a/src/pw3270/filetransfer.c +++ b/src/pw3270/filetransfer.c @@ -207,9 +207,10 @@ static void ft_dialog_save(GtkWidget *widget, const gchar *name) } -static void ft_complete(H3270FT *ft, unsigned long length,double kbytes_sec) +static void ft_complete(H3270FT *ft, unsigned long length,double kbytes_sec, const char *msg) { v3270_ft_progress_complete(GTK_WIDGET(ft->widget),length,kbytes_sec); + v3270_ft_progress_set_message(GTK_WIDGET(ft->widget),gettext(msg)); } static void ft_message(struct _h3270ft *ft, const char *text) @@ -255,6 +256,7 @@ gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION options, const gch ft->widget = progress; ft->complete = ft_complete; + ft->failed = ft_complete; ft->update = ft_update; ft->running = ft_running; ft->aborting = ft_aborting; -- libgit2 0.21.2