// SPDX-License-Identifier: GPL-3.0-only /* * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 Tayou * Copyright (C) 2023 TheKodeToad * * 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, see . * * 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 #include #include #include #include #include #include #include #include "minecraft/launch/MinecraftServerTarget.h" #include "ui/themes/CatPack.h" class LaunchController; class LocalPeer; class InstanceWindow; class MainWindow; class SetupWizard; class GenericPageProvider; class QFile; class HttpMetaCache; class SettingsObject; class InstanceList; class AccountList; class IconList; class QNetworkAccessManager; class JavaInstallList; class ExternalUpdater; class BaseProfilerFactory; class BaseDetachedToolFactory; class TranslationsModel; class ITheme; class MCEditTool; class ThemeManager; class IconTheme; namespace Meta { class Index; } #if defined(APPLICATION) #undef APPLICATION #endif #define APPLICATION (static_cast(QCoreApplication::instance())) class Application : public QApplication { // friends for the purpose of limiting access to deprecated stuff Q_OBJECT public: enum Status { StartingUp, Failed, Succeeded, Initialized }; enum Capability { None = 0, SupportsMSA = 1 << 0, SupportsFlame = 1 << 1, SupportsGameMode = 1 << 2, SupportsMangoHud = 1 << 3, }; Q_DECLARE_FLAGS(Capabilities, Capability) public: Application(int& argc, char** argv); virtual ~Application(); bool event(QEvent* event) override; std::shared_ptr settings() const { return m_settings; } qint64 timeSinceStart() const { return startTime.msecsTo(QDateTime::currentDateTime()); } QIcon getThemedIcon(const QString& name); ThemeManager* themeManager() { return m_themeManager.get(); } shared_qobject_ptr updater() { return m_updater; } void triggerUpdateCheck(); std::shared_ptr translations(); std::shared_ptr javalist(); std::shared_ptr instances() const { return m_instances; } std::shared_ptr icons() const { return m_icons; } MCEditTool* mcedit() const { return m_mcedit.get(); } shared_qobject_ptr accounts() const { return m_accounts; } Status status() const { return m_status; } const QMap>& profilers() const { return m_profilers; } void updateProxySettings(QString proxyTypeStr, QString addr, int port, QString user, QString password); shared_qobject_ptr network(); shared_qobject_ptr metacache(); shared_qobject_ptr metadataIndex(); void updateCapabilities(); /*! * Finds and returns the full path to a jar file. * Returns a null-string if it could not be found. */ QString getJarPath(QString jarFile); QString getMSAClientID(); QString getFlameAPIKey(); QString getModrinthAPIToken(); QString getUserAgent(); QString getUserAgentUncached(); /// this is the root of the 'installation'. Used for automatic updates const QString& root() { return m_rootPath; } bool isPortable() { return m_portable; } const Capabilities capabilities() { return m_capabilities; } /*! * Opens a json file using either a system default editor, or, if not empty, the editor * specified in the settings */ bool openJsonEditor(const QString& filename); InstanceWindow* showInstanceWindow(InstancePtr instance, QString page = QString()); MainWindow* showMainWindow(bool minimized = false); void updateIsRunning(bool running); bool updatesAreAllowed(); void ShowGlobalSettings(class QWidget* parent, QString open_page = QString()); int suitableMaxMem(); QUrl normalizeImportUrl(QString const& url); signals: void updateAllowedChanged(bool status); void globalSettingsAboutToOpen(); void globalSettingsClosed(); int currentCatChanged(int index); #ifdef Q_OS_MACOS void clickedOnDock(); #endif public slots: bool launch(InstancePtr instance, bool online = true, bool demo = false, BaseProfilerFactory* profiler = nullptr, MinecraftServerTargetPtr serverToJoin = nullptr, MinecraftAccountPtr accountToUse = nullptr); bool kill(InstancePtr instance); void closeCurrentWindow(); private slots: void on_windowClose(); void messageReceived(const QByteArray& message); void controllerSucceeded(); void controllerFailed(const QString& error); void setupWizardFinished(int status); private: bool handleDataMigration(const QString& currentData, const QString& oldData, const QString& name, const QString& configFile) const; bool createSetupWizard(); void performMainStartupAction(); // sets the fatal error message and m_status to Failed. void showFatalErrorMessage(const QString& title, const QString& content); private: void addRunningInstance(); void subRunningInstance(); bool shouldExitNow() const; private: QDateTime startTime; shared_qobject_ptr m_network; shared_qobject_ptr m_updater; shared_qobject_ptr m_accounts; shared_qobject_ptr m_metacache; shared_qobject_ptr m_metadataIndex; std::shared_ptr m_settings; std::shared_ptr m_instances; std::shared_ptr m_icons; std::shared_ptr m_javalist; std::shared_ptr m_translations; std::shared_ptr m_globalSettingsProvider; std::unique_ptr m_mcedit; QSet m_features; std::unique_ptr m_themeManager; QMap> m_profilers; QString m_rootPath; Status m_status = Application::StartingUp; Capabilities m_capabilities; bool m_portable = false; #ifdef Q_OS_MACOS Qt::ApplicationState m_prevAppState = Qt::ApplicationInactive; #endif #if defined Q_OS_WIN32 // used on Windows to attach the standard IO streams bool consoleAttached = false; #endif // FIXME: attach to instances instead. struct InstanceXtras { InstanceWindow* window = nullptr; shared_qobject_ptr controller; }; std::map m_instanceExtras; // main state variables size_t m_openWindows = 0; size_t m_runningInstances = 0; bool m_updateRunning = false; // main window, if any MainWindow* m_mainWindow = nullptr; // peer launcher instance connector - used to implement single instance launcher and signalling LocalPeer* m_peerInstance = nullptr; SetupWizard* m_setupWizard = nullptr; public: QString m_instanceIdToLaunch; QString m_serverToJoin; QString m_profileToUse; bool m_liveCheck = false; QList m_urlsToImport; QString m_instanceIdToShowWindowOf; std::unique_ptr logFile; };