diff --git a/src/dialogs/commondialog.c b/src/dialogs/commondialog.c
index 9ea9886..7bde8d0 100644
--- a/src/dialogs/commondialog.c
+++ b/src/dialogs/commondialog.c
@@ -32,17 +32,17 @@
/*--[ Implement ]------------------------------------------------------------------------------------*/
#if GTK_CHECK_VERSION(3,12,0)
-static void apply_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog)
+void v3270_dialog_apply(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog)
{
gtk_dialog_response(GTK_DIALOG(dialog),GTK_RESPONSE_APPLY);
}
-static void cancel_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog)
+void v3270_dialog_cancel(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog)
{
gtk_dialog_response(GTK_DIALOG(dialog),GTK_RESPONSE_CANCEL);
}
-static GtkWidget * create_button(GtkWidget *dialog, const gchar *mnemonic, GCallback callback)
+GtkWidget * v3270_dialog_button_new(GtkWidget *dialog, const gchar *mnemonic, GCallback callback)
{
GtkWidget * button = gtk_button_new_with_mnemonic(mnemonic);
gtk_button_set_use_underline(GTK_BUTTON (button), TRUE);
@@ -91,8 +91,8 @@ LIB3270_EXPORT GtkWidget * v3270_dialog_new(GtkWidget *widget, const gchar *titl
GtkWidget * header = gtk_dialog_get_header_bar(GTK_DIALOG(dialog));
gtk_header_bar_set_title(GTK_HEADER_BAR(header),title);
- gtk_header_bar_pack_start(GTK_HEADER_BAR(header),create_button(dialog,_("_Cancel"),G_CALLBACK(cancel_clicked)));
- gtk_header_bar_pack_end(GTK_HEADER_BAR(header),create_button(dialog,apply,G_CALLBACK(apply_clicked)));
+ gtk_header_bar_pack_start(GTK_HEADER_BAR(header),v3270_dialog_button_new(dialog,_("_Cancel"),G_CALLBACK(v3270_dialog_cancel)));
+ gtk_header_bar_pack_end(GTK_HEADER_BAR(header),v3270_dialog_button_new(dialog,apply,G_CALLBACK(v3270_dialog_apply)));
}
else
{
diff --git a/src/dialogs/transfer.c b/src/dialogs/transfer.c
index a172835..78f045f 100644
--- a/src/dialogs/transfer.c
+++ b/src/dialogs/transfer.c
@@ -51,12 +51,62 @@ static void header_on_state_changed(GtkWidget *worker, guint state, const gchar
static void transfer_success(GtkWidget *worker, const gchar *msg, const gchar *description, GtkDialog *dialog)
{
debug("%s(\"%s\",\"%s\")",__FUNCTION__,msg,description);
+ gtk_dialog_response(dialog,GTK_RESPONSE_OK);
}
+/*
static void transfer_failed(GtkWidget *worker, const gchar *msg, const gchar *description, GtkDialog *dialog)
{
debug("%s(\"%s\",\"%s\")",__FUNCTION__,msg,description);
+}
+*/
+
+static void save_activity_clicked(GtkWidget *button, GObject *activity)
+{
+ debug("%s",__FUNCTION__);
+
+ g_autofree gchar * filename = v3270_select_file(
+ gtk_widget_get_toplevel(button),
+ _("Save transfer activity to file"),
+ _("Save"),
+ GTK_FILE_CHOOSER_ACTION_SAVE,
+ NULL,
+ N_("XML file"), "*.xml",
+ NULL );
+
+ if(filename)
+ {
+ GError * error = NULL;
+ GString * str = g_string_new("\n\n");
+
+ v3270_ft_activity_xml_encode(activity,str);
+ g_string_append(str,"\n");
+
+ g_autofree gchar * text = g_string_free(str,FALSE);
+
+ debug("Saving %s",filename);
+
+ if(!g_file_set_contents(filename,text,-1,&error)) {
+
+ GtkWidget *popup = gtk_message_dialog_new_with_markup(
+ GTK_WINDOW(gtk_widget_get_toplevel(button)),
+ GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,
+ _("Can't save %s"),filename
+ );
+
+ gtk_window_set_title(GTK_WINDOW(popup),_("Operation has failed"));
+
+ gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",error->message);
+ g_error_free(error);
+
+ gtk_dialog_run(GTK_DIALOG(popup));
+ gtk_widget_destroy(popup);
+
+ }
+
+ }
}
@@ -80,10 +130,15 @@ LIB3270_EXPORT gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION opt
v3270_ft_worker_set_session(worker,v3270_get_session(widget));
v3270_ft_worker_set_activity(worker,activity);
+ // Create save button
+ GtkWidget * save_button = NULL;
+
// Create dialog
+ const gchar *title = (options & LIB3270_FT_OPTION_RECEIVE) ? _( "Receiving file" ) : _( "Sending file" );
+ gboolean use_header = FALSE;
+
#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 =
@@ -93,36 +148,69 @@ LIB3270_EXPORT gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION opt
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"));
+ GtkWidget * header = gtk_dialog_get_header_bar(GTK_DIALOG(dialog));
+ gtk_header_bar_set_title(GTK_HEADER_BAR(header),title);
+ gtk_header_bar_set_subtitle(GTK_HEADER_BAR(header),_("Starting transfer"));
+
+ save_button = gtk_button_new_from_icon_name("document-save-as",GTK_ICON_SIZE_SMALL_TOOLBAR);
+ gtk_header_bar_pack_start(GTK_HEADER_BAR(header),save_button);
+
g_signal_connect(worker,"ft-state-changed",G_CALLBACK(header_on_state_changed), dialog);
+
+ gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),18);
+
+ }
+ else
+ {
+ gtk_window_set_title(GTK_WINDOW(dialog), title);
+ gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE);
+
+ gtk_container_set_border_width(GTK_CONTAINER(worker),18);
+
+ gtk_dialog_add_buttons(
+ GTK_DIALOG (dialog),
+ _("_Close"), GTK_RESPONSE_CANCEL,
+ NULL
+ );
+
}
#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,
+ GtkWidget * dialog = gtk_dialog_new();
+
+ gtk_window_set_title(GTK_WINDOW(dialog), title);
+ gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE);
+
+ gtk_box_set_spacing(
+ GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
+ 18
+ );
+
+ gtk_dialog_add_buttons(
+ GTK_DIALOG (dialog),
+ _("_Close"), GTK_RESPONSE_CANCEL,
NULL
);
#endif // GTK(3,12,0)
+ if(save_button)
+ {
+ gtk_widget_set_tooltip_markup(save_button,_("Save transfer information to file"));
+ g_signal_connect(save_button,"clicked",G_CALLBACK(save_activity_clicked),activity);
+ }
+
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,"failed",G_CALLBACK(transfer_failed), dialog);
g_signal_connect(worker,"success",G_CALLBACK(transfer_success), dialog);
v3270_ft_worker_start(worker);
diff --git a/src/filetransfer/activity.c b/src/filetransfer/activity.c
index 8bd5d41..a5f2df6 100644
--- a/src/filetransfer/activity.c
+++ b/src/filetransfer/activity.c
@@ -350,3 +350,33 @@
);
}
+
+ LIB3270_EXPORT void v3270_ft_activity_xml_encode(GObject *object, GString *str)
+ {
+ g_return_if_fail(G_IS_V3270_FT_ACTIVITY(object));
+
+ size_t ix;
+ V3270FTActivity * activity = G_V3270_FT_ACTIVITY(object);
+
+ g_string_append_printf(
+ str,
+ "\t\n\t\t\n\t\t\n",
+ activity->file.local,
+ activity->file.remote
+ );
+
+ for(ix = 0; v3270_activity_list_options[ix].name; ix++)
+ {
+ if((activity->options & v3270_activity_list_options[ix].option) == v3270_activity_list_options[ix].option)
+ g_string_append_printf(str,"\t\t\n",v3270_activity_list_options[ix].name,v3270_activity_list_options[ix].value);
+ }
+
+ for(ix=0;ix\n",ft_value[ix].name,activity->values[ix]);
+ }
+
+ g_string_append(str,"\t\n");
+
+ }
+
diff --git a/src/filetransfer/activitylist.c b/src/filetransfer/activitylist.c
index 74a1250..127f58e 100644
--- a/src/filetransfer/activitylist.c
+++ b/src/filetransfer/activitylist.c
@@ -295,7 +295,6 @@
V3270FTActivityList * list = GTK_V3270_FT_ACTIVITY_LIST(widget);
GString * str = g_string_new("\n\n");
GError * error = NULL;
- size_t ix;
debug("%s",__FUNCTION__);
@@ -310,6 +309,9 @@
GObject * activity = NULL;
gtk_tree_model_get(model, &iter, 0, &activity, -1);
+ v3270_ft_activity_xml_encode(activity,str);
+
+ /*
if(activity)
{
g_string_append(str,"\t\n");
@@ -331,6 +333,7 @@
g_string_append(str,"\t\n");
}
+ */
}
while(gtk_tree_model_iter_next(model,&iter));
diff --git a/src/include/internals.h b/src/include/internals.h
index f077518..4c98da9 100644
--- a/src/include/internals.h
+++ b/src/include/internals.h
@@ -56,6 +56,9 @@
#if GTK_CHECK_VERSION(3,12,0)
G_GNUC_INTERNAL GtkHeaderBar * v3270_dialog_get_header_bar(GtkWidget * widget);
+ G_GNUC_INTERNAL void v3270_dialog_cancel(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog);
+ G_GNUC_INTERNAL void v3270_dialog_apply(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog);
+ G_GNUC_INTERNAL GtkWidget * v3270_dialog_button_new(GtkWidget *dialog, const gchar *mnemonic, GCallback callback);
#endif // ! GTK 3.12
// Activity list widget.
diff --git a/src/include/v3270/filetransfer.h b/src/include/v3270/filetransfer.h
index 0bcb267..4361de7 100644
--- a/src/include/v3270/filetransfer.h
+++ b/src/include/v3270/filetransfer.h
@@ -128,6 +128,7 @@
LIB3270_EXPORT void v3270_ft_activity_set_options(GObject * object, LIB3270_FT_OPTION options);
LIB3270_EXPORT void v3270_ft_activity_set_value(GObject * object, LIB3270_FT_VALUE id, guint value);
LIB3270_EXPORT H3270FT * v3270_ft_activity_begin_transfer(GObject * object, H3270 *hSession, const char **message);
+ LIB3270_EXPORT void v3270_ft_activity_xml_encode(GObject *object, GString *str);
// FT Dialog widget
#define GTK_TYPE_V3270_FT_DIALOG (V3270FTSettingsDialog_get_type ())
--
libgit2 0.21.2