Arduino DLNA Server
Loading...
Searching...
No Matches
XMLDeviceParser.h
Go to the documentation of this file.
1#pragma once
2
3#include "Print.h"
4#include "assert.h"
5#include "basic/Icon.h"
6#include "basic/StrView.h"
8
9namespace tiny_dlna {
10
18 public:
19 void parse(DLNADeviceInfo& result, StringRegistry& strings, const char* xmlStr) {
20 p_strings = &strings;
21 StrView tmp(xmlStr);
22 str.swap(tmp);
23 Url empty_url;
24 result.base_url = nullptr;
25 result.device_url = empty_url;
26 p_device = &result;
27 parseVersion(result);
28 parseIcons(result);
29 parseDevice(result);
30 }
31
32 protected:
36
38 const char* substrView(char* in, int pos, int end) {
39 const int len = end - pos + 1;
40 char tmp[len];
41 StrView tmp_str(tmp, len);
42 tmp_str.substrView(in, pos, end);
43 return p_strings->add((char*)tmp_str.c_str());
44 }
45
47 parseInt(0, "<major>", result.version_major);
48 parseInt(0, "<minor>", result.version_minor);
49 }
50
52 parseStr("<deviceType>", result.device_type);
53 parseStr("<friendlyName>", result.friendly_name);
54 parseStr("<manufacturer>", result.manufacturer);
55 parseStr("<manufacturerURL>", result.manufacturer_url);
56 parseStr("<modelDescription>", result.model_description);
57 parseStr("<modelName>", result.model_name);
58 parseStr("<modelNumber>", result.model_number);
59 parseStr("<modelURL>", result.model_url);
60 parseStr("<URLBase>", result.base_url);
62 };
63
64 int parseStr(const char* name, const char*& result) {
65 return parseStr(0, name, result);
66 }
67
68 int parseInt(int pos, const char* name, int& result) {
69 char temp[50] = {0};
70 StrView temp_view(temp, 50);
71 int start_pos = str.indexOf(name, pos);
72 int end_pos = -1;
73 if (start_pos > 0) {
74 StrView tag(name);
75 start_pos += tag.length();
76 end_pos = str.indexOf("</", start_pos);
77 temp_view.substrView((char*)str.c_str(), start_pos, end_pos);
78 result = temp_view.toInt();
79 DlnaLogger.log(DlnaLogLevel::Debug, "device xml %s : %s / %d", name, temp_view.c_str(), result);
80
81 end_pos = str.indexOf(">", end_pos);
82 }
83 return end_pos;
84 }
85
86 int parseStr(int pos, const char* name, const char*& result) {
87 int start_pos = str.indexOf(name, pos);
88 int end = -1;
89 if (start_pos > 0) {
90 StrView tag(name);
91 start_pos += tag.length();
92 int end_str = str.indexOf("</", start_pos);
93 result = substrView((char*)str.c_str(), start_pos, end_str);
94 DlnaLogger.log(DlnaLogLevel::Debug, "device xml %s : %s", name, result);
95 end = str.indexOf(">", end_str);
96 } else {
97 result = nullptr;
98 }
99 return end;
100 }
101
103 int pos = 0;
104 do {
105 pos = parseIcon(device, pos);
106 } while (pos > 0);
107 }
108
109 int parseIcon(DLNADeviceInfo& device, int pos) {
110 Icon icon;
111 int result = -1;
112 int iconPos = str.indexOf("<icon>", pos);
113 if (iconPos > 0) {
114 parseStr(iconPos, "<mimetype>", icon.mime);
115 parseInt(iconPos, "<width>", icon.width);
116 parseInt(iconPos, "<height>", icon.height);
117 parseInt(iconPos, "<depth>", icon.depth);
118 parseStr(iconPos, "<url>", icon.icon_url);
119 device.addIcon(icon);
120 result = str.indexOf("</icon>", pos) + 7;
121 }
122 return result;
123 }
124
126 int pos = 0;
127 do {
128 pos = parseService(pos);
129 } while (pos > 0);
130 }
131
132 int parseService(int pos) {
133 DLNAServiceInfo service;
134 int result = -1;
135 int servicePos = str.indexOf("<service>", pos);
136 if (servicePos > 0) {
137 parseStr(servicePos, "<serviceType>", service.service_type);
138 parseStr(servicePos, "<serviceId>", service.service_id);
139 parseStr(servicePos, "<SCPDURL>", service.scpd_url);
140 parseStr(servicePos, "<controlURL>", service.control_url);
141 parseStr(servicePos, "<eventSubURL>", service.event_sub_url);
142 p_device->addService(service);
143 result = str.indexOf("</service>", pos) + 10;
144 }
145 return result;
146 }
147};
148
149} // namespace tiny_dlna
Device Attributes and generation of XML using urn:schemas-upnp-org:device-1-0. We could just return a...
Definition: DLNADeviceInfo.h:27
Url device_url
Definition: DLNADeviceInfo.h:195
const char * friendly_name
Definition: DLNADeviceInfo.h:203
int version_minor
Definition: DLNADeviceInfo.h:198
const char * manufacturer_url
Definition: DLNADeviceInfo.h:205
void addService(DLNAServiceInfo s)
Adds a service defintion.
Definition: DLNADeviceInfo.h:137
void addIcon(Icon icon)
Definition: DLNADeviceInfo.h:169
const char * model_url
Definition: DLNADeviceInfo.h:208
const char * model_name
Definition: DLNADeviceInfo.h:207
const char * model_description
Definition: DLNADeviceInfo.h:206
const char * model_number
Definition: DLNADeviceInfo.h:209
const char * base_url
Definition: DLNADeviceInfo.h:199
const char * manufacturer
Definition: DLNADeviceInfo.h:204
int version_major
Definition: DLNADeviceInfo.h:197
const char * device_type
Definition: DLNADeviceInfo.h:202
Attributes needed for the DLNA Service Definition.
Definition: DLNAServiceInfo.h:16
const char * scpd_url
Definition: DLNAServiceInfo.h:35
const char * service_type
Definition: DLNAServiceInfo.h:33
const char * service_id
Definition: DLNAServiceInfo.h:34
const char * control_url
Definition: DLNAServiceInfo.h:36
const char * event_sub_url
Definition: DLNAServiceInfo.h:37
Information about the icon.
Definition: Icon.h:10
const char * icon_url
Definition: Icon.h:16
int width
Definition: Icon.h:13
int height
Definition: Icon.h:14
const char * mime
Definition: Icon.h:12
int depth
Definition: Icon.h:15
void log(DlnaLogLevel current_level, const char *fmt...)
Print log message.
Definition: Logger.h:40
A simple wrapper to provide string functions on char*. If the underlying char* is a const we do not a...
Definition: StrView.h:19
virtual void substrView(StrView &from, int start, int end)
copies a substring into the current string
Definition: StrView.h:493
virtual const char * c_str()
provides the string value as const char*
Definition: StrView.h:376
virtual int indexOf(const char c, int start=0)
Definition: StrView.h:275
int toInt()
Converts the string to an int.
Definition: StrView.h:596
virtual int length()
Definition: StrView.h:380
virtual void swap(StrView &str)
Definition: StrView.h:99
Make sure that a string is stored only once.
Definition: StringRegistry.h:9
const char * add(char *in)
adds a string
Definition: StringRegistry.h:12
URL parser which breaks a full url string up into its individual parts.
Definition: Url.h:18
Parses an DLNA device xml string to fill the DLNADevice data structure.
Definition: XMLDeviceParser.h:17
int parseInt(int pos, const char *name, int &result)
Definition: XMLDeviceParser.h:68
void parseVersion(DLNADeviceInfo &result)
Definition: XMLDeviceParser.h:46
const char * substrView(char *in, int pos, int end)
extract string, add to string repository and return repository string
Definition: XMLDeviceParser.h:38
StringRegistry * p_strings
Definition: XMLDeviceParser.h:35
void parseServices()
Definition: XMLDeviceParser.h:125
StrView str
Definition: XMLDeviceParser.h:33
int parseStr(int pos, const char *name, const char *&result)
Definition: XMLDeviceParser.h:86
void parseDevice(DLNADeviceInfo &result)
Definition: XMLDeviceParser.h:51
int parseIcon(DLNADeviceInfo &device, int pos)
Definition: XMLDeviceParser.h:109
void parseIcons(DLNADeviceInfo &device)
Definition: XMLDeviceParser.h:102
int parseStr(const char *name, const char *&result)
Definition: XMLDeviceParser.h:64
int parseService(int pos)
Definition: XMLDeviceParser.h:132
void parse(DLNADeviceInfo &result, StringRegistry &strings, const char *xmlStr)
Definition: XMLDeviceParser.h:19
DLNADeviceInfo * p_device
Definition: XMLDeviceParser.h:34
Definition: Allocator.h:6
LoggerClass DlnaLogger
Definition: Logger.cpp:5