aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/networking/sdl_net/localwebserver.cpp20
-rw-r--r--backends/networking/sdl_net/localwebserver.h4
-rw-r--r--gui/options.cpp53
-rw-r--r--gui/options.h3
-rw-r--r--gui/themes/scummclassic/classic_layout.stx9
-rw-r--r--gui/themes/scummclassic/classic_layout_lowres.stx11
-rw-r--r--gui/themes/scummmodern/scummmodern_layout.stx9
-rw-r--r--gui/themes/scummmodern/scummmodern_layout_lowres.stx11
8 files changed, 112 insertions, 8 deletions
diff --git a/backends/networking/sdl_net/localwebserver.cpp b/backends/networking/sdl_net/localwebserver.cpp
index 1480418b70..7c3edfc17f 100644
--- a/backends/networking/sdl_net/localwebserver.cpp
+++ b/backends/networking/sdl_net/localwebserver.cpp
@@ -30,6 +30,7 @@
#include "common/timer.h"
#include "common/translation.h"
#include <SDL/SDL_net.h>
+#include <common/config-manager.h>
#ifdef POSIX
#include <sys/types.h>
@@ -48,7 +49,7 @@ DECLARE_SINGLETON(Networking::LocalWebserver);
namespace Networking {
LocalWebserver::LocalWebserver(): _set(nullptr), _serverSocket(nullptr), _timerStarted(false),
- _stopOnIdle(false), _clients(0), _idlingFrames(0) {
+ _stopOnIdle(false), _clients(0), _idlingFrames(0), _serverPort(DEFAULT_SERVER_PORT) {
addPathHandler("/", _indexPageHandler.getHandler());
addPathHandler("/files", _filesPageHandler.getHandler());
addPathHandler("/create", _createDirectoryHandler.getHandler());
@@ -84,6 +85,7 @@ void LocalWebserver::stopTimer() {
void LocalWebserver::start() {
_handleMutex.lock();
+ _serverPort = getPort();
_stopOnIdle = false;
if (_timerStarted) {
_handleMutex.unlock();
@@ -93,7 +95,7 @@ void LocalWebserver::start() {
// Create a listening TCP socket
IPaddress ip;
- if (SDLNet_ResolveHost(&ip, NULL, SERVER_PORT) == -1) {
+ if (SDLNet_ResolveHost(&ip, NULL, _serverPort) == -1) {
error("SDLNet_ResolveHost: %s\n", SDLNet_GetError());
}
@@ -166,6 +168,14 @@ bool LocalWebserver::isRunning() {
return result;
}
+uint32 LocalWebserver::getPort() {
+#ifdef NETWORKING_LOCALWEBSERVER_ENABLE_PORT_OVERRIDE
+ if (ConfMan.hasKey("local_server_port"))
+ return ConfMan.getInt("local_server_port");
+#endif
+ return DEFAULT_SERVER_PORT;
+}
+
void LocalWebserver::handle() {
_handleMutex.lock();
int numready = SDLNet_CheckSockets(_set, 0);
@@ -241,7 +251,7 @@ void LocalWebserver::resolveAddress(void *ipAddress) {
IPaddress *ip = (IPaddress *)ipAddress;
// not resolved
- _address = Common::String::format("http://127.0.0.1:%u/ (unresolved)", SERVER_PORT);
+ _address = Common::String::format("http://127.0.0.1:%u/ (unresolved)", _serverPort);
// default way (might work everywhere, surely works on Windows)
const char *name = SDLNet_ResolveIP(ip);
@@ -249,13 +259,13 @@ void LocalWebserver::resolveAddress(void *ipAddress) {
warning("SDLNet_ResolveHost: %s\n", SDLNet_GetError());
} else {
IPaddress localIp;
- if (SDLNet_ResolveHost(&localIp, name, SERVER_PORT) == -1) {
+ if (SDLNet_ResolveHost(&localIp, name, _serverPort) == -1) {
warning("SDLNet_ResolveHost: %s\n", SDLNet_GetError());
} else {
_address = Common::String::format(
"http://%u.%u.%u.%u:%u/",
localIp.host & 0xFF, (localIp.host >> 8) & 0xFF, (localIp.host >> 16) & 0xFF, (localIp.host >> 24) & 0xFF,
- SERVER_PORT
+ _serverPort
);
}
}
diff --git a/backends/networking/sdl_net/localwebserver.h b/backends/networking/sdl_net/localwebserver.h
index 1185cda890..3512583605 100644
--- a/backends/networking/sdl_net/localwebserver.h
+++ b/backends/networking/sdl_net/localwebserver.h
@@ -50,7 +50,7 @@ namespace Networking {
class LocalWebserver : public Common::Singleton<LocalWebserver> {
static const uint32 FRAMES_PER_SECOND = 20;
static const uint32 TIMER_INTERVAL = 1000000 / FRAMES_PER_SECOND;
- static const uint32 SERVER_PORT = 12345;
+ static const uint32 DEFAULT_SERVER_PORT = 12345;
static const uint32 MAX_CONNECTIONS = 10;
friend void localWebserverTimer(void *); //calls handle()
@@ -73,6 +73,7 @@ class LocalWebserver : public Common::Singleton<LocalWebserver> {
uint32 _idlingFrames;
Common::Mutex _handleMutex;
Common::String _address;
+ uint32 _serverPort;
void startTimer(int interval = TIMER_INTERVAL);
void stopTimer();
@@ -95,6 +96,7 @@ public:
Common::String getAddress();
IndexPageHandler &indexPageHandler();
bool isRunning();
+ static uint32 getPort();
static void setClientGetHandler(Client &client, Common::String response, long code = 200, const char *mimeType = nullptr);
static void setClientGetHandler(Client &client, Common::SeekableReadStream *responseStream, long code = 200, const char *mimeType = nullptr);
diff --git a/gui/options.cpp b/gui/options.cpp
index ac548f53c7..cbcb42c69c 100644
--- a/gui/options.cpp
+++ b/gui/options.cpp
@@ -43,6 +43,7 @@
#include "audio/mixer.h"
#include "audio/fmopl.h"
#include "widgets/scrollcontainer.h"
+#include "widgets/edittext.h"
#ifdef USE_LIBCURL
#include "backends/cloud/cloudmanager.h"
@@ -1317,6 +1318,10 @@ GlobalOptionsDialog::GlobalOptionsDialog(LauncherDialog *launcher)
_runServerButton = new ButtonWidget(container, "GlobalOptions_Cloud_Container.RunServerButton", _("Run server"), _("Run local webserver"), kRunServerCmd);
_serverInfoLabel = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.ServerInfoLabel", _("Not running"));
+ uint32 port = Networking::LocalWebserver::getPort();
+ _serverPortDesc = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.ServerPortDesc", _("Server's port:"), _("Which port is used by server"));
+ _serverPort = new EditTextWidget(container, "GlobalOptions_Cloud_Container.ServerPortEditText", Common::String::format("%u", port), 0);
+
setupCloudTab();
_redrawCloudTab = false;
#ifdef USE_SDL_NET
@@ -1489,7 +1494,17 @@ void GlobalOptionsDialog::close() {
}
}
#endif
-
+#ifdef USE_SDL_NET
+#ifdef NETWORKING_LOCALWEBSERVER_ENABLE_PORT_OVERRIDE
+ // save server's port
+ uint32 port = Networking::LocalWebserver::getPort();
+ if (_serverPort) {
+ uint64 contents = _serverPort->getEditString().asUint64();
+ if (contents != 0) port = contents;
+ }
+ ConfMan.setInt("local_server_port", port);
+#endif
+#endif
}
OptionsDialog::close();
}
@@ -1647,6 +1662,17 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3
#ifdef USE_SDL_NET
case kRunServerCmd:
{
+#ifdef NETWORKING_LOCALWEBSERVER_ENABLE_PORT_OVERRIDE
+ // save server's port
+ uint32 port = Networking::LocalWebserver::getPort();
+ if (_serverPort) {
+ uint64 contents = _serverPort->getEditString().asUint64();
+ if (contents != 0) port = contents;
+ }
+ ConfMan.setInt("local_server_port", port);
+ ConfMan.flushToDisk();
+#endif
+
if (LocalServer.isRunning()) LocalServer.stopOnIdle();
else LocalServer.start();
break;
@@ -1787,13 +1813,19 @@ void GlobalOptionsDialog::setupCloudTab() {
//determine original widget's positions
int16 x, y;
uint16 w, h;
- int serverButtonY, serverInfoY;
+ int serverButtonY, serverInfoY, serverPortDescY, serverPortY;
if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.RunServerButton", x, y, w, h))
warning("GlobalOptions_Cloud_Container.RunServerButton's position is undefined");
serverButtonY = y;
if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.ServerInfoLabel", x, y, w, h))
warning("GlobalOptions_Cloud_Container.ServerInfoLabel's position is undefined");
serverInfoY = y;
+ if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.ServerPortDesc", x, y, w, h))
+ warning("GlobalOptions_Cloud_Container.ServerPortDesc's position is undefined");
+ serverPortDescY = y;
+ if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.ServerPortEditText", x, y, w, h))
+ warning("GlobalOptions_Cloud_Container.ServerPortEditText's position is undefined");
+ serverPortY = y;
bool serverIsRunning = LocalServer.isRunning();
@@ -1809,9 +1841,26 @@ void GlobalOptionsDialog::setupCloudTab() {
if (serverIsRunning) _serverInfoLabel->setLabel(LocalServer.getAddress());
else _serverInfoLabel->setLabel(_("Not running"));
}
+#ifdef NETWORKING_LOCALWEBSERVER_ENABLE_PORT_OVERRIDE
+ if (_serverPortDesc) {
+ _serverPortDesc->setVisible(true);
+ _serverPortDesc->setPos(_serverPortDesc->getRelX(), serverLabelPosition + serverPortDescY - serverInfoY);
+ _serverPortDesc->setEnabled(!serverIsRunning);
+ }
+ if (_serverPort) {
+ _serverPort->setVisible(true);
+ _serverPort->setPos(_serverPort->getRelX(), serverLabelPosition + serverPortY - serverInfoY);
+ _serverPort->setEnabled(!serverIsRunning);
+ }
+#else
+ if (_serverPortDesc) _serverPortDesc->setVisible(false);
+ if (_serverPort) _serverPort->setVisible(false);
+#endif
#else
if (_runServerButton) _runServerButton->setVisible(false);
if (_serverInfoLabel) _serverInfoLabel->setVisible(false);
+ if (_serverPortDesc) _serverPortDesc->setVisible(false);
+ if (_serverPort) _serverPort->setVisible(false);
#endif
}
#endif
diff --git a/gui/options.h b/gui/options.h
index a7e98adff6..ea8b252db7 100644
--- a/gui/options.h
+++ b/gui/options.h
@@ -45,6 +45,7 @@ namespace GUI {
class LauncherDialog;
class CheckboxWidget;
+class EditTextWidget;
class PopUpWidget;
class SliderWidget;
class StaticTextWidget;
@@ -267,6 +268,8 @@ protected:
ButtonWidget *_storageDownloadButton;
ButtonWidget *_runServerButton;
StaticTextWidget *_serverInfoLabel;
+ StaticTextWidget *_serverPortDesc;
+ EditTextWidget *_serverPort;
bool _redrawCloudTab;
#ifdef USE_SDL_NET
bool _serverWasRunning;
diff --git a/gui/themes/scummclassic/classic_layout.stx b/gui/themes/scummclassic/classic_layout.stx
index 545b3fe357..1e3d09d10e 100644
--- a/gui/themes/scummclassic/classic_layout.stx
+++ b/gui/themes/scummclassic/classic_layout.stx
@@ -583,6 +583,15 @@
height = 'Globals.Line.Height'
/>
</layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'ServerPortDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'ServerPortEditText'
+ width = '70'
+ height = 'Globals.Line.Height'
+ />
+ </layout>
</layout>
</dialog>
diff --git a/gui/themes/scummclassic/classic_layout_lowres.stx b/gui/themes/scummclassic/classic_layout_lowres.stx
index 27a3ecd26d..2ae008a80c 100644
--- a/gui/themes/scummclassic/classic_layout_lowres.stx
+++ b/gui/themes/scummclassic/classic_layout_lowres.stx
@@ -596,6 +596,17 @@
height = 'Globals.Line.Height'
/>
</layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '6' center = 'true'>
+ <widget name = 'ServerPortDesc'
+ width = '80'
+ height = 'Globals.Line.Height'
+ textalign = 'right'
+ />
+ <widget name = 'ServerPortEditText'
+ width = '60'
+ height = '16'
+ />
+ </layout>
</layout>
</dialog>
diff --git a/gui/themes/scummmodern/scummmodern_layout.stx b/gui/themes/scummmodern/scummmodern_layout.stx
index 5f4ef6f14d..03fa58acb7 100644
--- a/gui/themes/scummmodern/scummmodern_layout.stx
+++ b/gui/themes/scummmodern/scummmodern_layout.stx
@@ -597,6 +597,15 @@
height = 'Globals.Line.Height'
/>
</layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
+ <widget name = 'ServerPortDesc'
+ type = 'OptionsLabel'
+ />
+ <widget name = 'ServerPortEditText'
+ width = '70'
+ height = 'Globals.Line.Height'
+ />
+ </layout>
</layout>
</dialog>
diff --git a/gui/themes/scummmodern/scummmodern_layout_lowres.stx b/gui/themes/scummmodern/scummmodern_layout_lowres.stx
index 24476e3619..b25edcb2b0 100644
--- a/gui/themes/scummmodern/scummmodern_layout_lowres.stx
+++ b/gui/themes/scummmodern/scummmodern_layout_lowres.stx
@@ -594,6 +594,17 @@
height = 'Globals.Line.Height'
/>
</layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '6' center = 'true'>
+ <widget name = 'ServerPortDesc'
+ width = '80'
+ height = 'Globals.Line.Height'
+ textalign = 'right'
+ />
+ <widget name = 'ServerPortEditText'
+ width = '60'
+ height = '16'
+ />
+ </layout>
</layout>
</dialog>