From 477a7257e3aaec13dac7096ab91749399543502e Mon Sep 17 00:00:00 2001 From: ConfuSomu Date: Mon, 26 Dec 2022 17:41:45 -0500 Subject: Implement initial archive parsing --- src/archive_parser.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/archive_parser.h | 33 +++++++++++++++++++++++++++++++++ src/mainwindow.cpp | 26 ++++++++++++++++++++++++++ src/mainwindow.h | 4 ++++ 4 files changed, 109 insertions(+) create mode 100644 src/archive_parser.cpp create mode 100644 src/archive_parser.h (limited to 'src') diff --git a/src/archive_parser.cpp b/src/archive_parser.cpp new file mode 100644 index 0000000..09b8cef --- /dev/null +++ b/src/archive_parser.cpp @@ -0,0 +1,46 @@ +#include "archive_parser.h" + +#include +#include +#include + +Archive::Archive(QString outbox_filename, ArchiveType archive_type) : + outbox_filename(outbox_filename), archive_type(archive_type) {} + +Archive::InitError Archive::init() { + QFile outbox_file(outbox_filename); + + if (!outbox_file.open(QIODevice::ReadOnly | QIODevice::Text)) + return FailedOpeningFile; + + QJsonParseError json_error; + QJsonDocument outbox_json_document = QJsonDocument::fromJson(outbox_file.readAll(), &json_error); + outbox_file.close(); + + if (json_error.error != QJsonParseError::NoError) + return JsonParseError; + if (outbox_json_document.isEmpty()) + return JsonEmpty; + if (outbox_json_document.isNull()) + return JsonNull; + + if (outbox_json_document.isObject()) + outbox_json = new QJsonObject (outbox_json_document.object()); + else + return JsonNotObject; + + // Do some more throughful checks to make sure that the JSON is actually valid. + if (not (outbox_json->contains("@context") and outbox_json->value("@context").isString() and + (outbox_json->value("@context").toString() == "https://www.w3.org/ns/activitystreams"))) + return JsonNotActivityStream; + if (outbox_json->contains("orderedItems") and outbox_json->value("orderedItems").isArray()) { + outbox_items = new QJsonArray(outbox_json->value("orderedItems").toArray()); // we'll need it during Archive's lifetime + } + + return NoError; +} + +Archive::~Archive() { + delete outbox_json; outbox_json = nullptr; + delete outbox_items; outbox_items = nullptr; +} diff --git a/src/archive_parser.h b/src/archive_parser.h new file mode 100644 index 0000000..ac9a7f0 --- /dev/null +++ b/src/archive_parser.h @@ -0,0 +1,33 @@ +#pragma once + +#include +#include +#include +#include + +enum ArchiveType { + MASTODON +}; + +class Archive { +public: + enum InitError { + NoError = 0, + FailedOpeningFile, + JsonParseError, + JsonEmpty, + JsonNull, + JsonNotObject, + JsonNotActivityStream // for ActivityPub archives + }; + + Archive(QString outbox_filename, ArchiveType archive_type); + ~Archive(); + InitError init(); +private: + QString outbox_filename; + ArchiveType archive_type; + + QJsonObject *outbox_json = nullptr; + QJsonArray *outbox_items = nullptr; +}; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 58ea9d9..8f4ebfe 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1,5 +1,6 @@ #include "mainwindow.h" #include "./ui_mainwindow.h" +#include "src/archive_parser.h" #include #include @@ -25,6 +26,31 @@ void MainWindow::on_actionOpen_triggered(bool checked) { outbox_filename = files[0]; ui->statusInfoText->setText(outbox_filename); } + + if (data_archive) { + delete data_archive; + data_archive = nullptr; + } + + // TODO: Do this in another thread + QApplication::setOverrideCursor(Qt::WaitCursor); + data_archive = new Archive(outbox_filename, ArchiveType::MASTODON); + auto parse_error = data_archive->init(); + QApplication::restoreOverrideCursor(); + + switch (parse_error) { + case Archive::FailedOpeningFile: + QMessageBox::warning(this, tr("Archive Parser"), tr("Failed opening file.")); break; + case Archive::JsonParseError: + QMessageBox::warning(this, tr("Archive Parser"), tr("Failed parsing outbox JSON.")); break; + case Archive::JsonEmpty: + case Archive::JsonNull: + case Archive::JsonNotObject: + case Archive::JsonNotActivityStream: + QMessageBox::warning(this, tr("Archive Parser"), tr("The outbox JSON is empty or invalid in another way. Not an outbox.json?")); break; + case Archive::NoError: + break; + } } void MainWindow::on_actionQuit_triggered(bool checked) { diff --git a/src/mainwindow.h b/src/mainwindow.h index d9c62bf..2cbb9df 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -4,6 +4,8 @@ #include #include +#include "archive_parser.h" + struct ViewTootTypes { bool includePublic = true; bool includeUnlisted = true; @@ -43,5 +45,7 @@ private: QString outbox_filename; ViewTootTypes view_filters; + + Archive *data_archive = nullptr; }; #endif // MAINWINDOW_H -- cgit v1.2.3-54-g00ecf