diff options
| author | randomdan <randomdan@localhost> | 2011-03-15 01:03:52 +0000 | 
|---|---|---|
| committer | randomdan <randomdan@localhost> | 2011-03-15 01:03:52 +0000 | 
| commit | 87a90d56403667f873f9d9c2f278fb6e35cffe51 (patch) | |
| tree | 9cfbd5d0b87d6a167fcbffb64896b990404e12d0 | |
| parent | Fix linking problem where binaries linked against the installed libs, not the... (diff) | |
| download | project2-87a90d56403667f873f9d9c2f278fb6e35cffe51.tar.bz2 project2-87a90d56403667f873f9d9c2f278fb6e35cffe51.tar.xz project2-87a90d56403667f873f9d9c2f278fb6e35cffe51.zip  | |
Add element handler for loading extra libraries at runtime
| -rw-r--r-- | project2/Jamfile.jam | 5 | ||||
| -rw-r--r-- | project2/xmlObjectLoader.cpp | 25 | 
2 files changed, 30 insertions, 0 deletions
diff --git a/project2/Jamfile.jam b/project2/Jamfile.jam index 575d4f9..24fa691 100644 --- a/project2/Jamfile.jam +++ b/project2/Jamfile.jam @@ -13,6 +13,7 @@ alias libxslt : : : :  	<cflags>"`pkg-config --cflags libexslt`"  	<linkflags>"`pkg-config --libs libexslt`" ; +lib dl : : <name>dl ;  lib fcgi : : <name>fcgi ;  lib fcgi++ : : <name>fcgi++ ;  lib boost_regex : : <name>boost_regex ; @@ -63,10 +64,14 @@ lib p2common :  	:  	<include>../libmisc  	<library>libxmlpp +	<library>dl  	<library>boost_system  	<library>boost_filesystem  	<library>boost_date_time  	<library>boost_program_options +	: : +	<include>. +	<include>../libmisc  	;  lib p2xml : diff --git a/project2/xmlObjectLoader.cpp b/project2/xmlObjectLoader.cpp index e16c9e1..849cfa1 100644 --- a/project2/xmlObjectLoader.cpp +++ b/project2/xmlObjectLoader.cpp @@ -4,6 +4,7 @@  #include "logger.h"  #include <boost/shared_ptr.hpp>  #include <boost/foreach.hpp> +#include <dlfcn.h>  #include <libxml++/nodes/textnode.h>  unsigned int LoaderBase::depth = 0; @@ -17,10 +18,34 @@ objLoaders()  	return _objLoaders;  } +SimpleMessageException(LoadLibraryFailed); + +class Library : public SourceObject { +	public: +		Library(const xmlpp::Element * p) : +			SourceObject(p), +			handle(dlopen(p->get_attribute_value("path").c_str(), RTLD_NOW)) +		{ +			if (!handle) { +				throw LoadLibraryFailed(dlerror()); +			} +		} +		~Library() { +			dlclose(handle); +		} +		void loadComplete(const CommonObjects*) { +		} +	private: +		void * handle; +}; +Storage<Library>::Objects libraries; +DECLARE_LOADER("library", Library); +  LoaderBase::LoaderBase(const Glib::ustring & n, bool r) :  	recursive(r),  	ns(n)  { +	supportedStorers.insert(Storer::into(&libraries));  }  LoaderBase::~LoaderBase()  | 
