From 402f11a34afd944b479fa5ecf1d0e5e366ec3041 Mon Sep 17 00:00:00 2001 From: Roman Kuznetsov Date: Sat, 17 Feb 2018 14:24:01 +0300 Subject: [PATCH] Added new bookmarks sharing interface --- map/bookmark_manager.cpp | 58 ++++++++++++++++++++++++++++++++++++++++ map/bookmark_manager.hpp | 8 ++++++ 2 files changed, 66 insertions(+) diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index d66e71ba06..909fde800b 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -17,6 +17,7 @@ #include "coding/file_writer.hpp" #include "coding/hex.hpp" #include "coding/internal/file_data.hpp" +#include "coding/zip_creator.hpp" #include "coding/zip_reader.hpp" #include "geometry/transformations.hpp" @@ -1173,6 +1174,63 @@ void BookmarkManager::SetInvalidTokenHandler(Cloud::InvalidTokenHandler && onInv m_bookmarkCloud.SetInvalidTokenHandler(std::move(onInvalidToken)); } +std::string BookmarkManager::BeginSharing(df::MarkGroupID categoryId) +{ + auto const it = m_activeSharing.find(categoryId); + if (it != m_activeSharing.end()) + { + if (GetPlatform().IsFileExistsByFullPath(it->second)) + return it->second; + } + + auto const f = GetFileForSharing(categoryId); + if (f.empty()) + { + m_activeSharing.erase(categoryId); + return {}; + } + + m_activeSharing[categoryId] = f; + return f; +} + +void BookmarkManager::EndSharing(df::MarkGroupID categoryId) +{ + auto const it = m_activeSharing.find(categoryId); + if (it == m_activeSharing.end()) + return; + + if (GetPlatform().IsFileExistsByFullPath(it->second)) + my::DeleteFileX(it->second); + + m_activeSharing.erase(categoryId); +} + +std::string BookmarkManager::GetFileForSharing(df::MarkGroupID categoryId) +{ + auto const filePath = GetCategoryFileName(categoryId); + if (!GetPlatform().IsFileExistsByFullPath(filePath)) + return {}; + + auto ext = my::GetFileExtension(filePath); + strings::AsciiToLower(ext); + std::string fileName = filePath; + my::GetNameFromFullPath(fileName); + my::GetNameWithoutExt(fileName); + auto const tmpFilePath = my::JoinFoldersToPath(GetPlatform().TmpDir(), fileName + KMZ_EXTENSION); + if (ext == KMZ_EXTENSION) + { + if (!my::CopyFileX(filePath, tmpFilePath)) + return {}; + return tmpFilePath; + } + + if (CreateZipFromPathDeflatedAndDefaultCompression(filePath, tmpFilePath)) + return tmpFilePath; + + return {}; +} + df::GroupIDSet BookmarkManager::MarksChangesTracker::GetAllGroupIds() const { auto const & groupIds = m_bmManager.GetBmGroupsIdList(); diff --git a/map/bookmark_manager.hpp b/map/bookmark_manager.hpp index 7907b86571..43773f8449 100644 --- a/map/bookmark_manager.hpp +++ b/map/bookmark_manager.hpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -191,6 +192,9 @@ public: std::unique_ptr GetUserSubscriber(); void SetInvalidTokenHandler(Cloud::InvalidTokenHandler && onInvalidToken); + std::string BeginSharing(df::MarkGroupID categoryId); + void EndSharing(df::MarkGroupID categoryId); + /// These functions are public for unit tests only. You shouldn't call them from client code. void SaveToKML(df::MarkGroupID groupId, std::ostream & s); void CreateCategories(KMLDataCollection && dataCollection, bool autoSave = true); @@ -327,6 +331,8 @@ private: void SaveToKML(BookmarkCategory * group, std::ostream & s); + std::string GetFileForSharing(df::MarkGroupID categoryId); + Callbacks m_callbacks; MarksChangesTracker m_changesTracker; df::DrapeEngineSafePtr m_drapeEngine; @@ -367,5 +373,7 @@ private: Cloud m_bookmarkCloud; + std::map m_activeSharing; + DISALLOW_COPY_AND_MOVE(BookmarkManager); };