Commit 47a63a657e7fbf67f4eee81bd7b37de124f92ec2

Authored by Perry Werneck
1 parent fae87c18
Exists in v5.2

Refactoring windows session settings save/load engine.

src/pw3270/common.h
... ... @@ -60,7 +60,8 @@
60 60 LIB3270_EXPORT void pw3270_session_config_load(const gchar *filename);
61 61 LIB3270_EXPORT void pw3270_session_config_save();
62 62 LIB3270_EXPORT void pw3270_session_config_free(void);
63   - LIB3270_EXPORT GKeyFile * pw3270_session_config_get(gboolean create);
  63 + LIB3270_EXPORT GKeyFile * pw3270_session_config_get(gboolean create);
  64 + LIB3270_EXPORT void pw3270_session_save_terminal(GtkWidget *terminal);
64 65  
65 66 gchar * get_string_from_config(const gchar *group, const gchar *key, const gchar *def);
66 67 gboolean get_boolean_from_config(const gchar *group, const gchar *key, gboolean def);
... ... @@ -79,11 +80,10 @@
79 80 void restore_window_from_config(const gchar *group, const gchar *key, GtkWidget *hwnd);
80 81  
81 82 #ifdef ENABLE_WINDOWS_REGISTRY
82   - gboolean get_registry_handle(const gchar *group, HKEY *hKey, REGSAM samDesired);
  83 + gboolean pw3270_win32_registry_open(const gchar *group, HKEY *hKey, REGSAM samDesired);
  84 + void pw3270_win32_registry_foreach(HKEY parent, const gchar *name,void (*cbk)(const gchar *key, const gchar *val, gpointer *user_data), gpointer *user_data);
  85 +
83 86 HKEY get_application_registry(REGSAM samDesired);
84   - void registry_foreach(HKEY parent, const gchar *name,void (*cbk)(const gchar *key, const gchar *val, gpointer *user_data), gpointer *user_data);
85   - void registry_set_double(HKEY hKey, const gchar *key, gdouble value);
86   - gboolean registry_get_double(HKEY hKey, const gchar *key, gdouble *value);
87 87 #endif // ENABLE_WINDOWS_REGISTRY
88 88  
89 89  
... ...
src/pw3270/linux/config.c
... ... @@ -435,3 +435,15 @@ void restore_window_from_config(const gchar *group, const gchar *key, GtkWidget
435 435  
436 436 }
437 437  
  438 +void pw3270_session_save_terminal(GtkWidget *terminal)
  439 +{
  440 + GKeyFile * keyfile = pw3270_session_config_get(TRUE);
  441 +
  442 + debug("%s keyfile=%p",__FUNCTION__,keyfile);
  443 + if(keyfile)
  444 + {
  445 + v3270_to_key_file(widget, keyfile, "terminal");
  446 + pw3270_session_config_save();
  447 + }
  448 +
  449 +}
