summaryrefslogtreecommitdiff
path: root/cmps/serverlib/src/CommandHandler.cc
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;
}