void Eventing::NotifySubscriber( SubscriberInfo *pInfo ) { if (pInfo == NULL) return; QByteArray aBody; QTextStream tsBody( &aBody, QIODevice::WriteOnly ); tsBody.setCodec(QTextCodec::codecForName("UTF-8")); // ---------------------------------------------------------------------- // Build Body... Only send if there are changes // ---------------------------------------------------------------------- uint nCount = BuildNotifyBody(tsBody, pInfo->ttLastNotified); if (nCount) { // -=>TODO: Need to add support for more than one CallBack URL. QByteArray *pBuffer = new QByteArray(); // UPnpEventTask will delete this pointer. QTextStream tsMsg( pBuffer, QIODevice::WriteOnly ); tsMsg.setCodec(QTextCodec::codecForName("UTF-8")); // ---------------------------------------------------------------------- // Build Message Header // ---------------------------------------------------------------------- int nPort = (pInfo->qURL.port()>=0) ? pInfo->qURL.port() : 80; QString sHost = QString( "%1:%2" ).arg( pInfo->qURL.host() ) .arg( nPort ); tsMsg << "NOTIFY " << pInfo->qURL.path() << " HTTP/1.1\r\n"; tsMsg << "HOST: " << sHost << "\r\n"; tsMsg << "CONTENT-TYPE: \"text/xml\"\r\n"; tsMsg << "Content-Length: " << QString::number( aBody.size() ) << "\r\n"; tsMsg << "NT: upnp:event\r\n"; tsMsg << "NTS: upnp:propchange\r\n"; tsMsg << "SID: uuid:" << pInfo->sUUID << "\r\n"; tsMsg << "SEQ: " << QString::number( pInfo->nKey ) << "\r\n"; tsMsg << "\r\n"; tsMsg << aBody; tsMsg << flush; // ------------------------------------------------------------------ // Add new EventTask to the TaskQueue to do the actual sending. // ------------------------------------------------------------------ LOG(VB_UPNP, LOG_INFO, QString("UPnp::Eventing::NotifySubscriber( %1 ) : %2 Variables") .arg( sHost ).arg(nCount)); UPnpEventTask *pEventTask = new UPnpEventTask(QHostAddress( pInfo->qURL.host() ), nPort, pBuffer ); TaskQueue::Instance()->AddTask( 250, pEventTask ); // ------------------------------------------------------------------ // Update the subscribers Key & last Notified fields // ------------------------------------------------------------------ pInfo->IncrementKey(); gettimeofday( (&pInfo->ttLastNotified), NULL ); } }
void Eventing::NotifySubscriber( SubscriberInfo *pInfo ) { if (pInfo == NULL) return; int nCount = 0; QByteArray aBody; QTextStream tsBody( aBody, IO_WriteOnly ); tsBody.setEncoding( QTextStream::UnicodeUTF8 ); // ---------------------------------------------------------------------- // Build Body... Only send if there are changes // ---------------------------------------------------------------------- if (( nCount = BuildNotifyBody( tsBody, pInfo->ttLastNotified )) > 0) { // -=>TODO: Need to add support for more than one CallBack URL. QByteArray *pBuffer = new QByteArray(); // UPnpEventTask will delete this pointer. QTextStream tsMsg( *pBuffer, IO_WriteOnly ); tsMsg.setEncoding( QTextStream::UnicodeUTF8 ); // ---------------------------------------------------------------------- // Build Message Header // ---------------------------------------------------------------------- short nPort = pInfo->qURL.hasPort() ? pInfo->qURL.port() : 80; QString sHost = QString( "%1:%2" ).arg( pInfo->qURL.host() ) .arg( nPort ); tsMsg << "NOTIFY " << pInfo->qURL.path() << " HTTP/1.1\r\n"; tsMsg << "HOST: " << sHost << "\r\n"; tsMsg << "CONTENT-TYPE: \"text/xml\"\r\n"; tsMsg << "Content-Length: " << QString::number( aBody.size() ) << "\r\n"; tsMsg << "NT: upnp:event\r\n"; tsMsg << "NTS: upnp:propchange\r\n"; tsMsg << "SID: uuid:" << pInfo->sUUID << "\r\n"; tsMsg << "SEQ: " << QString::number( pInfo->nKey ) << "\r\n"; tsMsg << "\r\n"; tsMsg.writeRawBytes( aBody.data(), aBody.size() ); // ------------------------------------------------------------------ // Add new EventTask to the TaskQueue to do the actual sending. // ------------------------------------------------------------------ VERBOSE(VB_UPNP, QString("UPnp::Eventing::NotifySubscriber( %1 ) : %2 Variables").arg( sHost ).arg(nCount)); UPnpEventTask *pEventTask = new UPnpEventTask( pInfo->qURL.host(), nPort, pBuffer ); UPnp::g_pTaskQueue->AddTask( 250, pEventTask ); // ------------------------------------------------------------------ // Update the subscribers Key & last Notified fields // ------------------------------------------------------------------ pInfo->IncrementKey(); gettimeofday( &pInfo->ttLastNotified, NULL ); } }