Setting smack labels to User with vconftool option
[platform/core/appfw/ail.git] / src / ail_package.c
index 82af08d..2b30f5a 100755 (executable)
@@ -24,6 +24,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <db-util.h>
+#include <tzplatform_config.h>
 #include <vconf.h>
 #include "ail.h"
 #include "ail_private.h"
@@ -37,6 +38,8 @@
 #define LANGUAGE_LENGTH 2
 #define DEFAULT_LOCALE         "No Locale"
 #define MAX_QUERY_LEN  4096
+#define PKG_SD_PATH tzplatform_mkpath(TZ_SYS_STORAGE, "sdcard/app2sd/")
+#define QUERY_GET_LOCALNAME "select name from localname where package='%s' and locale='%s'"
 
 struct ail_appinfo {
        char **values;
@@ -61,7 +64,7 @@ static int __fallback_locale_cb(void *data, int ncols, char **coltxt, char **col
        return 0;
 }
 
-static int __check_validation_of_qurey_cb(void *data, int ncols, char **coltxt, char **colname)
+static int __check_validation_of_query_cb(void *data, int ncols, char **coltxt, char **colname)
 {
        int *p = (int*)data;
        *p = atoi(coltxt[0]);
@@ -74,7 +77,7 @@ static int __check_app_locale_from_app_localized_info_by_exact(const char *appid
        char query[MAX_QUERY_LEN];
 
        snprintf(query, MAX_QUERY_LEN, "select exists(select locale from localname where package='%s' and locale='%s')", appid, locale);
-       db_exec_sqlite_query(query, __check_validation_of_qurey_cb, (void *)&result_query);
+       db_exec_sqlite_query(query, __check_validation_of_query_cb, (void *)&result_query);
 
        return result_query;
 }
@@ -88,7 +91,7 @@ static int __check_app_locale_from_app_localized_info_by_fallback(const char *ap
        strncpy(lang, locale, LANGUAGE_LENGTH);
 
        snprintf(query, MAX_QUERY_LEN, "select exists(select locale from localname where package='%s' and locale like '%s%s')", appid, lang, wildcard);
-       db_exec_sqlite_query(query, __check_validation_of_qurey_cb, (void *)&result_query);
+       db_exec_sqlite_query(query, __check_validation_of_query_cb, (void *)&result_query);
 
        return result_query;
 }
@@ -166,30 +169,7 @@ static char* __get_app_locale_by_fallback(const char *appid, const char *sysloca
        return  strdup(DEFAULT_LOCALE);
 }
 
-void appinfo_set_stmt(ail_appinfo_h ai, sqlite3_stmt *stmt)
-{
-       ai->stmt = stmt;
-}
-
-ail_appinfo_h appinfo_create(void)
-{
-       ail_appinfo_h ai;
-       ai = calloc(1, sizeof(struct ail_appinfo));
-       retv_if (NULL == ai, NULL);
-       ai->stmt = NULL;
-
-       return ai;
-}
-
-void appinfo_destroy(ail_appinfo_h ai)
-{
-       if (ai) 
-               free(ai);
-}
-
-
-
-static ail_error_e _retrieve_all_column(ail_appinfo_h ai)
+static ail_error_e __retrieve_all_column(ail_appinfo_h ai)
 {
        int i, j;
        ail_error_e err;
@@ -229,6 +209,67 @@ static ail_error_e _retrieve_all_column(ail_appinfo_h ai)
                return AIL_ERROR_OK;
 }
 
+int _appinfo_check_installed_storage(ail_appinfo_h ai)
+{
+       int index = 0;
+       ail_prop_str_e prop = -1;
+       char *pkgid = NULL;
+       char *installed_storage = NULL;
+       char buf[AIL_SQL_QUERY_MAX_LEN] = {'\0'};
+
+       retv_if(!ai, AIL_ERROR_OK);
+
+       if (ai->stmt) {
+               prop = _ail_convert_to_prop_str(AIL_PROP_X_SLP_INSTALLEDSTORAGE_STR);
+               index = sql_get_app_info_idx(prop);
+               if (db_column_str(ai->stmt, index, &installed_storage) < 0){
+                       return AIL_ERROR_OK;
+               }
+
+               prop = _ail_convert_to_prop_str(AIL_PROP_X_SLP_PKGID_STR);
+               index = sql_get_app_info_idx(prop);
+               if (db_column_str(ai->stmt, index, &pkgid) < 0){
+                       return AIL_ERROR_OK;
+               }
+       } else {
+               prop = _ail_convert_to_prop_str(AIL_PROP_X_SLP_INSTALLEDSTORAGE_STR);
+               installed_storage = ai->values[prop];
+
+               prop = _ail_convert_to_prop_str(AIL_PROP_X_SLP_PKGID_STR);
+               pkgid = ai->values[prop];
+       }
+
+       if (strcmp(installed_storage, "installed_external") == 0) {
+               snprintf(buf, AIL_SQL_QUERY_MAX_LEN - 1, "%s%s", PKG_SD_PATH, pkgid);
+               if (access(buf, R_OK) != 0) {
+                       _E("can not access [%s]", buf);
+                       return AIL_ERROR_OK;//tmep, it will be fixed to ::  return AIL_ERROR_FAIL;
+               }
+       }
+
+       return AIL_ERROR_OK;
+}
+
+void appinfo_set_stmt(ail_appinfo_h ai, sqlite3_stmt *stmt)
+{
+       ai->stmt = stmt;
+}
+
+ail_appinfo_h appinfo_create(void)
+{
+       ail_appinfo_h ai;
+       ai = calloc(1, sizeof(struct ail_appinfo));
+       retv_if (NULL == ai, NULL);
+       ai->stmt = NULL;
+
+       return ai;
+}
+
+void appinfo_destroy(ail_appinfo_h ai)
+{
+       if (ai)
+               free(ai);
+}
 
 EXPORT_API ail_error_e ail_package_destroy_appinfo(ail_appinfo_h ai)
 {
@@ -250,6 +291,7 @@ EXPORT_API ail_error_e ail_destroy_appinfo(ail_appinfo_h ai)
 
        free(ai->values);
        free(ai);
+       db_close();
 
        return AIL_ERROR_OK;
 }
@@ -260,6 +302,12 @@ EXPORT_API ail_error_e ail_package_get_appinfo(const char *package, ail_appinfo_
        return ail_get_appinfo(package, ai);
 }
 
+EXPORT_API ail_error_e ail_package_get_usr_appinfo(const char *package, uid_t uid, ail_appinfo_h *ai)
+{
+       return ail_get_usr_appinfo(package, uid, ai);
+}
+
+
 
 EXPORT_API ail_error_e ail_get_appinfo(const char *appid, ail_appinfo_h *ai)
 {
@@ -279,11 +327,14 @@ EXPORT_API ail_error_e ail_get_appinfo(const char *appid, ail_appinfo_h *ai)
        snprintf(query, sizeof(query), "SELECT %s FROM %s WHERE %s",SQL_FLD_APP_INFO, SQL_TBL_APP_INFO, w);
 
        do {
-               ret = db_open(DB_OPEN_RO);
+               ret = db_open(DB_OPEN_RO, GLOBAL_USER);
                if (ret < 0) break;
-
+//is_admin
                ret = db_prepare(query, &stmt);
                if (ret < 0) break;
+//             ret = db_prepare(query, &stmt);
+//             if (ret < 0) break;
+
 
                ret = db_step(stmt);
                if (ret < 0) {
@@ -293,7 +344,13 @@ EXPORT_API ail_error_e ail_get_appinfo(const char *appid, ail_appinfo_h *ai)
 
                (*ai)->stmt = stmt;
 
-               ret = _retrieve_all_column(*ai);
+               ret = _appinfo_check_installed_storage(*ai);
+               if (ret < 0) {
+                       db_finalize((*ai)->stmt);
+                       break;
+               }
+
+               ret = __retrieve_all_column(*ai);
                if (ret < 0) {
                        db_finalize((*ai)->stmt);
                        break;
@@ -311,7 +368,64 @@ EXPORT_API ail_error_e ail_get_appinfo(const char *appid, ail_appinfo_h *ai)
        return ret;
 }
 
+EXPORT_API ail_error_e ail_get_usr_appinfo(const char *appid, uid_t uid, ail_appinfo_h *ai)
+{
+       ail_error_e ret;
+       char query[AIL_SQL_QUERY_MAX_LEN];
+       sqlite3_stmt *stmt = NULL;
+       char w[AIL_SQL_QUERY_MAX_LEN];
+
+       retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
+       retv_if(!ai, AIL_ERROR_INVALID_PARAMETER);
 
+       *ai = appinfo_create();
+       retv_if(!*ai, AIL_ERROR_OUT_OF_MEMORY);
+
+       snprintf(w, sizeof(w), sql_get_filter(E_AIL_PROP_X_SLP_APPID_STR), appid);
+
+       snprintf(query, sizeof(query), "SELECT %s FROM %s WHERE %s",SQL_FLD_APP_INFO, SQL_TBL_APP_INFO, w);
+
+       do {
+               ret = db_open(DB_OPEN_RO, uid);
+               if (ret < 0) break;
+//is_admin
+               ret = db_prepare(query, &stmt);
+               if (ret < 0) break;
+//             ret = db_prepare(query, &stmt);
+//             if (ret < 0) break;
+
+
+               ret = db_step(stmt);
+               if (ret < 0) {
+                       db_finalize(stmt);
+                       break;
+               }
+
+               (*ai)->stmt = stmt;
+
+               ret = _appinfo_check_installed_storage(*ai);
+               if (ret < 0) {
+                       db_finalize((*ai)->stmt);
+                       break;
+               }
+
+               ret = __retrieve_all_column(*ai);
+               if (ret < 0) {
+                       db_finalize((*ai)->stmt);
+                       break;
+               }
+
+               ret = db_finalize((*ai)->stmt);
+               if (ret < 0) break;
+               (*ai)->stmt = NULL;
+
+               return AIL_ERROR_OK;
+       } while(0);
+
+       appinfo_destroy(*ai);
+
+       return ret;
+}
 EXPORT_API ail_error_e ail_appinfo_get_bool(const ail_appinfo_h ai, const char *property, bool *value)
 {
        ail_prop_bool_e prop;
@@ -338,8 +452,6 @@ EXPORT_API ail_error_e ail_appinfo_get_bool(const ail_appinfo_h ai, const char *
        return AIL_ERROR_OK;
 }
 
-
-
 EXPORT_API ail_error_e ail_appinfo_get_int(const ail_appinfo_h ai, const char *property, int *value)
 {
        ail_prop_int_e prop;
@@ -364,11 +476,9 @@ EXPORT_API ail_error_e ail_appinfo_get_int(const ail_appinfo_h ai, const char *p
        return AIL_ERROR_OK;
 }
 
-#define QUERY_GET_LOCALNAME "select name from localname where package='%s' and locale='%s'"
-
-char *appinfo_get_localname(const char *package, char *locale)
+char *appinfo_get_localname(const char *package, char *locale, uid_t uid)
 {
-       db_open(DB_OPEN_RO);
+       db_open(DB_OPEN_RO, uid);
        sqlite3_stmt *stmt;
        char *str = NULL;
        char *localname;
@@ -376,8 +486,10 @@ char *appinfo_get_localname(const char *package, char *locale)
        
        snprintf(query, sizeof(query), QUERY_GET_LOCALNAME, package, locale);
 
-       _D("Query = %s",query);
+//     _D("Query = %s",query);
+//is_admin
        retv_if (db_prepare(query, &stmt) < 0, NULL);
+       //retv_if (db_prepare(query, &stmt) < 0, NULL);
 
        do {
                if (db_step(stmt) < 0)
@@ -398,7 +510,6 @@ char *appinfo_get_localname(const char *package, char *locale)
        return NULL;
 }
 
-
 EXPORT_API ail_error_e ail_appinfo_get_str(const ail_appinfo_h ai, const char *property, char **str)
 {
        int index;
@@ -439,7 +550,7 @@ EXPORT_API ail_error_e ail_appinfo_get_str(const ail_appinfo_h ai, const char *p
                                }
 
                                locale_new = __get_app_locale_by_fallback(pkg, locale);
-                               localname = (char *)appinfo_get_localname(pkg,locale_new);
+                               localname = (char *)appinfo_get_localname(pkg, locale_new, GLOBAL_USER);
                                free(locale);
                                free(locale_new);
                        } else {
@@ -457,11 +568,11 @@ EXPORT_API ail_error_e ail_appinfo_get_str(const ail_appinfo_h ai, const char *p
                        if(pkg_type && (strcasecmp(pkg_type, "tpk") ==0))
                        {
                                locale_new = __get_app_locale_by_fallback(pkg, locale);
-                               localname = (char *)appinfo_get_localname(pkg,locale_new);
+                               localname = (char *)appinfo_get_localname(pkg, locale_new, GLOBAL_USER);
                                free(locale);
                                free(locale_new);
                        } else {
-                               localname = (char *)appinfo_get_localname(pkg,locale);
+                               localname = (char *)appinfo_get_localname(pkg, locale, GLOBAL_USER);
                                free(locale);
                        }
                }
@@ -490,6 +601,102 @@ EXPORT_API ail_error_e ail_appinfo_get_str(const ail_appinfo_h ai, const char *p
 
        return AIL_ERROR_OK;
 }
+EXPORT_API ail_error_e ail_appinfo_get_usr_str(const ail_appinfo_h ai, const char *property, uid_t uid, char **str)
+{
+       int index;
+       char *value;
+       char *pkg;
+       char *pkg_type;
+       char *locale, *localname;
+       ail_prop_str_e prop;
+       char *locale_new;
 
+       retv_if(!ai, AIL_ERROR_INVALID_PARAMETER);
+       retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
+       retv_if(!str, AIL_ERROR_INVALID_PARAMETER);
+
+       prop = _ail_convert_to_prop_str(property);
+
+       if (prop < E_AIL_PROP_STR_MIN || prop > E_AIL_PROP_STR_MAX)
+               return AIL_ERROR_INVALID_PARAMETER;
+
+       localname = NULL;
+
+       if (E_AIL_PROP_NAME_STR == prop) {
+               if (ai->stmt) {
+                       if (db_column_str(ai->stmt, E_AIL_PROP_X_SLP_PACKAGETYPE_STR, &pkg_type) < 0)
+                               return AIL_ERROR_DB_FAILED;
+                       if(pkg_type && (strcasecmp(pkg_type, "tpk") ==0))
+                       {
+                               locale = sql_get_locale();
+                               retv_if (NULL == locale, AIL_ERROR_FAIL);
+
+                               if (db_column_str(ai->stmt, E_AIL_PROP_PACKAGE_STR, &pkg) < 0){
+                                       free(locale);
+                                       return AIL_ERROR_DB_FAILED;
+                               }
+                               if (pkg == NULL){
+                                       free(locale);
+                                       return AIL_ERROR_DB_FAILED;
+                               }
+
+                               locale_new = __get_app_locale_by_fallback(pkg, locale);
+                               localname = (char *)appinfo_get_localname(pkg, locale_new, uid);
+                               free(locale);
+                               free(locale_new);
+                       } else {
+                               if (db_column_str(ai->stmt, SQL_LOCALNAME_IDX, &localname) < 0)
+                                       return AIL_ERROR_DB_FAILED;
+                       }
+               } else {
+                       pkg_type = ai->values[E_AIL_PROP_X_SLP_PACKAGETYPE_STR];
+                       pkg = ai->values[E_AIL_PROP_PACKAGE_STR];
+                       retv_if (NULL == pkg, AIL_ERROR_FAIL);
+
+                       locale = sql_get_locale();
+                       retv_if (NULL == locale, AIL_ERROR_FAIL);
+
+                       if(pkg_type && (strcasecmp(pkg_type, "tpk") ==0))
+                       {
+                               locale_new = __get_app_locale_by_fallback(pkg, locale);
+                               localname = (char *)appinfo_get_localname(pkg, locale_new, uid);
+                               free(locale);
+                               free(locale_new);
+                       } else {
+                               localname = (char *)appinfo_get_localname(pkg, locale, uid);
+                               free(locale);
+                       }
+               }
+
+               if (localname) {
+                       if (!ai->stmt) {
+                               if (ai->values) {
+                                       if (ai->values[prop])
+                                               free(ai->values[prop]);
+                                       ai->values[prop] = localname;
+                               }
+                       }
+                       *str = localname;
+                       return AIL_ERROR_OK;
+               }
+       }
+
+       if (ai->stmt) {
+               index = sql_get_app_info_idx(prop);
+               if (db_column_str(ai->stmt, index, &value) < 0){
+                       return AIL_ERROR_DB_FAILED;
+               }
+               *str = value;
+       } else
+               *str = ai->values[prop];
+
+       return AIL_ERROR_OK;
+}
+
+
+EXPORT_API ail_error_e ail_close_appinfo_db(void)
+{
+       return db_close();
+}
 
 // End of file