summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago Marcos P. Santos <thiago@mapbox.com>2015-05-19 00:12:34 +0300
committerThiago Marcos P. Santos <thiago@mapbox.com>2015-05-22 10:44:18 +0300
commit7274d2e195b419babbc8c10e99af4f6d7803195f (patch)
treee5d003958fa84bc50f45d192a28658f8ef6e16dd
parent90fd06762c17eeb71eed69632045ae3db9f6e322 (diff)
downloadqtlocation-mapboxgl-7274d2e195b419babbc8c10e99af4f6d7803195f.tar.gz
Notify failures when loading the sprite JSON and image
-rw-r--r--include/mbgl/util/exception.hpp5
-rw-r--r--src/mbgl/map/resource_loader.cpp4
-rw-r--r--src/mbgl/map/resource_loader.hpp1
-rw-r--r--src/mbgl/map/sprite.cpp36
-rw-r--r--src/mbgl/map/sprite.hpp2
5 files changed, 39 insertions, 9 deletions
diff --git a/include/mbgl/util/exception.hpp b/include/mbgl/util/exception.hpp
index 050e56da38..dd0199d4e3 100644
--- a/include/mbgl/util/exception.hpp
+++ b/include/mbgl/util/exception.hpp
@@ -26,6 +26,11 @@ struct SourceLoadingException : Exception {
inline SourceLoadingException(const std::string &msg) : Exception(msg) {}
};
+struct SpriteLoadingException : Exception {
+ inline SpriteLoadingException(const char *msg) : Exception(msg) {}
+ inline SpriteLoadingException(const std::string &msg) : Exception(msg) {}
+};
+
}
}
diff --git a/src/mbgl/map/resource_loader.cpp b/src/mbgl/map/resource_loader.cpp
index a7dbc67d84..90c87c1426 100644
--- a/src/mbgl/map/resource_loader.cpp
+++ b/src/mbgl/map/resource_loader.cpp
@@ -126,6 +126,10 @@ void ResourceLoader::onSpriteLoaded() {
emitTileDataChanged();
}
+void ResourceLoader::onSpriteLoadingFailed(std::exception_ptr error) {
+ emitResourceLoadingFailed(error);
+}
+
void ResourceLoader::emitTileDataChanged() {
assert(Environment::currentlyOn(ThreadType::Map));
diff --git a/src/mbgl/map/resource_loader.hpp b/src/mbgl/map/resource_loader.hpp
index 70b79d8fe4..5b7863a6d3 100644
--- a/src/mbgl/map/resource_loader.hpp
+++ b/src/mbgl/map/resource_loader.hpp
@@ -71,6 +71,7 @@ public:
// Sprite::Observer implementation.
void onSpriteLoaded() override;
+ void onSpriteLoadingFailed(std::exception_ptr error) override;
private:
void emitTileDataChanged();
diff --git a/src/mbgl/map/sprite.cpp b/src/mbgl/map/sprite.cpp
index cfc0974571..d8cadbeb3f 100644
--- a/src/mbgl/map/sprite.cpp
+++ b/src/mbgl/map/sprite.cpp
@@ -1,17 +1,20 @@
#include <mbgl/map/sprite.hpp>
-#include <mbgl/util/raster.hpp>
-#include <mbgl/platform/log.hpp>
-#include <string>
-#include <mbgl/platform/platform.hpp>
#include <mbgl/map/environment.hpp>
+#include <mbgl/platform/log.hpp>
+#include <mbgl/platform/platform.hpp>
#include <mbgl/storage/resource.hpp>
#include <mbgl/storage/response.hpp>
-#include <mbgl/util/uv_detail.hpp>
+#include <mbgl/util/exception.hpp>
+#include <mbgl/util/raster.hpp>
#include <mbgl/util/std.hpp>
+#include <mbgl/util/uv_detail.hpp>
#include <rapidjson/document.h>
+#include <string>
+#include <sstream>
+
using namespace mbgl;
SpritePosition::SpritePosition(uint16_t x_, uint16_t y_, uint16_t width_, uint16_t height_, float pixelRatio_, bool sdf_)
@@ -39,25 +42,31 @@ Sprite::Sprite(const std::string& baseUrl, float pixelRatio_)
std::string spriteURL(baseUrl + (pixelRatio_ > 1 ? "@2x" : "") + ".png");
std::string jsonURL(baseUrl + (pixelRatio_ > 1 ? "@2x" : "") + ".json");
- jsonRequest = env.request({ Resource::Kind::JSON, jsonURL }, [this](const Response &res) {
+ jsonRequest = env.request({ Resource::Kind::JSON, jsonURL }, [this, jsonURL](const Response &res) {
jsonRequest = nullptr;
if (res.status == Response::Successful) {
body = res.data;
parseJSON();
} else {
- Log::Warning(Event::Sprite, "Failed to load sprite info: %s", res.message.c_str());
+ std::stringstream message;
+ message << "Failed to load [" << jsonURL << "]: " << res.message;
+ emitSpriteLoadingFailed(message.str());
+ return;
}
loadedJSON = true;
emitSpriteLoadedIfComplete();
});
- spriteRequest = env.request({ Resource::Kind::Image, spriteURL }, [this](const Response &res) {
+ spriteRequest = env.request({ Resource::Kind::Image, spriteURL }, [this, spriteURL](const Response &res) {
spriteRequest = nullptr;
if (res.status == Response::Successful) {
image = res.data;
parseImage();
} else {
- Log::Warning(Event::Sprite, "Failed to load sprite image: %s", res.message.c_str());
+ std::stringstream message;
+ message << "Failed to load [" << spriteURL << "]: " << res.message;
+ emitSpriteLoadingFailed(message.str());
+ return;
}
loadedImage = true;
emitSpriteLoadedIfComplete();
@@ -80,6 +89,15 @@ void Sprite::emitSpriteLoadedIfComplete() {
}
}
+void Sprite::emitSpriteLoadingFailed(const std::string& message) {
+ if (!observer) {
+ return;
+ }
+
+ auto error = std::make_exception_ptr(util::SpriteLoadingException(message));
+ observer->onSpriteLoadingFailed(error);
+}
+
bool Sprite::isLoaded() const {
return loadedImage && loadedJSON;
}
diff --git a/src/mbgl/map/sprite.hpp b/src/mbgl/map/sprite.hpp
index ccf2561618..13cfbe2d84 100644
--- a/src/mbgl/map/sprite.hpp
+++ b/src/mbgl/map/sprite.hpp
@@ -39,6 +39,7 @@ public:
virtual ~Observer() = default;
virtual void onSpriteLoaded() = 0;
+ virtual void onSpriteLoadingFailed(std::exception_ptr error) = 0;
};
Sprite(const std::string& baseUrl, float pixelRatio);
@@ -56,6 +57,7 @@ public:
void setObserver(Observer* observer);
private:
void emitSpriteLoadedIfComplete();
+ void emitSpriteLoadingFailed(const std::string& message);
void parseJSON();
void parseImage();