axmol/cocos2dx/platform/airplay/CCFileUtils_airplay.cpp

224 lines
5.2 KiB
C++

#include "CCFileUtils.h"
#include "string.h"
#include "stack"
#include "expat.h"
#include "CCString.h"
#include "support/file_support/FileData.h"
#include "support/zip_support/unzip.h"
#include "CCSAXParser_airplay.h"
#include "CCApplication.h"
#include "CCMutableArray.h"
NS_CC_BEGIN;
typedef enum
{
SAX_NONE = 0,
SAX_KEY,
SAX_DICT,
SAX_INT,
SAX_REAL,
SAX_STRING
}CCSAXState;
class CCDictMaker : public CCSAXDelegator
{
public:
CCDictionary<std::string, CCObject*> *m_pRootDict;
CCDictionary<std::string, CCObject*> *m_pCurDict;
std::stack<CCDictionary<std::string, CCObject*>*> m_tDictStack;
std::string m_sCurKey;///< parsed key
CCSAXState m_tState;
public:
CCDictMaker()
{
m_pRootDict = NULL;
m_pCurDict = NULL;
m_tState = SAX_NONE;
}
~CCDictMaker()
{
}
CCDictionary<std::string, CCObject*> *getDict()
{
return m_pRootDict;
}
CCDictionary<std::string, CCObject*> *dictionaryWithContentsOfFile(const char *pFileName)
{
CCSAXParser parser;
parser.init(NULL);
parser.setDelegator(this);
parser.parse(pFileName);
return m_pRootDict;
}
void startElement(void *ctx, const XML_Char *name, const XML_Char **atts)
{
CCDictMaker *pMaker = this;
std::string sName((char*)name);
if( sName == "dict" )
{
CCDictionary<std::string, CCObject*> *pNewDict = new CCDictionary<std::string, CCObject*>();
if(! pMaker->m_pRootDict)
{
pMaker->m_pRootDict = pNewDict;
pNewDict->autorelease();
}
else
{
CCAssert(pMaker->m_pCurDict && !pMaker->m_sCurKey.empty(), "");
pMaker->m_pCurDict->setObject(pNewDict, pMaker->m_sCurKey);
pNewDict->release();
pMaker->m_sCurKey.clear();
}
pMaker->m_pCurDict = pNewDict;
pMaker->m_tDictStack.push(pMaker->m_pCurDict);
pMaker->m_tState = SAX_DICT;
}
else if(sName == "key")
{
pMaker->m_tState = SAX_KEY;
}
else if(sName == "integer")
{
pMaker->m_tState = SAX_INT;
}
else if(sName == "real")
{
pMaker->m_tState = SAX_REAL;
}
else if(sName == "string")
{
pMaker->m_tState = SAX_STRING;
}
else
{
pMaker->m_tState = SAX_NONE;
}
}
void endElement(void *ctx, const XML_Char *name)
{
CCDictMaker * pMaker = this;
std::string sName((char*)name);
if( sName == "dict" )
{
pMaker->m_tDictStack.pop();
if ( !pMaker->m_tDictStack.empty() )
{
pMaker->m_pCurDict = (CCDictionary<std::string, CCObject*>*)(pMaker->m_tDictStack.top());
}
}
pMaker->m_tState = SAX_NONE;
}
void textHandler(void *ctx, const XML_Char *ch, int len)
{
CCDictMaker * pMaker = this;
if (pMaker->m_tState == SAX_NONE)
{
return;
}
CCString *pText = new CCString();
pText->m_sString = std::string((char*)ch,0,len);
switch(pMaker->m_tState)
{
case SAX_KEY:
{
pMaker->m_sCurKey = pText->m_sString;
}
break;
case SAX_INT:
case SAX_REAL:
{
CCAssert(!pMaker->m_sCurKey.empty(), "not found real : <integet/real>");
pMaker->m_pCurDict->setObject(pText, pMaker->m_sCurKey);
break;
}
case SAX_STRING:
{
CCAssert(!pMaker->m_sCurKey.empty(), "not found string");
pMaker->m_pCurDict->setObject(pText, pMaker->m_sCurKey);
break;
}
}
pText->release();
}
};
static char s_pszResourcePath[S3E_FILE_MAX_PATH] = {0};
const char* CCFileUtils::fullPathFromRelativePath(const char *pszRelativePath)
{
IwAssert(GAME, pszRelativePath);
CCString * pRet = new CCString();
pRet->autorelease();
if ((strlen(pszRelativePath) > 1 && pszRelativePath[1] == ':'))
{
pRet->m_sString = pszRelativePath;
}
else if (strlen(pszRelativePath) > 0 && pszRelativePath[0] == '/')
{
char szDriver[3] = {s_pszResourcePath[0], s_pszResourcePath[1], 0};
pRet->m_sString = szDriver;
pRet->m_sString += pszRelativePath;
}
else
{
pRet->m_sString = s_pszResourcePath;
pRet->m_sString += pszRelativePath;
}
return pRet->m_sString.c_str();
}
const char *CCFileUtils::fullPathFromRelativeFile(const char *pszFilename, const char *pszRelativeFile)
{
std::string relativeFile = fullPathFromRelativePath(pszRelativeFile);
CCString *pRet = new CCString();
pRet->autorelease();
pRet->m_sString = relativeFile.substr(0, relativeFile.rfind('/')+1);
pRet->m_sString += pszFilename;
return pRet->m_sString.c_str();
}
CCDictionary<std::string, CCObject*> *CCFileUtils::dictionaryWithContentsOfFile(const char *pFileName)
{
CCDictMaker tMaker;
return tMaker.dictionaryWithContentsOfFile(pFileName);
}
unsigned char* CCFileUtils::getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize)
{
IW_CALLSTACK("CCFileUtils::getFileData");
s3eFile* pFile = s3eFileOpen(pszFileName, pszMode);
IwAssertMsg(GAME, pFile, ("Open file %s Failed. s3eFileError Code : %i", pszFileName, s3eFileGetError()));
int32 fileSize = s3eFileGetSize(pFile);
*pSize=fileSize;
static int32* pDataToBeReadBinary;
pDataToBeReadBinary = (int32*)s3eMallocBase(fileSize);
memset(pDataToBeReadBinary, 0, fileSize);
s3eFileRead(pDataToBeReadBinary, fileSize, 1, pFile);
s3eFileClose(pFile);
return (unsigned char*)pDataToBeReadBinary;
}
NS_CC_END;