[gnome-builder] devices: simplify device manager and provider



commit 9e00b6b8db354ed8c189c811ab66fefea187342e
Author: Christian Hergert <chergert redhat com>
Date:   Thu Feb 22 17:56:58 2018 -0800

    devices: simplify device manager and provider
    
    This simplifies our very old device manager design. Since we wrote this, we
    learned a few things about using GListModel and async provider
    initialization.
    
    This applies those lessons as we start looking at more device integration.
    
    IdeDeviceProvider is now a base class, since libpeas supports that.

 src/libide/devices/ide-device-manager.c       | 340 +++++++++-----------------
 src/libide/devices/ide-device-manager.h       |  18 +-
 src/libide/devices/ide-device-provider.c      |   2 -
 src/plugins/mingw/ide-mingw-device-provider.c | 234 +++++-------------
 src/plugins/mingw/ide-mingw-device-provider.h |   2 +-
 src/plugins/mingw/ide-mingw-device.c          |  10 +-
 src/plugins/mingw/mingw-plugin.c              |   7 -
 7 files changed, 191 insertions(+), 422 deletions(-)
---
diff --git a/src/libide/devices/ide-device-manager.c b/src/libide/devices/ide-device-manager.c
index 3056544d5..6a9eea439 100644
--- a/src/libide/devices/ide-device-manager.c
+++ b/src/libide/devices/ide-device-manager.c
@@ -19,17 +19,17 @@
 #include <glib/gi18n.h>
 #include <libpeas/peas.h>
 
+#include "ide-debug.h"
+
 #include "devices/ide-device.h"
 #include "devices/ide-device-manager.h"
 #include "devices/ide-device-provider.h"
-
 #include "local/ide-local-device.h"
 #include "plugins/ide-extension-util.h"
 
 struct _IdeDeviceManager
 {
-  IdeObject  parent_instance;
-
+  IdeObject         parent_instance;
   GPtrArray        *devices;
   PeasExtensionSet *providers;
 };
@@ -39,182 +39,136 @@ static void list_model_init_interface (GListModelInterface *iface);
 G_DEFINE_TYPE_WITH_CODE (IdeDeviceManager, ide_device_manager, IDE_TYPE_OBJECT,
                          G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, list_model_init_interface))
 
-enum {
-  PROP_0,
-  PROP_SETTLED,
-  LAST_PROP
-};
-
-enum {
-  DEVICE_ADDED,
-  DEVICE_REMOVED,
-  LAST_SIGNAL
-};
-
-static guint signals [LAST_SIGNAL];
-static GParamSpec *properties [LAST_PROP];
-
-static void
-get_settled (PeasExtensionSet *set,
-             PeasPluginInfo   *plugin_info,
-             PeasExtension    *exten,
-             gpointer          user_data)
-{
-  gboolean *settled = user_data;
-
-  if (!ide_device_provider_get_settled (IDE_DEVICE_PROVIDER (exten)))
-    *settled = FALSE;
-}
-
-gboolean
-ide_device_manager_get_settled (IdeDeviceManager *self)
-{
-  gboolean settled = TRUE;
-
-  g_return_val_if_fail (IDE_IS_DEVICE_MANAGER (self), FALSE);
-
-  peas_extension_set_foreach (self->providers,
-                              (PeasExtensionSetForeachFunc)get_settled,
-                              &settled);
-
-  return settled;
-}
-
 static void
-ide_device_manager__provider_notify_settled (IdeDeviceManager  *self,
-                                             GParamSpec        *pspec,
+ide_device_manager_provider_device_added_cb (IdeDeviceManager  *self,
+                                             IdeDevice         *device,
                                              IdeDeviceProvider *provider)
 {
-  g_return_if_fail (IDE_IS_DEVICE_MANAGER (self));
-  g_return_if_fail (IDE_IS_DEVICE_PROVIDER (provider));
-
-  g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_SETTLED]);
-}
-
-static void
-ide_device_manager_do_add_device (IdeDeviceManager *self,
-                                  IdeDevice        *device)
-{
-  guint position;
+  IDE_ENTRY;
 
   g_assert (IDE_IS_DEVICE_MANAGER (self));
   g_assert (IDE_IS_DEVICE (device));
+  g_assert (IDE_IS_DEVICE_PROVIDER (provider));
 
-  position = self->devices->len;
   g_ptr_array_add (self->devices, g_object_ref (device));
-  g_list_model_items_changed (G_LIST_MODEL (self), position, 0, 1);
-}
-
-static void
-ide_device_manager__provider_device_added (IdeDeviceManager  *self,
-                                           IdeDevice         *device,
-                                           IdeDeviceProvider *provider)
-{
-  g_return_if_fail (IDE_IS_DEVICE_MANAGER (self));
-  g_return_if_fail (IDE_IS_DEVICE (device));
-  g_return_if_fail (IDE_IS_DEVICE_PROVIDER (provider));
+  g_list_model_items_changed (G_LIST_MODEL (self), self->devices->len - 1, 0, 1);
 
-  ide_device_manager_do_add_device (self, device);
-  g_signal_emit (self, signals [DEVICE_ADDED], 0, provider, device);
+  IDE_EXIT;
 }
 
 static void
