23 #include "joincommandlinebuilder.h"
25 #include "application.h"
26 #include "apprunner.h"
27 #include "configuration/doomseekerconfig.h"
29 #include "gui/passworddlg.h"
30 #include "gui/wadseekerinterface.h"
31 #include "gui/wadseekershow.h"
32 #include "ini/settingsproviderqt.h"
34 #include "plugins/engineplugin.h"
35 #include "serverapi/exefile.h"
36 #include "serverapi/gameclientrunner.h"
37 #include "serverapi/message.h"
38 #include "serverapi/server.h"
39 #include "templatedpathresolver.h"
42 #include <QDialogButtonBox>
43 #include <QGridLayout>
45 #include <QListWidget>
46 #include <QMessageBox>
47 #include <wadseeker/wadseeker.h>
49 DClass<JoinCommandLineBuilder>
53 bool configurationError;
54 QString connectPassword;
58 QString inGamePassword;
60 QWidget *parentWidget;
61 bool passwordsAlreadySet;
66 QDialogButtonBox *buttonBox;
67 QDialogButtonBox::StandardButton lastButtonClicked;
76 d->configurationError =
false;
78 d->demoName = d->demoStore.mkDemoFullPath(demo, *server->plugin(),
true);
79 d->parentWidget = parentWidget;
80 d->passwordsAlreadySet =
false;
84 JoinCommandLineBuilder::~JoinCommandLineBuilder()
90 if (d->server->isLockedAnywhere())
92 if (!d->passwordsAlreadySet)
95 int ret = password.exec();
96 if (ret != QDialog::Accepted)
100 d->connectPassword = password.connectPassword();
101 d->inGamePassword = password.inGamePassword();
102 d->passwordsAlreadySet =
true;
104 params.setConnectPassword(d->connectPassword);
105 params.setInGamePassword(d->inGamePassword);
108 if (!d->demoName.isEmpty())
110 params.setDemoName(d->demoName);
116 d->error = tr(
"Demo set for recording, but couldn't prepare its save path.\n\n%1")
117 .arg(d->demoStore.root().absolutePath());
123 const CommandLineInfo &JoinCommandLineBuilder::builtCommandLine()
const
128 bool JoinCommandLineBuilder::checkServerStatus()
131 if (d->server->isRefreshing())
133 d->error = tr(
"This server is still refreshing.\nPlease wait until it is finished.");
134 gLog << tr(
"Attempted to obtain a join command line for a \"%1\" "
135 "server that is under refresh.").arg(d->server->addressWithPort());
139 else if (!d->server->isKnown())
141 d->error = tr(
"Data for this server is not available.\nOperation failed.");
142 gLog << tr(
"Attempted to obtain a join command line for an unknown server \"%1\"").arg(
143 d->server->addressWithPort());
149 bool JoinCommandLineBuilder::checkWadseekerValidity(QWidget *parent)
153 QDir targetDir(targetDirPath);
154 QFileInfo targetDirFileInfo(targetDirPath);
156 if (targetDirPath.isEmpty() || !targetDir.exists() || !targetDirFileInfo.isWritable())
164 const QString &JoinCommandLineBuilder::error()
const
169 void JoinCommandLineBuilder::failBuild()
172 emit commandLineBuildFinished();
175 void JoinCommandLineBuilder::handleError(
const JoinError &error)
177 if (!error.error().isEmpty())
179 d->error = error.error();
183 d->error = tr(
"Unknown error.");
185 d->configurationError = (error.type() == JoinError::ConfigurationError);
187 gLog << tr(
"Error when obtaining join parameters for server "
188 "\"%1\", game \"%2\": %3").arg(d->server->name()).arg(
189 d->server->engineName()).arg(d->error);
192 MissingWadsDialog::MissingWadsProceed JoinCommandLineBuilder::handleMissingWads(
const JoinError &error)
194 QList<PWad> missingWads;
205 if (dialog.exec() == QDialog::Accepted)
207 if (dialog.decision() == MissingWadsDialog::Install)
209 if (!gWadseekerShow->checkWadseekerValidity(d->parentWidget))
211 return MissingWadsDialog::Cancel;
214 this->connect(wadseeker, SIGNAL(finished(
int)), SLOT(onWadseekerDone(
int)));
215 wadseeker->
setWads(dialog.filesToDownload());
216 wadseeker->setAttribute(Qt::WA_DeleteOnClose);
220 return dialog.decision();
223 bool JoinCommandLineBuilder::isConfigurationError()
const
225 return d->configurationError;
228 void JoinCommandLineBuilder::missingWadsClicked(QAbstractButton *button)
230 d->lastButtonClicked = d->buttonBox->standardButton(button);
235 assert(d->server !=
nullptr);
240 if (!d->demoStore.ensureStorageExists(d->parentWidget))
247 if (!checkServerStatus())
254 if (!buildServerConnectParams(params))
263 switch (joinError.type())
268 case JoinError::ConfigurationError:
269 case JoinError::Critical:
271 handleError(joinError);
278 if (tryToInstallGame())
289 case JoinError::MissingWads:
291 MissingWadsDialog::MissingWadsProceed proceed =
292 handleMissingWads(joinError);
295 case MissingWadsDialog::Cancel:
298 case MissingWadsDialog::Ignore:
300 case MissingWadsDialog::Install:
304 gLog <<
"Bug: not sure how to proceed after \"MissingWads\".";
308 [[gnu::fallthrough]];
311 case JoinError::NoError:
314 d->demoStore.saveDemoMetaData(d->demoName, *d->server->plugin(),
315 d->server->iwad(), d->server->wads(),
true, d->server->gameVersion());
320 gLog <<
"JoinCommandLineBuilder - unhandled JoinError type!";
324 emit commandLineBuildFinished();
327 void JoinCommandLineBuilder::onWadseekerDone(
int result)
329 if (result == QDialog::Accepted)
339 ServerPtr JoinCommandLineBuilder::server()
const
346 d->passwordsAlreadySet = !(connectPassword.isNull() && inGamePassword.isNull());
347 if (!connectPassword.isNull())
348 d->connectPassword = connectPassword;
349 if (!inGamePassword.isNull())
350 d->inGamePassword = inGamePassword;
353 bool JoinCommandLineBuilder::tryToInstallGame()
355 Message message = d->server->clientExe()->install(gApp->mainWindowAsQWidget());
358 QMessageBox::critical(gApp->mainWindowAsQWidget(), tr(
"Game installation failure"),
359 message.
contents(), QMessageBox::Ok);