#include #include #include #include #include #include #include #include #include #include #include #include namespace mbgl { class AssetFileRequest : public AsyncRequest { public: AssetFileRequest(std::shared_ptr callback_) : callback(std::move(callback_)) { } private: std::shared_ptr callback; }; class AssetFileSource::Worker { public: Worker(ActorRef, ActorRef parent_, std::string root_) : parent(std::move(parent_)), root(std::move(root_)) { } void readFile(const std::string& url, std::weak_ptr callback) { std::string path; if (url.size() <= 8 || url[8] == '/') { // This is an empty or absolute path. path = mbgl::util::percentDecode(url.substr(8)); } else { // This is a relative path. Prefix with the application root. path = root + "/" + mbgl::util::percentDecode(url.substr(8)); } Response response; struct stat buf; int result = stat(path.c_str(), &buf); if (result == 0 && S_ISDIR(buf.st_mode)) { response.error = std::make_unique(Response::Error::Reason::NotFound); } else if (result == -1 && errno == ENOENT) { response.error = std::make_unique(Response::Error::Reason::NotFound); } else { try { response.data = std::make_shared(util::read_file(path)); } catch (...) { response.error = std::make_unique( Response::Error::Reason::Other, util::toString(std::current_exception())); } } parent.invoke(&AssetFileSource::respond, callback, response); } private: ActorRef parent; const std::string root; }; AssetFileSource::AssetFileSource(Scheduler& scheduler, const std::string& root) : mailbox(std::make_shared(*util::RunLoop::Get())), worker(std::make_unique>( scheduler, ActorRef(*this, mailbox), root)) { } AssetFileSource::~AssetFileSource() = default; std::unique_ptr AssetFileSource::request(const Resource& resource, Callback callback) { auto cb = std::make_shared(std::move(callback)); worker->invoke(&Worker::readFile, resource.url, cb); return std::make_unique(std::move(cb)); } void AssetFileSource::respond(std::weak_ptr callback, Response response) { if (auto locked = callback.lock()) { (*locked)(response); } } } // namespace mbgl