8dad5d3348eaad4949e937ed072c8c801b48266a
[tpg/acess2.git] / Usermode / Applications / axwin4_src / Common / serialisation.cpp
1 /*
2  * Acess2 GUI v4
3  * - By John Hodge (thePowersGang) 
4  *
5  * serialisation.cpp
6  * - IPC Serialisation
7  */
8 #include <serialisation.hpp>
9 #include <cstddef>
10 #include <stdexcept>
11
12 namespace AxWin {
13
14 CDeserialiser::CDeserialiser(size_t Length, const uint8_t *Buffer):
15         m_length(Length),
16         m_data(Buffer),
17         m_offset(0)
18 {
19 }
20
21 bool CDeserialiser::IsConsumed() const
22 {
23         return m_offset == m_length;
24 }
25
26 ::uint8_t CDeserialiser::ReadU8()
27 {
28         if( m_offset + 1 >= m_length )
29                 throw ::std::out_of_range("CDeserialiser::ReadU8");
30         uint8_t rv = m_data[m_offset];
31         m_offset ++;
32         return rv;
33 }
34
35 ::uint16_t CDeserialiser::ReadU16()
36 {
37         if( m_offset + 2 >= m_length )
38                 throw ::std::out_of_range("CDeserialiser::ReadU16");
39         
40         uint16_t rv = m_data[m_offset] | ((uint16_t)m_data[m_offset+1] << 8);
41         m_offset += 2;
42         return rv;
43 }
44
45 ::int16_t CDeserialiser::ReadS16()
46 {
47         uint16_t rv_u = ReadU16();
48         if( rv_u < 0x8000 )
49                 return rv_u;
50         else
51                 return ~rv_u + 1;
52 }
53
54 const ::std::string CDeserialiser::ReadString()
55 {
56         if( m_offset + 1 >= m_length )
57                 throw ::std::out_of_range("CDeserialiser::ReadString");
58         uint8_t len = m_data[m_offset];
59         m_offset ++;
60         
61         if( m_offset + len >= m_length )
62                 throw ::std::out_of_range("CDeserialiser::ReadString");
63         
64         ::std::string ret( reinterpret_cast<const char*>(m_data+m_offset), len );
65         m_offset += len;
66         return ret;
67 }
68
69 CSerialiser::CSerialiser()
70 {
71 }
72
73 void CSerialiser::WriteU8(::uint8_t Value)
74 {
75         m_data.push_back(Value);
76 }
77
78 void CSerialiser::WriteU16(::uint16_t Value)
79 {
80         m_data.push_back(Value & 0xFF);
81         m_data.push_back(Value >> 8);
82 }
83
84 void CSerialiser::WriteS16(::int16_t Value)
85 {
86         if( Value < 0 )
87         {
88                 ::uint16_t rawval = 0x10000 - (::int32_t)Value;
89                 WriteU16(rawval);
90         }
91         else
92         {
93                 WriteU16(Value);
94         }
95 }
96
97 void CSerialiser::WriteBuffer(size_t n, const void* val)
98 {
99         const uint8_t*  val8 = static_cast<const uint8_t*>(val);
100         if( n > 0xFFFF )
101                 throw ::std::length_error("CSerialiser::WriteBuffer");
102         m_data.reserve( m_data.size() + 2 + n );
103         WriteU16(n);
104         for( size_t i = 0; i < n; i ++ )
105                 m_data.push_back(val8[i]);
106 }
107
108 void CSerialiser::WriteString(const char* val, size_t n)
109 {
110         if( n > 0xFF )
111                 throw ::std::length_error("CSerialiser::WriteString");
112         m_data.reserve( m_data.size() + 1 + n );
113         WriteU8(n);
114         for( size_t i = 0; i < n; i ++ )
115                 m_data.push_back(val[i]);
116 }
117
118 void CSerialiser::WriteSub(const CSerialiser& val)
119 {
120         // TODO: Append reference to sub-buffer contents
121         m_data.reserve( m_data.size() + val.m_data.size() );
122         for( auto byte : val.m_data )
123                 m_data.push_back( byte );
124 }
125
126 const ::std::vector<uint8_t>& CSerialiser::Compact()
127 {
128         return m_data;
129 }
130
131 };      // namespace AxWin
132

UCC git Repository :: git.ucc.asn.au