-ide_device_manager__provider_device_removed (IdeDeviceManager  *self,
-                                             IdeDevice         *device,
-                                             IdeDeviceProvider *provider)
+ide_device_manager_provider_device_removed_cb (IdeDeviceManager  *self,
+                                               IdeDevice         *device,
+                                               IdeDeviceProvider *provider)
 {
-  guint i;
-
-  g_return_if_fail (IDE_IS_DEVICE_MANAGER (self));
-  g_return_if_fail (IDE_IS_DEVICE (device));
-  g_return_if_fail (IDE_IS_DEVICE_PROVIDER (provider));
+  IDE_ENTRY;
 
-  if (self->devices == NULL)
-    return;
+  g_assert (IDE_IS_DEVICE_MANAGER (self));
+  g_assert (IDE_IS_DEVICE (device));
+  g_assert (IDE_IS_DEVICE_PROVIDER (provider));
 
-  for (i = 0; i < self->devices->len; i++)
+  for (guint i = 0; i < self->devices->len; i++)
     {
-      IdeDevice *current = g_ptr_array_index (self->devices, i);
+      IdeDevice *element = g_ptr_array_index (self->devices, i);
 
-      if (current == device)
+      if (element == device)
         {
           g_ptr_array_remove_index (self->devices, i);
           g_list_model_items_changed (G_LIST_MODEL (self), i, 1, 0);
-          g_signal_emit (self, signals [DEVICE_REMOVED], 0, provider, device);
-          return;
+          break;
         }
     }
 
-  g_warning (_("The device ā€œ%sā€ could not be found."),
-             ide_device_get_id (device));
+  IDE_EXIT;
 }
 
-void
-ide_device_manager_add_provider (IdeDeviceManager  *self,
-                                 IdeDeviceProvider *provider)
+static void
+ide_device_manager_provider_load_cb (GObject      *object,
+                                     GAsyncResult *result,
+                                     gpointer      user_data)
+{
+  IdeDeviceProvider *provider = (IdeDeviceProvider *)object;
+  g_autoptr(IdeDeviceManager) self = user_data;
+  g_autoptr(GError) error = NULL;
+
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_DEVICE_PROVIDER (provider));
+  g_assert (G_IS_ASYNC_RESULT (result));
+  g_assert (IDE_IS_DEVICE_MANAGER (self));
+
+  if (!ide_device_provider_load_finish (provider, result, &error))
+    g_warning ("%s failed to load: %s",
+               G_OBJECT_TYPE_NAME (provider),
+               error->message);
+
+  IDE_EXIT;
+}
+
+static void
+ide_device_manager_provider_added_cb (PeasExtensionSet *set,
+                                      PeasPluginInfo   *plugin_info,
+                                      PeasExtension    *exten,
+                                      gpointer          user_data)
 {
+  IdeDeviceManager *self = user_data;
+  IdeDeviceProvider *provider = (IdeDeviceProvider *)exten;
   g_autoptr(GPtrArray) devices = NULL;
-  guint i;
+  guint position;
 
-  g_return_if_fail (IDE_IS_DEVICE_MANAGER (self));
-  g_return_if_fail (IDE_IS_DEVICE_PROVIDER (provider));
+  IDE_ENTRY;
 
-  g_signal_connect_object (provider,
-                           "notify::settled",
-                           G_CALLBACK (ide_device_manager__provider_notify_settled),
-                           self,
-                           G_CONNECT_SWAPPED);
+  g_assert (PEAS_IS_EXTENSION_SET (set));
+  g_assert (IDE_IS_DEVICE_MANAGER (self));
+  g_assert (plugin_info != NULL);
+  g_assert (IDE_IS_DEVICE_PROVIDER (provider));
 
   g_signal_connect_object (provider,
                            "device-added",
-                           G_CALLBACK (ide_device_manager__provider_device_added),
+                           G_CALLBACK (ide_device_manager_provider_device_added_cb),
                            self,
                            G_CONNECT_SWAPPED);
 
   g_signal_connect_object (provider,
                            "device-removed",
-                           G_CALLBACK (ide_device_manager__provider_device_removed),
+                           G_CALLBACK (ide_device_manager_provider_device_removed_cb),
                            self,
                            G_CONNECT_SWAPPED);
 
   devices = ide_device_provider_get_devices (provider);
+  position = self->devices->len;
 
-  for (i = 0; i < devices->len; i++)
+  for (guint i = 0; i < devices->len; i++)
     {
-      IdeDevice *device;
+      IdeDevice *device = g_ptr_array_index (devices, i);
 
-      device = g_ptr_array_index (devices, i);
-      ide_device_manager__provider_device_added (self, device, provider);
+      g_assert (IDE_IS_DEVICE (device));
+
+      g_ptr_array_add (self->devices, g_object_ref (device));
     }
-}
 
