Variant.h 89 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075
  1. //
  2. // Notice Regarding Standards. AMD does not provide a license or sublicense to
  3. // any Intellectual Property Rights relating to any standards, including but not
  4. // limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4;
  5. // AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3
  6. // (collectively, the "Media Technologies"). For clarity, you will pay any
  7. // royalties due for such third party technologies, which may include the Media
  8. // Technologies that are owed as a result of AMD providing the Software to you.
  9. //
  10. // MIT license
  11. //
  12. // Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved.
  13. //
  14. // Permission is hereby granted, free of charge, to any person obtaining a copy
  15. // of this software and associated documentation files (the "Software"), to deal
  16. // in the Software without restriction, including without limitation the rights
  17. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  18. // copies of the Software, and to permit persons to whom the Software is
  19. // furnished to do so, subject to the following conditions:
  20. //
  21. // The above copyright notice and this permission notice shall be included in
  22. // all copies or substantial portions of the Software.
  23. //
  24. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  25. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  26. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  27. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  28. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  29. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  30. // THE SOFTWARE.
  31. //
  32. #ifndef AMF_Variant_h
  33. #define AMF_Variant_h
  34. #pragma once
  35. #if defined(_MSC_VER)
  36. #pragma warning(disable: 4996)
  37. #endif
  38. #include "Interface.h"
  39. #include <locale.h>
  40. #include <wchar.h>
  41. #include <string.h>
  42. #if defined(__cplusplus)
  43. namespace amf
  44. {
  45. #endif
  46. //----------------------------------------------------------------------------------------------
  47. // variant types
  48. //----------------------------------------------------------------------------------------------
  49. typedef enum AMF_VARIANT_TYPE
  50. {
  51. AMF_VARIANT_EMPTY = 0,
  52. AMF_VARIANT_BOOL = 1,
  53. AMF_VARIANT_INT64 = 2,
  54. AMF_VARIANT_DOUBLE = 3,
  55. AMF_VARIANT_RECT = 4,
  56. AMF_VARIANT_SIZE = 5,
  57. AMF_VARIANT_POINT = 6,
  58. AMF_VARIANT_RATE = 7,
  59. AMF_VARIANT_RATIO = 8,
  60. AMF_VARIANT_COLOR = 9,
  61. AMF_VARIANT_STRING = 10, // value is char*
  62. AMF_VARIANT_WSTRING = 11, // value is wchar_t*
  63. AMF_VARIANT_INTERFACE = 12, // value is AMFInterface*
  64. AMF_VARIANT_FLOAT = 13,
  65. AMF_VARIANT_FLOAT_SIZE = 14,
  66. AMF_VARIANT_FLOAT_POINT2D = 15,
  67. AMF_VARIANT_FLOAT_POINT3D = 16,
  68. AMF_VARIANT_FLOAT_VECTOR4D = 17
  69. } AMF_VARIANT_TYPE;
  70. //----------------------------------------------------------------------------------------------
  71. // variant struct
  72. //----------------------------------------------------------------------------------------------
  73. typedef struct AMFVariantStruct
  74. {
  75. AMF_VARIANT_TYPE type;
  76. union
  77. {
  78. amf_bool boolValue;
  79. amf_int64 int64Value;
  80. amf_double doubleValue;
  81. char* stringValue;
  82. wchar_t* wstringValue;
  83. AMFInterface* pInterface;
  84. struct AMFRect rectValue;
  85. struct AMFSize sizeValue;
  86. struct AMFPoint pointValue;
  87. struct AMFRate rateValue;
  88. struct AMFRatio ratioValue;
  89. struct AMFColor colorValue;
  90. amf_float floatValue;
  91. struct AMFFloatSize floatSizeValue;
  92. struct AMFFloatPoint2D floatPoint2DValue;
  93. struct AMFFloatPoint3D floatPoint3DValue;
  94. struct AMFFloatVector4D floatVector4DValue;
  95. };
  96. } AMFVariantStruct;
  97. //----------------------------------------------------------------------------------------------
  98. // variant accessors
  99. //----------------------------------------------------------------------------------------------
  100. static AMF_INLINE AMF_VARIANT_TYPE AMF_STD_CALL AMFVariantGetType(const AMFVariantStruct* _variant) { return (_variant)->type; }
  101. #if defined(__cplusplus)
  102. static AMF_INLINE AMF_VARIANT_TYPE& AMF_STD_CALL AMFVariantGetType(AMFVariantStruct* _variant) { return (_variant)->type; }
  103. #endif
  104. static AMF_INLINE amf_bool AMF_STD_CALL AMFVariantGetBool(const AMFVariantStruct* _variant) { return (_variant)->boolValue; }
  105. static AMF_INLINE amf_int64 AMF_STD_CALL AMFVariantGetInt64(const AMFVariantStruct* _variant) { return (_variant)->int64Value; }
  106. static AMF_INLINE amf_double AMF_STD_CALL AMFVariantGetDouble(const AMFVariantStruct* _variant) { return (_variant)->doubleValue; }
  107. static AMF_INLINE amf_float AMF_STD_CALL AMFVariantGetFloat(const AMFVariantStruct* _variant) { return (_variant)->floatValue; }
  108. static AMF_INLINE const char* AMF_STD_CALL AMFVariantGetString(const AMFVariantStruct* _variant) { return (_variant)->stringValue; }
  109. static AMF_INLINE const wchar_t* AMF_STD_CALL AMFVariantGetWString(const AMFVariantStruct* _variant) { return (_variant)->wstringValue; }
  110. #if defined(__cplusplus)
  111. static AMF_INLINE const AMFInterface* AMF_STD_CALL AMFVariantGetInterface(const AMFVariantStruct* _variant) { return (_variant)->pInterface; }
  112. #endif
  113. static AMF_INLINE AMFInterface* AMF_STD_CALL AMFVariantGetInterface(AMFVariantStruct* _variant) { return (_variant)->pInterface; }
  114. #if defined(__cplusplus)
  115. static AMF_INLINE const AMFRect & AMF_STD_CALL AMFVariantGetRect (const AMFVariantStruct* _variant) { return (_variant)->rectValue; }
  116. static AMF_INLINE const AMFSize & AMF_STD_CALL AMFVariantGetSize (const AMFVariantStruct* _variant) { return (_variant)->sizeValue; }
  117. static AMF_INLINE const AMFPoint& AMF_STD_CALL AMFVariantGetPoint(const AMFVariantStruct* _variant) { return (_variant)->pointValue; }
  118. static AMF_INLINE const AMFFloatSize& AMF_STD_CALL AMFVariantGetFloatSize(const AMFVariantStruct* _variant) { return (_variant)->floatSizeValue; }
  119. static AMF_INLINE const AMFFloatPoint2D& AMF_STD_CALL AMFVariantGetFloatPoint2D(const AMFVariantStruct* _variant) { return (_variant)->floatPoint2DValue; }
  120. static AMF_INLINE const AMFFloatPoint3D& AMF_STD_CALL AMFVariantGetFloatPoint3D(const AMFVariantStruct* _variant) { return (_variant)->floatPoint3DValue; }
  121. static AMF_INLINE const AMFFloatVector4D& AMF_STD_CALL AMFVariantGetFloatVector4D(const AMFVariantStruct* _variant) { return (_variant)->floatVector4DValue; }
  122. static AMF_INLINE const AMFRate & AMF_STD_CALL AMFVariantGetRate (const AMFVariantStruct* _variant) { return (_variant)->rateValue; }
  123. static AMF_INLINE const AMFRatio& AMF_STD_CALL AMFVariantGetRatio(const AMFVariantStruct* _variant) { return (_variant)->ratioValue; }
  124. static AMF_INLINE const AMFColor& AMF_STD_CALL AMFVariantGetColor(const AMFVariantStruct* _variant) { return (_variant)->colorValue; }
  125. #else // #if defined(__cplusplus)
  126. static AMF_INLINE const AMFRect AMF_STD_CALL AMFVariantGetRect (const AMFVariantStruct* _variant) { return (_variant)->rectValue; }
  127. static AMF_INLINE const AMFSize AMF_STD_CALL AMFVariantGetSize (const AMFVariantStruct* _variant) { return (_variant)->sizeValue; }
  128. static AMF_INLINE const AMFPoint AMF_STD_CALL AMFVariantGetPoint(const AMFVariantStruct* _variant) { return (_variant)->pointValue; }
  129. static AMF_INLINE const AMFFloatSize AMF_STD_CALL AMFVariantGetFloatSize(const AMFVariantStruct* _variant) { return (_variant)->floatSizeValue; }
  130. static AMF_INLINE const AMFFloatPoint2D AMF_STD_CALL AMFVariantGetFloatPoint2D(const AMFVariantStruct* _variant) { return (_variant)->floatPoint2DValue; }
  131. static AMF_INLINE const AMFFloatPoint3D AMF_STD_CALL AMFVariantGetFloatPoint3D(const AMFVariantStruct* _variant) { return (_variant)->floatPoint3DValue; }
  132. static AMF_INLINE const AMFFloatVector4D AMF_STD_CALL AMFVariantGetFloatVector4D(const AMFVariantStruct* _variant) { return (_variant)->floatVector4DValue; }
  133. static AMF_INLINE const AMFRate AMF_STD_CALL AMFVariantGetRate (const AMFVariantStruct* _variant) { return (_variant)->rateValue; }
  134. static AMF_INLINE const AMFRatio AMF_STD_CALL AMFVariantGetRatio(const AMFVariantStruct* _variant) { return (_variant)->ratioValue; }
  135. static AMF_INLINE const AMFColor AMF_STD_CALL AMFVariantGetColor(const AMFVariantStruct* _variant) { return (_variant)->colorValue; }
  136. #endif // #if defined(__cplusplus)
  137. #define AMFVariantEmpty(_variant) 0
  138. #define AMFVariantBool(_variant) (_variant)->boolValue
  139. #define AMFVariantInt64(_variant) (_variant)->int64Value
  140. #define AMFVariantDouble(_variant) (_variant)->doubleValue
  141. #define AMFVariantFloat(_variant) (_variant)->floatValue
  142. #define AMFVariantRect(_variant) (_variant)->rectValue
  143. #define AMFVariantSize(_variant) (_variant)->sizeValue
  144. #define AMFVariantPoint(_variant) (_variant)->pointValue
  145. #define AMFVariantFloatSize(_variant) (_variant)->floatSizeValue
  146. #define AMFVariantFloatPoint2D(_variant) (_variant)->floatPoint2DValue
  147. #define AMFVariantFloatPoint3D(_variant) (_variant)->floatPoint3DValue
  148. #define AMFVariantFloatVector4D(_variant) (_variant)->floatVector4DValue
  149. #define AMFVariantRate(_variant) (_variant)->rateValue
  150. #define AMFVariantRatio(_variant) (_variant)->ratioValue
  151. #define AMFVariantColor(_variant) (_variant)->colorValue
  152. #define AMFVariantString(_variant) (_variant)->stringValue
  153. #define AMFVariantWString(_variant) (_variant)->wstringValue
  154. #define AMFVariantInterface(_variant) (_variant)->pInterface
  155. //----------------------------------------------------------------------------------------------
  156. // variant hleper functions
  157. //----------------------------------------------------------------------------------------------
  158. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantInit(AMFVariantStruct* pVariant);
  159. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantClear(AMFVariantStruct* pVariant);
  160. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantCompare(const AMFVariantStruct* pFirst, const AMFVariantStruct* pSecond, amf_bool* equal);
  161. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantCopy(AMFVariantStruct* pDest, const AMFVariantStruct* pSrc);
  162. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignBool(AMFVariantStruct* pDest, amf_bool value);
  163. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignInt64(AMFVariantStruct* pDest, amf_int64 value);
  164. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignDouble(AMFVariantStruct* pDest, amf_double value);
  165. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloat(AMFVariantStruct* pDest, amf_float value);
  166. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignString(AMFVariantStruct* pDest, const char* value);
  167. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignWString(AMFVariantStruct* pDest, const wchar_t* value);
  168. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignInterface(AMFVariantStruct* pDest, AMFInterface* value);
  169. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRect(AMFVariantStruct* pDest, const AMFRect* value);
  170. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignSize(AMFVariantStruct* pDest, const AMFSize* value);
  171. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignPoint(AMFVariantStruct* pDest, const AMFPoint* value);
  172. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatSize(AMFVariantStruct* pDest, const AMFFloatSize* value);
  173. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint2D(AMFVariantStruct* pDest, const AMFFloatPoint2D* value);
  174. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint3D(AMFVariantStruct* pDest, const AMFFloatPoint3D* value);
  175. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatVector4D(AMFVariantStruct* pDest, const AMFFloatVector4D* value);
  176. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRate(AMFVariantStruct* pDest, const AMFRate* value);
  177. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRatio(AMFVariantStruct* pDest, const AMFRatio* value);
  178. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignColor(AMFVariantStruct* pDest, const AMFColor* value);
  179. #if defined(__cplusplus)
  180. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRect(AMFVariantStruct* pDest, const AMFRect& value);
  181. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignSize(AMFVariantStruct* pDest, const AMFSize& value);
  182. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignPoint(AMFVariantStruct* pDest, const AMFPoint& value);
  183. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatSize(AMFVariantStruct* pDest, const AMFFloatSize& value);
  184. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint2D(AMFVariantStruct* pDest, const AMFFloatPoint2D& value);
  185. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint3D(AMFVariantStruct* pDest, const AMFFloatPoint3D& value);
  186. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatVector4D(AMFVariantStruct* pDest, const AMFFloatVector4D& value);
  187. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRate(AMFVariantStruct* pDest, const AMFRate& value);
  188. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRatio(AMFVariantStruct* pDest, const AMFRatio& value);
  189. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignColor(AMFVariantStruct* pDest, const AMFColor& value);
  190. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantChangeType(AMFVariantStruct* pDest, const AMFVariantStruct* pSrc, AMF_VARIANT_TYPE newType);
  191. #endif
  192. static AMF_INLINE char* AMF_CDECL_CALL AMFVariantDuplicateString(const char* from);
  193. static AMF_INLINE void AMF_CDECL_CALL AMFVariantFreeString(char* from);
  194. static AMF_INLINE wchar_t* AMF_CDECL_CALL AMFVariantDuplicateWString(const wchar_t* from);
  195. static AMF_INLINE void AMF_CDECL_CALL AMFVariantFreeWString(wchar_t* from);
  196. #if defined(__cplusplus)
  197. //----------------------------------------------------------------------------------------------
  198. // AMF_INLINE Variant helper class
  199. //----------------------------------------------------------------------------------------------
  200. class AMFVariant : public AMFVariantStruct
  201. {
  202. public:
  203. class String;
  204. class WString;
  205. public:
  206. AMFVariant() { AMFVariantInit(this); }
  207. explicit AMFVariant(const AMFVariantStruct& other) { AMFVariantInit(this); AMFVariantCopy(this, const_cast<AMFVariantStruct*>(&other)); }
  208. explicit AMFVariant(const AMFVariantStruct* pOther);
  209. template<typename T>
  210. explicit AMFVariant(const AMFInterfacePtr_T<T>& pValue);
  211. AMFVariant(const AMFVariant& other) { AMFVariantInit(this); AMFVariantCopy(this, const_cast<AMFVariantStruct*>(static_cast<const AMFVariantStruct*>(&other))); }
  212. explicit AMF_INLINE AMFVariant(amf_bool value) { AMFVariantInit(this); AMFVariantAssignBool(this, value); }
  213. explicit AMF_INLINE AMFVariant(amf_int64 value) { AMFVariantInit(this); AMFVariantAssignInt64(this, value); }
  214. explicit AMF_INLINE AMFVariant(amf_uint64 value) { AMFVariantInit(this); AMFVariantAssignInt64(this, (amf_int64)value); }
  215. explicit AMF_INLINE AMFVariant(amf_int32 value) { AMFVariantInit(this); AMFVariantAssignInt64(this, value); }
  216. explicit AMF_INLINE AMFVariant(amf_uint32 value) { AMFVariantInit(this); AMFVariantAssignInt64(this, value); }
  217. explicit AMF_INLINE AMFVariant(amf_double value) { AMFVariantInit(this); AMFVariantAssignDouble(this, value); }
  218. explicit AMF_INLINE AMFVariant(amf_float value) { AMFVariantInit(this); AMFVariantAssignFloat(this, value); }
  219. explicit AMF_INLINE AMFVariant(const AMFRect & value) { AMFVariantInit(this); AMFVariantAssignRect(this, &value); }
  220. explicit AMF_INLINE AMFVariant(const AMFSize & value) { AMFVariantInit(this); AMFVariantAssignSize(this, &value); }
  221. explicit AMF_INLINE AMFVariant(const AMFPoint& value) { AMFVariantInit(this); AMFVariantAssignPoint(this, &value); }
  222. explicit AMF_INLINE AMFVariant(const AMFFloatSize& value) { AMFVariantInit(this); AMFVariantAssignFloatSize(this, &value); }
  223. explicit AMF_INLINE AMFVariant(const AMFFloatPoint2D& value) { AMFVariantInit(this); AMFVariantAssignFloatPoint2D(this, &value); }
  224. explicit AMF_INLINE AMFVariant(const AMFFloatPoint3D& value) { AMFVariantInit(this); AMFVariantAssignFloatPoint3D(this, &value); }
  225. explicit AMF_INLINE AMFVariant(const AMFFloatVector4D& value) { AMFVariantInit(this); AMFVariantAssignFloatVector4D(this, &value); }
  226. explicit AMF_INLINE AMFVariant(const AMFRate & value) { AMFVariantInit(this); AMFVariantAssignRate(this, &value); }
  227. explicit AMF_INLINE AMFVariant(const AMFRatio& value) { AMFVariantInit(this); AMFVariantAssignRatio(this, &value); }
  228. explicit AMF_INLINE AMFVariant(const AMFColor& value) { AMFVariantInit(this); AMFVariantAssignColor(this, &value); }
  229. explicit AMF_INLINE AMFVariant(const char* value) { AMFVariantInit(this); AMFVariantAssignString(this, value); }
  230. explicit AMF_INLINE AMFVariant(const wchar_t* value) { AMFVariantInit(this); AMFVariantAssignWString(this, value); }
  231. explicit AMF_INLINE AMFVariant(AMFInterface* pValue) { AMFVariantInit(this); AMFVariantAssignInterface(this, pValue); }
  232. ~AMFVariant() { AMFVariantClear(this); }
  233. AMFVariant& operator=(const AMFVariantStruct& other);
  234. AMFVariant& operator=(const AMFVariantStruct* pOther);
  235. AMFVariant& operator=(const AMFVariant& other);
  236. AMFVariant& operator=(amf_bool value) { AMFVariantAssignBool(this, value); return *this;}
  237. AMFVariant& operator=(amf_int64 value) { AMFVariantAssignInt64(this, value); return *this;}
  238. AMFVariant& operator=(amf_uint64 value) { AMFVariantAssignInt64(this, (amf_int64)value); return *this;}
  239. AMFVariant& operator=(amf_int32 value) { AMFVariantAssignInt64(this, value); return *this;}
  240. AMFVariant& operator=(amf_uint32 value) { AMFVariantAssignInt64(this, value); return *this;}
  241. AMFVariant& operator=(amf_double value) { AMFVariantAssignDouble(this, value); return *this;}
  242. AMFVariant& operator=(amf_float value) { AMFVariantAssignFloat(this, value); return *this; }
  243. AMFVariant& operator=(const AMFRect & value) { AMFVariantAssignRect(this, &value); return *this;}
  244. AMFVariant& operator=(const AMFSize & value) { AMFVariantAssignSize(this, &value); return *this;}
  245. AMFVariant& operator=(const AMFPoint& value) { AMFVariantAssignPoint(this, &value); return *this;}
  246. AMFVariant& operator=(const AMFFloatSize& value) { AMFVariantAssignFloatSize(this, &value); return *this; }
  247. AMFVariant& operator=(const AMFFloatPoint2D& value) { AMFVariantAssignFloatPoint2D(this, &value); return *this; }
  248. AMFVariant& operator=(const AMFFloatPoint3D& value) { AMFVariantAssignFloatPoint3D(this, &value); return *this; }
  249. AMFVariant& operator=(const AMFFloatVector4D& value) { AMFVariantAssignFloatVector4D(this, &value); return *this; }
  250. AMFVariant& operator=(const AMFRate & value) { AMFVariantAssignRate(this, &value); return *this;}
  251. AMFVariant& operator=(const AMFRatio& value) { AMFVariantAssignRatio(this, &value); return *this;}
  252. AMFVariant& operator=(const AMFColor& value) { AMFVariantAssignColor(this, &value); return *this;}
  253. AMFVariant& operator=(const char* value) { AMFVariantAssignString(this, value); return *this;}
  254. AMFVariant& operator=(const wchar_t* value) { AMFVariantAssignWString(this, value); return *this;}
  255. AMFVariant& operator=(AMFInterface* value) { AMFVariantAssignInterface(this, value); return *this;}
  256. template<typename T> AMFVariant& operator=(const AMFInterfacePtr_T<T>& value);
  257. operator amf_bool() const { return ToBool(); }
  258. operator amf_int64() const { return ToInt64(); }
  259. operator amf_uint64() const { return ToUInt64(); }
  260. operator amf_int32() const { return ToInt32(); }
  261. operator amf_uint32() const { return ToUInt32(); }
  262. operator amf_double() const { return ToDouble(); }
  263. operator amf_float() const { return ToFloat(); }
  264. operator AMFRect () const { return ToRect (); }
  265. operator AMFSize () const { return ToSize (); }
  266. operator AMFPoint() const { return ToPoint(); }
  267. operator AMFFloatSize() const { return ToFloatSize(); }
  268. operator AMFFloatPoint2D() const { return ToFloatPoint2D(); }
  269. operator AMFFloatPoint3D() const { return ToFloatPoint3D(); }
  270. operator AMFFloatVector4D() const { return ToFloatVector4D(); }
  271. operator AMFRate () const { return ToRate (); }
  272. operator AMFRatio() const { return ToRatio(); }
  273. operator AMFColor() const { return ToColor(); }
  274. operator AMFInterface*() const { return ToInterface(); }
  275. AMF_INLINE amf_bool ToBool() const { return Empty() ? false : GetValue<amf_bool, AMF_VARIANT_BOOL>(AMFVariantGetBool); }
  276. AMF_INLINE amf_int64 ToInt64() const { return Empty() ? 0 : GetValue<amf_int64, AMF_VARIANT_INT64>(AMFVariantGetInt64); }
  277. AMF_INLINE amf_uint64 ToUInt64() const { return Empty() ? 0 : GetValue<amf_uint64, AMF_VARIANT_INT64>(AMFVariantGetInt64); }
  278. AMF_INLINE amf_int32 ToInt32() const { return Empty() ? 0 : GetValue<amf_int32, AMF_VARIANT_INT64>(AMFVariantGetInt64); }
  279. AMF_INLINE amf_uint32 ToUInt32() const { return Empty() ? 0 : GetValue<amf_uint32, AMF_VARIANT_INT64>(AMFVariantGetInt64); }
  280. AMF_INLINE amf_double ToDouble() const { return Empty() ? 0 : GetValue<amf_double, AMF_VARIANT_DOUBLE>(AMFVariantGetDouble); }
  281. AMF_INLINE amf_float ToFloat() const { return Empty() ? 0 : GetValue<amf_float, AMF_VARIANT_FLOAT>(AMFVariantGetFloat); }
  282. AMF_INLINE AMFRect ToRect () const { return Empty() ? AMFRect() : GetValue<AMFRect, AMF_VARIANT_RECT>(AMFVariantGetRect); }
  283. AMF_INLINE AMFSize ToSize () const { return Empty() ? AMFSize() : GetValue<AMFSize, AMF_VARIANT_SIZE>(AMFVariantGetSize); }
  284. AMF_INLINE AMFPoint ToPoint() const { return Empty() ? AMFPoint() : GetValue<AMFPoint, AMF_VARIANT_POINT>(AMFVariantGetPoint); }
  285. AMF_INLINE AMFFloatSize ToFloatSize() const { return Empty() ? AMFFloatSize() : GetValue<AMFFloatSize, AMF_VARIANT_FLOAT_SIZE>(AMFVariantGetFloatSize); }
  286. AMF_INLINE AMFFloatPoint2D ToFloatPoint2D() const { return Empty() ? AMFFloatPoint2D() : GetValue<AMFFloatPoint2D, AMF_VARIANT_FLOAT_POINT2D>(AMFVariantGetFloatPoint2D); }
  287. AMF_INLINE AMFFloatPoint3D ToFloatPoint3D() const { return Empty() ? AMFFloatPoint3D() : GetValue<AMFFloatPoint3D, AMF_VARIANT_FLOAT_POINT3D>(AMFVariantGetFloatPoint3D); }
  288. AMF_INLINE AMFFloatVector4D ToFloatVector4D() const { return Empty() ? AMFFloatVector4D() : GetValue<AMFFloatVector4D, AMF_VARIANT_FLOAT_VECTOR4D>(AMFVariantGetFloatVector4D); }
  289. AMF_INLINE AMFRate ToRate () const { return Empty() ? AMFRate() : GetValue<AMFRate, AMF_VARIANT_RATE>(AMFVariantGetRate); }
  290. AMF_INLINE AMFRatio ToRatio() const { return Empty() ? AMFRatio() : GetValue<AMFRatio, AMF_VARIANT_RATIO>(AMFVariantGetRatio); }
  291. AMF_INLINE AMFColor ToColor() const { return Empty() ? AMFColor() : GetValue<AMFColor, AMF_VARIANT_COLOR>(AMFVariantGetColor); }
  292. AMF_INLINE AMFInterface* ToInterface() const { return AMFVariantGetType(this) == AMF_VARIANT_INTERFACE ? this->pInterface : NULL; }
  293. AMF_INLINE String ToString() const;
  294. AMF_INLINE WString ToWString() const;
  295. bool operator==(const AMFVariantStruct& other) const;
  296. bool operator==(const AMFVariantStruct* pOther) const;
  297. bool operator!=(const AMFVariantStruct& other) const;
  298. bool operator!=(const AMFVariantStruct* pOther) const;
  299. void Clear() { AMFVariantClear(this); }
  300. void Attach(AMFVariantStruct& variant);
  301. AMFVariantStruct Detach();
  302. AMFVariantStruct& GetVariant();
  303. void ChangeType(AMF_VARIANT_TYPE type, const AMFVariant* pSrc = NULL);
  304. bool Empty() const;
  305. private:
  306. template<class ReturnType, AMF_VARIANT_TYPE variantType, typename Getter>
  307. ReturnType GetValue(Getter getter) const;
  308. };
  309. //----------------------------------------------------------------------------------------------
  310. // helper String class
  311. //----------------------------------------------------------------------------------------------
  312. class AMFVariant::String
  313. {
  314. friend class AMFVariant;
  315. private:
  316. void Free()
  317. {
  318. if (m_Str != NULL)
  319. {
  320. AMFVariantFreeString(m_Str);
  321. m_Str = NULL;
  322. }
  323. }
  324. public:
  325. String() :m_Str(NULL){}
  326. String(const char* str) : m_Str(NULL)
  327. {
  328. m_Str = AMFVariantDuplicateString(str);
  329. }
  330. String(const String& p_other) : m_Str(NULL)
  331. {
  332. operator=(p_other);
  333. }
  334. #if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (_MSC_VER >= 1600)
  335. String(String&& p_other) : m_Str(NULL)
  336. {
  337. operator=(p_other);
  338. }
  339. #endif
  340. ~String()
  341. {
  342. Free();
  343. }
  344. char& operator[](size_t index)
  345. {
  346. if (index >= size())
  347. {
  348. resize(index);
  349. }
  350. return m_Str[index];
  351. }
  352. String& operator=(const String& p_other)
  353. {
  354. Free();
  355. m_Str = AMFVariantDuplicateString(p_other.m_Str);
  356. return *this;
  357. }
  358. #if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (_MSC_VER >= 1600)
  359. String& operator=(String&& p_other)
  360. {
  361. Free();
  362. m_Str = p_other.m_Str;
  363. p_other.m_Str = NULL; // Transfer the ownership
  364. return *this;
  365. }
  366. #endif
  367. bool operator==(const String& p_other) const
  368. {
  369. if (m_Str == NULL && p_other.m_Str == NULL)
  370. {
  371. return true;
  372. }
  373. else if ((m_Str == NULL && p_other.m_Str != NULL) || (m_Str != NULL && p_other.m_Str == NULL))
  374. {
  375. return false;
  376. }
  377. return strcmp(c_str(), p_other.c_str()) == 0;
  378. }
  379. const char* c_str() const { return m_Str; }
  380. size_t size() const
  381. {
  382. if(m_Str == NULL)
  383. {
  384. return 0;
  385. }
  386. return (size_t)strlen(m_Str);
  387. }
  388. AMF_INLINE size_t length() const { return size(); }
  389. void resize(size_t sizeAlloc)
  390. {
  391. if(sizeAlloc == 0)
  392. {
  393. Free();
  394. return;
  395. }
  396. char* str = (char*)amf_variant_alloc(sizeof(char)*(sizeAlloc + 1));
  397. if(m_Str != NULL)
  398. {
  399. size_t copySize = sizeAlloc;
  400. if(copySize > size())
  401. {
  402. copySize = size();
  403. }
  404. memcpy(str, m_Str, copySize * sizeof(char));
  405. Free();
  406. str[sizeAlloc] = 0;
  407. }
  408. m_Str = str;
  409. }
  410. private:
  411. char* m_Str;
  412. };
  413. //----------------------------------------------------------------------------------------------
  414. // helper WString class
  415. //----------------------------------------------------------------------------------------------
  416. class AMFVariant::WString
  417. {
  418. friend class AMFVariant;
  419. private:
  420. void Free()
  421. {
  422. if (m_Str != NULL)
  423. {
  424. AMFVariantFreeWString(m_Str);
  425. m_Str = NULL;
  426. }
  427. }
  428. public:
  429. WString() :m_Str(NULL){}
  430. WString(const wchar_t* str) : m_Str(NULL)
  431. {
  432. m_Str = AMFVariantDuplicateWString(str);
  433. }
  434. WString(const WString& p_other) : m_Str(NULL)
  435. {
  436. operator=(p_other);
  437. }
  438. #if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (_MSC_VER >= 1600)
  439. WString(WString&& p_other) : m_Str(NULL)
  440. {
  441. operator=(p_other);
  442. }
  443. #endif
  444. ~WString()
  445. {
  446. Free();
  447. }
  448. WString& operator=(const WString& p_other)
  449. {
  450. Free();
  451. m_Str = AMFVariantDuplicateWString(p_other.m_Str);
  452. return *this;
  453. }
  454. #if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (_MSC_VER >= 1600)
  455. WString& operator=(WString&& p_other)
  456. {
  457. Free();
  458. m_Str = p_other.m_Str;
  459. p_other.m_Str = NULL; // Transfer the ownership
  460. return *this;
  461. }
  462. #endif
  463. wchar_t& operator[](size_t index)
  464. {
  465. if (index >= size())
  466. {
  467. resize(index);
  468. }
  469. return m_Str[index];
  470. }
  471. bool operator==(const WString& p_other) const
  472. {
  473. if (m_Str == NULL && p_other.m_Str == NULL)
  474. {
  475. return true;
  476. }
  477. else if ((m_Str == NULL && p_other.m_Str != NULL) || (m_Str != NULL && p_other.m_Str == NULL))
  478. {
  479. return false;
  480. }
  481. return wcscmp(c_str(), p_other.c_str()) == 0;
  482. }
  483. const wchar_t* c_str() const { return m_Str; }
  484. size_t size() const
  485. {
  486. if(m_Str == NULL)
  487. {
  488. return 0;
  489. }
  490. return (size_t)wcslen(m_Str);
  491. }
  492. AMF_INLINE size_t length() const { return size(); }
  493. void resize(size_t sizeAlloc)
  494. {
  495. if(sizeAlloc == 0)
  496. {
  497. Free();
  498. return;
  499. }
  500. wchar_t* str = (wchar_t*)amf_variant_alloc(sizeof(wchar_t)*(sizeAlloc + 1));
  501. if(m_Str != NULL)
  502. {
  503. size_t copySize = sizeAlloc;
  504. if(copySize > size())
  505. {
  506. copySize = size();
  507. }
  508. memcpy(str, m_Str, copySize * sizeof(wchar_t));
  509. Free();
  510. str[sizeAlloc] = 0;
  511. }
  512. m_Str = str;
  513. }
  514. private:
  515. wchar_t* m_Str;
  516. };
  517. //-------------------------------------------------------------------------------------------------
  518. AMFVariant::String AMFVariant::ToString() const
  519. {
  520. String temp = GetValue<String, AMF_VARIANT_STRING>(AMFVariantGetString);
  521. return String(temp.c_str());
  522. }
  523. //-------------------------------------------------------------------------------------------------
  524. AMFVariant::WString AMFVariant::ToWString() const
  525. {
  526. WString temp = GetValue<WString, AMF_VARIANT_WSTRING>(AMFVariantGetWString);
  527. return WString(temp.c_str());
  528. }
  529. #endif // defined(__cplusplus)
  530. //----------------------------------------------------------------------------------------------
  531. // AMF_INLINE implementation of helper functions
  532. //----------------------------------------------------------------------------------------------
  533. #define AMF_VARIANT_RETURN_IF_INVALID_POINTER(p) \
  534. { \
  535. if(p == NULL) \
  536. { \
  537. return AMF_INVALID_POINTER; \
  538. } \
  539. }
  540. //-------------------------------------------------------------------------------------------------
  541. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantInit(AMFVariantStruct* pVariant)
  542. {
  543. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pVariant);
  544. pVariant->type = AMF_VARIANT_EMPTY;
  545. return AMF_OK;
  546. }
  547. //-------------------------------------------------------------------------------------------------
  548. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantClear(AMFVariantStruct* pVariant)
  549. {
  550. AMF_RESULT errRet = AMF_OK;
  551. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pVariant);
  552. switch(AMFVariantGetType(pVariant))
  553. {
  554. case AMF_VARIANT_STRING:
  555. amf_variant_free(AMFVariantString(pVariant));
  556. pVariant->type = AMF_VARIANT_EMPTY;
  557. break;
  558. case AMF_VARIANT_WSTRING:
  559. amf_variant_free(AMFVariantWString(pVariant));
  560. pVariant->type = AMF_VARIANT_EMPTY;
  561. break;
  562. case AMF_VARIANT_INTERFACE:
  563. if(AMFVariantInterface(pVariant) != NULL)
  564. {
  565. #if defined(__cplusplus)
  566. AMFVariantInterface(pVariant)->Release();
  567. #else
  568. AMFVariantInterface(pVariant)->pVtbl->Release(AMFVariantInterface(pVariant));
  569. #endif
  570. AMFVariantInterface(pVariant) = NULL;
  571. }
  572. pVariant->type = AMF_VARIANT_EMPTY;
  573. break;
  574. default:
  575. pVariant->type = AMF_VARIANT_EMPTY;
  576. break;
  577. }
  578. return errRet;
  579. }
  580. //-------------------------------------------------------------------------------------------------
  581. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantCompare(const AMFVariantStruct* pFirst, const AMFVariantStruct* pSecond, amf_bool* bEqual)
  582. {
  583. AMF_RESULT errRet = AMF_OK;
  584. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pFirst);
  585. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pSecond);
  586. if(pFirst == pSecond)
  587. {
  588. *bEqual = true;
  589. }
  590. else if(AMFVariantGetType(pFirst) != AMFVariantGetType(pSecond))
  591. {
  592. *bEqual = false;
  593. }
  594. else
  595. {
  596. switch(AMFVariantGetType(pFirst))
  597. {
  598. case AMF_VARIANT_EMPTY:
  599. *bEqual = true;
  600. break;
  601. case AMF_VARIANT_BOOL:
  602. *bEqual = AMFVariantGetBool(pFirst) == AMFVariantBool(pSecond);
  603. break;
  604. case AMF_VARIANT_INT64:
  605. *bEqual = AMFVariantGetInt64(pFirst) == AMFVariantInt64(pSecond);
  606. break;
  607. case AMF_VARIANT_DOUBLE:
  608. *bEqual = AMFVariantGetDouble(pFirst) == AMFVariantDouble(pSecond);
  609. break;
  610. case AMF_VARIANT_FLOAT:
  611. *bEqual = AMFVariantGetFloat(pFirst) == AMFVariantFloat(pSecond);
  612. break;
  613. case AMF_VARIANT_RECT:
  614. #if defined(__cplusplus)
  615. *bEqual = AMFVariantGetRect(pFirst) == AMFVariantGetRect(pSecond);
  616. #else
  617. *bEqual = memcmp(&pFirst->rectValue, &pSecond->rectValue, sizeof(AMFRect)) == 0;
  618. #endif
  619. break;
  620. case AMF_VARIANT_SIZE:
  621. #if defined(__cplusplus)
  622. *bEqual = AMFVariantGetSize(pFirst) == AMFVariantGetSize(pSecond);
  623. #else
  624. *bEqual = memcmp(&pFirst->sizeValue, &pSecond->sizeValue, sizeof(AMFSize)) == 0;
  625. #endif
  626. break;
  627. case AMF_VARIANT_POINT:
  628. #if defined(__cplusplus)
  629. *bEqual = AMFVariantGetPoint(pFirst) == AMFVariantGetPoint(pSecond);
  630. #else
  631. *bEqual = memcmp(&pFirst->pointValue, &pSecond->pointValue, sizeof(AMFPoint)) == 0;
  632. #endif
  633. break;
  634. case AMF_VARIANT_FLOAT_SIZE:
  635. #if defined(__cplusplus)
  636. *bEqual = AMFVariantGetFloatSize(pFirst) == AMFVariantGetFloatSize(pSecond);
  637. #else
  638. *bEqual = memcmp(&pFirst->floatSizeValue, &pSecond->floatSizeValue, sizeof(AMFFloatPoint2D)) == 0;
  639. #endif
  640. break;
  641. case AMF_VARIANT_FLOAT_POINT2D:
  642. #if defined(__cplusplus)
  643. *bEqual = AMFVariantGetFloatPoint2D(pFirst) == AMFVariantGetFloatPoint2D(pSecond);
  644. #else
  645. *bEqual = memcmp(&pFirst->floatPoint2DValue, &pSecond->floatPoint2DValue, sizeof(AMFFloatPoint2D)) == 0;
  646. #endif
  647. break;
  648. case AMF_VARIANT_FLOAT_POINT3D:
  649. #if defined(__cplusplus)
  650. *bEqual = AMFVariantGetFloatPoint3D(pFirst) == AMFVariantGetFloatPoint3D(pSecond);
  651. #else
  652. *bEqual = memcmp(&pFirst->floatPoint3DValue, &pSecond->floatPoint3DValue, sizeof(AMFFloatPoint3D)) == 0;
  653. #endif
  654. break;
  655. case AMF_VARIANT_FLOAT_VECTOR4D:
  656. #if defined(__cplusplus)
  657. *bEqual = AMFVariantGetFloatVector4D(pFirst) == AMFVariantGetFloatVector4D(pSecond);
  658. #else
  659. *bEqual = memcmp(&pFirst->floatVector4DValue, &pSecond->floatVector4DValue, sizeof(AMFFloatPoint3D)) == 0;
  660. #endif
  661. break;
  662. case AMF_VARIANT_RATE:
  663. #if defined(__cplusplus)
  664. *bEqual = AMFVariantGetRate(pFirst) == AMFVariantGetRate(pSecond);
  665. #else
  666. *bEqual = memcmp(&pFirst->rateValue, &pSecond->rateValue, sizeof(AMFRate)) == 0;
  667. #endif
  668. break;
  669. case AMF_VARIANT_RATIO:
  670. #if defined(__cplusplus)
  671. *bEqual = AMFVariantGetRatio(pFirst) == AMFVariantGetRatio(pSecond);
  672. #else
  673. *bEqual = memcmp(&pFirst->ratioValue, &pSecond->ratioValue, sizeof(AMFRatio)) == 0;
  674. #endif
  675. break;
  676. case AMF_VARIANT_COLOR:
  677. #if defined(__cplusplus)
  678. *bEqual = AMFVariantGetColor(pFirst) == AMFVariantGetColor(pSecond);
  679. #else
  680. *bEqual = memcmp(&pFirst->colorValue, &pSecond->colorValue, sizeof(AMFColor)) == 0;
  681. #endif
  682. break;
  683. case AMF_VARIANT_STRING:
  684. *bEqual = strcmp(AMFVariantString(pFirst), AMFVariantString(pSecond)) == 0;
  685. break;
  686. case AMF_VARIANT_WSTRING:
  687. *bEqual = wcscmp(AMFVariantWString(pFirst), AMFVariantWString(pSecond)) == 0;
  688. break;
  689. case AMF_VARIANT_INTERFACE:
  690. *bEqual = AMFVariantInterface(pFirst) == AMFVariantInterface(pSecond);
  691. break;
  692. default:
  693. errRet = AMF_INVALID_ARG;
  694. break;
  695. }
  696. }
  697. return errRet;
  698. }
  699. //-------------------------------------------------------------------------------------------------
  700. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantCopy(AMFVariantStruct* pDest, const AMFVariantStruct* pSrc)
  701. {
  702. AMF_RESULT errRet = AMF_OK;
  703. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  704. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pSrc);
  705. if(pDest != pSrc)
  706. {
  707. switch(AMFVariantGetType(pSrc))
  708. {
  709. case AMF_VARIANT_EMPTY:
  710. errRet = AMFVariantClear(pDest);
  711. break;
  712. case AMF_VARIANT_BOOL:
  713. errRet = AMFVariantAssignBool(pDest, AMFVariantBool(pSrc));
  714. break;
  715. case AMF_VARIANT_INT64:
  716. errRet = AMFVariantAssignInt64(pDest, AMFVariantInt64(pSrc));
  717. break;
  718. case AMF_VARIANT_DOUBLE:
  719. errRet = AMFVariantAssignDouble(pDest, AMFVariantDouble(pSrc));
  720. break;
  721. case AMF_VARIANT_FLOAT:
  722. errRet = AMFVariantAssignFloat(pDest, AMFVariantFloat(pSrc));
  723. break;
  724. case AMF_VARIANT_RECT:
  725. errRet = AMFVariantAssignRect(pDest, &pSrc->rectValue);
  726. break;
  727. case AMF_VARIANT_SIZE:
  728. errRet = AMFVariantAssignSize(pDest, &pSrc->sizeValue);
  729. break;
  730. case AMF_VARIANT_POINT:
  731. errRet = AMFVariantAssignPoint(pDest, &pSrc->pointValue);
  732. break;
  733. case AMF_VARIANT_FLOAT_SIZE:
  734. errRet = AMFVariantAssignFloatSize(pDest, &pSrc->floatSizeValue);
  735. break;
  736. case AMF_VARIANT_FLOAT_POINT2D:
  737. errRet = AMFVariantAssignFloatPoint2D(pDest, &pSrc->floatPoint2DValue);
  738. break;
  739. case AMF_VARIANT_FLOAT_POINT3D:
  740. errRet = AMFVariantAssignFloatPoint3D(pDest, &pSrc->floatPoint3DValue);
  741. break;
  742. case AMF_VARIANT_FLOAT_VECTOR4D:
  743. errRet = AMFVariantAssignFloatVector4D(pDest, &pSrc->floatVector4DValue);
  744. break;
  745. case AMF_VARIANT_RATE:
  746. errRet = AMFVariantAssignRate(pDest, &pSrc->rateValue);
  747. break;
  748. case AMF_VARIANT_RATIO:
  749. errRet = AMFVariantAssignRatio(pDest, &pSrc->ratioValue);
  750. break;
  751. case AMF_VARIANT_COLOR:
  752. errRet = AMFVariantAssignColor(pDest, &pSrc->colorValue);
  753. break;
  754. case AMF_VARIANT_STRING:
  755. errRet = AMFVariantAssignString(pDest, AMFVariantString(pSrc));
  756. break;
  757. case AMF_VARIANT_WSTRING:
  758. errRet = AMFVariantAssignWString(pDest, AMFVariantWString(pSrc));
  759. break;
  760. case AMF_VARIANT_INTERFACE:
  761. errRet = AMFVariantAssignInterface(pDest, AMFVariantInterface(pSrc));
  762. break;
  763. default:
  764. errRet = AMF_INVALID_ARG;
  765. break;
  766. }
  767. }
  768. return errRet;
  769. }
  770. #define AMFVariantTypeEmpty AMF_VARIANT_EMPTY
  771. #define AMFVariantTypeBool AMF_VARIANT_BOOL
  772. #define AMFVariantTypeInt64 AMF_VARIANT_INT64
  773. #define AMFVariantTypeDouble AMF_VARIANT_DOUBLE
  774. #define AMFVariantTypeFloat AMF_VARIANT_FLOAT
  775. #define AMFVariantTypeRect AMF_VARIANT_RECT
  776. #define AMFVariantTypeSize AMF_VARIANT_SIZE
  777. #define AMFVariantTypePoint AMF_VARIANT_POINT
  778. #define AMFVariantTypeFloatPoint2D AMF_VARIANT_FLOAT_POINT2D
  779. #define AMFVariantTypeFloatPoint3D AMF_VARIANT_FLOAT_POINT3D
  780. #define AMFVariantTypeFloatVector4D AMF_VARIANT_FLOAT_VECTOR4D
  781. #define AMFVariantTypeRate AMF_VARIANT_RATE
  782. #define AMFVariantTypeRatio AMF_VARIANT_RATIO
  783. #define AMFVariantTypeColor AMF_VARIANT_COLOR
  784. #define AMFVariantTypeString AMF_VARIANT_STRING
  785. #define AMFVariantTypeWString AMF_VARIANT_WSTRING
  786. #define AMFVariantTypeInterface AMF_VARIANT_INTERFACE
  787. #if defined(__cplusplus)
  788. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignString(AMFVariantStruct* pDest, const AMFVariant::String& value)
  789. {
  790. return AMFVariantAssignString(pDest, value.c_str());
  791. }
  792. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignWString(AMFVariantStruct* pDest, const AMFVariant::WString& value)
  793. {
  794. return AMFVariantAssignWString(pDest, value.c_str());
  795. }
  796. static AMF_INLINE amf_bool AMFConvertEmptyToBool(void*, AMF_RESULT& res) { res = AMF_OK; return false; }
  797. static AMF_INLINE amf_int64 AMFConvertEmptyToInt64(void*, AMF_RESULT& res) {res = AMF_OK; return 0; }
  798. static AMF_INLINE amf_double AMFConvertEmptyToDouble(void*, AMF_RESULT& res) {res = AMF_OK; return 0; }
  799. static AMF_INLINE amf_float AMFConvertEmptyToFloat(void*, AMF_RESULT& res) { res = AMF_OK; return 0; }
  800. static AMF_INLINE AMFVariant::String AMFConvertEmptyToString(void*, AMF_RESULT& res) {res = AMF_OK; return ""; }
  801. static AMF_INLINE AMFVariant::WString AMFConvertEmptyToWString(void*, AMF_RESULT& res) {res = AMF_OK; return L""; }
  802. static AMF_INLINE amf_int64 AMFConvertBoolToInt64(bool value, AMF_RESULT& res){res = AMF_OK; return value ? 1 : 0;}
  803. static AMF_INLINE amf_double AMFConvertBoolToDouble(bool value, AMF_RESULT& res){res = AMF_OK; return value ? 1.0 : 0.0;}
  804. static AMF_INLINE amf_float AMFConvertBoolToFloat(bool value, AMF_RESULT& res) { res = AMF_OK; return value ? 1.0f : 0.0f; }
  805. static AMF_INLINE AMFVariant::String AMFConvertBoolToString(bool value, AMF_RESULT& res){res = AMF_OK; return value ? "true" : "false";}
  806. static AMF_INLINE AMFVariant::WString AMFConvertBoolToWString(bool value, AMF_RESULT& res){res = AMF_OK; return value ? L"true" : L"false";}
  807. static AMF_INLINE bool AMFConvertInt64ToBool(amf_int64 value, AMF_RESULT& res){res = AMF_OK;return value != 0;}
  808. static AMF_INLINE amf_double AMFConvertInt64ToDouble(amf_int64 value, AMF_RESULT& res){res = AMF_OK;return (amf_double)value;}
  809. static AMF_INLINE amf_float AMFConvertInt64ToFloat(amf_int64 value, AMF_RESULT& res) { res = AMF_OK; return (amf_float)value; }
  810. static AMF_INLINE AMFVariant::String AMFConvertInt64ToString(amf_int64 value, AMF_RESULT& res)
  811. {
  812. res = AMF_OK;
  813. char buff[0xFF];
  814. sprintf(buff, "%" AMFPRId64, (long long)value);
  815. return buff;
  816. }
  817. static AMF_INLINE AMFVariant::WString AMFConvertInt64ToWString(amf_int64 value, AMF_RESULT& res)
  818. {
  819. res = AMF_OK;
  820. wchar_t buff[0xFF];
  821. swprintf(buff, 0xFF, L"%" LPRId64, (long long)value);
  822. return buff;
  823. }
  824. static AMF_INLINE bool AMFConvertDoubleToBool(amf_double value, AMF_RESULT& res){res = AMF_OK;return value != 0;}
  825. static AMF_INLINE bool AMFConvertFloatToBool(amf_float value, AMF_RESULT& res) { res = AMF_OK; return value != 0; }
  826. static AMF_INLINE amf_int64 AMFConvertDoubleToInt64(amf_double value, AMF_RESULT& res){res = AMF_OK;return amf_int64(value);}
  827. static AMF_INLINE amf_int64 AMFConvertFloatToInt64(amf_float value, AMF_RESULT& res) { res = AMF_OK; return amf_int64(value); }
  828. static AMF_INLINE AMFVariant::String AMFConvertDoubleToString(amf_double value, AMF_RESULT& res)
  829. {
  830. res = AMF_OK;
  831. char buff[0xFF];
  832. sprintf(buff, "%lf", value);
  833. return buff;
  834. }
  835. static AMF_INLINE AMFVariant::String AMFConvertFloatToString(amf_float value, AMF_RESULT& res)
  836. {
  837. res = AMF_OK;
  838. char buff[0xFF];
  839. sprintf(buff, "%f", value);
  840. return buff;
  841. }
  842. static AMF_INLINE AMFVariant::WString AMFConvertDoubleToWString(amf_double value, AMF_RESULT& res)
  843. {
  844. res = AMF_OK;
  845. wchar_t buff[0xFF];
  846. swprintf(buff, 0xFF, L"%lf", value);
  847. return buff;
  848. }
  849. static AMF_INLINE AMFVariant::WString AMFConvertFloatToWString(amf_float value, AMF_RESULT& res)
  850. {
  851. res = AMF_OK;
  852. wchar_t buff[0xFF];
  853. swprintf(buff, 0xFF, L"%f", value);
  854. return buff;
  855. }
  856. static AMF_INLINE bool AMFConvertStringToBool(const AMFVariant::String& value, AMF_RESULT& res)
  857. {
  858. res = AMF_OK;
  859. AMFVariant::String tmp = value;
  860. if(( tmp == "true") || ( tmp == "True") || ( tmp == "TRUE") || ( tmp == "1") )
  861. {
  862. return true;
  863. }
  864. else
  865. {
  866. if(( tmp == "false") || ( tmp == "False") || ( tmp == "FALSE") || ( tmp == "0") )
  867. {
  868. return false;
  869. }
  870. }
  871. res = AMF_INVALID_ARG;
  872. return false;
  873. }
  874. static AMF_INLINE amf_int64 AMFConvertStringToInt64(const AMFVariant::String& value, AMF_RESULT& res)
  875. {
  876. res = AMF_OK;
  877. long long tmp = 0;
  878. int readElements = 0;
  879. if(value.size() > 2 && ( value.c_str()[0] == '0') && ( value.c_str()[1] == 'x') )
  880. {
  881. readElements = sscanf(value.c_str(), "0x%" AMFPRIx64, &tmp);
  882. }
  883. else if(value.size() > 0)
  884. {
  885. readElements = sscanf(value.c_str(), "%" AMFPRId64, &tmp);
  886. }
  887. if(readElements)
  888. {
  889. return tmp;
  890. }
  891. res = AMF_INVALID_ARG;
  892. return 0;
  893. }
  894. static AMF_INLINE amf_double AMFConvertStringToDouble(const AMFVariant::String& value, AMF_RESULT& res)
  895. {
  896. res = AMF_OK;
  897. amf_double tmp = 0;
  898. int readElements = 0;
  899. if(value.size() > 0)
  900. {
  901. readElements = sscanf(value.c_str(), "%lf", &tmp);
  902. }
  903. if(readElements)
  904. {
  905. return tmp;
  906. }
  907. res = AMF_INVALID_ARG;
  908. return 0;
  909. }
  910. static AMF_INLINE amf_float AMFConvertStringToFloat(const AMFVariant::String& value, AMF_RESULT& res)
  911. {
  912. res = AMF_OK;
  913. amf_float tmp = 0;
  914. int readElements = 0;
  915. if (value.size() > 0)
  916. {
  917. readElements = sscanf(value.c_str(), "%f", &tmp);
  918. }
  919. if (readElements)
  920. {
  921. return tmp;
  922. }
  923. res = AMF_INVALID_ARG;
  924. return 0;
  925. }
  926. static AMF_INLINE AMFVariant::WString AMFConvertStringToWString(const AMFVariant::String& value, AMF_RESULT& res)
  927. {
  928. res = AMF_OK;
  929. // return amf_from_utf8_to_unicode(value);
  930. AMFVariant::WString result;
  931. if(0 == value.size())
  932. {
  933. return result;
  934. }
  935. const char* pUtf8Buff = value.c_str();
  936. #if defined(_WIN32)
  937. _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
  938. int UnicodeBuffSize = ::MultiByteToWideChar(CP_UTF8, 0, pUtf8Buff, -1, NULL, 0);
  939. if(0 == UnicodeBuffSize)
  940. {
  941. return result;
  942. }
  943. UnicodeBuffSize += 8; // get some extra space
  944. result.resize(UnicodeBuffSize);
  945. UnicodeBuffSize = ::MultiByteToWideChar(CP_UTF8, 0, pUtf8Buff, -1, (LPWSTR)result.c_str(), UnicodeBuffSize);
  946. UnicodeBuffSize--;
  947. #elif defined(__ANDROID__)
  948. // on android mbstowcs cannot be used to define length
  949. char* old_locale = setlocale(LC_CTYPE, "en_US.UTF8");
  950. mbstate_t mbs;
  951. mbrlen(NULL, 0, &mbs);
  952. int len = value.size();
  953. const char* pt = pUtf8Buff;
  954. int UnicodeBuffSize = 0;
  955. while(len > 0)
  956. {
  957. size_t length = mbrlen (pt, len, &mbs); //MM TODO Android always return 1
  958. if((length == 0) || (length > len))
  959. {
  960. break;
  961. }
  962. UnicodeBuffSize++;
  963. len -= length;
  964. pt += length;
  965. }
  966. UnicodeBuffSize += 8; // get some extra space
  967. result.resize(UnicodeBuffSize);
  968. mbrlen (NULL, 0, &mbs);
  969. len = value.size();
  970. pt = pUtf8Buff;
  971. UnicodeBuffSize = 0;
  972. while(len > 0)
  973. {
  974. size_t length = mbrlen (pt, len, &mbs);
  975. if((length == 0) || (length > len))
  976. {
  977. break;
  978. }
  979. mbrtowc(&((wchar_t*)(result.c_str()))[UnicodeBuffSize], pt, length, &mbs); //MM TODO Android always return 1 char
  980. UnicodeBuffSize++;
  981. len -= length;
  982. pt += length;
  983. }
  984. setlocale(LC_CTYPE, old_locale);
  985. #else
  986. char* old_locale = setlocale(LC_CTYPE, "en_US.UTF8");
  987. size_t UnicodeBuffSize = mbstowcs(NULL, pUtf8Buff, 0);
  988. if(0 == UnicodeBuffSize)
  989. {
  990. return result;
  991. }
  992. UnicodeBuffSize += 8; // get some extra space
  993. result.resize(UnicodeBuffSize);
  994. UnicodeBuffSize = mbstowcs((wchar_t*)result.c_str(), pUtf8Buff, UnicodeBuffSize + 1);
  995. setlocale(LC_CTYPE, old_locale);
  996. #endif
  997. result.resize(UnicodeBuffSize);
  998. return result;
  999. }
  1000. static AMF_INLINE AMFVariant::String AMFConvertWStringToString(const AMFVariant::WString& value, AMF_RESULT& res)
  1001. {
  1002. res = AMF_OK;
  1003. // return amf_from_unicode_to_utf8(value);
  1004. AMFVariant::String result;
  1005. if(0 == value.size())
  1006. {
  1007. return result;
  1008. }
  1009. const wchar_t* pwBuff = value.c_str();
  1010. #if defined(_WIN32)
  1011. _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
  1012. int Utf8BuffSize = ::WideCharToMultiByte(CP_UTF8, 0, pwBuff, -1, NULL, 0, NULL, NULL);
  1013. if(0 == Utf8BuffSize)
  1014. {
  1015. return result;
  1016. }
  1017. Utf8BuffSize += 8; // get some extra space
  1018. result.resize(Utf8BuffSize);
  1019. Utf8BuffSize = ::WideCharToMultiByte(CP_UTF8, 0, pwBuff, -1, (LPSTR)result.c_str(), Utf8BuffSize, NULL, NULL);
  1020. Utf8BuffSize--;
  1021. #elif defined(__ANDROID__)
  1022. char* old_locale = setlocale(LC_CTYPE, "en_US.UTF8");
  1023. int Utf8BuffSize = value.length();
  1024. if(0 == Utf8BuffSize)
  1025. {
  1026. return result;
  1027. }
  1028. Utf8BuffSize += 8; // get some extra space
  1029. result.resize(Utf8BuffSize);
  1030. mbstate_t mbs;
  1031. mbrlen(NULL, 0, &mbs);
  1032. Utf8BuffSize = 0;
  1033. for( int i = 0; i < value.length(); i++)
  1034. {
  1035. //MM TODO Android - not implemented
  1036. //int written = wcrtomb(&result[Utf8BuffSize], pwBuff[i], &mbs);
  1037. ((char*)(result.c_str()))[Utf8BuffSize] = (char)(pwBuff[i]);
  1038. int written = 1;
  1039. // temp replacement
  1040. Utf8BuffSize += written;
  1041. }
  1042. setlocale(LC_CTYPE, old_locale);
  1043. #else
  1044. char* old_locale = setlocale(LC_CTYPE, "en_US.UTF8");
  1045. size_t Utf8BuffSize = wcstombs(NULL, pwBuff, 0);
  1046. if(0 == Utf8BuffSize)
  1047. {
  1048. return result;
  1049. }
  1050. Utf8BuffSize += 8; // get some extra space
  1051. result.resize(Utf8BuffSize);
  1052. Utf8BuffSize = wcstombs((char*)result.c_str(), pwBuff, Utf8BuffSize + 1);
  1053. setlocale(LC_CTYPE, old_locale);
  1054. #endif
  1055. result.resize(Utf8BuffSize);
  1056. return result;
  1057. }
  1058. static AMF_INLINE bool AMFConvertWStringToBool(const AMFVariant::WString& value, AMF_RESULT& res)
  1059. {
  1060. return AMFConvertStringToBool(AMFConvertWStringToString(value, res), res);
  1061. }
  1062. static AMF_INLINE amf_int64 AMFConvertWStringToInt64(const AMFVariant::WString& value, AMF_RESULT& res)
  1063. {
  1064. return AMFConvertStringToInt64(AMFConvertWStringToString(value, res), res);
  1065. }
  1066. static AMF_INLINE amf_double AMFConvertWStringToDouble(const AMFVariant::WString& value, AMF_RESULT& res)
  1067. {
  1068. return AMFConvertStringToDouble(AMFConvertWStringToString(value, res), res);
  1069. }
  1070. static AMF_INLINE amf_float AMFConvertWStringToFloat(const AMFVariant::WString& value, AMF_RESULT& res)
  1071. {
  1072. return AMFConvertStringToFloat(AMFConvertWStringToString(value, res), res);
  1073. }
  1074. static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertRectToString(const AMFRect& value, AMF_RESULT& res)
  1075. {
  1076. res = AMF_OK;
  1077. char buff[0xFF];
  1078. sprintf(buff, "%d,%d,%d,%d", value.left, value.top, value.right, value.bottom);
  1079. return buff;
  1080. }
  1081. static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertSizeToString(const AMFSize& value, AMF_RESULT& res)
  1082. {
  1083. res = AMF_OK;
  1084. char buff[0xFF];
  1085. sprintf(buff, "%d,%d", value.width, value.height);
  1086. return buff;
  1087. }
  1088. static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertPointToString(const AMFPoint& value, AMF_RESULT& res)
  1089. {
  1090. res = AMF_OK;
  1091. char buff[0xFF];
  1092. sprintf(buff, "%d,%d", value.x, value.y);
  1093. return buff;
  1094. }
  1095. static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertFloatSizeToString(const AMFFloatSize& value, AMF_RESULT& res)
  1096. {
  1097. res = AMF_OK;
  1098. char buff[0xFF];
  1099. sprintf(buff, "%f,%f", value.width, value.height);
  1100. return buff;
  1101. }
  1102. static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertFloatPoint2DToString(const AMFFloatPoint2D& value, AMF_RESULT& res)
  1103. {
  1104. res = AMF_OK;
  1105. char buff[0xFF];
  1106. sprintf(buff, "%f,%f", value.x, value.y);
  1107. return buff;
  1108. }
  1109. static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertFloatPoint3DToString(const AMFFloatPoint3D& value, AMF_RESULT& res)
  1110. {
  1111. res = AMF_OK;
  1112. char buff[0xFF];
  1113. sprintf(buff, "%f,%f,%f", value.x, value.y, value.z);
  1114. return buff;
  1115. }
  1116. static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertFloatVector4DToString(const AMFFloatVector4D& value, AMF_RESULT& res)
  1117. {
  1118. res = AMF_OK;
  1119. char buff[0xFF];
  1120. sprintf(buff, "%f,%f,%f,%f", value.x, value.y, value.z, value.w);
  1121. return buff;
  1122. }
  1123. static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertRateToString(const AMFRate& value, AMF_RESULT& res)
  1124. {
  1125. res = AMF_OK;
  1126. char buff[0xFF];
  1127. sprintf(buff, "%d,%d", value.num, value.den);
  1128. return buff;
  1129. }
  1130. static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertRatioToString(const AMFRatio& value, AMF_RESULT& res)
  1131. {
  1132. res = AMF_OK;
  1133. char buff[0xFF];
  1134. sprintf(buff, "%d,%d", value.num, value.den);
  1135. return buff;
  1136. }
  1137. static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertColorToString(const AMFColor& value, AMF_RESULT& res)
  1138. {
  1139. res = AMF_OK;
  1140. char buff[0xFF];
  1141. sprintf(buff, "%d,%d,%d,%d", value.r, value.g, value.b, value.a);
  1142. return buff;
  1143. }
  1144. static AMF_INLINE AMFRect AMF_STD_CALL AMFConvertStringToRect(const AMFVariant::String& value, AMF_RESULT& res)
  1145. {
  1146. res = AMF_OK;
  1147. AMFRect tmp = {};
  1148. int readElements = 0;
  1149. if(value.size() > 0)
  1150. {
  1151. readElements = sscanf(value.c_str(), "%d,%d,%d,%d", &tmp.left, &tmp.top, &tmp.right, &tmp.bottom);
  1152. }
  1153. if(readElements)
  1154. {
  1155. return tmp;
  1156. }
  1157. res = AMF_INVALID_ARG;
  1158. return tmp;
  1159. }
  1160. static AMF_INLINE AMFSize AMF_STD_CALL AMFConvertStringToSize(const AMFVariant::String& value, AMF_RESULT& res)
  1161. {
  1162. res = AMF_OK;
  1163. AMFSize tmp = {};
  1164. int readElements = 0;
  1165. if(value.size() > 0)
  1166. {
  1167. if(strchr(value.c_str(), ',') != nullptr)
  1168. {
  1169. readElements = sscanf(value.c_str(), "%d,%d", &tmp.width, &tmp.height);
  1170. }
  1171. else if (strchr(value.c_str(), 'x') != nullptr)
  1172. {
  1173. readElements = sscanf(value.c_str(), "%dx%d", &tmp.width, &tmp.height);
  1174. }
  1175. }
  1176. if(readElements)
  1177. {
  1178. return tmp;
  1179. }
  1180. res = AMF_INVALID_ARG;
  1181. return tmp;
  1182. }
  1183. static AMF_INLINE AMFPoint AMF_STD_CALL AMFConvertStringToPoint(const AMFVariant::String& value, AMF_RESULT& res)
  1184. {
  1185. res = AMF_OK;
  1186. AMFPoint tmp = {};
  1187. int readElements = 0;
  1188. if(value.size() > 0)
  1189. {
  1190. readElements = sscanf(value.c_str(), "%d,%d", &tmp.x, &tmp.y);
  1191. }
  1192. if(readElements)
  1193. {
  1194. return tmp;
  1195. }
  1196. res = AMF_INVALID_ARG;
  1197. return tmp;
  1198. }
  1199. static AMF_INLINE AMFFloatSize AMF_STD_CALL AMFConvertStringToFloatSize(const AMFVariant::String& value, AMF_RESULT& res)
  1200. {
  1201. res = AMF_OK;
  1202. AMFFloatSize tmp = {};
  1203. int readElements = 0;
  1204. if (value.size() > 0)
  1205. {
  1206. readElements = sscanf(value.c_str(), "%f,%f", &tmp.width, &tmp.height);
  1207. }
  1208. if (readElements)
  1209. {
  1210. return tmp;
  1211. }
  1212. res = AMF_INVALID_ARG;
  1213. return tmp;
  1214. }
  1215. static AMF_INLINE AMFFloatPoint2D AMF_STD_CALL AMFConvertStringToFloatPoint2D(const AMFVariant::String& value, AMF_RESULT& res)
  1216. {
  1217. res = AMF_OK;
  1218. AMFFloatPoint2D tmp = {};
  1219. int readElements = 0;
  1220. if (value.size() > 0)
  1221. {
  1222. readElements = sscanf(value.c_str(), "%f,%f", &tmp.x, &tmp.y);
  1223. }
  1224. if (readElements)
  1225. {
  1226. return tmp;
  1227. }
  1228. res = AMF_INVALID_ARG;
  1229. return tmp;
  1230. }
  1231. static AMF_INLINE AMFFloatPoint3D AMF_STD_CALL AMFConvertStringToFloatPoint3D(const AMFVariant::String& value, AMF_RESULT& res)
  1232. {
  1233. res = AMF_OK;
  1234. AMFFloatPoint3D tmp = {};
  1235. int readElements = 0;
  1236. if (value.size() > 0)
  1237. {
  1238. readElements = sscanf(value.c_str(), "%f,%f,%f", &tmp.x, &tmp.y, &tmp.z);
  1239. }
  1240. if (readElements)
  1241. {
  1242. return tmp;
  1243. }
  1244. res = AMF_INVALID_ARG;
  1245. return tmp;
  1246. }
  1247. static AMF_INLINE AMFFloatVector4D AMF_STD_CALL AMFConvertStringToFloatVector4D(const AMFVariant::String& value, AMF_RESULT& res)
  1248. {
  1249. res = AMF_OK;
  1250. AMFFloatVector4D tmp = {};
  1251. int readElements = 0;
  1252. if (value.size() > 0)
  1253. {
  1254. readElements = sscanf(value.c_str(), "%f,%f,%f,%f", &tmp.x, &tmp.y, &tmp.z, &tmp.w);
  1255. }
  1256. if (readElements)
  1257. {
  1258. return tmp;
  1259. }
  1260. res = AMF_INVALID_ARG;
  1261. return tmp;
  1262. }
  1263. static AMF_INLINE AMFRate AMF_STD_CALL AMFConvertStringToRate(const AMFVariant::String& value, AMF_RESULT& res)
  1264. {
  1265. res = AMF_OK;
  1266. AMFRate tmp = {};
  1267. int readElements = 0;
  1268. if(value.size() > 0)
  1269. {
  1270. readElements = sscanf(value.c_str(), "%d,%d", &tmp.num, &tmp.den);
  1271. }
  1272. if(readElements)
  1273. {
  1274. return tmp;
  1275. }
  1276. res = AMF_INVALID_ARG;
  1277. return tmp;
  1278. }
  1279. static AMF_INLINE AMFRatio AMF_STD_CALL AMFConvertStringToRatio(const AMFVariant::String& value, AMF_RESULT& res)
  1280. {
  1281. res = AMF_OK;
  1282. AMFRatio tmp = {};
  1283. int readElements = 0;
  1284. if(value.size() > 0)
  1285. {
  1286. readElements = sscanf(value.c_str(), "%d,%d", &tmp.num, &tmp.den);
  1287. }
  1288. if(readElements)
  1289. {
  1290. return tmp;
  1291. }
  1292. res = AMF_INVALID_ARG;
  1293. return tmp;
  1294. }
  1295. static AMF_INLINE AMFColor AMF_STD_CALL AMFConvertStringToColor(const AMFVariant::String& value, AMF_RESULT& res)
  1296. {
  1297. res = AMF_OK;
  1298. int readElements = 0;
  1299. amf_uint32 r = 0;
  1300. amf_uint32 g = 0;
  1301. amf_uint32 b = 0;
  1302. amf_uint32 a = 0;
  1303. if(value.size() > 0)
  1304. {
  1305. readElements = sscanf(value.c_str(), "%u,%u,%u,%u", &r, &g, &b, &a);
  1306. }
  1307. if(readElements)
  1308. {
  1309. return AMFConstructColor((amf_uint8)r, (amf_uint8)g, (amf_uint8)b, (amf_uint8)a);
  1310. }
  1311. res = AMF_INVALID_ARG;
  1312. return AMFConstructColor(0, 0, 0, 255);
  1313. }
  1314. ///////////////////////
  1315. static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertRectToWString(const AMFRect& value, AMF_RESULT& res)
  1316. {
  1317. return AMFConvertStringToWString(AMFConvertRectToString(value, res), res);
  1318. }
  1319. static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertSizeToWString(const AMFSize& value, AMF_RESULT& res)
  1320. {
  1321. return AMFConvertStringToWString(AMFConvertSizeToString(value, res), res);
  1322. }
  1323. static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertPointToWString(const AMFPoint& value, AMF_RESULT& res)
  1324. {
  1325. return AMFConvertStringToWString(AMFConvertPointToString(value, res), res);
  1326. }
  1327. static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertFloatSizeToWString(const AMFFloatSize& value, AMF_RESULT& res)
  1328. {
  1329. return AMFConvertStringToWString(AMFConvertFloatSizeToString(value, res), res);
  1330. }
  1331. static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertFloatPoint2DToWString(const AMFFloatPoint2D& value, AMF_RESULT& res)
  1332. {
  1333. return AMFConvertStringToWString(AMFConvertFloatPoint2DToString(value, res), res);
  1334. }
  1335. static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertFloatPoint3DToWString(const AMFFloatPoint3D& value, AMF_RESULT& res)
  1336. {
  1337. return AMFConvertStringToWString(AMFConvertFloatPoint3DToString(value, res), res);
  1338. }
  1339. static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertFloatVector4DToWString(const AMFFloatVector4D& value, AMF_RESULT& res)
  1340. {
  1341. return AMFConvertStringToWString(AMFConvertFloatVector4DToString(value, res), res);
  1342. }
  1343. static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertRateToWString(const AMFRate& value, AMF_RESULT& res)
  1344. {
  1345. return AMFConvertStringToWString(AMFConvertRateToString(value, res), res);
  1346. }
  1347. static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertRatioToWString(const AMFRatio& value, AMF_RESULT& res)
  1348. {
  1349. return AMFConvertStringToWString(AMFConvertRatioToString(value, res), res);
  1350. }
  1351. static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertColorToWString(const AMFColor& value, AMF_RESULT& res)
  1352. {
  1353. return AMFConvertStringToWString(AMFConvertColorToString(value, res), res);
  1354. }
  1355. static AMF_INLINE AMFRect AMF_STD_CALL AMFConvertWStringToRect(const AMFVariant::WString& value, AMF_RESULT& res)
  1356. {
  1357. return AMFConvertStringToRect(AMFConvertWStringToString(value, res), res);
  1358. }
  1359. static AMF_INLINE AMFSize AMF_STD_CALL AMFConvertWStringToSize(const AMFVariant::WString& value, AMF_RESULT& res)
  1360. {
  1361. return AMFConvertStringToSize(AMFConvertWStringToString(value, res), res);
  1362. }
  1363. static AMF_INLINE AMFPoint AMF_STD_CALL AMFConvertWStringToPoint(const AMFVariant::WString& value, AMF_RESULT& res)
  1364. {
  1365. return AMFConvertStringToPoint(AMFConvertWStringToString(value, res), res);
  1366. }
  1367. static AMF_INLINE AMFFloatSize AMF_STD_CALL AMFConvertWStringToFloatSize(const AMFVariant::WString& value, AMF_RESULT& res)
  1368. {
  1369. return AMFConvertStringToFloatSize(AMFConvertWStringToString(value, res), res);
  1370. }
  1371. static AMF_INLINE AMFFloatPoint2D AMF_STD_CALL AMFConvertWStringToFloatPoint2D(const AMFVariant::WString& value, AMF_RESULT& res)
  1372. {
  1373. return AMFConvertStringToFloatPoint2D(AMFConvertWStringToString(value, res), res);
  1374. }
  1375. static AMF_INLINE AMFFloatPoint3D AMF_STD_CALL AMFConvertWStringToFloatPoint3D(const AMFVariant::WString& value, AMF_RESULT& res)
  1376. {
  1377. return AMFConvertStringToFloatPoint3D(AMFConvertWStringToString(value, res), res);
  1378. }
  1379. static AMF_INLINE AMFFloatVector4D AMF_STD_CALL AMFConvertWStringToFloatVector4D(const AMFVariant::WString& value, AMF_RESULT& res)
  1380. {
  1381. return AMFConvertStringToFloatVector4D(AMFConvertWStringToString(value, res), res);
  1382. }
  1383. static AMF_INLINE AMFRate AMF_STD_CALL AMFConvertWStringToRate(const AMFVariant::WString& value, AMF_RESULT& res)
  1384. {
  1385. return AMFConvertStringToRate(AMFConvertWStringToString(value, res), res);
  1386. }
  1387. static AMF_INLINE AMFRatio AMF_STD_CALL AMFConvertWStringToRatio(const AMFVariant::WString& value, AMF_RESULT& res)
  1388. {
  1389. return AMFConvertStringToRatio(AMFConvertWStringToString(value, res), res);
  1390. }
  1391. static AMF_INLINE AMFColor AMF_STD_CALL AMFConvertWStringToColor(const AMFVariant::WString& value, AMF_RESULT& res)
  1392. {
  1393. return AMFConvertStringToColor(AMFConvertWStringToString(value, res), res);
  1394. }
  1395. //-------------------------------------------------------------------------------------------------
  1396. #define AMFConvertTool(srcType, dstType)\
  1397. if(AMFVariantGetType(pSrc) == AMFVariantType##srcType && newType == AMFVariantType##dstType)\
  1398. {\
  1399. AMF_RESULT res = AMF_OK;\
  1400. AMFVariantAssign##dstType(pDest, AMFConvert##srcType##To##dstType(AMFVariant##srcType(pSrc), res));\
  1401. return res;\
  1402. }\
  1403. //-------------------------------------------------------------------------------------------------
  1404. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantChangeType(AMFVariantStruct* pDest, const AMFVariantStruct* pSrc, AMF_VARIANT_TYPE newType)
  1405. {
  1406. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1407. if(pSrc == 0)
  1408. {
  1409. pSrc = pDest;
  1410. }
  1411. if(AMFVariantGetType(pSrc) == newType)
  1412. {
  1413. if(pDest == pSrc)
  1414. {
  1415. return AMF_OK;
  1416. }
  1417. return AMFVariantCopy(pDest, pSrc);
  1418. }
  1419. AMFVariantClear(pDest);
  1420. AMFConvertTool(Empty, Bool);
  1421. AMFConvertTool(Empty, Int64);
  1422. AMFConvertTool(Empty, Double);
  1423. AMFConvertTool(Empty, Float);
  1424. AMFConvertTool(Empty, String);
  1425. AMFConvertTool(Empty, WString);
  1426. AMFConvertTool(Bool, Int64);
  1427. AMFConvertTool(Bool, Double);
  1428. AMFConvertTool(Bool, Float);
  1429. AMFConvertTool(Bool, String);
  1430. AMFConvertTool(Bool, WString);
  1431. AMFConvertTool(Int64, Bool);
  1432. AMFConvertTool(Int64, Double);
  1433. AMFConvertTool(Int64, Float);
  1434. AMFConvertTool(Int64, String);
  1435. AMFConvertTool(Int64, WString);
  1436. AMFConvertTool(Double, Bool);
  1437. AMFConvertTool(Double, Int64);
  1438. AMFConvertTool(Double, String);
  1439. AMFConvertTool(Double, String);
  1440. AMFConvertTool(Float, Bool);
  1441. AMFConvertTool(Float, Int64);
  1442. AMFConvertTool(Float, String);
  1443. AMFConvertTool(Float, String);
  1444. AMFConvertTool(String, Bool);
  1445. AMFConvertTool(String, Int64);
  1446. AMFConvertTool(String, Double);
  1447. AMFConvertTool(String, Float);
  1448. AMFConvertTool(String, WString);
  1449. AMFConvertTool(WString, Bool);
  1450. AMFConvertTool(WString, Int64);
  1451. AMFConvertTool(WString, Double);
  1452. AMFConvertTool(WString, Float);
  1453. AMFConvertTool(WString, String);
  1454. AMFConvertTool(String, Rect);
  1455. AMFConvertTool(String, Size);
  1456. AMFConvertTool(String, Point);
  1457. AMFConvertTool(String, Rate);
  1458. AMFConvertTool(String, Ratio);
  1459. AMFConvertTool(String, Color);
  1460. AMFConvertTool(Rect , String);
  1461. AMFConvertTool(Size , String);
  1462. AMFConvertTool(Point, String);
  1463. AMFConvertTool(Rate , String);
  1464. AMFConvertTool(Ratio, String);
  1465. AMFConvertTool(Color, String);
  1466. AMFConvertTool(WString, Rect);
  1467. AMFConvertTool(WString, Size);
  1468. AMFConvertTool(WString, Point);
  1469. AMFConvertTool(WString, Rate);
  1470. AMFConvertTool(WString, Ratio);
  1471. AMFConvertTool(WString, Color);
  1472. AMFConvertTool(Rect , WString);
  1473. AMFConvertTool(Size , WString);
  1474. AMFConvertTool(Point, WString);
  1475. AMFConvertTool(Rate , WString);
  1476. AMFConvertTool(Ratio, WString);
  1477. AMFConvertTool(Color, WString);
  1478. return AMF_INVALID_ARG;
  1479. }
  1480. #endif // #if defined(__cplusplus)
  1481. //-------------------------------------------------------------------------------------------------
  1482. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignBool(AMFVariantStruct* pDest, amf_bool value)
  1483. {
  1484. AMF_RESULT errRet = AMF_OK;
  1485. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1486. errRet = AMFVariantClear(pDest);
  1487. if(errRet == AMF_OK)
  1488. {
  1489. pDest->type = AMF_VARIANT_BOOL;
  1490. AMFVariantBool(pDest) = value;
  1491. }
  1492. return errRet;
  1493. }
  1494. //-------------------------------------------------------------------------------------------------
  1495. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignInt64(AMFVariantStruct* pDest, amf_int64 value)
  1496. {
  1497. AMF_RESULT errRet = AMF_OK;
  1498. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1499. errRet = AMFVariantClear(pDest);
  1500. if(errRet == AMF_OK)
  1501. {
  1502. pDest->type = AMF_VARIANT_INT64;
  1503. AMFVariantInt64(pDest) = value;
  1504. }
  1505. return errRet;
  1506. }
  1507. //-------------------------------------------------------------------------------------------------
  1508. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignDouble(AMFVariantStruct* pDest, amf_double value)
  1509. {
  1510. AMF_RESULT errRet = AMF_OK;
  1511. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1512. errRet = AMFVariantClear(pDest);
  1513. if(errRet == AMF_OK)
  1514. {
  1515. pDest->type = AMF_VARIANT_DOUBLE;
  1516. AMFVariantDouble(pDest) = value;
  1517. }
  1518. return errRet;
  1519. }
  1520. //-------------------------------------------------------------------------------------------------
  1521. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloat(AMFVariantStruct* pDest, amf_float value)
  1522. {
  1523. AMF_RESULT errRet = AMF_OK;
  1524. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1525. errRet = AMFVariantClear(pDest);
  1526. if (errRet == AMF_OK)
  1527. {
  1528. pDest->type = AMF_VARIANT_FLOAT;
  1529. AMFVariantFloat(pDest) = value;
  1530. }
  1531. return errRet;
  1532. }
  1533. //-------------------------------------------------------------------------------------------------
  1534. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignString(AMFVariantStruct* pDest, const char* pValue)
  1535. {
  1536. AMF_RESULT errRet = AMF_OK;
  1537. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1538. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pValue);
  1539. errRet = AMFVariantClear(pDest);
  1540. if(errRet == AMF_OK)
  1541. {
  1542. const size_t size = (strlen(pValue) + 1);
  1543. pDest->type = AMF_VARIANT_STRING;
  1544. AMFVariantString(pDest) = (char*)amf_variant_alloc(size * sizeof(char));
  1545. if(AMFVariantString(pDest))
  1546. {
  1547. memcpy(AMFVariantString(pDest), pValue, size * sizeof(char));
  1548. }
  1549. else
  1550. {
  1551. errRet = AMF_OUT_OF_MEMORY;
  1552. }
  1553. }
  1554. return errRet;
  1555. }
  1556. //-------------------------------------------------------------------------------------------------
  1557. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignWString(AMFVariantStruct* pDest, const wchar_t* pValue)
  1558. {
  1559. AMF_RESULT errRet = AMF_OK;
  1560. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1561. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pValue);
  1562. errRet = AMFVariantClear(pDest);
  1563. if(errRet == AMF_OK)
  1564. {
  1565. const size_t size = (wcslen(pValue) + 1);
  1566. pDest->type = AMF_VARIANT_WSTRING;
  1567. AMFVariantWString(pDest) = (wchar_t*)amf_variant_alloc(size * sizeof(wchar_t));
  1568. if(AMFVariantWString(pDest))
  1569. {
  1570. memcpy(AMFVariantWString(pDest), pValue, size * sizeof(wchar_t));
  1571. }
  1572. else
  1573. {
  1574. errRet = AMF_OUT_OF_MEMORY;
  1575. }
  1576. }
  1577. return errRet;
  1578. }
  1579. //-------------------------------------------------------------------------------------------------
  1580. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignInterface(AMFVariantStruct* pDest, AMFInterface* pValue)
  1581. {
  1582. AMF_RESULT errRet = AMF_OK;
  1583. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1584. //AMF_VARIANT_RETURN_IF_INVALID_POINTER(pValue);//can be NULL
  1585. errRet = AMFVariantClear(pDest);
  1586. if(errRet == AMF_OK)
  1587. {
  1588. pDest->type = AMF_VARIANT_INTERFACE;
  1589. AMFVariantInterface(pDest) = pValue;
  1590. if(AMFVariantInterface(pDest))
  1591. {
  1592. #if defined(__cplusplus)
  1593. AMFVariantInterface(pDest)->Acquire();
  1594. #else
  1595. AMFVariantInterface(pDest)->pVtbl->Acquire(AMFVariantInterface(pDest));
  1596. #endif
  1597. }
  1598. }
  1599. return errRet;
  1600. }
  1601. //-------------------------------------------------------------------------------------------------
  1602. #if defined(__cplusplus)
  1603. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRect(AMFVariantStruct* pDest, const AMFRect& value)
  1604. {
  1605. return AMFVariantAssignRect(pDest, &value);
  1606. }
  1607. #endif
  1608. //-------------------------------------------------------------------------------------------------
  1609. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRect (AMFVariantStruct* pDest, const AMFRect* value)
  1610. {
  1611. AMF_RESULT errRet = AMF_OK;
  1612. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1613. errRet = AMFVariantClear(pDest);
  1614. if(errRet == AMF_OK)
  1615. {
  1616. pDest->type = AMF_VARIANT_RECT;
  1617. AMFVariantRect(pDest) = *value;
  1618. }
  1619. return errRet;
  1620. }
  1621. //-------------------------------------------------------------------------------------------------
  1622. #if defined(__cplusplus)
  1623. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignSize (AMFVariantStruct* pDest, const AMFSize& value)
  1624. {
  1625. return AMFVariantAssignSize (pDest, &value);
  1626. }
  1627. #endif
  1628. //-------------------------------------------------------------------------------------------------
  1629. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignSize (AMFVariantStruct* pDest, const AMFSize* value)
  1630. {
  1631. AMF_RESULT errRet = AMF_OK;
  1632. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1633. errRet = AMFVariantClear(pDest);
  1634. if(errRet == AMF_OK)
  1635. {
  1636. pDest->type = AMF_VARIANT_SIZE;
  1637. AMFVariantSize(pDest) = *value;
  1638. }
  1639. return errRet;
  1640. }
  1641. //-------------------------------------------------------------------------------------------------
  1642. #if defined(__cplusplus)
  1643. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignPoint(AMFVariantStruct* pDest, const AMFPoint& value)
  1644. {
  1645. return AMFVariantAssignPoint(pDest, &value);
  1646. }
  1647. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatSize(AMFVariantStruct* pDest, const AMFFloatSize& value)
  1648. {
  1649. return AMFVariantAssignFloatSize(pDest, &value);
  1650. }
  1651. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint2D(AMFVariantStruct* pDest, const AMFFloatPoint2D& value)
  1652. {
  1653. return AMFVariantAssignFloatPoint2D(pDest, &value);
  1654. }
  1655. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint3D(AMFVariantStruct* pDest, const AMFFloatPoint3D& value)
  1656. {
  1657. return AMFVariantAssignFloatPoint3D(pDest, &value);
  1658. }
  1659. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatVector4D(AMFVariantStruct* pDest, const AMFFloatVector4D& value)
  1660. {
  1661. return AMFVariantAssignFloatVector4D(pDest, &value);
  1662. }
  1663. #endif
  1664. //-------------------------------------------------------------------------------------------------
  1665. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignPoint(AMFVariantStruct* pDest, const AMFPoint* value)
  1666. {
  1667. AMF_RESULT errRet = AMF_OK;
  1668. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1669. errRet = AMFVariantClear(pDest);
  1670. if(errRet == AMF_OK)
  1671. {
  1672. pDest->type = AMF_VARIANT_POINT;
  1673. AMFVariantPoint(pDest) = *value;
  1674. }
  1675. return errRet;
  1676. }
  1677. //-------------------------------------------------------------------------------------------------
  1678. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatSize(AMFVariantStruct* pDest, const AMFFloatSize* value)
  1679. {
  1680. AMF_RESULT errRet = AMF_OK;
  1681. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1682. errRet = AMFVariantClear(pDest);
  1683. if (errRet == AMF_OK)
  1684. {
  1685. pDest->type = AMF_VARIANT_FLOAT_SIZE;
  1686. AMFVariantFloatSize(pDest) = *value;
  1687. }
  1688. return errRet;
  1689. }
  1690. //-------------------------------------------------------------------------------------------------
  1691. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint2D(AMFVariantStruct* pDest, const AMFFloatPoint2D* value)
  1692. {
  1693. AMF_RESULT errRet = AMF_OK;
  1694. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1695. errRet = AMFVariantClear(pDest);
  1696. if (errRet == AMF_OK)
  1697. {
  1698. pDest->type = AMF_VARIANT_FLOAT_POINT2D;
  1699. AMFVariantFloatPoint2D(pDest) = *value;
  1700. }
  1701. return errRet;
  1702. }
  1703. //-------------------------------------------------------------------------------------------------
  1704. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint3D(AMFVariantStruct* pDest, const AMFFloatPoint3D* value)
  1705. {
  1706. AMF_RESULT errRet = AMF_OK;
  1707. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1708. errRet = AMFVariantClear(pDest);
  1709. if (errRet == AMF_OK)
  1710. {
  1711. pDest->type = AMF_VARIANT_FLOAT_POINT3D;
  1712. AMFVariantFloatPoint3D(pDest) = *value;
  1713. }
  1714. return errRet;
  1715. }
  1716. //-------------------------------------------------------------------------------------------------
  1717. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatVector4D(AMFVariantStruct* pDest, const AMFFloatVector4D* value)
  1718. {
  1719. AMF_RESULT errRet = AMF_OK;
  1720. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1721. errRet = AMFVariantClear(pDest);
  1722. if (errRet == AMF_OK)
  1723. {
  1724. pDest->type = AMF_VARIANT_FLOAT_VECTOR4D;
  1725. AMFVariantFloatVector4D(pDest) = *value;
  1726. }
  1727. return errRet;
  1728. }
  1729. //-------------------------------------------------------------------------------------------------
  1730. #if defined(__cplusplus)
  1731. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRate (AMFVariantStruct* pDest, const AMFRate& value)
  1732. {
  1733. return AMFVariantAssignRate (pDest, &value);
  1734. }
  1735. #endif
  1736. //-------------------------------------------------------------------------------------------------
  1737. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRate (AMFVariantStruct* pDest, const AMFRate* value)
  1738. {
  1739. AMF_RESULT errRet = AMF_OK;
  1740. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1741. errRet = AMFVariantClear(pDest);
  1742. if(errRet == AMF_OK)
  1743. {
  1744. pDest->type = AMF_VARIANT_RATE;
  1745. AMFVariantRate(pDest) = *value;
  1746. }
  1747. return errRet;
  1748. }
  1749. //-------------------------------------------------------------------------------------------------
  1750. #if defined(__cplusplus)
  1751. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRatio(AMFVariantStruct* pDest, const AMFRatio& value)
  1752. {
  1753. return AMFVariantAssignRatio(pDest, &value);
  1754. }
  1755. #endif
  1756. //-------------------------------------------------------------------------------------------------
  1757. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRatio(AMFVariantStruct* pDest, const AMFRatio* value)
  1758. {
  1759. AMF_RESULT errRet = AMF_OK;
  1760. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1761. errRet = AMFVariantClear(pDest);
  1762. if(errRet == AMF_OK)
  1763. {
  1764. pDest->type = AMF_VARIANT_RATIO;
  1765. AMFVariantRatio(pDest) = *value;
  1766. }
  1767. return errRet;
  1768. }
  1769. //-------------------------------------------------------------------------------------------------
  1770. #if defined(__cplusplus)
  1771. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignColor(AMFVariantStruct* pDest, const AMFColor& value)
  1772. {
  1773. return AMFVariantAssignColor(pDest, &value);
  1774. }
  1775. #endif
  1776. //-------------------------------------------------------------------------------------------------
  1777. static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignColor(AMFVariantStruct* pDest, const AMFColor* value)
  1778. {
  1779. AMF_RESULT errRet = AMF_OK;
  1780. AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
  1781. errRet = AMFVariantClear(pDest);
  1782. if(errRet == AMF_OK)
  1783. {
  1784. pDest->type = AMF_VARIANT_COLOR;
  1785. AMFVariantColor(pDest) = *value;
  1786. }
  1787. return errRet;
  1788. }
  1789. //-------------------------------------------------------------------------------------------------
  1790. static AMF_INLINE char* AMF_CDECL_CALL AMFVariantDuplicateString(const char* from)
  1791. {
  1792. char* ret = 0;
  1793. if(from)
  1794. {
  1795. ret = (char*)amf_variant_alloc(sizeof(char)*(strlen(from) + 1));
  1796. if(ret)
  1797. {
  1798. strcpy(ret, from);
  1799. }
  1800. }
  1801. return ret;
  1802. }
  1803. //-------------------------------------------------------------------------------------------------
  1804. static AMF_INLINE void AMF_CDECL_CALL AMFVariantFreeString(char* from)
  1805. {
  1806. amf_variant_free(from);
  1807. }
  1808. //-------------------------------------------------------------------------------------------------
  1809. static AMF_INLINE wchar_t* AMF_CDECL_CALL AMFVariantDuplicateWString(const wchar_t* from)
  1810. {
  1811. wchar_t* ret = 0;
  1812. if(from)
  1813. {
  1814. ret = (wchar_t*)amf_variant_alloc(sizeof(wchar_t)*(wcslen(from) + 1));
  1815. if(ret)
  1816. {
  1817. wcscpy(ret, from);
  1818. }
  1819. }
  1820. return ret;
  1821. }
  1822. //-------------------------------------------------------------------------------------------------
  1823. static AMF_INLINE void AMF_CDECL_CALL AMFVariantFreeWString(wchar_t* from)
  1824. {
  1825. amf_variant_free(from);
  1826. }
  1827. //----------------------------------------------------------------------------------------------
  1828. // AMF_INLINE implementation of AMFVariant class
  1829. //----------------------------------------------------------------------------------------------
  1830. #if defined(__cplusplus)
  1831. AMF_INLINE AMFVariant::AMFVariant(const AMFVariantStruct* pOther)
  1832. {
  1833. AMFVariantInit(this);
  1834. if(pOther != NULL)
  1835. {
  1836. AMFVariantCopy(this, const_cast<AMFVariantStruct*>(pOther));
  1837. }
  1838. }
  1839. //-------------------------------------------------------------------------------------------------
  1840. template<typename T>
  1841. AMFVariant::AMFVariant(const AMFInterfacePtr_T<T>& pValue)
  1842. {
  1843. AMFVariantInit(this);
  1844. AMFVariantAssignInterface(this, pValue);
  1845. }
  1846. //-------------------------------------------------------------------------------------------------
  1847. template<class ReturnType, AMF_VARIANT_TYPE variantType, typename Getter>
  1848. ReturnType AMFVariant::GetValue(Getter getter) const
  1849. {
  1850. ReturnType str = ReturnType();
  1851. if(AMFVariantGetType(this) == variantType)
  1852. {
  1853. str = static_cast<ReturnType>(getter(this));
  1854. }
  1855. else
  1856. {
  1857. AMFVariant varDest;
  1858. varDest.ChangeType(variantType, this);
  1859. if(varDest.type != AMF_VARIANT_EMPTY)
  1860. {
  1861. str = static_cast<ReturnType>(getter(&varDest));
  1862. }
  1863. }
  1864. return str;
  1865. }
  1866. //-------------------------------------------------------------------------------------------------
  1867. AMF_INLINE AMFVariant& AMFVariant::operator=(const AMFVariantStruct& other)
  1868. {
  1869. AMFVariantCopy(this, const_cast<AMFVariantStruct*>(&other));
  1870. return *this;
  1871. }
  1872. //-------------------------------------------------------------------------------------------------
  1873. AMF_INLINE AMFVariant& AMFVariant::operator=(const AMFVariantStruct* pOther)
  1874. {
  1875. if(pOther != NULL)
  1876. {
  1877. AMFVariantCopy(this, const_cast<AMFVariantStruct*>(pOther));
  1878. }
  1879. return *this;
  1880. }
  1881. //-------------------------------------------------------------------------------------------------
  1882. AMF_INLINE AMFVariant& AMFVariant::operator=(const AMFVariant& other)
  1883. {
  1884. AMFVariantCopy(this,
  1885. const_cast<AMFVariantStruct*>(static_cast<const AMFVariantStruct*>(&other)));
  1886. return *this;
  1887. }
  1888. //-------------------------------------------------------------------------------------------------
  1889. template<typename T>
  1890. AMFVariant& AMFVariant::operator=(const AMFInterfacePtr_T<T>& value)
  1891. {
  1892. AMFVariantAssignInterface(this, value);
  1893. return *this;
  1894. }
  1895. //-------------------------------------------------------------------------------------------------
  1896. AMF_INLINE bool AMFVariant::operator==(const AMFVariantStruct& other) const
  1897. {
  1898. return *this == &other;
  1899. }
  1900. //-------------------------------------------------------------------------------------------------
  1901. AMF_INLINE bool AMFVariant::operator==(const AMFVariantStruct* pOther) const
  1902. {
  1903. //TODO: double check
  1904. amf_bool ret = false;
  1905. if(pOther == NULL)
  1906. {
  1907. ret = false;
  1908. }
  1909. else
  1910. {
  1911. AMFVariantCompare(this, pOther, &ret);
  1912. }
  1913. return ret;
  1914. }
  1915. //-------------------------------------------------------------------------------------------------
  1916. AMF_INLINE bool AMFVariant::operator!=(const AMFVariantStruct& other) const
  1917. {
  1918. return !(*this == &other);
  1919. }
  1920. //-------------------------------------------------------------------------------------------------
  1921. AMF_INLINE bool AMFVariant::operator!=(const AMFVariantStruct* pOther) const
  1922. {
  1923. return !(*this == pOther);
  1924. }
  1925. //-------------------------------------------------------------------------------------------------
  1926. AMF_INLINE void AMFVariant::Attach(AMFVariantStruct& variant)
  1927. {
  1928. Clear();
  1929. memcpy(this, &variant, sizeof(variant));
  1930. AMFVariantGetType(&variant) = AMF_VARIANT_EMPTY;
  1931. }
  1932. //-------------------------------------------------------------------------------------------------
  1933. AMF_INLINE AMFVariantStruct AMFVariant::Detach()
  1934. {
  1935. AMFVariantStruct varResult = *this;
  1936. AMFVariantGetType(this) = AMF_VARIANT_EMPTY;
  1937. return varResult;
  1938. }
  1939. //-------------------------------------------------------------------------------------------------
  1940. AMF_INLINE AMFVariantStruct& AMFVariant::GetVariant()
  1941. {
  1942. return *static_cast<AMFVariantStruct*>(this);
  1943. }
  1944. //-------------------------------------------------------------------------------------------------
  1945. AMF_INLINE void AMFVariant::ChangeType(AMF_VARIANT_TYPE newType, const AMFVariant* pSrc)
  1946. {
  1947. AMFVariantChangeType(this, pSrc, newType);
  1948. }
  1949. //-------------------------------------------------------------------------------------------------
  1950. AMF_INLINE bool AMFVariant::Empty() const
  1951. {
  1952. return type == AMF_VARIANT_EMPTY;
  1953. }
  1954. //-------------------------------------------------------------------------------------------------
  1955. #endif // #if defined(__cplusplus)
  1956. #if defined(__cplusplus)
  1957. } //namespace amf
  1958. #endif
  1959. #endif //#ifndef AMF_Variant_h