... ...
src/pw3270/window.c
... ... @@ -407,7 +407,6 @@ static GtkWidget * trace_window = NULL;
407 407  
408 408 GKeyFile * keyfile = pw3270_session_config_get(FALSE);
409 409  
410   - debug("%s keyfile=%p",__FUNCTION__,keyfile);
411 410 if(keyfile)
412 411 {
413 412 v3270_to_key_file(widget, keyfile, "terminal");
... ... @@ -418,7 +417,7 @@ static GtkWidget * trace_window = NULL;
418 417 {
419 418 HKEY hKey;
420 419  
421   - if(get_registry_handle(NULL, &hKey, KEY_SET_VALUE))
  420 + if(pw3270_win32_registry_open(NULL, &hKey, KEY_SET_VALUE))
422 421 {
423 422 v3270_to_registry(widget, hKey, "terminal");
424 423 RegCloseKey(hKey);
... ... @@ -872,7 +871,7 @@ static GtkWidget * trace_window = NULL;
872 871 g_signal_connect(widget->terminal,"field_clicked",G_CALLBACK(field_clicked),widget);
873 872 g_signal_connect(widget->terminal,"toggle_changed",G_CALLBACK(toggle_changed),widget);
874 873 g_signal_connect(widget->terminal,"session_changed",G_CALLBACK(session_changed),widget);
875   - g_signal_connect(widget->terminal,"save_settings",G_CALLBACK(save_terminal_settings),widget);
  874 + g_signal_connect(widget->terminal,"save_settings",G_CALLBACK(pw3270_session_save_terminal),NULL);
876 875  
877 876 //g_signal_connect(widget->terminal,"print",G_CALLBACK(print_all),widget);
878 877  
... ...
src/pw3270/windows/config.c
... ... @@ -24,51 +24,36 @@
24 24 *
25 25 * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
26 26 * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
27   - * licinio@bb.com.br (Licínio Luis Branco)
28   - * kraucer@bb.com.br (Kraucer Fernandes Mazuco)
29 27 *
30 28 */
31 29  
32   -#ifdef _WIN32
33   - #include <windows.h>
34   -#endif // _WIN32
  30 + #include <windows.h>
35 31  
36 32 #include "../pw3270/private.h"
37 33  
38   - #include "common.h"
  34 + #include "../common.h"
39 35 #include <stdarg.h>
40 36 #include <glib/gstdio.h>
  37 + #include <v3270/settings.h>
41 38  
42   -#ifdef _WIN32
  39 + #ifndef KEY_WOW64_64KEY
  40 + #define KEY_WOW64_64KEY 0x0100
  41 + #endif // KEY_WOW64_64KEY
43 42  
44   - #include <windows.h>
45   -
46   - #ifndef KEY_WOW64_64KEY
47   - #define KEY_WOW64_64KEY 0x0100
48   - #endif // KEY_WOW64_64KEY
49   -
50   - #ifndef KEY_WOW64_32KEY
51   - #define KEY_WOW64_32KEY 0x0200
52   - #endif // KEY_WOW64_64KEY
53   -
54   -#endif // _WIN32
  43 + #ifndef KEY_WOW64_32KEY
  44 + #define KEY_WOW64_32KEY 0x0200
  45 + #endif // KEY_WOW64_64KEY
55 46  
56 47 /*--[ Globals ]--------------------------------------------------------------------------------------*/
57 48  
58   -#ifdef ENABLE_WINDOWS_REGISTRY
59   -
60   - static const gchar * registry_path = "SOFTWARE";
61   -
62   -#else
  49 + static GKeyFile * keyfile = NULL;
  50 + static gchar * keyfilename = NULL;
  51 + static const HKEY predefined[] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE };
63 52  
64   - static GKeyFile * program_config = NULL;
65   -
66   -#endif // ENABLE_WINDOWS_REGISTRY
  53 + #define WINDOWS_REGISTRY_PATH "software"
67 54  
68 55 /*--[ Implement ]------------------------------------------------------------------------------------*/
69 56  
70   -#ifdef ENABLE_WINDOWS_REGISTRY
71   -
72 57 enum REG_KEY
73 58 {
74 59 REG_KEY_USER,
... ... @@ -76,53 +61,46 @@
76 61 REG_KEY_INEXISTENT
77 62 };
78 63  
79   - static enum REG_KEY registry_query(const gchar *group, const gchar *key, HKEY *hKey)
  64 + /// @brief Open registry for read-only access.
  65 + static enum REG_KEY search_for_registry_key(const gchar *group, const gchar *key, HKEY *hKey)
80 66 {
81   - static HKEY predefined[] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE };
82   - gchar * path = g_strdup_printf("%s\\%s\\%s",registry_path,g_get_application_name(),group);
83   - int f;
  67 + g_autofree gchar * path = g_strdup_printf("%s\\%s\\%s",WINDOWS_REGISTRY_PATH,g_get_application_name(),group);
  68 + size_t ix;
84 69  
85   - for(f=0;f<G_N_ELEMENTS(predefined);f++)
  70 + for(ix=0;ix < G_N_ELEMENTS(predefined);ix++)
86 71 {
87   - if(RegOpenKeyEx(predefined[f],path,0,KEY_READ,hKey) == ERROR_SUCCESS)
  72 + if(RegOpenKeyEx(predefined[ix],path,0,KEY_READ,hKey) == ERROR_SUCCESS)
88 73 {
89 74 if(RegQueryValueExA(*hKey,key,NULL,NULL,NULL,NULL) == ERROR_SUCCESS)
90 75 {
91   - trace("Key\"%s\\%s\" found at id %d",path,key,f);
92   - g_free(path);
93   - return f;
  76 + trace("Key\"%s\\%s\" found at id %d",path,key,ix);
  77 + return (enum REG_KEY) ix;
94 78 }
95 79 RegCloseKey(*hKey);
96 80 }
97 81 }
98 82  
99   - trace("Key \"%s\\%s\""" not found",path,key,f);
100   - g_free(path);
  83 + trace("Key \"%s\\%s\""" not found",path,key);
101 84  
102   - return -1;
  85 + return REG_KEY_INEXISTENT;
103 86 }
104 87  
105   - static BOOL registry_open_key(const gchar *group, const gchar *key, REGSAM samDesired, HKEY *hKey)
  88 + gboolean pw3270_win32_registry_open(const gchar *group, HKEY *hKey, REGSAM samDesired)
106 89 {
107   - static HKEY predefined[] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE };
108   - int f;
109   - gchar * path = g_strdup_printf("%s\\%s\\%s",registry_path,g_get_application_name(),group);
  90 + size_t ix;
  91 + g_autofree gchar * path = g_strdup_printf("%s\\%s\\%s",WINDOWS_REGISTRY_PATH,g_get_application_name(),group);
110 92  
111   - for(f=0;f<G_N_ELEMENTS(predefined);f++)
  93 + for(ix=0;ix < G_N_ELEMENTS(predefined);ix++)
112 94 {
113   - if(RegOpenKeyEx(predefined[f],path,0,samDesired,hKey) == ERROR_SUCCESS)
114   - {
115   - g_free(path);
  95 + if(RegOpenKeyEx(predefined[ix],path,0,samDesired,hKey) == ERROR_SUCCESS)
116 96 return TRUE;
117   - }
118 97 }
119 98  
120   - g_free(path);
121   -
122 99 return FALSE;
  100 +
123 101 }
124 102  
125   - void registry_foreach(HKEY parent, const gchar *name,void (*cbk)(const gchar *key, const gchar *val, gpointer *user_data), gpointer *user_data)
  103 + void pw3270_win32_registry_foreach(HKEY parent, const gchar *name,void (*cbk)(const gchar *key, const gchar *val, gpointer *user_data), gpointer *user_data)
126 104 {
127 105 HKEY hKey = 0;
128 106  
... ... @@ -152,218 +130,94 @@
152 130 }
153 131 }
154 132  
155   - void registry_set_double(HKEY hKey, const gchar *key, gdouble value)
156   - {
157   - // Reference: http://git.gnome.org/browse/glib/tree/glib/gkeyfile.c
158   - gchar result[G_ASCII_DTOSTR_BUF_SIZE];
159   - g_ascii_dtostr (result, sizeof (result), value);
160   -
161   - RegSetValueEx(hKey,key,0,REG_SZ,(const BYTE *) result,strlen(result)+1);
162   - }
163 133  
164   - gboolean registry_get_double(HKEY hKey, const gchar *key, gdouble *value)
  134 + /*
  135 + static BOOL registry_open_key(const gchar *group, const gchar *key, REGSAM samDesired, HKEY *hKey)
165 136 {
166   -// GError * error = NULL;
167   - BYTE data[4096];
168   - unsigned long datatype;
169   - unsigned long datalen = sizeof(data);
170   - gchar * end_of_valid_d;
171   -
172   - if(RegQueryValueExA(hKey,key,NULL,&datatype,data,&datalen) != ERROR_SUCCESS)
173   - return FALSE;
174   -
175   - data[datalen] = 0;
176   -
177   - * value = g_ascii_strtod((const gchar *) data, &end_of_valid_d);
  137 + static HKEY predefined[] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE };
  138 + int f;
  139 + gchar * path = g_strdup_printf("%s\\%s\\%s",registry_path,g_get_application_name(),group);
178 140  
179   - if(*end_of_valid_d != '\0' || end_of_valid_d == ((gchar *) data))
  141 + for(f=0;f<G_N_ELEMENTS(predefined);f++)
180 142 {
181   - g_warning("Key %s on registry isnt a valid double value",key);
182   - return FALSE;
  143 + if(RegOpenKeyEx(predefined[f],path,0,samDesired,hKey) == ERROR_SUCCESS)
  144 + {
  145 + g_free(path);
  146 + return TRUE;
  147 + }
183 148 }
184 149  
185   - return TRUE;
186   - }
187   -
  150 + g_free(path);
188 151  
  152 + return FALSE;
  153 + }
  154 + */
