Commit 9747cc9e authored by Max Kellermann's avatar Max Kellermann

db/upnp/Device: replace std::vector with a std::string pointer

parent 7b44dea4
...@@ -33,61 +33,64 @@ ...@@ -33,61 +33,64 @@
*/ */
class UPnPDeviceParser final : public CommonExpatParser { class UPnPDeviceParser final : public CommonExpatParser {
UPnPDevice &m_device; UPnPDevice &m_device;
std::vector<std::string> m_path;
std::string *value;
UPnPService m_tservice; UPnPService m_tservice;
public: public:
UPnPDeviceParser(UPnPDevice& device) UPnPDeviceParser(UPnPDevice& device)
:m_device(device) {} :m_device(device),
value(nullptr) {}
protected: protected:
virtual void StartElement(const XML_Char *name, const XML_Char **) { virtual void StartElement(const XML_Char *name, const XML_Char **) {
m_path.push_back(name); switch (name[0]) {
}
virtual void EndElement(const XML_Char *name) {
if (!strcmp(name, "service")) {
m_device.services.emplace_back(std::move(m_tservice));
m_tservice.clear();
}
m_path.pop_back();
}
virtual void CharacterData(const XML_Char *s, int len) {
const auto &current = m_path.back();
std::string str = trimstring(s, len);
switch (current[0]) {
case 'c': case 'c':
if (!current.compare("controlURL")) if (strcmp(name, "controlURL") == 0)
m_tservice.controlURL = std::move(str); value = &m_tservice.controlURL;
break; break;
case 'd': case 'd':
if (!current.compare("deviceType")) if (strcmp(name, "deviceType") == 0)
m_device.deviceType = std::move(str); value = &m_device.deviceType;
break; break;
case 'f': case 'f':
if (!current.compare("friendlyName")) if (strcmp(name, "friendlyName") == 0)
m_device.friendlyName = std::move(str); value = &m_device.friendlyName;
break; break;
case 'm': case 'm':
if (!current.compare("manufacturer")) if (strcmp(name, "manufacturer") == 0)
m_device.manufacturer = std::move(str); value = &m_device.manufacturer;
else if (!current.compare("modelName")) else if (strcmp(name, "modelName") == 0)
m_device.modelName = std::move(str); value = &m_device.modelName;
break; break;
case 's': case 's':
if (!current.compare("serviceType")) if (strcmp(name, "serviceType") == 0)
m_tservice.serviceType = std::move(str); value = &m_tservice.serviceType;
break; break;
case 'U': case 'U':
if (!current.compare("UDN")) if (strcmp(name, "UDN") == 0)
m_device.UDN = std::move(str); value = &m_device.UDN;
else if (!current.compare("URLBase")) else if (strcmp(name, "URLBase") == 0)
m_device.URLBase = std::move(str); value = &m_device.URLBase;
break; break;
} }
} }
virtual void EndElement(const XML_Char *name) {
if (value != nullptr) {
trimstring(*value);
value = nullptr;
} else if (!strcmp(name, "service")) {
m_device.services.emplace_back(std::move(m_tservice));
m_tservice.clear();
}
}
virtual void CharacterData(const XML_Char *s, int len) {
if (value != nullptr)
value->append(s, len);
}
}; };
bool bool
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
*/ */
#include "Util.hxx" #include "Util.hxx"
#include "util/CharUtil.hxx"
#include <string> #include <string>
#include <map> #include <map>
...@@ -28,17 +27,19 @@ ...@@ -28,17 +27,19 @@
#include <upnp/ixml.h> #include <upnp/ixml.h>
/** Get rid of white space at both ends */ /** Get rid of white space at both ends */
std::string void
trimstring(const char *p, size_t length) trimstring(std::string &s, const char *ws)
{ {
while (length > 0 && IsWhitespaceOrNull(p[length - 1])) auto pos = s.find_first_not_of(ws);
--length; if (pos == std::string::npos) {
s.clear();
const char *end = p + length; return;
while (p != end && IsWhitespaceOrNull(*p)) }
++p; s.replace(0, pos, std::string());
return std::string(p, end); pos = s.find_last_not_of(ws);
if (pos != std::string::npos && pos != s.length()-1)
s.replace(pos + 1, std::string::npos, std::string());
} }
std::string std::string
......
...@@ -28,9 +28,8 @@ ...@@ -28,9 +28,8 @@
std::string std::string
caturl(const std::string& s1, const std::string& s2); caturl(const std::string& s1, const std::string& s2);
gcc_pure void
std::string trimstring(std::string &s, const char *ws = " \t\n");
trimstring(const char *p, size_t length);
std::string std::string
path_getfather(const std::string &s); path_getfather(const std::string &s);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment