Commit 992ffd3423723c9dcc78db687e47c995b1d0034d

Authored by Perry Werneck
1 parent 78c87dd2

'gfile' open has failed on windows, building an OS specific version.

pw3270.cbp
... ... @@ -130,6 +130,9 @@
130 130 <Unit filename="src/objects/keypad/widget.c">
131 131 <Option compilerVar="CC" />
132 132 </Unit>
  133 + <Unit filename="src/objects/os/linux/open.c">
  134 + <Option compilerVar="CC" />
  135 + </Unit>
133 136 <Unit filename="src/objects/os/linux/savedesktopicon.c">
134 137 <Option compilerVar="CC" />
135 138 </Unit>
... ...
src/include/pw3270/application.h
... ... @@ -65,6 +65,7 @@ typedef struct _pw3270Application pw3270Application;
65 65  
66 66 GType pw3270Application_get_type();
67 67 GtkApplication * pw3270_application_new(const gchar *application_id, GApplicationFlags flags);
  68 +void pw3270_application_open_file(GtkApplication *application, GtkWindow **window, GFile *file);
68 69  
69 70 /// @brief Get application settings.
70 71 /// @param app The pw3270 application object.
... ...
src/objects/application/open.c
... ... @@ -31,120 +31,6 @@
31 31 #include <pw3270/application.h>
32 32 #include <v3270/keyfile.h>
33 33  
34   -gchar * v3270_keyfile_find(const gchar *name) {
35   - //
36   - // It can be a session file, scans for it
37   - //
38   - const gchar * paths[] = {
39   - g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS),
40   - g_get_user_config_dir()
41   - };
42   -
43   - static const gchar *subdirs[] = {
44   - "3270",
45   - G_STRINGIFY(PRODUCT_NAME),
46   - PACKAGE_NAME
47   - };
48   -
49   - size_t path, subdir;
50   -
51   - g_autofree gchar * filename = g_strconcat(name,".3270",NULL);
52   -
53   - for(path = 0; path < G_N_ELEMENTS(paths); path++) {
54   -
55   - for(subdir = 0; subdir < G_N_ELEMENTS(subdirs); subdir++) {
56   -
57   - gchar * fullpath = g_build_filename(paths[path],subdirs[subdir],filename,NULL);
58   -
59   - debug("Searching for \"%s\"",fullpath);
60   -
61   - if(g_file_test(fullpath,G_FILE_TEST_IS_REGULAR)) {
62   - return fullpath;
63   - }
64   - g_free(fullpath);
65   -
66   - }
67   - }
68   -
69   - return NULL;
70   -
71   -}
72   -
73   -/// @brief Open session file
74   -static void open(GtkApplication *application, GtkWindow **window, const gchar *filename) {
75   -
76   - g_message("Opening '%s'",filename);
77   -
78   - if(*window) {
79   -
80   - // Already open a window, open in new tab.
81   - pw3270_application_window_new_tab(GTK_WIDGET(*window), filename);
82   -
83   - } else {
84   - // It's a new window
85   - *window = GTK_WINDOW(pw3270_application_window_new(application, filename));
86   -
87   - }
88   -
89   -}
90   -
91   -void pw3270_application_open_file(GtkApplication *application, GtkWindow **window, GFile *file) {
92   -
93   - g_autofree gchar * scheme = g_file_get_uri_scheme(file);
94   -
95   - if(g_ascii_strcasecmp(scheme,"file") == 0) {
96   -
97   - // It's a file scheme.
98   - if(g_file_query_exists(file,NULL)) {
99   -
100   - // The file exists, load it.
101   - g_autofree gchar *filename = g_file_get_path(file);
102   - open(application,window,filename);
103   -
104   - } else {
105   -
106   - // Search for file.
107   - g_autofree gchar * basename = g_file_get_basename(file);
108   - g_autofree gchar * filename = v3270_keyfile_find(basename);
109   -
110   - if(filename) {
111   - open(application,window,filename);
112   - } else {
113   - g_warning("Cant find session '%s'",basename);
114   - }
115   -
116   - }
117   -
118   - } else if(g_ascii_strcasecmp(scheme,"tn3270") == 0 || g_ascii_strcasecmp(scheme,"tn3270s") == 0) {
119   -
120   - g_autofree gchar * uri = g_file_get_uri(file);
121   - size_t sz = strlen(uri);
122   -
123   - if(sz > 0 && uri[sz-1] == '/')
124   - uri[sz-1] = 0;
125   -
126   - g_message("Opening '%s' with default settings",uri);
127   -
128   - if(!*window) {
129   - *window = GTK_WINDOW(pw3270_application_window_new(application, NULL));
130   - } else {
131   - pw3270_application_window_new_tab(GTK_WIDGET(*window), NULL);
132   - }
133   -
134   - GtkWidget * terminal = pw3270_application_window_get_active_terminal(GTK_WIDGET(*window));
135   - v3270_set_default_session(terminal);
136   - v3270_set_url(terminal,uri);
137   -
138   - } else {
139   -
140   - g_warning("Don't know how to handle '%s' scheme",scheme);
141   -
142   - }
143   -
144   -
145   -
146   -}
147   -
148 34 void pw3270_application_open(GApplication *application, GFile **files, gint n_files, const gchar G_GNUC_UNUSED(*hint)) {
149 35  
150 36 gint file;
... ...
src/objects/application/private.h
... ... @@ -47,6 +47,7 @@
47 47 #include <lib3270/log.h>
48 48  
49 49 G_GNUC_INTERNAL void pw3270_application_open(GApplication * application, GFile **files, gint n_files, const gchar *hint);
  50 +
50 51 G_GNUC_INTERNAL GtkWidget * pw3270_terminal_new(const gchar *session_file);
51 52  
52 53 // Actions
... ...
src/objects/os/linux/open.c 0 → 100644
... ... @@ -0,0 +1,163 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
  19 + * St, Fifth Floor, Boston, MA 02110-1301 USA
  20 + *
  21 + * Este programa está nomeado como - e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 +#include <config.h>
  31 +
  32 +#include <lib3270.h>
  33 +#include <lib3270/log.h>
  34 +#include <pw3270/application.h>
  35 +#include <pw3270/window.h>
  36 +#include <v3270.h>
  37 +#include <v3270/keyfile.h>
  38 +
  39 +static gchar * v3270_keyfile_find(const gchar *name) {
  40 + //
  41 + // It can be a session file, scans for it
  42 + //
  43 + const gchar * paths[] = {
  44 + g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS),
  45 + g_get_user_config_dir()
  46 + };
  47 +
  48 + static const gchar *subdirs[] = {
  49 + "3270",
  50 + G_STRINGIFY(PRODUCT_NAME),
  51 + PACKAGE_NAME
  52 + };
  53 +
  54 + size_t path, subdir;
  55 +
  56 + g_autofree gchar * filename = g_strconcat(name,".3270",NULL);
  57 +
  58 + for(path = 0; path < G_N_ELEMENTS(paths); path++) {
  59 +
  60 + // Try subdirs.
  61 + for(subdir = 0; subdir < G_N_ELEMENTS(subdirs); subdir++) {
  62 +
  63 + gchar * fullpath = g_build_filename(paths[path],subdirs[subdir],filename,NULL);
  64 +
  65 + debug("Searching for \"%s\"",fullpath);
  66 +
  67 + if(g_file_test(fullpath,G_FILE_TEST_IS_REGULAR)) {
  68 + return fullpath;
  69 + }
  70 + g_free(fullpath);
  71 +
  72 + }
  73 +
  74 + // Try path.
  75 + {
  76 + gchar * fullpath = g_build_filename(paths[path],filename,NULL);
  77 +
  78 + debug("Searching for \"%s\"",fullpath);
  79 +
  80 + if(g_file_test(fullpath,G_FILE_TEST_IS_REGULAR)) {
  81 + return fullpath;
  82 + }
  83 + g_free(fullpath);
  84 + }
  85 +
  86 + }
  87 +
  88 + return NULL;
  89 +
  90 +}
  91 +
  92 +/// @brief Open session file
  93 +static void open(GtkApplication *application, GtkWindow **window, const gchar *filename) {
  94 +
  95 + g_message("Opening '%s'",filename);
  96 +
  97 + if(*window) {
  98 +
  99 + // Already open a window, open in new tab.
  100 + pw3270_application_window_new_tab(GTK_WIDGET(*window), filename);
  101 +
  102 + } else {
  103 + // It's a new window
  104 + *window = GTK_WINDOW(pw3270_application_window_new(application, filename));
  105 +
  106 + }
  107 +
  108 +}
  109 +
  110 +void pw3270_application_open_file(GtkApplication *application, GtkWindow **window, GFile *file) {
  111 +
  112 + g_autofree gchar * scheme = g_file_get_uri_scheme(file);
  113 +
  114 + if(g_ascii_strcasecmp(scheme,"file") == 0) {
  115 +
  116 + // It's a file scheme.
  117 + if(g_file_query_exists(file,NULL)) {
  118 +
  119 + // The file exists, load it.
  120 + g_autofree gchar *filename = g_file_get_path(file);
  121 + open(application,window,filename);
  122 +
  123 + } else {
  124 +
  125 + // Search for file.
  126 + g_autofree gchar * basename = g_file_get_basename(file);
  127 + g_autofree gchar * filename = v3270_keyfile_find(basename);
  128 +
  129 + if(filename) {
  130 + open(application,window,filename);
  131 + } else {
  132 + g_warning("Cant find session '%s'",basename);
  133 + }
  134 +
  135 + }
  136 +
  137 + } else if(g_ascii_strcasecmp(scheme,"tn3270") == 0 || g_ascii_strcasecmp(scheme,"tn3270s") == 0) {
  138 +
  139 + g_autofree gchar * uri = g_file_get_uri(file);
  140 + size_t sz = strlen(uri);
  141 +
  142 + if(sz > 0 && uri[sz-1] == '/')
  143 + uri[sz-1] = 0;
  144 +
  145 + g_message("Opening '%s' with default settings",uri);
  146 +
  147 + if(!*window) {
  148 + *window = GTK_WINDOW(pw3270_application_window_new(application, NULL));
  149 + } else {
  150 + pw3270_application_window_new_tab(GTK_WIDGET(*window), NULL);
  151 + }
  152 +
  153 + GtkWidget * terminal = pw3270_application_window_get_active_terminal(GTK_WIDGET(*window));
  154 + v3270_set_default_session(terminal);
  155 + v3270_set_url(terminal,uri);
  156 +
  157 + } else {
  158 +
  159 + g_warning("Don't know how to handle '%s' scheme",scheme);
  160 +
  161 + }
  162 +
  163 +}
... ...