diff options
author | Andrew <forkk@forkk.net> | 2013-12-15 14:48:58 -0600 |
---|---|---|
committer | Andrew <forkk@forkk.net> | 2013-12-15 14:50:27 -0600 |
commit | 0ee8f90d40f5b3ddb177286c9066a4e59748c681 (patch) | |
tree | 43bdb631834ec7c1251a944b7b8b17f8a5db201c /logic/news/NewsChecker.cpp | |
parent | 1e96a0c8eba2d932e08a33ec909cf8141f1aaa43 (diff) | |
download | MultiMC-0ee8f90d40f5b3ddb177286c9066a4e59748c681.tar MultiMC-0ee8f90d40f5b3ddb177286c9066a4e59748c681.tar.gz MultiMC-0ee8f90d40f5b3ddb177286c9066a4e59748c681.tar.lz MultiMC-0ee8f90d40f5b3ddb177286c9066a4e59748c681.tar.xz MultiMC-0ee8f90d40f5b3ddb177286c9066a4e59748c681.zip |
Added a system to load news from MultiMC.org's RSS
Currently it doesn't show it anywhere in the UI. That's next.
Diffstat (limited to 'logic/news/NewsChecker.cpp')
-rw-r--r-- | logic/news/NewsChecker.cpp | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/logic/news/NewsChecker.cpp b/logic/news/NewsChecker.cpp new file mode 100644 index 00000000..08d4ef23 --- /dev/null +++ b/logic/news/NewsChecker.cpp @@ -0,0 +1,130 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "NewsChecker.h" + +#include <QByteArray> +#include <QDomDocument> + +#include <logger/QsLog.h> + +NewsChecker::NewsChecker(const QString& feedUrl) +{ + m_feedUrl = feedUrl; +} + +void NewsChecker::reloadNews() +{ + // Start a netjob to download the RSS feed and call rssDownloadFinished() when it's done. + if (isLoadingNews()) + { + QLOG_INFO() << "Ignored request to reload news. Currently reloading already."; + return; + } + + QLOG_INFO() << "Reloading news."; + + NetJob* job = new NetJob("News RSS Feed"); + job->addNetAction(ByteArrayDownload::make(m_feedUrl)); + QObject::connect(job, &NetJob::succeeded, this, &NewsChecker::rssDownloadFinished); + QObject::connect(job, &NetJob::failed, this, &NewsChecker::rssDownloadFailed); + m_newsNetJob.reset(job); + job->start(); +} + +void NewsChecker::rssDownloadFinished() +{ + // Parse the XML file and process the RSS feed entries. + QLOG_DEBUG() << "Finished loading RSS feed."; + + QByteArray data; + { + ByteArrayDownloadPtr dl = std::dynamic_pointer_cast<ByteArrayDownload>(m_newsNetJob->first()); + data = dl->m_data; + m_newsNetJob.reset(); + } + + QDomDocument doc; + { + // Stuff to store error info in. + QString errorMsg = "Unknown error."; + int errorLine = -1; + int errorCol = -1; + + // Parse the XML. + if (!doc.setContent(data, false, &errorMsg, &errorLine, &errorCol)) + { + QString fullErrorMsg = QString("Error parsing RSS feed XML. %s at %d:%d.").arg(errorMsg, errorLine, errorCol); + fail(fullErrorMsg); + return; + } + } + + // If the parsing succeeded, read it. + QDomNodeList items = doc.elementsByTagName("item"); + m_newsEntries.clear(); + for (int i = 0; i < items.length(); i++) + { + QDomElement element = items.at(i).toElement(); + NewsEntryPtr entry; + entry.reset(new NewsEntry()); + QString errorMsg = "An unknown error occurred."; + if (NewsEntry::fromXmlElement(element, entry.get(), &errorMsg)) + { + QLOG_DEBUG() << "Loaded news entry" << entry->title; + m_newsEntries.append(entry); + } + else + { + QLOG_WARN() << "Failed to load news entry at index" << i << ":" << errorMsg; + } + } + + succeed(); +} + +void NewsChecker::rssDownloadFailed() +{ + // Set an error message and fail. + fail("Failed to load news RSS feed."); +} + + +bool NewsChecker::isLoadingNews() const +{ + return m_newsNetJob.get() != nullptr; +} + +QString NewsChecker::getLastLoadErrorMsg() const +{ + return m_lastLoadError; +} + +void NewsChecker::succeed() +{ + m_lastLoadError = ""; + QLOG_DEBUG() << "News loading succeeded."; + m_newsNetJob.reset(); + emit newsLoaded(); +} + +void NewsChecker::fail(const QString& errorMsg) +{ + m_lastLoadError = errorMsg; + QLOG_DEBUG() << "Failed to load news:" << errorMsg; + m_newsNetJob.reset(); + emit newsLoadingFailed(errorMsg); +} + |