/**************************************************************************** * Copyright (C) 2018 Maschell * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . ****************************************************************************/ #include "PluginDataFactory.h" #include "NotificationsUtils.h" #include "fs/FSUtils.h" #include "utils/StringTools.h" #include "utils/logger.h" #include "utils/utils.h" #include #include #include #include std::forward_list> PluginDataFactory::loadDir(const std::string &path) { std::forward_list> result; struct dirent *dp; DIR *dfd; if (path.empty()) { DEBUG_FUNCTION_LINE_ERR("Failed to load Plugins from dir: Path was empty"); return result; } if ((dfd = opendir(path.c_str())) == nullptr) { DEBUG_FUNCTION_LINE_ERR("Couldn't open dir %s", path.c_str()); return result; } while ((dp = readdir(dfd)) != nullptr) { if (dp->d_type == DT_DIR) { continue; } if (std::string_view(dp->d_name).starts_with('.') || std::string_view(dp->d_name).starts_with('_') || !std::string_view(dp->d_name).ends_with(".wps")) { DEBUG_FUNCTION_LINE_WARN("Skip file %s/%s", path.c_str(), dp->d_name); continue; } auto full_file_path = string_format("%s/%s", path.c_str(), dp->d_name); DEBUG_FUNCTION_LINE("Loading plugin: %s", full_file_path.c_str()); auto pluginData = load(full_file_path); if (pluginData) { result.push_front(std::move(pluginData.value())); } else { auto errMsg = string_format("Failed to load plugin: %s", full_file_path.c_str()); DEBUG_FUNCTION_LINE_ERR("%s", errMsg.c_str()); DisplayErrorNotificationMessage(errMsg, 15.0f); } } closedir(dfd); return result; } std::optional> PluginDataFactory::load(const std::string &filename) { uint8_t *buffer = nullptr; uint32_t fsize = 0; if (FSUtils::LoadFileToMem(filename.c_str(), &buffer, &fsize) < 0) { DEBUG_FUNCTION_LINE_ERR("Failed to load %s into memory", filename.c_str()); return {}; } std::vector result; result.resize(fsize); memcpy(&result[0], buffer, fsize); free(buffer); DEBUG_FUNCTION_LINE_VERBOSE("Loaded file!"); return load(result, filename); } std::optional> PluginDataFactory::load(const std::vector &buffer, const std::string &source) { if (buffer.empty()) { return {}; } auto res = make_unique_nothrow(buffer, source); if (!res) { return {}; } return res; }