From ac72231fa19a0b8e24be90677b623e8b983b7433 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Tue, 26 Feb 2019 17:00:16 -0300 Subject: [PATCH] Adding compatibility FT dialog. --- src/dialogs/transfer.c | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/filetransfer/worker.c | 11 +++++++++++ src/include/v3270.h | 3 --- src/include/v3270/filetransfer.h | 5 +++++ src/testprogram/testprogram.c | 20 ++++++++++++++++++++ v3270.cbp | 3 +++ 6 files changed, 174 insertions(+), 3 deletions(-) create mode 100644 src/dialogs/transfer.c diff --git a/src/dialogs/transfer.c b/src/dialogs/transfer.c new file mode 100644 index 0000000..a172835 --- /dev/null +++ b/src/dialogs/transfer.c @@ -0,0 +1,135 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + #include + + #define ENABLE_NLS + #define GETTEXT_PACKAGE PACKAGE_NAME + + #include + #include + #include + #include + + #include + #include + +/*--[ Implement ]------------------------------------------------------------------------------------*/ + +static void header_on_state_changed(GtkWidget *worker, guint state, const gchar *msg, GtkDialog *dialog) +{ + debug("%s(%s)",__FUNCTION__,msg); + gtk_header_bar_set_subtitle(GTK_HEADER_BAR(gtk_dialog_get_header_bar(dialog)),msg); +} + +static void transfer_success(GtkWidget *worker, const gchar *msg, const gchar *description, GtkDialog *dialog) +{ + debug("%s(\"%s\",\"%s\")",__FUNCTION__,msg,description); + +} + +static void transfer_failed(GtkWidget *worker, const gchar *msg, const gchar *description, GtkDialog *dialog) +{ + debug("%s(\"%s\",\"%s\")",__FUNCTION__,msg,description); + +} + +LIB3270_EXPORT gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION options, const gchar *local, const gchar *remote, int lrecl, int blksize, int primspace, int secspace, int dft) +{ + // Create activity + GObject * activity = v3270_ft_activity_new(); + + v3270_ft_activity_set_local_filename(activity,local); + v3270_ft_activity_set_remote_filename(activity,remote); + v3270_ft_activity_set_options(activity,options); + + v3270_ft_activity_set_value(activity,LIB3270_FT_VALUE_LRECL, lrecl); + v3270_ft_activity_set_value(activity,LIB3270_FT_VALUE_BLKSIZE, blksize); + v3270_ft_activity_set_value(activity,LIB3270_FT_VALUE_PRIMSPACE, primspace); + v3270_ft_activity_set_value(activity,LIB3270_FT_VALUE_SECSPACE, secspace); + v3270_ft_activity_set_value(activity,LIB3270_FT_VALUE_DFT, dft); + + // Create worker + GtkWidget * worker = v3270_ft_worker_new(); + v3270_ft_worker_set_session(worker,v3270_get_session(widget)); + v3270_ft_worker_set_activity(worker,activity); + + // Create dialog +#if GTK_CHECK_VERSION(3,12,0) + + gboolean use_header; + g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); + + GtkWidget * dialog = + GTK_WIDGET(g_object_new( + GTK_TYPE_DIALOG, + "use-header-bar", (use_header ? 1 : 0), + NULL + )); + + gtk_window_set_title(GTK_WINDOW(dialog),(options & LIB3270_FT_OPTION_RECEIVE) ? _( "Receiving file" ) : _( "Sending file" )); + + if(use_header) + { + gtk_header_bar_set_subtitle(GTK_HEADER_BAR(gtk_dialog_get_header_bar(dialog)),_("Starting transfer")); + g_signal_connect(worker,"ft-state-changed",G_CALLBACK(header_on_state_changed), dialog); + } + +#else + + GtkWidget * dialog = gtk_dialog_new_with_buttons( + (options & LIB3270_FT_OPTION_RECEIVE) ? _( "Receiving file" ) : _( "Sending file" ), + GTK_WINDOW(gtk_widget_get_toplevel(widget)), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + _( "_Close" ), GTK_RESPONSE_CANCEL, + NULL + ); + +#endif // GTK(3,12,0) + + gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gtk_widget_get_toplevel(widget))); + gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); + gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); + + gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),18); + + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),worker,TRUE,TRUE,2); + + // Start transfer + g_signal_connect(worker,"failed",G_CALLBACK(transfer_failed), dialog); + g_signal_connect(worker,"success",G_CALLBACK(transfer_success), dialog); + v3270_ft_worker_start(worker); + + gtk_widget_show_all(dialog); + int rc = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + + return rc; +} + diff --git a/src/filetransfer/worker.c b/src/filetransfer/worker.c index 17e4ff3..ec0347a 100644 --- a/src/filetransfer/worker.c +++ b/src/filetransfer/worker.c @@ -165,6 +165,17 @@ G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER ); + v3270_worker_signals[V3270_WORKER_TRANSFER_SUCCESS_SIGNAL] = + g_signal_new( + "success", + G_OBJECT_CLASS_TYPE (gobject_class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + 0, + NULL, NULL, + v3270ft_VOID__POINTER_POINTER, + G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER + ); + v3270_worker_signals[V3270_WORKER_TRANSFER_STATE_SIGNAL] = g_signal_new( "ft-state-changed", diff --git a/src/include/v3270.h b/src/include/v3270.h index d40e631..f8feb77 100644 --- a/src/include/v3270.h +++ b/src/include/v3270.h @@ -255,9 +255,6 @@ LIB3270_EXPORT GtkWidget * v3270_security_dialog_new(GtkWidget *widget); LIB3270_EXPORT void v3270_popup_security_dialog(GtkWidget *widget); - // File transfer - LIB3270_EXPORT gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION options, const gchar *local, const gchar *remote, int lrecl, int blksize, int primspace, int secspace, int dft); - // Auxiliary widgets LIB3270_EXPORT GtkWidget * v3270_host_select_new(GtkWidget *widget); LIB3270_EXPORT void v3270_select_host(GtkWidget *widget); diff --git a/src/include/v3270/filetransfer.h b/src/include/v3270/filetransfer.h index fc3fb1c..0bcb267 100644 --- a/src/include/v3270/filetransfer.h +++ b/src/include/v3270/filetransfer.h @@ -162,4 +162,9 @@ LIB3270_EXPORT void v3270_ft_worker_set_session(GtkWidget *widget, H3270 *hSession); LIB3270_EXPORT int v3270_ft_worker_start(GtkWidget *widget); + + // File transfer compatibility. + LIB3270_EXPORT gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION options, const gchar *local, const gchar *remote, int lrecl, int blksize, int primspace, int secspace, int dft); + + #endif // V3270FT_H_INCLUDED diff --git a/src/testprogram/testprogram.c b/src/testprogram/testprogram.c index dcb05cd..4fdfb72 100644 --- a/src/testprogram/testprogram.c +++ b/src/testprogram/testprogram.c @@ -157,6 +157,22 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) */ // + // Test transfer dialog. + // + v3270_transfer_file( + terminal, + LIB3270_FT_OPTION_RECEIVE|LIB3270_FT_OPTION_ASCII|LIB3270_FT_OPTION_REMAP, + "/tmp/test.txt", + "remote_file", + 0, + 0, + 0, + 0, + 4096 + ); + + /* + // // Test activity // GObject * activity = v3270_ft_activity_new(); @@ -164,6 +180,7 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) v3270_ft_activity_set_local_filename(activity,"/tmp/test.txt"); v3270_ft_activity_set_remote_filename(activity,"remote_file"); v3270_ft_activity_set_options(activity,LIB3270_FT_OPTION_RECEIVE|LIB3270_FT_OPTION_ASCII|LIB3270_FT_OPTION_REMAP); + */ /* // @@ -173,6 +190,7 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) v3270_ft_settings_dialog_append_activity(dialog,activity,NULL); */ + /* // // Test worker widget // @@ -186,6 +204,8 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); + */ + } static void color_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) diff --git a/v3270.cbp b/v3270.cbp index 7386666..89f6059 100644 --- a/v3270.cbp +++ b/v3270.cbp @@ -81,6 +81,9 @@ + + -- libgit2 0.21.2