-static void
-ide_device_manager_provider_added (PeasExtensionSet *set,
-                                   PeasPluginInfo   *plugin_info,
-                                   PeasExtension    *exten,
-                                   gpointer          user_data)
-{
-  IdeDeviceManager *self = user_data;
-  IdeDeviceProvider *provider = (IdeDeviceProvider *)exten;
+  if (devices->len > 0)
+    g_list_model_items_changed (G_LIST_MODEL (self), position, 0, devices->len);
 
-  g_assert (PEAS_IS_EXTENSION_SET (set));
-  g_assert (IDE_IS_DEVICE_MANAGER (self));
-  g_assert (plugin_info != NULL);
-  g_assert (IDE_IS_DEVICE_PROVIDER (provider));
+  ide_device_provider_load_async (provider,
+                                  NULL,
+                                  ide_device_manager_provider_load_cb,
+                                  g_object_ref (self));
 
-  ide_device_manager_add_provider (self, provider);
+  IDE_EXIT;
 }
 
 static void
-ide_device_manager_provider_removed (PeasExtensionSet *set,
-                                     PeasPluginInfo   *plugin_info,
-                                     PeasExtension    *exten,
-                                     gpointer          user_data)
+ide_device_manager_provider_removed_cb (PeasExtensionSet *set,
+                                        PeasPluginInfo   *plugin_info,
+                                        PeasExtension    *exten,
+                                        gpointer          user_data)
 {
   IdeDeviceManager *self = user_data;
   IdeDeviceProvider *provider = (IdeDeviceProvider *)exten;
   g_autoptr(GPtrArray) devices = NULL;
-  gsize i;
+
+  IDE_ENTRY;
 
   g_assert (PEAS_IS_EXTENSION_SET (set));
   g_assert (IDE_IS_DEVICE_MANAGER (self));
@@ -223,22 +177,32 @@ ide_device_manager_provider_removed (PeasExtensionSet *set,
 
   devices = ide_device_provider_get_devices (provider);
 
-  for (i = 0; i < devices->len; i++)
+  for (guint i = 0; i < devices->len; i++)
     {
-      IdeDevice *device = g_ptr_array_index (devices, i);
+      IdeDevice *removed_device = g_ptr_array_index (devices, i);
 
-      ide_device_manager__provider_device_removed (self, device, provider);
+      for (guint j = 0; j < self->devices->len; j++)
+        {
+          IdeDevice *device = g_ptr_array_index (self->devices, j);
+
+          if (device == removed_device)
+            {
+              g_ptr_array_remove_index (self->devices, j);
+              g_list_model_items_changed (G_LIST_MODEL (self), j, 1, 0);
+              break;
+            }
+        }
     }
 
   g_signal_handlers_disconnect_by_func (provider,
-                                        G_CALLBACK (ide_device_manager__provider_notify_settled),
-                                        self);
-  g_signal_handlers_disconnect_by_func (provider,
-                                        G_CALLBACK (ide_device_manager__provider_device_added),
+                                        G_CALLBACK (ide_device_manager_provider_device_added_cb),
                                         self);
+
   g_signal_handlers_disconnect_by_func (provider,
-                                        G_CALLBACK (ide_device_manager__provider_device_removed),
+                                        G_CALLBACK (ide_device_manager_provider_device_removed_cb),
                                         self);
+
+  IDE_EXIT;
 }
 
 static void
@@ -250,55 +214,26 @@ ide_device_manager_add_providers (IdeDeviceManager *self)
 
   context = ide_object_get_context (IDE_OBJECT (self));
 
-  self->providers = ide_extension_set_new (peas_engine_get_default (),
-                                           IDE_TYPE_DEVICE_PROVIDER,
-                                           "context", context,
-                                           NULL);
+  self->providers = peas_extension_set_new (peas_engine_get_default (),
+                                            IDE_TYPE_DEVICE_PROVIDER,
+                                            "context", context,
+                                            NULL);
 
   g_signal_connect (self->providers,
                     "extension-added",
-                    G_CALLBACK (ide_device_manager_provider_added),
+                    G_CALLBACK (ide_device_manager_provider_added_cb),
                     self);
 
   g_signal_connect (self->providers,
                     "extension-removed",
-                    G_CALLBACK (ide_device_manager_provider_removed),
+                    G_CALLBACK (ide_device_manager_provider_removed_cb),
                     self);
 
   peas_extension_set_foreach (self->providers,
-                              (PeasExtensionSetForeachFunc)ide_device_manager_provider_added,
+                              (PeasExtensionSetForeachFunc)ide_device_manager_provider_added_cb,
                               self);
 }
 
