| 120 m_writtenLength = 0; |
118 m_writtenLength = 0; |
| 121 } |
119 } |
| 122 |
120 |
| 123 // ------------------------------------------------------------------------------------------------- |
121 // ------------------------------------------------------------------------------------------------- |
| 124 // |
122 // |
| 125 char Bytestream::read_byte (bool* ok) |
123 METHOD |
| 126 { |
124 Bytestream::ensure_read_space (unsigned int bytes) -> void |
| 127 *ok = bytes_left() > 0; |
125 { |
| 128 return *ok ? *m_cursor++ : -1; |
126 if (bytes_left() < bytes) |
| 129 } |
|
| 130 |
|
| 131 // ------------------------------------------------------------------------------------------------- |
|
| 132 // |
|
| 133 short int Bytestream::read_short (bool* ok) |
|
| 134 { |
|
| 135 if (bytes_left() < 2) |
|
| 136 { |
127 { |
| 137 *ok = false; |
128 throw IOError (format ("attempted to read %1 byte(s) past the end of bytestream", |
| 138 return false; |
129 bytes - bytes_left())); |
| 139 } |
130 } |
| 140 |
131 } |
| |
132 |
| |
133 // ------------------------------------------------------------------------------------------------- |
| |
134 // |
| |
135 char Bytestream::read_byte() |
| |
136 { |
| |
137 ensure_read_space (1); |
| |
138 return *m_cursor++; |
| |
139 } |
| |
140 |
| |
141 // ------------------------------------------------------------------------------------------------- |
| |
142 // |
| |
143 short int Bytestream::read_short() |
| |
144 { |
| |
145 ensure_read_space (2); |
| 141 short int result = 0; |
146 short int result = 0; |
| 142 |
147 |
| 143 for (int i = 0; i < 2; ++i) |
148 for (int i = 0; i < 2; ++i) |
| 144 result |= m_cursor[i] << (i * 8); |
149 result |= m_cursor[i] << (i * 8); |
| 145 |
150 |
| 147 return result; |
152 return result; |
| 148 } |
153 } |
| 149 |
154 |
| 150 // ------------------------------------------------------------------------------------------------- |
155 // ------------------------------------------------------------------------------------------------- |
| 151 // |
156 // |
| 152 long int Bytestream::read_long (bool* ok) |
157 long int Bytestream::read_long() |
| 153 { |
158 { |
| 154 if (bytes_left() < 4) |
159 ensure_read_space (4); |
| 155 { |
|
| 156 *ok = false; |
|
| 157 return -1; |
|
| 158 } |
|
| 159 |
|
| 160 long int result = 0; |
160 long int result = 0; |
| 161 |
161 |
| 162 for (int i = 0; i < 4; ++i) |
162 for (int i = 0; i < 4; ++i) |
| 163 result |= m_cursor[i] << (i * 8); |
163 result |= m_cursor[i] << (i * 8); |
| 164 |
164 |
| 166 return result; |
166 return result; |
| 167 } |
167 } |
| 168 |
168 |
| 169 // ------------------------------------------------------------------------------------------------- |
169 // ------------------------------------------------------------------------------------------------- |
| 170 // |
170 // |
| 171 float Bytestream::read_float (bool* ok) |
171 float Bytestream::read_float() |
| 172 { |
172 { |
| 173 int value = read_long (ok); |
173 int value = read_long(); |
| 174 |
|
| 175 if (*ok == false) |
|
| 176 return -1.0f; |
|
| 177 |
|
| 178 return reinterpret_cast<float&> (value); |
174 return reinterpret_cast<float&> (value); |
| 179 } |
175 } |
| 180 |
176 |
| 181 // ------------------------------------------------------------------------------------------------- |
177 // ------------------------------------------------------------------------------------------------- |
| 182 // |
178 // |
| 183 String Bytestream::read_string (bool* ok) |
179 String Bytestream::read_string() |
| 184 { |
180 { |
| 185 // Zandronum sends strings of maximum 2048 characters, though it only |
181 // Zandronum sends strings of maximum 2048 characters, though it only |
| 186 // reads 2047-character long ones so I guess we can follow up and do |
182 // reads 2047-character long ones so I guess we can follow up and do |
| 187 // the same :-) |
183 // the same :-) |
| 188 static char buffer[MAX_NETWORK_STRING]; |
184 static char buffer[MAX_NETWORK_STRING]; |
| 192 |
188 |
| 193 // where's the end of the string? |
189 // where's the end of the string? |
| 194 for (stringEnd = m_cursor; *stringEnd != '\0'; ++stringEnd) |
190 for (stringEnd = m_cursor; *stringEnd != '\0'; ++stringEnd) |
| 195 { |
191 { |
| 196 if (stringEnd == end) |
192 if (stringEnd == end) |
| 197 { |
|
| 198 // past the end of the buffer! Argh! |
193 // past the end of the buffer! Argh! |
| 199 *ok = false; |
194 throw IOError ("unterminated string in packet"); |
| 200 return ""; |
|
| 201 } |
|
| 202 } |
195 } |
| 203 |
196 |
| 204 m_cursor = stringEnd + 1; |
197 m_cursor = stringEnd + 1; |
| 205 unsigned int length = stringEnd - m_cursor; |
198 unsigned int length = stringEnd - m_cursor; |
| 206 |
199 |
| 215 } |
208 } |
| 216 |
209 |
| 217 // ------------------------------------------------------------------------------------------------- |
210 // ------------------------------------------------------------------------------------------------- |
| 218 // |
211 // |
| 219 METHOD |
212 METHOD |
| 220 Bytestream::read (unsigned char* buffer, unsigned long length, bool* ok) -> void |
213 Bytestream::read (unsigned char* buffer, unsigned long length) -> void |
| 221 { |
214 { |
| 222 if (bytes_left() < length) |
215 ensure_read_space (length); |
| 223 { |
|
| 224 *ok = false; |
|
| 225 return; |
|
| 226 } |
|
| 227 |
|
| 228 memcpy (buffer, m_cursor, length); |
216 memcpy (buffer, m_cursor, length); |
| 229 m_cursor += length; |
217 m_cursor += length; |
| 230 } |
218 } |
| 231 |
219 |
| 232 // ------------------------------------------------------------------------------------------------- |
220 // ------------------------------------------------------------------------------------------------- |