--- /dev/null
+/* === S Y N F I G ========================================================= */
+/*! \file synfig/module.cpp
+** \brief writeme
+**
+** $Id$
+**
+** \legal
+** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**
+** This package 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 package 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.
+** \endlegal
+*/
+/* ========================================================================= */
+
+/* === H E A D E R S ======================================================= */
+
+#define SYNFIG_NO_ANGLE
+
+#ifdef USING_PCH
+# include "pch.h"
+#else
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "module.h"
+#include "general.h"
+#include <ETL/stringf>
+
+#ifndef USE_CF_BUNDLES
+#include <ltdl.h>
+#endif
+
+#endif
+
+/* === M A C R O S ========================================================= */
+
+/* === G L O B A L S ======================================================= */
+
+using namespace std;
+using namespace etl;
+using namespace synfig;
+
+Module::Book *synfig::Module::book_;
+
+/* === P R O C E D U R E S ================================================= */
+
+bool
+Module::subsys_init(const String &prefix)
+{
+#ifndef USE_CF_BUNDLES
+ #ifndef SYNFIG_LTDL_NO_STATIC
+ //LTDL_SET_PRELOADED_SYMBOLS();
+ #endif
+
+ if(lt_dlinit())
+ {
+ error(_("Errors on lt_dlinit()"));
+ error(lt_dlerror());
+ return false;
+ }
+
+ lt_dladdsearchdir(".");
+ lt_dladdsearchdir("~/.synfig/modules");
+ lt_dladdsearchdir((prefix+"/lib/synfig/modules").c_str());
+#ifdef LIBDIR
+ lt_dladdsearchdir(LIBDIR"/synfig/modules");
+#endif
+#ifdef __APPLE__
+ lt_dladdsearchdir("/Library/Frameworks/synfig.framework/Resources/modules");
+#endif
+ lt_dladdsearchdir("/usr/local/lib/synfig/modules");
+ lt_dladdsearchdir(".");
+#endif
+ book_=new Book;
+ return true;
+}
+
+bool
+Module::subsys_stop()
+{
+ delete book_;
+
+#ifndef USE_CF_BUNDLES
+ lt_dlexit();
+#endif
+ return true;
+}
+
+bool
+register_default_modules()
+{
+ return true;
+}
+
+Module::Book&
+Module::book()
+{
+ return *book_;
+}
+
+void
+synfig::Module::Register(Module::Handle mod)
+{
+ book()[mod->Name()]=mod;
+}
+
+bool
+synfig::Module::Register(const String &module_name, ProgressCallback *callback)
+{
+#ifndef USE_CF_BUNDLES
+ lt_dlhandle module;
+
+ if(callback)callback->task(strprintf(_("Attempting to register \"%s\""),module_name.c_str()));
+
+ module=lt_dlopenext((string("lib")+module_name).c_str());
+ if(!module)module=lt_dlopenext(module_name.c_str());
+
+ if(!module)
+ {
+ if(callback)callback->warning(strprintf(_("Unable to find module \"%s\" (%s)"),module_name.c_str(),lt_dlerror()));
+ return false;
+ }
+
+ if(callback)callback->task(strprintf(_("Found module \"%s\""),module_name.c_str()));
+
+ Module::constructor_type constructor=NULL;
+ Handle mod;
+
+ if(!constructor)
+ {
+// if(callback)callback->task(string("looking for -> ")+module_name+"_LTX_new_instance()");
+ constructor=(Module::constructor_type )lt_dlsym(module,(module_name+"_LTX_new_instance").c_str());
+ }
+
+ if(!constructor)
+ {
+// if(callback)callback->task(string("looking for -> lib")+module_name+"_LTX_new_instance()");
+ constructor=(Module::constructor_type )lt_dlsym(module,(string("lib")+module_name+"_LTX_new_instance").c_str());
+ }
+ if(!constructor)
+ {
+// if(callback)callback->task(string("looking for -> lib")+module_name+"_LTX_new_instance()");
+ constructor=(Module::constructor_type )lt_dlsym(module,(string("_lib")+module_name+"_LTX_new_instance").c_str());
+ }
+ if(!constructor)
+ {
+// if(callback)callback->task(string("looking for -> lib")+module_name+"_LTX_new_instance()");
+ constructor=(Module::constructor_type )lt_dlsym(module,(string("_")+module_name+"_LTX_new_instance").c_str());
+ }
+
+ if(constructor)
+ {
+// if(callback)callback->task(strprintf("Executing callback for \"%s\"",module_name.c_str()));
+ mod=handle<Module>((*constructor)(callback));
+ }
+ else
+ {
+ if(callback)callback->error(strprintf(_("Unable to find entrypoint in module \"%s\" (%s)"),module_name.c_str(),lt_dlerror()));
+ return false;
+ }
+
+// if(callback)callback->task(strprintf("Done executing callback for \"%s\"",module_name.c_str()));
+
+ if(mod)
+ {
+// if(callback)callback->task(strprintf("Registering \"%s\"",module_name.c_str()));
+ Register(mod);
+ }
+ else
+ {
+ if(callback)callback->error(_("Entrypoint did not return a module."));
+ return false;
+ }
+
+ if(callback)callback->task(strprintf(_("Success for \"%s\""),module_name.c_str()));
+
+#endif
+ return false;
+}