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