189 155  
190   -#else
191 156  
192   - static gchar * search_for_ini(void)
  157 + gboolean get_boolean_from_config(const gchar *group, const gchar *key, gboolean def)
193 158 {
194   - static const gchar * (*dir[])(void) =
195   - {
196   - g_get_user_config_dir,
197   - g_get_user_data_dir,
198   - g_get_home_dir,
199   - };
200   -
201   - size_t f;
202   - g_autofree gchar * name = g_strconcat(g_get_application_name(),".conf",NULL);
203   -
204   - //
205   - // First search the user data
206   - //
207   -
208   - for(f=0;f<G_N_ELEMENTS(dir);f++)
209   - {
210   - gchar *filename = g_build_filename(dir[f](),name,NULL);
211   -
212   - trace("Checking for %s",filename);
213   -
214   - if(g_file_test(filename,G_FILE_TEST_IS_REGULAR))
215   - return filename;
216   - g_free(filename);
217   -
218   - }
  159 + HKEY hKey;
219 160  
220   -#ifdef DATADIR
221   - //
222   - // Search the application DATADIR
223   - //
  161 + if(keyfile)
224 162 {
225   - gchar *filename = g_build_filename(DATAROOTDIR,G_STRINGIFY(PRODUCT_NAME),name,NULL);
226   -
227   - trace("Checking for default config \"%s\"",filename);
228   -
229   - if(g_file_test(filename,G_FILE_TEST_IS_REGULAR))
230   - return filename;
231   -
232   - g_message("Can't find default config (%s)",filename);
233   -
234   - g_free(filename);
235   -
236   - }
237   -#endif // DATADIR
238   -
239   - //
240   - // Search the system config folders
241   - //
242   - const gchar * const * sysconfig = g_get_system_config_dirs();
243   - for(f=0;sysconfig[f];f++)
244   - {
245   - gchar *filename = g_build_filename(sysconfig[f],name,NULL);
246   - trace("Checking for %s",filename);
247   - if(g_file_test(filename,G_FILE_TEST_IS_REGULAR))
248   - return filename;
249   - g_free(filename);
250   - }
251   -
252   - //
253   - // Search the system data folders
254   - //
255   - const gchar * const * sysdata = g_get_system_data_dirs();
256   - for(f=0;sysdata[f];f++)
257   - {
258   - gchar *filename;
259   -
260   - // Check for product dir
261   - filename = g_build_filename(sysdata[f],G_STRINGIFY(PRODUCT_NAME),name,NULL);
262   - trace("Checking for system data \"%s\"",filename);
263   - if(g_file_test(filename,G_FILE_TEST_IS_REGULAR))
264   - return filename;
265   - g_free(filename);
266   -
267   - // Check for file
268   - filename = g_build_filename(sysdata[f],name,NULL);
269   - trace("Checking for system data \"%s\"",filename);
270   - if(g_file_test(filename,G_FILE_TEST_IS_REGULAR))
271   - return filename;
272   - g_free(filename);
273   -
274   -
275   -
  163 + GError * err = NULL;
  164 + gboolean val = g_key_file_get_boolean(keyfile,group,key,&err);
  165 + if(err)
  166 + g_error_free(err);
  167 + else
  168 + return val;
276 169 }
277   -
278   - //
279   - // Can't find, use user config dir
280   - //
281   - g_message("No config, defaulting to %s/%s",g_get_user_config_dir(),name);
282   - return g_build_filename(g_get_user_config_dir(),name,NULL);
283   -
284   - }
285   -#endif // #ifdef ENABLE_WINDOWS_REGISTRY
286   -
287   - gboolean get_boolean_from_config(const gchar *group, const gchar *key, gboolean def)
288   - {
289   -#ifdef ENABLE_WINDOWS_REGISTRY
290   - gboolean ret = def;
291   - HKEY hKey;
292   -
293   - if(registry_query(group,key,&hKey) != REG_KEY_INEXISTENT)
  170 + else if(search_for_registry_key(group,key,&hKey) != REG_KEY_INEXISTENT)
294 171 {
295   - DWORD data;
296   - unsigned long datalen = sizeof(data);
297   - unsigned long datatype;
  172 + DWORD data;
  173 + unsigned long datalen = sizeof(data);
  174 + unsigned long datatype;
298 175  
299 176 if(RegQueryValueExA(hKey,key,NULL,&datatype,(BYTE *) &data,&datalen) == ERROR_SUCCESS)
300 177 {
301 178 if(datatype == REG_DWORD)
302   - ret = data ? TRUE : FALSE;
  179 + def = data ? TRUE : FALSE;
303 180 else
304   - g_warning("Unexpected registry data type in %s\\%s\\%s\\%s",registry_path,g_get_application_name(),group,key);
  181 + g_warning("Unexpected registry data type in %s\\%s\\%s\\%s",WINDOWS_REGISTRY_PATH,g_get_application_name(),group,key);
305 182 }
306 183  
307 184 RegCloseKey(hKey);
  185 +
308 186 }
309 187  
310   - return ret;
  188 + return def;
  189 + }
