summaryrefslogtreecommitdiff
path: root/plugin-loaders/c
diff options
context:
space:
mode:
Diffstat (limited to 'plugin-loaders/c')
-rwxr-xr-xplugin-loaders/c/Makefile.am24
-rwxr-xr-xplugin-loaders/c/gedit-plugin-loader-c.c182
-rwxr-xr-xplugin-loaders/c/gedit-plugin-loader-c.h60
3 files changed, 266 insertions, 0 deletions
diff --git a/plugin-loaders/c/Makefile.am b/plugin-loaders/c/Makefile.am
new file mode 100755
index 00000000..7760aefe
--- /dev/null
+++ b/plugin-loaders/c/Makefile.am
@@ -0,0 +1,24 @@
+# C plugin loader
+
+loaderdir = $(libdir)/gedit-2/plugin-loaders
+
+INCLUDES = \
+ -I$(top_srcdir) \
+ $(GEDIT_CFLAGS) \
+ $(WARN_CFLAGS) \
+ $(DISABLE_DEPRECATED_CFLAGS) \
+ -DGEDIT_LOCALEDIR=\""$(prefix)/$(DATADIRNAME)/locale"\"
+
+loader_LTLIBRARIES = libcloader.la
+
+NOINST_H_FILES = \
+ gedit-plugin-loader-c.h
+
+libcloader_la_SOURCES = \
+ gedit-plugin-loader-c.c \
+ $(NOINST_H_FILES)
+
+libcloader_la_LDFLAGS = $(LOADER_LIBTOOL_FLAGS)
+libcloader_la_LIBADD = $(GEDIT_LIBS)
+
+-include $(top_srcdir)/git.mk
diff --git a/plugin-loaders/c/gedit-plugin-loader-c.c b/plugin-loaders/c/gedit-plugin-loader-c.c
new file mode 100755
index 00000000..37b3d059
--- /dev/null
+++ b/plugin-loaders/c/gedit-plugin-loader-c.c
@@ -0,0 +1,182 @@
+/*
+ * gedit-plugin-loader-c.c
+ * This file is part of gedit
+ *
+ * Copyright (C) 2008 - Jesse van den Kieboom
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "gedit-plugin-loader-c.h"
+#include <gedit/gedit-object-module.h>
+
+#define GEDIT_PLUGIN_LOADER_C_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), GEDIT_TYPE_PLUGIN_LOADER_C, GeditPluginLoaderCPrivate))
+
+struct _GeditPluginLoaderCPrivate
+{
+ GHashTable *loaded_plugins;
+};
+
+static void gedit_plugin_loader_iface_init (gpointer g_iface, gpointer iface_data);
+
+GEDIT_PLUGIN_LOADER_REGISTER_TYPE (GeditPluginLoaderC, gedit_plugin_loader_c, G_TYPE_OBJECT, gedit_plugin_loader_iface_init);
+
+
+static const gchar *
+gedit_plugin_loader_iface_get_id (void)
+{
+ return "C";
+}
+
+static GeditPlugin *
+gedit_plugin_loader_iface_load (GeditPluginLoader *loader,
+ GeditPluginInfo *info,
+ const gchar *path)
+{
+ GeditPluginLoaderC *cloader = GEDIT_PLUGIN_LOADER_C (loader);
+ GeditObjectModule *module;
+ const gchar *module_name;
+ GeditPlugin *result;
+
+ module = (GeditObjectModule *)g_hash_table_lookup (cloader->priv->loaded_plugins, info);
+ module_name = gedit_plugin_info_get_module_name (info);
+
+ if (module == NULL)
+ {
+ /* For now we force all modules to be resident */
+ module = gedit_object_module_new (module_name,
+ path,
+ "register_gedit_plugin",
+ TRUE);
+
+ /* Infos are available for all the lifetime of the loader.
+ * If this changes, we should use weak refs or something */
+
+ g_hash_table_insert (cloader->priv->loaded_plugins, info, module);
+ }
+
+ if (!g_type_module_use (G_TYPE_MODULE (module)))
+ {
+ g_warning ("Could not load plugin module: %s", gedit_plugin_info_get_name (info));
+
+ return NULL;
+ }
+
+ /* TODO: for now we force data-dir-name = module-name... if needed we can
+ * add a datadir field to the plugin descriptor file.
+ */
+ result = (GeditPlugin *)gedit_object_module_new_object (module,
+ "install-dir", path,
+ "data-dir-name", module_name,
+ NULL);
+
+ if (!result)
+ {
+ g_warning ("Could not create plugin object: %s", gedit_plugin_info_get_name (info));
+ g_type_module_unuse (G_TYPE_MODULE (module));
+
+ return NULL;
+ }
+
+ g_type_module_unuse (G_TYPE_MODULE (module));
+
+ return result;
+}
+
+static void
+gedit_plugin_loader_iface_unload (GeditPluginLoader *loader,
+ GeditPluginInfo *info)
+{
+ //GeditPluginLoaderC *cloader = GEDIT_PLUGIN_LOADER_C (loader);
+
+ /* this is a no-op, since the type module will be properly unused as
+ the last reference to the plugin dies. When the plugin is activated
+ again, the library will be reloaded */
+}
+
+static void
+gedit_plugin_loader_iface_init (gpointer g_iface,
+ gpointer iface_data)
+{
+ GeditPluginLoaderInterface *iface = (GeditPluginLoaderInterface *)g_iface;
+
+ iface->get_id = gedit_plugin_loader_iface_get_id;
+ iface->load = gedit_plugin_loader_iface_load;
+ iface->unload = gedit_plugin_loader_iface_unload;
+}
+
+static void
+gedit_plugin_loader_c_finalize (GObject *object)
+{
+ GeditPluginLoaderC *cloader = GEDIT_PLUGIN_LOADER_C (object);
+ GList *infos;
+ GList *item;
+
+ /* FIXME: this sanity check it's not efficient. Let's remove it
+ * once we are confident with the code */
+
+ infos = g_hash_table_get_keys (cloader->priv->loaded_plugins);
+
+ for (item = infos; item; item = item->next)
+ {
+ GeditPluginInfo *info = (GeditPluginInfo *)item->data;
+
+ if (gedit_plugin_info_is_active (info))
+ {
+ g_warning ("There are still C plugins loaded during destruction");
+ break;
+ }
+ }
+
+ g_list_free (infos);
+
+ g_hash_table_destroy (cloader->priv->loaded_plugins);
+
+ G_OBJECT_CLASS (gedit_plugin_loader_c_parent_class)->finalize (object);
+}
+
+static void
+gedit_plugin_loader_c_class_init (GeditPluginLoaderCClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = gedit_plugin_loader_c_finalize;
+
+ g_type_class_add_private (object_class, sizeof (GeditPluginLoaderCPrivate));
+}
+
+static void
+gedit_plugin_loader_c_class_finalize (GeditPluginLoaderCClass *klass)
+{
+}
+
+static void
+gedit_plugin_loader_c_init (GeditPluginLoaderC *self)
+{
+ self->priv = GEDIT_PLUGIN_LOADER_C_GET_PRIVATE (self);
+
+ /* loaded_plugins maps GeditPluginInfo to a GeditObjectModule */
+ self->priv->loaded_plugins = g_hash_table_new (g_direct_hash,
+ g_direct_equal);
+}
+
+GeditPluginLoaderC *
+gedit_plugin_loader_c_new ()
+{
+ GObject *loader = g_object_new (GEDIT_TYPE_PLUGIN_LOADER_C, NULL);
+
+ return GEDIT_PLUGIN_LOADER_C (loader);
+}
diff --git a/plugin-loaders/c/gedit-plugin-loader-c.h b/plugin-loaders/c/gedit-plugin-loader-c.h
new file mode 100755
index 00000000..70420546
--- /dev/null
+++ b/plugin-loaders/c/gedit-plugin-loader-c.h
@@ -0,0 +1,60 @@
+/*
+ * gedit-plugin-loader-c.h
+ * This file is part of gedit
+ *
+ * Copyright (C) 2008 - Jesse van den Kieboom
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GEDIT_PLUGIN_LOADER_C_H__
+#define __GEDIT_PLUGIN_LOADER_C_H__
+
+#include <gedit/gedit-plugin-loader.h>
+
+G_BEGIN_DECLS
+
+#define GEDIT_TYPE_PLUGIN_LOADER_C (gedit_plugin_loader_c_get_type ())
+#define GEDIT_PLUGIN_LOADER_C(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEDIT_TYPE_PLUGIN_LOADER_C, GeditPluginLoaderC))
+#define GEDIT_PLUGIN_LOADER_C_CONST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEDIT_TYPE_PLUGIN_LOADER_C, GeditPluginLoaderC const))
+#define GEDIT_PLUGIN_LOADER_C_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GEDIT_TYPE_PLUGIN_LOADER_C, GeditPluginLoaderCClass))
+#define GEDIT_IS_PLUGIN_LOADER_C(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEDIT_TYPE_PLUGIN_LOADER_C))
+#define GEDIT_IS_PLUGIN_LOADER_C_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GEDIT_TYPE_PLUGIN_LOADER_C))
+#define GEDIT_PLUGIN_LOADER_C_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GEDIT_TYPE_PLUGIN_LOADER_C, GeditPluginLoaderCClass))
+
+typedef struct _GeditPluginLoaderC GeditPluginLoaderC;
+typedef struct _GeditPluginLoaderCClass GeditPluginLoaderCClass;
+typedef struct _GeditPluginLoaderCPrivate GeditPluginLoaderCPrivate;
+
+struct _GeditPluginLoaderC {
+ GObject parent;
+
+ GeditPluginLoaderCPrivate *priv;
+};
+
+struct _GeditPluginLoaderCClass {
+ GObjectClass parent_class;
+};
+
+GType gedit_plugin_loader_c_get_type (void) G_GNUC_CONST;
+GeditPluginLoaderC *gedit_plugin_loader_c_new(void);
+
+/* All the loaders must implement this function */
+G_MODULE_EXPORT GType register_gedit_plugin_loader (GTypeModule * module);
+
+G_END_DECLS
+
+#endif /* __GEDIT_PLUGIN_LOADER_C_H__ */