remove '../' at path on android.

because AAssetManager_open do not support '../' in path.
This commit is contained in:
lite3 2014-09-29 19:25:00 +08:00
parent 09ebebc6d2
commit 240b922271
2 changed files with 54 additions and 0 deletions

View File

@ -81,6 +81,58 @@ bool FileUtilsAndroid::init()
return FileUtils::init();
}
std::string FileUtilsAndroid::getNewFilename(const std::string &filename) const
{
std::string newFileName = FileUtils::getNewFilename(filename);
// ../xxx do not fix this path
auto pos = newFileName.find("../");
if (pos == std::string::npos || pos == 0)
{
return newFileName;
}
std::vector<std::string> v(3);
v.resize(0);
auto change = false;
size_t size = newFileName.size();
size_t idx = 0;
bool noexit = true;
while (noexit)
{
pos = newFileName.find('/', idx);
std::string tmp;
if (pos == std::string::npos)
{
tmp = newFileName.substr(idx, size - idx);
noexit = false;
}else
{
tmp = newFileName.substr(idx, pos - idx + 1);
}
auto t = v.size();
if (t > 0 && v[t-1].compare("../") != 0 &&
(tmp.compare("../") == 0 || tmp.compare("..") == 0))
{
v.pop_back();
change = true;
}else
{
v.push_back(tmp);
}
idx = pos + 1;
}
if (change)
{
newFileName.clear();
for (auto s : v)
{
newFileName.append(s);
}
}
return newFileName;
}
bool FileUtilsAndroid::isFileExistInternal(const std::string& strFilePath) const
{
if (strFilePath.empty())

View File

@ -61,6 +61,8 @@ public:
/* override funtions */
bool init();
std::string getNewFilename(const std::string &filename) const override;
/** @deprecated Please use FileUtils::getDataFromFile or FileUtils::getStringFromFile instead. */
CC_DEPRECATED_ATTRIBUTE virtual unsigned char* getFileData(const std::string& filename, const char* mode, ssize_t * size) override;