summaryrefslogtreecommitdiff
path: root/archived/projt-launcher/launcher/BaseInstance.h
diff options
context:
space:
mode:
Diffstat (limited to 'archived/projt-launcher/launcher/BaseInstance.h')
-rw-r--r--archived/projt-launcher/launcher/BaseInstance.h427
1 files changed, 427 insertions, 0 deletions
diff --git a/archived/projt-launcher/launcher/BaseInstance.h b/archived/projt-launcher/launcher/BaseInstance.h
new file mode 100644
index 0000000000..e413e0162d
--- /dev/null
+++ b/archived/projt-launcher/launcher/BaseInstance.h
@@ -0,0 +1,427 @@
+// 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.
+ */
+/* === Upstream License Block (Do Not Modify) ==============================
+ *
+ * Prism Launcher - Minecraft Launcher
+ * Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
+ * Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
+ * Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>
+ *
+ * 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.
+ *
+ * This file incorporates work covered by the following copyright and
+ * permission notice:
+ *
+ * Copyright 2013-2021 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ======================================================================== */
+
+#pragma once
+#include <cassert>
+
+#include <QDataStream>
+#include <QDateTime>
+#include <QList>
+#include <QMenu>
+#include <QObject>
+#include <QProcess>
+#include <QSet>
+#include "QObjectPtr.h"
+
+#include "settings/SettingsObject.h"
+
+#include "BaseVersionList.h"
+#include "MessageLevel.h"
+#include "minecraft/auth/MinecraftAccount.hpp"
+#include "settings/INIFile.h"
+
+#include "net/Mode.h"
+
+#include "RuntimeContext.h"
+#include "minecraft/launch/MinecraftTarget.hpp"
+
+class QDir;
+class Task;
+class InstanceWindow;
+class LaunchController;
+
+namespace projt::launch
+{
+ class LaunchPipeline;
+}
+class BaseInstance;
+
+// pointer for lazy people
+using InstancePtr = std::shared_ptr<BaseInstance>;
+
+/// Shortcut saving target representations
+enum class ShortcutTarget
+{
+ Desktop,
+ Applications,
+ Other
+};
+
+/// Shortcut data representation
+struct ShortcutData
+{
+ QString name;
+ QString filePath;
+ ShortcutTarget target = ShortcutTarget::Other;
+
+ bool operator==(const ShortcutData& other) const
+ {
+ return name == other.name && filePath == other.filePath && target == other.target;
+ }
+};
+
+/// Console settings
+int getConsoleMaxLines(SettingsObjectPtr settings);
+bool shouldStopOnConsoleOverflow(SettingsObjectPtr settings);
+
+/*!
+ * \brief Base class for instances.
+ * This class implements many functions that are common between instances and
+ * provides a standard interface for all instances.
+ *
+ * To create a new instance type, create a new class inheriting from this class
+ * and implement the pure virtual functions.
+ */
+class BaseInstance : public QObject, public std::enable_shared_from_this<BaseInstance>
+{
+ Q_OBJECT
+ protected:
+ /// no-touchy!
+ BaseInstance(SettingsObjectPtr globalSettings, SettingsObjectPtr settings, const QString& rootDir);
+
+ public: /* types */
+ enum class Status
+ {
+ Present,
+ Gone // either nuked or invalidated
+ };
+
+ public:
+ /// virtual destructor to make sure the destruction is COMPLETE
+ virtual ~BaseInstance()
+ {}
+
+ virtual void saveNow() = 0;
+
+ /***
+ * the instance has been invalidated - it is no longer tracked by the launcher for some reason,
+ * but it has not necessarily been deleted.
+ *
+ * Happens when the instance folder changes to some other location, or the instance is removed by external means.
+ */
+ void invalidate();
+
+ /// The instance's ID. The ID SHALL be determined by LAUNCHER internally. The ID IS guaranteed to
+ /// be unique.
+ virtual QString id() const;
+
+ void setMinecraftRunning(bool running);
+ void setRunning(bool running);
+ bool isRunning() const;
+ int64_t totalTimePlayed() const;
+ int64_t lastTimePlayed() const;
+ void resetTimePlayed();
+
+ /// get the type of this instance
+ QString instanceType() const;
+
+ /// Path to the instance's root directory.
+ QString instanceRoot() const;
+
+ /// Path to the instance's game root directory.
+ virtual QString gameRoot() const
+ {
+ return instanceRoot();
+ }
+
+ /// Path to the instance's mods directory.
+ virtual QString modsRoot() const = 0;
+
+ QString name() const;
+ void setName(QString val);
+
+ /// Sync name and rename instance dir accordingly; returns true if successful
+ bool syncInstanceDirName(const QString& newRoot) const;
+
+ /// Register a created shortcut
+ void registerShortcut(const ShortcutData& data);
+ QList<ShortcutData> shortcuts() const;
+ void setShortcuts(const QList<ShortcutData>& shortcuts);
+
+ /// Value used for instance window titles
+ QString windowTitle() const;
+
+ QString iconKey() const;
+ void setIconKey(QString val);
+
+ QString notes() const;
+ void setNotes(QString val);
+
+ QString getPreLaunchCommand();
+ QString getPostExitCommand();
+ QString getWrapperCommand();
+
+ bool isManagedPack() const;
+ QString getManagedPackType() const;
+ QString getManagedPackID() const;
+ QString getManagedPackName() const;
+ QString getManagedPackVersionID() const;
+ QString getManagedPackVersionName() const;
+ void setManagedPack(const QString& type,
+ const QString& id,
+ const QString& name,
+ const QString& versionId,
+ const QString& version);
+ void copyManagedPack(BaseInstance& other);
+
+ /// Traits. Normally inside the version, depends on instance implementation.
+ virtual QSet<QString> traits() const = 0;
+
+ /**
+ * Gets the time that the instance was last launched.
+ * Stored in milliseconds since epoch.
+ */
+ qint64 lastLaunch() const;
+ /// Sets the last launched time to 'val' milliseconds since epoch
+ void setLastLaunch(qint64 val = QDateTime::currentMSecsSinceEpoch());
+
+ /*!
+ * \brief Gets this instance's settings object.
+ * This settings object stores instance-specific settings.
+ *
+ * Note that this method is not const.
+ * It may call loadSpecificSettings() to ensure those are loaded.
+ *
+ * \return A pointer to this instance's settings object.
+ */
+ virtual SettingsObjectPtr settings();
+
+ /*!
+ * \brief Loads settings specific to an instance type if they're not already loaded.
+ */
+ virtual void loadSpecificSettings() = 0;
+
+ /// returns a valid update task
+ virtual QList<Task::Ptr> createUpdateTask() = 0;
+
+ /// returns a valid launcher (pipeline container)
+ virtual shared_qobject_ptr<projt::launch::LaunchPipeline> createLaunchPipeline(
+ AuthSessionPtr account,
+ MinecraftTarget::Ptr targetToJoin) = 0;
+
+ /// returns the current launch pipeline (if any)
+ shared_qobject_ptr<projt::launch::LaunchPipeline> getLaunchPipeline();
+
+ /*!
+ * Create envrironment variables for running the instance
+ */
+ virtual QProcessEnvironment createEnvironment() = 0;
+ virtual QProcessEnvironment createLaunchEnvironment() = 0;
+
+ /*!
+ * Returns the root folder to use for looking up log files
+ */
+ virtual QStringList getLogFileSearchPaths() = 0;
+
+ virtual QString getStatusbarDescription() = 0;
+
+ /// Returns the path to the instance's config directory (e.g., .minecraft/config).
+ /// This is on BaseInstance because all instance types need config storage,
+ /// even if the actual path differs per implementation.
+ virtual QString instanceConfigFolder() const = 0;
+
+ /// get variables this instance exports
+ virtual QMap<QString, QString> getVariables() = 0;
+
+ virtual QString typeName() const = 0;
+
+ virtual void updateRuntimeContext();
+ RuntimeContext runtimeContext() const
+ {
+ return m_runtimeContext;
+ }
+
+ bool hasVersionBroken() const
+ {
+ return m_hasBrokenVersion;
+ }
+ void setVersionBroken(bool value)
+ {
+ if (m_hasBrokenVersion != value)
+ {
+ m_hasBrokenVersion = value;
+ emit propertiesChanged(this);
+ }
+ }
+
+ bool hasUpdateAvailable() const
+ {
+ return m_hasUpdate;
+ }
+ void setUpdateAvailable(bool value)
+ {
+ if (m_hasUpdate != value)
+ {
+ m_hasUpdate = value;
+ emit propertiesChanged(this);
+ }
+ }
+
+ bool hasCrashed() const
+ {
+ return m_crashed;
+ }
+ void setCrashed(bool value)
+ {
+ if (m_crashed != value)
+ {
+ m_crashed = value;
+ emit propertiesChanged(this);
+ }
+ }
+
+ virtual bool canLaunch() const;
+ virtual bool canEdit() const = 0;
+ virtual bool canExport() const = 0;
+
+ bool reloadSettings();
+
+ /**
+ * 'print' a verbose description of the instance into a QStringList
+ */
+ virtual QStringList verboseDescription(AuthSessionPtr session, MinecraftTarget::Ptr targetToJoin) = 0;
+
+ Status currentStatus() const;
+
+ QStringList getLinkedInstances() const;
+ void setLinkedInstances(const QStringList& list);
+ void addLinkedInstanceId(const QString& id);
+ bool removeLinkedInstanceId(const QString& id);
+ bool isLinkedToInstanceId(const QString& id) const;
+
+ // Instance window and controller management
+ InstanceWindow* getInstanceWindow() const
+ {
+ return m_instanceWindow;
+ }
+ void setInstanceWindow(InstanceWindow* window)
+ {
+ m_instanceWindow = window;
+ }
+
+ shared_qobject_ptr<LaunchController> getLaunchController() const
+ {
+ return m_launchController;
+ }
+ void setLaunchController(shared_qobject_ptr<LaunchController> controller)
+ {
+ m_launchController = controller;
+ }
+
+ bool isLegacy();
+
+ protected:
+ void changeStatus(Status newStatus);
+
+ SettingsObjectPtr globalSettings() const
+ {
+ return m_global_settings.lock();
+ }
+
+ bool isSpecificSettingsLoaded() const
+ {
+ return m_specific_settings_loaded;
+ }
+ void setSpecificSettingsLoaded(bool loaded)
+ {
+ m_specific_settings_loaded = loaded;
+ }
+
+ signals:
+ /*!
+ * \brief Signal emitted when properties relevant to the instance view change
+ */
+ void propertiesChanged(BaseInstance* inst);
+
+ void launchPipelineChanged(shared_qobject_ptr<projt::launch::LaunchPipeline>);
+
+ void runningStatusChanged(bool running);
+
+ void profilerChanged();
+
+ void statusChanged(Status from, Status to);
+
+ protected slots:
+ void iconUpdated(QString key);
+
+ protected: /* data */
+ QString m_rootDir;
+ SettingsObjectPtr m_settings;
+ // InstanceFlags m_flags;
+ bool m_isRunning = false;
+ shared_qobject_ptr<projt::launch::LaunchPipeline> m_launchProcess;
+ QDateTime m_timeStarted;
+ RuntimeContext m_runtimeContext;
+
+ private: /* data */
+ Status m_status = Status::Present;
+ bool m_crashed = false;
+ bool m_hasUpdate = false;
+ bool m_hasBrokenVersion = false;
+
+ SettingsObjectWeakPtr m_global_settings;
+ bool m_specific_settings_loaded = false;
+
+ // Instance-specific UI state (moved from Application)
+ InstanceWindow* m_instanceWindow = nullptr;
+ shared_qobject_ptr<LaunchController> m_launchController;
+};
+
+Q_DECLARE_METATYPE(shared_qobject_ptr<BaseInstance>)
+// Q_DECLARE_METATYPE(BaseInstance::InstanceFlag)
+// Q_DECLARE_OPERATORS_FOR_FLAGS(BaseInstance::InstanceFlags)