clean up launcher helpers

This commit is contained in:
nmzik
2026-09-17 19:50:03 +04:00
parent 2bf78a94e0
commit 218e7200bb
17 changed files with 28 additions and 166 deletions
-20
View File
@@ -1,20 +0,0 @@
#ifndef LAUNCHER_INCLUDE_COMMON_H_
#define LAUNCHER_INCLUDE_COMMON_H_
// IWYU pragma: begin_exports
#include <QArgument>
#include <QObject>
#include <cinttypes>
#include <cstdint>
#include <cstdio>
// IWYU pragma: end_exports
#define KYTY_QT_CLASS_NO_COPY(name) \
public: \
name(const name&) = delete; /* NOLINT(bugprone-macro-parentheses) */ \
name& operator=(const name&) = delete; /* NOLINT(bugprone-macro-parentheses) */ \
name(name&&) noexcept = delete; /* NOLINT(bugprone-macro-parentheses) */ \
name& operator=(name&&) noexcept = delete; /* NOLINT(bugprone-macro-parentheses) */
#endif /* LAUNCHER_INCLUDE_COMMON_H_ */
@@ -1,7 +1,6 @@
#ifndef COMPATIBILITY_DATABASE_H #ifndef COMPATIBILITY_DATABASE_H
#define COMPATIBILITY_DATABASE_H #define COMPATIBILITY_DATABASE_H
#include "common.h"
#include "configuration.h" #include "configuration.h"
#include <QMap> #include <QMap>
@@ -15,7 +14,6 @@ struct CompatibilityEntry {
class CompatibilityDatabase: public QObject { class CompatibilityDatabase: public QObject {
Q_OBJECT Q_OBJECT
KYTY_QT_CLASS_NO_COPY(CompatibilityDatabase);
public: public:
explicit CompatibilityDatabase(bool local, QObject* parent = nullptr); explicit CompatibilityDatabase(bool local, QObject* parent = nullptr);
+1 -1
View File
@@ -1,13 +1,13 @@
#ifndef LAUNCHER_INCLUDE_CONFIGURATION_H_ #ifndef LAUNCHER_INCLUDE_CONFIGURATION_H_
#define LAUNCHER_INCLUDE_CONFIGURATION_H_ #define LAUNCHER_INCLUDE_CONFIGURATION_H_
#include "common.h"
#include "common/emulatorConfig.h" #include "common/emulatorConfig.h"
#include <QByteArray> #include <QByteArray>
#include <QChar> #include <QChar>
#include <QMetaEnum> #include <QMetaEnum>
#include <QMetaType> #include <QMetaType>
#include <QObject>
#include <QSettings> #include <QSettings>
#include <QString> #include <QString>
#include <QStringList> #include <QStringList>
@@ -1,8 +1,6 @@
#ifndef CONFIGURATION_EDIT_DIALOG_H #ifndef CONFIGURATION_EDIT_DIALOG_H
#define CONFIGURATION_EDIT_DIALOG_H #define CONFIGURATION_EDIT_DIALOG_H
#include "common.h"
#include <QDialog> #include <QDialog>
#include <QString> #include <QString>
#include <QStringList> #include <QStringList>
@@ -22,7 +20,6 @@ class ConfigurationEditDialog;
class ConfigurationEditDialog: public QDialog { class ConfigurationEditDialog: public QDialog {
Q_OBJECT Q_OBJECT
KYTY_QT_CLASS_NO_COPY(ConfigurationEditDialog);
public: public:
explicit ConfigurationEditDialog(Configuration& info, QWidget* parent = nullptr); explicit ConfigurationEditDialog(Configuration& info, QWidget* parent = nullptr);
@@ -31,7 +28,6 @@ public:
static void WriteSettings(QSettings& s); static void WriteSettings(QSettings& s);
static void ReadSettings(QSettings& s); static void ReadSettings(QSettings& s);
void SetTitle(const QString& str);
void SetGameDirectories(const QStringList& dirs); void SetGameDirectories(const QStringList& dirs);
[[nodiscard]] QStringList GetGameDirectories() const; [[nodiscard]] QStringList GetGameDirectories() const;
@@ -55,8 +51,6 @@ protected:
/*slots:*/ /*slots:*/
void update_info();
void adjust_size();
void save(); void save();
void clear(); void clear();
void add_game_directory(); void add_game_directory();
-4
View File
@@ -1,8 +1,6 @@
#ifndef CONFIGURATION_ITEM_H #ifndef CONFIGURATION_ITEM_H
#define CONFIGURATION_ITEM_H #define CONFIGURATION_ITEM_H
#include "common.h"
#include <QObject> #include <QObject>
#include <QTreeWidgetItem> #include <QTreeWidgetItem>
@@ -23,8 +21,6 @@ public:
void Update(); void Update();
bool operator<(const QTreeWidgetItem& other) const override; bool operator<(const QTreeWidgetItem& other) const override;
KYTY_QT_CLASS_NO_COPY(ConfigurationItem);
Configuration& GetInfo() { return *m_info; } Configuration& GetInfo() { return *m_info; }
[[nodiscard]] const Configuration& GetInfo() const { return *m_info; } [[nodiscard]] const Configuration& GetInfo() const { return *m_info; }
// void SetInfo(Configuration* info); // void SetInfo(Configuration* info);
+1 -13
View File
@@ -1,7 +1,6 @@
#ifndef CONFIGURATION_LIST_WIDGET_H #ifndef CONFIGURATION_LIST_WIDGET_H
#define CONFIGURATION_LIST_WIDGET_H #define CONFIGURATION_LIST_WIDGET_H
#include "common.h"
#include "configuration.h" #include "configuration.h"
#include <QMap> #include <QMap>
@@ -14,7 +13,6 @@ class CompatibilityDatabase;
class QEvent; class QEvent;
class QTreeWidgetItem; class QTreeWidgetItem;
class QPoint; class QPoint;
class MainDialog;
namespace Ui { namespace Ui {
class ConfigurationListWidget; class ConfigurationListWidget;
@@ -22,27 +20,20 @@ class ConfigurationListWidget;
class ConfigurationListWidget: public QWidget { class ConfigurationListWidget: public QWidget {
Q_OBJECT Q_OBJECT
KYTY_QT_CLASS_NO_COPY(ConfigurationListWidget);
public: public:
explicit ConfigurationListWidget(QWidget* parent = nullptr); explicit ConfigurationListWidget(QWidget* parent = nullptr);
~ConfigurationListWidget() override; ~ConfigurationListWidget() override;
void SetRunEnabled(bool flag) { m_run_enabled = flag; } void SetRunEnabled(bool flag) { m_run_enabled = flag; }
[[nodiscard]] bool IsRunEnabled() const { return m_run_enabled; }
[[nodiscard]] const ConfigurationItem* GetSelectedItem() const { return m_selected_item; } [[nodiscard]] const ConfigurationItem* GetSelectedItem() const { return m_selected_item; }
ConfigurationItem* GetSelectedItem() { return m_selected_item; } ConfigurationItem* GetSelectedItem() { return m_selected_item; }
void SetMainDialog(MainDialog* main_dialog) { m_main_dialog = main_dialog; }
MainDialog* GetMainDialog() { return m_main_dialog; }
[[nodiscard]] const QString& GetSettingsFile() const { return m_settings_file; } [[nodiscard]] const QString& GetSettingsFile() const { return m_settings_file; }
[[nodiscard]] const QStringList& GetGameDirectories() const { return m_game_dirs; }
[[nodiscard]] const QStringList& GetHostInputMapping() const { [[nodiscard]] const QStringList& GetHostInputMapping() const {
return m_global_info.host_input_mapping; return m_global_info.host_input_mapping;
} }
[[nodiscard]] bool CanViewSelectedTrophies() const;
bool EnsureGameDirectory(); bool EnsureGameDirectory();
void ScanGameDirectory(); void ScanGameDirectory();
@@ -66,8 +57,6 @@ protected slots:
void delete_configuartion(); void delete_configuartion();
void edit_global_settings(); void edit_global_settings();
void edit_input_mapping(); void edit_input_mapping();
void run_configuration();
void list_currentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous);
void list_itemDoubleClicked(QTreeWidgetItem* witem, int column); void list_itemDoubleClicked(QTreeWidgetItem* witem, int column);
void show_context_menu(const QPoint& pos); void show_context_menu(const QPoint& pos);
void open_game_folder(); void open_game_folder();
@@ -84,7 +73,6 @@ private:
ConfigurationItem* m_selected_item = nullptr; ConfigurationItem* m_selected_item = nullptr;
bool m_run_enabled = true; bool m_run_enabled = true;
Ui::ConfigurationListWidget* m_ui = nullptr; Ui::ConfigurationListWidget* m_ui = nullptr;
MainDialog* m_main_dialog = nullptr;
QString m_settings_file; QString m_settings_file;
QStringList m_game_dirs; QStringList m_game_dirs;
Configuration m_global_info; Configuration m_global_info;
-4
View File
@@ -1,8 +1,6 @@
#ifndef MAIN_DIALOG_H #ifndef MAIN_DIALOG_H
#define MAIN_DIALOG_H #define MAIN_DIALOG_H
#include "common.h"
#include <QDialog> #include <QDialog>
#include <QString> #include <QString>
@@ -15,11 +13,9 @@ class QResizeEvent;
class Configuration; class Configuration;
class MainDialog: public QDialog { class MainDialog: public QDialog {
Q_OBJECT Q_OBJECT
KYTY_QT_CLASS_NO_COPY(MainDialog);
signals: signals:
void Start(); void Start();
void Quit();
void Resize(); void Resize();
public: public:
+1 -2
View File
@@ -1,9 +1,8 @@
#ifndef MANDATORY_LINEEDIT_H #ifndef MANDATORY_LINEEDIT_H
#define MANDATORY_LINEEDIT_H #define MANDATORY_LINEEDIT_H
#include "common.h"
#include <QLineEdit> #include <QLineEdit>
#include <QObject>
#include <QString> #include <QString>
class QPaintEvent; class QPaintEvent;
-4
View File
@@ -1,8 +1,6 @@
#ifndef PATCHES_DIALOG_H #ifndef PATCHES_DIALOG_H
#define PATCHES_DIALOG_H #define PATCHES_DIALOG_H
#include "common.h"
#include <QDialog> #include <QDialog>
#include <QString> #include <QString>
@@ -16,8 +14,6 @@ public:
explicit PatchesDialog(const Configuration& game, QWidget* parent = nullptr); explicit PatchesDialog(const Configuration& game, QWidget* parent = nullptr);
~PatchesDialog() override = default; ~PatchesDialog() override = default;
KYTY_QT_CLASS_NO_COPY(PatchesDialog);
[[nodiscard]] static bool IsSupportedTitleId(const QString& title_id); [[nodiscard]] static bool IsSupportedTitleId(const QString& title_id);
[[nodiscard]] static QString PatchPlanPath(const QString& title_id); [[nodiscard]] static QString PatchPlanPath(const QString& title_id);
@@ -1,8 +1,6 @@
#ifndef TROPHY_VIEWER_DIALOG_H #ifndef TROPHY_VIEWER_DIALOG_H
#define TROPHY_VIEWER_DIALOG_H #define TROPHY_VIEWER_DIALOG_H
#include "common.h"
#include <QDialog> #include <QDialog>
class QTabWidget; class QTabWidget;
@@ -10,8 +8,6 @@ class QWidget;
class Configuration; class Configuration;
class TrophyViewerDialog: public QDialog { class TrophyViewerDialog: public QDialog {
KYTY_QT_CLASS_NO_COPY(TrophyViewerDialog);
public: public:
explicit TrophyViewerDialog(QWidget* parent = nullptr); explicit TrophyViewerDialog(QWidget* parent = nullptr);
+1 -13
View File
@@ -307,10 +307,6 @@ void ConfigurationEditDialog::InitGameDirectories() {
update_game_directory_buttons(); update_game_directory_buttons();
} }
void ConfigurationEditDialog::SetTitle(const QString& str) {
setWindowTitle(str);
}
void ConfigurationEditDialog::SetGameDirectories(const QStringList& dirs) { void ConfigurationEditDialog::SetGameDirectories(const QStringList& dirs) {
m_show_game_dirs = true; m_show_game_dirs = true;
m_game_dirs_list->clear(); m_game_dirs_list->clear();
@@ -401,14 +397,6 @@ static void UpdateInfo(Configuration& info, Ui::ConfigurationEditDialog& ui) {
info.profiler_enabled = ui.checkBox_profiler->isChecked(); info.profiler_enabled = ui.checkBox_profiler->isChecked();
} }
void ConfigurationEditDialog::update_info() {
UpdateInfo(m_info, *m_ui);
}
void ConfigurationEditDialog::adjust_size() {
this->adjustSize();
}
void ConfigurationEditDialog::save() { void ConfigurationEditDialog::save() {
if (MandatoryLineEdit::FindEmpty(this)) { if (MandatoryLineEdit::FindEmpty(this)) {
QMessageBox::critical(this, tr("Save failed"), tr("Please fill all mandatory fields")); QMessageBox::critical(this, tr("Save failed"), tr("Please fill all mandatory fields"));
@@ -428,7 +416,7 @@ void ConfigurationEditDialog::save() {
return; return;
} }
update_info(); UpdateInfo(m_info, *m_ui);
emit accept(); emit accept();
} }
+3 -7
View File
@@ -77,10 +77,6 @@ void SetStatus(QComboBox* combo, Configuration::GameStatus status) {
combo->setCurrentIndex(index >= 0 ? index : 0); combo->setCurrentIndex(index >= 0 ? index : 0);
} }
QIcon StandardIcon(QStyle::StandardPixmap icon) {
return QApplication::style()->standardIcon(icon);
}
QString GetPathText(const Configuration& info) { QString GetPathText(const Configuration& info) {
return !info.game_path.isEmpty() ? info.game_path : info.basedir; return !info.game_path.isEmpty() ? info.game_path : info.basedir;
} }
@@ -278,11 +274,11 @@ void ConfigurationItem::UpdateIcon() {
} }
if (m_running) { if (m_running) {
setIcon(NameColumn, StandardIcon(QStyle::SP_MediaPlay)); setIcon(NameColumn, QApplication::style()->standardIcon(QStyle::SP_MediaPlay));
} else if (m_info->custom_settings) { } else if (m_info->custom_settings) {
setIcon(NameColumn, StandardIcon(QStyle::SP_FileIcon)); setIcon(NameColumn, QApplication::style()->standardIcon(QStyle::SP_FileIcon));
} else { } else {
setIcon(NameColumn, StandardIcon(QStyle::SP_ComputerIcon)); setIcon(NameColumn, QApplication::style()->standardIcon(QStyle::SP_ComputerIcon));
} }
} }
+5 -19
View File
@@ -1,6 +1,5 @@
#include "configurationListWidget.h" #include "configurationListWidget.h"
#include "common.h"
#include "compatibilityDatabase.h" #include "compatibilityDatabase.h"
#include "configuration.h" #include "configuration.h"
#include "configurationEditDialog.h" #include "configurationEditDialog.h"
@@ -232,7 +231,7 @@ ConfigurationListWidget::ConfigurationListWidget(QWidget* parent)
connect(m_ui->delete_button, &QToolButton::clicked, this, connect(m_ui->delete_button, &QToolButton::clicked, this,
&ConfigurationListWidget::delete_configuartion); &ConfigurationListWidget::delete_configuartion);
connect(m_ui->cfgs_list, &QTreeWidget::currentItemChanged, this, connect(m_ui->cfgs_list, &QTreeWidget::currentItemChanged, this,
&ConfigurationListWidget::list_currentItemChanged); &ConfigurationListWidget::SelectItem);
connect(m_ui->cfgs_list, &QTreeWidget::itemDoubleClicked, this, connect(m_ui->cfgs_list, &QTreeWidget::itemDoubleClicked, this,
&ConfigurationListWidget::list_itemDoubleClicked); &ConfigurationListWidget::list_itemDoubleClicked);
connect(m_ui->cfgs_list, &QTreeWidget::customContextMenuRequested, this, connect(m_ui->cfgs_list, &QTreeWidget::customContextMenuRequested, this,
@@ -676,7 +675,7 @@ void ConfigurationListWidget::edit_configuration() {
} }
ConfigurationEditDialog dlg(item->GetInfo(), this); ConfigurationEditDialog dlg(item->GetInfo(), this);
dlg.SetTitle(tr("Edit game settings")); dlg.setWindowTitle(tr("Edit game settings"));
if (dlg.exec() == QDialog::Accepted) { if (dlg.exec() == QDialog::Accepted) {
item->GetInfo().custom_settings = true; item->GetInfo().custom_settings = true;
@@ -708,7 +707,7 @@ void ConfigurationListWidget::edit_global_settings() {
info.name = tr("Global settings"); info.name = tr("Global settings");
ConfigurationEditDialog dlg(info, this); ConfigurationEditDialog dlg(info, this);
dlg.SetTitle(tr("Global settings")); dlg.setWindowTitle(tr("Global settings"));
dlg.SetGameDirectories(m_game_dirs); dlg.SetGameDirectories(m_game_dirs);
if (dlg.exec() == QDialog::Accepted) { if (dlg.exec() == QDialog::Accepted) {
@@ -731,15 +730,6 @@ void ConfigurationListWidget::ClearCustomSettings(ConfigurationItem* item) {
delete m_custom_infos.take(item->GetInfo().game_path); delete m_custom_infos.take(item->GetInfo().game_path);
} }
void ConfigurationListWidget::run_configuration() {
emit Run();
}
bool ConfigurationListWidget::CanViewSelectedTrophies() const {
return m_selected_item != nullptr &&
TrophyViewerDialog::HasTrophyData(&m_selected_item->GetInfo());
}
void ConfigurationListWidget::ViewTrophies() { void ConfigurationListWidget::ViewTrophies() {
auto* current = static_cast<ConfigurationItem*>(m_ui->cfgs_list->currentItem()); auto* current = static_cast<ConfigurationItem*>(m_ui->cfgs_list->currentItem());
auto* item = current != nullptr ? current : m_selected_item; auto* item = current != nullptr ? current : m_selected_item;
@@ -852,11 +842,6 @@ void ConfigurationListWidget::SelectItem(QTreeWidgetItem* witem) {
emit Select(); emit Select();
} }
void ConfigurationListWidget::list_currentItemChanged(QTreeWidgetItem* current,
QTreeWidgetItem* /*previous*/) {
SelectItem(current);
}
void ConfigurationListWidget::list_itemDoubleClicked(QTreeWidgetItem* witem, int /*column*/) { void ConfigurationListWidget::list_itemDoubleClicked(QTreeWidgetItem* witem, int /*column*/) {
SelectItem(witem); SelectItem(witem);
if (m_run_enabled) { if (m_run_enabled) {
@@ -877,7 +862,8 @@ void ConfigurationListWidget::show_context_menu(const QPoint& pos) {
const bool has_trophy_data = const bool has_trophy_data =
item != nullptr && TrophyViewerDialog::HasTrophyData(&item->GetInfo()); item != nullptr && TrophyViewerDialog::HasTrophyData(&item->GetInfo());
QAction* action_run = menu.addAction(tr("Run"), this, SLOT(run_configuration())); QAction* action_run = menu.addAction(tr("Run"));
connect(action_run, &QAction::triggered, this, &ConfigurationListWidget::Run);
QAction* action_open_folder = QAction* action_open_folder =
menu.addAction(style()->standardIcon(QStyle::SP_DirOpenIcon), tr("Open game folder"), this, menu.addAction(style()->standardIcon(QStyle::SP_DirOpenIcon), tr("Open game folder"), this,
SLOT(open_game_folder())); SLOT(open_game_folder()));
-4
View File
@@ -2,8 +2,6 @@
#include "launcherTheme.h" #include "launcherTheme.h"
#include <QApplication> #include <QApplication>
#include <QArgument>
#include <QObject>
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
QApplication a(argc, argv); QApplication a(argc, argv);
@@ -11,8 +9,6 @@ int main(int argc, char* argv[]) {
MainDialog w; MainDialog w;
QObject::connect(&a, &QApplication::aboutToQuit, &w, &MainDialog::Quit);
w.emit Start(); w.emit Start();
w.show(); w.show();
+4 -17
View File
@@ -1,6 +1,5 @@
#include "mainDialog.h" #include "mainDialog.h"
#include "common.h"
#include "configuration.h" #include "configuration.h"
#include "configurationItem.h" #include "configurationItem.h"
#include "configurationListWidget.h" #include "configurationListWidget.h"
@@ -17,6 +16,7 @@
#include <QIODevice> #include <QIODevice>
#include <QLabel> #include <QLabel>
#include <QMessageBox> #include <QMessageBox>
#include <QObject>
#include <QPointer> #include <QPointer>
#include <QProcess> #include <QProcess>
#include <QRadioButton> #include <QRadioButton>
@@ -27,6 +27,8 @@
#include <QVariant> #include <QVariant>
#include <QtCore> #include <QtCore>
#include <cstdint>
#include "ui_main_dialog.h" #include "ui_main_dialog.h"
#if defined(_WIN32) #if defined(_WIN32)
@@ -58,20 +60,8 @@ constexpr char SETTINGS_MAIN_DIALOG[] = "MainDialog";
constexpr char SETTINGS_MAIN_LAST_GEOMETRY[] = "geometry"; constexpr char SETTINGS_MAIN_LAST_GEOMETRY[] = "geometry";
constexpr char SETTINGS_CHECK_UPDATES[] = "check_updates_on_startup"; constexpr char SETTINGS_CHECK_UPDATES[] = "check_updates_on_startup";
class DetachableProcess: public QProcess {
Q_OBJECT;
public:
explicit DetachableProcess(QObject* parent = nullptr): QProcess(parent) {}
void Detach() {
this->waitForStarted();
setProcessState(QProcess::NotRunning);
}
};
class MainDialogPrivate: public QObject { class MainDialogPrivate: public QObject {
Q_OBJECT Q_OBJECT
KYTY_QT_CLASS_NO_COPY(MainDialogPrivate);
public: public:
explicit MainDialogPrivate(QObject* parent = nullptr): QObject(parent) {} explicit MainDialogPrivate(QObject* parent = nullptr): QObject(parent) {}
@@ -99,7 +89,7 @@ private:
UpdateChecker* m_update_checker = nullptr; UpdateChecker* m_update_checker = nullptr;
QString m_interpreter; QString m_interpreter;
/*DetachableProcess*/ QProcess m_process; QProcess m_process;
QPointer<ConfigurationItem> m_running_item; QPointer<ConfigurationItem> m_running_item;
}; };
@@ -121,7 +111,6 @@ void MainDialogPrivate::Setup(MainDialog* main_dialog) {
m_main_dialog = main_dialog; m_main_dialog = main_dialog;
m_update_checker = new UpdateChecker(main_dialog); m_update_checker = new UpdateChecker(main_dialog);
m_ui->widget->SetMainDialog(main_dialog);
m_ui->check_updates_on_startup->setChecked(g_check_updates_on_startup); m_ui->check_updates_on_startup->setChecked(g_check_updates_on_startup);
m_ui->check_updates_link->setVisible(UpdateChecker::IsSupported()); m_ui->check_updates_link->setVisible(UpdateChecker::IsSupported());
m_ui->check_updates_on_startup->setVisible(UpdateChecker::IsSupported()); m_ui->check_updates_on_startup->setVisible(UpdateChecker::IsSupported());
@@ -154,8 +143,6 @@ void MainDialogPrivate::Setup(MainDialog* main_dialog) {
Update(); Update();
}); });
// connect(main_dialog, &MainDialog::Quit, [=]() { m_process.Detach(); });
m_ui->label_settings_file->setText(tr("Settings file: ") + m_ui->widget->GetSettingsFile()); m_ui->label_settings_file->setText(tr("Settings file: ") + m_ui->widget->GetSettingsFile());
m_main_dialog->restoreGeometry(g_last_geometry); m_main_dialog->restoreGeometry(g_last_geometry);
+12 -25
View File
@@ -20,6 +20,7 @@
#include <QLabel> #include <QLabel>
#include <QMap> #include <QMap>
#include <QMessageBox> #include <QMessageBox>
#include <QObject>
#include <QPixmap> #include <QPixmap>
#include <QRegularExpression> #include <QRegularExpression>
#include <QSet> #include <QSet>
@@ -32,8 +33,9 @@
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QVariant> #include <QVariant>
#include <QWidget> #include <QWidget>
#include <QtEndian>
#include <limits> #include <utility>
namespace { namespace {
@@ -83,21 +85,6 @@ static bool CanRead(const QByteArray& data, qsizetype offset, qsizetype size) {
return offset >= 0 && size >= 0 && offset <= data.size() && size <= data.size() - offset; return offset >= 0 && size >= 0 && offset <= data.size() && size <= data.size() - offset;
} }
static quint32 ReadBe32(const QByteArray& data, qsizetype offset) {
const auto* p = reinterpret_cast<const uchar*>(data.constData() + offset);
return (static_cast<quint32>(p[0]) << 24u) | (static_cast<quint32>(p[1]) << 16u) |
(static_cast<quint32>(p[2]) << 8u) | static_cast<quint32>(p[3]);
}
static quint64 ReadBe64(const QByteArray& data, qsizetype offset) {
return (static_cast<quint64>(ReadBe32(data, offset)) << 32u) |
static_cast<quint64>(ReadBe32(data, offset + 4));
}
static bool FitsQSizeType(quint64 value) {
return value <= static_cast<quint64>(std::numeric_limits<qsizetype>::max());
}
static QString ReadFixedString(const QByteArray& data, qsizetype offset, qsizetype max_size) { static QString ReadFixedString(const QByteArray& data, qsizetype offset, qsizetype max_size) {
if (!CanRead(data, offset, max_size)) { if (!CanRead(data, offset, max_size)) {
return {}; return {};
@@ -125,33 +112,33 @@ static bool ReadUcp(const QString& file_name, QMap<QString, QByteArray>& files,
return false; return false;
} }
const auto magic = ReadBe32(data, 0x00); const auto magic = qFromBigEndian<quint32>(data.constData() + 0x00);
if (magic != UCP_MAGIC) { if (magic != UCP_MAGIC) {
error = QObject::tr("%1 has an invalid trophy package magic.") error = QObject::tr("%1 has an invalid trophy package magic.")
.arg(QFileInfo(file_name).fileName()); .arg(QFileInfo(file_name).fileName());
return false; return false;
} }
const auto version = ReadBe32(data, 0x04); const auto version = qFromBigEndian<quint32>(data.constData() + 0x04);
if (version != UCP_VERSION) { if (version != UCP_VERSION) {
error = QObject::tr("%1 uses unsupported trophy package version %2.") error = QObject::tr("%1 uses unsupported trophy package version %2.")
.arg(QFileInfo(file_name).fileName(), QString::number(version)); .arg(QFileInfo(file_name).fileName(), QString::number(version));
return false; return false;
} }
const auto declared_size = ReadBe64(data, 0x08); const auto declared_size = qFromBigEndian<quint64>(data.constData() + 0x08);
if (declared_size > static_cast<quint64>(data.size())) { if (declared_size > static_cast<quint64>(data.size())) {
error = QObject::tr("%1 is truncated.").arg(QFileInfo(file_name).fileName()); error = QObject::tr("%1 is truncated.").arg(QFileInfo(file_name).fileName());
return false; return false;
} }
const auto file_count = ReadBe32(data, 0x10); const auto file_count = qFromBigEndian<quint32>(data.constData() + 0x10);
const auto toc_offset = static_cast<quint64>(ReadBe32(data, 0x14)); const auto toc_offset = static_cast<quint64>(qFromBigEndian<quint32>(data.constData() + 0x14));
const auto data_size = static_cast<quint64>(data.size()); const auto data_size = static_cast<quint64>(data.size());
const quint64 table_size = UCP_TOC_SKIP + static_cast<quint64>(file_count) * UCP_ENTRY_LEN; const quint64 table_size = UCP_TOC_SKIP + static_cast<quint64>(file_count) * UCP_ENTRY_LEN;
if (toc_offset > data_size || table_size > data_size - toc_offset || if (toc_offset > data_size || table_size > data_size - toc_offset ||
!FitsQSizeType(toc_offset + table_size)) { !std::in_range<qsizetype>(toc_offset + table_size)) {
error = QObject::tr("%1 has an invalid table of contents.") error = QObject::tr("%1 has an invalid table of contents.")
.arg(QFileInfo(file_name).fileName()); .arg(QFileInfo(file_name).fileName());
return false; return false;
@@ -162,14 +149,14 @@ static bool ReadUcp(const QString& file_name, QMap<QString, QByteArray>& files,
static_cast<quint64>(i) * UCP_ENTRY_LEN); static_cast<quint64>(i) * UCP_ENTRY_LEN);
UcpEntry entry; UcpEntry entry;
entry.name = ReadFixedString(data, entry_offset, UCP_NAME_LEN).trimmed(); entry.name = ReadFixedString(data, entry_offset, UCP_NAME_LEN).trimmed();
entry.offset = ReadBe64(data, entry_offset + 0x20); entry.offset = qFromBigEndian<quint64>(data.constData() + entry_offset + 0x20);
entry.size = ReadBe64(data, entry_offset + 0x28); entry.size = qFromBigEndian<quint64>(data.constData() + entry_offset + 0x28);
if (entry.name.isEmpty()) { if (entry.name.isEmpty()) {
continue; continue;
} }
if (entry.offset > data_size || entry.size > data_size - entry.offset || if (entry.offset > data_size || entry.size > data_size - entry.offset ||
!FitsQSizeType(entry.offset) || !FitsQSizeType(entry.size)) { !std::in_range<qsizetype>(entry.offset) || !std::in_range<qsizetype>(entry.size)) {
error = QObject::tr("%1 has an invalid entry for %2.") error = QObject::tr("%1 has an invalid entry for %2.")
.arg(QFileInfo(file_name).fileName(), entry.name); .arg(QFileInfo(file_name).fileName(), entry.name);
return false; return false;
-21
View File
@@ -48,27 +48,6 @@ function(clang_tidy_check target config headers dirs)
endif() endif()
endfunction() endfunction()
function(clang_tidy_fix target config headers dirs)
if (KYTY_ENABLE_CLANG_TIDY AND CLANG AND ("${target}" IN_LIST KYTY_CLANG_TIDY))
find_program (CLANG_TIDY_EXE NAMES "clang-tidy")
if (CLANG_TIDY_EXE)
set(std_arg "-extra-arg=-std=c++${CMAKE_CXX_STANDARD}")
foreach(dir ${dirs})
list(APPEND incdirs "-extra-arg=-I${dir}")
endforeach()
foreach(header ${headers})
list(APPEND filter "(${header}.*)")
endforeach()
string(REPLACE ";" "|" filter "${filter}")
if ("${config}" STREQUAL "")
set_target_properties(${target} PROPERTIES CXX_CLANG_TIDY "${CLANG_TIDY_EXE};-fix;-format-style=file;-header-filter=${filter};${std_arg};${incdirs}")
else()
set_target_properties(${target} PROPERTIES CXX_CLANG_TIDY "${CLANG_TIDY_EXE};-fix;-format-style=file;-config=${config};-header-filter=${filter};${std_arg};${incdirs}")
endif()
endif()
endif()
endfunction()
macro(config_compiler_and_linker) macro(config_compiler_and_linker)
set(KYTY_WARNINGS_ARE_ERRORS OFF) set(KYTY_WARNINGS_ARE_ERRORS OFF)