2014-06-05 10:24:12 +08:00
|
|
|
#include "CocoLoader.h"
|
2014-07-01 16:31:17 +08:00
|
|
|
#include "zlib.h"
|
2014-06-18 11:54:25 +08:00
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
using namespace rapidjson;
|
|
|
|
|
|
|
|
namespace cocostudio{
|
2014-06-05 10:24:12 +08:00
|
|
|
|
2014-06-18 11:54:25 +08:00
|
|
|
|
2014-07-01 16:31:17 +08:00
|
|
|
char cTypeName[] = {'N','F','T','O','A','S','V'};
|
2014-06-18 11:54:25 +08:00
|
|
|
const char* kTypeNames[] = { "Null", "False", "True", "Object", "Array", "String", "Number" };
|
|
|
|
const char* kObjKeyName[] = { "__type" , "classname" };
|
|
|
|
char g_Buff[2048];
|
|
|
|
|
2014-07-01 16:31:17 +08:00
|
|
|
char* stExpCocoAttribDesc::GetName(CocoLoader* pCoco)
|
2014-06-18 11:54:25 +08:00
|
|
|
{
|
2014-07-01 16:31:17 +08:00
|
|
|
return ( pCoco->GetMemoryAddr_String() + m_szName );
|
2014-06-18 11:54:25 +08:00
|
|
|
}
|
|
|
|
|
2014-07-01 16:31:17 +08:00
|
|
|
char* stExpCocoObjectDesc::GetName(CocoLoader* pCoco)
|
2014-06-18 11:54:25 +08:00
|
|
|
{
|
2014-07-01 16:31:17 +08:00
|
|
|
return ( pCoco->GetMemoryAddr_String() + m_szName );
|
2014-06-18 11:54:25 +08:00
|
|
|
}
|
2014-06-11 09:35:24 +08:00
|
|
|
|
2014-07-01 16:31:17 +08:00
|
|
|
int stExpCocoObjectDesc::GetAttribNum()
|
2014-06-18 11:54:25 +08:00
|
|
|
{
|
2014-07-01 16:31:17 +08:00
|
|
|
return m_cAttribNum;
|
2014-06-18 11:54:25 +08:00
|
|
|
}
|
|
|
|
|
2014-07-01 16:31:17 +08:00
|
|
|
stExpCocoAttribDesc* stExpCocoObjectDesc::GetAttribDescArray(CocoLoader* pCoco)
|
|
|
|
{
|
|
|
|
return (stExpCocoAttribDesc*)( pCoco->GetMemoryAddr_AttribDesc() + m_pAttribDescArray );
|
|
|
|
}
|
|
|
|
|
|
|
|
Type stExpCocoNode::GetType(CocoLoader* pCoco)
|
2014-06-18 11:54:25 +08:00
|
|
|
{
|
2014-07-01 16:31:17 +08:00
|
|
|
|
|
|
|
Type tType = kObjectType;
|
|
|
|
if(m_ObjIndex >= 0)
|
|
|
|
{
|
|
|
|
stExpCocoObjectDesc* tpCocoObjectDesc = pCoco->GetCocoObjectDescArray() ;
|
|
|
|
if( m_AttribIndex >= 0 )
|
|
|
|
{
|
|
|
|
stExpCocoAttribDesc* tpAttribDescArray = (stExpCocoAttribDesc*) tpCocoObjectDesc[m_ObjIndex].GetAttribDescArray(pCoco);
|
|
|
|
tType = Type(tpAttribDescArray[m_AttribIndex].m_cTypeName - 'N' + kNullType);
|
|
|
|
|
2014-07-03 14:38:45 +08:00
|
|
|
if(kFalseType == tType || kTrueType == tType)
|
2014-07-01 16:31:17 +08:00
|
|
|
{
|
|
|
|
char* szValue = (char*)GetValue(pCoco);
|
|
|
|
if(szValue[0] == '0')
|
|
|
|
{
|
|
|
|
return kFalseType;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return kTrueType;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
tType = kObjectType;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if(m_AttribIndex >= 0)
|
|
|
|
{
|
|
|
|
tType = (Type)m_ChildNum;
|
|
|
|
|
|
|
|
if(kFalseType == tType || kTrueType == tType)
|
|
|
|
{
|
|
|
|
char* szValue = (char*)GetValue(pCoco);
|
|
|
|
if(szValue[0] == '0')
|
|
|
|
{
|
|
|
|
return kFalseType;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return kTrueType;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
tType = kArrayType;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return tType;
|
2014-06-18 11:54:25 +08:00
|
|
|
}
|
|
|
|
|
2014-07-01 16:31:17 +08:00
|
|
|
char* stExpCocoNode::GetName(CocoLoader* pCoco)
|
2014-06-18 11:54:25 +08:00
|
|
|
{
|
2014-07-01 16:31:17 +08:00
|
|
|
char* szName = NULL ;
|
|
|
|
if(m_ObjIndex >= 0)
|
|
|
|
{
|
|
|
|
stExpCocoObjectDesc* tpCocoObjectDesc = pCoco->GetCocoObjectDescArray();
|
|
|
|
if( m_AttribIndex >= 0 )
|
|
|
|
{
|
|
|
|
stExpCocoAttribDesc* tpAttribDescArray = (stExpCocoAttribDesc*) tpCocoObjectDesc[m_ObjIndex].GetAttribDescArray(pCoco);
|
|
|
|
szName = tpAttribDescArray[m_AttribIndex].GetName(pCoco);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
char* szValue = GetValue(pCoco);
|
|
|
|
if(szValue[0])
|
|
|
|
{
|
|
|
|
szName = GetValue(pCoco);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
szName = tpCocoObjectDesc[m_ObjIndex].GetName(pCoco);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if(m_AttribIndex >= 0)
|
|
|
|
{
|
|
|
|
char* pStringAddr = (char*)pCoco->GetCocoObjectDescArray() + pCoco->GetFileHeader()->m_lStringMemAddr ;
|
|
|
|
szName = m_ChildArray + pStringAddr;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
szName = (char*)GetValue(pCoco);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return szName ;
|
|
|
|
|
2014-06-18 11:54:25 +08:00
|
|
|
}
|
|
|
|
|
2014-07-01 16:31:17 +08:00
|
|
|
char* stExpCocoNode::GetValue(CocoLoader* pCoco)
|
2014-06-18 11:54:25 +08:00
|
|
|
{
|
2014-07-01 16:31:17 +08:00
|
|
|
return ( pCoco->GetMemoryAddr_String() + m_szValue );
|
|
|
|
}
|
|
|
|
|
|
|
|
int stExpCocoNode::GetChildNum()
|
|
|
|
{
|
|
|
|
return m_ChildNum;
|
|
|
|
}
|
2014-06-18 11:54:25 +08:00
|
|
|
|
2014-07-01 16:31:17 +08:00
|
|
|
stExpCocoNode* stExpCocoNode::GetChildArray(CocoLoader* pCoco)
|
|
|
|
{
|
|
|
|
return (stExpCocoNode*)( pCoco->GetMemoryAddr_CocoNode() + m_ChildArray );
|
2014-06-18 11:54:25 +08:00
|
|
|
}
|
2014-06-05 10:24:12 +08:00
|
|
|
|
2014-06-18 11:54:25 +08:00
|
|
|
CocoLoader::CocoLoader()
|
|
|
|
{
|
2014-07-01 16:31:17 +08:00
|
|
|
m_pRootNode = NULL;
|
|
|
|
m_pObjectDescArray = NULL;
|
|
|
|
m_pMemoryBuff = NULL;
|
2014-06-05 10:24:12 +08:00
|
|
|
}
|
|
|
|
|
2014-06-18 11:54:25 +08:00
|
|
|
CocoLoader::~CocoLoader()
|
|
|
|
{
|
2014-07-01 16:31:17 +08:00
|
|
|
if(m_pMemoryBuff)
|
|
|
|
{
|
|
|
|
delete[] m_pMemoryBuff;
|
|
|
|
m_pMemoryBuff = NULL;
|
|
|
|
}
|
|
|
|
|
2014-06-18 11:54:25 +08:00
|
|
|
}
|
|
|
|
|
2014-07-01 16:31:17 +08:00
|
|
|
bool CocoLoader::ReadCocoBinBuff(char* pBinBuff)
|
2014-06-18 11:54:25 +08:00
|
|
|
{
|
2014-07-01 16:31:17 +08:00
|
|
|
if(m_pMemoryBuff)return true;
|
2014-06-18 11:54:25 +08:00
|
|
|
char* pTempBuff = pBinBuff;
|
2014-07-01 16:31:17 +08:00
|
|
|
|
2014-06-18 11:54:25 +08:00
|
|
|
m_pFileHeader = (stCocoFileHeader*)pTempBuff;
|
|
|
|
pTempBuff += sizeof(stCocoFileHeader);
|
2014-07-01 16:31:17 +08:00
|
|
|
char* pStartAddr = m_pMemoryBuff = pTempBuff;
|
|
|
|
|
|
|
|
if( m_pFileHeader->m_nCompressSize > 0 )
|
|
|
|
{
|
|
|
|
char* pDestBuff = new char[m_pFileHeader->m_nDataSize];
|
|
|
|
uLongf dwSrcSize = m_pFileHeader->m_nCompressSize;
|
|
|
|
uLongf dwDestSize = m_pFileHeader->m_nDataSize;
|
|
|
|
int nRes = uncompress((Bytef*)pDestBuff,&dwDestSize,(Bytef*)m_pMemoryBuff,dwSrcSize);
|
|
|
|
pStartAddr = m_pMemoryBuff = pDestBuff;
|
|
|
|
}
|
|
|
|
|
2014-06-18 11:54:25 +08:00
|
|
|
m_pObjectDescArray = (stExpCocoObjectDesc*)pStartAddr;
|
2014-07-01 16:31:17 +08:00
|
|
|
|
2014-06-18 11:54:25 +08:00
|
|
|
char* pCocoMemAddr = pStartAddr + m_pFileHeader->m_CocoNodeMemAddr;
|
2014-07-01 16:31:17 +08:00
|
|
|
|
2014-06-18 11:54:25 +08:00
|
|
|
m_pRootNode = (stExpCocoNode*)pCocoMemAddr;
|
2014-07-01 16:31:17 +08:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
stExpCocoObjectDesc* CocoLoader::GetCocoObjectDesc(const char* szObjDesc)
|
|
|
|
{
|
|
|
|
for(int i = 0 ; i < m_pFileHeader->m_ObjectCount ; i++)
|
|
|
|
{
|
|
|
|
if(0 == strcmp((char*)m_pObjectDescArray[i].m_szName,szObjDesc))
|
|
|
|
{
|
|
|
|
return &m_pObjectDescArray[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
2014-06-18 11:54:25 +08:00
|
|
|
|
2014-07-01 16:31:17 +08:00
|
|
|
stExpCocoObjectDesc* CocoLoader::GetCocoObjectDesc(int vIndex)
|
|
|
|
{
|
|
|
|
if(vIndex >= 0 && vIndex < m_pFileHeader->m_ObjectCount)
|
|
|
|
{
|
|
|
|
return &m_pObjectDescArray[vIndex];
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
2014-06-18 11:54:25 +08:00
|
|
|
|
2014-07-01 16:31:17 +08:00
|
|
|
char* CocoLoader::GetMemoryAddr_AttribDesc()
|
|
|
|
{
|
|
|
|
return m_pMemoryBuff + m_pFileHeader->m_lAttribMemAddr ;
|
|
|
|
}
|
2014-06-18 11:54:25 +08:00
|
|
|
|
2014-07-01 16:31:17 +08:00
|
|
|
char* CocoLoader::GetMemoryAddr_CocoNode()
|
|
|
|
{
|
|
|
|
return m_pMemoryBuff + m_pFileHeader->m_CocoNodeMemAddr;
|
2014-06-18 11:54:25 +08:00
|
|
|
}
|
|
|
|
|
2014-07-01 16:31:17 +08:00
|
|
|
char* CocoLoader::GetMemoryAddr_String()
|
2014-06-18 11:54:25 +08:00
|
|
|
{
|
2014-07-01 16:31:17 +08:00
|
|
|
return m_pMemoryBuff + m_pFileHeader->m_lStringMemAddr ;
|
|
|
|
|
2014-06-18 11:54:25 +08:00
|
|
|
}
|
|
|
|
}
|