From f02b2ee4b60e02c37fbe58002b9747bb28f25ca2 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 5 Jul 2021 05:25:23 +0300 Subject: [PATCH] Move SecretChatEvent details to the corresponding header. --- td/telegram/logevent/LogEvent.h | 60 +------------------------- td/telegram/logevent/SecretChatEvent.h | 54 ++++++++++++++++++++++- 2 files changed, 54 insertions(+), 60 deletions(-) diff --git a/td/telegram/logevent/LogEvent.h b/td/telegram/logevent/LogEvent.h index 980571b4f..62dc4a666 100644 --- a/td/telegram/logevent/LogEvent.h +++ b/td/telegram/logevent/LogEvent.h @@ -125,69 +125,11 @@ class LogEvent { private: Id log_event_id_{}; }; + inline StringBuilder &operator<<(StringBuilder &sb, const LogEvent &log_event) { return log_event.print(sb); } -namespace detail { - -template -int32 magic(EventT &event) { - return static_cast(event.get_type()); -} - -template -Result> from_parser(T &&parser) { - auto version = parser.fetch_int(); - parser.set_version(version); - parser.set_context(G()); - auto magic = static_cast(parser.fetch_int()); - - unique_ptr event; - DestT::downcast_call(magic, [&](auto *ptr) { - auto tmp = make_unique>(); - tmp->parse(parser); - event = std::move(tmp); - }); - parser.fetch_end(); - TRY_STATUS(parser.get_status()); - if (event) { - return std::move(event); - } - return Status::Error(PSLICE() << "Unknown SecretChatEvent type: " << format::as_hex(magic)); -} - -template -class StorerImpl final : public Storer { - public: - explicit StorerImpl(const T &event) : event_(event) { - } - - size_t size() const final { - WithContext storer; - storer.set_context(G()); - - storer.store_int(T::version()); - td::store(magic(event_), storer); - td::store(event_, storer); - return storer.get_length(); - } - size_t store(uint8 *ptr) const final { - WithContext storer(ptr); - storer.set_context(G()); - - storer.store_int(T::version()); - td::store(magic(event_), storer); - td::store(event_, storer); - return static_cast(storer.get_buf() - ptr); - } - - private: - const T &event_; -}; - -} // namespace detail - class LogEventParser final : public WithVersion> { public: explicit LogEventParser(Slice data) : WithVersion>(data) { diff --git a/td/telegram/logevent/SecretChatEvent.h b/td/telegram/logevent/SecretChatEvent.h index dfb0ed300..4e6106168 100644 --- a/td/telegram/logevent/SecretChatEvent.h +++ b/td/telegram/logevent/SecretChatEvent.h @@ -17,15 +17,50 @@ #include "td/utils/buffer.h" #include "td/utils/common.h" #include "td/utils/format.h" +#include "td/utils/Status.h" #include "td/utils/StringBuilder.h" #include "td/utils/tl_helpers.h" #include "td/utils/tl_parsers.h" +#include "td/utils/tl_storers.h" #include namespace td { namespace log_event { +namespace detail { + +template +class StorerImpl final : public Storer { + public: + explicit StorerImpl(const T &event) : event_(event) { + } + + size_t size() const final { + WithContext storer; + storer.set_context(G()); + + storer.store_int(T::version()); + td::store(static_cast(event_.get_type()), storer); + td::store(event_, storer); + return storer.get_length(); + } + size_t store(uint8 *ptr) const final { + WithContext storer(ptr); + storer.set_context(G()); + + storer.store_int(T::version()); + td::store(static_cast(event_.get_type()), storer); + td::store(event_, storer); + return static_cast(storer.get_buf() - ptr); + } + + private: + const T &event_; +}; + +} // namespace detail + class SecretChatEvent : public LogEvent { public: // append only enum @@ -52,7 +87,24 @@ class SecretChatEvent : public LogEvent { } static Result> from_buffer_slice(BufferSlice slice) { - return detail::from_parser(WithVersion>{&slice}); + WithVersion> parser{&slice}; + auto version = parser.fetch_int(); + parser.set_version(version); + parser.set_context(G()); + auto magic = static_cast(parser.fetch_int()); + + unique_ptr event; + downcast_call(magic, [&](auto *ptr) { + auto tmp = make_unique>(); + tmp->parse(parser); + event = std::move(tmp); + }); + parser.fetch_end(); + TRY_STATUS(parser.get_status()); + if (event != nullptr) { + return std::move(event); + } + return Status::Error(PSLICE() << "Unknown SecretChatEvent type: " << format::as_hex(magic)); } };