From 33224a1f974f27daa598ccd43d138d9e2a6d395c Mon Sep 17 00:00:00 2001 From: walker0643 <> Date: Tue, 3 Jul 2018 18:48:24 -0400 Subject: [PATCH] drop Qt discovery of best IP address in favor of pure WINAPI method (with wireless detection) --- src/gui/CMakeLists.txt | 24 ++++++--- src/gui/src/ZeroconfService.cpp | 65 +++-------------------- src/gui/src/main.cpp | 7 +++ src/gui/src/win32/DefaultInterfaceIP.cpp | Bin 0 -> 5822 bytes src/gui/src/win32/DefaultInterfaceIP.h | 10 ++++ src/gui/src/win32/HeapResource.h | 48 +++++++++++++++++ 6 files changed, 89 insertions(+), 65 deletions(-) create mode 100644 src/gui/src/win32/DefaultInterfaceIP.cpp create mode 100644 src/gui/src/win32/DefaultInterfaceIP.h create mode 100644 src/gui/src/win32/HeapResource.h diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 12fb5fda..fcc6aee0 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -6,17 +6,25 @@ set (CMAKE_AUTORCC ON) set (CMAKE_AUTOUIC ON) set (CMAKE_INCLUDE_CURRENT_DIR ON) -file (GLOB GUI_SOURCE_FILES src/*.cpp src/*.h) -file (GLOB GUI_UI_FILES src/*.ui) - if (WIN32) - set (GUI_RC_FILES res/win/Barrier.rc) + set (resources res/win/Barrier.rc) + set (arch "win32") +else() + set (arch "unix") +endif() + +file (GLOB sources src/*.cpp src/${arch}/*.cpp) +file (GLOB headers src/*.h src/${arch}/*.h) +file (GLOB designs src/*.ui) + +if (BARRIER_ADD_HEADERS) + list (APPEND sources ${headers}) endif() add_executable (barrier WIN32 - ${GUI_SOURCE_FILES} - ${GUI_UI_FILES} - ${GUI_RC_FILES} + ${sources} + ${designs} + ${resources} res/Barrier.qrc ) @@ -32,7 +40,7 @@ if (WIN32) HINTS ENV BONJOUR_SDK_HOME PATH_SUFFIXES "Lib/x64") set_target_properties (barrier PROPERTIES LINK_FLAGS "/NODEFAULTLIB:LIBCMT") - target_link_libraries (barrier ${DNSSD_LIB}) + target_link_libraries (barrier ${DNSSD_LIB} Ws2_32.lib Iphlpapi.lib) elseif (APPLE) find_library(APPSERVICES_LIB ApplicationServices) target_link_libraries(barrier ${APPSERVICES_LIB}) diff --git a/src/gui/src/ZeroconfService.cpp b/src/gui/src/ZeroconfService.cpp index 9f263984..b5060108 100644 --- a/src/gui/src/ZeroconfService.cpp +++ b/src/gui/src/ZeroconfService.cpp @@ -30,8 +30,7 @@ #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include -#include -#pragma comment(lib, "wlanapi.lib") +#include "win32/DefaultInterfaceIP.h" #else #include #endif @@ -120,75 +119,27 @@ void ZeroconfService::errorHandle(DNSServiceErrorType errorCode) tr("Error code: %1.").arg(errorCode)); } -#ifdef _WIN32 -static QString mac_to_string(DOT11_MAC_ADDRESS mac) -{ - char str[18]; - snprintf(str, 18, "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X", - mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - return str; -} - -static QList wireless_mac_strings() -{ - QList wlanMAC; - DWORD version; - HANDLE client; - if (WlanOpenHandle(2, NULL, &version, &client) == 0) { - WLAN_INTERFACE_INFO_LIST * list; - if (WlanEnumInterfaces(client, NULL, &list) == 0) { - for (DWORD idx = 0; idx < list->dwNumberOfItems; ++idx) { - const GUID * PGuid = &(list->InterfaceInfo[0].InterfaceGuid); - const WLAN_INTF_OPCODE OpCode = wlan_intf_opcode_current_connection; - WLAN_CONNECTION_ATTRIBUTES * attrs; - DWORD attrsSz; - if (WlanQueryInterface(client, PGuid, OpCode, NULL, &attrsSz, - (void**)&attrs, NULL) == 0) { - wlanMAC.append(mac_to_string( - attrs->wlanAssociationAttributes.dot11Bssid)); - WlanFreeMemory(attrs); - } - } - WlanFreeMemory(list); - } - WlanCloseHandle(client, NULL); - } - return wlanMAC; -} -#else -static QList wireless_mac_strings() -{ - // TODO - return QList(); -} -#endif - QString ZeroconfService::getLocalIPAddresses() { +#ifdef _WIN32 + return QString::fromStdString(Debauchee::default_interface_ip()); +#else const QString NonEthernetMAC = "00:00:00:00:00:00"; - const auto wlanMAC = wireless_mac_strings(); - QString wirelessIP = ""; foreach(const auto qni, QNetworkInterface::allInterfaces()) { // weed out loopback, inactive, and non-ethernet interfaces if (!qni.flags().testFlag(QNetworkInterface::IsLoopBack) && qni.flags().testFlag(QNetworkInterface::IsUp) && qni.hardwareAddress() != NonEthernetMAC) { - bool isWireless = wlanMAC.contains(qni.hardwareAddress().toUpper()); foreach(const auto address, qni.allAddresses()) { if (address.protocol() == QAbstractSocket::IPv4Protocol) { - // use the first non-wireless address we find - if (!isWireless) - return address.toString(); - // save the first wireless address we find - if (wirelessIP.isEmpty()) - wirelessIP = address.toString(); + // use the first address we find + return address.toString(); } } } } - // if no non-wireless address could be found use a wireless one - // if one was found. otherwise return an empty string - return wirelessIP; + return ""; +#endif } bool ZeroconfService::registerService(bool server) diff --git a/src/gui/src/main.cpp b/src/gui/src/main.cpp index 76a7d1a2..47b28c05 100644 --- a/src/gui/src/main.cpp +++ b/src/gui/src/main.cpp @@ -67,6 +67,13 @@ int main(int argc, char* argv[]) /* Workaround for QTBUG-40332 - "High ping when QNetworkAccessManager is instantiated" */ ::setenv ("QT_BEARER_POLL_TIMEOUT", "-1", 1); #endif + +#if _WIN32 + // winsock needs to be initialized for DefaultInterfaceIP + WSADATA wd; + WSAStartup(MAKEWORD(2, 0), &wd); +#endif + QCoreApplication::setOrganizationName("Debauchee"); QCoreApplication::setOrganizationDomain("github.com"); QCoreApplication::setApplicationName("Barrier"); diff --git a/src/gui/src/win32/DefaultInterfaceIP.cpp b/src/gui/src/win32/DefaultInterfaceIP.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2afba7929f0b2cc8b917eb4c9fce54f7c0491a55 GIT binary patch literal 5822 zcmbtYYi}Dz4CLnm{SOxhaOF02;wAx#ya3g*9U+daSaOS^CJbUtp~I(R$L9o?Jm|j{j@uHlVvLTSCoDJC!l6L`HHUzu_9o z4Du=7%<=qI_0KTx49~QZ<2L0C7yDCOeQ0u~`9i7*Im#!{&C3lSn@Q!ZxeK|moU0aX z8DO5abTI0X?8+;&Tku#{y|s(k`)IZBwu64kHqp~jjRWZT`tIs@BlzxG$4}%LWNBFs z7LVkedU_%+RHI6ITJrre>HO;I#@vvXSScfUtlqnTZFAT%Mr0W%s9QLrCAGuO@HX*f-RX4Hb0W5xXv$l@>3>+~Z`mp0K{FceT*46Z(y}C{d z*7bB&`tL{eVzs3m9sN*qyV{%Pzo)v+ziXn)Sf7D6o`jq##;2HZ%<-9OB(Tr)q)pf$v*WuMR90<#<;@-6f;ezu~B=0u*OcSjz8cOHtx*Y%mv zWNNoJYW}j&dL+LV^rm3V1X;WqFETa67p;>>7&W*ky*)3hXY2oG>iU__~r z$2HM8hv)LSOqtDE-)w;~k_DH!Py8NvV*@N1eP=mREnQ{F=VcamCo&Xy^jgtAf|slv zy;aAlC-70mDaD*KevKnnW!*>kdy2Rbn~j1c^*-dTVR;#CHB82LMb?NmeT)4vMs}+Z z508Xn^G*p(W9)6@{NJ&HWs&!hA_Ahd5eu#nG2w6HN^I@%9aq*^1VIR19xbk{*k(Y$xPUm9ipcY~ zbN8xr1KK~31-j1BeKhgS_eQs$rip)PL)@Suqm4BQE%3iV^ zr5vHySuW@-*9p=UF}5PU*AJ`>b~#=>IBK7dg~%U!Iw@c#0^0fK~iTbaqP(mG>wO=4nBwF(Xy`(<@IIf zgfa?PE8fnHhDIBic;iWt)j}Izrj_+?AN=)jo7A9&60A?@a3;e;t%pub1&!z79uv@svQMu8Vc|jo(i- z^4$BE+You%wX5H{z4=^n^yl-XhkV(^#cyZ56;R9Zvae(0%#4wZ)63_Aa^&m09oG_D LaptPCjLH88YQkLJ literal 0 HcmV?d00001 diff --git a/src/gui/src/win32/DefaultInterfaceIP.h b/src/gui/src/win32/DefaultInterfaceIP.h new file mode 100644 index 00000000..2067aeac --- /dev/null +++ b/src/gui/src/win32/DefaultInterfaceIP.h @@ -0,0 +1,10 @@ +#pragma once + +#include + +namespace Debauchee +{ + +std::string default_interface_ip(); + +} diff --git a/src/gui/src/win32/HeapResource.h b/src/gui/src/win32/HeapResource.h new file mode 100644 index 00000000..aedce90e --- /dev/null +++ b/src/gui/src/win32/HeapResource.h @@ -0,0 +1,48 @@ +#pragma once + +namespace Debauchee +{ + +template +class HeapResource +{ +public: + explicit HeapResource(HANDLE heap, DWORD flags, SIZE_T sz) : + _heap(heap), + _flags(flags), + _mem((T*)HeapAlloc(heap, flags, sz)) + { + } + + HeapResource(HeapResource&& other) + : _mem(NULL) + { + swap(*this, other); + } + + ~HeapResource() + { + if (is_valid()) { + HeapFree(_heap, _flags, _mem); + } + } + + friend void swap(HeapResource& first, HeapResource& second) + { + using std::swap; + swap(first._heap, second._heap); + swap(first._flags, second._flags); + swap(first._mem, second._mem); + } + + bool is_valid() const { return _mem != NULL; } + + operator T*() const { return _mem; } + +private: + HANDLE _heap; + DWORD _flags; + T * _mem; +}; + +}