/** * ======================== legal notice ====================== * * File: CommandHandler.cc * Created: 5. Juli 2012, 16 * Author: Geronimo * 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 #include #include #include #include #include typedef struct { CommandCallback callback; void *opaque; } CallbackInfo; std::tr1::unordered_map supportedCommands; cCommandHandler::cCommandHandler() { } cCommandHandler::~cCommandHandler() { } void cCommandHandler::Cleanup() { std::tr1::unordered_map::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; }