windows-nt/Source/XPSP1/NT/inetsrv/iis/ui/admin/comprop/ipaddres.cpp
2020-09-26 16:20:57 +08:00

132 lines
2.5 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corp., 1995 **/
/**********************************************************************/
/*
FILE HISTORY:
*/
#define OEMRESOURCE
#include "stdafx.h"
#include <stdlib.h>
#include <memory.h>
#include <ctype.h>
#include <winsock.h>
#include "comprop.h"
#include "objplus.h"
#include "ipaddres.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
// CAVEAT: The functions herein require the winsock lib.
// Constructor
CIpAddress::CIpAddress (const CString & str)
{
CHAR szString [ MAX_PATH ] = {0};
if (IsValidIp(str))
{
#ifdef UNICODE
::WideCharToMultiByte(CP_ACP, 0, str, -1, szString, sizeof(szString), NULL, NULL);
#else
strcpy (szString, str, str.GetLength());
#endif
ULONG ul = ::inet_addr( szString );
m_fInitOk = (ul != INADDR_NONE);
// Convert the string to network byte order, then to host byte order.
if (m_fInitOk)
{
m_lIpAddress = (LONG)::ntohl(ul) ;
}
}
else
{
m_fInitOk = FALSE;
m_lIpAddress = 0;
}
}
// Assignment operator
const CIpAddress & CIpAddress::operator =(const LONG l)
{
m_lIpAddress = l;
m_fInitOk = TRUE;
return (*this);
}
// Assignment operator
const CIpAddress & CIpAddress::operator =(const CString & str)
{
CHAR szString [ MAX_PATH ] = {0};
if (IsValidIp(str))
{
#ifdef UNICODE
::WideCharToMultiByte(CP_ACP, 0, str, -1, szString, sizeof(szString), NULL, NULL);
#else
strcpy (szString, str, str.GetLength());
#endif
ULONG ul = ::inet_addr( szString );
m_fInitOk = (ul != INADDR_NONE);
// Convert the string to network byte order, then to host byte order.
if (m_fInitOk)
{
m_lIpAddress = (LONG)::ntohl(ul) ;
}
}
else
{
m_fInitOk = FALSE;
m_lIpAddress = 0;
}
return(*this);
}
BOOL
CIpAddress::IsValidIp(const CString & str)
{
BOOL fValid = TRUE;
for (int i = 0; i < str.GetLength(); i++)
{
if (str[i] != '.' &&
!iswdigit(str[i]))
{
fValid = FALSE;
break;
}
}
return fValid;
}
// Conversion operator
CIpAddress::operator const CString&() const
{
struct in_addr ipaddr ;
static CString strAddr;
// Convert the unsigned long to network byte order
ipaddr.s_addr = ::htonl( (u_long) m_lIpAddress ) ;
// Convert the IP address value to a string
strAddr = inet_ntoa( ipaddr ) ;
return(strAddr);
}