Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorr.kuznetsov <r.kuznetsov@corp.mail.ru>2018-05-07 15:58:11 +0300
committerDaria Volvenkova <d.volvenkova@corp.mail.ru>2018-05-07 16:54:55 +0300
commit1f7e2c22b33d4c64118954c1a96b30a482c1793f (patch)
tree43db5dcfa28dfdca546e61d2cc32b3262c0f1496
parent6d604f95e13b57c1cc89aba072194e7e926a4ab0 (diff)
Fixed crash on track without style
-rw-r--r--kml/serdes.cpp14
-rw-r--r--kml/serdes.hpp2
-rw-r--r--map/bookmark_helpers.cpp22
-rw-r--r--map/track.cpp2
4 files changed, 35 insertions, 5 deletions
diff --git a/kml/serdes.cpp b/kml/serdes.cpp
index 6b89e5d1e7..d31782851a 100644
--- a/kml/serdes.cpp
+++ b/kml/serdes.cpp
@@ -44,6 +44,7 @@ std::string const kExtendedDataFooter =
auto const kDefaultLang = StringUtf8Multilang::kDefaultCode;
auto const kDefaultTrackWidth = 5.0;
+auto const kDefaultTrackColor = 0xe51b23ff;
std::string Indent(size_t count)
{
@@ -734,7 +735,7 @@ void KmlParser::Pop(std::string const & tag)
TrackLayer layer;
layer.m_lineWidth = m_trackWidth;
layer.m_color.m_predefinedColor = PredefinedColor::None;
- layer.m_color.m_rgba = m_color;
+ layer.m_color.m_rgba = (m_color != 0 ? m_color : kDefaultTrackColor);
m_trackLayers.push_back(std::move(layer));
m_trackWidth = kDefaultTrackWidth;
@@ -859,7 +860,7 @@ void KmlParser::CharData(std::string value)
TrackLayer layer;
layer.m_lineWidth = GetTrackWidthForStyle(value);
layer.m_color.m_predefinedColor = PredefinedColor::None;
- layer.m_color.m_rgba = m_color;
+ layer.m_color.m_rgba = (m_color != 0 ? m_color : kDefaultTrackColor);
m_trackLayers.push_back(std::move(layer));
}
else if (currTag == "description")
@@ -993,6 +994,15 @@ void KmlParser::CharData(std::string value)
}
}
+// static
+kml::TrackLayer KmlParser::GetDefaultTrackLayer()
+{
+ kml::TrackLayer layer;
+ layer.m_lineWidth = kDefaultTrackWidth;
+ layer.m_color.m_rgba = kDefaultTrackColor;
+ return layer;
+}
+
DeserializerKml::DeserializerKml(FileData & fileData)
: m_fileData(fileData)
{
diff --git a/kml/serdes.hpp b/kml/serdes.hpp
index 9b2b6729ae..eec1864e8a 100644
--- a/kml/serdes.hpp
+++ b/kml/serdes.hpp
@@ -70,6 +70,8 @@ public:
void Pop(std::string const & tag);
void CharData(std::string value);
+ static kml::TrackLayer GetDefaultTrackLayer();
+
private:
enum GeometryType
{
diff --git a/map/bookmark_helpers.cpp b/map/bookmark_helpers.cpp
index 1bd6f90655..51b5857001 100644
--- a/map/bookmark_helpers.cpp
+++ b/map/bookmark_helpers.cpp
@@ -11,6 +11,21 @@
#include "coding/file_reader.hpp"
#include "coding/file_writer.hpp"
+namespace
+{
+void ValidateKmlData(std::unique_ptr<kml::FileData> & data)
+{
+ if (!data)
+ return;
+
+ for (auto & t : data->m_tracksData)
+ {
+ if (t.m_layers.empty())
+ t.m_layers.emplace_back(kml::KmlParser::GetDefaultTrackLayer());
+ }
+}
+} // namespace
+
std::unique_ptr<kml::FileData> LoadKmlFile(std::string const & file, bool useBinary)
{
std::unique_ptr<kml::FileData> kmlData;
@@ -35,14 +50,15 @@ std::unique_ptr<kml::FileData> LoadKmlData(Reader const & reader, bool useBinary
{
if (useBinary)
{
- kml::binary::DeserializerKml des(*data.get());
+ kml::binary::DeserializerKml des(*data);
des.Deserialize(reader);
}
else
{
- kml::DeserializerKml des(*data.get());
+ kml::DeserializerKml des(*data);
des.Deserialize(reader);
}
+ ValidateKmlData(data);
}
catch (Reader::Exception const & e)
{
@@ -69,7 +85,7 @@ std::unique_ptr<kml::FileData> LoadKmlData(Reader const & reader, bool useBinary
bool SaveKmlFile(kml::FileData & kmlData, std::string const & file, bool useBinary)
{
- bool success = false;
+ bool success;
try
{
FileWriter writer(file);
diff --git a/map/track.cpp b/map/track.cpp
index 1c70e7a394..dc041d5197 100644
--- a/map/track.cpp
+++ b/map/track.cpp
@@ -57,11 +57,13 @@ size_t Track::GetLayerCount() const
dp::Color Track::GetColor(size_t layerIndex) const
{
+ CHECK_LESS(layerIndex, m_data.m_layers.size(), ());
return dp::Color(m_data.m_layers[layerIndex].m_color.m_rgba);
}
float Track::GetWidth(size_t layerIndex) const
{
+ CHECK_LESS(layerIndex, m_data.m_layers.size(), ());
return static_cast<float>(m_data.m_layers[layerIndex].m_lineWidth);
}