const char *type, uid_t uid, char **appid, bool *is_trusted);
/**
+ * @fn int pkgmgrinfo_appinfo_foreach_datacontrol_privileges(const char *providerid, const char *type,
+ pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data);
+ * @brief This API retrieves the privileges and invokes given callback for each privilege.
+ *
+ * @par This API is for package-manager client application
+ * @par Sync (or) Async : Synchronous API
+ *
+ * @param[in] providerid pointer to the providerid of datacontrol.
+ * @param[in] type pointer to the type of dataconltrol.
+ * @param[in] privilege_func callback function for list
+ * @param[in] user_data user data to be passed to callback function
+ * @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
+ */
+int pkgmgrinfo_appinfo_foreach_datacontrol_privileges(const char *providerid, const char *type,
+ pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data);
+int pkgmgrinfo_appinfo_usr_foreach_datacontrol_privileges(const char *providerid, const char *type,
+ pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data, uid_t uid);
+
+/**
* @fn int pkgmgrinfo_appinfo_get_alias_appid(pkgmgrinfo_appinfo_h handle, char **alias_appid)
* @brief This API gets the alias_appid of the application
*
char *access;
char *type;
char *trusted;
+ GList *privileges;
} datacontrol_x;
typedef struct splashscreen_x {
</xs:element>
<xs:element name="datacontrol">
<xs:complexType>
+ <xs:sequence>
+ <xs:choice maxOccurs="unbounded" minOccurs="0">
+ <xs:element ref="packages:privilege"/>
+ </xs:choice>
+ </xs:sequence>
<xs:attribute name="providerid" type="xs:string"/>
<xs:attribute name="access" type="xs:string"/>
<xs:attribute name="type" type="xs:string"/>
</xs:element>
<xs:element name="datacontrol">
<xs:complexType>
+ <xs:sequence>
+ <xs:choice maxOccurs="unbounded" minOccurs="0">
+ <xs:element ref="packages:privilege"/>
+ </xs:choice>
+ </xs:sequence>
<xs:attribute name="providerid" type="xs:string"/>
<xs:attribute name="access" type="xs:string"/>
<xs:attribute name="type" type="xs:string"/>
QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_ALLOWED, /* ? */
QUERY_CREATE_TABLE_PACKAGE_APP_SHARE_REQUEST, /* ? */
QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL,
+ QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL_PRIVILEGE,
QUERY_CREATE_TABLE_PACKAGE_APP_INFO_FOR_UID,
QUERY_CREATE_TRIGGER_UPDATE_PACKAGE_APP_INFO_FOR_UID,
QUERY_CREATE_TABLE_PACKAGE_APP_SPLASH_SCREEN,
return 0;
}
+static int __insert_app_data_control_privilege_info(sqlite3 *db,
+ datacontrol_x *datacontrol)
+{
+ static const char query[] =
+ "INSERT INTO package_app_data_control_privilege (providerid,"
+ " privilege, type) VALUES (?, ?, ?)";
+
+ int ret;
+ sqlite3_stmt *stmt;
+ int idx;
+ GList *privileges;
+
+ if (datacontrol == NULL)
+ return 0;
+
+ ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+ if (ret != SQLITE_OK) {
+ _LOGE("prepare failed: %s", sqlite3_errmsg(db));
+ return -1;
+ }
+
+ for (privileges = datacontrol->privileges; privileges;
+ privileges = privileges->next) {
+ privilege_x *priv = (privilege_x *)privileges->data;
+ if (priv == NULL)
+ continue;
+
+ idx = 1;
+ __BIND_TEXT(db, stmt, idx++, datacontrol->providerid);
+ __BIND_TEXT(db, stmt, idx++, priv->value);
+ __BIND_TEXT(db, stmt, idx++, datacontrol->type);
+
+ ret = sqlite3_step(stmt);
+ if (ret != SQLITE_DONE) {
+ _LOGE("step failed: %s", sqlite3_errmsg(db));
+ sqlite3_finalize(stmt);
+ return -1;
+ }
+
+ sqlite3_reset(stmt);
+ }
+
+ sqlite3_finalize(stmt);
+ return 0;
+}
+
static int __insert_datacontrol_info(sqlite3 *db, application_x *app)
{
static const char query[] =
return -1;
}
+ if (dc->privileges &&
+ __insert_app_data_control_privilege_info(db, dc)) {
+ sqlite3_finalize(stmt);
+ return -1;
+ }
+
sqlite3_reset(stmt);
}
" FOREIGN KEY(app_id)\n" \
" REFERENCES package_app_info(app_id) ON DELETE CASCADE)"
+#define QUERY_CREATE_TABLE_PACKAGE_APP_DATA_CONTROL_PRIVILEGE \
+ "CREATE TABLE IF NOT EXISTS package_app_data_control_privilege (\n" \
+ " providerid TEXT,\n" \
+ " privilege TEXT NOT NULL,\n" \
+ " type TEXT NOT NULL,\n" \
+ " PRIMARY KEY(providerid, privilege, type)\n" \
+ " FOREIGN KEY(providerid, type)\n" \
+ " REFERENCES package_app_data_control(providerid, type) ON DELETE CASCADE)"
+
#define QUERY_CREATE_TABLE_PACKAGE_APP_INFO_FOR_UID \
"CREATE TABLE IF NOT EXISTS package_app_info_for_uid (\n" \
" app_id TEXT NOT NULL,\n" \
type, _getuid(), appid, is_trusted);
}
+API int pkgmgrinfo_appinfo_usr_foreach_datacontrol_privileges(const char *providerid, const char *type,
+ pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data, uid_t uid)
+{
+ retvm_if(providerid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n");
+ retvm_if(privilege_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL");
+
+ int ret = PMINFO_R_OK;
+ char *query = NULL;
+ sqlite3_stmt *stmt = NULL;
+
+ /*open db*/
+ ret = __open_manifest_db(uid, true);
+ retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB);
+
+ /*Start constructing query*/
+ query = sqlite3_mprintf("SELECT privilege FROM package_app_data_control_privilege "
+ "WHERE providerid=%Q AND type=%Q", providerid, type);
+ tryvm_if(query == NULL, ret = PMINFO_R_ERROR, "Out of memory");
+
+ /*prepare query*/
+ ret = sqlite3_prepare_v2(GET_DB(manifest_db), query, strlen(query), &stmt, NULL);
+ tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query);
+
+ while (sqlite3_step(stmt) == SQLITE_ROW) {
+ char *privilege;
+ privilege = (char *)sqlite3_column_text(stmt, 0);
+ ret = privilege_func(privilege, user_data);
+ if (ret < 0)
+ break;
+ }
+
+ ret = PMINFO_R_OK;
+
+catch:
+ sqlite3_free(query);
+ sqlite3_finalize(stmt);
+ __close_manifest_db();
+ return ret;
+}
+
+API int pkgmgrinfo_appinfo_foreach_datacontrol_privileges(const char *providerid, const char *type,
+ pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data)
+{
+ return pkgmgrinfo_appinfo_usr_foreach_datacontrol_privileges(providerid, type, privilege_func,
+ user_data, _getuid());
+}
API int pkgmgrinfo_appinfo_get_support_mode(pkgmgrinfo_appinfo_h handle, int *support_mode)
{
free((void *)compatibility);
}
-static void __ps_free_datacontrol(gpointer data)
-{
- datacontrol_x *datacontrol = (datacontrol_x *)data;
- if (datacontrol == NULL)
- return;
- if (datacontrol->providerid)
- free((void *)datacontrol->providerid);
- if (datacontrol->access)
- free((void *)datacontrol->access);
- if (datacontrol->type)
- free((void *)datacontrol->type);
- if (datacontrol->trusted)
- free((void *)datacontrol->trusted);
- free((void *)datacontrol);
-}
-
static void __ps_free_appcontrol(gpointer data)
{
appcontrol_x *appcontrol = (appcontrol_x *)data;
free((void *)privilege);
}
+static void __ps_free_datacontrol(gpointer data)
+{
+ datacontrol_x *datacontrol = (datacontrol_x *)data;
+ if (datacontrol == NULL)
+ return;
+ if (datacontrol->providerid)
+ free((void *)datacontrol->providerid);
+ if (datacontrol->access)
+ free((void *)datacontrol->access);
+ if (datacontrol->type)
+ free((void *)datacontrol->type);
+ if (datacontrol->trusted)
+ free((void *)datacontrol->trusted);
+ if (datacontrol->privileges)
+ g_list_free_full(datacontrol->privileges, __ps_free_privilege);
+ free((void *)datacontrol);
+}
+
static void __ps_free_application(gpointer data)
{
application_x *application = (application_x *)data;
"package_app_icon_section_info",
"package_privilege_info",
"package_app_image_info",
+ "package_app_data_control_privilege",
NULL
};