Commit d653c636 authored by dogmaphobic's avatar dogmaphobic

Enabling Zeroconf (Bonjour) on Mac OS/iOS

parent e3a27797
...@@ -278,3 +278,19 @@ else:WindowsBuild { ...@@ -278,3 +278,19 @@ else:WindowsBuild {
DEFINES += QGC_SPEECH_ENABLED DEFINES += QGC_SPEECH_ENABLED
LIBS += -lOle32 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 ...@@ -39,6 +39,8 @@ This file is part of the QGROUNDCONTROL project
#include "QGC.h" #include "QGC.h"
#include <QHostInfo> #include <QHostInfo>
static const char* kZeroconfRegistration = "_qgroundcontrol._udp";
static bool is_ip(const QString& address) static bool is_ip(const QString& address)
{ {
int a,b,c,d; int a,b,c,d;
...@@ -75,6 +77,7 @@ static QString get_ip_address(const QString& address) ...@@ -75,6 +77,7 @@ static QString get_ip_address(const QString& address)
UDPLink::UDPLink(UDPConfiguration* config) UDPLink::UDPLink(UDPConfiguration* config)
: _socket(NULL) : _socket(NULL)
, _connectState(false) , _connectState(false)
, _dnssServiceRef(NULL)
{ {
Q_ASSERT(config != NULL); Q_ASSERT(config != NULL);
_config = config; _config = config;
...@@ -108,6 +111,7 @@ void UDPLink::run() ...@@ -108,6 +111,7 @@ void UDPLink::run()
_hardwareConnect(); _hardwareConnect();
exec(); exec();
if (_socket) { if (_socket) {
_deregisterZeroconf();
_socket->close(); _socket->close();
} }
} }
...@@ -267,6 +271,7 @@ bool UDPLink::_hardwareConnect() ...@@ -267,6 +271,7 @@ bool UDPLink::_hardwareConnect()
_socket->setProxy(QNetworkProxy::NoProxy); _socket->setProxy(QNetworkProxy::NoProxy);
_connectState = _socket->bind(host, _config->localPort(), QAbstractSocket::ReuseAddressHint); _connectState = _socket->bind(host, _config->localPort(), QAbstractSocket::ReuseAddressHint);
if (_connectState) { if (_connectState) {
_registerZeroconf(_config->localPort(), kZeroconfRegistration);
QObject::connect(_socket, SIGNAL(readyRead()), this, SLOT(readBytes())); QObject::connect(_socket, SIGNAL(readyRead()), this, SLOT(readBytes()));
emit connected(); emit connected();
} else { } else {
...@@ -300,6 +305,40 @@ qint64 UDPLink::getCurrentOutDataRate() const ...@@ -300,6 +305,40 @@ qint64 UDPLink::getCurrentOutDataRate() const
return 0; 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 //-- UDPConfiguration
......
...@@ -37,6 +37,10 @@ This file is part of the QGROUNDCONTROL project ...@@ -37,6 +37,10 @@ This file is part of the QGROUNDCONTROL project
#include <QMutex> #include <QMutex>
#include <QUdpSocket> #include <QUdpSocket>
#if defined(QGC_ZEROCONF_ENABLED)
#include <dns_sd.h>
#endif
#include "QGCConfig.h" #include "QGCConfig.h"
#include "LinkManager.h" #include "LinkManager.h"
...@@ -201,6 +205,12 @@ private: ...@@ -201,6 +205,12 @@ private:
bool _hardwareConnect(); bool _hardwareConnect();
void _restartConnection(); void _restartConnection();
#if defined(QGC_ZEROCONF_ENABLED)
void _registerZeroconf(uint16_t port, const std::string& regType);
void _deregisterZeroconf();
DNSServiceRef _dnssServiceRef;
#endif
signals: signals:
//Signals are defined by LinkInterface //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