add api and db table to support data-control api 13/33313/2
authorJiwoong Im <jiwoong.im@samsung.com>
Thu, 8 Jan 2015 08:32:39 +0000 (17:32 +0900)
committerJiwoong Im <jiwoong.im@samsung.com>
Fri, 9 Jan 2015 07:34:17 +0000 (16:34 +0900)
- 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>
include/pkgmgr-info.h
parser/manifest.xsd.in
parser/pkgmgr_parser.c
parser/pkgmgr_parser.h
parser/pkgmgr_parser_db.c
src/pkgmgr-info.c

index 4534190..bbfd423 100755 (executable)
@@ -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
index df8240b..7fac267 100755 (executable)
           <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"/>
index 7e335a2..2fa8996 100755 (executable)
@@ -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");
index 8f7b82c..4751ed8 100755 (executable)
@@ -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;
index c8819a9..a4f5913 100755 (executable)
@@ -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) {
index 8b7335b..21642f1 100755 (executable)
@@ -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)
 {