[gnome-builder] configuration: Make the default config persist
- From: Matthew Leeds <mwleeds src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] configuration: Make the default config persist
- Date: Thu, 18 May 2017 01:34:08 +0000 (UTC)
commit 39997b2961f8f55a1f7220e59e9adfa4250ae168
Author: Matthew Leeds <mwleeds protonmail com>
Date: Tue May 16 19:13:12 2017 -0500
configuration: Make the default config persist
When the build configuration management changed to using
IdeConfigurationProviders rather than doing everything in
IdeConfigurationManager, the default configuration stopped persisting to
the disk (so changes made are only effective during a session). This is
because the configuration was being added by the manager as an
IdeConfiguration rather than an IdeBuildconfigConfiguration, and
IdeBuildconfigConfigurationProvider knows how to read and write
".buildconfig" files.
The most obvious solution, creating the default configuration in the
IdeBuildconfigConfigurationProvider's load function, doesn't work because the
loads are asynchronous and there has to be at least one configuration
when the IdeConfigurationManager finishes initializing (otherwise the
IdeBuildPipeline will fail to initialize).
Instead, the load interface for IdeConfigurationProviders was changed to
an async/finish pair, so the IdeConfigurationManager knows when the
loads finish. At that point, it can check if a configuration was
restored from a .buildconfig file (in which case nothing needs to be
done) or if the default configuration was added by the
IdeConfigurationManager (in which case the buildconfig provider needs to
be informed of it so it can be persisted when changes are made).
https://bugzilla.gnome.org/show_bug.cgi?id=779240
.../ide-buildconfig-configuration-provider.c | 61 ++++++++--
.../ide-buildconfig-configuration-provider.h | 5 +
libide/buildsystem/ide-configuration-manager.c | 117 +++++++++++++++++++-
libide/buildsystem/ide-configuration-provider.c | 51 ++++++++-
libide/buildsystem/ide-configuration-provider.h | 20 +++-
.../flatpak/gbp-flatpak-configuration-provider.c | 44 +++++---
6 files changed, 254 insertions(+), 44 deletions(-)
---
diff --git a/libide/buildconfig/ide-buildconfig-configuration-provider.c
b/libide/buildconfig/ide-buildconfig-configuration-provider.c
index 7dd4aee..1d6f2b9 100644
--- a/libide/buildconfig/ide-buildconfig-configuration-provider.c
+++ b/libide/buildconfig/ide-buildconfig-configuration-provider.c
@@ -41,7 +41,6 @@ struct _IdeBuildconfigConfigurationProvider
GObject parent_instance;
IdeConfigurationManager *manager;
- GCancellable *cancellable;
GPtrArray *configurations;
GKeyFile *key_file;
@@ -55,7 +54,6 @@ G_DEFINE_TYPE_EXTENDED (IdeBuildconfigConfigurationProvider, ide_buildconfig_con
G_IMPLEMENT_INTERFACE (IDE_TYPE_CONFIGURATION_PROVIDER,
configuration_provider_iface_init))
-static void ide_buildconfig_configuration_provider_load (IdeConfigurationProvider *provider,
IdeConfigurationManager *manager);
static void ide_buildconfig_configuration_provider_unload (IdeConfigurationProvider *provider,
IdeConfigurationManager *manager);
static void
@@ -511,11 +509,13 @@ ide_buildconfig_configuration_provider_load_cb (GObject *object,
IdeBuildconfigConfigurationProvider *self;
g_autoptr(GPtrArray) ar = NULL;
g_autoptr(GError) error = NULL;
+ g_autoptr(GTask) task = user_data;
IDE_ENTRY;
g_assert (IDE_IS_BUILDCONFIG_CONFIGURATION_PROVIDER (object));
g_assert (G_IS_TASK (result));
+ g_assert (G_IS_TASK (task));
ar = g_task_propagate_pointer (G_TASK (result), &error);
self = g_task_get_source_object (G_TASK (result));
@@ -544,35 +544,57 @@ ide_buildconfig_configuration_provider_load_cb (GObject *object,
self->configurations = g_steal_pointer (&ar);
if (error != NULL)
- g_warning ("Failed to restore configuration: %s", error->message);
+ g_task_return_error (task, g_steal_pointer (&error));
+ else
+ g_task_return_boolean (task, TRUE);
IDE_EXIT;
}
static void
-ide_buildconfig_configuration_provider_load (IdeConfigurationProvider *provider,
- IdeConfigurationManager *manager)
+ide_buildconfig_configuration_provider_load_async (IdeConfigurationProvider *provider,
+ IdeConfigurationManager *manager,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
IdeBuildconfigConfigurationProvider *self = (IdeBuildconfigConfigurationProvider *)provider;
+ g_autoptr(GTask) parent_task = NULL;
g_autoptr(GTask) task = NULL;
IDE_ENTRY;
g_assert (IDE_IS_BUILDCONFIG_CONFIGURATION_PROVIDER (self));
g_assert (IDE_IS_CONFIGURATION_MANAGER (manager));
+ g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
ide_set_weak_pointer (&self->manager, manager);
- self->cancellable = g_cancellable_new ();
+ /* This task is needed so the caller knows when the load finishes */
+ parent_task = g_task_new (self, cancellable, callback, user_data);
- task = g_task_new (self, self->cancellable, ide_buildconfig_configuration_provider_load_cb, NULL);
- g_task_set_source_tag (task, ide_buildconfig_configuration_provider_load);
+ /* This task is used to run the load_worker in its own thread */
+ task = g_task_new (self, cancellable, ide_buildconfig_configuration_provider_load_cb, g_steal_pointer
(&parent_task));
+ g_task_set_source_tag (task, ide_buildconfig_configuration_provider_load_async);
g_task_set_task_data (task, g_object_ref (manager), g_object_unref);
g_task_run_in_thread (task, ide_buildconfig_configuration_provider_load_worker);
IDE_EXIT;
}
+gboolean
+ide_buildconfig_configuration_provider_load_finish (IdeConfigurationProvider *provider,
+ GAsyncResult *result,
+ GError **error)
+{
+ IdeBuildconfigConfigurationProvider *self = (IdeBuildconfigConfigurationProvider *)provider;
+
+ g_return_val_if_fail (IDE_IS_BUILDCONFIG_CONFIGURATION_PROVIDER (self), FALSE);
+ g_return_val_if_fail (G_IS_TASK (result), FALSE);
+
+ return g_task_propagate_boolean (G_TASK (result), error);
+}
+
static void
ide_buildconfig_configuration_provider_unload (IdeConfigurationProvider *provider,
IdeConfigurationManager *manager)
@@ -598,15 +620,27 @@ ide_buildconfig_configuration_provider_unload (IdeConfigurationProvider *provide
g_clear_pointer (&self->configurations, g_ptr_array_unref);
- if (self->cancellable != NULL)
- g_cancellable_cancel (self->cancellable);
- g_clear_object (&self->cancellable);
-
ide_clear_weak_pointer (&self->manager);
IDE_EXIT;
}
+void
+ide_buildconfig_configuration_provider_track_config (IdeBuildconfigConfigurationProvider *self,
+ IdeBuildconfigConfiguration *config)
+{
+ g_assert (IDE_IS_BUILDCONFIG_CONFIGURATION_PROVIDER (self));
+ g_return_if_fail (IDE_IS_BUILDCONFIG_CONFIGURATION (config));
+
+ g_signal_connect_object (config,
+ "changed",
+ G_CALLBACK (ide_buildconfig_configuration_provider_changed),
+ self,
+ G_CONNECT_SWAPPED);
+
+ g_ptr_array_add (self->configurations, config);
+}
+
static void
ide_buildconfig_configuration_provider_class_init (IdeBuildconfigConfigurationProviderClass *klass)
{
@@ -620,7 +654,8 @@ ide_buildconfig_configuration_provider_init (IdeBuildconfigConfigurationProvider
static void
configuration_provider_iface_init (IdeConfigurationProviderInterface *iface)
{
- iface->load = ide_buildconfig_configuration_provider_load;
+ iface->load_async = ide_buildconfig_configuration_provider_load_async;
+ iface->load_finish = ide_buildconfig_configuration_provider_load_finish;
iface->unload = ide_buildconfig_configuration_provider_unload;
iface->save_async = ide_buildconfig_configuration_provider_save_async;
iface->save_finish = ide_buildconfig_configuration_provider_save_finish;
diff --git a/libide/buildconfig/ide-buildconfig-configuration-provider.h
b/libide/buildconfig/ide-buildconfig-configuration-provider.h
index 2ec8dff..5466e37 100644
--- a/libide/buildconfig/ide-buildconfig-configuration-provider.h
+++ b/libide/buildconfig/ide-buildconfig-configuration-provider.h
@@ -23,12 +23,17 @@
#include "ide-types.h"
+#include "buildconfig/ide-buildconfig-configuration.h"
+
G_BEGIN_DECLS
#define IDE_TYPE_BUILDCONFIG_CONFIGURATION_PROVIDER (ide_buildconfig_configuration_provider_get_type())
G_DECLARE_FINAL_TYPE (IdeBuildconfigConfigurationProvider, ide_buildconfig_configuration_provider, IDE,
BUILDCONFIG_CONFIGURATION_PROVIDER, GObject)
+void ide_buildconfig_configuration_provider_track_config (IdeBuildconfigConfigurationProvider *self,
+ IdeBuildconfigConfiguration *config);
+
G_END_DECLS
#endif /* IDE_BUILDCONFIG_CONFIGURATION_PROVIDER_H */
diff --git a/libide/buildsystem/ide-configuration-manager.c b/libide/buildsystem/ide-configuration-manager.c
index 10e3d57..c2f9403 100644
--- a/libide/buildsystem/ide-configuration-manager.c
+++ b/libide/buildsystem/ide-configuration-manager.c
@@ -30,6 +30,9 @@
#include "buildsystem/ide-configuration.h"
#include "buildsystem/ide-configuration-provider.h"
+#include "buildconfig/ide-buildconfig-configuration.h"
+#include "buildconfig/ide-buildconfig-configuration-provider.h"
+
struct _IdeConfigurationManager
{
GObject parent_instance;
@@ -37,6 +40,8 @@ struct _IdeConfigurationManager
GPtrArray *configurations;
IdeConfiguration *current;
PeasExtensionSet *extensions;
+ GCancellable *cancellable;
+ guint providers_loading;
};
static void async_initable_iface_init (GAsyncInitableIface *iface);
@@ -65,19 +70,24 @@ static guint signals [N_SIGNALS];
static void
ide_configuration_manager_add_default (IdeConfigurationManager *self)
{
- g_autoptr(IdeConfiguration) config = NULL;
+ g_autoptr(IdeBuildconfigConfiguration) config = NULL;
IdeContext *context;
g_assert (IDE_IS_CONFIGURATION_MANAGER (self));
context = ide_object_get_context (IDE_OBJECT (self));
- config = ide_configuration_new (context, "default", "local", "host");
- ide_configuration_set_display_name (config, _("Default"));
- ide_configuration_manager_add (self, config);
+ config = g_object_new (IDE_TYPE_BUILDCONFIG_CONFIGURATION,
+ "id", "default",
+ "context", context,
+ "device-id", "local",
+ "runtime-id", "host",
+ NULL);
+ ide_configuration_set_display_name (IDE_CONFIGURATION (config), _("Default"));
+ ide_configuration_manager_add (self, IDE_CONFIGURATION (config));
if (self->configurations->len == 1)
- ide_configuration_manager_set_current (self, config);
+ ide_configuration_manager_set_current (self, IDE_CONFIGURATION (config));
}
static void
@@ -254,6 +264,10 @@ ide_configuration_manager_finalize (GObject *object)
g_clear_object (&self->current);
}
+ if (self->cancellable != NULL)
+ g_cancellable_cancel (self->cancellable);
+ g_clear_object (&self->cancellable);
+
G_OBJECT_CLASS (ide_configuration_manager_parent_class)->finalize (object);
}
@@ -383,6 +397,79 @@ list_model_iface_init (GListModelInterface *iface)
}
static void
+ide_configuration_manager_track_buildconfig (PeasExtensionSet *set,
+ PeasPluginInfo *plugin_info,
+ PeasExtension *exten,
+ gpointer user_data)
+{
+ IdeConfigurationProvider *provider = (IdeConfigurationProvider *)exten;
+ IdeConfiguration *config = user_data;
+
+ g_assert (PEAS_IS_EXTENSION_SET (set));
+ g_assert (plugin_info != NULL);
+ g_assert (IDE_IS_CONFIGURATION_PROVIDER (provider));
+
+ if (IDE_IS_BUILDCONFIG_CONFIGURATION_PROVIDER (provider) && config != NULL)
+ ide_buildconfig_configuration_provider_track_config ((IdeBuildconfigConfigurationProvider *)provider,
+ (IdeBuildconfigConfiguration *)g_object_ref
(config));
+}
+
+static void
+ide_configuration_manager_load_cb (GObject *object,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ IdeConfigurationProvider *provider = (IdeConfigurationProvider *)object;
+ IdeConfigurationManager *self = user_data;
+ g_autoptr(GError) error = NULL;
+
+ IDE_ENTRY;
+
+ g_assert (IDE_IS_CONFIGURATION_PROVIDER (provider));
+ g_assert (IDE_IS_CONFIGURATION_MANAGER (self));
+ g_assert (G_IS_TASK (result));
+
+ if (!ide_configuration_provider_load_finish (provider, result, &error))
+ g_warning ("%s: %s", G_OBJECT_TYPE_NAME (provider), error->message);
+
+ self->providers_loading--;
+ if (self->providers_loading == 0)
+ {
+ IdeConfiguration *default_config;
+ gboolean restored_buildconfig = FALSE;
+
+ for (guint i = 0; i < self->configurations->len; i++)
+ {
+ IdeConfiguration *configuration = g_ptr_array_index (self->configurations, i);
+
+ if (IDE_IS_BUILDCONFIG_CONFIGURATION (configuration) &&
+ g_strcmp0 ("default", ide_configuration_get_id (configuration)) != 0)
+ restored_buildconfig = TRUE;
+ }
+
+ /*
+ * If the default config was added by the manager rather than the provider,
+ * let the provider know about it so changes are persisted to the disk.
+ */
+ default_config = ide_configuration_manager_get_configuration (self, "default");
+ if (!restored_buildconfig)
+ {
+ if (default_config == NULL)
+ {
+ ide_configuration_manager_add_default (self);
+ default_config = ide_configuration_manager_get_configuration (self, "default");
+ }
+
+ peas_extension_set_foreach (self->extensions,
+ ide_configuration_manager_track_buildconfig,
+ default_config);
+ }
+ }
+
+ IDE_EXIT;
+}
+
+static void
ide_configuration_manager_extension_added (PeasExtensionSet *set,
PeasPluginInfo *plugin_info,
PeasExtension *exten,
@@ -395,7 +482,12 @@ ide_configuration_manager_extension_added (PeasExtensionSet *set,
g_assert (plugin_info != NULL);
g_assert (IDE_IS_CONFIGURATION_PROVIDER (provider));
- ide_configuration_provider_load (provider, self);
+ self->providers_loading++;
+ ide_configuration_provider_load_async (provider,
+ self,
+ self->cancellable,
+ ide_configuration_manager_load_cb,
+ self);
}
static void
@@ -432,6 +524,10 @@ ide_configuration_manager_init_worker (GTask *task,
context = ide_object_get_context (IDE_OBJECT (self));
g_assert (IDE_IS_CONTEXT (context));
+ self->providers_loading = 0;
+
+ self->cancellable = g_cancellable_new ();
+
self->extensions = peas_extension_set_new (peas_engine_get_default (),
IDE_TYPE_CONFIGURATION_PROVIDER,
NULL);
@@ -567,6 +663,15 @@ ide_configuration_manager_add (IdeConfigurationManager *self,
g_return_if_fail (IDE_IS_CONFIGURATION_MANAGER (self));
g_return_if_fail (IDE_IS_CONFIGURATION (configuration));
+ /* Allow the default config to be overridden by one from a provider */
+ if (g_strcmp0 ("default", ide_configuration_get_id (configuration)) == 0)
+ {
+ IdeConfiguration *default_config;
+ default_config = ide_configuration_manager_get_configuration (self, "default");
+ if (default_config != NULL)
+ g_ptr_array_remove_fast (self->configurations, default_config);
+ }
+
position = self->configurations->len;
g_ptr_array_add (self->configurations, g_object_ref (configuration));
g_list_model_items_changed (G_LIST_MODEL (self), position, 0, 1);
diff --git a/libide/buildsystem/ide-configuration-provider.c b/libide/buildsystem/ide-configuration-provider.c
index 836fe04..7ddded1 100644
--- a/libide/buildsystem/ide-configuration-provider.c
+++ b/libide/buildsystem/ide-configuration-provider.c
@@ -22,9 +22,32 @@
G_DEFINE_INTERFACE (IdeConfigurationProvider, ide_configuration_provider, G_TYPE_OBJECT)
static void
-ide_configuration_provider_real_load (IdeConfigurationProvider *self,
- IdeConfigurationManager *manager)
+ide_configuration_provider_real_load_async (IdeConfigurationProvider *self,
+ IdeConfigurationManager *manager,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
+ g_autoptr(GTask) task = user_data;
+
+ g_return_if_fail (IDE_IS_CONFIGURATION_PROVIDER (self));
+ g_return_if_fail (IDE_IS_CONFIGURATION_MANAGER (manager));
+ g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
+ g_return_if_fail (G_IS_TASK (task));
+
+ g_warning ("The current IdeConfigurationProvider doesn't implement load_async");
+ g_task_return_boolean (task, TRUE);
+}
+
+gboolean
+ide_configuration_provider_real_load_finish (IdeConfigurationProvider *self,
+ GAsyncResult *result,
+ GError **error)
+{
+ g_return_val_if_fail (IDE_IS_CONFIGURATION_PROVIDER (self), FALSE);
+ g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);
+
+ return TRUE;
}
static void
@@ -63,20 +86,36 @@ ide_configuration_provider_real_save_finish (IdeConfigurationProvider *self,
static void
ide_configuration_provider_default_init (IdeConfigurationProviderInterface *iface)
{
- iface->load = ide_configuration_provider_real_load;
+ iface->load_async = ide_configuration_provider_real_load_async;
+ iface->load_finish = ide_configuration_provider_real_load_finish;
iface->unload = ide_configuration_provider_real_unload;
iface->save_async = ide_configuration_provider_real_save_async;
iface->save_finish = ide_configuration_provider_real_save_finish;
}
void
-ide_configuration_provider_load (IdeConfigurationProvider *self,
- IdeConfigurationManager *manager)
+ide_configuration_provider_load_async (IdeConfigurationProvider *self,
+ IdeConfigurationManager *manager,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
g_return_if_fail (IDE_IS_CONFIGURATION_PROVIDER (self));
g_return_if_fail (IDE_IS_CONFIGURATION_MANAGER (manager));
+ g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
+
+ IDE_CONFIGURATION_PROVIDER_GET_IFACE (self)->load_async (self, manager, cancellable, callback, user_data);
+}
- IDE_CONFIGURATION_PROVIDER_GET_IFACE (self)->load (self, manager);
+gboolean
+ide_configuration_provider_load_finish (IdeConfigurationProvider *self,
+ GAsyncResult *result,
+ GError **error)
+{
+ g_return_val_if_fail (IDE_IS_CONFIGURATION_PROVIDER (self), FALSE);
+ g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);
+
+ return IDE_CONFIGURATION_PROVIDER_GET_IFACE (self)->save_finish (self, result, error);
}
void
diff --git a/libide/buildsystem/ide-configuration-provider.h b/libide/buildsystem/ide-configuration-provider.h
index b9c19cd..ecad966 100644
--- a/libide/buildsystem/ide-configuration-provider.h
+++ b/libide/buildsystem/ide-configuration-provider.h
@@ -33,8 +33,14 @@ struct _IdeConfigurationProviderInterface
{
GTypeInterface parent;
- void (*load) (IdeConfigurationProvider *self,
- IdeConfigurationManager *manager);
+ void (*load_async) (IdeConfigurationProvider *self,
+ IdeConfigurationManager *manager,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+ gboolean (*load_finish) (IdeConfigurationProvider *self,
+ GAsyncResult *result,
+ GError **error);
void (*unload) (IdeConfigurationProvider *self,
IdeConfigurationManager *manager);
void (*save_async) (IdeConfigurationProvider *self,
@@ -46,8 +52,14 @@ struct _IdeConfigurationProviderInterface
GError **error);
};
-void ide_configuration_provider_load (IdeConfigurationProvider *self,
- IdeConfigurationManager *manager);
+void ide_configuration_provider_load_async (IdeConfigurationProvider *self,
+ IdeConfigurationManager *manager,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+gboolean ide_configuration_provider_load_finish (IdeConfigurationProvider *self,
+ GAsyncResult *result,
+ GError **error);
void ide_configuration_provider_unload (IdeConfigurationProvider *self,
IdeConfigurationManager *manager);
void ide_configuration_provider_save_async (IdeConfigurationProvider *self,
diff --git a/plugins/flatpak/gbp-flatpak-configuration-provider.c
b/plugins/flatpak/gbp-flatpak-configuration-provider.c
index bdd28f8..3de7668 100644
--- a/plugins/flatpak/gbp-flatpak-configuration-provider.c
+++ b/plugins/flatpak/gbp-flatpak-configuration-provider.c
@@ -36,7 +36,6 @@ struct _GbpFlatpakConfigurationProvider
{
GObject parent_instance;
IdeConfigurationManager *manager;
- GCancellable *cancellable;
GPtrArray *configurations;
GPtrArray *manifest_monitors;
@@ -45,8 +44,6 @@ struct _GbpFlatpakConfigurationProvider
};
static void configuration_provider_iface_init (IdeConfigurationProviderInterface *iface);
-static void gbp_flatpak_configuration_provider_load (IdeConfigurationProvider *provider,
- IdeConfigurationManager *manager);
static void gbp_flatpak_configuration_provider_unload (IdeConfigurationProvider *provider,
IdeConfigurationManager *manager);
@@ -999,16 +996,18 @@ gbp_flatpak_configuration_provider_load_cb (GObject *object,
GPtrArray *ret;
GError *error = NULL;
guint i;
+ g_autoptr(GTask) task = user_data;
IDE_ENTRY;
g_assert (GBP_IS_FLATPAK_CONFIGURATION_PROVIDER (self));
g_assert (G_IS_TASK (result));
+ g_assert (G_IS_TASK (task));
if (!(ret = g_task_propagate_pointer (G_TASK (result), &error)))
{
g_warning ("%s", error->message);
- g_clear_error (&error);
+ g_task_return_error (task, g_steal_pointer (&error));
IDE_EXIT;
}
@@ -1022,33 +1021,52 @@ gbp_flatpak_configuration_provider_load_cb (GObject *object,
self->configurations = ret;
+ g_task_return_boolean (task, TRUE);
+
IDE_EXIT;
}
static void
-gbp_flatpak_configuration_provider_load (IdeConfigurationProvider *provider,
- IdeConfigurationManager *manager)
+gbp_flatpak_configuration_provider_load_async (IdeConfigurationProvider *provider,
+ IdeConfigurationManager *manager,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
GbpFlatpakConfigurationProvider *self = (GbpFlatpakConfigurationProvider *)provider;
+ g_autoptr(GTask) parent_task = NULL;
g_autoptr(GTask) task = NULL;
IDE_ENTRY;
g_assert (GBP_IS_FLATPAK_CONFIGURATION_PROVIDER (self));
g_assert (IDE_IS_CONFIGURATION_MANAGER (manager));
+ g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
ide_set_weak_pointer (&self->manager, manager);
self->manifest_monitors = g_ptr_array_new_with_free_func (g_object_unref);
- self->cancellable = g_cancellable_new ();
-
- task = g_task_new (self, self->cancellable, gbp_flatpak_configuration_provider_load_cb, NULL);
+ parent_task = g_task_new (self, cancellable, callback, user_data);
+ task = g_task_new (self, cancellable, gbp_flatpak_configuration_provider_load_cb, g_steal_pointer
(&parent_task));
g_task_run_in_thread (task, gbp_flatpak_configuration_provider_load_worker);
IDE_EXIT;
}
+gboolean
+gbp_flatpak_configuration_provider_load_finish (IdeConfigurationProvider *provider,
+ GAsyncResult *result,
+ GError **error)
+{
+ GbpFlatpakConfigurationProvider *self = (GbpFlatpakConfigurationProvider *)provider;
+
+ g_return_val_if_fail (GBP_IS_FLATPAK_CONFIGURATION_PROVIDER (self), FALSE);
+ g_return_val_if_fail (G_IS_TASK (result), FALSE);
+
+ return g_task_propagate_boolean (G_TASK (result), error);
+}
+
static void
gbp_flatpak_configuration_provider_unload (IdeConfigurationProvider *provider,
IdeConfigurationManager *manager)
@@ -1076,11 +1094,6 @@ gbp_flatpak_configuration_provider_unload (IdeConfigurationProvider *provider,
g_clear_pointer (&self->manifest_monitors, g_ptr_array_unref);
- if (self->cancellable != NULL)
- g_cancellable_cancel (self->cancellable);
-
- g_clear_object (&self->cancellable);
-
ide_clear_weak_pointer (&self->manager);
IDE_EXIT;
@@ -1102,7 +1115,8 @@ gbp_flatpak_configuration_provider_init (GbpFlatpakConfigurationProvider *self)
static void
configuration_provider_iface_init (IdeConfigurationProviderInterface *iface)
{
- iface->load = gbp_flatpak_configuration_provider_load;
+ iface->load_async = gbp_flatpak_configuration_provider_load_async;
+ iface->load_finish = gbp_flatpak_configuration_provider_load_finish;
iface->unload = gbp_flatpak_configuration_provider_unload;
iface->save_async = gbp_flatpak_configuration_provider_save_async;
iface->save_finish = gbp_flatpak_configuration_provider_save_finish;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]