File: lxqtprogramfinder.cpp

package info (click to toggle)
liblxqt 2.3.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,072 kB
  • sloc: cpp: 4,152; ansic: 335; xml: 45; makefile: 15
file content (68 lines) | stat: -rw-r--r-- 2,177 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/* BEGIN_COMMON_COPYRIGHT_HEADER
 * (c)LGPL2+
 *
 * LXQt - a lightweight, Qt based, desktop toolset
 * https://lxqt.org
 *
 * 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>

using namespace LXQt;

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

    const QString path = QFile::decodeName(qgetenv("PATH"));
    const QStringList dirs = path.split(QL1C(':'), Qt::SkipEmptyParts);
    for (const QString& dirName : dirs)
    {
        const QFileInfo fi(QDir(dirName), program);
        if (fi.isExecutable() && fi.isFile())
            return true;
    }
    return false;
}

LXQT_API QStringList ProgramFinder::findPrograms(const QStringList& commands)
{
    QStringList availPrograms;
    for (const QString& program : commands)
        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)
            return QString::fromLocal8Bit(we.we_wordv[0]);
    return QString();
}