From 2642fe34a787712f71b18868e957df43e3471196 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Wed, 23 Sep 2020 13:53:00 -0300 Subject: [PATCH] Adding method to suggest session filename and path. --- src/include/v3270/keyfile.h | 7 ++++++- src/objects/actions/save.c | 6 ++---- src/objects/os/linux/savedesktopicon.c | 2 +- src/objects/window/keyfile.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 90 insertions(+), 7 deletions(-) diff --git a/src/include/v3270/keyfile.h b/src/include/v3270/keyfile.h index 3add18e..2e56a18 100644 --- a/src/include/v3270/keyfile.h +++ b/src/include/v3270/keyfile.h @@ -45,7 +45,12 @@ V3270KeyFile * v3270_key_file_open(GtkWidget *terminal, const gchar *name, GError **error); void v3270_key_file_close(GtkWidget *terminal); void v3270_key_file_save(GtkWidget *terminal); - const gchar * v3270_key_file_get_file_name(GtkWidget *terminal); + + /// @brief Get current key filename + const gchar * v3270_key_file_get_filename(GtkWidget *terminal); + + /// @brief Build a writable key filename + gchar * v3270_key_file_build_filename(GtkWidget *terminal); GKeyFile * v3270_key_file_get(GtkWidget *terminal); diff --git a/src/objects/actions/save.c b/src/objects/actions/save.c index 3ae1515..a516958 100644 --- a/src/objects/actions/save.c +++ b/src/objects/actions/save.c @@ -71,10 +71,8 @@ gtk_file_chooser_set_pw3270_filters(GTK_FILE_CHOOSER(dialog)); if(terminal) { - const gchar * current_file = v3270_key_file_get_file_name(terminal); - if(current_file && g_file_test(current_file,G_FILE_TEST_IS_REGULAR) && !g_str_has_prefix(current_file,g_get_user_config_dir())) { - gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),current_file); - } + g_autofree gchar * filename = v3270_key_file_build_filename(terminal); + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog),filename); } g_signal_connect(dialog,"response",G_CALLBACK(response),terminal); diff --git a/src/objects/os/linux/savedesktopicon.c b/src/objects/os/linux/savedesktopicon.c index bb7631d..a21772a 100644 --- a/src/objects/os/linux/savedesktopicon.c +++ b/src/objects/os/linux/savedesktopicon.c @@ -279,7 +279,7 @@ X-Desktop-File-Install-Version=0.23 if(bytes >= 0) buffer[bytes] = '\0'; - g_autofree gchar * exec_line = g_strdup_printf("%s \"%s\"",buffer,v3270_key_file_get_file_name(terminal)); + g_autofree gchar * exec_line = g_strdup_printf("%s \"%s\"",buffer,v3270_key_file_get_filename(terminal)); g_key_file_set_string(keyfile,"Desktop Entry","Exec",exec_line); } diff --git a/src/objects/window/keyfile.c b/src/objects/window/keyfile.c index 3b1c0e0..6fce6cb 100644 --- a/src/objects/window/keyfile.c +++ b/src/objects/window/keyfile.c @@ -39,6 +39,7 @@ #include #include #include + #include #include #include @@ -203,7 +204,86 @@ void v3270_key_file_close(GtkWidget *terminal) { } - const gchar * v3270_key_file_get_file_name(GtkWidget *terminal) { + /// @brief Search standard paths. + static gchar * v3270_get_configuration_folder(GtkWidget *terminal) { + + size_t folder; + const gchar *folders[] = { + g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS), + g_get_user_data_dir(), + g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP) + }; + + size_t application; + const gchar *applications[] = { + v3270_get_session_name(terminal), + G_STRINGIFY(PRODUCT_NAME), + PACKAGE_NAME, + "3270", + "tn3270" + }; + + for(folder = 0; folder < G_N_ELEMENTS(folders); folder++) { + + if(!(folders[folder] && g_file_test(folders[folder],G_FILE_TEST_IS_DIR))) + continue; + + for(application = 0; application < G_N_ELEMENTS(applications); application++) { + + gchar * appdir = g_build_filename(folder[folders],application[applications],NULL); + + debug("Testing for \"%s\"",appdir); + if(g_file_test(appdir,G_FILE_TEST_IS_DIR)) { + return appdir; + } + g_free(appdir); + + } + + } + + // Not found, try the current session path. + const gchar * filename = v3270_key_file_get_filename(terminal); + debug("Testing for \"%s\"",filename); + if(filename + && g_file_test(filename,G_FILE_TEST_IS_REGULAR) + && g_str_has_prefix(filename,g_get_user_data_dir()) + && !g_str_has_prefix(filename,g_get_user_config_dir()) + ) { + return g_path_get_dirname(filename); + } + + debug("%s: Using standard documents folder",__FUNCTION__); + return g_strdup(g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS)); + + } + + gchar * v3270_key_file_build_filename(GtkWidget *terminal) { + + const gchar * filename = v3270_key_file_get_filename(terminal); + if(filename && g_file_test(filename,G_FILE_TEST_IS_REGULAR) && !g_str_has_prefix(filename,g_get_user_config_dir())) { + return g_strdup(filename); + } + + debug("\n\n\n%s",__FUNCTION__); + g_autofree gchar * folder = v3270_get_configuration_folder(terminal); + + const char * hostname = lib3270_host_get_name(v3270_get_session(terminal)); + debug("Hostname=\"%s\"",hostname); + + gchar * name = g_strconcat(folder,G_DIR_SEPARATOR_S,hostname,".3270",NULL); + unsigned int index = 0; + while(g_file_test(name,G_FILE_TEST_EXISTS)) { + g_free(name); + name = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s.%u.3270",folder,hostname,++index); + } + + debug("%s returns \"%s\"",__FUNCTION__,name); + + return name; + } + + const gchar * v3270_key_file_get_filename(GtkWidget *terminal) { V3270KeyFile *session = v3270_get_session_descriptor(terminal); -- libgit2 0.21.2