24 #include "connectionhandler.h"
26 #include "application.h"
27 #include "apprunner.h"
28 #include "configuration/doomseekerconfig.h"
30 #include "gui/configuration/doomseekerconfigurationdialog.h"
31 #include "gui/configuration/gameconfigerrorbox.h"
32 #include "gui/mainwindow.h"
33 #include "joincommandlinebuilder.h"
35 #include "plugins/engineplugin.h"
36 #include "plugins/pluginloader.h"
37 #include "refresher/canrefreshserver.h"
38 #include "refresher/refresher.h"
39 #include "serverapi/gameclientrunner.h"
40 #include "serverapi/message.h"
41 #include "serverapi/server.h"
42 #include "strings.hpp"
43 #include <QDesktopServices>
44 #include <QMessageBox>
48 DClass<ConnectionHandler>
58 QWidget *parentWidget;
64 : QObject(parentWidget)
66 d->forceRefresh =
false;
68 d->parentWidget = parentWidget;
71 ConnectionHandler::~ConnectionHandler()
75 void ConnectionHandler::checkResponse(
const ServerPtr &server,
int response)
77 server->disconnect(
this);
83 QMessageBox::critical(d->parentWidget, tr(
"Doomseeker - join server"),
84 tr(
"Connection to server timed out."));
87 QMessageBox::critical(d->parentWidget, tr(
"Doomseeker - join server"),
88 tr(
"An error occured while trying to connect to server."));
99 QTimer::singleShot(0,
this, SLOT(buildJoinCommandLine()));
104 gLog << QString(
"Attempting to connect to server: %1").arg(url.toString());
109 bool zdsScheme = url.scheme().compare(
"zds", Qt::CaseInsensitive) == 0;
110 for (
unsigned int i = 0; i < gPlugins->numPlugins(); ++i)
112 const EnginePlugin *plugin = gPlugins->plugin(i)->info();
113 if (plugin->data()->scheme.compare(url.scheme(), Qt::CaseInsensitive) == 0 ||
114 (zdsScheme && plugin->data()->scheme.left(2).compare(url.path().mid(1), Qt::CaseInsensitive) == 0))
120 if (handler ==
nullptr)
122 gLog <<
"Scheme not recognized starting normally.";
126 unsigned short port = url.port(handler->data()->defaultServerPort);
133 ServerPtr server = handler->
server(QHostAddress(address), port);
135 connectionHandler->d->forceRefresh =
true;
137 return connectionHandler;
140 void ConnectionHandler::finish(
int response)
142 emit finished(response);
145 void ConnectionHandler::buildJoinCommandLine()
148 gConfig.doomseeker.bRecordDemo ? GameDemo::Managed : GameDemo::NoDemo,
150 this->connect(builder, SIGNAL(commandLineBuildFinished()), SLOT(onCommandLineBuildFinished()));
154 void ConnectionHandler::onCommandLineBuildFinished()
160 runCommandLine(builtCli);
162 else if (!builder->error().isEmpty())
164 GameConfigErrorBox::show(d->server->plugin(),
165 tr(
"Doomseeker - join game"), builder->error(),
166 builder->isConfigurationError());
168 builder->deleteLater();
174 Message message = AppRunner::runExecutable(cli);
177 gLog << tr(R
"(Error while launching game "%2" for server "%1": %3)")
178 .arg(d->server->name()).arg(d->server->engineName()).arg(message.contents());
179 QMessageBox::critical(d->parentWidget, tr("Doomseeker - launch game"), message.
contents());
183 void ConnectionHandler::refreshToJoin()
188 if (d->forceRefresh || (refreshCheck.shouldRefresh() && gConfig.doomseeker.bQueryBeforeLaunch))
190 this->connect(d->server.data(), SIGNAL(updated(ServerPtr,
int)),
191 SLOT(checkResponse(ServerPtr,
int)));
192 gRefresher->registerServer(d->server.data());
198 void ConnectionHandler::run()
207 void PluginUrlHandler::registerAll()
209 for (
unsigned int i = 0; i < gPlugins->numPlugins(); ++i)
210 registerScheme(gPlugins->plugin(i)->info()->data()->scheme);
213 registerScheme(
"zds");
216 void PluginUrlHandler::registerScheme(
const QString &scheme)
221 QDesktopServices::setUrlHandler(scheme, instance,
"handleUrl");
224 void PluginUrlHandler::handleUrl(
const QUrl &url)
226 if (QMessageBox::question(
nullptr, tr(
"Connect to server"),
227 tr(
"Do you want to connect to the server at %1?").arg(url.toString()),
228 QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes)
230 ConnectionHandler::connectByUrl(url);