311 190  
312   -#else
  191 + gint get_integer_from_config(const gchar *group, const gchar *key, gint def)
  192 + {
  193 + HKEY hKey;
313 194  
314   - if(program_config)
  195 + if(keyfile)
315 196 {
316   - GError * err = NULL;
317   - gboolean val = g_key_file_get_boolean(program_config,group,key,&err);
  197 + GError * err = NULL;
  198 + gint val = g_key_file_get_integer(keyfile,group,key,&err);
318 199 if(err)
319 200 g_error_free(err);
320 201 else
321 202 return val;
322 203 }
323   -#endif // ENABLE_WINDOWS_REGISTRY
324   -
325   - return def;
326   - }
327   -
328   - gint get_integer_from_config(const gchar *group, const gchar *key, gint def)
329   - {
330   -#ifdef ENABLE_WINDOWS_REGISTRY
331   -
332   - HKEY key_handle;
333   -
334   - if(registry_open_key(group,key,KEY_READ,&key_handle))
  204 + else if(search_for_registry_key(group,key,&hKey) != REG_KEY_INEXISTENT)
335 205 {
336 206 DWORD data;
337 207 gint ret = def;
338 208 unsigned long datalen = sizeof(data);
339 209 unsigned long datatype;
340 210  
341   - if(RegQueryValueExA(key_handle,key,NULL,&datatype,(BYTE *) &data,&datalen) == ERROR_SUCCESS)
  211 + if(RegQueryValueExA(hKey,key,NULL,&datatype,(BYTE *) &data,&datalen) == ERROR_SUCCESS)
342 212 {
343 213 if(datatype == REG_DWORD)
344   - ret = (gint) data;
  214 + def = (gint) data;
345 215 else
346   - g_warning("Unexpected registry data type in %s\\%s\\%s\\%s",registry_path,g_get_application_name(),group,key);
  216 + g_warning("Unexpected registry data type in %s\\%s\\%s\\%s",WINDOWS_REGISTRY_PATH,g_get_application_name(),group,key);
347 217 }
348 218  
349   - RegCloseKey(key_handle);
350   -
351   - return ret;
352   -
353   - }
354   -
355   -#else
356   -
357   - if(program_config)
358   - {
359   - GError * err = NULL;
360   - gint val = g_key_file_get_integer(program_config,group,key,&err);
361   - if(err)
362   - g_error_free(err);
363   - else
364   - return val;
  219 + RegCloseKey(hKey);
365 220 }
366   -#endif // ENABLE_WINDOWS_REGISTRY
367 221  
368 222 return def;
369 223 }
... ... @@ -371,46 +225,28 @@
371 225  
372 226 gchar * get_string_from_config(const gchar *group, const gchar *key, const gchar *def)
373 227 {
374   -#ifdef ENABLE_WINDOWS_REGISTRY
375   -
376   - HKEY key_handle;
377   - unsigned long datalen = 4096;
378   - unsigned long datatype;
379   - gchar * ret = NULL;
380   - BYTE * data;
381   -
382   - if(!registry_open_key(group,key,KEY_READ,&key_handle))
383   - {
384   - if(def)
385   - return g_strdup(def);
386   - return NULL;
387   - }
  228 + HKEY hKey;
388 229  
389   - data = (BYTE *) g_malloc0(datalen+2);
390   -
391   - if(RegQueryValueExA(key_handle,key,NULL,&datatype,data,&datalen) == ERROR_SUCCESS)
  230 + if(keyfile)
392 231 {
393   - data[datalen+1] = 0;
394   - ret = g_strdup((const gchar *) data);
  232 + gchar *ret = g_key_file_get_string(keyfile,group,key,NULL);
  233 + if(ret)
  234 + return ret;
395 235 }
396   - else if(def)
  236 + else if(search_for_registry_key(group,key,&hKey) != REG_KEY_INEXISTENT)
397 237 {
398   - ret = g_strdup(def);
399   - }
400   -
401   - g_free(data);
  238 + unsigned long datalen = 4096;
  239 + g_autofree gchar * data = g_malloc0(datalen+2);
  240 + unsigned long datatype;
402 241  
403   - RegCloseKey(key_handle);
404   -
405   - return ret;
406   -
407   -#else
  242 + if(RegQueryValueExA(hKey,key,NULL,&datatype,data,&datalen) == ERROR_SUCCESS)
  243 + {
  244 + RegCloseKey(hKey);
  245 + data[datalen+1] = 0;
  246 + return g_strdup((const gchar *) data);
  247 + }
408 248  
409   - if(program_config)
410   - {
411   - gchar *ret = g_key_file_get_string(program_config,group,key,NULL);
412   - if(ret)
413   - return ret;
  249 + RegCloseKey(hKey);
414 250 }
415 251  
416 252 if(def)
... ... @@ -418,207 +254,128 @@
418 254  
419 255 return NULL;
420 256  
421   -#endif // ENABLE_WINDOWS_REGISTRY
422 257 }
423 258  
424   -void configuration_init(void)
  259 +void pw3270_session_config_load(const gchar *filename)
