#include #include #include #include #include #include #include using namespace mbgl; RasterTileData::RasterTileData(const TileID& id_, float pixelRatio, const std::string& urlTemplate, TexturePool &texturePool_, Worker& worker_, const std::function& callback) : TileData(id_), texturePool(texturePool_), worker(worker_) { state = State::loading; const Resource resource = Resource::tile(urlTemplate, pixelRatio, id.x, id.y, id.sourceZ); req = util::ThreadContext::getFileSource()->request(resource, [callback, this](Response res) { if (res.error) { std::exception_ptr error; if (res.error->reason == Response::Error::Reason::NotFound) { // This is a 404 response. We're treating these as empty tiles. workRequest.reset(); state = State::parsed; bucket.reset(); } else { // This is a different error, e.g. a connection or server error. error = std::make_exception_ptr(std::runtime_error(res.error->message)); } callback(error); return; } modified = res.modified; expires = res.expires; if (res.notModified) { // We got the same data again. Abort early. return; } if (state == State::loading) { // Only overwrite the state when we didn't have a previous tile. state = State::loaded; } workRequest.reset(); workRequest = worker.parseRasterTile(std::make_unique(texturePool), res.data, [this, callback] (RasterTileParseResult result) { workRequest.reset(); if (state != State::loaded) { return; } std::exception_ptr error; if (result.is>()) { state = State::parsed; bucket = std::move(result.get>()); } else { error = result.get(); state = State::obsolete; bucket.reset(); } callback(error); }); }); } RasterTileData::~RasterTileData() { cancel(); } Bucket* RasterTileData::getBucket(StyleLayer const&) { return bucket.get(); } void RasterTileData::cancel() { if (state != State::obsolete) { state = State::obsolete; } req = nullptr; workRequest.reset(); }