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 + + + + +
+
+
+
+
+

{message}

+
+
+ + \ 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