/* * 86Box A hypervisor and IBM PC system emulator that specializes in * running old operating systems and software designed for IBM * PC systems and compatibles from 1981 through fairly recent * system designs based on the PCI bus. * * This file is part of the 86Box distribution. * * Header for 86Box VM manager system module * * * * Authors: cold-brewed * * Copyright 2024 cold-brewed */ #ifndef QT_VMMANAGER_SYSTEM_H #define QT_VMMANAGER_SYSTEM_H #include #include #include #include #include #include "qt_vmmanager_serversocket.hpp" #include "qt_vmmanager_config.hpp" #include "qt_deviceconfig.hpp" // This macro helps give us the required `qHash()` function in order to use the // enum as a hash key #define QHASH_FOR_CLASS_ENUM(T) \ inline uint qHash(const T &t, uint seed) { \ return ::qHash(static_cast::type>(t), seed); \ } namespace Display { Q_NAMESPACE enum class Name { Machine, CPU, Memory, Video, Disks, Floppy, CD, SCSIController, MidiOut, Joystick, Serial, Parallel, Audio, Voodoo, NIC, Mouse, Unknown }; Q_ENUM_NS(Name) QHASH_FOR_CLASS_ENUM(Name) } class VMManagerSystem : public QWidget { Q_OBJECT typedef QHash display_table_t; typedef QHash > config_hash_t; public: enum class ProcessStatus { Stopped, Running, Paused, PausedWaiting, RunningWaiting, Unknown, }; Q_ENUM(ProcessStatus); explicit VMManagerSystem(const QString &sysconfig_file); // Default constructor will generate a temporary filename as the config file // but it will not be valid (isValid() will return false) VMManagerSystem() : VMManagerSystem(generateTemporaryFilename()) {} ~VMManagerSystem() override; static QVector scanForConfigs(const QString &searchPath = {}); static QString generateTemporaryFilename(); QFileInfo config_file; QString config_name; QString config_dir; QString shortened_dir; QString uuid; QString displayName; QString notes; QString icon; QStringList searchTerms; config_hash_t config_hash; [[nodiscard]] QString getAll(const QString& category) const; [[nodiscard]] QHash getCategory(const QString& category) const; [[nodiscard]] QHash > getConfigHash() const; void setDisplayName(const QString& newDisplayName); void setNotes(const QString& newNotes); [[nodiscard]] bool isValid() const; [[nodiscard]] bool isProcessRunning() const; [[nodiscard]] qint64 processId() const; void launchMainProcess(); void launchSettings(); void startButtonPressed(); void restartButtonPressed(); void pauseButtonPressed(); void shutdownRequestButtonPressed(); void shutdownForceButtonPressed(); void reloadConfig(); QDateTime timestamp(); void setIcon(const QString &newIcon); QProcess *process = new QProcess(); bool window_obscured; QString getDisplayValue(Display::Name key); QFileInfoList getScreenshots(); inline bool operator==(const VMManagerSystem &rhs) const { return config_file.filePath() == rhs.config_file.filePath(); } static QString processStatusToString(VMManagerSystem::ProcessStatus status) ; ProcessStatus process_status; [[nodiscard]] QString getProcessStatusString() const; [[nodiscard]] ProcessStatus getProcessStatus() const; signals: void windowStatusChanged(); void itemDataChanged(); void clientProcessStatusChanged(); private: void loadSettings(); void saveSettings(); void generateSearchTerms(); void updateTimestamp(); display_table_t display_table; QFileInfo main_binary; QString platform; // QDir application_temp_directory; // QDir standard_temp_directory; // QDir app_data_directory; QDir screenshot_directory; QString unique_name; QDateTime lastUsedTimestamp; VMManagerServerSocket *socket_server; VMManagerServerSocket::ServerType socket_server_type; // Configuration file settings VMManagerConfig *config_settings; bool serverIsRunning; bool startServer(); bool has86BoxBinary(); void find86BoxBinary(); void setupPaths(); void setupVars(); void setProcessEnvVars(); void dataReceived(); void windowStatusChangeReceived(int status); void runningStatusChangeReceived(VMManagerProtocol::RunningState state); void processStatusChanged(); void statusRefresh(); }; #endif //QT_VMMANAGER_SYSTEM_H