db/upnp: use std::function for the libupnp callback
Replaces the bloated std::map.
This commit is contained in:
parent
85324f80fe
commit
ca43e634b5
@ -158,7 +158,7 @@ discoExplorer(void *)
|
||||
// mutex just for clarifying the message printing, the workqueue is
|
||||
// mt-safe of course.
|
||||
static int
|
||||
cluCallBack(Upnp_EventType et, void *evp, void *)
|
||||
cluCallBack(Upnp_EventType et, void *evp)
|
||||
{
|
||||
static Mutex cblock;
|
||||
const ScopeLock protect(cblock);
|
||||
@ -231,11 +231,9 @@ UPnPDeviceDirectory::UPnPDeviceDirectory()
|
||||
if (lib == nullptr)
|
||||
return;
|
||||
|
||||
lib->registerHandler(UPNP_DISCOVERY_SEARCH_RESULT, cluCallBack, this);
|
||||
lib->registerHandler(UPNP_DISCOVERY_ADVERTISEMENT_ALIVE,
|
||||
cluCallBack, this);
|
||||
lib->registerHandler(UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE,
|
||||
cluCallBack, this);
|
||||
lib->SetHandler([](Upnp_EventType type, void *event){
|
||||
cluCallBack(type, event);
|
||||
});
|
||||
|
||||
search();
|
||||
}
|
||||
|
@ -65,15 +65,6 @@ LibUPnP::LibUPnP()
|
||||
ixmlRelaxParser(1);
|
||||
}
|
||||
|
||||
void
|
||||
LibUPnP::registerHandler(Upnp_EventType et, Upnp_FunPtr handler, void *cookie)
|
||||
{
|
||||
if (handler == nullptr)
|
||||
m_handlers.erase(et);
|
||||
else
|
||||
m_handlers.emplace(et, Handler(handler, cookie));
|
||||
}
|
||||
|
||||
int
|
||||
LibUPnP::o_callback(Upnp_EventType et, void* evp, void* cookie)
|
||||
{
|
||||
@ -83,10 +74,9 @@ LibUPnP::o_callback(Upnp_EventType et, void* evp, void* cookie)
|
||||
ulib = theLib;
|
||||
}
|
||||
|
||||
auto it = ulib->m_handlers.find(et);
|
||||
if (it != ulib->m_handlers.end()) {
|
||||
(it->second.handler)(et, evp, it->second.cookie);
|
||||
}
|
||||
if (ulib->handler)
|
||||
ulib->handler(et, evp);
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -22,24 +22,18 @@
|
||||
|
||||
#include "util/Error.hxx"
|
||||
|
||||
#include <map>
|
||||
|
||||
#include <upnp/upnp.h>
|
||||
|
||||
#include <functional>
|
||||
|
||||
/** Our link to libupnp. Initialize and keep the handle around */
|
||||
class LibUPnP {
|
||||
// A Handler object records the data from registerHandler.
|
||||
class Handler {
|
||||
public:
|
||||
Handler(Upnp_FunPtr h, void *c)
|
||||
: handler(h), cookie(c) {}
|
||||
Upnp_FunPtr handler;
|
||||
void *cookie;
|
||||
};
|
||||
typedef std::function<void(Upnp_EventType type, void *event)> Handler;
|
||||
|
||||
Error init_error;
|
||||
UpnpClient_Handle m_clh;
|
||||
std::map<Upnp_EventType, Handler> m_handlers;
|
||||
|
||||
Handler handler;
|
||||
|
||||
LibUPnP();
|
||||
|
||||
@ -65,7 +59,10 @@ public:
|
||||
return init_error;
|
||||
}
|
||||
|
||||
void registerHandler(Upnp_EventType et, Upnp_FunPtr handler, void *cookie);
|
||||
template<typename T>
|
||||
void SetHandler(T &&_handler) {
|
||||
handler = std::forward<T>(_handler);
|
||||
}
|
||||
|
||||
UpnpClient_Handle getclh()
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user