425 260 {
426   -#ifndef ENABLE_WINDOWS_REGISTRY
427   - gchar *filename = search_for_ini();
428   -
429   - if(program_config)
430   - g_key_file_free(program_config);
  261 + if(keyfilename)
  262 + {
  263 + g_free(keyfilename);
  264 + keyfilename = NULL;
  265 + }
431 266  
432   - program_config = g_key_file_new();
  267 + if(keyfile)
  268 + {
  269 + g_key_file_free(keyfile);
  270 + keyfile = NULL;
  271 + }
433 272  
434 273 if(filename)
435 274 {
  275 + // Has file name, load it.
436 276 g_message(_("Loading %s"),filename);
437   - g_key_file_load_from_file(program_config,filename,G_KEY_FILE_NONE,NULL);
438   - g_free(filename);
  277 + keyfile = g_key_file_new();
  278 + g_key_file_load_from_file(keyfile,filename,G_KEY_FILE_NONE,NULL);
  279 + keyfilename = g_strdup(filename);
439 280 }
440 281  
441   -#endif // ENABLE_WINDOWS_REGISTRY
442 282 }
443 283  
444   -static void set_string(const gchar *group, const gchar *key, const gchar *fmt, va_list args)
445   -{
446   - gchar * value = g_strdup_vprintf(fmt,args);
447   -
448   -#ifdef ENABLE_WINDOWS_REGISTRY
449   -
450   - gchar * path = g_strdup_printf("%s\\%s\\%s",registry_path,g_get_application_name(),group);
451   - HKEY hKey;
452   - DWORD disp;
453   -
454   - if(RegCreateKeyEx(HKEY_CURRENT_USER,path,0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hKey,&disp) == ERROR_SUCCESS)
455   - {
456   - RegSetValueEx(hKey,key,0,REG_SZ,(const BYTE *) value,strlen(value)+1);
457   - RegCloseKey(hKey);
458   - }
459   -
460   - g_free(path);
461   -
462   -#else
463   -
464   - g_key_file_set_string(program_config,group,key,value);
465   -
466   -#endif
467   -
468   - g_free(value);
469   -}
470 284  
471 285 void set_string_to_config(const gchar *group, const gchar *key, const gchar *fmt, ...)
472 286 {
  287 + HKEY hKey;
  288 + g_autofree gchar * str = NULL;
  289 +
473 290 if(fmt)
474 291 {
475 292 va_list args;
476 293 va_start(args, fmt);
477   - set_string(group,key,fmt,args);
  294 + str = g_strdup_vprintf(fmt,args);
478 295 va_end(args);
479 296 }
480   -#ifdef ENABLE_WINDOWS_REGISTRY
481   - else
482   - {
483 297  
484   - gchar * path = g_strdup_printf("%s\\%s\\%s",registry_path,g_get_application_name(),group);
485   - HKEY hKey;
486   - DWORD disp;
487   -
488   - if(RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)
  298 + if(keyfile)
  299 + {
  300 + // Update keyfile
  301 + if(str)
489 302 {
490   - RegDeleteKey(hKey,key);
491   - RegCloseKey(hKey);
  303 + g_key_file_set_string(keyfile,group,key,str);
  304 + }
  305 + else
  306 + {
  307 + g_key_file_remove_key(keyfile,group,key,NULL);
492 308 }
493 309  
494   - g_free(path);
495   -
496   - }
497   -#else
498   - else if(g_key_file_has_key(program_config,group,key,NULL))
499   - {
500   - g_key_file_remove_key(program_config,group,key,NULL);
501 310 }
502   -#endif
  311 +
  312 +
503 313 }
504 314  
505 315 void set_boolean_to_config(const gchar *group, const gchar *key, gboolean val)
506 316 {
507   -#ifdef ENABLE_WINDOWS_REGISTRY
508   -
509   - HKEY hKey;
510   - DWORD disp;
511   - gchar * path = g_strdup_printf("%s\\%s\\%s",registry_path,g_get_application_name(),group);
512   -
513   -// trace("Creating key %s",path);
514   - if(RegCreateKeyEx(HKEY_CURRENT_USER,path,0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hKey,&disp) == ERROR_SUCCESS)
515   - {
516   - DWORD value = val ? 1 : 0;
517   - LONG rc = RegSetValueEx(hKey, key, 0, REG_DWORD,(const BYTE *) &value,sizeof(value));
  317 + HKEY hKey;
518 318  
519   - SetLastError(rc);
520   -
521   - if(rc != ERROR_SUCCESS)
522   - {
523   - gchar *msg = g_win32_error_message(GetLastError());
524   - g_warning("Error \"%s\" when setting key HKCU\\%s\\%s",msg,path,key);
525   - g_free(msg);
526   - }
527   - RegCloseKey(hKey);
528   - }
529   - else
  319 + if(keyfile)
530 320 {
531   - gchar *msg = g_win32_error_message(GetLastError());
532   - g_warning("Error \"%s\" when creating key HKCU\\%s",msg,path);
533   - g_free(msg);
  321 + g_key_file_set_boolean(keyfile,group,key,val);
534 322 }
535 323  
536   - g_free(path);
537   -
538   -#else
539   -
540   - if(program_config)
541   - g_key_file_set_boolean(program_config,group,key,val);
542   -
543   -#endif // ENABLE_WINDOWS_REGISTRY
544   -
545 324 }
546 325  
547 326 void set_integer_to_config(const gchar *group, const gchar *key, gint val)
548 327 {
549   -#ifdef ENABLE_WINDOWS_REGISTRY
  328 + HKEY hKey;
550 329  
551   - HKEY hKey;
552   - DWORD disp;
553   - gchar * path = g_strdup_printf("%s\\%s\\%s",registry_path,g_get_application_name(),group);
554   -
555   - trace("Creating key %s",path);
556   - if(RegCreateKeyEx(HKEY_CURRENT_USER,path,0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hKey,&disp) == ERROR_SUCCESS)
557   - {
558   - DWORD value = (DWORD) val;
559   - LONG rc = RegSetValueEx(hKey, key, 0, REG_DWORD,(const BYTE *) &value,sizeof(value));
560   -
561   - SetLastError(rc);
562   -
563   - if(rc != ERROR_SUCCESS)
564   - {
565   - gchar *msg = g_win32_error_message(GetLastError());
566   - g_warning("Error \"%s\" when setting key HKCU\\%s\\%s",msg,path,key);
567   - g_free(msg);
568   - }
569   - RegCloseKey(hKey);
570   - }
571   - else
  330 + if(keyfile)
572 331 {
573   - gchar *msg = g_win32_error_message(GetLastError());
574   - g_warning("Error \"%s\" when creating key HKCU\\%s",msg,path);
575   - g_free(msg);
  332 + g_key_file_set_integer(keyfile,group,key,val);
576 333 }
577 334  
578   - g_free(path);
579   -
580   -#else
581   -
582   - if(program_config)
583   - g_key_file_set_integer(program_config,group,key,val);
584   -
585   -#endif // ENABLE_WINDOWS_REGISTRY
586   -
587 335 }
588 336  
589   -void configuration_deinit(void)
  337 +void pw3270_session_config_save()
590 338 {
591   -#if !defined(ENABLE_WINDOWS_REGISTRY)
592   -
593   - if(!program_config)
  339 + if(!keyfile)
594 340 return;
595 341  
596   - g_autofree gchar * text = g_key_file_to_data(program_config,NULL,NULL);
  342 + g_autofree gchar * text = g_key_file_to_data(keyfile,NULL,NULL);
597 343  
598 344 if(text)
599 345 {
600 346 GError * error = NULL;
601 347  
602   - g_autofree gchar * name = g_strconcat(g_get_application_name(),".conf",NULL);
603   - g_autofree gchar * filename = g_build_filename(g_get_user_config_dir(),name,NULL);
604   -
605   - g_mkdir_with_parents(g_get_user_config_dir(),S_IRUSR|S_IWUSR);
606   -
607   - g_message( _("Saving %s"), filename);
  348 + if(keyfilename)
  349 + {
  350 + g_message( _("Saving %s"), keyfilename);
  351 + g_file_set_contents(keyfilename,text,-1,&error);
  352 + }
  353 + else
  354 + {
  355 + g_autofree gchar * name = g_strconcat(g_get_application_name(),".conf",NULL);
  356 + g_autofree gchar * filename = g_build_filename(g_get_user_config_dir(),name,NULL);
  357 + g_mkdir_with_parents(g_get_user_config_dir(),S_IRUSR|S_IWUSR);
  358 + g_file_set_contents(filename,text,-1,&error);
  359 + }
608 360  
609   - g_file_set_contents(filename,text,-1,&error);
610 361  
611 362 if(error) {
612   - g_message( _( "Can't save \"%s\": %s" ), filename, error->message);
  363 + g_message( _( "Can't save session settings: %s" ), error->message);
613 364 g_error_free(error);
614 365 }
615 366  
616 367 }
617 368  
618   - g_key_file_free(program_config);
619   - program_config = NULL;
  369 +}
620 370  
621   -#endif // ENABLE_WINDOWS_REGISTRY
  371 +void pw3270_session_config_free(void)
  372 +{
  373 + if(keyfile)
  374 + {
  375 + pw3270_session_config_save();
  376 + g_key_file_free(keyfile);
  377 + keyfile = NULL;
  378 + }
622 379 }
623 380  
624 381 gchar * build_data_filename(const gchar *first_element, ...)
... ... @@ -648,52 +405,6 @@ gchar * filename_from_va(const gchar *first_element, va_list args)
648 405  
649 406 g_autofree gchar * suffix = g_string_free(result, FALSE);
650 407  
651   -#if defined( ENABLE_WINDOWS_REGISTRY )
652   - for(p=0;p<G_N_ELEMENTS(appname) && !result;p++)
653   - {
654   - g_autofree gchar * path = g_strconcat("Software\\",appname[p],NULL);
655   -
656   - HKEY hKey = 0;
657   - LONG rc = 0;
658   -
659   - // Note: This could be needed: http://support.microsoft.com/kb/556009
660   - // http://msdn.microsoft.com/en-us/library/windows/desktop/aa384129(v=vs.85).aspx
661   -
662   - rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,path,0,KEY_QUERY_VALUE,&hKey);
663   - SetLastError(rc);
664   -
665   - if(rc == ERROR_SUCCESS)
666   - {
667   - char data[4096];
668   - unsigned long datalen = sizeof(data); // data field length(in), data returned length(out)
669   - unsigned long datatype; // #defined in winnt.h (predefined types 0-11)
670   -
671   - rc = RegQueryValueExA(hKey,"datadir",NULL,&datatype,(LPBYTE) data,&datalen);
672   - if(rc == ERROR_SUCCESS)
673   - {
674   - gchar * path = g_build_filename(data,appname[p],suffix,NULL);
675   - trace("searching \"%s\"",path);
676   - if(g_file_test(path,G_FILE_TEST_EXISTS))
677   - return path;
678   - g_free(path);
679   - }
680   - RegCloseKey(hKey);
681   - }
682   -
683   - }
684   -#endif // ENABLE_WINDOWS_REGISTRY
685   -
686   -#ifdef _WIN32
687   - for(p=0;p<G_N_ELEMENTS(appname) && !result;p++)
688   - {
689   - gchar * path = g_build_filename(g_win32_get_package_installation_directory_of_module(NULL),appname[p],suffix,NULL);
690   - trace("searching \"%s\"",path);
691   - if(g_file_test(path,G_FILE_TEST_EXISTS))
692   - return path;
693   - g_free(path);
694   - }
695   -#endif // _WIN32
696   -
697 408 // Check system data dirs
698 409 const gchar * const * system_data_dirs = g_get_system_data_dirs();
699 410 for(p=0;p<G_N_ELEMENTS(appname);p++)
... ... @@ -722,36 +433,12 @@ gchar * filename_from_va(const gchar *first_element, va_list args)
722 433 return g_build_filename(".",suffix,NULL);
723 434 }
724 435  
725   -#ifdef ENABLE_WINDOWS_REGISTRY
726   -gboolean get_registry_handle(const gchar *group, HKEY *hKey, REGSAM samDesired)
727   -{
728   - gboolean ret;
729   - gchar * path;
730   - DWORD disp;
731   -
732   - if(group)
733   - path = g_strdup_printf("%s\\%s\\%s",registry_path,g_get_application_name(),group);
734   - else
735   - path = g_strdup_printf("%s\\%s",registry_path,g_get_application_name());
736   -
737   - if(RegCreateKeyEx(HKEY_CURRENT_USER,path,0,NULL,REG_OPTION_NON_VOLATILE,samDesired,NULL,hKey,&disp) == ERROR_SUCCESS)
738   - ret = TRUE;
739   - else
740   - ret = FALSE;
741   -
742   - g_free(path);
743   -
744   - return ret;
745   -}
746   -#else
747   -#error Replace it!
748   -GKeyFile * get_application_keyfile(void)
  436 +GKeyFile * pw3270_session_config_get(gboolean create)
