Add new elements for component-based application
[platform/core/appfw/pkgmgr-info.git] / src / pkgmgrinfo_appinfo.c
index 3ea034f..bc42092 100644 (file)
@@ -332,6 +332,52 @@ static int _appinfo_get_splashscreens(sqlite3 *db, const char *appid,
        return PMINFO_R_OK;
 }
 
+static int _appinfo_get_component_info(sqlite3 *db, const char *appid,
+               GList **components)
+{
+       static const char query_raw[] =
+               "SELECT component_id, type, launch_mode "
+               "FROM package_app_component_info "
+               "WHERE app_id=%Q";
+       int ret;
+       char *query;
+       sqlite3_stmt *stmt;
+       int idx;
+       component_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(component_x));
+               if (info == NULL) {
+                       LOGE("out of memory");
+                       sqlite3_finalize(stmt);
+                       return PMINFO_R_ERROR;
+               }
+
+               idx = 0;
+               _save_column_str(stmt, idx++, &info->id);
+               _save_column_str(stmt, idx++, &info->type);
+               _save_column_str(stmt, idx++, &info->launch_mode);
+               *components = g_list_append(*components, info);
+       }
+
+       sqlite3_finalize(stmt);
+
+       return PMINFO_R_OK;
+}
+
 static GList *__get_background_category(const char *value)
 {
        GList *category_list = NULL;
@@ -703,6 +749,15 @@ static int _appinfo_get_applications(uid_t db_uid, uid_t uid,
                        }
                }
 
+               if (info->component &&
+                               !strcmp(info->component, "componentbasedapp")) {
+                       if (_appinfo_get_component_info(db, info->appid,
+                                               &info->components)) {
+                               ret = PMINFO_R_ERROR;
+                               goto catch;
+                       }
+               }
+
                if (is_check_storage &&
                                __appinfo_check_installed_storage(info) != PMINFO_R_OK) {
                        ret = PMINFO_R_ERROR;
@@ -1080,6 +1135,28 @@ static gpointer __copy_splashscreens(gconstpointer src, gpointer data)
        return splashscreen;
 }
 
+static gpointer __copy_components(gconstpointer src, gpointer data)
+{
+       component_x *tmp = (component_x *)src;
+       component_x *component;
+
+       component = (component_x *)calloc(1, sizeof(component_x));
+       if (component == NULL) {
+               LOGE("memory alloc failed");
+               *(int *)data = -1;
+               return NULL;
+       }
+
+       if (tmp->id)
+               component->id = strdup(tmp->id);
+       if (tmp->type)
+               component->type = strdup(tmp->type);
+       if (tmp->launch_mode)
+               component->launch_mode = strdup(tmp->launch_mode);
+
+       return component;
+}
+
 static int _appinfo_copy_appinfo(application_x **application, application_x *data)
 {
        application_x *app_info;
@@ -1223,6 +1300,15 @@ static int _appinfo_copy_appinfo(application_x **application, application_x *dat
                return PMINFO_R_ERROR;
        }
 
+       ret = 0;
+       app_info->components = g_list_copy_deep(data->components,
+                       __copy_components, &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;
@@ -1725,6 +1811,8 @@ static pkgmgrinfo_app_component __appcomponent_convert(const char *comp)
                return PMINFO_WIDGET_APP;
        else if (strcasecmp(comp, "watchapp") == 0)
                return PMINFO_WATCH_APP;
+       else if (strcasecmp(comp, "componentbasedapp") == 0)
+               return PMINFO_COMPONENT_BASED_APP;
        else
                return -1;
 }
@@ -1740,6 +1828,8 @@ static const char *__appcomponent_str(pkgmgrinfo_app_component comp)
                return "widgetapp";
        case PMINFO_WATCH_APP:
                return "watchapp";
+       case PMINFO_COMPONENT_BASED_APP:
+               return "componentbasedapp";
        default:
                return NULL;
        }
@@ -3687,3 +3777,25 @@ API int pkgmgrinfo_appinfo_foreach_remote_appcontrol_v2(
 
        return PMINFO_R_OK;
 }
+
+API int pkgmgrinfo_appinfo_foreach_component_info(pkgmgrinfo_appinfo_h handle,
+               pkgmgrinfo_component_info_list_cb callback, void *user_data)
+{
+       retvm_if(handle == NULL, PMINFO_R_EINVAL, "appinfo handle is NULL");
+       retvm_if(callback == NULL, PMINFO_R_EINVAL, "callback is NULL");
+       pkgmgr_appinfo_x *info = (pkgmgr_appinfo_x *)handle;
+       pkgmgr_compinfo_x compinfo;
+       GList *tmp;
+
+       if (info->app_info == NULL)
+               return PMINFO_R_ERROR;
+
+       compinfo.appid = info->app_info->appid;
+       for (tmp = info->app_info->components; tmp; tmp = tmp->next) {
+               compinfo.comp_info = (component_x *)tmp->data;
+               if (callback(&compinfo, user_data) < 0)
+                       break;
+       }
+
+       return PMINFO_R_OK;
+}