From fb59fa59688f52b6616acae6baa55883f620d30e Mon Sep 17 00:00:00 2001 From: methodus Date: Sat, 24 Nov 2012 17:51:02 +0100 Subject: Improved plugin loader. This makes linking of the upnp plugin from sub plugins obsolete. --- media/mediaManager.cpp | 12 ++---------- media/pluginManager.cpp | 25 +++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 12 deletions(-) (limited to 'media') diff --git a/media/mediaManager.cpp b/media/mediaManager.cpp index 7064daa..670a158 100644 --- a/media/mediaManager.cpp +++ b/media/mediaManager.cpp @@ -21,8 +21,6 @@ namespace upnp { -#define DEFAULTPLUGINDIR PLUGINDIR - static const char* DIDLFragment = "LoadPlugins(pluginDirectory)){ - esyslog("UPnP\tError while loading upnp plugin directory '%s'", pluginDirectory.c_str()); + if(!pluginManager->LoadPlugins()){ + esyslog("UPnP\tError while loading upnp plugins"); return false; } else { dsyslog("UPnP\tFound %d plugins", pluginManager->Count()); @@ -721,11 +718,6 @@ void cMediaManager::SetDatabaseDir(const string& file){ databaseFile += "/metadata.db"; } -void cMediaManager::SetPluginDirectory(const string& directory){ - if(directory.empty()) pluginDirectory = DEFAULTPLUGINDIR; - else pluginDirectory = directory; -} - void cMediaManager::Action(){ string uri; while(!scanTargets.empty()){ diff --git a/media/pluginManager.cpp b/media/pluginManager.cpp index 38be5d4..cd31be3 100644 --- a/media/pluginManager.cpp +++ b/media/pluginManager.cpp @@ -312,9 +312,13 @@ void cUPnPResourceProvider::OnContainerUpdate(const string& uri, long int cUID, void cUPnPResourceProvider::Action(){} upnp::cPluginManager::cPluginManager() +: selfhandle(NULL) {} -upnp::cPluginManager::~cPluginManager(){} +upnp::cPluginManager::~cPluginManager(){ + if(selfhandle) + dlclose(selfhandle); +} const cPluginManager::ProfilerList& upnp::cPluginManager::GetProfilers() const { return profilers; @@ -338,10 +342,27 @@ cUPnPResourceProvider* upnp::cPluginManager::CreateProvider(const string& schema #define UPNPPLUGIN_PREFIX "libupnp-" #define SO_INDICATOR ".so." -bool upnp::cPluginManager::LoadPlugins(const string& directory){ +bool upnp::cPluginManager::LoadPlugins(){ + + Dl_info info; + static int marker=0; + if(!dladdr((void *)&marker,&info)) { + esyslog("UPnP\tError while getting information about myself: %s", dlerror()); + return false; + } + + selfhandle = dlopen(info.dli_fname,RTLD_NOW|RTLD_GLOBAL); + if(!selfhandle) { + esyslog("Error while opening myself: %s",dlerror()); + return false; + } DIR* dirHandle; struct dirent* dirEntry; + string library = info.dli_fname; + string directory = library.substr(0, library.find_last_of('/')); + + dsyslog("UPnP\tScanning %s for plugins.", directory.c_str()); if((dirHandle = opendir(directory.c_str())) == NULL){ return false; -- cgit v1.2.3