From aecd745dec0bea64ec9bb4f9943ea95d845fe330 Mon Sep 17 00:00:00 2001 From: Jiwoong Im Date: Thu, 8 Jan 2015 17:32:39 +0900 Subject: [PATCH] add api and db table to support data-control api - Add getter api for datacontrol. pkgmgrinfo_appinfo_get_datacontrol_info pkgmgrinfo_appinfo_get_datacontrol_appid - Add datacontrol table to parse DB. Change-Id: Ib930f0ad61f594bc5e67ad66ee6f95b7218481e8 Signed-off-by: Jiwoong Im --- include/pkgmgr-info.h | 36 +++++++++++++++++++++++ parser/manifest.xsd.in | 8 +++++ parser/pkgmgr_parser.c | 63 ++++++++++----------------------------- parser/pkgmgr_parser.h | 4 ++- parser/pkgmgr_parser_db.c | 68 ++++++++++++++++++++++++++++++++++++++++-- src/pkgmgr-info.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 202 insertions(+), 52 deletions(-) diff --git a/include/pkgmgr-info.h b/include/pkgmgr-info.h index 4534190..bbfd423 100755 --- a/include/pkgmgr-info.h +++ b/include/pkgmgr-info.h @@ -3160,6 +3160,42 @@ static int get_app_submode_mainid(const char *appid) int pkgmgrinfo_appinfo_get_submode_mainid(pkgmgrinfo_appinfo_h handle, char **submode_mainid); /** + * @fn int pkgmgrinfo_appinfo_get_datacontrol_info(const char *providerid, const char *type, char **appid, char **access); + * @brief This API gets the datacontrol info + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] providerid pointer to the providerid of dataconltrol. + * @param[in] type pointer to the type of dataconltrol. + * @param[out] appid pointer to hold appid, need to free after using + * @param[out] access pointer to hold access, need to free after using + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @endcode + */ +int pkgmgrinfo_appinfo_get_datacontrol_info(const char *providerid, const char *type, char **appid, char **access); + +/** + * @fn int pkgmgrinfo_appinfo_get_datacontrol_appid(const char *providerid, char **appid); + * @brief This API gets the appid of datacontrol + * + * @par This API is for package-manager client application + * @par Sync (or) Async : Synchronous API + * + * @param[in] providerid pointer to the providerid of dataconltrol. + * @param[out] appid pointer to hold appid, need to free after using + * @return 0 if success, error code(<0) if fail + * @retval PMINFO_R_OK success + * @retval PMINFO_R_EINVAL invalid argument + * @retval PMINFO_R_ERROR internal error + * @endcode + */ +int pkgmgrinfo_appinfo_get_datacontrol_appid(const char *providerid, char **appid); + +/** * @fn int pkgmgrinfo_appinfo_foreach_permission(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_permission_list_cb permission_func, void *user_data); * @brief This API gets the list of permission for a particular application diff --git a/parser/manifest.xsd.in b/parser/manifest.xsd.in index df8240b..7fac267 100755 --- a/parser/manifest.xsd.in +++ b/parser/manifest.xsd.in @@ -125,6 +125,7 @@ + @@ -286,6 +287,13 @@ + + + + + + + diff --git a/parser/pkgmgr_parser.c b/parser/pkgmgr_parser.c index 7e335a2..2fa8996 100755 --- a/parser/pkgmgr_parser.c +++ b/parser/pkgmgr_parser.c @@ -1703,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; @@ -3324,45 +3322,14 @@ static int __ps_process_capability(xmlTextReaderPtr reader, capability_x *capabi 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) { - _LOGD("xmlTextReaderConstName value is NULL\n"); - return -1; - } - - if (!strcmp(ASCII(node), "capability")) { - capability_x *capability = malloc(sizeof(capability_x)); - if (capability == NULL) { - _LOGD("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) { - _LOGD("Processing datacontrol failed\n"); - return ret; - } - } - - if (datacontrol->capability) { - LISTHEAD(datacontrol->capability, tmp1); - datacontrol->capability = tmp1; - } + if (xmlTextReaderGetAttribute(reader, XMLCHAR("providerid"))) + datacontrol->providerid = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("providerid"))); + if (xmlTextReaderGetAttribute(reader, XMLCHAR("access"))) + datacontrol->access = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("access"))); + if (xmlTextReaderGetAttribute(reader, XMLCHAR("type"))) + datacontrol->type = ASCII(xmlTextReaderGetAttribute(reader, XMLCHAR("type"))); - return ret; + return 0; } static int __ps_process_uiapplication(xmlTextReaderPtr reader, uiapplication_x *uiapplication, uid_t uid) @@ -3845,7 +3812,7 @@ static int __ps_process_serviceapplication(xmlTextReaderPtr reader, serviceappli 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) { _LOGD("Malloc Failed\n"); diff --git a/parser/pkgmgr_parser.h b/parser/pkgmgr_parser.h index 8f7b82c..4751ed8 100755 --- a/parser/pkgmgr_parser.h +++ b/parser/pkgmgr_parser.h @@ -355,7 +355,8 @@ typedef struct capability_x { typedef struct datacontrol_x { const char *providerid; - struct capability_x *capability; + const char *access; + const char *type; struct datacontrol_x *prev; struct datacontrol_x *next; } datacontrol_x; @@ -397,6 +398,7 @@ typedef struct uiapplication_x { struct launchconditions_x *launchconditions; struct notification_x *notification; struct datashare_x *datashare; + struct datacontrol_x *datacontrol; struct uiapplication_x *prev; struct uiapplication_x *next; } uiapplication_x; diff --git a/parser/pkgmgr_parser_db.c b/parser/pkgmgr_parser_db.c index c8819a9..a4f5913 100755 --- a/parser/pkgmgr_parser_db.c +++ b/parser/pkgmgr_parser_db.c @@ -249,6 +249,15 @@ sqlite3 *pkgmgr_cert_db; "dist2_signer_cert integer, " \ "PRIMARY KEY(package)) " +#define QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL "create table if not exists package_app_data_control " \ + "(app_id text not null, " \ + "provider_id text not null, " \ + "access text not null, " \ + "type text not null, " \ + "PRIMARY KEY(app_id, provider_id, access, type) " \ + "FOREIGN KEY(app_id) " \ + "REFERENCES package_app_info(app_id) " \ + "ON DELETE CASCADE)" static int __insert_uiapplication_info(manifest_x *mfx); static int __insert_serviceapplication_info(manifest_x *mfx); @@ -264,6 +273,7 @@ static int __insert_uiapplication_share_allowed_info(manifest_x *mfx); static int __insert_serviceapplication_share_allowed_info(manifest_x *mfx); static int __insert_uiapplication_share_request_info(manifest_x *mfx); static int __insert_serviceapplication_share_request_info(manifest_x *mfx); +static int __insert_serviceapplication_datacontrol_info(manifest_x *mfx); static void __insert_serviceapplication_locale_info(gpointer data, gpointer userdata); static void __insert_uiapplication_locale_info(gpointer data, gpointer userdata); static void __insert_pkglocale_info(gpointer data, gpointer userdata); @@ -1481,7 +1491,38 @@ static int __insert_serviceapplication_appsvc_info(manifest_x *mfx) return 0; } +static int __insert_serviceapplication_datacontrol_info(manifest_x *mfx) +{ + serviceapplication_x *sp = mfx->serviceapplication; + datacontrol_x *dc = NULL; + int ret = -1; + char query[MAX_QUERY_LEN] = {'\0'}; + while(sp != NULL) + { + dc = sp->datacontrol; + while(dc != NULL) + { + snprintf(query, MAX_QUERY_LEN, + "insert into package_app_data_control(app_id, provider_id, access, type) " \ + "values('%s', '%s', '%s', '%s')",\ + mfx->serviceapplication->appid, + dc->providerid, + dc->access, + dc->type); + + ret = __exec_query(query); + if (ret == -1) { + _LOGD("Package ServiceApp Data Control DB Insert Failed\n"); + return -1; + } + memset(query, '\0', MAX_QUERY_LEN); + dc = dc->next; + } + sp = sp->next; + } + return 0; +} static int __insert_serviceapplication_share_request_info(manifest_x *mfx) { @@ -1697,9 +1738,11 @@ static int __insert_manifest_info_in_db(manifest_x *mfx) pvs = pvs->next; } - ret = __insert_ui_mainapp_info(mfx); - if (ret == -1) - return -1; + if (up != NULL) { + ret = __insert_ui_mainapp_info(mfx); + if (ret == -1) + return -1; + } /*Insert the package locale*/ pkglocale = __create_locale_list(pkglocale, lbl, lcn, icn, dcn, ath); @@ -1849,6 +1892,11 @@ static int __insert_manifest_info_in_db(manifest_x *mfx) if (ret == -1) return -1; + /*Insert in the package_app_data_control DB*/ + ret = __insert_serviceapplication_datacontrol_info(mfx); + if (ret == -1) + return -1; + return 0; } @@ -1905,6 +1953,9 @@ static int __delete_subpkg_info_from_db(char *appid) ret = __delete_appinfo_from_db("package_app_share_request", appid); if (ret < 0) return ret; + ret = __delete_appinfo_from_db("package_app_data_control", appid); + if (ret < 0) + return ret; return 0; } @@ -2006,6 +2057,9 @@ static int __delete_manifest_info_from_db(manifest_x *mfx, uid_t uid) ret = __delete_appinfo_from_db("package_app_share_request", up->appid); if (ret < 0) return ret; + ret = __delete_appinfo_from_db("package_app_data_control", up->appid); + if (ret < 0) + return ret; up = up->next; } @@ -2043,6 +2097,9 @@ static int __delete_manifest_info_from_db(manifest_x *mfx, uid_t uid) ret = __delete_appinfo_from_db("package_app_share_request", sp->appid); if (ret < 0) return ret; + ret = __delete_appinfo_from_db("package_app_data_control", sp->appid); + if (ret < 0) + return ret; sp = sp->next; } @@ -2140,6 +2197,11 @@ int pkgmgr_parser_initialize_db() _LOGD("package app share request DB initialization failed\n"); return ret; } + ret = __initialize_db(pkgmgr_parser_db, QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL); + if (ret == -1) { + _LOGD("package app data control DB initialization failed\n"); + return ret; + } /*Cert DB*/ ret = __initialize_db(pkgmgr_cert_db, QUERY_CREATE_TABLE_PACKAGE_CERT_INFO); if (ret == -1) { diff --git a/src/pkgmgr-info.c b/src/pkgmgr-info.c index 8b7335b..21642f1 100755 --- a/src/pkgmgr-info.c +++ b/src/pkgmgr-info.c @@ -5911,6 +5911,81 @@ API int pkgmgrinfo_appinfo_get_submode_mainid(pkgmgrinfo_appinfo_h handle, char return PMINFO_R_OK; } +API int pkgmgrinfo_appinfo_get_datacontrol_info(const char *providerid, const char *type, char **appid, char **access) +{ + retvm_if(providerid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); + retvm_if(type == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); + retvm_if(appid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + retvm_if(access == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + int ret = PMINFO_R_OK; + char *query = NULL; + sqlite3 *appinfo_db = NULL; + sqlite3_stmt *stmt = NULL; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &appinfo_db, 0); + retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*Start constructing query*/ + query = sqlite3_mprintf("select * from package_app_data_control where providerid=%Q and type=%Q", providerid, type); + + /*prepare query*/ + ret = sqlite3_prepare_v2(appinfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + /*step query*/ + ret = sqlite3_step(stmt); + tryvm_if((ret != SQLITE_ROW) || (ret == SQLITE_DONE), ret = PMINFO_R_ERROR, "No records found"); + + *appid = strdup((char *)sqlite3_column_text(stmt, 0)); + *access = strdup((char *)sqlite3_column_text(stmt, 2)); + + ret = PMINFO_R_OK; + +catch: + sqlite3_free(query); + sqlite3_finalize(stmt); + sqlite3_close(appinfo_db); + return ret; +} + +API int pkgmgrinfo_appinfo_get_datacontrol_appid(const char *providerid, char **appid) +{ + retvm_if(providerid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n"); + retvm_if(appid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n"); + + int ret = PMINFO_R_OK; + char *query = NULL; + sqlite3 *appinfo_db = NULL; + sqlite3_stmt *stmt = NULL; + + /*open db*/ + ret = db_util_open(MANIFEST_DB, &appinfo_db, 0); + retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB); + + /*Start constructing query*/ + query = sqlite3_mprintf("select * from package_app_data_control where providerid=%Q", providerid); + + /*prepare query*/ + ret = sqlite3_prepare_v2(appinfo_db, query, strlen(query), &stmt, NULL); + tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query); + + /*step query*/ + ret = sqlite3_step(stmt); + tryvm_if((ret != SQLITE_ROW) || (ret == SQLITE_DONE), ret = PMINFO_R_ERROR, "No records found"); + + *appid = strdup((char *)sqlite3_column_text(stmt, 0)); + + ret = PMINFO_R_OK; + +catch: + sqlite3_free(query); + sqlite3_finalize(stmt); + sqlite3_close(appinfo_db); + return ret; +} + API int pkgmgrinfo_appinfo_foreach_permission(pkgmgrinfo_appinfo_h handle, pkgmgrinfo_app_permission_list_cb permission_func, void *user_data) { -- 2.7.4