summaryrefslogtreecommitdiff
path: root/libappstream-glib/as-app-builder.c
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2016-01-31 19:55:13 +0000
committerRichard Hughes <richard@hughsie.com>2016-01-31 20:31:14 +0000
commitbfc6783eccc7e4d67d43011fdfaf88cf5972bc83 (patch)
treecc8cb773f7eb70818dec8d47643612d9bdfe35a7 /libappstream-glib/as-app-builder.c
parentd85558dbf74025bddfae6a369d77bc95654e1d91 (diff)
downloadappstream-glib-bfc6783eccc7e4d67d43011fdfaf88cf5972bc83.tar.gz
Move the kudo and provides autodetection to libappstream-glib
Diffstat (limited to 'libappstream-glib/as-app-builder.c')
-rw-r--r--libappstream-glib/as-app-builder.c173
1 files changed, 173 insertions, 0 deletions
diff --git a/libappstream-glib/as-app-builder.c b/libappstream-glib/as-app-builder.c
index 799e862..12d8b0e 100644
--- a/libappstream-glib/as-app-builder.c
+++ b/libappstream-glib/as-app-builder.c
@@ -516,3 +516,176 @@ as_app_builder_search_translations (AsApp *app,
}
return TRUE;
}
+
+/**
+ * as_app_builder_search_path:
+ **/
+static gboolean
+as_app_builder_search_path (AsApp *app,
+ const gchar *prefix,
+ const gchar *path,
+ AsAppBuilderFlags flags)
+{
+ const gchar *tmp;
+ g_autofree gchar *fn_prefix = NULL;
+ g_autoptr(GDir) dir = NULL;
+
+ /* find dir */
+ fn_prefix = g_build_filename (prefix, path, NULL);
+ if (!g_file_test (fn_prefix, G_FILE_TEST_IS_DIR))
+ return FALSE;
+ dir = g_dir_open (fn_prefix, 0, NULL);
+ if (dir == NULL)
+ return FALSE;
+
+ /* find any file with the app-id prefix */
+ while ((tmp = g_dir_read_name (dir)) != NULL) {
+ if (g_str_has_prefix (tmp, as_app_get_id (app)))
+ return TRUE;
+ }
+
+ /* just anything */
+ if (flags & AS_APP_BUILDER_FLAG_USE_FALLBACKS)
+ return TRUE;
+
+ return FALSE;
+}
+
+/**
+ * as_app_builder_search_kudos:
+ * @app: an #AsApp
+ * @prefix: a prefix to search, e.g. "/usr"
+ * @flags: #AsAppBuilderFlags, e.g. %AS_APP_BUILDER_FLAG_USE_FALLBACKS
+ * @cancellable: a #GCancellable or %NULL
+ * @error: a #GError or %NULL
+ *
+ * Searches a prefix for auto-detected kudos.
+ *
+ * Returns: %TRUE for success
+ *
+ * Since: 0.5.8
+ **/
+gboolean
+as_app_builder_search_kudos (AsApp *app,
+ const gchar *prefix,
+ AsAppBuilderFlags flags,
+ GError **error)
+{
+ /* gnome-shell search provider */
+ if (!as_app_has_kudo_kind (app, AS_KUDO_KIND_SEARCH_PROVIDER) &&
+ as_app_builder_search_path (app, prefix,
+ "share/gnome-shell/search-providers",
+ flags)) {
+ g_debug ("auto-adding SearchProvider kudo");
+ as_app_add_kudo_kind (AS_APP (app), AS_KUDO_KIND_SEARCH_PROVIDER);
+ }
+
+ /* hicolor icon */
+ if (!as_app_has_kudo_kind (app, AS_KUDO_KIND_HIGH_CONTRAST) &&
+ as_app_builder_search_path (app, prefix,
+ "share/icons/hicolor/symbolic/apps",
+ flags)) {
+ g_debug ("auto-adding HighContrast kudo");
+ as_app_add_kudo_kind (AS_APP (app), AS_KUDO_KIND_HIGH_CONTRAST);
+ }
+ return TRUE;
+}
+
+/**
+ * as_app_builder_search_dbus_file:
+ **/
+static gboolean
+as_app_builder_search_dbus_file (AsApp *app,
+ const gchar *filename,
+ AsProvideKind provide_kind,
+ GError **error)
+{
+ g_autofree gchar *name = NULL;
+ g_autoptr(AsProvide) provide = NULL;
+ g_autoptr(GKeyFile) kf = NULL;
+
+ /* load file */
+ kf = g_key_file_new ();
+ if (!g_key_file_load_from_file (kf, filename, G_KEY_FILE_NONE, error))
+ return FALSE;
+ name = g_key_file_get_string (kf, "D-BUS Service", "Name", error);
+ if (name == NULL)
+ return FALSE;
+
+ /* add provide */
+ provide = as_provide_new ();
+ as_provide_set_kind (provide, provide_kind);
+ as_provide_set_value (provide, name);
+ as_app_add_provide (AS_APP (app), provide);
+ return TRUE;
+}
+
+/**
+ * as_app_builder_search_dbus:
+ **/
+static gboolean
+as_app_builder_search_dbus (AsApp *app,
+ const gchar *prefix,
+ const gchar *path,
+ AsProvideKind provide_kind,
+ AsAppBuilderFlags flags,
+ GError **error)
+{
+ const gchar *tmp;
+ g_autofree gchar *fn_prefix = NULL;
+ g_autoptr(GDir) dir = NULL;
+
+ /* find dir */
+ fn_prefix = g_build_filename (prefix, path, NULL);
+ if (!g_file_test (fn_prefix, G_FILE_TEST_IS_DIR))
+ return TRUE;
+ dir = g_dir_open (fn_prefix, 0, error);
+ if (dir == NULL)
+ return FALSE;
+
+ /* find any file with the app-id prefix */
+ while ((tmp = g_dir_read_name (dir)) != NULL) {
+ g_autofree gchar *fn = NULL;
+ if ((flags & AS_APP_BUILDER_FLAG_USE_FALLBACKS) == 0) {
+ if (!g_str_has_prefix (tmp, as_app_get_id (app)))
+ continue;
+ }
+ fn = g_build_filename (fn_prefix, tmp, NULL);
+ if (!as_app_builder_search_dbus_file (app, fn, provide_kind, error))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/**
+ * as_app_builder_search_provides:
+ * @app: an #AsApp
+ * @prefix: a prefix to search, e.g. "/usr"
+ * @flags: #AsAppBuilderFlags, e.g. %AS_APP_BUILDER_FLAG_USE_FALLBACKS
+ * @cancellable: a #GCancellable or %NULL
+ * @error: a #GError or %NULL
+ *
+ * Searches a prefix for auto-detected provides.
+ *
+ * Returns: %TRUE for success
+ *
+ * Since: 0.5.8
+ **/
+gboolean
+as_app_builder_search_provides (AsApp *app,
+ const gchar *prefix,
+ AsAppBuilderFlags flags,
+ GError **error)
+{
+ if (!as_app_builder_search_dbus (app, prefix,
+ "share/dbus-1/system-services",
+ AS_PROVIDE_KIND_DBUS_SYSTEM,
+ flags, error))
+ return FALSE;
+ if (!as_app_builder_search_dbus (app, prefix,
+ "share/dbus-1/services",
+ AS_PROVIDE_KIND_DBUS_SESSION,
+ flags, error))
+ return FALSE;
+ return TRUE;
+}