Release 0.61.09
[synfig.git] / synfig-core / tags / 0.61.09 / src / synfig / module.cpp
diff --git a/synfig-core/tags/0.61.09/src/synfig/module.cpp b/synfig-core/tags/0.61.09/src/synfig/module.cpp
new file mode 100644 (file)
index 0000000..3e026a4
--- /dev/null
@@ -0,0 +1,188 @@
+/* === 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;
+}