From 8a08b9dce9cfc161494ddb07a1c979c7796780ff Mon Sep 17 00:00:00 2001 From: Sebastian Reichel Date: Fri, 15 Jun 2012 22:56:00 +0200 Subject: restructure code it is now loading its components from plugins --- plugin-loader.vala | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 plugin-loader.vala (limited to 'plugin-loader.vala') 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 + * + * 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 : 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); + } +} -- cgit v1.2.3