#include #include #include #include #include #include namespace mbgl { namespace style { TileSourceImpl::TileSourceImpl(SourceType type_, std::string id_, Source& base_, variant urlOrTileset_, uint16_t tileSize_) : Impl(type_, std::move(id_), base_), urlOrTileset(std::move(urlOrTileset_)), tileSize(tileSize_) { } TileSourceImpl::~TileSourceImpl() = default; void TileSourceImpl::loadDescription(FileSource& fileSource) { if (urlOrTileset.is()) { tileset = 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(base, std::make_exception_ptr(std::runtime_error(res.error->message))); } else if (res.notModified) { return; } else if (res.noContent) { observer->onSourceError(base, std::make_exception_ptr(std::runtime_error("unexpectedly empty TileJSON"))); } else { conversion::Error error; optional newTileset = conversion::convertJSON(*res.data, error); if (!newTileset) { observer->onSourceError(base, std::make_exception_ptr(std::runtime_error(error.message))); return; } util::mapbox::canonicalizeTileset(*newTileset, url, type, tileSize); bool attributionChanged = tileset.attribution != (*newTileset).attribution; tileset = *newTileset; loaded = true; observer->onSourceLoaded(base); if (attributionChanged) { observer->onSourceChanged(base); } } }); } optional TileSourceImpl::getTileset() const { if (loaded) { return tileset; } return {}; } optional TileSourceImpl::getAttribution() const { if (loaded && !tileset.attribution.empty()) { return tileset.attribution; } else { return {}; } } } // namespace style } // namespace mbgl