Initialize Tizen 2.3
[apps/home/settings.git] / setting-font / src / setting-font-main.c
1 /*
2  * setting
3  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
4  *
5  * Licensed under the Flora License, Version 1.1 (the License);
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://floralicense.org/license/
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an AS IS BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 #include <setting-font-main.h>
18 #include <sysman.h>
19 #include <fontconfig/fontconfig.h>
20 #include <unicode/uloc.h>
21 #include <libxml/xmlmemory.h>
22 #include <libxml/parser.h>
23 #include <Ecore_X.h>
24 #include <system_settings.h>
25
26 #define SETTING_FONT_MAX_LEN 10
27 #define FONT_BUF_SIZE 256
28
29 static int setting_font_main_create(void *cb);
30 static int setting_font_main_destroy(void *cb);
31 static int setting_font_main_update(void *cb);
32 static int setting_font_main_cleanup(void *cb);
33
34 static void __setting_font_main_click_softkey_back_cb(void *data, Evas_Object *obj,
35                                         void *event_info);
36
37 setting_view setting_view_font_main = {
38         .create = setting_font_main_create,
39         .destroy = setting_font_main_destroy,
40         .update = setting_font_main_update,
41         .cleanup = setting_font_main_cleanup,
42 };
43
44
45 /**
46  * [API] font-size
47  */
48 static char* __setting_font_main_get_font_size(int value)
49 {
50         const char* font_size_arr[] = {
51                                         _("IDS_ST_BODY_SMALL_M_TEXTSIZE"), // 0
52                                         _("IDS_ST_BODY_NORMAL_T_PROFILE"), // 1
53                                         _("IDS_ST_BODY_TEXTSTYLE_LARGE"),  // 2
54                                         _("IDS_EMAIL_OPT_HUGE_M_TEXTSIZE"),                        // 3
55                                         _("IDS_EMAIL_POP_GIANT_M_TEXTSIZE"),                       // 4
56                                 };
57         switch (value)
58         {
59                 case SYSTEM_SETTINGS_FONT_SIZE_SMALL:
60                         return (char *)font_size_arr[0];
61                 case SYSTEM_SETTINGS_FONT_SIZE_NORMAL:
62                         return (char *)font_size_arr[1];
63                 case SYSTEM_SETTINGS_FONT_SIZE_LARGE:
64                         return (char *)font_size_arr[2];
65                 case SYSTEM_SETTINGS_FONT_SIZE_HUGE:
66                         return (char *)font_size_arr[3];
67                 case SYSTEM_SETTINGS_FONT_SIZE_GIANT:
68                         return (char *)font_size_arr[4];
69                 default:
70                         return (char *)font_size_arr[1];
71         }
72 }
73
74
75 /**
76  * [API] get a font list from current system
77  * REFACTORING: move this feature to system-settings
78  */
79 static Eina_List *__setting_font_main_available_list_get()
80 {
81         SETTING_TRACE_BEGIN
82         FcObjectSet *os = NULL;
83         FcFontSet *fs = NULL;
84         FcPattern *pat = NULL;
85         Eina_List *list = NULL;
86         FcConfig *font_config = NULL;
87
88         font_config = FcInitLoadConfigAndFonts();
89
90         setting_retvm_if(font_config == NULL, NULL, "Failed: FcInitLoadConfigAndFonts");
91
92         pat = FcPatternCreate();
93
94         os = FcObjectSetBuild(FC_FAMILY, FC_FILE, (char *) 0);
95
96         if (os) {
97                 fs = FcFontList(font_config, pat, os);
98                 FcObjectSetDestroy(os);
99                 os = NULL;
100         }
101
102         if (pat) {
103                 FcPatternDestroy(pat);
104                 pat = NULL;
105         }
106
107         if (fs) {
108                 int j;
109                 SETTING_TRACE_DEBUG("fs->nfont = %d", fs->nfont);
110
111                 for (j = 0; j < fs->nfont; j++) {
112                         FcChar8 *family = NULL;
113                         FcChar8 *file = NULL;
114
115                         if (FcPatternGetString(fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch) {
116                                 //SETTING_TRACE_DEBUG("FC_FILE : %s\n", file);
117                                 int preload_path_len = safeStrLen(SETTING_FONT_PRELOAD_FONT_PATH);
118                                 int download_path_len = safeStrLen(SETTING_FONT_DOWNLOADED_FONT_PATH);
119                                 if (!safeStrNCmp((const char*)file, SETTING_FONT_PRELOAD_FONT_PATH, preload_path_len) ||
120                                         !safeStrNCmp((const char*)file, SETTING_FONT_DOWNLOADED_FONT_PATH, download_path_len)) {
121                                         if (FcPatternGetString(fs->fonts[j], FC_FAMILY, 0, &family) != FcResultMatch) {
122                                                 SETTING_TRACE_DEBUG("Family name is invalid");
123                                                 continue;
124                                         }
125
126                                         //SETTING_TRACE_DEBUG("family = %s", (char *)family);
127                                         if (eina_list_data_find(list, family) == NULL) {
128                                                 list = eina_list_append(list, family);
129                                                 /* list = eina_list_append(list, family); */
130                                                 // for TEST because there's 1 font on target.
131                                         }
132                                 }
133                         }
134                 }
135                 FcFontSetDestroy(fs);
136                 fs = NULL;
137         }
138
139         FcConfigDestroy(font_config);
140         font_config = NULL;
141         return list;
142 }
143
144 static void __setting_font_main_genlist_sel_cb(void *data, Evas_Object * obj, void *event_info)
145 {
146         //error check
147         setting_retm_if(data == NULL, "Data parameter is NULL");
148
149         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
150         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
151         elm_genlist_item_selected_set(item, 0);
152         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *)elm_object_item_data_get(item);
153
154         SettingFontUG *ad = (SettingFontUG *)data;
155
156         if (ad->font_size == list_item) {
157                 setting_view_change(&setting_view_font_main, &setting_view_font_font_size, ad);
158         }
159 }
160
161
162 int get_font_name_str(char* font_type_name, char* trans_font_type_name, int bufsize)
163 {
164         if(safeStrCmp(font_type_name, "Choco cooky") == 0)
165                 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_CHOCO_COOKY"));
166         else if(safeStrCmp(font_type_name, "Cool jazz") == 0)
167                 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_COOL_JAZZ"));
168         else if (safeStrCmp(font_type_name, "HelveticaNeue") == 0)
169                 snprintf(trans_font_type_name, bufsize, "%s", _("IDS_ST_BODY_HELVETICA_NEUE_M_FONT_NAME"));
170         else
171                 snprintf(trans_font_type_name, bufsize, "%s", font_type_name);
172
173         return 1;
174 }
175
176 int get_font_name_tag(char* font_data, char* temp, int bufsize)
177 {
178         SETTING_TRACE("font data : %s", (char*)font_data);
179
180         char* pos = font_data;
181         char new_name[bufsize];
182         int i=0;
183         int count = 0;
184         while(*pos != '\0')
185         {
186                 SETTING_TRACE(">>>  %c", *pos);
187                 if (*pos == ' ')
188                 {
189                         SETTING_TRACE(">>>  empty ' ' ");
190                         new_name[count] = '\\';
191                         count++;
192                         new_name[count] = ' ';
193                 } else {
194                         new_name[count] = font_data[i];
195                 }
196
197                 count++;
198                 pos++;
199                 i++;
200         }
201         new_name[count] = '\0';
202
203         SETTING_TRACE(">>> new_name length : %d : string : %s", count, (char*)new_name);
204         snprintf(temp, bufsize, "<font=%s>%s</font>", new_name, font_data);
205         return 1;
206 }
207
208 static void __setting_font_main_genlist_item_create(void *data)
209 {
210         SETTING_TRACE_BEGIN;
211         setting_retm_if(NULL == data, "data is NULL");
212
213         SettingFontUG *ad = (SettingFontUG *)data;
214         Elm_Object_Item *item = NULL;
215
216         if (ad->viewmode == FONT_SIZE_AND_FONT_SEL_UG || ad->viewmode == FONT_SEL_VIEW_APPCONTROL)              // font type only
217         {
218                 // [UI] Font Type
219                 item = elm_genlist_item_append(ad->genlist, &(ad->itc_seperator), NULL, NULL,
220                                         ELM_GENLIST_ITEM_NONE, NULL, NULL);
221                 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
222
223                 char *font_type_name = NULL;
224             int ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_FONT_TYPE, &font_type_name);
225                 SETTING_TRACE("---------------- system-setting call : (%s) ", font_type_name);
226
227                 #if 0
228                 char trans_font_type_name[256] = {0,};
229                 if(safeStrCmp(font_type_name, "Choco cooky") == 0)
230                         snprintf(trans_font_type_name, 256, "%s", _("IDS_ST_BODY_CHOCO_COOKY"));
231                 else if(safeStrCmp(font_type_name, "Cool jazz") == 0)
232                         snprintf(trans_font_type_name, 256, "%s", _("IDS_ST_BODY_COOL_JAZZ"));
233                 else if (safeStrCmp(font_type_name, "HelveticaNeue") == 0)
234                         snprintf(trans_font_type_name, 256, "%s", _("IDS_ST_BODY_HELVETICA_NEUE_M_FONT_NAME"));
235                 else
236                         snprintf(trans_font_type_name, 256, "%s", font_type_name);
237                 #else
238                 char trans_font_type_name[FONT_BUF_SIZE] = {0,};
239                 ret = get_font_name_str(font_type_name, trans_font_type_name, FONT_BUF_SIZE);
240                 //SETTING_TRACE_DEBUG("font data : %s", (char*)font_data);
241                 #endif
242                 SETTING_TRACE_DEBUG("current font : %s, trans font name: %s", font_type_name, trans_font_type_name);
243
244                 ad->font_type = setting_create_Gendial_exp_parent_field(ad->genlist,
245                                                                 &(ad->itc_2text_3_parent),
246                                                                 NULL, NULL,
247                                                                 SWALLOW_Type_INVALID,
248                                                                 SETTING_FONT_TYPE_STR,
249                                                                 trans_font_type_name);
250                 if (ad->font_type) {
251                         ad->font_type->userdata = ad;
252                 } else {
253                         SETTING_TRACE_ERROR("ad->font_type is NULL");
254                 }
255                 G_FREE(ad->font_name);
256                 ad->font_name = g_strdup(font_type_name);
257                 G_FREE(font_type_name);
258         }
259
260         if (ad->viewmode == FONT_SIZE_AND_FONT_SEL_UG || ad->viewmode == FONT_SIZE_VIEW_APPCONTROL)             // font size only
261         {
262                 int err = -1;
263                 // [UI] Font Size
264                 int ret = setting_get_int_slp_key(INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE, &ad->ret_font_size, &err);
265                 if (ret != 0) {
266                         SETTING_TRACE_ERROR("get vconf failed");
267                 }
268
269                 ad->font_size = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_2),
270                                         __setting_font_main_genlist_sel_cb,
271                                         ad, SWALLOW_Type_INVALID, NULL,
272                                         NULL, ad->ret_font_size, SETTING_FONT_SIZE_STR,
273                                         __setting_font_main_get_font_size(ad->ret_font_size), NULL);
274                 if (ad->font_size) {
275                         ad->font_size->userdata = ad;
276                 } else {
277                         SETTING_TRACE_ERROR("ad->font_size is NULL");
278                 }
279
280 #if DISABlED_CODE
281         setting_create_Gendial_field_def(ad->genlist, &(ad->itc_bg_1icon), NULL,
282                                          ad, SWALLOW_Type_LAYOUT_SPECIALIZTION_X,
283                                          NULL, NULL, 0, SETTING_FONT_SIZE_DESC, NULL,
284                                          NULL);
285 #endif
286         }
287 }
288
289
290 /**
291  * [API] set current font
292  * font change
293  */
294 static void __setting_font_main_font_set(char *font_name)
295 {
296         retm_if(font_name == NULL, "Invalid argument: font_name is NULL");
297     int ret;
298     ret = system_settings_set_value_string(SYSTEM_SETTINGS_KEY_FONT_TYPE, font_name);
299
300 }
301
302 static void __setting_font_main_popup_cb(void *data, Evas_Object *obj, void *event_info)
303 {
304         SETTING_TRACE_BEGIN;
305         setting_retm_if(data == NULL, "Data parameter is NULL");
306         SettingFontUG *ad = (SettingFontUG *) data;
307
308         switch (btn_type(obj)) {
309         case POPUP_RESPONSE_OK:
310                 {
311                         /* extract font name from tag mixed string */
312                         SETTING_TRACE("??? --> popup - get FONT : %s ", ad->subitem->keyStr);
313
314                         SETTING_TRACE("sub_desc --> popup - get FONT : %s ", ad->subitem->sub_desc);
315
316                         char *temp = NULL;
317                         temp = strchr(ad->subitem->keyStr, '>');
318                         temp += 1;
319                         char *last = NULL;
320                         last = strrchr(temp, '<');
321
322                         #if 0
323                         char font_name[64] = {0,};
324                         safeCopyStr(font_name, temp, (int)(last-temp));
325                         #else
326                         // sub - descc
327                         char *font_name = g_strdup(ad->subitem->sub_desc);
328                         #endif
329                         /* set font name to font main and font config */
330                         ad->font_type->sub_desc = (char *)g_strdup(_(font_name));
331                         elm_object_item_data_set(ad->font_type->item, ad->font_type);
332                         elm_genlist_item_update(ad->font_type->item);
333
334                         ad->prev_font = ad->subitem->chk_status;
335                         G_FREE(ad->font_name);
336                         ad->font_name = (char *)g_strdup(_(font_name));
337                         SETTING_TRACE("ad->subitem->keyStr = %s", font_name);
338
339                         __setting_font_main_font_set(font_name);
340                         ug_destroy_me(ad->ug);
341                         break;
342                 }
343         case POPUP_RESPONSE_CANCEL:
344                 {
345                         elm_radio_value_set(ad->subitem->rgd, ad->prev_font);
346
347                         break;
348                 }
349         default:
350                 {
351                         break;
352                 }
353         }
354
355         if (ad->popup) {
356                 evas_object_del(ad->popup);
357                 ad->popup = NULL;
358         }
359 }
360
361 static void __setting_font_main_popup(void *data)
362 {
363         SETTING_TRACE_BEGIN;
364         setting_retm_if(data == NULL, "Data parameter is NULL");
365         SettingFontUG *ad = (SettingFontUG *) data;
366
367         char popup_desc[SETTING_STR_SLP_LEN + 1] = {0,};
368         snprintf(popup_desc, SETTING_STR_SLP_LEN, "%s %s?", _(SETTING_FONT_POPUP_DESC), ad->subitem->keyStr);
369
370         ad->popup = setting_create_popup_with_btn(ad, ad->win_get, NULL,
371                                          popup_desc,
372                                          __setting_font_main_popup_cb, 0,
373                                          2, _("IDS_COM_SK_YES"),_("IDS_COM_SK_NO"));
374 }
375
376
377 /**
378  * [UI][expandable list][event handler:selection][font change]
379  */
380 void __setting_font_main_sub_list_sel_cb(void *data, Evas_Object *obj, void *event_info)
381 {
382         SETTING_TRACE_BEGIN;
383         /* error check */
384         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
385         Elm_Object_Item *subitem = (Elm_Object_Item *) event_info;
386         elm_genlist_item_selected_set(subitem, 0);
387         Setting_GenGroupItem_Data *data_subItem = elm_object_item_data_get(subitem);
388         ret_if(NULL == data_subItem);
389
390         SettingFontUG *ad = (SettingFontUG *) data;
391
392         /*  if not change, return */
393         if (ad->prev_font == data_subItem->chk_status) {
394                 SETTING_TRACE("NOT CHANGED ");
395                 return;
396         }
397
398         ad->subitem = data_subItem;
399         elm_radio_value_set(ad->subitem->rgd, ad->subitem->chk_status);
400
401         __setting_font_main_popup(ad);
402 }
403
404 static void __setting_font_main_exp_cb(void *data, Evas_Object *obj, void *event_info)
405 {
406         ret_if(NULL == data || NULL == event_info);
407         SETTING_TRACE_BEGIN;
408         SettingFontUG *ad = (SettingFontUG *) data;
409         Elm_Object_Item *parentItem = event_info;       /* parent item */
410         Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem);      /* parent data */
411         Evas_Object *scroller = elm_object_item_widget_get(parentItem);
412
413         Evas_Object *rgd = NULL;
414         if (data_parentItem == ad->font_type) {
415                 rgd = elm_radio_add(scroller);
416                 elm_radio_value_set(rgd, -1);
417
418                 Eina_List *font_list = NULL;
419                 Eina_List *l = NULL;
420                 FcChar8 *font_data = NULL;
421                 font_list = __setting_font_main_available_list_get();
422
423                 int i = 0;
424                 int matched_font = -1;
425                 Setting_GenGroupItem_Data *item = NULL;
426                 EINA_LIST_FOREACH(font_list, l, font_data)
427                 {
428                         char temp[FONT_BUF_SIZE] = {0,};
429                         int ret = get_font_name_tag(font_data, temp, FONT_BUF_SIZE);
430                         SETTING_TRACE_DEBUG("font data : %s", (char*)font_data);
431
432                         item = setting_create_Gendial_exp_sub_field(scroller, &(ad->itc_1text_1icon_2),
433                                                      __setting_font_main_sub_list_sel_cb, ad,
434                                                      parentItem, SWALLOW_Type_1RADIO, rgd,
435                                                      i, temp,
436                                                      NULL);
437
438                         if (item) {
439                                 item->userdata = ad;
440                                 //item->sub_desc = font_data;
441                                 item->sub_desc = strdup(font_data);
442                                 //if (!safeStrCmp(ad->font_name, (const char*)font_data)) {
443                                 if (!safeStrCmp(ad->font_name, (const char*)item->sub_desc)) {
444                                         matched_font = i;
445                                 }
446                         }
447
448                         i++;
449                 }
450
451                 /* update check status */
452                 if (matched_font != -1) {
453                         elm_radio_value_set(rgd, matched_font);
454                 }
455
456                 ad->prev_font = matched_font;
457         }
458 }
459
460
461 /* ***************************************************
462  *
463  *basic func
464  *
465  ***************************************************/
466 static int setting_font_main_create(void *cb)
467 {
468         SETTING_TRACE_BEGIN;
469         /* error check */
470         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
471
472         SettingFontUG *ad = (SettingFontUG *) cb;
473
474         retvm_if(ad->win_main_layout == NULL, SETTING_DRAW_ERR_FAIL_LOAD_EDJ,
475                  "win_main_layout is NULL");
476
477         ad->ly_main =
478             setting_create_layout_navi_bar_genlist(ad->win_main_layout,
479                                                    ad->win_get,
480                                                    _(KeyStr_Font),
481                                                    _("IDS_COM_BODY_BACK"),
482                                                    NULL,
483                                                    __setting_font_main_click_softkey_back_cb,
484                                                    NULL,
485                                                    ad, &ad->genlist, &ad->navibar);
486
487         setting_enable_expandable_genlist(ad->genlist, ad, __setting_font_main_exp_cb, NULL);
488
489         __setting_font_main_genlist_item_create(ad);
490
491         setting_view_font_main.is_create = 1;
492         return SETTING_RETURN_SUCCESS;
493 }
494
495 static int setting_font_main_destroy(void *cb)
496 {
497         SETTING_TRACE_BEGIN;
498         /* error check */
499         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
500
501         SettingFontUG *ad = (SettingFontUG *) cb;
502
503         if(ad->font_name)
504         {
505                 G_FREE(ad->font_name);
506                 ad->font_name = NULL;
507         }
508
509         if (ad->popup) {
510                 evas_object_del(ad->popup);
511                 ad->popup = NULL;
512         }
513
514         if (ad->ly_main != NULL) {
515                 evas_object_del(ad->ly_main);
516                 ad->ly_main = NULL;
517         }
518
519         setting_view_font_main.is_create = 0;
520         SETTING_TRACE_END;
521         return SETTING_RETURN_SUCCESS;
522 }
523
524 static int setting_font_main_update(void *cb)
525 {
526         SETTING_TRACE_BEGIN;
527         /* error check */
528         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
529
530         SettingFontUG *ad = (SettingFontUG *) cb;
531
532         if (ad->ly_main != NULL) {
533                 evas_object_show(ad->ly_main);
534
535                 int value = -1;
536                 int err = -1;
537                 int ret = setting_get_int_slp_key(INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE, &value, &err);
538                 if (ret != 0) {
539                         SETTING_TRACE_ERROR("get vconf failed");
540                 }
541
542                 if (ad->font_size) {
543                         G_FREE(ad->font_size->sub_desc);
544                         ad->font_size->sub_desc = (char *)g_strdup(__setting_font_main_get_font_size(value));
545                         elm_object_item_data_set(ad->font_size->item, ad->font_size);
546                         elm_genlist_item_update(ad->font_size->item);
547                 }
548
549                 setting_font_update_vconf_key(ad, SETTING_VCONF_INT_TYPE,
550                                               INT_SLP_SETTING_LCD_TIMEOUT_NORMAL);
551         }
552
553         return SETTING_RETURN_SUCCESS;
554 }
555
556 static int setting_font_main_cleanup(void *cb)
557 {
558         /* error check */
559         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
560
561         SettingFontUG *ad = (SettingFontUG *) cb;
562
563         if (ad->ly_main != NULL) {
564                 evas_object_hide(ad->ly_main);
565         }
566
567         return SETTING_RETURN_SUCCESS;
568 }
569
570 /* ***************************************************
571  *
572  *call back func
573  *
574  ***************************************************/
575
576 static void __setting_font_main_click_softkey_back_cb(void *data, Evas_Object *obj,
577                                         void *event_info)
578 {
579         SETTING_TRACE_BEGIN;
580         /* error check */
581         ret_if(data == NULL);
582
583         SettingFontUG *ad = (SettingFontUG *) data;
584
585         if (ad->viewmode == FONT_SEL_VIEW_APPCONTROL)
586         {
587                 service_h svc;
588                 if (service_create(&svc))
589                         return;
590
591                 service_add_extra_data(svc, "category", "FontType");
592                 service_add_extra_data(svc, "FontType", ad->font_name);
593
594                 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s","category", "FontType");
595                 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s","FontType", ad->font_name);
596
597
598                 ug_send_result(ad->ug, svc);
599                 service_destroy(svc);
600         }
601         else if (ad->viewmode == FONT_SIZE_VIEW_APPCONTROL)
602         {
603                 service_h svc;
604
605                 int err;
606                 int ret = setting_set_int_slp_key(INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE, ad->ret_font_size, &err);
607                 setting_retm_if(ret == -1, "Failed to set vconf");
608
609                 if (service_create(&svc))
610                         return;
611
612                 char font_size[SETTING_FONT_MAX_LEN] = {0,};
613                 snprintf(font_size, SETTING_FONT_MAX_LEN, "%d", ad->ret_font_size);
614
615                 service_add_extra_data(svc, "category", "FontSize");
616                 service_add_extra_data(svc, "FontSize", font_size);
617
618                 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s","category", "FontSize");
619                 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s","FontSize", font_size);
620
621
622                 ug_send_result(ad->ug, svc);
623                 service_destroy(svc);
624         }
625         /* Send destroy request */
626         ug_destroy_me(ad->ug);
627 }