-/**
- * ide_device_manager_get_devices:
- *
- * Retrieves all of the devices that are registered with the #IdeDeviceManager.
- *
- * Returns: (transfer container) (element-type Ide.Device): An array of devices
- *   registered with the #IdeManager.
- */
-GPtrArray *
-ide_device_manager_get_devices (IdeDeviceManager *self)
-{
-  GPtrArray *ret;
-  guint i;
-
-  g_return_val_if_fail (IDE_IS_DEVICE_MANAGER (self), NULL);
-
-  ret = g_ptr_array_new_with_free_func (g_object_unref);
-
-  for (i = 0; i < self->devices->len; i++)
-    {
-      IdeDevice *device;
-
-      device = g_ptr_array_index (self->devices, i);
-      g_ptr_array_add (ret, g_object_ref (device));
-    }
-
-  return ret;
-}
-
 static void
 ide_device_manager_add_local (IdeDeviceManager *self)
 {
@@ -308,10 +243,9 @@ ide_device_manager_add_local (IdeDeviceManager *self)
   g_return_if_fail (IDE_IS_DEVICE_MANAGER (self));
 
   context = ide_object_get_context (IDE_OBJECT (self));
-  device = g_object_new (IDE_TYPE_LOCAL_DEVICE,
-                         "context", context,
-                         NULL);
-  ide_device_manager_do_add_device (self, device);
+  device = g_object_new (IDE_TYPE_LOCAL_DEVICE, "context", context, NULL);
+  g_ptr_array_add (self->devices, g_steal_pointer (&device));
+  g_list_model_items_changed (G_LIST_MODEL (self), self->devices->len - 1, 0, 1);
 }
 
 static GType
@@ -356,33 +290,25 @@ ide_device_manager_constructed (GObject *object)
 }
 
 static void
-ide_device_manager_finalize (GObject *object)
+ide_device_manager_dispose (GObject *object)
 {
   IdeDeviceManager *self = (IdeDeviceManager *)object;
 
-  g_clear_pointer (&self->devices, g_ptr_array_unref);
+  if (self->devices->len > 0)
+    g_ptr_array_remove_range (self->devices, 0, self->devices->len);
   g_clear_object (&self->providers);
 
-  G_OBJECT_CLASS (ide_device_manager_parent_class)->finalize (object);
+  G_OBJECT_CLASS (ide_device_manager_parent_class)->dispose (object);
 }
 
 static void
-ide_device_manager_get_property (GObject    *object,
-                                 guint       prop_id,
-                                 GValue     *value,
-                                 GParamSpec *pspec)
+ide_device_manager_finalize (GObject *object)
 {
-  IdeDeviceManager *self = IDE_DEVICE_MANAGER(object);
+  IdeDeviceManager *self = (IdeDeviceManager *)object;
 
-  switch (prop_id)
-    {
-    case PROP_SETTLED:
-      g_value_set_boolean (value, ide_device_manager_get_settled (self));
-      break;
+  g_clear_pointer (&self->devices, g_ptr_array_unref);
 
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
-    }
+  G_OBJECT_CLASS (ide_device_manager_parent_class)->finalize (object);
 }
 
 static void
@@ -391,39 +317,8 @@ ide_device_manager_class_init (IdeDeviceManagerClass *klass)
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
   object_class->constructed = ide_device_manager_constructed;
+  object_class->dispose = ide_device_manager_dispose;
   object_class->finalize = ide_device_manager_finalize;
