Variant.cpp 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. //
  2. // Urho3D Engine
  3. // Copyright (c) 2008-2011 Lasse Öörni
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy
  6. // of this software and associated documentation files (the "Software"), to deal
  7. // in the Software without restriction, including without limitation the rights
  8. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the Software is
  10. // furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. // THE SOFTWARE.
  22. //
  23. #include "Precompiled.h"
  24. #include "Deserializer.h"
  25. #include "Exception.h"
  26. #include "Log.h"
  27. #include "Serializer.h"
  28. #include "StringUtils.h"
  29. #include <cstring>
  30. #include "DebugNew.h"
  31. void Variant::fromString(const std::string& type, const std::string& value)
  32. {
  33. std::string typeLower = toLower(type);
  34. if (typeLower == "none")
  35. mType = VAR_NONE;
  36. else if (typeLower == "int")
  37. *this = toInt(value);
  38. else if (typeLower == "bool")
  39. *this = toBool(value);
  40. else if (typeLower == "float")
  41. *this = toFloat(value);
  42. else if (typeLower == "vector2")
  43. *this = toVector2(value);
  44. else if (typeLower == "vector3")
  45. *this = toVector3(value);
  46. else if (typeLower == "vector4")
  47. *this = toVector4(value);
  48. else if (typeLower == "quaternion")
  49. *this = toQuaternion(value);
  50. else if (typeLower == "color")
  51. *this = toColor(value);
  52. else if (typeLower == "string")
  53. *this = value;
  54. else if (typeLower == "buffer")
  55. {
  56. std::vector<std::string> values = split(value, ' ');
  57. std::vector<unsigned char> buffer;
  58. for (std::vector<std::string>::const_iterator i = values.begin(); i != values.end(); ++i)
  59. buffer.push_back(toInt(*i));
  60. *this = buffer;
  61. }
  62. else if (typeLower == "pointer")
  63. {
  64. LOGWARNING("Deserialized pointer Variant set to null");
  65. *this = (void*)0;
  66. }
  67. else
  68. clear();
  69. }
  70. void Variant::write(Serializer& dest) const
  71. {
  72. dest.writeUByte(mType);
  73. switch (mType)
  74. {
  75. case VAR_NONE:
  76. break;
  77. case VAR_INT:
  78. dest.writeInt(mValue.mInt);
  79. break;
  80. case VAR_BOOL:
  81. dest.writeBool(mValue.mBool);
  82. break;
  83. case VAR_FLOAT:
  84. dest.writeFloat(mValue.mFloat);
  85. break;
  86. case VAR_VECTOR2:
  87. dest.writeVector2(*(reinterpret_cast<const Vector2*>(&mValue.mVector4)));
  88. break;
  89. case VAR_VECTOR3:
  90. dest.writeVector3(*(reinterpret_cast<const Vector3*>(&mValue.mVector4)));
  91. break;
  92. case VAR_VECTOR4:
  93. dest.writeVector4(mValue.mVector4);
  94. break;
  95. case VAR_QUATERNION:
  96. dest.writeQuaternion(*(reinterpret_cast<const Quaternion*>(&mValue.mVector4)));
  97. break;
  98. case VAR_COLOR:
  99. dest.writeColor(*(reinterpret_cast<const Color*>(&mValue.mVector4)));
  100. break;
  101. case VAR_STRING:
  102. dest.writeString(mValue.mString);
  103. break;
  104. case VAR_BUFFER:
  105. dest.writeVLE(mValue.mBuffer.size());
  106. if (mValue.mBuffer.size())
  107. dest.write(&mValue.mBuffer[0], mValue.mBuffer.size());
  108. break;
  109. case VAR_PTR:
  110. LOGWARNING("Serialized pointer Variant set to null");
  111. dest.writeUInt(0);
  112. break;
  113. }
  114. }
  115. void Variant::read(Deserializer& source)
  116. {
  117. mType = (VariantType)source.readUByte();
  118. switch (mType)
  119. {
  120. case VAR_NONE:
  121. break;
  122. case VAR_INT:
  123. mValue.mInt = source.readInt();
  124. break;
  125. case VAR_BOOL:
  126. mValue.mBool = source.readBool();
  127. break;
  128. case VAR_FLOAT:
  129. mValue.mFloat = source.readFloat();
  130. break;
  131. case VAR_VECTOR2:
  132. *(reinterpret_cast<Vector2*>(&mValue.mVector4)) = source.readVector2();
  133. break;
  134. case VAR_VECTOR3:
  135. *(reinterpret_cast<Vector3*>(&mValue.mVector4)) = source.readVector3();
  136. break;
  137. case VAR_VECTOR4:
  138. mValue.mVector4 = source.readVector4();
  139. break;
  140. case VAR_QUATERNION:
  141. *(reinterpret_cast<Quaternion*>(&mValue.mVector4)) = source.readQuaternion();
  142. break;
  143. case VAR_COLOR:
  144. *(reinterpret_cast<Color*>(&mValue.mVector4)) = source.readColor();
  145. break;
  146. case VAR_STRING:
  147. mValue.mString = source.readString();
  148. break;
  149. case VAR_BUFFER:
  150. mValue.mBuffer.resize(source.readVLE());
  151. if (mValue.mBuffer.size())
  152. source.read(&mValue.mBuffer[0], mValue.mBuffer.size());
  153. break;
  154. case VAR_PTR:
  155. LOGWARNING("Deserialized pointer Variant set to null");
  156. source.readUInt();
  157. mValue.mPtr = 0;
  158. break;
  159. default:
  160. SAFE_EXCEPTION("Unrecognized Variant type " + ::toString((int)mType));
  161. }
  162. }
  163. void Variant::setBuffer(const void* data, unsigned size)
  164. {
  165. if ((size) && (!data))
  166. SAFE_EXCEPTION("Null Variant buffer source");
  167. mType = VAR_BUFFER;
  168. mValue.mBuffer.resize(size);
  169. if (size)
  170. memcpy(&mValue.mBuffer[0], data, size);
  171. }
  172. const std::string& Variant::getTypeName() const
  173. {
  174. static const std::string typeNames[] =
  175. {
  176. "None",
  177. "Int",
  178. "Bool",
  179. "Float",
  180. "Vector2",
  181. "Vector3",
  182. "Vector4",
  183. "Quaternion",
  184. "Color",
  185. "String",
  186. "Buffer",
  187. "Pointer"
  188. };
  189. return typeNames[mType];
  190. }
  191. std::string Variant::toString() const
  192. {
  193. switch (mType)
  194. {
  195. case VAR_INT:
  196. return ::toString(mValue.mInt);
  197. case VAR_BOOL:
  198. return ::toString(mValue.mBool);
  199. case VAR_FLOAT:
  200. return ::toString(mValue.mFloat);
  201. case VAR_VECTOR2:
  202. return ::toString(*(reinterpret_cast<const Vector2*>(&mValue.mVector4)));
  203. case VAR_VECTOR3:
  204. return ::toString(*(reinterpret_cast<const Vector3*>(&mValue.mVector4)));
  205. case VAR_VECTOR4:
  206. return ::toString(mValue.mVector4);
  207. case VAR_QUATERNION:
  208. return ::toString(*(reinterpret_cast<const Quaternion*>(&mValue.mVector4)));
  209. case VAR_COLOR:
  210. return ::toString(*(reinterpret_cast<const Color*>(&mValue.mVector4)));
  211. case VAR_STRING:
  212. return mValue.mString;
  213. case VAR_BUFFER:
  214. {
  215. std::string ret;
  216. for (std::vector<unsigned char>::const_iterator i = mValue.mBuffer.begin(); i != mValue.mBuffer.end(); ++i)
  217. ret += ::toString(*i) + " ";
  218. return ret;
  219. }
  220. case VAR_PTR:
  221. LOGWARNING("Serialized pointer Variant set to null");
  222. return ::toString((unsigned)0);
  223. }
  224. return std::string();
  225. }