#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 *m_pRootDict; CCDictionary *m_pCurDict; std::stack*> 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 *getDict() { return m_pRootDict; } CCDictionary *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 *pNewDict = new CCDictionary(); 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*)(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 : "); 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 *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;