matrixion/src/Sync.cc

193 lines
6.6 KiB
C++
Raw Normal View History

2017-04-06 02:06:42 +03:00
/*
* nheko Copyright (C) 2017 Konstantinos Sideris <siderisk@auth.gr>
*
* 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 <QDebug>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include "Deserializable.h"
#include "Sync.h"
2017-08-20 13:47:22 +03:00
void
SyncResponse::deserialize(const QJsonDocument &data)
2017-04-06 02:06:42 +03:00
{
2017-09-10 12:59:21 +03:00
if (!data.isObject())
throw DeserializationException("Sync response is not a JSON object");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
QJsonObject object = data.object();
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (object.value("next_batch") == QJsonValue::Undefined)
throw DeserializationException("Sync: missing next_batch parameter");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (object.value("rooms") == QJsonValue::Undefined)
throw DeserializationException("Sync: missing rooms parameter");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
rooms_.deserialize(object.value("rooms"));
next_batch_ = object.value("next_batch").toString();
2017-04-06 02:06:42 +03:00
}
2017-08-20 13:47:22 +03:00
void
Rooms::deserialize(const QJsonValue &data)
2017-04-06 02:06:42 +03:00
{
2017-09-10 12:59:21 +03:00
if (!data.isObject())
throw DeserializationException("Rooms value is not a JSON object");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
QJsonObject object = data.toObject();
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.contains("join"))
throw DeserializationException("rooms/join is missing");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.contains("invite"))
throw DeserializationException("rooms/invite is missing");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.contains("leave"))
throw DeserializationException("rooms/leave is missing");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.value("join").isObject())
throw DeserializationException("rooms/join must be a JSON object");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.value("invite").isObject())
throw DeserializationException("rooms/invite must be a JSON object");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.value("leave").isObject())
throw DeserializationException("rooms/leave must be a JSON object");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
auto join = object.value("join").toObject();
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
for (auto it = join.constBegin(); it != join.constEnd(); it++) {
JoinedRoom tmp_room;
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
try {
tmp_room.deserialize(it.value());
join_.insert(it.key(), tmp_room);
} catch (DeserializationException &e) {
qWarning() << e.what();
qWarning() << "Skipping malformed object for room" << it.key();
}
}
2017-04-06 02:06:42 +03:00
}
2017-08-20 13:47:22 +03:00
void
JoinedRoom::deserialize(const QJsonValue &data)
2017-04-06 02:06:42 +03:00
{
2017-09-10 12:59:21 +03:00
if (!data.isObject())
throw DeserializationException("JoinedRoom is not a JSON object");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
QJsonObject object = data.toObject();
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.contains("state"))
throw DeserializationException("join/state is missing");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.contains("timeline"))
throw DeserializationException("join/timeline is missing");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.contains("account_data"))
throw DeserializationException("join/account_data is missing");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.contains("unread_notifications"))
throw DeserializationException("join/unread_notifications is missing");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.value("state").isObject())
throw DeserializationException("join/state should be an object");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
QJsonObject state = object.value("state").toObject();
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!state.contains("events"))
throw DeserializationException("join/state/events is missing");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
state_.deserialize(state.value("events"));
timeline_.deserialize(object.value("timeline"));
2017-04-06 02:06:42 +03:00
}
2017-08-20 13:47:22 +03:00
void
Event::deserialize(const QJsonValue &data)
2017-04-06 02:06:42 +03:00
{
2017-09-10 12:59:21 +03:00
if (!data.isObject())
throw DeserializationException("Event is not a JSON object");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
QJsonObject object = data.toObject();
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.contains("content"))
throw DeserializationException("event/content is missing");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.contains("unsigned"))
throw DeserializationException("event/content is missing");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.contains("sender"))
throw DeserializationException("event/sender is missing");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.contains("event_id"))
throw DeserializationException("event/event_id is missing");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
// TODO: Make this optional
/* if (!object.contains("state_key")) */
/* throw DeserializationException("event/state_key is missing"); */
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.contains("type"))
throw DeserializationException("event/type is missing");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.contains("origin_server_ts"))
throw DeserializationException("event/origin_server_ts is missing");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
content_ = object.value("content").toObject();
unsigned_ = object.value("unsigned").toObject();
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
sender_ = object.value("sender").toString();
state_key_ = object.value("state_key").toString();
type_ = object.value("type").toString();
event_id_ = object.value("event_id").toString();
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
origin_server_ts_ = object.value("origin_server_ts").toDouble();
2017-04-06 02:06:42 +03:00
}
2017-08-20 13:47:22 +03:00
void
State::deserialize(const QJsonValue &data)
2017-04-06 02:06:42 +03:00
{
2017-09-10 12:59:21 +03:00
if (!data.isArray())
throw DeserializationException("State is not a JSON array");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
events_ = data.toArray();
2017-04-06 02:06:42 +03:00
}
2017-08-20 13:47:22 +03:00
void
Timeline::deserialize(const QJsonValue &data)
2017-04-06 02:06:42 +03:00
{
2017-09-10 12:59:21 +03:00
if (!data.isObject())
throw DeserializationException("Timeline is not a JSON object");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
auto object = data.toObject();
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.contains("events"))
throw DeserializationException("timeline/events is missing");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.contains("prev_batch"))
throw DeserializationException("timeline/prev_batch is missing");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.contains("limited"))
throw DeserializationException("timeline/limited is missing");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
prev_batch_ = object.value("prev_batch").toString();
limited_ = object.value("limited").toBool();
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
if (!object.value("events").isArray())
throw DeserializationException("timeline/events is not a JSON array");
2017-04-06 02:06:42 +03:00
2017-09-10 12:59:21 +03:00
events_ = object.value("events").toArray();
2017-04-06 02:06:42 +03:00
}