#include <string.h>
#include <stdlib.h>
+#include <ctype.h>
+#include <assert.h>
+#include <unistd.h>
#include <db-util.h>
+#include <tzplatform_config.h>
#include <vconf.h>
+
#include "ail.h"
#include "ail_private.h"
#include "ail_convert.h"
#include "ail_db.h"
#include "ail_sql.h"
#include "ail_package.h"
-#include <assert.h>
-#include <unistd.h>
#define LANGUAGE_LENGTH 2
#define DEFAULT_LOCALE "No Locale"
#define MAX_QUERY_LEN 4096
-#define PKG_SD_PATH "/opt/storage/sdcard/app2sd/"
+#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 *locale;
} pkgmgr_locale_x;
-
/* get the first locale value*/
static int __fallback_locale_cb(void *data, int ncols, char **coltxt, char **colname)
{
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;
+ int *p = (int *)data;
*p = atoi(coltxt[0]);
return 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;
}
static int __check_app_locale_from_app_localized_info_by_fallback(const char *appid, const char *locale)
{
int result_query = -1;
- char wildcard[2] = {'%','\0'};
+ char wildcard[2] = {'%', '\0'};
char query[MAX_QUERY_LEN];
char lang[3] = {'\0'};
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;
}
static char* __get_app_locale_from_app_localized_info_by_fallback(const char *appid, const char *locale)
{
- char wildcard[2] = {'%','\0'};
+ char wildcard[2] = {'%', '\0'};
char lang[3] = {'\0'};
char query[MAX_QUERY_LEN];
char *locale_new = NULL;
_E("Out of Memory!!!\n");
return NULL;
}
- memset(info, NULL, sizeof(*info));
+ memset(info, 0x00, sizeof(*info));
strncpy(lang, locale, 2);
snprintf(query, MAX_QUERY_LEN, "select locale from localname where package='%s' and locale like '%s%s'", appid, lang, wildcard);
return locale_new;
}
-static char* __convert_syslocale_to_manifest_locale(char *syslocale)
+static char* __convert_syslocale_to_manifest_locale(const char *syslocale)
{
char *locale = malloc(6);
if (!locale) {
return NULL;
}
- sprintf(locale, "%c%c_%c%c", syslocale[0], syslocale[1], toupper(syslocale[3]), toupper(syslocale[4]));
+ snprintf(locale, 6, "%c%c_%c%c", syslocale[0], syslocale[1], toupper(syslocale[3]), toupper(syslocale[4]));
return locale;
}
/* fallback matching */
check_result = __check_app_locale_from_app_localized_info_by_fallback(appid, locale);
- if(check_result == 1) {
+ if (check_result == 1) {
locale_new = __get_app_locale_from_app_localized_info_by_fallback(appid, locale);
_D("%s found (%s) language-locale in DB by fallback!\n", appid, locale_new);
free(locale);
for (i = 0; i < NUM_OF_PROP; i++) {
err = db_column_str(ai->stmt, i, &col);
- if (AIL_ERROR_OK != err)
+ if (AIL_ERROR_OK != err)
break;
if (!col) {
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){
+ 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){
+ 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];
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; /* tmep, it will be fixed to :: return AIL_ERROR_FAIL; */
}
}
{
ail_appinfo_h ai;
ai = calloc(1, sizeof(struct ail_appinfo));
- retv_if (NULL == ai, NULL);
+ retv_if(ai == NULL, NULL);
ai->stmt = NULL;
return ai;
retv_if(!ai->values, AIL_ERROR_INVALID_PARAMETER);
for (i = 0; i < NUM_OF_PROP; i++) {
- if (ai->values[i]) {
+ if (ai->values[i])
free(ai->values[i]);
- }
}
free(ai->values);
return AIL_ERROR_OK;
}
-
EXPORT_API ail_error_e ail_package_get_appinfo(const char *package, 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)
{
ail_error_e ret;
char query[AIL_SQL_QUERY_MAX_LEN];
sqlite3_stmt *stmt = NULL;
char w[AIL_SQL_QUERY_MAX_LEN];
+ const char *filter;
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);
+ filter = sql_get_filter(E_AIL_PROP_X_SLP_APPID_STR);
+ if (filter == NULL) {
+ appinfo_destroy(*ai);
+ return AIL_ERROR_FAIL;
+ }
- snprintf(query, sizeof(query), "SELECT %s FROM %s WHERE %s",SQL_FLD_APP_INFO, SQL_TBL_APP_INFO, w);
+ snprintf(w, sizeof(w), filter, 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);
- if (ret < 0) break;
+ ret = db_open(DB_OPEN_RO, GLOBAL_USER);
+ if (ret < 0)
+ break;
- ret = db_prepare(query, &stmt);
- if (ret < 0) break;
+ /* is_admin */
+ ret = db_prepare_globalro(query, &stmt);
+ if (ret < 0)
+ break;
ret = db_step(stmt);
if (ret < 0) {
}
ret = db_finalize((*ai)->stmt);
- if (ret < 0) break;
+ if (ret < 0)
+ break;
+
(*ai)->stmt = NULL;
return AIL_ERROR_OK;
- } while(0);
+ } while (0);
appinfo_destroy(*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];
+ const char *filter;
+
+ 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);
+
+ filter = sql_get_filter(E_AIL_PROP_X_SLP_APPID_STR);
+ if (filter == NULL) {
+ appinfo_destroy(*ai);
+ return AIL_ERROR_FAIL;
+ }
+
+ snprintf(w, sizeof(w), filter, 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_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)
{
if (prop < E_AIL_PROP_BOOL_MIN || prop > E_AIL_PROP_BOOL_MAX)
return AIL_ERROR_INVALID_PARAMETER;
-
+
if (ai->stmt) {
int index;
index = sql_get_app_info_idx(prop);
return AIL_ERROR_DB_FAILED;
} else {
val = atoi(ai->values[prop]);
- *value = (val == 0? false : true);
+ *value = (val == 0) ? false : true;
}
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_INVALID_PARAMETER;
if (ai->stmt) {
- int index;
+ int index;
index = sql_get_app_info_idx(prop);
if (db_column_int(ai->stmt, index, value) < 0)
return AIL_ERROR_DB_FAILED;
return AIL_ERROR_OK;
}
-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;
char query[512];
-
+
snprintf(query, sizeof(query), QUERY_GET_LOCALNAME, package, locale);
-// _D("Query = %s",query);
- retv_if (db_prepare(query, &stmt) < 0, NULL);
+ if (uid != GLOBAL_USER)
+ retv_if(db_prepare(query, &stmt) < 0, NULL);
+ else
+ retv_if(db_prepare_globalro(query, &stmt) < 0, NULL);
do {
if (db_step(stmt) < 0)
db_finalize(stmt);
return localname;
- } while(0);
+ } while (0);
db_finalize(stmt);
return NULL;
}
-
EXPORT_API ail_error_e ail_appinfo_get_str(const ail_appinfo_h ai, const char *property, char **str)
{
int index;
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))
- {
+ if (pkg_type && (strcasecmp(pkg_type, "tpk") == 0)) {
locale = sql_get_locale();
- retv_if (NULL == locale, AIL_ERROR_FAIL);
+ retv_if(locale == NULL, AIL_ERROR_FAIL);
- if (db_column_str(ai->stmt, E_AIL_PROP_PACKAGE_STR, &pkg) < 0){
+ if (db_column_str(ai->stmt, E_AIL_PROP_PACKAGE_STR, &pkg) < 0) {
free(locale);
return AIL_ERROR_DB_FAILED;
}
- if (pkg == NULL){
+ 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);
+ localname = (char *)appinfo_get_localname(pkg, locale_new, GLOBAL_USER);
free(locale);
free(locale_new);
} else {
} 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);
+ retv_if(pkg == NULL, AIL_ERROR_FAIL);
locale = sql_get_locale();
- retv_if (NULL == locale, AIL_ERROR_FAIL);
+ retv_if(locale == NULL, AIL_ERROR_FAIL);
- if(pkg_type && (strcasecmp(pkg_type, "tpk") ==0))
- {
+ 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);
}
}
if (ai->stmt) {
index = sql_get_app_info_idx(prop);
- if (db_column_str(ai->stmt, index, &value) < 0){
+ 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(locale == NULL, 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(pkg == NULL, AIL_ERROR_FAIL);
+
+ locale = sql_get_locale();
+ retv_if(locale == NULL, 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 db_close();
}
-
-// End of file