-  object_class->get_property = ide_device_manager_get_property;
-
-  properties [PROP_SETTLED] =
-    g_param_spec_boolean ("settled",
-                          "Settled",
-                          "If the device providers have settled.",
-                          FALSE,
-                          (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-
-  g_object_class_install_properties (object_class, LAST_PROP, properties);
-
-  signals [DEVICE_ADDED] =
-    g_signal_new ("device-added",
-                  G_TYPE_FROM_CLASS (klass),
-                  G_SIGNAL_RUN_LAST,
-                  0,
-                  NULL, NULL, NULL,
-                  G_TYPE_NONE,
-                  2,
-                  IDE_TYPE_DEVICE_PROVIDER,
-                  IDE_TYPE_DEVICE);
-
-  signals [DEVICE_REMOVED] =
-    g_signal_new ("device-removed",
-                  G_TYPE_FROM_CLASS (klass),
-                  G_SIGNAL_RUN_LAST,
-                  0,
-                  NULL, NULL, NULL,
-                  G_TYPE_NONE,
-                  2,
-                  IDE_TYPE_DEVICE_PROVIDER,
-                  IDE_TYPE_DEVICE);
 }
 
 static void
@@ -442,6 +337,7 @@ ide_device_manager_init (IdeDeviceManager *self)
 
 /**
  * ide_device_manager_get_device:
+ * @self: an #IdeDeviceManager
  * @device_id: The device identifier string.
  *
  * Fetches the first device that matches the device identifier @device_id.
@@ -452,11 +348,9 @@ IdeDevice *
 ide_device_manager_get_device (IdeDeviceManager *self,
                                const gchar      *device_id)
 {
-  gsize i;
-
   g_return_val_if_fail (IDE_IS_DEVICE_MANAGER (self), NULL);
 
-  for (i = 0; i < self->devices->len; i++)
+  for (guint i = 0; i < self->devices->len; i++)
     {
       IdeDevice *device;
       const gchar *id;
diff --git a/src/libide/devices/ide-device-manager.h b/src/libide/devices/ide-device-manager.h
index 8754eb964..2821f12f7 100644
--- a/src/libide/devices/ide-device-manager.h
+++ b/src/libide/devices/ide-device-manager.h
@@ -18,10 +18,8 @@
 
 #pragma once
 
-#include "ide-version-macros.h"
-
 #include "ide-object.h"
-#include "devices/ide-device-manager.h"
+#include "ide-version-macros.h"
 
 G_BEGIN_DECLS
 
@@ -30,17 +28,7 @@ G_BEGIN_DECLS
 G_DECLARE_FINAL_TYPE (IdeDeviceManager, ide_device_manager, IDE, DEVICE_MANAGER, IdeObject)
 
 IDE_AVAILABLE_IN_ALL
-void       ide_device_manager_add_provider    (IdeDeviceManager  *self,
-                                               IdeDeviceProvider *provider);
-IDE_AVAILABLE_IN_ALL
-GPtrArray *ide_device_manager_get_devices     (IdeDeviceManager  *self);
-IDE_AVAILABLE_IN_ALL
-gboolean   ide_device_manager_get_settled     (IdeDeviceManager  *self);
-IDE_AVAILABLE_IN_ALL
-void       ide_device_manager_remove_provider (IdeDeviceManager  *self,
-                                               IdeDeviceProvider *provider);
-IDE_AVAILABLE_IN_ALL
-IdeDevice *ide_device_manager_get_device      (IdeDeviceManager  *self,
-                                               const gchar       *device_id);
+IdeDevice *ide_device_manager_get_device (IdeDeviceManager *self,
+                                          const gchar      *device_id);
 
 G_END_DECLS
diff --git a/src/libide/devices/ide-device-provider.c b/src/libide/devices/ide-device-provider.c
index 0abe19c0e..7796fb42b 100644
--- a/src/libide/devices/ide-device-provider.c
+++ b/src/libide/devices/ide-device-provider.c
@@ -227,8 +227,6 @@ ide_device_provider_emit_device_removed (IdeDeviceProvider *provider,
  * operation so that the device manager does not need to wait for additional
  * devices to enter the "settled" state.
  *
- * Returns: %TRUE if successful; otherwise %FALSE and @error is set.
- *
  * Since: 3.28
  */
 void
diff --git a/src/plugins/mingw/ide-mingw-device-provider.c b/src/plugins/mingw/ide-mingw-device-provider.c
index e10fa23c9..9cfec207d 100644
--- a/src/plugins/mingw/ide-mingw-device-provider.c
+++ b/src/plugins/mingw/ide-mingw-device-provider.c
@@ -25,212 +25,112 @@
 
 struct _IdeMingwDeviceProvider
 {
-  IdeObject  parent_instance;
-
-  GPtrArray *devices;
-
-  guint      settled : 1;
+  IdeDeviceProvider parent_instance;
 };
 
-static void device_provider_iface_init (IdeDeviceProviderInterface *iface);
-
-G_DEFINE_DYNAMIC_TYPE_EXTENDED (IdeMingwDeviceProvider,
-                                ide_mingw_device_provider,
-                                IDE_TYPE_OBJECT,
-                                0,
-                                G_IMPLEMENT_INTERFACE (IDE_TYPE_DEVICE_PROVIDER,
-                                                       device_provider_iface_init))
-
-enum {
-  PROP_0,
-  PROP_SETTLED,
-  LAST_PROP
-};
-
-static GParamSpec *properties [LAST_PROP];
-
-static GPtrArray *
-ide_mingw_device_provider_get_devices (IdeDeviceProvider *provider)
-{
-  IdeMingwDeviceProvider *self = (IdeMingwDeviceProvider *)provider;
-
-  g_return_val_if_fail (IDE_IS_MINGW_DEVICE_PROVIDER (self), NULL);
-
-  return g_ptr_array_ref (self->devices);
-}
+G_DEFINE_TYPE (IdeMingwDeviceProvider, ide_mingw_device_provider, IDE_TYPE_DEVICE_PROVIDER)
 
 static void
-ide_mingw_device_provider_discover_worker (GTask        *task,
-                                           gpointer      source_object,
-                                           gpointer      task_data,
-                                           GCancellable *cancellable)
+ide_mingw_device_provider_load_worker (GTask        *task,
+                                       gpointer      source_object,
+                                       gpointer      task_data,
+                                       GCancellable *cancellable)
 {
   IdeMingwDeviceProvider *self = source_object;
-  GPtrArray *devices;
+  g_autoptr(GPtrArray) devices = NULL;
+  g_autofree gchar *x32 = NULL;
+  g_autofree gchar *x64 = NULL;
   IdeContext *context;
-  gchar *mingw_path;
+
+  IDE_ENTRY;
 
   g_assert (G_IS_TASK (task));
   g_assert (IDE_IS_MINGW_DEVICE_PROVIDER (self));
-
-  devices = g_ptr_array_new_with_free_func (g_object_unref);
+  g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
 
   context = ide_object_get_context (IDE_OBJECT (self));
+  devices = g_ptr_array_new_with_free_func (g_object_unref);
 
-  g_assert (IDE_IS_CONTEXT (context));
-
-  /*
-   * FIXME:
-   *
-   * I'm almost certain this is not the proper way to check for mingw support.
-   * Someone that knows how this works, please fix this up!
-   */
-
-  mingw_path = g_find_program_in_path ("x86_64-w64-mingw32-gcc");
-  if (mingw_path != NULL)
-    {
-      IdeDevice *device;
-
-      g_free (mingw_path);
-      /* add 64-bit mingw device */
-      device = ide_mingw_device_new (context,
-                                     _("MinGW 64-bit"),
-                                     "local-x86_64-w64-mingw32",
-                                     "x86_64-w64-mingw32");
-      g_ptr_array_add (devices, device);
-    }
-
-  mingw_path = g_find_program_in_path ("i686-w64-mingw32-gcc");
-  if (mingw_path != NULL)
-    {
-      IdeDevice *device;
-
-      g_free (mingw_path);
-      /* add 32-bit mingw device */
-      device = ide_mingw_device_new (context,
-                                     _("MinGW 32-bit"),
-                                     "local-i686-w64-mingw32",
-                                     "i686-w64-mingw32");
-      g_ptr_array_add (devices, device);
-    }
-
-  g_task_return_pointer (task, devices, (GDestroyNotify)g_ptr_array_unref);
-
-  ide_object_release (IDE_OBJECT (self));
+  if (NULL != (x64 = g_find_program_in_path ("x86_64-w64-mingw32-gcc")))
+    g_ptr_array_add (devices,
+                     ide_mingw_device_new (context,
+                                           _("MinGW 64-bit"),
+                                           "local-x86_64-w64-mingw32",
+                                           "x86_64-w64-mingw32"));
+
+  if (NULL != (x32 = g_find_program_in_path ("i686-w64-mingw32-gcc")))
+    g_ptr_array_add (devices,
+                     ide_mingw_device_new (context,
+                                           _("MinGW 32-bit"),
+                                           "local-i686-w64-mingw32",
+                                           "i686-w64-mingw32"));
+
+  g_task_return_pointer (task,
+                         g_steal_pointer (&devices),
+                         (GDestroyNotify)g_ptr_array_unref);
+
+  IDE_EXIT;
 }
 
 static void
-load_cb (GObject      *object,
-         GAsyncResult *result,
-         gpointer      user_data)
+ide_mingw_device_provider_load_async (IdeDeviceProvider   *provider,
+                                      GCancellable        *cancellable,
+                                      GAsyncReadyCallback  callback,
+                                      gpointer             user_data)
 {
-  IdeMingwDeviceProvider *self = (IdeMingwDeviceProvider *)object;
-  GTask *task = (GTask *)result;
-  GPtrArray *devices;
-  gsize i;
-
-  g_assert (IDE_IS_MINGW_DEVICE_PROVIDER (self));
-  g_assert (G_IS_TASK (task));
-
-  devices = g_task_propagate_pointer (task, NULL);
+  IdeMingwDeviceProvider *self = (IdeMingwDeviceProvider *)provider;
+  g_autoptr(GTask) task = NULL;
 
-  if (devices)
-    {
-      g_clear_pointer (&self->devices, g_ptr_array_unref);
-      self->devices = devices;
+  IDE_ENTRY;
 
-      for (i = 0; i < devices->len; i++)
-        {
-          IdeDevice *device;
+  g_assert (IDE_IS_MINGW_DEVICE_PROVIDER (self));
+  g_assert (IDE_IS_DEVICE_PROVIDER (provider));
 
-          device = g_ptr_array_index (devices, i);
-          ide_device_provider_emit_device_added (IDE_DEVICE_PROVIDER (self), device);
-        }
-    }
+  task = g_task_new (self, cancellable, callback, user_data);
+  g_task_set_source_tag (task, ide_mingw_device_provider_load_async);
+  ide_context_hold_for_object (ide_object_get_context (IDE_OBJECT (self)), task);
+  g_task_run_in_thread (task, ide_mingw_device_provider_load_worker);
 
-  self->settled = TRUE;
-  g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_SETTLED]);
+  IDE_EXIT;
 }
 
