2 // Copyright (c) 2016 Samsung Electronics Co., Ltd.
4 // Licensed under the Apache License, Version 2.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
17 #include <app_manager.h>
21 #include <libxml/parser.h>
22 #include <libxml/tree.h>
23 #include <pkgmgr-info.h>
24 #include <pkgmgr_installer_info.h>
27 #include <sys/types.h>
29 #include <tzplatform_config.h>
30 #include <systemd/sd-login.h>
32 #include <gum/gum-user.h>
33 #include <gum/gum-user-service.h>
34 #include <gum/common/gum-user-types.h>
36 /* Define EXPORT_API */
38 #define EXPORT_API __attribute__((visibility("default")))
44 #define LOG_TAG "tts-engine-parser"
46 #define TTS_TAG_ENGINE_BASE "tts-engine"
47 #define TTS_TAG_ENGINE_NAME "name"
48 #define TTS_TAG_ENGINE_ID "id"
49 #define TTS_TAG_ENGINE_SETTING "setting"
50 #define TTS_TAG_ENGINE_VOICE_SET "voices"
51 #define TTS_TAG_ENGINE_VOICE "voice"
52 #define TTS_TAG_ENGINE_VOICE_TYPE "type"
53 #define TTS_TAG_ENGINE_PITCH_SUPPORT "pitch-support"
54 #define TTS_TAG_ENGINE_CREDENTIAL "credential"
56 #define TTS_CONFIG_BASE tzplatform_mkpath(TZ_USER_HOME, "share/.voice")
57 #define TTS_HOME tzplatform_mkpath(TZ_USER_HOME, "share/.voice/tts")
58 #define TTS_ENGINE_BASE tzplatform_mkpath(TZ_USER_HOME, "share/.voice/tts/1.0")
59 #define TTS_ENGINE_INFO tzplatform_mkpath(TZ_USER_SHARE, ".voice/tts/1.0/engine-info")
61 #define TTS_GLOBAL_CONFIG_BASE "/etc/skel/share/.voice"
62 #define TTS_GLOBAL_HOME "/etc/skel/share/.voice/tts"
63 #define TTS_GLOBAL_ENGINE_BASE "/etc/skel/share/.voice/tts/1.0"
64 #define TTS_GLOBAL_ENGINE_INFO "/etc/skel/share/.voice/tts/1.0/engine-info"
66 #define TTS_METADATA_NAME "http://tizen.org/metadata/tts-engine/name"
67 #define TTS_METADATA_LANGUAGE "http://tizen.org/metadata/tts-engine/language"
68 #define TTS_METADATA_CREDENTIAL_REQUIRED "http://tizen.org/metadata/tts-engine/credential-required"
69 #define TTS_METADATA_SETTING "http://tizen.org/metadata/tts-engine/setting"
71 typedef struct metadata {
76 static xmlDocPtr g_doc;
77 GumUser *g_guser = NULL;
78 uid_t g_uid = 301; // app_fw
79 gid_t g_gid = 301; // app_fw
80 GumUserType g_ut = GUM_USERTYPE_NONE;
81 gchar *g_user_type = NULL;
83 char *g_dir_config_base = NULL;
84 char *g_dir_home = NULL;
85 char *g_dir_engine_base = NULL;
86 char *g_dir_engine_info = NULL;
88 static int __create_engine_info_xml(const char *pkgid)
90 LOGD("=== Create engine info doc");
91 g_doc = xmlNewDoc((xmlChar*)"1.0");
93 LOGE("[ERROR] Fail to new doc");
100 static int __save_engine_info_xml(const char *pkgid, gchar *ut, uid_t uid, gid_t gid)
102 LOGD("=== Save engine info doc");
103 char *dir_config_base = NULL;
104 char *dir_home = NULL;
105 char *dir_engine_base = NULL;
106 char *dir_engine_info = NULL;
108 if (NULL == ut || (NULL != ut && 0 == strcmp(ut, "none"))) {
109 LOGE("[ERROR] Usertype is NONE");
113 uid_t globalapp_uid = tzplatform_getuid(TZ_SYS_GLOBALAPP_USER);
117 LOGD("uid(%d)", uid);
119 if (globalapp_uid == uid) {
121 dir_config_base = strdup(TTS_GLOBAL_CONFIG_BASE);
122 dir_home = strdup(TTS_GLOBAL_HOME);
123 dir_engine_base = strdup(TTS_GLOBAL_ENGINE_BASE);
124 dir_engine_info = strdup(TTS_GLOBAL_ENGINE_INFO);
125 tmp_uid = 301; // app_fw
126 tmp_gid = 301; // app_fw
128 /* User app, Guest app, Security app */
129 if (NULL != g_dir_config_base)
130 dir_config_base = strdup(g_dir_config_base);
131 if (NULL != g_dir_home)
132 dir_home = strdup(g_dir_home);
133 if (NULL != g_dir_engine_base)
134 dir_engine_base = strdup(g_dir_engine_base);
135 if (NULL != g_dir_engine_info)
136 dir_engine_info = strdup(g_dir_engine_info);
141 if (NULL == dir_config_base || NULL == dir_home || NULL == dir_engine_base || NULL == dir_engine_info) {
142 LOGE("[ERROR] Fail to allocate memory");
143 if (NULL != dir_config_base) {
144 free(dir_config_base);
145 dir_config_base = NULL;
147 if (NULL != dir_home) {
151 if (NULL != dir_engine_base) {
152 free(dir_engine_base);
153 dir_engine_base = NULL;
155 if (NULL != dir_engine_info) {
156 free(dir_engine_info);
157 dir_engine_info = NULL;
162 LOGD("[DEBUG] dir_engine_info(%s)", dir_engine_info);
165 /* Make directories */
166 // if (0 != access(dir_config_base, F_OK)) {
167 if (-1 == open(dir_config_base, O_DIRECTORY)) {
168 LOGE("[INFO] No directory : %s, errno : %d", dir_config_base, errno);
169 if (0 != mkdir(dir_config_base, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
170 LOGE("[ERROR] Fail to make directory : %s, errno : %d", dir_config_base, errno);
171 free(dir_config_base);
172 dir_config_base = NULL;
175 free(dir_engine_base);
176 dir_engine_base = NULL;
177 free(dir_engine_info);
178 dir_engine_info = NULL;
181 LOGD("Success to make directory : %s", dir_config_base);
182 if (0 != chown(dir_config_base, tmp_uid, tmp_gid)) {
183 LOGD("[ERROR] Fail to change user and group, errno : %d", errno);
185 LOGD("[DEBUG] Success to change user and group");
190 // if (0 != access(dir_home, F_OK)) {
191 if (-1 == open(dir_home, O_DIRECTORY)) {
192 LOGE("[INFO] No directory : %s, errno : %d", dir_home, errno);
193 if (0 != mkdir(dir_home, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
194 LOGE("[ERROR] Fail to make directory : %s, errno : %d", dir_home, errno);
195 free(dir_config_base);
196 dir_config_base = NULL;
199 free(dir_engine_base);
200 dir_engine_base = NULL;
201 free(dir_engine_info);
202 dir_engine_info = NULL;
205 LOGD("Success to make directory : %s", dir_home);
206 if (0 != chown(dir_home, tmp_uid, tmp_gid)) {
207 LOGD("[ERROR] Fail to change user and group, errno : %d", errno);
209 LOGD("[DEBUG] Success to change user and group");
214 // if (0 != access(dir_engine_base, F_OK)) {
215 if (-1 == open(dir_engine_base, O_DIRECTORY)) {
216 LOGE("[INFO] No directory : %s, errno : %d", dir_engine_base, errno);
217 if (0 != mkdir(dir_engine_base, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
218 LOGE("[ERROR] Fail to make directory : %s, errno : %d", dir_engine_base, errno);
219 free(dir_config_base);
220 dir_config_base = NULL;
223 free(dir_engine_base);
224 dir_engine_base = NULL;
225 free(dir_engine_info);
226 dir_engine_info = NULL;
229 LOGD("Success to make directory : %s", dir_engine_base);
230 if (0 != chown(dir_engine_base, tmp_uid, tmp_gid)) {
231 LOGD("[ERROR] Fail to change user and group, errno : %d", errno);
233 LOGD("[DEBUG] Success to change user and group");
238 // if (0 != access(dir_engine_info, F_OK)) {
239 if (-1 == open(dir_engine_info, O_DIRECTORY)) {
240 LOGE("[INFO] No directory : %s, errno : %d", dir_engine_info, errno);
241 if (0 != mkdir(dir_engine_info, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
242 LOGE("[ERROR] Fail to make directory : %s, errno : %d", dir_engine_info, errno);
243 free(dir_config_base);
244 dir_config_base = NULL;
247 free(dir_engine_base);
248 dir_engine_base = NULL;
249 free(dir_engine_info);
250 dir_engine_info = NULL;
253 LOGD("Success to make directory : %s", dir_engine_info);
254 if (0 != chown(dir_engine_info, tmp_uid, tmp_gid)) {
255 LOGD("[ERROR] Fail to change user and group, errno : %d", errno);
257 LOGD("[DEBUG] Success to change user and group");
263 char path[256] = {'\0',};
264 snprintf(path, 256, "%s/%s.xml", dir_engine_info, pkgid);
265 int ret = xmlSaveFormatFile(path, g_doc, 1);
266 LOGD("xmlSaveFile (%d)", ret);
268 if (0 != chown(path, tmp_uid, tmp_gid)) {
269 LOGD("[ERROR] Fail to change user and group");
271 LOGD("[DEBUG] Success to change user and group");
275 free(dir_config_base);
276 dir_config_base = NULL;
279 free(dir_engine_base);
280 dir_engine_base = NULL;
281 free(dir_engine_info);
282 dir_engine_info = NULL;
288 static int __remove_engine_info_xml(const char *pkgid, gchar *ut, uid_t uid)
290 LOGD("=== Remove engine info doc");
292 char *dir_engine_info = NULL;
294 if (NULL == ut || (NULL != ut && 0 == strcmp(ut, "none"))) {
295 LOGE("[ERROR] Usertype is NONE");
299 uid_t globalapp_uid = tzplatform_getuid(TZ_SYS_GLOBALAPP_USER);
301 LOGD("uid(%d)", uid);
303 if (globalapp_uid == uid) {
305 dir_engine_info = strdup(TTS_GLOBAL_ENGINE_INFO);
307 /* User app, Guest app, Security app */
308 if (NULL != g_dir_engine_info)
309 dir_engine_info = strdup(g_dir_engine_info);
312 if (NULL == dir_engine_info) {
313 LOGE("[ERROR] Fail to allocate memory");
317 LOGD("[DEBUG] dir_engine_info(%s)", dir_engine_info);
320 char path[256] = {'\0',};
321 snprintf(path, 256, "%s/%s.xml", dir_engine_info, pkgid);
322 if (0 == access(path, F_OK)) {
323 LOGD("Remove engine info xml(%s)", path);
324 if (0 != remove(path)) {
325 LOGE("[ERROR] Fail to Remove engine info xml(%s)", path);
329 free(dir_engine_info);
330 dir_engine_info = NULL;
336 static void __insert_language_from_metadata(xmlNodePtr root, const char *language)
338 LOGD("==== Insert language");
343 char *tmp_lang = NULL;
344 char *tmp_free = NULL;
345 tmp_free = tmp_lang = strdup(language);
346 if (NULL == tmp_lang) {
347 LOGE("Fail to memory allocation");
350 xmlNodePtr voices_node = NULL;
351 xmlNodePtr voice_node = NULL;
353 voices_node = xmlNewNode(NULL, (const xmlChar*)TTS_TAG_ENGINE_VOICE_SET);
355 voice = strsep(&tmp_lang, ",");
356 while (NULL != voice) {
357 LOGD("voice (%s)", voice);
358 voice_node = xmlNewNode(NULL, (const xmlChar*)TTS_TAG_ENGINE_VOICE);
359 lang = strsep(&voice, ":");
360 LOGD("lang (%s)", lang);
361 type = strsep(&voice, " ");
362 LOGD("type (%s)", type);
363 xmlSetProp(voice_node, (const xmlChar*)TTS_TAG_ENGINE_VOICE_TYPE, (const xmlChar*)type);
364 xmlNodeSetContent(voice_node, (const xmlChar*)lang);
365 xmlAddChild(voices_node, voice_node);
366 voice = strsep(&tmp_lang, ",");
368 xmlAddChild(root, voices_node);
374 static int __write_metadata_inxml(const char *pkgid, const char *appid, GList *list)
379 __create_engine_info_xml(pkgid);
381 xmlNodePtr root = NULL;
382 xmlNodePtr cur = NULL;
384 root = xmlNewNode(NULL, (const xmlChar*)TTS_TAG_ENGINE_BASE);
386 LOGE("[ERROR] Fail to get new node");
387 // xmlFreeDoc(g_doc);
390 xmlDocSetRootElement(g_doc, root);
393 // cur = xmlNewNode(NULL, (const xmlChar*)TTS_TAG_ENGINE_NAME);
394 // xmlNodeSetContent(cur, (const xmlChar*)pkgid);
395 // xmlAddChild(root, cur);
398 iter = g_list_first(list);
399 while (NULL != iter) {
400 md = (metadata *)iter->data;
401 if (NULL != md && NULL != md->key) {
402 LOGD(" - key(%s) value(%s)", md->key, md->value);
403 if (!strcmp(md->key, TTS_METADATA_LANGUAGE)) {
404 __insert_language_from_metadata(root, md->value);
405 } else if (!strcmp(md->key, TTS_METADATA_CREDENTIAL_REQUIRED)) {
406 cur = xmlNewNode(NULL, (const xmlChar*)TTS_TAG_ENGINE_CREDENTIAL);
407 xmlNodeSetContent(cur, (const xmlChar*)md->value);
408 xmlAddChild(root, cur);
409 } else if (!strcmp(md->key, TTS_METADATA_SETTING)) {
410 cur = xmlNewNode(NULL, (const xmlChar*)TTS_TAG_ENGINE_SETTING);
411 xmlNodeSetContent(cur, (const xmlChar*)md->value);
412 xmlAddChild(root, cur);
413 } else if (!strcmp(md->key, TTS_METADATA_NAME)) {
414 cur = xmlNewNode(NULL, (const xmlChar*)TTS_TAG_ENGINE_NAME);
415 xmlNodeSetContent(cur, (const xmlChar*)md->value);
416 xmlAddChild(root, cur);
418 LOGW("[WARNING] Unknown metadata type");
421 iter = g_list_next(iter);
424 cur = xmlNewNode(NULL, (const xmlChar*)TTS_TAG_ENGINE_ID);
425 xmlNodeSetContent(cur, (const xmlChar*)pkgid);
426 xmlAddChild(root, cur);
435 int PKGMGR_MDPARSER_PLUGIN_INSTALL(const char *pkgid, const char *appid, GList *list)
437 LOGD("METADATA INSTALL");
438 LOGD("pkgid(%s) appid(%s) list(%d)", pkgid, appid, g_list_length(list));
441 ret = pkgmgr_installer_info_get_target_uid(&g_uid);
443 LOGE("[ERROR] Fail to get target uid");
446 LOGD("uid(%d)", g_uid);
447 printf("[Parser Debug][DEBUG] uid(%d)", g_uid);
450 uid_t globalapp_uid = tzplatform_getuid(TZ_SYS_GLOBALAPP_USER);
451 if (globalapp_uid == g_uid) {
452 g_user_type = g_strdup("admin");
454 g_guser = gum_user_get_sync(g_uid, FALSE);
455 if (NULL == g_guser) {
456 LOGE("[ERROR] g_guser is NULL");
460 g_object_get(G_OBJECT(g_guser), "gid", &g_gid, NULL);
461 g_object_get(G_OBJECT(g_guser), "usertype", &g_ut, NULL);
462 g_user_type = g_strdup(gum_user_type_to_string(g_ut));
465 if (NULL == g_user_type) {
466 LOGE("[ERROR] Fail to allocate memory");
467 if (NULL != g_guser) {
468 g_object_unref(g_guser);
474 if (0 == strcmp(g_user_type, "none")) {
475 /* GUM_USERTYPE_NONE */
476 LOGE("[ERROR] Fail to get target uid");
477 g_object_unref(g_guser);
483 if (globalapp_uid == g_uid) {
484 /* global directory */
485 LOGD("[DEBUG] usertype: %s", g_user_type);
486 if (0 >= g_list_length(list)) {
487 LOGE("[ERROR] No Engine Metadata");
492 if (0 != __write_metadata_inxml(pkgid, appid, list)) {
493 LOGE("[ERROR] Fail to write metadata in the xml");
499 /* Save in /etc/skel/share/ */
500 g_dir_config_base = strdup(TTS_GLOBAL_CONFIG_BASE);
501 g_dir_home = strdup(TTS_GLOBAL_HOME);
502 g_dir_engine_base = strdup(TTS_GLOBAL_ENGINE_BASE);
503 g_dir_engine_info = strdup(TTS_GLOBAL_ENGINE_INFO);
505 if (NULL == g_dir_config_base || NULL == g_dir_home || NULL == g_dir_engine_base || NULL == g_dir_engine_info) {
506 LOGE("[ERROR] Fail to allocate memory");
507 if (NULL != g_dir_config_base) {
508 free(g_dir_config_base);
509 g_dir_config_base = NULL;
511 if (NULL != g_dir_home) {
515 if (NULL != g_dir_engine_base) {
516 free(g_dir_engine_base);
517 g_dir_engine_base = NULL;
519 if (NULL != g_dir_engine_info) {
520 free(g_dir_engine_info);
521 g_dir_engine_info = NULL;
528 if (0 != __save_engine_info_xml(pkgid, g_user_type, g_uid, g_gid)) {
529 LOGE("[ERROR] Fail to make engine info file");
535 /* Get user data by using libgum */
537 GumUserService *gus = NULL;
538 GumUserList *users = NULL;
539 GumUserList *iter = NULL;
540 GumUser *user = NULL;
542 GumUserType gumut = GUM_USERTYPE_NONE;
543 gchar *user_type = NULL;
547 gchar *home_dir = NULL;
549 gus = gum_user_service_create_sync(TRUE);
551 LOGE("Failed to create gum user service");
556 query = g_strsplit("admin,normal", ",", -1);
558 users = gum_user_service_get_user_list_sync(gus, (const gchar *const *)query);
562 LOGE("Failed to get gum user list");
569 /* Make new user list */
572 while (iter != NULL) {
573 user = (GumUser*) iter->data;
574 g_object_get(G_OBJECT(user), "uid", &uid, NULL);
575 if (NULL != home_dir) {
579 g_object_get(G_OBJECT(user), "gid", &gid, NULL);
580 g_object_get(G_OBJECT(user), "homedir", &home_dir, NULL);
581 g_object_get(G_OBJECT(user), "usertype", &gumut, NULL);
582 user_type = g_strdup(gum_user_type_to_string(gumut));
583 if (NULL == user_type) {
584 gum_user_service_list_free(users);
590 LOGD("[DEBUG] user info");
591 if (NULL != home_dir) {
592 LOGD("[DEBUG] uid(%d), gid(%d), user_type(%s), home_dir(%s)", uid, gid, user_type, home_dir);
594 g_dir_config_base = (char*)calloc(strlen(home_dir) + 14, sizeof(char));
595 g_dir_home = (char*)calloc(strlen(home_dir) + 18, sizeof(char));
596 g_dir_engine_base = (char*)calloc(strlen(home_dir) + 22, sizeof(char));
597 g_dir_engine_info = (char*)calloc(strlen(home_dir) + 34, sizeof(char));
599 if (NULL == g_dir_config_base || NULL == g_dir_home || NULL == g_dir_engine_base || NULL == g_dir_engine_info) {
600 LOGE("[ERROR] Fail to allocate memory");
601 if (NULL != g_dir_config_base) {
602 free(g_dir_config_base);
603 g_dir_config_base = NULL;
605 if (NULL != g_dir_home) {
609 if (NULL != g_dir_engine_base) {
610 free(g_dir_engine_base);
611 g_dir_engine_base = NULL;
613 if (NULL != g_dir_engine_info) {
614 free(g_dir_engine_info);
615 g_dir_engine_info = NULL;
617 gum_user_service_list_free(users);
622 snprintf(g_dir_config_base, strlen(home_dir) + 14, "%s/share/.voice", home_dir);
623 snprintf(g_dir_home, strlen(home_dir) + 18, "%s/share/.voice/tts", home_dir);
624 snprintf(g_dir_engine_base, strlen(home_dir) + 22, "%s/share/.voice/tts/1.0", home_dir);
625 snprintf(g_dir_engine_info, strlen(home_dir) + 34, "%s/share/.voice/tts/1.0/engine-info", home_dir);
627 LOGD("[DEBUG] g_dir_engine_info(%s)", g_dir_engine_info);
629 if (0 != __save_engine_info_xml(pkgid, user_type, uid, gid)) {
630 LOGE("[ERROR] Fail to make engine info file");
633 free(g_dir_config_base);
634 g_dir_config_base = NULL;
637 free(g_dir_engine_base);
638 g_dir_engine_base = NULL;
639 free(g_dir_engine_info);
640 g_dir_engine_info = NULL;
647 iter = g_list_next(iter);
649 iter = g_list_next(iter);
652 if (NULL != user_type) {
658 gum_user_service_list_free(users);
663 LOGD("[DEBUG] usertype: %s", g_user_type);
665 ret = tzplatform_set_user(g_uid);
667 LOGE("[ERROR] Invalid uid");
668 g_object_unref(g_guser);
673 LOGD("TZ_USER_HOME: %s", tzplatform_mkstr(TZ_USER_HOME, "/"));
674 printf("[Parser Debug][DEBUG] TZ_USER_HOME: %s", tzplatform_mkstr(TZ_USER_HOME, "/"));
677 if (0 >= g_list_length(list)) {
678 LOGE("[ERROR] No Engine Metadata");
679 g_object_unref(g_guser);
685 if (0 != __write_metadata_inxml(pkgid, appid, list)) {
686 LOGE("[ERROR] Fail to write metadata in the xml");
688 g_object_unref(g_guser);
694 g_dir_config_base = strdup(TTS_CONFIG_BASE);
695 g_dir_home = strdup(TTS_HOME);
696 g_dir_engine_base = strdup(TTS_ENGINE_BASE);
697 g_dir_engine_info = strdup(TTS_ENGINE_INFO);
699 if (NULL == g_dir_config_base || NULL == g_dir_home || NULL == g_dir_engine_base || NULL == g_dir_engine_info) {
700 LOGE("[ERROR] Fail to allocate memory");
701 if (NULL != g_dir_config_base) {
702 free(g_dir_config_base);
703 g_dir_config_base = NULL;
705 if (NULL != g_dir_home) {
709 if (NULL != g_dir_engine_base) {
710 free(g_dir_engine_base);
711 g_dir_engine_base = NULL;
713 if (NULL != g_dir_engine_info) {
714 free(g_dir_engine_info);
715 g_dir_engine_info = NULL;
718 g_object_unref(g_guser);
724 if (0 != __save_engine_info_xml(pkgid, g_user_type, g_uid, g_gid)) {
725 LOGE("[ERROR] Fail to make engine info file");
727 if (NULL != g_guser) {
728 g_object_unref(g_guser);
737 if (NULL != g_guser) {
738 g_object_unref(g_guser);
743 if (NULL != g_dir_config_base) {
744 free(g_dir_config_base);
745 g_dir_config_base = NULL;
747 if (NULL != g_dir_home) {
751 if (NULL != g_dir_engine_base) {
752 free(g_dir_engine_base);
753 g_dir_engine_base = NULL;
755 if (NULL != g_dir_engine_info) {
756 free(g_dir_engine_info);
757 g_dir_engine_info = NULL;
764 int PKGMGR_MDPARSER_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList *list)
766 LOGD("METADATA UNINSTALL");
767 LOGD("pkgid(%s) appid(%s) list(%d)", pkgid, appid, g_list_length(list));
770 ret = pkgmgr_installer_info_get_target_uid(&g_uid);
772 LOGE("[ERROR] Fail to get target uid");
775 LOGD("uid(%d)", g_uid);
776 printf("[Parser Debug][DEBUG] uid(%d)", g_uid);
779 uid_t globalapp_uid = tzplatform_getuid(TZ_SYS_GLOBALAPP_USER);
780 if (globalapp_uid == g_uid) {
781 g_user_type = g_strdup("admin");
783 g_guser = gum_user_get_sync(g_uid, FALSE);
784 if (NULL == g_guser) {
785 LOGE("[ERROR] g_guser is NULL");
789 g_object_get(G_OBJECT(g_guser), "usertype", &g_ut, NULL);
790 g_user_type = g_strdup(gum_user_type_to_string(g_ut));
793 if (NULL == g_user_type) {
794 LOGE("[ERROR] Fail to allocate memory");
795 if (NULL != g_guser) {
796 g_object_unref(g_guser);
802 if (0 == strcmp(g_user_type, "none")) {
803 /* GUM_USERTYPE_NONE */
804 LOGE("[ERROR] Fail to get target uid");
805 g_object_unref(g_guser);
811 if (globalapp_uid == g_uid) {
812 /* global directory */
813 LOGD("[DEBUG] usertype: %s", g_user_type);
815 /* Remove files in /etc/skel/share/ */
816 g_dir_engine_info = strdup(TTS_GLOBAL_ENGINE_INFO);
817 if (NULL == g_dir_engine_info) {
818 LOGE("[ERROR] Fail to allocate memory");
823 if (0 != __remove_engine_info_xml(pkgid, g_user_type, g_uid)) {
824 LOGE("[ERROR] Fail to remove engine info file");
827 /* Get user data by using libgum */
829 GumUserService *gus = NULL;
830 GumUserList *users = NULL;
831 GumUserList *iter = NULL;
832 GumUser *user = NULL;
834 GumUserType gumut = GUM_USERTYPE_NONE;
835 gchar *user_type = NULL;
838 gchar *home_dir = NULL;
840 GList *md_iter = NULL;
843 gus = gum_user_service_create_sync(TRUE);
845 LOGE("Failed to create gum user service");
850 query = g_strsplit("admin,normal", ",", -1);
852 users = gum_user_service_get_user_list_sync(gus, (const gchar *const *)query);
856 LOGE("Failed to get gum user list");
863 /* Make new user list */
866 while (iter != NULL) {
867 user = (GumUser*) iter->data;
868 g_object_get(G_OBJECT(user), "uid", &uid, NULL);
869 if (NULL != home_dir) {
873 g_object_get(G_OBJECT(user), "homedir", &home_dir, NULL);
874 g_object_get(G_OBJECT(user), "usertype", &gumut, NULL);
875 user_type = g_strdup(gum_user_type_to_string(gumut));
876 if (NULL == user_type) {
877 gum_user_service_list_free(users);
883 if (NULL != home_dir) {
884 g_dir_engine_info = (char*)calloc(strlen(home_dir) + 34, sizeof(char));
885 if (NULL == g_dir_engine_info) {
886 gum_user_service_list_free(users);
892 snprintf(g_dir_engine_info, strlen(home_dir) + 34, "%s/share/.voice/tts/1.0/engine-info", home_dir);
894 md_iter = g_list_first(list);
895 while (NULL != md_iter) {
896 md = (metadata *)md_iter->data;
897 LOGD(" - key(%s) value(%s)", md->key, md->value);
898 md_iter = g_list_next(md_iter);
901 if (0 != __remove_engine_info_xml(pkgid, user_type, uid)) {
902 LOGE("[ERROR] Fail to remove engine info file");
908 free(g_dir_engine_info);
909 g_dir_engine_info = NULL;
913 LOGD("Finish release memory");
914 iter = g_list_next(iter);
915 LOGD("Finish next iter");
917 iter = g_list_next(iter);
921 gum_user_service_list_free(users);
926 LOGD("[DEBUG] usertype: %s", g_user_type);
928 ret = tzplatform_set_user(g_uid);
930 LOGE("[ERROR] Invalid uid");
931 g_object_unref(g_guser);
936 LOGD("TZ_USER_HOME: %s", tzplatform_mkstr(TZ_USER_HOME, "/"));
937 printf("[Parser Debug][DEBUG] TZ_USER_HOME: %s", tzplatform_mkstr(TZ_USER_HOME, "/"));
940 g_dir_engine_info = strdup(TTS_ENGINE_INFO);
941 if (NULL == g_dir_engine_info) {
942 LOGE("[ERROR] Fail to allocate memory");
943 g_object_unref(g_guser);
949 if (0 != __remove_engine_info_xml(pkgid, g_user_type, g_uid)) {
950 LOGE("[ERROR] Fail to remove engine info file");
955 if (NULL != g_guser) {
956 g_object_unref(g_guser);
961 if (NULL != g_dir_engine_info) {
962 free(g_dir_engine_info);
963 g_dir_engine_info = NULL;
971 int PKGMGR_MDPARSER_PLUGIN_UPGRADE(const char *pkgid, const char *appid, GList *list)
973 LOGD("METADATA UPGRADE");
974 LOGD("pkgid(%s) appid(%s) list(%d)", pkgid, appid, g_list_length(list));
976 PKGMGR_MDPARSER_PLUGIN_UNINSTALL(pkgid, appid, list);
977 PKGMGR_MDPARSER_PLUGIN_INSTALL(pkgid, appid, list);