diff options
-rw-r--r-- | src/db/upnp/Device.cxx | 71 | ||||
-rw-r--r-- | src/db/upnp/Util.cxx | 21 | ||||
-rw-r--r-- | src/db/upnp/Util.hxx | 5 |
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 ¤t = 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); |