You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
3.6 KiB
142 lines
3.6 KiB
/*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "frameworks/UBVersion.h"
|
|
|
|
#include "UBRssHandler.h"
|
|
#include "UBSoftwareUpdate.h"
|
|
|
|
#include "core/memcheck.h"
|
|
|
|
const QString UBRssHandler::sRssItemElementName = "item";
|
|
const QString UBRssHandler::sRssLinkElementName = "link";
|
|
const QString UBRssHandler::sUniboardVersionElementName = "ub:version"; // TODO UB 4.x map properly ub namespace
|
|
|
|
UBRssHandler::UBRssHandler()
|
|
: mRssTagParsed(false)
|
|
, mInItem(false)
|
|
, mInVersion(false)
|
|
{
|
|
// NOOP
|
|
}
|
|
|
|
UBRssHandler::~UBRssHandler(void)
|
|
{
|
|
while (!mSoftwareUpdates.isEmpty())
|
|
{
|
|
delete mSoftwareUpdates.takeFirst();
|
|
}
|
|
}
|
|
|
|
bool UBRssHandler::startElement(
|
|
const QString & /* namespaceURI */,
|
|
const QString & /* localName */,
|
|
const QString &qualifiedName,
|
|
const QXmlAttributes &attributes)
|
|
{
|
|
bool ok = true;
|
|
if (!mRssTagParsed && qualifiedName != "rss")
|
|
{
|
|
mError = "This file is not a RSS source.";
|
|
ok = false;
|
|
}
|
|
else if (qualifiedName == "rss")
|
|
{
|
|
QString version = attributes.value("version");
|
|
if (!version.isEmpty() && version != "2.0")
|
|
{
|
|
mError = "Can only handle RSS 2.0.";
|
|
ok = false;
|
|
}
|
|
else
|
|
{
|
|
mRssTagParsed = true;
|
|
}
|
|
}
|
|
else if (qualifiedName == sRssItemElementName)
|
|
{
|
|
mInItem = true;
|
|
}
|
|
else if (qualifiedName == sUniboardVersionElementName)
|
|
{
|
|
mInVersion = true;
|
|
}
|
|
mCurrentText = "";
|
|
return ok;
|
|
}
|
|
|
|
bool UBRssHandler::characters(const QString &str)
|
|
{
|
|
mCurrentText += str;
|
|
return true;
|
|
}
|
|
|
|
bool UBRssHandler::endElement(
|
|
const QString & /* namespaceURI */,
|
|
const QString & /* localName */,
|
|
const QString &qualifiedName)
|
|
{
|
|
bool ok = true;
|
|
if (qualifiedName == sRssItemElementName)
|
|
{
|
|
mInItem = false;
|
|
if (mVersion.isValid() && !mDownloadUrl.isEmpty())
|
|
{
|
|
UBSoftwareUpdate *softwareUpdate = new UBSoftwareUpdate(mVersion, mDownloadUrl);
|
|
mSoftwareUpdates.append(softwareUpdate);
|
|
}
|
|
mVersion = UBVersion();
|
|
mDownloadUrl = "";
|
|
}
|
|
else if (qualifiedName == sRssLinkElementName)
|
|
{
|
|
if (mInItem)
|
|
{
|
|
QUrl url(mCurrentText);
|
|
if (url.isValid())
|
|
mDownloadUrl = mCurrentText;
|
|
else
|
|
ok = false;
|
|
}
|
|
}
|
|
else if (qualifiedName == sUniboardVersionElementName)
|
|
{
|
|
if (mInItem)
|
|
{
|
|
mVersion.setString(mCurrentText);
|
|
ok = mVersion.isValid();
|
|
mInVersion = false;
|
|
}
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
bool UBRssHandler::fatalError(const QXmlParseException &exception)
|
|
{
|
|
qWarning() << "Fatal error at line " << exception.lineNumber()
|
|
<< ", column " << exception.columnNumber() << ": "
|
|
<< exception.message() << mError;
|
|
return false;
|
|
}
|
|
|
|
QString UBRssHandler::error() const
|
|
{
|
|
return mError;
|
|
}
|
|
|
|
QList<UBSoftwareUpdate *> UBRssHandler::softwareUpdates() const
|
|
{
|
|
return mSoftwareUpdates;
|
|
}
|
|
|