diff options
author | Lars Knoll <lars.knoll@nokia.com> | 2009-03-23 09:34:13 (GMT) |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2009-03-23 09:34:13 (GMT) |
commit | 67ad0519fd165acee4a4d2a94fa502e9e4847bd0 (patch) | |
tree | 1dbf50b3dff8d5ca7e9344733968c72704eb15ff /src/tools/uic3/main.cpp | |
download | Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.zip Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.tar.gz Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.tar.bz2 |
Long live Qt!
Diffstat (limited to 'src/tools/uic3/main.cpp')
-rw-r--r-- | src/tools/uic3/main.cpp | 414 |
1 files changed, 414 insertions, 0 deletions
diff --git a/src/tools/uic3/main.cpp b/src/tools/uic3/main.cpp new file mode 100644 index 0000000..d581016 --- /dev/null +++ b/src/tools/uic3/main.cpp @@ -0,0 +1,414 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "ui3reader.h" +#include "domtool.h" +#include "globaldefs.h" + +#include <QApplication> +#include <QFile> +#include <QFileInfo> +#include <QStringList> +#include <QDateTime> +#include <QSettings> +#include <stdio.h> +#include <stdlib.h> + +#if defined Q_WS_WIN +#include <qt_windows.h> +#endif + +QT_BEGIN_NAMESPACE + +int runUic3(int argc, char * argv[]) +{ + bool impl = false; + bool wrap = false; + bool subcl = false; + bool extract = false; + bool imagecollection = false; + bool imagecollection_tmpfile = false; + bool convert = false; + QStringList images; + const char *error = 0; + const char* fileName = 0; + const char* className = 0; + const char* headerFile = 0; + const char* convertedUiFile = 0; + QByteArray outputFile; + QString qrcOutputFile; + QByteArray image_tmpfile; + const char* projectName = 0; + const char* trmacro = 0; + bool nofwd = false; + bool fix = false; + bool deps = false; + bool implicitIncludes = true; + QByteArray pchFile; + + + QApplication app(argc, argv, false); + + for (int n = 1; n < argc && error == 0; n++) { + QByteArray arg = argv[n]; + if (arg[0] == '-') { // option + QByteArray opt = arg.data() + 1; + if (opt[0] == 'o') { // output redirection + if (opt[1] == '\0') { + if (!(n < argc-1)) { + error = "Missing output-file name"; + break; + } + outputFile = argv[++n]; + } else + outputFile = opt.data() + 1; + } else if (opt[0] == 'i' || opt == "impl") { + impl = true; + if (opt == "impl" || opt[1] == '\0') { + if (!(n < argc-1)) { + error = "Missing name of header file"; + break; + } + headerFile = argv[++n]; + } else + headerFile = opt.data() + 1; + } else if (opt[0] == 'w' || opt == "wrap") { + wrap = true; + if (opt == "wrap" || opt[1] == '\0') { + if (!(n < argc-1)) { + error = "Missing name of converted ui file"; + break; + } + convertedUiFile = argv[++n]; + } else + convertedUiFile = opt.data() + 1; + } else if (opt == "extract") { // output redirection + extract = true; + if (!(n < argc-1)) { + error = "Missing output qrc-file name"; + break; + } + qrcOutputFile = QFile::decodeName(argv[++n]); + } else if ( opt[0] == 'e' || opt == "embed" ) { + imagecollection = true; + if ( opt == "embed" || opt[1] == '\0' ) { + if ( !(n < argc-1) ) { + error = "Missing name of project"; + break; + } + projectName = argv[++n]; + } else { + projectName = opt.data() + 1; + } + if ( argc > n+1 && qstrcmp( argv[n+1], "-f" ) == 0 ) { + imagecollection_tmpfile = true; + image_tmpfile = argv[n+2]; + n += 2; + } + } else if (opt == "d") { + deps = true; + } else if (opt == "no-implicit-includes") { + implicitIncludes = false; + } else if (opt == "nofwd") { + nofwd = true; + } else if (opt == "nounload") { + // skip + } else if (opt == "convert") { + convert = true; + } else if (opt == "subdecl") { + subcl = true; + if (!(n < argc-2)) { + error = "Missing arguments"; + break; + } + className = argv[++n]; + headerFile = argv[++n]; + } else if (opt == "subimpl") { + subcl = true; + impl = true; + if (!(n < argc-2)) { + error = "Missing arguments"; + break; + } + className = argv[++n]; + headerFile = argv[++n]; + } else if (opt == "tr") { + if (opt == "tr" || opt[1] == '\0') { + if (!(n < argc-1)) { + error = "Missing tr macro."; + break; + } + trmacro = argv[++n]; + } else { + trmacro = opt.data() + 1; + } + } else if (opt == "L") { + if (!(n < argc-1)) { + error = "Missing plugin path."; + break; + } + ++n; // ignore the next argument + } else if (opt == "version") { + fprintf(stderr, + "Qt User Interface Compiler version %s\n", + QT_VERSION_STR); + return 1; + } else if (opt == "help") { + break; + } else if (opt == "fix") { + fix = true; + } else if (opt == "pch") { + if (!(n < argc-1)) { + error = "Missing name of PCH file"; + break; + } + pchFile = argv[++n]; + } else { + error = "Unrecognized option"; + } + } else { + if (imagecollection && !imagecollection_tmpfile) + images << QLatin1String(argv[n]); + else if (fileName) // can handle only one file + error = "Too many input files specified"; + else + fileName = argv[n]; + } + } + + if (argc < 2 || error || (!fileName && !imagecollection)) { + fprintf(stderr, + "Qt User Interface Compiler version %s\n", + QT_VERSION_STR); + if (error) + fprintf(stderr, "uic: %s\n", error); + + fprintf(stderr, "Usage: %s [options] [mode] <uifile>\n\n" + "Convert a UI file to version 4:\n" + " %s [options] -convert <uifile>\n" + "Generate declaration:\n" + " %s [options] <uifile>\n" + "\t<uiheaderfile> name of the data file\n" + " %s [options] -decl <uiheaderfile> <uifile>\n" + "\t<uiheaderfile> name of the data file\n" + " %s [options] -wrap <converteduifile> <uifile>\n" + "\t<converteduifile> name of the converted ui file\n" + "Generate implementation:\n" + " %s [options] -impl <headerfile> <uifile>\n" + "\t<headerfile> name of the declaration file\n" + "Generate image collection:\n" + " %s [options] -embed <project> <image1> <image2> <image3> ...\n" + "or\n" + " %s [options] -embed <project> -f <temporary file containing image names>\n" + "\t<project> project name\n" + "\t<image[1-N]> image files\n" + "Generate subclass declaration:\n" + " %s [options] -subdecl <subclassname> <baseclassheaderfile> <uifile>\n" + "\t<subclassname> name of the subclass to generate\n" + "\t<baseclassheaderfile> declaration file of the baseclass\n" + "Generate subclass implementation:\n" + " %s [options] -subimpl <subclassname> <subclassheaderfile> <uifile>\n" + "\t<subclassname> name of the subclass to generate\n" + "\t<subclassheaderfile> declaration file of the subclass\n" + "Options:\n" + "\t-o file Write output to file rather than stdout\n" + "\t-extract qrcFile Create resource file and extract embedded images into \"image\" dir\n" + "\t-pch file Add #include \"file\" as the first statement in implementation\n" + "\t-nofwd Omit forward declarations of custom classes\n" + "\t-no-implicit-includes Do not generate #include-directives for custom classes\n" + "\t-nounload Don't unload plugins after processing\n" + "\t-tr func Use func() instead of tr() for i18n\n" + "\t-L path Additional plugin search path\n" + "\t-version Display version of uic\n" + "\t-help Display this information\n" + , argv[0], argv[0], argv[0], argv[0], argv[0], argv[0], argv[0], argv[0], argv[0], argv[0] + ); + return 1; + } + + if (imagecollection_tmpfile) { + QFile ifile(QFile::decodeName(image_tmpfile)); + if (ifile.open(QIODevice::ReadOnly)) { + QTextStream ts(&ifile); + QString s = ts.read(); + s = s.simplified(); + images = s.split(QLatin1Char(' ')); + for (QStringList::Iterator it = images.begin(); it != images.end(); ++it) + *it = (*it).simplified(); + } + } + + QFile fileOut; + if (!outputFile.isEmpty()) { + fileOut.setFileName(QFile::decodeName(outputFile)); + if (!fileOut.open(QIODevice::WriteOnly)) { + fprintf(stderr, "%s: Could not open output file '%s'\n", argv[0], outputFile.data()); + return 1; + } + } else { + fileOut.open(QIODevice::WriteOnly, stdout); + } + + QTextStream out(&fileOut); + + Ui3Reader ui3(out); + ui3.setExtractImages(extract, qrcOutputFile); + + if (projectName && imagecollection) { + out.setEncoding(QTextStream::Latin1); + ui3.embed(projectName, images); + return 0; + } + + out.setEncoding(QTextStream::UnicodeUTF8); + + QFile file(QFile::decodeName(fileName)); + if (!file.open(QIODevice::ReadOnly)) { + fprintf(stderr, "%s: Could not open file '%s'\n", argv[0], fileName); + return 1; + } + + QDomDocument doc; + QString errMsg; + int errLine; + if (!doc.setContent(&file, &errMsg, &errLine)) { + fprintf(stderr, "%s: Failed to parse %s: %s in line %d\n", argv[0], fileName, errMsg.latin1(), errLine); + return 1; + } + + QDomElement e = doc.firstChild().toElement(); + double version = e.attribute(QLatin1String("version"), QLatin1String("3.0")).toDouble(); + + if (version > 3.3) { + fprintf(stderr, "%s: File generated with too recent version of Qt Designer (%s vs. %s)\n", + argv[0], e.attribute(QLatin1String("version")).latin1(), "3.3"); + return 1; + } + + DomTool::fixDocument(doc); + + if (fix) { + out << doc.toString(); + return 0; + } + + if (imagecollection) { + out.setEncoding(QTextStream::Latin1); + ui3.embed(projectName, images); + return 0; + } else if (deps) { + QStringList globalIncludes, localIncludes; + ui3.computeDeps(e, globalIncludes, localIncludes, impl); + + foreach (QString i, globalIncludes) + printf("%s\n", i.toLatin1().constData()); + + foreach (QString i, localIncludes) + printf("%s\n", i.toLatin1().constData()); + + if (impl) + printf("%s\n", headerFile); + + return 0; + } else if (convert) { + ui3.generateUi4(QFile::decodeName(fileName), QFile::decodeName(outputFile), doc, implicitIncludes); + return 0; + } + + QString protector; + if (subcl && className && !impl) + protector = QString::fromUtf8(className).toUpper() + QLatin1String("_H"); + + if (!protector.isEmpty()) { + out << "#ifndef " << protector << endl; + out << "#define " << protector << endl; + } + + if (!pchFile.isEmpty() && impl) { + out << "#include \"" << pchFile << "\" // PCH include" << endl; + } + + if (headerFile) { + out << "#include \"" << headerFile << "\"" << endl << endl; + } + + QString convertedUi; + if (wrap) { + convertedUi = QFile::decodeName(convertedUiFile); + int pos = convertedUi.lastIndexOf(QLatin1String(".ui")); + if (pos > 0) { + convertedUi = convertedUi.mid(0, pos); + convertedUi += QLatin1String(".h"); + } + convertedUi = QLatin1String("ui_") + convertedUi; + } + + ui3.generate(QFile::decodeName(fileName), + QFile::decodeName(outputFile), + doc, + !impl, + subcl, + QString::fromUtf8(trmacro), + QString::fromUtf8(className), + nofwd, + implicitIncludes, + convertedUi); + + if (!protector.isEmpty()) { + out << endl; + out << "#endif // " << protector << endl; + } + + if (fileOut.error() != QFile::NoError) { + fprintf(stderr, "%s: Error writing to file\n", argv[0]); + if (!outputFile.isEmpty()) + remove(outputFile); + } + + return 0; +} + +QT_END_NAMESPACE + +int main(int argc, char * argv[]) +{ + return QT_PREPEND_NAMESPACE(runUic3(argc, argv)); +} |