Added support for unicode paths (filesystem::path approach)

This commit is contained in:
Dmitry K 2023-01-18 06:02:55 +00:00 committed by Adam Honse
parent 351515f025
commit b409b5f7cc
14 changed files with 143 additions and 104 deletions

View file

@ -3,6 +3,18 @@
#include "PluginManager.h"
#include "OpenRGBThemeManager.h"
// These two functions address the lack of a type-aware way to construct a QString
// Allows to avoid double conversions
static QString convertQPath(const std::string & filepath)
{
return QString::fromStdString(filepath);
}
static QString convertQPath(const std::wstring & filepath)
{
return QString::fromStdWString(filepath);
}
PluginManager::PluginManager()
{
/*---------------------------------------------------------*\
@ -16,7 +28,7 @@ PluginManager::PluginManager()
/*-------------------------------------------------------------------------*\
| Create OpenRGB plugins directory |
\*-------------------------------------------------------------------------*/
std::string plugins_dir = ResourceManager::get()->GetConfigurationDirectory() + plugins_path;
filesystem::path plugins_dir = ResourceManager::get()->GetConfigurationDirectory() / plugins_path;
filesystem::create_directories(plugins_dir);
}
@ -41,7 +53,8 @@ void PluginManager::ScanAndLoadPlugins()
| The plugins directory is a directory named "plugins" in |
| the configuration directory |
\*---------------------------------------------------------*/
ScanAndLoadPluginsFrom(QString(ResourceManager::get()->GetConfigurationDirectory().c_str()).append(plugins_path));
filesystem::path plugins_dir = ResourceManager::get()->GetConfigurationDirectory() / plugins_path;
ScanAndLoadPluginsFrom(plugins_dir);
#ifdef OPENRGB_EXTRA_PLUGIN_DIRECTORY
/*-----------------------------------------------------------------*\
@ -52,33 +65,23 @@ void PluginManager::ScanAndLoadPlugins()
#endif
}
void PluginManager::ScanAndLoadPluginsFrom(QDir plugins_dir)
void PluginManager::ScanAndLoadPluginsFrom(const filesystem::path & plugins_dir)
{
LOG_TRACE("[PluginManager] Scanning plugin directory: %s", plugins_dir.absolutePath().toStdString().c_str());
LOG_TRACE("[PluginManager] Scanning plugin directory: %s", plugins_dir.generic_u8string().c_str());
/*---------------------------------------------------------*\
| Get a list of all files in the plugins directory |
\*---------------------------------------------------------*/
std::vector<std::string> FileList;
for(int i = 0; i < QDir(plugins_dir).entryList(QDir::Files).size(); i++)
for(const filesystem::directory_entry& entry: filesystem::directory_iterator(plugins_dir))
{
LOG_TRACE("[PluginManager] Found plugin file %s", QDir(plugins_dir).entryList(QDir::Files)[i].toStdString().c_str());
FileList.push_back(QDir(plugins_dir).entryList(QDir::Files)[i].toStdString());
}
/*---------------------------------------------------------*\
| Attempt to load each file in the plugins directory |
\*---------------------------------------------------------*/
for(const std::string &plugin_name : FileList)
{
const std::string plugin_path = plugins_dir.absoluteFilePath(QString().fromStdString(plugin_name)).toStdString();
filesystem::path plugin_path = entry.path();
LOG_TRACE("[PluginManager] Found plugin file %s", plugin_path.filename().generic_u8string().c_str());
AddPlugin(plugin_path);
}
}
void PluginManager::AddPlugin(std::string path)
void PluginManager::AddPlugin(const filesystem::path& path)
{
OpenRGBPluginInterface* plugin = nullptr;
@ -103,7 +106,8 @@ void PluginManager::AddPlugin(std::string path)
/*-----------------------------------------------------------------*\
| Create a QPluginLoader and load the plugin |
\*-----------------------------------------------------------------*/
QPluginLoader* loader = new QPluginLoader(QString().fromStdString(path));
std::string path_string = path.generic_u8string();
QPluginLoader* loader = new QPluginLoader(convertQPath(path_string));
QObject* instance = loader->instance();
/*-----------------------------------------------------------------*\
@ -193,7 +197,7 @@ void PluginManager::AddPlugin(std::string path)
entry.plugin = plugin;
entry.loader = loader;
entry.loaded = false;
entry.path = path;
entry.path = path_string;
entry.enabled = enabled;
entry.widget = nullptr;
@ -216,7 +220,7 @@ void PluginManager::AddPlugin(std::string path)
}
}
void PluginManager::RemovePlugin(std::string path)
void PluginManager::RemovePlugin(const filesystem::path& path)
{
unsigned int plugin_idx;
@ -257,7 +261,7 @@ void PluginManager::RemovePlugin(std::string path)
ActivePlugins.erase(ActivePlugins.begin() + plugin_idx);
}
void PluginManager::LoadPlugin(std::string path)
void PluginManager::LoadPlugin(const filesystem::path& path)
{
unsigned int plugin_idx;
@ -317,7 +321,7 @@ void PluginManager::LoadPlugin(std::string path)
}
}
void PluginManager::UnloadPlugin(std::string path)
void PluginManager::UnloadPlugin(const filesystem::path& path)
{
unsigned int plugin_idx;