X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin4_src%2FCommon%2Fserialisation.cpp;h=f23d5cd8d09061310a484c195d1deb1c8de2da63;hb=145dd00e5c5a36f844be327e16a00b2983245423;hp=8dad5d3348eaad4949e937ed072c8c801b48266a;hpb=8ae0b1147e613573a45fcd8e6f2f6af2aeff54ac;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin4_src/Common/serialisation.cpp b/Usermode/Applications/axwin4_src/Common/serialisation.cpp index 8dad5d33..f23d5cd8 100644 --- a/Usermode/Applications/axwin4_src/Common/serialisation.cpp +++ b/Usermode/Applications/axwin4_src/Common/serialisation.cpp @@ -8,36 +8,43 @@ #include #include #include +#include // SysDebug namespace AxWin { -CDeserialiser::CDeserialiser(size_t Length, const uint8_t *Buffer): - m_length(Length), - m_data(Buffer), +CDeserialiser::CDeserialiser(const ::std::vector& vector): + m_vect(vector), m_offset(0) { } +CDeserialiser::CDeserialiser(::std::vector&& vector): + m_vect(vector), + m_offset(0) +{ +} +CDeserialiser& CDeserialiser::operator=(const CDeserialiser& x) +{ + m_vect = x.m_vect; + m_offset = x.m_offset; +} bool CDeserialiser::IsConsumed() const { - return m_offset == m_length; + return m_offset == m_vect.size(); } ::uint8_t CDeserialiser::ReadU8() { - if( m_offset + 1 >= m_length ) - throw ::std::out_of_range("CDeserialiser::ReadU8"); - uint8_t rv = m_data[m_offset]; + RangeCheck("CDeserialiser::ReadU8", 1); + uint8_t rv = m_vect[m_offset]; m_offset ++; return rv; } ::uint16_t CDeserialiser::ReadU16() { - if( m_offset + 2 >= m_length ) - throw ::std::out_of_range("CDeserialiser::ReadU16"); - - uint16_t rv = m_data[m_offset] | ((uint16_t)m_data[m_offset+1] << 8); + RangeCheck("CDeserialiser::ReadU16", 2); + uint16_t rv = m_vect[m_offset] | ((uint16_t)m_vect[m_offset+1] << 8); m_offset += 2; return rv; } @@ -51,21 +58,36 @@ bool CDeserialiser::IsConsumed() const return ~rv_u + 1; } -const ::std::string CDeserialiser::ReadString() +const ::std::vector CDeserialiser::ReadBuffer() { - if( m_offset + 1 >= m_length ) - throw ::std::out_of_range("CDeserialiser::ReadString"); - uint8_t len = m_data[m_offset]; - m_offset ++; + RangeCheck("CDeserialiser::ReadBuffer(len)", 2); + size_t size = ReadU16(); - if( m_offset + len >= m_length ) - throw ::std::out_of_range("CDeserialiser::ReadString"); + auto range_start = m_vect.begin() + int(m_offset); + ::std::vector ret( range_start, range_start + int(size) ); + m_offset += size; + return ret; +} + +const ::std::string CDeserialiser::ReadString() +{ + RangeCheck("CDeserialiser::ReadString(len)", 1); + uint8_t len = ReadU8(); - ::std::string ret( reinterpret_cast(m_data+m_offset), len ); + RangeCheck("CDeserialiser::ReadString(data)", len); + ::std::string ret( reinterpret_cast(m_vect.data()+m_offset), len ); m_offset += len; return ret; } +void CDeserialiser::RangeCheck(const char *Method, size_t bytes) throw(::std::out_of_range) +{ + if( m_offset + bytes > m_vect.size() ) { + ::_SysDebug("%s - out of range %i+%i >= %i", Method, m_offset, bytes, m_vect.size()); + throw ::std::out_of_range(Method); + } +} + CSerialiser::CSerialiser() { }