From 36b0069e95a5eb6816e75bb9cf4aae56c7b5b258 Mon Sep 17 00:00:00 2001 From: Alexander Tkachev Date: Sat, 9 Jul 2016 17:06:50 +0600 Subject: CLOUD: Cleanup in Handlers Simplified some stuff here and there by using HandlerUtils static methods. --- .../networking/sdl_net/handlers/basehandler.cpp | 100 --------------------- backends/networking/sdl_net/handlers/basehandler.h | 11 +-- .../sdl_net/handlers/createdirectoryhandler.cpp | 100 +++++++-------------- .../sdl_net/handlers/createdirectoryhandler.h | 10 --- .../sdl_net/handlers/downloadfilehandler.cpp | 56 +++--------- .../sdl_net/handlers/downloadfilehandler.h | 10 --- .../sdl_net/handlers/filespagehandler.cpp | 27 +----- .../networking/sdl_net/handlers/filespagehandler.h | 1 - .../sdl_net/handlers/indexpagehandler.cpp | 22 +---- .../networking/sdl_net/handlers/indexpagehandler.h | 2 +- .../sdl_net/handlers/resourcehandler.cpp | 3 +- 11 files changed, 57 insertions(+), 285 deletions(-) delete mode 100644 backends/networking/sdl_net/handlers/basehandler.cpp (limited to 'backends/networking/sdl_net/handlers') diff --git a/backends/networking/sdl_net/handlers/basehandler.cpp b/backends/networking/sdl_net/handlers/basehandler.cpp deleted file mode 100644 index da90bb4296..0000000000 --- a/backends/networking/sdl_net/handlers/basehandler.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* ScummVM - Graphic Adventure Engine -* -* ScummVM is the legal property of its developers, whose names -* are too numerous to list here. Please refer to the COPYRIGHT -* file distributed with this source distribution. -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* of the License, or (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -* -*/ - -#include "backends/networking/sdl_net/handlers/basehandler.h" -#include "common/archive.h" -#include "common/config-manager.h" -#include "common/file.h" -#include "common/unzip.h" - -namespace Networking { - -#define ARCHIVE_NAME "wwwroot.zip" - -BaseHandler::BaseHandler() {} - -BaseHandler::~BaseHandler() {} - -/// utils - -Common::Archive *BaseHandler::getZipArchive() const { - // first search in themepath - if (ConfMan.hasKey("themepath")) { - const Common::FSNode &node = Common::FSNode(ConfMan.get("themepath")); - if (!node.exists() || !node.isReadable() || !node.isDirectory()) - return nullptr; - - Common::FSNode fileNode = node.getChild(ARCHIVE_NAME); - if (fileNode.exists() && fileNode.isReadable() && !fileNode.isDirectory()) { - Common::SeekableReadStream *const stream = fileNode.createReadStream(); - Common::Archive *zipArchive = Common::makeZipArchive(stream); - if (zipArchive) return zipArchive; - } - } - - // then use SearchMan to find it - 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) return zipArchive; - } - - return nullptr; -} - -Common::ArchiveMemberList BaseHandler::listArchive() const { - Common::ArchiveMemberList resultList; - Common::Archive *zipArchive = getZipArchive(); - if (zipArchive) { - zipArchive->listMembers(resultList); - delete zipArchive; - } - return resultList; -} - -Common::SeekableReadStream *BaseHandler::getArchiveFile(Common::String name) const { - Common::SeekableReadStream *result = nullptr; - Common::Archive *zipArchive = getZipArchive(); - if (zipArchive) { - const Common::ArchiveMemberPtr ptr = zipArchive->getMember(name); - if (ptr.get() == nullptr) return nullptr; - result = ptr->createReadStream(); - delete zipArchive; - } - return result; -} - -Common::String BaseHandler::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/handlers/basehandler.h b/backends/networking/sdl_net/handlers/basehandler.h index feea83ac9c..fd55b1372e 100644 --- a/backends/networking/sdl_net/handlers/basehandler.h +++ b/backends/networking/sdl_net/handlers/basehandler.h @@ -24,7 +24,6 @@ #define BACKENDS_NETWORKING_SDL_NET_BASEHANDLER_H #include "backends/networking/sdl_net/client.h" -#include "common/archive.h" #include "common/callback.h" namespace Networking { @@ -32,15 +31,9 @@ namespace Networking { typedef Common::BaseCallback *ClientHandlerCallback; class BaseHandler { -protected: - Common::Archive *getZipArchive() const; - Common::ArchiveMemberList listArchive() const; - Common::SeekableReadStream *getArchiveFile(Common::String name) const; - static Common::String readEverythingFromStream(Common::SeekableReadStream *const stream); - public: - BaseHandler(); - virtual ~BaseHandler(); + BaseHandler() {} + virtual ~BaseHandler() {} virtual ClientHandlerCallback getHandler() = 0; }; diff --git a/backends/networking/sdl_net/handlers/createdirectoryhandler.cpp b/backends/networking/sdl_net/handlers/createdirectoryhandler.cpp index 7b7d9ed4a0..97d75fcf14 100644 --- a/backends/networking/sdl_net/handlers/createdirectoryhandler.cpp +++ b/backends/networking/sdl_net/handlers/createdirectoryhandler.cpp @@ -21,15 +21,13 @@ */ #include "backends/networking/sdl_net/handlers/createdirectoryhandler.h" -#include "backends/networking/sdl_net/localwebserver.h" #include "backends/fs/fs-factory.h" -#include "common/file.h" +#include "backends/networking/sdl_net/handlerutils.h" +#include "backends/networking/sdl_net/localwebserver.h" #include "common/translation.h" namespace Networking { -#define INDEX_PAGE_NAME ".index.html" - CreateDirectoryHandler::CreateDirectoryHandler() {} CreateDirectoryHandler::~CreateDirectoryHandler() {} @@ -37,94 +35,58 @@ CreateDirectoryHandler::~CreateDirectoryHandler() {} void CreateDirectoryHandler::handle(Client &client) { Common::String path = client.queryParameter("path"); Common::String name = client.queryParameter("directory_name"); - Common::String errorMessage = ""; - - // show an error message if failed to create directory - if (!createDirectory(path, name, errorMessage)) { - handleErrorMessage( - client, - Common::String::format( - "%s
%s", - errorMessage.c_str(), - "%2F", //that's encoded "/" - _("Back to the files manager") - ) - ); - return; - } - - 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); - - replace(response, "{message}", Common::String::format( - "%s
%s", - _("Directory created successfully!"), - client.queryParameter("path").c_str(), - _("Back to parent directory") - ) - ); - LocalWebserver::setClientRedirectHandler( - client, response, - "/files?path=" + LocalWebserver::urlEncodeQueryParameterValue(client.queryParameter("path")) - ); -} -void CreateDirectoryHandler::handleErrorMessage(Client &client, Common::String message) { - 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); - - replace(response, "{message}", message); - LocalWebserver::setClientGetHandler(client, response); -} - -bool CreateDirectoryHandler::createDirectory(Common::String path, Common::String name, Common::String &errorMessage) { // check that is not an absolute root if (path == "" || path == "/") { - errorMessage = _("Can't create directory here!"); - return false; + HandlerUtils::setFilesManagerErrorMessageHandler(client, _("Can't create directory here!")); + return; } // transform virtual path to actual file system one Common::String prefixToRemove = "", prefixToAdd = ""; if (!transformPath(path, prefixToRemove, prefixToAdd) || path.empty()) { - errorMessage = _("Invalid path!"); - return false; + HandlerUtils::setFilesManagerErrorMessageHandler(client, _("Invalid path!")); + return; } // check that exists and is directory AbstractFSNode *node = g_system->getFilesystemFactory()->makeFileNodePath(path); if (!node->exists()) { - errorMessage = _("Parent directory doesn't exists!"); - return false; + HandlerUtils::setFilesManagerErrorMessageHandler(client, _("Parent directory doesn't exists!")); + return; } if (!node->isDirectory()) { - errorMessage = _("Can't create a directory within a file!"); - return false; + HandlerUtils::setFilesManagerErrorMessageHandler(client, _("Can't create a directory within a file!")); + return; } - + // check that doesn't exist or is directory if (path.lastChar() != '/' && path.lastChar() != '\\') path += '/'; node = g_system->getFilesystemFactory()->makeFileNodePath(path + name); if (node->exists()) { if (!node->isDirectory()) { - errorMessage = _("There is a file with that name in the parent directory!"); - return false; - } else return true; - } - - // create the in - if (!node->create(true)) { - errorMessage = _("Failed to create the directory!"); - return false; + HandlerUtils::setFilesManagerErrorMessageHandler(client, _("There is a file with that name in the parent directory!")); + return; + } + } else { + // create the in + if (!node->create(true)) { + HandlerUtils::setFilesManagerErrorMessageHandler(client, _("Failed to create the directory!")); + return; + } } - return true; + // set redirect on success + HandlerUtils::setMessageHandler( + client, + Common::String::format( + "%s
%s", + _("Directory created successfully!"), + client.queryParameter("path").c_str(), + _("Back to parent directory") + ), + "/files?path=" + LocalWebserver::urlEncodeQueryParameterValue(client.queryParameter("path")) + ); } /// public diff --git a/backends/networking/sdl_net/handlers/createdirectoryhandler.h b/backends/networking/sdl_net/handlers/createdirectoryhandler.h index 023c3e74f2..2ffaf96f1f 100644 --- a/backends/networking/sdl_net/handlers/createdirectoryhandler.h +++ b/backends/networking/sdl_net/handlers/createdirectoryhandler.h @@ -29,16 +29,6 @@ namespace Networking { class CreateDirectoryHandler: public FilesBaseHandler { void handle(Client &client); - void handleErrorMessage(Client &client, Common::String message); - - /** - * Creates the directory in . - * - * Fills on failure. - * - * Returns true on success. - */ - bool createDirectory(Common::String path, Common::String name, Common::String &errorMessage); public: CreateDirectoryHandler(); virtual ~CreateDirectoryHandler(); diff --git a/backends/networking/sdl_net/handlers/downloadfilehandler.cpp b/backends/networking/sdl_net/handlers/downloadfilehandler.cpp index 8974cb7d19..ff45517979 100644 --- a/backends/networking/sdl_net/handlers/downloadfilehandler.cpp +++ b/backends/networking/sdl_net/handlers/downloadfilehandler.cpp @@ -21,77 +21,48 @@ */ #include "backends/networking/sdl_net/handlers/downloadfilehandler.h" -#include "backends/networking/sdl_net/localwebserver.h" #include "backends/fs/fs-factory.h" -#include "common/file.h" +#include "backends/networking/sdl_net/getclienthandler.h" +#include "backends/networking/sdl_net/handlerutils.h" +#include "backends/networking/sdl_net/localwebserver.h" #include "common/translation.h" -#include "../getclienthandler.h" namespace Networking { -#define INDEX_PAGE_NAME ".index.html" - DownloadFileHandler::DownloadFileHandler() {} DownloadFileHandler::~DownloadFileHandler() {} void DownloadFileHandler::handle(Client &client) { Common::String path = client.queryParameter("path"); - Common::String errorMessage = ""; - - // show an error message if failed to download the file - if (!downloadFile(client, path, errorMessage)) { - handleErrorMessage( - client, - Common::String::format( - "%s
%s", - errorMessage.c_str(), - "%2F", //that's encoded "/" - _("Back to the files manager") - ) - ); - } -} - -void DownloadFileHandler::handleErrorMessage(Client &client, Common::String message) { - 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); - - replace(response, "{message}", message); - LocalWebserver::setClientGetHandler(client, response); -} -bool DownloadFileHandler::downloadFile(Client &client, Common::String path, Common::String &errorMessage) { // check that is not an absolute root if (path == "" || path == "/") { - errorMessage = _("Invalid path!"); - return false; + HandlerUtils::setFilesManagerErrorMessageHandler(client, _("Invalid path!")); + return; } // transform virtual path to actual file system one Common::String prefixToRemove = "", prefixToAdd = ""; if (!transformPath(path, prefixToRemove, prefixToAdd, false) || path.empty()) { - errorMessage = _("Invalid path!"); - return false; + HandlerUtils::setFilesManagerErrorMessageHandler(client, _("Invalid path!")); + return; } // check that exists and is directory AbstractFSNode *node = g_system->getFilesystemFactory()->makeFileNodePath(path); if (!node->exists()) { - errorMessage = _("The file doesn't exist!"); - return false; + HandlerUtils::setFilesManagerErrorMessageHandler(client, _("The file doesn't exist!")); + return; } if (node->isDirectory()) { - errorMessage = _("Can't download a directory!"); - return false; + HandlerUtils::setFilesManagerErrorMessageHandler(client, _("Can't download a directory!")); + return; } Common::SeekableReadStream *stream = node->createReadStream(); if (stream == nullptr) { - errorMessage = _("Failed to read the file!"); - return false; + HandlerUtils::setFilesManagerErrorMessageHandler(client, _("Failed to read the file!")); + return; } GetClientHandler *handler = new GetClientHandler(stream); @@ -100,7 +71,6 @@ bool DownloadFileHandler::downloadFile(Client &client, Common::String path, Comm handler->setHeader("Content-Disposition", "attachment; filename=\"" + node->getDisplayName() + "\""); handler->setHeader("Content-Transfer-Encoding", "binary"); client.setHandler(handler); - return true; } /// public diff --git a/backends/networking/sdl_net/handlers/downloadfilehandler.h b/backends/networking/sdl_net/handlers/downloadfilehandler.h index 6b6966435c..afcedec72a 100644 --- a/backends/networking/sdl_net/handlers/downloadfilehandler.h +++ b/backends/networking/sdl_net/handlers/downloadfilehandler.h @@ -29,16 +29,6 @@ namespace Networking { class DownloadFileHandler: public FilesBaseHandler { void handle(Client &client); - void handleErrorMessage(Client &client, Common::String message); - - /** - * Creates a client handler for downloading file . - * - * Fills on failure. - * - * Returns true on success. - */ - bool downloadFile(Client &client, Common::String path, Common::String &errorMessage); public: DownloadFileHandler(); virtual ~DownloadFileHandler(); diff --git a/backends/networking/sdl_net/handlers/filespagehandler.cpp b/backends/networking/sdl_net/handlers/filespagehandler.cpp index 4b18ac3247..2db80f76ac 100644 --- a/backends/networking/sdl_net/handlers/filespagehandler.cpp +++ b/backends/networking/sdl_net/handlers/filespagehandler.cpp @@ -21,8 +21,8 @@ */ #include "backends/networking/sdl_net/handlers/filespagehandler.h" +#include "backends/networking/sdl_net/handlerutils.h" #include "backends/networking/sdl_net/localwebserver.h" -#include "common/file.h" #include "common/translation.h" namespace Networking { @@ -52,23 +52,15 @@ void FilesPageHandler::handle(Client &client) { Common::String itemTemplate = "{name}{size}\n"; //TODO: load this template too? // load stylish response page from the archive - Common::SeekableReadStream *const stream = getArchiveFile(FILES_PAGE_NAME); - if (stream) response = readEverythingFromStream(stream); + Common::SeekableReadStream *const stream = HandlerUtils::getArchiveFile(FILES_PAGE_NAME); + if (stream) response = HandlerUtils::readEverythingFromStream(stream); Common::String path = client.queryParameter("path"); Common::String content = ""; // show an error message if failed to list directory if (!listDirectory(path, content, itemTemplate)) { - handleErrorMessage( - client, - Common::String::format( - "%s
%s", - _("ScummVM couldn't list the directory you specified."), - "%2F", //that's encoded "/" - _("Back to the files manager") - ) - ); + HandlerUtils::setFilesManagerErrorMessageHandler(client, _("ScummVM couldn't list the directory you specified.")); return; } @@ -85,17 +77,6 @@ void FilesPageHandler::handle(Client &client) { LocalWebserver::setClientGetHandler(client, response); } -void FilesPageHandler::handleErrorMessage(Client &client, Common::String message) { - 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); - - replace(response, "{message}", message); - LocalWebserver::setClientGetHandler(client, response); -} - bool FilesPageHandler::listDirectory(Common::String path, Common::String &content, const Common::String &itemTemplate) { if (path == "" || path == "/") { addItem(content, itemTemplate, true, "/root/", _("File system root")); diff --git a/backends/networking/sdl_net/handlers/filespagehandler.h b/backends/networking/sdl_net/handlers/filespagehandler.h index 6205dcd52c..ba132fd7ba 100644 --- a/backends/networking/sdl_net/handlers/filespagehandler.h +++ b/backends/networking/sdl_net/handlers/filespagehandler.h @@ -29,7 +29,6 @@ namespace Networking { class FilesPageHandler: public FilesBaseHandler { void handle(Client &client); - void handleErrorMessage(Client &client, Common::String message); /** * Lists the directory . diff --git a/backends/networking/sdl_net/handlers/indexpagehandler.cpp b/backends/networking/sdl_net/handlers/indexpagehandler.cpp index 0d7256c235..da5cd2d3f9 100644 --- a/backends/networking/sdl_net/handlers/indexpagehandler.cpp +++ b/backends/networking/sdl_net/handlers/indexpagehandler.cpp @@ -21,47 +21,33 @@ */ #include "backends/networking/sdl_net/handlers/indexpagehandler.h" +#include "backends/networking/sdl_net/handlerutils.h" #include "backends/networking/sdl_net/localwebserver.h" -#include "backends/saves/default/default-saves.h" -#include "common/archive.h" -#include "common/config-manager.h" -#include "common/file.h" -#include "common/savefile.h" #include "common/translation.h" #include "gui/storagewizarddialog.h" namespace Networking { -#define INDEX_PAGE_NAME ".index.html" - IndexPageHandler::IndexPageHandler(): CommandSender(nullptr) {} IndexPageHandler::~IndexPageHandler() {} 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 == "") { - replace(response, "{message}", _("This is a local webserver index page.")); - LocalWebserver::setClientGetHandler(client, response); + HandlerUtils::setMessageHandler(client, _("This is a local webserver index page.")); return; } _code = code; sendCommand(GUI::kStorageCodePassedCmd, 0); - replace(response, "{message}", _("ScummVM got the code and already connects to your cloud storage!")); - LocalWebserver::setClientGetHandler(client, response); + HandlerUtils::setMessageHandler(client, _("ScummVM got the code and already connects to your cloud storage!")); } /// public -Common::String IndexPageHandler::code() { return _code; } +Common::String IndexPageHandler::code() const { return _code; } ClientHandlerCallback IndexPageHandler::getHandler() { return new Common::Callback(this, &IndexPageHandler::handle); diff --git a/backends/networking/sdl_net/handlers/indexpagehandler.h b/backends/networking/sdl_net/handlers/indexpagehandler.h index f10ab63b84..0e256b503f 100644 --- a/backends/networking/sdl_net/handlers/indexpagehandler.h +++ b/backends/networking/sdl_net/handlers/indexpagehandler.h @@ -37,7 +37,7 @@ public: IndexPageHandler(); virtual ~IndexPageHandler(); - Common::String code(); + Common::String code() const; virtual ClientHandlerCallback getHandler(); }; diff --git a/backends/networking/sdl_net/handlers/resourcehandler.cpp b/backends/networking/sdl_net/handlers/resourcehandler.cpp index 160f78fedb..1205c4aa7d 100644 --- a/backends/networking/sdl_net/handlers/resourcehandler.cpp +++ b/backends/networking/sdl_net/handlers/resourcehandler.cpp @@ -21,6 +21,7 @@ */ #include "backends/networking/sdl_net/handlers/resourcehandler.h" +#include "backends/networking/sdl_net/handlerutils.h" #include "backends/networking/sdl_net/localwebserver.h" namespace Networking { @@ -37,7 +38,7 @@ void ResourceHandler::handle(Client &client) { if (filename.size() && filename[0] == '.') return; // if file not found, don't set handler either - Common::SeekableReadStream *file = getArchiveFile(filename); + Common::SeekableReadStream *file = HandlerUtils::getArchiveFile(filename); if (file == nullptr) return; LocalWebserver::setClientGetHandler(client, file, 200, LocalWebserver::determineMimeType(filename)); -- cgit v1.2.3