pidgin/pidgin

Add a wrapper around the mdns interface implementation.

2020-12-31, Elliott Sales de Andrade
6777a9b23fd0
Parents 16127907763b
Children 2fcf11e235bd
Add a wrapper around the mdns interface implementation.

This might seem weird, but it's preparation to do more implementation work on Windows. Possibly also macOS, as it's weird that Avahi appears to be used and not Apple's version.

Testing Done:
Compile on both, and run on Linux.

Reviewed at https://reviews.imfreedom.org/r/315/
--- a/libpurple/protocols/bonjour/bonjour.c Tue Dec 29 00:37:08 2020 -0600
+++ b/libpurple/protocols/bonjour/bonjour.c Thu Dec 31 22:00:36 2020 -0600
@@ -30,7 +30,6 @@
#include <winsock2.h>
#include <windows.h>
#include <lm.h>
-#include "dns_sd_proxy.h"
#endif
#include <purple.h>
@@ -96,15 +95,13 @@
PurpleStatus *status;
PurplePresence *presence;
-#ifdef _WIN32
- if (!dns_sd_available()) {
+ if (!mdns_available()) {
purple_connection_error(gc,
PURPLE_CONNECTION_ERROR_OTHER_ERROR,
_("Unable to find Apple's \"Bonjour for Windows\" toolkit, see "
"https://developer.pidgin.im/BonjourWindows for more information."));
return;
}
-#endif /* _WIN32 */
purple_connection_set_flags(gc, PURPLE_CONNECTION_FLAG_HTML |
PURPLE_CONNECTION_FLAG_NO_IMAGES);
--- a/libpurple/protocols/bonjour/buddy.c Tue Dec 29 00:37:08 2020 -0600
+++ b/libpurple/protocols/bonjour/buddy.c Thu Dec 31 22:00:36 2020 -0600
@@ -21,7 +21,6 @@
#include "buddy.h"
#include "bonjour.h"
-#include "mdns_interface.h"
/**
* Creates a new buddy.
--- a/libpurple/protocols/bonjour/mdns_avahi.c Tue Dec 29 00:37:08 2020 -0600
+++ b/libpurple/protocols/bonjour/mdns_avahi.c Thu Dec 31 22:00:36 2020 -0600
@@ -16,7 +16,6 @@
#include <purple.h>
-#include "mdns_interface.h"
#include "buddy.h"
#include "bonjour.h"
@@ -398,7 +397,9 @@
* mdns_interface functions *
****************************/
-gboolean _mdns_init_session(BonjourDnsSd *data) {
+static gboolean
+avahi_mdns_init_session(BonjourDnsSd *data)
+{
AvahiSessionImplData *idata = g_new0(AvahiSessionImplData, 1);
const AvahiPoll *poll_api;
int error;
@@ -429,7 +430,9 @@
return TRUE;
}
-gboolean _mdns_publish(BonjourDnsSd *data, PublishType type, GSList *records) {
+static gboolean
+avahi_mdns_publish(BonjourDnsSd *data, PublishType type, GSList *records)
+{
int publish_result = 0;
AvahiSessionImplData *idata = data->mdns_impl_data;
AvahiStringList *lst = NULL;
@@ -492,7 +495,9 @@
return TRUE;
}
-gboolean _mdns_browse(BonjourDnsSd *data) {
+static gboolean
+avahi_mdns_browse(BonjourDnsSd *data)
+{
AvahiSessionImplData *idata = data->mdns_impl_data;
g_return_val_if_fail(idata != NULL, FALSE);
@@ -509,7 +514,9 @@
return TRUE;
}
-gboolean _mdns_set_buddy_icon_data(BonjourDnsSd *data, gconstpointer avatar_data, gsize avatar_len) {
+static gboolean
+avahi_mdns_set_buddy_icon_data(BonjourDnsSd *data, gconstpointer avatar_data, gsize avatar_len)
+{
AvahiSessionImplData *idata = data->mdns_impl_data;
if (idata == NULL || idata->client == NULL)
@@ -574,7 +581,9 @@
return TRUE;
}
-void _mdns_stop(BonjourDnsSd *data) {
+static void
+avahi_mdns_stop(BonjourDnsSd *data)
+{
AvahiSessionImplData *idata = data->mdns_impl_data;
if (idata == NULL || idata->client == NULL)
@@ -591,11 +600,15 @@
data->mdns_impl_data = NULL;
}
-void _mdns_init_buddy(BonjourBuddy *buddy) {
+static void
+avahi_mdns_init_buddy(BonjourBuddy *buddy)
+{
buddy->mdns_impl_data = g_new0(AvahiBuddyImplData, 1);
}
-void _mdns_delete_buddy(BonjourBuddy *buddy) {
+static void
+avahi_mdns_delete_buddy(BonjourBuddy *buddy)
+{
AvahiBuddyImplData *idata = buddy->mdns_impl_data;
g_return_if_fail(idata != NULL);
@@ -610,7 +623,9 @@
buddy->mdns_impl_data = NULL;
}
-void _mdns_retrieve_buddy_icon(BonjourBuddy* buddy) {
+static void
+avahi_mdns_retrieve_buddy_icon(BonjourBuddy* buddy)
+{
PurpleConnection *conn = purple_account_get_connection(buddy->account);
BonjourData *bd = purple_connection_get_protocol_data(conn);
AvahiSessionImplData *session_idata = bd->dns_sd_data->mdns_impl_data;
@@ -638,3 +653,17 @@
}
+gboolean
+mdns_available(void)
+{
+ _mdns_init_session = avahi_mdns_init_session;
+ _mdns_publish = avahi_mdns_publish;
+ _mdns_browse = avahi_mdns_browse;
+ _mdns_stop = avahi_mdns_stop;
+ _mdns_set_buddy_icon_data = avahi_mdns_set_buddy_icon_data;
+ _mdns_init_buddy = avahi_mdns_init_buddy;
+ _mdns_delete_buddy = avahi_mdns_delete_buddy;
+ _mdns_retrieve_buddy_icon = avahi_mdns_retrieve_buddy_icon;
+
+ return TRUE;
+}
--- a/libpurple/protocols/bonjour/mdns_common.c Tue Dec 29 00:37:08 2020 -0600
+++ b/libpurple/protocols/bonjour/mdns_common.c Thu Dec 31 22:00:36 2020 -0600
@@ -19,11 +19,23 @@
#include <purple.h>
#include "mdns_common.h"
-#include "mdns_interface.h"
#include "bonjour.h"
#include "buddy.h"
+/****************************
+ * mdns_interface functions *
+ ****************************/
+
+mdns_init_session_func *_mdns_init_session = NULL;
+mdns_publish_func *_mdns_publish = NULL;
+mdns_browse_func *_mdns_browse = NULL;
+mdns_stop_func *_mdns_stop = NULL;
+mdns_set_buddy_icon_data_func *_mdns_set_buddy_icon_data = NULL;
+mdns_init_buddy_func *_mdns_init_buddy = NULL;
+mdns_delete_buddy_func *_mdns_delete_buddy = NULL;
+mdns_retrieve_buddy_icon_func *_mdns_retrieve_buddy_icon = NULL;
+
/**
* Allocate space for the dns-sd data.
*/
--- a/libpurple/protocols/bonjour/mdns_common.h Tue Dec 29 00:37:08 2020 -0600
+++ b/libpurple/protocols/bonjour/mdns_common.h Thu Dec 31 22:00:36 2020 -0600
@@ -59,4 +59,34 @@
void bonjour_dns_sd_set_jid(PurpleAccount *account, const char *hostname);
+/****************************
+ * mdns_interface functions *
+ ****************************/
+
+typedef gboolean mdns_init_session_func(BonjourDnsSd *data);
+extern mdns_init_session_func *_mdns_init_session;
+
+typedef gboolean mdns_publish_func(BonjourDnsSd *data, PublishType type, GSList *records);
+extern mdns_publish_func *_mdns_publish;
+
+typedef gboolean mdns_browse_func(BonjourDnsSd *data);
+extern mdns_browse_func *_mdns_browse;
+
+typedef void mdns_stop_func(BonjourDnsSd *data);
+extern mdns_stop_func *_mdns_stop;
+
+typedef gboolean mdns_set_buddy_icon_data_func(BonjourDnsSd *data, gconstpointer avatar_data, gsize avatar_len);
+extern mdns_set_buddy_icon_data_func *_mdns_set_buddy_icon_data;
+
+typedef void mdns_init_buddy_func(BonjourBuddy *buddy);
+extern mdns_init_buddy_func *_mdns_init_buddy;
+
+typedef void mdns_delete_buddy_func(BonjourBuddy *buddy);
+extern mdns_delete_buddy_func *_mdns_delete_buddy;
+
+typedef void mdns_retrieve_buddy_icon_func(BonjourBuddy* buddy);
+extern mdns_retrieve_buddy_icon_func *_mdns_retrieve_buddy_icon;
+
+gboolean mdns_available(void);
+
#endif /* PURPLE_BONJOUR_MDNS_COMMON_H */
--- a/libpurple/protocols/bonjour/mdns_dns_sd.c Tue Dec 29 00:37:08 2020 -0600
+++ b/libpurple/protocols/bonjour/mdns_dns_sd.c Thu Dec 31 22:00:36 2020 -0600
@@ -23,13 +23,13 @@
#include <purple.h>
#include "buddy.h"
-#include "mdns_interface.h"
#ifdef __APPLE_CC__
#include <dns_sd.h>
#else
#include "dns_sd_proxy.h"
#endif
#include "mdns_common.h"
+#include "mdns_dns_sd.h"
#include "bonjour.h"
static GSList *pending_buddies = NULL;
@@ -467,7 +467,9 @@
* mdns_interface functions *
****************************/
-gboolean _mdns_init_session(BonjourDnsSd *data) {
+static gboolean
+dns_sd_mdns_init_session(BonjourDnsSd *data)
+{
data->mdns_impl_data = g_new0(Win32SessionImplData, 1);
bonjour_dns_sd_set_jid(data->account, g_get_host_name());
@@ -475,7 +477,9 @@
return TRUE;
}
-gboolean _mdns_publish(BonjourDnsSd *data, PublishType type, GSList *records) {
+static gboolean
+dns_sd_mdns_publish(BonjourDnsSd *data, PublishType type, GSList *records)
+{
TXTRecordRef dns_data;
gboolean ret = TRUE;
DNSServiceErrorType errorCode = kDNSServiceErr_NoError;
@@ -536,7 +540,9 @@
return ret;
}
-gboolean _mdns_browse(BonjourDnsSd *data) {
+static gboolean
+dns_sd_mdns_browse(BonjourDnsSd *data)
+{
DNSServiceErrorType errorCode;
Win32SessionImplData *idata = data->mdns_impl_data;
DNSServiceRef browser_sr;
@@ -560,7 +566,9 @@
return FALSE;
}
-void _mdns_stop(BonjourDnsSd *data) {
+static void
+dns_sd_mdns_stop(BonjourDnsSd *data)
+{
Win32SessionImplData *idata = data->mdns_impl_data;
if (idata == NULL)
@@ -583,7 +591,9 @@
data->mdns_impl_data = NULL;
}
-gboolean _mdns_set_buddy_icon_data(BonjourDnsSd *data, gconstpointer avatar_data, gsize avatar_len) {
+static gboolean
+dns_sd_mdns_set_buddy_icon_data(BonjourDnsSd *data, gconstpointer avatar_data, gsize avatar_len)
+{
Win32SessionImplData *idata = data->mdns_impl_data;
DNSServiceErrorType errorCode = kDNSServiceErr_NoError;
@@ -611,11 +621,15 @@
return TRUE;
}
-void _mdns_init_buddy(BonjourBuddy *buddy) {
+static void
+dns_sd_mdns_init_buddy(BonjourBuddy *buddy)
+{
buddy->mdns_impl_data = g_new0(Win32BuddyImplData, 1);
}
-void _mdns_delete_buddy(BonjourBuddy *buddy) {
+static void
+dns_sd_mdns_delete_buddy(BonjourBuddy *buddy)
+{
Win32BuddyImplData *idata = buddy->mdns_impl_data;
g_return_if_fail(idata != NULL);
@@ -637,7 +651,9 @@
buddy->mdns_impl_data = NULL;
}
-void _mdns_retrieve_buddy_icon(BonjourBuddy* buddy) {
+static void
+dns_sd_mdns_retrieve_buddy_icon(BonjourBuddy* buddy)
+{
Win32BuddyImplData *idata = buddy->mdns_impl_data;
char svc_name[kDNSServiceMaxDomainName];
@@ -670,6 +686,23 @@
} else
purple_debug_error("bonjour", "Unable to query buddy icon record for %s. (%d)\n", buddy->name, errorCode);
}
-
}
+gboolean
+dns_sd_mdns_available(void)
+{
+ if (!dns_sd_available()) {
+ return FALSE;
+ }
+
+ _mdns_init_session = dns_sd_mdns_init_session;
+ _mdns_publish = dns_sd_mdns_publish;
+ _mdns_browse = dns_sd_mdns_browse;
+ _mdns_stop = dns_sd_mdns_stop;
+ _mdns_set_buddy_icon_data = dns_sd_mdns_set_buddy_icon_data;
+ _mdns_init_buddy = dns_sd_mdns_init_buddy;
+ _mdns_delete_buddy = dns_sd_mdns_delete_buddy;
+ _mdns_retrieve_buddy_icon = dns_sd_mdns_retrieve_buddy_icon;
+
+ return TRUE;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/bonjour/mdns_dns_sd.h Thu Dec 31 22:00:36 2020 -0600
@@ -0,0 +1,25 @@
+/*
+ * Purple - Internet Messaging Library
+ * Copyright (C) Pidgin Developers <devel@pidgin.im>
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here. Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <glib.h>
+
+gboolean dns_sd_mdns_available(void);
--- a/libpurple/protocols/bonjour/mdns_interface.h Tue Dec 29 00:37:08 2020 -0600
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Library General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, USA.
- */
-
-#ifndef PURPLE_BONJOUR_MDNS_INTERFACE_H
-#define PURPLE_BONJOUR_MDNS_INTERFACE_H
-
-#include "mdns_types.h"
-#include "buddy.h"
-
-gboolean _mdns_init_session(BonjourDnsSd *data);
-
-gboolean _mdns_publish(BonjourDnsSd *data, PublishType type, GSList *records);
-
-gboolean _mdns_browse(BonjourDnsSd *data);
-
-void _mdns_stop(BonjourDnsSd *data);
-
-gboolean _mdns_set_buddy_icon_data(BonjourDnsSd *data, gconstpointer avatar_data, gsize avatar_len);
-
-void _mdns_init_buddy(BonjourBuddy *buddy);
-
-void _mdns_delete_buddy(BonjourBuddy *buddy);
-
-void _mdns_retrieve_buddy_icon(BonjourBuddy* buddy);
-
-#endif /* PURPLE_BONJOUR_MDNS_INTERFACE_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/bonjour/mdns_win32.c Thu Dec 31 22:00:36 2020 -0600
@@ -0,0 +1,40 @@
+/*
+ * Purple - Internet Messaging Library
+ * Copyright (C) Pidgin Developers <devel@pidgin.im>
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here. Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <purple.h>
+
+#include "mdns_common.h"
+#include "mdns_dns_sd.h"
+
+/****************************
+ * mdns_interface functions *
+ ****************************/
+
+gboolean
+mdns_available(void)
+{
+ if (dns_sd_mdns_available()) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
--- a/libpurple/protocols/bonjour/meson.build Tue Dec 29 00:37:08 2020 -0600
+++ b/libpurple/protocols/bonjour/meson.build Thu Dec 31 22:00:36 2020 -0600
@@ -7,7 +7,6 @@
'xmpp.h',
'mdns_common.c',
'mdns_common.h',
- 'mdns_interface.h',
'mdns_types.h',
'parser.c',
'parser.h',
@@ -16,7 +15,10 @@
]
if IS_WIN32
- BONJOUR_SOURCES += ['dns_sd_proxy.c', 'mdns_dns_sd.c']
+ BONJOUR_SOURCES += [
+ 'dns_sd_proxy.c', 'dns_sd_proxy.h', 'mdns_dns_sd.c', 'mdns_dns_sd.h',
+ 'mdns_win32.c'
+ ]
bonjour_link_args = ['-lnetapi32']
else
BONJOUR_SOURCES += ['mdns_avahi.c']