diff --git a/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.mm b/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.mm index 47dc2619b6..b8e66fc8d4 100644 --- a/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.mm +++ b/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.mm @@ -473,13 +473,14 @@ NSString * const CloudErrorToString(Cloud::SynchronizationResult result) if (observer) [observer onDownloadStart]; }; - auto onDownloadFinished = [](std::string const & serverCatId, platform::RemoteFile::Result const & result) + auto onDownloadFinished = [](std::string const & serverCatId, BookmarkCatalog::DownloadResult result, + std::string const & description) { auto observer = [MWMBookmarksManager manager].catalogObservers[@(serverCatId.c_str())]; if (observer) { - [observer onDownloadComplete:result.m_status]; - if (result.m_status != platform::RemoteFile::Status::Ok) { + [observer onDownloadComplete:result]; + if (result != BookmarkCatalog::DownloadResult::Success) { [[MWMBookmarksManager manager].catalogObservers removeObjectForKey:observer.categoryId]; } } diff --git a/iphone/Maps/Core/Bookmarks/MWMCatalogObserver.h b/iphone/Maps/Core/Bookmarks/MWMCatalogObserver.h index d0d782211d..bdf2b73669 100644 --- a/iphone/Maps/Core/Bookmarks/MWMCatalogObserver.h +++ b/iphone/Maps/Core/Bookmarks/MWMCatalogObserver.h @@ -1,5 +1,7 @@ #import "MWMCatalogCommon.h" +#include "map/bookmark_catalog.hpp" + #include "platform/remote_file.hpp" @interface MWMCatalogObserver : NSObject @@ -9,7 +11,7 @@ @property (copy, nonatomic) CompletionBlock completionBlock; - (void)onDownloadStart; -- (void)onDownloadComplete:(platform::RemoteFile::Status)status; +- (void)onDownloadComplete:(BookmarkCatalog::DownloadResult)result; - (void)onImportStart; - (void)onImportCompleteSuccessful:(BOOL)success forCategoryId:(UInt64)categoryId; diff --git a/iphone/Maps/Core/Bookmarks/MWMCatalogObserver.mm b/iphone/Maps/Core/Bookmarks/MWMCatalogObserver.mm index 46fe03b295..1ae1f3363e 100644 --- a/iphone/Maps/Core/Bookmarks/MWMCatalogObserver.mm +++ b/iphone/Maps/Core/Bookmarks/MWMCatalogObserver.mm @@ -8,27 +8,30 @@ self.progressBlock(MWMCategoryProgressDownloadStarted); } -- (void)onDownloadComplete:(platform::RemoteFile::Status)status +- (void)onDownloadComplete:(BookmarkCatalog::DownloadResult)result { MWMCategoryDownloadStatus downloadStatus; - switch (status) + switch (result) { - case platform::RemoteFile::Status::Ok: + case BookmarkCatalog::DownloadResult::Success: if (self.progressBlock) self.progressBlock(MWMCategoryProgressDownloadFinished); return; - case platform::RemoteFile::Status::Forbidden: + case BookmarkCatalog::DownloadResult::AuthError: downloadStatus = MWMCategoryDownloadStatusForbidden; break; - case platform::RemoteFile::Status::NotFound: + case BookmarkCatalog::DownloadResult::ServerError: downloadStatus = MWMCategoryDownloadStatusNotFound; break; - case platform::RemoteFile::Status::NetworkError: + case BookmarkCatalog::DownloadResult::NetworkError: downloadStatus = MWMCategoryDownloadStatusNetworkError; break; - case platform::RemoteFile::Status::DiskError: + case BookmarkCatalog::DownloadResult::DiskError: downloadStatus = MWMCategoryDownloadStatusDiskError; break; + case BookmarkCatalog::DownloadResult::NeedPayment: + //TODO(@beloal) + break; } if (self.completionBlock) self.completionBlock(0, [[NSError alloc] initWithDomain:kCatalogErrorDomain diff --git a/map/bookmark_catalog.cpp b/map/bookmark_catalog.cpp index 739d27be8a..093a282114 100644 --- a/map/bookmark_catalog.cpp +++ b/map/bookmark_catalog.cpp @@ -174,8 +174,8 @@ std::vector BookmarkCatalog::GetDownloadingNames() const void BookmarkCatalog::Download(std::string const & id, std::string const & name, std::string const & accessToken, - std::function && startHandler, - platform::RemoteFile::ResultHandler && finishHandler) + DownloadStartCallback && startHandler, + DownloadFinishCallback && finishHandler) { if (IsDownloading(id) || HasDownloaded(id)) return; @@ -198,8 +198,31 @@ void BookmarkCatalog::Download(std::string const & id, std::string const & name, { m_downloadingIds.erase(id); + DownloadResult downloadResult; + switch (result.m_status) + { + case platform::RemoteFile::Status::Ok: + downloadResult = DownloadResult::Success; + break; + case platform::RemoteFile::Status::Forbidden: + downloadResult = DownloadResult::AuthError; + break; + case platform::RemoteFile::Status::NotFound: + downloadResult = DownloadResult::ServerError; + break; + case platform::RemoteFile::Status::NetworkError: + if (result.m_httpCode == 402) + downloadResult = DownloadResult::NeedPayment; + else + downloadResult = DownloadResult::NetworkError; + break; + case platform::RemoteFile::Status::DiskError: + downloadResult = DownloadResult::DiskError; + break; + } + if (finishHandler) - finishHandler(std::move(result), filePath); + finishHandler(downloadResult, result.m_description, filePath); }); }); } diff --git a/map/bookmark_catalog.hpp b/map/bookmark_catalog.hpp index 6b05acb05e..d262f7be73 100644 --- a/map/bookmark_catalog.hpp +++ b/map/bookmark_catalog.hpp @@ -36,10 +36,24 @@ public: void RegisterByServerId(std::string const & id); void UnregisterByServerId(std::string const & id); + + enum class DownloadResult + { + Success, + NetworkError, + ServerError, + AuthError, + DiskError, + NeedPayment + }; + using DownloadStartCallback = std::function; + using DownloadFinishCallback = std::function; void Download(std::string const & id, std::string const & name, std::string const & accessToken, - std::function && startHandler, - platform::RemoteFile::ResultHandler && finishHandler); + DownloadStartCallback && startHandler, + DownloadFinishCallback && finishHandler); bool IsDownloading(std::string const & id) const; bool HasDownloaded(std::string const & id) const; diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index 157adb2353..d040cfab57 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -2124,12 +2124,13 @@ void BookmarkManager::DownloadFromCatalogAndImport(std::string const & id, std:: if (m_onCatalogDownloadStarted) m_onCatalogDownloadStarted(id); }, - [this, id](platform::RemoteFile::Result && result, std::string const & filePath) + [this, id](BookmarkCatalog::DownloadResult result, std::string const & desc, + std::string const & filePath) { if (m_onCatalogDownloadFinished) - m_onCatalogDownloadFinished(id, result); + m_onCatalogDownloadFinished(id, result, desc); - if (result.m_status == platform::RemoteFile::Status::Ok) + if (result == BookmarkCatalog::DownloadResult::Success) ImportDownloadedFromCatalog(id, filePath); }); } diff --git a/map/bookmark_manager.hpp b/map/bookmark_manager.hpp index 34153964e9..e340183c46 100644 --- a/map/bookmark_manager.hpp +++ b/map/bookmark_manager.hpp @@ -287,7 +287,8 @@ public: using OnCatalogDownloadStartedHandler = platform::SafeCallback; using OnCatalogDownloadFinishedHandler = platform::SafeCallback; + BookmarkCatalog::DownloadResult result, + std::string const & description)>; using OnCatalogImportStartedHandler = platform::SafeCallback; using OnCatalogImportFinishedHandler = platform::SafeCallback