/****************************************************************************** * Copyright (C) 2018 Kitsune Ral * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #pragma once #include "roomevent.h" namespace QMatrixClient { class StateEventBase: public RoomEvent { public: using factory_t = EventFactory; using RoomEvent::RoomEvent; ~StateEventBase() override = default; bool isStateEvent() const override { return true; } virtual bool repeatsState() const; }; using StateEventPtr = event_ptr_tt; using StateEvents = EventsArray; template struct Prev { template explicit Prev(const QJsonObject& unsignedJson, ContentParamTs&&... contentParams) : senderId(unsignedJson.value("prev_sender"_ls).toString()) , content(unsignedJson.value(PrevContentKeyL).toObject(), std::forward(contentParams)...) { } QString senderId; ContentT content; }; template class StateEvent: public StateEventBase { public: using content_type = ContentT; template explicit StateEvent(Type type, const QJsonObject& fullJson, ContentParamTs&&... contentParams) : StateEventBase(type, fullJson) , _content(contentJson(), std::forward(contentParams)...) { const auto& unsignedData = unsignedJson(); if (unsignedData.contains(PrevContentKeyL)) _prev = std::make_unique>(unsignedData, std::forward(contentParams)...); } template explicit StateEvent(Type type, event_mtype_t matrixType, ContentParamTs&&... contentParams) : StateEventBase(type, matrixType) , _content(std::forward(contentParams)...) { editJson().insert(ContentKey, _content.toJson()); } const ContentT& content() const { return _content; } [[deprecated("Use prevContent instead")]] const ContentT* prev_content() const { return prevContent(); } const ContentT* prevContent() const { return _prev ? &_prev->content : nullptr; } QString prevSenderId() const { return _prev ? _prev->senderId : QString(); } protected: ContentT _content; std::unique_ptr> _prev; }; } // namespace QMatrixClient