6dbc3d0e167fff52fb57bcc0abe25c833772028e
[platform/core/appfw/pkgmgr-info.git] / parser / pkgmgr_parser.c
1 /*
2  * pkgmgr-info
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
7  * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  * http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  */
22 #define _GNU_SOURCE
23 #include <dlfcn.h>
24 #include <string.h>
25 #include <errno.h>
26 #include <fcntl.h>
27 #include <unistd.h>
28 #include <ctype.h>
29 #include <time.h>
30 #include <string.h>
31 #include <libxml/parser.h>
32 #include <libxml/xmlreader.h>
33 #include <libxml/xmlschemas.h>
34 #include <vconf.h>
35 #include <glib.h>
36 #include <grp.h>
37
38 #include "pkgmgr_parser.h"
39 #include "pkgmgr_parser_internal.h"
40 #include "pkgmgr_parser_db.h"
41 #include "pkgmgr-info.h"
42 #include "pkgmgr_parser_signature.h"
43 #include "pkgmgr-info-debug.h"
44
45 #ifdef LOG_TAG
46 #undef LOG_TAG
47 #endif
48 #define LOG_TAG "PKGMGR_PARSER"
49
50 #define ASCII(s) (const char *)s
51 #define XMLCHAR(s) (const xmlChar *)s
52
53 //#define METADATA_PARSER_LIST SYSCONFDIR "/package-manager/parserlib/metadata/metadata_parser_list.txt"
54 #define METADATA_PARSER_LIST SYSCONFDIR "/package-manager/parserlib/metadata/mdparser_list.txt"
55 #define METADATA_PARSER_NAME    "metadataparser:"
56
57 #define CATEGORY_PARSER_LIST SYSCONFDIR "/package-manager/parserlib/category/category_parser_list.txt"
58 #define CATEGORY_PARSER_NAME    "categoryparser:"
59
60 #define TAG_PARSER_LIST SYSCONFDIR "/package-manager/parserlib/tag_parser_list.txt"
61 #define TAG_PARSER_NAME "parserlib:"
62
63 #define PKG_TAG_LEN_MAX 128
64 #define OWNER_ROOT 0
65 #define BUFSIZE 4096
66 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
67
68 /* operation_type */
69 typedef enum {
70         ACTION_INSTALL = 0,
71         ACTION_UPGRADE,
72         ACTION_UNINSTALL,
73         ACTION_FOTA,
74         ACTION_MAX
75 } ACTION_TYPE;
76
77 /* plugin process_type */
78 typedef enum {
79         PLUGIN_PRE_PROCESS = 0,
80         PLUGIN_POST_PROCESS
81 } PLUGIN_PROCESS_TYPE;
82
83 typedef struct {
84         const char *key;
85         const char *value;
86 } __metadata_t;
87
88 typedef struct {
89         const char *name;
90 } __category_t;
91
92 const char *package;
93
94 static int __ps_process_label(xmlTextReaderPtr reader, label_x *label);
95 static int __ps_process_privilege(xmlTextReaderPtr reader, privilege_x *privilege);
96 static int __ps_process_privileges(xmlTextReaderPtr reader, privileges_x *privileges);
97 static int __ps_process_deviceprofile(xmlTextReaderPtr reader, deviceprofile_x *deviceprofile);
98 static int __ps_process_allowed(xmlTextReaderPtr reader, allowed_x *allowed);
99 static int __ps_process_operation(xmlTextReaderPtr reader, operation_x *operation);
100 static int __ps_process_uri(xmlTextReaderPtr reader, uri_x *uri);
101 static int __ps_process_mime(xmlTextReaderPtr reader, mime_x *mime);
102 static int __ps_process_subapp(xmlTextReaderPtr reader, subapp_x *subapp);
103 static int __ps_process_condition(xmlTextReaderPtr reader, condition_x *condition);
104 static int __ps_process_notification(xmlTextReaderPtr reader, notification_x *notifiation);
105 static int __ps_process_category(xmlTextReaderPtr reader, category_x *category);
106 static int __ps_process_metadata(xmlTextReaderPtr reader, metadata_x *metadata);
107 static int __ps_process_permission(xmlTextReaderPtr reader, permission_x *permission);
108 static int __ps_process_compatibility(xmlTextReaderPtr reader, compatibility_x *compatibility);
109 static int __ps_process_resolution(xmlTextReaderPtr reader, resolution_x *resolution);
110 static int __ps_process_request(xmlTextReaderPtr reader, request_x *request);
111 static int __ps_process_define(xmlTextReaderPtr reader, define_x *define);
112 static int __ps_process_appsvc(xmlTextReaderPtr reader, appsvc_x *appsvc);
113 static int __ps_process_launchconditions(xmlTextReaderPtr reader, launchconditions_x *launchconditions);
114 static int __ps_process_datashare(xmlTextReaderPtr reader, datashare_x *datashare);
115 static int __ps_process_icon(xmlTextReaderPtr reader, icon_x *icon, uid_t uid);
116 static int __ps_process_author(xmlTextReaderPtr reader, author_x *author);
117 static int __ps_process_description(xmlTextReaderPtr reader, description_x *description);
118 static int __ps_process_capability(xmlTextReaderPtr reader, capability_x *capability);
119 static int __ps_process_license(xmlTextReaderPtr reader, license_x *license);
120 static int __ps_process_appcontrol(xmlTextReaderPtr reader, appcontrol_x *appcontrol);
121 static int __ps_process_datacontrol(xmlTextReaderPtr reader, datacontrol_x *datacontrol);
122 static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x *uiapplication, uid_t uid);
123 static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceapplication_x *serviceapplication, uid_t uid);
124 static int __ps_process_font(xmlTextReaderPtr reader, font_x *font);
125 static int __ps_process_theme(xmlTextReaderPtr reader, theme_x *theme);
126 static int __ps_process_daemon(xmlTextReaderPtr reader, daemon_x *daemon);
127 static int __ps_process_ime(xmlTextReaderPtr reader, ime_x *ime);
128 static void __ps_free_label(label_x *label);
129 static void __ps_free_privilege(privilege_x *privilege);
130 static void __ps_free_privileges(privileges_x *privileges);
131 static void __ps_free_deviceprofile(deviceprofile_x * deviceprofile);
132 static void __ps_free_allowed(allowed_x *allowed);
133 static void __ps_free_operation(operation_x *operation);
134 static void __ps_free_uri(uri_x *uri);
135 static void __ps_free_mime(mime_x *mime);
136 static void __ps_free_subapp(subapp_x *subapp);
137 static void __ps_free_condition(condition_x *condition);
138 static void __ps_free_notification(notification_x *notifiation);
139 static void __ps_free_category(category_x *category);
140 static void __ps_free_metadata(metadata_x *metadata);
141 static void __ps_free_permission(permission_x *permission);
142 static void __ps_free_compatibility(compatibility_x *compatibility);
143 static void __ps_free_resolution(resolution_x *resolution);
144 static void __ps_free_request(request_x *request);
145 static void __ps_free_define(define_x *define);
146 static void __ps_free_appsvc(appsvc_x *appsvc);
147 static void __ps_free_launchconditions(launchconditions_x *launchconditions);
148 static void __ps_free_datashare(datashare_x *datashare);
149 static void __ps_free_icon(icon_x *icon);
150 static void __ps_free_author(author_x *author);
151 static void __ps_free_description(description_x *description);
152 static void __ps_free_capability(capability_x *capability);
153 static void __ps_free_license(license_x *license);
154 static void __ps_free_appcontrol(appcontrol_x *appcontrol);
155 static void __ps_free_datacontrol(datacontrol_x *datacontrol);
156 static void __ps_free_uiapplication(uiapplication_x *uiapplication);
157 static void __ps_free_serviceapplication(serviceapplication_x *serviceapplication);
158 static void __ps_free_font(font_x *font);
159 static void __ps_free_theme(theme_x *theme);
160 static void __ps_free_daemon(daemon_x *daemon);
161 static void __ps_free_ime(ime_x *ime);
162 static char *__pkgid_to_manifest(const char *pkgid, uid_t uid);
163 static int __next_child_element(xmlTextReaderPtr reader, int depth);
164 static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx, uid_t uid);
165 static int __process_manifest(xmlTextReaderPtr reader, manifest_x * mfx, uid_t uid);
166 static void __str_trim(char *input);
167 static char *__get_parser_plugin(const char *type);
168 static int __ps_run_parser(xmlDocPtr docPtr, const char *tag, ACTION_TYPE action, const char *pkgid);
169 static int __run_parser_prestep(xmlTextReaderPtr reader, ACTION_TYPE action, const char *pkgid);
170 static void __processNode(xmlTextReaderPtr reader, ACTION_TYPE action, char *const tagv[], const char *pkgid);
171 static void __streamFile(const char *filename, ACTION_TYPE action, char *const tagv[], const char *pkgid);
172 static int __validate_appid(const char *pkgid, const char *appid, char **newappid);
173 API int __is_admin();
174
175 void *__open_lib_handle(char *tag)
176 {
177         char *lib_path = NULL;
178         void *lib_handle = NULL;
179
180         lib_path = __get_parser_plugin(tag);
181         retvm_if(!lib_path, NULL, "lib_path get fail");
182
183         lib_handle = dlopen(lib_path, RTLD_LAZY);
184         retvm_if(lib_handle == NULL, NULL, "dlopen is failed lib_path[%s]", lib_path);
185
186         return lib_handle;
187 }
188
189 void __close_lib_handle(void *lib_handle)
190 {
191         dlclose(lib_handle);
192 }
193
194 static void __str_trim(char *input)
195 {
196         char *trim_str = input;
197
198         if (input == NULL)
199                 return;
200
201         while (*input != 0) {
202                 if (!isspace(*input)) {
203                         *trim_str = *input;
204                         trim_str++;
205                 }
206                 input++;
207         }
208
209         *trim_str = 0;
210         return;
211 }
212
213 API int __is_admin()
214 {
215         uid_t uid = getuid();
216         if ((uid_t) 0 == uid )
217                 return 1;
218         else
219                 return 0;
220 }
221
222
223
224 static int __validate_appid(const char *pkgid, const char *appid, char **newappid)
225 {
226         if (!pkgid || !appid || !newappid) {
227                 _LOGD("Arg supplied is NULL\n");
228                 return -1;
229         }
230         int pkglen = strlen(pkgid);
231         int applen = strlen(appid);
232         char *ptr = NULL;
233         char *newapp = NULL;
234         int len = 0;
235         if (strncmp(appid, ".", 1) == 0) {
236                 len = pkglen + applen + 1;
237                 newapp = calloc(1,len);
238                 if (newapp == NULL) {
239                         _LOGD("Malloc failed\n");
240                         return -1;
241                 }
242                 strncpy(newapp, pkgid, pkglen);
243                 strncat(newapp, appid, applen);
244                 _LOGD("new appid is %s\n", newapp);
245                 *newappid = newapp;
246                 return 0;
247         }
248         if (applen < pkglen) {
249                 _LOGD("app id is not proper\n");
250                 *newappid = NULL;
251 #ifdef _VALIDATE_APPID_
252                 return -1;
253 #else
254                 return 0;
255 #endif
256         }
257         if (!strcmp(appid, pkgid)) {
258                 _LOGD("appid is proper\n");
259                 *newappid = NULL;
260                 return 0;
261         }
262         else if (strncmp(appid, pkgid, pkglen) == 0) {
263                 ptr = strstr(appid, pkgid);
264                 ptr = ptr + pkglen;
265                 if (strncmp(ptr, ".", 1) == 0) {
266                         _LOGD("appid is proper\n");
267                         *newappid = NULL;
268                         return 0;
269                 }
270                 else {
271                         _LOGD("appid is not proper\n");
272                         *newappid = NULL;
273 #ifdef _VALIDATE_APPID_
274                         return -1;
275 #else
276                         return 0;
277 #endif
278                 }
279         } else {
280                 _LOGD("appid is not proper\n");
281                 *newappid = NULL;
282 #ifdef _VALIDATE_APPID_
283                 return -1;
284 #else
285                 return 0;
286 #endif
287         }
288         return 0;
289 }
290
291 static char * __get_tag_by_key(char *md_key)
292 {
293         char *md_tag = NULL;
294
295         if (md_key == NULL) {
296                 _LOGD("md_key is NULL\n");
297                 return NULL;
298         }
299
300         md_tag = strrchr(md_key, 47) + 1;
301
302
303         return strdup(md_tag);
304 }
305
306 static char *__get_metadata_parser_plugin(const char *type)
307 {
308         FILE *fp = NULL;
309         char buffer[1024] = { 0 };
310         char temp_path[1024] = { 0 };
311         char *path = NULL;
312
313         if (type == NULL) {
314                 _LOGE("invalid argument\n");
315                 return NULL;
316         }
317
318         fp = fopen(PKG_PARSER_CONF_PATH, "r");
319         if (fp == NULL) {
320                 _LOGE("no matching metadata parser\n");
321                 return NULL;
322         }
323
324         while (fgets(buffer, sizeof(buffer), fp) != NULL) {
325                 if (buffer[0] == '#')
326                         continue;
327
328                 __str_trim(buffer);
329
330                 if ((path = strstr(buffer, METADATA_PARSER_NAME)) != NULL) {
331                         path = path + strlen(METADATA_PARSER_NAME);
332
333                         break;
334                 }
335
336                 memset(buffer, 0x00, 1024);
337         }
338
339         if (fp != NULL)
340                 fclose(fp);
341
342         if (path == NULL) {
343                 _LOGE("no matching [%s] [%s]\n", METADATA_PARSER_NAME,type);
344                 return NULL;
345         }
346
347         snprintf(temp_path, sizeof(temp_path) - 1, "%slib%s.so", path, type);
348
349         return strdup(temp_path);
350 }
351
352 static char *__get_category_parser_plugin(const char *type)
353 {
354         FILE *fp = NULL;
355         char buffer[1024] = { 0 };
356         char temp_path[1024] = { 0 };
357         char *path = NULL;
358
359         if (type == NULL) {
360                 _LOGE("invalid argument\n");
361                 return NULL;
362         }
363
364         fp = fopen(PKG_PARSER_CONF_PATH, "r");
365         if (fp == NULL) {
366                 _LOGE("no matching metadata parser\n");
367                 return NULL;
368         }
369
370         while (fgets(buffer, sizeof(buffer), fp) != NULL) {
371                 if (buffer[0] == '#')
372                         continue;
373
374                 __str_trim(buffer);
375
376                 if ((path = strstr(buffer, CATEGORY_PARSER_NAME)) != NULL) {
377                         path = path + strlen(CATEGORY_PARSER_NAME);
378
379                         break;
380                 }
381
382                 memset(buffer, 0x00, 1024);
383         }
384
385         if (fp != NULL)
386                 fclose(fp);
387
388         if (path == NULL) {
389                 _LOGE("no matching [%s] [%s]\n", CATEGORY_PARSER_NAME,type);
390                 return NULL;
391         }
392
393         snprintf(temp_path, sizeof(temp_path) - 1, "%slib%s.so", path, type);
394
395         return strdup(temp_path);
396 }
397
398 static char *__get_parser_plugin(const char *type)
399 {
400         FILE *fp = NULL;
401         char buffer[1024] = { 0 };
402         char temp_path[1024] = { 0 };
403         char *path = NULL;
404
405         if (type == NULL) {
406                 _LOGE("invalid argument\n");
407                 return NULL;
408         }
409
410         fp = fopen(PKG_PARSER_CONF_PATH, "r");
411         if (fp == NULL) {
412                 _LOGE("no matching backendlib\n");
413                 return NULL;
414         }
415
416         while (fgets(buffer, sizeof(buffer), fp) != NULL) {
417                 if (buffer[0] == '#')
418                         continue;
419
420                 __str_trim(buffer);
421
422                 if ((path = strstr(buffer, PKG_PARSERLIB)) != NULL) {
423                         path = path + strlen(PKG_PARSERLIB);
424                         break;
425                 }
426
427                 memset(buffer, 0x00, 1024);
428         }
429
430         if (fp != NULL)
431                 fclose(fp);
432
433         if (path == NULL) {
434                 _LOGE("no matching backendlib\n");
435                 return NULL;
436         }
437
438         snprintf(temp_path, sizeof(temp_path) - 1, "%slib%s.so", path, type);
439
440         return strdup(temp_path);
441 }
442
443 static int __ps_run_tag_parser(void *lib_handle, xmlDocPtr docPtr, const char *tag,
444                            ACTION_TYPE action, const char *pkgid)
445 {
446         int (*plugin_install) (xmlDocPtr, const char *);
447         int ret = -1;
448         char *ac = NULL;
449
450         switch (action) {
451         case ACTION_INSTALL:
452                 ac = "PKGMGR_PARSER_PLUGIN_INSTALL";
453                 break;
454         case ACTION_UPGRADE:
455                 ac = "PKGMGR_PARSER_PLUGIN_UPGRADE";
456                 break;
457         case ACTION_UNINSTALL:
458                 ac = "PKGMGR_PARSER_PLUGIN_UNINSTALL";
459                 break;
460         default:
461                 goto END;
462         }
463
464         if ((plugin_install =
465                 dlsym(lib_handle, ac)) == NULL || dlerror() != NULL) {
466                 _LOGE("can not find symbol[%s] \n", ac);
467                 goto END;
468         }
469
470         ret = plugin_install(docPtr, pkgid);
471         _LOGD("tag parser[%s, %s] ACTION_TYPE[%d] result[%d]\n", pkgid, tag, action, ret);
472
473 END:
474         return ret;
475 }
476
477 static int __ps_run_metadata_parser(GList *md_list, const char *tag,
478                                 ACTION_TYPE action, const char *pkgid, const char *appid)
479 {
480         char *lib_path = NULL;
481         void *lib_handle = NULL;
482         int (*metadata_parser_plugin) (const char *, const char *, GList *);
483         int ret = -1;
484         char *ac = NULL;
485
486         switch (action) {
487         case ACTION_INSTALL:
488                 ac = "PKGMGR_MDPARSER_PLUGIN_INSTALL";
489                 break;
490         case ACTION_UPGRADE:
491                 ac = "PKGMGR_MDPARSER_PLUGIN_UPGRADE";
492                 break;
493         case ACTION_UNINSTALL:
494                 ac = "PKGMGR_MDPARSER_PLUGIN_UNINSTALL";
495                 break;
496         default:
497                 goto END;
498         }
499
500         lib_path = __get_metadata_parser_plugin(tag);
501         if (!lib_path) {
502                 _LOGE("get %s parser fail\n", tag);
503                 goto END;
504         }
505
506         if ((lib_handle = dlopen(lib_path, RTLD_LAZY)) == NULL) {
507                 _LOGE("dlopen is failed lib_path[%s]\n", lib_path);
508                 goto END;
509         }
510
511         if ((metadata_parser_plugin =
512                 dlsym(lib_handle, ac)) == NULL || dlerror() != NULL) {
513                 _LOGE("can not find symbol[%s] \n",ac);
514                 goto END;
515         }
516
517         ret = metadata_parser_plugin(pkgid, appid, md_list);
518         if (ret < 0)
519                 _LOGD("[appid = %s, libpath = %s plugin fail\n", appid, lib_path);
520         else
521                 _LOGD("[appid = %s, libpath = %s plugin success\n", appid, lib_path);
522
523 END:
524         if (lib_path)
525                 free(lib_path);
526         if (lib_handle)
527                 dlclose(lib_handle);
528         return ret;
529 }
530
531 static int __ps_run_category_parser(GList *category_list, const char *tag,
532                                 ACTION_TYPE action, const char *pkgid, const char *appid)
533 {
534         char *lib_path = NULL;
535         void *lib_handle = NULL;
536         int (*category_parser_plugin) (const char *, const char *, GList *);
537         int ret = -1;
538         char *ac = NULL;
539
540         switch (action) {
541         case ACTION_INSTALL:
542                 ac = "PKGMGR_CATEGORY_PARSER_PLUGIN_INSTALL";
543                 break;
544         case ACTION_UPGRADE:
545                 ac = "PKGMGR_CATEGORY_PARSER_PLUGIN_UPGRADE";
546                 break;
547         case ACTION_UNINSTALL:
548                 ac = "PKGMGR_CATEGORY_PARSER_PLUGIN_UNINSTALL";
549                 break;
550         default:
551                 goto END;
552         }
553
554         lib_path = __get_category_parser_plugin(tag);
555         if (!lib_path) {
556                 _LOGE("get %s parser fail\n", tag);
557                 goto END;
558         }
559
560         if ((lib_handle = dlopen(lib_path, RTLD_LAZY)) == NULL) {
561                 _LOGE("dlopen is failed lib_path[%s]\n", lib_path);
562                 goto END;
563         }
564
565         if ((category_parser_plugin =
566                 dlsym(lib_handle, ac)) == NULL || dlerror() != NULL) {
567                 _LOGE("can not find symbol[%s] \n",ac);
568                 goto END;
569         }
570
571         ret = category_parser_plugin(pkgid, appid, category_list);
572         if (ret < 0)
573                 _LOGD("[appid = %s, libpath = %s plugin fail\n", appid, lib_path);
574         else
575                 _LOGD("[appid = %s, libpath = %s plugin success\n", appid, lib_path);
576
577 END:
578         if (lib_path)
579                 free(lib_path);
580         if (lib_handle)
581                 dlclose(lib_handle);
582         return ret;
583 }
584
585 static int __ps_run_parser(xmlDocPtr docPtr, const char *tag,
586                            ACTION_TYPE action, const char *pkgid)
587 {
588         char *lib_path = NULL;
589         void *lib_handle = NULL;
590         int (*plugin_install) (xmlDocPtr, const char *);
591         int ret = -1;
592         char *ac = NULL;
593
594         switch (action) {
595         case ACTION_INSTALL:
596                 ac = "PKGMGR_PARSER_PLUGIN_INSTALL";
597                 break;
598         case ACTION_UPGRADE:
599                 ac = "PKGMGR_PARSER_PLUGIN_UPGRADE";
600                 break;
601         case ACTION_UNINSTALL:
602                 ac = "PKGMGR_PARSER_PLUGIN_UNINSTALL";
603                 break;
604         default:
605                 goto END;
606         }
607
608         lib_path = __get_parser_plugin(tag);
609         if (!lib_path) {
610                 goto END;
611         }
612
613         if ((lib_handle = dlopen(lib_path, RTLD_LAZY)) == NULL) {
614                 _LOGE("dlopen is failed lib_path[%s]\n", lib_path);
615                 goto END;
616         }
617         if ((plugin_install =
618                 dlsym(lib_handle, ac)) == NULL || dlerror() != NULL) {
619                 _LOGE("can not find symbol[%s] \n", ac);
620                 goto END;
621         }
622
623         ret = plugin_install(docPtr, pkgid);
624         if (ret < 0)
625                 _LOGD("[pkgid = %s, libpath = %s plugin fail\n", pkgid, lib_path);
626         else
627                 _LOGD("[pkgid = %s, libpath = %s plugin success\n", pkgid, lib_path);
628
629 END:
630         if (lib_path)
631                 free(lib_path);
632         if (lib_handle)
633                 dlclose(lib_handle);
634         return ret;
635 }
636
637 static char *__pkgid_to_manifest(const char *pkgid, uid_t uid)
638 {
639         char *manifest;
640         int size;
641
642         if (pkgid == NULL) {
643                 _LOGE("pkgid is NULL");
644                 return NULL;
645         }
646
647         size = strlen(getUserManifestPath(uid)) + strlen(pkgid) + 10;
648         manifest = malloc(size);
649         if (manifest == NULL) {
650                 _LOGE("No memory");
651                 return NULL;
652         }
653         memset(manifest, '\0', size);
654         snprintf(manifest, size, "%s%s.xml", getUserManifestPath(uid), pkgid);
655
656         if (access(manifest, F_OK)) {
657                 snprintf(manifest, size, "%s%s.xml", getUserManifestPath(uid), pkgid);
658         }
659
660         return manifest;
661 }
662
663 static void __metadata_parser_clear_dir_list(GList* dir_list)
664 {
665         GList *list = NULL;
666         __metadata_t* detail = NULL;
667
668         if (dir_list) {
669                 list = g_list_first(dir_list);
670                 while (list) {
671                         detail = (__metadata_t *)list->data;
672                         if (detail) {
673                                 if (detail->key)
674                                         free(detail->key);
675                                 if (detail->value)
676                                         free(detail->value);
677                                 free(detail);
678                         }
679                         list = g_list_next(list);
680                 }
681                 g_list_free(dir_list);
682         }
683 }
684
685 static void __category_parser_clear_dir_list(GList* dir_list)
686 {
687         GList *list = NULL;
688         __category_t* detail = NULL;
689
690         if (dir_list) {
691                 list = g_list_first(dir_list);
692                 while (list) {
693                         detail = (__category_t *)list->data;
694                         if (detail) {
695                                 if (detail->name)
696                                         free(detail->name);
697
698                                 free(detail);
699                         }
700                         list = g_list_next(list);
701                 }
702                 g_list_free(dir_list);
703         }
704 }
705
706 static int __run_tag_parser_prestep(void *lib_handle, xmlTextReaderPtr reader, ACTION_TYPE action, const char *pkgid)
707 {
708         int ret = -1;
709         const xmlChar *name;
710
711         if (xmlTextReaderDepth(reader) != 1) {
712                 _LOGE("Node depth is not 1");
713                 goto END;
714         }
715
716         if (xmlTextReaderNodeType(reader) != 1) {
717                 _LOGE("Node type is not 1");
718                 goto END;
719         }
720
721         const xmlChar *value;
722         name = xmlTextReaderConstName(reader);
723         if (name == NULL) {
724                 _LOGE("TEST TEST TES\n");
725                 name = BAD_CAST "--";
726         }
727
728         value = xmlTextReaderConstValue(reader);
729         if (value != NULL) {
730                 if (xmlStrlen(value) > 40) {
731                         _LOGD(" %.40s...", value);
732                 } else {
733                         _LOGD(" %s", value);
734                 }
735         }
736
737         name = xmlTextReaderConstName(reader);
738         if (name == NULL) {
739                 _LOGE("TEST TEST TES\n");
740                 name = BAD_CAST "--";
741         }
742
743         xmlDocPtr docPtr = xmlTextReaderCurrentDoc(reader);
744         xmlDocPtr copyDocPtr = xmlCopyDoc(docPtr, 1);
745         if (copyDocPtr == NULL)
746                 return -1;
747         xmlNode *rootElement = xmlDocGetRootElement(copyDocPtr);
748         if (rootElement == NULL)
749                 return -1;
750         xmlNode *cur_node = xmlFirstElementChild(rootElement);
751         if (cur_node == NULL)
752                 return -1;
753         xmlNode *temp = xmlTextReaderExpand(reader);
754         if (temp == NULL)
755                 return -1;
756         xmlNode *next_node = NULL;
757         while(cur_node != NULL) {
758                 if ( (strcmp(ASCII(temp->name), ASCII(cur_node->name)) == 0) &&
759                         (temp->line == cur_node->line) ) {
760                         break;
761                 }
762                 else {
763                         next_node = xmlNextElementSibling(cur_node);
764                         xmlUnlinkNode(cur_node);
765                         xmlFreeNode(cur_node);
766                         cur_node = next_node;
767                 }
768         }
769         if (cur_node == NULL)
770                 return -1;
771         next_node = xmlNextElementSibling(cur_node);
772         if (next_node) {
773                 cur_node->next = NULL;
774                 next_node->prev = NULL;
775                 xmlFreeNodeList(next_node);
776                 xmlSetTreeDoc(cur_node, copyDocPtr);
777         } else {
778                 xmlSetTreeDoc(cur_node, copyDocPtr);
779         }
780
781         ret = __ps_run_tag_parser(lib_handle, copyDocPtr, ASCII(name), action, pkgid);
782  END:
783
784         return ret;
785 }
786
787 static int __run_metadata_parser_prestep (manifest_x *mfx, char *md_key, ACTION_TYPE action)
788 {
789         int ret = -1;
790         int tag_exist = 0;
791         char buffer[1024] = { 0, };
792         uiapplication_x *up = mfx->uiapplication;
793         metadata_x *md = NULL;
794         char *md_tag = NULL;
795
796         GList *md_list = NULL;
797         __metadata_t *md_detail = NULL;
798
799         md_tag = __get_tag_by_key(md_key);
800         if (md_tag == NULL) {
801                 _LOGD("md_tag is NULL\n");
802                 return -1;
803         }
804
805         while(up != NULL)
806         {
807                 md = up->metadata;
808                 while (md != NULL)
809                 {
810                         //get glist of metadata key and value combination
811                         memset(buffer, 0x00, 1024);
812                         snprintf(buffer, 1024, "%s/", md_key);
813                         if ((md->key && md->value) && (strncmp(md->key, md_key, strlen(md_key)) == 0) && (strncmp(buffer, md->key, strlen(buffer)) == 0)) {
814                                 md_detail = (__metadata_t*) calloc(1, sizeof(__metadata_t));
815                                 if (md_detail == NULL) {
816                                         _LOGD("Memory allocation failed\n");
817                                         goto END;
818                                 }
819
820                                 md_detail->key = (char*) calloc(1, sizeof(char)*(strlen(md->key)+2));
821                                 if (md_detail->key == NULL) {
822                                         _LOGD("Memory allocation failed\n");
823                                         free(md_detail);
824                                         goto END;
825                                 }
826                                 snprintf(md_detail->key, (strlen(md->key)+1), "%s", md->key);
827
828                                 md_detail->value = (char*) calloc(1, sizeof(char)*(strlen(md->value)+2));
829                                 if (md_detail->value == NULL) {
830                                         _LOGD("Memory allocation failed\n");
831                                         free(md_detail->key);
832                                         free(md_detail);
833                                         goto END;
834                                 }
835                                 snprintf(md_detail->value, (strlen(md->value)+1), "%s", md->value);
836
837                                 md_list = g_list_append(md_list, (gpointer)md_detail);
838                                 tag_exist = 1;
839                         }
840                         md = md->next;
841                 }
842
843                 //send glist to parser when tags for metadata plugin parser exist.
844                 if (tag_exist) {
845                         ret = __ps_run_metadata_parser(md_list, md_tag, action, mfx->package, up->appid);
846                         if (ret < 0){
847                                 _LOGD("metadata_parser failed[%d] for tag[%s]\n", ret, md_tag);
848                         }
849                         else{
850                                 _LOGD("metadata_parser success for tag[%s]\n", md_tag);
851                         }
852                 }
853                 __metadata_parser_clear_dir_list(md_list);
854                 md_list = NULL;
855                 tag_exist = 0;
856                 up = up->next;
857         }
858
859         return 0;
860 END:
861         __metadata_parser_clear_dir_list(md_list);
862
863         if (md_tag)
864                 free(md_tag);
865
866         return ret;
867 }
868
869 static int __run_category_parser_prestep (manifest_x *mfx, char *category_key, ACTION_TYPE action)
870 {
871         int ret = -1;
872         int tag_exist = 0;
873         char buffer[1024] = { 0, };
874         uiapplication_x *up = mfx->uiapplication;
875         category_x *category = NULL;
876         char *category_tag = NULL;
877
878         GList *category_list = NULL;
879         __category_t *category_detail = NULL;
880
881         category_tag = __get_tag_by_key(category_key);
882         if (category_tag == NULL) {
883                 _LOGD("md_tag is NULL\n");
884                 return -1;
885         }
886
887         while(up != NULL)
888         {
889                 category = up->category;
890                 while (category != NULL)
891                 {
892                         //get glist of category key and value combination
893                         memset(buffer, 0x00, 1024);
894                         snprintf(buffer, 1024, "%s/", category_key);
895                         if ((category->name) && (strncmp(category->name, category_key, strlen(category_key)) == 0)) {
896                                 category_detail = (__category_t*) calloc(1, sizeof(__category_t));
897                                 if (category_detail == NULL) {
898                                         _LOGD("Memory allocation failed\n");
899                                         goto END;
900                                 }
901
902                                 category_detail->name = (char*) calloc(1, sizeof(char)*(strlen(category->name)+2));
903                                 if (category_detail->name == NULL) {
904                                         _LOGD("Memory allocation failed\n");
905                                         free(category_detail);
906                                         goto END;
907                                 }
908                                 snprintf(category_detail->name, (strlen(category->name)+1), "%s", category->name);
909
910                                 category_list = g_list_append(category_list, (gpointer)category_detail);
911                                 tag_exist = 1;
912                         }
913                         category = category->next;
914                 }
915
916                 //send glist to parser when tags for metadata plugin parser exist.
917                 if (tag_exist) {
918                         ret = __ps_run_category_parser(category_list, category_tag, action, mfx->package, up->appid);
919                         if (ret < 0)
920                                 _LOGD("category_parser failed[%d] for tag[%s]\n", ret, category_tag);
921                         else
922                                 _LOGD("category_parser success for tag[%s]\n", category_tag);
923                 }
924                 __category_parser_clear_dir_list(category_list);
925                 category_list = NULL;
926                 tag_exist = 0;
927                 up = up->next;
928         }
929
930         return 0;
931 END:
932         __category_parser_clear_dir_list(category_list);
933
934         if (category_tag)
935                 free(category_tag);
936
937         return ret;
938 }
939
940 static int __run_parser_prestep(xmlTextReaderPtr reader, ACTION_TYPE action, const char *pkgid)
941 {
942         int ret = -1;
943         const xmlChar *name;
944
945 //      _LOGD("__run_parser_prestep");
946
947         if (xmlTextReaderDepth(reader) != 1) {
948                 _LOGE("Node depth is not 1");
949                 goto END;
950         }
951
952         if (xmlTextReaderNodeType(reader) != 1) {
953                 _LOGE("Node type is not 1");
954                 goto END;
955         }
956
957         const xmlChar *value;
958         name = xmlTextReaderConstName(reader);
959         if (name == NULL) {
960                 _LOGE("TEST TEST TES\n");
961                 name = BAD_CAST "--";
962         }
963
964         value = xmlTextReaderConstValue(reader);
965         _LOGD("%d %d %s %d %d",
966             xmlTextReaderDepth(reader),
967             xmlTextReaderNodeType(reader),
968             name,
969             xmlTextReaderIsEmptyElement(reader), xmlTextReaderHasValue(reader));
970
971         if (value != NULL) {
972                 if (xmlStrlen(value) > 40) {
973                         _LOGD(" %.40s...", value);
974                 } else {
975                         _LOGD(" %s", value);
976                 }
977         }
978
979         name = xmlTextReaderConstName(reader);
980         if (name == NULL) {
981                 _LOGE("TEST TEST TES\n");
982                 name = BAD_CAST "--";
983         }
984
985         xmlDocPtr docPtr = xmlTextReaderCurrentDoc(reader);
986         _LOGD("docPtr->URL %s\n", (char *)docPtr->URL);
987         xmlDocPtr copyDocPtr = xmlCopyDoc(docPtr, 1);
988         if (copyDocPtr == NULL)
989                 return -1;
990         xmlNode *rootElement = xmlDocGetRootElement(copyDocPtr);
991         if (rootElement == NULL)
992                 return -1;
993         xmlNode *cur_node = xmlFirstElementChild(rootElement);
994         if (cur_node == NULL)
995                 return -1;
996         xmlNode *temp = xmlTextReaderExpand(reader);
997         if (temp == NULL)
998                 return -1;
999         xmlNode *next_node = NULL;
1000         while(cur_node != NULL) {
1001                 if ( (strcmp(ASCII(temp->name), ASCII(cur_node->name)) == 0) &&
1002                         (temp->line == cur_node->line) ) {
1003                         break;
1004                 }
1005                 else {
1006                         next_node = xmlNextElementSibling(cur_node);
1007                         xmlUnlinkNode(cur_node);
1008                         xmlFreeNode(cur_node);
1009                         cur_node = next_node;
1010                 }
1011         }
1012         if (cur_node == NULL)
1013                 return -1;
1014         next_node = xmlNextElementSibling(cur_node);
1015         if (next_node) {
1016                 cur_node->next = NULL;
1017                 next_node->prev = NULL;
1018                 xmlFreeNodeList(next_node);
1019                 xmlSetTreeDoc(cur_node, copyDocPtr);
1020         } else {
1021                 xmlSetTreeDoc(cur_node, copyDocPtr);
1022         }
1023
1024 #ifdef __DEBUG__
1025
1026 //#else
1027         _LOGD("node type: %d, name: %s children->name: %s last->name: %s\n"
1028             "parent->name: %s next->name: %s prev->name: %s\n",
1029             cur_node->type, cur_node->name,
1030             cur_node->children ? cur_node->children->name : "NULL",
1031             cur_node->last ? cur_node->last->name : "NULL",
1032             cur_node->parent ? cur_node->parent->name : "NULL",
1033             cur_node->next ? cur_node->next->name : "NULL",
1034             cur_node->prev ? cur_node->prev->name : "NULL");
1035
1036         FILE *fp = fopen(tzplatform_mkpath(TZ_SYS_SHARE, "test.xml"), "a");
1037         xmlDocDump(fp, copyDocPtr);
1038         fclose(fp);
1039 #endif
1040
1041         ret = __ps_run_parser(copyDocPtr, ASCII(name), action, pkgid);
1042  END:
1043
1044         return ret;
1045 }
1046
1047 static void
1048 __processNode(xmlTextReaderPtr reader, ACTION_TYPE action, char *const tagv[], const char *pkgid)
1049 {
1050         char *tag = NULL;
1051         int i = 0;
1052
1053         switch (xmlTextReaderNodeType(reader)) {
1054         case XML_READER_TYPE_END_ELEMENT:
1055                 {
1056                         //            _LOGD("XML_READER_TYPE_END_ELEMENT");
1057                         break;
1058                 }
1059
1060         case XML_READER_TYPE_ELEMENT:
1061                 {
1062                         // Elements without closing tag don't receive
1063                         // XML_READER_TYPE_END_ELEMENT event.
1064
1065                         const xmlChar *elementName =
1066                             xmlTextReaderLocalName(reader);
1067                         if (elementName == NULL) {
1068 //                              _LOGD("elementName %s\n", (char *)elementName);
1069                                 break;
1070                         }
1071
1072                         const xmlChar *nameSpace =
1073                             xmlTextReaderConstNamespaceUri(reader);
1074                         if (nameSpace) {
1075 //                              _LOGD("nameSpace %s\n", (char *)nameSpace);
1076                         }
1077 /*
1078                         _LOGD("XML_READER_TYPE_ELEMENT %s, %s\n",
1079                             elementName ? elementName : "NULL",
1080                             nameSpace ? nameSpace : "NULL");
1081 */
1082                         if (tagv == NULL) {
1083                                 _LOGD("__run_parser_prestep pkgid[%s]\n", pkgid);
1084                                 __run_parser_prestep(reader, action, pkgid);
1085                         }
1086                         else {
1087                                 i = 0;
1088                                 for (tag = tagv[0]; tag; tag = tagv[++i])
1089                                         if (strcmp(tag, ASCII(elementName)) == 0) {
1090                                                 _LOGD("__run_parser_prestep tag[%s] pkgid[%s]\n", tag, pkgid);
1091                                                 __run_parser_prestep(reader,
1092                                                                      action, pkgid);
1093                                                 break;
1094                                         }
1095                         }
1096
1097                         break;
1098                 }
1099         case XML_READER_TYPE_TEXT:
1100         case XML_READER_TYPE_CDATA:
1101                 {
1102                         const xmlChar *value = xmlTextReaderConstValue(reader);
1103                         if (value) {
1104 //                              _LOGD("value %s\n", value);
1105                         }
1106
1107                         const xmlChar *lang = xmlTextReaderConstXmlLang(reader);
1108                         if (lang) {
1109 //                              _LOGD("lang\n", lang);
1110                         }
1111
1112 /*                      _LOGD("XML_READER_TYPE_TEXT %s, %s\n",
1113                             value ? value : "NULL", lang ? lang : "NULL");
1114 */
1115                         break;
1116                 }
1117         default:
1118 //              _LOGD("Ignoring Node of Type: %d", xmlTextReaderNodeType(reader));
1119                 break;
1120         }
1121 }
1122
1123 static void
1124 __processTag(void *lib_handle, xmlTextReaderPtr reader, ACTION_TYPE action, char *tag, const char *pkgid)
1125 {
1126         switch (xmlTextReaderNodeType(reader)) {
1127         case XML_READER_TYPE_END_ELEMENT:
1128                 {
1129                         break;
1130                 }
1131         case XML_READER_TYPE_ELEMENT:
1132                 {
1133                         // Elements without closing tag don't receive
1134                         const xmlChar *elementName =
1135                             xmlTextReaderLocalName(reader);
1136                         if (elementName == NULL) {
1137                                 break;
1138                         }
1139
1140                         if (strcmp(tag, ASCII(elementName)) == 0) {
1141                                 _LOGD("find : tag[%s] ACTION_TYPE[%d] pkg[%s]\n", tag, action, pkgid);
1142                                 __run_tag_parser_prestep(lib_handle, reader, action, pkgid);
1143                                 break;
1144                         }
1145                         break;
1146                 }
1147
1148         default:
1149                 break;
1150         }
1151 }
1152
1153 static int __parser_send_tag(void *lib_handle, ACTION_TYPE action, PLUGIN_PROCESS_TYPE process, const char *pkgid)
1154 {
1155         int (*plugin_install) (const char *);
1156         int ret = -1;
1157         char *ac = NULL;
1158
1159         if (process == PLUGIN_PRE_PROCESS) {
1160                 switch (action) {
1161                 case ACTION_INSTALL:
1162                         ac = "PKGMGR_PARSER_PLUGIN_PRE_INSTALL";
1163                         break;
1164                 case ACTION_UPGRADE:
1165                         ac = "PKGMGR_PARSER_PLUGIN_PRE_UPGRADE";
1166                         break;
1167                 case ACTION_UNINSTALL:
1168                         ac = "PKGMGR_PARSER_PLUGIN_PRE_UNINSTALL";
1169                         break;
1170                 default:
1171                         return -1;
1172                 }
1173         } else if (process == PLUGIN_POST_PROCESS) {
1174                 switch (action) {
1175                 case ACTION_INSTALL:
1176                         ac = "PKGMGR_PARSER_PLUGIN_POST_INSTALL";
1177                         break;
1178                 case ACTION_UPGRADE:
1179                         ac = "PKGMGR_PARSER_PLUGIN_POST_UPGRADE";
1180                         break;
1181                 case ACTION_UNINSTALL:
1182                         ac = "PKGMGR_PARSER_PLUGIN_POST_UNINSTALL";
1183                         break;
1184                 default:
1185                         return -1;
1186                 }
1187         } else
1188                 return -1;
1189
1190         if ((plugin_install =
1191                 dlsym(lib_handle, ac)) == NULL || dlerror() != NULL) {
1192                 return -1;
1193         }
1194
1195         ret = plugin_install(pkgid);
1196         return ret;
1197 }
1198
1199 static void __plugin_send_tag(const char *tag, ACTION_TYPE action, PLUGIN_PROCESS_TYPE process, const char *pkgid)
1200 {
1201         char *lib_path = NULL;
1202         void *lib_handle = NULL;
1203         int (*plugin_install) (const char *);
1204         int ret = -1;
1205         char *ac = NULL;
1206
1207         if (process == PLUGIN_PRE_PROCESS) {
1208                 switch (action) {
1209                 case ACTION_INSTALL:
1210                         ac = "PKGMGR_PARSER_PLUGIN_PRE_INSTALL";
1211                         break;
1212                 case ACTION_UPGRADE:
1213                         ac = "PKGMGR_PARSER_PLUGIN_PRE_UPGRADE";
1214                         break;
1215                 case ACTION_UNINSTALL:
1216                         ac = "PKGMGR_PARSER_PLUGIN_PRE_UNINSTALL";
1217                         break;
1218                 default:
1219                         goto END;
1220                 }
1221         } else if (process == PLUGIN_POST_PROCESS) {
1222                 switch (action) {
1223                 case ACTION_INSTALL:
1224                         ac = "PKGMGR_PARSER_PLUGIN_POST_INSTALL";
1225                         break;
1226                 case ACTION_UPGRADE:
1227                         ac = "PKGMGR_PARSER_PLUGIN_POST_UPGRADE";
1228                         break;
1229                 case ACTION_UNINSTALL:
1230                         ac = "PKGMGR_PARSER_PLUGIN_POST_UNINSTALL";
1231                         break;
1232                 default:
1233                         goto END;
1234                 }
1235         } else
1236                 goto END;
1237
1238         lib_path = __get_parser_plugin(tag);
1239         if (!lib_path) {
1240                 goto END;
1241         }
1242
1243         if ((lib_handle = dlopen(lib_path, RTLD_LAZY)) == NULL) {
1244                 _LOGE("dlopen is failed lib_path[%s] for tag[%s]\n", lib_path, tag);
1245                 goto END;
1246         }
1247         if ((plugin_install =
1248                 dlsym(lib_handle, ac)) == NULL || dlerror() != NULL) {
1249 //              _LOGE("can not find symbol[%s] for tag[%s] \n", ac, tag);
1250                 goto END;
1251         }
1252
1253         ret = plugin_install(pkgid);
1254         if (ret < 0)
1255                 _LOGD("[PLUGIN_PROCESS_TYPE[%d] pkgid=%s, tag=%s plugin fail\n", process, pkgid, tag);
1256         else
1257                 _LOGD("[PLUGIN_PROCESS_TYPE[%d] pkgid=%s, tag=%s plugin success\n", process, pkgid, tag);
1258
1259 END:
1260         if (lib_path)
1261                 free(lib_path);
1262         if (lib_handle)
1263                 dlclose(lib_handle);
1264 }
1265
1266 static void
1267 __plugin_process_tag(char *const tag_list[], ACTION_TYPE action, PLUGIN_PROCESS_TYPE process, const char *pkgid)
1268 {
1269         char *tag = NULL;
1270         int i = 0;
1271
1272         for (tag = tag_list[0]; tag; tag = tag_list[++i])
1273                 __plugin_send_tag(tag, action, process, pkgid);
1274
1275 }
1276
1277 static void
1278 __plugin_save_tag(xmlTextReaderPtr reader, char *const tagv[], char *tag_list[])
1279 {
1280         char *tag = NULL;
1281         int i = 0;
1282         static int pre_cnt=0;
1283
1284         switch (xmlTextReaderNodeType(reader)) {
1285         case XML_READER_TYPE_ELEMENT:
1286                 {
1287                         const xmlChar *elementName = xmlTextReaderLocalName(reader);
1288                         if (elementName == NULL) {
1289                                 break;
1290                         }
1291                         i = 0;
1292                         for (tag = tag_list[0]; tag; tag = tag_list[++i])
1293                                 if (strcmp(ASCII(elementName), tag) == 0) {
1294                                         return;
1295                                 }
1296                         i = 0;
1297                         for (tag = tagv[0]; tag; tag = tagv[++i])
1298                                 if (strcmp(tag, ASCII(elementName)) == 0) {
1299                                         tag_list[pre_cnt++] = tag;
1300                                         break;
1301                                 }
1302                         break;
1303                 }
1304         default:
1305 //              _LOGD("Ignoring Node of Type: %d", xmlTextReaderNodeType(reader));
1306                 break;
1307         }
1308 }
1309
1310 static void
1311 __streamFile(const char *filename, ACTION_TYPE action, char *const tagv[], const char *pkgid)
1312 {
1313         xmlTextReaderPtr reader;
1314         xmlDocPtr docPtr;
1315         int ret;
1316         __plugin_process_tag(tagv, action, PLUGIN_PRE_PROCESS, pkgid);
1317
1318         docPtr = xmlReadFile(filename, NULL, 0);
1319         reader = xmlReaderWalker(docPtr);
1320         if (reader != NULL) {
1321                 ret = xmlTextReaderRead(reader);
1322                 while (ret == 1) {
1323                         __processNode(reader, action, tagv, pkgid);
1324                         ret = xmlTextReaderRead(reader);
1325                 }
1326                 xmlFreeTextReader(reader);
1327
1328                 if (ret != 0) {
1329                         _LOGD("%s : failed to parse", filename);
1330                 }
1331         } else {
1332                 _LOGD("Unable to open %s", filename);
1333         }
1334
1335         __plugin_process_tag(tagv, action, PLUGIN_POST_PROCESS, pkgid);
1336 }
1337
1338 static int __next_child_element(xmlTextReaderPtr reader, int depth)
1339 {
1340         int ret = xmlTextReaderRead(reader);
1341         int cur = xmlTextReaderDepth(reader);
1342         while (ret == 1) {
1343
1344                 switch (xmlTextReaderNodeType(reader)) {
1345                 case XML_READER_TYPE_ELEMENT:
1346                         if (cur == depth + 1)
1347                                 return 1;
1348                         break;
1349                 case XML_READER_TYPE_TEXT:
1350                         /*text is handled by each function separately*/
1351                         if (cur == depth + 1)
1352                                 return 0;
1353                         break;
1354                 case XML_READER_TYPE_END_ELEMENT:
1355                         if (cur == depth)
1356                                 return 0;
1357                         break;
1358                 default:
1359                         if (cur <= depth)
1360                                 return 0;
1361                         break;
1362                 }
1363                 ret = xmlTextReaderRead(reader);
1364                 cur = xmlTextReaderDepth(reader);
1365         }
1366         return ret;
1367 }
1368
1369 static bool __check_action_fota(char *const tagv[])
1370 {
1371         int i = 0;
1372         char delims[] = "=";
1373         char *ret_result = NULL;
1374         char *tag = NULL;
1375         int ret = false;
1376
1377         if (tagv == NULL)
1378                 return ret;
1379
1380         for (tag = strdup(tagv[0]); tag != NULL; ) {
1381                 ret_result = strtok(tag, delims);
1382
1383                 /*check tag :  fota is true */
1384                 if (strcmp(ret_result, "fota") == 0) {
1385                         ret_result = strtok(NULL, delims);
1386                         if (strcmp(ret_result, "true") == 0) {
1387                                 ret = true;
1388                         }
1389                 } else
1390                         _LOGD("tag process [%s]is not defined\n", ret_result);
1391
1392                 free(tag);
1393
1394                 /*check next value*/
1395                 if (tagv[++i] != NULL)
1396                         tag = strdup(tagv[i]);
1397                 else {
1398                         _LOGD("tag process success...%d\n" , ret);
1399                         return ret;
1400                 }
1401         }
1402
1403         return ret;
1404 }
1405
1406 static void __ps_free_category(category_x *category)
1407 {
1408         if (category == NULL)
1409                 return;
1410         if (category->name) {
1411                 free((void *)category->name);
1412                 category->name = NULL;
1413         }
1414         free((void*)category);
1415         category = NULL;
1416 }
1417
1418 static void __ps_free_privilege(privilege_x *privilege)
1419 {
1420         if (privilege == NULL)
1421                 return;
1422         if (privilege->text) {
1423                 free((void *)privilege->text);
1424                 privilege->text = NULL;
1425         }
1426         free((void*)privilege);
1427         privilege = NULL;
1428 }
1429
1430 static void __ps_free_privileges(privileges_x *privileges)
1431 {
1432         if (privileges == NULL)
1433                 return;
1434         /*Free Privilege*/
1435         if (privileges->privilege) {
1436                 privilege_x *privilege = privileges->privilege;
1437                 privilege_x *tmp = NULL;
1438                 while(privilege != NULL) {
1439                         tmp = privilege->next;
1440                         __ps_free_privilege(privilege);
1441                         privilege = tmp;
1442                 }
1443         }
1444         free((void*)privileges);
1445         privileges = NULL;
1446 }
1447
1448 static void __ps_free_metadata(metadata_x *metadata)
1449 {
1450         if (metadata == NULL)
1451                 return;
1452         if (metadata->key) {
1453                 free((void *)metadata->key);
1454                 metadata->key = NULL;
1455         }
1456         if (metadata->value) {
1457                 free((void *)metadata->value);
1458                 metadata->value = NULL;
1459         }
1460         free((void*)metadata);
1461         metadata = NULL;
1462 }
1463
1464 static void __ps_free_permission(permission_x *permission)
1465 {
1466         if (permission == NULL)
1467                 return;
1468         if (permission->type) {
1469                 free((void *)permission->type);
1470                 permission->type = NULL;
1471         }
1472         if (permission->value) {
1473                 free((void *)permission->value);
1474                 permission->value = NULL;
1475         }
1476         free((void*)permission);
1477         permission = NULL;
1478 }
1479
1480 static void __ps_free_icon(icon_x *icon)
1481 {
1482         if (icon == NULL)
1483                 return;
1484         if (icon->text) {
1485                 free((void *)icon->text);
1486                 icon->text = NULL;
1487         }
1488         if (icon->lang) {
1489                 free((void *)icon->lang);
1490                 icon->lang = NULL;
1491         }
1492         if (icon->name) {
1493                 free((void *)icon->name);
1494                 icon->name= NULL;
1495         }
1496         if (icon->section) {
1497                 free((void *)icon->section);
1498                 icon->section = NULL;
1499         }
1500         if (icon->size) {
1501                 free((void *)icon->size);
1502                 icon->size = NULL;
1503         }
1504         if (icon->resolution) {
1505                 free((void *)icon->resolution);
1506                 icon->resolution = NULL;
1507         }
1508         free((void*)icon);
1509         icon = NULL;
1510 }
1511
1512 static void __ps_free_image(image_x *image)
1513 {
1514         if (image == NULL)
1515                 return;
1516         if (image->text) {
1517                 free((void *)image->text);
1518                 image->text = NULL;
1519         }
1520         if (image->lang) {
1521                 free((void *)image->lang);
1522                 image->lang = NULL;
1523         }
1524         if (image->name) {
1525                 free((void *)image->name);
1526                 image->name= NULL;
1527         }
1528         if (image->section) {
1529                 free((void *)image->section);
1530                 image->section = NULL;
1531         }
1532         free((void*)image);
1533         image = NULL;
1534 }
1535
1536 static void __ps_free_operation(operation_x *operation)
1537 {
1538         if (operation == NULL)
1539                 return;
1540         if (operation->text) {
1541                 free((void *)operation->text);
1542                 operation->text = NULL;
1543         }
1544         free((void*)operation);
1545         operation = NULL;
1546 }
1547
1548 static void __ps_free_uri(uri_x *uri)
1549 {
1550         if (uri == NULL)
1551                 return;
1552         if (uri->text) {
1553                 free((void *)uri->text);
1554                 uri->text = NULL;
1555         }
1556         free((void*)uri);
1557         uri = NULL;
1558 }
1559
1560 static void __ps_free_mime(mime_x *mime)
1561 {
1562         if (mime == NULL)
1563                 return;
1564         if (mime->text) {
1565                 free((void *)mime->text);
1566                 mime->text = NULL;
1567         }
1568         free((void*)mime);
1569         mime = NULL;
1570 }
1571
1572 static void __ps_free_subapp(subapp_x *subapp)
1573 {
1574         if (subapp == NULL)
1575                 return;
1576         if (subapp->text) {
1577                 free((void *)subapp->text);
1578                 subapp->text = NULL;
1579         }
1580         free((void*)subapp);
1581         subapp = NULL;
1582 }
1583
1584 static void __ps_free_condition(condition_x *condition)
1585 {
1586         if (condition == NULL)
1587                 return;
1588         if (condition->text) {
1589                 free((void *)condition->text);
1590                 condition->text = NULL;
1591         }
1592         if (condition->name) {
1593                 free((void *)condition->name);
1594                 condition->name = NULL;
1595         }
1596         free((void*)condition);
1597         condition = NULL;
1598 }
1599
1600 static void __ps_free_notification(notification_x *notification)
1601 {
1602         if (notification == NULL)
1603                 return;
1604         if (notification->text) {
1605                 free((void *)notification->text);
1606                 notification->text = NULL;
1607         }
1608         if (notification->name) {
1609                 free((void *)notification->name);
1610                 notification->name = NULL;
1611         }
1612         free((void*)notification);
1613         notification = NULL;
1614 }
1615
1616 static void __ps_free_compatibility(compatibility_x *compatibility)
1617 {
1618         if (compatibility == NULL)
1619                 return;
1620         if (compatibility->text) {
1621                 free((void *)compatibility->text);
1622                 compatibility->text = NULL;
1623         }
1624         if (compatibility->name) {
1625                 free((void *)compatibility->name);
1626                 compatibility->name = NULL;
1627         }
1628         free((void*)compatibility);
1629         compatibility = NULL;
1630 }
1631
1632 static void __ps_free_resolution(resolution_x *resolution)
1633 {
1634         if (resolution == NULL)
1635                 return;
1636         if (resolution->mimetype) {
1637                 free((void *)resolution->mimetype);
1638                 resolution->mimetype = NULL;
1639         }
1640         if (resolution->urischeme) {
1641                 free((void *)resolution->urischeme);
1642                 resolution->urischeme = NULL;
1643         }
1644         free((void*)resolution);
1645         resolution = NULL;
1646 }
1647
1648 static void __ps_free_capability(capability_x *capability)
1649 {
1650         if (capability == NULL)
1651                 return;
1652         if (capability->operationid) {
1653                 free((void *)capability->operationid);
1654                 capability->operationid = NULL;
1655         }
1656         /*Free Resolution*/
1657         if (capability->resolution) {
1658                 resolution_x *resolution = capability->resolution;
1659                 resolution_x *tmp = NULL;
1660                 while(resolution != NULL) {
1661                         tmp = resolution->next;
1662                         __ps_free_resolution(resolution);
1663                         resolution = tmp;
1664                 }
1665         }
1666         free((void*)capability);
1667         capability = NULL;
1668 }
1669
1670 static void __ps_free_allowed(allowed_x *allowed)
1671 {
1672         if (allowed == NULL)
1673                 return;
1674         if (allowed->name) {
1675                 free((void *)allowed->name);
1676                 allowed->name = NULL;
1677         }
1678         if (allowed->text) {
1679                 free((void *)allowed->text);
1680                 allowed->text = NULL;
1681         }
1682         free((void*)allowed);
1683         allowed = NULL;
1684 }
1685
1686 static void __ps_free_request(request_x *request)
1687 {
1688         if (request == NULL)
1689                 return;
1690         if (request->text) {
1691                 free((void *)request->text);
1692                 request->text = NULL;
1693         }
1694         free((void*)request);
1695         request = NULL;
1696 }
1697
1698 static void __ps_free_datacontrol(datacontrol_x *datacontrol)
1699 {
1700         if (datacontrol == NULL)
1701                 return;
1702         if (datacontrol->providerid) {
1703                 free((void *)datacontrol->providerid);
1704                 datacontrol->providerid = NULL;
1705         }
1706         if (datacontrol->access) {
1707                 free((void *)datacontrol->access);
1708                 datacontrol->access = NULL;
1709         }
1710         if (datacontrol->type) {
1711                 free((void *)datacontrol->type);
1712                 datacontrol->type = NULL;
1713         }
1714         free((void*)datacontrol);
1715         datacontrol = NULL;
1716 }
1717
1718 static void __ps_free_launchconditions(launchconditions_x *launchconditions)
1719 {
1720         if (launchconditions == NULL)
1721                 return;
1722         if (launchconditions->text) {
1723                 free((void *)launchconditions->text);
1724                 launchconditions->text = NULL;
1725         }
1726         /*Free Condition*/
1727         if (launchconditions->condition) {
1728                 condition_x *condition = launchconditions->condition;
1729                 condition_x *tmp = NULL;
1730                 while(condition != NULL) {
1731                         tmp = condition->next;
1732                         __ps_free_condition(condition);
1733                         condition = tmp;
1734                 }
1735         }
1736         free((void*)launchconditions);
1737         launchconditions = NULL;
1738 }
1739
1740 static void __ps_free_appcontrol(appcontrol_x *appcontrol)
1741 {
1742         if (appcontrol == NULL)
1743                 return;
1744         /*Free Operation*/
1745         if (appcontrol->operation)
1746                 free(appcontrol->operation);
1747         /*Free Uri*/
1748         if (appcontrol->uri)
1749                 free(appcontrol->uri);
1750         /*Free Mime*/
1751         if (appcontrol->mime)
1752                 free(appcontrol->mime);
1753         free((void*)appcontrol);
1754         appcontrol = NULL;
1755 }
1756
1757 static void __ps_free_appsvc(appsvc_x *appsvc)
1758 {
1759         if (appsvc == NULL)
1760                 return;
1761         if (appsvc->text) {
1762                 free((void *)appsvc->text);
1763                 appsvc->text = NULL;
1764         }
1765         /*Free Operation*/
1766         if (appsvc->operation) {
1767                 operation_x *operation = appsvc->operation;
1768                 operation_x *tmp = NULL;
1769                 while(operation != NULL) {
1770                         tmp = operation->next;
1771                         __ps_free_operation(operation);
1772                         operation = tmp;
1773                 }
1774         }
1775         /*Free Uri*/
1776         if (appsvc->uri) {
1777                 uri_x *uri = appsvc->uri;
1778                 uri_x *tmp = NULL;
1779                 while(uri != NULL) {
1780                         tmp = uri->next;
1781                         __ps_free_uri(uri);
1782                         uri = tmp;
1783                 }
1784         }
1785         /*Free Mime*/
1786         if (appsvc->mime) {
1787                 mime_x *mime = appsvc->mime;
1788                 mime_x *tmp = NULL;
1789                 while(mime != NULL) {
1790                         tmp = mime->next;
1791                         __ps_free_mime(mime);
1792                         mime = tmp;
1793                 }
1794         }
1795         /*Free subapp*/
1796         if (appsvc->subapp) {
1797                 subapp_x *subapp = appsvc->subapp;
1798                 subapp_x *tmp = NULL;
1799                 while(subapp != NULL) {
1800                         tmp = subapp->next;
1801                         __ps_free_subapp(subapp);
1802                         subapp = tmp;
1803                 }
1804         }
1805         free((void*)appsvc);
1806         appsvc = NULL;
1807 }
1808
1809 static void __ps_free_deviceprofile(deviceprofile_x *deviceprofile)
1810 {
1811         return;
1812 }
1813
1814 static void __ps_free_define(define_x *define)
1815 {
1816         if (define == NULL)
1817                 return;
1818         if (define->path) {
1819                 free((void *)define->path);
1820                 define->path = NULL;
1821         }
1822         /*Free Request*/
1823         if (define->request) {
1824                 request_x *request = define->request;
1825                 request_x *tmp = NULL;
1826                 while(request != NULL) {
1827                         tmp = request->next;
1828                         __ps_free_request(request);
1829                         request = tmp;
1830                 }
1831         }
1832         /*Free Allowed*/
1833         if (define->allowed) {
1834                 allowed_x *allowed = define->allowed;
1835                 allowed_x *tmp = NULL;
1836                 while(allowed != NULL) {
1837                         tmp = allowed->next;
1838                         __ps_free_allowed(allowed);
1839                         allowed = tmp;
1840                 }
1841         }
1842         free((void*)define);
1843         define = NULL;
1844 }
1845
1846 static void __ps_free_datashare(datashare_x *datashare)
1847 {
1848         if (datashare == NULL)
1849                 return;
1850         /*Free Define*/
1851         if (datashare->define) {
1852                 define_x *define =  datashare->define;
1853                 define_x *tmp = NULL;
1854                 while(define != NULL) {
1855                         tmp = define->next;
1856                         __ps_free_define(define);
1857                         define = tmp;
1858                 }
1859         }
1860         /*Free Request*/
1861         if (datashare->request) {
1862                 request_x *request = datashare->request;
1863                 request_x *tmp = NULL;
1864                 while(request != NULL) {
1865                         tmp = request->next;
1866                         __ps_free_request(request);
1867                         request = tmp;
1868                 }
1869         }
1870         free((void*)datashare);
1871         datashare = NULL;
1872 }
1873
1874 static void __ps_free_label(label_x *label)
1875 {
1876         if (label == NULL)
1877                 return;
1878         if (label->name) {
1879                 free((void *)label->name);
1880                 label->name = NULL;
1881         }
1882         if (label->text) {
1883                 free((void *)label->text);
1884                 label->text = NULL;
1885         }
1886         if (label->lang) {
1887                 free((void *)label->lang);
1888                 label->lang= NULL;
1889         }
1890         free((void*)label);
1891         label = NULL;
1892 }
1893
1894 static void __ps_free_author(author_x *author)
1895 {
1896         if (author == NULL)
1897                 return;
1898         if (author->email) {
1899                 free((void *)author->email);
1900                 author->email = NULL;
1901         }
1902         if (author->text) {
1903                 free((void *)author->text);
1904                 author->text = NULL;
1905         }
1906         if (author->href) {
1907                 free((void *)author->href);
1908                 author->href = NULL;
1909         }
1910         if (author->lang) {
1911                 free((void *)author->lang);
1912                 author->lang = NULL;
1913         }
1914         free((void*)author);
1915         author = NULL;
1916 }
1917
1918 static void __ps_free_description(description_x *description)
1919 {
1920         if (description == NULL)
1921                 return;
1922         if (description->name) {
1923                 free((void *)description->name);
1924                 description->name = NULL;
1925         }
1926         if (description->text) {
1927                 free((void *)description->text);
1928                 description->text = NULL;
1929         }
1930         if (description->lang) {
1931                 free((void *)description->lang);
1932                 description->lang = NULL;
1933         }
1934         free((void*)description);
1935         description = NULL;
1936 }
1937
1938 static void __ps_free_license(license_x *license)
1939 {
1940         if (license == NULL)
1941                 return;
1942         if (license->text) {
1943                 free((void *)license->text);
1944                 license->text = NULL;
1945         }
1946         if (license->lang) {
1947                 free((void *)license->lang);
1948                 license->lang = NULL;
1949         }
1950         free((void*)license);
1951         license = NULL;
1952 }
1953
1954 static void __ps_free_uiapplication(uiapplication_x *uiapplication)
1955 {
1956         if (uiapplication == NULL)
1957                 return;
1958         if (uiapplication->exec) {
1959                 free((void *)uiapplication->exec);
1960                 uiapplication->exec = NULL;
1961         }
1962         if (uiapplication->appid) {
1963                 free((void *)uiapplication->appid);
1964                 uiapplication->appid = NULL;
1965         }
1966         if (uiapplication->nodisplay) {
1967                 free((void *)uiapplication->nodisplay);
1968                 uiapplication->nodisplay = NULL;
1969         }
1970         if (uiapplication->multiple) {
1971                 free((void *)uiapplication->multiple);
1972                 uiapplication->multiple = NULL;
1973         }
1974         if (uiapplication->type) {
1975                 free((void *)uiapplication->type);
1976                 uiapplication->type = NULL;
1977         }
1978         if (uiapplication->categories) {
1979                 free((void *)uiapplication->categories);
1980                 uiapplication->categories = NULL;
1981         }
1982         if (uiapplication->extraid) {
1983                 free((void *)uiapplication->extraid);
1984                 uiapplication->extraid = NULL;
1985         }
1986         if (uiapplication->taskmanage) {
1987                 free((void *)uiapplication->taskmanage);
1988                 uiapplication->taskmanage = NULL;
1989         }
1990         if (uiapplication->enabled) {
1991                 free((void *)uiapplication->enabled);
1992                 uiapplication->enabled = NULL;
1993         }
1994         if (uiapplication->hwacceleration) {
1995                 free((void *)uiapplication->hwacceleration);
1996                 uiapplication->hwacceleration = NULL;
1997         }
1998         if (uiapplication->screenreader) {
1999                 free((void *)uiapplication->screenreader);
2000                 uiapplication->screenreader = NULL;
2001         }
2002         if (uiapplication->mainapp) {
2003                 free((void *)uiapplication->mainapp);
2004                 uiapplication->mainapp = NULL;
2005         }
2006         if (uiapplication->recentimage) {
2007                 free((void *)uiapplication->recentimage);
2008                 uiapplication->recentimage = NULL;
2009         }
2010         if (uiapplication->package) {
2011                 free((void *)uiapplication->package);
2012                 uiapplication->package = NULL;
2013         }
2014         if (uiapplication->launchcondition) {
2015                 free((void *)uiapplication->launchcondition);
2016                 uiapplication->launchcondition = NULL;
2017         }
2018         /*Free Label*/
2019         if (uiapplication->label) {
2020                 label_x *label = uiapplication->label;
2021                 label_x *tmp = NULL;
2022                 while(label != NULL) {
2023                         tmp = label->next;
2024                         __ps_free_label(label);
2025                         label = tmp;
2026                 }
2027         }
2028         /*Free Icon*/
2029         if (uiapplication->icon) {
2030                 icon_x *icon = uiapplication->icon;
2031                 icon_x *tmp = NULL;
2032                 while(icon != NULL) {
2033                         tmp = icon->next;
2034                         __ps_free_icon(icon);
2035                         icon = tmp;
2036                 }
2037         }
2038         /*Free image*/
2039         if (uiapplication->image) {
2040                 image_x *image = uiapplication->image;
2041                 image_x *tmp = NULL;
2042                 while(image != NULL) {
2043                         tmp = image->next;
2044                         __ps_free_image(image);
2045                         image = tmp;
2046                 }
2047         }
2048         /*Free AppControl*/
2049         if (uiapplication->appcontrol) {
2050                 appcontrol_x *appcontrol = uiapplication->appcontrol;
2051                 appcontrol_x *tmp = NULL;
2052                 while(appcontrol != NULL) {
2053                         tmp = appcontrol->next;
2054                         __ps_free_appcontrol(appcontrol);
2055                         appcontrol = tmp;
2056                 }
2057         }
2058         /*Free LaunchConditions*/
2059         if (uiapplication->launchconditions) {
2060                 launchconditions_x *launchconditions = uiapplication->launchconditions;
2061                 launchconditions_x *tmp = NULL;
2062                 while(launchconditions != NULL) {
2063                         tmp = launchconditions->next;
2064                         __ps_free_launchconditions(launchconditions);
2065                         launchconditions = tmp;
2066                 }
2067         }
2068         /*Free Notification*/
2069         if (uiapplication->notification) {
2070                 notification_x *notification = uiapplication->notification;
2071                 notification_x *tmp = NULL;
2072                 while(notification != NULL) {
2073                         tmp = notification->next;
2074                         __ps_free_notification(notification);
2075                         notification = tmp;
2076                 }
2077         }
2078         /*Free DataShare*/
2079         if (uiapplication->datashare) {
2080                 datashare_x *datashare = uiapplication->datashare;
2081                 datashare_x *tmp = NULL;
2082                 while(datashare != NULL) {
2083                         tmp = datashare->next;
2084                         __ps_free_datashare(datashare);
2085                         datashare = tmp;
2086                 }
2087         }
2088         /*Free AppSvc*/
2089         if (uiapplication->appsvc) {
2090                 appsvc_x *appsvc = uiapplication->appsvc;
2091                 appsvc_x *tmp = NULL;
2092                 while(appsvc != NULL) {
2093                         tmp = appsvc->next;
2094                         __ps_free_appsvc(appsvc);
2095                         appsvc = tmp;
2096                 }
2097         }
2098         /*Free Category*/
2099         if (uiapplication->category) {
2100                 category_x *category = uiapplication->category;
2101                 category_x *tmp = NULL;
2102                 while(category != NULL) {
2103                         tmp = category->next;
2104                         __ps_free_category(category);
2105                         category = tmp;
2106                 }
2107         }
2108         /*Free Metadata*/
2109         if (uiapplication->metadata) {
2110                 metadata_x *metadata = uiapplication->metadata;
2111                 metadata_x *tmp = NULL;
2112                 while(metadata != NULL) {
2113                         tmp = metadata->next;
2114                         __ps_free_metadata(metadata);
2115                         metadata = tmp;
2116                 }
2117         }
2118         /*Free permission*/
2119         if (uiapplication->permission) {
2120                 permission_x *permission = uiapplication->permission;
2121                 permission_x *tmp = NULL;
2122                 while(permission != NULL) {
2123                         tmp = permission->next;
2124                         __ps_free_permission(permission);
2125                         permission = tmp;
2126                 }
2127         }
2128         /*Free DataControl*/
2129         if (uiapplication->datacontrol) {
2130                 datacontrol_x *datacontrol = uiapplication->datacontrol;
2131                 datacontrol_x *tmp = NULL;
2132                 while(datacontrol != NULL) {
2133                         tmp = datacontrol->next;
2134                         __ps_free_datacontrol(datacontrol);
2135                         datacontrol = tmp;
2136                 }
2137         }
2138         /* _PRODUCT_LAUNCHING_ENHANCED_ START */
2139         if (uiapplication->indicatordisplay) {
2140                 free((void *)uiapplication->indicatordisplay);
2141                 uiapplication->indicatordisplay = NULL;
2142         }
2143         if (uiapplication->portraitimg) {
2144                 free((void *)uiapplication->portraitimg);
2145                 uiapplication->portraitimg = NULL;
2146         }
2147         if (uiapplication->landscapeimg) {
2148                 free((void *)uiapplication->landscapeimg);
2149                 uiapplication->landscapeimg = NULL;
2150         }
2151         /* _PRODUCT_LAUNCHING_ENHANCED_ END */
2152         if (uiapplication->guestmode_visibility) {
2153                 free((void *)uiapplication->guestmode_visibility);
2154                 uiapplication->guestmode_visibility = NULL;
2155         }
2156         if (uiapplication->app_component) {
2157                 free((void *)uiapplication->app_component);
2158                 uiapplication->app_component = NULL;
2159         }
2160         if (uiapplication->permission_type) {
2161                 free((void *)uiapplication->permission_type);
2162                 uiapplication->permission_type = NULL;
2163         }
2164         if (uiapplication->component_type) {
2165                 free((void *)uiapplication->component_type);
2166                 uiapplication->component_type = NULL;
2167         }
2168         if (uiapplication->preload) {
2169                 free((void *)uiapplication->preload);
2170                 uiapplication->preload = NULL;
2171         }
2172         if (uiapplication->submode) {
2173                 free((void *)uiapplication->submode);
2174                 uiapplication->submode = NULL;
2175         }
2176         if (uiapplication->submode_mainid) {
2177                 free((void *)uiapplication->submode_mainid);
2178                 uiapplication->submode_mainid = NULL;
2179         }
2180
2181         free((void*)uiapplication);
2182         uiapplication = NULL;
2183 }
2184
2185 static void __ps_free_serviceapplication(serviceapplication_x *serviceapplication)
2186 {
2187         if (serviceapplication == NULL)
2188                 return;
2189         if (serviceapplication->exec) {
2190                 free((void *)serviceapplication->exec);
2191                 serviceapplication->exec = NULL;
2192         }
2193         if (serviceapplication->appid) {
2194                 free((void *)serviceapplication->appid);
2195                 serviceapplication->appid = NULL;
2196         }
2197         if (serviceapplication->onboot) {
2198                 free((void *)serviceapplication->onboot);
2199                 serviceapplication->onboot = NULL;
2200         }
2201         if (serviceapplication->autorestart) {
2202                 free((void *)serviceapplication->autorestart);
2203                 serviceapplication->autorestart = NULL;
2204         }
2205         if (serviceapplication->type) {
2206                 free((void *)serviceapplication->type);
2207                 serviceapplication->type = NULL;
2208         }
2209         if (serviceapplication->enabled) {
2210                 free((void *)serviceapplication->enabled);
2211                 serviceapplication->enabled = NULL;
2212         }
2213         if (serviceapplication->package) {
2214                 free((void *)serviceapplication->package);
2215                 serviceapplication->package = NULL;
2216         }
2217         if (serviceapplication->permission_type) {
2218                 free((void *)serviceapplication->permission_type);
2219                 serviceapplication->permission_type = NULL;
2220         }
2221         /*Free Label*/
2222         if (serviceapplication->label) {
2223                 label_x *label = serviceapplication->label;
2224                 label_x *tmp = NULL;
2225                 while(label != NULL) {
2226                         tmp = label->next;
2227                         __ps_free_label(label);
2228                         label = tmp;
2229                 }
2230         }
2231         /*Free Icon*/
2232         if (serviceapplication->icon) {
2233                 icon_x *icon = serviceapplication->icon;
2234                 icon_x *tmp = NULL;
2235                 while(icon != NULL) {
2236                         tmp = icon->next;
2237                         __ps_free_icon(icon);
2238                         icon = tmp;
2239                 }
2240         }
2241         /*Free AppControl*/
2242         if (serviceapplication->appcontrol) {
2243                 appcontrol_x *appcontrol = serviceapplication->appcontrol;
2244                 appcontrol_x *tmp = NULL;
2245                 while(appcontrol != NULL) {
2246                         tmp = appcontrol->next;
2247                         __ps_free_appcontrol(appcontrol);
2248                         appcontrol = tmp;
2249                 }
2250         }
2251         /*Free DataControl*/
2252         if (serviceapplication->datacontrol) {
2253                 datacontrol_x *datacontrol = serviceapplication->datacontrol;
2254                 datacontrol_x *tmp = NULL;
2255                 while(datacontrol != NULL) {
2256                         tmp = datacontrol->next;
2257                         __ps_free_datacontrol(datacontrol);
2258                         datacontrol = tmp;
2259                 }
2260         }
2261         /*Free LaunchConditions*/
2262         if (serviceapplication->launchconditions) {
2263                 launchconditions_x *launchconditions = serviceapplication->launchconditions;
2264                 launchconditions_x *tmp = NULL;
2265                 while(launchconditions != NULL) {
2266                         tmp = launchconditions->next;
2267                         __ps_free_launchconditions(launchconditions);
2268                         launchconditions = tmp;
2269                 }
2270         }
2271         /*Free Notification*/
2272         if (serviceapplication->notification) {
2273                 notification_x *notification = serviceapplication->notification;
2274                 notification_x *tmp = NULL;
2275                 while(notification != NULL) {
2276                         tmp = notification->next;
2277                         __ps_free_notification(notification);
2278                         notification = tmp;
2279                 }
2280         }
2281         /*Free DataShare*/
2282         if (serviceapplication->datashare) {
2283                 datashare_x *datashare = serviceapplication->datashare;
2284                 datashare_x *tmp = NULL;
2285                 while(datashare != NULL) {
2286                         tmp = datashare->next;
2287                         __ps_free_datashare(datashare);
2288                         datashare = tmp;
2289                 }
2290         }
2291         /*Free AppSvc*/
2292         if (serviceapplication->appsvc) {
2293                 appsvc_x *appsvc = serviceapplication->appsvc;
2294                 appsvc_x *tmp = NULL;
2295                 while(appsvc != NULL) {
2296                         tmp = appsvc->next;
2297                         __ps_free_appsvc(appsvc);
2298                         appsvc = tmp;
2299                 }
2300         }
2301         /*Free Category*/
2302         if (serviceapplication->category) {
2303                 category_x *category = serviceapplication->category;
2304                 category_x *tmp = NULL;
2305                 while(category != NULL) {
2306                         tmp = category->next;
2307                         __ps_free_category(category);
2308                         category = tmp;
2309                 }
2310         }
2311         /*Free Metadata*/
2312         if (serviceapplication->metadata) {
2313                 metadata_x *metadata = serviceapplication->metadata;
2314                 metadata_x *tmp = NULL;
2315                 while(metadata != NULL) {
2316                         tmp = metadata->next;
2317                         __ps_free_metadata(metadata);
2318                         metadata = tmp;
2319                 }
2320         }
2321         /*Free permission*/
2322         if (serviceapplication->permission) {
2323                 permission_x *permission = serviceapplication->permission;
2324                 permission_x *tmp = NULL;
2325                 while(permission != NULL) {
2326                         tmp = permission->next;
2327                         __ps_free_permission(permission);
2328                         permission = tmp;
2329                 }
2330         }
2331         free((void*)serviceapplication);
2332         serviceapplication = NULL;
2333 }
2334
2335 static void __ps_free_font(font_x *font)
2336 {
2337         if (font == NULL)
2338                 return;
2339         if (font->name) {
2340                 free((void *)font->name);
2341                 font->name = NULL;
2342         }
2343         if (font->text) {
2344                 free((void *)font->text);
2345                 font->text = NULL;
2346         }
2347         free((void*)font);
2348         font = NULL;
2349 }
2350
2351 static void __ps_free_theme(theme_x *theme)
2352 {
2353         if (theme == NULL)
2354                 return;
2355         if (theme->name) {
2356                 free((void *)theme->name);
2357                 theme->name = NULL;
2358         }
2359         if (theme->text) {
2360                 free((void *)theme->text);
2361                 theme->text = NULL;
2362         }
2363         free((void*)theme);
2364         theme = NULL;
2365 }
2366
2367 static void __ps_free_daemon(daemon_x *daemon)
2368 {
2369         if (daemon == NULL)
2370                 return;
2371         if (daemon->name) {
2372                 free((void *)daemon->name);
2373                 daemon->name = NULL;
2374         }
2375         if (daemon->text) {
2376                 free((void *)daemon->text);
2377                 daemon->text = NULL;
2378         }
2379         free((void*)daemon);
2380         daemon = NULL;
2381 }
2382
2383 static void __ps_free_ime(ime_x *ime)
2384 {
2385         if (ime == NULL)
2386                 return;
2387         if (ime->name) {
2388                 free((void *)ime->name);
2389                 ime->name = NULL;
2390         }
2391         if (ime->text) {
2392                 free((void *)ime->text);
2393                 ime->text = NULL;
2394         }
2395         free((void*)ime);
2396         ime = NULL;
2397 }
2398
2399 int __ps_process_tag_parser(manifest_x *mfx, const char *filename, ACTION_TYPE action)
2400 {
2401         xmlTextReaderPtr reader;
2402         xmlDocPtr docPtr;
2403         int ret = -1;
2404         FILE *fp = NULL;
2405         void *lib_handle = NULL;
2406         char tag[PKG_STRING_LEN_MAX] = { 0 };
2407
2408         fp = fopen(TAG_PARSER_LIST, "r");
2409         retvm_if(fp == NULL, PMINFO_R_ERROR, "no preload list");
2410
2411         while (fgets(tag, sizeof(tag), fp) != NULL) {
2412                 __str_trim(tag);
2413
2414                 lib_handle = __open_lib_handle(tag);
2415                 if (lib_handle == NULL)
2416                         continue;
2417
2418                 ret = __parser_send_tag(lib_handle, action, PLUGIN_PRE_PROCESS, mfx->package);
2419                 _LOGD("PLUGIN_PRE_PROCESS[%s, %s] ACTION_TYPE[%d] result[%d]\n", mfx->package, tag, action, ret);
2420
2421                 docPtr = xmlReadFile(filename, NULL, 0);
2422                 reader = xmlReaderWalker(docPtr);
2423                 if (reader != NULL) {
2424                         ret = xmlTextReaderRead(reader);
2425                         while (ret == 1) {
2426                                 __processTag(lib_handle, reader, action, tag, mfx->package);
2427                                 ret = xmlTextReaderRead(reader);
2428                         }
2429                         xmlFreeTextReader(reader);
2430
2431                         if (ret != 0) {
2432                                 _LOGD("%s : failed to parse", filename);
2433                         }
2434                 } else {
2435                         _LOGD("Unable to open %s", filename);
2436                 }
2437
2438                 ret = __parser_send_tag(lib_handle, action, PLUGIN_POST_PROCESS, mfx->package);
2439                 _LOGD("PLUGIN_POST_PROCESS[%s, %s] ACTION_TYPE[%d] result[%d]\n", mfx->package, tag, action, ret);
2440
2441                 __close_lib_handle(lib_handle);
2442
2443                 memset(tag, 0x00, sizeof(tag));
2444         }
2445
2446         if (fp != NULL)
2447                 fclose(fp);
2448
2449         return 0;
2450 }
2451
2452 int __ps_process_metadata_parser(manifest_x *mfx, ACTION_TYPE action)
2453 {
2454         fprintf(stdout,"__ps_process_metadata_parser\n");
2455         int ret = -1;
2456         FILE *fp = NULL;
2457         char md_key[PKG_STRING_LEN_MAX] = { 0 };
2458
2459         fp = fopen(METADATA_PARSER_LIST, "r");
2460         if (fp == NULL) {
2461                 _LOGD("no preload list\n");
2462                 return -1;
2463         }
2464         
2465         while (fgets(md_key, sizeof(md_key), fp) != NULL) {
2466                 __str_trim(md_key);
2467                 ret = __run_metadata_parser_prestep(mfx, md_key, action);
2468
2469                 memset(md_key, 0x00, sizeof(md_key));
2470         }
2471
2472         if (fp != NULL)
2473                 fclose(fp);
2474
2475         return 0;
2476 }
2477
2478 int __ps_process_category_parser(manifest_x *mfx, ACTION_TYPE action)
2479 {
2480         int ret = -1;
2481         FILE *fp = NULL;
2482         char category_key[PKG_STRING_LEN_MAX] = { 0 };
2483
2484         fp = fopen(CATEGORY_PARSER_LIST, "r");
2485         if (fp == NULL) {
2486                 _LOGD("no category parser list\n");
2487                 return -1;
2488         }
2489
2490         while (fgets(category_key, sizeof(category_key), fp) != NULL) {
2491                 __str_trim(category_key);
2492                 ret = __run_category_parser_prestep(mfx, category_key, action);
2493
2494                 memset(category_key, 0x00, sizeof(category_key));
2495         }
2496
2497         if (fp != NULL)
2498                 fclose(fp);
2499
2500         return 0;
2501 }
2502
2503 static int __ps_process_allowed(xmlTextReaderPtr reader, allowed_x *allowed)
2504 {
2505         xmlTextReaderRead(reader);
2506         if (xmlTextReaderValue(reader))
2507                 allowed->text = ASCII(xmlTextReaderValue(reader));
2508         return 0;
2509 }
2510
2511 static int __ps_process_operation(xmlTextReaderPtr reader, operation_x *operation)
2512 {
2513         if (xmlTextReaderGetAttribute(reader, XMLCHAR("name")))
2514                 operation->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name")));
2515 /* Text does not exist. Only attribute exists
2516         xmlTextReaderRead(reader);
2517         if (xmlTextReaderValue(reader))
2518                 operation->text = ASCII(xmlTextReaderValue(reader));
2519 */
2520         return 0;
2521 }
2522
2523 static int __ps_process_uri(xmlTextReaderPtr reader, uri_x *uri)
2524 {
2525         if (xmlTextReaderGetAttribute(reader, XMLCHAR("name")))
2526                 uri->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name")));
2527 /* Text does not exist. Only attribute exists
2528         xmlTextReaderRead(reader);
2529         if (xmlTextReaderValue(reader))
2530                 uri->text = ASCII(xmlTextReaderValue(reader));
2531 */
2532         return 0;
2533 }
2534
2535 static int __ps_process_mime(xmlTextReaderPtr reader, mime_x *mime)
2536 {
2537         if (xmlTextReaderGetAttribute(reader, XMLCHAR("name")))
2538                 mime->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name")));
2539 /* Text does not exist. Only attribute exists
2540         xmlTextReaderRead(reader);
2541         if (xmlTextReaderValue(reader))
2542                 mime->text = ASCII(xmlTextReaderValue(reader));
2543 */
2544         return 0;
2545 }
2546
2547 static int __ps_process_subapp(xmlTextReaderPtr reader, subapp_x *subapp)
2548 {
2549         if (xmlTextReaderGetAttribute(reader, XMLCHAR("name")))
2550                 subapp->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name")));
2551 /* Text does not exist. Only attribute exists
2552         xmlTextReaderRead(reader);
2553         if (xmlTextReaderValue(reader))
2554                 mime->text = ASCII(xmlTextReaderValue(reader));
2555 */
2556         return 0;
2557 }
2558
2559 static int __ps_process_condition(xmlTextReaderPtr reader, condition_x *condition)
2560 {
2561         if (xmlTextReaderGetAttribute(reader, XMLCHAR("name")))
2562                 condition->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name")));
2563         xmlTextReaderRead(reader);
2564         if (xmlTextReaderValue(reader))
2565                 condition->text = ASCII(xmlTextReaderValue(reader));
2566         return 0;
2567 }
2568
2569 static int __ps_process_notification(xmlTextReaderPtr reader, notification_x *notification)
2570 {
2571         if (xmlTextReaderGetAttribute(reader, XMLCHAR("name")))
2572                 notification->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name")));
2573         xmlTextReaderRead(reader);
2574         if (xmlTextReaderValue(reader))
2575                 notification->text = ASCII(xmlTextReaderValue(reader));
2576         return 0;
2577 }
2578
2579 static int __ps_process_category(xmlTextReaderPtr reader, category_x *category)
2580 {
2581         if (xmlTextReaderGetAttribute(reader, XMLCHAR("name")))
2582                 category->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name")));
2583         return 0;
2584 }
2585
2586 static int __ps_process_privilege(xmlTextReaderPtr reader, privilege_x *privilege)
2587 {
2588         xmlTextReaderRead(reader);
2589         if (xmlTextReaderValue(reader)) {
2590                 privilege->text = ASCII(xmlTextReaderValue(reader));
2591         }
2592         return 0;
2593 }
2594
2595 static int __ps_process_metadata(xmlTextReaderPtr reader, metadata_x *metadata)
2596 {
2597         if (xmlTextReaderGetAttribute(reader, XMLCHAR("key")))
2598                 metadata->key = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("key")));
2599         if (xmlTextReaderGetAttribute(reader, XMLCHAR("value")))
2600                 metadata->value = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("value")));
2601         return 0;
2602 }
2603
2604 static int __ps_process_permission(xmlTextReaderPtr reader, permission_x *permission)
2605 {
2606         if (xmlTextReaderGetAttribute(reader, XMLCHAR("type")))
2607                 permission->type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("type")));
2608
2609         xmlTextReaderRead(reader);
2610         if (xmlTextReaderValue(reader))
2611                 permission->value = ASCII(xmlTextReaderValue(reader));
2612         return 0;
2613 }
2614
2615 static int __ps_process_compatibility(xmlTextReaderPtr reader, compatibility_x *compatibility)
2616 {
2617         if (xmlTextReaderGetAttribute(reader, XMLCHAR("name")))
2618                 compatibility->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name")));
2619         xmlTextReaderRead(reader);
2620         if (xmlTextReaderValue(reader))
2621                 compatibility->text = ASCII(xmlTextReaderValue(reader));
2622         return 0;
2623 }
2624
2625 static int __ps_process_resolution(xmlTextReaderPtr reader, resolution_x *resolution)
2626 {
2627         if (xmlTextReaderGetAttribute(reader, XMLCHAR("mime-type")))
2628                 resolution->mimetype = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("mime-type")));
2629         if (xmlTextReaderGetAttribute(reader, XMLCHAR("uri-scheme")))
2630                 resolution->urischeme = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("uri-scheme")));
2631         return 0;
2632 }
2633
2634 static int __ps_process_request(xmlTextReaderPtr reader, request_x *request)
2635 {
2636         xmlTextReaderRead(reader);
2637         if (xmlTextReaderValue(reader))
2638                 request->text = ASCII(xmlTextReaderValue(reader));
2639         return 0;
2640 }
2641
2642 static int __ps_process_define(xmlTextReaderPtr reader, define_x *define)
2643 {
2644         const xmlChar *node;
2645         int ret = -1;
2646         int depth = -1;
2647         allowed_x *tmp1 = NULL;
2648         request_x *tmp2 = NULL;
2649
2650         if (xmlTextReaderGetAttribute(reader, XMLCHAR("path")))
2651                 define->path = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("path")));
2652
2653         depth = xmlTextReaderDepth(reader);
2654         while ((ret = __next_child_element(reader, depth))) {
2655                 node = xmlTextReaderConstName(reader);
2656                 if (!node) {
2657                         _LOGD("xmlTextReaderConstName value is NULL\n");
2658                         return -1;
2659                 }
2660
2661                 if (!strcmp(ASCII(node), "allowed")) {
2662                         allowed_x *allowed= malloc(sizeof(allowed_x));
2663                         if (allowed == NULL) {
2664                                 _LOGD("Malloc Failed\n");
2665                                 return -1;
2666                         }
2667                         memset(allowed, '\0', sizeof(allowed_x));
2668                         LISTADD(define->allowed, allowed);
2669                         ret = __ps_process_allowed(reader, allowed);
2670                 } else if (!strcmp(ASCII(node), "request")) {
2671                         request_x *request = malloc(sizeof(request_x));
2672                         if (request == NULL) {
2673                                 _LOGD("Malloc Failed\n");
2674                                 return -1;
2675                         }
2676                         memset(request, '\0', sizeof(request_x));
2677                         LISTADD(define->request, request);
2678                         ret = __ps_process_request(reader, request);
2679                 } else
2680                         return -1;
2681                 if (ret < 0) {
2682                         _LOGD("Processing define failed\n");
2683                         return ret;
2684                 }
2685         }
2686         if (define->allowed) {
2687                 LISTHEAD(define->allowed, tmp1);
2688                 define->allowed = tmp1;
2689         }
2690         if (define->request) {
2691                 LISTHEAD(define->request, tmp2);
2692                 define->request = tmp2;
2693         }
2694         return ret;
2695 }
2696
2697 static int __ps_process_appcontrol(xmlTextReaderPtr reader, appcontrol_x *appcontrol)
2698 {
2699         const xmlChar *node;
2700         int ret = -1;
2701         int depth = -1;
2702
2703         depth = xmlTextReaderDepth(reader);
2704         while ((ret = __next_child_element(reader, depth))) {
2705                 node = xmlTextReaderConstName(reader);
2706                 if (!node) {
2707                         _LOGD("xmlTextReaderConstName value is NULL\n");
2708                         return -1;
2709                 }
2710
2711                 if (!strcmp(ASCII(node), "operation")) {
2712                         appcontrol->operation = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name")));
2713                         _LOGD("operation processing\n");
2714                 } else if (!strcmp(ASCII(node), "uri")) {
2715                         appcontrol->uri = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name")));
2716                         _LOGD("uri processing\n");
2717                 } else if (!strcmp(ASCII(node), "mime")) {
2718                         appcontrol->mime = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name")));
2719                         _LOGD("mime processing\n");
2720                 } else
2721                         return -1;
2722                 if (ret < 0) {
2723                         _LOGD("Processing appcontrol failed\n");
2724                         return ret;
2725                 }
2726         }
2727
2728         return ret;
2729 }
2730
2731 static int __ps_process_appsvc(xmlTextReaderPtr reader, appsvc_x *appsvc)
2732 {
2733         const xmlChar *node;
2734         int ret = -1;
2735         int depth = -1;
2736         operation_x *tmp1 = NULL;
2737         uri_x *tmp2 = NULL;
2738         mime_x *tmp3 = NULL;
2739         subapp_x *tmp4 = NULL;
2740
2741         depth = xmlTextReaderDepth(reader);
2742         while ((ret = __next_child_element(reader, depth))) {
2743                 node = xmlTextReaderConstName(reader);
2744                 if (!node) {
2745                         _LOGD("xmlTextReaderConstName value is NULL\n");
2746                         return -1;
2747                 }
2748
2749                 if (!strcmp(ASCII(node), "operation")) {
2750                         operation_x *operation = malloc(sizeof(operation_x));
2751                         if (operation == NULL) {
2752                                 _LOGD("Malloc Failed\n");
2753                                 return -1;
2754                         }
2755                         memset(operation, '\0', sizeof(operation_x));
2756                         LISTADD(appsvc->operation, operation);
2757                         ret = __ps_process_operation(reader, operation);
2758                         _LOGD("operation processing\n");
2759                 } else if (!strcmp(ASCII(node), "uri")) {
2760                         uri_x *uri= malloc(sizeof(uri_x));
2761                         if (uri == NULL) {
2762                                 _LOGD("Malloc Failed\n");
2763                                 return -1;
2764                         }
2765                         memset(uri, '\0', sizeof(uri_x));
2766                         LISTADD(appsvc->uri, uri);
2767                         ret = __ps_process_uri(reader, uri);
2768                         _LOGD("uri processing\n");
2769                 } else if (!strcmp(ASCII(node), "mime")) {
2770                         mime_x *mime = malloc(sizeof(mime_x));
2771                         if (mime == NULL) {
2772                                 _LOGD("Malloc Failed\n");
2773                                 return -1;
2774                         }
2775                         memset(mime, '\0', sizeof(mime_x));
2776                         LISTADD(appsvc->mime, mime);
2777                         ret = __ps_process_mime(reader, mime);
2778                         _LOGD("mime processing\n");
2779                 } else if (!strcmp(ASCII(node), "subapp")) {
2780                         subapp_x *subapp = malloc(sizeof(subapp_x));
2781                         if (subapp == NULL) {
2782                                 _LOGD("Malloc Failed\n");
2783                                 return -1;
2784                         }
2785                         memset(subapp, '\0', sizeof(subapp_x));
2786                         LISTADD(appsvc->subapp, subapp);
2787                         ret = __ps_process_subapp(reader, subapp);
2788                         _LOGD("subapp processing\n");
2789                 } else
2790                         return -1;
2791                 if (ret < 0) {
2792                         _LOGD("Processing appsvc failed\n");
2793                         return ret;
2794                 }
2795         }
2796         if (appsvc->operation) {
2797                 LISTHEAD(appsvc->operation, tmp1);
2798                 appsvc->operation = tmp1;
2799         }
2800         if (appsvc->uri) {
2801                 LISTHEAD(appsvc->uri, tmp2);
2802                 appsvc->uri = tmp2;
2803         }
2804         if (appsvc->mime) {
2805                 LISTHEAD(appsvc->mime, tmp3);
2806                 appsvc->mime = tmp3;
2807         }
2808         if (appsvc->subapp) {
2809                 LISTHEAD(appsvc->subapp, tmp4);
2810                 appsvc->subapp = tmp4;
2811         }
2812
2813         xmlTextReaderRead(reader);
2814         if (xmlTextReaderValue(reader))
2815                 appsvc->text = ASCII(xmlTextReaderValue(reader));
2816
2817         return ret;
2818 }
2819
2820
2821 static int __ps_process_privileges(xmlTextReaderPtr reader, privileges_x *privileges)
2822 {
2823         const xmlChar *node;
2824         int ret = -1;
2825         int depth = -1;
2826         privilege_x *tmp1 = NULL;
2827
2828         depth = xmlTextReaderDepth(reader);
2829         while ((ret = __next_child_element(reader, depth))) {
2830                 node = xmlTextReaderConstName(reader);
2831                 if (!node) {
2832                         _LOGD("xmlTextReaderConstName value is NULL\n");
2833                         return -1;
2834                 }
2835
2836                 if (strcmp(ASCII(node), "privilege") == 0) {
2837                         privilege_x *privilege = malloc(sizeof(privilege_x));
2838                         if (privilege == NULL) {
2839                                 _LOGD("Malloc Failed\n");
2840                                 return -1;
2841                         }
2842                         memset(privilege, '\0', sizeof(privilege_x));
2843                         LISTADD(privileges->privilege, privilege);
2844                         ret = __ps_process_privilege(reader, privilege);
2845                 } else
2846                         return -1;
2847                 if (ret < 0) {
2848                         _LOGD("Processing privileges failed\n");
2849                         return ret;
2850                 }
2851         }
2852         if (privileges->privilege) {
2853                 LISTHEAD(privileges->privilege, tmp1);
2854                 privileges->privilege = tmp1;
2855         }
2856         return ret;
2857 }
2858
2859 static int __ps_process_launchconditions(xmlTextReaderPtr reader, launchconditions_x *launchconditions)
2860 {
2861         const xmlChar *node;
2862         int ret = -1;
2863         int depth = -1;
2864         condition_x *tmp1 = NULL;
2865
2866         depth = xmlTextReaderDepth(reader);
2867         while ((ret = __next_child_element(reader, depth))) {
2868                 node = xmlTextReaderConstName(reader);
2869                 if (!node) {
2870                         _LOGD("xmlTextReaderConstName value is NULL\n");
2871                         return -1;
2872                 }
2873
2874                 if (strcmp(ASCII(node), "condition") == 0) {
2875                         condition_x *condition = malloc(sizeof(condition_x));
2876                         if (condition == NULL) {
2877                                 _LOGD("Malloc Failed\n");
2878                                 return -1;
2879                         }
2880                         memset(condition, '\0', sizeof(condition_x));
2881                         LISTADD(launchconditions->condition, condition);
2882                         ret = __ps_process_condition(reader, condition);
2883                 } else
2884                         return -1;
2885                 if (ret < 0) {
2886                         _LOGD("Processing launchconditions failed\n");
2887                         return ret;
2888                 }
2889         }
2890         if (launchconditions->condition) {
2891                 LISTHEAD(launchconditions->condition, tmp1);
2892                 launchconditions->condition = tmp1;
2893         }
2894
2895         xmlTextReaderRead(reader);
2896         if (xmlTextReaderValue(reader))
2897                 launchconditions->text = ASCII(xmlTextReaderValue(reader));
2898
2899         return ret;
2900 }
2901
2902 static int __ps_process_datashare(xmlTextReaderPtr reader, datashare_x *datashare)
2903 {
2904         const xmlChar *node;
2905         int ret = -1;
2906         int depth = -1;
2907         define_x *tmp1 = NULL;
2908         request_x *tmp2 = NULL;
2909         depth = xmlTextReaderDepth(reader);
2910         while ((ret = __next_child_element(reader, depth))) {
2911                 node = xmlTextReaderConstName(reader);
2912                 if (!node) {
2913                         _LOGD("xmlTextReaderConstName value is NULL\n");
2914                         return -1;
2915                 }
2916
2917                 if (!strcmp(ASCII(node), "define")) {
2918                         define_x *define= malloc(sizeof(define_x));
2919                         if (define == NULL) {
2920                                 _LOGD("Malloc Failed\n");
2921                                 return -1;
2922                         }
2923                         memset(define, '\0', sizeof(define_x));
2924                         LISTADD(datashare->define, define);
2925                         ret = __ps_process_define(reader, define);
2926                 } else if (!strcmp(ASCII(node), "request")) {
2927                         request_x *request= malloc(sizeof(request_x));
2928                         if (request == NULL) {
2929                                 _LOGD("Malloc Failed\n");
2930                                 return -1;
2931                         }
2932                         memset(request, '\0', sizeof(request_x));
2933                         LISTADD(datashare->request, request);
2934                         ret = __ps_process_request(reader, request);
2935                 } else
2936                         return -1;
2937                 if (ret < 0) {
2938                         _LOGD("Processing data-share failed\n");
2939                         return ret;
2940                 }
2941         }
2942         if (datashare->define) {
2943                 LISTHEAD(datashare->define, tmp1);
2944                 datashare->define = tmp1;
2945         }
2946         if (datashare->request) {
2947                 LISTHEAD(datashare->request, tmp2);
2948                 datashare->request = tmp2;
2949         }
2950         return ret;
2951 }
2952
2953 static char*
2954 __get_icon_with_path(const char* icon, uid_t uid)
2955 {
2956         if (!icon)
2957                 return NULL;
2958
2959         if (index(icon, '/') == NULL) {
2960                 char* theme = NULL;
2961                 char* icon_with_path = NULL;
2962                 char *app_path = NULL;
2963                 int len;
2964
2965                 if (!package)
2966                         return NULL;
2967
2968 /* "db/setting/theme" is not exist */
2969 #if 0
2970                 theme = vconf_get_str("db/setting/theme");
2971                 if (!theme) {
2972                         theme = strdup("default");
2973                         if(!theme) {
2974                                 return NULL;
2975                         }
2976                 }
2977 #else
2978                 theme = strdup("default");
2979 #endif
2980
2981                 len = (0x01 << 7) + strlen(icon) + strlen(package) + strlen(theme);
2982                 icon_with_path = malloc(len);
2983                 if(icon_with_path == NULL) {
2984                         _LOGD("(icon_with_path == NULL) return\n");
2985                         free(theme);
2986                         return NULL;
2987                 }
2988
2989                 memset(icon_with_path, 0, len);
2990                 if (uid != GLOBAL_USER)
2991                         snprintf(icon_with_path, len, "%s%s", getIconPath(uid), icon);
2992                 else {
2993                         snprintf(icon_with_path, len, "%s%s/small/%s", getIconPath(GLOBAL_USER), theme, icon);
2994                         if (access (icon_with_path, F_OK)) { //If doesn't exist in case of Global app, try to get icon directly into app's directory
2995                                 app_path = tzplatform_getenv(TZ_SYS_RW_APP);
2996                                 if (app_path)
2997                                         snprintf(icon_with_path, len, "%s/%q/res/icons/%q/small/%q", app_path, package, theme, icon);
2998                                 if (access (icon_with_path, F_OK))
2999                                         _LOGE("Cannot find icon path");
3000                         }
3001                 }
3002                 free(theme);
3003                 _LOGD("Icon path : %s ---> %s", icon, icon_with_path);
3004                 return icon_with_path;
3005         } else {
3006                 char* confirmed_icon = NULL;
3007
3008                 confirmed_icon = strdup(icon);
3009                 if (!confirmed_icon)
3010                         return NULL;
3011                 return confirmed_icon;
3012         }
3013 }
3014
3015 static void __ps_process_tag(manifest_x * mfx, char *const tagv[])
3016 {
3017         int i = 0;
3018         char delims[] = "=";
3019         char *ret_result = NULL;
3020         char *tag = NULL;
3021
3022         if (tagv == NULL)
3023                 return;
3024
3025         for (tag = strdup(tagv[0]); tag != NULL; ) {
3026                 ret_result = strtok(tag, delims);
3027
3028                 /*check tag :  preload */
3029                 if (strcmp(ret_result, "preload") == 0) {
3030                         ret_result = strtok(NULL, delims);
3031                         if (strcmp(ret_result, "true") == 0) {
3032                                 free((void *)mfx->preload);
3033                                 mfx->preload = strdup("true");
3034                         } else if (strcmp(ret_result, "false") == 0) {
3035                                 free((void *)mfx->preload);
3036                                 mfx->preload = strdup("false");
3037                         }
3038                 /*check tag :  removable*/
3039                 } else if (strcmp(ret_result, "removable") == 0) {
3040                         ret_result = strtok(NULL, delims);
3041                         if (strcmp(ret_result, "true") == 0){
3042                                 free((void *)mfx->removable);
3043                                 mfx->removable = strdup("true");
3044                         } else if (strcmp(ret_result, "false") == 0) {
3045                                 free((void *)mfx->removable);
3046                                 mfx->removable = strdup("false");
3047                         }
3048                 /*check tag :  not matched*/
3049                 } else
3050                         _LOGD("tag process [%s]is not defined\n", ret_result);
3051
3052                 free(tag);
3053
3054                 /*check next value*/
3055                 if (tagv[++i] != NULL)
3056                         tag = strdup(tagv[i]);
3057                 else {
3058                         _LOGD("tag process success...\n");
3059                         return;
3060                 }
3061         }
3062 }
3063
3064 static int __ps_process_icon(xmlTextReaderPtr reader, icon_x *icon, uid_t uid)
3065 {
3066         if (xmlTextReaderGetAttribute(reader, XMLCHAR("name")))
3067                 icon->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name")));
3068         if (xmlTextReaderConstXmlLang(reader)) {
3069                 icon->lang = strdup(ASCII(xmlTextReaderConstXmlLang(reader)));
3070                 if (icon->lang == NULL)
3071                         icon->lang = strdup(DEFAULT_LOCALE);
3072         } else {
3073                 icon->lang = strdup(DEFAULT_LOCALE);
3074         }
3075         if (xmlTextReaderGetAttribute(reader, XMLCHAR("section")))
3076                 icon->section = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("section")));
3077         if (xmlTextReaderGetAttribute(reader, XMLCHAR("size")))
3078                 icon->size = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("size")));
3079         if (xmlTextReaderGetAttribute(reader, XMLCHAR("resolution")))
3080                 icon->resolution = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("resolution")));
3081         xmlTextReaderRead(reader);
3082         if (xmlTextReaderValue(reader)) {
3083                 const char *text  = ASCII(xmlTextReaderValue(reader));
3084                 if(text) {
3085                         icon->text = (const char *)__get_icon_with_path(text, uid);
3086                         free((void *)text);
3087                 }
3088         }
3089
3090         return 0;
3091 }
3092
3093 static int __ps_process_image(xmlTextReaderPtr reader, image_x *image)
3094 {
3095         if (xmlTextReaderGetAttribute(reader, XMLCHAR("name")))
3096                 image->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name")));
3097         if (xmlTextReaderConstXmlLang(reader)) {
3098                 image->lang = strdup(ASCII(xmlTextReaderConstXmlLang(reader)));
3099                 if (image->lang == NULL)
3100                         image->lang = strdup(DEFAULT_LOCALE);
3101         } else {
3102                 image->lang = strdup(DEFAULT_LOCALE);
3103         }
3104         if (xmlTextReaderGetAttribute(reader, XMLCHAR("section")))
3105                 image->section = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("section")));
3106         xmlTextReaderRead(reader);
3107         if (xmlTextReaderValue(reader))
3108                 image->text = ASCII(xmlTextReaderValue(reader));
3109
3110         return 0;
3111 }
3112
3113 static int __ps_process_label(xmlTextReaderPtr reader, label_x *label)
3114 {
3115         if (xmlTextReaderGetAttribute(reader, XMLCHAR("name")))
3116                 label->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name")));
3117         if (xmlTextReaderConstXmlLang(reader)) {
3118                 label->lang = strdup(ASCII(xmlTextReaderConstXmlLang(reader)));
3119                 if (label->lang == NULL)
3120                         label->lang = strdup(DEFAULT_LOCALE);
3121         } else 
3122                 label->lang = strdup(DEFAULT_LOCALE);
3123         xmlTextReaderRead(reader);
3124         if (xmlTextReaderValue(reader))
3125                 label->text = ASCII(xmlTextReaderValue(reader));
3126
3127
3128 /*      _LOGD("lable name %s\n", label->name);
3129         _LOGD("lable lang %s\n", label->lang);
3130         _LOGD("lable text %s\n", label->text);
3131 */
3132         return 0;
3133
3134 }
3135
3136 static int __ps_process_author(xmlTextReaderPtr reader, author_x *author)
3137 {
3138         if (xmlTextReaderGetAttribute(reader, XMLCHAR("email")))
3139                 author->email = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("email")));
3140         if (xmlTextReaderGetAttribute(reader, XMLCHAR("href")))
3141                 author->href = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("href")));
3142         if (xmlTextReaderConstXmlLang(reader)) {
3143                 author->lang = strdup(ASCII(xmlTextReaderConstXmlLang(reader)));
3144                 if (author->lang == NULL)
3145                         author->lang = strdup(DEFAULT_LOCALE);
3146         } else {
3147                 author->lang = strdup(DEFAULT_LOCALE);
3148         }
3149         xmlTextReaderRead(reader);
3150         if (xmlTextReaderValue(reader)) {
3151                 const char *text  = ASCII(xmlTextReaderValue(reader));
3152                 if (*text == '\n') {
3153                         author->text = NULL;
3154                         free((void *)text);
3155                         return 0;
3156                 }
3157                 author->text = ASCII(xmlTextReaderValue(reader));
3158         }
3159         return 0;
3160 }
3161
3162 static int __ps_process_description(xmlTextReaderPtr reader, description_x *description)
3163 {
3164         if (xmlTextReaderConstXmlLang(reader)) {
3165                 description->lang = strdup(ASCII(xmlTextReaderConstXmlLang(reader)));
3166                 if (description->lang == NULL)
3167                         description->lang = strdup(DEFAULT_LOCALE);
3168         } else {
3169                 description->lang = strdup(DEFAULT_LOCALE);
3170         }
3171         xmlTextReaderRead(reader);
3172         if (xmlTextReaderValue(reader)) {
3173                 const char *text  = ASCII(xmlTextReaderValue(reader));
3174                 if (*text == '\n') {
3175                         description->text = NULL;
3176                         free((void *)text);
3177                         return 0;
3178                 }
3179                 description->text = ASCII(xmlTextReaderValue(reader));
3180         }
3181         return 0;
3182 }
3183
3184 static int __ps_process_license(xmlTextReaderPtr reader, license_x *license)
3185 {
3186         if (xmlTextReaderConstXmlLang(reader)) {
3187                 license->lang = strdup(ASCII(xmlTextReaderConstXmlLang(reader)));
3188                 if (license->lang == NULL)
3189                         license->lang = strdup(DEFAULT_LOCALE);
3190         } else {
3191                 license->lang = strdup(DEFAULT_LOCALE);
3192         }
3193         xmlTextReaderRead(reader);
3194         if (xmlTextReaderValue(reader))
3195                 license->text = ASCII(xmlTextReaderValue(reader));
3196         return 0;
3197 }
3198
3199 static int __ps_process_capability(xmlTextReaderPtr reader, capability_x *capability)
3200 {
3201         const xmlChar *node;
3202         int ret = -1;
3203         int depth = -1;
3204         resolution_x *tmp1 = NULL;
3205
3206         if (xmlTextReaderGetAttribute(reader, XMLCHAR("operation-id")))
3207                 capability->operationid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("operation-id")));
3208
3209         depth = xmlTextReaderDepth(reader);
3210         while ((ret = __next_child_element(reader, depth))) {
3211                 node = xmlTextReaderConstName(reader);
3212                 if (!node) {
3213                         _LOGD("xmlTextReaderConstName value is NULL\n");
3214                         return -1;
3215                 }
3216
3217                 if (!strcmp(ASCII(node), "resolution")) {
3218                         resolution_x *resolution = malloc(sizeof(resolution_x));
3219                         if (resolution == NULL) {
3220                                 _LOGD("Malloc Failed\n");
3221                                 return -1;
3222                         }
3223                         memset(resolution, '\0', sizeof(resolution_x));
3224                         LISTADD(capability->resolution, resolution);
3225                         ret = __ps_process_resolution(reader, resolution);
3226                 } else
3227                         return -1;
3228                 if (ret < 0) {
3229                         _LOGD("Processing capability failed\n");
3230                         return ret;
3231                 }
3232         }
3233
3234         if (capability->resolution) {
3235                 LISTHEAD(capability->resolution, tmp1);
3236                 capability->resolution = tmp1;
3237         }
3238
3239         return ret;
3240 }
3241
3242 static int __ps_process_datacontrol(xmlTextReaderPtr reader, datacontrol_x *datacontrol)
3243 {
3244         if (xmlTextReaderGetAttribute(reader, XMLCHAR("providerid")))
3245                 datacontrol->providerid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("providerid")));
3246         if (xmlTextReaderGetAttribute(reader, XMLCHAR("access")))
3247                 datacontrol->access = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("access")));
3248         if (xmlTextReaderGetAttribute(reader, XMLCHAR("type")))
3249                 datacontrol->type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("type")));
3250
3251         return 0;
3252 }
3253
3254 static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x *uiapplication, uid_t uid)
3255 {
3256         const xmlChar *node;
3257         int ret = -1;
3258         int depth = -1;
3259         char *newappid = NULL;
3260         label_x *tmp1 = NULL;
3261         icon_x *tmp2 = NULL;
3262         appsvc_x *tmp3 = NULL;
3263         appcontrol_x *tmp4 = NULL;
3264         launchconditions_x *tmp5 = NULL;
3265         notification_x *tmp6 = NULL;
3266         datashare_x *tmp7 = NULL;
3267         category_x *tmp8 = NULL;
3268         metadata_x *tmp9 = NULL;
3269         image_x *tmp10 = NULL;
3270         permission_x *tmp11 = NULL;
3271         datacontrol_x *tmp12 = NULL;
3272
3273         if (xmlTextReaderGetAttribute(reader, XMLCHAR("appid"))) {
3274                 uiapplication->appid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("appid")));
3275                 if (uiapplication->appid == NULL) {
3276                         _LOGD("appid cant be NULL\n");
3277                         return -1;
3278                 }
3279         } else {
3280                 _LOGD("appid is mandatory\n");
3281                 return -1;
3282         }
3283         /*check appid*/
3284         ret = __validate_appid(package, uiapplication->appid, &newappid);
3285         if (ret == -1) {
3286                 _LOGD("appid is not proper\n");
3287                 return -1;
3288         } else {
3289                 if (newappid) {
3290                         if (uiapplication->appid)
3291                                 free((void *)uiapplication->appid);
3292                         uiapplication->appid = newappid;
3293                 }
3294                 uiapplication->package= strdup(package);
3295         }
3296         if (xmlTextReaderGetAttribute(reader, XMLCHAR("exec")))
3297                 uiapplication->exec = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("exec")));
3298         if (xmlTextReaderGetAttribute(reader, XMLCHAR("nodisplay"))) {
3299                 uiapplication->nodisplay = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("nodisplay")));
3300                 if (uiapplication->nodisplay == NULL)
3301                         uiapplication->nodisplay = strdup("false");
3302         } else {
3303                 uiapplication->nodisplay = strdup("false");
3304         }
3305         if (xmlTextReaderGetAttribute(reader, XMLCHAR("multiple"))) {
3306                 uiapplication->multiple = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("multiple")));
3307                 if (uiapplication->multiple == NULL)
3308                         uiapplication->multiple = strdup("false");
3309         } else {
3310                 uiapplication->multiple = strdup("false");
3311         }
3312         if (xmlTextReaderGetAttribute(reader, XMLCHAR("type")))
3313                 uiapplication->type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("type")));
3314         if (xmlTextReaderGetAttribute(reader, XMLCHAR("categories")))
3315                 uiapplication->categories = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("categories")));
3316         if (xmlTextReaderGetAttribute(reader, XMLCHAR("extraid")))
3317                 uiapplication->extraid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("extraid")));
3318         if (xmlTextReaderGetAttribute(reader, XMLCHAR("taskmanage"))) {
3319                 uiapplication->taskmanage = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("taskmanage")));
3320                 if (uiapplication->taskmanage == NULL)
3321                         uiapplication->taskmanage = strdup("true");
3322         } else {
3323                 uiapplication->taskmanage = strdup("true");
3324         }
3325         if (xmlTextReaderGetAttribute(reader, XMLCHAR("enabled"))) {
3326                 uiapplication->enabled = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("enabled")));
3327                 if (uiapplication->enabled == NULL)
3328                         uiapplication->enabled = strdup("true");
3329         } else {
3330                 uiapplication->enabled = strdup("true");
3331         }
3332         if (xmlTextReaderGetAttribute(reader, XMLCHAR("hw-acceleration"))) {
3333                 uiapplication->hwacceleration = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("hw-acceleration")));
3334                 if (uiapplication->hwacceleration == NULL)
3335                         uiapplication->hwacceleration = strdup("use-system-setting");
3336         } else {
3337                 uiapplication->hwacceleration = strdup("use-system-setting");
3338         }
3339         if (xmlTextReaderGetAttribute(reader, XMLCHAR("screen-reader"))) {
3340                 uiapplication->screenreader = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("screen-reader")));
3341                 if (uiapplication->screenreader == NULL)
3342                         uiapplication->screenreader = strdup("use-system-setting");
3343         } else {
3344                 uiapplication->screenreader = strdup("use-system-setting");
3345         }
3346         if (xmlTextReaderGetAttribute(reader, XMLCHAR("recentimage")))
3347                 uiapplication->recentimage = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("recentimage")));
3348         if (xmlTextReaderGetAttribute(reader, XMLCHAR("mainapp"))) {
3349                 uiapplication->mainapp = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("mainapp")));
3350                 if (uiapplication->mainapp == NULL)
3351                         uiapplication->mainapp = strdup("false");
3352         } else {
3353                 uiapplication->mainapp = strdup("false");
3354         }
3355         if (xmlTextReaderGetAttribute(reader, XMLCHAR("launchcondition"))) {
3356                 uiapplication->launchcondition = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("launchcondition")));
3357                 if (uiapplication->launchcondition == NULL)
3358                         uiapplication->launchcondition = strdup("false");
3359         } else {
3360                 uiapplication->launchcondition = strdup("false");
3361         }
3362
3363         if (xmlTextReaderGetAttribute(reader, XMLCHAR("indicatordisplay"))) {
3364                 uiapplication->indicatordisplay = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("indicatordisplay")));
3365                 if (uiapplication->indicatordisplay == NULL)
3366                         uiapplication->indicatordisplay = strdup("true");
3367         } else {
3368                 uiapplication->indicatordisplay = strdup("true");
3369         }
3370         if (xmlTextReaderGetAttribute(reader, XMLCHAR("portrait-effectimage")))
3371                 uiapplication->portraitimg = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("portrait-effectimage")));
3372         else
3373                 uiapplication->portraitimg = NULL;
3374         if (xmlTextReaderGetAttribute(reader, XMLCHAR("landscape-effectimage")))
3375                 uiapplication->landscapeimg = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("landscape-effectimage")));
3376         else
3377                 uiapplication->landscapeimg = NULL;
3378         if (xmlTextReaderGetAttribute(reader, XMLCHAR("guestmode-visibility"))) {
3379                 uiapplication->guestmode_visibility = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("guestmode-visibility")));
3380                 if (uiapplication->guestmode_visibility == NULL)
3381                         uiapplication->guestmode_visibility = strdup("true");
3382         } else {
3383                 uiapplication->guestmode_visibility = strdup("true");
3384         }
3385         if (xmlTextReaderGetAttribute(reader, XMLCHAR("permission-type"))) {
3386                 uiapplication->permission_type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("permission-type")));
3387                 if (uiapplication->permission_type == NULL)
3388                         uiapplication->permission_type = strdup("normal");
3389         } else {
3390                 uiapplication->permission_type = strdup("normal");
3391         }
3392         if (xmlTextReaderGetAttribute(reader, XMLCHAR("component-type"))) {
3393                 uiapplication->component_type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("component-type")));
3394                 if (uiapplication->component_type == NULL)
3395                         uiapplication->component_type = strdup("uiapp");
3396         } else {
3397                 uiapplication->component_type = strdup("uiapp");
3398         }
3399         if (xmlTextReaderGetAttribute(reader, XMLCHAR("submode"))) {
3400                 uiapplication->submode = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("submode")));
3401                 if (uiapplication->submode == NULL)
3402                         uiapplication->submode = strdup("false");
3403         } else {
3404                 uiapplication->submode = strdup("false");
3405         }
3406         if (xmlTextReaderGetAttribute(reader, XMLCHAR("submode-mainid")))
3407                 uiapplication->submode_mainid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("submode-mainid")));
3408         if (xmlTextReaderGetAttribute(reader, XMLCHAR("launch_mode"))) {
3409                 uiapplication->launch_mode = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("launch_mode")));
3410                 if (uiapplication->launch_mode == NULL)
3411                         uiapplication->launch_mode = strdup("caller");
3412         } else {
3413                 uiapplication->launch_mode = strdup("caller");
3414         }
3415
3416         depth = xmlTextReaderDepth(reader);
3417         while ((ret = __next_child_element(reader, depth))) {
3418                 node = xmlTextReaderConstName(reader);
3419                 if (!node) {
3420                         _LOGD("xmlTextReaderConstName value is NULL\n");
3421                         return -1;
3422                 }
3423                 if (!strcmp(ASCII(node), "label")) {
3424                         label_x *label = malloc(sizeof(label_x));
3425                         if (label == NULL) {
3426                                 _LOGD("Malloc Failed\n");
3427                                 return -1;
3428                         }
3429                         memset(label, '\0', sizeof(label_x));
3430                         LISTADD(uiapplication->label, label);
3431                         ret = __ps_process_label(reader, label);
3432                 } else if (!strcmp(ASCII(node), "icon")) {
3433                         icon_x *icon = malloc(sizeof(icon_x));
3434                         if (icon == NULL) {
3435                                 _LOGD("Malloc Failed\n");
3436                                 return -1;
3437                         }
3438                         memset(icon, '\0', sizeof(icon_x));
3439                         LISTADD(uiapplication->icon, icon);
3440                         ret = __ps_process_icon(reader, icon, uid);
3441                 } else if (!strcmp(ASCII(node), "image")) {
3442                         image_x *image = malloc(sizeof(image_x));
3443                         if (image == NULL) {
3444                                 _LOGD("Malloc Failed\n");
3445                                 return -1;
3446                         }
3447                         memset(image, '\0', sizeof(image_x));
3448                         LISTADD(uiapplication->image, image);
3449                         ret = __ps_process_image(reader, image);
3450                 } else if (!strcmp(ASCII(node), "category")) {
3451                         category_x *category = malloc(sizeof(category_x));
3452                         if (category == NULL) {
3453                                 _LOGD("Malloc Failed\n");
3454                                 return -1;
3455                         }
3456                         memset(category, '\0', sizeof(category_x));
3457                         LISTADD(uiapplication->category, category);
3458                         ret = __ps_process_category(reader, category);
3459                 } else if (!strcmp(ASCII(node), "metadata")) {
3460                         metadata_x *metadata = malloc(sizeof(metadata_x));
3461                         if (metadata == NULL) {
3462                                 _LOGD("Malloc Failed\n");
3463                                 return -1;
3464                         }
3465                         memset(metadata, '\0', sizeof(metadata_x));
3466                         LISTADD(uiapplication->metadata, metadata);
3467                         ret = __ps_process_metadata(reader, metadata);
3468                 } else if (!strcmp(ASCII(node), "permission")) {
3469                         permission_x *permission = malloc(sizeof(permission_x));
3470                         if (permission == NULL) {
3471                                 _LOGD("Malloc Failed\n");
3472                                 return -1;
3473                         }
3474                         memset(permission, '\0', sizeof(permission_x));
3475                         LISTADD(uiapplication->permission, permission);
3476                         ret = __ps_process_permission(reader, permission);
3477                 } else if (!strcmp(ASCII(node), "app-control")) {
3478                         appcontrol_x *appcontrol = malloc(sizeof(appcontrol_x));
3479                         if (appcontrol == NULL) {
3480                                 _LOGD("Malloc Failed\n");
3481                                 return -1;
3482                         }
3483                         memset(appcontrol, '\0', sizeof(appcontrol_x));
3484                         LISTADD(uiapplication->appcontrol, appcontrol);
3485                         ret = __ps_process_appcontrol(reader, appcontrol);
3486                 } else if (!strcmp(ASCII(node), "application-service")) {
3487                         appsvc_x *appsvc = malloc(sizeof(appsvc_x));
3488                         if (appsvc == NULL) {
3489                                 _LOGD("Malloc Failed\n");
3490                                 return -1;
3491                         }
3492                         memset(appsvc, '\0', sizeof(appsvc_x));
3493                         LISTADD(uiapplication->appsvc, appsvc);
3494                         ret = __ps_process_appsvc(reader, appsvc);
3495                 } else if (!strcmp(ASCII(node), "data-share")) {
3496                         datashare_x *datashare = malloc(sizeof(datashare_x));
3497                         if (datashare == NULL) {
3498                                 _LOGD("Malloc Failed\n");
3499                                 return -1;
3500                         }
3501                         memset(datashare, '\0', sizeof(datashare_x));
3502                         LISTADD(uiapplication->datashare, datashare);
3503                         ret = __ps_process_datashare(reader, datashare);
3504                 } else if (!strcmp(ASCII(node), "launch-conditions")) {
3505                         launchconditions_x *launchconditions = malloc(sizeof(launchconditions_x));
3506                         if (launchconditions == NULL) {
3507                                 _LOGD("Malloc Failed\n");
3508                                 return -1;
3509                         }
3510                         memset(launchconditions, '\0', sizeof(launchconditions_x));
3511                         LISTADD(uiapplication->launchconditions, launchconditions);
3512                         ret = __ps_process_launchconditions(reader, launchconditions);
3513                 } else if (!strcmp(ASCII(node), "notification")) {
3514                         notification_x *notification = malloc(sizeof(notification_x));
3515                         if (notification == NULL) {
3516                                 _LOGD("Malloc Failed\n");
3517                                 return -1;
3518                         }
3519                         memset(notification, '\0', sizeof(notification_x));
3520                         LISTADD(uiapplication->notification, notification);
3521                         ret = __ps_process_notification(reader, notification);
3522                 } else if (!strcmp(ASCII(node), "datacontrol")) {
3523                         datacontrol_x *datacontrol = malloc(sizeof(datacontrol_x));
3524                         if (datacontrol == NULL) {
3525                                 _LOGD("Malloc Failed\n");
3526                                 return -1;
3527                         }
3528                         memset(datacontrol, '\0', sizeof(datacontrol_x));
3529                         LISTADD(uiapplication->datacontrol, datacontrol);
3530                         ret = __ps_process_datacontrol(reader, datacontrol);
3531                 } else
3532                         return -1;
3533                 if (ret < 0) {
3534                         _LOGD("Processing uiapplication failed\n");
3535                         return ret;
3536                 }
3537         }
3538
3539         if (uiapplication->label) {
3540                 LISTHEAD(uiapplication->label, tmp1);
3541                 uiapplication->label = tmp1;
3542         }
3543         if (uiapplication->icon) {
3544                 LISTHEAD(uiapplication->icon, tmp2);
3545                 uiapplication->icon = tmp2;
3546         }
3547         if (uiapplication->appsvc) {
3548                 LISTHEAD(uiapplication->appsvc, tmp3);
3549                 uiapplication->appsvc = tmp3;
3550         }
3551         if (uiapplication->appcontrol) {
3552                 LISTHEAD(uiapplication->appcontrol, tmp4);
3553                 uiapplication->appcontrol = tmp4;
3554         }
3555         if (uiapplication->launchconditions) {
3556                 LISTHEAD(uiapplication->launchconditions, tmp5);
3557                 uiapplication->launchconditions = tmp5;
3558         }
3559         if (uiapplication->notification) {
3560                 LISTHEAD(uiapplication->notification, tmp6);
3561                 uiapplication->notification = tmp6;
3562         }
3563         if (uiapplication->datashare) {
3564                 LISTHEAD(uiapplication->datashare, tmp7);
3565                 uiapplication->datashare = tmp7;
3566         }
3567         if (uiapplication->category) {
3568                 LISTHEAD(uiapplication->category, tmp8);
3569                 uiapplication->category = tmp8;
3570         }
3571         if (uiapplication->metadata) {
3572                 LISTHEAD(uiapplication->metadata, tmp9);
3573                 uiapplication->metadata = tmp9;
3574         }
3575         if (uiapplication->image) {
3576                 LISTHEAD(uiapplication->image, tmp10);
3577                 uiapplication->image = tmp10;
3578         }
3579         if (uiapplication->permission) {
3580                 LISTHEAD(uiapplication->permission, tmp11);
3581                 uiapplication->permission = tmp11;
3582         }
3583         if (uiapplication->datacontrol) {
3584                 LISTHEAD(uiapplication->datacontrol, tmp12);
3585                 uiapplication->datacontrol = tmp12;
3586         }
3587
3588         return ret;
3589 }
3590
3591 static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceapplication_x *serviceapplication, uid_t uid)
3592 {
3593         const xmlChar *node;
3594         int ret = -1;
3595         int depth = -1;
3596         char *newappid = NULL;
3597         label_x *tmp1 = NULL;
3598         icon_x *tmp2 = NULL;
3599         appsvc_x *tmp3 = NULL;
3600         appcontrol_x *tmp4 = NULL;
3601         datacontrol_x *tmp5 = NULL;
3602         launchconditions_x *tmp6 = NULL;
3603         notification_x *tmp7 = NULL;
3604         datashare_x *tmp8 = NULL;
3605         category_x *tmp9 = NULL;
3606         metadata_x *tmp10 = NULL;
3607         permission_x *tmp11 = NULL;
3608
3609         if (xmlTextReaderGetAttribute(reader, XMLCHAR("appid"))) {
3610                 serviceapplication->appid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("appid")));
3611                 if (serviceapplication->appid == NULL) {
3612                         _LOGD("appid cant be NULL\n");
3613                         return -1;
3614                 }
3615         } else {
3616                 _LOGD("appid is mandatory\n");
3617                 return -1;
3618         }
3619         /*check appid*/
3620         ret = __validate_appid(package, serviceapplication->appid, &newappid);
3621         if (ret == -1) {
3622                 _LOGD("appid is not proper\n");
3623                 return -1;
3624         } else {
3625                 if (newappid) {
3626                         if (serviceapplication->appid)
3627                                 free((void *)serviceapplication->appid);
3628                         serviceapplication->appid = newappid;
3629                 }
3630         }
3631         if (xmlTextReaderGetAttribute(reader, XMLCHAR("exec")))
3632                 serviceapplication->exec = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("exec")));
3633         if (xmlTextReaderGetAttribute(reader, XMLCHAR("type")))
3634                 serviceapplication->type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("type")));
3635         if (xmlTextReaderGetAttribute(reader, XMLCHAR("on-boot"))) {
3636                 serviceapplication->onboot = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("on-boot")));
3637                 if (serviceapplication->onboot == NULL)
3638                         serviceapplication->onboot = strdup("false");
3639         } else {
3640                 serviceapplication->onboot = strdup("false");
3641         }
3642         if (xmlTextReaderGetAttribute(reader, XMLCHAR("auto-restart"))) {
3643                 serviceapplication->autorestart = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("auto-restart")));
3644                 if (serviceapplication->autorestart == NULL)
3645                         serviceapplication->autorestart = strdup("false");
3646         } else {
3647                 serviceapplication->autorestart = strdup("false");
3648         }
3649         if (xmlTextReaderGetAttribute(reader, XMLCHAR("permission-type"))) {
3650                 serviceapplication->permission_type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("permission-type")));
3651                 if (serviceapplication->permission_type == NULL)
3652                         serviceapplication->permission_type = strdup("normal");
3653         } else {
3654                 serviceapplication->permission_type = strdup("normal");
3655         }
3656
3657         depth = xmlTextReaderDepth(reader);
3658         while ((ret = __next_child_element(reader, depth))) {
3659                 node = xmlTextReaderConstName(reader);
3660                 if (!node) {
3661                         _LOGD("xmlTextReaderConstName value is NULL\n");
3662                         return -1;
3663                 }
3664
3665                 if (!strcmp(ASCII(node), "label")) {
3666                         label_x *label = malloc(sizeof(label_x));
3667                         if (label == NULL) {
3668                                 _LOGD("Malloc Failed\n");
3669                                 return -1;
3670                         }
3671                         memset(label, '\0', sizeof(label_x));
3672                         LISTADD(serviceapplication->label, label);
3673                         ret = __ps_process_label(reader, label);
3674                 } else if (!strcmp(ASCII(node), "icon")) {
3675                         icon_x *icon = malloc(sizeof(icon_x));
3676                         if (icon == NULL) {
3677                                 _LOGD("Malloc Failed\n");
3678                                 return -1;
3679                         }
3680                         memset(icon, '\0', sizeof(icon_x));
3681                         LISTADD(serviceapplication->icon, icon);
3682                         ret = __ps_process_icon(reader, icon, uid);
3683                 } else if (!strcmp(ASCII(node), "category")) {
3684                         category_x *category = malloc(sizeof(category_x));
3685                         if (category == NULL) {
3686                                 _LOGD("Malloc Failed\n");
3687                                 return -1;
3688                         }
3689                         memset(category, '\0', sizeof(category_x));
3690                         LISTADD(serviceapplication->category, category);
3691                         ret = __ps_process_category(reader, category);
3692                 } else if (!strcmp(ASCII(node), "metadata")) {
3693                         metadata_x *metadata = malloc(sizeof(metadata_x));
3694                         if (metadata == NULL) {
3695                                 _LOGD("Malloc Failed\n");
3696                                 return -1;
3697                         }
3698                         memset(metadata, '\0', sizeof(metadata_x));
3699                         LISTADD(serviceapplication->metadata, metadata);
3700                         ret = __ps_process_metadata(reader, metadata);
3701                 } else if (!strcmp(ASCII(node), "permission")) {
3702                         permission_x *permission = malloc(sizeof(permission_x));
3703                         if (permission == NULL) {
3704                                 _LOGD("Malloc Failed\n");
3705                                 return -1;
3706                         }
3707                         memset(permission, '\0', sizeof(permission_x));
3708                         LISTADD(serviceapplication->permission, permission);
3709                         ret = __ps_process_permission(reader, permission);
3710                 } else if (!strcmp(ASCII(node), "app-control")) {
3711                         appcontrol_x *appcontrol = malloc(sizeof(appcontrol_x));
3712                         if (appcontrol == NULL) {
3713                                 _LOGD("Malloc Failed\n");
3714                                 return -1;
3715                         }
3716                         memset(appcontrol, '\0', sizeof(appcontrol_x));
3717                         LISTADD(serviceapplication->appcontrol, appcontrol);
3718                         ret = __ps_process_appcontrol(reader, appcontrol);
3719                 } else if (!strcmp(ASCII(node), "application-service")) {
3720                         appsvc_x *appsvc = malloc(sizeof(appsvc_x));
3721                         if (appsvc == NULL) {
3722                                 _LOGD("Malloc Failed\n");
3723                                 return -1;
3724                         }
3725                         memset(appsvc, '\0', sizeof(appsvc_x));
3726                         LISTADD(serviceapplication->appsvc, appsvc);
3727                         ret = __ps_process_appsvc(reader, appsvc);
3728                 } else if (!strcmp(ASCII(node), "data-share")) {
3729                         datashare_x *datashare = malloc(sizeof(datashare_x));
3730                         if (datashare == NULL) {
3731                                 _LOGD("Malloc Failed\n");
3732                                 return -1;
3733                         }
3734                         memset(datashare, '\0', sizeof(datashare_x));
3735                         LISTADD(serviceapplication->datashare, datashare);
3736                         ret = __ps_process_datashare(reader, datashare);
3737                 } else if (!strcmp(ASCII(node), "launch-conditions")) {
3738                         launchconditions_x *launchconditions = malloc(sizeof(launchconditions_x));
3739                         if (launchconditions == NULL) {
3740                                 _LOGD("Malloc Failed\n");
3741                                 return -1;
3742                         }
3743                         memset(launchconditions, '\0', sizeof(launchconditions_x));
3744                         LISTADD(serviceapplication->launchconditions, launchconditions);
3745                         ret = __ps_process_launchconditions(reader, launchconditions);
3746                 } else if (!strcmp(ASCII(node), "notification")) {
3747                         notification_x *notification = malloc(sizeof(notification_x));
3748                         if (notification == NULL) {
3749                                 _LOGD("Malloc Failed\n");
3750                                 return -1;
3751                         }
3752                         memset(notification, '\0', sizeof(notification_x));
3753                         LISTADD(serviceapplication->notification, notification);
3754                         ret = __ps_process_notification(reader, notification);
3755                 } else if (!strcmp(ASCII(node), "datacontrol")) {
3756                         datacontrol_x *datacontrol = malloc(sizeof(datacontrol_x));
3757                         if (datacontrol == NULL) {
3758                                 _LOGD("Malloc Failed\n");
3759                                 return -1;
3760                         }
3761                         memset(datacontrol, '\0', sizeof(datacontrol_x));
3762                         LISTADD(serviceapplication->datacontrol, datacontrol);
3763                         ret = __ps_process_datacontrol(reader, datacontrol);
3764                 } else
3765                         return -1;
3766                 if (ret < 0) {
3767                         _LOGD("Processing serviceapplication failed\n");
3768                         return ret;
3769                 }
3770         }
3771
3772         if (serviceapplication->label) {
3773                 LISTHEAD(serviceapplication->label, tmp1);
3774                 serviceapplication->label = tmp1;
3775         }
3776         if (serviceapplication->icon) {
3777                 LISTHEAD(serviceapplication->icon, tmp2);
3778                 serviceapplication->icon = tmp2;
3779         }
3780         if (serviceapplication->appsvc) {
3781                 LISTHEAD(serviceapplication->appsvc, tmp3);
3782                 serviceapplication->appsvc = tmp3;
3783         }
3784         if (serviceapplication->appcontrol) {
3785                 LISTHEAD(serviceapplication->appcontrol, tmp4);
3786                 serviceapplication->appcontrol = tmp4;
3787         }
3788         if (serviceapplication->datacontrol) {
3789                 LISTHEAD(serviceapplication->datacontrol, tmp5);
3790                 serviceapplication->datacontrol = tmp5;
3791         }
3792         if (serviceapplication->launchconditions) {
3793                 LISTHEAD(serviceapplication->launchconditions, tmp6);
3794                 serviceapplication->launchconditions = tmp6;
3795         }
3796         if (serviceapplication->notification) {
3797                 LISTHEAD(serviceapplication->notification, tmp7);
3798                 serviceapplication->notification = tmp7;
3799         }
3800         if (serviceapplication->datashare) {
3801                 LISTHEAD(serviceapplication->datashare, tmp8);
3802                 serviceapplication->datashare = tmp8;
3803         }
3804         if (serviceapplication->category) {
3805                 LISTHEAD(serviceapplication->category, tmp9);
3806                 serviceapplication->category = tmp9;
3807         }
3808         if (serviceapplication->metadata) {
3809                 LISTHEAD(serviceapplication->metadata, tmp10);
3810                 serviceapplication->metadata = tmp10;
3811         }
3812         if (serviceapplication->permission) {
3813                 LISTHEAD(serviceapplication->permission, tmp11);
3814                 serviceapplication->permission = tmp11;
3815         }
3816
3817         return ret;
3818 }
3819
3820 static int __ps_process_deviceprofile(xmlTextReaderPtr reader, deviceprofile_x *deviceprofile)
3821 {
3822         /*TODO: once policy is set*/
3823         return 0;
3824 }
3825
3826 static int __ps_process_font(xmlTextReaderPtr reader, font_x *font)
3827 {
3828         /*TODO: once policy is set*/
3829         return 0;
3830 }
3831
3832 static int __ps_process_theme(xmlTextReaderPtr reader, theme_x *theme)
3833 {
3834         /*TODO: once policy is set*/
3835         return 0;
3836 }
3837
3838 static int __ps_process_daemon(xmlTextReaderPtr reader, daemon_x *daemon)
3839 {
3840         /*TODO: once policy is set*/
3841         return 0;
3842 }
3843
3844 static int __ps_process_ime(xmlTextReaderPtr reader, ime_x *ime)
3845 {
3846         /*TODO: once policy is set*/
3847         return 0;
3848 }
3849
3850 static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx, uid_t uid)
3851 {
3852         _LOGD("__start_process\n");
3853         const xmlChar *node;
3854         int ret = -1;
3855         int depth = -1;
3856         label_x *tmp1 = NULL;
3857         author_x *tmp2 = NULL;
3858         description_x *tmp3 = NULL;
3859         license_x *tmp4 = NULL;
3860         uiapplication_x *tmp5 = NULL;
3861         serviceapplication_x *tmp6 = NULL;
3862         daemon_x *tmp7 = NULL;
3863         theme_x *tmp8 = NULL;
3864         font_x *tmp9 = NULL;
3865         ime_x *tmp10 = NULL;
3866         icon_x *tmp11 = NULL;
3867         compatibility_x *tmp12 = NULL;
3868         deviceprofile_x *tmp13 = NULL;
3869         privileges_x *tmp14 = NULL;
3870
3871         depth = xmlTextReaderDepth(reader);
3872         while ((ret = __next_child_element(reader, depth))) {
3873                 node = xmlTextReaderConstName(reader);
3874                 if (!node) {
3875                         _LOGD("xmlTextReaderConstName value is NULL\n");
3876                         return -1;
3877                 }
3878
3879                 if (!strcmp(ASCII(node), "label")) {
3880                         label_x *label = malloc(sizeof(label_x));
3881                         if (label == NULL) {
3882                                 _LOGD("Malloc Failed\n");
3883                                 return -1;
3884                         }
3885                         memset(label, '\0', sizeof(label_x));
3886                         LISTADD(mfx->label, label);
3887                         ret = __ps_process_label(reader, label);
3888                 } else if (!strcmp(ASCII(node), "author")) {
3889                         author_x *author = malloc(sizeof(author_x));
3890                         if (author == NULL) {
3891                                 _LOGD("Malloc Failed\n");
3892                                 return -1;
3893                         }
3894                         memset(author, '\0', sizeof(author_x));
3895                         LISTADD(mfx->author, author);
3896                         ret = __ps_process_author(reader, author);
3897                 } else if (!strcmp(ASCII(node), "description")) {
3898                         description_x *description = malloc(sizeof(description_x));
3899                         if (description == NULL) {
3900                                 _LOGD("Malloc Failed\n");
3901                                 return -1;
3902                         }
3903                         memset(description, '\0', sizeof(description_x));
3904                         LISTADD(mfx->description, description);
3905                         ret = __ps_process_description(reader, description);
3906                 } else if (!strcmp(ASCII(node), "license")) {
3907                         license_x *license = malloc(sizeof(license_x));
3908                         if (license == NULL) {
3909                                 _LOGD("Malloc Failed\n");
3910                                 return -1;
3911                         }
3912                         memset(license, '\0', sizeof(license_x));
3913                         LISTADD(mfx->license, license);
3914                         ret = __ps_process_license(reader, license);
3915                 } else if (!strcmp(ASCII(node), "privileges")) {
3916                         privileges_x *privileges = malloc(sizeof(privileges_x));
3917                         if (privileges == NULL) {
3918                                 _LOGD("Malloc Failed\n");
3919                                 return -1;
3920                         }
3921                         memset(privileges, '\0', sizeof(privileges_x));
3922                         LISTADD(mfx->privileges, privileges);
3923                         ret = __ps_process_privileges(reader, privileges);
3924                 } else if (!strcmp(ASCII(node), "ui-application")) {
3925                         uiapplication_x *uiapplication = malloc(sizeof(uiapplication_x));
3926                         if (uiapplication == NULL) {
3927                                 _LOGD("Malloc Failed\n");
3928                                 return -1;
3929                         }
3930                         memset(uiapplication, '\0', sizeof(uiapplication_x));
3931                         LISTADD(mfx->uiapplication, uiapplication);
3932                         ret = __ps_process_uiapplication(reader, uiapplication, uid);
3933                 } else if (!strcmp(ASCII(node), "service-application")) {
3934                         serviceapplication_x *serviceapplication = malloc(sizeof(serviceapplication_x));
3935                         if (serviceapplication == NULL) {
3936                                 _LOGD("Malloc Failed\n");
3937                                 return -1;
3938                         }
3939                         memset(serviceapplication, '\0', sizeof(serviceapplication_x));
3940                         LISTADD(mfx->serviceapplication, serviceapplication);
3941                         ret = __ps_process_serviceapplication(reader, serviceapplication, uid);
3942                 } else if (!strcmp(ASCII(node), "daemon")) {
3943                         daemon_x *daemon = malloc(sizeof(daemon_x));
3944                         if (daemon == NULL) {
3945                                 _LOGD("Malloc Failed\n");
3946                                 return -1;
3947                         }
3948                         memset(daemon, '\0', sizeof(daemon_x));
3949                         LISTADD(mfx->daemon, daemon);
3950                         ret = __ps_process_daemon(reader, daemon);
3951                 } else if (!strcmp(ASCII(node), "theme")) {
3952                         theme_x *theme = malloc(sizeof(theme_x));
3953                         if (theme == NULL) {
3954                                 _LOGD("Malloc Failed\n");
3955                                 return -1;
3956                         }
3957                         memset(theme, '\0', sizeof(theme_x));
3958                         LISTADD(mfx->theme, theme);
3959                         ret = __ps_process_theme(reader, theme);
3960                 } else if (!strcmp(ASCII(node), "font")) {
3961                         font_x *font = malloc(sizeof(font_x));
3962                         if (font == NULL) {
3963                                 _LOGD("Malloc Failed\n");
3964                                 return -1;
3965                         }
3966                         memset(font, '\0', sizeof(font_x));
3967                         LISTADD(mfx->font, font);
3968                         ret = __ps_process_font(reader, font);
3969                 } else if (!strcmp(ASCII(node), "ime")) {
3970                         ime_x *ime = malloc(sizeof(ime_x));
3971                         if (ime == NULL) {
3972                                 _LOGD("Malloc Failed\n");
3973                                 return -1;
3974                         }
3975                         memset(ime, '\0', sizeof(ime_x));
3976                         LISTADD(mfx->ime, ime);
3977                         ret = __ps_process_ime(reader, ime);
3978                 } else if (!strcmp(ASCII(node), "icon")) {
3979                         icon_x *icon = malloc(sizeof(icon_x));
3980                         if (icon == NULL) {
3981                                 _LOGD("Malloc Failed\n");
3982                                 return -1;
3983                         }
3984                         memset(icon, '\0', sizeof(icon_x));
3985                         LISTADD(mfx->icon, icon);
3986                         ret = __ps_process_icon(reader, icon, uid);
3987                 } else if (!strcmp(ASCII(node), "profile")) {
3988                         deviceprofile_x *deviceprofile = malloc(sizeof(deviceprofile_x));
3989                         if (deviceprofile == NULL) {
3990                                 _LOGD("Malloc Failed\n");
3991                                 return -1;
3992                         }
3993                         memset(deviceprofile, '\0', sizeof(deviceprofile_x));
3994                         LISTADD(mfx->deviceprofile, deviceprofile);
3995                         ret = __ps_process_deviceprofile(reader, deviceprofile);
3996                 } else if (!strcmp(ASCII(node), "compatibility")) {
3997                         compatibility_x *compatibility = malloc(sizeof(compatibility_x));
3998                         if (compatibility == NULL) {
3999                                 _LOGD("Malloc Failed\n");
4000                                 return -1;
4001                         }
4002                         memset(compatibility, '\0', sizeof(compatibility_x));
4003                         LISTADD(mfx->compatibility, compatibility);
4004                         ret = __ps_process_compatibility(reader, compatibility);
4005                 } else if (!strcmp(ASCII(node), "shortcut-list")) {
4006                         continue;
4007                 } else if (!strcmp(ASCII(node), "livebox")) {
4008                         continue;
4009                 } else if (!strcmp(ASCII(node), "account")) {
4010                         continue;
4011                 } else if (!strcmp(ASCII(node), "notifications")) {
4012                         continue;
4013                 } else if (!strcmp(ASCII(node), "ime")) {
4014                         continue;
4015                 } else if (!strcmp(ASCII(node), "feature")) {
4016                         continue;
4017                 } else {
4018                         _LOGE("Unknown element: %s", ASCII(node));
4019                         return -1;
4020                 }
4021
4022                 if (ret < 0) {
4023                         _LOGD("Processing manifest failed\n");
4024                         return ret;
4025                 }
4026         }
4027         if (mfx->label) {
4028                 LISTHEAD(mfx->label, tmp1);
4029                 mfx->label = tmp1;
4030         }
4031         if (mfx->author) {
4032                 LISTHEAD(mfx->author, tmp2);
4033                 mfx->author = tmp2;
4034         }
4035         if (mfx->description) {
4036                 LISTHEAD(mfx->description, tmp3);
4037                 mfx->description= tmp3;
4038         }
4039         if (mfx->license) {
4040                 LISTHEAD(mfx->license, tmp4);
4041                 mfx->license= tmp4;
4042         }
4043         if (mfx->uiapplication) {
4044                 LISTHEAD(mfx->uiapplication, tmp5);
4045                 mfx->uiapplication = tmp5;
4046         }
4047         if (mfx->serviceapplication) {
4048                 LISTHEAD(mfx->serviceapplication, tmp6);
4049                 mfx->serviceapplication = tmp6;
4050         }
4051         if (mfx->daemon) {
4052                 LISTHEAD(mfx->daemon, tmp7);
4053                 mfx->daemon= tmp7;
4054         }
4055         if (mfx->theme) {
4056                 LISTHEAD(mfx->theme, tmp8);
4057                 mfx->theme= tmp8;
4058         }
4059         if (mfx->font) {
4060                 LISTHEAD(mfx->font, tmp9);
4061                 mfx->font= tmp9;
4062         }
4063         if (mfx->ime) {
4064                 LISTHEAD(mfx->ime, tmp10);
4065                 mfx->ime= tmp10;
4066         }
4067         if (mfx->icon) {
4068                 LISTHEAD(mfx->icon, tmp11);
4069                 mfx->icon= tmp11;
4070         }
4071         if (mfx->compatibility) {
4072                 LISTHEAD(mfx->compatibility, tmp12);
4073                 mfx->compatibility= tmp12;
4074         }
4075         if (mfx->deviceprofile) {
4076                 LISTHEAD(mfx->deviceprofile, tmp13);
4077                 mfx->deviceprofile= tmp13;
4078         }
4079         if (mfx->privileges) {
4080                 LISTHEAD(mfx->privileges, tmp14);
4081                 mfx->privileges = tmp14;
4082         }
4083         return ret;
4084 }
4085
4086 static int __process_manifest(xmlTextReaderPtr reader, manifest_x * mfx, uid_t uid)
4087 {
4088         const xmlChar *node;
4089         int ret = -1;
4090
4091         if ((ret = __next_child_element(reader, -1))) {
4092                 node = xmlTextReaderConstName(reader);
4093                 if (!node) {
4094                         _LOGD("xmlTextReaderConstName value is NULL\n");
4095                         return -1;
4096                 }
4097
4098                 if (!strcmp(ASCII(node), "manifest")) {
4099                         if (xmlTextReaderGetAttribute(reader, XMLCHAR("xmlns"))){
4100                                 mfx->ns = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("xmlns")));
4101                         }
4102                         if (xmlTextReaderGetAttribute(reader, XMLCHAR("package"))) {
4103                                 mfx->package= ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("package")));
4104                                 if (mfx->package == NULL) {
4105                                         _LOGD("package cant be NULL\n");
4106                                         return -1;
4107                                 }
4108                         } else {
4109                                 _LOGD("package field is mandatory\n");
4110                                 return -1;
4111                         }
4112                         package = mfx->package;
4113                         if (xmlTextReaderGetAttribute(reader, XMLCHAR("version")))
4114                                 mfx->version= ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("version")));
4115                         /*app2ext needs package size for external installation*/
4116                         if (xmlTextReaderGetAttribute(reader, XMLCHAR("size")))
4117                                 mfx->package_size = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("size")));
4118                         if (xmlTextReaderGetAttribute(reader, XMLCHAR("install-location")))
4119                                 mfx->installlocation = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("install-location")));
4120                         if (xmlTextReaderGetAttribute(reader, XMLCHAR("type")))
4121                                 mfx->type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("type")));
4122                         if (xmlTextReaderGetAttribute(reader, XMLCHAR("root_path")))
4123                                 mfx->root_path = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("root_path")));
4124                         if (xmlTextReaderGetAttribute(reader, XMLCHAR("csc_path")))
4125                                 mfx->csc_path = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("csc_path")));
4126                         if (xmlTextReaderGetAttribute(reader, XMLCHAR("main_package")))
4127                                 mfx->main_package = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("main_package")));
4128                         if (xmlTextReaderGetAttribute(reader, XMLCHAR("appsetting"))) {
4129                                 mfx->appsetting = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("appsetting")));
4130                                 if (mfx->appsetting == NULL)
4131                                         mfx->appsetting = strdup("false");
4132                         } else {
4133                                 mfx->appsetting = strdup("false");
4134                         }
4135                         if (xmlTextReaderGetAttribute(reader, XMLCHAR("storeclient-id")))
4136                                 mfx->storeclient_id= ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("storeclient-id")));
4137                         if (xmlTextReaderGetAttribute(reader, XMLCHAR("nodisplay-setting"))) {
4138                                 mfx->nodisplay_setting = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("nodisplay-setting")));
4139                                 if (mfx->nodisplay_setting == NULL)
4140                                         mfx->nodisplay_setting = strdup("false");
4141                         } else {
4142                                 mfx->nodisplay_setting = strdup("false");
4143                         }
4144                         if (xmlTextReaderGetAttribute(reader, XMLCHAR("url")))
4145                                 mfx->package_url= ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("url")));
4146                         /*Assign default values. If required it will be overwritten in __add_preload_info()*/
4147                         mfx->preload = strdup("False");
4148                         mfx->removable = strdup("True");
4149                         mfx->readonly = strdup("False");
4150                         mfx->update = strdup("False");
4151                         mfx->system = strdup("False");
4152                         char buf[PKG_STRING_LEN_MAX] = {'\0'};
4153                         char *val = NULL;
4154                         time_t current_time;
4155                         time(&current_time);
4156                         snprintf(buf, PKG_STRING_LEN_MAX - 1, "%d", current_time);
4157                         val = strndup(buf, PKG_STRING_LEN_MAX - 1);
4158                         mfx->installed_time = val;
4159                         mfx->installed_storage= strdup("installed_internal");
4160
4161                         ret = __start_process(reader, mfx, uid);
4162                 } else {
4163                         _LOGD("No Manifest element found\n");
4164                         return -1;
4165                 }
4166         }
4167         return ret;
4168 }
4169
4170 static char* __convert_to_system_locale(const char *mlocale)
4171 {
4172         if (mlocale == NULL)
4173                 return NULL;
4174         char *locale = NULL;
4175         locale = (char *)calloc(1, 6);
4176         if (!locale) {
4177                 _LOGE("Malloc Failed\n");
4178                 return NULL;
4179         }
4180
4181         strncpy(locale, mlocale, 2);
4182         strncat(locale, "_", 1);
4183         locale[3] = toupper(mlocale[3]);
4184         locale[4] = toupper(mlocale[4]);
4185         return locale;
4186 }
4187
4188 #define LIBAPPSVC_PATH LIB_PATH "/libappsvc.so.0"
4189
4190 static int __ps_remove_appsvc_db(manifest_x *mfx, uid_t uid)
4191 {
4192         void *lib_handle = NULL;
4193         int (*appsvc_operation) (const char *, uid_t);
4194         int ret = 0;
4195         uiapplication_x *uiapplication = mfx->uiapplication;
4196
4197         if ((lib_handle = dlopen(LIBAPPSVC_PATH, RTLD_LAZY)) == NULL) {
4198                 _LOGE("dlopen is failed LIBAPPSVC_PATH[%s]\n", LIBAPPSVC_PATH);
4199                 goto END;
4200         }
4201
4202         if ((appsvc_operation =
4203                  dlsym(lib_handle, "appsvc_unset_defapp")) == NULL || dlerror() != NULL) {
4204                 _LOGE("can not find symbol \n");
4205                 goto END;
4206         }
4207
4208         for(; uiapplication; uiapplication=uiapplication->next) {
4209                 ret = appsvc_operation(uiapplication->appid, uid);
4210                 if (ret <0)
4211                         _LOGE("can not operation  symbol \n");
4212         }
4213
4214 END:
4215         if (lib_handle)
4216                 dlclose(lib_handle);
4217
4218         return ret;
4219 }
4220
4221 #define PRELOAD_PACKAGE_LIST SYSCONFDIR "/package-manager/preload/preload_list.txt"
4222 static int __add_preload_info(manifest_x * mfx, const char *manifest, uid_t uid)
4223 {
4224         FILE *fp = NULL;
4225         char buffer[1024] = { 0 };
4226         int state = 0;
4227
4228         if(strstr(manifest, getUserManifestPath(uid))) {
4229                 free((void *)mfx->readonly);
4230                 mfx->readonly = strdup("True");
4231
4232                 free((void *)mfx->preload);
4233                 mfx->preload = strdup("True");
4234
4235                 free((void *)mfx->removable);
4236                 mfx->removable = strdup("False");
4237
4238                 free((void *)mfx->system);
4239                 mfx->system = strdup("True");
4240
4241                 return 0;
4242         }
4243
4244         fp = fopen(PRELOAD_PACKAGE_LIST, "r");
4245         if (fp == NULL) {
4246                 _LOGE("no preload list\n");
4247                 return -1;
4248         }
4249
4250         while (fgets(buffer, sizeof(buffer), fp) != NULL) {
4251                 if (buffer[0] == '#') {
4252                         if(strcasestr(buffer, "RW_NORM"))
4253                                 state = 2;
4254                         else if(strcasestr(buffer, "RW_RM"))
4255                                 state = 3;
4256                         else
4257                                 continue;
4258                 }
4259
4260                 __str_trim(buffer);
4261
4262                 if(!strcmp(mfx->package, buffer)) {
4263                         free((void *)mfx->preload);
4264                         mfx->preload = strdup("True");
4265                         if(state == 2){
4266                                 free((void *)mfx->readonly);
4267                                 mfx->readonly = strdup("False");
4268                                 free((void *)mfx->removable);
4269                                 mfx->removable = strdup("False");
4270                         } else if(state == 3){
4271                                 free((void *)mfx->readonly);
4272                                 mfx->readonly = strdup("False");
4273                                 free((void *)mfx->removable);
4274                                 mfx->removable = strdup("True");
4275                         }
4276                 }
4277
4278                 memset(buffer, 0x00, sizeof(buffer));
4279         }
4280
4281         if (fp != NULL)
4282                 fclose(fp);
4283
4284         return 0;
4285 }
4286
4287 static int __check_preload_updated(manifest_x * mfx, const char *manifest, uid_t uid)
4288 {
4289         if (!strstr(manifest, getUserManifestPath(uid))) {
4290                 /* if downloaded app is updated, then update tag set true*/
4291                 if (mfx->update)
4292                         free((void *)mfx->update);
4293                 mfx->update = strdup("true");
4294         }
4295
4296         return 0;
4297 }
4298
4299
4300 API int pkgmgr_parser_create_desktop_file(manifest_x *mfx)
4301 {
4302         /* desktop file is no longer used */
4303         return 0;
4304 }
4305
4306 API int pkgmgr_parser_create_usr_desktop_file(manifest_x *mfx, uid_t uid)
4307 {
4308         /* desktop file is no longer used */
4309         return 0;
4310 }
4311
4312
4313 API void pkgmgr_parser_free_manifest_xml(manifest_x *mfx)
4314 {
4315         if (mfx == NULL)
4316                 return;
4317         if (mfx->ns) {
4318                 free((void *)mfx->ns);
4319                 mfx->ns = NULL;
4320         }
4321         if (mfx->package) {
4322                 free((void *)mfx->package);
4323                 mfx->package = NULL;
4324         }
4325         if (mfx->version) {
4326                 free((void *)mfx->version);
4327                 mfx->version = NULL;
4328         }
4329         if (mfx->installlocation) {
4330                 free((void *)mfx->installlocation);
4331                 mfx->installlocation = NULL;
4332         }
4333         if (mfx->preload) {
4334                 free((void *)mfx->preload);
4335                 mfx->preload = NULL;
4336         }
4337         if (mfx->readonly) {
4338                 free((void *)mfx->readonly);
4339                 mfx->readonly = NULL;
4340         }
4341         if (mfx->removable) {
4342                 free((void *)mfx->removable);
4343                 mfx->removable = NULL;
4344         }
4345         if (mfx->update) {
4346                 free((void *)mfx->update);
4347                 mfx->update = NULL;
4348         }
4349         if (mfx->system) {
4350                 free((void *)mfx->system);
4351                 mfx->system = NULL;
4352         }
4353         if (mfx->type) {
4354                 free((void *)mfx->type);
4355                 mfx->type = NULL;
4356         }
4357         if (mfx->package_size) {
4358                 free((void *)mfx->package_size);
4359                 mfx->package_size = NULL;
4360         }
4361         if (mfx->installed_time) {
4362                 free((void *)mfx->installed_time);
4363                 mfx->installed_time = NULL;
4364         }
4365         if (mfx->installed_storage) {
4366                 free((void *)mfx->installed_storage);
4367                 mfx->installed_storage = NULL;
4368         }
4369         if (mfx->storeclient_id) {
4370                 free((void *)mfx->storeclient_id);
4371                 mfx->storeclient_id = NULL;
4372         }
4373         if (mfx->mainapp_id) {
4374                 free((void *)mfx->mainapp_id);
4375                 mfx->mainapp_id = NULL;
4376         }
4377         if (mfx->package_url) {
4378                 free((void *)mfx->package_url);
4379                 mfx->package_url = NULL;
4380         }
4381         if (mfx->root_path) {
4382                 free((void *)mfx->root_path);
4383                 mfx->root_path = NULL;
4384         }
4385         if (mfx->csc_path) {
4386                 free((void *)mfx->csc_path);
4387                 mfx->csc_path = NULL;
4388         }
4389         if (mfx->appsetting) {
4390                 free((void *)mfx->appsetting);
4391                 mfx->appsetting = NULL;
4392         }
4393         if (mfx->nodisplay_setting) {
4394                 free((void *)mfx->nodisplay_setting);
4395                 mfx->nodisplay_setting = NULL;
4396         }
4397         if (mfx->main_package) {
4398                 free((void *)mfx->main_package);
4399                 mfx->main_package = NULL;
4400         }
4401
4402         /*Free Icon*/
4403         if (mfx->icon) {
4404                 icon_x *icon = mfx->icon;
4405                 icon_x *tmp = NULL;
4406                 while(icon != NULL) {
4407                         tmp = icon->next;
4408                         __ps_free_icon(icon);
4409                         icon = tmp;
4410                 }
4411         }
4412         /*Free Label*/
4413         if (mfx->label) {
4414                 label_x *label = mfx->label;
4415                 label_x *tmp = NULL;
4416                 while(label != NULL) {
4417                         tmp = label->next;
4418                         __ps_free_label(label);
4419                         label = tmp;
4420                 }
4421         }
4422         /*Free Author*/
4423         if (mfx->author) {
4424                 author_x *author = mfx->author;
4425                 author_x *tmp = NULL;
4426                 while(author != NULL) {
4427                         tmp = author->next;
4428                         __ps_free_author(author);
4429                         author = tmp;
4430                 }
4431         }
4432         /*Free Description*/
4433         if (mfx->description) {
4434                 description_x *description = mfx->description;
4435                 description_x *tmp = NULL;
4436                 while(description != NULL) {
4437                         tmp = description->next;
4438                         __ps_free_description(description);
4439                         description = tmp;
4440                 }
4441         }
4442         /*Free License*/
4443         if (mfx->license) {
4444                 license_x *license = mfx->license;
4445                 license_x *tmp = NULL;
4446                 while(license != NULL) {
4447                         tmp = license->next;
4448                         __ps_free_license(license);
4449                         license = tmp;
4450                 }
4451         }
4452         /*Free Privileges*/
4453         if (mfx->privileges) {
4454                 privileges_x *privileges = mfx->privileges;
4455                 privileges_x *tmp = NULL;
4456                 while(privileges != NULL) {
4457                         tmp = privileges->next;
4458                         __ps_free_privileges(privileges);
4459                         privileges = tmp;
4460                 }
4461         }
4462         /*Free UiApplication*/
4463         if (mfx->uiapplication) {
4464                 uiapplication_x *uiapplication = mfx->uiapplication;
4465                 uiapplication_x *tmp = NULL;
4466                 while(uiapplication != NULL) {
4467                         tmp = uiapplication->next;
4468                         __ps_free_uiapplication(uiapplication);
4469                         uiapplication = tmp;
4470                 }
4471         }
4472         /*Free ServiceApplication*/
4473         if (mfx->serviceapplication) {
4474                 serviceapplication_x *serviceapplication = mfx->serviceapplication;
4475                 serviceapplication_x *tmp = NULL;
4476                 while(serviceapplication != NULL) {
4477                         tmp = serviceapplication->next;
4478                         __ps_free_serviceapplication(serviceapplication);
4479                         serviceapplication = tmp;
4480                 }
4481         }
4482         /*Free Daemon*/
4483         if (mfx->daemon) {
4484                 daemon_x *daemon = mfx->daemon;
4485                 daemon_x *tmp = NULL;
4486                 while(daemon != NULL) {
4487                         tmp = daemon->next;
4488                         __ps_free_daemon(daemon);
4489                         daemon = tmp;
4490                 }
4491         }
4492         /*Free Theme*/
4493         if (mfx->theme) {
4494                 theme_x *theme = mfx->theme;
4495                 theme_x *tmp = NULL;
4496                 while(theme != NULL) {
4497                         tmp = theme->next;
4498                         __ps_free_theme(theme);
4499                         theme = tmp;
4500                 }
4501         }
4502         /*Free Font*/
4503         if (mfx->font) {
4504                 font_x *font = mfx->font;
4505                 font_x *tmp = NULL;
4506                 while(font != NULL) {
4507                         tmp = font->next;
4508                         __ps_free_font(font);
4509                         font = tmp;
4510                 }
4511         }
4512         /*Free Ime*/
4513         if (mfx->ime) {
4514                 ime_x *ime = mfx->ime;
4515                 ime_x *tmp = NULL;
4516                 while(ime != NULL) {
4517                         tmp = ime->next;
4518                         __ps_free_ime(ime);
4519                         ime = tmp;
4520                 }
4521         }
4522         /*Free Compatibility*/
4523         if (mfx->compatibility) {
4524                 compatibility_x *compatibility = mfx->compatibility;
4525                 compatibility_x *tmp = NULL;
4526                 while(compatibility != NULL) {
4527                         tmp = compatibility->next;
4528                         __ps_free_compatibility(compatibility);
4529                         compatibility = tmp;
4530                 }
4531         }
4532         /*Free DeviceProfile*/
4533         if (mfx->deviceprofile) {
4534                 deviceprofile_x *deviceprofile = mfx->deviceprofile;
4535                 deviceprofile_x *tmp = NULL;
4536                 while(deviceprofile != NULL) {
4537                         tmp = deviceprofile->next;
4538                         __ps_free_deviceprofile(deviceprofile);
4539                         deviceprofile = tmp;
4540                 }
4541         }
4542         free((void*)mfx);
4543         mfx = NULL;
4544         return;
4545 }
4546
4547 API manifest_x *pkgmgr_parser_process_manifest_xml(const char *manifest)
4548 {
4549         _LOGD("parsing start pkgmgr_parser_process_manifest_xml\n");
4550         xmlTextReaderPtr reader;
4551         manifest_x *mfx = NULL;
4552
4553         reader = xmlReaderForFile(manifest, NULL, 0);
4554         if (reader) {
4555                 mfx = malloc(sizeof(manifest_x));
4556                 if (mfx) {
4557                         memset(mfx, '\0', sizeof(manifest_x));
4558                         if (__process_manifest(reader, mfx, GLOBAL_USER) < 0) {
4559                                 _LOGD("Parsing Failed\n");
4560                                 pkgmgr_parser_free_manifest_xml(mfx);
4561                                 mfx = NULL;
4562                         } else
4563                                 _LOGD("Parsing Success\n");
4564                 } else {
4565                         _LOGD("Memory allocation error\n");
4566                 }
4567                 xmlFreeTextReader(reader);
4568         } else {
4569                 _LOGD("Unable to create xml reader\n");
4570         }
4571         return mfx;
4572 }
4573
4574
4575 API manifest_x *pkgmgr_parser_usr_process_manifest_xml(const char *manifest, uid_t uid)
4576 {
4577         _LOGD("parsing start pkgmgr_parser_usr_process_manifest_xml\n");
4578         xmlTextReaderPtr reader;
4579         manifest_x *mfx = NULL;
4580
4581         reader = xmlReaderForFile(manifest, NULL, 0);
4582         if (reader) {
4583                 mfx = malloc(sizeof(manifest_x));
4584                 if (mfx) {
4585                         memset(mfx, '\0', sizeof(manifest_x));
4586                         if (__process_manifest(reader, mfx, uid) < 0) {
4587                                 _LOGD("Parsing Failed\n");
4588                                 pkgmgr_parser_free_manifest_xml(mfx);
4589                                 mfx = NULL;
4590                         } else
4591                                 _LOGD("Parsing Success\n");
4592                 } else {
4593                         _LOGD("Memory allocation error\n");
4594                 }
4595                 xmlFreeTextReader(reader);
4596         } else {
4597                 _LOGD("Unable to create xml reader\n");
4598         }
4599         return mfx;
4600 }
4601
4602 /* These APIs are intended to call parser directly */
4603
4604 API int pkgmgr_parser_parse_manifest_for_installation(const char *manifest, char *const tagv[])
4605 {
4606 //      char *temp[] = {"shortcut-list", "livebox", "account", "notifications", "privileges", "ime", "font", NULL};
4607         retvm_if(manifest == NULL, PMINFO_R_ERROR, "argument supplied is NULL");
4608         _LOGD("parsing manifest for installation: %s\n", manifest);
4609
4610         manifest_x *mfx = NULL;
4611         int ret = -1;
4612
4613         xmlInitParser();
4614         mfx = pkgmgr_parser_process_manifest_xml(manifest);
4615         retvm_if(mfx == NULL, PMINFO_R_ERROR, "argument supplied is NULL");
4616
4617         _LOGD("Parsing Finished\n");
4618
4619 //      __streamFile(manifest, ACTION_INSTALL, temp, mfx->package);
4620         __add_preload_info(mfx, manifest, GLOBAL_USER);
4621
4622         _LOGD("Added preload infomation\n");
4623
4624         __ps_process_tag(mfx, tagv);
4625
4626         ret = pkgmgr_parser_insert_manifest_info_in_db(mfx);
4627         retvm_if(ret == PMINFO_R_ERROR, PMINFO_R_ERROR, "DB Insert failed");
4628
4629         _LOGD("DB Insert Success\n");
4630
4631         __ps_process_tag_parser(mfx, manifest, ACTION_INSTALL);
4632         ret = __ps_process_metadata_parser(mfx, ACTION_INSTALL);
4633         if (ret == -1)
4634                 _LOGD("Creating metadata parser failed\n");
4635
4636         ret = __ps_process_category_parser(mfx, ACTION_INSTALL);
4637         if (ret == -1)
4638                 _LOGD("Creating category parser failed\n");
4639
4640         pkgmgr_parser_free_manifest_xml(mfx);
4641         _LOGD("Free Done\n");
4642         xmlCleanupParser();
4643
4644         return PMINFO_R_OK;
4645 }
4646 API int pkgmgr_parser_parse_usr_manifest_for_installation(const char *manifest, uid_t uid, char *const tagv[])
4647 {
4648 //      char *temp[] = {"shortcut-list", "livebox", "account", "notifications", "privileges", "ime", "font", NULL};
4649         retvm_if(manifest == NULL, PMINFO_R_ERROR, "argument supplied is NULL");
4650         _LOGD("parsing manifest for installation: %s\n", manifest);
4651         manifest_x *mfx = NULL;
4652         int ret = -1;
4653
4654         xmlInitParser();
4655         mfx = pkgmgr_parser_usr_process_manifest_xml(manifest, uid);
4656         retvm_if(mfx == NULL, PMINFO_R_ERROR, "argument supplied is NULL");
4657
4658         _LOGD("Parsing Finished\n");
4659 //      __streamFile(manifest, ACTION_INSTALL, temp, mfx->package);
4660
4661         __ps_process_tag(mfx, tagv);
4662
4663         ret = pkgmgr_parser_insert_manifest_info_in_usr_db(mfx, uid);
4664         retvm_if(ret == PMINFO_R_ERROR, PMINFO_R_ERROR, "DB Insert failed");
4665
4666         _LOGD("DB Insert Success\n");
4667
4668         __ps_process_tag_parser(mfx, manifest, ACTION_INSTALL);
4669         ret = __ps_process_metadata_parser(mfx, ACTION_INSTALL);
4670         if (ret == -1)
4671                 _LOGD("Creating metadata parser failed\n");
4672         ret = __ps_process_category_parser(mfx, ACTION_INSTALL);
4673         if (ret == -1)
4674                 _LOGD("Creating category parser failed\n");
4675
4676         pkgmgr_parser_free_manifest_xml(mfx);
4677         _LOGD("Free Done\n");
4678         xmlCleanupParser();
4679
4680         return PMINFO_R_OK;
4681 }
4682
4683 API int pkgmgr_parser_parse_manifest_for_upgrade(const char *manifest, char *const tagv[])
4684 {
4685 //      char *temp[] = {"shortcut-list", "livebox", "account", "notifications", "privileges", "ime", "font", NULL};
4686         retvm_if(manifest == NULL, PMINFO_R_ERROR, "argument supplied is NULL");
4687         _LOGD("pkgmgr_parser_parse_manifest_for_upgrade  parsing manifest for upgradation: %s\n", manifest);
4688         manifest_x *mfx = NULL;
4689         int ret = -1;
4690         bool preload = false;
4691         bool system = false;
4692         char *csc_path = NULL;
4693         pkgmgrinfo_pkginfo_h handle = NULL;
4694
4695         xmlInitParser();
4696         mfx = pkgmgr_parser_process_manifest_xml(manifest);
4697         retvm_if(mfx == NULL, PMINFO_R_ERROR, "argument supplied is NULL");
4698
4699         _LOGD("Parsing Finished\n");
4700 //      __streamFile(manifest, ACTION_UPGRADE, temp, mfx->package);
4701         __add_preload_info(mfx, manifest, GLOBAL_USER);
4702         _LOGD("Added preload infomation\n");
4703         __check_preload_updated(mfx, manifest, GLOBAL_USER);
4704
4705         ret = pkgmgrinfo_pkginfo_get_pkginfo(mfx->package, &handle);
4706         if (ret != PMINFO_R_OK)
4707                 _LOGD("pkgmgrinfo_pkginfo_get_pkginfo failed\n");
4708         ret = pkgmgrinfo_pkginfo_is_preload(handle, &preload);
4709         if (ret != PMINFO_R_OK)
4710                 _LOGD("pkgmgrinfo_pkginfo_is_preload failed\n");
4711
4712         if (preload) {
4713                 free((void *)mfx->preload);
4714                 mfx->preload = strdup("true");
4715         }
4716
4717         ret = pkgmgrinfo_pkginfo_is_system(handle, &system);
4718         if (ret != PMINFO_R_OK)
4719                 _LOGD("pkgmgrinfo_pkginfo_is_system failed\n");
4720         if (system) {
4721                 free((void *)mfx->system);
4722                 mfx->system = strdup("true");
4723         }
4724
4725         ret = pkgmgrinfo_pkginfo_get_csc_path(handle, &csc_path);
4726         if (ret != PMINFO_R_OK)
4727                 _LOGD("pkgmgrinfo_pkginfo_get_csc_path failed\n");
4728         
4729         if (csc_path != NULL) {
4730                 if (mfx->csc_path)
4731                         free((void *)mfx->csc_path);
4732                 mfx->csc_path = strdup(csc_path);
4733         }
4734
4735         ret = pkgmgr_parser_update_manifest_info_in_db(mfx);
4736         retvm_if(ret == PMINFO_R_ERROR, PMINFO_R_ERROR, "DB Insert failed");
4737
4738         _LOGD("DB Update Success\n");
4739
4740         __ps_process_tag_parser(mfx, manifest, ACTION_UPGRADE);
4741         ret = __ps_process_metadata_parser(mfx, ACTION_UPGRADE);
4742         if (ret == -1){
4743                 _LOGD("Upgrade metadata parser failed\n");
4744         }
4745         ret = __ps_process_category_parser(mfx, ACTION_UPGRADE);
4746         if (ret == -1)
4747                 _LOGD("Creating category parser failed\n");
4748         pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
4749         pkgmgr_parser_free_manifest_xml(mfx);
4750         _LOGD("Free Done\n");
4751         xmlCleanupParser();
4752
4753         return PMINFO_R_OK;
4754 }
4755
4756 API int pkgmgr_parser_parse_usr_manifest_for_upgrade(const char *manifest, uid_t uid, char *const tagv[])
4757 {
4758 //      char *temp[] = {"shortcut-list", "livebox", "account", "notifications", "privileges", "ime", "font", NULL};
4759         retvm_if(manifest == NULL, PMINFO_R_ERROR, "argument supplied is NULL");
4760         _LOGD(" pkgmgr_parser_parse_usr_manifest_for_upgrade parsing manifest for upgradation: %s\n", manifest);
4761         manifest_x *mfx = NULL;
4762         int ret = -1;
4763         bool preload = false;
4764         bool system = false;
4765         char *csc_path = NULL;
4766         pkgmgrinfo_pkginfo_h handle = NULL;
4767
4768         xmlInitParser();
4769         mfx = pkgmgr_parser_usr_process_manifest_xml(manifest, uid);
4770         retvm_if(mfx == NULL, PMINFO_R_ERROR, "argument supplied is NULL");
4771
4772         _LOGD("Parsing Finished\n");
4773         //__streamFile(manifest, ACTION_UPGRADE, temp, mfx->package);
4774         __check_preload_updated(mfx, manifest, uid);
4775
4776         ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(mfx->package, uid, &handle);
4777         if (ret != PMINFO_R_OK)
4778                 _LOGD("pkgmgrinfo_pkginfo_get_pkginfo failed\n");
4779         ret = pkgmgrinfo_pkginfo_is_preload(handle, &preload);
4780         if (ret != PMINFO_R_OK)
4781                 _LOGD("pkgmgrinfo_pkginfo_is_preload failed\n");
4782
4783         if (preload) {
4784                 free((void *)mfx->preload);
4785                 mfx->preload = strdup("true");
4786         }
4787
4788         ret = pkgmgrinfo_pkginfo_is_system(handle, &system);
4789         if (ret != PMINFO_R_OK)
4790                 _LOGD("pkgmgrinfo_pkginfo_is_system failed\n");
4791
4792         if (system) {
4793                 free((void *)mfx->system);
4794                 mfx->system = strdup("true");
4795         }
4796
4797         ret = pkgmgrinfo_pkginfo_get_csc_path(handle, &csc_path);
4798         if (ret != PMINFO_R_OK)
4799                 _LOGD("pkgmgrinfo_pkginfo_get_csc_path failed\n");
4800         if (csc_path != NULL) {
4801                 if (mfx->csc_path)
4802                         free((void *)mfx->csc_path);
4803                 mfx->csc_path = strdup(csc_path);
4804         }
4805
4806         ret = pkgmgr_parser_update_manifest_info_in_usr_db(mfx, uid);
4807         retvm_if(ret == PMINFO_R_ERROR, PMINFO_R_ERROR, "DB Insert failed");
4808         _LOGD("DB Update Success\n");
4809
4810         __ps_process_tag_parser(mfx, manifest, ACTION_UPGRADE);
4811         ret = __ps_process_metadata_parser(mfx, ACTION_UPGRADE);
4812         if (ret == -1)
4813                 _LOGD("Upgrade metadata parser failed\n");
4814         ret = __ps_process_category_parser(mfx, ACTION_UPGRADE);
4815         if (ret == -1)
4816                 _LOGD("Creating category parser failed\n");
4817         pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
4818         pkgmgr_parser_free_manifest_xml(mfx);
4819         _LOGD("Free Done\n");
4820         xmlCleanupParser();
4821
4822         return PMINFO_R_OK;
4823 }
4824
4825 API int pkgmgr_parser_parse_manifest_for_uninstallation(const char *manifest, char *const tagv[])
4826 {
4827 //      char *temp[] = {"shortcut-list", "livebox", "account", "notifications", "privileges", "ime", "font", NULL};
4828         retvm_if(manifest == NULL, PMINFO_R_ERROR, "argument supplied is NULL");
4829         _LOGD("parsing manifest for uninstallation: %s\n", manifest);
4830
4831         manifest_x *mfx = NULL;
4832         int ret = -1;
4833         xmlInitParser();
4834         mfx = pkgmgr_parser_process_manifest_xml(manifest);
4835         retvm_if(mfx == NULL, PMINFO_R_ERROR, "argument supplied is NULL");
4836
4837         _LOGD("Parsing Finished\n");
4838
4839 //      __streamFile(manifest, ACTION_UNINSTALL, temp, mfx->package);
4840         __ps_process_tag_parser(mfx, manifest, ACTION_UNINSTALL);
4841
4842         __add_preload_info(mfx, manifest, GLOBAL_USER);
4843         _LOGD("Added preload infomation\n");
4844
4845         ret = __ps_process_metadata_parser(mfx, ACTION_UNINSTALL);
4846         if (ret == -1)
4847                 _LOGD("Removing metadata parser failed\n");
4848
4849         ret = __ps_process_category_parser(mfx, ACTION_UNINSTALL);
4850         if (ret == -1)
4851                 _LOGD("Creating category parser failed\n");
4852
4853         ret = pkgmgr_parser_delete_manifest_info_from_db(mfx);
4854         if (ret == -1)
4855                 _LOGD("DB Delete failed\n");
4856         else
4857                 _LOGD("DB Delete Success\n");
4858
4859         pkgmgr_parser_free_manifest_xml(mfx);
4860         _LOGD("Free Done\n");
4861         xmlCleanupParser();
4862
4863         return PMINFO_R_OK;
4864 }
4865
4866
4867 API int pkgmgr_parser_parse_usr_manifest_for_uninstallation(const char *manifest, uid_t uid, char *const tagv[])
4868 {
4869 //      char *temp[] = {"shortcut-list", "livebox", "account", "notifications", "privileges", "ime", "font", NULL};
4870         retvm_if(manifest == NULL, PMINFO_R_ERROR, "argument supplied is NULL");
4871         _LOGD("parsing manifest for uninstallation: %s\n", manifest);
4872
4873         manifest_x *mfx = NULL;
4874         int ret = -1;
4875         xmlInitParser();
4876         mfx = pkgmgr_parser_usr_process_manifest_xml(manifest, uid);
4877         retvm_if(mfx == NULL, PMINFO_R_ERROR, "argument supplied is NULL");
4878
4879         _LOGD("Parsing Finished\n");
4880
4881 //      __streamFile(manifest, ACTION_UNINSTALL, temp, mfx->package);
4882         __ps_process_tag_parser(mfx, manifest, ACTION_UNINSTALL);
4883
4884         ret = __ps_process_metadata_parser(mfx, ACTION_UNINSTALL);
4885         if (ret == -1)
4886                 _LOGD("Removing metadata parser failed\n");
4887
4888         ret = __ps_process_category_parser(mfx, ACTION_UNINSTALL);
4889         if (ret == -1)
4890                 _LOGD("Creating category parser failed\n");
4891
4892         ret = pkgmgr_parser_delete_manifest_info_from_usr_db(mfx, uid);
4893         if (ret == -1)
4894                 _LOGD("DB Delete failed\n");
4895         else
4896                 _LOGD("DB Delete Success\n");
4897
4898         ret = __ps_remove_appsvc_db(mfx, uid);
4899         if (ret == -1)
4900                 _LOGD("Removing appsvc_db failed\n");
4901         else
4902                 _LOGD("Removing appsvc_db Success\n");
4903
4904         pkgmgr_parser_free_manifest_xml(mfx);
4905         _LOGD("Free Done\n");
4906         xmlCleanupParser();
4907
4908         return PMINFO_R_OK;
4909 }
4910
4911 API int pkgmgr_parser_parse_manifest_for_preload()
4912 {
4913         return pkgmgr_parser_update_preload_info_in_db();
4914 }
4915
4916 API int pkgmgr_parser_parse_usr_manifest_for_preload(uid_t uid)
4917 {
4918         return pkgmgr_parser_update_preload_info_in_usr_db(uid);
4919 }
4920
4921
4922 API char *pkgmgr_parser_get_usr_manifest_file(const char *pkgid, uid_t uid)
4923 {
4924         return __pkgid_to_manifest(pkgid, uid);
4925 }
4926
4927 API char *pkgmgr_parser_get_manifest_file(const char *pkgid)
4928 {
4929         return __pkgid_to_manifest(pkgid, GLOBAL_USER);
4930 }
4931
4932 API int pkgmgr_parser_run_parser_for_installation(xmlDocPtr docPtr, const char *tag, const char *pkgid)
4933 {
4934         return __ps_run_parser(docPtr, tag, ACTION_INSTALL, pkgid);
4935 }
4936
4937 API int pkgmgr_parser_run_parser_for_upgrade(xmlDocPtr docPtr, const char *tag, const char *pkgid)
4938 {
4939         return __ps_run_parser(docPtr, tag, ACTION_UPGRADE, pkgid);
4940 }
4941
4942 API int pkgmgr_parser_run_parser_for_uninstallation(xmlDocPtr docPtr, const char *tag, const char *pkgid)
4943 {
4944         return __ps_run_parser(docPtr, tag, ACTION_UNINSTALL, pkgid);
4945 }
4946
4947 #define SCHEMA_FILE SYSCONFDIR "/package-manager/preload/manifest.xsd"
4948 #if 1
4949 API int pkgmgr_parser_check_manifest_validation(const char *manifest)
4950 {
4951         if (manifest == NULL) {
4952                 _LOGE("manifest file is NULL\n");
4953                 return PMINFO_R_EINVAL;
4954         }
4955         int ret = -1;
4956         xmlSchemaParserCtxtPtr ctx;
4957         xmlSchemaValidCtxtPtr vctx;
4958         xmlSchemaPtr xschema;
4959         ctx = xmlSchemaNewParserCtxt(SCHEMA_FILE);
4960         if (ctx == NULL) {
4961                 _LOGE("xmlSchemaNewParserCtxt() Failed\n");
4962                 return PMINFO_R_ERROR;
4963         }
4964         xschema = xmlSchemaParse(ctx);
4965         if (xschema == NULL) {
4966                 _LOGE("xmlSchemaParse() Failed\n");
4967                 return PMINFO_R_ERROR;
4968         }
4969         vctx = xmlSchemaNewValidCtxt(xschema);
4970         if (vctx == NULL) {
4971                 _LOGE("xmlSchemaNewValidCtxt() Failed\n");
4972                 return PMINFO_R_ERROR;
4973         }
4974         xmlSchemaSetValidErrors(vctx, (xmlSchemaValidityErrorFunc) fprintf, (xmlSchemaValidityWarningFunc) fprintf, stderr);
4975         ret = xmlSchemaValidateFile(vctx, manifest, 0);
4976         if (ret == -1) {
4977                 _LOGE("xmlSchemaValidateFile() failed\n");
4978                 return PMINFO_R_ERROR;
4979         } else if (ret == 0) {
4980                 _LOGE("Manifest is Valid\n");
4981                 return PMINFO_R_OK;
4982         } else {
4983                 _LOGE("Manifest Validation Failed with error code %d\n", ret);
4984                 return PMINFO_R_ERROR;
4985         }
4986         return PMINFO_R_OK;
4987 }
4988
4989 #else
4990 API int pkgmgr_parser_check_manifest_validation(const char *manifest)
4991 {
4992         int err = 0;
4993         int status = 0;
4994         pid_t pid;
4995
4996         pid = fork();
4997
4998         switch (pid) {
4999         case -1:
5000                 _LOGE("fork failed\n");
5001                 return -1;
5002         case 0:
5003                 /* child */
5004                 {
5005                         int dev_null_fd = open ("/dev/null", O_RDWR);
5006                         if (dev_null_fd >= 0)
5007                         {
5008                                 dup2 (dev_null_fd, 0);/*stdin*/
5009                                 dup2 (dev_null_fd, 1);/*stdout*/
5010                                 dup2 (dev_null_fd, 2);/*stderr*/
5011                         }
5012
5013                         if (execl("/usr/bin/xmllint", "xmllint", manifest, "--schema",
5014                                 SCHEMA_FILE, NULL) < 0) {
5015                                 _LOGE("execl error\n");
5016                         }
5017
5018                         _exit(100);
5019                 }
5020         default:
5021                 /* parent */
5022                 break;
5023         }
5024
5025         while ((err = waitpid(pid, &status, WNOHANG)) != pid) {
5026                 if (err < 0) {
5027                         if (errno == EINTR)
5028                                 continue;
5029                         _LOGE("waitpid failed\n");
5030                         return -1;
5031                 }
5032         }
5033
5034
5035         if(WIFEXITED(status) && !WEXITSTATUS(status))
5036                 return 0;
5037         else
5038                 return -1;
5039 }
5040 #endif