diff options
author | Richard Hughes <richard@hughsie.com> | 2016-03-01 22:34:35 +0000 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2016-03-01 22:34:35 +0000 |
commit | 72c1168373de06d8e13012292079a0cbbe6ec4fa (patch) | |
tree | ff5cc43d4f210a3763d44a173e6d2a861a5f6c66 /libappstream-builder/plugins | |
parent | 501a5cad1f9b7c5ac33b2efca783f56391689158 (diff) | |
download | appstream-glib-72c1168373de06d8e13012292079a0cbbe6ec4fa.tar.gz |
Add support for GNOME Shell extensions
Diffstat (limited to 'libappstream-builder/plugins')
-rw-r--r-- | libappstream-builder/plugins/Makefile.am | 7 | ||||
-rw-r--r-- | libappstream-builder/plugins/asb-plugin-shell-extension.c | 234 |
2 files changed, 241 insertions, 0 deletions
diff --git a/libappstream-builder/plugins/Makefile.am b/libappstream-builder/plugins/Makefile.am index b933ed2..861fa37 100644 --- a/libappstream-builder/plugins/Makefile.am +++ b/libappstream-builder/plugins/Makefile.am @@ -5,6 +5,7 @@ AM_CPPFLAGS = \ $(LIBARCHIVE_CFLAGS) \ $(SOUP_CFLAGS) \ $(RPM_CFLAGS) \ + $(JSON_GLIB_CFLAGS) \ $(FREETYPE_CFLAGS) \ -I$(top_srcdir)/libappstream-glib \ -I$(top_builddir)/libappstream-glib \ @@ -16,6 +17,7 @@ plugindir = $(libdir)/asb-plugins-$(AS_PLUGIN_VERSION) plugin_LTLIBRARIES = \ libasb_plugin_absorb.la \ libasb_plugin_appdata.la \ + libasb_plugin_shell_extension.la \ libasb_plugin_desktop.la \ libasb_plugin_gettext.la \ libasb_plugin_hardcoded.la @@ -50,6 +52,11 @@ libasb_plugin_appdata_la_LIBADD = $(GLIB_LIBS) $(GDKPIXBUF_LIBS) libasb_plugin_appdata_la_LDFLAGS = -module -avoid-version libasb_plugin_appdata_la_CFLAGS = $(GLIB_CFLAGS) $(WARNINGFLAGS_C) +libasb_plugin_shell_extension_la_SOURCES = asb-plugin-shell-extension.c +libasb_plugin_shell_extension_la_LIBADD = $(GLIB_LIBS) $(JSON_GLIB_LIBS) +libasb_plugin_shell_extension_la_LDFLAGS = -module -avoid-version +libasb_plugin_shell_extension_la_CFLAGS = $(GLIB_CFLAGS) $(WARNINGFLAGS_C) + if HAVE_FONTS libasb_plugin_font_la_SOURCES = asb-plugin-font.c libasb_plugin_font_la_LIBADD = $(GLIB_LIBS) $(FREETYPE_LIBS) $(GDKPIXBUF_LIBS) $(GTK_LIBS) diff --git a/libappstream-builder/plugins/asb-plugin-shell-extension.c b/libappstream-builder/plugins/asb-plugin-shell-extension.c new file mode 100644 index 0000000..8842b1f --- /dev/null +++ b/libappstream-builder/plugins/asb-plugin-shell-extension.c @@ -0,0 +1,234 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * + * Copyright (C) 2016 Richard Hughes <richard@hughsie.com> + * + * Licensed under the GNU Lesser General Public License Version 2.1 + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <config.h> +#include <fnmatch.h> +#include <json-glib/json-glib.h> + +#include <asb-plugin.h> + +/** + * asb_plugin_get_name: + */ +const gchar * +asb_plugin_get_name (void) +{ + return "shell-extension"; +} + +/** + * asb_plugin_add_globs: + */ +void +asb_plugin_add_globs (AsbPlugin *plugin, GPtrArray *globs) +{ + asb_plugin_add_glob (globs, "/usr/share/gnome-shell/extensions/*/metadata.json"); +} + +/** + * _asb_plugin_check_filename: + */ +static gboolean +_asb_plugin_check_filename (const gchar *filename) +{ + if (asb_plugin_match_glob ("/usr/share/gnome-shell/extensions/*/metadata.json", filename)) + return TRUE; + return FALSE; +} + +/** + * asb_plugin_check_filename: + */ +gboolean +asb_plugin_check_filename (AsbPlugin *plugin, const gchar *filename) +{ + return _asb_plugin_check_filename (filename); +} + +/** + * as_app_parse_shell_extension_data: + */ +static gboolean +as_app_parse_shell_extension_data (AsApp *app, + const gchar *data, + gsize len, + GError **error) +{ + JsonArray *json_array; + JsonNode *json_root; + JsonObject *json_obj; + const gchar *tmp; + g_autoptr(AsIcon) ic = NULL; + g_autoptr(JsonParser) json_parser = NULL; + + /* parse the data */ + json_parser = json_parser_new (); + if (!json_parser_load_from_data (json_parser, data, len, error)) + return FALSE; + json_root = json_parser_get_root (json_parser); + if (json_root == NULL) { + g_set_error_literal (error, + ASB_PLUGIN_ERROR, + ASB_PLUGIN_ERROR_FAILED, + "no root"); + return FALSE; + } + json_obj = json_node_get_object (json_root); + if (json_obj == NULL) { + g_set_error_literal (error, + ASB_PLUGIN_ERROR, + ASB_PLUGIN_ERROR_FAILED, + "no obect"); + return FALSE; + } + + as_app_set_kind (app, AS_APP_KIND_SHELL_EXTENSION); + as_app_set_comment (app, NULL, "GNOME Shell Extension"); + as_app_add_category (AS_APP (app), "Addons"); + as_app_add_category (AS_APP (app), "ShellExtensions"); + tmp = json_object_get_string_member (json_obj, "uuid"); + if (tmp != NULL) { + g_autofree gchar *id = NULL; + id = g_strdup_printf ("%s.shell-extension", tmp); + as_app_set_id (app, id); + } + if (json_object_has_member (json_obj, "gettext-domain")) { + tmp = json_object_get_string_member (json_obj, "gettext-domain"); + if (tmp != NULL) { + g_autoptr(AsTranslation) transaction = NULL; + transaction = as_translation_new (); + as_translation_set_kind (transaction, AS_TRANSLATION_KIND_GETTEXT); + as_translation_set_id (transaction, tmp); + as_app_add_translation (app, transaction); + } + } + if (json_object_has_member (json_obj, "name")) { + tmp = json_object_get_string_member (json_obj, "name"); + if (tmp != NULL) + as_app_set_name (app, NULL, tmp); + } + if (json_object_has_member (json_obj, "description")) { + tmp = json_object_get_string_member (json_obj, "description"); + if (tmp != NULL) { + g_autofree gchar *desc = NULL; + desc = as_markup_import (tmp); + if (desc != NULL) + as_app_set_description (app, NULL, desc); + } + } + if (json_object_has_member (json_obj, "url")) { + tmp = json_object_get_string_member (json_obj, "url"); + if (tmp != NULL) + as_app_add_url (app, AS_URL_KIND_HOMEPAGE, tmp); + } + if (json_object_has_member (json_obj, "original-authors")) { + json_array = json_object_get_array_member (json_obj, "original-authors"); + if (json_array != NULL) { + tmp = json_array_get_string_element (json_array, 0); + as_app_set_developer_name (app, NULL, tmp); + } + } + if (as_app_get_release_default (app) == NULL && + json_object_has_member (json_obj, "shell-version")) { + json_array = json_object_get_array_member (json_obj, "shell-version"); + if (json_array != NULL) { + g_autoptr(AsRelease) release = NULL; + tmp = json_array_get_string_element (json_array, 0); + release = as_release_new (); + as_release_set_state (release, AS_RELEASE_STATE_INSTALLED); + as_release_set_version (release, tmp); + as_app_add_release (app, release); + } + } + + /* use a stock icon */ + ic = as_icon_new (); + as_icon_set_kind (ic, AS_ICON_KIND_STOCK); + as_icon_set_name (ic, "application-x-addon-symbolic"); + as_app_add_icon (app, ic); + return TRUE; +} + +/** + * asb_plugin_process_filename: + */ +static gboolean +asb_plugin_process_filename (AsbPlugin *plugin, + AsbPackage *pkg, + const gchar *filename, + GList **apps, + GError **error) +{ + gsize len; + g_autoptr(AsbApp) app = NULL; + g_autofree gchar *data = NULL; + + app = asb_app_new (pkg, NULL); + if (!g_file_get_contents (filename, &data, &len, error)) + return FALSE; + if (!as_app_parse_shell_extension_data (AS_APP (app), data, len, error)) + return FALSE; + asb_plugin_add_app (apps, AS_APP (app)); + return TRUE; +} + +/** + * asb_plugin_process: + */ +GList * +asb_plugin_process (AsbPlugin *plugin, + AsbPackage *pkg, + const gchar *tmpdir, + GError **error) +{ + gboolean ret; + GList *apps = NULL; + guint i; + gchar **filelist; + + filelist = asb_package_get_filelist (pkg); + for (i = 0; filelist[i] != NULL; i++) { + g_autofree gchar *filename_tmp = NULL; + if (!_asb_plugin_check_filename (filelist[i])) + continue; + filename_tmp = g_build_filename (tmpdir, filelist[i], NULL); + ret = asb_plugin_process_filename (plugin, + pkg, + filename_tmp, + &apps, + error); + if (!ret) { + g_list_free_full (apps, (GDestroyNotify) g_object_unref); + return NULL; + } + } + + /* no desktop files we care about */ + if (apps == NULL) { + g_set_error (error, + ASB_PLUGIN_ERROR, + ASB_PLUGIN_ERROR_FAILED, + "nothing interesting in %s", + asb_package_get_basename (pkg)); + return NULL; + } + return apps; +} |