-static void
-ide_mingw_device_provider_constructed (GObject *object)
-{
-  IdeMingwDeviceProvider *self = (IdeMingwDeviceProvider *)object;
-  g_autoptr(GTask) task = NULL;
-
-  g_assert (IDE_IS_MINGW_DEVICE_PROVIDER (self));
-
-  ide_object_hold (IDE_OBJECT (self));
-  task = g_task_new (self, NULL, load_cb, NULL);
-  g_task_run_in_thread (task, ide_mingw_device_provider_discover_worker);
-}
-static void
-ide_mingw_device_provider_finalize (GObject *object)
+static gboolean
+ide_mingw_device_provider_load_finish (IdeDeviceProvider  *provider,
+                                       GAsyncResult       *result,
+                                       GError            **error)
 {
-  IdeMingwDeviceProvider *self = (IdeMingwDeviceProvider *)object;
-
-  g_clear_pointer (&self->devices, g_ptr_array_unref);
+  g_autoptr(GPtrArray) devices = NULL;
 
-  G_OBJECT_CLASS (ide_mingw_device_provider_parent_class)->finalize (object);
-}
+  IDE_ENTRY;
 
-static void
-ide_mingw_device_provider_get_property (GObject    *object,
-                                        guint       prop_id,
-                                        GValue     *value,
-                                        GParamSpec *pspec)
-{
-  IdeMingwDeviceProvider *self = IDE_MINGW_DEVICE_PROVIDER(object);
+  g_assert (IDE_IS_MINGW_DEVICE_PROVIDER (provider));
+  g_assert (G_IS_TASK (result));
 
-  switch (prop_id)
+  if (NULL != (devices = g_task_propagate_pointer (G_TASK (result), error)))
     {
-    case PROP_SETTLED:
-      g_value_set_boolean (value, self->settled);
-      break;
+      for (guint i = 0; i < devices->len; i++)
+        {
+          IdeDevice *device = g_ptr_array_index (devices, i);
 
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+          g_assert (IDE_IS_DEVICE (device));
+
+          ide_device_provider_emit_device_added (provider, device);
+        }
     }
+
+  IDE_RETURN (TRUE);
 }
 
 static void
 ide_mingw_device_provider_class_init (IdeMingwDeviceProviderClass *klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-  object_class->constructed = ide_mingw_device_provider_constructed;
-  object_class->finalize = ide_mingw_device_provider_finalize;
-  object_class->get_property = ide_mingw_device_provider_get_property;
+  IdeDeviceProviderClass *provider_class = IDE_DEVICE_PROVIDER_CLASS (klass);
 
-  properties [PROP_SETTLED] =
-    g_param_spec_boolean ("settled",
-                          "Settled",
-                          "Settled",
-                          FALSE,
-                          (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-
-  g_object_class_install_properties (object_class, LAST_PROP, properties);
-}
-
-static void
-ide_mingw_device_provider_class_finalize (IdeMingwDeviceProviderClass *klass)
-{
+  provider_class->load_async = ide_mingw_device_provider_load_async;
+  provider_class->load_finish = ide_mingw_device_provider_load_finish;
 }
 
 static void
 ide_mingw_device_provider_init (IdeMingwDeviceProvider *self)
 {
-  self->devices = g_ptr_array_new_with_free_func (g_object_unref);
-}
-
-static void
-device_provider_iface_init (IdeDeviceProviderInterface *iface)
-{
-  iface->get_devices = ide_mingw_device_provider_get_devices;
-}
-
-void
-_ide_mingw_device_provider_register_type (GTypeModule *module)
-{
-  ide_mingw_device_provider_register_type (module);
 }
diff --git a/src/plugins/mingw/ide-mingw-device-provider.h b/src/plugins/mingw/ide-mingw-device-provider.h
index 03aba88db..abe7c8794 100644
--- a/src/plugins/mingw/ide-mingw-device-provider.h
+++ b/src/plugins/mingw/ide-mingw-device-provider.h
@@ -24,6 +24,6 @@ G_BEGIN_DECLS
 
 #define IDE_TYPE_MINGW_DEVICE_PROVIDER (ide_mingw_device_provider_get_type())
 
-G_DECLARE_FINAL_TYPE (IdeMingwDeviceProvider,ide_mingw_device_provider, IDE, MINGW_DEVICE_PROVIDER, 
IdeObject)
+G_DECLARE_FINAL_TYPE (IdeMingwDeviceProvider,ide_mingw_device_provider, IDE, MINGW_DEVICE_PROVIDER, 
IdeDeviceProvider)
 
 G_END_DECLS
diff --git a/src/plugins/mingw/ide-mingw-device.c b/src/plugins/mingw/ide-mingw-device.c
index 89f0b4325..3f7de2ea1 100644
--- a/src/plugins/mingw/ide-mingw-device.c
+++ b/src/plugins/mingw/ide-mingw-device.c
@@ -26,7 +26,7 @@ struct _IdeMingwDevice
   gchar     *system_type;
 };
 
-G_DEFINE_DYNAMIC_TYPE (IdeMingwDevice, ide_mingw_device, IDE_TYPE_DEVICE)
+G_DEFINE_TYPE (IdeMingwDevice, ide_mingw_device, IDE_TYPE_DEVICE)
 
 IdeDevice *
 ide_mingw_device_new (IdeContext  *context,
@@ -78,11 +78,7 @@ ide_mingw_device_class_init (IdeMingwDeviceClass *klass)
   device_class->get_system_type = ide_mingw_device_get_system_type;
 }
 
-static void ide_mingw_device_class_finalize (IdeMingwDeviceClass *klass) { }
-static void ide_mingw_device_init (IdeMingwDevice *self) { }
-
-void
-_ide_mingw_device_register_type (GTypeModule *module)
+static void
+ide_mingw_device_init (IdeMingwDevice *self)
 {
-  ide_mingw_device_register_type (module);
 }
diff --git a/src/plugins/mingw/mingw-plugin.c b/src/plugins/mingw/mingw-plugin.c
index 73015b411..1fe787d4f 100644
--- a/src/plugins/mingw/mingw-plugin.c
+++ b/src/plugins/mingw/mingw-plugin.c
@@ -19,16 +19,9 @@
 #include <libpeas/peas.h>
 
 #include "ide-mingw-device-provider.h"
-#include "ide-mingw-device.h"
-
-void _ide_mingw_device_provider_register_type (GTypeModule *module);
-void _ide_mingw_device_register_type (GTypeModule *module);
 
 void
 ide_mingw_register_types (PeasObjectModule *module)
 {
-  _ide_mingw_device_provider_register_type (G_TYPE_MODULE (module));
-  _ide_mingw_device_register_type (G_TYPE_MODULE (module));
-
   peas_object_module_register_extension_type (module, IDE_TYPE_DEVICE_PROVIDER, 
IDE_TYPE_MINGW_DEVICE_PROVIDER);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]