From 4e59eadba3b0d4586a9122e6a825ea030a139c9a Mon Sep 17 00:00:00 2001 From: ConfuSomu Date: Wed, 20 Mar 2024 13:28:19 -0400 Subject: Use smart pointers with AP classes and Instance --- src/net/instance.cpp | 6 +++--- src/net/instance.h | 11 ++++++++--- src/net/mastodon_instance.cpp | 15 ++++++++------- src/net/mastodon_instance.h | 2 +- 4 files changed, 20 insertions(+), 14 deletions(-) (limited to 'src/net') diff --git a/src/net/instance.cpp b/src/net/instance.cpp index 6982f64..8b2ad2d 100644 --- a/src/net/instance.cpp +++ b/src/net/instance.cpp @@ -4,15 +4,15 @@ #endif #include "src/settings_interface.h" -Instance* Instance::create_instance() { +InstancePtr Instance::create_instance() { return create_instance(SettingsInterface::quick_read_setting("net/instance/type")); } -Instance* Instance::create_instance(AppSettingsTypes::InstanceType type) { +InstancePtr Instance::create_instance(AppSettingsTypes::InstanceType type) { switch (type) { #ifdef MASTODONPP_BUILD case AppSettingsTypes::InstanceType::MASTODON: - return new MastodonInstance; + return std::make_shared(); #endif default: return nullptr; diff --git a/src/net/instance.h b/src/net/instance.h index 2b7eec7..79c0b12 100644 --- a/src/net/instance.h +++ b/src/net/instance.h @@ -1,6 +1,11 @@ #pragma once #include "src/activitypub/appost.h" #include "src/settings_interface.h" +#include +#include + +class Instance; +typedef std::shared_ptr InstancePtr; class Instance { public: @@ -10,7 +15,7 @@ public: }; virtual ~Instance() {}; - virtual APPost* get_post_from_url(const QString &url) = 0; + virtual APPostPtr get_post_from_url(const QString &url) = 0; // Returns the URI the user has to visit in their browser virtual QString oauth2_step1(); // auth_code is the code given by the user through the URI @@ -18,7 +23,7 @@ public: virtual OAuth2Step2 oauth2_step2(const QString &auth_code); bool supports_oauth2 = false; // Creates an instance by reading the type from settings - static Instance* create_instance(); + static InstancePtr create_instance(); // Creates a specific type of instance, for use with SettingsDialog - static Instance* create_instance(AppSettingsTypes::InstanceType type); + static InstancePtr create_instance(AppSettingsTypes::InstanceType type); }; diff --git a/src/net/mastodon_instance.cpp b/src/net/mastodon_instance.cpp index 8b88221..17d23ca 100644 --- a/src/net/mastodon_instance.cpp +++ b/src/net/mastodon_instance.cpp @@ -1,6 +1,7 @@ #include "mastodon_instance.h" #include "src/activitypub/appost.h" #include "src/activitypub/apquestion.h" +#include "src/activitypub/fields.h" #include "src/settings_interface.h" #include "src/types.h" @@ -10,7 +11,7 @@ #include #include -APPost* post_from_json(const QJsonObject &status); +APPostPtr post_from_json(const QJsonObject &status); MastodonInstance::MastodonInstance() : instance(SettingsInterface::quick_read_setting("net/instance/address").toStdString(), SettingsInterface::quick_read_setting("net/instance/token").toStdString()), connection(instance) { @@ -43,7 +44,7 @@ Instance::OAuth2Step2 MastodonInstance::oauth2_step2(const QString &auth_code) { return {(bool)answer, token}; } -APPost* MastodonInstance::get_post_from_url(const QString &url) { +APPostPtr MastodonInstance::get_post_from_url(const QString &url) { auto answer{connection.get(mastodonpp::API::v2::search, { {"q", QUrl::toPercentEncoding(url).toStdString()}, {"type", "statuses"}, @@ -57,18 +58,18 @@ APPost* MastodonInstance::get_post_from_url(const QString &url) { qDebug() << doc; if (obj.contains("statuses")) { QJsonObject status = obj["statuses"].toArray().first().toObject(); - if (status.isEmpty()) return new APPost({.content="invalid"}); // Invalid + if (status.isEmpty()) return std::make_shared(APObjectFields {.content="invalid"}); // Invalid post return post_from_json(status); } } - return new APPost({.content="connection error"}); + return std::make_shared(APObjectFields {.content="connection error"}); } // Create a filled APPost object from a Status entity (https://docs.joinmastodon.org/entities/Status/) // We have to return a pointer as else I can't get derived classes of APPost to render properly: the additional methods are ignored. // Furthermore, using pointers removes unecessary copying, even if that can be reduced by return value optimization. -APPost* post_from_json(const QJsonObject &status) { +APPostPtr post_from_json(const QJsonObject &status) { APObjectFields fields; bool is_question = status.contains("poll"); @@ -128,7 +129,7 @@ APPost* post_from_json(const QJsonObject &status) { } if (is_question) - return new APQuestion(fields); + return std::make_shared(fields); else - return new APPost(fields); + return std::make_shared(fields); } diff --git a/src/net/mastodon_instance.h b/src/net/mastodon_instance.h index 983bef6..7f9b058 100644 --- a/src/net/mastodon_instance.h +++ b/src/net/mastodon_instance.h @@ -7,7 +7,7 @@ class MastodonInstance : public Instance { public: MastodonInstance(); ~MastodonInstance(); - APPost* get_post_from_url(const QString &url); + APPostPtr get_post_from_url(const QString &url); QString oauth2_step1(); OAuth2Step2 oauth2_step2(const QString &auth_code); bool supports_oauth2 = true; -- cgit v1.2.3-54-g00ecf