Setting smack labels to User with vconftool option
[platform/core/appfw/ail.git] / src / ail_desktop.c
index cd03040..1e666cc 100755 (executable)
@@ -22,6 +22,7 @@
 
 
 #define _GNU_SOURCE
+#include <errno.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <time.h>
 #include <sys/types.h>
 #include <sys/wait.h>
+#include <tzplatform_config.h>
 #include <xdgmime.h>
 
-#include <vconf.h>
 #include <glib.h>
+#include <grp.h>
+#include <pwd.h>
 
 #include "ail_private.h"
 #include "ail_db.h"
 #include "ail_sql.h"
 #include "ail.h"
+#include "ail_vconf.h"
 
-#define OPT_DESKTOP_DIRECTORY "/opt/share/applications"
-#define USR_DESKTOP_DIRECTORY "/usr/share/applications"
-#define BUFSZE 4096
+#define BUFSIZE 4096
+#define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
 
 #define whitespace(c) (((c) == ' ') || ((c) == '\t'))
 #define argsdelimiter  " \t"
@@ -63,7 +66,7 @@ typedef enum {
 
 struct entry_parser {
        const char *field;
-       ail_error_e (*value_cb)(void *data, char *tag, char *value);
+       ail_error_e (*value_cb)(void *data, char *tag, char *value, uid_t uid);
 };
 
 inline static char *_ltrim(char *str)
@@ -111,6 +114,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,13 +124,14 @@ 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;
 
 
 
-static ail_error_e _read_exec(void *data, char *tag, char *value)
+static ail_error_e _read_exec(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
        char *token_exe_path;
@@ -161,7 +167,7 @@ static ail_error_e _read_exec(void *data, char *tag, char *value)
 
 
 
-static ail_error_e _read_name(void *data, char *tag, char *value)
+static ail_error_e _read_name(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
 
@@ -202,7 +208,7 @@ static ail_error_e _read_name(void *data, char *tag, char *value)
 
 
 
-static ail_error_e _read_type(void *data, char *tag, char *value)
+static ail_error_e _read_type(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
 
@@ -238,7 +244,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);
 
@@ -247,11 +253,14 @@ _get_icon_with_path(char* icon)
                char* theme = NULL;
                char* icon_with_path = NULL;
                int len;
+               char *app_path = NULL;
 
                package = _get_package_from_icon(icon);
                retv_if(!package, NULL);
 
-               theme = vconf_get_str("db/setting/theme");
+/* "db/setting/theme" is not exist */
+#if 0
+               theme = ail_vconf_get_str("db/setting/theme");
                if (!theme) {
                        theme = strdup("default");
                        if(!theme) {
@@ -259,48 +268,35 @@ _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)) {
+                       app_path = tzplatform_getenv(TZ_SYS_RW_APP);
+                       if (app_path)
+                               sqlite3_snprintf( len, icon_with_path, "%s/%q/res/icons/%q/small/%q",app_path, package, theme, icon);
+                       if (access (icon_with_path, F_OK))
+                               _E("Cannot find icon path");
+               }
                free(theme);
                free(package);
-
-               _D("Icon path : %s ---> %s", icon, icon_with_path);
-
+               _D("Icon path : %s", icon_with_path);
                return icon_with_path;
        } else {
                char* confirmed_icon = NULL;
@@ -312,14 +308,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);
 
@@ -328,7 +324,7 @@ static ail_error_e _read_icon(void *data, char *tag, char *value)
 
 
 
-static ail_error_e _read_categories(void *data, char *tag, char *value)
+static ail_error_e _read_categories(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
 
@@ -343,7 +339,7 @@ static ail_error_e _read_categories(void *data, char *tag, char *value)
 
 
 
-static ail_error_e _read_version(void *data, char *tag, char *value)
+static ail_error_e _read_version(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
 
@@ -358,7 +354,7 @@ static ail_error_e _read_version(void *data, char *tag, char *value)
 
 
 
-static ail_error_e _read_mimetype(void *data, char *tag, char *value)
+static ail_error_e _read_mimetype(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
        int size, total_len = 0;
@@ -420,7 +416,7 @@ static ail_error_e _read_mimetype(void *data, char *tag, char *value)
 
 
 
-static ail_error_e _read_nodisplay(void *data, char *tag, char *value)
+static ail_error_e _read_nodisplay(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s* info = data;
 
@@ -434,7 +430,7 @@ static ail_error_e _read_nodisplay(void *data, char *tag, char *value)
 
 
 
-static ail_error_e _read_x_slp_service(void *data, char *tag, char *value)
+static ail_error_e _read_x_slp_service(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
 
@@ -449,7 +445,7 @@ static ail_error_e _read_x_slp_service(void *data, char *tag, char *value)
 
 
 
-static ail_error_e _read_x_slp_packagetype(void *data, char *tag, char *value)
+static ail_error_e _read_x_slp_packagetype(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
 
@@ -464,7 +460,7 @@ static ail_error_e _read_x_slp_packagetype(void *data, char *tag, char *value)
 
 
 
-static ail_error_e _read_x_slp_packagecategories(void *data, char *tag, char *value)
+static ail_error_e _read_x_slp_packagecategories(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
 
@@ -479,7 +475,7 @@ static ail_error_e _read_x_slp_packagecategories(void *data, char *tag, char *va
 
 
 
-static ail_error_e _read_x_slp_packageid(void *data, char *tag, char *value)
+static ail_error_e _read_x_slp_packageid(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
 
@@ -492,9 +488,33 @@ 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, uid_t uid)
+{
+       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, uid_t uid)
+{
+       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)
+static ail_error_e _read_x_slp_uri(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
 
@@ -509,7 +529,7 @@ static ail_error_e _read_x_slp_uri(void *data, char *tag, char *value)
 
 
 
-static ail_error_e _read_x_slp_svc(void *data, char *tag, char *value)
+static ail_error_e _read_x_slp_svc(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
 
@@ -524,7 +544,7 @@ static ail_error_e _read_x_slp_svc(void *data, char *tag, char *value)
 
 
 
-static ail_error_e _read_x_slp_taskmanage(void *data, char *tag, char *value)
+static ail_error_e _read_x_slp_taskmanage(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
 
@@ -538,7 +558,7 @@ static ail_error_e _read_x_slp_taskmanage(void *data, char *tag, char *value)
 
 
 
-static ail_error_e _read_x_slp_multiple(void *data, char *tag, char *value)
+static ail_error_e _read_x_slp_multiple(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
 
@@ -552,7 +572,7 @@ static ail_error_e _read_x_slp_multiple(void *data, char *tag, char *value)
 
 
 
-static ail_error_e _read_x_slp_removable(void *data, char *tag, char *value)
+static ail_error_e _read_x_slp_removable(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
 
@@ -565,7 +585,19 @@ static ail_error_e _read_x_slp_removable(void *data, char *tag, char *value)
 }
 
 
-static ail_error_e _read_x_slp_appid(void *data, char *tag, char *value)
+static ail_error_e _read_x_slp_submode(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->x_slp_submode = !strcasecmp(value, "true");
+
+       return AIL_ERROR_OK;
+}
+
+static ail_error_e _read_x_slp_appid(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
 
@@ -579,7 +611,7 @@ static ail_error_e _read_x_slp_appid(void *data, char *tag, char *value)
 }
 
 
-static ail_error_e _read_x_slp_pkgid(void *data, char *tag, char *value)
+static ail_error_e _read_x_slp_pkgid(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
 
@@ -593,7 +625,7 @@ static ail_error_e _read_x_slp_pkgid(void *data, char *tag, char *value)
 }
 
 
-static ail_error_e _read_x_slp_domain(void *data, char *tag, char *value)
+static ail_error_e _read_x_slp_domain(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
 
@@ -607,7 +639,7 @@ static ail_error_e _read_x_slp_domain(void *data, char *tag, char *value)
 }
 
 
-static ail_error_e _read_x_slp_enabled(void *data, char *tag, char *value)
+static ail_error_e _read_x_slp_enabled(void *data, char *tag, char *value, uid_t uid)
 {
        desktop_info_s *info = data;
 
@@ -666,6 +698,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 +726,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 +762,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 +781,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 = ail_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 +846,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 +870,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 +920,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 +935,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 +953,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,15 +974,17 @@ 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;
 }
 
 
 
-static ail_error_e _read_desktop_info(desktop_info_s* info)
+static ail_error_e _read_desktop_info(desktop_info_s* info,uid_t uid)
 {
        char *line = NULL;
        FILE *fp;
@@ -974,7 +1027,7 @@ static ail_error_e _read_desktop_info(desktop_info_s* info)
 
                for (idx = 0; entry_parsers[idx].field; idx ++) {
                        if (!g_ascii_strcasecmp(entry_parsers[idx].field, field_name) && entry_parsers[idx].value_cb) {
-                               if (entry_parsers[idx].value_cb(info, tag, tmp) != AIL_ERROR_OK) {
+                               if (entry_parsers[idx].value_cb(info, tag, tmp,uid) != AIL_ERROR_OK) {
                                        _E("field - [%s] is wrong.", field_name);
                                }
                                break;
@@ -1039,6 +1092,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 +1103,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 +1118,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 +1132,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 +1211,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 +1224,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 +1271,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 +1281,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 +1309,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 +1319,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 +1380,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 +1390,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 +1410,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 +1420,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 +1459,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 +1476,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,13 +1576,13 @@ 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);
-       vconf_set_str(VCONFKEY_AIL_INFO_STATE, noti_string);
-       vconf_set_str(VCONFKEY_MENUSCREEN_DESKTOP, noti_string); // duplicate, will be removed
+       snprintf(noti_string, size + 1, "%s:%s:%u", type_string, package, getuid());
+       ail_vconf_set_str(VCONFKEY_AIL_INFO_STATE, noti_string);
+       ail_vconf_set_str(VCONFKEY_MENUSCREEN_DESKTOP, noti_string); // duplicate, will be removed
        _D("Noti : %s", noti_string);
 
        free(noti_string);
@@ -1524,6 +1622,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);
@@ -1536,7 +1636,7 @@ static void _fini_desktop_info(desktop_info_s *info)
 static int __is_authorized()
 {
        uid_t uid = getuid();
-       if ((uid_t) 0 == uid )
+       if ((uid_t) GLOBAL_USER == uid )
                return 1;
        else
                return 0;
@@ -1544,33 +1644,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);
+       ret = _read_desktop_info(&info,uid);
        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 +1668,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);
+       ret = _read_desktop_info(&info,uid);
        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 +1697,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 +1718,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,uid);
+       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 +1783,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 +1805,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 +1825,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 +1836,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 +1849,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