[gnome-software/wip/libappstream] Implement all refinement methods
- From: Matthias Klumpp <mak src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/wip/libappstream] Implement all refinement methods
- Date: Sat, 10 May 2014 16:28:28 +0000 (UTC)
commit 02e388770ec94eae3f9c07c8bfd7b97f7fbfa8ce
Author: Matthias Klumpp <matthias tenstral net>
Date: Sat May 10 18:28:16 2014 +0200
Implement all refinement methods
configure.ac | 2 +-
src/plugins/gs-plugin-libappstream.c | 223 ++++++++++++++++++++++++++++++++--
2 files changed, 216 insertions(+), 9 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index b9e33c2..019db76 100644
--- a/configure.ac
+++ b/configure.ac
@@ -62,7 +62,7 @@ dnl ---------------------------------------------------------------------------
PKG_CHECK_MODULES(GTK, gtk+-3.0 >= 3.11.5 gio-unix-2.0)
PKG_CHECK_MODULES(PACKAGEKIT, packagekit-glib2 >= 0.8.12)
PKG_CHECK_MODULES(APPSTREAM, appstream-glib >= 0.1.3)
-PKG_CHECK_MODULES(LIBAPPSTREAM, appstream >= 0.6.1)
+PKG_CHECK_MODULES(LIBAPPSTREAM, appstream >= 0.6.2)
PKG_CHECK_MODULES(SQLITE, sqlite3)
PKG_CHECK_MODULES(SOUP, libsoup-2.4)
PKG_CHECK_MODULES(GSETTINGS_DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.11.5)
diff --git a/src/plugins/gs-plugin-libappstream.c b/src/plugins/gs-plugin-libappstream.c
index 34a1dad..c4f778f 100644
--- a/src/plugins/gs-plugin-libappstream.c
+++ b/src/plugins/gs-plugin-libappstream.c
@@ -118,7 +118,7 @@ gs_plugin_startup (GsPlugin *plugin, GCancellable *cancellable, GError **error)
AsComponent *cpt;
cpt = (AsComponent*) g_ptr_array_index (items, i);
g_hash_table_insert (plugin->priv->cpts,
- g_strdup (as_component_get_idname (cpt)),
+ g_strdup (as_component_get_id (cpt)),
g_object_ref (cpt));
}
@@ -130,6 +130,60 @@ out:
}
/**
+ * gs_plugin_refine_add_screenshots:
+ */
+static void
+gs_plugin_refine_add_screenshots (GsApp *app, AsComponent *item)
+{
+ AsImage *im;
+ AsScreenshot *ss;
+ AsScreenshotKind ss_kind;
+ GPtrArray *images_as;
+ GPtrArray *screenshots_as;
+ GsScreenshot *screenshot;
+ guint i;
+ guint j;
+
+ /* do we have any to add */
+ screenshots_as = as_component_get_screenshots (item);
+ if (screenshots_as->len == 0)
+ return;
+
+ /* does the app already have some */
+ gs_app_add_kudo (app, GS_APP_KUDO_HAS_SCREENSHOTS);
+ if (gs_app_get_screenshots(app)->len > 0)
+ return;
+
+ /* add any we know */
+ for (i = 0; i < screenshots_as->len &&
+ i < GS_PLUGIN_APPSTREAM_MAX_SCREENSHOTS; i++) {
+ ss = g_ptr_array_index (screenshots_as, i);
+ images_as = as_screenshot_get_images (ss);
+ if (images_as->len == 0)
+ continue;
+ ss_kind = as_screenshot_get_kind (ss);
+ if (ss_kind == AS_SCREENSHOT_KIND_UNKNOWN)
+ continue;
+
+ /* create a new application screenshot and add each image */
+ screenshot = gs_screenshot_new ();
+ gs_screenshot_set_is_default (screenshot,
+ ss_kind == AS_SCREENSHOT_KIND_DEFAULT);
+ gs_screenshot_set_caption (screenshot,
+ as_screenshot_get_caption (ss));
+ for (j = 0; j < images_as->len; j++) {
+ im = g_ptr_array_index (images_as, j);
+ gs_screenshot_add_image (screenshot,
+ as_image_get_url (im),
+ as_image_get_width (im),
+ as_image_get_height (im));
+ }
+ gs_app_add_screenshot (app, screenshot);
+ g_object_unref (screenshot);
+ }
+}
+
+/**
* gs_plugin_refine_item:
*/
static gboolean
@@ -139,8 +193,8 @@ gs_plugin_refine_item (GsPlugin *plugin,
GError **error)
{
GHashTable *urls;
- const gchar *pkgname;
const gchar *tmp;
+ GPtrArray *pkgs;
GdkPixbuf *pixbuf;
gboolean ret = TRUE;
@@ -150,8 +204,12 @@ gs_plugin_refine_item (GsPlugin *plugin,
gs_app_set_kind (app, GS_APP_KIND_NORMAL);
}
+ /* FIXME: This looks like a hack... Need to learn how to properly set app states */
+ if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN)
+ gs_app_set_state (app, GS_APP_STATE_AVAILABLE);
+
/* set id */
- gs_app_set_id (app, as_component_get_idname (item));
+ gs_app_set_id (app, as_component_get_id (item));
/* set name */
tmp = as_component_get_name (item);
@@ -238,10 +296,21 @@ gs_plugin_refine_item (GsPlugin *plugin,
gs_app_set_project_group (app, tmp);
}
+ /* this is a core application for the desktop and cannot be removed */
+ if (as_component_is_compulsory_for_desktop (item, "GNOME") &&
+ gs_app_get_kind (app) == GS_APP_KIND_NORMAL)
+ gs_app_set_kind (app, GS_APP_KIND_SYSTEM);
+
/* set package names */
- pkgname = as_component_get_pkgname (item);
+ pkgs = gs_app_get_sources (app);
+ if (pkgs->len == 0) {
+ g_ptr_array_add (pkgs, g_strdup (as_component_get_pkgname (item)));
+ }
+
+ /* set screenshots */
+ gs_plugin_refine_add_screenshots (app, item);
- // TODO
+ /* TODO: Refine more stuff */
out:
return ret;
@@ -368,10 +437,8 @@ gs_plugin_add_search (GsPlugin *plugin,
for (i = 0; i < array->len; i++) {
AsComponent *cpt;
cpt = (AsComponent*) g_ptr_array_index (array, i);
- app = gs_app_new (as_component_get_idname (cpt));
+ app = gs_app_new (as_component_get_id (cpt));
ret = gs_plugin_refine_item (plugin, app, cpt, error);
- /* FIXME: This looks like a hack... Need to learn how to properly set app states */
- gs_app_set_state (app, GS_APP_STATE_AVAILABLE);
if (!ret)
goto out;
gs_plugin_add_app (list, app);
@@ -386,3 +453,143 @@ out:
g_ptr_array_unref (array);
return ret;
}
+
+/**
+ * gs_plugin_add_categories:
+ */
+gboolean
+gs_plugin_add_categories (GsPlugin *plugin,
+ GList **list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ const gchar *search_id1;
+ const gchar *search_id2 = NULL;
+ gboolean ret = TRUE;
+ GList *l;
+ GList *l2;
+ GList *children;
+ GList *cpt_list;
+ GList *cl;
+ GsCategory *category;
+ GsCategory *parent;
+
+ /* load database */
+ if (g_once_init_enter (&plugin->priv->done_init)) {
+ ret = gs_plugin_startup (plugin, cancellable, error);
+ g_once_init_leave (&plugin->priv->done_init, TRUE);
+ if (!ret)
+ goto out;
+ }
+
+ /* find out how many packages are in each category */
+ gs_profile_start (plugin->profile, "appstream::add-categories");
+ cpt_list = g_hash_table_get_values (plugin->priv->cpts);
+
+ for (l = *list; l != NULL; l = l->next) {
+ parent = GS_CATEGORY (l->data);
+ search_id2 = gs_category_get_id (parent);
+ children = gs_category_get_subcategories (parent);
+
+ for (l2 = children; l2 != NULL; l2 = l2->next) {
+ category = GS_CATEGORY (l2->data);
+
+ /* just look at each app in turn */
+ for (cl = cpt_list; cl != NULL; cl = cl->next) {
+ AsComponent *item;
+ item = AS_COMPONENT (cl->data);
+
+ if (as_component_get_id (item) == NULL)
+ continue;
+ if (!as_component_has_category (item, search_id2))
+ continue;
+ search_id1 = gs_category_get_id (category);
+ if (search_id1 != NULL &&
+ !as_component_has_category (item, search_id1))
+ continue;
+
+ /* we have another result */
+ gs_category_increment_size (category);
+ gs_category_increment_size (parent);
+ }
+ }
+ g_list_free (children);
+ }
+ gs_profile_stop (plugin->profile, "appstream::add-categories");
+out:
+ return ret;
+}
+
+/**
+ * gs_plugin_add_category_apps:
+ */
+gboolean
+gs_plugin_add_category_apps (GsPlugin *plugin,
+ GsCategory *category,
+ GList **list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ const gchar *search_id1;
+ const gchar *search_id2 = NULL;
+ gboolean ret = TRUE;
+ GsCategory *parent;
+ GPtrArray *array = NULL;
+ guint i;
+
+ /* load database */
+ if (g_once_init_enter (&plugin->priv->done_init)) {
+ ret = gs_plugin_startup (plugin, cancellable, error);
+ g_once_init_leave (&plugin->priv->done_init, TRUE);
+ if (!ret)
+ goto out;
+ }
+
+ /* get the two search terms */
+ gs_profile_start (plugin->profile, "appstream::add-category-apps");
+ search_id1 = gs_category_get_id (category);
+ parent = gs_category_get_parent (category);
+ if (parent != NULL)
+ search_id2 = gs_category_get_id (parent);
+
+ /* the "General" item has no ID */
+ if (search_id1 == NULL) {
+ search_id1 = search_id2;
+ search_id2 = NULL;
+ }
+
+ /* quick-find the applications */
+ array = as_database_find_components_by_str (plugin->priv->db, "", search_id1);
+ if ((array == NULL) || (array->len == 0)) {
+ g_set_error (error,
+ GS_PLUGIN_LOADER_ERROR,
+ GS_PLUGIN_LOADER_ERROR_NO_RESULTS,
+ _("No components in category '%s' found."),
+ search_id1);
+ ret = FALSE;
+ goto out;
+ }
+
+ /* just look at each app in turn */
+ for (i = 0; i < array->len; i++) {
+ GsApp *app;
+ AsComponent *item;
+ item = g_ptr_array_index (array, i);
+ if (as_component_get_id (item) == NULL)
+ continue;
+ if (search_id2 != NULL && !as_component_has_category (item, search_id2))
+ continue;
+
+ /* got a search match, so add all the data we can */
+ app = gs_app_new (as_component_get_id (item));
+ ret = gs_plugin_refine_item (plugin, app, item, error);
+ if (!ret)
+ goto out;
+ gs_plugin_add_app (list, app);
+ }
+ gs_profile_stop (plugin->profile, "appstream::add-category-apps");
+out:
+ if (array != NULL)
+ g_ptr_array_unref (array);
+ return ret;
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]