From d1aa6aa6e7f2358212d7eeb3f0710fd0e2c711a5 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Wed, 23 Sep 2020 23:49:53 -0300 Subject: [PATCH] Creating session file when a desktop icon is built with default session. --- src/include/v3270/keyfile.h | 3 +++ src/objects/os/linux/savedesktopicon.c | 72 ++++++++++++++++++++++++++++++++++++++++-------------------------------- src/objects/window/keyfile.c | 30 +++++++++++++++++++++++++++++- src/objects/window/terminal.c | 10 ++-------- 4 files changed, 74 insertions(+), 41 deletions(-) diff --git a/src/include/v3270/keyfile.h b/src/include/v3270/keyfile.h index 2e56a18..1ad9f3f 100644 --- a/src/include/v3270/keyfile.h +++ b/src/include/v3270/keyfile.h @@ -42,9 +42,12 @@ typedef struct _V3270KeyFile V3270KeyFile; + gchar * v3270_keyfile_get_default_filename(void); + 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); + void v3270_key_file_save_to_file(GtkWidget * terminal, const gchar *filename); /// @brief Get current key filename const gchar * v3270_key_file_get_filename(GtkWidget *terminal); diff --git a/src/objects/os/linux/savedesktopicon.c b/src/objects/os/linux/savedesktopicon.c index a21772a..aa47614 100644 --- a/src/objects/os/linux/savedesktopicon.c +++ b/src/objects/os/linux/savedesktopicon.c @@ -39,6 +39,7 @@ #include #include #include + #include static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal); @@ -196,6 +197,43 @@ X-Desktop-File-Install-Version=0.23 return dialog; } + static gchar * get_filename(GtkWidget *terminal) { + + g_autofree gchar * defname = v3270_keyfile_get_default_filename(); + const gchar * current = v3270_key_file_get_filename(terminal); + + // If is not the default name, return it. + if(strcmp(defname,current)) { + return g_strdup(current); + } + + // It's the default one, create a new one on the user_config dir + g_autofree gchar * config_path = g_build_filename(g_get_user_config_dir(),G_STRINGIFY(PRODUCT_NAME),NULL); + g_mkdir_with_parents(config_path,0644); + + // Use the hostname + const char * hostname = lib3270_host_get_name(v3270_get_session(terminal)); + if(!hostname) { + hostname = "session"; + } + + // Build the filename + gchar *filename = g_strconcat(config_path,G_DIR_SEPARATOR_S,hostname,".3270",NULL); + + unsigned int index = 0; + while(g_file_test(filename,G_FILE_TEST_EXISTS)) { + g_free(filename); + filename = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s.%u.3270",config_path,hostname,++index); + } + + v3270_key_file_save_to_file(terminal,filename); + + g_message("New session file create at \"%s\"",filename); + + return filename; + + } + void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) { debug("%s(%d)",__FUNCTION__,response_id); @@ -236,37 +274,7 @@ X-Desktop-File-Install-Version=0.23 } // Get session filename - /* - const gchar * session_file = v3270_get_session_filename(terminal); - - if(!session_file) { - - // No session file, create one. - - // Check for configdir - g_autofree gchar * configdir = g_build_filename(g_get_user_config_dir(),G_STRINGIFY(PRODUCT_NAME),"sessions",NULL); - g_mkdir_with_parents(configdir,0755); - - // Create a base name - g_autofree gchar * basename = g_path_get_basename(gtk_entry_get_text(GTK_ENTRY(inputs[0]))); - - gchar *ptr = strrchr(basename,'.'); - if(ptr) - *ptr = 0; - - ix = time(NULL); - gchar * new_session_file = g_strdup_printf("%s/%s.3270",configdir,basename); - while(!g_file_test(new_session_file,G_FILE_TEST_EXISTS)) { - g_free(new_session_file); - new_session_file = g_strdup_printf("%s/%s_%08lx.3270",configdir,basename,(unsigned long) ix++); - } - - g_message("Saving session to %s",new_session_file); - v3270_set_session_filename(terminal,new_session_file); - g_free(new_session_file); - - } - */ + g_autofree gchar * filename = get_filename(terminal); // Get program file name // https://stackoverflow.com/questions/4517425/how-to-get-program-path @@ -279,7 +287,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_filename(terminal)); + g_autofree gchar * exec_line = g_strdup_printf("%s \"%s\"",buffer,filename); 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 6fce6cb..9f6d953 100644 --- a/src/objects/window/keyfile.c +++ b/src/objects/window/keyfile.c @@ -189,6 +189,23 @@ void v3270_key_file_close(GtkWidget *terminal) { return v3270_get_session_descriptor(terminal)->key_file; } + void v3270_key_file_save_to_file(GtkWidget * terminal, const gchar *filename) { + + V3270KeyFile * new_session = (V3270KeyFile *) g_malloc0(sizeof(struct _V3270KeyFile) + strlen(filename)); + V3270KeyFile * old_session = g_object_get_data(G_OBJECT(terminal),"session-descriptor"); + + if(old_session) { + *new_session = *old_session; + } + + strcpy(new_session->filename,filename); + new_session->key_file = g_key_file_new(); + + g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",new_session,(GDestroyNotify) close_keyfile); + v3270_key_file_save(terminal); + + } + void v3270_key_file_save(GtkWidget *terminal) { V3270KeyFile *session = v3270_get_session_descriptor(terminal); @@ -258,6 +275,17 @@ void v3270_key_file_close(GtkWidget *terminal) { } + gchar * v3270_keyfile_get_default_filename(void) { + + gchar * filename = g_build_filename(g_get_user_config_dir(),"default.3270",NULL); + + g_autofree gchar * compatible = g_build_filename(g_get_user_config_dir(),G_STRINGIFY(PRODUCT_NAME) ".conf",NULL); + if(g_file_test(compatible,G_FILE_TEST_IS_REGULAR)) + g_rename(compatible,filename); + + return filename; + } + gchar * v3270_key_file_build_filename(GtkWidget *terminal) { const gchar * filename = v3270_key_file_get_filename(terminal); @@ -271,7 +299,7 @@ void v3270_key_file_close(GtkWidget *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); + gchar * name = g_strconcat(folder,G_DIR_SEPARATOR_S,(hostname ? hostname : "session"),".3270",NULL); unsigned int index = 0; while(g_file_test(name,G_FILE_TEST_EXISTS)) { g_free(name); diff --git a/src/objects/window/terminal.c b/src/objects/window/terminal.c index c613533..7ef75c9 100644 --- a/src/objects/window/terminal.c +++ b/src/objects/window/terminal.c @@ -135,15 +135,9 @@ } else { // No session file, use the default one. - g_autofree gchar * compatible = g_build_filename(g_get_user_config_dir(),G_STRINGIFY(PRODUCT_NAME) ".conf",NULL); - g_autofree gchar * filename = g_build_filename(g_get_user_config_dir(),"default.3270",NULL); - - if(g_file_test(compatible,G_FILE_TEST_IS_REGULAR)) - { - g_rename(compatible,filename); - } - + gchar * filename = v3270_keyfile_get_default_filename(); v3270_key_file_open(terminal,filename,&error); + g_free(filename); } -- libgit2 0.21.2