14 #if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
15 #include <QStringConverter>
26 #define LOC QString("SOAPClient: ")
36 QString sControlPath) :
37 m_url(std::move(url)), m_sNamespace(std::move(sNamespace)),
38 m_sControlPath(std::move(sControlPath))
48 const QString &sNamespace,
49 const QString &sControlPath)
52 if (sNamespace.isEmpty())
55 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Init() given blank namespace");
59 test.setPath(sControlPath);
63 LOG(VB_GENERAL, LOG_ERR,
LOC +
64 QString(
"Init() given invalid control URL %1")
65 .arg(test.toString()));
86 const QString &sName,
const QDomNode &baseNode)
const
88 QStringList parts = sName.split(
'/', Qt::SkipEmptyParts);
94 QStringList &sParts,
const QDomNode &curNode)
const
99 QString sName = sParts.front();
102 QDomNode child = curNode.namedItem(sName);
113 const QDomNode &node,
const QString &sName,
int nDefault)
const
115 QString sValue =
GetNodeValue(node, sName, QString::number(nDefault));
116 return sValue.toInt();
122 const QDomNode &node,
const QString &sName,
bool bDefault)
const
124 QString sDefault = (bDefault) ?
"true" :
"false";
126 if (sValue.isEmpty())
129 char ret = sValue[0].toLatin1();
132 case 't':
case 'T':
case 'y':
case 'Y':
case '1':
134 case 'f':
case 'F':
case 'n':
case 'N':
case '0':
144 const QDomNode &node,
const QString &sName,
const QString &sDefault)
const
150 QDomNode valNode =
FindNode(sName, node);
152 if (!valNode.isNull())
156 QDomText oText = valNode.firstChild().toText();
159 sValue = oText.nodeValue();
161 return QUrl::fromPercentEncoding(sValue.toUtf8());
192 path.append(sMethod);
195 url.setPort(
m_url.port() - 6);
200 QDomDocument xmlResult;
204 sErrDesc =
"No namespace given";
211 QHash<QByteArray, QByteArray>
headers;
213 headers.insert(
"Content-Type",
"text/xml; charset=\"utf-8\"");
214 QString soapHeader = QString(
"\"%1#%2\"").arg(
m_sNamespace, sMethod);
215 headers.insert(
"SOAPACTION", soapHeader.toUtf8());
216 headers.insert(
"User-Agent",
"Mozilla/9.876 (X11; U; Linux 2.2.12-20 i686, en) "
217 "Gecko/25250101 Netscape/5.432b1");
224 for (QStringMap::iterator it = list.begin(); it != list.end(); ++it)
226 query.addQueryItem(it.key(),*it);
236 LOG(VB_UPNP, LOG_DEBUG,
237 QString(
"SOAPClient(%1) sending:\n %2").arg(url.toString() ));
243 LOG(VB_GENERAL, LOG_ERR, QString(
"SOAPClient::SendSOAPRequest: request failed: %1")
244 .arg(url.toString()));
248 sXml = QString(aBuffer);
255 LOG(VB_UPNP, LOG_DEBUG,
"SOAPClient response:\n" +
256 QString(
"%1\n").arg(sXml));
263 #if QT_VERSION < QT_VERSION_CHECK(6,5,0)
266 if (!doc.setContent(sXml,
true, &sErrDesc, &ErrLineNum))
269 LOG(VB_UPNP, LOG_ERR,
270 QString(
"SendSOAPRequest(%1) - Invalid response from %2. Error %3: %4. Response: %5")
271 .arg(sMethod, url.toString(),
272 QString::number(nErrCode), sErrDesc, sXml));
276 auto parseResult = doc.setContent(sXml,QDomDocument::ParseOption::UseNamespaceProcessing);
280 LOG(VB_UPNP, LOG_ERR,
281 QString(
"SendSOAPRequest(%1) - Invalid response from %2. Error %3: %4. Response: %5")
282 .arg(sMethod, url.toString(),
283 QString::number(nErrCode), parseResult.errorMessage, sXml));