Mercurial > projects > hoofbaby
diff deps/Platinum/ThirdParty/Neptune/Source/Core/NptNetwork.cpp @ 0:3425707ddbf6
Initial import (hopefully this mercurial stuff works...)
author | fraserofthenight |
---|---|
date | Mon, 06 Jul 2009 08:06:28 -0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/deps/Platinum/ThirdParty/Neptune/Source/Core/NptNetwork.cpp Mon Jul 06 08:06:28 2009 -0700 @@ -0,0 +1,247 @@ +/***************************************************************** +| +| Neptune - Network +| +| Copyright (c) 2002-2008, Axiomatic Systems, LLC. +| All rights reserved. +| +| Redistribution and use in source and binary forms, with or without +| modification, are permitted provided that the following conditions are met: +| * Redistributions of source code must retain the above copyright +| notice, this list of conditions and the following disclaimer. +| * Redistributions in binary form must reproduce the above copyright +| notice, this list of conditions and the following disclaimer in the +| documentation and/or other materials provided with the distribution. +| * Neither the name of Axiomatic Systems nor the +| names of its contributors may be used to endorse or promote products +| derived from this software without specific prior written permission. +| +| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY +| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY +| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +| + ****************************************************************/ + +/*---------------------------------------------------------------------- +| includes ++---------------------------------------------------------------------*/ +#include "NptSockets.h" +#include "NptUtils.h" + +/*---------------------------------------------------------------------- +| NPT_IpAddress::Any ++---------------------------------------------------------------------*/ +const NPT_IpAddress NPT_IpAddress::Any; + +/*---------------------------------------------------------------------- +| NPT_IpAddress::NPT_IpAddress ++---------------------------------------------------------------------*/ +NPT_IpAddress::NPT_IpAddress() +{ + m_Address[0] = m_Address[1] = m_Address[2] = m_Address[3] = 0; +} + +/*---------------------------------------------------------------------- +| NPT_IpAddress::NPT_IpAddress ++---------------------------------------------------------------------*/ +NPT_IpAddress::NPT_IpAddress(unsigned long address) +{ + Set(address); +} + +/*---------------------------------------------------------------------- +| NPT_IpAddress::Parse ++---------------------------------------------------------------------*/ +NPT_Result +NPT_IpAddress::Parse(const char* name) +{ + // check the name + if (name == NULL) return NPT_ERROR_INVALID_PARAMETERS; + + // clear the address + m_Address[0] = m_Address[1] = m_Address[2] = m_Address[3] = 0; + + // parse + unsigned int fragment; + bool fragment_empty = true; + unsigned char address[4]; + unsigned int accumulator; + for (fragment = 0, accumulator = 0; fragment < 4; ++name) { + if (*name == '\0' || *name == '.') { + // fragment terminator + if (fragment_empty) return NPT_ERROR_INVALID_SYNTAX; + address[fragment++] = accumulator; + if (*name == '\0') break; + accumulator = 0; + fragment_empty = true; + } else if (*name >= '0' && *name <= '9') { + // numerical character + accumulator = accumulator*10 + (*name - '0'); + if (accumulator > 255) return NPT_ERROR_INVALID_SYNTAX; + fragment_empty = false; + } else { + // invalid character + return NPT_ERROR_INVALID_SYNTAX; + } + } + + if (fragment == 4 && *name == '\0' && !fragment_empty) { + m_Address[0] = address[0]; + m_Address[1] = address[1]; + m_Address[2] = address[2]; + m_Address[3] = address[3]; + return NPT_SUCCESS; + } else { + return NPT_ERROR_INVALID_SYNTAX; + } +} + +/*---------------------------------------------------------------------- +| NPT_IpAddress::AsLong ++---------------------------------------------------------------------*/ +unsigned long +NPT_IpAddress::AsLong() const +{ + return + (((unsigned long)m_Address[0])<<24) | + (((unsigned long)m_Address[1])<<16) | + (((unsigned long)m_Address[2])<< 8) | + (((unsigned long)m_Address[3])); +} + +/*---------------------------------------------------------------------- +| NPT_IpAddress::AsBytes ++---------------------------------------------------------------------*/ +const unsigned char* +NPT_IpAddress::AsBytes() const +{ + return m_Address; +} + +/*---------------------------------------------------------------------- +| NPT_IpAddress::ToString ++---------------------------------------------------------------------*/ +NPT_String +NPT_IpAddress::ToString() const +{ + NPT_String address; + address.Reserve(16); + address += NPT_String::FromInteger(m_Address[0]); + address += '.'; + address += NPT_String::FromInteger(m_Address[1]); + address += '.'; + address += NPT_String::FromInteger(m_Address[2]); + address += '.'; + address += NPT_String::FromInteger(m_Address[3]); + + return address; +} + +/*---------------------------------------------------------------------- +| NPT_IpAddress::Set ++---------------------------------------------------------------------*/ +NPT_Result +NPT_IpAddress::Set(const unsigned char bytes[4]) +{ + m_Address[0] = bytes[0]; + m_Address[1] = bytes[1]; + m_Address[2] = bytes[2]; + m_Address[3] = bytes[3]; + + return NPT_SUCCESS; +} + +/*---------------------------------------------------------------------- +| NPT_IpAddress::Set ++---------------------------------------------------------------------*/ +NPT_Result +NPT_IpAddress::Set(unsigned long address) +{ + m_Address[0] = (unsigned char)((address >> 24) & 0xFF); + m_Address[1] = (unsigned char)((address >> 16) & 0xFF); + m_Address[2] = (unsigned char)((address >> 8) & 0xFF); + m_Address[3] = (unsigned char)((address ) & 0xFF); + + return NPT_SUCCESS; +} + +/*---------------------------------------------------------------------- +| NPT_MacAddress::NPT_MacAddress ++---------------------------------------------------------------------*/ +NPT_MacAddress::NPT_MacAddress(Type type, + const unsigned char* address, + unsigned int length) +{ + SetAddress(type, address, length); +} + +/*---------------------------------------------------------------------- +| NPT_MacAddress::SetAddress ++---------------------------------------------------------------------*/ +void +NPT_MacAddress::SetAddress(Type type, + const unsigned char* address, + unsigned int length) +{ + m_Type = type; + if (length > NPT_NETWORK_MAX_MAC_ADDRESS_LENGTH) { + length = NPT_NETWORK_MAX_MAC_ADDRESS_LENGTH; + } + m_Length = length; + for (unsigned int i=0; i<length; i++) { + m_Address[i] = address[i]; + } +} + +/*---------------------------------------------------------------------- +| NPT_MacAddress::ToString ++---------------------------------------------------------------------*/ +NPT_String +NPT_MacAddress::ToString() const +{ + NPT_String result; + + if (m_Length) { + char s[3*NPT_NETWORK_MAX_MAC_ADDRESS_LENGTH]; + const char hex[17] = "0123456789abcdef"; + for (unsigned int i=0; i<m_Length; i++) { + s[i*3 ] = hex[m_Address[i]>>4]; + s[i*3+1] = hex[m_Address[i]&0xf]; + s[i*3+2] = ':'; + } + s[3*m_Length-1] = '\0'; + result = s; + } + + return result; +} + +/*---------------------------------------------------------------------- +| NPT_NetworkInterface::NPT_NetworkInterface ++---------------------------------------------------------------------*/ +NPT_NetworkInterface::NPT_NetworkInterface(const char* name, + const NPT_MacAddress& mac, + NPT_Flags flags) : + m_Name(name), + m_MacAddress(mac), + m_Flags(flags) +{ +} + +/*---------------------------------------------------------------------- +| NPT_NetworkInterface::AddAddress ++---------------------------------------------------------------------*/ +NPT_Result +NPT_NetworkInterface::AddAddress(const NPT_NetworkInterfaceAddress& address) +{ + return m_Addresses.Add(address); +} + +