gcc6: narrowing conversion from char to unsigned char
[platform/core/uifw/ise-engine-unikey.git] / setup / config_utils.cpp
1 #include <stdlib.h>
2 #include <string.h>
3 #include <ctype.h>
4
5 #include "dlg_main_setup.h"
6
7 #include "scim_unikey_const.h"
8
9 #define get_macro_file() (g_build_filename(g_getenv("HOME"), SCIM_IMENGINE_UNIKEY_MACROPATH, NULL))
10 void scim_set_config(const gchar* key, GType t, gpointer data);
11 gboolean scim_get_config(const gchar* key, GType t, gpointer data);
12
13 void set_default_config(UnikeyMainSetupOptions* opt)
14 {
15     opt->input_method = 0;
16     opt->output_charset = 0;
17
18     opt->enableSpellcheck = SCIM_IMENGINE_UNIKEY_SPELLCHECKENABLED_DEF;
19     opt->autoRestoreNonVn = SCIM_IMENGINE_UNIKEY_AUTONONVNRESTORE_DEF;
20     opt->modernStyle = SCIM_IMENGINE_UNIKEY_MODERNSTYLE_DEF;
21     opt->freeMarking = SCIM_IMENGINE_UNIKEY_FREEMARKING_DEF;
22     opt->enableMacro = SCIM_IMENGINE_UNIKEY_MACROENABLED_DEF;
23
24     opt->processwatbegin = SCIM_IMENGINE_UNIKEY_PROCESSWATWORDBEGIN_DEF;
25
26     opt->macrofile = get_macro_file();
27 }
28
29 void read_config(UnikeyMainSetupOptions* opt)
30 {
31     gboolean b;
32     int k;
33     gboolean t;
34     //gchar* s;
35
36     // get Input method
37     b = scim_get_config(SCIM_IMENGINE_UNIKEY_INPUTMETHOD, G_TYPE_INT, &k);
38     if (b == TRUE)
39     {
40         opt->input_method = k;
41     }
42     // END get Input method
43
44     // get Output charset
45     b = scim_get_config(SCIM_IMENGINE_UNIKEY_OUTPUTCHARSET, G_TYPE_INT, &k);
46     if (b == TRUE)
47     {
48         opt->output_charset = k;
49     }
50     // END get Output charset
51
52     // get Spellcheck
53     b = scim_get_config(SCIM_IMENGINE_UNIKEY_SPELLCHECKENABLED, G_TYPE_BOOLEAN, &t);
54     if (b == TRUE)
55     {
56         opt->enableSpellcheck = t;
57     }
58     // END get Spellcheck
59
60     // get autoRestoreNonVn
61     b = scim_get_config(SCIM_IMENGINE_UNIKEY_AUTONONVNRESTORE, G_TYPE_BOOLEAN, &t);
62     if (b == TRUE)
63     {
64         opt->autoRestoreNonVn = t;
65     }
66     // END get autoRestoreNonVn
67
68     // get modernStyle
69     b = scim_get_config(SCIM_IMENGINE_UNIKEY_MODERNSTYLE, G_TYPE_BOOLEAN, &t);
70     if (b == TRUE)
71     {
72         opt->modernStyle = t;
73     }
74     // END get modernStyle
75
76     // get freeMarking
77     b = scim_get_config(SCIM_IMENGINE_UNIKEY_FREEMARKING, G_TYPE_BOOLEAN, &t);
78     if (b == TRUE)
79     {
80         opt->freeMarking = t;
81     }
82     // END get freeMarking
83
84     // get enableMacro
85     b = scim_get_config(SCIM_IMENGINE_UNIKEY_MACROENABLED, G_TYPE_BOOLEAN, &t);
86     if (b == TRUE)
87     {
88         opt->enableMacro = t;
89     }
90     // END get enableMacro
91
92     // get ProcessWAtBegin
93     b = scim_get_config(SCIM_IMENGINE_UNIKEY_PROCESSWATWORDBEGIN, G_TYPE_BOOLEAN, &t);
94     if (b == TRUE)
95     {
96         opt->processwatbegin = t;
97     }
98     // END get ProcessWAtBegin
99 }
100
101 void write_config(UnikeyMainSetupOptions* opt)
102 {
103     scim_set_config(SCIM_IMENGINE_UNIKEY_INPUTMETHOD, G_TYPE_INT, &opt->input_method);
104     scim_set_config(SCIM_IMENGINE_UNIKEY_OUTPUTCHARSET, G_TYPE_INT, &opt->output_charset);
105     scim_set_config(SCIM_IMENGINE_UNIKEY_SPELLCHECKENABLED, G_TYPE_BOOLEAN, &opt->enableSpellcheck);
106     scim_set_config(SCIM_IMENGINE_UNIKEY_AUTONONVNRESTORE, G_TYPE_BOOLEAN, &opt->autoRestoreNonVn);
107     scim_set_config(SCIM_IMENGINE_UNIKEY_MODERNSTYLE, G_TYPE_BOOLEAN, &opt->modernStyle);
108     scim_set_config(SCIM_IMENGINE_UNIKEY_FREEMARKING, G_TYPE_BOOLEAN, &opt->freeMarking);
109     scim_set_config(SCIM_IMENGINE_UNIKEY_MACROENABLED, G_TYPE_BOOLEAN, &opt->enableMacro);
110     scim_set_config(SCIM_IMENGINE_UNIKEY_PROCESSWATWORDBEGIN, G_TYPE_BOOLEAN, &opt->processwatbegin);
111 }
112
113 int force_engine_to_reload_config()
114 {
115     return system("scim-config-agent --reload > /dev/null");
116 }
117
118 void scim_set_config(const gchar* key, GType t, gpointer data)
119 {
120     gchar** argv;
121     gchar s[1024];
122     gchar* output;
123
124     argv = (gchar**)g_malloc(sizeof(gchar*)*4);
125     argv[0] = (gchar*)"scim-config-agent";
126     argv[1] = (gchar*)"--set";
127     argv[3] = (gchar*)NULL;
128
129     strcpy(s, key);
130     strcat(s, "=");
131
132     switch (t)
133     {
134     case G_TYPE_BOOLEAN:
135         strcat(s, *(gboolean*)data?"true":"false");
136         break;
137     case G_TYPE_INT:
138         sprintf(s+strlen(s), "%d", *(gint*)data);
139         break;
140     case G_TYPE_STRING:
141         strcat(s, *(gchar**)data);
142         break;
143     }
144
145     argv[2] = (gchar*)s;
146
147     g_spawn_sync(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &output, NULL, NULL, NULL);
148     free(output);
149 }
150
151 gboolean scim_get_config(const gchar* key, GType t, gpointer data)
152 {
153     gchar** argv;
154     gchar* output;
155
156     argv = (gchar**)g_malloc(sizeof(gchar*)*4);
157     argv[0] = (gchar*)"scim-config-agent";
158     argv[1] = (gchar*)"--get";
159     argv[2] = (gchar*)key;
160     argv[3] = (gchar*)NULL;
161
162     g_spawn_sync(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &output, NULL, NULL, NULL);
163
164     free(argv);
165
166     output[strlen(output)-1] = 0;
167
168     if (strcmp(output, "Failed to get key value.") == 0)
169     {
170         free(output);
171         return FALSE;
172     }
173
174     gboolean* pb;
175     gint* pi;
176     gchar** pc;
177
178     switch(t)
179     {
180     case G_TYPE_BOOLEAN:
181         pb = (gboolean*)data;
182         if (strcmp(output, "true") == 0)
183             *pb = TRUE;
184         else if (strcmp(output, "false") == 0)
185             *pb = FALSE;
186         else
187         {
188             free(output);
189             return FALSE;
190         }
191         break;
192     case G_TYPE_INT:
193         pi = (gint*)data;
194         if (isalpha(output[0]))
195         {
196             free(output);
197             return FALSE;
198         }
199         else
200             *pi = atoi(output);
201         break;
202     case G_TYPE_STRING:
203         pc = (gchar**)data;
204         *pc = output;
205         return TRUE;
206     }
207
208     free(output);
209
210     return TRUE;
211 }
212