X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=parser%2Fpkgmgr_parser.c;h=a3cd1944a2bc9ca155ea35073eacdf594b989aeb;hb=058e3f199273f85a984d04041b598f8606fae842;hp=27d1830803a32217e3e7870918ad7b9ef5503e8e;hpb=e1b02c2c2bc93cb8c3982cb219c9b99360ebc696;p=platform%2Fcore%2Fappfw%2Fpkgmgr-info.git diff --git a/parser/pkgmgr_parser.c b/parser/pkgmgr_parser.c old mode 100755 new mode 100644 index 27d1830..a3cd194 --- a/parser/pkgmgr_parser.c +++ b/parser/pkgmgr_parser.c @@ -33,33 +33,62 @@ #include #include #include +#include #include "pkgmgr_parser.h" #include "pkgmgr_parser_internal.h" #include "pkgmgr_parser_db.h" #include "pkgmgr-info.h" +#include "pkgmgr_parser_signature.h" +#include "pkgmgr-info-debug.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "PKGMGR_PARSER" -#define MANIFEST_RW_DIRECTORY "/opt/share/packages" -#define MANIFEST_RO_DIRECTORY "/usr/share/packages" #define ASCII(s) (const char *)s #define XMLCHAR(s) (const xmlChar *)s -#define MDPARSER_LIST "/usr/etc/package-manager/parserlib/metadata/mdparser_list.txt" -#define MDPARSER_NAME "mdparser:" +//#define METADATA_PARSER_LIST SYSCONFDIR "/package-manager/parserlib/metadata/metadata_parser_list.txt" +#define METADATA_PARSER_LIST SYSCONFDIR "/package-manager/parserlib/metadata/mdparser_list.txt" +#define METADATA_PARSER_NAME "metadataparser:" + +#define CATEGORY_PARSER_LIST SYSCONFDIR "/package-manager/parserlib/category/category_parser_list.txt" +#define CATEGORY_PARSER_NAME "categoryparser:" + +#define TAG_PARSER_LIST SYSCONFDIR "/package-manager/parserlib/tag_parser_list.txt" +#define TAG_PARSER_NAME "parserlib:" + +#define PKG_TAG_LEN_MAX 128 +#define OWNER_ROOT 0 +#define BUFSIZE 4096 +#define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER) /* operation_type */ typedef enum { ACTION_INSTALL = 0, ACTION_UPGRADE, ACTION_UNINSTALL, + ACTION_FOTA, ACTION_MAX } ACTION_TYPE; +/* plugin process_type */ +typedef enum { + PLUGIN_PRE_PROCESS = 0, + PLUGIN_POST_PROCESS +} PLUGIN_PROCESS_TYPE; + typedef struct { const char *key; const char *value; } __metadata_t; +typedef struct { + const char *name; +} __category_t; + const char *package; static int __ps_process_label(xmlTextReaderPtr reader, label_x *label); @@ -77,21 +106,19 @@ static int __ps_process_category(xmlTextReaderPtr reader, category_x *category); static int __ps_process_metadata(xmlTextReaderPtr reader, metadata_x *metadata); static int __ps_process_permission(xmlTextReaderPtr reader, permission_x *permission); static int __ps_process_compatibility(xmlTextReaderPtr reader, compatibility_x *compatibility); -static int __ps_process_resolution(xmlTextReaderPtr reader, resolution_x *resolution); static int __ps_process_request(xmlTextReaderPtr reader, request_x *request); static int __ps_process_define(xmlTextReaderPtr reader, define_x *define); static int __ps_process_appsvc(xmlTextReaderPtr reader, appsvc_x *appsvc); static int __ps_process_launchconditions(xmlTextReaderPtr reader, launchconditions_x *launchconditions); static int __ps_process_datashare(xmlTextReaderPtr reader, datashare_x *datashare); -static int __ps_process_icon(xmlTextReaderPtr reader, icon_x *icon); +static int __ps_process_icon(xmlTextReaderPtr reader, icon_x *icon, uid_t uid); static int __ps_process_author(xmlTextReaderPtr reader, author_x *author); static int __ps_process_description(xmlTextReaderPtr reader, description_x *description); -static int __ps_process_capability(xmlTextReaderPtr reader, capability_x *capability); static int __ps_process_license(xmlTextReaderPtr reader, license_x *license); static int __ps_process_appcontrol(xmlTextReaderPtr reader, appcontrol_x *appcontrol); static int __ps_process_datacontrol(xmlTextReaderPtr reader, datacontrol_x *datacontrol); -static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x *uiapplication); -static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceapplication_x *serviceapplication); +static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x *uiapplication, uid_t uid); +static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceapplication_x *serviceapplication, uid_t uid); static int __ps_process_font(xmlTextReaderPtr reader, font_x *font); static int __ps_process_theme(xmlTextReaderPtr reader, theme_x *theme); static int __ps_process_daemon(xmlTextReaderPtr reader, daemon_x *daemon); @@ -130,17 +157,106 @@ static void __ps_free_font(font_x *font); static void __ps_free_theme(theme_x *theme); static void __ps_free_daemon(daemon_x *daemon); static void __ps_free_ime(ime_x *ime); -static char *__pkgid_to_manifest(const char *pkgid); +static char *__pkgid_to_manifest(const char *pkgid, uid_t uid); static int __next_child_element(xmlTextReaderPtr reader, int depth); -static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx); -static int __process_manifest(xmlTextReaderPtr reader, manifest_x * mfx); +static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx, uid_t uid); +static int __process_manifest(xmlTextReaderPtr reader, manifest_x * mfx, uid_t uid); static void __str_trim(char *input); static char *__get_parser_plugin(const char *type); static int __ps_run_parser(xmlDocPtr docPtr, const char *tag, ACTION_TYPE action, const char *pkgid); static int __run_parser_prestep(xmlTextReaderPtr reader, ACTION_TYPE action, const char *pkgid); static void __processNode(xmlTextReaderPtr reader, ACTION_TYPE action, char *const tagv[], const char *pkgid); static void __streamFile(const char *filename, ACTION_TYPE action, char *const tagv[], const char *pkgid); -static int __validate_appid(const char *pkgid, const char *appid, char **newappid); +API int __is_admin(); + +static void __save_xml_attribute(xmlTextReaderPtr reader, char *attribute, const char **xml_attribute, char *default_value) +{ + xmlChar *attrib_val = xmlTextReaderGetAttribute(reader, XMLCHAR(attribute)); + if (attrib_val) { + *xml_attribute = strdup((const char *)attrib_val); + xmlFree(attrib_val); + } else { + if (default_value != NULL) { + *xml_attribute = strdup(default_value); + } + } +} + +static void __save_xml_lang(xmlTextReaderPtr reader, const char **xml_attribute) +{ + const xmlChar *attrib_val = xmlTextReaderConstXmlLang(reader); + if (attrib_val != NULL) + *xml_attribute = strdup(ASCII(attrib_val)); + else + *xml_attribute = strdup(DEFAULT_LOCALE); +} + +static void __save_xml_value(xmlTextReaderPtr reader, const char **xml_attribute) +{ + xmlTextReaderRead(reader); + const xmlChar *attrib_val = xmlTextReaderConstValue(reader); + + if (attrib_val) + *xml_attribute = strdup((const char *)attrib_val); +} + +static void __save_xml_installed_time(manifest_x *mfx) +{ + char buf[PKG_STRING_LEN_MAX] = {'\0'}; + char *val = NULL; + time_t current_time; + time(¤t_time); + snprintf(buf, PKG_STRING_LEN_MAX - 1, "%d", (int)current_time); + val = strndup(buf, PKG_STRING_LEN_MAX - 1); + mfx->installed_time = val; +} + +static void __save_xml_root_path(manifest_x *mfx, uid_t uid) +{ + char root[PKG_STRING_LEN_MAX] = { '\0' }; + const char *path; + + if (mfx->root_path) + return; + + tzplatform_set_user(uid); + path = tzplatform_getenv((uid == OWNER_ROOT || uid == GLOBAL_USER) ? TZ_SYS_RO_APP : TZ_USER_APP); + snprintf(root, PKG_STRING_LEN_MAX - 1, "%s/%s", path, mfx->package); + + mfx->root_path = strdup(root); + + tzplatform_reset_user(); +} + +static void __save_xml_default_value(manifest_x * mfx) +{ + mfx->preload = strdup("False"); + mfx->removable = strdup("True"); + mfx->readonly = strdup("False"); + mfx->update = strdup("False"); + mfx->system = strdup("False"); + mfx->installed_storage= strdup("installed_internal"); + package = mfx->package; +} + +void *__open_lib_handle(char *tag) +{ + char *lib_path = NULL; + void *lib_handle = NULL; + + lib_path = __get_parser_plugin(tag); + retvm_if(!lib_path, NULL, "lib_path get fail"); + + lib_handle = dlopen(lib_path, RTLD_LAZY); + retvm_if(lib_handle == NULL, NULL, "dlopen is failed lib_path[%s]", lib_path); + + return lib_handle; +} + +void __close_lib_handle(void *lib_handle) +{ + dlclose(lib_handle); +} static void __str_trim(char *input) { @@ -161,79 +277,23 @@ static void __str_trim(char *input) return; } -static int __validate_appid(const char *pkgid, const char *appid, char **newappid) +API int __is_admin() { - if (!pkgid || !appid || !newappid) { - DBG("Arg supplied is NULL\n"); - return -1; - } - int pkglen = strlen(pkgid); - int applen = strlen(appid); - char *ptr = NULL; - char *newapp = NULL; - int len = 0; - if (strncmp(appid, ".", 1) == 0) { - len = pkglen + applen + 1; - newapp = calloc(1,len); - if (newapp == NULL) { - DBG("Malloc failed\n"); - return -1; - } - strncpy(newapp, pkgid, pkglen); - strncat(newapp, appid, applen); - DBG("new appid is %s\n", newapp); - *newappid = newapp; - return 0; - } - if (applen < pkglen) { - DBG("app id is not proper\n"); - *newappid = NULL; -#ifdef _VALIDATE_APPID_ - return -1; -#else - return 0; -#endif - } - if (!strcmp(appid, pkgid)) { - DBG("appid is proper\n"); - *newappid = NULL; - return 0; - } - else if (strncmp(appid, pkgid, pkglen) == 0) { - ptr = strstr(appid, pkgid); - ptr = ptr + pkglen; - if (strncmp(ptr, ".", 1) == 0) { - DBG("appid is proper\n"); - *newappid = NULL; - return 0; - } - else { - DBG("appid is not proper\n"); - *newappid = NULL; -#ifdef _VALIDATE_APPID_ - return -1; -#else - return 0; -#endif - } - } else { - DBG("appid is not proper\n"); - *newappid = NULL; -#ifdef _VALIDATE_APPID_ - return -1; -#else + uid_t uid = getuid(); + if ((uid_t) 0 == uid ) + return 1; + else return 0; -#endif - } - return 0; } + + static char * __get_tag_by_key(char *md_key) { char *md_tag = NULL; if (md_key == NULL) { - DBG("md_key is NULL\n"); + _LOGD("md_key is NULL\n"); return NULL; } @@ -243,7 +303,7 @@ static char * __get_tag_by_key(char *md_key) return strdup(md_tag); } -static char *__get_mdparser_plugin(const char *type) +static char *__get_metadata_parser_plugin(const char *type) { FILE *fp = NULL; char buffer[1024] = { 0 }; @@ -251,13 +311,13 @@ static char *__get_mdparser_plugin(const char *type) char *path = NULL; if (type == NULL) { - DBGE("invalid argument\n"); + _LOGE("invalid argument\n"); return NULL; } fp = fopen(PKG_PARSER_CONF_PATH, "r"); if (fp == NULL) { - DBGE("no matching mdparser\n"); + _LOGE("no matching metadata parser\n"); return NULL; } @@ -267,8 +327,8 @@ static char *__get_mdparser_plugin(const char *type) __str_trim(buffer); - if ((path = strstr(buffer, MDPARSER_NAME)) != NULL) { - path = path + strlen(MDPARSER_NAME); + if ((path = strstr(buffer, METADATA_PARSER_NAME)) != NULL) { + path = path + strlen(METADATA_PARSER_NAME); break; } @@ -280,7 +340,53 @@ static char *__get_mdparser_plugin(const char *type) fclose(fp); if (path == NULL) { - DBGE("no matching backendlib\n"); + _LOGE("no matching [%s] [%s]\n", METADATA_PARSER_NAME,type); + return NULL; + } + + snprintf(temp_path, sizeof(temp_path) - 1, "%slib%s.so", path, type); + + return strdup(temp_path); +} + +static char *__get_category_parser_plugin(const char *type) +{ + FILE *fp = NULL; + char buffer[1024] = { 0 }; + char temp_path[1024] = { 0 }; + char *path = NULL; + + if (type == NULL) { + _LOGE("invalid argument\n"); + return NULL; + } + + fp = fopen(PKG_PARSER_CONF_PATH, "r"); + if (fp == NULL) { + _LOGE("no matching metadata parser\n"); + return NULL; + } + + while (fgets(buffer, sizeof(buffer), fp) != NULL) { + if (buffer[0] == '#') + continue; + + __str_trim(buffer); + + if ((path = strstr(buffer, CATEGORY_PARSER_NAME)) != NULL) { + path = path + strlen(CATEGORY_PARSER_NAME); + + break; + } + + memset(buffer, 0x00, 1024); + } + + if (fp != NULL) + fclose(fp); + + if (path == NULL) { + _LOGE("no matching [%s] [%s]\n", CATEGORY_PARSER_NAME,type); return NULL; } @@ -297,13 +403,13 @@ static char *__get_parser_plugin(const char *type) char *path = NULL; if (type == NULL) { - DBGE("invalid argument\n"); + _LOGE("invalid argument\n"); return NULL; } fp = fopen(PKG_PARSER_CONF_PATH, "r"); if (fp == NULL) { - DBGE("no matching backendlib\n"); + _LOGE("no matching backendlib\n"); return NULL; } @@ -314,10 +420,7 @@ static char *__get_parser_plugin(const char *type) __str_trim(buffer); if ((path = strstr(buffer, PKG_PARSERLIB)) != NULL) { - DBG("[%s]\n", path); path = path + strlen(PKG_PARSERLIB); - DBG("[%s]\n", path); - break; } @@ -328,22 +431,55 @@ static char *__get_parser_plugin(const char *type) fclose(fp); if (path == NULL) { - DBGE("no matching backendlib\n"); + _LOGE("no matching backendlib\n"); return NULL; } snprintf(temp_path, sizeof(temp_path) - 1, "%slib%s.so", path, type); - DBG("[%s]\n", temp_path); return strdup(temp_path); } -static int __ps_run_mdparser(GList *md_list, const char *tag, +static int __ps_run_tag_parser(void *lib_handle, xmlDocPtr docPtr, const char *tag, + ACTION_TYPE action, const char *pkgid) +{ + int (*plugin_install) (xmlDocPtr, const char *); + int ret = -1; + char *ac = NULL; + + switch (action) { + case ACTION_INSTALL: + ac = "PKGMGR_PARSER_PLUGIN_INSTALL"; + break; + case ACTION_UPGRADE: + ac = "PKGMGR_PARSER_PLUGIN_UPGRADE"; + break; + case ACTION_UNINSTALL: + ac = "PKGMGR_PARSER_PLUGIN_UNINSTALL"; + break; + default: + goto END; + } + + if ((plugin_install = + dlsym(lib_handle, ac)) == NULL || dlerror() != NULL) { + _LOGE("can not find symbol[%s] \n", ac); + goto END; + } + + ret = plugin_install(docPtr, pkgid); + _LOGD("tag parser[%s, %s] ACTION_TYPE[%d] result[%d]\n", pkgid, tag, action, ret); + +END: + return ret; +} + +static int __ps_run_metadata_parser(GList *md_list, const char *tag, ACTION_TYPE action, const char *pkgid, const char *appid) { char *lib_path = NULL; void *lib_handle = NULL; - int (*mdparser_plugin) (const char *, const char *, GList *); + int (*metadata_parser_plugin) (const char *, const char *, GList *); int ret = -1; char *ac = NULL; @@ -361,28 +497,82 @@ static int __ps_run_mdparser(GList *md_list, const char *tag, goto END; } - lib_path = __get_mdparser_plugin(tag); + lib_path = __get_metadata_parser_plugin(tag); + if (!lib_path) { + _LOGE("get %s parser fail\n", tag); + goto END; + } + + if ((lib_handle = dlopen(lib_path, RTLD_LAZY)) == NULL) { + _LOGE("dlopen is failed lib_path[%s]\n", lib_path); + goto END; + } + + if ((metadata_parser_plugin = + dlsym(lib_handle, ac)) == NULL || dlerror() != NULL) { + _LOGE("can not find symbol[%s] \n",ac); + goto END; + } + + ret = metadata_parser_plugin(pkgid, appid, md_list); + if (ret < 0) + _LOGD("[appid = %s, libpath = %s plugin fail\n", appid, lib_path); + else + _LOGD("[appid = %s, libpath = %s plugin success\n", appid, lib_path); + +END: + if (lib_path) + free(lib_path); + if (lib_handle) + dlclose(lib_handle); + return ret; +} + +static int __ps_run_category_parser(GList *category_list, const char *tag, + ACTION_TYPE action, const char *pkgid, const char *appid) +{ + char *lib_path = NULL; + void *lib_handle = NULL; + int (*category_parser_plugin) (const char *, const char *, GList *); + int ret = -1; + char *ac = NULL; + + switch (action) { + case ACTION_INSTALL: + ac = "PKGMGR_CATEGORY_PARSER_PLUGIN_INSTALL"; + break; + case ACTION_UPGRADE: + ac = "PKGMGR_CATEGORY_PARSER_PLUGIN_UPGRADE"; + break; + case ACTION_UNINSTALL: + ac = "PKGMGR_CATEGORY_PARSER_PLUGIN_UNINSTALL"; + break; + default: + goto END; + } + + lib_path = __get_category_parser_plugin(tag); if (!lib_path) { - DBGE("__get_mdparser_plugin fail\n"); + _LOGE("get %s parser fail\n", tag); goto END; } if ((lib_handle = dlopen(lib_path, RTLD_LAZY)) == NULL) { - DBGE("dlopen is failed lib_path[%s]\n", lib_path); + _LOGE("dlopen is failed lib_path[%s]\n", lib_path); goto END; } - if ((mdparser_plugin = + if ((category_parser_plugin = dlsym(lib_handle, ac)) == NULL || dlerror() != NULL) { - DBGE("can not find symbol \n"); + _LOGE("can not find symbol[%s] \n",ac); goto END; } - ret = mdparser_plugin(pkgid, appid, md_list); + ret = category_parser_plugin(pkgid, appid, category_list); if (ret < 0) - DBGE("[appid = %s, libpath = %s] plugin fail\n", appid, lib_path); + _LOGD("[appid = %s, libpath = %s plugin fail\n", appid, lib_path); else - DBGE("[appid = %s, libpath = %s] plugin success\n", appid, lib_path); + _LOGD("[appid = %s, libpath = %s plugin success\n", appid, lib_path); END: if (lib_path) @@ -421,16 +611,20 @@ static int __ps_run_parser(xmlDocPtr docPtr, const char *tag, } if ((lib_handle = dlopen(lib_path, RTLD_LAZY)) == NULL) { - DBGE("dlopen is failed lib_path[%s]\n", lib_path); + _LOGE("dlopen is failed lib_path[%s]\n", lib_path); goto END; } if ((plugin_install = dlsym(lib_handle, ac)) == NULL || dlerror() != NULL) { - DBGE("can not find symbol \n"); + _LOGE("can not find symbol[%s] \n", ac); goto END; } ret = plugin_install(docPtr, pkgid); + if (ret < 0) + _LOGD("[pkgid = %s, libpath = %s plugin fail\n", pkgid, lib_path); + else + _LOGD("[pkgid = %s, libpath = %s plugin success\n", pkgid, lib_path); END: if (lib_path) @@ -440,33 +634,33 @@ END: return ret; } -static char *__pkgid_to_manifest(const char *pkgid) +static char *__pkgid_to_manifest(const char *pkgid, uid_t uid) { char *manifest; int size; if (pkgid == NULL) { - DBGE("pkgid is NULL"); + _LOGE("pkgid is NULL"); return NULL; } - size = strlen(MANIFEST_RW_DIRECTORY) + strlen(pkgid) + 10; + size = strlen(getUserManifestPath(uid)) + strlen(pkgid) + 10; manifest = malloc(size); if (manifest == NULL) { - DBGE("No memory"); + _LOGE("No memory"); return NULL; } memset(manifest, '\0', size); - snprintf(manifest, size, MANIFEST_RW_DIRECTORY "/%s.xml", pkgid); + snprintf(manifest, size, "%s%s.xml", getUserManifestPath(uid), pkgid); if (access(manifest, F_OK)) { - snprintf(manifest, size, MANIFEST_RO_DIRECTORY "/%s.xml", pkgid); + snprintf(manifest, size, "%s%s.xml", getUserManifestPath(uid), pkgid); } return manifest; } -static void __mdparser_clear_dir_list(GList* dir_list) +static void __metadata_parser_clear_dir_list(GList* dir_list) { GList *list = NULL; __metadata_t* detail = NULL; @@ -488,7 +682,109 @@ static void __mdparser_clear_dir_list(GList* dir_list) } } -static int __run_mdparser_prestep (manifest_x *mfx, char *md_key, ACTION_TYPE action) +static void __category_parser_clear_dir_list(GList* dir_list) +{ + GList *list = NULL; + __category_t* detail = NULL; + + if (dir_list) { + list = g_list_first(dir_list); + while (list) { + detail = (__category_t *)list->data; + if (detail) { + if (detail->name) + free(detail->name); + + free(detail); + } + list = g_list_next(list); + } + g_list_free(dir_list); + } +} + +static int __run_tag_parser_prestep(void *lib_handle, xmlTextReaderPtr reader, ACTION_TYPE action, const char *pkgid) +{ + int ret = -1; + const xmlChar *name; + + if (xmlTextReaderDepth(reader) != 1) { + _LOGE("Node depth is not 1"); + goto END; + } + + if (xmlTextReaderNodeType(reader) != 1) { + _LOGE("Node type is not 1"); + goto END; + } + + const xmlChar *value; + name = xmlTextReaderConstName(reader); + if (name == NULL) { + _LOGE("TEST TEST TES\n"); + name = BAD_CAST "--"; + } + + value = xmlTextReaderConstValue(reader); + if (value != NULL) { + if (xmlStrlen(value) > 40) { + _LOGD(" %.40s...", value); + } else { + _LOGD(" %s", value); + } + } + + name = xmlTextReaderConstName(reader); + if (name == NULL) { + _LOGE("TEST TEST TES\n"); + name = BAD_CAST "--"; + } + + xmlDocPtr docPtr = xmlTextReaderCurrentDoc(reader); + xmlDocPtr copyDocPtr = xmlCopyDoc(docPtr, 1); + if (copyDocPtr == NULL) + return -1; + xmlNode *rootElement = xmlDocGetRootElement(copyDocPtr); + if (rootElement == NULL) + return -1; + xmlNode *cur_node = xmlFirstElementChild(rootElement); + if (cur_node == NULL) + return -1; + xmlNode *temp = xmlTextReaderExpand(reader); + if (temp == NULL) + return -1; + xmlNode *next_node = NULL; + while(cur_node != NULL) { + if ( (strcmp(ASCII(temp->name), ASCII(cur_node->name)) == 0) && + (temp->line == cur_node->line) ) { + break; + } + else { + next_node = xmlNextElementSibling(cur_node); + xmlUnlinkNode(cur_node); + xmlFreeNode(cur_node); + cur_node = next_node; + } + } + if (cur_node == NULL) + return -1; + next_node = xmlNextElementSibling(cur_node); + if (next_node) { + cur_node->next = NULL; + next_node->prev = NULL; + xmlFreeNodeList(next_node); + xmlSetTreeDoc(cur_node, copyDocPtr); + } else { + xmlSetTreeDoc(cur_node, copyDocPtr); + } + + ret = __ps_run_tag_parser(lib_handle, copyDocPtr, ASCII(name), action, pkgid); + END: + + return ret; +} + +static int __run_metadata_parser_prestep (manifest_x *mfx, char *md_key, ACTION_TYPE action) { int ret = -1; int tag_exist = 0; @@ -502,29 +798,28 @@ static int __run_mdparser_prestep (manifest_x *mfx, char *md_key, ACTION_TYPE ac md_tag = __get_tag_by_key(md_key); if (md_tag == NULL) { - DBG("md_tag is NULL\n"); + _LOGD("md_tag is NULL\n"); return -1; } - DBG("md_tag = %s\n", md_tag); while(up != NULL) { md = up->metadata; while (md != NULL) { - //get glist of meatdata key and value combination + //get glist of metadata key and value combination memset(buffer, 0x00, 1024); snprintf(buffer, 1024, "%s/", md_key); if ((md->key && md->value) && (strncmp(md->key, md_key, strlen(md_key)) == 0) && (strncmp(buffer, md->key, strlen(buffer)) == 0)) { md_detail = (__metadata_t*) calloc(1, sizeof(__metadata_t)); if (md_detail == NULL) { - DBG("Memory allocation failed\n"); + _LOGD("Memory allocation failed\n"); goto END; } md_detail->key = (char*) calloc(1, sizeof(char)*(strlen(md->key)+2)); if (md_detail->key == NULL) { - DBG("Memory allocation failed\n"); + _LOGD("Memory allocation failed\n"); free(md_detail); goto END; } @@ -532,7 +827,7 @@ static int __run_mdparser_prestep (manifest_x *mfx, char *md_key, ACTION_TYPE ac md_detail->value = (char*) calloc(1, sizeof(char)*(strlen(md->value)+2)); if (md_detail->value == NULL) { - DBG("Memory allocation failed\n"); + _LOGD("Memory allocation failed\n"); free(md_detail->key); free(md_detail); goto END; @@ -547,13 +842,15 @@ static int __run_mdparser_prestep (manifest_x *mfx, char *md_key, ACTION_TYPE ac //send glist to parser when tags for metadata plugin parser exist. if (tag_exist) { - ret = __ps_run_mdparser(md_list, md_tag, action, mfx->package, up->appid); - if (ret < 0) - DBG("mdparser failed[%d]\n", ret); - else - DBG("mdparser success, done[%d]\n", ret); + ret = __ps_run_metadata_parser(md_list, md_tag, action, mfx->package, up->appid); + if (ret < 0){ + _LOGD("metadata_parser failed[%d] for tag[%s]\n", ret, md_tag); + } + else{ + _LOGD("metadata_parser success for tag[%s]\n", md_tag); + } } - __mdparser_clear_dir_list(md_list); + __metadata_parser_clear_dir_list(md_list); md_list = NULL; tag_exist = 0; up = up->next; @@ -561,7 +858,7 @@ static int __run_mdparser_prestep (manifest_x *mfx, char *md_key, ACTION_TYPE ac return 0; END: - __mdparser_clear_dir_list(md_list); + __metadata_parser_clear_dir_list(md_list); if (md_tag) free(md_tag); @@ -569,55 +866,124 @@ END: return ret; } +static int __run_category_parser_prestep (manifest_x *mfx, char *category_key, ACTION_TYPE action) +{ + int ret = -1; + int tag_exist = 0; + char buffer[1024] = { 0, }; + uiapplication_x *up = mfx->uiapplication; + category_x *category = NULL; + char *category_tag = NULL; + + GList *category_list = NULL; + __category_t *category_detail = NULL; + + category_tag = __get_tag_by_key(category_key); + if (category_tag == NULL) { + _LOGD("md_tag is NULL\n"); + return -1; + } + + while(up != NULL) + { + category = up->category; + while (category != NULL) + { + //get glist of category key and value combination + memset(buffer, 0x00, 1024); + snprintf(buffer, 1024, "%s/", category_key); + if ((category->name) && (strncmp(category->name, category_key, strlen(category_key)) == 0)) { + category_detail = (__category_t*) calloc(1, sizeof(__category_t)); + if (category_detail == NULL) { + _LOGD("Memory allocation failed\n"); + goto END; + } + + category_detail->name = (char*) calloc(1, sizeof(char)*(strlen(category->name)+2)); + if (category_detail->name == NULL) { + _LOGD("Memory allocation failed\n"); + free(category_detail); + goto END; + } + snprintf(category_detail->name, (strlen(category->name)+1), "%s", category->name); + + category_list = g_list_append(category_list, (gpointer)category_detail); + tag_exist = 1; + } + category = category->next; + } + + //send glist to parser when tags for metadata plugin parser exist. + if (tag_exist) { + ret = __ps_run_category_parser(category_list, category_tag, action, mfx->package, up->appid); + if (ret < 0) + _LOGD("category_parser failed[%d] for tag[%s]\n", ret, category_tag); + else + _LOGD("category_parser success for tag[%s]\n", category_tag); + } + __category_parser_clear_dir_list(category_list); + category_list = NULL; + tag_exist = 0; + up = up->next; + } + + return 0; +END: + __category_parser_clear_dir_list(category_list); + + if (category_tag) + free(category_tag); + + return ret; +} + static int __run_parser_prestep(xmlTextReaderPtr reader, ACTION_TYPE action, const char *pkgid) { int ret = -1; const xmlChar *name; - DBG("__run_parser_prestep"); +// _LOGD("__run_parser_prestep"); if (xmlTextReaderDepth(reader) != 1) { - DBGE("Node depth is not 1"); + _LOGE("Node depth is not 1"); goto END; } if (xmlTextReaderNodeType(reader) != 1) { - DBGE("Node type is not 1"); + _LOGE("Node type is not 1"); goto END; } const xmlChar *value; name = xmlTextReaderConstName(reader); if (name == NULL) { - DBGE("TEST TEST TES\n"); + _LOGE("TEST TEST TES\n"); name = BAD_CAST "--"; } value = xmlTextReaderConstValue(reader); - DBG("%d %d %s %d %d", + _LOGD("%d %d %s %d %d", xmlTextReaderDepth(reader), xmlTextReaderNodeType(reader), name, xmlTextReaderIsEmptyElement(reader), xmlTextReaderHasValue(reader)); - if (value == NULL) { - DBG("ConstValue NULL"); - } else { + if (value != NULL) { if (xmlStrlen(value) > 40) { - DBG(" %.40s...", value); + _LOGD(" %.40s...", value); } else { - DBG(" %s", value); + _LOGD(" %s", value); } } name = xmlTextReaderConstName(reader); if (name == NULL) { - DBGE("TEST TEST TES\n"); + _LOGE("TEST TEST TES\n"); name = BAD_CAST "--"; } xmlDocPtr docPtr = xmlTextReaderCurrentDoc(reader); - DBG("docPtr->URL %s\n", (char *)docPtr->URL); + _LOGD("docPtr->URL %s\n", (char *)docPtr->URL); xmlDocPtr copyDocPtr = xmlCopyDoc(docPtr, 1); if (copyDocPtr == NULL) return -1; @@ -658,7 +1024,7 @@ static int __run_parser_prestep(xmlTextReaderPtr reader, ACTION_TYPE action, con #ifdef __DEBUG__ //#else - DBG("node type: %d, name: %s children->name: %s last->name: %s\n" + _LOGD("node type: %d, name: %s children->name: %s last->name: %s\n" "parent->name: %s next->name: %s prev->name: %s\n", cur_node->type, cur_node->name, cur_node->children ? cur_node->children->name : "NULL", @@ -667,90 +1033,276 @@ static int __run_parser_prestep(xmlTextReaderPtr reader, ACTION_TYPE action, con cur_node->next ? cur_node->next->name : "NULL", cur_node->prev ? cur_node->prev->name : "NULL"); - FILE *fp = fopen("/opt/share/test.xml", "a"); - xmlDocDump(fp, copyDocPtr); - fprintf(fp, "\n"); - fclose(fp); -#endif + FILE *fp = fopen(tzplatform_mkpath(TZ_SYS_SHARE, "test.xml"), "a"); + xmlDocDump(fp, copyDocPtr); + fclose(fp); +#endif + + ret = __ps_run_parser(copyDocPtr, ASCII(name), action, pkgid); + END: + + return ret; +} + +static void +__processNode(xmlTextReaderPtr reader, ACTION_TYPE action, char *const tagv[], const char *pkgid) +{ + char *tag = NULL; + int i = 0; + + switch (xmlTextReaderNodeType(reader)) { + case XML_READER_TYPE_END_ELEMENT: + { + // _LOGD("XML_READER_TYPE_END_ELEMENT"); + break; + } + + case XML_READER_TYPE_ELEMENT: + { + // Elements without closing tag don't receive + // XML_READER_TYPE_END_ELEMENT event. + + const xmlChar *elementName = + xmlTextReaderLocalName(reader); + if (elementName == NULL) { +// _LOGD("elementName %s\n", (char *)elementName); + break; + } + + const xmlChar *nameSpace = + xmlTextReaderConstNamespaceUri(reader); + if (nameSpace) { +// _LOGD("nameSpace %s\n", (char *)nameSpace); + } +/* + _LOGD("XML_READER_TYPE_ELEMENT %s, %s\n", + elementName ? elementName : "NULL", + nameSpace ? nameSpace : "NULL"); +*/ + if (tagv == NULL) { + _LOGD("__run_parser_prestep pkgid[%s]\n", pkgid); + __run_parser_prestep(reader, action, pkgid); + } + else { + i = 0; + for (tag = tagv[0]; tag; tag = tagv[++i]) + if (strcmp(tag, ASCII(elementName)) == 0) { + _LOGD("__run_parser_prestep tag[%s] pkgid[%s]\n", tag, pkgid); + __run_parser_prestep(reader, + action, pkgid); + break; + } + } + + break; + } + case XML_READER_TYPE_TEXT: + case XML_READER_TYPE_CDATA: + { + const xmlChar *value = xmlTextReaderConstValue(reader); + if (value) { +// _LOGD("value %s\n", value); + } + + const xmlChar *lang = xmlTextReaderConstXmlLang(reader); + if (lang) { +// _LOGD("lang\n", lang); + } + +/* _LOGD("XML_READER_TYPE_TEXT %s, %s\n", + value ? value : "NULL", lang ? lang : "NULL"); +*/ + break; + } + default: +// _LOGD("Ignoring Node of Type: %d", xmlTextReaderNodeType(reader)); + break; + } +} + +static void +__processTag(void *lib_handle, xmlTextReaderPtr reader, ACTION_TYPE action, char *tag, const char *pkgid) +{ + switch (xmlTextReaderNodeType(reader)) { + case XML_READER_TYPE_END_ELEMENT: + { + break; + } + case XML_READER_TYPE_ELEMENT: + { + // Elements without closing tag don't receive + const xmlChar *elementName = + xmlTextReaderLocalName(reader); + if (elementName == NULL) { + break; + } + + if (strcmp(tag, ASCII(elementName)) == 0) { + _LOGD("find : tag[%s] ACTION_TYPE[%d] pkg[%s]\n", tag, action, pkgid); + __run_tag_parser_prestep(lib_handle, reader, action, pkgid); + break; + } + break; + } + + default: + break; + } +} + +static int __parser_send_tag(void *lib_handle, ACTION_TYPE action, PLUGIN_PROCESS_TYPE process, const char *pkgid) +{ + int (*plugin_install) (const char *); + int ret = -1; + char *ac = NULL; + + if (process == PLUGIN_PRE_PROCESS) { + switch (action) { + case ACTION_INSTALL: + ac = "PKGMGR_PARSER_PLUGIN_PRE_INSTALL"; + break; + case ACTION_UPGRADE: + ac = "PKGMGR_PARSER_PLUGIN_PRE_UPGRADE"; + break; + case ACTION_UNINSTALL: + ac = "PKGMGR_PARSER_PLUGIN_PRE_UNINSTALL"; + break; + default: + return -1; + } + } else if (process == PLUGIN_POST_PROCESS) { + switch (action) { + case ACTION_INSTALL: + ac = "PKGMGR_PARSER_PLUGIN_POST_INSTALL"; + break; + case ACTION_UPGRADE: + ac = "PKGMGR_PARSER_PLUGIN_POST_UPGRADE"; + break; + case ACTION_UNINSTALL: + ac = "PKGMGR_PARSER_PLUGIN_POST_UNINSTALL"; + break; + default: + return -1; + } + } else + return -1; + + if ((plugin_install = + dlsym(lib_handle, ac)) == NULL || dlerror() != NULL) { + return -1; + } + + ret = plugin_install(pkgid); + return ret; +} + +static void __plugin_send_tag(const char *tag, ACTION_TYPE action, PLUGIN_PROCESS_TYPE process, const char *pkgid) +{ + char *lib_path = NULL; + void *lib_handle = NULL; + int (*plugin_install) (const char *); + int ret = -1; + char *ac = NULL; + + if (process == PLUGIN_PRE_PROCESS) { + switch (action) { + case ACTION_INSTALL: + ac = "PKGMGR_PARSER_PLUGIN_PRE_INSTALL"; + break; + case ACTION_UPGRADE: + ac = "PKGMGR_PARSER_PLUGIN_PRE_UPGRADE"; + break; + case ACTION_UNINSTALL: + ac = "PKGMGR_PARSER_PLUGIN_PRE_UNINSTALL"; + break; + default: + goto END; + } + } else if (process == PLUGIN_POST_PROCESS) { + switch (action) { + case ACTION_INSTALL: + ac = "PKGMGR_PARSER_PLUGIN_POST_INSTALL"; + break; + case ACTION_UPGRADE: + ac = "PKGMGR_PARSER_PLUGIN_POST_UPGRADE"; + break; + case ACTION_UNINSTALL: + ac = "PKGMGR_PARSER_PLUGIN_POST_UNINSTALL"; + break; + default: + goto END; + } + } else + goto END; + + lib_path = __get_parser_plugin(tag); + if (!lib_path) { + goto END; + } + + if ((lib_handle = dlopen(lib_path, RTLD_LAZY)) == NULL) { + _LOGE("dlopen is failed lib_path[%s] for tag[%s]\n", lib_path, tag); + goto END; + } + if ((plugin_install = + dlsym(lib_handle, ac)) == NULL || dlerror() != NULL) { +// _LOGE("can not find symbol[%s] for tag[%s] \n", ac, tag); + goto END; + } + + ret = plugin_install(pkgid); + if (ret < 0) + _LOGD("[PLUGIN_PROCESS_TYPE[%d] pkgid=%s, tag=%s plugin fail\n", process, pkgid, tag); + else + _LOGD("[PLUGIN_PROCESS_TYPE[%d] pkgid=%s, tag=%s plugin success\n", process, pkgid, tag); + +END: + if (lib_path) + free(lib_path); + if (lib_handle) + dlclose(lib_handle); +} - ret = __ps_run_parser(copyDocPtr, ASCII(name), action, pkgid); - END: +static void +__plugin_process_tag(char *const tag_list[], ACTION_TYPE action, PLUGIN_PROCESS_TYPE process, const char *pkgid) +{ + char *tag = NULL; + int i = 0; + + for (tag = tag_list[0]; tag; tag = tag_list[++i]) + __plugin_send_tag(tag, action, process, pkgid); - return ret; } static void -__processNode(xmlTextReaderPtr reader, ACTION_TYPE action, char *const tagv[], const char *pkgid) +__plugin_save_tag(xmlTextReaderPtr reader, char *const tagv[], char *tag_list[]) { char *tag = NULL; int i = 0; + static int pre_cnt=0; switch (xmlTextReaderNodeType(reader)) { - case XML_READER_TYPE_END_ELEMENT: - { - // DBG("XML_READER_TYPE_END_ELEMENT"); - break; - } - case XML_READER_TYPE_ELEMENT: { - // Elements without closing tag don't receive - // XML_READER_TYPE_END_ELEMENT event. - - const xmlChar *elementName = - xmlTextReaderLocalName(reader); + const xmlChar *elementName = xmlTextReaderLocalName(reader); if (elementName == NULL) { -// DBG("elementName %s\n", (char *)elementName); break; } - - const xmlChar *nameSpace = - xmlTextReaderConstNamespaceUri(reader); - if (nameSpace) { -// DBG("nameSpace %s\n", (char *)nameSpace); - } -/* - DBG("XML_READER_TYPE_ELEMENT %s, %s\n", - elementName ? elementName : "NULL", - nameSpace ? nameSpace : "NULL"); -*/ - if (tagv == NULL) { - DBG("__run_parser_prestep pkgid[%s]\n", pkgid); - __run_parser_prestep(reader, action, pkgid); - } - else { - i = 0; - for (tag = tagv[0]; tag; tag = tagv[++i]) - if (strcmp(tag, ASCII(elementName)) == 0) { - DBG("__run_parser_prestep tag[%s] pkgid[%s]\n", tag, pkgid); - __run_parser_prestep(reader, - action, pkgid); - break; - } - } - - break; - } - case XML_READER_TYPE_TEXT: - case XML_READER_TYPE_CDATA: - { - const xmlChar *value = xmlTextReaderConstValue(reader); - if (value) { -// DBG("value %s\n", value); - } - - const xmlChar *lang = xmlTextReaderConstXmlLang(reader); - if (lang) { -// DBG("lang\n", lang); - } - -/* DBG("XML_READER_TYPE_TEXT %s, %s\n", - value ? value : "NULL", lang ? lang : "NULL"); -*/ + i = 0; + for (tag = tag_list[0]; tag; tag = tag_list[++i]) + if (strcmp(ASCII(elementName), tag) == 0) { + return; + } + i = 0; + for (tag = tagv[0]; tag; tag = tagv[++i]) + if (strcmp(tag, ASCII(elementName)) == 0) { + tag_list[pre_cnt++] = tag; + break; + } break; } default: -// DBG("Ignoring Node of Type: %d", xmlTextReaderNodeType(reader)); +// _LOGD("Ignoring Node of Type: %d", xmlTextReaderNodeType(reader)); break; } } @@ -761,6 +1313,7 @@ __streamFile(const char *filename, ACTION_TYPE action, char *const tagv[], const xmlTextReaderPtr reader; xmlDocPtr docPtr; int ret; + __plugin_process_tag(tagv, action, PLUGIN_PRE_PROCESS, pkgid); docPtr = xmlReadFile(filename, NULL, 0); reader = xmlReaderWalker(docPtr); @@ -773,11 +1326,13 @@ __streamFile(const char *filename, ACTION_TYPE action, char *const tagv[], const xmlFreeTextReader(reader); if (ret != 0) { - DBGE("%s : failed to parse", filename); + _LOGD("%s : failed to parse", filename); } } else { - DBGE("Unable to open %s", filename); + _LOGD("Unable to open %s", filename); } + + __plugin_process_tag(tagv, action, PLUGIN_POST_PROCESS, pkgid); } static int __next_child_element(xmlTextReaderPtr reader, int depth) @@ -811,6 +1366,43 @@ static int __next_child_element(xmlTextReaderPtr reader, int depth) return ret; } +static bool __check_action_fota(char *const tagv[]) +{ + int i = 0; + char delims[] = "="; + char *ret_result = NULL; + char *tag = NULL; + int ret = false; + + if (tagv == NULL) + return ret; + + for (tag = strdup(tagv[0]); tag != NULL; ) { + ret_result = strtok(tag, delims); + + /*check tag : fota is true */ + if (strcmp(ret_result, "fota") == 0) { + ret_result = strtok(NULL, delims); + if (strcmp(ret_result, "true") == 0) { + ret = true; + } + } else + _LOGD("tag process [%s]is not defined\n", ret_result); + + free(tag); + + /*check next value*/ + if (tagv[++i] != NULL) + tag = strdup(tagv[i]); + else { + _LOGD("tag process success...%d\n" , ret); + return ret; + } + } + + return ret; +} + static void __ps_free_category(category_x *category) { if (category == NULL) @@ -1111,15 +1703,13 @@ static void __ps_free_datacontrol(datacontrol_x *datacontrol) free((void *)datacontrol->providerid); datacontrol->providerid = NULL; } - /*Free Capability*/ - if (datacontrol->capability) { - capability_x *capability = datacontrol->capability; - capability_x *tmp = NULL; - while(capability != NULL) { - tmp = capability->next; - __ps_free_capability(capability); - capability = tmp; - } + if (datacontrol->access) { + free((void *)datacontrol->access); + datacontrol->access = NULL; + } + if (datacontrol->type) { + free((void *)datacontrol->type); + datacontrol->type = NULL; } free((void*)datacontrol); datacontrol = NULL; @@ -1151,50 +1741,15 @@ static void __ps_free_appcontrol(appcontrol_x *appcontrol) { if (appcontrol == NULL) return; - if (appcontrol->text) { - free((void *)appcontrol->text); - appcontrol->text = NULL; - } /*Free Operation*/ - if (appcontrol->operation) { - operation_x *operation = appcontrol->operation; - operation_x *tmp = NULL; - while(operation != NULL) { - tmp = operation->next; - __ps_free_operation(operation); - operation = tmp; - } - } + if (appcontrol->operation) + free(appcontrol->operation); /*Free Uri*/ - if (appcontrol->uri) { - uri_x *uri = appcontrol->uri; - uri_x *tmp = NULL; - while(uri != NULL) { - tmp = uri->next; - __ps_free_uri(uri); - uri = tmp; - } - } + if (appcontrol->uri) + free(appcontrol->uri); /*Free Mime*/ - if (appcontrol->mime) { - mime_x *mime = appcontrol->mime; - mime_x *tmp = NULL; - while(mime != NULL) { - tmp = mime->next; - __ps_free_mime(mime); - mime = tmp; - } - } - /*Free subapp*/ - if (appcontrol->subapp) { - subapp_x *subapp = appcontrol->subapp; - subapp_x *tmp = NULL; - while(subapp != NULL) { - tmp = subapp->next; - __ps_free_subapp(subapp); - subapp = tmp; - } - } + if (appcontrol->mime) + free(appcontrol->mime); free((void*)appcontrol); appcontrol = NULL; } @@ -1440,6 +1995,10 @@ static void __ps_free_uiapplication(uiapplication_x *uiapplication) free((void *)uiapplication->hwacceleration); uiapplication->hwacceleration = NULL; } + if (uiapplication->screenreader) { + free((void *)uiapplication->screenreader); + uiapplication->screenreader = NULL; + } if (uiapplication->mainapp) { free((void *)uiapplication->mainapp); uiapplication->mainapp = NULL; @@ -1566,6 +2125,16 @@ static void __ps_free_uiapplication(uiapplication_x *uiapplication) permission = tmp; } } + /*Free DataControl*/ + if (uiapplication->datacontrol) { + datacontrol_x *datacontrol = uiapplication->datacontrol; + datacontrol_x *tmp = NULL; + while(datacontrol != NULL) { + tmp = datacontrol->next; + __ps_free_datacontrol(datacontrol); + datacontrol = tmp; + } + } /* _PRODUCT_LAUNCHING_ENHANCED_ START */ if (uiapplication->indicatordisplay) { free((void *)uiapplication->indicatordisplay); @@ -1827,23 +2396,75 @@ static void __ps_free_ime(ime_x *ime) ime = NULL; } -int __ps_process_mdparser(manifest_x *mfx, ACTION_TYPE action) +int __ps_process_tag_parser(manifest_x *mfx, const char *filename, ACTION_TYPE action) +{ + xmlTextReaderPtr reader; + xmlDocPtr docPtr; + int ret = -1; + FILE *fp = NULL; + void *lib_handle = NULL; + char tag[PKG_STRING_LEN_MAX] = { 0 }; + + fp = fopen(TAG_PARSER_LIST, "r"); + retvm_if(fp == NULL, PMINFO_R_ERROR, "no preload list"); + + while (fgets(tag, sizeof(tag), fp) != NULL) { + __str_trim(tag); + + lib_handle = __open_lib_handle(tag); + if (lib_handle == NULL) + continue; + + ret = __parser_send_tag(lib_handle, action, PLUGIN_PRE_PROCESS, mfx->package); + _LOGD("PLUGIN_PRE_PROCESS[%s, %s] ACTION_TYPE[%d] result[%d]\n", mfx->package, tag, action, ret); + + docPtr = xmlReadFile(filename, NULL, 0); + reader = xmlReaderWalker(docPtr); + if (reader != NULL) { + ret = xmlTextReaderRead(reader); + while (ret == 1) { + __processTag(lib_handle, reader, action, tag, mfx->package); + ret = xmlTextReaderRead(reader); + } + xmlFreeTextReader(reader); + + if (ret != 0) { + _LOGD("%s : failed to parse", filename); + } + } else { + _LOGD("Unable to open %s", filename); + } + + ret = __parser_send_tag(lib_handle, action, PLUGIN_POST_PROCESS, mfx->package); + _LOGD("PLUGIN_POST_PROCESS[%s, %s] ACTION_TYPE[%d] result[%d]\n", mfx->package, tag, action, ret); + + __close_lib_handle(lib_handle); + + memset(tag, 0x00, sizeof(tag)); + } + + if (fp != NULL) + fclose(fp); + + return 0; +} + +int __ps_process_metadata_parser(manifest_x *mfx, ACTION_TYPE action) { + fprintf(stdout,"__ps_process_metadata_parser\n"); int ret = -1; FILE *fp = NULL; char md_key[PKG_STRING_LEN_MAX] = { 0 }; - fp = fopen(MDPARSER_LIST, "r"); + fp = fopen(METADATA_PARSER_LIST, "r"); if (fp == NULL) { - DBG("no preload list\n"); + _LOGD("no preload list\n"); return -1; } - + while (fgets(md_key, sizeof(md_key), fp) != NULL) { __str_trim(md_key); - DBG("md_key = %s\n", md_key); - - ret = __run_mdparser_prestep(mfx, md_key, action); + ret = __run_metadata_parser_prestep(mfx, md_key, action); memset(md_key, 0x00, sizeof(md_key)); } @@ -1854,142 +2475,110 @@ int __ps_process_mdparser(manifest_x *mfx, ACTION_TYPE action) return 0; } +int __ps_process_category_parser(manifest_x *mfx, ACTION_TYPE action) +{ + int ret = -1; + FILE *fp = NULL; + char category_key[PKG_STRING_LEN_MAX] = { 0 }; + + fp = fopen(CATEGORY_PARSER_LIST, "r"); + if (fp == NULL) { + _LOGD("no category parser list\n"); + return -1; + } + + while (fgets(category_key, sizeof(category_key), fp) != NULL) { + __str_trim(category_key); + ret = __run_category_parser_prestep(mfx, category_key, action); + + memset(category_key, 0x00, sizeof(category_key)); + } + + if (fp != NULL) + fclose(fp); + + return 0; +} + static int __ps_process_allowed(xmlTextReaderPtr reader, allowed_x *allowed) { - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) - allowed->text = ASCII(xmlTextReaderValue(reader)); + __save_xml_value(reader, &allowed->text); return 0; } static int __ps_process_operation(xmlTextReaderPtr reader, operation_x *operation) { - if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) - operation->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); -/* Text does not exist. Only attribute exists - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) - operation->text = ASCII(xmlTextReaderValue(reader)); -*/ + __save_xml_attribute(reader, "name", &operation->name, NULL); return 0; } static int __ps_process_uri(xmlTextReaderPtr reader, uri_x *uri) { - if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) - uri->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); -/* Text does not exist. Only attribute exists - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) - uri->text = ASCII(xmlTextReaderValue(reader)); -*/ + __save_xml_attribute(reader, "name", &uri->name, NULL); return 0; } static int __ps_process_mime(xmlTextReaderPtr reader, mime_x *mime) { - if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) - mime->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); -/* Text does not exist. Only attribute exists - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) - mime->text = ASCII(xmlTextReaderValue(reader)); -*/ + __save_xml_attribute(reader, "name", &mime->name, NULL); return 0; } static int __ps_process_subapp(xmlTextReaderPtr reader, subapp_x *subapp) { - if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) - subapp->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); -/* Text does not exist. Only attribute exists - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) - mime->text = ASCII(xmlTextReaderValue(reader)); -*/ + __save_xml_attribute(reader, "name", &subapp->name, NULL); return 0; } static int __ps_process_condition(xmlTextReaderPtr reader, condition_x *condition) { - if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) - condition->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) - condition->text = ASCII(xmlTextReaderValue(reader)); + __save_xml_attribute(reader, "name", &condition->name, NULL); return 0; } static int __ps_process_notification(xmlTextReaderPtr reader, notification_x *notification) { - if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) - notification->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) - notification->text = ASCII(xmlTextReaderValue(reader)); + __save_xml_attribute(reader, "name", ¬ification->name, NULL); + __save_xml_value(reader, ¬ification->text); return 0; } static int __ps_process_category(xmlTextReaderPtr reader, category_x *category) { - if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) - category->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); + __save_xml_attribute(reader, "name", &category->name, NULL); return 0; } static int __ps_process_privilege(xmlTextReaderPtr reader, privilege_x *privilege) { - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) { - privilege->text = ASCII(xmlTextReaderValue(reader)); - } + __save_xml_value(reader, &privilege->text); return 0; } static int __ps_process_metadata(xmlTextReaderPtr reader, metadata_x *metadata) { - if (xmlTextReaderGetAttribute(reader, XMLCHAR("key"))) - metadata->key = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("key"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("value"))) - metadata->value = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("value"))); + __save_xml_attribute(reader, "key", &metadata->key, NULL); + __save_xml_attribute(reader, "value", &metadata->value, NULL); return 0; } static int __ps_process_permission(xmlTextReaderPtr reader, permission_x *permission) { - if (xmlTextReaderGetAttribute(reader, XMLCHAR("type"))) - permission->type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("type"))); - - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) - permission->value = ASCII(xmlTextReaderValue(reader)); + __save_xml_attribute(reader, "type", &permission->type, NULL); + __save_xml_value(reader, &permission->value); return 0; } static int __ps_process_compatibility(xmlTextReaderPtr reader, compatibility_x *compatibility) { - if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) - compatibility->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) - compatibility->text = ASCII(xmlTextReaderValue(reader)); - return 0; -} - -static int __ps_process_resolution(xmlTextReaderPtr reader, resolution_x *resolution) -{ - if (xmlTextReaderGetAttribute(reader, XMLCHAR("mime-type"))) - resolution->mimetype = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("mime-type"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("uri-scheme"))) - resolution->urischeme = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("uri-scheme"))); + __save_xml_attribute(reader, "name", &compatibility->name, NULL); + __save_xml_value(reader, &compatibility->text); return 0; } static int __ps_process_request(xmlTextReaderPtr reader, request_x *request) { - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) - request->text = ASCII(xmlTextReaderValue(reader)); + __save_xml_value(reader, &request->text); return 0; } @@ -2001,21 +2590,20 @@ static int __ps_process_define(xmlTextReaderPtr reader, define_x *define) allowed_x *tmp1 = NULL; request_x *tmp2 = NULL; - if (xmlTextReaderGetAttribute(reader, XMLCHAR("path"))) - define->path = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("path"))); + __save_xml_attribute(reader, "path", &define->path, NULL); depth = xmlTextReaderDepth(reader); while ((ret = __next_child_element(reader, depth))) { node = xmlTextReaderConstName(reader); if (!node) { - DBG("xmlTextReaderConstName value is NULL\n"); + _LOGD("xmlTextReaderConstName value is NULL\n"); return -1; } if (!strcmp(ASCII(node), "allowed")) { allowed_x *allowed= malloc(sizeof(allowed_x)); if (allowed == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(allowed, '\0', sizeof(allowed_x)); @@ -2024,7 +2612,7 @@ static int __ps_process_define(xmlTextReaderPtr reader, define_x *define) } else if (!strcmp(ASCII(node), "request")) { request_x *request = malloc(sizeof(request_x)); if (request == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(request, '\0', sizeof(request_x)); @@ -2033,7 +2621,7 @@ static int __ps_process_define(xmlTextReaderPtr reader, define_x *define) } else return -1; if (ret < 0) { - DBG("Processing define failed\n"); + _LOGD("Processing define failed\n"); return ret; } } @@ -2053,86 +2641,31 @@ static int __ps_process_appcontrol(xmlTextReaderPtr reader, appcontrol_x *appcon const xmlChar *node; int ret = -1; int depth = -1; - operation_x *tmp1 = NULL; - uri_x *tmp2 = NULL; - mime_x *tmp3 = NULL; - subapp_x *tmp4 = NULL; depth = xmlTextReaderDepth(reader); while ((ret = __next_child_element(reader, depth))) { - node = xmlTextReaderConstName(reader); - if (!node) { - DBG("xmlTextReaderConstName value is NULL\n"); - return -1; - } - - if (!strcmp(ASCII(node), "operation")) { - operation_x *operation = malloc(sizeof(operation_x)); - if (operation == NULL) { - DBG("Malloc Failed\n"); - return -1; - } - memset(operation, '\0', sizeof(operation_x)); - LISTADD(appcontrol->operation, operation); - ret = __ps_process_operation(reader, operation); - DBG("operation processing\n"); - } else if (!strcmp(ASCII(node), "uri")) { - uri_x *uri= malloc(sizeof(uri_x)); - if (uri == NULL) { - DBG("Malloc Failed\n"); - return -1; - } - memset(uri, '\0', sizeof(uri_x)); - LISTADD(appcontrol->uri, uri); - ret = __ps_process_uri(reader, uri); - DBG("uri processing\n"); - } else if (!strcmp(ASCII(node), "mime")) { - mime_x *mime = malloc(sizeof(mime_x)); - if (mime == NULL) { - DBG("Malloc Failed\n"); - return -1; - } - memset(mime, '\0', sizeof(mime_x)); - LISTADD(appcontrol->mime, mime); - ret = __ps_process_mime(reader, mime); - DBG("mime processing\n"); - } else if (!strcmp(ASCII(node), "subapp")) { - subapp_x *subapp = malloc(sizeof(subapp_x)); - if (subapp == NULL) { - DBG("Malloc Failed\n"); - return -1; - } - memset(subapp, '\0', sizeof(subapp_x)); - LISTADD(appcontrol->subapp, subapp); - ret = __ps_process_subapp(reader, subapp); - DBG("subapp processing\n"); + node = xmlTextReaderConstName(reader); + if (!node) { + _LOGD("xmlTextReaderConstName value is NULL\n"); + return -1; + } + + if (!strcmp(ASCII(node), "operation")) { + __save_xml_attribute(reader, "name", &appcontrol->operation, NULL); + _LOGD("operation processing\n"); + } else if (!strcmp(ASCII(node), "uri")) { + __save_xml_attribute(reader, "name", &appcontrol->uri, NULL); + _LOGD("uri processing\n"); + } else if (!strcmp(ASCII(node), "mime")) { + __save_xml_attribute(reader, "name", &appcontrol->mime, NULL); + _LOGD("mime processing\n"); } else return -1; if (ret < 0) { - DBG("Processing appcontrol failed\n"); + _LOGD("Processing appcontrol failed\n"); return ret; } } - if (appcontrol->operation) { - LISTHEAD(appcontrol->operation, tmp1); - appcontrol->operation = tmp1; - } - if (appcontrol->uri) { - LISTHEAD(appcontrol->uri, tmp2); - appcontrol->uri = tmp2; - } - if (appcontrol->mime) { - LISTHEAD(appcontrol->mime, tmp3); - appcontrol->mime = tmp3; - } - if (appcontrol->subapp) { - LISTHEAD(appcontrol->subapp, tmp4); - appcontrol->subapp = tmp4; - } - - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) - appcontrol->text = ASCII(xmlTextReaderValue(reader)); return ret; } @@ -2151,54 +2684,54 @@ static int __ps_process_appsvc(xmlTextReaderPtr reader, appsvc_x *appsvc) while ((ret = __next_child_element(reader, depth))) { node = xmlTextReaderConstName(reader); if (!node) { - DBG("xmlTextReaderConstName value is NULL\n"); + _LOGD("xmlTextReaderConstName value is NULL\n"); return -1; } if (!strcmp(ASCII(node), "operation")) { operation_x *operation = malloc(sizeof(operation_x)); if (operation == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(operation, '\0', sizeof(operation_x)); LISTADD(appsvc->operation, operation); ret = __ps_process_operation(reader, operation); - DBG("operation processing\n"); + _LOGD("operation processing\n"); } else if (!strcmp(ASCII(node), "uri")) { uri_x *uri= malloc(sizeof(uri_x)); if (uri == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(uri, '\0', sizeof(uri_x)); LISTADD(appsvc->uri, uri); ret = __ps_process_uri(reader, uri); - DBG("uri processing\n"); + _LOGD("uri processing\n"); } else if (!strcmp(ASCII(node), "mime")) { mime_x *mime = malloc(sizeof(mime_x)); if (mime == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(mime, '\0', sizeof(mime_x)); LISTADD(appsvc->mime, mime); ret = __ps_process_mime(reader, mime); - DBG("mime processing\n"); + _LOGD("mime processing\n"); } else if (!strcmp(ASCII(node), "subapp")) { subapp_x *subapp = malloc(sizeof(subapp_x)); if (subapp == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(subapp, '\0', sizeof(subapp_x)); LISTADD(appsvc->subapp, subapp); ret = __ps_process_subapp(reader, subapp); - DBG("subapp processing\n"); + _LOGD("subapp processing\n"); } else return -1; if (ret < 0) { - DBG("Processing appsvc failed\n"); + _LOGD("Processing appsvc failed\n"); return ret; } } @@ -2238,14 +2771,14 @@ static int __ps_process_privileges(xmlTextReaderPtr reader, privileges_x *privil while ((ret = __next_child_element(reader, depth))) { node = xmlTextReaderConstName(reader); if (!node) { - DBG("xmlTextReaderConstName value is NULL\n"); + _LOGD("xmlTextReaderConstName value is NULL\n"); return -1; } if (strcmp(ASCII(node), "privilege") == 0) { privilege_x *privilege = malloc(sizeof(privilege_x)); if (privilege == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(privilege, '\0', sizeof(privilege_x)); @@ -2254,7 +2787,7 @@ static int __ps_process_privileges(xmlTextReaderPtr reader, privileges_x *privil } else return -1; if (ret < 0) { - DBG("Processing privileges failed\n"); + _LOGD("Processing privileges failed\n"); return ret; } } @@ -2276,14 +2809,14 @@ static int __ps_process_launchconditions(xmlTextReaderPtr reader, launchconditio while ((ret = __next_child_element(reader, depth))) { node = xmlTextReaderConstName(reader); if (!node) { - DBG("xmlTextReaderConstName value is NULL\n"); + _LOGD("xmlTextReaderConstName value is NULL\n"); return -1; } if (strcmp(ASCII(node), "condition") == 0) { condition_x *condition = malloc(sizeof(condition_x)); if (condition == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(condition, '\0', sizeof(condition_x)); @@ -2292,7 +2825,7 @@ static int __ps_process_launchconditions(xmlTextReaderPtr reader, launchconditio } else return -1; if (ret < 0) { - DBG("Processing launchconditions failed\n"); + _LOGD("Processing launchconditions failed\n"); return ret; } } @@ -2301,9 +2834,7 @@ static int __ps_process_launchconditions(xmlTextReaderPtr reader, launchconditio launchconditions->condition = tmp1; } - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) - launchconditions->text = ASCII(xmlTextReaderValue(reader)); + __save_xml_value(reader, &launchconditions->text); return ret; } @@ -2319,14 +2850,14 @@ static int __ps_process_datashare(xmlTextReaderPtr reader, datashare_x *datashar while ((ret = __next_child_element(reader, depth))) { node = xmlTextReaderConstName(reader); if (!node) { - DBG("xmlTextReaderConstName value is NULL\n"); + _LOGD("xmlTextReaderConstName value is NULL\n"); return -1; } if (!strcmp(ASCII(node), "define")) { define_x *define= malloc(sizeof(define_x)); if (define == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(define, '\0', sizeof(define_x)); @@ -2335,7 +2866,7 @@ static int __ps_process_datashare(xmlTextReaderPtr reader, datashare_x *datashar } else if (!strcmp(ASCII(node), "request")) { request_x *request= malloc(sizeof(request_x)); if (request == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(request, '\0', sizeof(request_x)); @@ -2344,7 +2875,7 @@ static int __ps_process_datashare(xmlTextReaderPtr reader, datashare_x *datashar } else return -1; if (ret < 0) { - DBG("Processing data-share failed\n"); + _LOGD("Processing data-share failed\n"); return ret; } } @@ -2360,7 +2891,7 @@ static int __ps_process_datashare(xmlTextReaderPtr reader, datashare_x *datashar } static char* -__get_icon_with_path(const char* icon) +__get_icon_with_path(const char* icon, uid_t uid) { if (!icon) return NULL; @@ -2368,11 +2899,14 @@ __get_icon_with_path(const char* icon) if (index(icon, '/') == NULL) { char* theme = NULL; char* icon_with_path = NULL; + char *app_path = NULL; int len; if (!package) return NULL; +/* "db/setting/theme" is not exist */ +#if 0 theme = vconf_get_str("db/setting/theme"); if (!theme) { theme = strdup("default"); @@ -2380,47 +2914,33 @@ __get_icon_with_path(const char* icon) return NULL; } } +#else + theme = strdup("default"); +#endif len = (0x01 << 7) + strlen(icon) + strlen(package) + strlen(theme); icon_with_path = malloc(len); if(icon_with_path == NULL) { - DBG("(icon_with_path == NULL) return\n"); + _LOGD("(icon_with_path == NULL) return\n"); free(theme); return NULL; } memset(icon_with_path, 0, len); - - snprintf(icon_with_path, len, "/opt/share/icons/%s/small/%s", theme, icon); - do { - if (access(icon_with_path, R_OK) == 0) break; - snprintf(icon_with_path, len, "/usr/share/icons/%s/small/%s", theme, icon); - if (access(icon_with_path, R_OK) == 0) break; - DBG("cannot find icon %s", icon_with_path); - snprintf(icon_with_path, len,"/opt/share/icons/default/small/%s", icon); - if (access(icon_with_path, R_OK) == 0) break; - snprintf(icon_with_path, len, "/usr/share/icons/default/small/%s", icon); - if (access(icon_with_path, R_OK) == 0) break; - - /* icon path is going to be moved intto the app directory */ - DBGE("icon file must be moved to %s", icon_with_path); - snprintf(icon_with_path, len, "/opt/apps/%s/res/icons/%s/small/%s", package, theme, icon); - if (access(icon_with_path, R_OK) == 0) break; - snprintf(icon_with_path, len, "/usr/apps/%s/res/icons/%s/small/%s", package, theme, icon); - if (access(icon_with_path, R_OK) == 0) break; - DBG("cannot find icon %s", icon_with_path); - snprintf(icon_with_path, len, "/opt/apps/%s/res/icons/default/small/%s", package, icon); - if (access(icon_with_path, R_OK) == 0) break; - snprintf(icon_with_path, len, "/usr/apps/%s/res/icons/default/small/%s", package, icon); - if (access(icon_with_path, R_OK) == 0) break; - snprintf(icon_with_path, len, "/usr/ug/res/images/%s/%s", package, icon); - if (access(icon_with_path, R_OK) == 0) break; - } while (0); - + if (uid != GLOBAL_USER) + snprintf(icon_with_path, len, "%s%s", getIconPath(uid), icon); + else { + snprintf(icon_with_path, len, "%s%s/small/%s", getIconPath(GLOBAL_USER), theme, icon); + 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 + app_path = tzplatform_getenv(TZ_SYS_RW_APP); + if (app_path) + snprintf(icon_with_path, len, "%s/%q/res/icons/%q/small/%q", app_path, package, theme, icon); + if (access (icon_with_path, F_OK)) + _LOGE("Cannot find icon path"); + } + } free(theme); - - DBG("Icon path : %s ---> %s", icon, icon_with_path); - + _LOGD("Icon path : %s ---> %s", icon, icon_with_path); return icon_with_path; } else { char* confirmed_icon = NULL; @@ -2467,7 +2987,7 @@ static void __ps_process_tag(manifest_x * mfx, char *const tagv[]) } /*check tag : not matched*/ } else - DBG("tag process [%s]is not defined\n", ret_result); + _LOGD("tag process [%s]is not defined\n", ret_result); free(tag); @@ -2475,36 +2995,25 @@ static void __ps_process_tag(manifest_x * mfx, char *const tagv[]) if (tagv[++i] != NULL) tag = strdup(tagv[i]); else { - DBG("tag process success...\n"); + _LOGD("tag process success...\n"); return; } } } -static int __ps_process_icon(xmlTextReaderPtr reader, icon_x *icon) +static int __ps_process_icon(xmlTextReaderPtr reader, icon_x *icon, uid_t uid) { - if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) - icon->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); - if (xmlTextReaderConstXmlLang(reader)) { - icon->lang = strdup(ASCII(xmlTextReaderConstXmlLang(reader))); - if (icon->lang == NULL) - icon->lang = strdup(DEFAULT_LOCALE); - } else { - icon->lang = strdup(DEFAULT_LOCALE); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("section"))) - icon->section = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("section"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("size"))) - icon->size = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("size"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("resolution"))) - icon->resolution = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("resolution"))); + __save_xml_attribute(reader, "name", &icon->name, NULL); + __save_xml_attribute(reader, "section", &icon->section, NULL); + __save_xml_attribute(reader, "size", &icon->size, NULL); + __save_xml_attribute(reader, "resolution", &icon->resolution, NULL); + __save_xml_lang(reader, &icon->lang); + xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) { - const char *text = ASCII(xmlTextReaderValue(reader)); - if(text) { - icon->text = (const char *)__get_icon_with_path(text); - free((void *)text); - } + const char *text = ASCII(xmlTextReaderValue(reader)); + if (text) { + icon->text = (const char *)__get_icon_with_path(text, uid); + free((void *)text); } return 0; @@ -2512,188 +3021,58 @@ static int __ps_process_icon(xmlTextReaderPtr reader, icon_x *icon) static int __ps_process_image(xmlTextReaderPtr reader, image_x *image) { - if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) - image->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); - if (xmlTextReaderConstXmlLang(reader)) { - image->lang = strdup(ASCII(xmlTextReaderConstXmlLang(reader))); - if (image->lang == NULL) - image->lang = strdup(DEFAULT_LOCALE); - } else { - image->lang = strdup(DEFAULT_LOCALE); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("section"))) - image->section = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("section"))); - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) - image->text = ASCII(xmlTextReaderValue(reader)); - + __save_xml_attribute(reader, "name", &image->name, NULL); + __save_xml_attribute(reader, "section", &image->section, NULL); + __save_xml_lang(reader, &image->lang); + __save_xml_value(reader, &image->text); return 0; } static int __ps_process_label(xmlTextReaderPtr reader, label_x *label) { - if (xmlTextReaderGetAttribute(reader, XMLCHAR("name"))) - label->name = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("name"))); - if (xmlTextReaderConstXmlLang(reader)) { - label->lang = strdup(ASCII(xmlTextReaderConstXmlLang(reader))); - if (label->lang == NULL) - label->lang = strdup(DEFAULT_LOCALE); - } else { - label->lang = strdup(DEFAULT_LOCALE); - } - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) - label->text = ASCII(xmlTextReaderValue(reader)); - -/* DBG("lable name %s\n", label->name); - DBG("lable lang %s\n", label->lang); - DBG("lable text %s\n", label->text); -*/ + __save_xml_attribute(reader, "name", &label->name, NULL); + __save_xml_lang(reader, &label->lang); + __save_xml_value(reader, &label->text); return 0; } static int __ps_process_author(xmlTextReaderPtr reader, author_x *author) { - if (xmlTextReaderGetAttribute(reader, XMLCHAR("email"))) - author->email = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("email"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("href"))) - author->href = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("href"))); - if (xmlTextReaderConstXmlLang(reader)) { - author->lang = strdup(ASCII(xmlTextReaderConstXmlLang(reader))); - if (author->lang == NULL) - author->lang = strdup(DEFAULT_LOCALE); - } else { - author->lang = strdup(DEFAULT_LOCALE); - } - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) - author->text = ASCII(xmlTextReaderValue(reader)); + __save_xml_attribute(reader, "email", &author->email, NULL); + __save_xml_attribute(reader, "href", &author->href, NULL); + __save_xml_lang(reader, &author->lang); + __save_xml_value(reader, &author->text); return 0; } static int __ps_process_description(xmlTextReaderPtr reader, description_x *description) { - if (xmlTextReaderConstXmlLang(reader)) { - description->lang = strdup(ASCII(xmlTextReaderConstXmlLang(reader))); - if (description->lang == NULL) - description->lang = strdup(DEFAULT_LOCALE); - } else { - description->lang = strdup(DEFAULT_LOCALE); - } - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) - description->text = ASCII(xmlTextReaderValue(reader)); + __save_xml_lang(reader, &description->lang); + __save_xml_value(reader, &description->text); return 0; } static int __ps_process_license(xmlTextReaderPtr reader, license_x *license) { - if (xmlTextReaderConstXmlLang(reader)) { - license->lang = strdup(ASCII(xmlTextReaderConstXmlLang(reader))); - if (license->lang == NULL) - license->lang = strdup(DEFAULT_LOCALE); - } else { - license->lang = strdup(DEFAULT_LOCALE); - } - xmlTextReaderRead(reader); - if (xmlTextReaderValue(reader)) - license->text = ASCII(xmlTextReaderValue(reader)); + __save_xml_lang(reader, &license->lang); + __save_xml_value(reader, &license->text); return 0; } -static int __ps_process_capability(xmlTextReaderPtr reader, capability_x *capability) -{ - const xmlChar *node; - int ret = -1; - int depth = -1; - resolution_x *tmp1 = NULL; - - if (xmlTextReaderGetAttribute(reader, XMLCHAR("operation-id"))) - capability->operationid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("operation-id"))); - - depth = xmlTextReaderDepth(reader); - while ((ret = __next_child_element(reader, depth))) { - node = xmlTextReaderConstName(reader); - if (!node) { - DBG("xmlTextReaderConstName value is NULL\n"); - return -1; - } - - if (!strcmp(ASCII(node), "resolution")) { - resolution_x *resolution = malloc(sizeof(resolution_x)); - if (resolution == NULL) { - DBG("Malloc Failed\n"); - return -1; - } - memset(resolution, '\0', sizeof(resolution_x)); - LISTADD(capability->resolution, resolution); - ret = __ps_process_resolution(reader, resolution); - } else - return -1; - if (ret < 0) { - DBG("Processing capability failed\n"); - return ret; - } - } - - if (capability->resolution) { - LISTHEAD(capability->resolution, tmp1); - capability->resolution = tmp1; - } - - return ret; -} - static int __ps_process_datacontrol(xmlTextReaderPtr reader, datacontrol_x *datacontrol) { - const xmlChar *node; - int ret = -1; - int depth = -1; - capability_x *tmp1 = NULL; - - if (xmlTextReaderGetAttribute(reader, XMLCHAR("provider-id"))) - datacontrol->providerid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("provider-id"))); - - depth = xmlTextReaderDepth(reader); - while ((ret = __next_child_element(reader, depth))) { - node = xmlTextReaderConstName(reader); - if (!node) { - DBG("xmlTextReaderConstName value is NULL\n"); - return -1; - } - - if (!strcmp(ASCII(node), "capability")) { - capability_x *capability = malloc(sizeof(capability_x)); - if (capability == NULL) { - DBG("Malloc Failed\n"); - return -1; - } - memset(capability, '\0', sizeof(capability_x)); - LISTADD(datacontrol->capability, capability); - ret = __ps_process_capability(reader, capability); - } else - return -1; - if (ret < 0) { - DBG("Processing datacontrol failed\n"); - return ret; - } - } - - if (datacontrol->capability) { - LISTHEAD(datacontrol->capability, tmp1); - datacontrol->capability = tmp1; - } - - return ret; + __save_xml_attribute(reader, "providerid", &datacontrol->providerid, NULL); + __save_xml_attribute(reader, "access", &datacontrol->access, NULL); + __save_xml_attribute(reader, "type", &datacontrol->type, NULL); + return 0; } -static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x *uiapplication) +static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x *uiapplication, uid_t uid) { const xmlChar *node; int ret = -1; int depth = -1; - char *newappid = NULL; label_x *tmp1 = NULL; icon_x *tmp2 = NULL; appsvc_x *tmp3 = NULL; @@ -2705,147 +3084,48 @@ static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x * metadata_x *tmp9 = NULL; image_x *tmp10 = NULL; permission_x *tmp11 = NULL; - - if (xmlTextReaderGetAttribute(reader, XMLCHAR("appid"))) { - uiapplication->appid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("appid"))); - if (uiapplication->appid == NULL) { - DBG("appid cant be NULL\n"); - return -1; - } - } else { - DBG("appid is mandatory\n"); - return -1; - } - /*check appid*/ - ret = __validate_appid(package, uiapplication->appid, &newappid); - if (ret == -1) { - DBG("appid is not proper\n"); - return -1; - } else { - if (newappid) { - if (uiapplication->appid) - free((void *)uiapplication->appid); - uiapplication->appid = newappid; - } - uiapplication->package= strdup(package); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("exec"))) - uiapplication->exec = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("exec"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("nodisplay"))) { - uiapplication->nodisplay = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("nodisplay"))); - if (uiapplication->nodisplay == NULL) - uiapplication->nodisplay = strdup("false"); - } else { - uiapplication->nodisplay = strdup("false"); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("multiple"))) { - uiapplication->multiple = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("multiple"))); - if (uiapplication->multiple == NULL) - uiapplication->multiple = strdup("false"); - } else { - uiapplication->multiple = strdup("false"); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("type"))) - uiapplication->type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("type"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("categories"))) - uiapplication->categories = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("categories"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("extraid"))) - uiapplication->extraid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("extraid"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("taskmanage"))) { - uiapplication->taskmanage = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("taskmanage"))); - if (uiapplication->taskmanage == NULL) - uiapplication->taskmanage = strdup("true"); - } else { - uiapplication->taskmanage = strdup("true"); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("enabled"))) { - uiapplication->enabled = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("enabled"))); - if (uiapplication->enabled == NULL) - uiapplication->enabled = strdup("true"); - } else { - uiapplication->enabled = strdup("true"); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("hw-acceleration"))) { - uiapplication->hwacceleration = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("hw-acceleration"))); - if (uiapplication->hwacceleration == NULL) - uiapplication->hwacceleration = strdup("use-system-setting"); - } else { - uiapplication->hwacceleration = strdup("use-system-setting"); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("recentimage"))) - uiapplication->recentimage = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("recentimage"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("mainapp"))) { - uiapplication->mainapp = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("mainapp"))); - if (uiapplication->mainapp == NULL) - uiapplication->mainapp = strdup("false"); - } else { - uiapplication->mainapp = strdup("false"); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("launchcondition"))) { - uiapplication->launchcondition = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("launchcondition"))); - if (uiapplication->launchcondition == NULL) - uiapplication->launchcondition = strdup("false"); - } else { - uiapplication->launchcondition = strdup("false"); - } - - if (xmlTextReaderGetAttribute(reader, XMLCHAR("indicatordisplay"))) { - uiapplication->indicatordisplay = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("indicatordisplay"))); - if (uiapplication->indicatordisplay == NULL) - uiapplication->indicatordisplay = strdup("true"); - } else { - uiapplication->indicatordisplay = strdup("true"); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("portrait-effectimage"))) - uiapplication->portraitimg = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("portrait-effectimage"))); - else - uiapplication->portraitimg = NULL; - if (xmlTextReaderGetAttribute(reader, XMLCHAR("landscape-effectimage"))) - uiapplication->landscapeimg = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("landscape-effectimage"))); - else - uiapplication->landscapeimg = NULL; - if (xmlTextReaderGetAttribute(reader, XMLCHAR("guestmode-visibility"))) { - uiapplication->guestmode_visibility = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("guestmode-visibility"))); - if (uiapplication->guestmode_visibility == NULL) - uiapplication->guestmode_visibility = strdup("true"); - } else { - uiapplication->guestmode_visibility = strdup("true"); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("permission-type"))) { - uiapplication->permission_type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("permission-type"))); - if (uiapplication->permission_type == NULL) - uiapplication->permission_type = strdup("normal"); - } else { - uiapplication->permission_type = strdup("normal"); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("component-type"))) { - uiapplication->component_type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("component-type"))); - if (uiapplication->component_type == NULL) - uiapplication->component_type = strdup("uiapp"); - } else { - uiapplication->component_type = strdup("uiapp"); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("submode"))) { - uiapplication->submode = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("submode"))); - if (uiapplication->submode == NULL) - uiapplication->submode = strdup("false"); - } else { - uiapplication->submode = strdup("false"); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("submode-mainid"))) - uiapplication->submode_mainid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("submode-mainid"))); + datacontrol_x *tmp12 = NULL; + + __save_xml_attribute(reader, "appid", &uiapplication->appid, NULL); + retvm_if(uiapplication->appid == NULL, PM_PARSER_R_ERROR, "appid cant be NULL, appid field is mandatory\n"); + __save_xml_attribute(reader, "exec", &uiapplication->exec, NULL); + __save_xml_attribute(reader, "nodisplay", &uiapplication->nodisplay, "false"); + __save_xml_attribute(reader, "multiple", &uiapplication->multiple, "false"); + __save_xml_attribute(reader, "type", &uiapplication->type, NULL); + __save_xml_attribute(reader, "categories", &uiapplication->categories, NULL); + __save_xml_attribute(reader, "extraid", &uiapplication->extraid, NULL); + __save_xml_attribute(reader, "taskmanage", &uiapplication->taskmanage, "true"); + __save_xml_attribute(reader, "enabled", &uiapplication->enabled, "true"); + __save_xml_attribute(reader, "hw-acceleration", &uiapplication->hwacceleration, "default"); + __save_xml_attribute(reader, "screen-reader", &uiapplication->screenreader, "use-system-setting"); + __save_xml_attribute(reader, "mainapp", &uiapplication->mainapp, "false"); + __save_xml_attribute(reader, "recentimage", &uiapplication->recentimage, "false"); + __save_xml_attribute(reader, "launchcondition", &uiapplication->launchcondition, "false"); + __save_xml_attribute(reader, "indicatordisplay", &uiapplication->indicatordisplay, "true"); + __save_xml_attribute(reader, "portrait-effectimage", &uiapplication->portraitimg, NULL); + __save_xml_attribute(reader, "landscape-effectimage", &uiapplication->landscapeimg, NULL); + __save_xml_attribute(reader, "guestmode-visibility", &uiapplication->guestmode_visibility, "true"); + __save_xml_attribute(reader, "permission-type", &uiapplication->permission_type, "normal"); + __save_xml_attribute(reader, "component-type", &uiapplication->component_type, "uiapp"); + /*component_type has "svcapp" or "uiapp", if it is not, parsing manifest is fail*/ + retvm_if(((strcmp(uiapplication->component_type, "svcapp") != 0) && (strcmp(uiapplication->component_type, "uiapp") != 0) && (strcmp(uiapplication->component_type, "widgetapp") != 0)), PM_PARSER_R_ERROR, "invalid component_type[%s]\n", uiapplication->component_type); + __save_xml_attribute(reader, "submode", &uiapplication->submode, "false"); + __save_xml_attribute(reader, "submode-mainid", &uiapplication->submode_mainid, NULL); + __save_xml_attribute(reader, "launch_mode", &uiapplication->launch_mode, "caller"); + + uiapplication->package= strdup(package); depth = xmlTextReaderDepth(reader); while ((ret = __next_child_element(reader, depth))) { node = xmlTextReaderConstName(reader); if (!node) { - DBG("xmlTextReaderConstName value is NULL\n"); + _LOGD("xmlTextReaderConstName value is NULL\n"); return -1; } if (!strcmp(ASCII(node), "label")) { label_x *label = malloc(sizeof(label_x)); if (label == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(label, '\0', sizeof(label_x)); @@ -2854,16 +3134,16 @@ static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x * } else if (!strcmp(ASCII(node), "icon")) { icon_x *icon = malloc(sizeof(icon_x)); if (icon == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(icon, '\0', sizeof(icon_x)); LISTADD(uiapplication->icon, icon); - ret = __ps_process_icon(reader, icon); + ret = __ps_process_icon(reader, icon, uid); } else if (!strcmp(ASCII(node), "image")) { image_x *image = malloc(sizeof(image_x)); if (image == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(image, '\0', sizeof(image_x)); @@ -2872,7 +3152,7 @@ static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x * } else if (!strcmp(ASCII(node), "category")) { category_x *category = malloc(sizeof(category_x)); if (category == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(category, '\0', sizeof(category_x)); @@ -2881,7 +3161,7 @@ static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x * } else if (!strcmp(ASCII(node), "metadata")) { metadata_x *metadata = malloc(sizeof(metadata_x)); if (metadata == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(metadata, '\0', sizeof(metadata_x)); @@ -2890,7 +3170,7 @@ static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x * } else if (!strcmp(ASCII(node), "permission")) { permission_x *permission = malloc(sizeof(permission_x)); if (permission == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(permission, '\0', sizeof(permission_x)); @@ -2899,7 +3179,7 @@ static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x * } else if (!strcmp(ASCII(node), "app-control")) { appcontrol_x *appcontrol = malloc(sizeof(appcontrol_x)); if (appcontrol == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(appcontrol, '\0', sizeof(appcontrol_x)); @@ -2908,7 +3188,7 @@ static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x * } else if (!strcmp(ASCII(node), "application-service")) { appsvc_x *appsvc = malloc(sizeof(appsvc_x)); if (appsvc == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(appsvc, '\0', sizeof(appsvc_x)); @@ -2917,7 +3197,7 @@ static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x * } else if (!strcmp(ASCII(node), "data-share")) { datashare_x *datashare = malloc(sizeof(datashare_x)); if (datashare == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(datashare, '\0', sizeof(datashare_x)); @@ -2926,7 +3206,7 @@ static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x * } else if (!strcmp(ASCII(node), "launch-conditions")) { launchconditions_x *launchconditions = malloc(sizeof(launchconditions_x)); if (launchconditions == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(launchconditions, '\0', sizeof(launchconditions_x)); @@ -2935,16 +3215,25 @@ static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x * } else if (!strcmp(ASCII(node), "notification")) { notification_x *notification = malloc(sizeof(notification_x)); if (notification == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(notification, '\0', sizeof(notification_x)); LISTADD(uiapplication->notification, notification); ret = __ps_process_notification(reader, notification); + } else if (!strcmp(ASCII(node), "datacontrol")) { + datacontrol_x *datacontrol = malloc(sizeof(datacontrol_x)); + if (datacontrol == NULL) { + _LOGD("Malloc Failed\n"); + return -1; + } + memset(datacontrol, '\0', sizeof(datacontrol_x)); + LISTADD(uiapplication->datacontrol, datacontrol); + ret = __ps_process_datacontrol(reader, datacontrol); } else return -1; if (ret < 0) { - DBG("Processing uiapplication failed\n"); + _LOGD("Processing uiapplication failed\n"); return ret; } } @@ -2993,16 +3282,19 @@ static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x * LISTHEAD(uiapplication->permission, tmp11); uiapplication->permission = tmp11; } + if (uiapplication->datacontrol) { + LISTHEAD(uiapplication->datacontrol, tmp12); + uiapplication->datacontrol = tmp12; + } return ret; } -static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceapplication_x *serviceapplication) +static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceapplication_x *serviceapplication, uid_t uid) { const xmlChar *node; int ret = -1; int depth = -1; - char *newappid = NULL; label_x *tmp1 = NULL; icon_x *tmp2 = NULL; appsvc_x *tmp3 = NULL; @@ -3015,66 +3307,29 @@ static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceappli metadata_x *tmp10 = NULL; permission_x *tmp11 = NULL; - if (xmlTextReaderGetAttribute(reader, XMLCHAR("appid"))) { - serviceapplication->appid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("appid"))); - if (serviceapplication->appid == NULL) { - DBG("appid cant be NULL\n"); - return -1; - } - } else { - DBG("appid is mandatory\n"); - return -1; - } - /*check appid*/ - ret = __validate_appid(package, serviceapplication->appid, &newappid); - if (ret == -1) { - DBG("appid is not proper\n"); - return -1; - } else { - if (newappid) { - if (serviceapplication->appid) - free((void *)serviceapplication->appid); - serviceapplication->appid = newappid; - } - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("exec"))) - serviceapplication->exec = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("exec"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("type"))) - serviceapplication->type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("type"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("on-boot"))) { - serviceapplication->onboot = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("on-boot"))); - if (serviceapplication->onboot == NULL) - serviceapplication->onboot = strdup("false"); - } else { - serviceapplication->onboot = strdup("false"); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("auto-restart"))) { - serviceapplication->autorestart = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("auto-restart"))); - if (serviceapplication->autorestart == NULL) - serviceapplication->autorestart = strdup("false"); - } else { - serviceapplication->autorestart = strdup("false"); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("permission-type"))) { - serviceapplication->permission_type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("permission-type"))); - if (serviceapplication->permission_type == NULL) - serviceapplication->permission_type = strdup("normal"); - } else { - serviceapplication->permission_type = strdup("normal"); - } + __save_xml_attribute(reader, "appid", &serviceapplication->appid, NULL); + retvm_if(serviceapplication->appid == NULL, PM_PARSER_R_ERROR, "appid cant be NULL, appid field is mandatory\n"); + __save_xml_attribute(reader, "exec", &serviceapplication->exec, NULL); + __save_xml_attribute(reader, "type", &serviceapplication->type, NULL); + __save_xml_attribute(reader, "enabled", &serviceapplication->enabled, "true"); + __save_xml_attribute(reader, "permission-type", &serviceapplication->permission_type, "normal"); + __save_xml_attribute(reader, "auto-restart", &serviceapplication->autorestart, "false"); + __save_xml_attribute(reader, "on-boot", &serviceapplication->onboot, "false"); + + serviceapplication->package= strdup(package); depth = xmlTextReaderDepth(reader); while ((ret = __next_child_element(reader, depth))) { node = xmlTextReaderConstName(reader); if (!node) { - DBG("xmlTextReaderConstName value is NULL\n"); + _LOGD("xmlTextReaderConstName value is NULL\n"); return -1; } if (!strcmp(ASCII(node), "label")) { label_x *label = malloc(sizeof(label_x)); if (label == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(label, '\0', sizeof(label_x)); @@ -3083,16 +3338,16 @@ static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceappli } else if (!strcmp(ASCII(node), "icon")) { icon_x *icon = malloc(sizeof(icon_x)); if (icon == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(icon, '\0', sizeof(icon_x)); LISTADD(serviceapplication->icon, icon); - ret = __ps_process_icon(reader, icon); + ret = __ps_process_icon(reader, icon, uid); } else if (!strcmp(ASCII(node), "category")) { category_x *category = malloc(sizeof(category_x)); if (category == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(category, '\0', sizeof(category_x)); @@ -3101,7 +3356,7 @@ static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceappli } else if (!strcmp(ASCII(node), "metadata")) { metadata_x *metadata = malloc(sizeof(metadata_x)); if (metadata == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(metadata, '\0', sizeof(metadata_x)); @@ -3110,7 +3365,7 @@ static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceappli } else if (!strcmp(ASCII(node), "permission")) { permission_x *permission = malloc(sizeof(permission_x)); if (permission == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(permission, '\0', sizeof(permission_x)); @@ -3119,7 +3374,7 @@ static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceappli } else if (!strcmp(ASCII(node), "app-control")) { appcontrol_x *appcontrol = malloc(sizeof(appcontrol_x)); if (appcontrol == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(appcontrol, '\0', sizeof(appcontrol_x)); @@ -3128,7 +3383,7 @@ static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceappli } else if (!strcmp(ASCII(node), "application-service")) { appsvc_x *appsvc = malloc(sizeof(appsvc_x)); if (appsvc == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(appsvc, '\0', sizeof(appsvc_x)); @@ -3137,7 +3392,7 @@ static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceappli } else if (!strcmp(ASCII(node), "data-share")) { datashare_x *datashare = malloc(sizeof(datashare_x)); if (datashare == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(datashare, '\0', sizeof(datashare_x)); @@ -3146,7 +3401,7 @@ static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceappli } else if (!strcmp(ASCII(node), "launch-conditions")) { launchconditions_x *launchconditions = malloc(sizeof(launchconditions_x)); if (launchconditions == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(launchconditions, '\0', sizeof(launchconditions_x)); @@ -3155,16 +3410,16 @@ static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceappli } else if (!strcmp(ASCII(node), "notification")) { notification_x *notification = malloc(sizeof(notification_x)); if (notification == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(notification, '\0', sizeof(notification_x)); LISTADD(serviceapplication->notification, notification); ret = __ps_process_notification(reader, notification); - } else if (!strcmp(ASCII(node), "data-control")) { + } else if (!strcmp(ASCII(node), "datacontrol")) { datacontrol_x *datacontrol = malloc(sizeof(datacontrol_x)); if (datacontrol == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(datacontrol, '\0', sizeof(datacontrol_x)); @@ -3173,7 +3428,7 @@ static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceappli } else return -1; if (ret < 0) { - DBG("Processing serviceapplication failed\n"); + _LOGD("Processing serviceapplication failed\n"); return ret; } } @@ -3256,9 +3511,9 @@ static int __ps_process_ime(xmlTextReaderPtr reader, ime_x *ime) return 0; } -static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx) +static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx, uid_t uid) { - DBG("__start_process\n"); + _LOGD("__start_process\n"); const xmlChar *node; int ret = -1; int depth = -1; @@ -3281,14 +3536,14 @@ static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx) while ((ret = __next_child_element(reader, depth))) { node = xmlTextReaderConstName(reader); if (!node) { - DBG("xmlTextReaderConstName value is NULL\n"); + _LOGD("xmlTextReaderConstName value is NULL\n"); return -1; } if (!strcmp(ASCII(node), "label")) { label_x *label = malloc(sizeof(label_x)); if (label == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(label, '\0', sizeof(label_x)); @@ -3297,7 +3552,7 @@ static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx) } else if (!strcmp(ASCII(node), "author")) { author_x *author = malloc(sizeof(author_x)); if (author == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(author, '\0', sizeof(author_x)); @@ -3306,7 +3561,7 @@ static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx) } else if (!strcmp(ASCII(node), "description")) { description_x *description = malloc(sizeof(description_x)); if (description == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(description, '\0', sizeof(description_x)); @@ -3315,7 +3570,7 @@ static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx) } else if (!strcmp(ASCII(node), "license")) { license_x *license = malloc(sizeof(license_x)); if (license == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(license, '\0', sizeof(license_x)); @@ -3324,7 +3579,7 @@ static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx) } else if (!strcmp(ASCII(node), "privileges")) { privileges_x *privileges = malloc(sizeof(privileges_x)); if (privileges == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(privileges, '\0', sizeof(privileges_x)); @@ -3333,25 +3588,25 @@ static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx) } else if (!strcmp(ASCII(node), "ui-application")) { uiapplication_x *uiapplication = malloc(sizeof(uiapplication_x)); if (uiapplication == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(uiapplication, '\0', sizeof(uiapplication_x)); LISTADD(mfx->uiapplication, uiapplication); - ret = __ps_process_uiapplication(reader, uiapplication); + ret = __ps_process_uiapplication(reader, uiapplication, uid); } else if (!strcmp(ASCII(node), "service-application")) { serviceapplication_x *serviceapplication = malloc(sizeof(serviceapplication_x)); if (serviceapplication == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(serviceapplication, '\0', sizeof(serviceapplication_x)); LISTADD(mfx->serviceapplication, serviceapplication); - ret = __ps_process_serviceapplication(reader, serviceapplication); + ret = __ps_process_serviceapplication(reader, serviceapplication, uid); } else if (!strcmp(ASCII(node), "daemon")) { daemon_x *daemon = malloc(sizeof(daemon_x)); if (daemon == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(daemon, '\0', sizeof(daemon_x)); @@ -3360,7 +3615,7 @@ static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx) } else if (!strcmp(ASCII(node), "theme")) { theme_x *theme = malloc(sizeof(theme_x)); if (theme == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(theme, '\0', sizeof(theme_x)); @@ -3369,7 +3624,7 @@ static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx) } else if (!strcmp(ASCII(node), "font")) { font_x *font = malloc(sizeof(font_x)); if (font == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(font, '\0', sizeof(font_x)); @@ -3378,7 +3633,7 @@ static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx) } else if (!strcmp(ASCII(node), "ime")) { ime_x *ime = malloc(sizeof(ime_x)); if (ime == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(ime, '\0', sizeof(ime_x)); @@ -3387,16 +3642,16 @@ static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx) } else if (!strcmp(ASCII(node), "icon")) { icon_x *icon = malloc(sizeof(icon_x)); if (icon == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(icon, '\0', sizeof(icon_x)); LISTADD(mfx->icon, icon); - ret = __ps_process_icon(reader, icon); - } else if (!strcmp(ASCII(node), "device-profile")) { + ret = __ps_process_icon(reader, icon, uid); + } else if (!strcmp(ASCII(node), "profile")) { deviceprofile_x *deviceprofile = malloc(sizeof(deviceprofile_x)); if (deviceprofile == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(deviceprofile, '\0', sizeof(deviceprofile_x)); @@ -3405,7 +3660,7 @@ static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx) } else if (!strcmp(ASCII(node), "compatibility")) { compatibility_x *compatibility = malloc(sizeof(compatibility_x)); if (compatibility == NULL) { - DBG("Malloc Failed\n"); + _LOGD("Malloc Failed\n"); return -1; } memset(compatibility, '\0', sizeof(compatibility_x)); @@ -3421,11 +3676,15 @@ static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx) continue; } else if (!strcmp(ASCII(node), "ime")) { continue; - } else + } else if (!strcmp(ASCII(node), "feature")) { + continue; + } else { + _LOGE("Unknown element: %s", ASCII(node)); return -1; + } if (ret < 0) { - DBG("Processing manifest failed\n"); + _LOGD("Processing manifest failed\n"); return ret; } } @@ -3488,571 +3747,90 @@ static int __start_process(xmlTextReaderPtr reader, manifest_x * mfx) return ret; } -static int __process_manifest(xmlTextReaderPtr reader, manifest_x * mfx) -{ - const xmlChar *node; - int ret = -1; - - if ((ret = __next_child_element(reader, -1))) { - node = xmlTextReaderConstName(reader); - if (!node) { - DBG("xmlTextReaderConstName value is NULL\n"); - return -1; - } - - if (!strcmp(ASCII(node), "manifest")) { - if (xmlTextReaderGetAttribute(reader, XMLCHAR("xmlns"))) - mfx->ns = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("xmlns"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("package"))) { - mfx->package= ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("package"))); - if (mfx->package == NULL) { - DBG("package cant be NULL\n"); - return -1; - } - } else { - DBG("package field is mandatory\n"); - return -1; - } - package = mfx->package; - if (xmlTextReaderGetAttribute(reader, XMLCHAR("version"))) - mfx->version= ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("version"))); - /*app2ext needs package size for external installation*/ - if (xmlTextReaderGetAttribute(reader, XMLCHAR("size"))) - mfx->package_size = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("size"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("install-location"))) - mfx->installlocation = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("install-location"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("type"))) - mfx->type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("type"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("root_path"))) - mfx->root_path = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("root_path"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("csc_path"))) - mfx->csc_path = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("csc_path"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("appsetting"))) { - mfx->appsetting = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("appsetting"))); - if (mfx->appsetting == NULL) - mfx->appsetting = strdup("false"); - } else { - mfx->appsetting = strdup("false"); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("storeclient-id"))) - mfx->storeclient_id= ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("storeclient-id"))); - if (xmlTextReaderGetAttribute(reader, XMLCHAR("nodisplay-setting"))) { - mfx->nodisplay_setting = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("nodisplay-setting"))); - if (mfx->nodisplay_setting == NULL) - mfx->nodisplay_setting = strdup("false"); - } else { - mfx->nodisplay_setting = strdup("false"); - } - if (xmlTextReaderGetAttribute(reader, XMLCHAR("url"))) - mfx->package_url= ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("url"))); - - /*Assign default values. If required it will be overwritten in __add_preload_info()*/ - mfx->preload = strdup("False"); - mfx->removable = strdup("True"); - mfx->readonly = strdup("False"); - mfx->update = strdup("False"); - char buf[PKG_STRING_LEN_MAX] = {'\0'}; - char *val = NULL; - time_t current_time; - time(¤t_time); - snprintf(buf, PKG_STRING_LEN_MAX - 1, "%d", current_time); - val = strndup(buf, PKG_STRING_LEN_MAX - 1); - mfx->installed_time = val; - - mfx->installed_storage= strdup("installed_internal"); - - ret = __start_process(reader, mfx); - } else { - DBG("No Manifest element found\n"); - return -1; - } - } - return ret; -} - -#define DESKTOP_RW_PATH "/opt/share/applications/" -#define DESKTOP_RO_PATH "/usr/share/applications/" -#define MANIFEST_RO_PREFIX "/usr/share/packages/" - -static char* __convert_to_system_locale(const char *mlocale) -{ - if (mlocale == NULL) - return NULL; - char *locale = NULL; - locale = (char *)calloc(1, 6); - if (!locale) { - DBGE("Malloc Failed\n"); - return NULL; - } - - strncpy(locale, mlocale, 2); - strncat(locale, "_", 1); - locale[3] = toupper(mlocale[3]); - locale[4] = toupper(mlocale[4]); - return locale; -} - -#define LIBAIL_PATH "/usr/lib/libail.so.0" - -/* operation_type */ -typedef enum { - AIL_INSTALL = 0, - AIL_UPDATE, - AIL_REMOVE, - AIL_CLEAN, - AIL_MAX -} AIL_TYPE; - -static int __ail_change_info(int op, const char *appid) -{ - void *lib_handle = NULL; - int (*ail_desktop_operation) (const char *); - char *aop = NULL; - int ret = 0; - - if ((lib_handle = dlopen(LIBAIL_PATH, RTLD_LAZY)) == NULL) { - DBGE("dlopen is failed LIBAIL_PATH[%s]\n", LIBAIL_PATH); - goto END; - } - - - switch (op) { - case 0: - aop = "ail_desktop_add"; - break; - case 1: - aop = "ail_desktop_update"; - break; - case 2: - aop = "ail_desktop_remove"; - break; - case 3: - aop = "ail_desktop_clean"; - break; - default: - goto END; - break; - } - - if ((ail_desktop_operation = - dlsym(lib_handle, aop)) == NULL || dlerror() != NULL) { - DBGE("can not find symbol \n"); - goto END; - } - - ret = ail_desktop_operation(appid); - -END: - if (lib_handle) - dlclose(lib_handle); - - return ret; -} - - -/* desktop shoud be generated automatically based on manifest */ -/* Currently removable, taskmanage, etc fields are not considerd. it will be decided soon.*/ -#define BUFMAX 1024*128 -static int __ps_make_nativeapp_desktop(manifest_x * mfx, const char *manifest, bool is_update) -{ - FILE* file = NULL; - int fd = 0; - char filepath[PKG_STRING_LEN_MAX] = ""; - char *buf = NULL; - char *buftemp = NULL; - char *locale = NULL; - - buf = (char *)calloc(1, BUFMAX); - if (!buf) { - DBGE("Malloc Failed\n"); - return -1; - } - - buftemp = (char *)calloc(1, BUFMAX); - if (!buftemp) { - DBGE("Malloc Failed\n"); - free(buf); - return -1; - } - - if (is_update) - __ail_change_info(AIL_CLEAN, mfx->package); - - for(; mfx->uiapplication; mfx->uiapplication=mfx->uiapplication->next) { +static int __process_manifest(xmlTextReaderPtr reader, manifest_x *mfx, uid_t uid) +{ + const xmlChar *node; + int ret = -1; - if (manifest != NULL) { - /* skip making a deskfile and update ail, if preload app is updated */ - if(strstr(manifest, MANIFEST_RO_PREFIX)) { - __ail_change_info(AIL_INSTALL, mfx->uiapplication->appid); - DBGE("preload app is update : skip and update ail : %s", manifest); - continue; - } + if ((ret = __next_child_element(reader, -1))) { + node = xmlTextReaderConstName(reader); + if (!node) { + _LOGD("xmlTextReaderConstName value is NULL\n"); + return -1; } - if(mfx->readonly && !strcasecmp(mfx->readonly, "True")) - snprintf(filepath, sizeof(filepath),"%s%s.desktop", DESKTOP_RO_PATH, mfx->uiapplication->appid); - else - snprintf(filepath, sizeof(filepath),"%s%s.desktop", DESKTOP_RW_PATH, mfx->uiapplication->appid); - - /* skip if desktop exists - if (access(filepath, R_OK) == 0) - continue; - */ - - file = fopen(filepath, "w"); - if(file == NULL) - { - DBGE("Can't open %s", filepath); - free(buf); - free(buftemp); - return -1; - } - - snprintf(buf, BUFMAX, "[Desktop Entry]\n"); - fwrite(buf, 1, strlen(buf), file); - - for( ; mfx->uiapplication->label ; mfx->uiapplication->label = mfx->uiapplication->label->next) { - if(!strcmp(mfx->uiapplication->label->lang, DEFAULT_LOCALE)) { - snprintf(buf, BUFMAX, "Name=%s\n", mfx->uiapplication->label->text); - } else { - locale = __convert_to_system_locale(mfx->uiapplication->label->lang); - snprintf(buf, BUFMAX, "Name[%s]=%s\n", locale, - mfx->uiapplication->label->text); - free(locale); - } - fwrite(buf, 1, strlen(buf), file); - } + if (!strcmp(ASCII(node), "manifest")) { + __save_xml_attribute(reader, "xmlns", &mfx->ns, NULL); + __save_xml_attribute(reader, "package", &mfx->package, NULL); + retvm_if(mfx->package == NULL, PM_PARSER_R_ERROR, "package cant be NULL, package field is mandatory\n"); + __save_xml_attribute(reader, "version", &mfx->version, NULL); + __save_xml_attribute(reader, "size", &mfx->package_size, NULL); + __save_xml_attribute(reader, "install-location", &mfx->installlocation, "internal-only"); + __save_xml_attribute(reader, "type", &mfx->type, "rpm"); + __save_xml_attribute(reader, "root_path", &mfx->root_path, NULL); + __save_xml_attribute(reader, "csc_path", &mfx->csc_path, NULL); + __save_xml_attribute(reader, "appsetting", &mfx->appsetting, "false"); + __save_xml_attribute(reader, "storeclient-id", &mfx->storeclient_id, NULL); + __save_xml_attribute(reader, "nodisplay-setting", &mfx->nodisplay_setting, "false"); + __save_xml_attribute(reader, "url", &mfx->package_url, NULL); + __save_xml_attribute(reader, "api-version", &mfx->api_version, NULL); + + __save_xml_installed_time(mfx); + __save_xml_root_path(mfx, uid); + /*Assign default values. If required it will be overwritten in __add_preload_info()*/ + __save_xml_default_value(mfx); - if(mfx->uiapplication->label && mfx->uiapplication->label->text) { - snprintf(buf, BUFMAX, "Name=%s\n", mfx->uiapplication->label->text); - fwrite(buf, 1, strlen(buf), file); - } -/* - else if(mfx->label && mfx->label->text) { - snprintf(buf, BUFMAX, "Name=%s\n", mfx->label->text); - fwrite(buf, 1, strlen(buf), file); + ret = __start_process(reader, mfx, uid); } else { - snprintf(buf, BUFMAX, "Name=%s\n", mfx->package); - fwrite(buf, 1, strlen(buf), file); - } -*/ - - - snprintf(buf, BUFMAX, "Type=Application\n"); - fwrite(buf, 1, strlen(buf), file); - - if(mfx->uiapplication->exec) { - snprintf(buf, BUFMAX, "Exec=%s\n", mfx->uiapplication->exec); - fwrite(buf, 1, strlen(buf), file); - } - - if(mfx->uiapplication->icon && mfx->uiapplication->icon->text) { - snprintf(buf, BUFMAX, "Icon=%s\n", mfx->uiapplication->icon->text); - fwrite(buf, 1, strlen(buf), file); - } else if(mfx->icon && mfx->icon->text) { - snprintf(buf, BUFMAX, "Icon=%s\n", mfx->icon->text); - fwrite(buf, 1, strlen(buf), file); - } - - // MIME types - if(mfx->uiapplication && mfx->uiapplication->appsvc) { - appsvc_x *asvc = mfx->uiapplication->appsvc; - mime_x *mi = NULL; - const char *mime = NULL; - const char *mime_delim = "; "; - int mime_count = 0; - - strncpy(buf, "MimeType=", BUFMAX-1); - while (asvc) { - mi = asvc->mime; - while (mi) { - mime_count++; - mime = mi->name; - DBG("MIME type: %s\n", mime); - strncat(buf, mime, BUFMAX-strlen(buf)-1); - if(mi->next) { - strncat(buf, mime_delim, BUFMAX-strlen(buf)-1); - } - - mi = mi->next; - mime = NULL; - } - asvc = asvc->next; - } - DBG("MIME types: buf[%s]\n", buf); - DBG("MIME count: %d\n", mime_count); - if(mime_count) - fwrite(buf, 1, strlen(buf), file); - } - - if(mfx->version) { - snprintf(buf, BUFMAX, "Version=%s\n", mfx->version); - fwrite(buf, 1, strlen(buf), file); - } - - if(mfx->uiapplication->nodisplay) { - snprintf(buf, BUFMAX, "NoDisplay=%s\n", mfx->uiapplication->nodisplay); - fwrite(buf, 1, strlen(buf), file); - } - - if(mfx->uiapplication->categories) { - snprintf(buf, BUFMAX, "Categories=%s\n", mfx->uiapplication->categories); - fwrite(buf, 1, strlen(buf), file); - } - - if(mfx->uiapplication->taskmanage && !strcasecmp(mfx->uiapplication->taskmanage, "False")) { - snprintf(buf, BUFMAX, "X-TIZEN-TaskManage=False\n"); - fwrite(buf, 1, strlen(buf), file); - } - - if(mfx->uiapplication->enabled && !strcasecmp(mfx->uiapplication->enabled, "False")) { - snprintf(buf, BUFMAX, "X-TIZEN-Enabled=False\n"); - fwrite(buf, 1, strlen(buf), file); - } - - if(mfx->uiapplication->hwacceleration) { - snprintf(buf, BUFMAX, "Hw-Acceleration=%s\n", mfx->uiapplication->hwacceleration); - fwrite(buf, 1, strlen(buf), file); - } - - if(mfx->uiapplication->multiple && !strcasecmp(mfx->uiapplication->multiple, "True")) { - snprintf(buf, BUFMAX, "X-TIZEN-Multiple=True\n"); - fwrite(buf, 1, strlen(buf), file); - } - - if(mfx->uiapplication->extraid) { - snprintf(buf, BUFMAX, "X-TIZEN-PackageID=%s\n", mfx->uiapplication->extraid); - fwrite(buf, 1, strlen(buf), file); - } - - if(mfx->removable && !strcasecmp(mfx->removable, "False")) { - snprintf(buf, BUFMAX, "X-TIZEN-Removable=False\n"); - fwrite(buf, 1, strlen(buf), file); - } - - if(mfx->type) { - snprintf(buf, BUFMAX, "X-TIZEN-PackageType=%s\n", mfx->type); - fwrite(buf, 1, strlen(buf), file); - } - - snprintf(buf, BUFMAX, "X-TIZEN-PkgID=%s\n", mfx->package); - fwrite(buf, 1, strlen(buf), file); - - -// snprintf(buf, BUFMAX, "X-TIZEN-PackageType=rpm\n"); -// fwrite(buf, 1, strlen(buf), file); - - - if(mfx->uiapplication->appsvc) { - snprintf(buf, BUFMAX, "X-TIZEN-Svc="); - DBG("buf[%s]\n", buf); - - - uiapplication_x *up = mfx->uiapplication; - appsvc_x *asvc = NULL; - operation_x *op = NULL; - mime_x *mi = NULL; - uri_x *ui = NULL; - subapp_x *sub = NULL; - const char *operation = NULL; - const char *mime = NULL; - const char *uri = NULL; - const char *subapp = NULL; - int i = 0; - - - asvc = up->appsvc; - while(asvc != NULL) { - op = asvc->operation; - while(op != NULL) { - if (op) - operation = op->name; - mi = asvc->mime; - - do - { - if (mi) - mime = mi->name; - sub = asvc->subapp; - do - { - if (sub) - subapp = sub->name; - ui = asvc->uri; - do - { - if (ui) - uri = ui->name; - - if(i++ > 0) { - strncpy(buftemp, buf, BUFMAX); - snprintf(buf, BUFMAX, "%s;", buftemp); - } - - - strncpy(buftemp, buf, BUFMAX); - snprintf(buf, BUFMAX, "%s%s|%s|%s|%s", buftemp, operation?operation:"NULL", uri?uri:"NULL", mime?mime:"NULL", subapp?subapp:"NULL"); - DBG("buf[%s]\n", buf); - - if (ui) - ui = ui->next; - uri = NULL; - } while(ui != NULL); - if (sub) - sub = sub->next; - subapp = NULL; - }while(sub != NULL); - if (mi) - mi = mi->next; - mime = NULL; - }while(mi != NULL); - if (op) - op = op->next; - operation = NULL; - } - asvc = asvc->next; - } - - - fwrite(buf, 1, strlen(buf), file); - -// strncpy(buftemp, buf, BUFMAX); -// snprintf(buf, BUFMAX, "%s\n", buftemp); -// fwrite(buf, 1, strlen(buf), file); - } - - if(mfx->uiapplication->appcontrol) { - snprintf(buf, BUFMAX, "X-TIZEN-Svc="); - DBG("buf[%s]\n", buf); - - uiapplication_x *up = mfx->uiapplication; - appcontrol_x *acontrol = NULL; - operation_x *op = NULL; - mime_x *mi = NULL; - uri_x *ui = NULL; - subapp_x *sub = NULL; - const char *operation = NULL; - const char *mime = NULL; - const char *uri = NULL; - const char *subapp = NULL; - int i = 0; - - acontrol = up->appcontrol; - while(acontrol != NULL) { - op = acontrol->operation; - while(op != NULL) { - if (op) - operation = op->name; - mi = acontrol->mime; - - do - { - if (mi) - mime = mi->name; - sub = acontrol->subapp; - do - { - if (sub) - subapp = sub->name; - ui = acontrol->uri; - do - { - if (ui) - uri = ui->name; - - if(i++ > 0) { - strncpy(buftemp, buf, BUFMAX); - snprintf(buf, BUFMAX, "%s;", buftemp); - } - - strncpy(buftemp, buf, BUFMAX); - snprintf(buf, BUFMAX, "%s%s|%s|%s|%s", buftemp, operation?operation:"NULL", uri?uri:"NULL", mime?mime:"NULL", subapp?subapp:"NULL"); - DBG("buf[%s]\n", buf); - - if (ui) - ui = ui->next; - uri = NULL; - } while(ui != NULL); - if (sub) - sub = sub->next; - subapp = NULL; - }while(sub != NULL); - if (mi) - mi = mi->next; - mime = NULL; - }while(mi != NULL); - if (op) - op = op->next; - operation = NULL; - } - acontrol = acontrol->next; - } - - - fwrite(buf, 1, strlen(buf), file); - -// strncpy(buftemp, buf, BUFMAX); -// snprintf(buf, BUFMAX, "%s\n", buftemp); -// fwrite(buf, 1, strlen(buf), file); + _LOGD("No Manifest element found\n"); + return -1; } - - fflush(file); - fd = fileno(file); - fsync(fd); - fclose(file); - - __ail_change_info(AIL_INSTALL, mfx->uiapplication->appid); } - - free(buf); - free(buftemp); - - return 0; + return ret; } -static int __ps_remove_nativeapp_desktop(manifest_x *mfx) +static char* __convert_to_system_locale(const char *mlocale) { - char filepath[PKG_STRING_LEN_MAX] = ""; - int ret = 0; - uiapplication_x *uiapplication = mfx->uiapplication; - - for(; uiapplication; uiapplication=uiapplication->next) { - snprintf(filepath, sizeof(filepath),"%s%s.desktop", DESKTOP_RW_PATH, uiapplication->appid); - - __ail_change_info(AIL_REMOVE, uiapplication->appid); - - ret = remove(filepath); - if (ret <0) - return -1; + if (mlocale == NULL) + return NULL; + char *locale = NULL; + locale = (char *)calloc(1, 6); + if (!locale) { + _LOGE("Malloc Failed\n"); + return NULL; } - return 0; + strncpy(locale, mlocale, 2); + strncat(locale, "_", 1); + locale[3] = toupper(mlocale[3]); + locale[4] = toupper(mlocale[4]); + return locale; } -#define LIBAPPSVC_PATH "/usr/lib/libappsvc.so.0" +#define LIBAPPSVC_PATH LIB_PATH "/libappsvc.so.0" -static int __ps_remove_appsvc_db(manifest_x *mfx) +static int __ps_remove_appsvc_db(manifest_x *mfx, uid_t uid) { void *lib_handle = NULL; - int (*appsvc_operation) (const char *); + int (*appsvc_operation) (const char *, uid_t); int ret = 0; uiapplication_x *uiapplication = mfx->uiapplication; if ((lib_handle = dlopen(LIBAPPSVC_PATH, RTLD_LAZY)) == NULL) { - DBGE("dlopen is failed LIBAIL_PATH[%s]\n", LIBAPPSVC_PATH); + _LOGE("dlopen is failed LIBAPPSVC_PATH[%s]\n", LIBAPPSVC_PATH); goto END; } if ((appsvc_operation = dlsym(lib_handle, "appsvc_unset_defapp")) == NULL || dlerror() != NULL) { - DBGE("can not find symbol \n"); + _LOGE("can not find symbol \n"); goto END; } for(; uiapplication; uiapplication=uiapplication->next) { - ret = appsvc_operation(uiapplication->appid); + ret = appsvc_operation(uiapplication->appid, uid); if (ret <0) - DBGE("can not operation symbol \n"); + _LOGE("can not operation symbol \n"); } END: @@ -4062,14 +3840,14 @@ END: return ret; } -#define PRELOAD_PACKAGE_LIST "/usr/etc/package-manager/preload/preload_list.txt" -static int __add_preload_info(manifest_x * mfx, const char *manifest) +#define PRELOAD_PACKAGE_LIST SYSCONFDIR "/package-manager/preload/preload_list.txt" +static int __add_preload_info(manifest_x * mfx, const char *manifest, uid_t uid) { FILE *fp = NULL; char buffer[1024] = { 0 }; int state = 0; - if(strstr(manifest, MANIFEST_RO_PREFIX)) { + if(strstr(manifest, getUserManifestPath(uid))) { free((void *)mfx->readonly); mfx->readonly = strdup("True"); @@ -4079,12 +3857,15 @@ static int __add_preload_info(manifest_x * mfx, const char *manifest) free((void *)mfx->removable); mfx->removable = strdup("False"); + free((void *)mfx->system); + mfx->system = strdup("True"); + return 0; } fp = fopen(PRELOAD_PACKAGE_LIST, "r"); if (fp == NULL) { - DBGE("no preload list\n"); + _LOGE("no preload list\n"); return -1; } @@ -4125,23 +3906,12 @@ static int __add_preload_info(manifest_x * mfx, const char *manifest) return 0; } -static int __check_preload_updated(manifest_x * mfx, const char *manifest) +static int __check_preload_updated(manifest_x * mfx, const char *manifest, uid_t uid) { - char filepath[PKG_STRING_LEN_MAX] = ""; - int ret = 0; - uiapplication_x *uiapplication = mfx->uiapplication; - - if(strstr(manifest, MANIFEST_RO_PREFIX)) { - /* if preload app is updated, then remove previous desktop file on RW*/ - for(; uiapplication; uiapplication=uiapplication->next) { - snprintf(filepath, sizeof(filepath),"%s%s.desktop", DESKTOP_RW_PATH, uiapplication->appid); - ret = remove(filepath); - if (ret <0) - return -1; - } - } else { + if (!strstr(manifest, getUserManifestPath(uid))) { /* if downloaded app is updated, then update tag set true*/ - free((void *)mfx->update); + if (mfx->update) + free((void *)mfx->update); mfx->update = strdup("true"); } @@ -4151,19 +3921,17 @@ static int __check_preload_updated(manifest_x * mfx, const char *manifest) API int pkgmgr_parser_create_desktop_file(manifest_x *mfx) { - int ret = 0; - if (mfx == NULL) { - DBG("Manifest pointer is NULL\n"); - return -1; - } - ret = __ps_make_nativeapp_desktop(mfx, NULL, 0); - if (ret == -1) - DBG("Creating desktop file failed\n"); - else - DBG("Creating desktop file Success\n"); - return ret; + /* desktop file is no longer used */ + return 0; +} + +API int pkgmgr_parser_create_usr_desktop_file(manifest_x *mfx, uid_t uid) +{ + /* desktop file is no longer used */ + return 0; } + API void pkgmgr_parser_free_manifest_xml(manifest_x *mfx) { if (mfx == NULL) @@ -4200,6 +3968,10 @@ API void pkgmgr_parser_free_manifest_xml(manifest_x *mfx) free((void *)mfx->update); mfx->update = NULL; } + if (mfx->system) { + free((void *)mfx->system); + mfx->system = NULL; + } if (mfx->type) { free((void *)mfx->type); mfx->type = NULL; @@ -4244,6 +4016,10 @@ API void pkgmgr_parser_free_manifest_xml(manifest_x *mfx) free((void *)mfx->nodisplay_setting); mfx->nodisplay_setting = NULL; } + if (mfx->api_version) { + free((void *)mfx->api_version); + mfx->api_version = NULL; + } /*Free Icon*/ if (mfx->icon) { @@ -4392,7 +4168,35 @@ API void pkgmgr_parser_free_manifest_xml(manifest_x *mfx) API manifest_x *pkgmgr_parser_process_manifest_xml(const char *manifest) { - DBG("parsing start\n"); + _LOGD("parsing start pkgmgr_parser_process_manifest_xml\n"); + xmlTextReaderPtr reader; + manifest_x *mfx = NULL; + + reader = xmlReaderForFile(manifest, NULL, 0); + if (reader) { + mfx = malloc(sizeof(manifest_x)); + if (mfx) { + memset(mfx, '\0', sizeof(manifest_x)); + if (__process_manifest(reader, mfx, GLOBAL_USER) < 0) { + _LOGD("Parsing Failed\n"); + pkgmgr_parser_free_manifest_xml(mfx); + mfx = NULL; + } else + _LOGD("Parsing Success\n"); + } else { + _LOGD("Memory allocation error\n"); + } + xmlFreeTextReader(reader); + } else { + _LOGD("Unable to create xml reader\n"); + } + return mfx; +} + + +API manifest_x *pkgmgr_parser_usr_process_manifest_xml(const char *manifest, uid_t uid) +{ + _LOGD("parsing start pkgmgr_parser_usr_process_manifest_xml\n"); xmlTextReaderPtr reader; manifest_x *mfx = NULL; @@ -4401,18 +4205,18 @@ API manifest_x *pkgmgr_parser_process_manifest_xml(const char *manifest) mfx = malloc(sizeof(manifest_x)); if (mfx) { memset(mfx, '\0', sizeof(manifest_x)); - if (__process_manifest(reader, mfx) < 0) { - DBG("Parsing Failed\n"); + if (__process_manifest(reader, mfx, uid) < 0) { + _LOGD("Parsing Failed\n"); pkgmgr_parser_free_manifest_xml(mfx); mfx = NULL; } else - DBG("Parsing Success\n"); + _LOGD("Parsing Success\n"); } else { - DBG("Memory allocation error\n"); + _LOGD("Memory allocation error\n"); } xmlFreeTextReader(reader); } else { - DBG("Unable to create xml reader\n"); + _LOGD("Unable to create xml reader\n"); } return mfx; } @@ -4421,46 +4225,78 @@ API manifest_x *pkgmgr_parser_process_manifest_xml(const char *manifest) API int pkgmgr_parser_parse_manifest_for_installation(const char *manifest, char *const tagv[]) { - char *temp[] = {"shortcut-list", "livebox", "account", "notifications", "privileges", "ime", "font", NULL}; - if (manifest == NULL) { - DBG("argument supplied is NULL\n"); - return PMINFO_R_EINVAL; - } - DBG("parsing manifest for installation: %s\n", manifest); +// char *temp[] = {"shortcut-list", "livebox", "account", "notifications", "privileges", "ime", "font", NULL}; + retvm_if(manifest == NULL, PMINFO_R_ERROR, "argument supplied is NULL"); + _LOGD("parsing manifest for installation: %s\n", manifest); + manifest_x *mfx = NULL; int ret = -1; - char roxml_check[PKG_STRING_LEN_MAX] = {'\0'}; xmlInitParser(); mfx = pkgmgr_parser_process_manifest_xml(manifest); - DBG("Parsing Finished\n"); - if (mfx == NULL) - return PMINFO_R_ERROR; + retvm_if(mfx == NULL, PMINFO_R_ERROR, "argument supplied is NULL"); + + _LOGD("Parsing Finished\n"); - __streamFile(manifest, ACTION_INSTALL, temp, mfx->package); - __add_preload_info(mfx, manifest); - DBG("Added preload infomation\n"); +// __streamFile(manifest, ACTION_INSTALL, temp, mfx->package); + __add_preload_info(mfx, manifest, GLOBAL_USER); + + _LOGD("Added preload infomation\n"); __ps_process_tag(mfx, tagv); ret = pkgmgr_parser_insert_manifest_info_in_db(mfx); + retvm_if(ret == PMINFO_R_ERROR, PMINFO_R_ERROR, "DB Insert failed"); + + _LOGD("DB Insert Success\n"); + + __ps_process_tag_parser(mfx, manifest, ACTION_INSTALL); + ret = __ps_process_metadata_parser(mfx, ACTION_INSTALL); if (ret == -1) - DBG("DB Insert failed\n"); - else - DBG("DB Insert Success\n"); + _LOGD("Creating metadata parser failed\n"); - ret = __ps_process_mdparser(mfx, ACTION_INSTALL); + ret = __ps_process_category_parser(mfx, ACTION_INSTALL); if (ret == -1) - DBG("Creating metadata parser failed\n"); + _LOGD("Creating category parser failed\n"); + + pkgmgr_parser_free_manifest_xml(mfx); + _LOGD("Free Done\n"); + xmlCleanupParser(); + + return PMINFO_R_OK; +} +API int pkgmgr_parser_parse_usr_manifest_for_installation(const char *manifest, uid_t uid, char *const tagv[]) +{ +// char *temp[] = {"shortcut-list", "livebox", "account", "notifications", "privileges", "ime", "font", NULL}; + retvm_if(manifest == NULL, PMINFO_R_ERROR, "argument supplied is NULL"); + _LOGD("parsing manifest for installation: %s\n", manifest); + manifest_x *mfx = NULL; + int ret = -1; + + xmlInitParser(); + mfx = pkgmgr_parser_usr_process_manifest_xml(manifest, uid); + retvm_if(mfx == NULL, PMINFO_R_ERROR, "argument supplied is NULL"); + + _LOGD("Parsing Finished\n"); +// __streamFile(manifest, ACTION_INSTALL, temp, mfx->package); + + __ps_process_tag(mfx, tagv); - ret = __ps_make_nativeapp_desktop(mfx, NULL, 0); + ret = pkgmgr_parser_insert_manifest_info_in_usr_db(mfx, uid); + retvm_if(ret == PMINFO_R_ERROR, PMINFO_R_ERROR, "DB Insert failed"); + + _LOGD("DB Insert Success\n"); + + __ps_process_tag_parser(mfx, manifest, ACTION_INSTALL); + ret = __ps_process_metadata_parser(mfx, ACTION_INSTALL); if (ret == -1) - DBG("Creating desktop file failed\n"); - else - DBG("Creating desktop file Success\n"); + _LOGD("Creating metadata parser failed\n"); + ret = __ps_process_category_parser(mfx, ACTION_INSTALL); + if (ret == -1) + _LOGD("Creating category parser failed\n"); pkgmgr_parser_free_manifest_xml(mfx); - DBG("Free Done\n"); + _LOGD("Free Done\n"); xmlCleanupParser(); return PMINFO_R_OK; @@ -4468,46 +4304,50 @@ API int pkgmgr_parser_parse_manifest_for_installation(const char *manifest, char API int pkgmgr_parser_parse_manifest_for_upgrade(const char *manifest, char *const tagv[]) { - char *temp[] = {"shortcut-list", "livebox", "account", "notifications", "privileges", "ime", "font", NULL}; - if (manifest == NULL) { - DBG("argument supplied is NULL\n"); - return PMINFO_R_EINVAL; - } - DBG("parsing manifest for upgradation: %s\n", manifest); +// char *temp[] = {"shortcut-list", "livebox", "account", "notifications", "privileges", "ime", "font", NULL}; + retvm_if(manifest == NULL, PMINFO_R_ERROR, "argument supplied is NULL"); + _LOGD("pkgmgr_parser_parse_manifest_for_upgrade parsing manifest for upgradation: %s\n", manifest); manifest_x *mfx = NULL; int ret = -1; bool preload = false; + bool system = false; char *csc_path = NULL; pkgmgrinfo_pkginfo_h handle = NULL; xmlInitParser(); mfx = pkgmgr_parser_process_manifest_xml(manifest); - DBG("Parsing Finished\n"); - if (mfx == NULL) - return PMINFO_R_ERROR; - - __streamFile(manifest, ACTION_UPGRADE, temp, mfx->package); - __add_preload_info(mfx, manifest); - DBG("Added preload infomation\n"); - __check_preload_updated(mfx, manifest); + retvm_if(mfx == NULL, PMINFO_R_ERROR, "argument supplied is NULL"); + + _LOGD("Parsing Finished\n"); +// __streamFile(manifest, ACTION_UPGRADE, temp, mfx->package); + __add_preload_info(mfx, manifest, GLOBAL_USER); + _LOGD("Added preload infomation\n"); + __check_preload_updated(mfx, manifest, GLOBAL_USER); ret = pkgmgrinfo_pkginfo_get_pkginfo(mfx->package, &handle); if (ret != PMINFO_R_OK) - DBG("pkgmgrinfo_pkginfo_get_pkginfo failed\n"); - + _LOGD("pkgmgrinfo_pkginfo_get_pkginfo failed\n"); ret = pkgmgrinfo_pkginfo_is_preload(handle, &preload); if (ret != PMINFO_R_OK) - DBG("pkgmgrinfo_pkginfo_is_preload failed\n"); + _LOGD("pkgmgrinfo_pkginfo_is_preload failed\n"); if (preload) { free((void *)mfx->preload); mfx->preload = strdup("true"); } - ret = pkgmgrinfo_pkginfo_get_csc_path(handle, &csc_path); + ret = pkgmgrinfo_pkginfo_is_system(handle, &system); if (ret != PMINFO_R_OK) - DBG("pkgmgrinfo_pkginfo_get_csc_path failed\n"); + _LOGD("pkgmgrinfo_pkginfo_is_system failed\n"); + if (system) { + free((void *)mfx->system); + mfx->system = strdup("true"); + } + ret = pkgmgrinfo_pkginfo_get_csc_path(handle, &csc_path); + if (ret != PMINFO_R_OK) + _LOGD("pkgmgrinfo_pkginfo_get_csc_path failed\n"); + if (csc_path != NULL) { if (mfx->csc_path) free((void *)mfx->csc_path); @@ -4515,24 +4355,90 @@ API int pkgmgr_parser_parse_manifest_for_upgrade(const char *manifest, char *con } ret = pkgmgr_parser_update_manifest_info_in_db(mfx); - if (ret == -1) - DBG("DB Update failed\n"); - else - DBG("DB Update Success\n"); + retvm_if(ret == PMINFO_R_ERROR, PMINFO_R_ERROR, "DB Insert failed"); - ret = __ps_process_mdparser(mfx, ACTION_UPGRADE); - if (ret == -1) - DBG("Upgrade metadata parser failed\n"); + _LOGD("DB Update Success\n"); - ret = __ps_make_nativeapp_desktop(mfx, manifest, 1); + __ps_process_tag_parser(mfx, manifest, ACTION_UPGRADE); + ret = __ps_process_metadata_parser(mfx, ACTION_UPGRADE); + if (ret == -1){ + _LOGD("Upgrade metadata parser failed\n"); + } + ret = __ps_process_category_parser(mfx, ACTION_UPGRADE); if (ret == -1) - DBG("Creating desktop file failed\n"); - else - DBG("Creating desktop file Success\n"); + _LOGD("Creating category parser failed\n"); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + pkgmgr_parser_free_manifest_xml(mfx); + _LOGD("Free Done\n"); + xmlCleanupParser(); + + return PMINFO_R_OK; +} + +API int pkgmgr_parser_parse_usr_manifest_for_upgrade(const char *manifest, uid_t uid, char *const tagv[]) +{ +// char *temp[] = {"shortcut-list", "livebox", "account", "notifications", "privileges", "ime", "font", NULL}; + retvm_if(manifest == NULL, PMINFO_R_ERROR, "argument supplied is NULL"); + _LOGD(" pkgmgr_parser_parse_usr_manifest_for_upgrade parsing manifest for upgradation: %s\n", manifest); + manifest_x *mfx = NULL; + int ret = -1; + bool preload = false; + bool system = false; + char *csc_path = NULL; + pkgmgrinfo_pkginfo_h handle = NULL; + + xmlInitParser(); + mfx = pkgmgr_parser_usr_process_manifest_xml(manifest, uid); + retvm_if(mfx == NULL, PMINFO_R_ERROR, "argument supplied is NULL"); + + _LOGD("Parsing Finished\n"); + //__streamFile(manifest, ACTION_UPGRADE, temp, mfx->package); + __check_preload_updated(mfx, manifest, uid); + + ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(mfx->package, uid, &handle); + if (ret != PMINFO_R_OK) + _LOGD("pkgmgrinfo_pkginfo_get_pkginfo failed\n"); + ret = pkgmgrinfo_pkginfo_is_preload(handle, &preload); + if (ret != PMINFO_R_OK) + _LOGD("pkgmgrinfo_pkginfo_is_preload failed\n"); + + if (preload) { + free((void *)mfx->preload); + mfx->preload = strdup("true"); + } + + ret = pkgmgrinfo_pkginfo_is_system(handle, &system); + if (ret != PMINFO_R_OK) + _LOGD("pkgmgrinfo_pkginfo_is_system failed\n"); + + if (system) { + free((void *)mfx->system); + mfx->system = strdup("true"); + } + + ret = pkgmgrinfo_pkginfo_get_csc_path(handle, &csc_path); + if (ret != PMINFO_R_OK) + _LOGD("pkgmgrinfo_pkginfo_get_csc_path failed\n"); + if (csc_path != NULL) { + if (mfx->csc_path) + free((void *)mfx->csc_path); + mfx->csc_path = strdup(csc_path); + } + + ret = pkgmgr_parser_update_manifest_info_in_usr_db(mfx, uid); + retvm_if(ret == PMINFO_R_ERROR, PMINFO_R_ERROR, "DB Insert failed"); + _LOGD("DB Update Success\n"); + __ps_process_tag_parser(mfx, manifest, ACTION_UPGRADE); + ret = __ps_process_metadata_parser(mfx, ACTION_UPGRADE); + if (ret == -1) + _LOGD("Upgrade metadata parser failed\n"); + ret = __ps_process_category_parser(mfx, ACTION_UPGRADE); + if (ret == -1) + _LOGD("Creating category parser failed\n"); pkgmgrinfo_pkginfo_destroy_pkginfo(handle); pkgmgr_parser_free_manifest_xml(mfx); - DBG("Free Done\n"); + _LOGD("Free Done\n"); xmlCleanupParser(); return PMINFO_R_OK; @@ -4540,48 +4446,85 @@ API int pkgmgr_parser_parse_manifest_for_upgrade(const char *manifest, char *con API int pkgmgr_parser_parse_manifest_for_uninstallation(const char *manifest, char *const tagv[]) { - char *temp[] = {"shortcut-list", "livebox", "account", "notifications", "privileges", "ime", "font", NULL}; - if (manifest == NULL) { - DBG("argument supplied is NULL\n"); - return PMINFO_R_EINVAL; - } - DBG("parsing manifest for uninstallation: %s\n", manifest); +// char *temp[] = {"shortcut-list", "livebox", "account", "notifications", "privileges", "ime", "font", NULL}; + retvm_if(manifest == NULL, PMINFO_R_ERROR, "argument supplied is NULL"); + _LOGD("parsing manifest for uninstallation: %s\n", manifest); + manifest_x *mfx = NULL; int ret = -1; xmlInitParser(); mfx = pkgmgr_parser_process_manifest_xml(manifest); - DBG("Parsing Finished\n"); - if (mfx == NULL) - return PMINFO_R_ERROR; - - __streamFile(manifest, ACTION_UNINSTALL, temp, mfx->package); - __add_preload_info(mfx, manifest); - DBG("Added preload infomation\n"); + retvm_if(mfx == NULL, PMINFO_R_ERROR, "argument supplied is NULL"); + + _LOGD("Parsing Finished\n"); + +// __streamFile(manifest, ACTION_UNINSTALL, temp, mfx->package); + __ps_process_tag_parser(mfx, manifest, ACTION_UNINSTALL); + + __add_preload_info(mfx, manifest, GLOBAL_USER); + _LOGD("Added preload infomation\n"); - ret = __ps_process_mdparser(mfx, ACTION_UNINSTALL); + ret = __ps_process_metadata_parser(mfx, ACTION_UNINSTALL); if (ret == -1) - DBG("Removing metadata parser failed\n"); + _LOGD("Removing metadata parser failed\n"); + + ret = __ps_process_category_parser(mfx, ACTION_UNINSTALL); + if (ret == -1) + _LOGD("Creating category parser failed\n"); ret = pkgmgr_parser_delete_manifest_info_from_db(mfx); if (ret == -1) - DBG("DB Delete failed\n"); + _LOGD("DB Delete failed\n"); else - DBG("DB Delete Success\n"); + _LOGD("DB Delete Success\n"); + + pkgmgr_parser_free_manifest_xml(mfx); + _LOGD("Free Done\n"); + xmlCleanupParser(); + + return PMINFO_R_OK; +} + + +API int pkgmgr_parser_parse_usr_manifest_for_uninstallation(const char *manifest, uid_t uid, char *const tagv[]) +{ +// char *temp[] = {"shortcut-list", "livebox", "account", "notifications", "privileges", "ime", "font", NULL}; + retvm_if(manifest == NULL, PMINFO_R_ERROR, "argument supplied is NULL"); + _LOGD("parsing manifest for uninstallation: %s\n", manifest); + + manifest_x *mfx = NULL; + int ret = -1; + xmlInitParser(); + mfx = pkgmgr_parser_usr_process_manifest_xml(manifest, uid); + retvm_if(mfx == NULL, PMINFO_R_ERROR, "argument supplied is NULL"); + + _LOGD("Parsing Finished\n"); + +// __streamFile(manifest, ACTION_UNINSTALL, temp, mfx->package); + __ps_process_tag_parser(mfx, manifest, ACTION_UNINSTALL); + + ret = __ps_process_metadata_parser(mfx, ACTION_UNINSTALL); + if (ret == -1) + _LOGD("Removing metadata parser failed\n"); + + ret = __ps_process_category_parser(mfx, ACTION_UNINSTALL); + if (ret == -1) + _LOGD("Creating category parser failed\n"); - ret = __ps_remove_nativeapp_desktop(mfx); + ret = pkgmgr_parser_delete_manifest_info_from_usr_db(mfx, uid); if (ret == -1) - DBG("Removing desktop file failed\n"); + _LOGD("DB Delete failed\n"); else - DBG("Removing desktop file Success\n"); + _LOGD("DB Delete Success\n"); - ret = __ps_remove_appsvc_db(mfx); + ret = __ps_remove_appsvc_db(mfx, uid); if (ret == -1) - DBG("Removing appsvc_db failed\n"); + _LOGD("Removing appsvc_db failed\n"); else - DBG("Removing appsvc_db Success\n"); + _LOGD("Removing appsvc_db Success\n"); pkgmgr_parser_free_manifest_xml(mfx); - DBG("Free Done\n"); + _LOGD("Free Done\n"); xmlCleanupParser(); return PMINFO_R_OK; @@ -4592,9 +4535,20 @@ API int pkgmgr_parser_parse_manifest_for_preload() return pkgmgr_parser_update_preload_info_in_db(); } +API int pkgmgr_parser_parse_usr_manifest_for_preload(uid_t uid) +{ + return pkgmgr_parser_update_preload_info_in_usr_db(uid); +} + + +API char *pkgmgr_parser_get_usr_manifest_file(const char *pkgid, uid_t uid) +{ + return __pkgid_to_manifest(pkgid, uid); +} + API char *pkgmgr_parser_get_manifest_file(const char *pkgid) { - return __pkgid_to_manifest(pkgid); + return __pkgid_to_manifest(pkgid, GLOBAL_USER); } API int pkgmgr_parser_run_parser_for_installation(xmlDocPtr docPtr, const char *tag, const char *pkgid) @@ -4612,12 +4566,12 @@ API int pkgmgr_parser_run_parser_for_uninstallation(xmlDocPtr docPtr, const char return __ps_run_parser(docPtr, tag, ACTION_UNINSTALL, pkgid); } -#define SCHEMA_FILE "/usr/etc/package-manager/preload/manifest.xsd" +#define SCHEMA_FILE SYSCONFDIR "/package-manager/preload/manifest.xsd" #if 1 API int pkgmgr_parser_check_manifest_validation(const char *manifest) { if (manifest == NULL) { - DBGE("manifest file is NULL\n"); + _LOGE("manifest file is NULL\n"); return PMINFO_R_EINVAL; } int ret = -1; @@ -4626,29 +4580,29 @@ API int pkgmgr_parser_check_manifest_validation(const char *manifest) xmlSchemaPtr xschema; ctx = xmlSchemaNewParserCtxt(SCHEMA_FILE); if (ctx == NULL) { - DBGE("xmlSchemaNewParserCtxt() Failed\n"); + _LOGE("xmlSchemaNewParserCtxt() Failed\n"); return PMINFO_R_ERROR; } xschema = xmlSchemaParse(ctx); if (xschema == NULL) { - DBGE("xmlSchemaParse() Failed\n"); + _LOGE("xmlSchemaParse() Failed\n"); return PMINFO_R_ERROR; } vctx = xmlSchemaNewValidCtxt(xschema); if (vctx == NULL) { - DBGE("xmlSchemaNewValidCtxt() Failed\n"); + _LOGE("xmlSchemaNewValidCtxt() Failed\n"); return PMINFO_R_ERROR; } xmlSchemaSetValidErrors(vctx, (xmlSchemaValidityErrorFunc) fprintf, (xmlSchemaValidityWarningFunc) fprintf, stderr); ret = xmlSchemaValidateFile(vctx, manifest, 0); if (ret == -1) { - DBGE("xmlSchemaValidateFile() failed\n"); + _LOGE("xmlSchemaValidateFile() failed\n"); return PMINFO_R_ERROR; } else if (ret == 0) { - DBGE("Manifest is Valid\n"); + _LOGE("Manifest is Valid\n"); return PMINFO_R_OK; } else { - DBGE("Manifest Validation Failed with error code %d\n", ret); + _LOGE("Manifest Validation Failed with error code %d\n", ret); return PMINFO_R_ERROR; } return PMINFO_R_OK; @@ -4665,7 +4619,7 @@ API int pkgmgr_parser_check_manifest_validation(const char *manifest) switch (pid) { case -1: - DBGE("fork failed\n"); + _LOGE("fork failed\n"); return -1; case 0: /* child */ @@ -4680,7 +4634,7 @@ API int pkgmgr_parser_check_manifest_validation(const char *manifest) if (execl("/usr/bin/xmllint", "xmllint", manifest, "--schema", SCHEMA_FILE, NULL) < 0) { - DBGE("execl error\n"); + _LOGE("execl error\n"); } _exit(100); @@ -4694,7 +4648,7 @@ API int pkgmgr_parser_check_manifest_validation(const char *manifest) if (err < 0) { if (errno == EINTR) continue; - DBGE("waitpid failed\n"); + _LOGE("waitpid failed\n"); return -1; } }