Commit 2642fe34a787712f71b18868e957df43e3471196

Authored by Perry Werneck
1 parent fdc58940

Adding method to suggest session filename and path.

src/include/v3270/keyfile.h
... ... @@ -45,7 +45,12 @@
45 45 V3270KeyFile * v3270_key_file_open(GtkWidget *terminal, const gchar *name, GError **error);
46 46 void v3270_key_file_close(GtkWidget *terminal);
47 47 void v3270_key_file_save(GtkWidget *terminal);
48   - const gchar * v3270_key_file_get_file_name(GtkWidget *terminal);
  48 +
  49 + /// @brief Get current key filename
  50 + const gchar * v3270_key_file_get_filename(GtkWidget *terminal);
  51 +
  52 + /// @brief Build a writable key filename
  53 + gchar * v3270_key_file_build_filename(GtkWidget *terminal);
49 54  
50 55 GKeyFile * v3270_key_file_get(GtkWidget *terminal);
51 56  
... ...
src/objects/actions/save.c
... ... @@ -71,10 +71,8 @@
71 71 gtk_file_chooser_set_pw3270_filters(GTK_FILE_CHOOSER(dialog));
72 72  
73 73 if(terminal) {
74   - const gchar * current_file = v3270_key_file_get_file_name(terminal);
75   - if(current_file && g_file_test(current_file,G_FILE_TEST_IS_REGULAR) && !g_str_has_prefix(current_file,g_get_user_config_dir())) {
76   - gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),current_file);
77   - }
  74 + g_autofree gchar * filename = v3270_key_file_build_filename(terminal);
  75 + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog),filename);
78 76 }
79 77  
80 78 g_signal_connect(dialog,"response",G_CALLBACK(response),terminal);
... ...
src/objects/os/linux/savedesktopicon.c
... ... @@ -279,7 +279,7 @@ X-Desktop-File-Install-Version=0.23
279 279 if(bytes >= 0)
280 280 buffer[bytes] = '\0';
281 281  
282   - g_autofree gchar * exec_line = g_strdup_printf("%s \"%s\"",buffer,v3270_key_file_get_file_name(terminal));
  282 + g_autofree gchar * exec_line = g_strdup_printf("%s \"%s\"",buffer,v3270_key_file_get_filename(terminal));
283 283 g_key_file_set_string(keyfile,"Desktop Entry","Exec",exec_line);
284 284  
285 285 }
... ...
src/objects/window/keyfile.c
... ... @@ -39,6 +39,7 @@
39 39 #include <v3270/settings.h>
40 40 #include <v3270/keyfile.h>
41 41 #include <v3270/actions.h>
  42 + #include <lib3270/properties.h>
42 43 #include <string.h>
43 44 #include <stdlib.h>
44 45  
... ... @@ -203,7 +204,86 @@ void v3270_key_file_close(GtkWidget *terminal) {
203 204  
204 205 }
205 206  
206   - const gchar * v3270_key_file_get_file_name(GtkWidget *terminal) {
  207 + /// @brief Search standard paths.
  208 + static gchar * v3270_get_configuration_folder(GtkWidget *terminal) {
  209 +
  210 + size_t folder;
  211 + const gchar *folders[] = {
  212 + g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS),
  213 + g_get_user_data_dir(),
  214 + g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP)
  215 + };
  216 +
  217 + size_t application;
  218 + const gchar *applications[] = {
  219 + v3270_get_session_name(terminal),
  220 + G_STRINGIFY(PRODUCT_NAME),
  221 + PACKAGE_NAME,
  222 + "3270",
  223 + "tn3270"
  224 + };
  225 +
  226 + for(folder = 0; folder < G_N_ELEMENTS(folders); folder++) {
  227 +
  228 + if(!(folders[folder] && g_file_test(folders[folder],G_FILE_TEST_IS_DIR)))
  229 + continue;
  230 +
  231 + for(application = 0; application < G_N_ELEMENTS(applications); application++) {
  232 +
  233 + gchar * appdir = g_build_filename(folder[folders],application[applications],NULL);
  234 +
  235 + debug("Testing for \"%s\"",appdir);
  236 + if(g_file_test(appdir,G_FILE_TEST_IS_DIR)) {
  237 + return appdir;
  238 + }
  239 + g_free(appdir);
  240 +
  241 + }
  242 +
  243 + }
  244 +
  245 + // Not found, try the current session path.
  246 + const gchar * filename = v3270_key_file_get_filename(terminal);
  247 + debug("Testing for \"%s\"",filename);
  248 + if(filename
  249 + && g_file_test(filename,G_FILE_TEST_IS_REGULAR)
  250 + && g_str_has_prefix(filename,g_get_user_data_dir())
  251 + && !g_str_has_prefix(filename,g_get_user_config_dir())
  252 + ) {
  253 + return g_path_get_dirname(filename);
  254 + }
  255 +
  256 + debug("%s: Using standard documents folder",__FUNCTION__);
  257 + return g_strdup(g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS));
  258 +
  259 + }
  260 +
  261 + gchar * v3270_key_file_build_filename(GtkWidget *terminal) {
  262 +
  263 + const gchar * filename = v3270_key_file_get_filename(terminal);
  264 + if(filename && g_file_test(filename,G_FILE_TEST_IS_REGULAR) && !g_str_has_prefix(filename,g_get_user_config_dir())) {
  265 + return g_strdup(filename);
  266 + }
  267 +
  268 + debug("\n\n\n%s",__FUNCTION__);
  269 + g_autofree gchar * folder = v3270_get_configuration_folder(terminal);
  270 +
  271 + const char * hostname = lib3270_host_get_name(v3270_get_session(terminal));
  272 + debug("Hostname=\"%s\"",hostname);
  273 +
  274 + gchar * name = g_strconcat(folder,G_DIR_SEPARATOR_S,hostname,".3270",NULL);
  275 + unsigned int index = 0;
  276 + while(g_file_test(name,G_FILE_TEST_EXISTS)) {
  277 + g_free(name);
  278 + name = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s.%u.3270",folder,hostname,++index);
  279 + }
  280 +
  281 + debug("%s returns \"%s\"",__FUNCTION__,name);
  282 +
  283 + return name;
  284 + }
  285 +
  286 + const gchar * v3270_key_file_get_filename(GtkWidget *terminal) {
207 287  
208 288 V3270KeyFile *session = v3270_get_session_descriptor(terminal);
209 289  
... ...