Mercurial > hg > svcore
diff base/HelperExecPath.cpp @ 1251:67aee57e32c8 3.0-integration
Merge from branch piper
author | Chris Cannam |
---|---|
date | Fri, 04 Nov 2016 14:57:03 +0000 |
parents | 75aefcc9f07d |
children | a9d0b5a2c242 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/base/HelperExecPath.cpp Fri Nov 04 14:57:03 2016 +0000 @@ -0,0 +1,105 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Sonic Visualiser + An audio file viewer and annotation editor. + Centre for Digital Music, Queen Mary, University of London. + This file copyright 2006-2016 Chris Cannam and QMUL. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#include "HelperExecPath.h" + +#include <QCoreApplication> +#include <QFile> +#include <QDir> +#include <QFileInfo> + +QStringList +HelperExecPath::getTags() +{ + if (sizeof(void *) == 8) { + if (m_type == NativeArchitectureOnly) { + return { "64", "" }; + } else { + return { "64", "", "32" }; + } + } else { + return { "", "32" }; + } +} + +static bool +isGood(QString path) +{ + return QFile(path).exists() && QFileInfo(path).isExecutable(); +} + +QList<HelperExecPath::HelperExec> +HelperExecPath::getHelperExecutables(QString basename) +{ + QStringList dummy; + return search(basename, dummy); +} + +QString +HelperExecPath::getHelperExecutable(QString basename) +{ + auto execs = getHelperExecutables(basename); + if (execs.empty()) return ""; + else return execs[0].executable; +} + +QStringList +HelperExecPath::getHelperDirPaths() +{ + QStringList dirs; + QString myDir = QCoreApplication::applicationDirPath(); + dirs.push_back(myDir + "/helpers"); + dirs.push_back(myDir); + return dirs; +} + +QStringList +HelperExecPath::getHelperCandidatePaths(QString basename) +{ + QStringList candidates; + (void)search(basename, candidates); + return candidates; +} + +QList<HelperExecPath::HelperExec> +HelperExecPath::search(QString basename, QStringList &candidates) +{ + // Helpers are expected to exist either in the same directory as + // this executable was found, or in a subdirectory called helpers. + + QString extension = ""; +#ifdef _WIN32 + extension = ".exe"; +#endif + + QList<HelperExec> executables; + QStringList dirs = getHelperDirPaths(); + + for (QString t: getTags()) { + for (QString d: dirs) { + QString path = d + QDir::separator() + basename; + if (t != QString()) path += "-" + t; + path += extension; + candidates.push_back(path); + if (isGood(path)) { + executables.push_back({ path, t }); + break; + } + } + } + + return executables; +} +