mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-09 12:29:56 +02:00
Provide plugin load state
This commit is contained in:
parent
1de6e6d418
commit
111cea477d
3 changed files with 95 additions and 8 deletions
|
@ -370,6 +370,17 @@ int main(int argc, const char* argv[]) {
|
||||||
if (parser.isSet(getPluginsOption)) {
|
if (parser.isSet(getPluginsOption)) {
|
||||||
auto pluginManager = PluginManager::getInstance();
|
auto pluginManager = PluginManager::getInstance();
|
||||||
|
|
||||||
|
QJsonObject pluginsJson;
|
||||||
|
for (const auto &plugin : pluginManager->getPluginInfo()) {
|
||||||
|
QJsonObject data;
|
||||||
|
data["data"] = plugin.metaData;
|
||||||
|
data["loaded"] = plugin.loaded;
|
||||||
|
data["disabled"] = plugin.disabled;
|
||||||
|
data["filteredOut"] = plugin.filteredOut;
|
||||||
|
data["wrongVersion"] = plugin.wrongVersion;
|
||||||
|
pluginsJson[plugin.name] = data;
|
||||||
|
}
|
||||||
|
|
||||||
QJsonObject inputJson;
|
QJsonObject inputJson;
|
||||||
for (const auto &plugin : pluginManager->getInputPlugins()) {
|
for (const auto &plugin : pluginManager->getInputPlugins()) {
|
||||||
QJsonObject data;
|
QJsonObject data;
|
||||||
|
@ -406,15 +417,16 @@ int main(int argc, const char* argv[]) {
|
||||||
codecsJson[plugin->getName()] = data;
|
codecsJson[plugin->getName()] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
QJsonObject staticJson;
|
QJsonObject platformsJson;
|
||||||
staticJson["steamAvailable"] = (pluginManager->getSteamClientPlugin() != nullptr);
|
platformsJson["steamAvailable"] = (pluginManager->getSteamClientPlugin() != nullptr);
|
||||||
staticJson["oculusAvailable"] = (pluginManager->getOculusPlatformPlugin() != nullptr);
|
platformsJson["oculusAvailable"] = (pluginManager->getOculusPlatformPlugin() != nullptr);
|
||||||
|
|
||||||
QJsonObject root;
|
QJsonObject root;
|
||||||
root["input"] = inputJson;
|
root["plugins"] = pluginsJson;
|
||||||
root["display"] = displayJson;
|
root["inputs"] = inputJson;
|
||||||
root["codec"] = codecsJson;
|
root["displays"] = displayJson;
|
||||||
root["staticPlugins"] = staticJson;
|
root["codecs"] = codecsJson;
|
||||||
|
root["platforms"] = platformsJson;
|
||||||
|
|
||||||
std::cout << QJsonDocument(root).toJson().toStdString() << "\n";
|
std::cout << QJsonDocument(root).toJson().toStdString() << "\n";
|
||||||
|
|
||||||
|
|
|
@ -72,12 +72,12 @@ int getPluginInterfaceVersionFromMetaData(const QJsonObject& object) {
|
||||||
QStringList preferredDisplayPlugins;
|
QStringList preferredDisplayPlugins;
|
||||||
QStringList disabledDisplays;
|
QStringList disabledDisplays;
|
||||||
QStringList disabledInputs;
|
QStringList disabledInputs;
|
||||||
|
std::vector<PluginManager::PluginInfo> pluginInfo;
|
||||||
|
|
||||||
bool isDisabled(QJsonObject metaData) {
|
bool isDisabled(QJsonObject metaData) {
|
||||||
auto name = getPluginNameFromMetaData(metaData);
|
auto name = getPluginNameFromMetaData(metaData);
|
||||||
auto iid = getPluginIIDFromMetaData(metaData);
|
auto iid = getPluginIIDFromMetaData(metaData);
|
||||||
|
|
||||||
qDebug() << "Name = " << name << "; iid =" << iid;
|
|
||||||
if (iid == DisplayProvider_iid || iid == SteamClientProvider_iid || iid == OculusPlatformProvider_iid) {
|
if (iid == DisplayProvider_iid || iid == SteamClientProvider_iid || iid == OculusPlatformProvider_iid) {
|
||||||
return disabledDisplays.contains(name);
|
return disabledDisplays.contains(name);
|
||||||
} else if (iid == InputProvider_iid) {
|
} else if (iid == InputProvider_iid) {
|
||||||
|
@ -127,18 +127,28 @@ int PluginManager::instantiate() {
|
||||||
qCDebug(plugins) << "Attempting plugin" << qPrintable(plugin);
|
qCDebug(plugins) << "Attempting plugin" << qPrintable(plugin);
|
||||||
auto loader = QSharedPointer<QPluginLoader>::create(pluginPath + plugin);
|
auto loader = QSharedPointer<QPluginLoader>::create(pluginPath + plugin);
|
||||||
const QJsonObject pluginMetaData = loader->metaData();
|
const QJsonObject pluginMetaData = loader->metaData();
|
||||||
|
|
||||||
|
PluginInfo info;
|
||||||
|
info.name = plugin;
|
||||||
|
info.metaData = pluginMetaData;
|
||||||
|
|
||||||
#if defined(HIFI_PLUGINMANAGER_DEBUG)
|
#if defined(HIFI_PLUGINMANAGER_DEBUG)
|
||||||
QJsonDocument metaDataDoc(pluginMetaData);
|
QJsonDocument metaDataDoc(pluginMetaData);
|
||||||
qCInfo(plugins) << "Metadata for " << qPrintable(plugin) << ": " << QString(metaDataDoc.toJson());
|
qCInfo(plugins) << "Metadata for " << qPrintable(plugin) << ": " << QString(metaDataDoc.toJson());
|
||||||
#endif
|
#endif
|
||||||
if (isDisabled(pluginMetaData)) {
|
if (isDisabled(pluginMetaData)) {
|
||||||
qCWarning(plugins) << "Plugin" << qPrintable(plugin) << "is disabled";
|
qCWarning(plugins) << "Plugin" << qPrintable(plugin) << "is disabled";
|
||||||
|
info.disabled = true;
|
||||||
|
pluginInfo.push_back(info);
|
||||||
|
|
||||||
// Skip this one, it's disabled
|
// Skip this one, it's disabled
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_pluginFilter(pluginMetaData)) {
|
if (!_pluginFilter(pluginMetaData)) {
|
||||||
qCDebug(plugins) << "Plugin" << qPrintable(plugin) << "doesn't pass provided filter";
|
qCDebug(plugins) << "Plugin" << qPrintable(plugin) << "doesn't pass provided filter";
|
||||||
|
info.filteredOut = true;
|
||||||
|
pluginInfo.push_back(info);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,16 +156,22 @@ int PluginManager::instantiate() {
|
||||||
qCWarning(plugins) << "Plugin" << qPrintable(plugin) << "interface version doesn't match, not loading:"
|
qCWarning(plugins) << "Plugin" << qPrintable(plugin) << "interface version doesn't match, not loading:"
|
||||||
<< getPluginInterfaceVersionFromMetaData(pluginMetaData)
|
<< getPluginInterfaceVersionFromMetaData(pluginMetaData)
|
||||||
<< "doesn't match" << HIFI_PLUGIN_INTERFACE_VERSION;
|
<< "doesn't match" << HIFI_PLUGIN_INTERFACE_VERSION;
|
||||||
|
|
||||||
|
info.wrongVersion = true;
|
||||||
|
pluginInfo.push_back(info);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loader->load()) {
|
if (loader->load()) {
|
||||||
qCDebug(plugins) << "Plugin" << qPrintable(plugin) << "loaded successfully";
|
qCDebug(plugins) << "Plugin" << qPrintable(plugin) << "loaded successfully";
|
||||||
|
info.loaded = true;
|
||||||
loadedPlugins.push_back(loader);
|
loadedPlugins.push_back(loader);
|
||||||
} else {
|
} else {
|
||||||
qCDebug(plugins) << "Plugin" << qPrintable(plugin) << "failed to load:";
|
qCDebug(plugins) << "Plugin" << qPrintable(plugin) << "failed to load:";
|
||||||
qCDebug(plugins) << " " << qPrintable(loader->errorString());
|
qCDebug(plugins) << " " << qPrintable(loader->errorString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pluginInfo.push_back(info);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
qWarning() << "pluginPath does not exit..." << pluginDir;
|
qWarning() << "pluginPath does not exit..." << pluginDir;
|
||||||
|
@ -164,6 +180,11 @@ int PluginManager::instantiate() {
|
||||||
return loadedPlugins;
|
return loadedPlugins;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<PluginManager::PluginInfo> PluginManager::getPluginInfo() const {
|
||||||
|
getLoadedPlugins(); // This builds the pluginInfo list
|
||||||
|
return pluginInfo;
|
||||||
|
}
|
||||||
|
|
||||||
const CodecPluginList& PluginManager::getCodecPlugins() {
|
const CodecPluginList& PluginManager::getCodecPlugins() {
|
||||||
static CodecPluginList codecPlugins;
|
static CodecPluginList codecPlugins;
|
||||||
static std::once_flag once;
|
static std::once_flag once;
|
||||||
|
|
|
@ -12,6 +12,8 @@
|
||||||
|
|
||||||
#include <DependencyManager.h>
|
#include <DependencyManager.h>
|
||||||
#include <SettingHandle.h>
|
#include <SettingHandle.h>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include <QJsonObject>
|
||||||
|
|
||||||
#include "Forward.h"
|
#include "Forward.h"
|
||||||
|
|
||||||
|
@ -39,6 +41,49 @@ class PluginManager : public QObject, public Dependency {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Information about known plugins
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
struct PluginInfo {
|
||||||
|
/**
|
||||||
|
* @brief Plugin metadata
|
||||||
|
*/
|
||||||
|
QJsonObject metaData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Filename
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
QString name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Whether the plugin has been disabled
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool disabled = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Whether the plugin has been filtered out by a filter
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool filteredOut = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Whether the plugin has been not loaded because it's the wrong version
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool wrongVersion = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Whether the plugin has been loaded successfully
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool loaded = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
static PluginManagerPointer getInstance();
|
static PluginManagerPointer getInstance();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -217,6 +262,15 @@ public:
|
||||||
bool getEnableOculusPluginSetting() { return _enableOculusPluginSetting.get(); }
|
bool getEnableOculusPluginSetting() { return _enableOculusPluginSetting.get(); }
|
||||||
void setEnableOculusPluginSetting(bool value);
|
void setEnableOculusPluginSetting(bool value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns information about known plugins
|
||||||
|
*
|
||||||
|
* This is a function for informative/debugging purposes.
|
||||||
|
*
|
||||||
|
* @return std::vector<PluginInfo>
|
||||||
|
*/
|
||||||
|
std::vector<PluginInfo> getPluginInfo() const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void inputDeviceRunningChanged(const QString& pluginName, bool isRunning, const QStringList& runningDevices);
|
void inputDeviceRunningChanged(const QString& pluginName, bool isRunning, const QStringList& runningDevices);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue