# HG changeset patch # User Chris Cannam # Date 1541081198 0 # Node ID c55de1488b93e4a40b76d45153b6a791d08cc46d # Parent 73b3dd65e0b3f92ab73ad1caa7c8dfd589348815 Check server minimum version diff -r 73b3dd65e0b3 -r c55de1488b93 plugin/PiperVampPluginFactory.cpp --- a/plugin/PiperVampPluginFactory.cpp Thu Oct 18 13:14:56 2018 +0100 +++ b/plugin/PiperVampPluginFactory.cpp Thu Nov 01 14:06:38 2018 +0000 @@ -58,18 +58,29 @@ m_logger(new Logger) { QString serverName = "piper-vamp-simple-server"; + float minimumVersion = 2.0; HelperExecPath hep(HelperExecPath::AllInstalled); - m_servers = hep.getHelperExecutables(serverName); - for (auto n: m_servers) { + auto servers = hep.getHelperExecutables(serverName); + + for (auto n: servers) { SVDEBUG << "NOTE: PiperVampPluginFactory: Found server: " << n.executable << endl; + if (serverMeetsMinimumVersion(n, minimumVersion)) { + m_servers.push_back(n); + } else { + SVCERR << "WARNING: PiperVampPluginFactory: Server at " + << n.executable + << " does not meet minimum version requirement (version >= " + << minimumVersion << ")" << endl; + } } if (m_servers.empty()) { SVDEBUG << "NOTE: No Piper Vamp servers found in installation;" - << " found none of the following:" << endl; + << " the following paths are either absent or fail " + << "minimum-version check:" << endl; for (auto d: hep.getHelperCandidatePaths(serverName)) { SVDEBUG << "NOTE: " << d << endl; } @@ -81,6 +92,55 @@ delete m_logger; } +bool +PiperVampPluginFactory::serverMeetsMinimumVersion(const HelperExecPath::HelperExec &server, + float minimumVersion) +{ + QProcess process; + QString executable = server.executable; + process.setReadChannel(QProcess::StandardOutput); + process.setProcessChannelMode(QProcess::ForwardedErrorChannel); + process.start(executable, { "--version" }); + + if (!process.waitForStarted()) { + QProcess::ProcessError err = process.error(); + if (err == QProcess::FailedToStart) { + SVCERR << "WARNING: Unable to start server " << executable + << " for version check" << endl; + } else if (err == QProcess::Crashed) { + SVCERR << "WARNING: Server " << executable + << " crashed on version check" << endl; + } else { + SVCERR << "WARNING: Server " << executable + << " failed on version check with error code " + << err << endl; + } + return false; + } + process.waitForFinished(); + + QByteArray output = process.readAllStandardOutput(); + while (output.endsWith('\n') || output.endsWith('\r')) { + output.chop(1); + } + + QString outputString(output); + bool ok = false; + float version = outputString.toFloat(&ok); + if (!ok) { + SVCERR << "WARNING: Failed to convert server version response \"" + << outputString << "\" into one- or two-part version number" + << endl; + } + + SVDEBUG << "Server " << executable << " reports version number " + << version << endl; + + float eps = 1e-6; + return (version >= minimumVersion || + fabsf(version - minimumVersion) < eps); // arf +} + vector PiperVampPluginFactory::getPluginIdentifiers(QString &errorMessage) { diff -r 73b3dd65e0b3 -r c55de1488b93 plugin/PiperVampPluginFactory.h --- a/plugin/PiperVampPluginFactory.h Thu Oct 18 13:14:56 2018 +0100 +++ b/plugin/PiperVampPluginFactory.h Thu Nov 01 14:06:38 2018 +0000 @@ -59,6 +59,8 @@ std::map m_pluginData; // identifier -> data std::map m_taxonomy; // identifier -> category string + bool serverMeetsMinimumVersion(const HelperExecPath::HelperExec &server, + float minimumVersion); void populate(QString &errorMessage); void populateFrom(const HelperExecPath::HelperExec &, QString &errorMessage);