749 437 {
750   - if(!program_config)
751   - configuration_init();
752   - return program_config;
  438 + if(!keyfile && create)
  439 + pw3270_session_config_load(NULL);
  440 + return keyfile;
753 441 }
754   -#endif // ENABLE_WINDOWS_REGISTRY
755 442  
756 443 static const struct _WindowState
757 444 {
... ... @@ -765,175 +452,33 @@ GKeyFile * get_application_keyfile(void)
765 452 { "Sticky", GDK_WINDOW_STATE_STICKY, gtk_window_stick }
766 453 };
767 454  
768   -void save_window_state_to_config(const gchar *group, const gchar *key, GdkWindowState CurrentState)
769   -{
770   -#if defined( ENABLE_WINDOWS_REGISTRY )
771   -
772   - gchar * path = g_strdup_printf("%s\\%s\\%s\\%s",registry_path,g_get_application_name(),group,key);
773   -
774   - HKEY hKey;
775   - DWORD disp;
776   -
777   - if(RegCreateKeyEx(HKEY_CURRENT_USER,path,0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hKey,&disp) == ERROR_SUCCESS)
778   - {
779   - int f;
780   - for(f=0;f<G_N_ELEMENTS(WindowState);f++)
781   - {
782   - DWORD value = (CurrentState & WindowState[f].flag) ? 1 : 0;
783   -// trace("%s=%s",WindowState[f].name,value ? "Yes" : "No");
784   - RegSetValueEx(hKey, WindowState[f].name, 0, REG_DWORD,(const BYTE *) &value,sizeof(value));
785   - }
786   -
787   - RegCloseKey(hKey);
788   - }
789   -
790   - g_free(path);
791   -
792   -#else
793   - int f;
794   - GKeyFile * conf = get_application_keyfile();
795   - gchar * id = g_strconcat(group,".",key,NULL);
796   -
797   - for(f=0;f<G_N_ELEMENTS(WindowState);f++)
798   - g_key_file_set_boolean(conf,id,WindowState[f].name,CurrentState & WindowState[f].flag);
799   -
800   - g_free(id);
801   -
802   -#endif // ENABLE_WINDOWS_REGISTRY
803   -}
804   -
805   -void save_window_size_to_config(const gchar *group, const gchar *key, GtkWidget *hwnd)
806   -{
807   -#if defined( ENABLE_WINDOWS_REGISTRY )
808   -
809   - gchar * path = g_strdup_printf("%s\\%s\\%s\\%s",registry_path,g_get_application_name(),group,key);
810   -
811   - HKEY hKey;
812   - DWORD disp;
813   -
814   - if(RegCreateKeyEx(HKEY_CURRENT_USER,path,0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hKey,&disp) == ERROR_SUCCESS)
815   - {
816   - int pos[2];
817   -
818   - gtk_window_get_size(GTK_WINDOW(hwnd),&pos[0],&pos[1]);
819   -
820   - RegSetValueEx(hKey, "Size", 0, REG_BINARY,(const BYTE *) pos,sizeof(pos));
821   -
822   - RegCloseKey(hKey);
823   - }
824   -
825   - g_free(path);
826   -
827   -#else
828   - int pos[2];
829   - GKeyFile * conf = get_application_keyfile();
830   - gchar * id = g_strconcat(group,".",key,NULL);
831   -
832   - gtk_window_get_size(GTK_WINDOW(hwnd),&pos[0],&pos[1]);
833   - g_key_file_set_integer_list(conf,id,"size",pos,2);
834   -
835   - g_free(id);
836   -
837   -#endif // ENABLE_WINDOWS_REGISTRY
838   -}
839   -
840   -#if defined( ENABLE_WINDOWS_REGISTRY )
841   -static void restore_window_from_regkey(GtkWidget *hwnd, HKEY hKey, const gchar *path)
842   -{
843   - int f;
844   - int pos[2];
845   - unsigned long datalen;
846   - unsigned long datatype;
847   -
848   -
849   - datalen = sizeof(pos);
850   - if(RegQueryValueExA(hKey,"Size",NULL,&datatype,(BYTE *) pos,&datalen) == ERROR_SUCCESS)
851   - {
852   - if(datatype == REG_BINARY && datalen == sizeof(pos))
853   - {
854   - gtk_window_resize(GTK_WINDOW(hwnd),pos[0],pos[1]);
855   - }
856   - else
857   - {
858   - g_warning("Unexpected registry data in %s\\Size",path);
859   - }
860   - }
861   -
862   -
863   - for(f=0;f<G_N_ELEMENTS(WindowState);f++)
864   - {
865   - DWORD data;
866   -
867   - datalen = sizeof(data);
868   -
869   - if(RegQueryValueExA(hKey,WindowState[f].name,NULL,&datatype,(BYTE *) &data,&datalen) == ERROR_SUCCESS)
870   - {
871   - if(datatype == REG_DWORD)
872   - {
873   - if(data)
874   - WindowState[f].activate(GTK_WINDOW(hwnd));
875   -
876   - }
877   - else
878   - {
879   - g_warning("Unexpected registry data type in %s\\%s",path,WindowState[f].name);
880   - }
881   - }
882   - }
883   -
884   -
885   -}
886   -#endif // ENABLE_WINDOWS_REGISTRY
887   -
888   -void restore_window_from_config(const gchar *group, const gchar *key, GtkWidget *hwnd)
889   -{
890   -#if defined( ENABLE_WINDOWS_REGISTRY )
  455 + void pw3270_session_save_terminal(GtkWidget *terminal)
  456 + {
  457 + HKEY hKey;
891 458  
892   - gchar * path = g_strdup_printf("%s\\%s\\%s\\%s",registry_path,g_get_application_name(),group,key);
893   - HKEY hKey;
  459 + GKeyFile * keyfile = pw3270_session_config_get(FALSE);
894 460  
895   - if(RegOpenKeyEx(HKEY_CURRENT_USER,path,0,KEY_READ,&hKey) == ERROR_SUCCESS)
896   - {
897   - // Load user settings
898   - restore_window_from_regkey(hwnd,hKey,path);
899   - RegCloseKey(hKey);
900   - }
901   - else if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,path,0,KEY_READ,&hKey) == ERROR_SUCCESS)
  461 + if(keyfile)
902 462 {
903   - // Load system defaults
904   - restore_window_from_regkey(hwnd,hKey,path);
905   - RegCloseKey(hKey);
  463 + v3270_to_key_file(terminal, keyfile, "terminal");
  464 + pw3270_session_config_save();
906 465 }
907 466  
908   - g_free(path);
909   -
910   -#else
911   - gchar * id = g_strconcat(group,".",key,NULL);
912   - GKeyFile * conf = get_application_keyfile();
913 467  
914   - if(g_key_file_has_key(conf,id,"size",NULL))
915   - {
916   - gsize sz = 2;
917   - gint * vlr = g_key_file_get_integer_list(conf,id,"size",&sz,NULL);
918   - int f;
  468 + }
919 469  
920   - if(vlr)
921   - {
922   - gtk_window_resize(GTK_WINDOW(hwnd),vlr[0],vlr[1]);
923   - g_free(vlr);
924   - }
  470 + void save_window_state_to_config(const gchar *group, const gchar *key, GdkWindowState CurrentState)
  471 + {
925 472  
926   - for(f=0;f<G_N_ELEMENTS(WindowState);f++)
927   - {
928   - if(g_key_file_get_boolean(conf,id,WindowState[f].name,NULL))
929   - WindowState[f].activate(GTK_WINDOW(hwnd));
930   - }
  473 + }
