From 1476be76c8ea91dbe3e033a29acf954d98ab9aa6 Mon Sep 17 00:00:00 2001 From: Nicolas Werner <nicolas.werner@hotmail.de> Date: Sun, 22 Dec 2019 16:33:08 +0100 Subject: [PATCH] move to_json of TimelineEvents from header to cpp --- CMakeLists.txt | 1 + include/mtx/events/collections.hpp | 149 +--------------------------- lib/structs/events/collections.cpp | 152 +++++++++++++++++++++++++++++ 3 files changed, 155 insertions(+), 147 deletions(-) create mode 100644 lib/structs/events/collections.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 759f9d9d6..32c21ea22 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -110,6 +110,7 @@ add_library(matrix_client lib/structs/events/avatar.cpp lib/structs/events/canonical_alias.cpp lib/structs/events/common.cpp + lib/structs/events/collections.cpp lib/structs/events/create.cpp lib/structs/events/encrypted.cpp lib/structs/events/encryption.cpp diff --git a/include/mtx/events/collections.hpp b/include/mtx/events/collections.hpp index a5bf3eae4..61b9d3e47 100644 --- a/include/mtx/events/collections.hpp +++ b/include/mtx/events/collections.hpp @@ -108,154 +108,9 @@ struct TimelineEvent TimelineEvents data; }; -inline void -from_json(const json &obj, TimelineEvent &e) -{ - const auto type = mtx::events::getEventType(obj); - using namespace mtx::events::state; - using namespace mtx::events::msg; - - switch (type) { - case events::EventType::RoomAliases: { - e.data = events::StateEvent<Aliases>(obj); - break; - } - case events::EventType::RoomAvatar: { - e.data = events::StateEvent<Avatar>(obj); - break; - } - case events::EventType::RoomCanonicalAlias: { - e.data = events::StateEvent<CanonicalAlias>(obj); - break; - } - case events::EventType::RoomCreate: { - e.data = events::StateEvent<Create>(obj); - break; - } - case events::EventType::RoomEncrypted: { - e.data = events::EncryptedEvent<mtx::events::msg::Encrypted>(obj); - break; - } - case events::EventType::RoomEncryption: { - e.data = events::StateEvent<Encryption>(obj); - break; - } - case events::EventType::RoomGuestAccess: { - e.data = events::StateEvent<GuestAccess>(obj); - break; - } - case events::EventType::RoomHistoryVisibility: { - e.data = events::StateEvent<HistoryVisibility>(obj); - break; - } - case events::EventType::RoomJoinRules: { - e.data = events::StateEvent<JoinRules>(obj); - break; - } - case events::EventType::RoomMember: { - e.data = events::StateEvent<Member>(obj); - break; - } - case events::EventType::RoomName: { - e.data = events::StateEvent<Name>(obj); - break; - } - case events::EventType::RoomPowerLevels: { - e.data = events::StateEvent<PowerLevels>(obj); - break; - } - case events::EventType::RoomRedaction: { - e.data = events::RedactionEvent<mtx::events::msg::Redaction>(obj); - break; - } - case events::EventType::RoomTombstone: { - e.data = events::StateEvent<Tombstone>(obj); - break; - } - case events::EventType::RoomTopic: { - e.data = events::StateEvent<Topic>(obj); - break; - } - case events::EventType::RoomMessage: { - using MsgType = mtx::events::MessageType; - const auto msg_type = mtx::events::getMessageType(obj.at("content")); - - if (msg_type == events::MessageType::Unknown) { - try { - auto unsigned_data = - obj.at("unsigned").at("redacted_by").get<std::string>(); - - if (unsigned_data.empty()) - return; - - e.data = events::RoomEvent<events::msg::Redacted>(obj); - return; - } catch (json::exception &err) { - std::cout << "Invalid event type: " << err.what() << " " - << obj.dump(2) << '\n'; - return; - } - - std::cout << "Invalid event type: " << obj.dump(2) << '\n'; - break; - } +void +from_json(const json &obj, TimelineEvent &e); - switch (msg_type) { - case MsgType::Audio: { - e.data = events::RoomEvent<events::msg::Audio>(obj); - break; - } - case MsgType::Emote: { - e.data = events::RoomEvent<events::msg::Emote>(obj); - break; - } - case MsgType::File: { - e.data = events::RoomEvent<events::msg::File>(obj); - break; - } - case MsgType::Image: { - e.data = events::RoomEvent<events::msg::Image>(obj); - break; - } - case MsgType::Location: { - /* events::RoomEvent<events::msg::Location> location = e; */ - /* container.emplace_back(location); */ - break; - } - case MsgType::Notice: { - e.data = events::RoomEvent<events::msg::Notice>(obj); - break; - } - case MsgType::Text: { - e.data = events::RoomEvent<events::msg::Text>(obj); - break; - } - case MsgType::Video: { - e.data = events::RoomEvent<events::msg::Video>(obj); - break; - } - case MsgType::Unknown: - return; - } - break; - } - case events::EventType::Sticker: { - e.data = events::Sticker(obj); - break; - } - case events::EventType::RoomPinnedEvents: - case events::EventType::RoomKeyRequest: // Not part of the timeline - case events::EventType::Tag: // Not part of the timeline - case events::EventType::KeyVerificationCancel: - case events::EventType::KeyVerificationRequest: - case events::EventType::KeyVerificationStart: - case events::EventType::KeyVerificationAccept: - case events::EventType::KeyVerificationKey: - case events::EventType::KeyVerificationMac: - case events::EventType::Unsupported: - return; - } -} } // namespace collections } // namespace events } // namespace mtx diff --git a/lib/structs/events/collections.cpp b/lib/structs/events/collections.cpp new file mode 100644 index 000000000..55b88556b --- /dev/null +++ b/lib/structs/events/collections.cpp @@ -0,0 +1,152 @@ +#include "mtx/events/collections.hpp" + +namespace mtx::events::collections { +void +from_json(const json &obj, TimelineEvent &e) +{ + const auto type = mtx::events::getEventType(obj); + using namespace mtx::events::state; + using namespace mtx::events::msg; + + switch (type) { + case events::EventType::RoomAliases: { + e.data = events::StateEvent<Aliases>(obj); + break; + } + case events::EventType::RoomAvatar: { + e.data = events::StateEvent<Avatar>(obj); + break; + } + case events::EventType::RoomCanonicalAlias: { + e.data = events::StateEvent<CanonicalAlias>(obj); + break; + } + case events::EventType::RoomCreate: { + e.data = events::StateEvent<Create>(obj); + break; + } + case events::EventType::RoomEncrypted: { + e.data = events::EncryptedEvent<mtx::events::msg::Encrypted>(obj); + break; + } + case events::EventType::RoomEncryption: { + e.data = events::StateEvent<Encryption>(obj); + break; + } + case events::EventType::RoomGuestAccess: { + e.data = events::StateEvent<GuestAccess>(obj); + break; + } + case events::EventType::RoomHistoryVisibility: { + e.data = events::StateEvent<HistoryVisibility>(obj); + break; + } + case events::EventType::RoomJoinRules: { + e.data = events::StateEvent<JoinRules>(obj); + break; + } + case events::EventType::RoomMember: { + e.data = events::StateEvent<Member>(obj); + break; + } + case events::EventType::RoomName: { + e.data = events::StateEvent<Name>(obj); + break; + } + case events::EventType::RoomPowerLevels: { + e.data = events::StateEvent<PowerLevels>(obj); + break; + } + case events::EventType::RoomRedaction: { + e.data = events::RedactionEvent<mtx::events::msg::Redaction>(obj); + break; + } + case events::EventType::RoomTombstone: { + e.data = events::StateEvent<Tombstone>(obj); + break; + } + case events::EventType::RoomTopic: { + e.data = events::StateEvent<Topic>(obj); + break; + } + case events::EventType::RoomMessage: { + using MsgType = mtx::events::MessageType; + const auto msg_type = mtx::events::getMessageType(obj.at("content")); + + if (msg_type == events::MessageType::Unknown) { + try { + auto unsigned_data = + obj.at("unsigned").at("redacted_by").get<std::string>(); + + if (unsigned_data.empty()) + return; + + e.data = events::RoomEvent<events::msg::Redacted>(obj); + return; + } catch (json::exception &err) { + std::cout << "Invalid event type: " << err.what() << " " + << obj.dump(2) << '\n'; + return; + } + + std::cout << "Invalid event type: " << obj.dump(2) << '\n'; + break; + } + + switch (msg_type) { + case MsgType::Audio: { + e.data = events::RoomEvent<events::msg::Audio>(obj); + break; + } + case MsgType::Emote: { + e.data = events::RoomEvent<events::msg::Emote>(obj); + break; + } + case MsgType::File: { + e.data = events::RoomEvent<events::msg::File>(obj); + break; + } + case MsgType::Image: { + e.data = events::RoomEvent<events::msg::Image>(obj); + break; + } + case MsgType::Location: { + /* events::RoomEvent<events::msg::Location> location = e; */ + /* container.emplace_back(location); */ + break; + } + case MsgType::Notice: { + e.data = events::RoomEvent<events::msg::Notice>(obj); + break; + } + case MsgType::Text: { + e.data = events::RoomEvent<events::msg::Text>(obj); + break; + } + case MsgType::Video: { + e.data = events::RoomEvent<events::msg::Video>(obj); + break; + } + case MsgType::Unknown: + return; + } + break; + } + case events::EventType::Sticker: { + e.data = events::Sticker(obj); + break; + } + case events::EventType::RoomPinnedEvents: + case events::EventType::RoomKeyRequest: // Not part of the timeline + case events::EventType::Tag: // Not part of the timeline + case events::EventType::KeyVerificationCancel: + case events::EventType::KeyVerificationRequest: + case events::EventType::KeyVerificationStart: + case events::EventType::KeyVerificationAccept: + case events::EventType::KeyVerificationKey: + case events::EventType::KeyVerificationMac: + case events::EventType::Unsupported: + return; + } +} +} -- GitLab