⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 port.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the qt3to4 porting application of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.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 GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "projectporter.h"#include "fileporter.h"#include "logger.h"#include "preprocessorcontrol.h"#include <QString>#include <QFile>#include <QFileInfo>#include <QDir>#include <QByteArray>#include <QBuffer>#include <QTextStream>#include <QCoreApplication>#include <QLibraryInfo>#include <QtDebug>QString rulesFilePath;QString applicationDirPath;QString findRulesFile(const QString &fileName){    // Check QLibraryInfo::DataPath/filename    QString filePath;    filePath = QDir::cleanPath(QLibraryInfo::location(QLibraryInfo::DataPath) + "/" + fileName)  ;    if (QFile::exists(filePath))        return QFileInfo(filePath).canonicalFilePath();    // Check QLibraryInfo::PrefixPath/tools/porting/src/filename    filePath = QDir::cleanPath(QLibraryInfo::location(QLibraryInfo::PrefixPath) + "/tools/porting/src/" + fileName);    if (QFile::exists(filePath))        return QFileInfo(filePath).canonicalFilePath();    //no luck    return QString();}/*    A option contains an argument and its help text.*/class Option{public:    Option(const QString &argument, const QString &description)    :argument(argument), description(description) {}    /*        Checks if candidateArgument matches the options argument.    */    bool checkArgument(const QString &candidateArgument) const    {        return (candidateArgument == argument) ||               (candidateArgument.toLower() == argument.toLower());    }    QString argument;    QString description;};typedef QList<Option> OptionList;void usage(const OptionList &optionList){    printf("Tool for porting Qt 3 applications to Qt 4, using the compatibility library\n");    printf("and compatibility functions in the core library.\n");    printf("Usage: qt3to4 [options] <Infile>, [Infile], ...\n");    printf("\n");    printf("Infile can be a source file or a project file.\n");    printf("If you specify a project file, ending with .pro or .pri,\n");    printf("qt3to4 will port all files specified in that project.\n");    printf("\n");    printf("Options:\n");    // Find the length of the longest argument.    int argumentMaxLenght = 0;    foreach (const Option option, optionList) {        if (option.argument.count() > argumentMaxLenght)            argumentMaxLenght = option.argument.count();    }    // Print the options, pad with spaces between the argument and description where needed.    const int extraSpaces = 5;    foreach (const Option option, optionList) {        printf("%s", option.argument.toLocal8Bit().constData());        for (int i = 0; i < argumentMaxLenght - option.argument.count() + extraSpaces; ++i)            printf(" ");        puts(option.description.toLocal8Bit().constData());    }    printf("\n");    printf("The porting documentation contains more information on how\n");    printf("to use qt3to4 as well as general porting information.\n");}int main(int argc, char**argv){    QCoreApplication app(argc, argv);    applicationDirPath = app.applicationDirPath();    QString defaultRulesFileName = "q3porting.xml";    QStringList inFileNames;    QStringList includeSearchDirectories;    bool enableCppParsing = true;    bool useBuildtinQt3Headers = true;    bool showMissingFilesWarnings = false;    bool alwaysOverwrite = false;    int currentArg = 1;    const Option helpOption("-h", "Display this help.");    const Option rulesFileOption("-rulesFile", "Specify the location for the rules file.");    const Option includeDirectoryOption("-I", "Add directory to the list of directories to be searched for header files.");    const Option disableCppParsingOption("-disableCppParsing", "Disable the C++ parsing component.");    const Option disableBuiltinQt3HeadersOption("-disableBuiltinQt3Headers", "Do not use the built-in Qt 3 headers.");    const Option missingFileWarningsOption("-missingFileWarnings", "Warn about files not found while searching for header files.");    const Option alwaysOverwriteOption("-alwaysOverwrite", "Port all files without prompting.");    const Option strictOption("-strict", "Be stricter when selecting which tokens to replace.");    const OptionList optionList = OptionList() << helpOption << alwaysOverwriteOption << rulesFileOption                                               << includeDirectoryOption << disableCppParsingOption                                               << disableBuiltinQt3HeadersOption << missingFileWarningsOption                                               << strictOption;    if (argc == 1) {        usage(optionList);        return 0;    }    // Read arguments.    while (currentArg < argc) {        QString argText = argv[currentArg];        if(argText.isEmpty()) {            continue;        } else if (argText == "--help" || argText == "/h" || argText == "-help"            || argText == "-h"  || argText == "-?" || argText == "/?") {            usage(optionList);            return 0;        } else if (rulesFileOption.checkArgument(argText)) {            ++currentArg;            if (currentArg >= argc) {                printf("You must specify a file name along with %s \n", argText.toLocal8Bit().constData());                return 0;            }            rulesFilePath = argv[currentArg];            if (!QFile::exists(rulesFilePath)) {                printf("File not found: %s\n", rulesFilePath.toLocal8Bit().constData());                return 0;            }        } else if (includeDirectoryOption.checkArgument(argText)) {            ++currentArg;            if (currentArg >= argc) {                printf("You must specify a directory name along with %s\n",                     argText.toLocal8Bit().constData());                return 0;            }            includeSearchDirectories += argv[currentArg];        } else if (disableCppParsingOption.checkArgument(argText)) {            enableCppParsing = false;        } else if (strictOption.checkArgument(argText)) {            // Enable strict mode, this is used by the ScopedTokenReplacement constructor.             Logger::instance()->globalState.insert("strictMode", "");        } else if (disableBuiltinQt3HeadersOption.checkArgument(argText)) {            useBuildtinQt3Headers = false;        } else if (missingFileWarningsOption.checkArgument(argText)) {            showMissingFilesWarnings = true;        } else if (alwaysOverwriteOption.checkArgument(argText)) {            alwaysOverwrite = true;            FileWriter::instance()->setOverwriteFiles(FileWriter::AlwaysOverWrite);        } else if (argText[0]  == '-') {            printf("Unknown option %s\n", argText.toLocal8Bit().constData());            return 0;        } else {            inFileNames.append(argText);        }        ++currentArg;    }    if (rulesFilePath.isEmpty())        rulesFilePath = findRulesFile(defaultRulesFileName);    // Check if we have a rule file.    if (!QFile::exists(rulesFilePath)) {        printf("Error: Could not find the %s rule file: ", defaultRulesFileName.toLocal8Bit().constData());        printf("Please try specifying the location of the file with the %s option \n",             rulesFileOption.argument.toLocal8Bit().constData());        return 0;    }    // Check if we have any infiles    if (inFileNames.isEmpty()) {        printf("You must specify a file name. \n");        return 0;    }    // Read rule file and create PortingRules instance.    printf("Using rules file: ");    puts(QDir::convertSeparators(rulesFilePath).toLocal8Bit().constData());    PortingRules::createInstance(rulesFilePath);    // Construct a ProjectPorter object add pass it the options.    QStringList builtinQtheaders;    if (useBuildtinQt3Headers) {        builtinQtheaders += ":qt3headers0.resource";        builtinQtheaders += ":qt3headers1.resource";        builtinQtheaders += ":qt3headers2.resource";        builtinQtheaders += ":qt3headers3.resource";    }    ProjectPorter porter(QDir::currentPath(), includeSearchDirectories, builtinQtheaders);    porter.enableCppParsing(enableCppParsing);    porter.enableMissingFilesWarnings(showMissingFilesWarnings);    // Determine mode based on file exstesions and port.    // (The ProjectPorter class is also used for porting single files :)    foreach (QString inFileName, inFileNames) {        const QString canonicalFileName = QFileInfo(inFileName).canonicalFilePath();        if (QFile::exists(canonicalFileName)) {            if (canonicalFileName.endsWith(".pro") || canonicalFileName.endsWith(".pri"))                porter.portProject(canonicalFileName);            else                porter.portFile(canonicalFileName);        } else {            printf("File not found: %s \n", QDir::convertSeparators(inFileName).toLocal8Bit().constData());        }    }    // Write log    if (Logger::instance()->numEntries() > 0) {        QStringList report = Logger::instance()->fullReport();        QString logFileName =  "portinglog.txt";        printf("Writing log to %s \n", logFileName.toLocal8Bit().constData());        QByteArray logContents;        QBuffer logBuffer(&logContents);        logBuffer.open(QIODevice::Text | QIODevice::WriteOnly);        QTextStream logStream(&logBuffer);        foreach (QString logLine, report) {            logStream << logLine << endl;        }        FileWriter fileWriter(FileWriter::AskOnOverWrite, "Overwrite file ");        if (alwaysOverwrite)            fileWriter.setOverwriteFiles(FileWriter::AlwaysOverWrite);        fileWriter.writeFile(logFileName, logContents);    }    Logger::deleteInstance();    PortingRules::deleteInstance();    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -