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@1243: QStringList dirs; Chris@1243: QString myDir = QCoreApplication::applicationDirPath(); Chris@1243: dirs.push_back(myDir + "/helpers"); 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: // Helpers are expected to exist either in the same directory as Chris@1243: // this executable was found, or in a subdirectory called helpers. 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: