15#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
16#include <QStringConverter>
25#define LOC QString("SOAPClient: ")
35 QString sControlPath) :
36 m_url(
std::move(url)), m_sNamespace(
std::move(sNamespace)),
37 m_sControlPath(
std::move(sControlPath))
47 const QString &sNamespace,
48 const QString &sControlPath)
51 if (sNamespace.isEmpty())
54 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Init() given blank namespace");
58 test.setPath(sControlPath);
62 LOG(VB_GENERAL, LOG_ERR,
LOC +
63 QString(
"Init() given invalid control URL %1")
64 .arg(test.toString()));
85 const QString &sName,
const QDomNode &baseNode)
const
87 QStringList parts = sName.split(
'/', Qt::SkipEmptyParts);
93 QStringList &sParts,
const QDomNode &curNode)
const
98 QString sName = sParts.front();
101 QDomNode child = curNode.namedItem(sName);
112 const QDomNode &node,
const QString &sName,
int nDefault)
const
114 QString sValue =
GetNodeValue(node, sName, QString::number(nDefault));
115 return sValue.toInt();
121 const QDomNode &node,
const QString &sName,
bool bDefault)
const
123 QString sDefault = (bDefault) ?
"true" :
"false";
125 if (sValue.isEmpty())
128 char ret = sValue[0].toLatin1();
131 case 't':
case 'T':
case 'y':
case 'Y':
case '1':
133 case 'f':
case 'F':
case 'n':
case 'N':
case '0':
143 const QDomNode &node,
const QString &sName,
const QString &sDefault)
const
149 QDomNode valNode =
FindNode(sName, node);
151 if (!valNode.isNull())
155 QDomText oText = valNode.firstChild().toText();
158 sValue = oText.nodeValue();
160 return QUrl::fromPercentEncoding(sValue.toUtf8());
191 path.append(sMethod);
194 url.setPort(
m_url.port() - 6);
199 QDomDocument xmlResult;
203 sErrDesc =
"No namespace given";
210 QHash<QByteArray, QByteArray>
headers;
212 headers.insert(
"Content-Type",
"text/xml; charset=\"utf-8\"");
213 QString soapHeader = QString(
"\"%1#%2\"").arg(
m_sNamespace, sMethod);
214 headers.insert(
"SOAPACTION", soapHeader.toUtf8());
215 headers.insert(
"User-Agent",
"Mozilla/9.876 (X11; U; Linux 2.2.12-20 i686, en) "
216 "Gecko/25250101 Netscape/5.432b1");
223 for (QStringMap::iterator it = list.begin(); it != list.end(); ++it)
225 query.addQueryItem(it.key(),*it);
235 LOG(VB_UPNP, LOG_DEBUG,
236 QString(
"SOAPClient(%1) sending:\n %2").arg(url.toString() ));
242 LOG(VB_GENERAL, LOG_ERR, QString(
"SOAPClient::SendSOAPRequest: request failed: %1")
243 .arg(url.toString()));
247 sXml = QString(aBuffer);
254 LOG(VB_UPNP, LOG_DEBUG,
"SOAPClient response:\n" +
255 QString(
"%1\n").arg(sXml));
262#if QT_VERSION < QT_VERSION_CHECK(6,5,0)
265 if (!doc.setContent(sXml,
true, &sErrDesc, &ErrLineNum))
268 LOG(VB_UPNP, LOG_ERR,
269 QString(
"SendSOAPRequest(%1) - Invalid response from %2. Error %3: %4. Response: %5")
270 .arg(sMethod, url.toString(),
271 QString::number(nErrCode), sErrDesc, sXml));
275 auto parseResult = doc.setContent(sXml,QDomDocument::ParseOption::UseNamespaceProcessing);
279 LOG(VB_UPNP, LOG_ERR,
280 QString(
"SendSOAPRequest(%1) - Invalid response from %2. Error %3: %4. Response: %5")
281 .arg(sMethod, url.toString(),
282 QString::number(nErrCode), parseResult.errorMessage, sXml));
bool Init(const QUrl &url, const QString &sNamespace, const QString &sControlPath)
SOAPClient Initializer.
QDomNode FindNodeInternal(QStringList &sParts, const QDomNode &curNode) const
This is an internal function used to implement FindNode.
int GetNodeValue(const QDomNode &node, const QString &sName, int nDefault) const
Gets the named value using QDomNode as the baseNode in the search, returns default if it is not found...
QDomNode FindNode(const QString &sName, const QDomNode &baseNode) const
Used by GeNodeValue() methods to find the named node.
SOAPClient()=default
Empty SOAPClient constructor.
QDomDocument SendSOAPRequest(const QString &sMethod, QStringMap &list, int &nErrCode, QString &sErrDesc)
Actually sends the sMethod action to the command URL specified in the constructor (url+[/]+sControlPa...
MythDownloadManager * GetMythDownloadManager(void)
Gets the pointer to the MythDownloadManager singleton.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
@ UPnPResult_MythTV_XmlParseError
@ UPnPResult_MythTV_NoNamespaceGiven
QMap< QString, QString > QStringMap