summaryrefslogtreecommitdiffstats
path: root/lib/gs-plugin-loader-sync.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gs-plugin-loader-sync.c')
-rw-r--r--lib/gs-plugin-loader-sync.c254
1 files changed, 254 insertions, 0 deletions
diff --git a/lib/gs-plugin-loader-sync.c b/lib/gs-plugin-loader-sync.c
new file mode 100644
index 0000000..2b8b39a
--- /dev/null
+++ b/lib/gs-plugin-loader-sync.c
@@ -0,0 +1,254 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ * vi:set noexpandtab tabstop=8 shiftwidth=8:
+ *
+ * Copyright (C) 2012-2017 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2017 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include "gs-plugin-loader-sync.h"
+
+/* tiny helper to help us do the async operation */
+typedef struct {
+ GAsyncResult *res;
+ GMainContext *context;
+ GMainLoop *loop;
+} GsPluginLoaderHelper;
+
+static void
+_helper_finish_sync (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ GsPluginLoaderHelper *helper = user_data;
+ helper->res = g_object_ref (res);
+ g_main_loop_quit (helper->loop);
+}
+
+GsAppList *
+gs_plugin_loader_job_process (GsPluginLoader *plugin_loader,
+ GsPluginJob *plugin_job,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginLoaderHelper helper;
+ GsAppList *list;
+
+ /* create temp object */
+ helper.res = NULL;
+ helper.context = g_main_context_new ();
+ helper.loop = g_main_loop_new (helper.context, FALSE);
+
+ g_main_context_push_thread_default (helper.context);
+
+ /* run async method */
+ gs_plugin_loader_job_process_async (plugin_loader,
+ plugin_job,
+ cancellable,
+ _helper_finish_sync,
+ &helper);
+ g_main_loop_run (helper.loop);
+ list = gs_plugin_loader_job_process_finish (plugin_loader,
+ helper.res,
+ error);
+
+ g_main_context_pop_thread_default (helper.context);
+
+ g_main_loop_unref (helper.loop);
+ g_main_context_unref (helper.context);
+ if (helper.res != NULL)
+ g_object_unref (helper.res);
+
+ return list;
+}
+
+gboolean
+gs_plugin_loader_job_action (GsPluginLoader *plugin_loader,
+ GsPluginJob *plugin_job,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginLoaderHelper helper;
+ gboolean ret;
+
+ /* create temp object */
+ helper.res = NULL;
+ helper.context = g_main_context_new ();
+ helper.loop = g_main_loop_new (helper.context, FALSE);
+
+ g_main_context_push_thread_default (helper.context);
+
+ /* run async method */
+ gs_plugin_loader_job_process_async (plugin_loader,
+ plugin_job,
+ cancellable,
+ _helper_finish_sync,
+ &helper);
+ g_main_loop_run (helper.loop);
+ ret = gs_plugin_loader_job_action_finish (plugin_loader,
+ helper.res,
+ error);
+
+ g_main_context_pop_thread_default (helper.context);
+
+ g_main_loop_unref (helper.loop);
+ g_main_context_unref (helper.context);
+ if (helper.res != NULL)
+ g_object_unref (helper.res);
+
+ return ret;
+}
+
+GsApp *
+gs_plugin_loader_job_process_app (GsPluginLoader *plugin_loader,
+ GsPluginJob *plugin_job,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginLoaderHelper helper;
+ g_autoptr(GsAppList) list = NULL;
+ GsApp *app = NULL;
+
+ /* create temp object */
+ helper.res = NULL;
+ helper.context = g_main_context_new ();
+ helper.loop = g_main_loop_new (helper.context, FALSE);
+
+ g_main_context_push_thread_default (helper.context);
+
+ /* run async method */
+ gs_plugin_loader_job_process_async (plugin_loader,
+ plugin_job,
+ cancellable,
+ _helper_finish_sync,
+ &helper);
+ g_main_loop_run (helper.loop);
+ list = gs_plugin_loader_job_process_finish (plugin_loader,
+ helper.res,
+ error);
+ if (list != NULL)
+ app = g_object_ref (gs_app_list_index (list, 0));
+
+ g_main_context_pop_thread_default (helper.context);
+
+ g_main_loop_unref (helper.loop);
+ g_main_context_unref (helper.context);
+ if (helper.res != NULL)
+ g_object_unref (helper.res);
+
+ return app;
+}
+
+GsApp *
+gs_plugin_loader_app_create (GsPluginLoader *plugin_loader,
+ const gchar *unique_id,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginLoaderHelper helper;
+ GsApp *app;
+
+ /* create temp object */
+ helper.res = NULL;
+ helper.context = g_main_context_new ();
+ helper.loop = g_main_loop_new (helper.context, FALSE);
+
+ g_main_context_push_thread_default (helper.context);
+
+ /* run async method */
+ gs_plugin_loader_app_create_async (plugin_loader,
+ unique_id,
+ cancellable,
+ _helper_finish_sync,
+ &helper);
+ g_main_loop_run (helper.loop);
+ app = gs_plugin_loader_app_create_finish (plugin_loader,
+ helper.res,
+ error);
+
+ g_main_context_pop_thread_default (helper.context);
+
+ g_main_loop_unref (helper.loop);
+ g_main_context_unref (helper.context);
+ if (helper.res != NULL)
+ g_object_unref (helper.res);
+
+ return app;
+}
+
+GsApp *
+gs_plugin_loader_get_system_app (GsPluginLoader *plugin_loader,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginLoaderHelper helper;
+ GsApp *app;
+
+ /* create temp object */
+ helper.res = NULL;
+ helper.context = g_main_context_new ();
+ helper.loop = g_main_loop_new (helper.context, FALSE);
+
+ g_main_context_push_thread_default (helper.context);
+
+ /* run async method */
+ gs_plugin_loader_get_system_app_async (plugin_loader,
+ cancellable,
+ _helper_finish_sync,
+ &helper);
+ g_main_loop_run (helper.loop);
+ app = gs_plugin_loader_get_system_app_finish (plugin_loader,
+ helper.res,
+ error);
+
+ g_main_context_pop_thread_default (helper.context);
+
+ g_main_loop_unref (helper.loop);
+ g_main_context_unref (helper.context);
+ if (helper.res != NULL)
+ g_object_unref (helper.res);
+
+ return app;
+}
+
+gboolean
+gs_plugin_loader_setup (GsPluginLoader *plugin_loader,
+ const gchar * const *allowlist,
+ const gchar * const *blocklist,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginLoaderHelper helper;
+ gboolean retval;
+
+ /* create temp object */
+ helper.res = NULL;
+ helper.context = g_main_context_new ();
+ helper.loop = g_main_loop_new (helper.context, FALSE);
+
+ g_main_context_push_thread_default (helper.context);
+
+ /* run async method */
+ gs_plugin_loader_setup_async (plugin_loader,
+ allowlist,
+ blocklist,
+ cancellable,
+ _helper_finish_sync,
+ &helper);
+ g_main_loop_run (helper.loop);
+ retval = gs_plugin_loader_setup_finish (plugin_loader,
+ helper.res,
+ error);
+
+ g_main_context_pop_thread_default (helper.context);
+
+ g_main_loop_unref (helper.loop);
+ g_main_context_unref (helper.context);
+ if (helper.res != NULL)
+ g_object_unref (helper.res);
+
+ return retval;
+}