17#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
18#include <QStringConverter>
36 QTextStream &ts, std::chrono::microseconds ttLastNotified)
const
40 ts <<
"<?xml version=\"1.0\"?>" << Qt::endl
41 <<
"<e:propertyset xmlns:e=\"urn:schemas-upnp-org:event-1-0\">" << Qt::endl;
43 for (
auto *prop : std::as_const(
m_map))
45 if ( ttLastNotified < prop->m_ttLastChanged )
49 ts <<
"<e:property>" << Qt::endl;
50 ts <<
"<" << prop->m_sName <<
">";
51 ts << prop->ToString();
52 ts <<
"</" << prop->m_sName <<
">";
53 ts <<
"</e:property>" << Qt::endl;
57 ts <<
"</e:propertyset>" << Qt::endl;
68 QString sEventMethodName,
69 const QString &sSharePath) :
71 m_sEventMethodName(std::move(sEventMethodName)),
72 m_nSubscriptionDuration(
73 XmlConfiguration().GetDuration<std::chrono::seconds>(
"UPnP/SubscriptionDuration", 30min))
105 LOG(VB_GENERAL, LOG_ERR,
"Exceeded maximum guarranteed range of "
106 "m_nHoldCount short [-128..127]");
107 LOG(VB_GENERAL, LOG_ERR,
108 "UPnP may not exhibit strange behavior or crash mythtv");
141 return QStringList(
"/" );
158 LOG(VB_UPNP, LOG_INFO, QString(
"Eventing::ProcessRequest - Method (%1)")
214 if ( sCallBack.length() != 0 )
220 if ( sSID.length() != 0 )
226 if ( sNT !=
"upnp:event" )
235 sCallBack = sCallBack.mid( 1, sCallBack.indexOf(
">") - 1);
238 if ( sTimeout.startsWith(
"Second-") )
241 auto nValue = std::chrono::seconds(sTimeout.section(
"-", 1).toInt(&ok));
269 if ( sSID.length() != 0 )
271 sSID = sSID.mid( 5 );
277 if (pInfo !=
nullptr)
304 if ((sCallBack.length() != 0) || (sNT.length() != 0))
310 sSID = sSID.mid( 5 );
327 auto tt = nowAsDuration<std::chrono::microseconds>();
340 if (tt < (*it)->m_ttExpires)
363 if (pInfo ==
nullptr)
367#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
368 QTextStream tsBody( &aBody, QIODevice::WriteOnly );
369 tsBody.setCodec(QTextCodec::codecForName(
"UTF-8"));
371 QTextStream tsBody(&aBody, QIODeviceBase::WriteOnly);
372 tsBody.setEncoding(QStringConverter::Utf8);
385 auto *pBuffer =
new QByteArray();
386#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
387 QTextStream tsMsg( pBuffer, QIODevice::WriteOnly );
388 tsMsg.setCodec(QTextCodec::codecForName(
"UTF-8"));
390 QTextStream tsMsg(pBuffer, QIODeviceBase::WriteOnly);
391 tsMsg.setEncoding(QStringConverter::Utf8);
398 int nPort = (pInfo->
m_qURL.port()>=0) ? pInfo->
m_qURL.port() : 80;
399 QString sHost = QString(
"%1:%2" ).arg( pInfo->
m_qURL.host() )
402 tsMsg <<
"NOTIFY " << pInfo->
m_qURL.path() <<
" HTTP/1.1\r\n";
403 tsMsg <<
"HOST: " << sHost <<
"\r\n";
404 tsMsg <<
"CONTENT-TYPE: \"text/xml\"\r\n";
405 tsMsg <<
"Content-Length: " << QString::number( aBody.size() ) <<
"\r\n";
406 tsMsg <<
"NT: upnp:event\r\n";
407 tsMsg <<
"NTS: upnp:propchange\r\n";
408 tsMsg <<
"SID: uuid:" << pInfo->
m_sUUID <<
"\r\n";
409 tsMsg <<
"SEQ: " << QString::number( pInfo->
m_nKey ) <<
"\r\n";
418 LOG(VB_UPNP, LOG_INFO,
419 QString(
"UPnp::Eventing::NotifySubscriber( %1 ) : %2 Variables")
420 .arg( sHost ).arg(nCount));
427 pEventTask->DecrRef();
void HandleUnsubscribe(HTTPRequest *pRequest)
QString m_sEventMethodName
void HandleSubscribe(HTTPRequest *pRequest)
bool ProcessRequest(HTTPRequest *pRequest) override
void NotifySubscriber(SubscriberInfo *pInfo)
QStringList GetBasePaths() override
void ExecutePostProcess() override
Eventing(const QString &sExtensionName, QString sEventMethodName, const QString &sSharePath)
SubscriberInfo * m_pInitializeSubscriber
Subscribers m_subscribers
std::chrono::seconds m_nSubscriptionDuration
HttpResponseType m_eResponseType
void FormatErrorResponse(bool bServerError, const QString &sFaultString, const QString &sDetails)
QString GetRequestHeader(const QString &sKey, const QString &sDefault)
IPostProcess * m_pPostProcess
QStringMap m_mapRespHeaders
uint BuildNotifyBody(QTextStream &ts, std::chrono::microseconds ttLastNotified) const
std::chrono::microseconds m_ttLastNotified
unsigned long IncrementKey()
std::chrono::seconds m_nDuration
void AddTask(std::chrono::milliseconds msec, Task *pTask)
Add a task to run in the future.
static TaskQueue * Instance()
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
@ UPnPResult_InvalidAction