Modified source code to memory safe when return.
[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
7 #include <string.h>
8 #include <sys/types.h>
9 #include <sys/stat.h>
10 #include <fcntl.h>
11
12 #include <regex.h>
13
14 #include <dlog.h>
15 #include <vconf.h>
16
17 #include <glib.h>
18 #include <libxml/xmlmemory.h>
19 #include <libxml/parser.h>
20
21 #include <fontconfig/fontconfig.h>
22
23 #include <Elementary.h>
24 #include <Evas.h>
25 #include <Ecore_Evas.h>
26
27 #include <pkgmgr-info.h>
28
29 #include <system_settings.h>
30 #include <system_settings_private.h>
31
32 #include <tzplatform_config.h>
33 #include <system_settings_util.h>
34
35 #ifdef TIZEN_WEARABLE
36 #define SMALL_FONT_DPI                                          (-90)
37 #endif
38 #ifdef TIZEN_MOBILE
39 #define SMALL_FONT_DPI                                          (-80)
40 #endif
41 #define MIDDLE_FONT_DPI                                         (-100)
42 #ifdef TIZEN_WEARABLE
43 #define LARGE_FONT_DPI                                          (-110)
44 #endif
45 #ifdef TIZEN_MOBILE
46 #define LARGE_FONT_DPI                                          (-150)
47 #endif
48 #define HUGE_FONT_DPI                                           (-190)
49 #define GIANT_FONT_DPI                                          (-250)
50
51 #define SETTING_FONT_PRELOAD_FONT_PATH _TZ_SYS_RO_SHARE"/fonts"
52 #define SETTING_FONT_DOWNLOADED_FONT_PATH _TZ_SYS_SHARE"/fonts"
53
54 #define SETTING_FONT_CONF_FILE _TZ_SYS_ETC"/fonts/conf.avail/99-tizen.conf"
55
56 #define SETTING_FONT_TIZEN_FONT_ALIAS "Tizen"
57 #define SETTING_FONT_TIZEN_DEFAULT_FONT_ALIAS "TizenDefaultFont"
58
59 static int __font_size_get();
60
61 /* Returned family name should be free'd manually. */
62 char *__get_main_font_family_name_by_alias(char *alias)
63 {
64         SETTING_TRACE_BEGIN;
65         FcFontSet *set = NULL;
66         FcPattern *pat = NULL;
67         FcConfig *font_config = NULL;
68         FcChar8 *family = NULL;
69         char *ret = NULL;
70         FcResult res = 0;
71
72         font_config = FcInitLoadConfigAndFonts();
73         if (font_config == NULL)
74                 return ret;
75
76         pat = FcPatternBuild(0, FC_FAMILY, FcTypeString, alias, (char *)0);
77
78         if (pat == NULL) {
79                 if (font_config != NULL) {
80                         FcConfigDestroy(font_config);
81                         font_config = NULL;
82                 }
83                 return ret;
84         }
85
86         FcConfigSubstitute(font_config, pat, FcMatchPattern);
87         FcDefaultSubstitute(pat);
88
89         /* do matching */
90         set = FcFontSort(font_config, pat, FcTrue, NULL, &res);
91
92         if (set != NULL && (set->nfont > 0)) {
93                 FcPatternGetString(set->fonts[0], FC_FAMILY, 0, &family);
94                 ret = g_strdup((char *)family);
95
96                 FcFontSetDestroy(set);
97                 set = NULL;
98         }
99
100         if (set != NULL) {
101                 FcFontSetDestroy(set);
102                 set = NULL;
103         }
104
105         if (pat != NULL) {
106                 FcPatternDestroy(pat);
107                 pat = NULL;
108         }
109
110         if (font_config != NULL) {
111                 FcConfigDestroy(font_config);
112                 font_config = NULL;
113         }
114
115         return ret;
116 }
117
118 /*  LCOV_EXCL_START */
119 bool __is_supported_image_type_load(char *path)
120 {
121         SETTING_TRACE_BEGIN;
122         evas_init();
123         Ecore_Evas      *ee;
124         Evas            *evas;
125
126         ee = ecore_evas_new(NULL, 0, 0, 100, 100, NULL);
127         evas = ecore_evas_get(ee);
128
129         Evas_Object *img = evas_object_image_add(evas);
130         evas_object_image_file_set(img, path, NULL);
131         Evas_Load_Error ret = evas_object_image_load_error_get(img);
132
133         bool result = false;
134         if (ret == EVAS_LOAD_ERROR_NONE) {
135                 SETTING_TRACE("%s - OK", path);
136                 result = true;
137         } else {
138                 SETTING_TRACE("%s - NO", path);
139                 result = false;
140         }
141         ecore_evas_free(ee);
142         evas_shutdown();
143         return result;
144 }
145 /*  LCOV_EXCL_STOP */
146
147 char *_get_cur_font()
148 {
149         return __get_main_font_family_name_by_alias(SETTING_FONT_TIZEN_FONT_ALIAS);
150 }
151
152 /*  LCOV_EXCL_START */
153 void font_config_set_notification()
154 {
155         SETTING_TRACE_BEGIN;
156 #if 0
157         /* notification */
158         Ecore_X_Window ecore_win = ecore_x_window_root_first_get();
159         Ecore_X_Atom atom = ecore_x_atom_get("FONT_TYPE_change");
160         ecore_x_window_prop_string_set(ecore_win, atom, "tizen");
161 #endif
162 }
163 /*  LCOV_EXCL_STOP */
164
165 /*  LCOV_EXCL_START */
166 int __is_available_font(char *font_name)
167 {
168         SETTING_TRACE_BEGIN;
169         FcObjectSet *os = NULL;
170         FcFontSet *fs = NULL;
171         FcPattern *pat = NULL;
172         FcConfig *font_config = NULL;
173
174         int ret = 0;
175
176         if (font_name == NULL)
177                 return -1;
178
179         font_config = FcInitLoadConfigAndFonts();
180
181         /*setting_retvm_if(font_config == NULL, NULL, "Failed: FcInitLoadConfigAndFonts"); */
182
183         char *locale = setlocale(0, NULL);
184
185         pat = FcPatternCreate();
186
187         os = FcObjectSetBuild(FC_FAMILY, FC_FILE, FC_FAMILYLANG, (char *) 0);
188
189         if (os) {
190                 fs = FcFontList(font_config, pat, os);
191                 FcObjectSetDestroy(os);
192                 os = NULL;
193         }
194
195         if (pat) {
196                 FcPatternDestroy(pat);
197                 pat = NULL;
198         }
199
200         if (fs) {
201                 int j;
202                 SETTING_TRACE("fs->nfont = %d", fs->nfont);
203
204                 for (j = 0; j < fs->nfont; j++) {
205                         FcChar8 *family = NULL;
206                         FcChar8 *file = NULL;
207
208                         if (FcPatternGetString(fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch) {
209                                 int preload_path_len = strlen(SETTING_FONT_PRELOAD_FONT_PATH);
210                                 int download_path_len = strlen(SETTING_FONT_DOWNLOADED_FONT_PATH);
211
212                                 if (file && (!strncmp((const char *)file, SETTING_FONT_PRELOAD_FONT_PATH, preload_path_len)
213                                                 || !strncmp((const char *)file, SETTING_FONT_DOWNLOADED_FONT_PATH, download_path_len))) {
214                                         char *family_result = NULL;
215                                         FcChar8 *lang = NULL;
216                                         int id = 0;
217                                         if (FcPatternGetString(fs->fonts[j], FC_FAMILY, id, &family) != FcResultMatch) {
218                                                 break;
219                                         }
220                                         if (FcPatternGetString(fs->fonts[j], FC_FAMILYLANG, id, &lang) != FcResultMatch) {
221                                                 break;
222                                         }
223                                         family_result = (char *)family;
224
225                                         /* Find proper family name for current locale. */
226                                         while (locale && family && lang) {
227                                                 if (!strncmp(locale, (char *)lang, strlen((char *)lang))) {
228                                                         family_result = (char *)family;
229                                                         break;
230                                                 }
231
232                                                 /* I will set english as default family language. */
233                                                 /* If there is no proper family language for current locale, */
234                                                 /* we have to show the english family name. */
235                                                 if (!strcmp((char *)lang, (char *)"en")) {
236                                                         family_result = (char *)family;
237                                                 }
238                                                 id++;
239                                                 if (FcPatternGetString(fs->fonts[j], FC_FAMILY, id, &family) != FcResultMatch) {
240                                                         break;
241                                                 }
242                                                 if (FcPatternGetString(fs->fonts[j], FC_FAMILYLANG, id, &lang) != FcResultMatch) {
243                                                         break;
244                                                 }
245                                         }
246
247                                         if (family_result) {
248                                                 SETTING_TRACE("-------- FONT - family_result = %s", (char *)family_result);
249                                                 if (strcmp(family_result, font_name) == 0) {
250                                                         ret = 1;
251                                                         break;
252                                                 }
253                                         }
254                                 }
255                         }
256                 }
257                 FcFontSetDestroy(fs);
258                 fs = NULL;
259         }
260         FcConfigDestroy(font_config);
261         font_config = NULL;
262         return ret;
263 }
264 /*  LCOV_EXCL_STOP */
265
266
267 char *_get_default_font()
268 {
269         return __get_main_font_family_name_by_alias(SETTING_FONT_TIZEN_DEFAULT_FONT_ALIAS);
270 }
271
272 /*  LCOV_EXCL_START */
273 bool font_config_set(char *font_name)
274 {
275         SETTING_TRACE_BEGIN;
276         Eina_List *text_classes = NULL;
277         Elm_Text_Class *etc = NULL;
278         const Eina_List *l = NULL;
279         Eina_List *fo_list = NULL;
280         Elm_Font_Overlay *efo = NULL;
281
282         int font_size = __font_size_get();
283         int size = 0;
284
285         text_classes = elm_config_text_classes_list_get();
286
287         fo_list = (Eina_List *)elm_config_font_overlay_list_get();
288
289         Eina_List *ll = NULL;
290         Eina_List *l_next = NULL;
291
292         Eina_Bool slp_medium_exist = EINA_FALSE;
293         Eina_Bool slp_roman_exist = EINA_FALSE;
294         Eina_Bool slp_bold_exist = EINA_FALSE;
295         Eina_Bool slp_regular_exist = EINA_FALSE;
296
297         /* Tizen */
298         Eina_Bool tizen_exist = EINA_FALSE;
299
300         EINA_LIST_FOREACH_SAFE(fo_list, ll, l_next, efo) {
301                 if (!strcmp(efo->text_class, "tizen_medium")) {
302                         elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
303                         slp_medium_exist = EINA_TRUE;
304                 } else if (!strcmp(efo->text_class, "tizen_roman")) {
305                         elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
306                         slp_roman_exist = EINA_TRUE;
307                 } else if (!strcmp(efo->text_class, "tizen_bold")) {
308                         elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
309                         slp_bold_exist = EINA_TRUE;
310                 } else if (!strcmp(efo->text_class, "tizen_regular")) {
311                         elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
312                         slp_regular_exist = EINA_TRUE;
313                 }
314
315                 /* Tizen */
316                 if (!strcmp(efo->text_class, "tizen")) {
317                         elm_config_font_overlay_set(efo->text_class, (const char *)font_name, efo->size);
318                         tizen_exist = EINA_TRUE;
319                 }
320
321         }
322
323         /* if slp_XX do not exist, need to set them, font size is -100(100%) */
324         if (slp_medium_exist == EINA_FALSE) {
325                 elm_config_font_overlay_set("tizen_medium", (const char *)font_name,  MIDDLE_FONT_DPI);
326         }
327         if (slp_roman_exist == EINA_FALSE) {
328                 elm_config_font_overlay_set("tizen_roman", (const char *)font_name,      MIDDLE_FONT_DPI);
329         }
330         if (slp_bold_exist == EINA_FALSE) {
331                 elm_config_font_overlay_set("tizen_bold", (const char *)font_name,      MIDDLE_FONT_DPI);
332         }
333         if (slp_regular_exist == EINA_FALSE) {
334                 elm_config_font_overlay_set("tizen_regular", (const char *)font_name,  MIDDLE_FONT_DPI);
335         }
336
337         /* Tizen */
338         if (tizen_exist == EINA_FALSE) {
339                 elm_config_font_overlay_set("tizen", (const char *)font_name,  MIDDLE_FONT_DPI);
340         }
341
342         elm_config_font_overlay_set("tizen", (const char *)font_name,  MIDDLE_FONT_DPI);
343
344         /* Tizen */
345         elm_config_font_overlay_set("tizen", (const char *)font_name,  MIDDLE_FONT_DPI);
346
347         EINA_LIST_FOREACH(text_classes, l, etc) {
348                 ll = NULL;
349
350                 size = font_size;
351                 EINA_LIST_FOREACH(fo_list, ll, efo) {
352                         if (!strcmp(etc->name, efo->text_class)) {
353                                 size = efo->size;
354                         }
355                 }
356                 elm_config_font_overlay_set(etc->name, (const char *)font_name, size);
357         }
358         elm_config_text_classes_list_free(text_classes);
359         text_classes = NULL;
360
361         /* add new function */
362 #ifdef USE_EFL_ASSIST
363         ea_theme_system_font_set(font_name, font_size);
364         ea_theme_system_fonts_apply();
365 #endif
366
367         elm_config_font_overlay_apply();
368         elm_config_all_flush();
369         elm_config_save();
370         return 1;
371 }
372 /*  LCOV_EXCL_STOP */
373
374 /*  LCOV_EXCL_START */
375 void __font_size_set()
376 {
377         SETTING_TRACE_BEGIN;
378         Eina_List *text_classes = NULL;
379         Elm_Text_Class *etc = NULL;
380         const Eina_List *l = NULL;
381         int font_size = __font_size_get();
382         char *font_name = _get_cur_font();
383
384         if (font_size == -1) {
385                 return;
386         }
387
388         text_classes = elm_config_text_classes_list_get();
389
390         EINA_LIST_FOREACH(text_classes, l, etc) {
391                 elm_config_font_overlay_set(etc->name, font_name, font_size);
392         }
393
394         elm_config_text_classes_list_free(text_classes);
395
396 #ifdef USE_EFL_ASSIST
397         ea_theme_system_font_set(font_name, font_size);
398         ea_theme_system_fonts_apply();
399 #endif
400
401         elm_config_font_overlay_apply();
402         elm_config_all_flush();
403         elm_config_save();
404
405         text_classes = NULL;
406         g_free(font_name);
407 }
408 /*  LCOV_EXCL_STOP */
409
410 /*  LCOV_EXCL_START */
411 static int __font_size_get()
412 {
413         SETTING_TRACE_BEGIN;
414         int font_size = -1;
415
416         int vconf_value = -1;
417         if (vconf_get_int(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, &vconf_value)) {
418                 return -1;
419         }
420
421         switch (vconf_value) {
422         case SYSTEM_SETTINGS_FONT_SIZE_SMALL:
423                 font_size = SMALL_FONT_DPI;
424                 break;
425         case SYSTEM_SETTINGS_FONT_SIZE_NORMAL:
426                 font_size = MIDDLE_FONT_DPI;
427                 break;
428         case SYSTEM_SETTINGS_FONT_SIZE_LARGE:
429                 font_size = LARGE_FONT_DPI;
430                 break;
431         case SYSTEM_SETTINGS_FONT_SIZE_HUGE:
432                 font_size = HUGE_FONT_DPI;
433                 break;
434         case SYSTEM_SETTINGS_FONT_SIZE_GIANT:
435                 font_size = GIANT_FONT_DPI;
436                 break;
437         default:
438                 font_size = MIDDLE_FONT_DPI;
439                 break;
440         }
441         return font_size;
442 }
443 /*  LCOV_EXCL_STOP */