diff options
author | vng <viktor.govako@gmail.com> | 2012-10-30 17:24:15 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:46:28 +0300 |
commit | 77564c5b7a3c2448a0fb7d46d1104a756eaeaf27 (patch) | |
tree | c2c56b396ec5e943a103bd239d0d3a8a7f734586 /platform | |
parent | f05dcc2e4838503e9ebc204cfa1c894bda9ff46f (diff) |
Make GetFilesInDir with GetFilesByExt and GetFilesByRegExp function in Platform.
Diffstat (limited to 'platform')
-rw-r--r-- | platform/platform.cpp | 25 | ||||
-rw-r--r-- | platform/platform.hpp | 9 | ||||
-rw-r--r-- | platform/platform_android.cpp | 12 | ||||
-rw-r--r-- | platform/platform_ios.mm | 4 | ||||
-rw-r--r-- | platform/platform_qt.cpp | 16 | ||||
-rw-r--r-- | platform/platform_tests/downloader_test.cpp | 9 | ||||
-rw-r--r-- | platform/platform_tests/platform_test.cpp | 18 | ||||
-rw-r--r-- | platform/platform_unix_impl.cpp | 24 | ||||
-rw-r--r-- | platform/platform_unix_impl.hpp | 4 |
9 files changed, 78 insertions, 43 deletions
diff --git a/platform/platform.cpp b/platform/platform.cpp index b611a0851a..e048ea1f69 100644 --- a/platform/platform.cpp +++ b/platform/platform.cpp @@ -59,7 +59,7 @@ void Platform::GetFontNames(FilesList & res) const for (size_t i = 0; i < ARRAY_SIZE(arr); ++i) { LOG(LDEBUG, ("Searching for fonts in", arr[i])); - GetFilesInDir(arr[i], "*.ttf", res); + GetFilesByExt(arr[i], "*.ttf", res); } sort(res.begin(), res.end()); @@ -67,3 +67,26 @@ void Platform::GetFontNames(FilesList & res) const LOG(LINFO, ("Available font files:", (res))); } + +void Platform::GetFilesByExt(string const & directory, string const & ext, FilesList & outFiles) +{ + // Transform extension mask to regexp (*.mwm -> \.mwm$) + ASSERT ( !ext.empty(), () ); + + string regexp; + if (ext[0] == '*') + { + regexp = ext + '$'; + regexp[0] = '\\'; + } + else if (ext[0] == '.') + { + regexp = '\\' + ext + '$'; + } + else + { + regexp = "\\." + ext + '$'; + } + + GetFilesByRegExp(directory, regexp, outFiles); +} diff --git a/platform/platform.hpp b/platform/platform.hpp index 2cd0eeac99..f5a9b9649d 100644 --- a/platform/platform.hpp +++ b/platform/platform.hpp @@ -75,9 +75,12 @@ public: typedef vector<string> FilesList; /// Retrieves files list contained in given directory /// @param directory directory path with slash at the end - /// @param mask files extension to find, like ".map" etc - /// @return number of files found in outFiles - static void GetFilesInDir(string const & directory, string const & mask, FilesList & outFiles); + //@{ + /// @param ext files extension to find, like ".mwm", "*.ttf" etc + static void GetFilesByExt(string const & directory, string const & ext, FilesList & outFiles); + static void GetFilesByRegExp(string const & directory, string const & regexp, FilesList & outFiles); + //@} + /// @return false if file is not exist /// @note Check files in Writable dir first, and in ReadDir if not exist in Writable dir bool GetFileSizeByName(string const & fileName, uint64_t & size) const; diff --git a/platform/platform_android.cpp b/platform/platform_android.cpp index 16e5ad882d..2b819c8050 100644 --- a/platform/platform_android.cpp +++ b/platform/platform_android.cpp @@ -1,6 +1,7 @@ #include "platform.hpp" #include "platform_unix_impl.hpp" #include "constants.hpp" +#include "regexp.hpp" #include "../coding/zip_reader.hpp" @@ -33,7 +34,7 @@ ModelReader * Platform::GetReader(string const & file) const } } -void Platform::GetFilesInDir(string const & directory, string const & mask, FilesList & res) +void Platform::GetFilesByRegExp(string const & directory, string const & regexp, FilesList & res) { if (ZipFileReader::IsZip(directory)) { @@ -41,14 +42,15 @@ void Platform::GetFilesInDir(string const & directory, string const & mask, File FilesList fList; ZipFileReader::FilesList(directory, fList); - string const fixedMask = pl::GetFixedMask(mask); + regexp::RegExpT exp; + regexp::Create(regexp, exp); for (FilesList::iterator it = fList.begin(); it != fList.end(); ++it) { - if (it->find(fixedMask) != string::npos) + if (regexp::IsExist(*it, exp)) { // Remove assets/ prefix - clean files are needed for fonts white/blacklisting logic - static size_t const ASSETS_LENGTH = 7; + size_t const ASSETS_LENGTH = 7; if (it->find("assets/") == 0) it->erase(0, ASSETS_LENGTH); @@ -57,7 +59,7 @@ void Platform::GetFilesInDir(string const & directory, string const & mask, File } } else - pl::EnumerateFilesInDir(directory, mask, res); + pl::EnumerateFilesByRegExp(directory, regexp, res); } int Platform::CpuCores() const diff --git a/platform/platform_ios.mm b/platform/platform_ios.mm index 1fe47165f8..c9ed79f358 100644 --- a/platform/platform_ios.mm +++ b/platform/platform_ios.mm @@ -84,9 +84,9 @@ Platform::~Platform() delete m_impl; } -void Platform::GetFilesInDir(string const & directory, string const & mask, FilesList & res) +void Platform::GetFilesByRegExp(string const & directory, string const & regexp, FilesList & res) { - pl::EnumerateFilesInDir(directory, mask, res); + pl::EnumerateFilesByRegExp(directory, regexp, res); } bool Platform::GetFileSizeByName(string const & fileName, uint64_t & size) const diff --git a/platform/platform_qt.cpp b/platform/platform_qt.cpp index c0265141b7..22ad70de62 100644 --- a/platform/platform_qt.cpp +++ b/platform/platform_qt.cpp @@ -1,5 +1,6 @@ #include "platform.hpp" #include "constants.hpp" +#include "regexp.hpp" #include "../coding/file_reader.hpp" @@ -29,13 +30,20 @@ bool Platform::GetFileSizeByName(string const & fileName, uint64_t & size) const } } -void Platform::GetFilesInDir(string const & directory, string const & mask, FilesList & outFiles) +void Platform::GetFilesByRegExp(string const & directory, string const & regexp, FilesList & outFiles) { - QDir dir(directory.c_str(), mask.c_str(), QDir::Unsorted, - QDir::Files | QDir::Readable | QDir::Dirs | QDir::NoDotAndDotDot); + regexp::RegExpT exp; + regexp::Create(regexp, exp); + + QDir dir(QString::fromUtf8(directory.c_str())); int const count = dir.count(); + for (int i = 0; i < count; ++i) - outFiles.push_back(dir[i].toUtf8().data()); + { + string const name = dir[i].toUtf8().data(); + if (regexp::IsExist(name, exp)) + outFiles.push_back(name); + } } string Platform::DeviceName() const diff --git a/platform/platform_tests/downloader_test.cpp b/platform/platform_tests/downloader_test.cpp index a9a97a8431..be7b3293f8 100644 --- a/platform/platform_tests/downloader_test.cpp +++ b/platform/platform_tests/downloader_test.cpp @@ -372,10 +372,13 @@ namespace { void DeleteTempDownloadFiles() { - // remove data from previously failed files + // Remove data from previously failed files. + + // Get regexp like this: (\.downloading3$|\.resume3$) + string const regexp = "(\\" RESUME_FILE_EXTENSION "$|\\" DOWNLOADING_FILE_EXTENSION "$)"; + Platform::FilesList files; - Platform::GetFilesInDir(".", "*" RESUME_FILE_EXTENSION, files); - Platform::GetFilesInDir(".", "*" DOWNLOADING_FILE_EXTENSION, files); + Platform::GetFilesByRegExp(".", regexp, files); for (Platform::FilesList::iterator it = files.begin(); it != files.end(); ++it) FileWriter::DeleteFileX(*it); } diff --git a/platform/platform_tests/platform_test.cpp b/platform/platform_tests/platform_test.cpp index 8d20467585..c94950881c 100644 --- a/platform/platform_tests/platform_test.cpp +++ b/platform/platform_tests/platform_test.cpp @@ -60,18 +60,22 @@ UNIT_TEST(GetReader) TEST_EQUAL(wasException, true, ()); } -UNIT_TEST(GetFilesInDir) +UNIT_TEST(GetFilesInDir_Smoke) { Platform & pl = GetPlatform(); - Platform::FilesList files; + Platform::FilesList files1, files2; - pl.GetFilesInDir(pl.WritableDir(), "*" DATA_FILE_EXTENSION, files); - TEST_GREATER(files.size(), 0, ("/data/ folder should contain some data files")); + string const dir = pl.WritableDir(); - files.clear(); + pl.GetFilesByExt(dir, "*" DATA_FILE_EXTENSION, files1); + TEST_GREATER(files1.size(), 0, ("/data/ folder should contain some data files")); - pl.GetFilesInDir(pl.WritableDir(), "asdnonexistentfile.dsa", files); - TEST_EQUAL(files.size(), 0, ()); + pl.GetFilesByRegExp(dir, ".*\\" DATA_FILE_EXTENSION "$", files2); + TEST_EQUAL(files1, files2, ()); + + files1.clear(); + pl.GetFilesByExt(dir, "asdnonexistentfile.dsa", files1); + TEST_EQUAL(files1.size(), 0, ()); } UNIT_TEST(GetFileSize) diff --git a/platform/platform_unix_impl.cpp b/platform/platform_unix_impl.cpp index c1819a0eee..90132f2b9d 100644 --- a/platform/platform_unix_impl.cpp +++ b/platform/platform_unix_impl.cpp @@ -1,5 +1,6 @@ #include "platform.hpp" #include "platform_unix_impl.hpp" +#include "regexp.hpp" #include "../base/logging.hpp" @@ -52,31 +53,22 @@ Platform::TStorageStatus Platform::GetWritableStorageStatus(uint64_t neededSize) namespace pl { -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 EnumerateFilesInDir(string const & directory, string const & mask, vector<string> & res) +void EnumerateFilesByRegExp(string const & directory, string const & regexp, + vector<string> & res) { DIR * dir; struct dirent * entry; if ((dir = opendir(directory.c_str())) == NULL) return; - string const fixedMask = GetFixedMask(mask); + regexp::RegExpT exp; + regexp::Create(regexp, exp); while ((entry = readdir(dir)) != 0) { - 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); + string const name(entry->d_name); + if (regexp::IsExist(name, exp)) + res.push_back(name); } closedir(dir); diff --git a/platform/platform_unix_impl.hpp b/platform/platform_unix_impl.hpp index 0823c925c5..efca59f8cb 100644 --- a/platform/platform_unix_impl.hpp +++ b/platform/platform_unix_impl.hpp @@ -5,6 +5,6 @@ namespace pl { - string GetFixedMask(string const & mask); - void EnumerateFilesInDir(string const & directory, string const & mask, vector<string> & res); + void EnumerateFilesByRegExp(string const & directory, string const & regexp, + vector<string> & res); } |