Arduino DLNA Server
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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"
7 #include "dlna/DLNADevice.h"
8 
9 namespace tiny_dlna {
10 
18  public:
19  void parse(DLNADevice& 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:
34  DLNADevice* p_device = nullptr;
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 
46  void parseVersion(DLNADevice& result) {
47  parseInt(0, "<major>", result.version_major);
48  parseInt(0, "<minor>", result.version_minor);
49  }
50 
51  void parseDevice(DLNADevice& result) {
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);
61  parseServices();
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(DlnaDebug, "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(DlnaDebug, "device xml %s : %s", name, result);
95  end = str.indexOf(">", end_str);
96  } else {
97  result = nullptr;
98  }
99  return end;
100  }
101 
102  void parseIcons(DLNADevice& device) {
103  int pos = 0;
104  do {
105  pos = parseIcon(device, pos);
106  } while (pos > 0);
107  }
108 
109  int parseIcon(DLNADevice& 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 
125  void parseServices() {
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: DLNADevice.h:27
const char * model_number
Definition: DLNADevice.h:184
const char * model_description
Definition: DLNADevice.h:181
const char * friendly_name
Definition: DLNADevice.h:178
const char * device_type
Definition: DLNADevice.h:177
const char * manufacturer_url
Definition: DLNADevice.h:180
const char * model_url
Definition: DLNADevice.h:183
const char * model_name
Definition: DLNADevice.h:182
const char * manufacturer
Definition: DLNADevice.h:179
const char * base_url
Definition: DLNADevice.h:174
void addService(DLNAServiceInfo s)
Adds a service defintion.
Definition: DLNADevice.h:110
Url device_url
Definition: DLNADevice.h:170
int version_minor
Definition: DLNADevice.h:173
int version_major
Definition: DLNADevice.h:172
void addIcon(Icon icon)
Definition: DLNADevice.h:142
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:486
virtual int indexOf(const char c, int start=0)
Definition: StrView.h:269
int toInt()
Converts the string to an int.
Definition: StrView.h:589
virtual int length()
Definition: StrView.h:373
virtual const char * c_str()
provides the string value as const char*
Definition: StrView.h:369
virtual void swap(StrView &str)
Definition: StrView.h:94
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
const char * substrView(char *in, int pos, int end)
extract string, add to string repository and return repository string
Definition: XMLDeviceParser.h:38
DLNADevice * p_device
Definition: XMLDeviceParser.h:34
void parse(DLNADevice &result, StringRegistry &strings, const char *xmlStr)
Definition: XMLDeviceParser.h:19
StringRegistry * p_strings
Definition: XMLDeviceParser.h:35
void parseServices()
Definition: XMLDeviceParser.h:125
int parseIcon(DLNADevice &device, int pos)
Definition: XMLDeviceParser.h:109
StrView str
Definition: XMLDeviceParser.h:33
int parseStr(int pos, const char *name, const char *&result)
Definition: XMLDeviceParser.h:86
int parseStr(const char *name, const char *&result)
Definition: XMLDeviceParser.h:64
void parseDevice(DLNADevice &result)
Definition: XMLDeviceParser.h:51
int parseService(int pos)
Definition: XMLDeviceParser.h:132
void parseVersion(DLNADevice &result)
Definition: XMLDeviceParser.h:46
void parseIcons(DLNADevice &device)
Definition: XMLDeviceParser.h:102
Definition: Allocator.h:6
@ DlnaDebug
Definition: Logger.h:16
LoggerClass DlnaLogger
Definition: Logger.cpp:5