[gnome-builder/wip/libide] libide: add IdeSearchEngine getter to IdeContext



commit e289a4a18eb1e76c398b7773405ebfdf15de494c
Author: Christian Hergert <christian hergert me>
Date:   Mon Feb 16 12:14:52 2015 -0800

    libide: add IdeSearchEngine getter to IdeContext

 libide/ide-context.c         |   95 ++++++++++++++++++++++++++++++++++++++++++
 libide/ide-context.h         |    2 +
 libide/ide-search-provider.h |    3 +
 libide/ide.c                 |    4 +-
 4 files changed, 103 insertions(+), 1 deletions(-)
---
diff --git a/libide/ide-context.c b/libide/ide-context.c
index 29929cc..11b208a 100644
--- a/libide/ide-context.c
+++ b/libide/ide-context.c
@@ -29,6 +29,8 @@
 #include "ide-internal.h"
 #include "ide-project.h"
 #include "ide-script-manager.h"
+#include "ide-search-engine.h"
+#include "ide-search-provider.h"
 #include "ide-service.h"
 #include "ide-unsaved-files.h"
 #include "ide-vcs.h"
@@ -41,6 +43,7 @@ struct _IdeContext
   IdeBuildSystem     *build_system;
   IdeDeviceManager   *device_manager;
   IdeScriptManager   *script_manager;
+  IdeSearchEngine    *search_engine;
   IdeProject         *project;
   GFile              *project_file;
   gchar              *root_build_dir;
@@ -302,6 +305,36 @@ ide_context_set_project_file (IdeContext *self,
     }
 }
 
+/**
+ * ide_context_get_script_manager:
+ *
+ * Retrieves the script manager for the context.
+ *
+ * Returns: (transfer none): An #IdeScriptManager.
+ */
+IdeScriptManager *
+ide_context_get_script_manager (IdeContext *self)
+{
+  g_return_val_if_fail (IDE_IS_CONTEXT (self), NULL);
+
+  return self->script_manager;
+}
+
+/**
+ * ide_context_get_search_engine:
+ *
+ * Retrieves the search engine for the context.
+ *
+ * Returns: (transfer none): An #IdeSearchEngine.
+ */
+IdeSearchEngine *
+ide_context_get_search_engine (IdeContext *self)
+{
+  g_return_val_if_fail (IDE_IS_CONTEXT (self), NULL);
+
+  return self->search_engine;
+}
+
 static gpointer
 ide_context_create_service (IdeContext *self,
                             GType       service_type)
@@ -583,6 +616,10 @@ ide_context_init (IdeContext *self)
                                       "context", self,
                                       NULL);
 
