Add support for watch-application to pkgmgr-parser
[platform/core/appfw/pkgmgr-info.git] / src / pkgmgrinfo_appinfo.c
index 399b954..15383a0 100644 (file)
@@ -250,20 +250,6 @@ static int _appinfo_get_label(sqlite3 *db, const char *appid,
        return PMINFO_R_OK;
 }
 
-static void _appinfo_modify_icon(const char *appid, const char **icon)
-{
-       char buf[PKG_VALUE_STRING_LEN_MAX];
-       const char *tmp;
-
-       if (*icon == NULL || (*icon)[0] == '/' || !strcasecmp(*icon, ""))
-               return;
-
-       tmp = *icon;
-       snprintf(buf, sizeof(buf), "%s%s.png", getIconPath(getuid()), appid);
-       *icon = strdup(buf);
-       free((char *)tmp);
-}
-
 static int _appinfo_get_icon(sqlite3 *db, const char *appid, const char *locale,
                GList **icon)
 {
@@ -300,8 +286,6 @@ static int _appinfo_get_icon(sqlite3 *db, const char *appid, const char *locale,
                }
                idx = 0;
                _save_column_str(stmt, idx++, &info->text);
-               /* FIXME: this is a workaround. this must be removed later */
-               _appinfo_modify_icon(appid, &info->text);
                _save_column_str(stmt, idx++, &info->lang);
                *icon = g_list_append(*icon, info);
        }
@@ -503,6 +487,52 @@ static int _appinfo_get_metadata(sqlite3 *db, const char *appid,
 
 }
 
