summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2015-09-16 16:36:08 +0100
committerRichard Hughes <richard@hughsie.com>2015-09-16 17:59:30 +0100
commit8c58e47632f1e3da2723e57b2cb1bf775da37234 (patch)
tree0d64d33a98ef0c393a8058a267e911ac7c497bc2
parentd707ebe7e684a7f8aae6c65be390d02cb0740077 (diff)
downloadappstream-glib-8c58e47632f1e3da2723e57b2cb1bf775da37234.tar.gz
Require AppData files to be present in the AppStream metadata
This changes the default processing element from the desktop file to an AppData (or MetaInfo) file, and the other sources now refine the base object rather than the other way around. This matches what Debian is doing.
-rw-r--r--configure.ac2
-rw-r--r--libappstream-builder/asb-app.c122
-rw-r--r--libappstream-builder/asb-app.h11
-rw-r--r--libappstream-builder/asb-plugin-loader.c17
-rw-r--r--libappstream-builder/asb-self-test.c131
-rw-r--r--libappstream-builder/asb-task.c12
-rw-r--r--libappstream-builder/plugins/Makefile.am18
-rw-r--r--libappstream-builder/plugins/asb-plugin-appdata.c358
-rw-r--r--libappstream-builder/plugins/asb-plugin-blacklist.c2
-rw-r--r--libappstream-builder/plugins/asb-plugin-desktop.c124
-rw-r--r--libappstream-builder/plugins/asb-plugin-firmware.c139
-rw-r--r--libappstream-builder/plugins/asb-plugin-gstreamer.c101
-rw-r--r--libappstream-builder/plugins/asb-plugin-hardcoded.c28
-rw-r--r--libappstream-builder/plugins/asb-plugin-ibus-sql.c264
-rw-r--r--libappstream-builder/plugins/asb-plugin-ibus-xml.c224
-rw-r--r--libappstream-builder/plugins/asb-plugin-metainfo.c184
-rw-r--r--libappstream-glib/as-app-validate.c8
17 files changed, 328 insertions, 1417 deletions
diff --git a/configure.ac b/configure.ac
index e8e48a3..6e6f2be 100644
--- a/configure.ac
+++ b/configure.ac
@@ -26,7 +26,7 @@ AC_SUBST(AS_VERSION)
# this refers to the plugin API version
# this is not in any way related to a package or soname version
-AS_PLUGIN_VERSION=2
+AS_PLUGIN_VERSION=3
AC_SUBST(AS_PLUGIN_VERSION)
AC_DEFINE_UNQUOTED([AS_PLUGIN_VERSION], "$AS_PLUGIN_VERSION", [plugin API version])
diff --git a/libappstream-builder/asb-app.c b/libappstream-builder/asb-app.c
index d2a59e4..69f8909 100644
--- a/libappstream-builder/asb-app.c
+++ b/libappstream-builder/asb-app.c
@@ -88,84 +88,50 @@ asb_app_class_init (AsbAppClass *klass)
}
/**
- * asb_app_add_requires_appdata:
+ * asb_app_get_package:
* @app: A #AsbApp
- * @fmt: format string
- * @...: varargs
- *
- * Adds a reason that AppData is required.
*
- * Since: 0.1.0
- **/
-void
-asb_app_add_requires_appdata (AsbApp *app, const gchar *fmt, ...)
-{
- AsbAppPrivate *priv = GET_PRIVATE (app);
- gchar *tmp;
- va_list args;
- if (priv->ignore_requires_appdata)
- return;
- va_start (args, fmt);
- tmp = g_strdup_vprintf (fmt, args);
- va_end (args);
- g_ptr_array_add (priv->requires_appdata, tmp);
-}
-
-/**
- * asb_app_set_requires_appdata:
- * @app: A #AsbApp
- * @requires_appdata: boolean
+ * Gets the package that backs the application.
*
- * Sets (or clears) the requirement for AppData.
+ * Returns: (transfer none): package
*
* Since: 0.1.0
**/
-void
-asb_app_set_requires_appdata (AsbApp *app, gboolean requires_appdata)
+AsbPackage *
+asb_app_get_package (AsbApp *app)
{
AsbAppPrivate *priv = GET_PRIVATE (app);
- if (requires_appdata) {
- if (priv->ignore_requires_appdata)
- return;
- g_ptr_array_add (priv->requires_appdata, NULL);
- } else {
- g_ptr_array_set_size (priv->requires_appdata, 0);
- priv->ignore_requires_appdata = TRUE;
- }
+ return priv->pkg;
}
/**
- * asb_app_get_requires_appdata:
+ * asb_app_set_package:
* @app: A #AsbApp
+ * @pkg: A #AsbPackage
*
- * Gets if AppData is still required for the application.
- *
- * Returns: (transfer none) (element-type utf8): A list of reasons
+ * Sets the package that backs the application.
*
- * Since: 0.1.0
+ * Since: 0.5.1
**/
-GPtrArray *
-asb_app_get_requires_appdata (AsbApp *app)
+void
+asb_app_set_package (AsbApp *app, AsbPackage *pkg)
{
AsbAppPrivate *priv = GET_PRIVATE (app);
- return priv->requires_appdata;
-}
-/**
- * asb_app_get_package:
- * @app: A #AsbApp
- *
- * Gets the package that backs the application.
- *
- * Returns: (transfer none): package
- *
- * Since: 0.1.0
- **/
-AsbPackage *
-asb_app_get_package (AsbApp *app)
-{
- AsbAppPrivate *priv = GET_PRIVATE (app);
- return priv->pkg;
+ if (priv->pkg != NULL)
+ g_object_unref (priv->pkg);
+ priv->pkg = g_object_ref (pkg);
+
+ /* be helpful */
+ if (asb_package_get_kind (pkg) == ASB_PACKAGE_KIND_DEFAULT) {
+ as_app_add_pkgname (AS_APP (app), asb_package_get_name (pkg));
+ } else if (asb_package_get_kind (pkg) == ASB_PACKAGE_KIND_BUNDLE) {
+ g_autoptr(AsBundle) bundle = NULL;
+ bundle = as_bundle_new ();
+ as_bundle_set_id (bundle, asb_package_get_source (pkg));
+ as_bundle_set_kind (bundle, AS_BUNDLE_KIND_XDG_APP);
+ as_app_add_bundle (AS_APP (app), bundle);
+ }
}
/**
@@ -215,7 +181,8 @@ asb_app_save_resources (AsbApp *app, AsbAppSaveFlags save_flags, GError **error)
/* don't save some types of icons */
icon = g_ptr_array_index (icons, i);
- if (as_icon_get_kind (icon) == AS_ICON_KIND_STOCK ||
+ if (as_icon_get_kind (icon) == AS_ICON_KIND_UNKNOWN ||
+ as_icon_get_kind (icon) == AS_ICON_KIND_STOCK ||
as_icon_get_kind (icon) == AS_ICON_KIND_EMBEDDED ||
as_icon_get_kind (icon) == AS_ICON_KIND_LOCAL ||
as_icon_get_kind (icon) == AS_ICON_KIND_REMOTE)
@@ -231,8 +198,9 @@ asb_app_save_resources (AsbApp *app, AsbAppSaveFlags save_flags, GError **error)
g_set_error (error,
AS_APP_ERROR,
AS_APP_ERROR_FAILED,
- "No pixbuf for %s",
- as_icon_get_name (icon));
+ "No pixbuf for %s in %s",
+ as_icon_get_name (icon),
+ as_app_get_id (AS_APP (app)));
return FALSE;
}
if (!gdk_pixbuf_save (pixbuf, filename, "png", error, NULL))
@@ -248,8 +216,8 @@ asb_app_save_resources (AsbApp *app, AsbAppSaveFlags save_flags, GError **error)
/**
* asb_app_new:
- * @pkg: A #AsbPackage
- * @id: The ID for the package
+ * @pkg: A #AsbPackage, or %NULL
+ * @id: The ID for the package, or %NULL
*
* Creates a new application object.
*
@@ -261,29 +229,9 @@ AsbApp *
asb_app_new (AsbPackage *pkg, const gchar *id)
{
AsbApp *app;
- AsbAppPrivate *priv;
-
app = g_object_new (ASB_TYPE_APP, NULL);
- priv = GET_PRIVATE (app);
- if (pkg != NULL) {
- priv->pkg = g_object_ref (pkg);
- switch (asb_package_get_kind (pkg)) {
- case ASB_PACKAGE_KIND_DEFAULT:
- as_app_add_pkgname (AS_APP (app),
- asb_package_get_name (pkg));
- break;
- case ASB_PACKAGE_KIND_BUNDLE:
- {
- g_autoptr(AsBundle) bundle = NULL;
- bundle = as_bundle_new ();
- as_bundle_set_id (bundle, asb_package_get_source (pkg));
- as_bundle_set_kind (bundle, AS_BUNDLE_KIND_XDG_APP);
- as_app_add_bundle (AS_APP (app), bundle);
- };
- default:
- break;
- }
- }
+ if (pkg != NULL)
+ asb_app_set_package (app, pkg);
if (id != NULL)
as_app_set_id (AS_APP (app), id);
return ASB_APP (app);
diff --git a/libappstream-builder/asb-app.h b/libappstream-builder/asb-app.h
index 0abf4bf..c575195 100644
--- a/libappstream-builder/asb-app.h
+++ b/libappstream-builder/asb-app.h
@@ -68,16 +68,9 @@ AsbApp *asb_app_new (AsbPackage *pkg,
const gchar *id);
void asb_app_set_hidpi_enabled (AsbApp *app,
gboolean hidpi_enabled);
-void asb_app_add_requires_appdata (AsbApp *app,
- const gchar *fmt,
- ...)
- G_GNUC_PRINTF(2,3);
-void asb_app_set_requires_appdata (AsbApp *app,
- gboolean requires_appdata);
-
-GPtrArray *asb_app_get_requires_appdata (AsbApp *app);
+void asb_app_set_package (AsbApp *app,
+ AsbPackage *pkg);
AsbPackage *asb_app_get_package (AsbApp *app);
-
gboolean asb_app_save_resources (AsbApp *app,
AsbAppSaveFlags save_flags,
GError **error);
diff --git a/libappstream-builder/asb-plugin-loader.c b/libappstream-builder/asb-plugin-loader.c
index ee6de00..ed3c32c 100644
--- a/libappstream-builder/asb-plugin-loader.c
+++ b/libappstream-builder/asb-plugin-loader.c
@@ -186,18 +186,11 @@ asb_plugin_loader_process_app (AsbPluginLoader *plugin_loader,
"Running asb_plugin_process_app() from %s",
plugin->name);
if (!plugin_func (plugin, pkg, app, tmpdir, &error_local)) {
- if (g_error_matches (error_local,
- ASB_PLUGIN_ERROR,
- ASB_PLUGIN_ERROR_IGNORE)) {
- asb_package_log (pkg,
- ASB_PACKAGE_LOG_LEVEL_WARNING,
- "Ignoring: %s",
- error_local->message);
- g_clear_error (&error_local);
- } else {
- g_propagate_error (error, error_local);
- return FALSE;
- }
+ asb_package_log (pkg,
+ ASB_PACKAGE_LOG_LEVEL_WARNING,
+ "Ignoring: %s",
+ error_local->message);
+ g_clear_error (&error_local);
}
}
return TRUE;
diff --git a/libappstream-builder/asb-self-test.c b/libappstream-builder/asb-self-test.c
index 511278a..8b9046a 100644
--- a/libappstream-builder/asb-self-test.c
+++ b/libappstream-builder/asb-self-test.c
@@ -267,7 +267,7 @@ asb_test_plugin_loader_func (void)
/* get the list of plugins */
plugins = asb_plugin_loader_get_plugins (loader);
- g_assert_cmpint (plugins->len, >=, 17);
+ g_assert_cmpint (plugins->len, >=, 16);
plugin = g_ptr_array_index (plugins, 0);
g_assert (plugin != NULL);
g_assert (plugin->module != NULL);
@@ -275,9 +275,9 @@ asb_test_plugin_loader_func (void)
g_assert (plugin->ctx == ctx);
/* match the correct one */
- plugin = asb_plugin_loader_match_fn (loader, "/usr/share/applications/gimp.desktop");
+ plugin = asb_plugin_loader_match_fn (loader, "/usr/share/appdata/gimp.appdata.xml");
g_assert (plugin != NULL);
- g_assert_cmpstr (plugin->name, ==, "desktop");
+ g_assert_cmpstr (plugin->name, ==, "appdata");
}
#ifdef HAVE_RPM
@@ -399,7 +399,7 @@ asb_test_context_test_func (AsbTestContextMode mode)
ret = as_store_from_file (store, file, NULL, NULL, &error);
g_assert_no_error (error);
g_assert (ret);
- g_assert_cmpint (as_store_get_size (store), ==, 6);
+ g_assert_cmpint (as_store_get_size (store), ==, 4);
app = as_store_get_app_by_pkgname (store, "app");
g_assert (app != NULL);
app = as_store_get_app_by_id (store, "app.desktop");
@@ -518,6 +518,7 @@ asb_test_context_test_func (AsbTestContextMode mode)
"<description><p>Updating the firmware on your ColorHug device "
"improves performance and adds new features.</p></description>\n"
"<icon type=\"stock\">application-x-executable</icon>\n"
+ "<project_license>GPL-2.0+</project_license>\n"
"<url type=\"homepage\">http://www.hughski.com/</url>\n"
"<releases>\n"
"<release version=\"2.0.2\" timestamp=\"1424116753\">\n"
@@ -537,48 +538,6 @@ asb_test_context_test_func (AsbTestContextMode mode)
"<value key=\"X-CacheID\">colorhug-als-2.0.2.cab</value>\n"
"</metadata>\n"
"</component>\n"
- "<component type=\"desktop\">\n"
- "<id>valid1.desktop</id>\n"
- "<pkgname>composite</pkgname>\n"
- "<name>Frobnicator</name>\n"
- "<summary>Frobnicator</summary>\n"
- "<icon type=\"stock\">computer</icon>\n"
- "<categories>\n"
- "<category>Profiling</category>\n"
- "</categories>\n"
- "<kudos>\n"
- "<kudo>HiDpiIcon</kudo>\n"
- "</kudos>\n"
- "<project_license>GPL-2.0+</project_license>\n"
- "<url type=\"homepage\">http://people.freedesktop.org/</url>\n"
- "<releases>\n"
- "<release version=\"1\" timestamp=\"1407844800\"/>\n"
- "</releases>\n"
- "<metadata>\n"
- "<value key=\"X-CacheID\">composite-1-1.fc21.x86_64.rpm</value>\n"
- "</metadata>\n"
- "</component>\n"
- "<component type=\"desktop\">\n"
- "<id>valid2.desktop</id>\n"
- "<pkgname>composite</pkgname>\n"
- "<name>Frobnicator Example</name>\n"
- "<summary>Frobnicator Example Program</summary>\n"
- "<icon type=\"stock\">computer</icon>\n"
- "<categories>\n"
- "<category>Profiling</category>\n"
- "</categories>\n"
- "<kudos>\n"
- "<kudo>HiDpiIcon</kudo>\n"
- "</kudos>\n"
- "<project_license>GPL-2.0+</project_license>\n"
- "<url type=\"homepage\">http://people.freedesktop.org/</url>\n"
- "<releases>\n"
- "<release version=\"1\" timestamp=\"1407844800\"/>\n"
- "</releases>\n"
- "<metadata>\n"
- "<value key=\"X-CacheID\">composite-1-1.fc21.x86_64.rpm</value>\n"
- "</metadata>\n"
- "</component>\n"
"</components>\n";
ret = asb_test_compare_lines (xml->str, expected_xml, &error);
g_assert_no_error (error);
@@ -590,11 +549,11 @@ asb_test_context_test_func (AsbTestContextMode mode)
ret = as_store_from_file (store_failed, file_failed, NULL, NULL, &error);
g_assert_no_error (error);
g_assert (ret);
- g_assert_cmpint (as_store_get_size (store_failed), ==, 4);
- app = as_store_get_app_by_id (store_failed, "console1.desktop");
- g_assert (app != NULL);
- app = as_store_get_app_by_id (store_failed, "console2.desktop");
- g_assert (app != NULL);
+ g_assert_cmpint (as_store_get_size (store_failed), ==, 2);
+// app = as_store_get_app_by_id (store_failed, "console1.desktop");
+// g_assert (app != NULL);
+// app = as_store_get_app_by_id (store_failed, "console2.desktop");
+// g_assert (app != NULL);
/* check output */
xml_failed = as_store_to_xml (store_failed, AS_NODE_TO_XML_FLAG_FORMAT_MULTILINE);
@@ -670,64 +629,6 @@ asb_test_context_test_func (AsbTestContextMode mode)
"<value key=\"X-Merge-With-Parent\">app.desktop</value>\n"
"</metadata>\n"
"</component>\n"
- "<component type=\"desktop\">\n"
- "<id>console1.desktop</id>\n"
- "<pkgname>app-console</pkgname>\n"
- "<source_pkgname>app</source_pkgname>\n"
- "<name>Console1</name>\n"
- "<summary>A console1 test application</summary>\n"
- "<icon height=\"64\" width=\"64\" type=\"cached\">console1.png</icon>\n"
- "<categories>\n"
- "<category>ConsoleOnly</category>\n"
- "</categories>\n"
- "<kudos>\n"
- "<kudo>ModernToolkit</kudo>\n"
- "</kudos>\n"
- "<vetos>\n"
- "<veto>Required AppData: ConsoleOnly</veto>\n"
- "</vetos>\n"
- "<project_license>GPL-2.0+</project_license>\n"
- "<url type=\"homepage\">http://people.freedesktop.org/</url>\n"
- "<releases>\n"
- "<release version=\"1\" timestamp=\"1407844800\"/>\n"
- "</releases>\n"
- "<languages>\n"
- "<lang percentage=\"100\">en_GB</lang>\n"
- "<lang percentage=\"33\">ru</lang>\n"
- "</languages>\n"
- "<metadata>\n"
- "<value key=\"X-CacheID\">app-console-1-1.fc21.noarch.rpm</value>\n"
- "</metadata>\n"
- "</component>\n"
- "<component type=\"desktop\">\n"
- "<id>console2.desktop</id>\n"
- "<pkgname>app-console</pkgname>\n"
- "<source_pkgname>app</source_pkgname>\n"
- "<name>Console2</name>\n"
- "<summary>A console2 test application</summary>\n"
- "<icon height=\"64\" width=\"64\" type=\"cached\">console2.png</icon>\n"
- "<categories>\n"
- "<category>ConsoleOnly</category>\n"
- "</categories>\n"
- "<kudos>\n"
- "<kudo>ModernToolkit</kudo>\n"
- "</kudos>\n"
- "<vetos>\n"
- "<veto>Required AppData: ConsoleOnly</veto>\n"
- "</vetos>\n"
- "<project_license>GPL-2.0+</project_license>\n"
- "<url type=\"homepage\">http://people.freedesktop.org/</url>\n"
- "<releases>\n"
- "<release version=\"1\" timestamp=\"1407844800\"/>\n"
- "</releases>\n"
- "<languages>\n"
- "<lang percentage=\"100\">en_GB</lang>\n"
- "<lang percentage=\"33\">ru</lang>\n"
- "</languages>\n"
- "<metadata>\n"
- "<value key=\"X-CacheID\">app-console-1-1.fc21.noarch.rpm</value>\n"
- "</metadata>\n"
- "</component>\n"
"</components>\n";
ret = asb_test_compare_lines (xml_failed->str, expected_xml, &error);
g_assert_no_error (error);
@@ -759,6 +660,13 @@ asb_test_context_test_func (AsbTestContextMode mode)
"</metadata>\n"
"</component>\n"
"<component>\n"
+ "<id>composite.x86_64</id>\n"
+ "<pkgname>composite</pkgname>\n"
+ "<metadata>\n"
+ "<value key=\"X-CacheID\">composite-1-1.fc21.x86_64.rpm</value>\n"
+ "</metadata>\n"
+ "</component>\n"
+ "<component>\n"
"<id>font-serif.noarch</id>\n"
"<pkgname>font-serif</pkgname>\n"
"<metadata>\n"
@@ -923,6 +831,7 @@ asb_test_firmware_func (void)
"<description><p>Updating the firmware on your ColorHug device "
"improves performance and adds new features.</p></description>\n"
"<icon type=\"stock\">application-x-executable</icon>\n"
+ "<project_license>GPL-2.0+</project_license>\n"
"<url type=\"homepage\">http://www.hughski.com/</url>\n"
"<releases>\n"
"<release version=\"2.0.2\" timestamp=\"1424116753\">\n"
@@ -943,10 +852,6 @@ asb_test_firmware_func (void)
"<li>Scale XYZ measurement with a constant factor to make the CCMX more "
"sane</li></ul></description>\n"
"</release>\n"
- "<release version=\"2.0.0\" timestamp=\"1425168000\">\n"
- "<checksum filename=\"colorhug-als-2.0.0.cab\" target=\"container\" type=\"sha1\">abcedb24d0a2fa8c9cab065d6751e1b89b4c79c1</checksum>\n"
- "<checksum filename=\"firmware.bin\" target=\"content\" type=\"sha1\">767a8a7b8a7b350b513f57761204b4aaa657aa44</checksum>\n"
- "</release>\n"
"</releases>\n"
"<provides>\n"
"<firmware type=\"flashed\">84f40464-9272-4ef7-9399-cd95f12da696</firmware>\n"
diff --git a/libappstream-builder/asb-task.c b/libappstream-builder/asb-task.c
index 57bd192..f6bdca5 100644
--- a/libappstream-builder/asb-task.c
+++ b/libappstream-builder/asb-task.c
@@ -236,7 +236,6 @@ asb_task_process (AsbTask *task, GError **error_not_used)
GPtrArray *array;
gboolean ret;
gchar *cache_id;
- gchar *tmp;
guint i;
guint nr_added = 0;
g_autoptr(GError) error = NULL;
@@ -403,17 +402,6 @@ asb_task_process (AsbTask *task, GError **error_not_used)
goto skip;
}
- /* veto apps that *still* require appdata */
- array = asb_app_get_requires_appdata (app);
- for (i = 0; i < array->len; i++) {
- tmp = g_ptr_array_index (array, i);
- if (tmp == NULL) {
- as_app_add_veto (AS_APP (app), "Required AppData");
- continue;
- }
- as_app_add_veto (AS_APP (app), "Required AppData: %s", tmp);
- }
-
/* set cache-id in case we want to use the metadata directly */
if (asb_context_get_flag (priv->ctx, ASB_CONTEXT_FLAG_ADD_CACHE_ID)) {
cache_id = asb_utils_get_cache_id_for_filename (priv->filename);
diff --git a/libappstream-builder/plugins/Makefile.am b/libappstream-builder/plugins/Makefile.am
index f697631..96840ad 100644
--- a/libappstream-builder/plugins/Makefile.am
+++ b/libappstream-builder/plugins/Makefile.am
@@ -27,9 +27,6 @@ plugin_LTLIBRARIES = \
libasb_plugin_gettext.la \
libasb_plugin_gstreamer.la \
libasb_plugin_hardcoded.la \
- libasb_plugin_ibus_sql.la \
- libasb_plugin_ibus_xml.la \
- libasb_plugin_metainfo.la \
libasb_plugin_kde_services.la \
libasb_plugin_kde_notifyrc.la \
libasb_plugin_nm.la
@@ -69,11 +66,6 @@ libasb_plugin_gstreamer_la_LIBADD = $(GLIB_LIBS)
libasb_plugin_gstreamer_la_LDFLAGS = -module -avoid-version
libasb_plugin_gstreamer_la_CFLAGS = $(GLIB_CFLAGS) $(WARNINGFLAGS_C)
-libasb_plugin_metainfo_la_SOURCES = asb-plugin-metainfo.c
-libasb_plugin_metainfo_la_LIBADD = $(GLIB_LIBS)
-libasb_plugin_metainfo_la_LDFLAGS = -module -avoid-version
-libasb_plugin_metainfo_la_CFLAGS = $(GLIB_CFLAGS) $(WARNINGFLAGS_C)
-
libasb_plugin_gettext_la_SOURCES = asb-plugin-gettext.c
libasb_plugin_gettext_la_LIBADD = $(GLIB_LIBS)
libasb_plugin_gettext_la_LDFLAGS = -module -avoid-version
@@ -114,16 +106,6 @@ libasb_plugin_nm_la_LIBADD = $(GLIB_LIBS)
libasb_plugin_nm_la_LDFLAGS = -module -avoid-version
libasb_plugin_nm_la_CFLAGS = $(GLIB_CFLAGS) $(WARNINGFLAGS_C)
-libasb_plugin_ibus_sql_la_SOURCES = asb-plugin-ibus-sql.c
-libasb_plugin_ibus_sql_la_LIBADD = $(GLIB_LIBS) $(SQLITE_LIBS)
-libasb_plugin_ibus_sql_la_LDFLAGS = -module -avoid-version
-libasb_plugin_ibus_sql_la_CFLAGS = $(GLIB_CFLAGS) $(WARNINGFLAGS_C)
-
-libasb_plugin_ibus_xml_la_SOURCES = asb-plugin-ibus-xml.c
-libasb_plugin_ibus_xml_la_LIBADD = $(GLIB_LIBS) $(SQLITE_LIBS)
-libasb_plugin_ibus_xml_la_LDFLAGS = -module -avoid-version
-libasb_plugin_ibus_xml_la_CFLAGS = $(GLIB_CFLAGS) $(WARNINGFLAGS_C)
-
libasb_plugin_font_la_SOURCES = asb-plugin-font.c
libasb_plugin_font_la_LIBADD = $(GLIB_LIBS) $(FREETYPE_LIBS) $(GDKPIXBUF_LIBS) $(GTK_LIBS)
libasb_plugin_font_la_LDFLAGS = -module -avoid-version
diff --git a/libappstream-builder/plugins/asb-plugin-appdata.c b/libappstream-builder/plugins/asb-plugin-appdata.c
index e0d3851..26e68c5 100644
--- a/libappstream-builder/plugins/asb-plugin-appdata.c
+++ b/libappstream-builder/plugins/asb-plugin-appdata.c
@@ -20,8 +20,7 @@
*/
#include <config.h>
-
-#include <appstream-glib.h>
+#include <fnmatch.h>
#include <asb-plugin.h>
@@ -40,46 +39,73 @@ asb_plugin_get_name (void)
void
asb_plugin_add_globs (AsbPlugin *plugin, GPtrArray *globs)
{
+ asb_plugin_add_glob (globs, "/usr/share/appdata/*.metainfo.xml");
asb_plugin_add_glob (globs, "/usr/share/appdata/*.appdata.xml");
asb_plugin_add_glob (globs, "*.metainfo.xml");
}
/**
+ * _asb_plugin_check_filename:
+ */
+static gboolean
+_asb_plugin_check_filename (const gchar *filename)
+{
+ if (asb_plugin_match_glob ("*.metainfo.xml", filename) ||
+ asb_plugin_match_glob ("/usr/share/appdata/*.metainfo.xml", filename) ||
+ asb_plugin_match_glob ("/usr/share/appdata/*.appdata.xml", 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);
+}
+
+/**
* asb_plugin_process_filename:
*/
static gboolean
asb_plugin_process_filename (AsbPlugin *plugin,
- AsbApp *app,
+ AsbPackage *pkg,
const gchar *filename,
+ GList **apps,
GError **error)
{
AsProblemKind problem_kind;
AsProblem *problem;
- const gchar *key;
- const gchar *old;
+ GPtrArray *icons;
const gchar *tmp;
- gboolean ret;
- GHashTable *hash;
- GPtrArray *array;
- GList *l;
- GList *list;
guint i;
- g_autoptr(AsApp) appdata = NULL;
+ g_autoptr(AsbApp) app = NULL;
g_autoptr(GPtrArray) problems = NULL;
- /* validate */
- appdata = as_app_new ();
- ret = as_app_parse_file (appdata, filename,
- AS_APP_PARSE_FLAG_NONE,
- error);
- if (!ret)
+ app = asb_app_new (NULL, NULL);
+ if (!as_app_parse_file (AS_APP (app), filename,
+ AS_APP_PARSE_FLAG_NONE,
+ error))
+ return FALSE;
+ if (as_app_get_id_kind (AS_APP (app)) == AS_ID_KIND_UNKNOWN) {
+ g_set_error (error,
+ ASB_PLUGIN_ERROR,
+ ASB_PLUGIN_ERROR_FAILED,
+ "%s has no recognised type",
+ as_app_get_id (AS_APP (app)));
return FALSE;
- problems = as_app_validate (appdata,
+ }
+
+ /* validate */
+ problems = as_app_validate (AS_APP (app),
AS_APP_VALIDATE_FLAG_NO_NETWORK |
AS_APP_VALIDATE_FLAG_RELAX,
error);
if (problems == NULL)
return FALSE;
+ asb_app_set_package (app, pkg);
for (i = 0; i < problems->len; i++) {
problem = g_ptr_array_index (problems, i);
problem_kind = as_problem_get_kind (problem);
@@ -90,34 +116,14 @@ asb_plugin_process_filename (AsbPlugin *plugin,
as_problem_get_message (problem));
}
- /* check <id> matches, but still accept if missing or incorrect */
- tmp = as_app_get_id (appdata);
- if (tmp == NULL) {
- asb_package_log (asb_app_get_package (app),
- ASB_PACKAGE_LOG_LEVEL_WARNING,
- "AppData %s has no ID", filename);
- } else if (g_strcmp0 (tmp, as_app_get_id (AS_APP (app))) != 0) {
- asb_package_log (asb_app_get_package (app),
- ASB_PACKAGE_LOG_LEVEL_WARNING,
- "AppData %s does not match '%s':'%s'",
- filename, tmp,
- as_app_get_id (AS_APP (app)));
- }
-
- /* overwrite the app ID with the metadata one for firmware */
- if (as_app_get_id_kind (appdata) == AS_ID_KIND_FIRMWARE) {
- old = as_app_get_id (AS_APP (app));
- if (old != NULL) {
- asb_package_log (asb_app_get_package (app),
- ASB_PACKAGE_LOG_LEVEL_DEBUG,
- "renaming ID %s -> %s",
- old, as_app_get_id (AS_APP (appdata)));
- }
- as_app_set_id (AS_APP (app), as_app_get_id (AS_APP (appdata)));
- }
+ /* nuke things that do not belong */
+ icons = as_app_get_icons (AS_APP (app));
+ if (icons->len > 0)
+ g_ptr_array_set_size (icons, 0);
/* add provide if missing */
- if (as_app_get_id_kind (appdata) == AS_ID_KIND_FIRMWARE &&
+ tmp = as_app_get_id (AS_APP (app));
+ if (as_app_get_id_kind (AS_APP (app)) == AS_ID_KIND_FIRMWARE &&
as_utils_guid_is_valid (tmp)) {
g_autoptr(AsProvide) provide = NULL;
provide = as_provide_new ();
@@ -127,7 +133,7 @@ asb_plugin_process_filename (AsbPlugin *plugin,
}
/* check license */
- tmp = as_app_get_metadata_license (appdata);
+ tmp = as_app_get_metadata_license (AS_APP (app));
if (tmp == NULL) {
g_set_error (error,
ASB_PLUGIN_ERROR,
@@ -145,189 +151,149 @@ asb_plugin_process_filename (AsbPlugin *plugin,
return FALSE;
}
- /* other optional data */
- tmp = as_app_get_url_item (appdata, AS_URL_KIND_HOMEPAGE);
- if (tmp != NULL)
- as_app_add_url (AS_APP (app), AS_URL_KIND_HOMEPAGE, tmp);
- tmp = as_app_get_project_group (appdata);
+ /* check project group */
+ tmp = as_app_get_project_group (AS_APP (app));
if (tmp != NULL) {
- /* check the category is valid */
if (!as_utils_is_environment_id (tmp)) {
asb_package_log (asb_app_get_package (app),
ASB_PACKAGE_LOG_LEVEL_WARNING,
"AppData project group invalid, "
"so ignoring: %s", tmp);
- } else {
- as_app_set_project_group (AS_APP (app), tmp);
- }
- }
- array = as_app_get_compulsory_for_desktops (appdata);
- if (array->len > 0) {
- tmp = g_ptr_array_index (array, 0);
- as_app_add_compulsory_for_desktop (AS_APP (app), tmp);
- }
-
- /* perhaps get name */
- hash = as_app_get_names (appdata);
- list = g_hash_table_get_keys (hash);
- for (l = list; l != NULL; l = l->next) {
- key = l->data;
- tmp = g_hash_table_lookup (hash, key);
- as_app_set_name (AS_APP (app), key, tmp);
- }
- g_list_free (list);
-
- /* perhaps get summary */
- hash = as_app_get_comments (appdata);
- list = g_hash_table_get_keys (hash);
- for (l = list; l != NULL; l = l->next) {
- key = l->data;
- tmp = g_hash_table_lookup (hash, key);
- as_app_set_comment (AS_APP (app), key, tmp);
- }
- g_list_free (list);
-
- /* get descriptions */
- hash = as_app_get_descriptions (appdata);
- list = g_hash_table_get_keys (hash);
- for (l = list; l != NULL; l = l->next) {
- key = l->data;
- tmp = g_hash_table_lookup (hash, key);
- as_app_set_description (AS_APP (app), key, tmp);
- }
- g_list_free (list);
-
- /* add screenshots if not already added */
- array = as_app_get_screenshots (AS_APP (app));
- if (array->len == 0) {
- /* just use the upstream locations */
- array = as_app_get_screenshots (appdata);
- for (i = 0; i < array->len; i++) {
- AsScreenshot *ss;
- ss = g_ptr_array_index (array, i);
- as_app_add_screenshot (AS_APP (app), ss);
- }
- } else {
- array = as_app_get_screenshots (appdata);
- if (array->len > 0) {
- asb_package_log (asb_app_get_package (app),
- ASB_PACKAGE_LOG_LEVEL_INFO,
- "AppData screenshots ignored");
+ as_app_set_project_group (AS_APP (app), NULL);
}
}
- /* add metadata */
- hash = as_app_get_metadata (appdata);
- list = g_hash_table_get_keys (hash);
- for (l = list; l != NULL; l = l->next) {
- key = l->data;
- tmp = g_hash_table_lookup (hash, key);
- as_app_add_metadata (AS_APP (app), key, tmp);
+ /* log updateinfo */
+ tmp = as_app_get_update_contact (AS_APP (app));
+ if (tmp != NULL) {
+ asb_package_log (asb_app_get_package (app),
+ ASB_PACKAGE_LOG_LEVEL_INFO,
+ "Upstream contact <%s>", tmp);
}
- /* add developer name */
- tmp = as_app_get_developer_name (AS_APP (appdata), NULL);
- if (tmp != NULL)
- as_app_set_developer_name (AS_APP (app), NULL, tmp);
-
- /* add releases */
- array = as_app_get_releases (appdata);
- for (i = 0; i < array->len; i++) {
- AsRelease *rel = g_ptr_array_index (array, i);
- as_app_add_release (AS_APP (app), rel);
+ /* add icon for firmware */
+ if (as_app_get_id_kind (AS_APP (app)) == AS_ID_KIND_FIRMWARE) {
+ g_autoptr(AsIcon) icon = NULL;
+ icon = as_icon_new ();
+ as_icon_set_kind (icon, AS_ICON_KIND_STOCK);
+ as_icon_set_name (icon, "application-x-executable");
+ as_app_add_icon (AS_APP (app), icon);
}
- /* add provides */
- array = as_app_get_provides (appdata);
- for (i = 0; i < array->len; i++) {
- AsProvide *pr = g_ptr_array_index (array, i);
- as_app_add_provide (AS_APP (app), pr);
+ /* fix up input methods */
+ if (as_app_get_id_kind (AS_APP (app)) == AS_ID_KIND_INPUT_METHOD) {
+ g_autoptr(AsIcon) icon = NULL;
+ icon = as_icon_new ();
+ as_icon_set_kind (icon, AS_ICON_KIND_STOCK);
+ as_icon_set_name (icon, "system-run-symbolic");
+ as_app_add_icon (AS_APP (app), icon);
+ as_app_add_category (AS_APP (app), "Addons");
+ as_app_add_category (AS_APP (app), "InputSources");
}
- /* log updateinfo */
- tmp = as_app_get_update_contact (AS_APP (appdata));
- if (tmp != NULL) {
- asb_package_log (asb_app_get_package (app),
- ASB_PACKAGE_LOG_LEVEL_INFO,
- "Upstream contact <%s>", tmp);
+ /* fix up codecs */
+ if (as_app_get_id_kind (AS_APP (app)) == AS_ID_KIND_CODEC) {
+ g_autoptr(AsIcon) icon = NULL;
+ icon = as_icon_new ();
+ as_icon_set_kind (icon, AS_ICON_KIND_STOCK);
+ as_icon_set_name (icon, "application-x-executable");
+ as_app_add_icon (AS_APP (app), icon);
+ as_app_add_category (AS_APP (app), "Addons");
+ as_app_add_category (AS_APP (app), "Codecs");
}
/* success */
- asb_app_set_requires_appdata (app, FALSE);
+ asb_app_set_hidpi_enabled (app, asb_context_get_flag (plugin->ctx,
+ ASB_CONTEXT_FLAG_HIDPI_ICONS));
+ asb_plugin_add_app (apps, AS_APP (app));
return TRUE;
}
/**
- * asb_plugin_appdata_get_fn_for_app:
+ * asb_plugin_process:
*/
-static gchar *
-asb_plugin_appdata_get_fn_for_app (AsApp *app)
+GList *
+asb_plugin_process (AsbPlugin *plugin,
+ AsbPackage *pkg,
+ const gchar *tmpdir,
+ GError **error)
{
- gchar *fn = g_strdup (as_app_get_id (app));
- gchar *tmp;
+ gboolean ret;
+ GList *apps = NULL;
+ guint i;
+ gchar **filelist;
- /* just cut off the last section without munging the name */
- tmp = g_strrstr (fn, ".");
- if (tmp != NULL)
- *tmp = '\0';
- return fn;
+ 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;
}
/**
- * asb_plugin_process_app:
+ * asb_plugin_merge:
*/
-gboolean
-asb_plugin_process_app (AsbPlugin *plugin,
- AsbPackage *pkg,
- AsbApp *app,
- const gchar *tmpdir,
- GError **error)
+void
+asb_plugin_merge (AsbPlugin *plugin, GList *list)
{
- GError *error_local = NULL;
- g_autofree gchar *appdata_filename = NULL;
-
- /* get possible sources */
- if (asb_package_get_kind (pkg) == ASB_PACKAGE_KIND_FIRMWARE) {
- appdata_filename = g_build_filename (tmpdir,
- as_app_get_metadata_item (AS_APP (app), "MetainfoBasename"),
- NULL);
- } else {
- g_autofree gchar *appdata_basename = NULL;
- appdata_basename = asb_plugin_appdata_get_fn_for_app (AS_APP (app));
- appdata_filename = g_strdup_printf ("%s/files/share/appdata/%s.appdata.xml",
- tmpdir, appdata_basename);
- if (!g_file_test (appdata_filename, G_FILE_TEST_EXISTS)) {
- g_free (appdata_filename);
- appdata_filename = g_strdup_printf ("%s/usr/share/appdata/%s.appdata.xml",
- tmpdir, appdata_basename);
- }
- }
+ AsApp *app;
+ AsApp *found;
+ GList *l;
+ g_autoptr(GHashTable) hash = NULL;
- /* any installed appdata file */
- if (g_file_test (appdata_filename, G_FILE_TEST_EXISTS)) {
- /* be understanding if upstream gets the AppData file
- * wrong -- just fall back to the desktop file data */
- if (!asb_plugin_process_filename (plugin,
- app,
- appdata_filename,
- &error_local)) {
- error_local->code = ASB_PLUGIN_ERROR_IGNORE;
- g_propagate_error (error, error_local);
- g_prefix_error (error,
- "AppData file '%s' invalid: ",
- appdata_filename);
- return FALSE;
- }
- return TRUE;
+ /* make a hash table of ID->AsApp */
+ hash = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, (GDestroyNotify) g_object_unref);
+ for (l = list; l != NULL; l = l->next) {
+ app = AS_APP (l->data);
+ if (as_app_get_id_kind (app) != AS_ID_KIND_DESKTOP)
+ continue;
+ g_hash_table_insert (hash,
+ g_strdup (as_app_get_id (app)),
+ g_object_ref (app));
}
- /* we're going to require this soon */
- if (as_app_get_id_kind (AS_APP (app)) == AS_ID_KIND_DESKTOP &&
- as_app_get_metadata_item (AS_APP (app), "NoDisplay") == NULL) {
- asb_package_log (pkg,
- ASB_PACKAGE_LOG_LEVEL_WARNING,
- "desktop application %s has no AppData",
- as_app_get_id (AS_APP (app)));
+ /* add addons where the pkgname is different from the
+ * main package */
+ for (l = list; l != NULL; l = l->next) {
+ if (!ASB_IS_APP (l->data))
+ continue;
+ app = AS_APP (l->data);
+ if (as_app_get_id_kind (app) != AS_ID_KIND_ADDON)
+ continue;
+ found = g_hash_table_lookup (hash, as_app_get_id (app));
+ if (found == NULL)
+ continue;
+ if (g_strcmp0 (as_app_get_pkgname_default (app),
+ as_app_get_pkgname_default (found)) != 0)
+ continue;
+ as_app_add_veto (app,
+ "absorbing addon %s shipped in "
+ "main package %s",
+ as_app_get_id (app),
+ as_app_get_pkgname_default (app));
+ as_app_subsume_full (found, app, AS_APP_SUBSUME_FLAG_PARTIAL);
}
- return TRUE;
}
diff --git a/libappstream-builder/plugins/asb-plugin-blacklist.c b/libappstream-builder/plugins/asb-plugin-blacklist.c
index d441b5a..e4360ef 100644
--- a/libappstream-builder/plugins/asb-plugin-blacklist.c
+++ b/libappstream-builder/plugins/asb-plugin-blacklist.c
@@ -133,6 +133,6 @@ asb_plugin_process_app (AsbPlugin *plugin,
tmp = asb_glob_value_search (plugin->priv->vetos,
as_app_get_id (AS_APP (app)));
if (tmp != NULL)
- asb_app_add_requires_appdata (app, "%s", tmp);
+ as_app_add_veto (AS_APP (app), "%s", tmp);
return TRUE;
}
diff --git a/libappstream-builder/plugins/asb-plugin-desktop.c b/libappstream-builder/plugins/asb-plugin-desktop.c
index ec412c1..34cf795 100644
--- a/libappstream-builder/plugins/asb-plugin-desktop.c
+++ b/libappstream-builder/plugins/asb-plugin-desktop.c
@@ -53,28 +53,6 @@ asb_plugin_add_globs (AsbPlugin *plugin, GPtrArray *globs)
}
/**
- * _asb_plugin_check_filename:
- */
-static gboolean
-_asb_plugin_check_filename (const gchar *filename)
-{
- if (asb_plugin_match_glob ("/usr/share/applications/*.desktop", filename))
- return TRUE;
- if (asb_plugin_match_glob ("/usr/share/applications/kde4/*.desktop", 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);
-}
-
-/**
* asb_app_load_icon:
*/
static GdkPixbuf *
@@ -301,22 +279,21 @@ asb_plugin_desktop_add_icons (AsbPlugin *plugin,
}
/**
- * asb_plugin_process_filename:
+ * asb_plugin_desktop_refine:
*/
static gboolean
-asb_plugin_process_filename (AsbPlugin *plugin,
- AsbPackage *pkg,
- const gchar *filename,
- GList **apps,
- const gchar *tmpdir,
- GError **error)
+asb_plugin_desktop_refine (AsbPlugin *plugin,
+ AsbPackage *pkg,
+ const gchar *filename,
+ AsbApp *app,
+ const gchar *tmpdir,
+ GError **error)
{
AsIcon *icon;
AsAppParseFlags parse_flags = AS_APP_PARSE_FLAG_USE_HEURISTICS;
gboolean ret;
g_autofree gchar *app_id = NULL;
- g_autofree gchar *full_filename = NULL;
- g_autoptr(AsbApp) app = NULL;
+ g_autoptr(AsApp) desktop_app = NULL;
g_autoptr(GdkPixbuf) pixbuf = NULL;
/* use GenericName fallback */
@@ -325,23 +302,16 @@ asb_plugin_process_filename (AsbPlugin *plugin,
/* create app */
app_id = g_path_get_basename (filename);
- app = asb_app_new (pkg, app_id);
- asb_app_set_hidpi_enabled (app, asb_context_get_flag (plugin->ctx, ASB_CONTEXT_FLAG_HIDPI_ICONS));
- full_filename = g_build_filename (tmpdir, filename, NULL);
- if (!as_app_parse_file (AS_APP (app), full_filename, parse_flags, error))
+ desktop_app = as_app_new ();
+ if (!as_app_parse_file (desktop_app, filename, parse_flags, error))
return FALSE;
/* NoDisplay apps are never included */
- if (as_app_get_metadata_item (AS_APP (app), "NoDisplay") != NULL)
- asb_app_add_requires_appdata (app, "NoDisplay=true");
-
- /* Settings or DesktopSettings requires AppData */
- if (!asb_context_get_flag (plugin->ctx, ASB_CONTEXT_FLAG_IGNORE_SETTINGS)) {
- if (as_app_has_category (AS_APP (app), "Settings"))
- asb_app_add_requires_appdata (app, "Category=Settings");
- if (as_app_has_category (AS_APP (app), "DesktopSettings"))
- asb_app_add_requires_appdata (app, "Category=DesktopSettings");
- }
+ if (as_app_get_metadata_item (desktop_app, "NoDisplay") != NULL)
+ as_app_add_veto (AS_APP (app), "NoDisplay=true");
+
+ /* copy all metadata */
+ as_app_subsume_full (AS_APP (app), desktop_app, AS_APP_SUBSUME_FLAG_NO_OVERWRITE);
/* is the icon a stock-icon-name? */
icon = as_app_get_icon_default (AS_APP (app));
@@ -367,54 +337,38 @@ asb_plugin_process_filename (AsbPlugin *plugin,
}
}
- /* add */
- asb_plugin_add_app (apps, AS_APP (app));
return TRUE;
}
/**
- * asb_plugin_process:
+ * asb_plugin_process_app:
*/
-GList *
-asb_plugin_process (AsbPlugin *plugin,
- AsbPackage *pkg,
- const gchar *tmpdir,
- GError **error)
+gboolean
+asb_plugin_process_app (AsbPlugin *plugin,
+ AsbPackage *pkg,
+ AsbApp *app,
+ const gchar *tmpdir,
+ GError **error)
{
- gboolean ret;
- GError *error_local = NULL;
- GList *apps = NULL;
guint i;
- gchar **filelist;
-
- filelist = asb_package_get_filelist (pkg);
- for (i = 0; filelist[i] != NULL; i++) {
- if (!_asb_plugin_check_filename (filelist[i]))
- continue;
- ret = asb_plugin_process_filename (plugin,
- pkg,
- filelist[i],
- &apps,
- tmpdir,
- &error_local);
- if (!ret) {
- asb_package_log (pkg,
- ASB_PACKAGE_LOG_LEVEL_INFO,
- "Failed to process %s: %s",
- filelist[i],
- error_local->message);
- g_clear_error (&error_local);
+ const gchar *app_dirs[] = {
+ "/usr/share/applications",
+ "/usr/share/applications/kde4",
+ NULL };
+
+ /* use the .desktop file to refine the application */
+ for (i = 0; app_dirs[i] != NULL; i++) {
+ g_autofree gchar *fn = NULL;
+ fn = g_build_filename (tmpdir,
+ app_dirs[i],
+ as_app_get_id (AS_APP (app)),
+ NULL);
+ if (g_file_test (fn, G_FILE_TEST_EXISTS)) {
+ if (!asb_plugin_desktop_refine (plugin, pkg, fn,
+ app, tmpdir, error))
+ return FALSE;
}
}
- /* 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;
+ return TRUE;
}
diff --git a/libappstream-builder/plugins/asb-plugin-firmware.c b/libappstream-builder/plugins/asb-plugin-firmware.c
index bd98f07..2ef9b5c 100644
--- a/libappstream-builder/plugins/asb-plugin-firmware.c
+++ b/libappstream-builder/plugins/asb-plugin-firmware.c
@@ -46,39 +46,19 @@ asb_plugin_add_globs (AsbPlugin *plugin, GPtrArray *globs)
}
/**
- * _asb_plugin_check_filename:
- */
-static gboolean
-_asb_plugin_check_filename (const gchar *filename)
-{
- if (asb_plugin_match_glob ("*.inf", 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);
-}
-
-/**
- * asb_plugin_firmware_get_metainfo_fn:
+ * asb_plugin_firmware_get_inf_fn:
*/
static gchar *
-asb_plugin_firmware_get_metainfo_fn (const gchar *filename)
+asb_plugin_firmware_get_inf_fn (const gchar *filename)
{
gchar *basename;
gchar *tmp;
basename = g_path_get_basename (filename);
- tmp = g_strrstr (basename, ".inf");
+ tmp = g_strrstr (basename, ".metainfo.xml");
if (tmp != NULL)
*tmp = '\0';
- return g_strdup_printf ("%s.metainfo.xml", basename);
+ return g_strdup_printf ("%s.inf", basename);
}
/**
@@ -98,30 +78,28 @@ asb_plugin_firmware_get_checksum (const gchar *filename,
}
/**
- * asb_plugin_process_filename:
+ * asb_plugin_firmware_refine:
*/
static gboolean
-asb_plugin_process_filename (AsbPlugin *plugin,
- AsbPackage *pkg,
- const gchar *filename,
- GList **apps,
- const gchar *tmpdir,
- GError **error)
+asb_plugin_firmware_refine (AsbPlugin *plugin,
+ AsbPackage *pkg,
+ const gchar *filename,
+ AsbApp *app,
+ const gchar *tmpdir,
+ GError **error)
{
AsRelease *release;
GError *error_local = NULL;
const gchar *fw_basename = NULL;
g_autofree gchar *checksum = NULL;
- g_autofree gchar *filename_full = NULL;
g_autofree gchar *location_checksum = NULL;
g_autofree gchar *metainfo_fn = NULL;
- g_autoptr(AsbApp) app = NULL;
+ g_autoptr(AsApp) inf = NULL;
g_autoptr(AsChecksum) csum = NULL;
/* parse */
- filename_full = g_build_filename (tmpdir, filename, NULL);
- app = asb_app_new (pkg, NULL);
- if (!as_app_parse_file (AS_APP (app), filename_full,
+ inf = as_app_new ();
+ if (!as_app_parse_file (inf, filename,
AS_APP_PARSE_FLAG_NONE, &error_local)) {
g_set_error_literal (error,
ASB_PLUGIN_ERROR,
@@ -130,7 +108,7 @@ asb_plugin_process_filename (AsbPlugin *plugin,
return FALSE;
}
- /* get the default release, creating if required */
+ /* get the correct release, creating if required */
release = as_app_get_release_default (AS_APP (app));
if (release == NULL) {
release = as_release_new ();
@@ -152,13 +130,8 @@ asb_plugin_process_filename (AsbPlugin *plugin,
as_checksum_set_filename (csum, asb_package_get_basename (pkg));
as_release_add_checksum (release, csum);
- /* for the adddata plugin; removed in asb_plugin_merge() */
- metainfo_fn = asb_plugin_firmware_get_metainfo_fn (filename);
- if (metainfo_fn != NULL)
- as_app_add_metadata (AS_APP (app), "MetainfoBasename", metainfo_fn);
-
/* set the internal checksum */
- fw_basename = as_app_get_metadata_item (AS_APP (app), "FirmwareBasename");
+ fw_basename = as_app_get_metadata_item (inf, "FirmwareBasename");
if (fw_basename != NULL) {
g_autofree gchar *checksum_bin = NULL;
g_autofree gchar *fn_bin = NULL;
@@ -181,72 +154,40 @@ asb_plugin_process_filename (AsbPlugin *plugin,
as_release_add_checksum (release, csum_bin);
}
- asb_plugin_add_app (apps, AS_APP (app));
return TRUE;
}
/**
- * asb_plugin_process:
+ * asb_plugin_process_app:
*/
-GList *
-asb_plugin_process (AsbPlugin *plugin,
- AsbPackage *pkg,
- const gchar *tmpdir,
- GError **error)
+gboolean
+asb_plugin_process_app (AsbPlugin *plugin,
+ AsbPackage *pkg,
+ AsbApp *app,
+ const gchar *tmpdir,
+ GError **error)
{
- gboolean ret;
- GError *error_local = NULL;
- GList *apps = NULL;
- guint i;
- gchar **filelist;
-
- filelist = asb_package_get_filelist (pkg);
- for (i = 0; filelist[i] != NULL; i++) {
- if (!_asb_plugin_check_filename (filelist[i]))
- continue;
- ret = asb_plugin_process_filename (plugin,
- pkg,
- filelist[i],
- &apps,
- tmpdir,
- &error_local);
- if (!ret) {
- asb_package_log (pkg,
- ASB_PACKAGE_LOG_LEVEL_INFO,
- "Failed to process %s: %s",
- filelist[i],
- error_local->message);
- g_clear_error (&error_local);
- }
- }
+ const gchar *tmp;
+ g_autofree gchar *fn = NULL;
+ g_autofree gchar *inf_fn = NULL;
- /* no desktop files we care about */
- if (apps == NULL) {
+ /* use metainfo basename */
+ tmp = as_app_get_source_file (AS_APP (app));
+ if (tmp == NULL) {
g_set_error (error,
ASB_PLUGIN_ERROR,
- ASB_PLUGIN_ERROR_FAILED,
- "nothing interesting in %s",
- asb_package_get_basename (pkg));
- return NULL;
+ ASB_PLUGIN_ERROR_NOT_SUPPORTED,
+ "no source_file set for %s",
+ as_app_get_id (AS_APP (app)));
+ return FALSE;
}
- return apps;
-}
-/**
- * asb_plugin_merge:
- */
-void
-asb_plugin_merge (AsbPlugin *plugin, GList *list)
-{
- AsApp *app;
- GList *l;
-
- /* remove the MetainfoBasename metadata */
- for (l = list; l != NULL; l = l->next) {
- app = AS_APP (l->data);
- if (as_app_get_id_kind (app) != AS_ID_KIND_FIRMWARE)
- continue;
- as_app_remove_metadata (app, "MetainfoBasename");
- as_app_remove_metadata (app, "FirmwareBasename");
+ /* use the .inf file to refine the application */
+ inf_fn = asb_plugin_firmware_get_inf_fn (tmp);
+ fn = g_build_filename (tmpdir, inf_fn, NULL);
+ if (g_file_test (fn, G_FILE_TEST_EXISTS)) {
+ if (!asb_plugin_firmware_refine (plugin, pkg, fn, app, tmpdir, error))
+ return FALSE;
}
+ return TRUE;
}
diff --git a/libappstream-builder/plugins/asb-plugin-gstreamer.c b/libappstream-builder/plugins/asb-plugin-gstreamer.c
index 9f0c710..8c5a8a4 100644
--- a/libappstream-builder/plugins/asb-plugin-gstreamer.c
+++ b/libappstream-builder/plugins/asb-plugin-gstreamer.c
@@ -42,17 +42,6 @@ asb_plugin_add_globs (AsbPlugin *plugin, GPtrArray *globs)
asb_plugin_add_glob (globs, "/usr/lib64/gstreamer-1.0/libgst*.so");
}
-/**
- * asb_plugin_check_filename:
- */
-gboolean
-asb_plugin_check_filename (AsbPlugin *plugin, const gchar *filename)
-{
- if (asb_plugin_match_glob ("/usr/lib64/gstreamer-1.0/libgst*.so", filename))
- return TRUE;
- return FALSE;
-}
-
typedef struct {
const gchar *path;
const gchar *text;
@@ -117,98 +106,26 @@ asb_utils_is_file_in_tmpdir (const gchar *tmpdir, const gchar *filename)
}
/**
- * asb_utils_string_sort_cb:
- */
-static gint
-asb_utils_string_sort_cb (gconstpointer a, gconstpointer b)
-{
- return g_strcmp0 (*((const gchar **) a), *((const gchar **) b));
-}
-
-/**
- * asb_plugin_process:
+ * asb_plugin_process_app:
*/
-GList *
-asb_plugin_process (AsbPlugin *plugin,
- AsbPackage *pkg,
- const gchar *tmpdir,
- GError **error)
+gboolean
+asb_plugin_process_app (AsbPlugin *plugin,
+ AsbPackage *pkg,
+ AsbApp *app,
+ const gchar *tmpdir,
+ GError **error)
{
- const gchar *tmp;
- gchar **split;
- GList *apps = NULL;
- GPtrArray *keywords;
guint i;
guint j;
- g_autofree gchar *app_id = NULL;
- g_autoptr(AsbApp) app = NULL;
- g_autoptr(AsIcon) icon = NULL;
- g_autoptr(GString) str = NULL;
-
- /* use the pkgname suffix as the app-id */
- tmp = asb_package_get_name (pkg);
- if (g_str_has_prefix (tmp, "gstreamer1-"))
- tmp += 11;
- if (g_str_has_prefix (tmp, "gstreamer-"))
- tmp += 10;
- if (g_str_has_prefix (tmp, "plugins-"))
- tmp += 8;
- app_id = g_strdup_printf ("gstreamer-%s", tmp);
-
- /* create app */
- app = asb_app_new (pkg, app_id);
- as_app_set_id_kind (AS_APP (app), AS_ID_KIND_CODEC);
- as_app_set_name (AS_APP (app), "C", "GStreamer Multimedia Codecs");
- asb_app_set_requires_appdata (app, TRUE);
- asb_app_set_hidpi_enabled (app, asb_context_get_flag (plugin->ctx, ASB_CONTEXT_FLAG_HIDPI_ICONS));
- as_app_add_category (AS_APP (app), "Addons");
- as_app_add_category (AS_APP (app), "Codecs");
-
- /* add icon */
- icon = as_icon_new ();
- as_icon_set_kind (icon, AS_ICON_KIND_STOCK);
- as_icon_set_name (icon, "application-x-executable");
- as_app_add_icon (AS_APP (app), icon);
for (i = 0; data[i].path != NULL; i++) {
+ g_auto(GStrv) split = NULL;
if (!asb_utils_is_file_in_tmpdir (tmpdir, data[i].path))
continue;
split = g_strsplit (data[i].text, "|", -1);
for (j = 0; split[j] != NULL; j++)
as_app_add_keyword (AS_APP (app), NULL, split[j]);
- g_strfreev (split);
- }
-
- /* no codecs we care about */
- keywords = as_app_get_keywords (AS_APP (app), NULL);
- if (keywords == NULL) {
- g_set_error (error,
- ASB_PLUGIN_ERROR,
- ASB_PLUGIN_ERROR_FAILED,
- "nothing interesting in %s",
- asb_package_get_basename (pkg));
- return NULL;
- }
-
- /* sort categories by name */
- g_ptr_array_sort (keywords, asb_utils_string_sort_cb);
-
- /* create a description */
- str = g_string_new ("Multimedia playback for ");
- if (keywords->len > 1) {
- for (i = 0; i < keywords->len - 1; i++) {
- tmp = g_ptr_array_index (keywords, i);
- g_string_append_printf (str, "%s, ", tmp);
- }
- g_string_truncate (str, str->len - 2);
- tmp = g_ptr_array_index (keywords, keywords->len - 1);
- g_string_append_printf (str, " and %s", tmp);
- } else {
- g_string_append (str, g_ptr_array_index (keywords, 0));
}
- as_app_set_comment (AS_APP (app), "C", str->str);
- /* add */
- asb_plugin_add_app (&apps, AS_APP (app));
- return apps;
+ return TRUE;
}
diff --git a/libappstream-builder/plugins/asb-plugin-hardcoded.c b/libappstream-builder/plugins/asb-plugin-hardcoded.c
index b2e7396..d17271b 100644
--- a/libappstream-builder/plugins/asb-plugin-hardcoded.c
+++ b/libappstream-builder/plugins/asb-plugin-hardcoded.c
@@ -222,18 +222,6 @@ asb_plugin_process_app (AsbPlugin *plugin,
as_app_add_veto (AS_APP (app), "Uses obsolete Elektra library");
break;
}
- if (g_strcmp0 (tmp, "libXt.so.6") == 0) {
- asb_app_add_requires_appdata (app, "Uses obsolete X11 toolkit");
- break;
- }
- if (g_strcmp0 (tmp, "Xvfb") == 0) {
- asb_app_add_requires_appdata (app, "Uses obsolete Xvfb");
- break;
- }
- if (g_strcmp0 (tmp, "wine-core") == 0) {
- asb_app_add_requires_appdata (app, "Uses wine");
- break;
- }
}
}
@@ -261,21 +249,21 @@ asb_plugin_process_app (AsbPlugin *plugin,
secs = (g_get_real_time () / G_USEC_PER_SEC) -
as_release_get_timestamp (release);
days = secs / (60 * 60 * 24);
- /* we need AppData if the app needs saving */
if (secs > 0 && days > 365 * 5) {
- asb_app_add_requires_appdata (app,
- "Dead upstream for > %i years", 5);
+ asb_package_log (asb_app_get_package (app),
+ ASB_PACKAGE_LOG_LEVEL_WARNING,
+ "Dead upstream for > %i years", 5);
}
}
/* a ConsoleOnly category means we require AppData */
if (as_app_has_category (AS_APP(app), "ConsoleOnly"))
- asb_app_add_requires_appdata (app, "ConsoleOnly");
+ as_app_add_veto (AS_APP (app), "ConsoleOnly");
- /* no categories means we require AppData */
- if (as_app_get_id_kind (AS_APP (app)) == AS_ID_KIND_DESKTOP &&
- as_app_get_categories(AS_APP(app))->len == 0)
- asb_app_add_requires_appdata (app, "no Categories");
+ /* no categories means veto */
+// if (as_app_get_id_kind (AS_APP (app)) == AS_ID_KIND_DESKTOP &&
+// as_app_get_categories(AS_APP(app))->len == 0)
+// as_app_add_veto (AS_APP (app), "no Categories");
return TRUE;
}
diff --git a/libappstream-builder/plugins/asb-plugin-ibus-sql.c b/libappstream-builder/plugins/asb-plugin-ibus-sql.c
deleted file mode 100644
index 6a6919c..0000000
--- a/libappstream-builder/plugins/asb-plugin-ibus-sql.c
+++ /dev/null
@@ -1,264 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2014-2015 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 <sqlite3.h>
-
-#include <asb-plugin.h>
-
-/**
- * asb_plugin_get_name:
- */
-const gchar *
-asb_plugin_get_name (void)
-{
- return "ibus-sqlite";
-}
-
-/**
- * asb_plugin_add_globs:
- */
-void
-asb_plugin_add_globs (AsbPlugin *plugin, GPtrArray *globs)
-{
- asb_plugin_add_glob (globs, "/usr/share/ibus-table/tables/*.db");
-}
-
-/**
- * _asb_plugin_check_filename:
- */
-static gboolean
-_asb_plugin_check_filename (const gchar *filename)
-{
- if (asb_plugin_match_glob ("/usr/share/ibus-table/tables/*.db", 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);
-}
-
-/**
- * asb_plugin_sqlite_callback_cb:
- */
-static int
-asb_plugin_sqlite_callback_cb (void *user_data, int argc, char **argv, char **data)
-{
- gchar **tmp = (gchar **) user_data;
- *tmp = g_strdup (argv[1]);
- return 0;
-}
-
-/**
- * asb_plugin_process_filename:
- */
-static gboolean
-asb_plugin_process_filename (AsbPlugin *plugin,
- AsbPackage *pkg,
- const gchar *filename,
- GList **apps,
- const gchar *tmpdir,
- GError **error)
-{
- gboolean ret = TRUE;
- gchar *error_msg = 0;
- gchar *filename_tmp;
- gint rc;
- guint i;
- sqlite3 *db = NULL;
- g_autofree gchar *basename = NULL;
- g_autofree gchar *description = NULL;
- g_autofree gchar *language_string = NULL;
- g_autofree gchar *name = NULL;
- g_autofree gchar *symbol = NULL;
- g_autoptr(AsbApp) app = NULL;
- g_autoptr(AsIcon) icon = NULL;
- g_auto(GStrv) languages = NULL;
-
- /* open IME database */
- filename_tmp = g_build_filename (tmpdir, filename, NULL);
- rc = sqlite3_open (filename_tmp, &db);
- if (rc) {
- ret = FALSE;
- g_set_error (error,
- ASB_PLUGIN_ERROR,
- ASB_PLUGIN_ERROR_FAILED,
- "Can't open database: %s",
- sqlite3_errmsg (db));
- goto out;
- }
-
- /* get name */
- rc = sqlite3_exec(db, "SELECT * FROM ime WHERE attr = 'name' LIMIT 1;",
- asb_plugin_sqlite_callback_cb,
- &name, &error_msg);
- if (rc != SQLITE_OK) {
- ret = FALSE;
- g_set_error (error,
- ASB_PLUGIN_ERROR,
- ASB_PLUGIN_ERROR_FAILED,
- "Can't get IME name from %s: %s",
- filename, error_msg);
- sqlite3_free(error_msg);
- goto out;
- }
-
- /* get symbol */
- rc = sqlite3_exec(db, "SELECT * FROM ime WHERE attr = 'symbol' LIMIT 1;",
- asb_plugin_sqlite_callback_cb,
- &symbol, &error_msg);
- if (rc != SQLITE_OK) {
- ret = FALSE;
- g_set_error (error,
- ASB_PLUGIN_ERROR,
- ASB_PLUGIN_ERROR_FAILED,
- "Can't get IME symbol from %s: %s",
- filename, error_msg);
- sqlite3_free(error_msg);
- goto out;
- }
-
- /* get languages */
- rc = sqlite3_exec(db, "SELECT * FROM ime WHERE attr = 'languages' LIMIT 1;",
- asb_plugin_sqlite_callback_cb,
- &language_string, &error_msg);
- if (rc != SQLITE_OK) {
- ret = FALSE;
- g_set_error (error,
- ASB_PLUGIN_ERROR,
- ASB_PLUGIN_ERROR_FAILED,
- "Can't get IME languages from %s: %s",
- filename, error_msg);
- sqlite3_free(error_msg);
- goto out;
- }
-
- /* get description */
- rc = sqlite3_exec(db, "SELECT * FROM ime WHERE attr = 'description' LIMIT 1;",
- asb_plugin_sqlite_callback_cb,
- &description, &error_msg);
- if (rc != SQLITE_OK) {
- ret = FALSE;
- g_set_error (error,
- ASB_PLUGIN_ERROR,
- ASB_PLUGIN_ERROR_FAILED,
- "Can't get IME name from %s: %s",
- filename, error_msg);
- sqlite3_free(error_msg);
- goto out;
- }
-
- /* this is _required_ */
- if (name == NULL || description == NULL) {
- ret = FALSE;
- g_set_error (error,
- ASB_PLUGIN_ERROR,
- ASB_PLUGIN_ERROR_FAILED,
- "No 'name' and 'description' in %s",
- filename);
- goto out;
- }
-
- /* create new app */
- basename = g_path_get_basename (filename);
- app = asb_app_new (pkg, basename);
- as_app_set_id_kind (AS_APP (app), AS_ID_KIND_INPUT_METHOD);
- as_app_add_category (AS_APP (app), "Addons");
- as_app_add_category (AS_APP (app), "InputSources");
- as_app_set_name (AS_APP (app), "C", name);
- as_app_set_comment (AS_APP (app), "C", description);
- if (symbol != NULL && symbol[0] != '\0')
- as_app_add_metadata (AS_APP (app), "X-IBus-Symbol", symbol);
- if (language_string != NULL) {
- languages = g_strsplit (language_string, ",", -1);
- for (i = 0; languages[i] != NULL; i++) {
- if (g_strcmp0 (languages[i], "other") == 0)
- continue;
- as_app_add_language (AS_APP (app),
- 100, languages[i]);
- }
- }
- asb_app_set_requires_appdata (app, TRUE);
- asb_app_set_hidpi_enabled (app, asb_context_get_flag (plugin->ctx, ASB_CONTEXT_FLAG_HIDPI_ICONS));
-
- /* add icon */
- icon = as_icon_new ();
- as_icon_set_kind (icon, AS_ICON_KIND_STOCK);
- as_icon_set_name (icon, "system-run-symbolic");
- as_app_add_icon (AS_APP (app), icon);
-
- asb_plugin_add_app (apps, AS_APP (app));
-out:
- if (db != NULL)
- sqlite3_close (db);
- return ret;
-}
-
-/**
- * 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++) {
- if (!_asb_plugin_check_filename (filelist[i]))
- continue;
- ret = asb_plugin_process_filename (plugin,
- pkg,
- filelist[i],
- &apps,
- tmpdir,
- error);
- if (!ret) {
- g_list_free_full (apps, (GDestroyNotify) g_object_unref);
- apps = NULL;
- goto out;
- }
- }
-
- /* 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));
- goto out;
- }
-out:
- return apps;
-}
diff --git a/libappstream-builder/plugins/asb-plugin-ibus-xml.c b/libappstream-builder/plugins/asb-plugin-ibus-xml.c
deleted file mode 100644
index f5180fb..0000000
--- a/libappstream-builder/plugins/asb-plugin-ibus-xml.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2014-2015 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 <sqlite3.h>
-#include <appstream-glib.h>
-
-#include <asb-plugin.h>
-
-/**
- * asb_plugin_get_name:
- */
-const gchar *
-asb_plugin_get_name (void)
-{
- return "ibus-xml";
-}
-
-/**
- * asb_plugin_add_globs:
- */
-void
-asb_plugin_add_globs (AsbPlugin *plugin, GPtrArray *globs)
-{
- asb_plugin_add_glob (globs, "/usr/share/ibus/component/*.xml");
-}
-
-/**
- * _asb_plugin_check_filename:
- */
-static gboolean
-_asb_plugin_check_filename (const gchar *filename)
-{
- if (asb_plugin_match_glob ("/usr/share/ibus/component/*.xml", 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);
-}
-
-/**
- * asb_plugin_process_filename:
- */
-static gboolean
-asb_plugin_process_filename (AsbPlugin *plugin,
- AsbPackage *pkg,
- const gchar *filename,
- GList **apps,
- const gchar *tmpdir,
- GError **error)
-{
- GNode *root = NULL;
- GString *valid_xml;
- const gchar *tmp;
- const GNode *n;
- gboolean found_header = FALSE;
- gboolean ret;
- guint i;
- g_autofree gchar *basename = NULL;
- g_autofree gchar *data = NULL;
- g_autofree gchar *filename_tmp = NULL;
- g_autoptr(AsbApp) app = NULL;
- g_autoptr(AsIcon) icon = NULL;
- g_auto(GStrv) languages = NULL;
- g_auto(GStrv) lines = NULL;
-
- /* open file */
- filename_tmp = g_build_filename (tmpdir, filename, NULL);
- ret = g_file_get_contents (filename_tmp, &data, NULL, error);
- if (!ret)
- goto out;
-
- /* some components start with a comment (invalid XML) and some
- * don't even have '<?xml' -- try to fix up best we can */
- valid_xml = g_string_new ("");
- lines = g_strsplit (data, "\n", -1);
- for (i = 0; lines[i] != NULL; i++) {
- if (g_str_has_prefix (lines[i], "<?xml") ||
- g_str_has_prefix (lines[i], "<component>"))
- found_header = TRUE;
- if (found_header)
- g_string_append_printf (valid_xml, "%s\n", lines[i]);
- }
-
- /* parse contents */
- root = as_node_from_xml (valid_xml->str,
- AS_NODE_FROM_XML_FLAG_NONE,
- error);
- if (!ret)
- goto out;
-
- /* create new app */
- basename = g_path_get_basename (filename);
- app = asb_app_new (pkg, basename);
- as_app_set_id_kind (AS_APP (app), AS_ID_KIND_INPUT_METHOD);
- as_app_add_category (AS_APP (app), "Addons");
- as_app_add_category (AS_APP (app), "InputSources");
- asb_app_set_requires_appdata (app, TRUE);
- asb_app_set_hidpi_enabled (app, asb_context_get_flag (plugin->ctx, ASB_CONTEXT_FLAG_HIDPI_ICONS));
-
- /* add icon */
- icon = as_icon_new ();
- as_icon_set_kind (icon, AS_ICON_KIND_STOCK);
- as_icon_set_name (icon, "system-run-symbolic");
- as_app_add_icon (AS_APP (app), icon);
-
- /* read the component header which all input methods have */
- n = as_node_find (root, "component/description");
- if (n != NULL) {
- as_app_set_name (AS_APP (app), "C", as_node_get_data (n));
- as_app_set_comment (AS_APP (app), "C", as_node_get_data (n));
- }
- n = as_node_find (root, "component/homepage");
- if (n != NULL) {
- as_app_add_url (AS_APP (app),
- AS_URL_KIND_HOMEPAGE,
- as_node_get_data (n));
- }
-
- /* do we have a engine section we can use? */
- n = as_node_find (root, "component/engines/engine/longname");
- if (n != NULL)
- as_app_set_name (AS_APP (app), "C", as_node_get_data (n));
- n = as_node_find (root, "component/engines/engine/description");
- if (n != NULL)
- as_app_set_comment (AS_APP (app), "C", as_node_get_data (n));
- n = as_node_find (root, "component/engines/engine/symbol");
- if (n != NULL) {
- tmp = as_node_get_data (n);
- if (tmp != NULL && tmp[0] != '\0') {
- as_app_add_metadata (AS_APP (app),
- "X-IBus-Symbol",
- tmp);
- }
- }
- n = as_node_find (root, "component/engines/engine/language");
- if (n != NULL) {
- tmp = as_node_get_data (n);
- if (tmp != NULL) {
- languages = g_strsplit (tmp, ",", -1);
- for (i = 0; languages[i] != NULL; i++) {
- if (g_strcmp0 (languages[i], "other") == 0)
- continue;
- as_app_add_language (AS_APP (app),
- 100, languages[i]);
- }
- }
- }
-
- /* add */
- asb_plugin_add_app (apps, AS_APP (app));
-out:
- if (root != NULL)
- as_node_unref (root);
- return ret;
-}
-
-/**
- * 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++) {
- if (!_asb_plugin_check_filename (filelist[i]))
- continue;
- ret = asb_plugin_process_filename (plugin,
- pkg,
- filelist[i],
- &apps,
- tmpdir,
- 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;
-}
diff --git a/libappstream-builder/plugins/asb-plugin-metainfo.c b/libappstream-builder/plugins/asb-plugin-metainfo.c
deleted file mode 100644
index 5f54d65..0000000
--- a/libappstream-builder/plugins/asb-plugin-metainfo.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2014-2015 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 <asb-plugin.h>
-
-/**
- * asb_plugin_get_name:
- */
-const gchar *
-asb_plugin_get_name (void)
-{
- return "metainfo";
-}
-
-/**
- * asb_plugin_add_globs:
- */
-void
-asb_plugin_add_globs (AsbPlugin *plugin, GPtrArray *globs)
-{
- asb_plugin_add_glob (globs, "/usr/share/appdata/*.metainfo.xml");
-}
-
-/**
- * _asb_plugin_check_filename:
- */
-static gboolean
-_asb_plugin_check_filename (const gchar *filename)
-{
- if (asb_plugin_match_glob ("/usr/share/appdata/*.metainfo.xml", 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);
-}
-
-/**
- * asb_plugin_process_filename:
- */
-static gboolean
-asb_plugin_process_filename (AsbPlugin *plugin,
- AsbPackage *pkg,
- const gchar *filename,
- GList **apps,
- GError **error)
-{
- g_autoptr(AsbApp) app = NULL;
-
- app = asb_app_new (pkg, NULL);
- if (!as_app_parse_file (AS_APP (app), filename,
- AS_APP_PARSE_FLAG_APPEND_DATA,
- error))
- return FALSE;
- if (as_app_get_id_kind (AS_APP (app)) != AS_ID_KIND_ADDON &&
- as_app_get_id_kind (AS_APP (app)) != AS_ID_KIND_FONT) {
- g_set_error (error,
- ASB_PLUGIN_ERROR,
- ASB_PLUGIN_ERROR_FAILED,
- "%s is not an addon or font",
- as_app_get_id (AS_APP (app)));
- return FALSE;
- }
- asb_app_set_requires_appdata (app, FALSE);
- asb_app_set_hidpi_enabled (app, asb_context_get_flag (plugin->ctx, ASB_CONTEXT_FLAG_HIDPI_ICONS));
- 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;
-}
-
-/**
- * asb_plugin_merge:
- */
-void
-asb_plugin_merge (AsbPlugin *plugin, GList *list)
-{
- AsApp *app;
- AsApp *found;
- GList *l;
- g_autoptr(GHashTable) hash = NULL;
-
- /* make a hash table of ID->AsApp */
- hash = g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free, (GDestroyNotify) g_object_unref);
- for (l = list; l != NULL; l = l->next) {
- app = AS_APP (l->data);
- if (as_app_get_id_kind (app) != AS_ID_KIND_DESKTOP)
- continue;
- g_hash_table_insert (hash,
- g_strdup (as_app_get_id (app)),
- g_object_ref (app));
- }
-
- /* add addons where the pkgname is different from the
- * main package */
- for (l = list; l != NULL; l = l->next) {
- if (!ASB_IS_APP (l->data))
- continue;
- app = AS_APP (l->data);
- if (as_app_get_id_kind (app) != AS_ID_KIND_ADDON)
- continue;
- found = g_hash_table_lookup (hash, as_app_get_id (app));
- if (found == NULL)
- continue;
- if (g_strcmp0 (as_app_get_pkgname_default (app),
- as_app_get_pkgname_default (found)) != 0)
- continue;
- as_app_add_veto (app,
- "absorbing addon %s shipped in "
- "main package %s",
- as_app_get_id (app),
- as_app_get_pkgname_default (app));
- as_app_subsume_full (found, app, AS_APP_SUBSUME_FLAG_PARTIAL);
- }
-}
diff --git a/libappstream-glib/as-app-validate.c b/libappstream-glib/as-app-validate.c
index 36632d7..d8076ca 100644
--- a/libappstream-glib/as-app-validate.c
+++ b/libappstream-glib/as-app-validate.c
@@ -1209,6 +1209,14 @@ as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error)
"<pkgname> not allowed in metainfo");
}
+ /* appdata */
+ if (as_app_get_icon_default (app) != NULL &&
+ as_app_get_source_kind (app) == AS_APP_SOURCE_KIND_APPDATA) {
+ ai_app_validate_add (&helper,
+ AS_PROBLEM_KIND_TAG_INVALID,
+ "<icon> not allowed in appdata");
+ }
+
/* extends */
if (as_app_get_extends(app)->len == 0 &&
as_app_get_id_kind (app) == AS_ID_KIND_ADDON &&