diff options
author | spark <spark@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2002-03-08 23:10:17 +0000 |
---|---|---|
committer | spark <spark@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2002-03-08 23:10:17 +0000 |
commit | 59db8e60ac8807e304c8fd1af0ad205cf3165b5d (patch) | |
tree | f4c67ad38bf878875084b9cc376e0064e3467992 | |
parent | 9e2578ef6f372c7348fc91d76bfe843ff607ee06 (diff) | |
download | ATCD-59db8e60ac8807e304c8fd1af0ad205cf3165b5d.tar.gz |
Changed to use Iphlpapi library (standard on WinCE) on WinCE to find IP address instead of searching registry since CE has so many variations on registry settings.
-rw-r--r-- | ace/Sock_Connect.cpp | 115 |
1 files changed, 114 insertions, 1 deletions
diff --git a/ace/Sock_Connect.cpp b/ace/Sock_Connect.cpp index 8d11bdf2621..0079667b330 100644 --- a/ace/Sock_Connect.cpp +++ b/ace/Sock_Connect.cpp @@ -15,6 +15,10 @@ extern "C" { } #endif /* VXWORKS */ +#if defined (ACE_HAS_WINCE) +#include <Iphlpapi.h> +#endif // ACE_HAS_WINCE + #if defined (ACE_HAS_IPV6) # if defined (ACE_HAS_THREADS) # include "ace/Synch.h" @@ -178,7 +182,8 @@ enum ACE_WINDOWS_VERSION { ACE_WINDOWS_IS_WIN98, ACE_WINDOWS_IS_WINME, ACE_WINDOWS_IS_WINNT, - ACE_WINDOWS_IS_WIN2K + ACE_WINDOWS_IS_WIN2K, + ACE_WINDOWS_IS_WINCE }; static ACE_WINDOWS_VERSION @@ -208,6 +213,13 @@ get_windows_version() else if (vinfo.dwMinorVersion == 90) return ACE_WINDOWS_IS_WINME; } + case VER_PLATFORM_WIN32_CE: + if (vinfo.dwMajorVersion >= 3) { + return ACE_WINDOWS_IS_WINCE; + } + else { + return ACE_WINDOWS_IS_UNKNOWN; + } // If no match we fall throu. default: return ACE_WINDOWS_IS_UNKNOWN; @@ -616,6 +628,107 @@ ACE_Sock_Connect::get_ip_interfaces (size_t &count, # else /* ACE_HAS_PHARLAP */ +# if defined (ACE_HAS_WINCE) + + // CE does not support Winsock2 (yet) and has many variations on registry setting. + // Thus, it is better to use GetAdapterInfo defined in iphlpapi.h, which is a + // standard library for CE. iphlpapi.lib should come with the CE SDK and should + // be included in the machine. + // Note: This call is supported only in WinCE 3.0 or later. Also, even though + // "iphlpapi.dll" may not be found in the /Windows directory on some machines, + // it will (must) support iphlpapi API's because it is part of the standard + // library for WinCE. + + IP_ADAPTER_INFO* adapterInfo = 0; + ULONG sz = 0; + DWORD result = ::GetAdaptersInfo(adapterInfo, &sz); + + while (result != ERROR_SUCCESS) + { + switch (result) + { + case ERROR_BUFFER_OVERFLOW: // MUST come here at the first run because sz = 0 + adapterInfo = (PIP_ADAPTER_INFO)(new char[sz]); // I know, I know, this is ugly. + + result = ::GetAdaptersInfo(adapterInfo, &sz); + if (result == ERROR_SUCCESS) { + const char* invalid_IP = "0.0.0.0"; + + // find out how many interfaces are there + { + IP_ADAPTER_INFO* tempAdapterInfo = adapterInfo; + int n_interfaces = 0; + while (tempAdapterInfo != 0) { + IP_ADDR_STRING* addr = &tempAdapterInfo->IpAddressList; + while (addr != 0) { + if (ACE_OS::strcmp(addr->IpAddress.String, invalid_IP) != 0) { + // skip invalid IP address + ++n_interfaces; + } + addr = addr->Next; + } + tempAdapterInfo = tempAdapterInfo->Next; + } + if (n_interfaces == 0) { + ACE_ERROR_RETURN ((LM_ERROR, + ACE_LIB_TEXT ("%p\nACE_Sock_Connect::get_ip_interfaces - ") + ACE_LIB_TEXT ("No adapter found.")), + -1); + } + + ACE_NEW_RETURN (addrs, ACE_INET_Addr[n_interfaces], -2); + } + + // find out valid IP addresses and put them into the addr + while (adapterInfo != 0) { + IP_ADDR_STRING* addr = &adapterInfo->IpAddressList; + while (addr != 0) { + if (ACE_OS::strcmp(addr->IpAddress.String, invalid_IP) != 0) { + addrs[count++] = ACE_INET_Addr((u_short) 0, addr->IpAddress.String); + } + addr = addr->Next; + } + adapterInfo = adapterInfo->Next; + } + } + // if second GetAdaptersInfo call fails, let other cases take care of it + break; + + case ERROR_NOT_SUPPORTED: // OS does not support this method + ACE_ERROR_RETURN ((LM_ERROR, + ACE_LIB_TEXT ("%p\nACE_Sock_Connect::get_ip_interfaces - ") + ACE_LIB_TEXT ("This version of WinCE does not support GetAdapterInfo.")), + -1); + break; + + case ERROR_NO_DATA: // no adapter installed + ACE_ERROR_RETURN ((LM_ERROR, + ACE_LIB_TEXT ("%p\nACE_Sock_Connect::get_ip_interfaces - ") + ACE_LIB_TEXT ("No network adapter installed.")), + -1); + break; + + case ERROR_INVALID_PARAMETER: + ACE_ERROR_RETURN ((LM_ERROR, + ACE_LIB_TEXT ("%p\nACE_Sock_Connect::get_ip_interfaces - ") + ACE_LIB_TEXT ("Invalid parameter.")), + -1); + break; + + default: + ACE_ERROR_RETURN ((LM_ERROR, + ACE_LIB_TEXT ("%p\nACE_Sock_Connect::get_ip_interfaces - ") + ACE_LIB_TEXT ("Adapter info access permission denied.")), + -1); + break; + } + } + + delete [] adapterInfo; + return 0; + +# endif // ACE_HAS_WINCE + // // No Winsock2. // Get interface information from the registry. |