diff --git a/map/bookmark.cpp b/map/bookmark.cpp index e7a0ba957f..dd1695272c 100644 --- a/map/bookmark.cpp +++ b/map/bookmark.cpp @@ -191,6 +191,7 @@ namespace bookmark_impl string m_name; string m_type; string m_description; + time_t m_timeStamp; m2::PointD m_org; double m_scale; @@ -202,6 +203,7 @@ namespace bookmark_impl m_org = m2::PointD(-1000, -1000); m_type.clear(); m_scale = -1.0; + m_timeStamp = Bookmark::INVALID_TIME_STAMP; } void SetOrigin(string const & s) @@ -254,7 +256,8 @@ namespace bookmark_impl if (tag == "Placemark" && MakeValid()) { - m_category.AddBookmarkImpl(Bookmark(m_org, m_name, m_type, m_description), m_scale); + m_category.AddBookmarkImpl(Bookmark(m_org, m_name, m_type, m_description, m_timeStamp), + m_scale); Reset(); } m_tags.pop_back(); @@ -301,6 +304,15 @@ namespace bookmark_impl m_scale = -1.0; } } + else if (prevTag == "TimeStamp") + { + if (currTag == "when") + { + m_timeStamp = StringToTimestamp(value); + if (m_timeStamp == Bookmark::INVALID_TIME_STAMP) + LOG(LWARNING, ("Invalid timestamp in Placemark:", value)); + } + } } } } @@ -434,10 +446,16 @@ void BookmarkCategory::SaveToKML(ostream & s) s << "\n"; } + time_t const timeStamp = bm->GetTimeStamp(); + if (timeStamp != Bookmark::INVALID_TIME_STAMP) + { + string const strTimeStamp = TimestampToString(timeStamp); + ASSERT_EQUAL(strTimeStamp.size(), 20, ("We always generate fixed length UTC-format timestamp")); + s << " " << strTimeStamp << "\n"; + } + s << " #" << bm->GetType() << "\n" - << " \n" - << " " << PointToString(bm->GetOrg()) << "\n" - << " \n"; + << " " << PointToString(bm->GetOrg()) << "\n"; double const scale = bm->GetScale(); if (scale != -1.0) diff --git a/map/bookmark.hpp b/map/bookmark.hpp index 932c3d2922..9eb4194102 100644 --- a/map/bookmark.hpp +++ b/map/bookmark.hpp @@ -18,12 +18,14 @@ class Bookmark string m_description; string m_type; ///< Now it stores bookmark color (category style). double m_scale; ///< Viewport scale. -1.0 - is a default value (no scale set). + time_t m_timeStamp; public: - Bookmark() {} + Bookmark() : m_scale(-1.0), m_timeStamp(INVALID_TIME_STAMP) {} Bookmark(m2::PointD const & org, string const & name, string const & type, - string const & description = string()) - : m_org(org), m_name(name), m_description(description), m_type(type), m_scale(-1.0) + string const & description = string(), time_t timeStamp = INVALID_TIME_STAMP) + : m_org(org), m_name(name), m_description(description), m_type(type), m_scale(-1.0), + m_timeStamp(timeStamp) { } @@ -36,6 +38,9 @@ public: static time_t const INVALID_TIME_STAMP; + /// @return INVALID_TIME_STAMP if bookmark has no timestamp + time_t GetTimeStamp() const { return m_timeStamp; } + double GetScale() const { return m_scale; } void SetScale(double scale) { m_scale = scale; } }; diff --git a/map/map_tests/bookmarks_test.cpp b/map/map_tests/bookmarks_test.cpp index 0f284a7f3c..cbc169ece5 100644 --- a/map/map_tests/bookmarks_test.cpp +++ b/map/map_tests/bookmarks_test.cpp @@ -83,6 +83,9 @@ char const * kmlString = "Monongahela National Forest" "]]>" "#placemark-pink" + "" + "1986-08-12T07:10:43Z" + "" "" "-79.829674,38.627785,0.000000" "" @@ -91,6 +94,9 @@ char const * kmlString = "From: Минск, Минская область, Беларусь" "" "#placemark-blue" + "" + "1998-03-03T03:04:48+01:30" + "" "" "27.566765,53.900047,0" "" @@ -99,6 +105,9 @@ char const * kmlString = "]]>" "]]>" "#placemark-green" + "" + "2048 bytes in two kilobytes - some invalid timestamp" + "" "" "27.551532,53.89306" "" @@ -114,11 +123,13 @@ char const * kmlString = TEST_EQUAL(bm->GetName(), "Nebraska", ()); TEST_EQUAL(bm->GetType(), "placemark-red", ()); TEST_EQUAL(bm->GetDescription(), "", ()); + TEST_EQUAL(bm->GetTimeStamp(), Bookmark::INVALID_TIME_STAMP, ()); bm = cat.GetBookmark(1); TEST_EQUAL(bm->GetName(), "Monongahela National Forest", ()); TEST_EQUAL(bm->GetType(), "placemark-pink", ()); TEST_EQUAL(bm->GetDescription(), "Huttonsville, WV 26273
", ()); + TEST_EQUAL(bm->GetTimeStamp(), 524214643, ()); bm = cat.GetBookmark(2); m2::PointD org = bm->GetOrg(); @@ -127,6 +138,7 @@ char const * kmlString = TEST_EQUAL(bm->GetName(), "From: Минск, Минская область, Беларусь", ()); TEST_EQUAL(bm->GetType(), "placemark-blue", ()); TEST_EQUAL(bm->GetDescription(), "", ()); + TEST_EQUAL(bm->GetTimeStamp(), 888888888, ()); bm = cat.GetBookmark(3); org = bm->GetOrg(); @@ -134,6 +146,7 @@ char const * kmlString = TEST_ALMOST_EQUAL(MercatorBounds::YToLat(org.y), 53.89306, ()); TEST_EQUAL(bm->GetName(), "", ()); TEST_EQUAL(bm->GetDescription(), "Amps & ", ()); + TEST_EQUAL(bm->GetTimeStamp(), Bookmark::INVALID_TIME_STAMP, ()); } }