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, ());
}
}