- 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 <jiwoong.im@samsung.com>
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
<xs:element ref="packages:category"/>
<xs:element ref="packages:metadata"/>
<xs:element ref="packages:permission"/>
+ <xs:element ref="packages:datacontrol"/>
</xs:choice>
</xs:sequence>
<xs:attribute name="appid" use="required" type="xs:string"/>
<xs:attribute name="type" type="xs:string"/>
</xs:complexType>
</xs:element>
+ <xs:element name="datacontrol">
+ <xs:complexType>
+ <xs:attribute name="providerid" type="xs:string"/>
+ <xs:attribute name="access" type="xs:string"/>
+ <xs:attribute name="type" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
<xs:element name="operation">
<xs:complexType>
<xs:attribute name="name" use="required"/>
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;
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)
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");
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;
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;
"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);
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);
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)
{
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);
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;
}
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;
}
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;
}
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;
}
_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) {
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)
{