From: Sune Vuorela Date: Fri, 5 Jul 2013 12:07:18 +0000 (+0200) Subject: Command line client to standard paths X-Git-Tag: accepted/tizen/20131212.181521~80 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0c8a003c6f2affee5a3f6b73b9e96d178b06cd75;p=platform%2Fupstream%2Fqttools.git 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 --- diff --git a/src/qtpaths/qtpaths.cpp b/src/qtpaths/qtpaths.cpp new file mode 100644 index 0000000..eca53d5 --- /dev/null +++ b/src/qtpaths/qtpaths.cpp @@ -0,0 +1,296 @@ +/**************************************************************************** + * * + ** Copyright (C) 2013 Sune Vuorela + ** 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 +#include +#include +#include +#include + +#include + +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 ."), QStringLiteral("type")); + parser.addOption(paths); + + QCommandLineOption writablePath(QStringLiteral("writable-path"), + QCoreApplication::translate("qtpaths", "Find writable path for ."), QStringLiteral("type")); + parser.addOption(writablePath); + + QCommandLineOption locateDir(QStringList() << QStringLiteral("locate-dir") << QStringLiteral("locate-directory."), + QCoreApplication::translate("qtpaths", "Locate directory [name] in ."), QStringLiteral("type")); + parser.addOption(locateDir); + + QCommandLineOption locateDirs(QStringList() << QStringLiteral("locate-dirs") << QStringLiteral("locate-directories"), + QCoreApplication::translate("qtpaths", "Locate directories [name] in all paths for ."), QStringLiteral("type")); + parser.addOption(locateDirs); + + QCommandLineOption locateFile(QStringLiteral("locate-file"), + QCoreApplication::translate("qtpaths", "Locate file [name] for ."), QStringLiteral("type")); + parser.addOption(locateFile); + + QCommandLineOption locateFiles(QStringLiteral("locate-files"), + QCoreApplication::translate("qtpaths", "Locate files [name] in all paths for ."), 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 ."), 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 0000000..f494c81 --- /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 c8756db..0e6b24d 100644 --- a/src/src.pro +++ b/src/src.pro @@ -14,7 +14,8 @@ qtHaveModule(widgets) { } } -SUBDIRS += linguist +SUBDIRS += linguist \ + qtpaths mac { SUBDIRS += macdeployqt