Arduino DLNA Server
Loading...
Searching...
No Matches
DLNAControlPointRequestParser.h
Go to the documentation of this file.
1#pragma once
2
3#include "IUDPService.h"
4#include "Schedule.h"
5#include "Scheduler.h"
6
7namespace tiny_dlna {
8
16 public:
18 DlnaLogger.log(DlnaLogLevel::Debug, "Raw UDP packet: %s", req.data.c_str());
19 if (req.data.startsWith("NOTIFY")) {
20 return parseNotifyReply(req);
21 } else if (req.data.startsWith("HTTP/1.1 200 OK")) {
22 return parseMSearchReply(req);
23 } else if (req.data.startsWith("M-SEARCH")) {
24 DlnaLogger.log(DlnaLogLevel::Debug, "M-SEARCH request ignored");
25 } else {
26 DlnaLogger.log(DlnaLogLevel::Info, "Not handled: %s", req.data);
27 }
28 return nullptr;
29 }
30
31 protected:
33 MSearchReplyCP* result = new MSearchReplyCP();
34 // Accept different common header capitalizations
35 parse(req.data, "Location:", result->location);
36 parse(req.data, "USN:", result->usn);
37 parse(req.data, "ST:", result->search_target);
38 // Debug: log parsed fields to help diagnose missing Location/ST
40 "parseMSearchReply parsed -> LOCATION='%s' USN='%s' ST='%s'",
41 result->location.c_str(), result->usn.c_str(),
42 result->search_target.c_str());
43 return result;
44 }
45
47 NotifyReplyCP* result = new NotifyReplyCP();
48 parse(req.data, "NOTIFY:", result->delivery_path);
49 parse(req.data, "NTS:", result->nts);
50 parse(req.data, "NT:", result->search_target);
51 parse(req.data, "Location:", result->location);
52 parse(req.data, "USN:", result->usn);
53 parse(req.data, "Host:", result->delivery_host_and_port);
54 parse(req.data, "SID:", result->subscription_id);
55 parse(req.data, "SEQ:", result->event_key);
56 parse(req.data, "<e:propertyset", result->xml, "</e:propertyset>");
57 return result;
58 }
59
60 // Case-insensitive parse: searches for tag regardless of capitalization
61 bool parse(Str& in, const char* tag, Str& result, const char* end = "\r\n") {
62 result.clearAll();
63 // create lower-case copies for case-insensitive search using std::string
64 Str sin = in.c_str();
65 Str stag = tag;
66 sin.toLowerCase();
67 stag.toLowerCase();
68
69 int start_pos = sin.indexOf(stag.c_str());
70 if (start_pos >= 0) {
71 // find end position in the original buffer to preserve casing
72 int end_pos = sin.indexOf(end, start_pos);
73 start_pos += strlen(tag);
74 if (end_pos < 0) end_pos = in.indexOf("\n", start_pos);
75 if (end_pos >= 0) {
76 result.substrView(in.c_str(), start_pos, end_pos);
77 //DlnaLogger.log(DlnaLogLevel::Debug, "%s substrView (%d,%d)->%s", tag, start_pos, end_pos, result.c_str());
78 result.trim();
79 return true;
80 }
81 }
82 return false;
83 }
84};
85
86} // namespace tiny_dlna
Translates DLNA UDP Requests to Schedule so that we can schedule a reply.
Definition: DLNAControlPointRequestParser.h:15
MSearchReplyCP * parseMSearchReply(RequestData &req)
Definition: DLNAControlPointRequestParser.h:32
Schedule * parse(RequestData &req)
Definition: DLNAControlPointRequestParser.h:17
NotifyReplyCP * parseNotifyReply(RequestData &req)
Definition: DLNAControlPointRequestParser.h:46
bool parse(Str &in, const char *tag, Str &result, const char *end="\r\n")
Definition: DLNAControlPointRequestParser.h:61
void log(DlnaLogLevel current_level, const char *fmt...)
Print log message.
Definition: Logger.h:40
Processing at control point to handle a MSearchReply from the device.
Definition: Schedule.h:122
Str usn
Definition: Schedule.h:126
Str location
Definition: Schedule.h:125
Str search_target
Definition: Schedule.h:127
Represents a notification/notify reply scheduled for control-point processing.
Definition: Schedule.h:163
Str delivery_host_and_port
Definition: Schedule.h:167
Str xml
Definition: Schedule.h:171
Str event_key
Definition: Schedule.h:170
Str subscription_id
Definition: Schedule.h:169
Str delivery_path
Definition: Schedule.h:168
Str nts
Definition: Schedule.h:166
virtual void substrView(StrView &from, int start, int end)
copies a substring into the current string
Definition: StrView.h:493
virtual void clearAll()
Definition: StrView.h:559
virtual int indexOf(const char c, int start=0)
Definition: StrView.h:275
virtual bool startsWith(const char *str)
checks if the string starts with the indicated substring
Definition: StrView.h:184
virtual void trim()
remove leading and traling spaces
Definition: StrView.h:520
void toLowerCase()
Converts the string to lowercase letters.
Definition: StrView.h:634
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()
provides the string value as const char*
Definition: Str.h:187
Definition: Allocator.h:6
LoggerClass DlnaLogger
Definition: Logger.cpp:5
Provides information of the received UDP which consists of the (xml) data and the peer address and po...
Definition: IUDPService.h:23
Str data
Definition: IUDPService.h:24
An individual Schedule (to send out UDP messages)
Definition: Schedule.h:17