lxqtprogramfinder.cpp 2.13 KB
Newer Older
1 2 3 4
/* BEGIN_COMMON_COPYRIGHT_HEADER
 * (c)LGPL2+
 *
 * LXQt - a lightweight, Qt based, desktop toolset
5
 * https://lxqt.org
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
 *
 * Copyright (C) 2013  Alec Moskvin <alecm@gmx.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.

 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * END_COMMON_COPYRIGHT_HEADER */

#include "lxqtprogramfinder.h"
#include <wordexp.h>
#include <QDir>
#include <QFileInfo>

30
using namespace LXQt;
31 32 33

LXQT_API bool ProgramFinder::programExists(const QString& command)
{
34
    const QString program = programName(command);
35
    if (program[0] == QL1C('/'))
36 37 38 39 40
    {
        QFileInfo fi(program);
        return fi.isExecutable() && fi.isFile();
    }

41 42
    const QString path = QFile::decodeName(qgetenv("PATH"));
    const QStringList dirs = path.split(QL1C(':'), QString::SkipEmptyParts);
43
    for (const QString& dirName : dirs)
44
    {
45
        const QFileInfo fi(QDir(dirName), program);
46 47 48 49 50 51 52 53 54
        if (fi.isExecutable() && fi.isFile())
            return true;
    }
    return false;
}

LXQT_API QStringList ProgramFinder::findPrograms(const QStringList& commands)
{
    QStringList availPrograms;
55
    for (const QString& program : commands)
56 57 58 59 60 61 62 63 64 65
        if (programExists(program))
            availPrograms.append(program);
    return availPrograms;
}

LXQT_API QString ProgramFinder::programName(const QString& command)
{
    wordexp_t we;
    if (wordexp(command.toLocal8Bit().constData(), &we, WRDE_NOCMD) == 0)
        if (we.we_wordc > 0)
66
            return QString::fromLocal8Bit(we.we_wordv[0]);
67 68
    return QString();
}