#include #include #include #include #include #include #include namespace mbgl { namespace style { RasterSource::RasterSource(std::string id, variant urlOrTileset_, uint16_t tileSize) : Source(makeMutable(std::move(id), tileSize)), urlOrTileset(std::move(urlOrTileset_)) { } RasterSource::~RasterSource() = default; const RasterSource::Impl& RasterSource::impl() const { return static_cast(*baseImpl); } const variant& RasterSource::getURLOrTileset() const { return urlOrTileset; } optional RasterSource::getURL() const { if (urlOrTileset.is()) { return {}; } return urlOrTileset.get(); } uint16_t RasterSource::getTileSize() const { return impl().getTileSize(); } void RasterSource::loadDescription(FileSource& fileSource) { if (urlOrTileset.is()) { baseImpl = makeMutable(impl(), urlOrTileset.get()); loaded = true; return; } if (req) { return; } const std::string& url = urlOrTileset.get(); req = fileSource.request(Resource::source(url), [this, url](Response res) { if (res.error) { observer->onSourceError(*this, std::make_exception_ptr(std::runtime_error(res.error->message))); } else if (res.notModified) { return; } else if (res.noContent) { observer->onSourceError(*this, std::make_exception_ptr(std::runtime_error("unexpectedly empty TileJSON"))); } else { conversion::Error error; optional tileset = conversion::convertJSON(*res.data, error); if (!tileset) { observer->onSourceError(*this, std::make_exception_ptr(std::runtime_error(error.message))); return; } util::mapbox::canonicalizeTileset(*tileset, url, getType(), getTileSize()); bool changed = impl().getTileset() != *tileset; baseImpl = makeMutable(impl(), *tileset); loaded = true; observer->onSourceLoaded(*this); if (changed) { observer->onSourceChanged(*this); } } }); } } // namespace style } // namespace mbgl