Fix memory leak and usage of json api
[platform/core/api/system-settings.git] / system-settings-util / src / system_settings_util.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <errno.h>
5 #include <time.h>
6 #include <locale.h>
7
8 #include <regex.h>
9
10 #include <dlog.h>
11 #include <vconf.h>
12
13 #include <glib.h>
14 #include <libxml/xmlmemory.h>
15 #include <libxml/parser.h>
16
17 #include <fontconfig/fontconfig.h>
18
19 #include <pkgmgr-info.h>
20
21 #include <system_settings.h>
22 #include <system_settings_private.h>
23
24 #include <tzplatform_config.h>
25 #include <system_settings_util.h>
26 #include <system_settings_font.h>
27
28 #ifdef TIZEN_WEARABLE
29 #define SMALL_FONT_DPI                                          (-90)
30 #endif
31 #ifdef TIZEN_MOBILE
32 #define SMALL_FONT_DPI                                          (-80)
33 #endif
34 #define MIDDLE_FONT_DPI                                         (-100)
35 #ifdef TIZEN_WEARABLE
36 #define LARGE_FONT_DPI                                          (-110)
37 #endif
38 #ifdef TIZEN_MOBILE
39 #define LARGE_FONT_DPI                                          (-150)
40 #endif
41 #define HUGE_FONT_DPI                                           (-190)
42 #define GIANT_FONT_DPI                                          (-250)
43
44 #define SETTING_FONT_PRELOAD_FONT_PATH _TZ_SYS_RO_SHARE"/fonts"
45 #define SETTING_FONT_DOWNLOADED_FONT_PATH _TZ_SYS_SHARE"/fonts"
46
47 #define SETTING_FONT_CONF_FILE _TZ_SYS_ETC"/fonts/conf.avail/99-tizen.conf"
48
49 #define SETTING_FONT_TIZEN_FONT_ALIAS "Tizen"
50 #define SETTING_FONT_TIZEN_DEFAULT_FONT_ALIAS "TizenDefaultFont"
51
52 #define SETTING_FONT_CONFIG_SO_PATH "/usr/lib/libfontconfig.so.1"
53 #define SETTING_ECORE_EVAS_SO_PATH "/usr/lib/libecore_evas.so.1"
54 #define SETTING_EFL_EXTENSION_SO_PATH "/usr/lib/libefl-extension.so.0"
55 #define SETTING_EVAS_SO_PATH "/usr/lib/libevas.so.1"
56
57 static int __font_size_get();
58
59 void *d_font_handle = NULL;
60 void *d_ecore_evas_handle = NULL;
61 void *d_evas_handle = NULL;
62 void *d_efl_eext_handle = NULL;
63
64
65
66 #define DYM_FUNC_LOADING(error, handle, pfunc, func_name) do { \
67         pfunc = (void*)dlsym(handle, func_name); \
68         if ((error = dlerror()) != NULL) { \
69                 SETTING_TRACE("ERROR!! canNOT find %s function at %s", func_name, #handle); \
70                 if (handle) \
71                 dlclose(handle); \
72                 return false; \
73         } \
74 } while (0)
75
76 #define DYM_CLOSE_HANDLE(handle) do { \
77         if (handle) { \
78                 dlclose(handle); \
79                 handle = NULL; \
80         } \
81 } while (0)
82
83 int loading_dym_font(f_libs *font_lib)
84 {
85         char *error = NULL;
86
87         if (!font_lib)
88                 return false;
89
90         if (!d_font_handle) {
91                 d_font_handle = dlopen(SETTING_FONT_CONFIG_SO_PATH,  RTLD_LAZY);
92                 if (!d_font_handle) {
93                         SETTING_TRACE("ERROR!! canNOT find "SETTING_FONT_CONFIG_SO_PATH);
94                         return false;
95                 }
96         }
97
98         DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcInitLoadConfigAndFonts, "FcInitLoadConfigAndFonts");
99         DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcPatternBuild, "FcPatternBuild");
100         DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcConfigDestroy, "FcConfigDestroy");
101         DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcConfigSubstitute, "FcConfigSubstitute");
102         DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcDefaultSubstitute, "FcDefaultSubstitute");
103         DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcFontSort, "FcFontSort");
104         DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcPatternGetString, "FcPatternGetString");
105         DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcFontSetDestroy, "FcFontSetDestroy");
106         DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcPatternDestroy, "FcPatternDestroy");
107         DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcPatternCreate, "FcPatternCreate");
108         DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcObjectSetBuild, "FcObjectSetBuild");
109         DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcFontList, "FcFontList");
110         DYM_FUNC_LOADING(error, d_font_handle, font_lib->d_FcObjectSetDestroy, "FcObjectSetDestroy");
111
112         return true;
113 }
114
115 int loading_dym_efl(e_libs *efl_libs)
116 {
117         char *error = NULL;
118
119         if (!efl_libs)
120                 return false;
121
122         if (!d_ecore_evas_handle) {
123                 d_ecore_evas_handle = dlopen(SETTING_ECORE_EVAS_SO_PATH,  RTLD_LAZY);
124                 if (!d_ecore_evas_handle) {
125                         SETTING_TRACE("ERROR!! canNOT find "SETTING_ECORE_EVAS_SO_PATH" %s", dlerror());
126
127                         return false;
128                 }
129         }
130
131         if (!d_evas_handle) {
132                 d_evas_handle = dlopen(SETTING_EVAS_SO_PATH,  RTLD_LAZY);
133                 if (!d_evas_handle) {
134                         SETTING_TRACE("ERROR!! canNOT find "SETTING_EVAS_SO_PATH" %s", dlerror());
135                         return false;
136                 }
137         }
138
139         DYM_FUNC_LOADING(error, d_evas_handle, efl_libs->d_evas_init, "evas_init");
140         DYM_FUNC_LOADING(error, d_evas_handle, efl_libs->d_evas_object_image_add, "evas_object_image_add");
141         DYM_FUNC_LOADING(error, d_evas_handle, efl_libs->d_evas_object_image_file_set, "evas_object_image_file_set");
142         DYM_FUNC_LOADING(error, d_evas_handle, efl_libs->d_evas_object_image_load_error_get, "evas_object_image_load_error_get");
143         DYM_FUNC_LOADING(error, d_evas_handle, efl_libs->d_evas_shutdown, "evas_shutdown");
144
145         DYM_FUNC_LOADING(error, d_ecore_evas_handle, efl_libs->d_ecore_evas_init, "ecore_evas_init");
146         DYM_FUNC_LOADING(error, d_ecore_evas_handle, efl_libs->d_ecore_evas_shutdown, "ecore_evas_shutdown");
147         DYM_FUNC_LOADING(error, d_ecore_evas_handle, efl_libs->d_ecore_evas_new, "ecore_evas_new");
148         DYM_FUNC_LOADING(error, d_ecore_evas_handle, efl_libs->d_ecore_evas_get, "ecore_evas_get");
149         DYM_FUNC_LOADING(error, d_ecore_evas_handle, efl_libs->d_ecore_evas_free, "ecore_evas_free");
150
151         return true;
152 }
153
154 void close_dym_efl()
155 {
156         DYM_CLOSE_HANDLE(d_evas_handle);
157         DYM_CLOSE_HANDLE(d_ecore_evas_handle);
158 }
159
160 int loading_dym_efl_eext(ex_libs *eext_libs)
161 {
162         char *error = NULL;
163
164         if (!eext_libs)
165                 return false;
166
167         if (!d_efl_eext_handle) {
168                 d_efl_eext_handle = dlopen(SETTING_EFL_EXTENSION_SO_PATH, RTLD_LAZY);
169                 if (!d_efl_eext_handle) {
170                         SETTING_TRACE("ERROR!! canNOT find "SETTING_EFL_EXTENSION_SO_PATH" %s", dlerror());
171                         return false;
172                 }
173         }
174
175         DYM_FUNC_LOADING(error, d_efl_eext_handle, eext_libs->d_eext_config_font_set, "eext_config_font_set");
176
177         return true;
178 }
179
180 /* Returned family name should be free'd manually. */
181 char *__get_main_font_family_name_by_alias(char *alias)
182 {
183         SETTING_TRACE_BEGIN;
184         FcFontSet *set = NULL;
185         FcPattern *pat = NULL;
186         FcConfig *font_config = NULL;
187         FcChar8 *family = NULL;
188         char *ret = NULL;
189         FcResult res = 0;
190         f_libs font_libs;
191
192         if (!loading_dym_font(&font_libs))
193                 return NULL;
194
195         font_config = font_libs.d_FcInitLoadConfigAndFonts();
196         if (font_config == NULL) {
197                 DYM_CLOSE_HANDLE(d_font_handle);
198                 return ret;
199         }
200
201         pat = font_libs.d_FcPatternBuild(0, FC_FAMILY, FcTypeString, alias, (char *)0);
202
203         if (pat == NULL) {
204                 if (font_config != NULL) {
205                         font_libs.d_FcConfigDestroy(font_config);
206                         font_config = NULL;
207                 }
208                 DYM_CLOSE_HANDLE(d_font_handle);
209                 return ret;
210         }
211
212         font_libs.d_FcConfigSubstitute(font_config, pat, FcMatchPattern);
213         font_libs.d_FcDefaultSubstitute(pat);
214
215         /* do matching */
216         set = font_libs.d_FcFontSort(font_config, pat, FcTrue, NULL, &res);
217
218         if (set != NULL && (set->nfont > 0)) {
219                 font_libs.d_FcPatternGetString(set->fonts[0], FC_FAMILY, 0, &family);
220                 ret = g_strdup((char *)family);
221
222                 font_libs.d_FcFontSetDestroy(set);
223                 set = NULL;
224         }
225
226         if (set != NULL) {
227                 font_libs.d_FcFontSetDestroy(set);
228                 set = NULL;
229         }
230
231         if (pat != NULL) {
232                 font_libs.d_FcPatternDestroy(pat);
233                 pat = NULL;
234         }
235
236         if (font_config != NULL) {
237                 font_libs.d_FcConfigDestroy(font_config);
238                 font_config = NULL;
239         }
240         DYM_CLOSE_HANDLE(d_font_handle);
241         return ret;
242 }
243
244 /*  LCOV_EXCL_START */
245 bool __is_supported_image_type_load(char *path)
246 {
247         SETTING_TRACE_BEGIN;
248         e_libs efl_libs;
249         if (!loading_dym_efl(&efl_libs)) {
250                 SETTING_TRACE("ERROR!! canNOT loading efl!!");
251                 return false;
252         }
253
254         void *ee;
255         void *evas;
256
257         if (!efl_libs.d_ecore_evas_init()) {
258                 close_dym_efl();
259                 return false;
260         }
261
262         ee = efl_libs.d_ecore_evas_new(NULL, 0, 0, 100, 100, NULL);
263         evas = efl_libs.d_ecore_evas_get(ee);
264
265         void *img = efl_libs.d_evas_object_image_add(evas);
266         efl_libs.d_evas_object_image_file_set(img, path, NULL);
267         int ret = efl_libs.d_evas_object_image_load_error_get(img);
268
269         bool result = false;
270         if (ret == 0) {
271                 SETTING_TRACE("%s - OK", path);
272                 result = true;
273         } else {
274                 SETTING_TRACE("%s - NO", path);
275                 result = false;
276         }
277         efl_libs.d_ecore_evas_free(ee);
278         efl_libs.d_ecore_evas_shutdown();
279         close_dym_efl();
280         return result;
281 }
282 /*  LCOV_EXCL_STOP */
283
284 /*  LCOV_EXCL_START */
285 void font_config_set_notification()
286 {
287         SETTING_TRACE_BEGIN;
288 }
289 /*  LCOV_EXCL_STOP */
290
291 /*  LCOV_EXCL_START */
292 int __is_available_font(char *font_name)
293 {
294         SETTING_TRACE_BEGIN;
295         FcObjectSet *os = NULL;
296         FcFontSet *fs = NULL;
297         FcPattern *pat = NULL;
298         FcConfig *font_config = NULL;
299         int ret = 0;
300         f_libs font_libs = {0};
301
302         if (!loading_dym_font(&font_libs))
303                 return -1;
304
305         if (font_name == NULL) {
306                 DYM_CLOSE_HANDLE(d_font_handle);
307                 return -1;
308         }
309
310         font_config = font_libs.d_FcInitLoadConfigAndFonts();
311
312         /*setting_retvm_if(font_config == NULL, NULL, "Failed: FcInitLoadConfigAndFonts"); */
313
314         char *locale = setlocale(0, NULL);
315
316         pat = font_libs.d_FcPatternCreate();
317
318         os = font_libs.d_FcObjectSetBuild(FC_FAMILY, FC_FILE, FC_FAMILYLANG, (char *) 0);
319
320         if (os) {
321                 fs = font_libs.d_FcFontList(font_config, pat, os);
322                 font_libs.d_FcObjectSetDestroy(os);
323                 os = NULL;
324         }
325
326         if (pat) {
327                 font_libs.d_FcPatternDestroy(pat);
328                 pat = NULL;
329         }
330
331         if (fs) {
332                 int j;
333                 SETTING_TRACE("fs->nfont = %d", fs->nfont);
334
335                 for (j = 0; j < fs->nfont; j++) {
336                         FcChar8 *family = NULL;
337                         FcChar8 *file = NULL;
338
339                         if (font_libs.d_FcPatternGetString(fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch) {
340                                 int preload_path_len = strlen(SETTING_FONT_PRELOAD_FONT_PATH);
341                                 int download_path_len = strlen(SETTING_FONT_DOWNLOADED_FONT_PATH);
342
343                                 if (file && (!strncmp((const char *)file, SETTING_FONT_PRELOAD_FONT_PATH, preload_path_len)
344                                                         || !strncmp((const char *)file, SETTING_FONT_DOWNLOADED_FONT_PATH, download_path_len))) {
345                                         char *family_result = NULL;
346                                         FcChar8 *lang = NULL;
347                                         int id = 0;
348                                         if (font_libs.d_FcPatternGetString(fs->fonts[j], FC_FAMILY, id, &family) != FcResultMatch) {
349                                                 break;
350                                         }
351                                         if (font_libs.d_FcPatternGetString(fs->fonts[j], FC_FAMILYLANG, id, &lang) != FcResultMatch) {
352                                                 break;
353                                         }
354                                         family_result = (char *)family;
355
356                                         /* Find proper family name for current locale. */
357                                         while (locale && family && lang) {
358                                                 if (!strncmp(locale, (char *)lang, strlen((char *)lang))) {
359                                                         family_result = (char *)family;
360                                                         break;
361                                                 }
362
363                                                 /* I will set english as default family language. */
364                                                 /* If there is no proper family language for current locale, */
365                                                 /* we have to show the english family name. */
366                                                 if (!strcmp((char *)lang, (char *)"en")) {
367                                                         family_result = (char *)family;
368                                                 }
369                                                 id++;
370                                                 if (font_libs.d_FcPatternGetString(fs->fonts[j], FC_FAMILY, id, &family) != FcResultMatch) {
371                                                         break;
372                                                 }
373                                                 if (font_libs.d_FcPatternGetString(fs->fonts[j], FC_FAMILYLANG, id, &lang) != FcResultMatch) {
374                                                         break;
375                                                 }
376                                         }
377
378                                         if (family_result) {
379                                                 SETTING_TRACE("-------- FONT - family_result = %s", (char *)family_result);
380                                                 if (strcmp(family_result, font_name) == 0) {
381                                                         ret = 1;
382                                                         break;
383                                                 }
384                                         }
385                                 }
386                         }
387                 }
388                 font_libs.d_FcFontSetDestroy(fs);
389                 fs = NULL;
390         }
391         font_libs.d_FcConfigDestroy(font_config);
392         font_config = NULL;
393         DYM_CLOSE_HANDLE(d_font_handle);
394         return ret;
395 }
396 /*  LCOV_EXCL_STOP */
397
398
399 char *_get_default_font()
400 {
401         return __get_main_font_family_name_by_alias(SETTING_FONT_TIZEN_DEFAULT_FONT_ALIAS);
402 }
403
404
405 /*  LCOV_EXCL_START */
406 bool font_config_set(char *font_name)
407 {
408         SETTING_TRACE_BEGIN;
409         ex_libs eext_libs;
410         if (!loading_dym_efl_eext(&eext_libs))
411                 return false;
412         int font_size = __font_size_get();
413         bool ret = eext_libs.d_eext_config_font_set(font_name, font_size);
414         DYM_CLOSE_HANDLE(d_efl_eext_handle);
415         return ret;
416 }
417 /*  LCOV_EXCL_STOP */
418
419 /*  LCOV_EXCL_START */
420 void __font_size_set()
421 {
422         SETTING_TRACE_BEGIN;
423         ex_libs eext_libs;
424         if (!loading_dym_efl_eext(&eext_libs))
425                 return;
426         int font_size = __font_size_get();
427         char *font_name = NULL;
428         font_name = vconf_get_str(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_NAME);
429
430         eext_libs.d_eext_config_font_set(font_name, font_size);
431
432         DYM_CLOSE_HANDLE(d_efl_eext_handle);
433         free(font_name);
434 }
435 /*  LCOV_EXCL_STOP */
436
437 /*  LCOV_EXCL_START */
438 static int __font_size_get()
439 {
440         SETTING_TRACE_BEGIN;
441         int font_size = -1;
442
443         int vconf_value = -1;
444         if (vconf_get_int(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, &vconf_value)) {
445                 return -1;
446         }
447
448         switch (vconf_value) {
449         case SYSTEM_SETTINGS_FONT_SIZE_SMALL:
450                 font_size = SMALL_FONT_DPI;
451                 break;
452         case SYSTEM_SETTINGS_FONT_SIZE_NORMAL:
453                 font_size = MIDDLE_FONT_DPI;
454                 break;
455         case SYSTEM_SETTINGS_FONT_SIZE_LARGE:
456                 font_size = LARGE_FONT_DPI;
457                 break;
458         case SYSTEM_SETTINGS_FONT_SIZE_HUGE:
459                 font_size = HUGE_FONT_DPI;
460                 break;
461         case SYSTEM_SETTINGS_FONT_SIZE_GIANT:
462                 font_size = GIANT_FONT_DPI;
463                 break;
464         default:
465                 font_size = MIDDLE_FONT_DPI;
466                 break;
467         }
468         return font_size;
469 }
470 /*  LCOV_EXCL_STOP */