mirror of https://github.com/infosecn1nja/C3.git
99 lines
4.9 KiB
C++
99 lines
4.9 KiB
C++
#include "StdAfx.h"
|
|
#include "RouteId.h"
|
|
#include "Common/MWR/CppTools/ByteView.h"
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
const MWR::C3::RouteId MWR::C3::RouteId::Null{ AgentId::Null, DeviceId::Null };
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
constexpr MWR::C3::RouteId::RouteId(AgentId aid, DeviceId iid)
|
|
: m_AgentId(std::move(aid))
|
|
, m_InterfaceId(std::move(iid))
|
|
{
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
MWR::C3::RouteId MWR::C3::RouteId::FromString(std::string_view textId) noexcept(false)
|
|
{
|
|
return { AgentId{ textId.substr(0, AgentId::TextSize) }, DeviceId{ textId.substr(AgentId::TextSize + 1) } }; // +1 for separator
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
MWR::C3::RouteId MWR::C3::RouteId::FromByteView(ByteView byteId)
|
|
{
|
|
return { AgentId{ byteId.SubString(0, AgentId::BinarySize) }, DeviceId{ byteId.SubString(AgentId::BinarySize, DeviceId::BinarySize) } };
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
MWR::C3::RouteId MWR::C3::RouteId::GenerateRandom()
|
|
{
|
|
return { AgentId::GenerateRandom(), DeviceId::GenerateRandom() };
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
std::string MWR::C3::RouteId::ToString() const
|
|
{
|
|
return m_AgentId.ToString() + OBF(":") + m_InterfaceId.ToString();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
MWR::ByteVector MWR::C3::RouteId::ToByteVector() const
|
|
{
|
|
// Allocate return vector.
|
|
MWR::ByteVector retByteVector;
|
|
retByteVector.reserve(m_AgentId.BinarySize + m_InterfaceId.BinarySize);
|
|
|
|
// Fill it with aid and iid.
|
|
auto aid = m_AgentId.ToByteVector(), iid = m_InterfaceId.ToByteVector();
|
|
retByteVector.insert(retByteVector.end(), aid.begin(), aid.end());
|
|
retByteVector.insert(retByteVector.end(), iid.begin(), iid.end());
|
|
|
|
// That's it.
|
|
return retByteVector;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
MWR::ByteArray<MWR::C3::RouteId::BinarySize> MWR::C3::RouteId::ToByteArray() const
|
|
{
|
|
MWR::ByteArray<BinarySize> retArray;
|
|
|
|
// Fill it with aid and iid.
|
|
auto aid = m_AgentId.ToByteVector(), iid = m_InterfaceId.ToByteVector();
|
|
memcpy(retArray.data(), aid.data(), m_AgentId.BinarySize);
|
|
memcpy(retArray.data() + m_AgentId.BinarySize, iid.data(), m_InterfaceId.BinarySize);
|
|
// That's it.
|
|
return retArray;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
bool MWR::C3::RouteId::operator!() const
|
|
{
|
|
return IsNull();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
bool MWR::C3::RouteId::operator==(RouteId const& c) const
|
|
{
|
|
return c.m_AgentId == m_AgentId and m_InterfaceId == c.m_InterfaceId;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
bool MWR::C3::RouteId::operator!=(RouteId const& c) const
|
|
{
|
|
return !operator == (c);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
bool MWR::C3::RouteId::operator<(RouteId const& c) const
|
|
{
|
|
return m_AgentId < c.m_AgentId or (m_AgentId == c.m_AgentId and m_InterfaceId < c.m_InterfaceId);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
bool MWR::C3::RouteId::IsNull() const
|
|
{
|
|
return m_AgentId != 0 and m_InterfaceId != 0;
|
|
}
|