blob: 5449d250b592258ea0f448aa45b4f545d3c0d751 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
/**
* ======================== legal notice ======================
*
* File: CommandHandler.cc
* Created: 5. Juli 2012, 16
* 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;
}
|