mirror of https://github.com/axmolengine/axmol.git
Refactored CCFileUtils for Marmalade port.
This commit is contained in:
parent
73389d68d5
commit
cefef60e11
|
@ -36,7 +36,6 @@
|
|||
|
||||
NS_CC_BEGIN;
|
||||
|
||||
static char s_pszResourcePath[S3E_FILE_MAX_PATH] = {0};
|
||||
|
||||
static CCFileUtils* s_pFileUtils = NULL;
|
||||
|
||||
|
@ -45,15 +44,30 @@ CCFileUtils* CCFileUtils::sharedFileUtils()
|
|||
if (s_pFileUtils == NULL)
|
||||
{
|
||||
s_pFileUtils = new CCFileUtils();
|
||||
s_pFileUtils->init();
|
||||
}
|
||||
return s_pFileUtils;
|
||||
}
|
||||
|
||||
bool CCFileUtils::init()
|
||||
{
|
||||
m_pSearchPathArray = new CCArray();
|
||||
m_pSearchPathArray->addObject(CCString::create(""));
|
||||
|
||||
m_pSearchResolutionsOrderArray = new CCArray();
|
||||
m_pSearchResolutionsOrderArray->addObject(CCString::create(""));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CCFileUtils::purgeFileUtils()
|
||||
{
|
||||
if (s_pFileUtils != NULL)
|
||||
{
|
||||
s_pFileUtils->purgeCachedEntries();
|
||||
CC_SAFE_RELEASE(s_pFileUtils->m_pFilenameLookupDict);
|
||||
CC_SAFE_RELEASE(s_pFileUtils->m_pSearchPathArray);
|
||||
CC_SAFE_RELEASE(s_pFileUtils->m_pSearchResolutionsOrderArray);
|
||||
}
|
||||
|
||||
CC_SAFE_DELETE(s_pFileUtils);
|
||||
|
@ -64,74 +78,109 @@ void CCFileUtils::purgeCachedEntries()
|
|||
|
||||
}
|
||||
|
||||
const char* CCFileUtils::fullPathFromRelativePath(const char *pszRelativePath)
|
||||
std::string CCFileUtils::getPathForFilename(const std::string& filename, const std::string& resourceDirectory, const std::string& searchPath)
|
||||
{
|
||||
std::string ret = "";
|
||||
|
||||
if (ret[ret.length()-1] != '\\' && ret[ret.length()-1] != '/')
|
||||
{
|
||||
ret += "/";
|
||||
}
|
||||
|
||||
std::string file = filename;
|
||||
std::string file_path = "";
|
||||
size_t pos = filename.find_last_of("/");
|
||||
if (pos != std::string::npos)
|
||||
{
|
||||
file_path = filename.substr(0, pos+1);
|
||||
file = filename.substr(pos+1);
|
||||
}
|
||||
|
||||
// searchPath + file_path + resourceDirectory
|
||||
std::string path = searchPath;
|
||||
if (path.size() > 0 && path[path.length()-1] != '/')
|
||||
{
|
||||
path += "/";
|
||||
}
|
||||
path += file_path;
|
||||
path += resourceDirectory;
|
||||
|
||||
if (path.size() > 0 && path[path.length()-1] != '/')
|
||||
{
|
||||
path += "/";
|
||||
}
|
||||
path += file;
|
||||
ret += path;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
const char* CCFileUtils::fullPathForFilename(const char* pszFileName)
|
||||
{
|
||||
// TODO HOW ARE WE SUPPOSED TO WRITE BACK TO THE "ignore" REFERENCE?
|
||||
IwAssert(GAME, pszRelativePath);
|
||||
IwAssert(GAME, pszFileName);
|
||||
|
||||
bool bFileExist = true;
|
||||
const char* resDir = m_obDirectory.c_str();
|
||||
CCString * pRet = new CCString();
|
||||
|
||||
pRet->autorelease();
|
||||
if ((strlen(pszRelativePath) > 1 && pszRelativePath[1] == ':'))
|
||||
if (pszFileName && pszFileName[0] == '/')
|
||||
{
|
||||
pRet->m_sString = resDir;
|
||||
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 += resDir;
|
||||
pRet->m_sString += pszRelativePath;
|
||||
}
|
||||
else
|
||||
{
|
||||
pRet->m_sString = s_pszResourcePath;
|
||||
pRet->m_sString += resDir;
|
||||
pRet->m_sString += pszRelativePath;
|
||||
return pszFileName;
|
||||
}
|
||||
|
||||
bool exists = s3eFileCheckExists(pRet->getCString()) == S3E_TRUE;
|
||||
if (!exists)
|
||||
bool bFound = false;
|
||||
CCString* pRet = CCString::create("");
|
||||
|
||||
std::string newFileName = getNewFilename(pszFileName);
|
||||
std::string fullpath;
|
||||
|
||||
do
|
||||
{
|
||||
if ((strlen(pszRelativePath) > 1 && pszRelativePath[1] == ':'))
|
||||
CCObject* pSearchObj = NULL;
|
||||
CCARRAY_FOREACH(m_pSearchPathArray, pSearchObj)
|
||||
{
|
||||
pRet->m_sString = pszRelativePath;
|
||||
CCString* pSearchPath = (CCString*)pSearchObj;
|
||||
|
||||
CCObject* pResourceDirObj = NULL;
|
||||
CCARRAY_FOREACH(m_pSearchResolutionsOrderArray, pResourceDirObj)
|
||||
{
|
||||
CCString* pResourceDirectory = (CCString*)pResourceDirObj;
|
||||
// Search in subdirectories
|
||||
fullpath = this->getPathForFilename(newFileName, pResourceDirectory->getCString(), pSearchPath->getCString());
|
||||
|
||||
// check if file or path exist
|
||||
if (s3eFileCheckExists(fullpath.c_str()) == S3E_TRUE)
|
||||
{
|
||||
pRet->m_sString = fullpath;
|
||||
bFound = true;
|
||||
break;
|
||||
}
|
||||
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
|
||||
if (bFound)
|
||||
{
|
||||
pRet->m_sString = s_pszResourcePath;
|
||||
pRet->m_sString += pszRelativePath;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bFileExist = s3eFileCheckExists(pRet->getCString()) == S3E_TRUE;
|
||||
}while(false);
|
||||
|
||||
if (!bFound)
|
||||
{ // Can't find the file, return the relative path.
|
||||
pRet->m_sString = newFileName;
|
||||
}
|
||||
|
||||
if (!bFileExist)
|
||||
{
|
||||
pRet->m_sString = pszRelativePath;
|
||||
}
|
||||
|
||||
return pRet->m_sString.c_str();
|
||||
return pRet->getCString();
|
||||
}
|
||||
|
||||
const char* CCFileUtils::fullPathFromRelativePath(const char *pszRelativePath)
|
||||
{
|
||||
return fullPathForFilename(pszRelativePath);
|
||||
}
|
||||
|
||||
|
||||
const char *CCFileUtils::fullPathFromRelativeFile(const char *pszFilename, const char *pszRelativeFile)
|
||||
{
|
||||
|
||||
std::string relativeFile = fullPathFromRelativePath(pszRelativeFile);
|
||||
|
||||
CCString *pRet = new CCString();
|
||||
pRet->autorelease();
|
||||
std::string relativeFile = pszRelativeFile;
|
||||
CCString *pRet = CCString::create("");
|
||||
pRet->m_sString = relativeFile.substr(0, relativeFile.rfind('/')+1);
|
||||
pRet->m_sString += pszFilename;
|
||||
pRet->m_sString += getNewFilename(pszFilename);
|
||||
return pRet->m_sString.c_str();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue