diff --git a/android/jni/app/organicmaps/Framework.cpp b/android/jni/app/organicmaps/Framework.cpp index ac5ad0a6af..34c64a2835 100644 --- a/android/jni/app/organicmaps/Framework.cpp +++ b/android/jni/app/organicmaps/Framework.cpp @@ -1106,8 +1106,14 @@ Java_app_organicmaps_Framework_nativeGetMovableFilesExts(JNIEnv * env, jclass) JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_Framework_nativeGetBookmarksFilesExts(JNIEnv * env, jclass) { - const vector exts = { kKmzExtension, kKmlExtension, kKmbExtension, kGpxExtension }; - return jni::ToJavaStringArray(env, exts); + static std::array const kBookmarkExtensions = { + std::string{kKmzExtension}, + std::string{kKmlExtension}, + std::string{kKmbExtension}, + std::string{kGpxExtension} + }; + + return jni::ToJavaStringArray(env, kBookmarkExtensions); } JNIEXPORT void JNICALL diff --git a/map/bookmark_helpers.cpp b/map/bookmark_helpers.cpp index 15c9512a71..d1b54efc59 100644 --- a/map/bookmark_helpers.cpp +++ b/map/bookmark_helpers.cpp @@ -245,17 +245,25 @@ std::string RemoveInvalidSymbols(std::string const & name) return strings::ToUtf8(filtered); } -std::string GenerateUniqueFileName(const std::string & path, std::string name, std::string const & ext) + +std::string GenerateUniqueFileName(std::string const & path, std::string name, std::string_view ext) { // Remove extension, if file name already contains it. if (strings::EndsWith(name, ext)) name.resize(name.size() - ext.size()); size_t counter = 1; - std::string suffix; - while (Platform::IsFileExistsByFullPath(base::JoinPath(path, name + suffix + ext))) + std::string suffix, res; + do + { + res = name; + res = base::JoinPath(path, res.append(suffix).append(ext)); + if (!Platform::IsFileExistsByFullPath(res)) + break; suffix = strings::to_string(counter++); - return base::JoinPath(path, name + suffix + ext); + } while (true); + + return res; } std::string GenerateValidAndUniqueFilePathForKML(std::string const & fileName) @@ -264,13 +272,9 @@ std::string GenerateValidAndUniqueFilePathForKML(std::string const & fileName) if (filePath.empty()) filePath = kDefaultBookmarksFileName; - return GenerateUniqueFileName(GetBookmarksDirectory(), std::move(filePath)); + return GenerateUniqueFileName(GetBookmarksDirectory(), std::move(filePath), kKmlExtension); } -std::string const kKmzExtension = ".kmz"; -std::string const kKmlExtension = ".kml"; -std::string const kKmbExtension = ".kmb"; -std::string const kGpxExtension = ".gpx"; std::string const kDefaultBookmarksFileName = "Bookmarks"; // Populate empty category & track names based on file name: assign file name to category name, diff --git a/map/bookmark_helpers.hpp b/map/bookmark_helpers.hpp index e539988b95..e2cabe2a5e 100644 --- a/map/bookmark_helpers.hpp +++ b/map/bookmark_helpers.hpp @@ -65,10 +65,10 @@ enum class BookmarkBaseType : uint16_t Count }; -extern std::string const kKmzExtension; -extern std::string const kKmlExtension; -extern std::string const kKmbExtension; -extern std::string const kGpxExtension; +std::string_view constexpr kKmzExtension = ".kmz"; +std::string_view constexpr kKmlExtension = ".kml"; +std::string_view constexpr kKmbExtension = ".kmb"; +std::string_view constexpr kGpxExtension = ".gpx"; extern std::string const kDefaultBookmarksFileName; enum class KmlFileType @@ -93,7 +93,7 @@ inline std::string DebugPrint(KmlFileType fileType) /// @{ std::string GetBookmarksDirectory(); std::string RemoveInvalidSymbols(std::string const & name); -std::string GenerateUniqueFileName(const std::string & path, std::string name, std::string const & ext = kKmlExtension); +std::string GenerateUniqueFileName(const std::string & path, std::string name, std::string_view ext = kKmlExtension); std::string GenerateValidAndUniqueFilePathForKML(std::string const & fileName); /// @} diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index 34ecb9cb0c..945fcf497f 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -81,7 +81,7 @@ BookmarkManager::SharingResult GetFileForSharing(BookmarkManager::KMLDataCollect if (fileName.empty()) fileName = base::GetNameFromFullPathWithoutExt(kmlToShare.first); - auto const filePath = base::JoinPath(GetPlatform().TmpDir(), fileName + kKmlExtension); + auto const filePath = base::JoinPath(GetPlatform().TmpDir(), fileName.append(kKmlExtension)); SCOPE_GUARD(fileGuard, std::bind(&base::DeleteFileX, filePath)); auto const categoryId = kmlToShare.second->m_categoryData.m_id; @@ -92,7 +92,7 @@ BookmarkManager::SharingResult GetFileForSharing(BookmarkManager::KMLDataCollect "Bookmarks file does not exist."); } - auto const tmpFilePath = base::JoinPath(GetPlatform().TmpDir(), fileName + kKmzExtension); + auto const tmpFilePath = base::JoinPath(GetPlatform().TmpDir(), fileName.append(kKmzExtension)); if (!CreateZipFromPathDeflatedAndDefaultCompression(filePath, tmpFilePath)) { return BookmarkManager::SharingResult(categoryId, BookmarkManager::SharingResult::Code::ArchiveError, @@ -1798,7 +1798,7 @@ void BookmarkManager::ClearCategories() } BookmarkManager::KMLDataCollectionPtr BookmarkManager::LoadBookmarks( - std::string const & dir, std::string const & ext, KmlFileType fileType, + std::string const & dir, std::string_view ext, KmlFileType fileType, BookmarksChecker const & checker) { Platform::FilesList files; @@ -2588,7 +2588,7 @@ BookmarkManager::KMLDataCollectionPtr BookmarkManager::PrepareToSaveBookmarks( if (name.empty()) name = kDefaultBookmarksFileName; - file = GenerateUniqueFileName(fileDir, std::move(name)); + file = GenerateUniqueFileName(fileDir, std::move(name), kKmlExtension); group->SetFileName(file); } diff --git a/map/bookmark_manager.hpp b/map/bookmark_manager.hpp index 0e2d4f497e..e8882fc7f7 100644 --- a/map/bookmark_manager.hpp +++ b/map/bookmark_manager.hpp @@ -603,7 +603,7 @@ private: void LoadBookmarkRoutine(std::string const & filePath, bool isTemporaryFile); using BookmarksChecker = std::function; - KMLDataCollectionPtr LoadBookmarks(std::string const & dir, std::string const & ext, + KMLDataCollectionPtr LoadBookmarks(std::string const & dir, std::string_view ext, KmlFileType fileType, BookmarksChecker const & checker); void GetDirtyGroups(kml::GroupIdSet & dirtyGroups) const; diff --git a/map/map_tests/bookmarks_test.cpp b/map/map_tests/bookmarks_test.cpp index 1c687b7a8c..c37f9e66f0 100644 --- a/map/map_tests/bookmarks_test.cpp +++ b/map/map_tests/bookmarks_test.cpp @@ -494,7 +494,7 @@ UNIT_TEST(Bookmarks_UniqueFileName) { string const BASE = "SomeUniqueFileName"; string const FILEBASE = "./" + BASE; - string const FILENAME = FILEBASE + kKmlExtension; + string const FILENAME = FILEBASE + string{kKmlExtension}; { FileWriter file(FILENAME); diff --git a/platform/platform.cpp b/platform/platform.cpp index e14ca2c295..54f65002da 100644 --- a/platform/platform.cpp +++ b/platform/platform.cpp @@ -214,13 +214,13 @@ void Platform::GetFontNames(FilesList & res) const LOG(LINFO, ("Available font files:", (res))); } -void Platform::GetFilesByExt(std::string const & directory, std::string const & ext, FilesList & outFiles) +void Platform::GetFilesByExt(std::string const & directory, std::string_view ext, FilesList & outFiles) { // Transform extension mask to regexp (.mwm -> \.mwm$) ASSERT ( !ext.empty(), () ); ASSERT_EQUAL ( ext[0], '.' , () ); - - GetFilesByRegExp(directory, '\\' + ext + '$', outFiles); + std::string regexp = "\\"; + GetFilesByRegExp(directory, regexp.append(ext).append("$"), outFiles); } // static diff --git a/platform/platform.hpp b/platform/platform.hpp index d185c60228..e18ff07000 100644 --- a/platform/platform.hpp +++ b/platform/platform.hpp @@ -210,7 +210,7 @@ public: /// @param directory directory path with slash at the end //@{ /// @param ext files extension to find, like ".mwm". - static void GetFilesByExt(std::string const & directory, std::string const & ext, + static void GetFilesByExt(std::string const & directory, std::string_view ext, FilesList & outFiles); static void GetFilesByRegExp(std::string const & directory, std::string const & regexp, FilesList & outFiles);