summaryrefslogtreecommitdiffstats
path: root/plugin-loader.vala
diff options
context:
space:
mode:
Diffstat (limited to 'plugin-loader.vala')
-rw-r--r--plugin-loader.vala49
1 files changed, 49 insertions, 0 deletions
diff --git a/plugin-loader.vala b/plugin-loader.vala
new file mode 100644
index 0000000..67070b4
--- /dev/null
+++ b/plugin-loader.vala
@@ -0,0 +1,49 @@
+/* Copyright 2012, Sebastian Reichel <sre@ring0.de>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+public class PluginLoader<T> : Object {
+
+ public string path { get; private set; }
+
+ private Type type;
+ private Module module;
+
+ private delegate Type RegisterPluginFunction(Module module);
+
+ public PluginLoader(string path) {
+ assert(Module.supported());
+ this.path = path;
+ }
+
+ public bool load() {
+ module = Module.open(path, ModuleFlags.BIND_LAZY);
+ if(module == null) {
+ return false;
+ }
+
+ module.make_resident();
+
+ void* function;
+ module.symbol("register_plugin", out function);
+
+ type = ((RegisterPluginFunction) function)(module);
+ stdout.printf("Loaded Plugin: %s\n", type.name());
+ return true;
+ }
+
+ public T new_object() {
+ return Object.new (type);
+ }
+}