aboutsummaryrefslogtreecommitdiff
path: root/backends/networking/sdl_net/localwebserver.cpp
diff options
context:
space:
mode:
authorAlexander Tkachev2016-06-15 21:36:20 +0600
committerAlexander Tkachev2016-08-24 16:07:55 +0600
commit6126435b64442ae838953e095191230737391dca (patch)
tree23f640819ee8b187cbf7358947e82d3be2267825 /backends/networking/sdl_net/localwebserver.cpp
parent0af97e59bc63538d18d2241285b68ed287ccd87c (diff)
downloadscummvm-rg350-6126435b64442ae838953e095191230737391dca.tar.gz
scummvm-rg350-6126435b64442ae838953e095191230737391dca.tar.bz2
scummvm-rg350-6126435b64442ae838953e095191230737391dca.zip
CLOUD: Add Networking::Client
Keeps current client's state
Diffstat (limited to 'backends/networking/sdl_net/localwebserver.cpp')
-rw-r--r--backends/networking/sdl_net/localwebserver.cpp73
1 files changed, 39 insertions, 34 deletions
diff --git a/backends/networking/sdl_net/localwebserver.cpp b/backends/networking/sdl_net/localwebserver.cpp
index 681485701b..783814de14 100644
--- a/backends/networking/sdl_net/localwebserver.cpp
+++ b/backends/networking/sdl_net/localwebserver.cpp
@@ -37,10 +37,7 @@ DECLARE_SINGLETON(Networking::LocalWebserver);
namespace Networking {
-LocalWebserver::LocalWebserver(): _set(nullptr), _serverSocket(nullptr), _timerStarted(false), _clients(0) {
- for (uint32 i = 0; i < MAX_CONNECTIONS; ++i)
- _clientSocket[i] = nullptr;
-}
+LocalWebserver::LocalWebserver(): _set(nullptr), _serverSocket(nullptr), _timerStarted(false), _clients(0) {}
LocalWebserver::~LocalWebserver() {
stop();
@@ -94,51 +91,59 @@ void LocalWebserver::start() {
void LocalWebserver::stop() {
if (_timerStarted) stopTimer();
- if (_set) {
- SDLNet_FreeSocketSet(_set);
- _set = nullptr;
- }
-
if (_serverSocket) {
SDLNet_TCP_Close(_serverSocket);
_serverSocket = nullptr;
}
for (uint32 i = 0; i < MAX_CONNECTIONS; ++i)
- if (_clientSocket[i]) {
- SDLNet_TCP_Close(_clientSocket[i]);
- _clientSocket[i] = nullptr;
- }
+ _client[i].close();
_clients = 0;
+
+ if (_set) {
+ SDLNet_FreeSocketSet(_set);
+ _set = nullptr;
+ }
}
void LocalWebserver::handle() {
int numready = SDLNet_CheckSockets(_set, 0);
if (numready == -1) {
error("SDLNet_CheckSockets: %s\n", SDLNet_GetError());
- } else if (numready) {
- if (SDLNet_SocketReady(_serverSocket)) {
- TCPsocket client = SDLNet_TCP_Accept(_serverSocket);
- if (client) {
- if (_clients == MAX_CONNECTIONS) { //drop the connection
- SDLNet_TCP_Close(client);
- } else {
- int numused = SDLNet_TCP_AddSocket(_set, _serverSocket);
- if (numused == -1) {
- error("SDLNet_AddSocket: %s\n", SDLNet_GetError());
- }
- _clientSocket[_clients++] = client;
- }
- }
- }
-
- for (uint32 i = 0; i < MAX_CONNECTIONS; ++i) {
- if (!_clientSocket[i]) continue;
- if (!SDLNet_SocketReady(_clientSocket[i])) continue;
- //TODO: handle client
- }
+ } else if (numready) acceptClient();
+
+ for (uint32 i = 0; i < MAX_CONNECTIONS; ++i)
+ handleClient(i);
+}
+
+void LocalWebserver::handleClient(uint32 i) {
+ switch (_client[i].state()) {
+ case INVALID: return;
+ case READING_HEADERS: _client[i].readHeaders(); break;
+ case READ_HEADERS: //decide what to do next with that client
+ //if GET, check whether we know a handler for such URL
+ //if PUT, check whether we know a handler for that URL
+ //if no handler, answer with default BAD REQUEST
+ warning("headers %s", _client[i].headers().c_str());
+ _client[i].close();
+ break;
}
}
+
+void LocalWebserver::acceptClient() {
+ if (!SDLNet_SocketReady(_serverSocket)) return;
+
+ TCPsocket client = SDLNet_TCP_Accept(_serverSocket);
+ if (!client) return;
+
+ if (_clients == MAX_CONNECTIONS) { //drop the connection
+ SDLNet_TCP_Close(client);
+ return;
+ }
+
+ _client[_clients++].open(_set, client);
+}
+
} // End of namespace Networking