#include "asset_manager_file_source.hpp" #include #include #include #include #include #include #include namespace mbgl { class AssetManagerFileSource::Impl { public: Impl(ActorRef, AAssetManager* assetManager_) : assetManager(assetManager_) { } void request(const std::string& url, ActorRef req) { // Note: AssetManager already prepends "assets" to the filename. const std::string path = mbgl::util::percentDecode(url.substr(8)); Response response; if (AAsset* asset = AAssetManager_open(assetManager, path.c_str(), AASSET_MODE_BUFFER)) { response.data = std::make_shared( reinterpret_cast(AAsset_getBuffer(asset)), AAsset_getLength64(asset)); AAsset_close(asset); } else { response.error = std::make_unique(Response::Error::Reason::NotFound, "Could not read asset"); } req.invoke(&FileSourceRequest::setResponse, response); } private: AAssetManager* assetManager; }; AssetManagerFileSource::AssetManagerFileSource(jni::JNIEnv& env, jni::Object assetManager_) : assetManager(assetManager_.NewGlobalRef(env)), impl(std::make_unique>("AssetManagerFileSource", AAssetManager_fromJava(&env, jni::Unwrap(**assetManager)))) { } AssetManagerFileSource::~AssetManagerFileSource() = default; std::unique_ptr AssetManagerFileSource::request(const Resource& resource, Callback callback) { auto req = std::make_unique(std::move(callback)); impl->actor().invoke(&Impl::request, resource.url, req->actor()); return std::move(req); } } // namespace mbgl