2014-11-02 19:08:26 +00:00
|
|
|
/* Copyright 2013-2014 MultiMC Contributors
|
2014-01-12 18:28:42 +00:00
|
|
|
*
|
|
|
|
* 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 "StatusChecker.h"
|
|
|
|
|
|
|
|
#include <logic/net/URLConstants.h>
|
|
|
|
|
|
|
|
#include <QByteArray>
|
|
|
|
#include <QDomDocument>
|
|
|
|
|
|
|
|
#include <logger/QsLog.h>
|
|
|
|
|
|
|
|
StatusChecker::StatusChecker()
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2014-05-17 15:23:48 +01:00
|
|
|
void StatusChecker::timerEvent(QTimerEvent *e)
|
|
|
|
{
|
|
|
|
QObject::timerEvent(e);
|
|
|
|
reloadStatus();
|
|
|
|
}
|
|
|
|
|
2014-01-12 18:28:42 +00:00
|
|
|
void StatusChecker::reloadStatus()
|
|
|
|
{
|
|
|
|
if (isLoadingStatus())
|
|
|
|
{
|
2014-01-16 22:06:07 +00:00
|
|
|
// QLOG_INFO() << "Ignored request to reload status. Currently reloading already.";
|
2014-01-12 18:28:42 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-01-16 22:06:07 +00:00
|
|
|
// QLOG_INFO() << "Reloading status.";
|
2014-01-12 18:28:42 +00:00
|
|
|
|
|
|
|
NetJob* job = new NetJob("Status JSON");
|
|
|
|
job->addNetAction(ByteArrayDownload::make(URLConstants::MOJANG_STATUS_URL));
|
|
|
|
QObject::connect(job, &NetJob::succeeded, this, &StatusChecker::statusDownloadFinished);
|
|
|
|
QObject::connect(job, &NetJob::failed, this, &StatusChecker::statusDownloadFailed);
|
|
|
|
m_statusNetJob.reset(job);
|
2014-05-17 15:23:48 +01:00
|
|
|
emit statusLoading(true);
|
2014-01-12 18:28:42 +00:00
|
|
|
job->start();
|
|
|
|
}
|
|
|
|
|
|
|
|
void StatusChecker::statusDownloadFinished()
|
|
|
|
{
|
|
|
|
QLOG_DEBUG() << "Finished loading status JSON.";
|
2014-05-17 15:23:48 +01:00
|
|
|
m_statusEntries.clear();
|
2014-01-12 18:28:42 +00:00
|
|
|
QByteArray data;
|
|
|
|
{
|
|
|
|
ByteArrayDownloadPtr dl = std::dynamic_pointer_cast<ByteArrayDownload>(m_statusNetJob->first());
|
|
|
|
data = dl->m_data;
|
|
|
|
m_statusNetJob.reset();
|
|
|
|
}
|
|
|
|
|
|
|
|
QJsonParseError jsonError;
|
|
|
|
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError);
|
|
|
|
|
|
|
|
if (jsonError.error != QJsonParseError::NoError)
|
|
|
|
{
|
|
|
|
fail("Error parsing status JSON:" + jsonError.errorString());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!jsonDoc.isArray())
|
|
|
|
{
|
|
|
|
fail("Error parsing status JSON: JSON root is not an array");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
QJsonArray root = jsonDoc.array();
|
|
|
|
|
|
|
|
for(auto status = root.begin(); status != root.end(); ++status)
|
|
|
|
{
|
|
|
|
QVariantMap map = (*status).toObject().toVariantMap();
|
|
|
|
|
|
|
|
for (QVariantMap::const_iterator iter = map.begin(); iter != map.end(); ++iter)
|
|
|
|
{
|
|
|
|
QString key = iter.key();
|
|
|
|
QVariant value = iter.value();
|
|
|
|
|
|
|
|
if(value.type() == QVariant::Type::String)
|
|
|
|
{
|
|
|
|
m_statusEntries.insert(key, value.toString());
|
2014-01-16 22:06:07 +00:00
|
|
|
//QLOG_DEBUG() << "Status JSON object: " << key << m_statusEntries[key];
|
2014-01-12 18:28:42 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
fail("Malformed status JSON: expected status type to be a string.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
succeed();
|
|
|
|
}
|
|
|
|
|
|
|
|
void StatusChecker::statusDownloadFailed()
|
|
|
|
{
|
|
|
|
fail("Failed to load status JSON.");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QMap<QString, QString> StatusChecker::getStatusEntries() const
|
|
|
|
{
|
|
|
|
return m_statusEntries;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool StatusChecker::isLoadingStatus() const
|
|
|
|
{
|
|
|
|
return m_statusNetJob.get() != nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString StatusChecker::getLastLoadErrorMsg() const
|
|
|
|
{
|
|
|
|
return m_lastLoadError;
|
|
|
|
}
|
|
|
|
|
|
|
|
void StatusChecker::succeed()
|
|
|
|
{
|
2014-05-17 15:23:48 +01:00
|
|
|
if(m_prevEntries != m_statusEntries)
|
|
|
|
{
|
|
|
|
emit statusChanged(m_statusEntries);
|
|
|
|
m_prevEntries = m_statusEntries;
|
|
|
|
}
|
2014-01-12 18:28:42 +00:00
|
|
|
m_lastLoadError = "";
|
|
|
|
QLOG_DEBUG() << "Status loading succeeded.";
|
|
|
|
m_statusNetJob.reset();
|
2014-05-17 15:23:48 +01:00
|
|
|
emit statusLoading(false);
|
2014-01-12 18:28:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void StatusChecker::fail(const QString& errorMsg)
|
|
|
|
{
|
2014-05-17 15:23:48 +01:00
|
|
|
if(m_prevEntries != m_statusEntries)
|
|
|
|
{
|
|
|
|
emit statusChanged(m_statusEntries);
|
|
|
|
m_prevEntries = m_statusEntries;
|
|
|
|
}
|
2014-01-12 18:28:42 +00:00
|
|
|
m_lastLoadError = errorMsg;
|
|
|
|
QLOG_DEBUG() << "Failed to load status:" << errorMsg;
|
|
|
|
m_statusNetJob.reset();
|
2014-05-17 15:23:48 +01:00
|
|
|
emit statusLoading(false);
|
2014-01-12 18:28:42 +00:00
|
|
|
}
|
|
|
|
|