+  self->search_engine = g_object_new (IDE_TYPE_SEARCH_ENGINE,
+                                      "context", self,
+                                      NULL);
+
   scriptsdir = g_build_filename (g_get_user_config_dir (),
                                  ide_get_program_name (),
                                  "scripts",
@@ -902,6 +939,63 @@ ide_context_init_services (gpointer             source_object,
 }
 
 static void
+ide_context_init_search_engine (gpointer             source_object,
+                                GCancellable        *cancellable,
+                                GAsyncReadyCallback  callback,
+                                gpointer             user_data)
+{
+  g_autoptr(GTask) task = NULL;
+  IdeContext *self = source_object;
+  GIOExtensionPoint *point;
+  const GList *iter;
+  const GList *list;
+
+  g_return_if_fail (IDE_IS_CONTEXT (self));
+  g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
+
+  task = g_task_new (self, cancellable, callback, user_data);
+
+  point = g_io_extension_point_lookup (IDE_SEARCH_PROVIDER_EXTENSION_POINT);
+
+  if (!point)
+    {
+      g_task_return_new_error (task,
+                               G_IO_ERROR,
+                               G_IO_ERROR_NOT_SUPPORTED,
+                               _("Missing extension point for %s"),
+                               IDE_SEARCH_PROVIDER_EXTENSION_POINT);
+      return;
+    }
+
+  list = g_io_extension_point_get_extensions (point);
+
+  for (iter = list; iter; iter = iter->next)
+    {
+      GIOExtension *extension = iter->data;
+      IdeSearchProvider *provider;
+      GType gtype;
+
+      gtype = g_io_extension_get_type (extension);
+
+      if (!g_type_is_a (gtype, IDE_TYPE_SEARCH_PROVIDER))
+        {
+          g_task_return_new_error (task,
+                                   G_IO_ERROR,
+                                   G_IO_ERROR_INVALID_DATA,
+                                   _("%s is not an IdeSearchProvider."),
+                                   g_type_name (gtype));
+          return;
+        }
+
+      provider = g_object_new (gtype, "context", self, NULL);
+      ide_search_engine_add_provider (self->search_engine, provider);
+      g_object_unref (provider);
+    }
+
+  g_task_return_boolean (task, TRUE);
+}
+
+static void
 ide_context_init_async (GAsyncInitable      *initable,
                         int                  io_priority,
                         GCancellable        *cancellable,
@@ -924,6 +1018,7 @@ ide_context_init_async (GAsyncInitable      *initable,
                         ide_context_init_project_name,
                         ide_context_init_back_forward_list,
                         ide_context_init_unsaved_files,
+                        ide_context_init_search_engine,
                         ide_context_init_scripts,
                         NULL);
 }
diff --git a/libide/ide-context.h b/libide/ide-context.h
index 0d2d05a..50e5242 100644
--- a/libide/ide-context.h
+++ b/libide/ide-context.h
@@ -34,6 +34,8 @@ GFile              *ide_context_get_project_file      (IdeContext           *sel
 IdeBuildSystem     *ide_context_get_build_system      (IdeContext           *self);
 IdeDeviceManager   *ide_context_get_device_manager    (IdeContext           *self);
 IdeProject         *ide_context_get_project           (IdeContext           *self);
+IdeScriptManager   *ide_context_get_script_manager    (IdeContext           *self);
+IdeSearchEngine    *ide_context_get_search_engine     (IdeContext           *self);
 IdeUnsavedFiles    *ide_context_get_unsaved_files     (IdeContext           *self);
 IdeVcs             *ide_context_get_vcs               (IdeContext           *self);
 const gchar        *ide_context_get_root_build_dir    (IdeContext           *self);
diff --git a/libide/ide-search-provider.h b/libide/ide-search-provider.h
index c8c3194..4146138 100644
--- a/libide/ide-search-provider.h
+++ b/libide/ide-search-provider.h
@@ -25,6 +25,9 @@ G_BEGIN_DECLS
 
 #define IDE_TYPE_SEARCH_PROVIDER (ide_search_provider_get_type())
 
+#define IDE_SEARCH_PROVIDER_EXTENSION_POINT \
+  "org.gnome.libide.extensions.search-provider"
+
 G_DECLARE_DERIVABLE_TYPE (IdeSearchProvider, ide_search_provider,
                           IDE, SEARCH_PROVIDER, IdeObject)
 
diff --git a/libide/ide.c b/libide/ide.c
index 2a2d37a..ea360d5 100644
--- a/libide/ide.c
+++ b/libide/ide.c
@@ -31,8 +31,9 @@
 #include "ide-file-settings.h"
 #include "ide-gca-service.h"
 #include "ide-git-vcs.h"
-#include "ide-gsettings-file-settings.h"
 #include "ide-gjs-script.h"
+#include "ide-gsettings-file-settings.h"
+#include "ide-search-provider.h"
 
 static gboolean     gProgramNameRead;
 static const gchar *gProgramName = "libide";
@@ -68,6 +69,7 @@ ide_init_ctor (void)
   g_io_extension_point_register (IDE_FILE_SETTINGS_EXTENSION_POINT);
   g_io_extension_point_register (IDE_LANGUAGE_EXTENSION_POINT);
   g_io_extension_point_register (IDE_SCRIPT_EXTENSION_POINT);
+  g_io_extension_point_register (IDE_SEARCH_PROVIDER_EXTENSION_POINT);
   g_io_extension_point_register (IDE_SERVICE_EXTENSION_POINT);
   g_io_extension_point_register (IDE_VCS_EXTENSION_POINT);
 


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