#include "stdafx.h"
#include "addr.h"
#include "SelfTest.h"
#include "Exceptions.h"
CAddr::CAddr() :
m_wZone(0),
m_wNet(0),
m_wNode(0),
m_wPoint(0)
{
}
CAddr::CAddr(WORD in_wZone, WORD in_wNet, WORD in_wNode, WORD in_wPoint) :
m_wZone(in_wZone),
m_wNet(in_wNet),
m_wNode(in_wNode),
m_wPoint(in_wPoint)
{
}
CAddr::CAddr(const CAddr & rhs) :
m_wZone(rhs.m_wZone),
m_wNet(rhs.m_wNet),
m_wNode(rhs.m_wNode),
m_wPoint(rhs.m_wPoint)
{
}
CAddr::CAddr(String & strAddr, const CAddr & addrOur)
{
*this = addrOur;
size_t posColon, posSlash, posPoint;
GetPunctuatorsPos(strAddr, posColon, posSlash, posPoint);
// I hate parsing!
if (ValidatePunctuators(posColon, posSlash, posPoint))
{
if (posColon == String::npos &&
posSlash == String::npos &&
posPoint == String::npos)
m_wNode = atoi(strAddr.c_str());
else
if (posColon == String::npos &&
posSlash == String::npos &&
posPoint != String::npos)
m_wPoint = atoi(strAddr.substr(posPoint+1).c_str());
else
{
if (posColon != String::npos)
{
m_wZone = atoi(strAddr.substr(0, posColon).c_str());
m_wNet = atoi(strAddr.substr(posColon+1, posSlash).c_str());
} else
{
String strNet = strAddr.substr(0, posSlash);
if (!strNet.empty())
m_wNet = atoi(strNet.c_str());
}
if (posSlash != String::npos)
m_wNode = atoi(strAddr.substr(posSlash+1, posPoint).c_str());
else
{
if (posColon != String::npos)
m_wNode = 0;
else
m_wNode = atoi(strAddr.substr(0, posPoint).c_str());
}
if (posPoint != String::npos)
m_wPoint = atoi(strAddr.substr(posPoint+1).c_str());
else
m_wPoint = 0;
}
} else
throw CAbstractException(__FUNCTION__, "Bad address");
}
CAddr::CAddr(String & strAddr)
{
InitOurAddress(strAddr);
}
CAddr::CAddr(LPCSTR cszrAddr)
{
String strAddr(cszrAddr);
InitOurAddress(strAddr);
}
CAddr & CAddr::operator=(const CAddr & rhs)
{
m_wZone = rhs.m_wZone;
m_wNet = rhs.m_wNet;
m_wNode = rhs.m_wNode;
m_wPoint = rhs.m_wPoint;
return *this;
}
bool CAddr::operator==(const CAddr & rhs) const
{
return
(rhs.m_wZone == m_wZone) &&
(rhs.m_wNet == m_wNet) &&
(rhs.m_wNode == m_wNode) &&
(rhs.m_wPoint == m_wPoint);
}
bool CAddr::operator!=(const CAddr & rhs) const
{
return !(rhs == *this);
}
// TODO: need to rewrite
bool CAddr::operator<(const CAddr & rhs) const
{
return memcmp(this, &rhs, sizeof CAddr) > 0;
}
void CAddr::GetPunctuatorsPos(String & strAddr, size_t & posColon, size_t & posSlash, size_t & posPoint) const
{
posColon = strAddr.find(':');
posSlash = strAddr.find('/');
posPoint = strAddr.find('.');
}
bool CAddr::ValidatePunctuators(size_t posColon, size_t posSlash, size_t posPoint) const
{
if (posColon != String::npos && posSlash != String::npos)
if (posColon >= posSlash)
return false;
if (posSlash != String::npos && posPoint != String::npos)
if (posSlash >= posPoint)
return false;
if (posColon != String::npos && posPoint != String::npos)
if (posColon >= posPoint)
return false;
return true;
}
void CAddr::InitOurAddress(String & strAddr)
{
size_t posColon, posSlash, posPoint;
GetPunctuatorsPos(strAddr, posColon, posSlash, posPoint);
if (ValidatePunctuators(posColon, posSlash, posPoint) &&
posColon != String::npos && posSlash != String::npos) // only full address acceptable here
{
m_wZone = atoi(strAddr.substr(0, posColon).c_str());
m_wNet = atoi(strAddr.substr(posColon+1, posSlash).c_str());
m_wNode = atoi(strAddr.substr(posSlash+1, posPoint).c_str());
if (posPoint != String::npos)
m_wPoint = atoi(strAddr.substr(posPoint+1).c_str());
else
m_wPoint = 0;
} else
throw CAbstractException(__FUNCTION__, "Bad address");
}
// test class for CAddr
#ifdef _DEBUG
class CSelfTest_CAddr : public CSelfTest
{
public:
CSelfTest_CAddr()
{
if (!IsTested())
TestItself();
}
private:
virtual void TestItself()
{
SetTested();
CAddr my("2:5011/92.0");
String strSomeAddr("2:5020/52.32557");
CAddr someaddr1(strSomeAddr, my);
if (someaddr1 != CAddr(2, 5020, 52, 32557))
throw CAbstractException(__FUNCTION__, "Bad address");
strSomeAddr = "/13";
CAddr someaddr2(strSomeAddr, my);
if (someaddr2 != CAddr(2, 5011, 13, 0))
throw CAbstractException(__FUNCTION__, "Bad address");
strSomeAddr = "36";
CAddr someaddr3(strSomeAddr, my);
if (someaddr3 != CAddr(2, 5011, 36, 0))
throw CAbstractException(__FUNCTION__, "Bad address");
strSomeAddr = ".7";
CAddr someaddr4(strSomeAddr, my);
if (someaddr4 != CAddr(2, 5011, 92, 7))
throw CAbstractException(__FUNCTION__, "Bad address");
strSomeAddr = "5020/52";
CAddr someaddr5(strSomeAddr, my);
if (someaddr5 != CAddr(2, 5020, 52, 0))
throw CAbstractException(__FUNCTION__, "Bad address");
strSomeAddr = "1:709/15.36";
CAddr someaddr6(strSomeAddr, my);
if (someaddr6 != CAddr(1, 709, 15, 36))
throw CAbstractException(__FUNCTION__, "Bad address");
strSomeAddr = "1:709";
CAddr someaddr7(strSomeAddr, my);
if (someaddr7 != CAddr(1, 709, 0, 0))
throw CAbstractException(__FUNCTION__, "Bad address");
}
};
CSelfTest_CAddr test_CAddr;
#endif