aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2013-01-27 22:32:10 +0100
committerMax Kellermann <max@duempel.org>2013-01-27 22:38:14 +0100
commit0988056471fefa2ee195a170dcf57771e7926a08 (patch)
treeb1e7535d4100756006b61d1a03f60eaad6e1f9b7 /src
parent95c3f57b3027e0961a1e32036dcce0383fb5e6ee (diff)
downloadmpd-0988056471fefa2ee195a170dcf57771e7926a08.tar.gz
mpd-0988056471fefa2ee195a170dcf57771e7926a08.tar.xz
mpd-0988056471fefa2ee195a170dcf57771e7926a08.zip
ZeroconfBonjour: use SocketMonitor instead of GIOChannel
Diffstat (limited to 'src')
-rw-r--r--src/Main.cxx2
-rw-r--r--src/ZeroconfBonjour.cxx55
-rw-r--r--src/ZeroconfBonjour.hxx4
-rw-r--r--src/ZeroconfGlue.cxx5
-rw-r--r--src/ZeroconfGlue.hxx6
5 files changed, 40 insertions, 32 deletions
diff --git a/src/Main.cxx b/src/Main.cxx
index 828462019..6f8bc27d0 100644
--- a/src/Main.cxx
+++ b/src/Main.cxx
@@ -490,7 +490,7 @@ int mpd_main(int argc, char *argv[])
return EXIT_FAILURE;
}
- ZeroconfInit();
+ ZeroconfInit(*main_loop);
player_create(&global_partition->pc);
diff --git a/src/ZeroconfBonjour.cxx b/src/ZeroconfBonjour.cxx
index 929ff6108..ac58a83e0 100644
--- a/src/ZeroconfBonjour.cxx
+++ b/src/ZeroconfBonjour.cxx
@@ -21,6 +21,8 @@
#include "ZeroconfBonjour.hxx"
#include "ZeroconfInternal.hxx"
#include "Listen.hxx"
+#include "event/SocketMonitor.hxx"
+#include "gcc.h"
#include <glib.h>
@@ -29,8 +31,28 @@
#undef G_LOG_DOMAIN
#define G_LOG_DOMAIN "bonjour"
-static DNSServiceRef dnsReference;
-static GIOChannel *bonjour_channel;
+class BonjourMonitor final : public SocketMonitor {
+ DNSServiceRef service_ref;
+
+public:
+ BonjourMonitor(EventLoop &_loop, DNSServiceRef _service_ref)
+ :SocketMonitor(DNSServiceRefSockFD(_service_ref), _loop),
+ service_ref(_service_ref) {
+ ScheduleRead();
+ }
+
+ ~BonjourMonitor() {
+ Steal();
+ DNSServiceRefDeallocate(service_ref);
+ }
+
+protected:
+ virtual void OnSocketReady(gcc_unused unsigned flags) override {
+ DNSServiceProcessResult(service_ref);
+ }
+};
+
+static BonjourMonitor *bonjour_monitor;
static void
dnsRegisterCallback(G_GNUC_UNUSED DNSServiceRef sdRef,
@@ -43,25 +65,16 @@ dnsRegisterCallback(G_GNUC_UNUSED DNSServiceRef sdRef,
if (errorCode != kDNSServiceErr_NoError) {
g_warning("Failed to register zeroconf service.");
- BonjourDeinit();
+ bonjour_monitor->Cancel();
} else {
g_debug("Registered zeroconf service with name '%s'", name);
}
}
-static gboolean
-bonjour_channel_event(G_GNUC_UNUSED GIOChannel *source,
- G_GNUC_UNUSED GIOCondition condition,
- G_GNUC_UNUSED gpointer data)
-{
- DNSServiceProcessResult(dnsReference);
-
- return dnsReference != NULL;
-}
-
void
-BonjourInit(const char *service_name)
+BonjourInit(EventLoop &loop, const char *service_name)
{
+ DNSServiceRef dnsReference;
DNSServiceErrorType error = DNSServiceRegister(&dnsReference,
0, 0, service_name,
SERVICE_TYPE, NULL, NULL,
@@ -80,21 +93,11 @@ BonjourInit(const char *service_name)
return;
}
- bonjour_channel = g_io_channel_unix_new(DNSServiceRefSockFD(dnsReference));
- g_io_add_watch(bonjour_channel, G_IO_IN, bonjour_channel_event, NULL);
+ bonjour_monitor = new BonjourMonitor(loop, dnsReference);
}
void
BonjourDeinit()
{
- if (bonjour_channel != NULL) {
- g_io_channel_unref(bonjour_channel);
- bonjour_channel = NULL;
- }
-
- if (dnsReference != NULL) {
- DNSServiceRefDeallocate(dnsReference);
- dnsReference = NULL;
- g_debug("Deregistered Zeroconf service.");
- }
+ delete bonjour_monitor;
}
diff --git a/src/ZeroconfBonjour.hxx b/src/ZeroconfBonjour.hxx
index 5d2470eb3..d91fe9a0d 100644
--- a/src/ZeroconfBonjour.hxx
+++ b/src/ZeroconfBonjour.hxx
@@ -20,8 +20,10 @@
#ifndef MPD_ZEROCONF_BONJOUR_HXX
#define MPD_ZEROCONF_BONJOUR_HXX
+class EventLoop;
+
void
-BonjourInit(const char *service_name);
+BonjourInit(EventLoop &loop, const char *service_name);
void
BonjourDeinit();
diff --git a/src/ZeroconfGlue.cxx b/src/ZeroconfGlue.cxx
index 3facd5762..fd53faa42 100644
--- a/src/ZeroconfGlue.cxx
+++ b/src/ZeroconfGlue.cxx
@@ -23,6 +23,7 @@
#include "ZeroconfBonjour.hxx"
#include "conf.h"
#include "Listen.hxx"
+#include "gcc.h"
#include <glib.h>
@@ -36,7 +37,7 @@
static int zeroconfEnabled;
void
-ZeroconfInit()
+ZeroconfInit(gcc_unused EventLoop &loop)
{
const char *serviceName;
@@ -58,7 +59,7 @@ ZeroconfInit()
#endif
#ifdef HAVE_BONJOUR
- BonjourInit(serviceName);
+ BonjourInit(loop, serviceName);
#endif
}
diff --git a/src/ZeroconfGlue.hxx b/src/ZeroconfGlue.hxx
index dcd7b81c0..2a291ce29 100644
--- a/src/ZeroconfGlue.hxx
+++ b/src/ZeroconfGlue.hxx
@@ -22,10 +22,12 @@
#include "check.h"
+class EventLoop;
+
#ifdef HAVE_ZEROCONF
void
-ZeroconfInit();
+ZeroconfInit(EventLoop &loop);
void
ZeroconfDeinit();
@@ -33,7 +35,7 @@ ZeroconfDeinit();
#else /* ! HAVE_ZEROCONF */
static inline void
-ZeroconfInit()
+ZeroconfInit(EventLoop &)
{}
static inline void