1 //
2 // Copyright (c) 2008-2017 the Urho3D project.
3 //
4 // Permission is hereby granted, free of charge, to any person obtaining a copy
5 // of this software and associated documentation files (the "Software"), to deal
6 // in the Software without restriction, including without limitation the rights
7 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 // copies of the Software, and to permit persons to whom the Software is
9 // furnished to do so, subject to the following conditions:
10 //
11 // The above copyright notice and this permission notice shall be included in
12 // all copies or substantial portions of the Software.
13 //
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 // THE SOFTWARE.
21 //
22
23 #include "../Precompiled.h"
24
25 #include "../IO/Deserializer.h"
26
27 #include "../DebugNew.h"
28
29 namespace Urho3D
30 {
31
32 static const float invQ = 1.0f / 32767.0f;
33
Deserializer()34 Deserializer::Deserializer() :
35 position_(0),
36 size_(0)
37 {
38 }
39
Deserializer(unsigned size)40 Deserializer::Deserializer(unsigned size) :
41 position_(0),
42 size_(size)
43 {
44 }
45
~Deserializer()46 Deserializer::~Deserializer()
47 {
48 }
49
SeekRelative(int delta)50 unsigned Deserializer::SeekRelative(int delta)
51 {
52 return Seek(GetPosition() + delta);
53 }
54
GetName() const55 const String& Deserializer::GetName() const
56 {
57 return String::EMPTY;
58 }
59
GetChecksum()60 unsigned Deserializer::GetChecksum()
61 {
62 return 0;
63 }
64
ReadInt64()65 long long Deserializer::ReadInt64()
66 {
67 long long ret;
68 Read(&ret, sizeof ret);
69 return ret;
70 }
71
ReadInt()72 int Deserializer::ReadInt()
73 {
74 int ret;
75 Read(&ret, sizeof ret);
76 return ret;
77 }
78
ReadShort()79 short Deserializer::ReadShort()
80 {
81 short ret;
82 Read(&ret, sizeof ret);
83 return ret;
84 }
85
ReadByte()86 signed char Deserializer::ReadByte()
87 {
88 signed char ret;
89 Read(&ret, sizeof ret);
90 return ret;
91 }
92
ReadUInt64()93 unsigned long long Deserializer::ReadUInt64()
94 {
95 unsigned long long ret;
96 Read(&ret, sizeof ret);
97 return ret;
98 }
99
ReadUInt()100 unsigned Deserializer::ReadUInt()
101 {
102 unsigned ret;
103 Read(&ret, sizeof ret);
104 return ret;
105 }
106
ReadUShort()107 unsigned short Deserializer::ReadUShort()
108 {
109 unsigned short ret;
110 Read(&ret, sizeof ret);
111 return ret;
112 }
113
ReadUByte()114 unsigned char Deserializer::ReadUByte()
115 {
116 unsigned char ret;
117 Read(&ret, sizeof ret);
118 return ret;
119 }
120
ReadBool()121 bool Deserializer::ReadBool()
122 {
123 return ReadUByte() != 0;
124 }
125
ReadFloat()126 float Deserializer::ReadFloat()
127 {
128 float ret;
129 Read(&ret, sizeof ret);
130 return ret;
131 }
132
ReadDouble()133 double Deserializer::ReadDouble()
134 {
135 double ret;
136 Read(&ret, sizeof ret);
137 return ret;
138 }
139
ReadIntRect()140 IntRect Deserializer::ReadIntRect()
141 {
142 int data[4];
143 Read(data, sizeof data);
144 return IntRect(data);
145 }
146
ReadIntVector2()147 IntVector2 Deserializer::ReadIntVector2()
148 {
149 int data[2];
150 Read(data, sizeof data);
151 return IntVector2(data);
152 }
153
ReadIntVector3()154 IntVector3 Deserializer::ReadIntVector3()
155 {
156 int data[3];
157 Read(data, sizeof data);
158 return IntVector3(data);
159 }
160
ReadRect()161 Rect Deserializer::ReadRect()
162 {
163 float data[4];
164 Read(data, sizeof data);
165 return Rect(data);
166 }
167
ReadVector2()168 Vector2 Deserializer::ReadVector2()
169 {
170 float data[2];
171 Read(data, sizeof data);
172 return Vector2(data);
173 }
174
ReadVector3()175 Vector3 Deserializer::ReadVector3()
176 {
177 float data[3];
178 Read(data, sizeof data);
179 return Vector3(data);
180 }
181
ReadPackedVector3(float maxAbsCoord)182 Vector3 Deserializer::ReadPackedVector3(float maxAbsCoord)
183 {
184 float invV = maxAbsCoord / 32767.0f;
185 short coords[3];
186 Read(coords, sizeof coords);
187 Vector3 ret(coords[0] * invV, coords[1] * invV, coords[2] * invV);
188 return ret;
189 }
190
ReadVector4()191 Vector4 Deserializer::ReadVector4()
192 {
193 float data[4];
194 Read(data, sizeof data);
195 return Vector4(data);
196 }
197
ReadQuaternion()198 Quaternion Deserializer::ReadQuaternion()
199 {
200 float data[4];
201 Read(data, sizeof data);
202 return Quaternion(data);
203 }
204
ReadPackedQuaternion()205 Quaternion Deserializer::ReadPackedQuaternion()
206 {
207 short coords[4];
208 Read(coords, sizeof coords);
209 Quaternion ret(coords[0] * invQ, coords[1] * invQ, coords[2] * invQ, coords[3] * invQ);
210 ret.Normalize();
211 return ret;
212 }
213
ReadMatrix3()214 Matrix3 Deserializer::ReadMatrix3()
215 {
216 float data[9];
217 Read(data, sizeof data);
218 return Matrix3(data);
219 }
220
ReadMatrix3x4()221 Matrix3x4 Deserializer::ReadMatrix3x4()
222 {
223 float data[12];
224 Read(data, sizeof data);
225 return Matrix3x4(data);
226 }
227
ReadMatrix4()228 Matrix4 Deserializer::ReadMatrix4()
229 {
230 float data[16];
231 Read(data, sizeof data);
232 return Matrix4(data);
233 }
234
ReadColor()235 Color Deserializer::ReadColor()
236 {
237 float data[4];
238 Read(data, sizeof data);
239 return Color(data);
240 }
241
ReadBoundingBox()242 BoundingBox Deserializer::ReadBoundingBox()
243 {
244 float data[6];
245 Read(data, sizeof data);
246 return BoundingBox(Vector3(&data[0]), Vector3(&data[3]));
247 }
248
ReadString()249 String Deserializer::ReadString()
250 {
251 String ret;
252
253 while (!IsEof())
254 {
255 char c = ReadByte();
256 if (!c)
257 break;
258 else
259 ret += c;
260 }
261
262 return ret;
263 }
264
ReadFileID()265 String Deserializer::ReadFileID()
266 {
267 String ret;
268 ret.Resize(4);
269 Read(&ret[0], 4);
270 return ret;
271 }
272
ReadStringHash()273 StringHash Deserializer::ReadStringHash()
274 {
275 return StringHash(ReadUInt());
276 }
277
ReadBuffer()278 PODVector<unsigned char> Deserializer::ReadBuffer()
279 {
280 PODVector<unsigned char> ret(ReadVLE());
281 if (ret.Size())
282 Read(&ret[0], ret.Size());
283 return ret;
284 }
285
ReadResourceRef()286 ResourceRef Deserializer::ReadResourceRef()
287 {
288 ResourceRef ret;
289 ret.type_ = ReadStringHash();
290 ret.name_ = ReadString();
291 return ret;
292 }
293
ReadResourceRefList()294 ResourceRefList Deserializer::ReadResourceRefList()
295 {
296 ResourceRefList ret;
297 ret.type_ = ReadStringHash();
298 ret.names_.Resize(ReadVLE());
299 for (unsigned i = 0; i < ret.names_.Size(); ++i)
300 ret.names_[i] = ReadString();
301 return ret;
302 }
303
ReadVariant()304 Variant Deserializer::ReadVariant()
305 {
306 VariantType type = (VariantType)ReadUByte();
307 return ReadVariant(type);
308 }
309
ReadVariant(VariantType type)310 Variant Deserializer::ReadVariant(VariantType type)
311 {
312 switch (type)
313 {
314 case VAR_INT:
315 return Variant(ReadInt());
316
317 case VAR_INT64:
318 return Variant(ReadInt64());
319
320 case VAR_BOOL:
321 return Variant(ReadBool());
322
323 case VAR_FLOAT:
324 return Variant(ReadFloat());
325
326 case VAR_VECTOR2:
327 return Variant(ReadVector2());
328
329 case VAR_VECTOR3:
330 return Variant(ReadVector3());
331
332 case VAR_VECTOR4:
333 return Variant(ReadVector4());
334
335 case VAR_QUATERNION:
336 return Variant(ReadQuaternion());
337
338 case VAR_COLOR:
339 return Variant(ReadColor());
340
341 case VAR_STRING:
342 return Variant(ReadString());
343
344 case VAR_BUFFER:
345 return Variant(ReadBuffer());
346
347 // Deserializing pointers is not supported. Return null
348 case VAR_VOIDPTR:
349 case VAR_PTR:
350 ReadUInt();
351 return Variant((void*)0);
352
353 case VAR_RESOURCEREF:
354 return Variant(ReadResourceRef());
355
356 case VAR_RESOURCEREFLIST:
357 return Variant(ReadResourceRefList());
358
359 case VAR_VARIANTVECTOR:
360 return Variant(ReadVariantVector());
361
362 case VAR_STRINGVECTOR:
363 return Variant(ReadStringVector());
364
365 case VAR_VARIANTMAP:
366 return Variant(ReadVariantMap());
367
368 case VAR_INTRECT:
369 return Variant(ReadIntRect());
370
371 case VAR_INTVECTOR2:
372 return Variant(ReadIntVector2());
373
374 case VAR_INTVECTOR3:
375 return Variant(ReadIntVector3());
376
377 case VAR_MATRIX3:
378 return Variant(ReadMatrix3());
379
380 case VAR_MATRIX3X4:
381 return Variant(ReadMatrix3x4());
382
383 case VAR_MATRIX4:
384 return Variant(ReadMatrix4());
385
386 case VAR_DOUBLE:
387 return Variant(ReadDouble());
388
389 default:
390 return Variant();
391 }
392 }
393
ReadVariantVector()394 VariantVector Deserializer::ReadVariantVector()
395 {
396 VariantVector ret(ReadVLE());
397 for (unsigned i = 0; i < ret.Size(); ++i)
398 ret[i] = ReadVariant();
399 return ret;
400 }
401
ReadStringVector()402 StringVector Deserializer::ReadStringVector()
403 {
404 StringVector ret(ReadVLE());
405 for (unsigned i = 0; i < ret.Size(); ++i)
406 ret[i] = ReadString();
407 return ret;
408 }
409
ReadVariantMap()410 VariantMap Deserializer::ReadVariantMap()
411 {
412 VariantMap ret;
413 unsigned num = ReadVLE();
414
415 for (unsigned i = 0; i < num; ++i)
416 {
417 StringHash key = ReadStringHash();
418 ret[key] = ReadVariant();
419 }
420
421 return ret;
422 }
423
ReadVLE()424 unsigned Deserializer::ReadVLE()
425 {
426 unsigned ret;
427 unsigned char byte;
428
429 byte = ReadUByte();
430 ret = (unsigned)(byte & 0x7f);
431 if (byte < 0x80)
432 return ret;
433
434 byte = ReadUByte();
435 ret |= ((unsigned)(byte & 0x7f)) << 7;
436 if (byte < 0x80)
437 return ret;
438
439 byte = ReadUByte();
440 ret |= ((unsigned)(byte & 0x7f)) << 14;
441 if (byte < 0x80)
442 return ret;
443
444 byte = ReadUByte();
445 ret |= ((unsigned)byte) << 21;
446 return ret;
447 }
448
ReadNetID()449 unsigned Deserializer::ReadNetID()
450 {
451 unsigned ret = 0;
452 Read(&ret, 3);
453 return ret;
454 }
455
ReadLine()456 String Deserializer::ReadLine()
457 {
458 String ret;
459
460 while (!IsEof())
461 {
462 char c = ReadByte();
463 if (c == 10)
464 break;
465 if (c == 13)
466 {
467 // Peek next char to see if it's 10, and skip it too
468 if (!IsEof())
469 {
470 char next = ReadByte();
471 if (next != 10)
472 Seek(position_ - 1);
473 }
474 break;
475 }
476
477 ret += c;
478 }
479
480 return ret;
481 }
482
483 }
484