From 7ea87b4bc5666ec2ff42b08e63aa09951fa6cbc9 Mon Sep 17 00:00:00 2001 From: jules Date: Mon, 15 Oct 2018 10:29:29 +0100 Subject: [PATCH] DRYed some IPAddress code --- .../native/juce_mac_linux_IPAddress.h | 17 +-- .../juce_core/native/juce_win32_Network.cpp | 117 ++++++------------ 2 files changed, 41 insertions(+), 93 deletions(-) diff --git a/modules/juce_core/native/juce_mac_linux_IPAddress.h b/modules/juce_core/native/juce_mac_linux_IPAddress.h index 024977b8ae..ecec568e74 100644 --- a/modules/juce_core/native/juce_mac_linux_IPAddress.h +++ b/modules/juce_core/native/juce_mac_linux_IPAddress.h @@ -30,15 +30,9 @@ namespace if (addr_in == nullptr) return {}; - in6_addr addr = addr_in->sin6_addr; + auto addr = addr_in->sin6_addr; - union ByteUnion - { - uint16 combined; - uint8 split[2]; - }; - - ByteUnion temp; + IPAddressByteUnion temp; uint16 arr[8]; for (int i = 0; i < 8; ++i) // Swap bytes from network to host order @@ -62,8 +56,7 @@ namespace struct InterfaceInfo { - IPAddress interfaceAddress; - IPAddress broadcastAddress; + IPAddress interfaceAddress, broadcastAddress; }; bool operator== (const InterfaceInfo& lhs, const InterfaceInfo& rhs) @@ -78,8 +71,8 @@ namespace { if (ifa->ifa_addr->sa_family == AF_INET) { - auto* interfaceAddressInfo = (sockaddr_in*) ifa->ifa_addr; - auto* broadcastAddressInfo = (sockaddr_in*) ifa->ifa_dstaddr; + auto interfaceAddressInfo = (sockaddr_in*) ifa->ifa_addr; + auto broadcastAddressInfo = (sockaddr_in*) ifa->ifa_dstaddr; if (interfaceAddressInfo->sin_addr.s_addr != INADDR_NONE) { diff --git a/modules/juce_core/native/juce_win32_Network.cpp b/modules/juce_core/native/juce_win32_Network.cpp index 96f10db90d..a62c407c95 100644 --- a/modules/juce_core/native/juce_win32_Network.cpp +++ b/modules/juce_core/native/juce_win32_Network.cpp @@ -514,6 +514,37 @@ namespace MACAddressHelpers split[1] = sa_in6->sin6_addr.u.Byte[off]; #endif } + + static IPAddress createAddress (const sockaddr_in6* sa_in6) + { + IPAddressByteUnion temp; + uint16 arr[8]; + + for (int i = 0; i < 8; ++i) + { + split (sa_in6, i * 2, temp.split); + arr[i] = temp.combined; + } + + return IPAddress (arr); + } + + static IPAddress createAddress (const sockaddr_in* sa_in) + { + return IPAddress ((uint8*) &sa_in->sin_addr.s_addr, false); + } + + template + static void findAddresses (Array& result, bool includeIPv6, Type start) + { + for (auto addr = start; addr != nullptr; addr = addr->Next) + { + if (addr->Address.lpSockaddr->sa_family == AF_INET) + result.addIfNotAlreadyThere (createAddress ((sockaddr_in*) addr->Address.lpSockaddr)); + else if (addr->Address.lpSockaddr->sa_family == AF_INET6 && includeIPv6) + result.addIfNotAlreadyThere (createAddress ((sockaddr_in6*) addr->Address.lpSockaddr)); + } + } } void MACAddress::findAllAddresses (Array& result) @@ -530,90 +561,14 @@ void IPAddress::findAllAddresses (Array& result, bool includeIPv6) result.addIfNotAlreadyThere (IPAddress::local (true)); GetAdaptersAddressesHelper addressesHelper; + if (addressesHelper.callGetAdaptersAddresses()) { for (PIP_ADAPTER_ADDRESSES adapter = addressesHelper.adaptersAddresses; adapter != nullptr; adapter = adapter->Next) { - PIP_ADAPTER_UNICAST_ADDRESS pUnicast = nullptr; - for (pUnicast = adapter->FirstUnicastAddress; pUnicast != nullptr; pUnicast = pUnicast->Next) - { - if (pUnicast->Address.lpSockaddr->sa_family == AF_INET) - { - const sockaddr_in* sa_in = (sockaddr_in*)pUnicast->Address.lpSockaddr; - IPAddress ip ((uint8*)&sa_in->sin_addr.s_addr, false); - result.addIfNotAlreadyThere (ip); - } - else if (pUnicast->Address.lpSockaddr->sa_family == AF_INET6 && includeIPv6) - { - const sockaddr_in6* sa_in6 = (sockaddr_in6*)pUnicast->Address.lpSockaddr; - - ByteUnion temp; - uint16 arr[8]; - - for (int i = 0; i < 8; ++i) - { - MACAddressHelpers::split (sa_in6, i * 2, temp.split); - arr[i] = temp.combined; - } - - IPAddress ip (arr); - result.addIfNotAlreadyThere (ip); - } - } - - PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = nullptr; - for (pAnycast = adapter->FirstAnycastAddress; pAnycast != nullptr; pAnycast = pAnycast->Next) - { - if (pAnycast->Address.lpSockaddr->sa_family == AF_INET) - { - const sockaddr_in* sa_in = (sockaddr_in*)pAnycast->Address.lpSockaddr; - IPAddress ip ((uint8*)&sa_in->sin_addr.s_addr, false); - result.addIfNotAlreadyThere (ip); - } - else if (pAnycast->Address.lpSockaddr->sa_family == AF_INET6 && includeIPv6) - { - const sockaddr_in6* sa_in6 = (sockaddr_in6*)pAnycast->Address.lpSockaddr; - - ByteUnion temp; - uint16 arr[8]; - - for (int i = 0; i < 8; ++i) - { - MACAddressHelpers::split (sa_in6, i * 2, temp.split); - arr[i] = temp.combined; - } - - IPAddress ip (arr); - result.addIfNotAlreadyThere (ip); - } - } - - PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = nullptr; - for (pMulticast = adapter->FirstMulticastAddress; pMulticast != nullptr; pMulticast = pMulticast->Next) - { - if (pMulticast->Address.lpSockaddr->sa_family == AF_INET) - { - const sockaddr_in* sa_in = (sockaddr_in*)pMulticast->Address.lpSockaddr; - IPAddress ip ((uint8*)&sa_in->sin_addr.s_addr, false); - result.addIfNotAlreadyThere (ip); - } - else if (pMulticast->Address.lpSockaddr->sa_family == AF_INET6 && includeIPv6) - { - const sockaddr_in6* sa_in6 = (sockaddr_in6*)pMulticast->Address.lpSockaddr; - - ByteUnion temp; - uint16 arr[8]; - - for (int i = 0; i < 8; ++i) - { - MACAddressHelpers::split (sa_in6, i * 2, temp.split); - arr[i] = temp.combined; - } - - IPAddress ip (arr); - result.addIfNotAlreadyThere (ip); - } - } + MACAddressHelpers::findAddresses (result, includeIPv6, adapter->FirstUnicastAddress); + MACAddressHelpers::findAddresses (result, includeIPv6, adapter->FirstAnycastAddress); + MACAddressHelpers::findAddresses (result, includeIPv6, adapter->FirstMulticastAddress); } } } @@ -621,7 +576,7 @@ void IPAddress::findAllAddresses (Array& result, bool includeIPv6) IPAddress IPAddress::getInterfaceBroadcastAddress (const IPAddress&) { // TODO - return IPAddress {}; + return {}; }