[gnome-builder/wip/commands] commands: query providers to create a command instance



commit 1a866cb8aabbeae47b5b80ffaf5e4397564eef30
Author: Christian Hergert <christian hergert me>
Date:   Tue Oct 7 21:56:59 2014 -0700

    commands: query providers to create a command instance
    
    If no command was found, let a provider attempt to create one.

 src/commands/gb-command-manager.c |   21 +++++++++++++++------
 1 files changed, 15 insertions(+), 6 deletions(-)
---
diff --git a/src/commands/gb-command-manager.c b/src/commands/gb-command-manager.c
index 2722473..00f4931 100644
--- a/src/commands/gb-command-manager.c
+++ b/src/commands/gb-command-manager.c
@@ -165,7 +165,7 @@ gb_command_manager_lookup (GbCommandManager  *manager,
   const gchar *colon;
   GbCommand *command;
   GVariant *variant = NULL;
-  gchar *name;
+  gchar *name = NULL;
 
   g_return_val_if_fail (GB_IS_COMMAND_MANAGER (manager), NULL);
   g_return_val_if_fail (command_text, NULL);
@@ -196,23 +196,32 @@ gb_command_manager_lookup (GbCommandManager  *manager,
    * Now let's look up a command by name.
    */
   name = gb_command_manager_parse (manager, command_text, &variant);
-  if (!name)
-    return NULL;
+  if (name)
+    command = g_hash_table_lookup (priv->commands, name);
 
-  command = g_hash_table_lookup (priv->commands, name);
+  g_free (name);
 
   /*
    * Now let's see if a command provider will create one for us.
    */
   if (!command)
     {
-      /* TODO */
+      GHashTableIter iter;
+      GbCommandProvider *provider;
+
+      g_hash_table_iter_init (&iter, manager->priv->providers);
+      while (g_hash_table_iter_next (&iter, NULL, (gpointer *)&provider))
+        {
+          command = gb_command_provider_create (provider, command_text);
+          if (command)
+            return command;
+        }
     }
 
   if (command && parameters)
     *parameters = variant ? g_variant_ref (variant) : NULL;
 
-  g_clear_pointer (&name, g_free);
+  /* XXX: leaking */
   g_clear_pointer (&variant, g_variant_unref);
 
   return command ? g_object_ref (command) : NULL;


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