Chris@1243: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@1243: Chris@1243: /* Chris@1243: Sonic Visualiser Chris@1243: An audio file viewer and annotation editor. Chris@1243: Centre for Digital Music, Queen Mary, University of London. Chris@1243: This file copyright 2006-2016 Chris Cannam and QMUL. Chris@1243: Chris@1243: This program is free software; you can redistribute it and/or Chris@1243: modify it under the terms of the GNU General Public License as Chris@1243: published by the Free Software Foundation; either version 2 of the Chris@1243: License, or (at your option) any later version. See the file Chris@1243: COPYING included with this distribution for more information. Chris@1243: */ Chris@1243: Chris@1243: #include "HelperExecPath.h" Chris@1243: Chris@1243: #include Chris@1243: #include Chris@1243: #include Chris@1243: #include Chris@1243: Chris@1246: QStringList Chris@1246: HelperExecPath::getTags() Chris@1243: { Chris@1243: if (sizeof(void *) == 8) { Chris@1246: if (m_type == NativeArchitectureOnly) { Chris@1246: return { "64", "" }; Chris@1246: } else { Chris@1246: return { "64", "", "32" }; Chris@1246: } Chris@1243: } else { Chris@1246: return { "", "32" }; Chris@1243: } Chris@1243: } Chris@1243: Chris@1243: static bool Chris@1243: isGood(QString path) Chris@1243: { Chris@1243: return QFile(path).exists() && QFileInfo(path).isExecutable(); Chris@1243: } Chris@1243: Chris@1246: QList Chris@1243: HelperExecPath::getHelperExecutables(QString basename) Chris@1243: { Chris@1243: QStringList dummy; Chris@1243: return search(basename, dummy); Chris@1243: } Chris@1243: Chris@1243: QString Chris@1243: HelperExecPath::getHelperExecutable(QString basename) Chris@1243: { Chris@1246: auto execs = getHelperExecutables(basename); Chris@1243: if (execs.empty()) return ""; Chris@1246: else return execs[0].executable; Chris@1243: } Chris@1243: Chris@1243: QStringList Chris@1243: HelperExecPath::getHelperDirPaths() Chris@1243: { Chris@1781: // Helpers are expected to exist in one of the following, in order Chris@1781: // from most strongly preferred to least: Chris@1781: // Chris@1781: // 1. (on Mac only) in /../Resources Chris@1781: // Chris@1781: // 2. (on non-Windows non-Mac platforms only) in Chris@1781: // /../lib/application-name/ Chris@1781: // Chris@1781: // 3. (on non-Mac platforms only) in /helpers Chris@1781: // Chris@1781: // 4. in Chris@1694: Chris@1243: QStringList dirs; Chris@1781: QString appName = QCoreApplication::applicationName(); Chris@1243: QString myDir = QCoreApplication::applicationDirPath(); Chris@1783: QString binaryName = QFileInfo(QCoreApplication::arguments().at(0)) Chris@1783: .fileName(); Chris@1783: Chris@1694: #ifdef Q_OS_MAC Chris@1694: dirs.push_back(myDir + "/../Resources"); Chris@1694: #else Chris@1781: #ifndef Q_OS_WIN32 Chris@1783: if (binaryName != "") { Chris@1783: dirs.push_back(myDir + "/../lib/" + binaryName); Chris@1783: } Chris@1781: dirs.push_back(myDir + "/../lib/" + appName); Chris@1781: #endif Chris@1243: dirs.push_back(myDir + "/helpers"); Chris@1694: #endif Chris@1243: dirs.push_back(myDir); Chris@1243: return dirs; Chris@1243: } Chris@1243: Chris@1243: QStringList Chris@1243: HelperExecPath::getHelperCandidatePaths(QString basename) Chris@1243: { Chris@1243: QStringList candidates; Chris@1243: (void)search(basename, candidates); Chris@1243: return candidates; Chris@1243: } Chris@1243: Chris@1246: QList Chris@1243: HelperExecPath::search(QString basename, QStringList &candidates) Chris@1243: { Chris@1243: QString extension = ""; Chris@1243: #ifdef _WIN32 Chris@1243: extension = ".exe"; Chris@1243: #endif Chris@1243: Chris@1246: QList executables; Chris@1243: QStringList dirs = getHelperDirPaths(); Chris@1243: Chris@1246: for (QString t: getTags()) { Chris@1243: for (QString d: dirs) { Chris@1246: QString path = d + QDir::separator() + basename; Chris@1246: if (t != QString()) path += "-" + t; Chris@1246: path += extension; Chris@1243: candidates.push_back(path); Chris@1243: if (isGood(path)) { Chris@1246: executables.push_back({ path, t }); Chris@1243: break; Chris@1243: } Chris@1243: } Chris@1243: } Chris@1243: Chris@1243: return executables; Chris@1243: } Chris@1243: