diff options
author | methodus <methodus@web.de> | 2012-11-24 17:51:02 +0100 |
---|---|---|
committer | methodus <methodus@web.de> | 2012-11-24 17:51:02 +0100 |
commit | fb59fa59688f52b6616acae6baa55883f620d30e (patch) | |
tree | 57a33d1124f934b70daa9690640aeb40b72a2ff2 /media | |
parent | 50f35873ed654ef3b289859a46aeb52c59df59ee (diff) | |
download | vdr-plugin-upnp-fb59fa59688f52b6616acae6baa55883f620d30e.tar.gz vdr-plugin-upnp-fb59fa59688f52b6616acae6baa55883f620d30e.tar.bz2 |
Improved plugin loader. This makes linking of the upnp plugin from sub plugins obsolete.
Diffstat (limited to 'media')
-rw-r--r-- | media/mediaManager.cpp | 12 | ||||
-rw-r--r-- | media/pluginManager.cpp | 25 |
2 files changed, 25 insertions, 12 deletions
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 = "<DIDL-Lite " "xmlns=\"urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/\" " "xmlns:dc=\"http://purl.org/dc/elements/1.1/\" " @@ -107,7 +105,6 @@ void cResourceStreamer::Close(){ cMediaManager::cMediaManager() : systemUpdateID(0) -, pluginDirectory(DEFAULTPLUGINDIR) , pluginManager(NULL) { SetDatabaseDir(string()); @@ -597,8 +594,8 @@ bool cMediaManager::Initialise(){ dsyslog("UPnP\tLoading Plugins..."); pluginManager = new upnp::cPluginManager(); - if(!pluginManager->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; |