summaryrefslogtreecommitdiff
path: root/archived/projt-launcher/launcher/meta/BaseEntity.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'archived/projt-launcher/launcher/meta/BaseEntity.hpp')
-rw-r--r--archived/projt-launcher/launcher/meta/BaseEntity.hpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/archived/projt-launcher/launcher/meta/BaseEntity.hpp b/archived/projt-launcher/launcher/meta/BaseEntity.hpp
new file mode 100644
index 0000000000..69ce49d4bf
--- /dev/null
+++ b/archived/projt-launcher/launcher/meta/BaseEntity.hpp
@@ -0,0 +1,118 @@
+// SPDX-License-Identifier: GPL-3.0-only
+// SPDX-FileCopyrightText: 2026 Project Tick
+// SPDX-FileContributor: Project Tick Team
+/*
+ * ProjT Launcher - Minecraft Launcher
+ * Copyright (C) 2026 Project Tick
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#pragma once
+
+#include <QJsonObject>
+#include <QObject>
+#include <QUrl>
+#include <memory>
+
+#include "net/Mode.h"
+#include "net/NetJob.h"
+#include "tasks/Task.h"
+
+namespace projt::meta
+{
+
+ class EntityLoader;
+
+ /**
+ * @brief Cacheable metadata entity loaded from local cache or remote.
+ */
+ class MetaEntity
+ {
+ friend class EntityLoader;
+
+ public:
+ using Ptr = std::shared_ptr<MetaEntity>;
+
+ enum class State
+ {
+ Pending,
+ Cached,
+ Synchronized
+ };
+
+ virtual ~MetaEntity() = default;
+
+ virtual QString cacheFilePath() const = 0;
+ virtual QUrl remoteUrl() const;
+
+ State state() const
+ {
+ return m_state;
+ }
+ bool isReady() const
+ {
+ return m_state != State::Pending;
+ }
+
+ void setExpectedChecksum(const QString& sha256)
+ {
+ m_expectedSha256 = sha256;
+ }
+ QString expectedChecksum() const
+ {
+ return m_expectedSha256;
+ }
+
+ virtual void loadFromJson(const QJsonObject& json) = 0;
+
+ [[nodiscard]] Task::Ptr createLoadTask(Net::Mode mode = Net::Mode::Online);
+
+ protected:
+ State m_state = State::Pending;
+ QString m_expectedSha256;
+ QString m_actualSha256;
+ Task::Ptr m_activeTask;
+ };
+
+ /**
+ * @brief Task for loading a MetaEntity.
+ */
+ class EntityLoader : public Task
+ {
+ Q_OBJECT
+
+ public:
+ explicit EntityLoader(MetaEntity* target, Net::Mode mode);
+ ~EntityLoader() override = default;
+
+ protected:
+ void executeTask() override;
+ bool canAbort() const override;
+ bool abort() override;
+
+ private:
+ void attemptLocalLoad();
+ void initiateRemoteFetch();
+ bool loadCachedMetadata(const QString& cachePath, QString* errorOut = nullptr);
+ void handleRemoteFailure(const QString& reason);
+ void finalizeLoad(MetaEntity::State newState);
+
+ MetaEntity* m_target;
+ Net::Mode m_mode;
+ NetJob::Ptr m_netTask;
+ bool m_canUseLocalFallback = false;
+ };
+
+} // namespace projt::meta