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
95
96
97
98
99
100
101
|
/**
* ======================== legal notice ======================
*
* File: MediaListHandler.cc
* Created: 5. Juli 2012, 08
* 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 <MediaListHandler.h>
#include <AbstractListAssembler.h>
#include <FSMediaScanner.h>
#include <HTTPRequest.h>
#include <HTTPResponse.h>
#include <StringBuilder.h>
#include <Logging.h>
cMediaListHandler::cMediaListHandler()
{
}
cMediaListHandler::~cMediaListHandler()
{
AssemblerList::iterator it = listAssemblers.begin();
while (it != listAssemblers.end()) {
delete it->second;
++it;
}
if (defaultListAssembler) delete defaultListAssembler;
}
cAbstractListAssembler *cMediaListHandler::ListAssembler(const char* ID)
{
if (!ID) return defaultListAssembler;
cAbstractListAssembler *rv = listAssemblers[ID];
if (rv) return rv;
return defaultListAssembler;
}
cHTTPResponse *cMediaListHandler::ProcessRequest(cHTTPRequest& Request)
{
isyslog("cMediaListHandler::ProcessRequest ...");
cHTTPResponse *res = NULL;
cAbstractListAssembler *la = ListAssembler(Request.Url().Parameter("format"));
const char *hdStart = Request.Url().Parameter("start");
const char *hdDelta = Request.Url().Parameter("limit");
int start = 0;
int delta = 40;
if (hdStart) start = atol(hdStart);
if (hdDelta) delta = atol(hdDelta);
if (!la) return new cHTTPResponse(HTTP_NotFound);
res = new cHTTPResponse(HTTP_OK);
res->SetContentType(la->MediaType());
la->AssembleList(res->StringBuilder(), FSMediaScanner()->MediaPool(), FSMediaScanner()->Categories(), start, delta);
return res;
}
void cMediaListHandler::Usage(cStringBuilder& sb)
{
isyslog("start of cMediaListHandler::Usage() ...");
sb.Append("returns a list of known/supported media on this machine. To access any media from the list, ");
sb.Append("use the path as uri (using the http protocol).<br/>");
sb.Append("<strong>supported parameters:</strong><ul>");
sb.Append("<dl><dt>start=#</dt>");
sb.Append("<dd>used to step list by chunks, where <em>#</em> stands for the index of the first element to retrieve</dd>");
sb.Append("<dt>limit=#</dt>");
sb.Append("<dd>gives the chunksize (default is 40), where <em>#</em> stands for the number of elements to retrieve</dd>");
sb.Append("<dt>format=json</dt>");
sb.Append("<dd>default format is html, so if you like to get the list in json format, use this parameter</dd>");
sb.Append("</dl></ul>");
isyslog("end of cMediaListHandler::Usage() ...");
}
void cMediaListHandler::SetDefaultListAssembler(cAbstractListAssembler* assembler)
{
defaultListAssembler = assembler;
}
void cMediaListHandler::SetListAssembler(const char* ID, cAbstractListAssembler* assembler)
{
listAssemblers[ID] = assembler;
}
|