X-Git-Url: https://git.draconx.ca/gitweb/upkg.git/blobdiff_plain/0ea001fde2555a1335161632b2d78c9397d8f53d..3896f18892f87f3c354cb47965c4064d3ff26f5d:/src/module.c diff --git a/src/module.c b/src/module.c index 24ef250..ffc06e2 100644 --- a/src/module.c +++ b/src/module.c @@ -1,3 +1,22 @@ +/* + * upkg: tool for manipulating Unreal Tournament packages. + * Copyright (C) 2009 Nick Bowler + * + * 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 #include #include @@ -5,7 +24,8 @@ #include #include -#include "module.h" +#include +#include #include "avl.h" static unsigned initialized; @@ -22,91 +42,15 @@ static char *str_cpy_lower(char *dst, const char *src) return dst; } -G_DEFINE_TYPE(UPkgModule, upkg_module, G_TYPE_TYPE_MODULE); - -static void dl_print_errors(const char *prefix) -{ - const char *err; - while (err = lt_dlerror()) { - if (prefix) fprintf(stderr, "%s: ", prefix); - puts(err); - } -} - -static gboolean module_load(GTypeModule *m) -{ - UPkgModule *mod = UPKG_MODULE(m); - int (*init_func)(GTypeModule *); - - mod->dl = lt_dlopenext(G_TYPE_MODULE(m)->name); - if (!mod->dl) { - dl_print_errors(__func__); - return FALSE; - } - - init_func = lt_dlsym(mod->dl, "init"); - if (!init_func || init_func(m) != 0) { - dl_print_errors(__func__); - lt_dlclose(mod->dl); - return FALSE; - } - - return TRUE; -} - -static void module_unload(GTypeModule *m) -{ - UPkgModule *mod = UPKG_MODULE(m); - - if (lt_dlclose(mod->dl) != 0) { - dl_print_errors(__func__); - } -} - -static void upkg_module_init(UPkgModule *mod) -{ -} - -static void upkg_module_class_init(UPkgModuleClass *class) -{ - GTypeModuleClass *modclass = G_TYPE_MODULE_CLASS(class); - - modclass->load = module_load; - modclass->unload = module_unload; -} - -UPkgModule *upkg_module_new(const char *name) -{ - char *name2; - - if (!name) { - return NULL; - } - - name2 = malloc(strlen(name)+1); - if (!name2) { - return NULL; - } - - UPkgModule *mod = g_object_new(UPKG_MODULE_TYPE, NULL); - if (!mod) { - free(name2); - return NULL; - } - - G_TYPE_MODULE(mod)->name = str_cpy_lower(name2, name); - return mod; -} - static int modcmp(const void *a, const void *b, void *_data) { - GTypeModule *ma = G_TYPE_MODULE(a); - GTypeModule *mb = G_TYPE_MODULE(b); + const GTypeModule *ma = a; + const GTypeModule *mb = b; return strcmp(ma->name, mb->name); } -int module_init(void) +int uobject_module_init(void) { if (!initialized) { package_tree = avl_create(modcmp, NULL, NULL); @@ -115,12 +59,6 @@ int module_init(void) return -1; } - if (lt_dlinit() != 0) { - avl_destroy(package_tree, NULL); - dl_print_errors(__func__); - return -1; - } - g_type_init(); } @@ -128,18 +66,17 @@ int module_init(void) return 0; } -int module_exit(void) +int uobject_module_exit(void) { if (--initialized) return 0; - if (lt_dlexit() != 0) { - dl_print_errors(__func__); - return -1; - } + avl_destroy(package_tree, NULL); + + return 0; } -GType module_get_class(const char *package, const char *class) +GType uobject_module_get_class(const char *package, const char *class) { char buf[strlen(package) + strlen(class) + 1]; GTypeModule search = { .name = str_cpy_lower(buf, package) }; @@ -148,7 +85,7 @@ GType module_get_class(const char *package, const char *class) if (!mod) { void **p; - mod = G_TYPE_MODULE(upkg_module_new(package)); + mod = u_pkg_new(package); if (!mod) { return 0; }