summaryrefslogtreecommitdiffstats
path: root/installerbuilder/libinstaller/kdtools/KDUpdater/kdupdaterupdatesinfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'installerbuilder/libinstaller/kdtools/KDUpdater/kdupdaterupdatesinfo.cpp')
-rw-r--r--installerbuilder/libinstaller/kdtools/KDUpdater/kdupdaterupdatesinfo.cpp372
1 files changed, 372 insertions, 0 deletions
diff --git a/installerbuilder/libinstaller/kdtools/KDUpdater/kdupdaterupdatesinfo.cpp b/installerbuilder/libinstaller/kdtools/KDUpdater/kdupdaterupdatesinfo.cpp
new file mode 100644
index 000000000..4e9f60195
--- /dev/null
+++ b/installerbuilder/libinstaller/kdtools/KDUpdater/kdupdaterupdatesinfo.cpp
@@ -0,0 +1,372 @@
+/****************************************************************************
+** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
+**
+** This file is part of the KD Tools library.
+**
+** Licensees holding valid commercial KD Tools licenses may use this file in
+** accordance with the KD Tools Commercial License Agreement provided with
+** the Software.
+**
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU Lesser General Public License version 2 and version 3 as published by the
+** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Contact info@kdab.com if any conditions of this licensing are not
+** clear to you.
+**
+**********************************************************************/
+
+#include "kdupdaterupdatesinfo_p.h"
+
+#include <QCoreApplication>
+#include <QDomDocument>
+#include <QDomElement>
+#include <QFile>
+#include <QSharedData>
+
+//
+// KDUpdater::UpdatesInfo::UpdatesInfoData
+//
+struct KDUpdater::UpdatesInfo::UpdatesInfoData : public QSharedData
+{
+ Q_DECLARE_TR_FUNCTIONS(KDUpdater::UpdatesInfoData)
+
+public:
+ UpdatesInfoData() : error(UpdatesInfo::NotYetReadError), compatLevel(-1) { }
+
+ QString errorMessage;
+ UpdatesInfo::Error error;
+ QString updateXmlFile;
+ QString applicationName;
+ QString applicationVersion;
+ int compatLevel;
+ QList<KDUpdater::UpdateInfo> updateInfoList;
+
+ void parseFile(const QString& updateXmlFile);
+ bool parsePackageUpdateElement(const QDomElement & updateE);
+ bool parseCompatUpdateElement(const QDomElement & updateE);
+
+ void setInvalidContentError( const QString& detail );
+};
+
+void KDUpdater::UpdatesInfo::UpdatesInfoData::setInvalidContentError(const QString& detail)
+{
+ error = UpdatesInfo::InvalidContentError;
+ errorMessage = tr("Updates.Xml contains invalid content: %1").arg(detail);
+}
+
+void KDUpdater::UpdatesInfo::UpdatesInfoData::parseFile(const QString& updateXmlFile)
+{
+ QFile file( updateXmlFile );
+ if( !file.open(QFile::ReadOnly) )
+ {
+ error = UpdatesInfo::CouldNotReadUpdateInfoFileError;
+ errorMessage = tr("Could not read \"%1\"").arg(updateXmlFile);
+ return;
+ }
+
+ QDomDocument doc;
+ QString parseErrorMessage;
+ int parseErrorLine;
+ int parseErrorColumn;
+ if( !doc.setContent( &file, &parseErrorMessage, &parseErrorLine, &parseErrorColumn ) )
+ {
+ error = UpdatesInfo::InvalidXmlError;
+ errorMessage = tr("Parse error in %1 at %2, %3: %4")
+ .arg( updateXmlFile,
+ QString::number( parseErrorLine ),
+ QString::number( parseErrorColumn ),
+ parseErrorMessage );
+ return;
+ }
+
+ QDomElement rootE = doc.documentElement();
+ if( rootE.tagName() != QLatin1String( "Updates" ) )
+ {
+ setInvalidContentError(tr("root element %1 unexpected, should be \"Updates\"").arg(rootE.tagName()));
+ return;
+ }
+
+ QDomNodeList childNodes = rootE.childNodes();
+ for(int i=0; i<childNodes.count(); i++)
+ {
+ QDomNode childNode = childNodes.at(i);
+ QDomElement childE = childNode.toElement();
+ if( childE.isNull() )
+ continue;
+
+ if( childE.tagName() == QLatin1String( "ApplicationName" ) )
+ applicationName = childE.text();
+ else if( childE.tagName() == QLatin1String( "ApplicationVersion" ) )
+ applicationVersion = childE.text();
+ else if( childE.tagName() == QLatin1String( "RequiredCompatLevel" ) )
+ compatLevel = childE.text().toInt();
+ else if( childE.tagName() == QLatin1String( "PackageUpdate" ) ) {
+ const bool res = parsePackageUpdateElement( childE );
+ if (!res) {
+ //error handled in subroutine
+ return;
+ }
+ } else if( childE.tagName() == QLatin1String( "CompatUpdate" ) ) {
+ const bool res = parseCompatUpdateElement( childE );
+ if (!res) {
+ //error handled in subroutine
+ return;
+ }
+ }
+ }
+
+ if (applicationName.isEmpty())
+ {
+ setInvalidContentError(tr("ApplicationName element is missing"));
+ return;
+ }
+
+ if (applicationVersion.isEmpty())
+ {
+ setInvalidContentError(tr("ApplicationVersion element is missing"));
+ return;
+ }
+
+ error = UpdatesInfo::NoError;
+ errorMessage.clear();
+}
+
+bool KDUpdater::UpdatesInfo::UpdatesInfoData::parsePackageUpdateElement(const QDomElement & updateE)
+{
+ if( updateE.isNull() )
+ return false;
+
+ KDUpdater::UpdateInfo info;
+ info.type = KDUpdater::PackageUpdate;
+
+ QDomNodeList childNodes = updateE.childNodes();
+ for(int i=0; i<childNodes.count(); i++)
+ {
+ QDomNode childNode = childNodes.at(i);
+ QDomElement childE = childNode.toElement();
+ if( childE.isNull() )
+ continue;
+
+ if( childE.tagName() == QLatin1String( "ReleaseNotes" ) ) {
+ info.data[childE.tagName()] = QUrl(childE.text());
+ }
+ else if( childE.tagName() == QLatin1String( "UpdateFile" ) )
+ {
+ KDUpdater::UpdateFileInfo ufInfo;
+ ufInfo.arch = childE.attribute(QLatin1String( "Arch" ), QLatin1String( "i386" ));
+ ufInfo.os = childE.attribute(QLatin1String( "OS" ));
+ ufInfo.compressedSize = childE.attribute( QLatin1String( "CompressedSize" ) ).toLongLong();
+ ufInfo.uncompressedSize = childE.attribute( QLatin1String( "UncompressedSize" ) ).toLongLong();
+ ufInfo.sha1sum = QByteArray::fromHex( childE.attribute( QLatin1String( "sha1sum" ) ).toAscii() );
+ ufInfo.fileName = childE.text();
+ info.updateFiles.append(ufInfo);
+ }
+ else if (childE.tagName() == QLatin1String("Licenses")) {
+ QHash<QString, QVariant> licenseHash;
+ const QDomNodeList licenseNodes = childE.childNodes();
+ for (int i = 0; i < licenseNodes.count(); ++i) {
+ const QDomNode licenseNode = licenseNodes.at(i);
+ if (licenseNode.nodeName() == QLatin1String("License")) {
+ QDomElement element = licenseNode.toElement();
+ licenseHash.insert(element.attributeNode(QLatin1String("name")).value(),
+ element.attributeNode(QLatin1String("file")).value());
+ }
+ }
+ if (!licenseHash.isEmpty())
+ info.data.insert(QLatin1String("Licenses"), licenseHash);
+ }
+ else {
+ info.data[childE.tagName()] = childE.text();
+ }
+ }
+
+ if (!info.data.contains( QLatin1String( "Name" ) ))
+ {
+ setInvalidContentError(tr("PackageUpdate element without Name"));
+ return false;
+ }
+ else if (!info.data.contains( QLatin1String( "Version" ) ))
+ {
+ setInvalidContentError(tr("PackageUpdate element without Version"));
+ return false;
+ }
+ else if (!info.data.contains( QLatin1String( "ReleaseDate" ) ))
+ {
+ setInvalidContentError(tr("PackageUpdate element without ReleaseDate"));
+ return false;
+ }
+ else if (info.updateFiles.isEmpty())
+ {
+ setInvalidContentError(tr("PackageUpdate element without UpdateFile"));
+ return false;
+ }
+
+ updateInfoList.append(info);
+ return true;
+}
+
+bool KDUpdater::UpdatesInfo::UpdatesInfoData::parseCompatUpdateElement(const QDomElement & updateE)
+{
+ if( updateE.isNull() )
+ return false;
+
+ KDUpdater::UpdateInfo info;
+ info.type = KDUpdater::CompatUpdate;
+
+ QDomNodeList childNodes = updateE.childNodes();
+ for(int i=0; i<childNodes.count(); i++)
+ {
+ QDomNode childNode = childNodes.at(i);
+ QDomElement childE = childNode.toElement();
+ if( childE.isNull() )
+ continue;
+
+ if( childE.tagName() == QLatin1String( "ReleaseNotes" ) ) {
+ info.data[childE.tagName()] = QUrl(childE.text());
+ }
+ else if( childE.tagName() == QLatin1String( "UpdateFile" ) )
+ {
+ KDUpdater::UpdateFileInfo ufInfo;
+ ufInfo.arch = childE.attribute(QLatin1String( "Arch" ), QLatin1String( "i386" ));
+ ufInfo.os = childE.attribute(QLatin1String( "OS" ));
+ ufInfo.fileName = childE.text();
+ info.updateFiles.append(ufInfo);
+ }
+ else {
+ info.data[childE.tagName()] = childE.text();
+ }
+ }
+
+ if (!info.data.contains( QLatin1String( "CompatLevel" ) ))
+ {
+ setInvalidContentError(tr("CompatUpdate element without CompatLevel"));
+ return false;
+ }
+
+ if (!info.data.contains( QLatin1String( "ReleaseDate" ) ))
+ {
+ setInvalidContentError(tr("CompatUpdate element without ReleaseDate"));
+ return false;
+ }
+
+ if (info.updateFiles.isEmpty())
+ {
+ setInvalidContentError(tr("CompatUpdate element without UpdateFile"));
+ return false;
+ }
+
+ updateInfoList.append(info);
+ return true;
+}
+
+
+//
+// KDUpdater::UpdatesInfo
+//
+KDUpdater::UpdatesInfo::UpdatesInfo()
+ : d(new KDUpdater::UpdatesInfo::UpdatesInfoData)
+{
+}
+
+KDUpdater::UpdatesInfo::~UpdatesInfo()
+{
+}
+
+bool KDUpdater::UpdatesInfo::isValid() const
+{
+ return d->error == NoError;
+}
+
+QString KDUpdater::UpdatesInfo::errorString() const
+{
+ return d->errorMessage;
+}
+
+void KDUpdater::UpdatesInfo::setFileName(const QString& updateXmlFile)
+{
+ if( d->updateXmlFile == updateXmlFile )
+ return;
+
+ d->applicationName.clear();
+ d->applicationVersion.clear();
+ d->updateInfoList.clear();
+
+ d->updateXmlFile = updateXmlFile;
+ d->parseFile( d->updateXmlFile );
+}
+
+QString KDUpdater::UpdatesInfo::fileName() const
+{
+ return d->updateXmlFile;
+}
+
+QString KDUpdater::UpdatesInfo::applicationName() const
+{
+ return d->applicationName;
+}
+
+QString KDUpdater::UpdatesInfo::applicationVersion() const
+{
+ return d->applicationVersion;
+}
+
+int KDUpdater::UpdatesInfo::compatLevel() const
+{
+ return d->compatLevel;
+}
+
+int KDUpdater::UpdatesInfo::updateInfoCount( int type) const
+{
+ if ( type == KDUpdater::AllUpdate ) {
+ return d->updateInfoList.count();
+ }
+ int count = 0;
+ for ( int i=0; i<d->updateInfoList.count(); ++i ) {
+ if ( d->updateInfoList.at( i ).type == type )
+ ++count;
+ }
+ return count;
+}
+
+KDUpdater::UpdateInfo KDUpdater::UpdatesInfo::updateInfo(int index) const
+{
+ if(index < 0 || index >= d->updateInfoList.count())
+ return KDUpdater::UpdateInfo();
+
+ return d->updateInfoList.at( index );
+}
+
+QList<KDUpdater::UpdateInfo> KDUpdater::UpdatesInfo::updatesInfo( int type, int compatLevel ) const
+{
+ QList<KDUpdater::UpdateInfo> list;
+ if ( compatLevel == -1 ) {
+ if ( type == KDUpdater::AllUpdate ) {
+ return d->updateInfoList;
+ }
+ for ( int i=0; i<d->updateInfoList.count(); ++i ) {
+ if ( d->updateInfoList.at( i ).type == type )
+ list.append( d->updateInfoList.at( i ) );
+ }
+ }
+ else {
+ for ( int i=0; i<d->updateInfoList.count(); ++i ) {
+ UpdateInfo updateInfo = d->updateInfoList.at( i );
+ if ( updateInfo.type == type ) {
+ if ( updateInfo.type == CompatUpdate ) {
+ if ( updateInfo.data.value( QLatin1String( "CompatLevel" ) ) == compatLevel )
+ list.append( updateInfo );
+ }
+ else {
+ if ( updateInfo.data.value( QLatin1String( "RequiredCompatLevel" ) ) == compatLevel )
+ list.append( updateInfo );
+ }
+ }
+ }
+ }
+ return list;
+}