From ca30c35c2bc12f7c2a6acc02da3d38e5365f1453 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 7 Sep 2023 01:36:57 +0300 Subject: [PATCH] Added initial export writer for both html and json formats. --- .../export/output/export_output_abstract.h | 1 + .../output/export_output_html_and_json.cpp | 148 ++++++++++++++++++ .../output/export_output_html_and_json.h | 65 ++++++++ Telegram/cmake/td_export.cmake | 2 + 4 files changed, 216 insertions(+) create mode 100644 Telegram/SourceFiles/export/output/export_output_html_and_json.cpp create mode 100644 Telegram/SourceFiles/export/output/export_output_html_and_json.h diff --git a/Telegram/SourceFiles/export/output/export_output_abstract.h b/Telegram/SourceFiles/export/output/export_output_abstract.h index 7a2bb65ea..9ceef46eb 100644 --- a/Telegram/SourceFiles/export/output/export_output_abstract.h +++ b/Telegram/SourceFiles/export/output/export_output_abstract.h @@ -37,6 +37,7 @@ class Stats; enum class Format { Html, Json, + HtmlAndJson, }; class AbstractWriter { diff --git a/Telegram/SourceFiles/export/output/export_output_html_and_json.cpp b/Telegram/SourceFiles/export/output/export_output_html_and_json.cpp new file mode 100644 index 000000000..9220147ea --- /dev/null +++ b/Telegram/SourceFiles/export/output/export_output_html_and_json.cpp @@ -0,0 +1,148 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "export/output/export_output_html_and_json.h" + +#include "export/output/export_output_html.h" +#include "export/output/export_output_json.h" +#include "export/output/export_output_result.h" + +namespace Export::Output { + +HtmlAndJsonWriter::HtmlAndJsonWriter() { + _writers.push_back(CreateWriter(Format::Html)); + _writers.push_back(CreateWriter(Format::Json)); +} + +Format HtmlAndJsonWriter::format() { + return Format::HtmlAndJson; +} + +Result HtmlAndJsonWriter::start( + const Settings &settings, + const Environment &environment, + Stats *stats) { + return invoke([&](WriterPtr w) { + return w->start(settings, environment, stats); + }); +} + +Result HtmlAndJsonWriter::writePersonal(const Data::PersonalInfo &data) { + return invoke([&](WriterPtr w) { + return w->writePersonal(data); + }); +} + +Result HtmlAndJsonWriter::writeUserpicsStart(const Data::UserpicsInfo &data) { + return invoke([&](WriterPtr w) { + return w->writeUserpicsStart(data); + }); +} + +Result HtmlAndJsonWriter::writeUserpicsSlice(const Data::UserpicsSlice &d) { + return invoke([&](WriterPtr w) { + return w->writeUserpicsSlice(d); + }); +} + +Result HtmlAndJsonWriter::writeUserpicsEnd() { + return invoke([&](WriterPtr w) { + return w->writeUserpicsEnd(); + }); +} + +Result HtmlAndJsonWriter::writeStoriesStart(const Data::StoriesInfo &data) { + return invoke([&](WriterPtr w) { + return w->writeStoriesStart(data); + }); +} + +Result HtmlAndJsonWriter::writeStoriesSlice(const Data::StoriesSlice &data) { + return invoke([&](WriterPtr w) { + return w->writeStoriesSlice(data); + }); +} + +Result HtmlAndJsonWriter::writeStoriesEnd() { + return invoke([&](WriterPtr w) { + return w->writeStoriesEnd(); + }); +} + +Result HtmlAndJsonWriter::writeContactsList(const Data::ContactsList &data) { + return invoke([&](WriterPtr w) { + return w->writeContactsList(data); + }); +} + +Result HtmlAndJsonWriter::writeSessionsList(const Data::SessionsList &data) { + return invoke([&](WriterPtr w) { + return w->writeSessionsList(data); + }); +} + +Result HtmlAndJsonWriter::writeOtherData(const Data::File &data) { + return invoke([&](WriterPtr w) { + return w->writeOtherData(data); + }); +} + +Result HtmlAndJsonWriter::writeDialogsStart(const Data::DialogsInfo &data) { + return invoke([&](WriterPtr w) { + return w->writeDialogsStart(data); + }); +} + +Result HtmlAndJsonWriter::writeDialogStart(const Data::DialogInfo &data) { + return invoke([&](WriterPtr w) { + return w->writeDialogStart(data); + }); +} + +Result HtmlAndJsonWriter::writeDialogSlice(const Data::MessagesSlice &data) { + return invoke([&](WriterPtr w) { + return w->writeDialogSlice(data); + }); +} + +Result HtmlAndJsonWriter::writeDialogEnd() { + return invoke([&](WriterPtr w) { + return w->writeDialogEnd(); + }); +} + +Result HtmlAndJsonWriter::writeDialogsEnd() { + return invoke([&](WriterPtr w) { + return w->writeDialogsEnd(); + }); +} + +Result HtmlAndJsonWriter::finish() { + return invoke([&](WriterPtr w) { + return w->finish(); + }); +} + +QString HtmlAndJsonWriter::mainFilePath() { + return _writers.front()->mainFilePath(); +} + +HtmlAndJsonWriter::~HtmlAndJsonWriter() = default; + +Result HtmlAndJsonWriter::invoke(Fn method) const { + auto result = Result(Result::Type::Success, QString()); + for (const auto &writer : _writers) { + const auto current = method(writer); + if (!current) { + result = current; + } + } + return result; +} + +} // namespace Export::Output + diff --git a/Telegram/SourceFiles/export/output/export_output_html_and_json.h b/Telegram/SourceFiles/export/output/export_output_html_and_json.h new file mode 100644 index 000000000..2a40833a8 --- /dev/null +++ b/Telegram/SourceFiles/export/output/export_output_html_and_json.h @@ -0,0 +1,65 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +#include "export/output/export_output_abstract.h" + +namespace Export::Output { + +class HtmlWriter; +class JsonWriter; +struct Result; + +class HtmlAndJsonWriter final : public AbstractWriter { +public: + HtmlAndJsonWriter(); + + Format format() override; + + Result start( + const Settings &settings, + const Environment &environment, + Stats *stats) override; + + Result writePersonal(const Data::PersonalInfo &data) override; + + Result writeUserpicsStart(const Data::UserpicsInfo &data) override; + Result writeUserpicsSlice(const Data::UserpicsSlice &data) override; + Result writeUserpicsEnd() override; + + Result writeStoriesStart(const Data::StoriesInfo &data) override; + Result writeStoriesSlice(const Data::StoriesSlice &data) override; + Result writeStoriesEnd() override; + + Result writeContactsList(const Data::ContactsList &data) override; + + Result writeSessionsList(const Data::SessionsList &data) override; + + Result writeOtherData(const Data::File &data) override; + + Result writeDialogsStart(const Data::DialogsInfo &data) override; + Result writeDialogStart(const Data::DialogInfo &data) override; + Result writeDialogSlice(const Data::MessagesSlice &data) override; + Result writeDialogEnd() override; + Result writeDialogsEnd() override; + + Result finish() override; + + QString mainFilePath() override; + + ~HtmlAndJsonWriter(); + +private: + using WriterPtr = const std::unique_ptr &; + Result invoke(Fn method) const; + + std::vector> _writers; + +}; + +} // namespace Export::Output diff --git a/Telegram/cmake/td_export.cmake b/Telegram/cmake/td_export.cmake index 097926b9f..c187e6543 100644 --- a/Telegram/cmake/td_export.cmake +++ b/Telegram/cmake/td_export.cmake @@ -26,6 +26,8 @@ PRIVATE export/output/export_output_file.h export/output/export_output_html.cpp export/output/export_output_html.h + export/output/export_output_html_and_json.cpp + export/output/export_output_html_and_json.h export/output/export_output_json.cpp export/output/export_output_json.h export/output/export_output_result.h