#include <string.h>
#include <stdlib.h>
#include <db-util.h>
+#include <tzplatform_config.h>
#include <vconf.h>
#include "ail.h"
#include "ail_private.h"
#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;
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]);
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;
}
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;
}
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;
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)
{
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)
{
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) {
(*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;
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;
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;
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;
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)
return NULL;
}
-
EXPORT_API ail_error_e ail_appinfo_get_str(const ail_appinfo_h ai, const char *property, char **str)
{
int index;
}
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 {
+ 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, GLOBAL_USER);
+ free(locale);
+ free(locale_new);
+ } else {
+ localname = (char *)appinfo_get_localname(pkg, locale, GLOBAL_USER);
+ 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_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(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, uid);
free(locale);
free(locale_new);
} else {
- localname = (char *)appinfo_get_localname(pkg,locale);
+ localname = (char *)appinfo_get_localname(pkg, locale, uid);
free(locale);
}
}
return AIL_ERROR_OK;
}
+
EXPORT_API ail_error_e ail_close_appinfo_db(void)
{
return db_close();