diff options
author | Russell Sim <russell.sim@gmail.com> | 2020-06-14 09:07:27 +0200 |
---|---|---|
committer | Russell Sim <russell.sim@gmail.com> | 2020-06-14 09:08:35 +0200 |
commit | 8444c609936606a361dd2681a6e2356e0d5ee81c (patch) | |
tree | ddd8bee7bc99015b1470fce1cca8f2cf54736951 /proto-wine | |
parent | beac0c60e8188cb593ac82df2c0773576b493c93 (diff) |
Implement error handling
Diffstat (limited to 'proto-wine')
-rw-r--r-- | proto-wine/ftnoir_protocol_wine.cpp | 11 | ||||
-rw-r--r-- | proto-wine/proton.cpp | 39 | ||||
-rw-r--r-- | proto-wine/proton.h | 23 |
3 files changed, 54 insertions, 19 deletions
diff --git a/proto-wine/ftnoir_protocol_wine.cpp b/proto-wine/ftnoir_protocol_wine.cpp index 63308e9f..7052ea41 100644 --- a/proto-wine/ftnoir_protocol_wine.cpp +++ b/proto-wine/ftnoir_protocol_wine.cpp @@ -1,4 +1,5 @@ #include "ftnoir_protocol_wine.h" +#include "proton.h" #ifndef OTR_WINE_NO_WRAPPER # include "csv/csv.h" #endif @@ -74,9 +75,13 @@ module_status wine::initialize() QString proton_path(const QString& proton_path); wine_path = proton_path(s.proton_path().toString()); - env = make_steam_environ(s.proton_path().toString(), s.proton_appid); + try { + env = make_steam_environ(s.proton_path().toString(), s.proton_appid); + } catch(const ProtonException &e) { + return error(e.getMessage()); + } } - else + { QString wineprefix = "~/.wine"; if (!s.wineprefix->isEmpty()) @@ -85,7 +90,7 @@ module_status wine::initialize() wineprefix = qgetenv("HOME") + wineprefix.mid(1); if (wineprefix[0] != '/') - error(tr("Wine prefix must be an absolute path (given '%1')").arg(wineprefix)); + return error(tr("Wine prefix must be an absolute path (given '%1')").arg(wineprefix)); env.insert("WINEPREFIX", wineprefix); } diff --git a/proto-wine/proton.cpp b/proto-wine/proton.cpp index f2b0269e..b1eb8b9e 100644 --- a/proto-wine/proton.cpp +++ b/proto-wine/proton.cpp @@ -7,12 +7,13 @@ #ifndef OTR_WINE_NO_WRAPPER +#include "proton.h" + #include <QDebug> -#include <QtGlobal> -#include <QString> -#include <QProcessEnvironment> #include <QDir> #include <QFileInfo> +#include <QProcessEnvironment> +#include <QtGlobal> static const char* steam_paths[] = { @@ -30,7 +31,14 @@ QProcessEnvironment make_steam_environ(const QString& proton_path, int appid) { auto ret = QProcessEnvironment::systemEnvironment(); QString home = qgetenv("HOME"); - QString runtime_path; + QString runtime_path, app_wineprefix; + + auto expand = [&](QString x) { + x.replace("HOME", home); + x.replace("PROTON_PATH", proton_path); + x.replace("RUNTIME_PATH", runtime_path); + return x; + }; for (const char* path : runtime_paths) { QDir dir(QDir::homePath() + path); @@ -38,12 +46,16 @@ QProcessEnvironment make_steam_environ(const QString& proton_path, int appid) runtime_path = dir.absolutePath(); } - auto expand = [&](QString x) { - x.replace("HOME", home); - x.replace("PROTON_PATH", proton_path); - x.replace("RUNTIME_PATH", runtime_path); - return x; - }; + if (runtime_path.isEmpty()) + ProtonException(QString("Couldn't find a Steam runtime.")).raise(); + + for (const char* path : steam_paths) { + QDir dir(QDir::homePath() + path + expand("/%1/pfx").arg(appid)); + if (dir.exists()) + app_wineprefix = dir.absolutePath(); + } + if (app_wineprefix.isEmpty()) + ProtonException(QString("Couldn't find a Wineprefix for AppId %1").arg(appid)).raise(); QString path = expand( ":PROTON_PATH/dist/bin" @@ -67,12 +79,7 @@ QProcessEnvironment make_steam_environ(const QString& proton_path, int appid) ); library_path += ':'; library_path += qgetenv("LD_LIBRARY_PATH"); ret.insert("LD_LIBRARY_PATH", library_path); - - for (const char* path : steam_paths) { - QDir dir(QDir::homePath() + path + expand("/%1/pfx").arg(appid)); - if (dir.exists()) - ret.insert("WINEPREFIX", dir.absolutePath()); - } + ret.insert("WINEPREFIX", app_wineprefix); return ret; } diff --git a/proto-wine/proton.h b/proto-wine/proton.h new file mode 100644 index 00000000..08179c3d --- /dev/null +++ b/proto-wine/proton.h @@ -0,0 +1,23 @@ +#pragma once + +#include <QString> +#include <QException> + +class ProtonException : public QException +{ +public: + ProtonException(const QString& message) + : message(message) {} + + virtual ~ProtonException() + {} + + void raise() const { throw *this; } + ProtonException *clone() const { return new ProtonException(*this); } + + QString getMessage() const { + return message; + } +private: + QString message; +}; |