#include "./media_meta_info_loader.hpp" #include "./image_loader_webp.hpp" #include "./image_loader_sdl_bmp.hpp" #include "./image_loader_qoi.hpp" #include "./image_loader_sdl_image.hpp" #include #include "./os_comps.hpp" #include #include #include #include void MediaMetaInfoLoader::handleMessage(const Message3Handle& m) { if (!static_cast(m)) { return; } // move to obj if (m.any_of()) { return; } if (!m.all_of()) { // not a file message return; } const auto& o = m.get().o; if (!static_cast(o)) { std::cerr << "MMIL error: invalid object in file message\n"; return; } if (o.any_of()) { return; } if (!o.all_of()) { return; // we dont have all data } if (!o.all_of()) { std::cerr << "MMIL error: object missing backend/file info (?)\n"; return; } // TODO: handle collections const auto file_size = o.get().file_size; if (file_size > 50*1024*1024) { std::cerr << "MMIL error: image file too large\n"; return; } if (file_size == 0) { std::cerr << "MMIL warning: empty file\n"; return; } if (!o.all_of()) { // not ready yet return; } auto* file_backend = o.get().ptr; if (file_backend == nullptr) { std::cerr << "MMIL error: object backend nullptr\n"; return; } auto file2 = file_backend->file2(o, StorageBackendI::FILE2_READ); if (!file2 || !file2->isGood() || !file2->can_read) { std::cerr << "MMIL error: creating file2 from object via backendI\n"; return; } auto read_data = file2->read(file_size, 0); if (read_data.ptr == nullptr) { std::cerr << "MMIL error: reading from file2 returned nullptr\n"; return; } if (read_data.size != file_size) { std::cerr << "MMIL error: reading from file2 size missmatch, should be " << file_size << ", is " << read_data.size << "\n"; return; } // try all loaders after another for (auto& il : _image_loaders) { // TODO: impl callback based load auto res = il->loadInfoFromMemory(read_data.ptr, read_data.size); if (res.height == 0 || res.width == 0) { continue; } o.emplace( static_cast(std::min(res.width, std::numeric_limits::max())), static_cast(std::min(res.height, std::numeric_limits::max())) ); std::cout << "MMIL: loaded image file o:" << /*file_path*/ entt::to_integral(o.entity()) << "\n"; _rmm.throwEventUpdate(m); return; } m.emplace(); std::cout << "MMIL: loading failed image info o:" << /*file_path*/ entt::to_integral(o.entity()) << "\n"; // TODO: update object too // recursion _rmm.throwEventUpdate(m); } MediaMetaInfoLoader::MediaMetaInfoLoader(RegistryMessageModel& rmm) : _rmm(rmm) { // HACK: make them be added externally? _image_loaders.push_back(std::make_unique()); _image_loaders.push_back(std::make_unique()); _image_loaders.push_back(std::make_unique()); _image_loaders.push_back(std::make_unique()); _rmm.subscribe(this, RegistryMessageModel_Event::message_construct); _rmm.subscribe(this, RegistryMessageModel_Event::message_updated); } MediaMetaInfoLoader::~MediaMetaInfoLoader(void) { } bool MediaMetaInfoLoader::onEvent(const Message::Events::MessageConstruct& e) { handleMessage(e.e); return false; } bool MediaMetaInfoLoader::onEvent(const Message::Events::MessageUpdated& e) { handleMessage(e.e); return false; }