From a4ac18dae1ce0011c2787b6a89cb7a3d0402564e Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Thu, 6 Apr 2017 13:52:19 +0300 Subject: [PATCH 1/2] Refactored local ads manager --- android/jni/Android.mk | 6 +- coding/file_reader.cpp | 60 ++-- coding/file_reader.hpp | 14 +- coding/multilang_utf8_string.hpp | 19 +- iphone/Maps/Maps.xcodeproj/project.pbxproj | 10 + local_ads/CMakeLists.txt | 2 + local_ads/local_ads.pro | 17 + local_ads/local_ads_helpers.cpp | 52 +++ local_ads/local_ads_helpers.hpp | 37 ++ local_ads/local_ads_tests/CMakeLists.txt | 2 + .../local_ads_helpers_tests.cpp | 71 ++++ local_ads/local_ads_tests/local_ads_tests.pro | 20 ++ map/framework.cpp | 1 + map/local_ads_manager.cpp | 261 +++++++------- map/local_ads_manager.hpp | 16 +- map/map_tests/CMakeLists.txt | 1 + map/map_tests/map_tests.pro | 2 +- mapshot/mapshot.pro | 2 +- omim.pro | 6 +- qt/CMakeLists.txt | 4 +- qt/qt.pro | 2 +- .../assessment_tool/CMakeLists.txt | 1 + .../storage_integration_tests/CMakeLists.txt | 1 + .../storage_integration_tests.pro | 2 +- xcode/base/base.xcodeproj/project.pbxproj | 3 - .../local_ads.xcodeproj/project.pbxproj | 333 ++++++++++++++++++ xcode/map/map.xcodeproj/project.pbxproj | 4 + .../omim.xcworkspace/contents.xcworkspacedata | 3 + 28 files changed, 769 insertions(+), 183 deletions(-) create mode 100644 local_ads/local_ads.pro create mode 100644 local_ads/local_ads_helpers.cpp create mode 100644 local_ads/local_ads_helpers.hpp create mode 100644 local_ads/local_ads_tests/local_ads_helpers_tests.cpp create mode 100644 local_ads/local_ads_tests/local_ads_tests.pro create mode 100644 xcode/local_ads/local_ads.xcodeproj/project.pbxproj diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 125c24082a..dd8100a9cd 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -25,8 +25,10 @@ define add_prebuild_static_lib include $(PREBUILT_STATIC_LIBRARY) endef -prebuild_static_libs := map tracking routing traffic routing_common drape_frontend search storage indexer drape platform editor partners_api geometry coding base opening_hours -prebuild_static_libs += pugixml oauthcpp expat freetype fribidi minizip jansson protobuf osrm stats_client succinct stb_image sdf_image icu +prebuild_static_libs := map tracking routing traffic routing_common drape_frontend search storage +prebuild_static_libs += indexer drape platform editor partners_api local_ads geometry coding base +prebuild_static_libs += opening_hours pugixml oauthcpp expat freetype fribidi minizip jansson +prebuild_static_libs += protobuf osrm stats_client succinct stb_image sdf_image icu $(foreach item,$(prebuild_static_libs),$(eval $(call add_prebuild_static_lib,$(item)))) diff --git a/coding/file_reader.cpp b/coding/file_reader.cpp index 1ca0aff021..500d0e9fbd 100644 --- a/coding/file_reader.cpp +++ b/coding/file_reader.cpp @@ -68,57 +68,73 @@ private: #endif }; -FileReader::FileReader(string const & fileName, uint32_t logPageSize, uint32_t logPageCount) - : base_type(fileName), m_pFileData(new FileReaderData(fileName, logPageSize, logPageCount)), - m_Offset(0), m_Size(m_pFileData->Size()) -{ -} +FileReader::FileReader(string const & fileName, bool withExceptions, + uint32_t logPageSize, uint32_t logPageCount) + : BaseType(fileName) + , m_fileData(new FileReaderData(fileName, logPageSize, logPageCount)) + , m_offset(0) + , m_size(m_fileData->Size()) + , m_withExceptions(withExceptions) +{} FileReader::FileReader(FileReader const & reader, uint64_t offset, uint64_t size) - : base_type(reader.GetName()), m_pFileData(reader.m_pFileData), m_Offset(offset), m_Size(size) -{ -} + : BaseType(reader.GetName()) + , m_fileData(reader.m_fileData) + , m_offset(offset) + , m_size(size) + , m_withExceptions(reader.m_withExceptions) +{} uint64_t FileReader::Size() const { - return m_Size; + return m_size; } void FileReader::Read(uint64_t pos, void * p, size_t size) const { - ASSERT ( AssertPosAndSize(pos, size), () ); - m_pFileData->Read(m_Offset + pos, p, size); + CheckPosAndSize(pos, size); + m_fileData->Read(m_offset + pos, p, size); } FileReader FileReader::SubReader(uint64_t pos, uint64_t size) const { - ASSERT ( AssertPosAndSize(pos, size), () ); - return FileReader(*this, m_Offset + pos, size); + CheckPosAndSize(pos, size); + return FileReader(*this, m_offset + pos, size); } unique_ptr FileReader::CreateSubReader(uint64_t pos, uint64_t size) const { - ASSERT ( AssertPosAndSize(pos, size), () ); + CheckPosAndSize(pos, size); // Can't use make_unique with private constructor. - return unique_ptr(new FileReader(*this, m_Offset + pos, size)); + return unique_ptr(new FileReader(*this, m_offset + pos, size)); } bool FileReader::AssertPosAndSize(uint64_t pos, uint64_t size) const { uint64_t const allSize1 = Size(); bool const ret1 = (pos + size <= allSize1); - ASSERT ( ret1, (pos, size, allSize1) ); + if (!m_withExceptions) + ASSERT(ret1, (pos, size, allSize1)); - uint64_t const allSize2 = m_pFileData->Size(); - bool const ret2 = (m_Offset + pos + size <= allSize2); - ASSERT ( ret2, (m_Offset, pos, size, allSize2) ); + uint64_t const allSize2 = m_fileData->Size(); + bool const ret2 = (m_offset + pos + size <= allSize2); + if (!m_withExceptions) + ASSERT(ret2, (m_offset, pos, size, allSize2)); return (ret1 && ret2); } +void FileReader::CheckPosAndSize(uint64_t pos, uint64_t size) const +{ + if (m_withExceptions && !AssertPosAndSize(pos, size)) + MYTHROW(Reader::SizeException, (pos, size)); + else + ASSERT(AssertPosAndSize(pos, size), ()); +} + void FileReader::SetOffsetAndSize(uint64_t offset, uint64_t size) { - ASSERT ( AssertPosAndSize(offset, size), () ); - m_Offset = offset; - m_Size = size; + CheckPosAndSize(offset, size); + m_offset = offset; + m_size = size; } diff --git a/coding/file_reader.hpp b/coding/file_reader.hpp index 882b07b019..77e0123b6a 100644 --- a/coding/file_reader.hpp +++ b/coding/file_reader.hpp @@ -8,10 +8,11 @@ // because of caching and assumption that Size() is constant. class FileReader : public ModelReader { - typedef ModelReader base_type; + using BaseType = ModelReader; public: explicit FileReader(string const & fileName, + bool withExceptions = false, uint32_t logPageSize = 10, uint32_t logPageCount = 4); @@ -22,9 +23,11 @@ public: FileReader SubReader(uint64_t pos, uint64_t size) const; unique_ptr CreateSubReader(uint64_t pos, uint64_t size) const override; - inline uint64_t GetOffset() const { return m_Offset; } + inline uint64_t GetOffset() const { return m_offset; } protected: + void CheckPosAndSize(uint64_t pos, uint64_t size) const; + /// Make assertion that pos + size in FileReader bounds. bool AssertPosAndSize(uint64_t pos, uint64_t size) const; /// Used in special derived readers. @@ -33,7 +36,8 @@ protected: private: FileReader(FileReader const & reader, uint64_t offset, uint64_t size); - shared_ptr m_pFileData; - uint64_t m_Offset; - uint64_t m_Size; + shared_ptr m_fileData; + uint64_t m_offset; + uint64_t m_size; + bool m_withExceptions; }; diff --git a/coding/multilang_utf8_string.hpp b/coding/multilang_utf8_string.hpp index f54d402a1e..e4bd083c8e 100644 --- a/coding/multilang_utf8_string.hpp +++ b/coding/multilang_utf8_string.hpp @@ -1,31 +1,40 @@ #pragma once +#include "coding/reader.hpp" #include "coding/varint.hpp" +#include "coding/writer.hpp" #include "base/assert.hpp" #include "std/array.hpp" #include "std/string.hpp" - namespace utils { -template void WriteString(TSink & sink, string const & s) +template +void WriteString(TSink & sink, string const & s) { - CHECK(!s.empty(), ()); + if (EnableExceptions && s.empty()) + MYTHROW(Writer::WriteException, ("String is empty")); + else + CHECK(!s.empty(), ()); size_t const sz = s.size(); WriteVarUint(sink, static_cast(sz - 1)); sink.Write(s.c_str(), sz); } -template void ReadString(TSource & src, string & s) +template +void ReadString(TSource & src, string & s) { uint32_t const sz = ReadVarUint(src) + 1; s.resize(sz); src.Read(&s[0], sz); - CHECK(!s.empty(), ()); + if (EnableExceptions && s.empty()) + MYTHROW(Reader::ReadException, ("String is empty")); + else + CHECK(!s.empty(), ()); } } // namespace utils diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj index 75aa5ee45b..2d433daf28 100644 --- a/iphone/Maps/Maps.xcodeproj/project.pbxproj +++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj @@ -491,6 +491,7 @@ 4554B6ED1E55F0F00084017F /* drules_proto_vehicle_clear.bin in Resources */ = {isa = PBXBuildFile; fileRef = 4554B6E81E55F02B0084017F /* drules_proto_vehicle_clear.bin */; }; 4554B6EE1E55F0F30084017F /* drules_proto_vehicle_dark.bin in Resources */ = {isa = PBXBuildFile; fileRef = 4554B6E91E55F02B0084017F /* drules_proto_vehicle_dark.bin */; }; 4554B6EF1E55F0F40084017F /* drules_proto_vehicle_dark.bin in Resources */ = {isa = PBXBuildFile; fileRef = 4554B6E91E55F02B0084017F /* drules_proto_vehicle_dark.bin */; }; + 45FFD65D1E965EBE00DB854E /* liblocal_ads.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 45FFD65C1E965EBE00DB854E /* liblocal_ads.a */; }; 46F26CD810F623BA00ECCA39 /* EAGLView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 46F26CD710F623BA00ECCA39 /* EAGLView.mm */; }; 4A00DBDF1AB704C400113624 /* drules_proto_dark.bin in Resources */ = {isa = PBXBuildFile; fileRef = 4A00DBDE1AB704C400113624 /* drules_proto_dark.bin */; }; 4A23D15B1B8B4DD700D4EB6F /* drules_proto_clear.bin in Resources */ = {isa = PBXBuildFile; fileRef = 4A23D1561B8B4DD700D4EB6F /* drules_proto_clear.bin */; }; @@ -1841,6 +1842,7 @@ 4554B6E81E55F02B0084017F /* drules_proto_vehicle_clear.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; name = drules_proto_vehicle_clear.bin; path = ../../data/drules_proto_vehicle_clear.bin; sourceTree = ""; }; 4554B6E91E55F02B0084017F /* drules_proto_vehicle_dark.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; name = drules_proto_vehicle_dark.bin; path = ../../data/drules_proto_vehicle_dark.bin; sourceTree = ""; }; 458287C21AD3BE2000BA8940 /* DownloadIndicatorProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DownloadIndicatorProtocol.h; sourceTree = ""; }; + 45FFD65C1E965EBE00DB854E /* liblocal_ads.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblocal_ads.a; path = "/Users/r.kuznetsov/Dev/Projects/omim/xcode/local_ads/../../../omim-build/xcode/Debug/liblocal_ads.a"; sourceTree = ""; }; 46F26CD610F623BA00ECCA39 /* EAGLView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = EAGLView.h; sourceTree = ""; }; 46F26CD710F623BA00ECCA39 /* EAGLView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = EAGLView.mm; sourceTree = ""; }; 46F8A2EB10EB63040045521A /* MapViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = MapViewController.h; sourceTree = ""; }; @@ -2336,6 +2338,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 45FFD65D1E965EBE00DB854E /* liblocal_ads.a in Frameworks */, 34D1B6F11E95096B0057E9C7 /* libicu.a in Frameworks */, 671E78D31E6A423300B2859B /* librouting_common.a in Frameworks */, 34D808861E793F91002F0584 /* Pushwoosh.framework in Frameworks */, @@ -2513,6 +2516,7 @@ 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( + 45FFD65C1E965EBE00DB854E /* liblocal_ads.a */, 340474DB1E08199D00C92850 /* 3party */, 3462FD8A1DC1DF3A00906FD7 /* SDK */, 3446C6761DDCA9A200146687 /* libtraffic.a */, @@ -6255,6 +6259,7 @@ "-lstb_image", "-lsdf_image", "-licu", + "-llocal_ads", ); }; name = Simulator; @@ -6353,6 +6358,7 @@ "-lstb_image", "-lsdf_image", "-licu", + "-llocal_ads", ); }; name = Debug; @@ -6454,6 +6460,7 @@ "-lstb_image", "-lsdf_image", "-licu", + "-llocal_ads", ); }; name = AdHoc; @@ -6555,6 +6562,7 @@ "-lstb_image", "-lsdf_image", "-licu", + "-llocal_ads", ); }; name = "Production Full"; @@ -6656,6 +6664,7 @@ "-lstb_image", "-lsdf_image", "-licu", + "-llocal_ads", ); }; name = Release; @@ -6758,6 +6767,7 @@ "-lstb_image", "-lsdf_image", "-licu", + "-llocal_ads", ); }; name = "Simulator Release"; diff --git a/local_ads/CMakeLists.txt b/local_ads/CMakeLists.txt index 7ca8a9bb49..1d2e65354e 100644 --- a/local_ads/CMakeLists.txt +++ b/local_ads/CMakeLists.txt @@ -5,6 +5,8 @@ set( campaign.hpp campaign_serialization.cpp campaign_serialization.hpp + local_ads_helpers.cpp + local_ads_helpers.hpp ) add_library(${PROJECT_NAME} ${SRC}) diff --git a/local_ads/local_ads.pro b/local_ads/local_ads.pro new file mode 100644 index 0000000000..dc7f22d840 --- /dev/null +++ b/local_ads/local_ads.pro @@ -0,0 +1,17 @@ +TARGET = local_ads +TEMPLATE = lib +CONFIG += staticlib warn_on + +ROOT_DIR = .. + +include($$ROOT_DIR/common.pri) + +SOURCES += \ + campaign_serialization.cpp \ + local_ads_helpers.cpp \ + + +HEADERS += \ + campaign.hpp \ + campaign_serialization.hpp \ + local_ads_helpers.hpp \ diff --git a/local_ads/local_ads_helpers.cpp b/local_ads/local_ads_helpers.cpp new file mode 100644 index 0000000000..0ff6060985 --- /dev/null +++ b/local_ads/local_ads_helpers.cpp @@ -0,0 +1,52 @@ +#include "local_ads/local_ads_helpers.hpp" + +#include "coding/multilang_utf8_string.hpp" +#include "coding/reader.hpp" +#include "coding/write_to_sink.hpp" + +#include "base/assert.hpp" + +namespace local_ads +{ +void WriteCountryName(FileWriter & writer, std::string const & countryName) +{ + ASSERT(!countryName.empty(), ()); + utils::WriteString(writer, countryName); +} + +void WriteDuration(FileWriter & writer, int64_t duration) +{ + uint64_t const encodedDuration = bits::ZigZagEncode(duration); + WriteToSink(writer, encodedDuration); +} + +void WriteRawData(FileWriter & writer, std::vector const & rawData) +{ + uint64_t const size = static_cast(rawData.size()); + WriteToSink(writer, size); + writer.Write(rawData.data(), size); +} + +std::string ReadCountryName(ReaderSource & src) +{ + std::string countryName; + utils::ReadString(src, countryName); + return countryName; +} + +int64_t ReadDuration(ReaderSource & src) +{ + uint64_t const duration = ReadPrimitiveFromSource(src); + return bits::ZigZagDecode(duration); +} + +std::vector ReadRawData(ReaderSource & src) +{ + uint64_t const size = ReadPrimitiveFromSource(src); + if (src.Size() < size) + MYTHROW(Reader::SizeException, (src.Pos(), size)); + std::vector bytes(size); + src.Read(bytes.data(), bytes.size()); + return bytes; +} +} // namespace local_ads diff --git a/local_ads/local_ads_helpers.hpp b/local_ads/local_ads_helpers.hpp new file mode 100644 index 0000000000..df385b96a3 --- /dev/null +++ b/local_ads/local_ads_helpers.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include "coding/file_reader.hpp" +#include "coding/file_writer.hpp" + +#include +#include +#include + +namespace local_ads +{ +void WriteCountryName(FileWriter & writer, std::string const & countryName); + +void WriteDuration(FileWriter & writer, int64_t duration); + +template +void WriteTimestamp(FileWriter & writer, std::chrono::steady_clock::time_point ts) +{ + int64_t const d = std::chrono::duration_cast(ts.time_since_epoch()).count(); + WriteDuration(writer, d); +} + +void WriteRawData(FileWriter & writer, std::vector const & rawData); + +std::string ReadCountryName(ReaderSource & src); + +int64_t ReadDuration(ReaderSource & src); + +template +std::chrono::steady_clock::time_point ReadTimestamp(ReaderSource & src) +{ + int64_t const d = ReadDuration(src); + return std::chrono::steady_clock::time_point(Duration(d)); +} + +std::vector ReadRawData(ReaderSource & src); +} // namespace local_ads diff --git a/local_ads/local_ads_tests/CMakeLists.txt b/local_ads/local_ads_tests/CMakeLists.txt index 1d515c5f18..62d0e29b95 100644 --- a/local_ads/local_ads_tests/CMakeLists.txt +++ b/local_ads/local_ads_tests/CMakeLists.txt @@ -3,6 +3,7 @@ project(local_ads_tests) set( SRC campaign_serialization_test.cpp + local_ads_helpers_tests.cpp ) omim_add_test(${PROJECT_NAME} ${SRC}) @@ -12,6 +13,7 @@ omim_link_libraries( local_ads coding platform + platform_tests_support base stats_client ${LIBZ} diff --git a/local_ads/local_ads_tests/local_ads_helpers_tests.cpp b/local_ads/local_ads_tests/local_ads_helpers_tests.cpp new file mode 100644 index 0000000000..103c2fda90 --- /dev/null +++ b/local_ads/local_ads_tests/local_ads_helpers_tests.cpp @@ -0,0 +1,71 @@ +#include "testing/testing.hpp" + +#include "local_ads/local_ads_helpers.hpp" + +#include "coding/file_name_utils.hpp" + +#include "platform/platform_tests_support/scoped_file.hpp" + +UNIT_TEST(LocalAdsHelpers_Read_Write_Country_Name) +{ + platform::tests_support::ScopedFile testFile("la_tests.dat"); + + std::string const countryName = "Russia_Moscow"; + { + FileWriter writer(testFile.GetFullPath()); + local_ads::WriteCountryName(writer, countryName); + } + + std::string result; + { + FileReader reader(testFile.GetFullPath()); + ReaderSource src(reader); + result = local_ads::ReadCountryName(src); + } + + TEST_EQUAL(result, countryName, ()); +} + +UNIT_TEST(LocalAdsHelpers_Read_Write_Timestamp) +{ + platform::tests_support::ScopedFile testFile("la_tests.dat"); + + auto ts = std::chrono::steady_clock::now(); + { + FileWriter writer(testFile.GetFullPath()); + local_ads::WriteTimestamp(writer, ts); + local_ads::WriteTimestamp(writer, ts); + } + + std::chrono::steady_clock::time_point resultInHours; + std::chrono::steady_clock::time_point resultInSeconds; + { + FileReader reader(testFile.GetFullPath()); + ReaderSource src(reader); + resultInHours = local_ads::ReadTimestamp(src); + resultInSeconds = local_ads::ReadTimestamp(src); + } + + TEST_EQUAL(std::chrono::duration_cast(ts - resultInHours).count(), 0, ()); + TEST_EQUAL(std::chrono::duration_cast(ts - resultInSeconds).count(), 0, ()); +} + +UNIT_TEST(LocalAdsHelpers_Read_Write_RawData) +{ + platform::tests_support::ScopedFile testFile("la_tests.dat"); + + std::vector rawData = {1, 2, 3, 4, 5}; + { + FileWriter writer(testFile.GetFullPath()); + local_ads::WriteRawData(writer, rawData); + } + + std::vector result; + { + FileReader reader(testFile.GetFullPath()); + ReaderSource src(reader); + result = local_ads::ReadRawData(src); + } + + TEST_EQUAL(rawData, result, ()); +} diff --git a/local_ads/local_ads_tests/local_ads_tests.pro b/local_ads/local_ads_tests/local_ads_tests.pro new file mode 100644 index 0000000000..af4be6f1d9 --- /dev/null +++ b/local_ads/local_ads_tests/local_ads_tests.pro @@ -0,0 +1,20 @@ +TARGET = local_ads_tests +CONFIG += console warn_on +CONFIG -= app_bundle +TEMPLATE = app + +ROOT_DIR = ../.. +DEPENDENCIES = local_ads platform_tests_support stats_client coding platform base + +include($$ROOT_DIR/common.pri) + +macx-* { + LIBS *= "-framework IOKit" "-framework SystemConfiguration" +} + +HEADERS += \ + +SOURCES += \ + $$ROOT_DIR/testing/testingmain.cpp \ + campaign_serialization_test.cpp \ + local_ads_helpers_tests.cpp \ diff --git a/map/framework.cpp b/map/framework.cpp index d6194488c9..2734eb16c6 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1862,6 +1862,7 @@ void Framework::OnRecoverGLContext(int width, int height) } m_trafficManager.OnRecoverGLContext(); + m_localAdsManager.Invalidate(); } void Framework::OnDestroyGLContext() diff --git a/map/local_ads_manager.cpp b/map/local_ads_manager.cpp index c56d419714..12fe78dafd 100644 --- a/map/local_ads_manager.cpp +++ b/map/local_ads_manager.cpp @@ -1,5 +1,8 @@ #include "map/local_ads_manager.hpp" +#include "local_ads/campaign_serialization.hpp" +#include "local_ads/local_ads_helpers.hpp" + #include "drape_frontend/drape_engine.hpp" #include "drape_frontend/visual_params.hpp" @@ -8,48 +11,39 @@ #include "platform/http_client.hpp" #include "platform/platform.hpp" -#include "coding/file_container.hpp" #include "coding/file_name_utils.hpp" -#include "base/bits.hpp" - namespace { std::string const kCampaignFile = "local_ads_campaigns.dat"; -std::string const kExpirationFile = "local_ads_expiration.dat"; auto constexpr kWWanUpdateTimeout = std::chrono::hours(12); -std::vector SerializeTimestamp(std::chrono::steady_clock::time_point ts) +void SerializeCampaign(FileWriter & writer, std::string const & countryName, + LocalAdsManager::Timestamp const & ts, + std::vector const & rawData) { - auto hours = std::chrono::duration_cast(ts.time_since_epoch()).count(); - uint64_t const encodedHours = bits::ZigZagEncode(static_cast(hours)); - - std::vector result; - MemWriter writer(result); - writer.Write(&encodedHours, sizeof(encodedHours)); - - return result; + local_ads::WriteCountryName(writer, countryName); + local_ads::WriteTimestamp(writer, ts); + local_ads::WriteRawData(writer, rawData); } -std::chrono::steady_clock::time_point DeserializeTimestamp(ModelReaderPtr const & reader) +void DeserializeCampaign(ReaderSource & src, std::string & countryName, + LocalAdsManager::Timestamp & ts, std::vector & rawData) { - ASSERT_EQUAL(reader.Size(), sizeof(long), ()); - - std::vector bytes(reader.Size()); - reader.Read(0, bytes.data(), bytes.size()); - - MemReaderWithExceptions memReader(bytes.data(), bytes.size()); - ReaderSource src(memReader); - uint64_t hours = ReadPrimitiveFromSource(src); - int64_t const decodedHours = bits::ZigZagDecode(hours); - - return std::chrono::steady_clock::time_point(std::chrono::hours(decodedHours)); + countryName = local_ads::ReadCountryName(src); + ts = local_ads::ReadTimestamp(src); + rawData = local_ads::ReadRawData(src); } std::string GetPath(std::string const & fileName) { return my::JoinFoldersToPath(GetPlatform().WritableDir(), fileName); } + +std::chrono::steady_clock::time_point Now() +{ + return std::chrono::steady_clock::now(); +} } // namespace LocalAdsManager::LocalAdsManager(GetMwmsByRectFn const & getMwmsByRectFn, @@ -63,12 +57,8 @@ LocalAdsManager::LocalAdsManager(GetMwmsByRectFn const & getMwmsByRectFn, LocalAdsManager::~LocalAdsManager() { -#ifdef DEBUG - { - std::lock_guard lock(m_mutex); - ASSERT(!m_isRunning, ()); - } -#endif + std::lock_guard lock(m_mutex); + ASSERT(!m_isRunning, ()); } void LocalAdsManager::Startup() @@ -138,15 +128,12 @@ void LocalAdsManager::UpdateViewport(ScreenBase const & screen) // If a campaign has not been requested from server this session. if (!campaignIt->second) { - auto const it = m_expiration.find(mwmName); + auto const it = m_info.find(mwmName); bool needUpdateByTimeout = (connectionStatus == Platform::EConnectionType::CONNECTION_WIFI); - if (!needUpdateByTimeout && it != m_expiration.end()) - { - auto const currentTime = std::chrono::steady_clock::now(); - needUpdateByTimeout = currentTime > (it->second + kWWanUpdateTimeout); - } + if (!needUpdateByTimeout && it != m_info.end()) + needUpdateByTimeout = Now() > (it->second.m_creationTimestamp + kWWanUpdateTimeout); - if (needUpdateByTimeout || it == m_expiration.end()) + if (needUpdateByTimeout || it == m_info.end()) requestedCampaigns.push_back(mwmName); } } @@ -164,66 +151,63 @@ void LocalAdsManager::UpdateViewport(ScreenBase const & screen) void LocalAdsManager::ThreadRoutine() { std::string const campaignFile = GetPath(kCampaignFile); - std::string const expirationFile = GetPath(kExpirationFile); - // Read persistence data (expiration file must be read first). - ReadExpirationFile(expirationFile); + // Read persistence data. ReadCampaignFile(campaignFile); + Invalidate(); std::vector campaignMwms; while (WaitForRequest(campaignMwms)) { - try + for (auto const & mwm : campaignMwms) { - FilesContainerW campaignsContainer(campaignFile, FileWriter::OP_WRITE_EXISTING); - FilesContainerW expirationContainer(expirationFile, FileWriter::OP_WRITE_EXISTING); - for (auto const & mwm : campaignMwms) + if (!mwm.first.IsAlive()) + continue; + + std::string const countryName = mwm.first.GetInfo()->GetCountryName(); + if (mwm.second == RequestType::Download) { - if (!mwm.first.IsAlive()) + // Download campaign data from server. + CampaignInfo info; + info.m_data = DownloadCampaign(mwm.first); + if (info.m_data.empty()) continue; + info.m_creationTimestamp = Now(); - std::string const countryName = mwm.first.GetInfo()->GetCountryName(); - if (mwm.second == RequestType::Download) + // Parse data and send symbols to rendering. + auto symbols = ParseCampaign(std::move(info.m_data), mwm.first, + info.m_creationTimestamp); + if (symbols.empty()) { - // Download campaign data from server. - std::vector rawData = DownloadCampaign(mwm.first); - if (rawData.empty()) - continue; - - // Save data persistently. - campaignsContainer.Write(rawData, countryName); - auto ts = std::chrono::steady_clock::now(); - expirationContainer.Write(SerializeTimestamp(ts), countryName); - - // Update run-time data. - { - std::lock_guard lock(m_mutex); - m_campaigns[countryName] = true; - m_expiration[countryName] = ts; - } - - // Deserialize and send data to rendering. - auto symbols = DeserializeCampaign(std::move(rawData), ts); - if (symbols.empty()) - DeleteSymbolsFromRendering(mwm.first); - else - SendSymbolsToRendering(std::move(symbols)); - } - else if (mwm.second == RequestType::Delete) - { - campaignsContainer.DeleteSection(countryName); - expirationContainer.DeleteSection(countryName); + std::lock_guard lock(m_mutex); + m_campaigns.erase(countryName); + m_info.erase(countryName); DeleteSymbolsFromRendering(mwm.first); } + else + { + SendSymbolsToRendering(std::move(symbols)); + } + + // Update run-time data. + { + std::lock_guard lock(m_mutex); + m_campaigns[countryName] = true; + m_info[countryName] = info; + } + } + else if (mwm.second == RequestType::Delete) + { + std::lock_guard lock(m_mutex); + m_campaigns.erase(countryName); + m_info.erase(countryName); + DeleteSymbolsFromRendering(mwm.first); } - campaignsContainer.Finish(); - expirationContainer.Finish(); - } - catch (RootException const & ex) - { - LOG(LWARNING, (ex.Msg())); } campaignMwms.clear(); + + // Save data persistently. + WriteCampaignFile(campaignFile); } } @@ -246,19 +230,17 @@ void LocalAdsManager::OnDownloadCountry(std::string const & countryName) { std::lock_guard lock(m_mutex); m_campaigns.erase(countryName); - m_expiration.erase(countryName); + m_info.erase(countryName); } void LocalAdsManager::OnDeleteCountry(std::string const & countryName) { std::lock_guard lock(m_mutex); - m_campaigns.erase(countryName); - m_expiration.erase(countryName); m_requestedCampaigns.push_back(std::make_pair(m_getMwmIdByNameFn(countryName), RequestType::Delete)); m_condition.notify_one(); } -string LocalAdsManager::MakeRemoteURL(MwmSet::MwmId const &mwmId) const +string LocalAdsManager::MakeRemoteURL(MwmSet::MwmId const & mwmId) const { // TODO: build correct URL after server completion. @@ -274,75 +256,64 @@ std::vector LocalAdsManager::DownloadCampaign(MwmSet::MwmId const & mwm return std::vector(response.cbegin(), response.cend()); } -df::CustomSymbols LocalAdsManager::DeserializeCampaign(std::vector && rawData, - std::chrono::steady_clock::time_point timestamp) +df::CustomSymbols LocalAdsManager::ParseCampaign(std::vector const & rawData, + MwmSet::MwmId const & mwmId, + Timestamp timestamp) { df::CustomSymbols symbols; - // TODO: Deserialize campaign. - // TODO: Filter by timestamp. - // TEMP! - //auto mwmId = m_getMwmIdByNameFn("Russia_Moscow"); - //symbols.insert(std::make_pair(FeatureID(mwmId, 371323), df::CustomSymbol("test-m", true))); - //symbols.insert(std::make_pair(FeatureID(mwmId, 371363), df::CustomSymbol("test-m", true))); - //symbols.insert(std::make_pair(FeatureID(mwmId, 373911), df::CustomSymbol("test-m", true))); + auto campaigns = local_ads::Deserialize(rawData); + for (local_ads::Campaign const & campaign : campaigns) + { + if (Now() > timestamp + std::chrono::hours(24 * campaign.m_daysBeforeExpired)) + continue; + symbols.insert(std::make_pair(FeatureID(mwmId, campaign.m_featureId), + df::CustomSymbol(campaign.GetIconName(), campaign.m_priorityBit))); + } return symbols; } -void LocalAdsManager::ReadExpirationFile(std::string const & expirationFile) -{ - if (!GetPlatform().IsFileExistsByFullPath(expirationFile)) - { - FilesContainerW f(expirationFile); - return; - } - - try - { - std::lock_guard lock(m_mutex); - FilesContainerR expirationContainer(expirationFile); - expirationContainer.ForEachTag([this, &expirationContainer](FilesContainerR::Tag const & tag) - { - m_expiration[tag] = DeserializeTimestamp(expirationContainer.GetReader(tag)); - }); - } - catch (Reader::Exception const & ex) - { - LOG(LWARNING, ("Error reading file:", expirationFile, ex.Msg())); - } -} - void LocalAdsManager::ReadCampaignFile(std::string const & campaignFile) { if (!GetPlatform().IsFileExistsByFullPath(campaignFile)) - { - FilesContainerW f(campaignFile); return; - } + std::lock_guard lock(m_mutex); try { - std::lock_guard lock(m_mutex); - df::CustomSymbols allSymbols; - FilesContainerR campaignContainer(campaignFile); - campaignContainer.ForEachTag([this, &campaignContainer, &allSymbols](FilesContainerR::Tag const & tag) + FileReader reader(campaignFile, true /* withExceptions */); + ReaderSource src(reader); + while (src.Size() > 0) { - auto const & reader = campaignContainer.GetReader(tag); - std::vector rawData(reader.Size()); - reader.Read(0, rawData.data(), rawData.size()); - m_campaigns[tag] = false; - - ASSERT(m_expiration.find(tag) != m_expiration.end(), ()); - auto ts = m_expiration[tag]; - auto const symbols = DeserializeCampaign(std::move(rawData), ts); - allSymbols.insert(symbols.begin(), symbols.end()); - }); - SendSymbolsToRendering(std::move(allSymbols)); + std::string countryName; + CampaignInfo info; + DeserializeCampaign(src, countryName, info.m_creationTimestamp, info.m_data); + m_info[countryName] = info; + m_campaigns[countryName] = false; + } } catch (Reader::Exception const & ex) { LOG(LWARNING, ("Error reading file:", campaignFile, ex.Msg())); + FileWriter::DeleteFileX(campaignFile); + m_info.clear(); + m_campaigns.clear(); + } +} + +void LocalAdsManager::WriteCampaignFile(std::string const & campaignFile) +{ + try + { + std::lock_guard lock(m_mutex); + FileWriter writer(campaignFile); + for (auto const & info : m_info) + SerializeCampaign(writer, info.first, info.second.m_creationTimestamp, info.second.m_data); + } + catch (RootException const & ex) + { + LOG(LWARNING, ("Error writing file:", campaignFile, ex.Msg())); } } @@ -365,3 +336,21 @@ void LocalAdsManager::DeleteSymbolsFromRendering(MwmSet::MwmId const & mwmId) if (m_drapeEngine != nullptr) m_drapeEngine->RemoveCustomSymbols(mwmId); } + +void LocalAdsManager::Invalidate() +{ + if (m_drapeEngine != nullptr) + m_drapeEngine->RemoveAllCustomSymbols(); + + df::CustomSymbols symbols; + { + std::lock_guard lock(m_mutex); + for (auto const & info : m_info) + { + auto campaignSymbols = ParseCampaign(info.second.m_data, m_getMwmIdByNameFn(info.first), + info.second.m_creationTimestamp); + symbols.insert(campaignSymbols.begin(), campaignSymbols.end()); + } + } + SendSymbolsToRendering(std::move(symbols)); +} diff --git a/map/local_ads_manager.hpp b/map/local_ads_manager.hpp index ab4edffe6c..bcc6218feb 100644 --- a/map/local_ads_manager.hpp +++ b/map/local_ads_manager.hpp @@ -28,6 +28,7 @@ class LocalAdsManager final public: using GetMwmsByRectFn = function(m2::RectD const &)>; using GetMwmIdByName = function; + using Timestamp = std::chrono::steady_clock::time_point; LocalAdsManager(GetMwmsByRectFn const & getMwmsByRectFn, GetMwmIdByName const & getMwmIdByName); LocalAdsManager(LocalAdsManager && /* localAdsManager */) = default; @@ -41,6 +42,8 @@ public: void OnDownloadCountry(std::string const & countryName); void OnDeleteCountry(std::string const & countryName); + void Invalidate(); + private: enum class RequestType { @@ -54,13 +57,13 @@ private: std::string MakeRemoteURL(MwmSet::MwmId const & mwmId) const; std::vector DownloadCampaign(MwmSet::MwmId const & mwmId) const; - df::CustomSymbols DeserializeCampaign(std::vector && rawData, - std::chrono::steady_clock::time_point timestamp); + df::CustomSymbols ParseCampaign(std::vector const & rawData, + MwmSet::MwmId const & mwmId, Timestamp timestamp); void SendSymbolsToRendering(df::CustomSymbols && symbols); void DeleteSymbolsFromRendering(MwmSet::MwmId const & mwmId); - void ReadExpirationFile(std::string const & expirationFile); void ReadCampaignFile(std::string const & campaignFile); + void WriteCampaignFile(std::string const & campaignFile); GetMwmsByRectFn m_getMwmsByRectFn; GetMwmIdByName m_getMwmIdByNameFn; @@ -68,7 +71,12 @@ private: ref_ptr m_drapeEngine; std::map m_campaigns; - std::map m_expiration; + struct CampaignInfo + { + Timestamp m_creationTimestamp; + std::vector m_data; + }; + std::map m_info; df::CustomSymbols m_symbolsCache; std::mutex m_symbolsCacheMutex; diff --git a/map/map_tests/CMakeLists.txt b/map/map_tests/CMakeLists.txt index 199d2a1e5e..64def173a2 100644 --- a/map/map_tests/CMakeLists.txt +++ b/map/map_tests/CMakeLists.txt @@ -34,6 +34,7 @@ omim_link_libraries( drape indexer partners_api + local_ads platform editor geometry diff --git a/map/map_tests/map_tests.pro b/map/map_tests/map_tests.pro index dd88109a56..8d7e425d61 100644 --- a/map/map_tests/map_tests.pro +++ b/map/map_tests/map_tests.pro @@ -7,7 +7,7 @@ TEMPLATE = app ROOT_DIR = ../.. DEPENDENCIES = map drape_frontend routing traffic routing_common search storage tracking drape \ - indexer partners_api platform editor geometry coding base freetype fribidi expat \ + indexer partners_api local_ads platform editor geometry coding base freetype fribidi expat \ protobuf jansson osrm stats_client minizip succinct pugixml stats_client stb_image sdf_image icu DEPENDENCIES *= opening_hours diff --git a/mapshot/mapshot.pro b/mapshot/mapshot.pro index 0a3e16d5a0..a61e17d257 100644 --- a/mapshot/mapshot.pro +++ b/mapshot/mapshot.pro @@ -2,7 +2,7 @@ ROOT_DIR = .. DEPENDENCIES = map drape_frontend routing search storage tracking traffic routing_common indexer \ - drape partners_api platform editor geometry coding base \ + drape partners_api local_ads platform editor geometry coding base \ freetype expat fribidi gflags jansson protobuf osrm stats_client minizip succinct \ pugixml opening_hours stb_image sdf_image icu diff --git a/omim.pro b/omim.pro index 64afa443e1..319a588b47 100644 --- a/omim.pro +++ b/omim.pro @@ -66,7 +66,7 @@ SUBDIRS = 3party base coding geometry editor indexer routing routing_common sear } !CONFIG(gtool):!CONFIG(osrm) { - SUBDIRS *= drape drape_frontend partners_api tracking traffic + SUBDIRS *= drape drape_frontend partners_api local_ads tracking traffic CONFIG(map_designer):CONFIG(desktop) { SUBDIRS *= skin_generator @@ -253,6 +253,10 @@ SUBDIRS = 3party base coding geometry editor indexer routing routing_common sear partners_api_tests.depends = 3party base geometry coding platform indexer partners_api SUBDIRS *= partners_api_tests + local_ads_tests.subdir = local_ads/local_ads_tests + local_ads_tests.depends = base coding platform local_ads + SUBDIRS *= local_ads_tests + tracking_tests.subdir = tracking/tracking_tests tracking_tests.depends = 3party base routing routing_common tracking platform_tests_support platform coding geometry SUBDIRS *= tracking_tests diff --git a/qt/CMakeLists.txt b/qt/CMakeLists.txt index c0288e0a23..87fef21c9a 100644 --- a/qt/CMakeLists.txt +++ b/qt/CMakeLists.txt @@ -66,8 +66,10 @@ omim_link_libraries( indexer drape partners_api + local_ads platform - editor geometry + editor + geometry coding base freetype diff --git a/qt/qt.pro b/qt/qt.pro index 4b6b16425f..c372eec28a 100644 --- a/qt/qt.pro +++ b/qt/qt.pro @@ -2,7 +2,7 @@ ROOT_DIR = .. DEPENDENCIES = qt_common map drape_frontend openlr routing search storage tracking traffic routing_common \ - indexer drape partners_api platform editor geometry \ + indexer drape partners_api local_ads platform editor geometry \ coding base freetype expat fribidi jansson protobuf osrm stats_client \ minizip succinct pugixml oauthcpp stb_image sdf_image icu diff --git a/search/search_quality/assessment_tool/CMakeLists.txt b/search/search_quality/assessment_tool/CMakeLists.txt index dee27cb93c..4c3158a60d 100644 --- a/search/search_quality/assessment_tool/CMakeLists.txt +++ b/search/search_quality/assessment_tool/CMakeLists.txt @@ -51,6 +51,7 @@ omim_link_libraries( indexer drape partners_api + local_ads platform editor geometry coding diff --git a/storage/storage_integration_tests/CMakeLists.txt b/storage/storage_integration_tests/CMakeLists.txt index 0c6c2dc311..b8c0c70d91 100644 --- a/storage/storage_integration_tests/CMakeLists.txt +++ b/storage/storage_integration_tests/CMakeLists.txt @@ -30,6 +30,7 @@ omim_link_libraries( indexer drape partners_api + local_ads platform_tests_support platform editor diff --git a/storage/storage_integration_tests/storage_integration_tests.pro b/storage/storage_integration_tests/storage_integration_tests.pro index d1c226b6cc..dcd5b9b1b5 100644 --- a/storage/storage_integration_tests/storage_integration_tests.pro +++ b/storage/storage_integration_tests/storage_integration_tests.pro @@ -7,7 +7,7 @@ TEMPLATE = app ROOT_DIR = ../.. DEPENDENCIES = map drape_frontend routing search storage tracking traffic routing_common indexer drape \ - partners_api platform_tests_support platform editor opening_hours geometry \ + partners_api local_ads platform_tests_support platform editor opening_hours geometry \ coding base freetype expat fribidi jansson protobuf osrm stats_client \ minizip succinct pugixml oauthcpp stb_image sdf_image icu diff --git a/xcode/base/base.xcodeproj/project.pbxproj b/xcode/base/base.xcodeproj/project.pbxproj index 4d9d859463..7f3569da8e 100644 --- a/xcode/base/base.xcodeproj/project.pbxproj +++ b/xcode/base/base.xcodeproj/project.pbxproj @@ -637,8 +637,6 @@ 39FD271C1CC65A7100AFF551 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_TESTABILITY = YES; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", "OMIM_UNIT_TEST_DISABLE_PLATFORM_INIT=1", @@ -652,7 +650,6 @@ 39FD271D1CC65A7100AFF551 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - COPY_PHASE_STRIP = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", "OMIM_UNIT_TEST_DISABLE_PLATFORM_INIT=1", diff --git a/xcode/local_ads/local_ads.xcodeproj/project.pbxproj b/xcode/local_ads/local_ads.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..965c61216e --- /dev/null +++ b/xcode/local_ads/local_ads.xcodeproj/project.pbxproj @@ -0,0 +1,333 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 45812AAF1E977D2200D7D3B3 /* local_ads_helpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45812AAD1E977D2200D7D3B3 /* local_ads_helpers.cpp */; }; + 45812AB01E977D2200D7D3B3 /* local_ads_helpers.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 45812AAE1E977D2200D7D3B3 /* local_ads_helpers.hpp */; }; + 45812AB31E977D4500D7D3B3 /* local_ads_helpers_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45812AB11E977D4000D7D3B3 /* local_ads_helpers_tests.cpp */; }; + 45812AB51E9781D500D7D3B3 /* libplatform_tests_support.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 45812AB41E9781D500D7D3B3 /* libplatform_tests_support.a */; }; + 45FFD6571E965E0600DB854E /* campaign_serialization.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45FFD6541E965E0600DB854E /* campaign_serialization.cpp */; }; + 45FFD6581E965E0600DB854E /* campaign_serialization.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 45FFD6551E965E0600DB854E /* campaign_serialization.hpp */; }; + 45FFD6591E965E0600DB854E /* campaign.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 45FFD6561E965E0600DB854E /* campaign.hpp */; }; + 45FFD67B1E965FDD00DB854E /* liblocal_ads.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 45FFD6461E965DBB00DB854E /* liblocal_ads.a */; }; + 45FFD67C1E96630B00DB854E /* campaign_serialization_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45FFD6791E965F3C00DB854E /* campaign_serialization_test.cpp */; }; + 45FFD67F1E96634100DB854E /* testingmain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45FFD67D1E96633300DB854E /* testingmain.cpp */; }; + 45FFD6821E96634B00DB854E /* libbase.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 45FFD6811E96634B00DB854E /* libbase.a */; }; + 45FFD6841E96635B00DB854E /* libplatform.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 45FFD6831E96635B00DB854E /* libplatform.a */; }; + 45FFD6861E96636A00DB854E /* libcoding.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 45FFD6851E96636A00DB854E /* libcoding.a */; }; + 45FFD6881E96637C00DB854E /* libalohalitics.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 45FFD6871E96637C00DB854E /* libalohalitics.a */; }; + 45FFD68A1E96639400DB854E /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 45FFD6891E96639400DB854E /* libz.tbd */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 45812AAD1E977D2200D7D3B3 /* local_ads_helpers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = local_ads_helpers.cpp; sourceTree = ""; }; + 45812AAE1E977D2200D7D3B3 /* local_ads_helpers.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = local_ads_helpers.hpp; sourceTree = ""; }; + 45812AB11E977D4000D7D3B3 /* local_ads_helpers_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = local_ads_helpers_tests.cpp; sourceTree = ""; }; + 45812AB41E9781D500D7D3B3 /* libplatform_tests_support.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libplatform_tests_support.a; path = "../../../omim-build/xcode/Debug-iphonesimulator/libplatform_tests_support.a"; sourceTree = ""; }; + 45FFD6461E965DBB00DB854E /* liblocal_ads.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = liblocal_ads.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 45FFD6541E965E0600DB854E /* campaign_serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = campaign_serialization.cpp; sourceTree = ""; }; + 45FFD6551E965E0600DB854E /* campaign_serialization.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = campaign_serialization.hpp; sourceTree = ""; }; + 45FFD6561E965E0600DB854E /* campaign.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = campaign.hpp; sourceTree = ""; }; + 45FFD65A1E965E3A00DB854E /* common-debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "common-debug.xcconfig"; path = "../common-debug.xcconfig"; sourceTree = ""; }; + 45FFD65B1E965E3A00DB854E /* common-release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "common-release.xcconfig"; path = "../common-release.xcconfig"; sourceTree = ""; }; + 45FFD6621E965EFB00DB854E /* local_ads_tests.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = local_ads_tests.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 45FFD6791E965F3C00DB854E /* campaign_serialization_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = campaign_serialization_test.cpp; sourceTree = ""; }; + 45FFD67D1E96633300DB854E /* testingmain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = testingmain.cpp; path = ../../testing/testingmain.cpp; sourceTree = ""; }; + 45FFD6811E96634B00DB854E /* libbase.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libbase.a; path = "../../../omim-build/xcode/Debug/libbase.a"; sourceTree = ""; }; + 45FFD6831E96635B00DB854E /* libplatform.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libplatform.a; path = "/Users/r.kuznetsov/Dev/Projects/omim/xcode/platform/../../../omim-build/xcode/Debug/libplatform.a"; sourceTree = ""; }; + 45FFD6851E96636A00DB854E /* libcoding.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcoding.a; path = "/Users/r.kuznetsov/Dev/Projects/omim/xcode/coding/../../../omim-build/xcode/Debug/libcoding.a"; sourceTree = ""; }; + 45FFD6871E96637C00DB854E /* libalohalitics.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libalohalitics.a; path = "/Users/r.kuznetsov/Dev/Projects/omim/xcode/alohalitics/../../../omim-build/xcode/Debug/libalohalitics.a"; sourceTree = ""; }; + 45FFD6891E96639400DB854E /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 45FFD6431E965DBB00DB854E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 45FFD65F1E965EFB00DB854E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 45FFD68A1E96639400DB854E /* libz.tbd in Frameworks */, + 45FFD6881E96637C00DB854E /* libalohalitics.a in Frameworks */, + 45FFD6861E96636A00DB854E /* libcoding.a in Frameworks */, + 45812AB51E9781D500D7D3B3 /* libplatform_tests_support.a in Frameworks */, + 45FFD6841E96635B00DB854E /* libplatform.a in Frameworks */, + 45FFD6821E96634B00DB854E /* libbase.a in Frameworks */, + 45FFD67B1E965FDD00DB854E /* liblocal_ads.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 45FFD63D1E965DBB00DB854E = { + isa = PBXGroup; + children = ( + 45FFD65A1E965E3A00DB854E /* common-debug.xcconfig */, + 45FFD65B1E965E3A00DB854E /* common-release.xcconfig */, + 45FFD6481E965DBB00DB854E /* local_ads */, + 45FFD6631E965EFB00DB854E /* local_ads_tests */, + 45FFD6471E965DBB00DB854E /* Products */, + 45FFD6801E96634B00DB854E /* Frameworks */, + ); + sourceTree = ""; + }; + 45FFD6471E965DBB00DB854E /* Products */ = { + isa = PBXGroup; + children = ( + 45FFD6461E965DBB00DB854E /* liblocal_ads.a */, + 45FFD6621E965EFB00DB854E /* local_ads_tests.app */, + ); + name = Products; + sourceTree = ""; + }; + 45FFD6481E965DBB00DB854E /* local_ads */ = { + isa = PBXGroup; + children = ( + 45FFD6541E965E0600DB854E /* campaign_serialization.cpp */, + 45FFD6551E965E0600DB854E /* campaign_serialization.hpp */, + 45812AAD1E977D2200D7D3B3 /* local_ads_helpers.cpp */, + 45812AAE1E977D2200D7D3B3 /* local_ads_helpers.hpp */, + 45FFD6561E965E0600DB854E /* campaign.hpp */, + ); + name = local_ads; + path = ../../local_ads; + sourceTree = ""; + }; + 45FFD6631E965EFB00DB854E /* local_ads_tests */ = { + isa = PBXGroup; + children = ( + 45FFD67D1E96633300DB854E /* testingmain.cpp */, + 45FFD6791E965F3C00DB854E /* campaign_serialization_test.cpp */, + 45812AB11E977D4000D7D3B3 /* local_ads_helpers_tests.cpp */, + ); + name = local_ads_tests; + path = ../../local_ads/local_ads_tests; + sourceTree = ""; + }; + 45FFD6801E96634B00DB854E /* Frameworks */ = { + isa = PBXGroup; + children = ( + 45812AB41E9781D500D7D3B3 /* libplatform_tests_support.a */, + 45FFD6891E96639400DB854E /* libz.tbd */, + 45FFD6871E96637C00DB854E /* libalohalitics.a */, + 45FFD6851E96636A00DB854E /* libcoding.a */, + 45FFD6831E96635B00DB854E /* libplatform.a */, + 45FFD6811E96634B00DB854E /* libbase.a */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 45FFD6441E965DBB00DB854E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 45FFD6591E965E0600DB854E /* campaign.hpp in Headers */, + 45FFD6581E965E0600DB854E /* campaign_serialization.hpp in Headers */, + 45812AB01E977D2200D7D3B3 /* local_ads_helpers.hpp in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 45FFD6451E965DBB00DB854E /* local_ads */ = { + isa = PBXNativeTarget; + buildConfigurationList = 45FFD6511E965DBB00DB854E /* Build configuration list for PBXNativeTarget "local_ads" */; + buildPhases = ( + 45FFD6421E965DBB00DB854E /* Sources */, + 45FFD6431E965DBB00DB854E /* Frameworks */, + 45FFD6441E965DBB00DB854E /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = local_ads; + productName = local_ads; + productReference = 45FFD6461E965DBB00DB854E /* liblocal_ads.a */; + productType = "com.apple.product-type.library.static"; + }; + 45FFD6611E965EFB00DB854E /* local_ads_tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 45FFD6761E965EFB00DB854E /* Build configuration list for PBXNativeTarget "local_ads_tests" */; + buildPhases = ( + 45FFD65E1E965EFB00DB854E /* Sources */, + 45FFD65F1E965EFB00DB854E /* Frameworks */, + 45FFD6601E965EFB00DB854E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = local_ads_tests; + productName = local_ads_tests; + productReference = 45FFD6621E965EFB00DB854E /* local_ads_tests.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 45FFD63E1E965DBB00DB854E /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = maps.me; + TargetAttributes = { + 45FFD6451E965DBB00DB854E = { + CreatedOnToolsVersion = 8.3; + ProvisioningStyle = Automatic; + }; + 45FFD6611E965EFB00DB854E = { + CreatedOnToolsVersion = 8.3; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 45FFD6411E965DBB00DB854E /* Build configuration list for PBXProject "local_ads" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 45FFD63D1E965DBB00DB854E; + productRefGroup = 45FFD6471E965DBB00DB854E /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 45FFD6451E965DBB00DB854E /* local_ads */, + 45FFD6611E965EFB00DB854E /* local_ads_tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 45FFD6601E965EFB00DB854E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 45FFD6421E965DBB00DB854E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 45812AAF1E977D2200D7D3B3 /* local_ads_helpers.cpp in Sources */, + 45FFD6571E965E0600DB854E /* campaign_serialization.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 45FFD65E1E965EFB00DB854E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 45812AB31E977D4500D7D3B3 /* local_ads_helpers_tests.cpp in Sources */, + 45FFD67C1E96630B00DB854E /* campaign_serialization_test.cpp in Sources */, + 45FFD67F1E96634100DB854E /* testingmain.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 45FFD64F1E965DBB00DB854E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 45FFD65A1E965E3A00DB854E /* common-debug.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + 45FFD6501E965DBB00DB854E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 45FFD65B1E965E3A00DB854E /* common-release.xcconfig */; + buildSettings = { + }; + name = Release; + }; + 45FFD6521E965DBB00DB854E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 45FFD6531E965DBB00DB854E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 45FFD6771E965EFB00DB854E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = "$(OMIM_ROOT)/iphone/Maps/MAPSME.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "maps.me.local-ads-tests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 45FFD6781E965EFB00DB854E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = "$(OMIM_ROOT)/iphone/Maps/MAPSME.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "maps.me.local-ads-tests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 45FFD6411E965DBB00DB854E /* Build configuration list for PBXProject "local_ads" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 45FFD64F1E965DBB00DB854E /* Debug */, + 45FFD6501E965DBB00DB854E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 45FFD6511E965DBB00DB854E /* Build configuration list for PBXNativeTarget "local_ads" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 45FFD6521E965DBB00DB854E /* Debug */, + 45FFD6531E965DBB00DB854E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 45FFD6761E965EFB00DB854E /* Build configuration list for PBXNativeTarget "local_ads_tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 45FFD6771E965EFB00DB854E /* Debug */, + 45FFD6781E965EFB00DB854E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 45FFD63E1E965DBB00DB854E /* Project object */; +} diff --git a/xcode/map/map.xcodeproj/project.pbxproj b/xcode/map/map.xcodeproj/project.pbxproj index ebbdba905f..fcc935ff33 100644 --- a/xcode/map/map.xcodeproj/project.pbxproj +++ b/xcode/map/map.xcodeproj/project.pbxproj @@ -23,6 +23,7 @@ 45201E931CE4AC90008A4842 /* api_mark_point.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45201E921CE4AC90008A4842 /* api_mark_point.cpp */; }; 45580ABE1E2CBD5E00CD535D /* benchmark_tools.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45580ABC1E2CBD5E00CD535D /* benchmark_tools.cpp */; }; 45580ABF1E2CBD5E00CD535D /* benchmark_tools.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 45580ABD1E2CBD5E00CD535D /* benchmark_tools.hpp */; }; + 45D287671E966E3400587F05 /* liblocal_ads.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 45D287661E966E3400587F05 /* liblocal_ads.a */; }; 670E39401C46C5C700E9C0A6 /* gps_tracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670E393E1C46C5C700E9C0A6 /* gps_tracker.cpp */; }; 670E39411C46C5C700E9C0A6 /* gps_tracker.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670E393F1C46C5C700E9C0A6 /* gps_tracker.hpp */; }; 674231CB1DF984F600913FEB /* libtraffic.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 674231CA1DF984F600913FEB /* libtraffic.a */; }; @@ -139,6 +140,7 @@ 45201E921CE4AC90008A4842 /* api_mark_point.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = api_mark_point.cpp; sourceTree = ""; }; 45580ABC1E2CBD5E00CD535D /* benchmark_tools.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = benchmark_tools.cpp; sourceTree = ""; }; 45580ABD1E2CBD5E00CD535D /* benchmark_tools.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = benchmark_tools.hpp; sourceTree = ""; }; + 45D287661E966E3400587F05 /* liblocal_ads.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblocal_ads.a; path = "../../../omim-build/xcode/Debug-iphonesimulator/liblocal_ads.a"; sourceTree = ""; }; 670E393E1C46C5C700E9C0A6 /* gps_tracker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gps_tracker.cpp; sourceTree = ""; }; 670E393F1C46C5C700E9C0A6 /* gps_tracker.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = gps_tracker.hpp; sourceTree = ""; }; 674231CA1DF984F600913FEB /* libtraffic.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtraffic.a; path = "../../../omim-build/xcode/Debug/libtraffic.a"; sourceTree = ""; }; @@ -244,6 +246,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 45D287671E966E3400587F05 /* liblocal_ads.a in Frameworks */, F685EB631E955C45003CA3FF /* libicu.a in Frameworks */, F627BFC41E8E89B600B1CBF4 /* librouting_common.a in Frameworks */, 674231CB1DF984F600913FEB /* libtraffic.a in Frameworks */, @@ -297,6 +300,7 @@ 34DDA17E1DBE5DF40088A609 /* Frameworks */ = { isa = PBXGroup; children = ( + 45D287661E966E3400587F05 /* liblocal_ads.a */, F685EB621E955C45003CA3FF /* libicu.a */, F627BFC31E8E89B600B1CBF4 /* librouting_common.a */, 674231CA1DF984F600913FEB /* libtraffic.a */, diff --git a/xcode/omim.xcworkspace/contents.xcworkspacedata b/xcode/omim.xcworkspace/contents.xcworkspacedata index edc01b796f..508e37df1c 100644 --- a/xcode/omim.xcworkspace/contents.xcworkspacedata +++ b/xcode/omim.xcworkspace/contents.xcworkspacedata @@ -274,6 +274,9 @@ + + From 7dabc65928388d8afa8b3c220da895a3724d8add Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Fri, 7 Apr 2017 14:23:11 +0300 Subject: [PATCH 2/2] Review fixes --- .../local_ads_helpers_tests.cpp | 37 ++++++++++--------- map/local_ads_manager.cpp | 13 +++---- map/local_ads_manager.hpp | 2 +- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/local_ads/local_ads_tests/local_ads_helpers_tests.cpp b/local_ads/local_ads_tests/local_ads_helpers_tests.cpp index 103c2fda90..300e55b939 100644 --- a/local_ads/local_ads_tests/local_ads_helpers_tests.cpp +++ b/local_ads/local_ads_tests/local_ads_helpers_tests.cpp @@ -6,21 +6,24 @@ #include "platform/platform_tests_support/scoped_file.hpp" +using namespace local_ads; +using namespace std; + UNIT_TEST(LocalAdsHelpers_Read_Write_Country_Name) { platform::tests_support::ScopedFile testFile("la_tests.dat"); - std::string const countryName = "Russia_Moscow"; + string const countryName = "Russia_Moscow"; { FileWriter writer(testFile.GetFullPath()); - local_ads::WriteCountryName(writer, countryName); + WriteCountryName(writer, countryName); } - std::string result; + string result; { FileReader reader(testFile.GetFullPath()); ReaderSource src(reader); - result = local_ads::ReadCountryName(src); + result = ReadCountryName(src); } TEST_EQUAL(result, countryName, ()); @@ -30,41 +33,41 @@ UNIT_TEST(LocalAdsHelpers_Read_Write_Timestamp) { platform::tests_support::ScopedFile testFile("la_tests.dat"); - auto ts = std::chrono::steady_clock::now(); + auto ts = chrono::steady_clock::now(); { FileWriter writer(testFile.GetFullPath()); - local_ads::WriteTimestamp(writer, ts); - local_ads::WriteTimestamp(writer, ts); + WriteTimestamp(writer, ts); + WriteTimestamp(writer, ts); } - std::chrono::steady_clock::time_point resultInHours; - std::chrono::steady_clock::time_point resultInSeconds; + chrono::steady_clock::time_point resultInHours; + chrono::steady_clock::time_point resultInSeconds; { FileReader reader(testFile.GetFullPath()); ReaderSource src(reader); - resultInHours = local_ads::ReadTimestamp(src); - resultInSeconds = local_ads::ReadTimestamp(src); + resultInHours = ReadTimestamp(src); + resultInSeconds = ReadTimestamp(src); } - TEST_EQUAL(std::chrono::duration_cast(ts - resultInHours).count(), 0, ()); - TEST_EQUAL(std::chrono::duration_cast(ts - resultInSeconds).count(), 0, ()); + TEST_EQUAL(chrono::duration_cast(ts - resultInHours).count(), 0, ()); + TEST_EQUAL(chrono::duration_cast(ts - resultInSeconds).count(), 0, ()); } UNIT_TEST(LocalAdsHelpers_Read_Write_RawData) { platform::tests_support::ScopedFile testFile("la_tests.dat"); - std::vector rawData = {1, 2, 3, 4, 5}; + vector rawData = {1, 2, 3, 4, 5}; { FileWriter writer(testFile.GetFullPath()); - local_ads::WriteRawData(writer, rawData); + WriteRawData(writer, rawData); } - std::vector result; + vector result; { FileReader reader(testFile.GetFullPath()); ReaderSource src(reader); - result = local_ads::ReadRawData(src); + result = ReadRawData(src); } TEST_EQUAL(rawData, result, ()); diff --git a/map/local_ads_manager.cpp b/map/local_ads_manager.cpp index 12fe78dafd..150bddfdde 100644 --- a/map/local_ads_manager.cpp +++ b/map/local_ads_manager.cpp @@ -131,7 +131,7 @@ void LocalAdsManager::UpdateViewport(ScreenBase const & screen) auto const it = m_info.find(mwmName); bool needUpdateByTimeout = (connectionStatus == Platform::EConnectionType::CONNECTION_WIFI); if (!needUpdateByTimeout && it != m_info.end()) - needUpdateByTimeout = Now() > (it->second.m_creationTimestamp + kWWanUpdateTimeout); + needUpdateByTimeout = Now() > (it->second.m_created + kWWanUpdateTimeout); if (needUpdateByTimeout || it == m_info.end()) requestedCampaigns.push_back(mwmName); @@ -172,11 +172,10 @@ void LocalAdsManager::ThreadRoutine() info.m_data = DownloadCampaign(mwm.first); if (info.m_data.empty()) continue; - info.m_creationTimestamp = Now(); + info.m_created = Now(); // Parse data and send symbols to rendering. - auto symbols = ParseCampaign(std::move(info.m_data), mwm.first, - info.m_creationTimestamp); + auto symbols = ParseCampaign(std::move(info.m_data), mwm.first, info.m_created); if (symbols.empty()) { std::lock_guard lock(m_mutex); @@ -288,7 +287,7 @@ void LocalAdsManager::ReadCampaignFile(std::string const & campaignFile) { std::string countryName; CampaignInfo info; - DeserializeCampaign(src, countryName, info.m_creationTimestamp, info.m_data); + DeserializeCampaign(src, countryName, info.m_created, info.m_data); m_info[countryName] = info; m_campaigns[countryName] = false; } @@ -309,7 +308,7 @@ void LocalAdsManager::WriteCampaignFile(std::string const & campaignFile) std::lock_guard lock(m_mutex); FileWriter writer(campaignFile); for (auto const & info : m_info) - SerializeCampaign(writer, info.first, info.second.m_creationTimestamp, info.second.m_data); + SerializeCampaign(writer, info.first, info.second.m_created, info.second.m_data); } catch (RootException const & ex) { @@ -348,7 +347,7 @@ void LocalAdsManager::Invalidate() for (auto const & info : m_info) { auto campaignSymbols = ParseCampaign(info.second.m_data, m_getMwmIdByNameFn(info.first), - info.second.m_creationTimestamp); + info.second.m_created); symbols.insert(campaignSymbols.begin(), campaignSymbols.end()); } } diff --git a/map/local_ads_manager.hpp b/map/local_ads_manager.hpp index bcc6218feb..5978646481 100644 --- a/map/local_ads_manager.hpp +++ b/map/local_ads_manager.hpp @@ -73,7 +73,7 @@ private: std::map m_campaigns; struct CampaignInfo { - Timestamp m_creationTimestamp; + Timestamp m_created; std::vector m_data; }; std::map m_info;