Commit d653c636 authored by dogmaphobic's avatar dogmaphobic

Enabling Zeroconf (Bonjour) on Mac OS/iOS

parent e3a27797
......@@ -278,3 +278,19 @@ else:WindowsBuild {
DEFINES += QGC_SPEECH_ENABLED
LIBS += -lOle32
}
#
# [OPTIONAL] Zeroconf for UDP links
#
contains (DEFINES, DISABLE_ZEROCONF) {
message("Skipping support for Zeroconf (manual override from command line)")
DEFINES -= DISABLE_ZEROCONF
# Otherwise the user can still disable this feature in the user_config.pri file.
} else:exists(user_config.pri):infile(user_config.pri, DEFINES, DISABLE_ZEROCONF) {
message("Skipping support for Zeroconf (manual override from user_config.pri)")
# Mac support is built into OS
} else:MacBuild|iOSBuild {
message("Including support for Zeroconf (Bonjour)")
DEFINES += QGC_ZEROCONF_ENABLED
}
......@@ -39,6 +39,8 @@ This file is part of the QGROUNDCONTROL project
#include "QGC.h"
#include <QHostInfo>
static const char* kZeroconfRegistration = "_qgroundcontrol._udp";
static bool is_ip(const QString& address)
{
int a,b,c,d;
......@@ -75,6 +77,7 @@ static QString get_ip_address(const QString& address)
UDPLink::UDPLink(UDPConfiguration* config)
: _socket(NULL)
, _connectState(false)
, _dnssServiceRef(NULL)
{
Q_ASSERT(config != NULL);
_config = config;
......@@ -108,6 +111,7 @@ void UDPLink::run()
_hardwareConnect();
exec();
if (_socket) {
_deregisterZeroconf();
_socket->close();
}
}
......@@ -267,6 +271,7 @@ bool UDPLink::_hardwareConnect()
_socket->setProxy(QNetworkProxy::NoProxy);
_connectState = _socket->bind(host, _config->localPort(), QAbstractSocket::ReuseAddressHint);
if (_connectState) {
_registerZeroconf(_config->localPort(), kZeroconfRegistration);
QObject::connect(_socket, SIGNAL(readyRead()), this, SLOT(readBytes()));
emit connected();
} else {
......@@ -300,6 +305,40 @@ qint64 UDPLink::getCurrentOutDataRate() const
return 0;
}
void UDPLink::_registerZeroconf(uint16_t port, const std::string &regType)
{
#if defined(QGC_ZEROCONF_ENABLED)
DNSServiceErrorType result = DNSServiceRegister(&_dnssServiceRef, 0, 0, 0,
regType.c_str(),
NULL,
NULL,
htons(port),
0,
NULL,
NULL,
NULL);
if (result != kDNSServiceErr_NoError)
{
emit communicationError("UDP Link Error", "Error registering Zeroconf");
_dnssServiceRef = NULL;
}
#else
Q_UNUSED(port);
Q_UNUSED(regType);
#endif
}
void UDPLink::_deregisterZeroconf()
{
#if defined(QGC_ZEROCONF_ENABLED)
if (_dnssServiceRef)
{
DNSServiceRefDeallocate(_dnssServiceRef);
_dnssServiceRef = NULL;
}
#endif
}
//--------------------------------------------------------------------------
//-- UDPConfiguration
......
......@@ -37,6 +37,10 @@ This file is part of the QGROUNDCONTROL project
#include <QMutex>
#include <QUdpSocket>
#if defined(QGC_ZEROCONF_ENABLED)
#include <dns_sd.h>
#endif
#include "QGCConfig.h"
#include "LinkManager.h"
......@@ -201,6 +205,12 @@ private:
bool _hardwareConnect();
void _restartConnection();
#if defined(QGC_ZEROCONF_ENABLED)
void _registerZeroconf(uint16_t port, const std::string& regType);
void _deregisterZeroconf();
DNSServiceRef _dnssServiceRef;
#endif
signals:
//Signals are defined by LinkInterface
......
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