931 474  
932   - }
  475 + void save_window_size_to_config(const gchar *group, const gchar *key, GtkWidget *hwnd)
  476 + {
933 477  
934   - g_free(id);
  478 + }
935 479  
936   -#endif // ENABLE_WINDOWS_REGISTRY
  480 + void restore_window_from_config(const gchar *group, const gchar *key, GtkWidget *hwnd)
  481 + {
937 482  
938   -}
  483 + }
939 484  
... ...
src/pw3270/windows/print.c
... ... @@ -100,6 +100,29 @@ static gchar * enum_to_string(GType type, guint enum_value)
100 100 }
101 101 }
102 102  
  103 + gboolean registry_get_double(HKEY hKey, const gchar *key, gdouble *value)
  104 + {
  105 + BYTE data[4096];
  106 + unsigned long datatype;
  107 + unsigned long datalen = sizeof(data);
  108 + gchar * end_of_valid_d;
  109 +
  110 + if(RegQueryValueExA(hKey,key,NULL,&datatype,data,&datalen) != ERROR_SUCCESS)
  111 + return FALSE;
  112 +
  113 + data[datalen] = 0;
  114 +
  115 + * value = g_ascii_strtod((const gchar *) data, &end_of_valid_d);
  116 +
  117 + if(*end_of_valid_d != '\0' || end_of_valid_d == ((gchar *) data))
  118 + {
  119 + g_warning("Key %s on registry isnt a valid double value",key);
  120 + return FALSE;
  121 + }
  122 +
  123 + return TRUE;
  124 + }
  125 +
103 126 void load_print_operation_settings(GtkPrintOperation * operation)
104 127 {
105 128 GtkPrintSettings * settings = gtk_print_settings_new();
... ... @@ -122,12 +145,12 @@ static gchar * enum_to_string(GType type, guint enum_value)
122 145  
123 146 HKEY registry;
124 147  
125   - if(get_registry_handle("print",&registry,KEY_READ))
  148 + if(pw3270_win32_registry_open("print",&registry,KEY_READ))
126 149 {
127 150 HKEY hKey;
128 151 DWORD disp;
129 152  
130   - registry_foreach(registry,"settings",update_settings,(gpointer) settings);
  153 + pw3270_win32_registry_foreach(registry,"settings",update_settings,(gpointer) settings);
131 154  
132 155 if(RegCreateKeyEx(registry,"pagesetup",0,NULL,REG_OPTION_NON_VOLATILE,KEY_READ,NULL,&hKey,&disp) == ERROR_SUCCESS)
133 156 {
... ... @@ -234,6 +257,15 @@ static gchar * enum_to_string(GType type, guint enum_value)
234 257  
235 258 }
236 259  
  260 + static void registry_set_double(HKEY hKey, const gchar *key, gdouble value)
  261 + {
  262 + // Reference: http://git.gnome.org/browse/glib/tree/glib/gkeyfile.c
  263 + gchar result[G_ASCII_DTOSTR_BUF_SIZE];
  264 + g_ascii_dtostr (result, sizeof (result), value);
  265 +
  266 + RegSetValueEx(hKey,key,0,REG_SZ,(const BYTE *) result,strlen(result)+1);
  267 + }
  268 +
237 269 void save_print_operation_settings(GtkPrintOperation * operation)
238 270 {
239 271 // Save settings
... ... @@ -246,7 +278,7 @@ static gchar * enum_to_string(GType type, guint enum_value)
246 278 #ifdef ENABLE_WINDOWS_REGISTRY
247 279 HKEY registry;
248 280  
249   - if(get_registry_handle("print",&registry,KEY_SET_VALUE))
  281 + if(pw3270_win32_registry_open("print",&registry,KEY_SET_VALUE))
250 282 {
251 283 HKEY hKey;
252 284 DWORD disp;
... ...