Commit ca43e634 authored by Max Kellermann's avatar Max Kellermann

db/upnp: use std::function for the libupnp callback

Replaces the bloated std::map.
parent 85324f80
......@@ -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()
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment