X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fail_desktop.c;h=3868b798dc2485057c17a7485a3ae46b5e2ba37f;hb=d8b4d50672dce40fce54cf1c43a6e4a7a064c982;hp=cd030401bb5cb78f8fa8f0fe17318ce44d8a9674;hpb=7d9e2b39cc5e99bfa921c41f2a5dfe21e4235201;p=platform%2Fcore%2Fappfw%2Fail.git diff --git a/src/ail_desktop.c b/src/ail_desktop.c index cd03040..3868b79 100755 --- a/src/ail_desktop.c +++ b/src/ail_desktop.c @@ -22,6 +22,7 @@ #define _GNU_SOURCE +#include #include #include #include @@ -33,15 +34,16 @@ #include #include +#include +#include #include "ail_private.h" #include "ail_db.h" #include "ail_sql.h" #include "ail.h" -#define OPT_DESKTOP_DIRECTORY "/opt/share/applications" -#define USR_DESKTOP_DIRECTORY "/usr/share/applications" -#define BUFSZE 4096 +#define BUFSIZE 4096 +#define GLOBAL_USER 0 #define whitespace(c) (((c) == ' ') || ((c) == '\t')) #define argsdelimiter " \t" @@ -111,6 +113,8 @@ typedef struct { char* x_slp_appid; char* x_slp_pkgid; char* x_slp_domain; + char* x_slp_submodemainid; + char* x_slp_installedstorage; int x_slp_baselayoutwidth; int x_slp_installedtime; int nodisplay; @@ -119,6 +123,7 @@ typedef struct { int x_slp_removable; int x_slp_ishorizontalscale; int x_slp_enabled; + int x_slp_submode; char* desktop; GSList* localname; } desktop_info_s; @@ -238,7 +243,7 @@ _get_package_from_icon(char* icon) static char* -_get_icon_with_path(char* icon) +_get_icon_with_path(char* icon, uid_t uid) { retv_if(!icon, NULL); @@ -251,6 +256,8 @@ _get_icon_with_path(char* icon) package = _get_package_from_icon(icon); retv_if(!package, NULL); +/* "db/setting/theme" is not exist */ +#if 0 theme = vconf_get_str("db/setting/theme"); if (!theme) { theme = strdup("default"); @@ -259,47 +266,34 @@ _get_icon_with_path(char* icon) return NULL; } } +#else + theme = strdup("default"); +#endif len = (0x01 << 7) + strlen(icon) + strlen(package) + strlen(theme); icon_with_path = malloc(len); if(icon_with_path == NULL) { - _E("(icon_with_path == NULL) return\n"); + _E("icon_with_path == NULL\n"); free(package); free(theme); return NULL; } memset(icon_with_path, 0, len); - - sqlite3_snprintf( len, icon_with_path,"/opt/share/icons/%q/small/%q", theme, icon); - do { - if (access(icon_with_path, R_OK) == 0) break; - sqlite3_snprintf( len, icon_with_path,"/usr/share/icons/%q/small/%q", theme, icon); - if (access(icon_with_path, R_OK) == 0) break; - _D("cannot find icon %s", icon_with_path); - sqlite3_snprintf( len, icon_with_path, "/opt/share/icons/default/small/%q", icon); - if (access(icon_with_path, R_OK) == 0) break; - sqlite3_snprintf( len, icon_with_path, "/usr/share/icons/default/small/%q", icon); - if (access(icon_with_path, R_OK) == 0) break; - - #if 1 /* this will be remove when finish the work for moving icon path */ - _E("icon file must be moved to %s", icon_with_path); - sqlite3_snprintf( len, icon_with_path, "/opt/apps/%q/res/icons/%q/small/%q", package, theme, icon); - if (access(icon_with_path, R_OK) == 0) break; - sqlite3_snprintf( len, icon_with_path, "/usr/apps/%q/res/icons/%q/small/%q", package, theme, icon); - if (access(icon_with_path, R_OK) == 0) break; - _D("cannot find icon %s", icon_with_path); - sqlite3_snprintf( len, icon_with_path, "/opt/apps/%q/res/icons/default/small/%q", package, icon); - if (access(icon_with_path, R_OK) == 0) break; - sqlite3_snprintf( len, icon_with_path, "/usr/apps/%q/res/icons/default/small/%q", package, icon); - if (access(icon_with_path, R_OK) == 0) break; - #endif - } while (0); - + if (uid != GLOBAL_USER) + sqlite3_snprintf( len, icon_with_path, "%s%q", ail_get_icon_path(uid), icon); + else + sqlite3_snprintf( len, icon_with_path, "%s/%q/small/%q", ail_get_icon_path(GLOBAL_USER), theme, icon); + if (!access (icon_with_path, F_OK)) + sqlite3_snprintf( len, icon_with_path, "%s/%q/res/icons/%q/small/%q", tzplatform_getenv(TZ_SYS_RO_APP), package, theme, icon); + else if (!access (icon_with_path, F_OK)) + sqlite3_snprintf( len, icon_with_path, "%s/%q/res/icons/%q/small/%q", tzplatform_getenv(TZ_SYS_RW_APP), package, theme, icon); + else + _D("Cannot find icon path"); free(theme); free(package); + _D("Icon path : %s", icon_with_path); - _D("Icon path : %s ---> %s", icon, icon_with_path); return icon_with_path; } else { @@ -312,14 +306,14 @@ _get_icon_with_path(char* icon) } -static ail_error_e _read_icon(void *data, char *tag, char *value) +static ail_error_e _read_icon(void *data, char *tag, char *value, uid_t uid) { desktop_info_s *info = data; retv_if(!data, AIL_ERROR_INVALID_PARAMETER); retv_if(!value, AIL_ERROR_INVALID_PARAMETER); - info->icon = _get_icon_with_path(value); + info->icon = _get_icon_with_path(value, uid); retv_if (!info->icon, AIL_ERROR_OUT_OF_MEMORY); @@ -492,7 +486,31 @@ static ail_error_e _read_x_slp_packageid(void *data, char *tag, char *value) return AIL_ERROR_OK; } +static ail_error_e _read_x_slp_submodemainid(void *data, char *tag, char *value) +{ + desktop_info_s *info = data; + + retv_if(!data, AIL_ERROR_INVALID_PARAMETER); + retv_if(!value, AIL_ERROR_INVALID_PARAMETER); + + SAFE_FREE_AND_STRDUP(value, info->x_slp_submodemainid); + retv_if(!info->x_slp_submodemainid, AIL_ERROR_OUT_OF_MEMORY); + + return AIL_ERROR_OK; +} + +static ail_error_e _read_x_slp_installedstorage(void *data, char *tag, char *value) +{ + desktop_info_s *info = data; + + retv_if(!data, AIL_ERROR_INVALID_PARAMETER); + retv_if(!value, AIL_ERROR_INVALID_PARAMETER); + + SAFE_FREE_AND_STRDUP(value, info->x_slp_installedstorage); + retv_if(!info->x_slp_installedstorage, AIL_ERROR_OUT_OF_MEMORY); + return AIL_ERROR_OK; +} static ail_error_e _read_x_slp_uri(void *data, char *tag, char *value) { @@ -565,6 +583,18 @@ static ail_error_e _read_x_slp_removable(void *data, char *tag, char *value) } +static ail_error_e _read_x_slp_submode(void *data, char *tag, char *value) +{ + desktop_info_s *info = data; + + retv_if(!data, AIL_ERROR_INVALID_PARAMETER); + retv_if(!value, AIL_ERROR_INVALID_PARAMETER); + + info->x_slp_submode = !strcasecmp(value, "true"); + + return AIL_ERROR_OK; +} + static ail_error_e _read_x_slp_appid(void *data, char *tag, char *value) { desktop_info_s *info = data; @@ -666,6 +696,14 @@ static struct entry_parser entry_parsers[] = { .value_cb = _read_x_slp_packageid, }, { + .field = "x-tizen-submodemainid", + .value_cb = _read_x_slp_submodemainid, + }, + { + .field = "x-tizen-installedstorage", + .value_cb = _read_x_slp_installedstorage, + }, + { .field = "x-tizen-uri", .value_cb = _read_x_slp_uri, }, @@ -686,6 +724,10 @@ static struct entry_parser entry_parsers[] = { .value_cb = _read_x_slp_enabled, }, { + .field = "x-tizen-submode", + .value_cb = _read_x_slp_submode, + }, + { .field = "x-tizen-multiple", .value_cb = _read_x_slp_multiple, }, @@ -718,12 +760,15 @@ static struct entry_parser entry_parsers[] = { /* Utility functions */ -static int _count_all(void) +static int _count_all(uid_t uid) { ail_error_e ret; int count; - ret = ail_filter_count_appinfo(NULL, &count); + if (uid != GLOBAL_USER) + ret = ail_filter_count_usr_appinfo(NULL, &count, uid); + else + ret = ail_filter_count_appinfo(NULL, &count); if(ret != AIL_ERROR_OK) { _E("cannot count appinfo"); count = -1; @@ -734,25 +779,23 @@ static int _count_all(void) return count; } - - -char *_pkgname_to_desktop(const char *package) +char *_pkgname_to_desktop(const char *package, uid_t uid) { char *desktop; + char *desktop_path; int size; retv_if(!package, NULL); - size = strlen(OPT_DESKTOP_DIRECTORY) + strlen(package) + 10; + desktop_path = al_get_desktop_path(uid); + + size = strlen(desktop_path) + strlen(package) + 10; desktop = malloc(size); retv_if(!desktop, NULL); - snprintf(desktop, size, OPT_DESKTOP_DIRECTORY"/%s.desktop", package); + snprintf(desktop, size, "%s/%s.desktop", desktop_path, package); - if (access(desktop, R_OK) == 0) - return desktop; - - snprintf(desktop, size, USR_DESKTOP_DIRECTORY"/%s.desktop", package); + _D("uid: %d / desktop: [%s]\n", uid, desktop); return desktop; } @@ -801,7 +844,7 @@ static inline int _len_local_info(desktop_info_s* info) } -static inline int _insert_local_info(desktop_info_s* info) +static inline int _insert_local_info(desktop_info_s* info, uid_t uid) { int len_query = SQL_INSERT_LOCALNAME_STR_LEN; int nb_locale_args; @@ -825,7 +868,10 @@ static inline int _insert_local_info(desktop_info_s* info) strcat(query, SQL_LOCALNAME_TRIPLET_STR); do { - ret = db_prepare_rw(query, &stmt); + if(uid != GLOBAL_USER) + ret = db_prepare_rw(query, &stmt); + else + ret = db_prepare_globalrw(query, &stmt); if (ret < 0) break; ret = _bind_local_info(info, stmt); @@ -872,6 +918,8 @@ static inline int _strlen_desktop_info(desktop_info_s* info) if (info->x_slp_exe_path) len += strlen(info->x_slp_exe_path); if (info->x_slp_appid) len += strlen(info->x_slp_appid); if (info->desktop) len += strlen(info->desktop); + if (info->x_slp_submodemainid) len += strlen(info->x_slp_submodemainid); + if (info->x_slp_installedstorage) len += strlen(info->x_slp_installedstorage); return len; } @@ -885,13 +933,13 @@ int __is_ail_initdb(void) return 0; } - - /* Manipulating desktop_info functions */ -static ail_error_e _init_desktop_info(desktop_info_s *info, const char *package) +static ail_error_e _init_desktop_info(desktop_info_s *info, const char *package, uid_t uid) { static int is_initdb = -1; + _D("package - [%s].", package); + if(is_initdb == -1) is_initdb = __is_ail_initdb(); @@ -903,6 +951,7 @@ static ail_error_e _init_desktop_info(desktop_info_s *info, const char *package) info->x_slp_taskmanage = 1; info->x_slp_removable = 1; + info->x_slp_submode = 0; if(is_initdb) info->x_slp_installedtime = 0; @@ -923,9 +972,11 @@ static ail_error_e _init_desktop_info(desktop_info_s *info, const char *package) info->x_slp_enabled = 1; - info->desktop = _pkgname_to_desktop(package); + info->desktop = _pkgname_to_desktop(package, uid); retv_if(!info->desktop, AIL_ERROR_FAIL); + _D("desktop - [%s].", info->desktop); + return AIL_ERROR_OK; } @@ -1039,6 +1090,8 @@ static ail_error_e _retrieve_all_column_to_desktop_info(desktop_info_s* info, sq SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_APPID_STR], info->x_slp_appid); SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PKGID_STR], info->x_slp_pkgid); SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_DOMAIN_STR], info->x_slp_domain); + SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SUBMODEMAINID_STR], info->x_slp_submodemainid); + SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_INSTALLEDSTORAGE_STR], info->x_slp_installedstorage); info->x_slp_installedtime = atoi(values[E_AIL_PROP_X_SLP_INSTALLEDTIME_INT]); @@ -1048,6 +1101,7 @@ static ail_error_e _retrieve_all_column_to_desktop_info(desktop_info_s* info, sq info->x_slp_removable = atoi(values[E_AIL_PROP_X_SLP_REMOVABLE_BOOL]); info->x_slp_ishorizontalscale = atoi(values[E_AIL_PROP_X_SLP_ISHORIZONTALSCALE_BOOL]); info->x_slp_enabled = atoi(values[E_AIL_PROP_X_SLP_ENABLED_BOOL]); + info->x_slp_submode = atoi(values[E_AIL_PROP_X_SLP_SUBMODE_BOOL]); err = AIL_ERROR_OK; @@ -1062,7 +1116,7 @@ NEXT: } -static ail_error_e _load_desktop_info(desktop_info_s* info) +static ail_error_e _load_desktop_info(desktop_info_s* info, uid_t uid) { ail_error_e ret; char query[AIL_SQL_QUERY_MAX_LEN]; @@ -1076,10 +1130,11 @@ static ail_error_e _load_desktop_info(desktop_info_s* info) 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, uid); if (ret < 0) break; - +//is_admin ret = db_prepare(query, &stmt); + //ret = db_prepare_globalro(query, &stmt); if (ret < 0) break; ret = db_step(stmt); @@ -1154,7 +1209,12 @@ static ail_error_e _modify_desktop_info_str(desktop_info_s* info, SAFE_FREE_AND_STRDUP(value, info->x_slp_svc); retv_if (!info->x_slp_svc, AIL_ERROR_OUT_OF_MEMORY); break; + case E_AIL_PROP_X_SLP_INSTALLEDSTORAGE_STR: + SAFE_FREE_AND_STRDUP(value, info->x_slp_installedstorage); + retv_if (!info->x_slp_installedstorage, AIL_ERROR_OUT_OF_MEMORY); + break; default: + _E("prop[%d] is not defined\n", prop); return AIL_ERROR_FAIL; } @@ -1162,74 +1222,26 @@ static ail_error_e _modify_desktop_info_str(desktop_info_s* info, } - - -static ail_error_e _create_table(void) -{ - int i; - ail_error_e ret; - const char *tbls[3] = { - "CREATE TABLE app_info " - "(package TEXT PRIMARY KEY, " - "exec TEXT DEFAULT 'No Exec', " - "name TEXT DEFAULT 'No Name', " - "type TEXT DEFAULT 'Application', " - "icon TEXT DEFAULT 'No Icon', " - "categories TEXT, " - "version TEXT, " - "mimetype TEXT, " - "x_slp_service TEXT, " - "x_slp_packagetype TEXT, " - "x_slp_packagecategories TEXT, " - "x_slp_packageid TEXT, " - "x_slp_uri TEXT, " - "x_slp_svc TEXT, " - "x_slp_exe_path TEXT, " - "x_slp_appid TEXT, " - "x_slp_pkgid TEXT, " - "x_slp_domain TEXT, " - "x_slp_baselayoutwidth INTEGER DEFAULT 0, " - "x_slp_installedtime INTEGER DEFAULT 0, " - "nodisplay INTEGER DEFAULT 0, " - "x_slp_taskmanage INTEGER DEFAULT 1, " - "x_slp_multiple INTEGER DEFAULT 0, " - "x_slp_removable INTEGER DEFAULT 1, " - "x_slp_ishorizontalscale INTEGER DEFAULT 0, " - "x_slp_enabled INTEGER DEFAULT 1, " - "desktop TEXT UNIQUE NOT NULL);", - "CREATE TABLE localname (package TEXT NOT NULL, " - "locale TEXT NOT NULL, " - "name TEXT NOT NULL, PRIMARY KEY (package, locale));", - NULL - }; - - ret = db_open(DB_OPEN_RW); - retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED); - - for (i = 0; tbls[i] != NULL; i++) { - ret = db_exec(tbls[i]); - retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED); - } - - return AIL_ERROR_OK; -} - - -static inline void _insert_localname(gpointer data, gpointer user_data) +static inline void _insert_localname(gpointer data, gpointer user_data, uid_t uid) { char query[512]; struct name_item *item = (struct name_item *)data; desktop_info_s *info = (desktop_info_s *)user_data; - snprintf(query, sizeof(query), "insert into localname (package, locale, name) " - "values ('%s', '%s', '%s');", - info->package, item->locale, item->name); - if (db_exec(query) < 0) - _E("Failed to insert local name of package[%s]",info->package); + sqlite3_snprintf(sizeof(query), query, "insert into localname (package, locale, name, x_slp_pkgid) " + "values ('%q', '%q', '%q', '%q');", + info->package, item->locale, item->name, info->x_slp_pkgid); + if(uid != GLOBAL_USER) { + if (db_exec_usr_rw(query) < 0) + _E("Failed to insert local name of package[%s]",info->package); + } else { + if (db_exec_glo_rw(query) < 0) + _E("Failed to insert local name of package[%s]",info->package); + } } -static ail_error_e _insert_desktop_info(desktop_info_s *info) +static ail_error_e _insert_desktop_info(desktop_info_s *info, uid_t uid) { char *query; int len; @@ -1257,6 +1269,8 @@ static ail_error_e _insert_desktop_info(desktop_info_s *info) "x_slp_appid, " "x_slp_pkgid, " "x_slp_domain, " + "x_slp_submodemainid, " + "x_slp_installedstorage, " "x_slp_baselayoutwidth, " "x_slp_installedtime, " "nodisplay, " @@ -1265,13 +1279,14 @@ static ail_error_e _insert_desktop_info(desktop_info_s *info) "x_slp_removable, " "x_slp_ishorizontalscale, " "x_slp_enabled, " + "x_slp_submode, " "desktop) " "values " "('%q', '%q', '%q', '%q', '%q', " "'%q', '%q', '%q', '%q', '%q', " "'%q', '%q', '%q', '%q', '%q', " - "'%q', '%q', '%q', " - "%d, %d, %d, %d, %d, %d, " + "'%q', '%q', '%q', '%q', '%q', " + "%d, %d, %d, %d, %d, %d, %d," "%d, %d, " "'%q');", info->package, @@ -1292,6 +1307,8 @@ static ail_error_e _insert_desktop_info(desktop_info_s *info) info->x_slp_appid, info->x_slp_pkgid, info->x_slp_domain, + info->x_slp_submodemainid, + info->x_slp_installedstorage, info->x_slp_baselayoutwidth, info->x_slp_installedtime, info->nodisplay, @@ -1300,38 +1317,42 @@ static ail_error_e _insert_desktop_info(desktop_info_s *info) info->x_slp_removable, info->x_slp_ishorizontalscale, info->x_slp_enabled, + info->x_slp_submode, info->desktop ); - ret = db_open(DB_OPEN_RW); + ret = db_open(DB_OPEN_RW, uid); if(ret != AIL_ERROR_OK) { _E("(tmp == NULL) return\n"); free(query); return AIL_ERROR_DB_FAILED; } - - ret = db_exec(query); + if (uid != GLOBAL_USER) + ret = db_exec_usr_rw(query); + else + ret = db_exec_glo_rw(query); + free(query); retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED); if (info->localname) - _insert_local_info(info); + _insert_local_info(info, uid); - _D("Add (%s).", info->package); + _D("Add (%s).", query); return AIL_ERROR_OK; } -static ail_error_e _update_desktop_info(desktop_info_s *info) +static ail_error_e _update_desktop_info(desktop_info_s *info, uid_t uid) { char *query; int len; retv_if (NULL == info, AIL_ERROR_INVALID_PARAMETER); - if (db_open(DB_OPEN_RW) < 0) { + if (db_open(DB_OPEN_RW, uid) < 0) { return AIL_ERROR_DB_FAILED; } @@ -1357,6 +1378,8 @@ static ail_error_e _update_desktop_info(desktop_info_s *info) "x_slp_appid='%q', " "x_slp_pkgid='%q', " "x_slp_domain='%q', " + "x_slp_submodemainid='%q', " + "x_slp_installedstorage='%q', " "x_slp_baselayoutwidth=%d, " "x_slp_installedtime=%d, " "nodisplay=%d, " @@ -1365,6 +1388,7 @@ static ail_error_e _update_desktop_info(desktop_info_s *info) "x_slp_removable=%d, " "x_slp_ishorizontalscale=%d, " "x_slp_enabled=%d, " + "x_slp_submode=%d, " "desktop='%q'" "where package='%q'", info->exec, @@ -1384,6 +1408,8 @@ static ail_error_e _update_desktop_info(desktop_info_s *info) info->x_slp_appid, info->x_slp_pkgid, info->x_slp_domain, + info->x_slp_submodemainid, + info->x_slp_installedstorage, info->x_slp_baselayoutwidth, info->x_slp_installedtime, info->nodisplay, @@ -1392,23 +1418,35 @@ static ail_error_e _update_desktop_info(desktop_info_s *info) info->x_slp_removable, info->x_slp_ishorizontalscale, info->x_slp_enabled, + info->x_slp_submode, info->desktop, info->package); - if (db_exec(query) < 0) { - free (query); - return AIL_ERROR_DB_FAILED; + if(uid != GLOBAL_USER) { + if (db_exec_usr_rw(query) < 0) { + free (query); + return AIL_ERROR_DB_FAILED; + } + } else { + if (db_exec_glo_rw(query) < 0) { + free (query); + return AIL_ERROR_DB_FAILED; + } } - snprintf(query, len, "delete from localname where package = '%s'", info->package); - - if (db_exec(query) < 0) { - free (query); - return AIL_ERROR_DB_FAILED; + if (uid != GLOBAL_USER) { + if (db_exec_usr_rw(query) < 0) { + free (query); + return AIL_ERROR_DB_FAILED; + } + } else { + if (db_exec_glo_rw(query) < 0) { + free (query); + return AIL_ERROR_DB_FAILED; + } } - if (info->localname) - _insert_local_info(info); + _insert_local_info(info, uid); _D("Update (%s).", info->package); @@ -1419,14 +1457,14 @@ static ail_error_e _update_desktop_info(desktop_info_s *info) -static ail_error_e _remove_package(const char* package) +static ail_error_e _remove_package(const char* package, uid_t uid) { char *query; int size; retv_if(!package, AIL_ERROR_INVALID_PARAMETER); - if (db_open(DB_OPEN_RW) < 0) { + if (db_open(DB_OPEN_RW, uid) < 0) { return AIL_ERROR_DB_FAILED; } @@ -1436,26 +1474,84 @@ static ail_error_e _remove_package(const char* package) snprintf(query, size, "delete from app_info where package = '%s'", package); - if (db_exec(query) < 0) { - free(query); - return AIL_ERROR_DB_FAILED; + if(uid != GLOBAL_USER) { + if (db_exec_usr_rw(query) < 0) { + free(query); + return AIL_ERROR_DB_FAILED; + } + } else { + if (db_exec_glo_rw(query) < 0) { + free(query); + return AIL_ERROR_DB_FAILED; + } } - snprintf(query, size, "delete from localname where package = '%s'", package); _D("query=%s",query); - - if (db_exec(query) < 0) { - free(query); - return AIL_ERROR_DB_FAILED; + + if(uid != GLOBAL_USER) { + if (db_exec_usr_rw(query) < 0) { + free(query); + return AIL_ERROR_DB_FAILED; + } + } else { + if (db_exec_glo_rw(query) < 0) { + free(query); + return AIL_ERROR_DB_FAILED; + } } - _D("Remove (%s).", package); free(query); return AIL_ERROR_OK; } +static ail_error_e _clean_pkgid_data(const char* pkgid, uid_t uid) +{ + char *query; + int size; + retv_if(!pkgid, AIL_ERROR_INVALID_PARAMETER); + + if (db_open(DB_OPEN_RW, uid) ){ + return AIL_ERROR_DB_FAILED; + } + + size = strlen(pkgid) + (0x01 << 10); + query = calloc(1, size); + retv_if(!query, AIL_ERROR_OUT_OF_MEMORY); + + snprintf(query, size, "delete from app_info where x_slp_pkgid = '%s'", pkgid); + + if(uid != GLOBAL_USER) { + if (db_exec_usr_rw(query) < 0) { + free(query); + return AIL_ERROR_DB_FAILED; + } + } else { + if (db_exec_glo_rw(query) < 0) { + free(query); + return AIL_ERROR_DB_FAILED; + } + } + snprintf(query, size, "delete from localname where x_slp_pkgid = '%s'", pkgid); + _D("query=%s",query); + + if(uid != GLOBAL_USER) { + if (db_exec_usr_rw(query) < 0) { + free(query); + return AIL_ERROR_DB_FAILED; + } + } else { + if (db_exec_glo_rw(query) < 0) { + free(query); + return AIL_ERROR_DB_FAILED; + } + } + _D("Clean pkgid data (%s).", pkgid); + free(query); + + return AIL_ERROR_OK; +} static ail_error_e _send_db_done_noti(noti_type type, const char *package) { @@ -1478,11 +1574,11 @@ static ail_error_e _send_db_done_noti(noti_type type, const char *package) return AIL_ERROR_FAIL; } - size = strlen(package) + 8; - noti_string = calloc(1, size); + size = snprintf(NULL, 0, "%s:%s:%u", type_string, package, getuid()); + noti_string = (char*) calloc(size + 1, sizeof(char)); retv_if(!noti_string, AIL_ERROR_OUT_OF_MEMORY); - snprintf(noti_string, size, "%s:%s", type_string, package); + snprintf(noti_string, size + 1, "%s:%s:%u", type_string, package, getuid()); vconf_set_str(VCONFKEY_AIL_INFO_STATE, noti_string); vconf_set_str(VCONFKEY_MENUSCREEN_DESKTOP, noti_string); // duplicate, will be removed _D("Noti : %s", noti_string); @@ -1524,6 +1620,8 @@ static void _fini_desktop_info(desktop_info_s *info) SAFE_FREE(info->x_slp_appid); SAFE_FREE(info->x_slp_pkgid); SAFE_FREE(info->x_slp_domain); + SAFE_FREE(info->x_slp_submodemainid); + SAFE_FREE(info->x_slp_installedstorage); SAFE_FREE(info->desktop); if (info->localname) { g_slist_free_full(info->localname, _name_item_free_func); @@ -1544,33 +1642,20 @@ static int __is_authorized() /* Public functions */ -EXPORT_API ail_error_e ail_desktop_add(const char *appid) +EXPORT_API ail_error_e ail_usr_desktop_add(const char *appid, uid_t uid) { desktop_info_s info = {0,}; ail_error_e ret; - int count; retv_if(!appid, AIL_ERROR_INVALID_PARAMETER); - if (!__is_authorized()) { - _E("You are not an authorized user on adding!\n"); - return -1; - } - count = _count_all(); - if (count <= 0) { - ret = _create_table(); - if (ret != AIL_ERROR_OK) { - _D("Cannot create a table. Maybe there is already a table."); - } - } - - ret = _init_desktop_info(&info, appid); + ret = _init_desktop_info(&info, appid, uid); retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); ret = _read_desktop_info(&info); retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); - ret = _insert_desktop_info(&info); + ret = _insert_desktop_info(&info, uid); retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); ret = _send_db_done_noti(NOTI_ADD, appid); @@ -1581,26 +1666,25 @@ EXPORT_API ail_error_e ail_desktop_add(const char *appid) return AIL_ERROR_OK; } +EXPORT_API ail_error_e ail_desktop_add(const char *appid) +{ + return ail_usr_desktop_add(appid,GLOBAL_USER); +} - -EXPORT_API ail_error_e ail_desktop_update(const char *appid) +EXPORT_API ail_error_e ail_usr_desktop_update(const char *appid, uid_t uid) { desktop_info_s info = {0,}; ail_error_e ret; retv_if(!appid, AIL_ERROR_INVALID_PARAMETER); - if (!__is_authorized()) { - _E("You are not an authorized user on updating!\n"); - return -1; - } - ret = _init_desktop_info(&info, appid); + ret = _init_desktop_info(&info, appid, uid); retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); ret = _read_desktop_info(&info); retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); - ret = _update_desktop_info(&info); + ret = _update_desktop_info(&info, uid); retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); ret = _send_db_done_noti(NOTI_UPDATE, appid); @@ -1611,19 +1695,19 @@ EXPORT_API ail_error_e ail_desktop_update(const char *appid) return AIL_ERROR_OK; } +EXPORT_API ail_error_e ail_desktop_update(const char *appid) +{ + return ail_usr_desktop_update(appid,GLOBAL_USER); +} -EXPORT_API ail_error_e ail_desktop_remove(const char *appid) +EXPORT_API ail_error_e ail_usr_desktop_remove(const char *appid, uid_t uid) { ail_error_e ret; retv_if(!appid, AIL_ERROR_INVALID_PARAMETER); - if (!__is_authorized()) { - _E("You are not an authorized user on removing!\n"); - return -1; - } - ret = _remove_package(appid); + ret = _remove_package(appid, uid); retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); ret = _send_db_done_noti(NOTI_REMOVE, appid); @@ -1632,11 +1716,62 @@ EXPORT_API ail_error_e ail_desktop_remove(const char *appid) return AIL_ERROR_OK; } +EXPORT_API ail_error_e ail_desktop_remove(const char *appid) +{ + return ail_usr_desktop_remove(appid, GLOBAL_USER); +} + -EXPORT_API ail_error_e ail_desktop_appinfo_modify_bool(const char *appid, +EXPORT_API ail_error_e ail_usr_desktop_clean(const char *pkgid, uid_t uid) +{ + ail_error_e ret; + + retv_if(!pkgid, AIL_ERROR_INVALID_PARAMETER); + + _D("ail_desktop_clean=%s",pkgid); + + ret = _clean_pkgid_data(pkgid, uid); + retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); + + return AIL_ERROR_OK; +} + +EXPORT_API ail_error_e ail_desktop_clean(const char *pkgid) +{ + return ail_usr_desktop_clean(pkgid, GLOBAL_USER); +} + +EXPORT_API ail_error_e ail_usr_desktop_fota(const char *appid, uid_t uid) +{ + desktop_info_s info = {0,}; + ail_error_e ret; + + retv_if(!appid, AIL_ERROR_INVALID_PARAMETER); + + ret = _init_desktop_info(&info, appid, uid); + retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); + + ret = _read_desktop_info(&info); + retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); + + ret = _insert_desktop_info(&info, uid); + retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); + + _fini_desktop_info(&info); + + return AIL_ERROR_OK; +} + +EXPORT_API ail_error_e ail_desktop_fota(const char *appid) +{ + return ail_usr_desktop_fota(appid, GLOBAL_USER); +} + + +EXPORT_API ail_error_e ail_desktop_appinfo_modify_usr_bool(const char *appid, const char *property, bool value, - bool broadcast) + bool broadcast, uid_t uid) { desktop_info_s info = {0,}; ail_error_e ret; @@ -1646,16 +1781,16 @@ EXPORT_API ail_error_e ail_desktop_appinfo_modify_bool(const char *appid, retv_if(strcmp(property, AIL_PROP_X_SLP_ENABLED_BOOL), AIL_ERROR_INVALID_PARAMETER); - ret = _init_desktop_info(&info, appid); + ret = _init_desktop_info(&info, appid, uid); retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); - ret = _load_desktop_info(&info); + ret = _load_desktop_info(&info, uid); retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); ret = _modify_desktop_info_bool(&info, property, value); retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); - ret = _update_desktop_info(&info); + ret = _update_desktop_info(&info, uid); retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); if (broadcast) { @@ -1668,8 +1803,17 @@ EXPORT_API ail_error_e ail_desktop_appinfo_modify_bool(const char *appid, return AIL_ERROR_OK; } +EXPORT_API ail_error_e ail_desktop_appinfo_modify_bool(const char *appid, + const char *property, + bool value, + bool broadcast) +{ + return ail_desktop_appinfo_modify_usr_bool(appid, property, value, broadcast, + GLOBAL_USER); +} -EXPORT_API ail_error_e ail_desktop_appinfo_modify_str(const char *appid, + +EXPORT_API ail_error_e ail_desktop_appinfo_modify_usr_str(const char *appid, uid_t uid, const char *property, const char *value, bool broadcast) @@ -1679,10 +1823,10 @@ EXPORT_API ail_error_e ail_desktop_appinfo_modify_str(const char *appid, retv_if(!appid, AIL_ERROR_INVALID_PARAMETER); - ret = _init_desktop_info(&info, appid); + ret = _init_desktop_info(&info, appid, uid); retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); - ret = _load_desktop_info(&info); + ret = _load_desktop_info(&info, uid); retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); _D("info.name [%s], value [%s]", info.name, value); @@ -1690,7 +1834,7 @@ EXPORT_API ail_error_e ail_desktop_appinfo_modify_str(const char *appid, retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); _D("info.name [%s], value [%s]", info.name, value); - ret = _update_desktop_info(&info); + ret = _update_desktop_info(&info, uid); retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL); if (broadcast) { @@ -1703,4 +1847,13 @@ EXPORT_API ail_error_e ail_desktop_appinfo_modify_str(const char *appid, return AIL_ERROR_OK; } +EXPORT_API ail_error_e ail_desktop_appinfo_modify_str(const char *appid, + const char *property, + const char *value, + bool broadcast) +{ + return ail_desktop_appinfo_modify_usr_str(appid, GLOBAL_USER, property, value, + broadcast); +} + // End of File