From 5176eaba81f4cda6cd5a14108c3516abd8ba0c84 Mon Sep 17 00:00:00 2001
From: Alexander Tkachev
Date: Thu, 16 Jun 2016 19:47:02 +0600
Subject: CLOUD: Add wwwroot
wwwroot.zip contains ScummVM local webserver's resources, such as
template html pages, styles and images.
One can make it from wwwroot directory contents by running
make_archive.py script.
It's added to scummvm.rc, so it's included in the executable (it works
with MinGW, but I was unable to do that in VS yet).
IndexPageHandler is the one who returns these resources. It uses
index.html for "/". I'm replacing "{message}" with translated message,
so that's the way I thought the templates should work.
---
backends/networking/make_archive.py | 35 ++++++++
backends/networking/sdl_net/indexpagehandler.cpp | 108 ++++++++++++++++++++++-
backends/networking/sdl_net/indexpagehandler.h | 7 ++
backends/networking/wwwroot.zip | Bin 0 -> 228117 bytes
backends/networking/wwwroot/favicon.ico | Bin 0 -> 94081 bytes
backends/networking/wwwroot/index.html | 18 ++++
backends/networking/wwwroot/logo.png | Bin 0 -> 132967 bytes
backends/networking/wwwroot/style.css | 21 +++++
dists/scummvm.rc | 3 +
9 files changed, 188 insertions(+), 4 deletions(-)
create mode 100644 backends/networking/make_archive.py
create mode 100644 backends/networking/wwwroot.zip
create mode 100644 backends/networking/wwwroot/favicon.ico
create mode 100644 backends/networking/wwwroot/index.html
create mode 100644 backends/networking/wwwroot/logo.png
create mode 100644 backends/networking/wwwroot/style.css
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 = "
ScummVM{message}";
+
+ // 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, "ScummVMThis is a local webserver index page.");
+ 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, "ScummVMScummVM got the code and already connects to your cloud storage!");
+ 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(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(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
Binary files /dev/null and b/backends/networking/wwwroot.zip differ
diff --git a/backends/networking/wwwroot/favicon.ico b/backends/networking/wwwroot/favicon.ico
new file mode 100644
index 0000000000..0283e8432e
Binary files /dev/null and b/backends/networking/wwwroot/favicon.ico 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 @@
+
+
+
+ ScummVM
+
+
+
+
+
+
+
\ 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
Binary files /dev/null and b/backends/networking/wwwroot/logo.png 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"
--
cgit v1.2.3