CocoLoader.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #include "editor-support/cocostudio/CocoLoader.h"
  2. #include "zlib.h"
  3. using namespace std;
  4. using namespace rapidjson;
  5. namespace cocostudio{
  6. char cTypeName[] = {'N','F','T','O','A','S','V'};
  7. const char* kTypeNames[] = { "Null", "False", "True", "Object", "Array", "String", "Number" };
  8. const char* kObjKeyName[] = { "__type" , "classname" };
  9. char g_Buff[2048];
  10. char* stExpCocoAttribDesc::GetName(CocoLoader* pCoco)
  11. {
  12. return ( pCoco->GetMemoryAddr_String() + m_szName );
  13. }
  14. char* stExpCocoObjectDesc::GetName(CocoLoader* pCoco)
  15. {
  16. return ( pCoco->GetMemoryAddr_String() + m_szName );
  17. }
  18. int stExpCocoObjectDesc::GetAttribNum()
  19. {
  20. return m_cAttribNum;
  21. }
  22. stExpCocoAttribDesc* stExpCocoObjectDesc::GetAttribDescArray(CocoLoader* pCoco)
  23. {
  24. return (stExpCocoAttribDesc*)( pCoco->GetMemoryAddr_AttribDesc() + m_pAttribDescArray );
  25. }
  26. Type stExpCocoNode::GetType(CocoLoader* pCoco)
  27. {
  28. Type tType = kObjectType;
  29. if(m_ObjIndex >= 0)
  30. {
  31. stExpCocoObjectDesc* tpCocoObjectDesc = pCoco->GetCocoObjectDescArray() ;
  32. if( m_AttribIndex >= 0 )
  33. {
  34. stExpCocoAttribDesc* tpAttribDescArray = (stExpCocoAttribDesc*) tpCocoObjectDesc[m_ObjIndex].GetAttribDescArray(pCoco);
  35. tType = Type(tpAttribDescArray[m_AttribIndex].m_cTypeName - 'N' + kNullType);
  36. if(kFalseType == tType || kTrueType == tType)
  37. {
  38. char* szValue = (char*)GetValue(pCoco);
  39. if(szValue[0] == '0')
  40. {
  41. return kFalseType;
  42. }
  43. else
  44. {
  45. return kTrueType;
  46. }
  47. }
  48. }
  49. else
  50. {
  51. tType = kObjectType;
  52. }
  53. }
  54. else
  55. {
  56. if(m_AttribIndex >= 0)
  57. {
  58. tType = (Type)m_ChildNum;
  59. if(kFalseType == tType || kTrueType == tType)
  60. {
  61. char* szValue = (char*)GetValue(pCoco);
  62. if(szValue[0] == '0')
  63. {
  64. return kFalseType;
  65. }
  66. else
  67. {
  68. return kTrueType;
  69. }
  70. }
  71. }
  72. else
  73. {
  74. tType = kArrayType;
  75. }
  76. }
  77. return tType;
  78. }
  79. char* stExpCocoNode::GetName(CocoLoader* pCoco)
  80. {
  81. char* szName = nullptr ;
  82. if(m_ObjIndex >= 0)
  83. {
  84. stExpCocoObjectDesc* tpCocoObjectDesc = pCoco->GetCocoObjectDescArray();
  85. if( m_AttribIndex >= 0 )
  86. {
  87. stExpCocoAttribDesc* tpAttribDescArray = (stExpCocoAttribDesc*) tpCocoObjectDesc[m_ObjIndex].GetAttribDescArray(pCoco);
  88. szName = tpAttribDescArray[m_AttribIndex].GetName(pCoco);
  89. }
  90. else
  91. {
  92. char* szValue = GetValue(pCoco);
  93. if(szValue[0])
  94. {
  95. szName = GetValue(pCoco);
  96. }
  97. else
  98. {
  99. szName = tpCocoObjectDesc[m_ObjIndex].GetName(pCoco);
  100. }
  101. }
  102. }
  103. else
  104. {
  105. if(m_AttribIndex >= 0)
  106. {
  107. char* pStringAddr = (char*)pCoco->GetCocoObjectDescArray() + pCoco->GetFileHeader()->m_lStringMemAddr ;
  108. szName = m_ChildArray + pStringAddr;
  109. }
  110. else
  111. {
  112. szName = (char*)GetValue(pCoco);
  113. }
  114. }
  115. return szName ;
  116. }
  117. char* stExpCocoNode::GetValue(CocoLoader* pCoco)
  118. {
  119. char* szValue = ( pCoco->GetMemoryAddr_String() + m_szValue );
  120. if( 0==strcmp(szValue,"null") && GetType(pCoco) == kStringType )
  121. {
  122. strcpy(szValue,"");
  123. }
  124. return szValue;
  125. }
  126. int stExpCocoNode::GetChildNum()
  127. {
  128. return m_ChildNum;
  129. }
  130. stExpCocoNode* stExpCocoNode::GetChildArray(CocoLoader* pCoco)
  131. {
  132. return (stExpCocoNode*)( pCoco->GetMemoryAddr_CocoNode() + m_ChildArray );
  133. }
  134. CocoLoader::CocoLoader()
  135. {
  136. m_pRootNode = nullptr;
  137. m_pObjectDescArray = nullptr;
  138. m_pMemoryBuff = nullptr;
  139. }
  140. CocoLoader::~CocoLoader()
  141. {
  142. if(m_pMemoryBuff)
  143. {
  144. delete[] m_pMemoryBuff;
  145. m_pMemoryBuff = nullptr;
  146. }
  147. }
  148. bool CocoLoader::ReadCocoBinBuff(char* pBinBuff)
  149. {
  150. if(m_pMemoryBuff)return true;
  151. char* pTempBuff = pBinBuff;
  152. m_pFileHeader = (stCocoFileHeader*)pTempBuff;
  153. pTempBuff += sizeof(stCocoFileHeader);
  154. char* pStartAddr = m_pMemoryBuff = pTempBuff;
  155. char* pDestBuff = new (std::nothrow) char[m_pFileHeader->m_nDataSize];
  156. if (m_pFileHeader->m_nCompressSize > 0)
  157. {
  158. uLongf dwSrcSize = m_pFileHeader->m_nCompressSize;
  159. uLongf dwDestSize = m_pFileHeader->m_nDataSize;
  160. uncompress((Bytef*)pDestBuff,&dwDestSize,(Bytef*)m_pMemoryBuff,dwSrcSize);
  161. }
  162. else
  163. {
  164. memcpy(pDestBuff, m_pMemoryBuff, m_pFileHeader->m_nDataSize);
  165. }
  166. pStartAddr = m_pMemoryBuff = pDestBuff;
  167. m_pObjectDescArray = (stExpCocoObjectDesc*)pStartAddr;
  168. char* pCocoMemAddr = pStartAddr + m_pFileHeader->m_CocoNodeMemAddr;
  169. m_pRootNode = (stExpCocoNode*)pCocoMemAddr;
  170. return true;
  171. }
  172. char* CocoLoader::GetMemoryAddr_AttribDesc()
  173. {
  174. return m_pMemoryBuff + m_pFileHeader->m_lAttribMemAddr ;
  175. }
  176. char* CocoLoader::GetMemoryAddr_CocoNode()
  177. {
  178. return m_pMemoryBuff + m_pFileHeader->m_CocoNodeMemAddr;
  179. }
  180. char* CocoLoader::GetMemoryAddr_String()
  181. {
  182. return m_pMemoryBuff + m_pFileHeader->m_lStringMemAddr ;
  183. }
  184. }