summaryrefslogtreecommitdiff
path: root/media
diff options
context:
space:
mode:
authormethodus <methodus@web.de>2012-11-24 17:51:02 +0100
committermethodus <methodus@web.de>2012-11-24 17:51:02 +0100
commitfb59fa59688f52b6616acae6baa55883f620d30e (patch)
tree57a33d1124f934b70daa9690640aeb40b72a2ff2 /media
parent50f35873ed654ef3b289859a46aeb52c59df59ee (diff)
downloadvdr-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.cpp12
-rw-r--r--media/pluginManager.cpp25
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;