diff -r 000000000000 -r 1918ee327afb tools/porting/src/portingrules.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/porting/src/portingrules.cpp Mon Jan 11 14:00:40 2010 +0000 @@ -0,0 +1,296 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the qt3to4 porting application 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "portingrules.h" +#include "logger.h" +#include "qtsimplexml.h" +#include +#include +#include + +QT_BEGIN_NAMESPACE + +PortingRules *PortingRules::theInstance = 0; + +void PortingRules::createInstance(QString xmlFilePath) +{ + deleteInstance(); + theInstance = new PortingRules(xmlFilePath); +} + +PortingRules *PortingRules::instance() +{ + if(theInstance) { + return theInstance; + } else { + qWarning("Error: must create a PortingRules instance with createInstance() before calling instance()\n"); + return 0; + } +} + +void PortingRules::deleteInstance() +{ + if(theInstance) { + delete theInstance; + theInstance = 0; + } +} + +PortingRules::PortingRules(QString xmlFilePath) +{ + parseXml(xmlFilePath); +} + +QList PortingRules::getTokenReplacementRules() +{ + if(tokenRules.isEmpty()) + addLogWarning(QLatin1String("Warning: token rules list is empty")); + return tokenRules; +} + +QStringList PortingRules::getHeaderList(QtVersion qtVersion) +{ + if(qt3Headers.isEmpty() || qt4Headers.isEmpty()) + addLogWarning(QLatin1String("Warning: headers list is empty")); + + if (qtVersion==Qt3) + return qt3Headers; + else //Qt4 + return qt4Headers; +} + +QHash PortingRules::getNeededHeaders() +{ + if(neededHeaders.isEmpty()) + addLogWarning(QLatin1String("Warning: needed headers list is empty")); + return neededHeaders; +} + +QStringList PortingRules::getInheritsQt() +{ + if(tokenRules.isEmpty()) + addLogWarning(QLatin1String("Warning: inheritsQtClass list is empty")); + return inheritsQtClass; +} + +QHash PortingRules::getClassLibraryList() +{ + if(classLibraryList.isEmpty()) + addLogWarning(QLatin1String("Warning: classLibraryList list is empty")); + return classLibraryList; +} + +QHash PortingRules::getHeaderReplacements() +{ + return headerReplacements; +} + +/* + Loads rule xml file given by fileName, and sets up data structures. + The rules can generally be divided into to types, replacement rules and + info rules. + + Replacement rules has the form Qt3Symobl -> Qt4Symbol + Info rules includes the NeedHeader, Qt3Header, Qt4Header, InhertitsQt + rule types. +*/ +void PortingRules::parseXml(QString fileName) +{ + QtSimpleXml *xmlPointer = loadXml(fileName); + QtSimpleXml &xml = *xmlPointer; + + int ruleCount = xml[QLatin1String("Rules")].numChildren(); + ++ruleCount; + + for(int rule=0; rulesetContent(&f)) + addLogError(QLatin1String("Xml parsing failed: ") + xml->errorString()); + + return xml; +} + +/* + Resolves includeFilePath against currentFilePath. If currentFilePath + contains foo/bar.xml, and includeFilePath contains bar2.xml, the returned + result will be foo/bar2.xml. If includeFilePath is absolute, it is returned + unmodified. +*/ +QString PortingRules::resolveFileName(const QString currentFilePath, + const QString includeFilePath) const +{ + if(QFileInfo(includeFilePath).isAbsolute()) + return includeFilePath; + QString relativeDirectory = QFileInfo(currentFilePath).dir().dirName(); + QString testFileName = relativeDirectory + QLatin1String("/") + includeFilePath; + if (QFile::exists(testFileName)) + return testFileName; + + return QString(); +} +/* + Checks if a rule is a replacement rule. +*/ +bool PortingRules::isReplacementRule(const QString ruleType) const +{ + return (ruleType == QLatin1String("RenamedHeader") || ruleType == QLatin1String("RenamedClass") || + ruleType == QLatin1String("RenamedToken") || ruleType == QLatin1String("RenamedEnumvalue") || + ruleType == QLatin1String("RenamedType") || ruleType == QLatin1String("RenamedQtSymbol") ); +} + +/* + Disables a replacement rule given by the replacementRule parameter +*/ +void PortingRules::disableRule(QtSimpleXml &replacementRule) +{ + RuleDescription ruleDescription(replacementRule); + disabledRules.append(ruleDescription); +} + +/* + Checks if a replacement rule is disabled or not +*/ +bool PortingRules::isRuleDisabled(QtSimpleXml &replacementRule) const +{ + RuleDescription ruleDescription(replacementRule); + return disabledRules.contains(ruleDescription); +} + +/* + Adds a warning to the global logger. +*/ +void PortingRules::addLogWarning(const QString text) const +{ + Logger::instance()->addEntry(new PlainLogEntry(QLatin1String("Warning"), QLatin1String("Porting"), text)); +} + +/* + Adds an error to the global logger. +*/ +void PortingRules::addLogError(const QString text) const +{ + Logger::instance()->addEntry(new PlainLogEntry(QLatin1String("Error"), QLatin1String("Porting"), text)); +} + +QT_END_NAMESPACE