summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSune Vuorela <sune@vuorela.dk>2013-07-05 14:07:18 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-12 23:55:28 +0200
commit0c8a003c6f2affee5a3f6b73b9e96d178b06cd75 (patch)
treec4b4787ee01305c10ce1ad77001ad4782860af85
parent21dc114334b320abe3c6f74be79d6e8e80c04ae0 (diff)
Command line client to standard paths
This tool is usable within scripts and for debugging to query paths and executables and whatever QStandardPaths will report. Also a few additional outputs. See also: kde4-config tool. Change-Id: I1c10257df80da537eaa85354810dcc051211c602 Reviewed-by: David Faure <david.faure@kdab.com>
-rw-r--r--src/qtpaths/qtpaths.cpp296
-rw-r--r--src/qtpaths/qtpaths.pro5
-rw-r--r--src/src.pro3
3 files changed, 303 insertions, 1 deletions
diff --git a/src/qtpaths/qtpaths.cpp b/src/qtpaths/qtpaths.cpp
new file mode 100644
index 000000000..eca53d588
--- /dev/null
+++ b/src/qtpaths/qtpaths.cpp
@@ -0,0 +1,296 @@
+/****************************************************************************
+ * *
+ ** Copyright (C) 2013 Sune Vuorela <sune@kde.org>
+ ** Contact: http://www.qt-project.org/
+ **
+ ** This file is part of the tools applications of the Qt Toolkit.
+ **
+ ** $QT_BEGIN_LICENSE:BSD$
+ ** You may use this file under the terms of the BSD license as follows:
+ **
+ ** "Redistribution and use in source and binary forms, with or without
+ ** modification, are permitted provided that the following conditions are
+ ** met:
+ ** * Redistributions of source code must retain the above copyright
+ ** notice, this list of conditions and the following disclaimer.
+ ** * Redistributions in binary form must reproduce the above copyright
+ ** notice, this list of conditions and the following disclaimer in
+ ** the documentation and/or other materials provided with the
+ ** distribution.
+ ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
+ ** of its contributors may be used to endorse or promote products derived
+ ** from this software without specific prior written permission.
+ **
+ **
+ ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+ **
+ ** $QT_END_LICENSE$
+ **
+ ****************************************************************************/
+
+#include <QCoreApplication>
+#include <QCommandLineParser>
+#include <QStandardPaths>
+#include <QHash>
+#include <QLibraryInfo>
+
+#include <stdio.h>
+
+QT_USE_NAMESPACE
+
+/**
+ * Prints the string on stdout and appends a newline
+ * \param string printable string
+ */
+static void message(const QString &string)
+{
+ fprintf(stdout, "%s\n", qPrintable(string));
+}
+
+/**
+ * Writes error message and exits 1
+ * \param message to write
+ */
+Q_NORETURN static void error(const QString &message)
+{
+ fprintf(stderr, "%s\n", qPrintable(message));
+ ::exit(1);
+}
+
+
+/*
+ * NOTE: that DataLocation and CacheLocation are missing as
+ * they don't really make sense for a utility like this because
+ * they include the application name.
+ */
+static const struct StringEnum {
+ const char *stringvalue;
+ QStandardPaths::StandardLocation enumvalue;
+} lookupTableData[] = {
+ { "DesktopLocation", QStandardPaths::DesktopLocation },
+ { "DocumentsLocation", QStandardPaths::DocumentsLocation },
+ { "FontsLocation", QStandardPaths::FontsLocation },
+ { "DesktopLocation", QStandardPaths::DesktopLocation },
+ { "DocumentsLocation", QStandardPaths::DocumentsLocation },
+ { "MusicLocation", QStandardPaths::MusicLocation },
+ { "MoviesLocation", QStandardPaths::MoviesLocation },
+ { "PicturesLocation", QStandardPaths::PicturesLocation },
+ { "HomeLocation", QStandardPaths::HomeLocation },
+ { "GenericCacheLocation", QStandardPaths::GenericCacheLocation },
+ { "GenericDataLocation", QStandardPaths::GenericDataLocation },
+ { "RuntimeLocation", QStandardPaths::RuntimeLocation },
+ { "ConfigLocation", QStandardPaths::ConfigLocation },
+ { "DownloadLocation", QStandardPaths::DownloadLocation }
+};
+
+/**
+ * \return available types as a QStringList.
+ */
+static QStringList types()
+{
+ QStringList typelist;
+ for (unsigned int i = 0; i < sizeof(lookupTableData)/sizeof(lookupTableData[0]); i++)
+ typelist << QString::fromLatin1(lookupTableData[i].stringvalue);
+ qSort(typelist);
+ return typelist;
+}
+
+/**
+ * Tries to parse the location string into a StandardLocation or alternatively
+ * calls \ref error with a error message
+ */
+static QStandardPaths::StandardLocation parseLocationOrError(const QString &locationString)
+{
+ for (unsigned int i = 0; i < sizeof(lookupTableData)/sizeof(lookupTableData[0]); i++)
+ if (locationString == QLatin1String(lookupTableData[i].stringvalue))
+ return lookupTableData[i].enumvalue;
+
+ QString message = QCoreApplication::translate("qtpaths", "Unknown location: %1");
+ error(message.arg(locationString));
+}
+
+/**
+ * searches for exactly one remaining argument and returns it.
+ * If not found, \ref error is called with a error message.
+ * \param parser to ask for remaining arguments
+ * \return one extra argument
+ */
+static QString searchStringOrError(QCommandLineParser *parser)
+{
+ int positionalArgumentCount = parser->positionalArguments().size();
+ if (positionalArgumentCount != 1)
+ error(QCoreApplication::translate("qtpaths", "Exactly one argument needed as searchitem"));
+ return parser->positionalArguments().first();
+}
+
+int main(int argc, char **argv)
+{
+ QCoreApplication app(argc, argv);
+ app.setApplicationVersion("1.0");
+
+#ifdef Q_OS_WIN
+ const QLatin1Char pathsep(';');
+#else
+ const QLatin1Char pathsep(':');
+#endif
+
+ QCommandLineParser parser;
+ parser.setApplicationDescription(QCoreApplication::translate("qtpaths", "Command line client to QStandardPaths"));
+ parser.addPositionalArgument(QCoreApplication::translate("qtpaths", "[name]"), QCoreApplication::tr("Name of file or directory"));
+ parser.addHelpOption();
+ parser.addVersionOption();
+
+ //setting up options
+ QCommandLineOption types(QStringLiteral("types"), QCoreApplication::translate("qtpaths", "Available location types."));
+ parser.addOption(types);
+
+ QCommandLineOption paths(QStringLiteral("paths"), QCoreApplication::translate("qtpaths", "Find paths for <type>."), QStringLiteral("type"));
+ parser.addOption(paths);
+
+ QCommandLineOption writablePath(QStringLiteral("writable-path"),
+ QCoreApplication::translate("qtpaths", "Find writable path for <type>."), QStringLiteral("type"));
+ parser.addOption(writablePath);
+
+ QCommandLineOption locateDir(QStringList() << QStringLiteral("locate-dir") << QStringLiteral("locate-directory."),
+ QCoreApplication::translate("qtpaths", "Locate directory [name] in <type>."), QStringLiteral("type"));
+ parser.addOption(locateDir);
+
+ QCommandLineOption locateDirs(QStringList() << QStringLiteral("locate-dirs") << QStringLiteral("locate-directories"),
+ QCoreApplication::translate("qtpaths", "Locate directories [name] in all paths for <type>."), QStringLiteral("type"));
+ parser.addOption(locateDirs);
+
+ QCommandLineOption locateFile(QStringLiteral("locate-file"),
+ QCoreApplication::translate("qtpaths", "Locate file [name] for <type>."), QStringLiteral("type"));
+ parser.addOption(locateFile);
+
+ QCommandLineOption locateFiles(QStringLiteral("locate-files"),
+ QCoreApplication::translate("qtpaths", "Locate files [name] in all paths for <type>."), QStringLiteral("type"));
+ parser.addOption(locateFiles);
+
+ QCommandLineOption findExe(QStringList() << QStringLiteral("find-exe") << QStringLiteral("find-executable"),
+ QCoreApplication::translate("qtpaths", "Find executable with [name]."));
+ parser.addOption(findExe);
+
+ QCommandLineOption display(QStringList() << QStringLiteral("display"),
+ QCoreApplication::translate("qtpaths", "Prints user readable name for <type>."), QStringLiteral("type"));
+ parser.addOption(display);
+
+ QCommandLineOption testmode(QStringList() << QStringLiteral("testmode") << QStringLiteral("test-mode"),
+ QCoreApplication::translate("qtpaths", "Use paths specific for unit testing."));
+ parser.addOption(testmode);
+
+ QCommandLineOption qtversion(QStringLiteral("qt-version"), QCoreApplication::translate("qtpaths", "Qt version."));
+ parser.addOption(qtversion);
+
+ QCommandLineOption installprefix(QStringLiteral("install-prefix"), QCoreApplication::translate("qtpaths", "Installation prefix for Qt."));
+ parser.addOption(installprefix);
+
+ QCommandLineOption bindir(QStringList() << QStringLiteral("binaries-dir") << QStringLiteral("binaries-directory"),
+ QCoreApplication::translate("qtpaths", "Location of Qt executables."));
+ parser.addOption(bindir);
+
+ QCommandLineOption plugindir(QStringList() << QStringLiteral("plugin-dir") << QStringLiteral("plugin-directory"),
+ QCoreApplication::translate("qtpaths", "Location of Qt plugins."));
+ parser.addOption(plugindir);
+
+ parser.process(app);
+
+ QStandardPaths::enableTestMode(parser.isSet(testmode));
+
+ QStringList results;
+ if (parser.isSet(qtversion)) {
+ QString qtversionstring = QString::fromLatin1(qVersion());
+ results << qtversionstring;
+ }
+
+ if (parser.isSet(installprefix)) {
+ QString path = QLibraryInfo::location(QLibraryInfo::PrefixPath);
+ results << path;
+ }
+
+ if (parser.isSet(bindir)) {
+ QString path = QLibraryInfo::location(QLibraryInfo::BinariesPath);
+ results << path;
+ }
+
+ if (parser.isSet(plugindir)) {
+ QString path = QLibraryInfo::location(QLibraryInfo::PluginsPath);
+ results << path;
+ }
+
+ if (parser.isSet(types)) {
+ QStringList typesList = ::types();
+ results << typesList.join('\n');
+ }
+
+ if (parser.isSet(display)) {
+ QStandardPaths::StandardLocation location = parseLocationOrError(parser.value(display));
+ QString text = QStandardPaths::displayName(location);
+ results << text;
+ }
+
+ if (parser.isSet(paths)) {
+ QStandardPaths::StandardLocation location = parseLocationOrError(parser.value(paths));
+ QStringList paths = QStandardPaths::standardLocations(location);
+ results << paths.join(pathsep);
+ }
+
+ if (parser.isSet(writablePath)) {
+ QStandardPaths::StandardLocation location = parseLocationOrError(parser.value(writablePath));
+ QString path = QStandardPaths::writableLocation(location);
+ results << path;
+ }
+
+ if (parser.isSet(findExe)) {
+ QString searchitem = searchStringOrError(&parser);
+ QString path = QStandardPaths::findExecutable(searchitem);
+ results << path;
+ }
+
+ if (parser.isSet(locateDir)) {
+ QStandardPaths::StandardLocation location = parseLocationOrError(parser.value(locateDir));
+ QString searchitem = searchStringOrError(&parser);
+ QString path = QStandardPaths::locate(location, searchitem, QStandardPaths::LocateDirectory);
+ results << path;
+ }
+
+ if (parser.isSet(locateFile)) {
+ QStandardPaths::StandardLocation location = parseLocationOrError(parser.value(locateFile));
+ QString searchitem = searchStringOrError(&parser);
+ QString path = QStandardPaths::locate(location, searchitem, QStandardPaths::LocateFile);
+ results << path;
+ }
+
+ if (parser.isSet(locateDirs)) {
+ QStandardPaths::StandardLocation location = parseLocationOrError(parser.value(locateDirs));
+ QString searchitem = searchStringOrError(&parser);
+ QStringList paths = QStandardPaths::locateAll(location, searchitem, QStandardPaths::LocateDirectory);
+ results << paths.join(pathsep);
+ }
+
+ if (parser.isSet(locateFiles)) {
+ QStandardPaths::StandardLocation location = parseLocationOrError(parser.value(locateFiles));
+ QString searchitem = searchStringOrError(&parser);
+ QStringList paths = QStandardPaths::locateAll(location, searchitem, QStandardPaths::LocateFile);
+ results << paths.join(pathsep);
+ }
+ if (results.isEmpty()) {
+ parser.showHelp();
+ } else if (results.size() == 1) {
+ message(results.first());
+ } else {
+ QString errorMessage = QCoreApplication::translate("qtpaths", "Several options given, only one is supported at a time.");
+ error(errorMessage);
+ }
+ return 0;
+}
diff --git a/src/qtpaths/qtpaths.pro b/src/qtpaths/qtpaths.pro
new file mode 100644
index 000000000..f494c8148
--- /dev/null
+++ b/src/qtpaths/qtpaths.pro
@@ -0,0 +1,5 @@
+SOURCES = qtpaths.cpp
+QT = core
+win32:CONFIG += console
+
+load(qt_app)
diff --git a/src/src.pro b/src/src.pro
index c8756db40..0e6b24d77 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -14,7 +14,8 @@ qtHaveModule(widgets) {
}
}
-SUBDIRS += linguist
+SUBDIRS += linguist \
+ qtpaths
mac {
SUBDIRS += macdeployqt