#include #include #include #include #include #include #include using namespace mbgl; RasterTileData::RasterTileData(const TileID& id_, TexturePool &texturePool_, Worker& worker_) : TileData(id_), texturePool(texturePool_), worker(worker_) { } RasterTileData::~RasterTileData() { cancel(); } void RasterTileData::request(const std::string& url, const RasterTileData::Callback& callback) { state = State::loading; FileSource* fs = util::ThreadContext::getFileSource(); req = fs->request({ Resource::Kind::Tile, url }, [url, 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); }); }); } Bucket* RasterTileData::getBucket(StyleLayer const&) { return bucket.get(); } void RasterTileData::cancel() { if (state != State::obsolete) { state = State::obsolete; } req = nullptr; workRequest.reset(); }