From 4819379020f88d2cf34774dfb6aca0ca16aa53ca Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Wed, 27 May 2015 16:00:52 +0300 Subject: [PATCH] Notify sprite parsing errors Emit a signal when the JSON or the sprite image was not parsed correctly. --- src/mbgl/map/sprite.cpp | 25 +++++++++++++++++-------- src/mbgl/map/sprite.hpp | 4 ++-- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/mbgl/map/sprite.cpp b/src/mbgl/map/sprite.cpp index fd3615f91..d5af3e1d1 100644 --- a/src/mbgl/map/sprite.cpp +++ b/src/mbgl/map/sprite.cpp @@ -45,14 +45,13 @@ Sprite::Sprite(const std::string& baseUrl, float pixelRatio_) jsonRequest = nullptr; if (res.status == Response::Successful) { body = res.data; - parseJSON(); + parseJSON(jsonURL); } else { std::stringstream message; message << "Failed to load [" << jsonURL << "]: " << res.message; emitSpriteLoadingFailed(message.str()); return; } - loadedJSON = true; emitSpriteLoadedIfComplete(); }); @@ -60,14 +59,13 @@ Sprite::Sprite(const std::string& baseUrl, float pixelRatio_) spriteRequest = nullptr; if (res.status == Response::Successful) { image = res.data; - parseImage(); + parseImage(spriteURL); } else { std::stringstream message; message << "Failed to load [" << spriteURL << "]: " << res.message; emitSpriteLoadingFailed(message.str()); return; } - loadedImage = true; emitSpriteLoadedIfComplete(); }); } @@ -105,21 +103,29 @@ bool Sprite::hasPixelRatio(float ratio) const { return pixelRatio == (ratio > 1 ? 2 : 1); } -void Sprite::parseImage() { +void Sprite::parseImage(const std::string& spriteURL) { raster = std::make_unique(image); if (!*raster) { raster.reset(); + std::stringstream message; + message << "Failed to parse [" << spriteURL << "]"; + emitSpriteLoadingFailed(message.str()); + return; } + image.clear(); + loadedImage = true; } -void Sprite::parseJSON() { +void Sprite::parseJSON(const std::string& jsonURL) { rapidjson::Document d; d.Parse<0>(body.c_str()); body.clear(); if (d.HasParseError()) { - Log::Warning(Event::Sprite, "sprite JSON is invalid"); + std::stringstream message; + message << "Failed to parse [" << jsonURL << "]: " << d.GetErrorOffset() << " - " << d.GetParseError(); + emitSpriteLoadingFailed(message.str()); } else if (d.IsObject()) { for (rapidjson::Value::ConstMemberIterator itr = d.MemberBegin(); itr != d.MemberEnd(); ++itr) { const std::string& name = itr->name.GetString(); @@ -142,8 +148,11 @@ void Sprite::parseJSON() { pos.emplace(name, SpritePosition { x, y, width, height, spritePixelRatio, sdf }); } } + loadedJSON = true; } else { - Log::Warning(Event::Sprite, "sprite JSON root is not an object"); + std::stringstream message; + message << "Failed to parse [" << jsonURL << "]: Root is not an object"; + emitSpriteLoadingFailed(message.str()); } } diff --git a/src/mbgl/map/sprite.hpp b/src/mbgl/map/sprite.hpp index 13cfbe2d8..b0fda3001 100644 --- a/src/mbgl/map/sprite.hpp +++ b/src/mbgl/map/sprite.hpp @@ -59,8 +59,8 @@ private: void emitSpriteLoadedIfComplete(); void emitSpriteLoadingFailed(const std::string& message); - void parseJSON(); - void parseImage(); + void parseJSON(const std::string& jsonURL); + void parseImage(const std::string& spriteURL); std::string body; std::string image;