aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/networking/make_archive.py35
-rw-r--r--backends/networking/sdl_net/indexpagehandler.cpp108
-rw-r--r--backends/networking/sdl_net/indexpagehandler.h7
-rw-r--r--backends/networking/wwwroot.zipbin0 -> 228117 bytes
-rw-r--r--backends/networking/wwwroot/favicon.icobin0 -> 94081 bytes
-rw-r--r--backends/networking/wwwroot/index.html18
-rw-r--r--backends/networking/wwwroot/logo.pngbin0 -> 132967 bytes
-rw-r--r--backends/networking/wwwroot/style.css21
-rw-r--r--dists/scummvm.rc3
9 files changed, 188 insertions, 4 deletions
diff --git a/backends/networking/make_archive.py b/backends/networking/make_archive.py
new file mode 100644
index 0000000000..72d3b01d80
--- /dev/null
+++ b/backends/networking/make_archive.py
@@ -0,0 +1,35 @@
+#!/usr/bin/env python
+# encoding: utf-8
+import sys
+import re
+import os
+import zipfile
+
+ARCHIVE_FILE_EXTENSIONS = ('.html', '.css', '.js', '.ico', '.png')
+
+def buildArchive(archiveName):
+ if not os.path.isdir(archiveName):
+ print ("Invalid archive name: " + archiveName)
+ return
+
+ zf = zipfile.ZipFile(archiveName + ".zip", 'w')
+
+ print ("Building '" + archiveName + "' archive:")
+ os.chdir(archiveName)
+
+ filenames = os.listdir('.')
+ filenames.sort()
+ for filename in filenames:
+ if os.path.isfile(filename) and not filename[0] == '.' and filename.endswith(ARCHIVE_FILE_EXTENSIONS):
+ zf.write(filename, './' + filename)
+ print (" Adding file: " + filename)
+
+ os.chdir('../')
+
+ zf.close()
+
+def main():
+ buildArchive("wwwroot")
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/backends/networking/sdl_net/indexpagehandler.cpp b/backends/networking/sdl_net/indexpagehandler.cpp
index 58c4761f59..37fcac6419 100644
--- a/backends/networking/sdl_net/indexpagehandler.cpp
+++ b/backends/networking/sdl_net/indexpagehandler.cpp
@@ -22,35 +22,135 @@
#include "backends/networking/sdl_net/indexpagehandler.h"
#include "backends/networking/sdl_net/localwebserver.h"
+#include "common/archive.h"
+#include "common/file.h"
+#include "common/translation.h"
+#include "common/unzip.h"
#include "gui/storagewizarddialog.h"
namespace Networking {
+#define ARCHIVE_NAME "wwwroot.zip"
+#define INDEX_PAGE_NAME "index.html"
+
IndexPageHandler::IndexPageHandler(): CommandSender(nullptr) {}
IndexPageHandler::~IndexPageHandler() {
LocalServer.removePathHandler("/");
+
+ Common::ArchiveMemberList fileList = listArchive();
+ for (Common::ArchiveMemberList::iterator it = fileList.begin(); it != fileList.end(); ++it) {
+ Common::ArchiveMember const &m = **it;
+ if (m.getName() == INDEX_PAGE_NAME) continue;
+ LocalServer.removePathHandler("/" + m.getName());
+ }
}
-void IndexPageHandler::handle(Client &client) {
+void IndexPageHandler::handle(Client &client) {
+ Common::String response = "<html><head><title>ScummVM</title></head><body>{message}</body></html>";
+
+ // load stylish response page from the archive
+ Common::SeekableReadStream *const stream = getArchiveFile(INDEX_PAGE_NAME);
+ if (stream) response = readEverythingFromStream(stream);
+
Common::String code = client.queryParameter("code");
- if (code == "") {
- LocalWebserver::setClientGetHandler(client, "<html><head><title>ScummVM</title></head><body>This is a local webserver index page.</body></html>");
+ if (code == "") {
+ replace(response, "{message}", _("This is a local webserver index page."));
+ LocalWebserver::setClientGetHandler(client, response);
return;
}
_code = code;
sendCommand(GUI::kStorageCodePassedCmd, 0);
- LocalWebserver::setClientGetHandler(client, "<html><head><title>ScummVM</title></head><body>ScummVM got the code and already connects to your cloud storage!</body></html>");
+ replace(response, "{message}", _("ScummVM got the code and already connects to your cloud storage!"));
+ LocalWebserver::setClientGetHandler(client, response);
+}
+
+void IndexPageHandler::handleResource(Client &client) {
+ Common::String filename = client.path();
+ filename.deleteChar(0);
+ LocalWebserver::setClientGetHandler(client, getArchiveFile(filename), 200, LocalWebserver::determineMimeType(filename));
}
+/// public
+
void IndexPageHandler::addPathHandler(LocalWebserver &server) {
// we can't use LocalServer yet, because IndexPageHandler is created while LocalWebserver is created
// (thus no _instance is available and it causes stack overflow)
server.addPathHandler("/", new Common::Callback<IndexPageHandler, Client &>(this, &IndexPageHandler::handle));
+
+ Common::ArchiveMemberList fileList = listArchive();
+ for (Common::ArchiveMemberList::iterator it = fileList.begin(); it != fileList.end(); ++it) {
+ Common::ArchiveMember const &m = **it;
+ if (m.getName() == INDEX_PAGE_NAME) continue;
+ server.addPathHandler("/" + m.getName(), new Common::Callback<IndexPageHandler, Client &>(this, &IndexPageHandler::handleResource));
+ }
}
Common::String IndexPageHandler::code() { return _code; }
+/// utils
+
+void IndexPageHandler::replace(Common::String &source, const Common::String &what, const Common::String &with) {
+ const char *cstr = source.c_str();
+ const char *position = strstr(cstr, what.c_str());
+ if (position) {
+ uint32 index = position - cstr;
+ source.replace(index, what.size(), with);
+ }
+}
+
+Common::ArchiveMemberList IndexPageHandler::listArchive() {
+ Common::ArchiveMemberList resultList;
+
+ // Find "wwwroot.zip" with SearchMan and call its listMembers()
+ Common::ArchiveMemberList fileList;
+ SearchMan.listMatchingMembers(fileList, ARCHIVE_NAME);
+ for (Common::ArchiveMemberList::iterator it = fileList.begin(); it != fileList.end(); ++it) {
+ Common::ArchiveMember const &m = **it;
+ Common::SeekableReadStream *const stream = m.createReadStream();
+ Common::Archive *zipArchive = Common::makeZipArchive(stream);
+ if (zipArchive) {
+ zipArchive->listMembers(resultList);
+ delete zipArchive;
+ break;
+ }
+ }
+
+ return resultList;
+}
+
+Common::SeekableReadStream *const IndexPageHandler::getArchiveFile(Common::String name) {
+ Common::SeekableReadStream *result = nullptr;
+
+ // Find "wwwroot.zip" with SearchMan and call its getMember(name)
+ Common::ArchiveMemberList fileList;
+ SearchMan.listMatchingMembers(fileList, ARCHIVE_NAME);
+ for (Common::ArchiveMemberList::iterator it = fileList.begin(); it != fileList.end(); ++it) {
+ Common::ArchiveMember const &m = **it;
+ Common::SeekableReadStream *const stream = m.createReadStream();
+ Common::Archive *zipArchive = Common::makeZipArchive(stream);
+ if (zipArchive) {
+ const Common::ArchiveMemberPtr ptr = zipArchive->getMember(name);
+ result = ptr->createReadStream();
+ delete zipArchive;
+ break;
+ }
+ }
+
+ return result;
+}
+
+Common::String IndexPageHandler::readEverythingFromStream(Common::SeekableReadStream *const stream) {
+ Common::String result;
+ char buf[1024];
+ uint32 readBytes;
+ while (!stream->eos()) {
+ readBytes = stream->read(buf, 1024);
+ result += Common::String(buf, readBytes);
+ }
+ return result;
+}
+
} // End of namespace Networking
diff --git a/backends/networking/sdl_net/indexpagehandler.h b/backends/networking/sdl_net/indexpagehandler.h
index 5a1d2d7cbc..143c300336 100644
--- a/backends/networking/sdl_net/indexpagehandler.h
+++ b/backends/networking/sdl_net/indexpagehandler.h
@@ -24,6 +24,7 @@
#define BACKENDS_NETWORKING_SDL_NET_INDEXPAGEHANDLER_H
#include "backends/networking/sdl_net/client.h"
+#include "common/archive.h"
#include "gui/object.h"
namespace Networking {
@@ -33,6 +34,12 @@ class IndexPageHandler: public GUI::CommandSender {
Common::String _code;
void handle(Client &client);
+ void handleResource(Client &client);
+
+ void replace(Common::String &source, const Common::String &what, const Common::String &with);
+ Common::ArchiveMemberList listArchive();
+ Common::SeekableReadStream *const getArchiveFile(Common::String name);
+ Common::String readEverythingFromStream(Common::SeekableReadStream *const stream);
public:
IndexPageHandler();
diff --git a/backends/networking/wwwroot.zip b/backends/networking/wwwroot.zip
new file mode 100644
index 0000000000..4d98136c77
--- /dev/null
+++ b/backends/networking/wwwroot.zip
Binary files differ
diff --git a/backends/networking/wwwroot/favicon.ico b/backends/networking/wwwroot/favicon.ico
new file mode 100644
index 0000000000..0283e8432e
--- /dev/null
+++ b/backends/networking/wwwroot/favicon.ico
Binary files differ
diff --git a/backends/networking/wwwroot/index.html b/backends/networking/wwwroot/index.html
new file mode 100644
index 0000000000..2a3d9d382d
--- /dev/null
+++ b/backends/networking/wwwroot/index.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<html>
+ <head>
+ <title>ScummVM</title>
+ <meta charset="utf-8"/>
+ <link rel="stylesheet" type="text/css" href="style.css"/>
+ </head>
+ <body>
+ <div class="container">
+ <div class='header'>
+ <center><img src="logo.png"/></center>
+ </div>
+ <div class="content">
+ <p>{message}</p>
+ </div>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/backends/networking/wwwroot/logo.png b/backends/networking/wwwroot/logo.png
new file mode 100644
index 0000000000..9fdd2d0d1e
--- /dev/null
+++ b/backends/networking/wwwroot/logo.png
Binary files differ
diff --git a/backends/networking/wwwroot/style.css b/backends/networking/wwwroot/style.css
new file mode 100644
index 0000000000..f092b058a8
--- /dev/null
+++ b/backends/networking/wwwroot/style.css
@@ -0,0 +1,21 @@
+body, .header { background: #FFCC33; }
+
+.container {
+ width: 80%;
+ margin: 0 auto;
+}
+
+.header {
+ padding: 10pt;
+ /*margin: 8pt;*/
+ margin-bottom: 0;
+}
+
+.content {
+ padding: 8pt;
+ background: rgb(251, 241, 206);
+ font-family: Tahoma;
+ font-size: 16pt;
+}
+
+.content p { margin: 0 0 6pt 0; } \ No newline at end of file
diff --git a/dists/scummvm.rc b/dists/scummvm.rc
index 873feaa419..00d71ef717 100644
--- a/dists/scummvm.rc
+++ b/dists/scummvm.rc
@@ -19,6 +19,9 @@ scummmodern.zip FILE "gui/themes/scummmodern.zip"
#ifdef USE_TRANSLATION
translations.dat FILE "gui/themes/translations.dat"
#endif
+#ifdef USE_SDL_NET
+wwwroot.zip FILE "backends/networking/wwwroot.zip"
+#endif
#if ENABLE_ACCESS == STATIC_PLUGIN
access.dat FILE "dists/engine-data/access.dat"