127 active ?
"true" :
"false");
140 auto writer = [](Print& out,
void* ref) ->
size_t {
143 written += out.print(
"<TransportState val=\"");
144 written += out.print(self->transport_state.c_str());
145 written += out.print(
"\"/>");
170 auto writer = [](Print& out,
void* ref) ->
size_t {
173 written += out.print(
"<Volume val=\"");
174 written += out.print(self->current_volume);
175 written += out.print(
"\"/>");
191 auto writer = [](Print& out,
void* ref) ->
size_t {
194 written += out.print(
"<Mute val=\"");
195 written += out.print(self->is_muted ? 1 : 0);
196 written += out.print(
"\"/>");
220 bool play(
const char* urlStr) {
221 if (urlStr ==
nullptr)
return false;
238 auto writer = [](Print& out,
void* ref) ->
size_t {
241 written += out.print(
"<CurrentTrackURI val=\"");
242 written += out.print(self->current_uri.c_str());
243 written += out.print(
"\"/>\n");
244 written += out.print(
"<TransportState val=\"");
245 written += out.print(self->transport_state.c_str());
246 written += out.print(
"\"/>");
257 if (urlStr ==
nullptr)
return false;
268 auto writer = [](Print& out,
void* ref) ->
size_t {
271 written += out.print(
"<CurrentTrackURI val=\"");
272 written += out.print(self->current_uri.c_str());
273 written += out.print(
"\"/>\n");
292 auto writer = [](Print& out,
void* ref) ->
size_t {
295 written += out.print(
"<TransportState val=\"");
296 written += out.print(self->getTransportState());
297 written += out.print(
"\"/>");
320 auto writer = [](Print& out,
void* ref) ->
size_t {
323 written += out.print(
"<TransportState val=\"");
324 written += out.print(self->transport_state.c_str());
325 written += out.print(
"\"/>");
326 written += out.print(
"<CurrentPlayMode val=\"NORMAL\"/>");
327 written += out.print(
"<CurrentTrackURI val=\"\"/>");
328 written += out.print(
"<RelativeTimePosition val=\"00:00:00\"/>");
329 written += out.print(
"<CurrentTransportActions val=\"Play\"/>");
338 return static_cast<size_t>(posMs / 1000);
343 auto writer = [](Print& out,
void* ref) ->
size_t {
347 int h =
static_cast<int>(self->getRelativeTimePositionSec() / 3600);
349 static_cast<int>((self->getRelativeTimePositionSec() % 3600) / 60);
350 int s =
static_cast<int>(self->getRelativeTimePositionSec() % 60);
351 written += out.print(
"<RelativeTimePosition val=\"");
353 if (h < 10) written += out.print(
'0');
354 written += out.print(h);
355 written += out.print(
':');
356 if (m < 10) written += out.print(
'0');
357 written += out.print(m);
358 written += out.print(
':');
359 if (s < 10) written += out.print(
'0');
360 written += out.print(s);
361 written += out.print(
"\"/>");
379 for (
size_t i = 0; i <
rules.size(); ++i) {
381 rules[i].handler = handler;
385 rules.push_back({suffix, handler});
399 const char*
st =
"urn:schemas-upnp-org:device:MediaRenderer:1";
400 const char*
usn =
"uuid:09349455-2941-4cf7-9847-1dd5ab210e97";
412 std::function<
size_t(Print&,
void*)> changeWriter) {
421 auto writer = [](Print& out,
void* ref) ->
size_t {
424 tmp.
printf(
"<TransportState val=\"%s\"/>",
425 self->transport_state.c_str());
426 if (!self->current_uri.isEmpty()) {
427 tmp.
printf(
"<CurrentTrackURI val=\"%s\"/>",
428 self->current_uri.c_str());
431 "<RelativeTimePosition val=\"%02d:%02d:%02d\"/>",
432 static_cast<int>(self->getRelativeTimePositionSec() / 3600),
433 static_cast<int>((self->getRelativeTimePositionSec() % 3600) / 60),
434 static_cast<int>(self->getRelativeTimePositionSec() % 60));
435 tmp.
printf(
"<CurrentTransportActions val=\"%s\"/>",
436 self->getCurrentTransportActions());
437 return out.print(tmp.
c_str());
445 auto writer = [](Print& out,
void* ref) ->
size_t {
448 tmp.
printf(
"<Volume val=\"%d\"/>", self->current_volume);
449 tmp.
printf(
"<Mute val=\"%d\"/>", self->is_muted ? 1 : 0);
450 return out.print(tmp.
c_str());
460 auto writer = [](Print& out,
void* ref) ->
size_t {
462 return out.print(
"<CurrentConnectionIDs>0</CurrentConnectionIDs>");
483 char mimeBuf[64] = {0};
485 didl,
"<res",
"protocolInfo=", 3, mimeBuf,
sizeof(mimeBuf))) {
493 server->
reply(
"text/xml", [](Print& out) {
501 server->
reply(
"text/xml", [](Print& out) {
509 server->
reply(
"text/xml", [](Print& out) {
533 const char* requestPath,
538 StrView request_path_str(requestPath);
539 if (request_path_str.
contains(
"/AVT/"))
541 else if (request_path_str.
contains(
"/RC/"))
543 else if (request_path_str.
contains(
"/CM/"))
552 avt.
setup(
"urn:schemas-upnp-org:service:AVTransport:1",
553 "urn:upnp-org:serviceId:AVTransport",
"/AVT/service.xml",
556 [](
HttpServer* server,
const char* requestPath,
576 "urn:schemas-upnp-org:service:ConnectionManager:1",
577 "urn:upnp-org:serviceId:ConnectionManager",
"/CM/service.xml",
579 [](
HttpServer* server,
const char* requestPath,
582 [](
HttpServer* server,
const char* requestPath,
600 rc.
setup(
"urn:schemas-upnp-org:service:RenderingControl:1",
601 "urn:upnp-org:serviceId:RenderingControl",
"/RC/service.xml",
604 [](
HttpServer* server,
const char* requestPath,
631 const char* serviceId,
632 const char* values =
nullptr) {
636 "s:Envelope",
"xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"");
638 result += xp.
printf(
"<u:%s xmlns:u=\"urn:schemas-upnp-org:service:%s:1\">",
639 replyName, serviceId);
644 result += xp.
printf(
"%s", values);
647 result += xp.
printf(
"</u:%s>", replyName);
679 values.
printf(
"<CurrentMute>%d</CurrentMute>",
isMuted ? 1 : 0);
681 "RenderingControl", values.
c_str());
687 values.
printf(
"<CurrentVolume>%d</CurrentVolume>", volume);
689 "RenderingControl", values.
c_str());
709 for (
const auto& rule :
rules) {
710 if (action_str.
endsWith(rule.suffix)) {
711 return rule.handler(
this, action, server);
726 server.reply(
"text/xml",
735 server.reply(
"text/xml",
744 server.reply(
"text/xml",
749 rules.push_back({
"GetCurrentTransportActions",
753 returnValue.
printf(
"<u:return>%s</u:return>",
757 xml,
"QueryStateVariableResponse",
"AVTransport",
758 returnValue.
c_str());
759 server.reply(
"text/xml",
xml.c_str(),
xml.length());
765 const char* uri = action.getArgumentValue(
"CurrentURI");
769 server.reply(
"text/xml",
776 "SetAVTransportURI called with invalid SOAP payload");
777 server.replyError(400,
"Invalid Action");
784 int desiredVolume = action.getArgumentIntValue(
"DesiredVolume");
794 bool desiredMute = action.getArgumentIntValue(
"DesiredMute") != 0;
806 server.reply(
"text/xml", str.
c_str());
815 server.reply(
"text/xml", str.
c_str());
Represents a request to invoke a remote DLNA service action.
Definition: Action.h:109
const char * action
Definition: Action.h:159
Device Attributes and generation of XML using urn:schemas-upnp-org:device-1-0. We could just return a...
Definition: DLNADeviceInfo.h:27
void setDeviceType(const char *st)
Definition: DLNADeviceInfo.h:48
void addService(DLNAServiceInfo s)
Adds a service definition.
Definition: DLNADeviceInfo.h:143
void setModelName(const char *name)
Definition: DLNADeviceInfo.h:131
void setSerialNumber(const char *sn)
Definition: DLNADeviceInfo.h:135
void setManufacturer(const char *man)
Definition: DLNADeviceInfo.h:125
void setFriendlyName(const char *name)
Definition: DLNADeviceInfo.h:123
XMLPrinter xml
Definition: DLNADeviceInfo.h:215
bool is_active
Definition: DLNADeviceInfo.h:214
void setModelNumber(const char *number)
Definition: DLNADeviceInfo.h:133
void setBaseURL(const char *url)
Defines the base url.
Definition: DLNADeviceInfo.h:59
Setup of a Basic DLNA Device service. The device registers itself to the network and answers to the D...
Definition: DLNADevice.h:27
void end()
Stops the processing and releases the resources.
Definition: DLNADevice.h:85
void addChange(const char *serviceAbbrev, std::function< size_t(Print &, void *)> changeWriter, void *ref)
Definition: DLNADevice.h:156
bool begin(DLNADeviceInfo &device, IUDPService &udp, HttpServer &server)
start the
Definition: DLNADevice.h:30
static void parseActionRequest(HttpServer *server, const char *requestPath, HttpRequestHandlerLine *hl, ActionRequest &action)
Parses the SOAP content of a DLNA action request.
Definition: DLNADevice.h:275
static void eventSubscriptionHandler(HttpServer *server, const char *requestPath, HttpRequestHandlerLine *hl)
Static handler for SUBSCRIBE/UNSUBSCRIBE requests on service event URLs.
Definition: DLNADevice.h:189
bool loop()
call this method in the Arduino loop as often as possible
Definition: DLNADevice.h:104
Attributes needed for the DLNA Service Definition.
Definition: DLNAServiceInfo.h:16
const char * scpd_url
Definition: DLNAServiceInfo.h:35
http_callback control_cb
Definition: DLNAServiceInfo.h:40
http_callback scp_cb
Definition: DLNAServiceInfo.h:39
void setup(const char *type, const char *id, const char *scp, http_callback cbScp, const char *control, http_callback cbControl, const char *event, http_callback cbEvent)
Definition: DLNAServiceInfo.h:19
const char * control_url
Definition: DLNAServiceInfo.h:36
const char * subscription_namespace_abbrev
Definition: DLNAServiceInfo.h:49
const char * event_sub_url
Definition: DLNAServiceInfo.h:37
Used to register and process callbacks.
Definition: HttpRequestHandlerLine.h:19
void ** context
Definition: HttpRequestHandlerLine.h:39
A Simple Header only implementation of Http Server that allows the registration of callback functions...
Definition: HttpServer.h:25
void on(const char *url, TinyMethodID method, web_callback_fn fn, void *ctx[]=nullptr, int ctxCount=0)
register a generic handler
Definition: HttpServer.h:90
void replyOK()
write OK reply with 200 SUCCESS
Definition: HttpServer.h:380
void reply(const char *contentType, Stream &inputStream, int size, int status=200, const char *msg=SUCCESS)
write reply - copies data from input stream with header size
Definition: HttpServer.h:296
void replyError(int err, const char *msg="Internal Server Error")
Definition: HttpServer.h:388
void replyNotFound()
write 404 reply
Definition: HttpServer.h:383
Abstract Interface for UDP API.
Definition: IUDPService.h:33
void log(DlnaLogLevel current_level, const char *fmt...)
Print log message.
Definition: Logger.h:40
Class with does not do any output: it can be used to determine the length of the output.
Definition: NullPrint.h:12
Print to a dynamic string.
Definition: StrPrint.h:13
const char * c_str()
Definition: StrPrint.h:39
size_t printf(const char *fmt,...)
Definition: StrPrint.h:49
A simple wrapper to provide string functions on char*. If the underlying char* is a const we do not a...
Definition: StrView.h:18
virtual bool isEmpty()
checks if the string is empty
Definition: StrView.h:383
virtual bool endsWith(const char *str)
checks if the string ends with the indicated substring
Definition: StrView.h:191
virtual void set(const char *alt)
assigs a value
Definition: StrView.h:44
virtual bool contains(const char *str)
checks if the string contains a substring
Definition: StrView.h:284
String implementation which keeps the data on the heap. We grow the allocated memory only if the copy...
Definition: Str.h:22
const char * c_str() const
Definition: Str.h:186
Vector implementation which provides the most important methods as defined by std::vector....
Definition: Vector.h:19
static bool extractAttributeToken(const char *xml, const char *tagName, const char *attrName, int n, char *outBuf, size_t bufSize)
Extract the nth (1-based) colon-separated token from an attribute value located on the first occurren...
Definition: XMLAttributeParser.h:132
Definition: AllocationTracker.h:9
MediaEvent
Events emitted by the MediaRenderer to notify the application about playback and rendering control ch...
Definition: DLNAMediaRenderer.h:31
@ T_UNSUBSCRIBE
Definition: HttpHeader.h:46
@ T_SUBSCRIBE
Definition: HttpHeader.h:47
@ T_GET
Definition: HttpHeader.h:37
@ T_POST
Definition: HttpHeader.h:39
LoggerClass DlnaLogger
Definition: Logger.cpp:5
Functions to efficiently output XML. XML data contains a lot of redundancy so it is more memory effic...
Definition: XMLPrinter.h:55
size_t printNodeBegin(const char *node, const char *attributes=nullptr, const char *ns=nullptr)
Prints the beginning of an XML node.
Definition: XMLPrinter.h:249
size_t printf(const char *fmt,...)
printf-style helper that formats into an internal buffer and writes to the configured Print output.
Definition: XMLPrinter.h:183
size_t printNodeEnd(const char *node, const char *ns=nullptr)
Prints the end of an XML node.
Definition: XMLPrinter.h:287