Browse Source

DRYed some IPAddress code

tags/2021-05-28
jules 6 years ago
parent
commit
7ea87b4bc5
2 changed files with 41 additions and 93 deletions
  1. +5
    -12
      modules/juce_core/native/juce_mac_linux_IPAddress.h
  2. +36
    -81
      modules/juce_core/native/juce_win32_Network.cpp

+ 5
- 12
modules/juce_core/native/juce_mac_linux_IPAddress.h View File

@@ -30,15 +30,9 @@ namespace
if (addr_in == nullptr) if (addr_in == nullptr)
return {}; 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]; uint16 arr[8];
for (int i = 0; i < 8; ++i) // Swap bytes from network to host order for (int i = 0; i < 8; ++i) // Swap bytes from network to host order
@@ -62,8 +56,7 @@ namespace
struct InterfaceInfo struct InterfaceInfo
{ {
IPAddress interfaceAddress;
IPAddress broadcastAddress;
IPAddress interfaceAddress, broadcastAddress;
}; };
bool operator== (const InterfaceInfo& lhs, const InterfaceInfo& rhs) bool operator== (const InterfaceInfo& lhs, const InterfaceInfo& rhs)
@@ -78,8 +71,8 @@ namespace
{ {
if (ifa->ifa_addr->sa_family == AF_INET) 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) if (interfaceAddressInfo->sin_addr.s_addr != INADDR_NONE)
{ {


+ 36
- 81
modules/juce_core/native/juce_win32_Network.cpp View File

@@ -514,6 +514,37 @@ namespace MACAddressHelpers
split[1] = sa_in6->sin6_addr.u.Byte[off]; split[1] = sa_in6->sin6_addr.u.Byte[off];
#endif #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 <typename Type>
static void findAddresses (Array<IPAddress>& 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<MACAddress>& result) void MACAddress::findAllAddresses (Array<MACAddress>& result)
@@ -530,90 +561,14 @@ void IPAddress::findAllAddresses (Array<IPAddress>& result, bool includeIPv6)
result.addIfNotAlreadyThere (IPAddress::local (true)); result.addIfNotAlreadyThere (IPAddress::local (true));
GetAdaptersAddressesHelper addressesHelper; GetAdaptersAddressesHelper addressesHelper;
if (addressesHelper.callGetAdaptersAddresses()) if (addressesHelper.callGetAdaptersAddresses())
{ {
for (PIP_ADAPTER_ADDRESSES adapter = addressesHelper.adaptersAddresses; adapter != nullptr; adapter = adapter->Next) 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<IPAddress>& result, bool includeIPv6)
IPAddress IPAddress::getInterfaceBroadcastAddress (const IPAddress&) IPAddress IPAddress::getInterfaceBroadcastAddress (const IPAddress&)
{ {
// TODO // TODO
return IPAddress {};
return {};
} }


Loading…
Cancel
Save