Commit 6e555522 authored by Max Kellermann's avatar Max Kellermann

db/upnp/ixmlwrap: getFirstElementValue() returns const char *

Eliminate the std::string bloat.
parent e569f82d
...@@ -59,6 +59,16 @@ public: ...@@ -59,6 +59,16 @@ public:
} }
}; };
static bool
ReadResultTag(UPnPDirContent &dirbuf, IXML_Document *response, Error &error)
{
const char *p = ixmlwrap::getFirstElementValue(response, "Result");
if (p == nullptr)
p = "";
return dirbuf.parse(p, error);
}
bool bool
ContentDirectoryService::readDirSlice(UpnpClient_Handle hdl, ContentDirectoryService::readDirSlice(UpnpClient_Handle hdl,
const char *objectId, int offset, const char *objectId, int offset,
...@@ -100,9 +110,9 @@ ContentDirectoryService::readDirSlice(UpnpClient_Handle hdl, ...@@ -100,9 +110,9 @@ ContentDirectoryService::readDirSlice(UpnpClient_Handle hdl,
DirBResFree cleaner(&response); DirBResFree cleaner(&response);
int didread = -1; int didread = -1;
std::string tbuf = ixmlwrap::getFirstElementValue(response, "NumberReturned"); const char *value = ixmlwrap::getFirstElementValue(response, "NumberReturned");
if (!tbuf.empty()) if (value != nullptr)
didread = atoi(tbuf.c_str()); didread = atoi(value);
if (count == -1 || count == 0) { if (count == -1 || count == 0) {
// TODO: what's this? // TODO: what's this?
...@@ -110,13 +120,11 @@ ContentDirectoryService::readDirSlice(UpnpClient_Handle hdl, ...@@ -110,13 +120,11 @@ ContentDirectoryService::readDirSlice(UpnpClient_Handle hdl,
return false; return false;
} }
tbuf = ixmlwrap::getFirstElementValue(response, "TotalMatches"); value = ixmlwrap::getFirstElementValue(response, "TotalMatches");
if (!tbuf.empty()) if (value != nullptr)
*totalp = atoi(tbuf.c_str()); *totalp = atoi(value);
tbuf = ixmlwrap::getFirstElementValue(response, "Result");
if (!dirbuf.parse(tbuf, error)) if (!ReadResultTag(dirbuf, response, error))
return false; return false;
*didreadp = didread; *didreadp = didread;
...@@ -189,10 +197,10 @@ ContentDirectoryService::search(UpnpClient_Handle hdl, ...@@ -189,10 +197,10 @@ ContentDirectoryService::search(UpnpClient_Handle hdl,
DirBResFree cleaner(&response); DirBResFree cleaner(&response);
int count = -1; int count = -1;
std::string tbuf = const char *value =
ixmlwrap::getFirstElementValue(response, "NumberReturned"); ixmlwrap::getFirstElementValue(response, "NumberReturned");
if (!tbuf.empty()) if (value != nullptr)
count = atoi(tbuf.c_str()); count = atoi(value);
if (count == -1 || count == 0) { if (count == -1 || count == 0) {
// TODO: what's this? // TODO: what's this?
...@@ -202,13 +210,11 @@ ContentDirectoryService::search(UpnpClient_Handle hdl, ...@@ -202,13 +210,11 @@ ContentDirectoryService::search(UpnpClient_Handle hdl,
offset += count; offset += count;
tbuf = ixmlwrap::getFirstElementValue(response, "TotalMatches"); value = ixmlwrap::getFirstElementValue(response, "TotalMatches");
if (!tbuf.empty()) if (value != nullptr)
total = atoi(tbuf.c_str()); total = atoi(value);
tbuf = ixmlwrap::getFirstElementValue(response, "Result");
if (!dirbuf.parse(tbuf, error)) if (!ReadResultTag(dirbuf, response, error))
return false; return false;
} }
...@@ -291,7 +297,7 @@ ContentDirectoryService::getMetadata(UpnpClient_Handle hdl, ...@@ -291,7 +297,7 @@ ContentDirectoryService::getMetadata(UpnpClient_Handle hdl,
return false; return false;
} }
std::string tbuf = ixmlwrap::getFirstElementValue(response, "Result"); bool success = ReadResultTag(dirbuf, response, error);
ixmlDocument_free(response); ixmlDocument_free(response);
return dirbuf.parse(tbuf, error); return success;
} }
...@@ -186,8 +186,8 @@ protected: ...@@ -186,8 +186,8 @@ protected:
}; };
bool bool
UPnPDirContent::parse(const std::string &input, Error &error) UPnPDirContent::parse(const char *input, Error &error)
{ {
UPnPDirParser parser(*this); UPnPDirParser parser(*this);
return parser.Parse(input.data(), input.length(), true, error); return parser.Parse(input, strlen(input), true, error);
} }
...@@ -58,7 +58,7 @@ public: ...@@ -58,7 +58,7 @@ public:
* actually global, nothing really bad will happen if you mix * actually global, nothing really bad will happen if you mix
* up... * up...
*/ */
bool parse(const std::string &didltext, Error &error); bool parse(const char *didltext, Error &error);
}; };
#endif /* _UPNPDIRCONTENT_H_X_INCLUDED_ */ #endif /* _UPNPDIRCONTENT_H_X_INCLUDED_ */
...@@ -19,10 +19,10 @@ ...@@ -19,10 +19,10 @@
namespace ixmlwrap { namespace ixmlwrap {
std::string const char *
getFirstElementValue(IXML_Document *doc, const char *name) getFirstElementValue(IXML_Document *doc, const char *name)
{ {
std::string ret; const char *ret = nullptr;
IXML_NodeList *nodes = IXML_NodeList *nodes =
ixmlDocument_getElementsByTagName(doc, name); ixmlDocument_getElementsByTagName(doc, name);
......
...@@ -24,10 +24,10 @@ ...@@ -24,10 +24,10 @@
namespace ixmlwrap { namespace ixmlwrap {
/** /**
* Retrieve the text content for the first element of given * Retrieve the text content for the first element of given
* name. Returns an empty string if the element does not * name. Returns nullptr if the element does not
* contain a text node * contain a text node
*/ */
std::string getFirstElementValue(IXML_Document *doc, const char *getFirstElementValue(IXML_Document *doc,
const char *name); const char *name);
}; };
......
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