mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-03-12 13:13:43 +00:00
Qt: Allow package installation through cli
Adds --installpkg cli option
This commit is contained in:
parent
2c05e9719d
commit
554ba9d6a6
@ -305,6 +305,7 @@ public:
|
||||
package_reader(const std::string& path);
|
||||
~package_reader();
|
||||
|
||||
bool is_valid() const { return m_is_valid; }
|
||||
package_error check_target_app_version();
|
||||
bool extract_data(atomic_t<double>& sync);
|
||||
psf::registry get_psf() const { return m_psf; }
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <QJsonArray>
|
||||
#include <QJsonObject>
|
||||
#include <QJsonDocument>
|
||||
#include <QMessageBox>
|
||||
|
||||
#include "rpcs3qt/gui_application.h"
|
||||
#include "rpcs3qt/fatal_error_dialog.h"
|
||||
@ -207,6 +208,7 @@ constexpr auto arg_q_debug = "qDebug";
|
||||
constexpr auto arg_error = "error";
|
||||
constexpr auto arg_updating = "updating";
|
||||
constexpr auto arg_installfw = "installfw";
|
||||
constexpr auto arg_installpkg = "installpkg";
|
||||
constexpr auto arg_commit_db = "get-commit-db";
|
||||
|
||||
int find_arg(std::string arg, int& argc, char* argv[])
|
||||
@ -511,6 +513,8 @@ int main(int argc, char** argv)
|
||||
parser.addOption(config_option);
|
||||
const QCommandLineOption installfw_option(arg_installfw, "Forces the emulator to install this firmware file.", "path", "");
|
||||
parser.addOption(installfw_option);
|
||||
const QCommandLineOption installpkg_option(arg_installpkg, "Forces the emulator to install this pkg file.", "path", "");
|
||||
parser.addOption(installpkg_option);
|
||||
parser.addOption(QCommandLineOption(arg_q_debug, "Log qDebug to RPCS3.log."));
|
||||
parser.addOption(QCommandLineOption(arg_error, "For internal usage."));
|
||||
parser.addOption(QCommandLineOption(arg_updating, "For internal usage."));
|
||||
@ -769,32 +773,41 @@ int main(int argc, char** argv)
|
||||
Emu.SetConfigOverride(config_override_path);
|
||||
}
|
||||
|
||||
std::string firmware_path;
|
||||
|
||||
// Force install firmware first if specified through command-line
|
||||
if (parser.isSet(arg_installfw))
|
||||
// Force install firmware or pkg first if specified through command-line
|
||||
if (parser.isSet(arg_installfw) || parser.isSet(arg_installpkg))
|
||||
{
|
||||
if (auto gui_app = qobject_cast<gui_application*>(app.data()))
|
||||
{
|
||||
if (s_no_gui)
|
||||
{
|
||||
report_fatal_error("Cannot install firmware in no-gui mode!");
|
||||
report_fatal_error("Cannot perform installation in no-gui mode!");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (gui_app->m_main_window)
|
||||
{
|
||||
gui_app->m_main_window->HandlePupInstallation(parser.value(installfw_option));
|
||||
if (parser.isSet(arg_installfw) && parser.isSet(arg_installpkg))
|
||||
{
|
||||
QMessageBox::warning(gui_app->m_main_window, QObject::tr("Invalid command-line arguments!"), QObject::tr("Cannot perform multiple installations at the same time!"));
|
||||
}
|
||||
else if (parser.isSet(arg_installfw))
|
||||
{
|
||||
gui_app->m_main_window->InstallPup(parser.value(installfw_option));
|
||||
}
|
||||
else
|
||||
{
|
||||
gui_app->m_main_window->InstallPackages({parser.value(installpkg_option)});
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
report_fatal_error("Cannot install firmware. No main window found!");
|
||||
report_fatal_error("Cannot perform installation. No main window found!");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
report_fatal_error("Cannot install firmware in headless mode!");
|
||||
report_fatal_error("Cannot perform installation in headless mode!");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@ -804,7 +817,7 @@ int main(int argc, char** argv)
|
||||
sys_log.notice("Option passed via command line: %s %s", opt.toStdString(), parser.value(opt).toStdString());
|
||||
}
|
||||
|
||||
if (const QStringList args = parser.positionalArguments(); !args.isEmpty() && !is_updating && !parser.isSet(arg_installfw))
|
||||
if (const QStringList args = parser.positionalArguments(); !args.isEmpty() && !is_updating && !parser.isSet(arg_installfw) && !parser.isSet(arg_installpkg))
|
||||
{
|
||||
sys_log.notice("Booting application from command line: %s", args.at(0).toStdString());
|
||||
|
||||
|
@ -247,14 +247,21 @@ compat::status game_compatibility::GetStatusData(const QString& status)
|
||||
|
||||
compat::package_info game_compatibility::GetPkgInfo(const QString& pkg_path, game_compatibility* compat)
|
||||
{
|
||||
compat::package_info info;
|
||||
|
||||
package_reader reader(pkg_path.toStdString());
|
||||
if (!reader.is_valid())
|
||||
{
|
||||
info.is_valid = false;
|
||||
return info;
|
||||
}
|
||||
|
||||
psf::registry psf = reader.get_psf();
|
||||
|
||||
// TODO: localization of title and changelog
|
||||
std::string title_key = "TITLE";
|
||||
std::string changelog_key = "paramhip";
|
||||
|
||||
compat::package_info info;
|
||||
info.path = pkg_path;
|
||||
info.title = qstr(std::string(psf::get_string(psf, title_key))); // Let's read this from the psf first
|
||||
info.title_id = qstr(std::string(psf::get_string(psf, "TITLE_ID")));
|
||||
|
@ -100,6 +100,8 @@ namespace compat
|
||||
/** Concicely represents a specific pkg's localized information for use in the GUI */
|
||||
struct package_info
|
||||
{
|
||||
bool is_valid = true;
|
||||
|
||||
QString path; // File path
|
||||
QString title_id; // TEST12345
|
||||
QString title; // Localized
|
||||
|
@ -557,12 +557,18 @@ void main_window::InstallPackages(QStringList file_paths)
|
||||
}
|
||||
else if (file_paths.count() == 1)
|
||||
{
|
||||
// This can currently only happen by drag and drop.
|
||||
// This can currently only happen by drag and drop and cli arg.
|
||||
const QString file_path = file_paths.front();
|
||||
const QFileInfo file_info(file_path);
|
||||
|
||||
compat::package_info info = game_compatibility::GetPkgInfo(file_path, m_game_list_frame ? m_game_list_frame->GetGameCompatibility() : nullptr);
|
||||
|
||||
if (!info.is_valid)
|
||||
{
|
||||
QMessageBox::warning(this, QObject::tr("Invalid package!"), QObject::tr("The selected package is invalid!\n\nPath:\n%0").arg(file_path));
|
||||
return;
|
||||
}
|
||||
|
||||
if (info.type != compat::package_type::other)
|
||||
{
|
||||
if (info.type == compat::package_type::dlc)
|
||||
@ -634,6 +640,11 @@ void main_window::InstallPackages(QStringList file_paths)
|
||||
|
||||
void main_window::HandlePackageInstallation(QStringList file_paths)
|
||||
{
|
||||
if (file_paths.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<compat::package_info> packages;
|
||||
|
||||
game_compatibility* compat = m_game_list_frame ? m_game_list_frame->GetGameCompatibility() : nullptr;
|
||||
|
@ -85,7 +85,8 @@ public:
|
||||
bool Init();
|
||||
QIcon GetAppIcon();
|
||||
bool OnMissingFw();
|
||||
void HandlePupInstallation(QString file_path, QString dir_path = "");
|
||||
void InstallPackages(QStringList file_paths = QStringList());
|
||||
void InstallPup(QString filePath = "");
|
||||
|
||||
Q_SIGNALS:
|
||||
void RequestLanguageChange(const QString& language);
|
||||
@ -141,10 +142,9 @@ private:
|
||||
|
||||
static bool InstallRapFile(const QString& path, const std::string& filename);
|
||||
|
||||
void InstallPackages(QStringList file_paths = QStringList());
|
||||
void HandlePackageInstallation(QStringList file_paths);
|
||||
|
||||
void InstallPup(QString filePath = "");
|
||||
void HandlePupInstallation(QString file_path, QString dir_path = "");
|
||||
void ExtractPup();
|
||||
|
||||
void ExtractTar();
|
||||
|
@ -28,6 +28,11 @@ pkg_install_dialog::pkg_install_dialog(const QStringList& paths, game_compatibil
|
||||
for (const QString& path : paths)
|
||||
{
|
||||
const compat::package_info info = game_compatibility::GetPkgInfo(path, compat);
|
||||
if (!info.is_valid)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
const QFileInfo file_info(path);
|
||||
|
||||
// We have to build our complicated localized string in some annoying manner
|
||||
|
Loading…
x
Reference in New Issue
Block a user