aboutsummaryrefslogtreecommitdiff
path: root/backends/networking/sdl_net/localwebserver.cpp
diff options
context:
space:
mode:
authorAlexander Tkachev2016-07-06 18:03:56 +0600
committerAlexander Tkachev2016-08-24 16:07:55 +0600
commitab4361a76b40b56348ec46311121a0552f0c9d6b (patch)
treed0f73ba85786e94fd9bd6931052ef90d7294bafb /backends/networking/sdl_net/localwebserver.cpp
parent48e3fff6bcea94da5bd46ee2def17eb6bdca716c (diff)
downloadscummvm-rg350-ab4361a76b40b56348ec46311121a0552f0c9d6b.tar.gz
scummvm-rg350-ab4361a76b40b56348ec46311121a0552f0c9d6b.tar.bz2
scummvm-rg350-ab4361a76b40b56348ec46311121a0552f0c9d6b.zip
CLOUD: Make "/create" work
One can now create directories through browser.
Diffstat (limited to 'backends/networking/sdl_net/localwebserver.cpp')
-rw-r--r--backends/networking/sdl_net/localwebserver.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/backends/networking/sdl_net/localwebserver.cpp b/backends/networking/sdl_net/localwebserver.cpp
index c3df9f8819..c8f322dad6 100644
--- a/backends/networking/sdl_net/localwebserver.cpp
+++ b/backends/networking/sdl_net/localwebserver.cpp
@@ -44,6 +44,7 @@ LocalWebserver::LocalWebserver(): _set(nullptr), _serverSocket(nullptr), _timerS
_stopOnIdle(false), _clients(0), _idlingFrames(0) {
addPathHandler("/", _indexPageHandler.getHandler());
addPathHandler("/files", _filesPageHandler.getHandler());
+ addPathHandler("/create", _filesPageHandler.getHandler()); //"Create directory" feature
_defaultHandler = _resourceHandler.getHandler();
}
@@ -271,4 +272,32 @@ const char *LocalWebserver::determineMimeType(Common::String &filename) {
return "application/octet-stream";
}
+namespace {
+int hexDigit(char c) {
+ if ('0' <= c && c <= '9') return c - '0';
+ if ('A' <= c && c <= 'F') return c - 'A' + 10;
+ if ('a' <= c && c <= 'f') return c - 'a' + 10;
+ return -1;
+}
+}
+
+Common::String LocalWebserver::urlDecode(Common::String value) {
+ Common::String result = "";
+ uint32 size = value.size();
+ for (uint32 i = 0; i < size; ++i) {
+ if (value[i] == '%' && i+2 < size) {
+ int d1 = hexDigit(value[i+1]);
+ int d2 = hexDigit(value[i+2]);
+ if (0 <= d1 && d1 < 16 && 0 <= d2 && d2 < 16) {
+ result += (char)(d1 * 16 + d2);
+ i = i + 2;
+ continue;
+ }
+ }
+
+ result += value[i];
+ }
+ return result;
+}
+
} // End of namespace Networking