upnp: initialize the client handle only once

Eliminate class LibUPnP and move the code to ClientInit.cxx.  Its
initialization function can be called multiple times, but
UpnpRegisterClient() is called at most once.
This commit is contained in:
Max Kellermann
2014-01-26 15:41:25 +01:00
parent 01f7abfc63
commit d7e78059b0
4 changed files with 73 additions and 70 deletions

View File

@@ -20,7 +20,7 @@
#include "config.h"
#include "UpnpDatabasePlugin.hxx"
#include "lib/upnp/Domain.hxx"
#include "lib/upnp/upnpplib.hxx"
#include "lib/upnp/ClientInit.hxx"
#include "lib/upnp/Discovery.hxx"
#include "lib/upnp/ContentDirectoryService.hxx"
#include "lib/upnp/Util.hxx"
@@ -69,7 +69,7 @@ public:
};
class UpnpDatabase : public Database {
LibUPnP *lib;
UpnpClient_Handle handle;
UPnPDeviceDirectory *discovery;
public:
@@ -175,17 +175,13 @@ UpnpDatabase::Configure(const config_param &, Error &)
bool
UpnpDatabase::Open(Error &error)
{
lib = new LibUPnP();
if (!lib->ok()) {
error.Set(lib->GetInitError());
delete lib;
if (!UpnpClientGlobalInit(handle, error))
return false;
}
discovery = new UPnPDeviceDirectory(lib->getclh());
discovery = new UPnPDeviceDirectory(handle);
if (!discovery->Start(error)) {
delete discovery;
delete lib;
UpnpClientGlobalFinish();
return false;
}
@@ -199,7 +195,7 @@ void
UpnpDatabase::Close()
{
delete discovery;
delete lib;
UpnpClientGlobalFinish();
}
void
@@ -277,7 +273,7 @@ UpnpDatabase::SearchSongs(const ContentDirectoryService &server,
return true;
std::list<std::string> searchcaps;
if (!server.getSearchCapabilities(lib->getclh(), searchcaps, error))
if (!server.getSearchCapabilities(handle, searchcaps, error))
return false;
if (searchcaps.empty())
@@ -344,7 +340,7 @@ UpnpDatabase::SearchSongs(const ContentDirectoryService &server,
}
}
return server.search(lib->getclh(),
return server.search(handle,
objid, cond.c_str(), dirbuf,
error);
}
@@ -431,7 +427,7 @@ UpnpDatabase::ReadNode(const ContentDirectoryService &server,
Error &error) const
{
UPnPDirContent dirbuf;
if (!server.getMetadata(lib->getclh(), objid, dirbuf, error))
if (!server.getMetadata(handle, objid, dirbuf, error))
return false;
if (dirbuf.objects.size() == 1) {
@@ -485,8 +481,6 @@ UpnpDatabase::Namei(const ContentDirectoryService &server,
return true;
}
const UpnpClient_Handle handle = lib->getclh();
std::string objid(rootid);
// Walk the path elements, read each directory and try to find the next one
@@ -663,7 +657,7 @@ UpnpDatabase::VisitServer(const ContentDirectoryService &server,
and loop here, but it's not useful as mpd will only return
data to the client when we're done anyway. */
UPnPDirContent dirbuf;
if (!server.readDir(lib->getclh(), tdirent.m_id.c_str(), dirbuf,
if (!server.readDir(handle, tdirent.m_id.c_str(), dirbuf,
error))
return false;