+static int _appinfo_get_splashscreens(sqlite3 *db, const char *appid,
+               GList **splashscreens)
+{
+       static const char query_raw[] =
+               "SELECT src, type, orientation, indicatordisplay, operation "
+               "FROM package_app_splash_screen WHERE app_id=%Q";
+       int ret;
+       char *query;
+       sqlite3_stmt *stmt;
+       int idx;
+       splashscreen_x *info;
+
+       query = sqlite3_mprintf(query_raw, appid);
+       if (query == NULL) {
+               LOGE("out of memory");
+               return PMINFO_R_ERROR;
+       }
+
+       ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+       sqlite3_free(query);
+       if (ret != SQLITE_OK) {
+               LOGE("prepare failed: %s", sqlite3_errmsg(db));
+               return PMINFO_R_ERROR;
+       }
+
+       while (sqlite3_step(stmt) == SQLITE_ROW) {
+               info = calloc(1, sizeof(splashscreen_x));
+               if (info == NULL) {
+                       LOGE("out of memory");
+                       sqlite3_finalize(stmt);
+                       return PMINFO_R_ERROR;
+               }
+               idx = 0;
+               _save_column_str(stmt, idx++, &info->src);
+               _save_column_str(stmt, idx++, &info->type);
+               _save_column_str(stmt, idx++, &info->orientation);
+               _save_column_str(stmt, idx++, &info->indicatordisplay);
+               _save_column_str(stmt, idx++, &info->operation);
+               *splashscreens = g_list_append(*splashscreens, info);
+       }
+
+       sqlite3_finalize(stmt);
+
+       return PMINFO_R_OK;
+}
+
 static GList *__get_background_category(char *value)
 {
        GList *category_list = NULL;
@@ -545,7 +575,7 @@ static GList *__get_background_category(char *value)
 }
 
 static int _appinfo_get_application(sqlite3 *db, const char *appid,
-               const char *locale, application_x **application)
+               const char *locale, application_x **application, bool is_disabled)
 {
        static const char query_raw[] =
                "SELECT app_id, app_component, app_exec, app_nodisplay, "
@@ -560,15 +590,22 @@ static int _appinfo_get_application(sqlite3 *db, const char *appid,
                "component_type, package, app_process_pool, app_installed_storage, "
                "app_background_category, app_package_type "
                "FROM package_app_info WHERE app_id='%s' "
-               "AND app_id NOT IN "
-               "(SELECT app_id from package_app_disable_for_user WHERE uid='%d')";
+               "AND (app_disable='%s' "
+               "%s app_id %s IN "
+               "(SELECT app_id from package_app_disable_for_user WHERE uid='%d'))";
        int ret;
        char query[MAX_QUERY_LEN] = { '\0' };
        sqlite3_stmt *stmt;
        int idx;
        application_x *info;
        char *bg_category_str = NULL;
-       snprintf(query, MAX_QUERY_LEN - 1, query_raw, appid, (int)getuid());
+       snprintf(query, MAX_QUERY_LEN - 1, query_raw,
+                       appid,
+                       is_disabled ? "true" : "false",
+                       is_disabled ? "OR" : "AND",
+                       is_disabled ? "" : "NOT",
+                       (int)getuid());
+
        ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
        if (ret != SQLITE_OK) {
                LOGE("prepare failed: %s", sqlite3_errmsg(db));
@@ -663,6 +700,12 @@ static int _appinfo_get_application(sqlite3 *db, const char *appid,
                return PMINFO_R_ERROR;
        }
 
+       if (_appinfo_get_splashscreens(db, info->appid, &info->splashscreens)) {
+               pkgmgrinfo_basic_free_application(info);
+               sqlite3_finalize(stmt);
+               return PMINFO_R_ERROR;
+       }
+
        *application = info;
 
        sqlite3_finalize(stmt);
@@ -671,7 +714,7 @@ static int _appinfo_get_application(sqlite3 *db, const char *appid,
 }
 
 static int _appinfo_get_appinfo(const char *appid, uid_t uid,
-               pkgmgr_appinfo_x **appinfo)
+               pkgmgr_appinfo_x **appinfo, bool is_disabled)
 {
        int ret;
        sqlite3 *db;
@@ -702,7 +745,7 @@ static int _appinfo_get_appinfo(const char *appid, uid_t uid,
                return PMINFO_R_ERROR;
        }
 
-       ret = _appinfo_get_application(db, appid, locale, &info->app_info);
+       ret = _appinfo_get_application(db, appid, locale, &info->app_info, is_disabled);
        if (ret != PMINFO_R_OK) {
                free(info);
                free(locale);
@@ -720,6 +763,32 @@ static int _appinfo_get_appinfo(const char *appid, uid_t uid,
        return ret;
 }
 
+API int pkgmgrinfo_appinfo_get_usr_disabled_appinfo(const char *appid, uid_t uid,
+               pkgmgrinfo_appinfo_h *handle)
+{
+       int ret;
+
+       if (appid == NULL || handle == NULL) {
+               LOGE("invalid parameter");
+               return PMINFO_R_EINVAL;
+       }
+
+       ret = _appinfo_get_appinfo(appid, uid, (pkgmgr_appinfo_x **)handle, true);
+       if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER)
+               ret = _appinfo_get_appinfo(appid, GLOBAL_USER,
+                               (pkgmgr_appinfo_x **)handle, true);
+
+       if (ret != PMINFO_R_OK)
+               _LOGE("failed to get appinfo of %s for user %d", appid, uid);
+
+       return ret;
+}
+
+API int pkgmgrinfo_appinfo_get_disabled_appinfo(const char *appid, pkgmgrinfo_appinfo_h *handle)
+{
+       return pkgmgrinfo_appinfo_get_usr_disabled_appinfo(appid, GLOBAL_USER, handle);
+}
+
 API int pkgmgrinfo_appinfo_get_usr_appinfo(const char *appid, uid_t uid,
                pkgmgrinfo_appinfo_h *handle)
 {
@@ -730,10 +799,10 @@ API int pkgmgrinfo_appinfo_get_usr_appinfo(const char *appid, uid_t uid,
                return PMINFO_R_EINVAL;
        }
 
-       ret = _appinfo_get_appinfo(appid, uid, (pkgmgr_appinfo_x **)handle);
+       ret = _appinfo_get_appinfo(appid, uid, (pkgmgr_appinfo_x **)handle, false);
        if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER)
                ret = _appinfo_get_appinfo(appid, GLOBAL_USER,
-                               (pkgmgr_appinfo_x **)handle);
+                               (pkgmgr_appinfo_x **)handle, false);
 
        if (ret != PMINFO_R_OK)
                _LOGE("failed to get appinfo of %s for user %d", appid, uid);
@@ -799,8 +868,6 @@ static gpointer __copy_icon(gconstpointer src, gpointer data)
                icon->text = strdup(tmp->text);
        if (tmp->lang)
                icon->lang = strdup(tmp->lang);
-       if (tmp->name)
-               icon->name = strdup(tmp->name);
        if (tmp->section)
                icon->section = strdup(tmp->section);
        if (tmp->size)
@@ -875,6 +942,32 @@ static gpointer __copy_appcontrol(gconstpointer src, gpointer data)
        return appcontrol;
 }
 
+static gpointer __copy_splashscreens(gconstpointer src, gpointer data)
+{
+       splashscreen_x *tmp = (splashscreen_x *)src;
+       splashscreen_x *splashscreen;
+
+       splashscreen = (splashscreen_x *)calloc(1, sizeof(splashscreen_x));
+       if (splashscreen == NULL) {
+               LOGE("memory alloc failed");
+               *(int *)data = -1;
+               return NULL;
+       }
+
+       if (tmp->src)
+               splashscreen->src = strdup(tmp->src);
+       if (tmp->type)
+               splashscreen->type = strdup(tmp->type);
+       if (tmp->orientation)
+               splashscreen->orientation = strdup(tmp->orientation);
+       if (tmp->indicatordisplay)
+               splashscreen->indicatordisplay = strdup(tmp->indicatordisplay);
+       if (tmp->operation)
+               splashscreen->operation = strdup(tmp->operation);
+
+       return splashscreen;
+}
+
 static int _appinfo_copy_appinfo(application_x **application, application_x *data)
 {
        application_x *app_info;
@@ -1008,6 +1101,14 @@ static int _appinfo_copy_appinfo(application_x **application, application_x *dat
                return PMINFO_R_ERROR;
        }
 
+       ret = 0;
+       app_info->splashscreens = g_list_copy_deep(data->splashscreens, __copy_splashscreens, &ret);
+       if (ret < 0) {
+               LOGE("memory alloc failed");
+               pkgmgrinfo_basic_free_application(app_info);
+               return PMINFO_R_ERROR;
+       }
+
        *application = app_info;
 
        return PMINFO_R_OK;
@@ -1068,10 +1169,10 @@ static int _appinfo_get_filtered_foreach_appinfo(uid_t uid,
        for (tmp = list; tmp; tmp = tmp->next) {
                appid = (char *)tmp->data;
                if (stop == 0) {
-                       ret = _appinfo_get_appinfo(appid, uid, &info);
+                       ret = _appinfo_get_appinfo(appid, uid, &info, false);
                        if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER)
                                ret = _appinfo_get_appinfo(appid, GLOBAL_USER,
-                                               &info);
+                                               &info, false);
                        if (ret != PMINFO_R_OK) {
                                free(appid);
                                continue;
@@ -1408,10 +1509,14 @@ API int pkgmgrinfo_appinfo_get_localed_label(const char *appid, const char *loca
 
 static pkgmgrinfo_app_component __appcomponent_convert(const char *comp)
 {
-       if ( strcasecmp(comp, "uiapp") == 0)
+       if (strcasecmp(comp, "uiapp") == 0)
                return PMINFO_UI_APP;
-       else if ( strcasecmp(comp, "svcapp") == 0)
+       else if (strcasecmp(comp, "svcapp") == 0)
                return PMINFO_SVC_APP;
+       else if (strcasecmp(comp, "widgetapp") == 0)
+               return PMINFO_WIDGET_APP;
+       else if (strcasecmp(comp, "watchapp") == 0)
+               return PMINFO_WATCH_APP;
        else
                return -1;
 }
@@ -1694,8 +1799,8 @@ API int pkgmgrinfo_appinfo_get_effectimage(pkgmgrinfo_appinfo_h handle, char **p
        retvm_if(portrait_img == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
        retvm_if(landscape_img == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
 
-       if (info->app_info == NULL || info->app_info->portraitimg ||
-                       info->app_info->landscapeimg == NULL)
+       if (info->app_info == NULL || (info->app_info->portraitimg == NULL
+                       && info->app_info->landscapeimg == NULL))
                return PMINFO_R_ERROR;
 
        *portrait_img = (char *)info->app_info->portraitimg;
@@ -2013,6 +2118,38 @@ API int pkgmgrinfo_appinfo_foreach_background_category(
        return PMINFO_R_OK;
 }
 
+API int pkgmgrinfo_appinfo_foreach_splash_screen(pkgmgrinfo_appinfo_h handle,
+               pkgmgrinfo_app_splash_screen_list_cb splash_screen_func,
+               void *user_data)
+{
+       pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle;
+       splashscreen_x *splashscreen;
+       GList *tmp;
+       int ret;
+
+       if (info == NULL || info->app_info == NULL
+                       || splash_screen_func == NULL) {
+               LOGE("invalid parameter");
+               return PMINFO_R_EINVAL;
+       }
+
+       for (tmp = info->app_info->splashscreens; tmp; tmp = tmp->next) {
+               splashscreen = (splashscreen_x *)tmp->data;
+               if (splashscreen == NULL)
+                       continue;
+               ret = splash_screen_func(splashscreen->src,
+                               splashscreen->type,
+                               splashscreen->orientation,
+                               splashscreen->indicatordisplay,
+                               splashscreen->operation,
+                               user_data);
+               if (ret < 0)
+                       break;
+       }
+
+       return PMINFO_R_OK;
+}
+
 API int pkgmgrinfo_appinfo_is_nodisplay(pkgmgrinfo_appinfo_h handle, bool *nodisplay)
 {
        retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL");