diff options
author | Alessandro Portale <alessandro.portale@nokia.com> | 2011-02-03 19:46:41 +0100 |
---|---|---|
committer | Alessandro Portale <alessandro.portale@nokia.com> | 2011-02-03 19:48:12 +0100 |
commit | efc596170cad15f56c18643508fc1ea0c83a5644 (patch) | |
tree | e5a9cd4976a3e2eb395f5441ae1c264bd2f5b6f1 | |
parent | 07b52446897d6345bc26e5463aa64e5866da6c26 (diff) | |
download | qt-creator-efc596170cad15f56c18643508fc1ea0c83a5644.tar.gz |
Refactoring the template code updater. Reusable for html5
Less static functions, more ploymorphism.
7 files changed, 75 insertions, 85 deletions
diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.cpp b/src/plugins/qt4projectmanager/qt4projectmanager.cpp index 4a48134c1d..6b88843e3d 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanager.cpp @@ -194,22 +194,19 @@ QString Qt4Manager::mimeType() const return QLatin1String(Qt4ProjectManager::Constants::PROFILE_MIMETYPE); } -// Prototype Ui for update of QmlApplicationView files. -// TODO implement a proper Ui for this. Maybe not as modal message box. -// When removing this, also remove the inclusions of "wizards/qmlstandaloneapp.h" and QtGui/QMessageBox -inline void updateQmlApplicationViewerFiles(const QString proFile) +inline void updateBoilerPlateCodeFiles(const AbstractMobileApp &app, const QString proFile) { - const QList<QmlAppGeneratedFileInfo> updates = - QmlStandaloneApp::fileUpdates(proFile); + const QList<AbstractGeneratedFileInfo> updates = + app.fileUpdates(proFile); if (!updates.empty()) { // TODO Translate the folloing strings when we want to keep the code QString message = QLatin1String("The following files are either outdated or have been modified:"); message.append(QLatin1String("<ul>")); - foreach (const QmlAppGeneratedFileInfo &info, updates) { + foreach (const AbstractGeneratedFileInfo &info, updates) { QStringList reasons; - if (info.wasModified()) + if (info.statedChecksum != info.dataChecksum) reasons.append(QLatin1String("modified")); - if (info.isOutdated()) + if (info.version != info.currentVersion) reasons.append(QLatin1String("outdated")); message.append(QString::fromLatin1("<li><nobr>%1 (%2)</nobr></li>") .arg(QDir::toNativeSeparators(info.fileInfo.canonicalFilePath())) @@ -220,7 +217,7 @@ inline void updateQmlApplicationViewerFiles(const QString proFile) const QString title = QLatin1String("Update of the QmlApplicationView files"); if (QMessageBox::question(0, title, message, QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { QString error; - if (!QmlStandaloneApp::updateFiles(updates, error)) + if (!app.updateFiles(updates, error)) QMessageBox::critical(0, title, error); } } @@ -248,7 +245,7 @@ ProjectExplorer::Project *Qt4Manager::openProject(const QString &fileName) } } - updateQmlApplicationViewerFiles(canonicalFilePath); + updateBoilerPlateCodeFiles(QmlStandaloneApp(), canonicalFilePath); Qt4Project *pro = new Qt4Project(this, canonicalFilePath); return pro; diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp b/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp index bd7c8dfb58..f354d373e4 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp @@ -47,23 +47,13 @@ namespace Internal { AbstractGeneratedFileInfo::AbstractGeneratedFileInfo() : fileType(ExtendedFile) + , currentVersion(-1) , version(-1) , dataChecksum(0) , statedChecksum(0) { } -bool AbstractGeneratedFileInfo::isUpToDate() const -{ - return !isOutdated() && !wasModified(); -} - -bool AbstractGeneratedFileInfo::wasModified() const -{ - return dataChecksum != statedChecksum; -} - - const QString AbstractMobileApp::CFileComment(QLatin1String("//")); const QString AbstractMobileApp::ProFileComment(QLatin1String("#")); const QString AbstractMobileApp::DeploymentPriFileName(QLatin1String("deployment.pri")); @@ -298,6 +288,54 @@ QByteArray AbstractMobileApp::generateProFile(QString *errorMessage) const return proFileContent; } +QList<AbstractGeneratedFileInfo> AbstractMobileApp::fileUpdates(const QString &mainProFile) const +{ + QList<AbstractGeneratedFileInfo> result; + foreach (const AbstractGeneratedFileInfo &file, updateableFiles(mainProFile)) { + AbstractGeneratedFileInfo newFile = file; + QFile readFile(newFile.fileInfo.absoluteFilePath()); + if (!readFile.open(QIODevice::ReadOnly)) + continue; + const QString firstLine = readFile.readLine(); + const QStringList elements = firstLine.split(QLatin1Char(' ')); + if (elements.count() != 5 || elements.at(1) != FileChecksum + || elements.at(3) != FileStubVersion) + continue; + const QString versionString = elements.at(4); + newFile.version = versionString.startsWith(QLatin1String("0x")) + ? versionString.toInt(0, 16) : 0; + newFile.statedChecksum = elements.at(2).toUShort(0, 16); + QByteArray data = readFile.readAll(); + data.replace('\x0D', ""); + data.replace('\x0A', ""); + newFile.dataChecksum = qChecksum(data.constData(), data.length()); + if (newFile.dataChecksum != newFile.statedChecksum + || newFile.version < newFile.currentVersion) + result.append(newFile); + } + return result; +} + + +bool AbstractMobileApp::updateFiles(const QList<AbstractGeneratedFileInfo> &list, QString &error) const +{ + error.clear(); + foreach (const AbstractGeneratedFileInfo &info, list) { + const QByteArray data = generateFile(info.fileType, &error); + if (!error.isEmpty()) + return false; + QFile file(info.fileInfo.absoluteFilePath()); + if (!file.open(QIODevice::WriteOnly) || file.write(data) == -1) { + error = QCoreApplication::translate( + "Qt4ProjectManager::Internal::QmlStandaloneApp", + "Could not write file '%1'."). + arg(QDir::toNativeSeparators(info.fileInfo.canonicalFilePath())); + return false; + } + } + return true; +} + #ifndef CREATORLESSTEST // The definition of QmlStandaloneApp::templatesRoot() for // CREATORLESSTEST is in tests/manual/qmlstandalone/main.cpp diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileapp.h b/src/plugins/qt4projectmanager/wizards/abstractmobileapp.h index a3dfd25955..c4e5bd9402 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileapp.h +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileapp.h @@ -60,15 +60,12 @@ struct AbstractGeneratedFileInfo AbstractGeneratedFileInfo(); - bool isUpToDate() const; - bool wasModified() const; - virtual bool isOutdated() const=0; - int fileType; QFileInfo fileInfo; - int version; - quint16 dataChecksum; - quint16 statedChecksum; + int currentVersion; // Current version of the template file in Creator + int version; // The version in the file header + quint16 dataChecksum; // The calculated checksum + quint16 statedChecksum; // The checksum in the file header }; class AbstractMobileApp : public QObject @@ -125,6 +122,8 @@ public: static QString symbianUidForPath(const QString &path); static int makeStubVersion(int minor); + QList<AbstractGeneratedFileInfo> fileUpdates(const QString &mainProFile) const; + bool updateFiles(const QList<AbstractGeneratedFileInfo> &list, QString &error) const; static const QString DeploymentPriFileName; protected: @@ -164,6 +163,7 @@ private: virtual void handleCurrentProFileTemplateLine(const QString &line, QTextStream &proFileTemplate, QTextStream &proFile, bool &uncommentNextLine) const=0; + virtual QList<AbstractGeneratedFileInfo> updateableFiles(const QString &mainProFile) const = 0; QString m_projectName; QFileInfo m_projectPath; diff --git a/src/plugins/qt4projectmanager/wizards/mobileapp.cpp b/src/plugins/qt4projectmanager/wizards/mobileapp.cpp index f8a0916dcd..57ec6919db 100644 --- a/src/plugins/qt4projectmanager/wizards/mobileapp.cpp +++ b/src/plugins/qt4projectmanager/wizards/mobileapp.cpp @@ -142,6 +142,12 @@ QString MobileApp::mainWindowClassName() const int MobileApp::stubVersionMinor() const { return StubVersion; } +QList<AbstractGeneratedFileInfo> MobileApp::updateableFiles(const QString &mainProFile) const +{ + Q_UNUSED(mainProFile) + return QList<AbstractGeneratedFileInfo>(); // Nothing to update, here +} + const int MobileApp::StubVersion = 2; } // namespace Internal diff --git a/src/plugins/qt4projectmanager/wizards/mobileapp.h b/src/plugins/qt4projectmanager/wizards/mobileapp.h index 168fa4c1e1..7e41aebe96 100644 --- a/src/plugins/qt4projectmanager/wizards/mobileapp.h +++ b/src/plugins/qt4projectmanager/wizards/mobileapp.h @@ -80,6 +80,7 @@ private: virtual void handleCurrentProFileTemplateLine(const QString &line, QTextStream &proFileTemplate, QTextStream &proFile, bool &uncommentNextLine) const; + QList<AbstractGeneratedFileInfo> updateableFiles(const QString &mainProFile) const; }; } // end of namespace Internal diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp b/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp index 5b4cd09234..a3265333f9 100644 --- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp +++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp @@ -95,11 +95,7 @@ QmlCppPlugin::QmlCppPlugin(const QString &name, const QFileInfo &path, , path(path) , module(module) , proFile(proFile) -{} - -bool QmlAppGeneratedFileInfo::isOutdated() const { - return version < AbstractMobileApp::makeStubVersion(QmlStandaloneApp::StubVersion); } QmlStandaloneApp::QmlStandaloneApp() : AbstractMobileApp() @@ -407,9 +403,9 @@ int QmlStandaloneApp::stubVersionMinor() const return StubVersion; } -static QList<QmlAppGeneratedFileInfo> updateableFiles(const QString &mainProFile) +QList<AbstractGeneratedFileInfo> QmlStandaloneApp::updateableFiles(const QString &mainProFile) const { - QList<QmlAppGeneratedFileInfo> result; + QList<AbstractGeneratedFileInfo> result; static const struct { int fileType; QString fileName; @@ -428,6 +424,7 @@ static QList<QmlAppGeneratedFileInfo> updateableFiles(const QString &mainProFile QmlAppGeneratedFileInfo file; file.fileType = files[i].fileType; file.fileInfo = QFileInfo(fileName); + file.currentVersion = AbstractMobileApp::makeStubVersion(QmlStandaloneApp::StubVersion); result.append(file); } if (result.count() != size) @@ -435,53 +432,6 @@ static QList<QmlAppGeneratedFileInfo> updateableFiles(const QString &mainProFile return result; } -QList<QmlAppGeneratedFileInfo> QmlStandaloneApp::fileUpdates(const QString &mainProFile) -{ - QList<QmlAppGeneratedFileInfo> result; - foreach (const QmlAppGeneratedFileInfo &file, updateableFiles(mainProFile)) { - QmlAppGeneratedFileInfo newFile = file; - QFile readFile(newFile.fileInfo.absoluteFilePath()); - if (!readFile.open(QIODevice::ReadOnly)) - continue; - const QString firstLine = readFile.readLine(); - const QStringList elements = firstLine.split(QLatin1Char(' ')); - if (elements.count() != 5 || elements.at(1) != FileChecksum - || elements.at(3) != FileStubVersion) - continue; - const QString versionString = elements.at(4); - newFile.version = versionString.startsWith(QLatin1String("0x")) - ? versionString.toInt(0, 16) : 0; - newFile.statedChecksum = elements.at(2).toUShort(0, 16); - QByteArray data = readFile.readAll(); - data.replace('\x0D', ""); - data.replace('\x0A', ""); - newFile.dataChecksum = qChecksum(data.constData(), data.length()); - if (!newFile.isUpToDate()) - result.append(newFile); - } - return result; -} - -bool QmlStandaloneApp::updateFiles(const QList<QmlAppGeneratedFileInfo> &list, QString &error) -{ - error.clear(); - const QmlStandaloneApp app; - foreach (const QmlAppGeneratedFileInfo &info, list) { - const QByteArray data = app.generateFile(info.fileType, &error); - if (!error.isEmpty()) - return false; - QFile file(info.fileInfo.absoluteFilePath()); - if (!file.open(QIODevice::WriteOnly) || file.write(data) == -1) { - error = QCoreApplication::translate( - "Qt4ProjectManager::Internal::QmlStandaloneApp", - "Could not write file '%1'."). - arg(QDir::toNativeSeparators(info.fileInfo.canonicalFilePath())); - return false; - } - } - return true; -} - const int QmlStandaloneApp::StubVersion = 10; } // namespace Internal diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.h b/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.h index 9e26cc8071..626a5c9b38 100644 --- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.h +++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.h @@ -87,7 +87,6 @@ struct QmlAppGeneratedFileInfo : public AbstractGeneratedFileInfo }; QmlAppGeneratedFileInfo() : AbstractGeneratedFileInfo() {} - virtual bool isOutdated() const; }; class QmlStandaloneApp : public AbstractMobileApp @@ -122,8 +121,6 @@ public: #endif // CREATORLESSTEST bool useExistingMainQml() const; const QList<QmlModule*> modules() const; - static QList<QmlAppGeneratedFileInfo> fileUpdates(const QString &mainProFile); - static bool updateFiles(const QList<QmlAppGeneratedFileInfo> &list, QString &error); static const int StubVersion; @@ -138,6 +135,7 @@ private: virtual void handleCurrentProFileTemplateLine(const QString &line, QTextStream &proFileTemplate, QTextStream &proFile, bool &uncommentNextLine) const; + QList<AbstractGeneratedFileInfo> updateableFiles(const QString &mainProFile) const; bool addExternalModule(const QString &uri, const QFileInfo &dir, const QFileInfo &contentDir); |