diff --git a/coding/zip_reader.cpp b/coding/zip_reader.cpp index 37765e4463..4eed5c536f 100644 --- a/coding/zip_reader.cpp +++ b/coding/zip_reader.cpp @@ -38,9 +38,9 @@ ZipFileReader::ZipFileReader(string const & container, string const & file) m_uncompressedFileSize = fileInfo.uncompressed_size; } -vector ZipFileReader::FilesList(string const & zipContainer) +void ZipFileReader::FilesList(string const & zipContainer, FileListT & filesList) { - unzFile zip = unzOpen64(zipContainer.c_str()); + unzFile const zip = unzOpen64(zipContainer.c_str()); if (!zip) MYTHROW(OpenZipException, ("Can't get zip file handle", zipContainer)); @@ -49,7 +49,6 @@ vector ZipFileReader::FilesList(string const & zipContainer) if (UNZ_OK != unzGoToFirstFile(zip)) MYTHROW(LocateZipException, ("Can't find first file inside zip", zipContainer)); - vector filesList; do { char fileName[256]; @@ -59,8 +58,6 @@ vector ZipFileReader::FilesList(string const & zipContainer) filesList.push_back(fileName); } while (UNZ_OK == unzGoToNextFile(zip)); - - return filesList; } bool ZipFileReader::IsZip(string const & zipContainer) diff --git a/coding/zip_reader.hpp b/coding/zip_reader.hpp index 02a3fb6124..b00e7fcad0 100644 --- a/coding/zip_reader.hpp +++ b/coding/zip_reader.hpp @@ -13,14 +13,15 @@ #include "../std/function.hpp" + class ZipFileReader : public BaseZipFileReaderType { private: uint64_t m_uncompressedFileSize; public: - typedef function ProgressFn; + typedef vector FileListT; DECLARE_EXCEPTION(OpenZipException, OpenException); DECLARE_EXCEPTION(LocateZipException, OpenException); @@ -35,7 +36,8 @@ public: static void UnzipFile(string const & zipContainer, string const & fileInZip, string const & outFilePath, ProgressFn progressFn = ProgressFn()); - static vector FilesList(string const & zipContainer); + static void FilesList(string const & zipContainer, FileListT & filesList); + /// Quick version without exceptions static bool IsZip(string const & zipContainer); }; diff --git a/platform/platform_android.cpp b/platform/platform_android.cpp index d3c2ac750e..b408977c03 100644 --- a/platform/platform_android.cpp +++ b/platform/platform_android.cpp @@ -32,27 +32,39 @@ ModelReader * Platform::GetReader(string const & file) const } } +namespace +{ + string GetFixedMask(string const & mask) + { + // Filter out according to the mask. + // @TODO we don't support wildcards at the moment + if (!mask.empty() && mask[0] == '*') + return string(mask.c_str() + 1); + else + return mask; + } +} + void Platform::GetFilesInDir(string const & directory, string const & mask, FilesList & res) { if (ZipFileReader::IsZip(directory)) - { // Get files list inside zip file - res = ZipFileReader::FilesList(directory); - // filter out according to the mask - // @TODO we don't support wildcards at the moment - string fixedMask = mask; - if (fixedMask.size() && fixedMask[0] == '*') - fixedMask.erase(0, 1); - for (FilesList::iterator it = res.begin(); it != res.end();) + { + // Get files list inside zip file + FilesList fList; + ZipFileReader::FilesList(directory, fList); + + string const fixedMask = GetFixedMask(mask); + + for (FilesList::iterator it = fList.begin(); it != fList.end(); ++it) { - if (it->find(fixedMask) == string::npos) - it = res.erase(it); - else + if (it->find(fixedMask) != string::npos) { // Remove assets/ prefix - clean files are needed for fonts white/blacklisting logic static size_t const ASSETS_LENGTH = 7; if (it->find("assets/") == 0) it->erase(0, ASSETS_LENGTH); - ++it; + + res.push_back(*it); } } } @@ -62,22 +74,16 @@ void Platform::GetFilesInDir(string const & directory, string const & mask, File struct dirent * entry; if ((dir = opendir(directory.c_str())) == NULL) return; - // TODO: take wildcards into account... - string mask_fixed = mask; - if (mask_fixed.size() && mask_fixed[0] == '*') - mask_fixed.erase(0, 1); - do + + string const fixedMask = GetFixedMask(mask); + + while ((entry = readdir(dir)) != 0) { - if ((entry = readdir(dir)) != NULL) - { - string fname(entry->d_name); - size_t index = fname.rfind(mask_fixed); - if (index != string::npos && index == fname.size() - mask_fixed.size()) - { - res.push_back(fname); - } - } - } while (entry != NULL); + string const fname(entry->d_name); + size_t const index = fname.rfind(fixedMask); + if ((index != string::npos) && (index == fname.size() - fixedMask.size())) + res.push_back(fname); + } closedir(dir); }