diff options
Diffstat (limited to 'cmps/serverlib/src/CommandHandler.cc')
-rw-r--r-- | cmps/serverlib/src/CommandHandler.cc | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/cmps/serverlib/src/CommandHandler.cc b/cmps/serverlib/src/CommandHandler.cc new file mode 100644 index 0000000..b1a17b8 --- /dev/null +++ b/cmps/serverlib/src/CommandHandler.cc @@ -0,0 +1,94 @@ +/** + * ======================== legal notice ====================== + * + * File: CommandHandler.cc + * Created: 5. Juli 2012, 16:06 + * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a> + * Project: cmps - the backend (server) part of compound media player + * + * CMP - compound media player + * + * is a client/server mediaplayer intended to play any media from any workstation + * without the need to export or mount shares. cmps is an easy to use backend + * with a (ready to use) HTML-interface. Additionally the backend supports + * authentication via HTTP-digest authorization. + * cmpc is a client with vdr-like osd-menues. + * + * Copyright (c) 2012 Reinhard Mantey, some rights reserved! + * published under Creative Commons by-sa + * For details see http://creativecommons.org/licenses/by-sa/3.0/ + * + * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp + * + * -------------------------------------------------------------- + */ +#include <CommandHandler.h> +#include <tr1/unordered_map> +#include <HTTPRequest.h> +#include <HTTPResponse.h> +#include <StringBuilder.h> +#include <Logging.h> + +typedef struct { + CommandCallback callback; + void *opaque; +} CallbackInfo; +std::tr1::unordered_map<std::string, CallbackInfo *> supportedCommands; + + +cCommandHandler::cCommandHandler() +{ +} + +cCommandHandler::~cCommandHandler() +{ +} + +void cCommandHandler::Cleanup() +{ + std::tr1::unordered_map<std::string, CallbackInfo *>::iterator it = supportedCommands.begin(); + + while (it != supportedCommands.end()) { + free(it->second); + ++it; + } +} + +cHTTPResponse *cCommandHandler::ProcessRequest(cHTTPRequest& Request) +{ + const char *command = Request.GetHeader("what"); + CallbackInfo *info; + + isyslog("cCommandHandler::ProcessRequest ..."); + if (!command) { + esyslog("ERROR: no command in request"); + return new cHTTPResponse(HTTP_BadRequest); + } + info = supportedCommands[command]; + if (!info) { + esyslog("ERROR: command not registered/supported!"); + return new cHTTPResponse(HTTP_BadRequest); + } + if ((*info->callback)(info->opaque, Request)) { + esyslog("ERROR: failed to execute command!"); + return new cHTTPResponse(HTTP_InternalServerError); + } + isyslog("OK - all went well?!?"); + + return new cHTTPResponse(HTTP_NoContent); +} + +void cCommandHandler::Usage(cStringBuilder &sb) +{ + +} + +void cCommandHandler::RegisterCallback(const char* CommandID, CommandCallback cb, void* opaque) +{ + CallbackInfo *info = (CallbackInfo *)malloc(sizeof(CallbackInfo)); + + info->callback = cb; + info->opaque = opaque; + supportedCommands[CommandID] = info; +} + |