aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/db/upnp/Device.cxx71
-rw-r--r--src/db/upnp/Util.cxx21
-rw-r--r--src/db/upnp/Util.hxx5
3 files changed, 50 insertions, 47 deletions
diff --git a/src/db/upnp/Device.cxx b/src/db/upnp/Device.cxx
index 2f39e8829..dd1a8f43c 100644
--- a/src/db/upnp/Device.cxx
+++ b/src/db/upnp/Device.cxx
@@ -33,61 +33,64 @@
*/
class UPnPDeviceParser final : public CommonExpatParser {
UPnPDevice &m_device;
- std::vector<std::string> m_path;
+
+ std::string *value;
+
UPnPService m_tservice;
public:
UPnPDeviceParser(UPnPDevice& device)
- :m_device(device) {}
+ :m_device(device),
+ value(nullptr) {}
protected:
virtual void StartElement(const XML_Char *name, const XML_Char **) {
- m_path.push_back(name);
- }
-
- 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]) {
+ switch (name[0]) {
case 'c':
- if (!current.compare("controlURL"))
- m_tservice.controlURL = std::move(str);
+ if (strcmp(name, "controlURL") == 0)
+ value = &m_tservice.controlURL;
break;
case 'd':
- if (!current.compare("deviceType"))
- m_device.deviceType = std::move(str);
+ if (strcmp(name, "deviceType") == 0)
+ value = &m_device.deviceType;
break;
case 'f':
- if (!current.compare("friendlyName"))
- m_device.friendlyName = std::move(str);
+ if (strcmp(name, "friendlyName") == 0)
+ value = &m_device.friendlyName;
break;
case 'm':
- if (!current.compare("manufacturer"))
- m_device.manufacturer = std::move(str);
- else if (!current.compare("modelName"))
- m_device.modelName = std::move(str);
+ if (strcmp(name, "manufacturer") == 0)
+ value = &m_device.manufacturer;
+ else if (strcmp(name, "modelName") == 0)
+ value = &m_device.modelName;
break;
case 's':
- if (!current.compare("serviceType"))
- m_tservice.serviceType = std::move(str);
+ if (strcmp(name, "serviceType") == 0)
+ value = &m_tservice.serviceType;
break;
case 'U':
- if (!current.compare("UDN"))
- m_device.UDN = std::move(str);
- else if (!current.compare("URLBase"))
- m_device.URLBase = std::move(str);
+ if (strcmp(name, "UDN") == 0)
+ value = &m_device.UDN;
+ else if (strcmp(name, "URLBase") == 0)
+ value = &m_device.URLBase;
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
diff --git a/src/db/upnp/Util.cxx b/src/db/upnp/Util.cxx
index 9b223aca9..76710c9ab 100644
--- a/src/db/upnp/Util.cxx
+++ b/src/db/upnp/Util.cxx
@@ -18,7 +18,6 @@
*/
#include "Util.hxx"
-#include "util/CharUtil.hxx"
#include <string>
#include <map>
@@ -28,17 +27,19 @@
#include <upnp/ixml.h>
/** Get rid of white space at both ends */
-std::string
-trimstring(const char *p, size_t length)
+void
+trimstring(std::string &s, const char *ws)
{
- while (length > 0 && IsWhitespaceOrNull(p[length - 1]))
- --length;
-
- const char *end = p + length;
- while (p != end && IsWhitespaceOrNull(*p))
- ++p;
+ auto pos = s.find_first_not_of(ws);
+ if (pos == std::string::npos) {
+ s.clear();
+ return;
+ }
+ 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
diff --git a/src/db/upnp/Util.hxx b/src/db/upnp/Util.hxx
index 5812c5d9f..005dd3360 100644
--- a/src/db/upnp/Util.hxx
+++ b/src/db/upnp/Util.hxx
@@ -28,9 +28,8 @@
std::string
caturl(const std::string& s1, const std::string& s2);
-gcc_pure
-std::string
-trimstring(const char *p, size_t length);
+void
+trimstring(std::string &s, const char *ws = " \t\n");
std::string
path_getfather(const std::string &s);