void SSDPCache::Add( const QString &sURI, const QString &sUSN, const QString &sLocation, long sExpiresInSecs ) { // -------------------------------------------------------------- // Calculate when this cache entry should expire. // -------------------------------------------------------------- TaskTime ttExpires; gettimeofday ( (&ttExpires), NULL ); AddSecondsToTaskTime( ttExpires, sExpiresInSecs ); // -------------------------------------------------------------- // Get a Pointer to a Entries QDict... (Create if not found) // -------------------------------------------------------------- SSDPCacheEntries *pEntries = Find( sURI ); if (pEntries == NULL) { pEntries = new SSDPCacheEntries(); pEntries->AddRef(); m_cache.insert( sURI, pEntries ); } pEntries->AddRef(); // -------------------------------------------------------------- // See if the Entries Collection contains our USN... (Create if not found) // -------------------------------------------------------------- DeviceLocation *pEntry = pEntries->Find( sUSN ); if (pEntry == NULL) { pEntry = new DeviceLocation( sURI, sUSN, sLocation, ttExpires ); Lock(); pEntries->Insert( sUSN, pEntry ); Unlock(); NotifyAdd( sURI, sUSN, sLocation ); } else { pEntry->AddRef(); pEntry->m_sLocation = sLocation; pEntry->m_ttExpires = ttExpires; pEntry->Release(); } pEntries->Release(); }
void BackendSelection::customEvent(QEvent *event) { if (((MythEvent::Type)(event->type())) == MythEvent::MythEventMessage) { MythEvent *me = (MythEvent *)event; QString message = me->Message(); QString URI = me->ExtraData(0); QString URN = me->ExtraData(1); QString URL = me->ExtraData(2); VERBOSE(VB_UPNP, QString("BackendSelection::customEvent(%1, %2, %3, %4)") .arg(message).arg(URI).arg(URN).arg(URL)); if (message.startsWith("SSDP_ADD") && URI.startsWith("urn:schemas-mythtv-org:device:MasterMediaServer:")) { DeviceLocation *devLoc = SSDP::Instance()->Find(URI, URN); if (devLoc) { devLoc->AddRef(); AddItem(devLoc); // this does a Release() } } else if (message.startsWith("SSDP_REMOVE")) { //-=>Note: This code will never get executed until // SSDPCache is changed to handle NotifyRemove correctly RemoveItem(URN); } } else if (event->type() == DialogCompletionEvent::kEventType) { DialogCompletionEvent *dce = dynamic_cast<DialogCompletionEvent*>(event); if (!dce) return; QString resultid = dce->GetId(); if (resultid == "password") { m_pinCode = dce->GetResultText(); Accept(); } } }
void BackendSelection::Init(void) { EntryMap::Iterator it; EntryMap ourMap; DeviceLocation *pDevLoc; SSDPCacheEntries *pEntries = SSDPCache::Instance()->Find( gBackendURI ); if (!pEntries) { VERBOSE(VB_GENERAL, "Found zero backends, bailing"); return; } pEntries->AddRef(); pEntries->Lock(); EntryMap *pMap = pEntries->GetEntryMap(); for (it = pMap->begin(); it != pMap->end(); ++it) { pDevLoc = (DeviceLocation *)*it; if (!pDevLoc) continue; pDevLoc->AddRef(); ourMap.insert(pDevLoc->m_sUSN, pDevLoc); } pEntries->Unlock(); pEntries->Release(); for (it = ourMap.begin(); it != ourMap.end(); ++it) { pDevLoc = (DeviceLocation *)*it; AddItem(pDevLoc); // this does a Release() } }
void SSDPCache::Dump() { int nCount = 0; if (VERBOSE_LEVEL_CHECK(VB_UPNP)) { Lock(); // ---------------------------------------------------------------------- // Build List of items to be removed // ---------------------------------------------------------------------- VERBOSE( VB_UPNP, "===============================================================================" ); VERBOSE( VB_UPNP, QString( " URI (type) - Found: %1 Entries - %2 have been Allocated. " ) .arg( m_cache.count() ) .arg( SSDPCacheEntries::g_nAllocated )); VERBOSE( VB_UPNP, " \t\tUSN (unique id)\t\t | Expires\t | Location" ); VERBOSE( VB_UPNP, "-------------------------------------------------------------------------------" ); for (SSDPCacheEntriesMap::Iterator it = m_cache.begin(); it != m_cache.end(); ++it ) { SSDPCacheEntries *pEntries = *it; if (pEntries != NULL) { VERBOSE( VB_UPNP, it.key() ); pEntries->Lock(); EntryMap *pMap = pEntries->GetEntryMap(); for (EntryMap::Iterator itEntry = pMap->begin(); itEntry != pMap->end(); ++itEntry ) { DeviceLocation *pEntry = *itEntry; if (pEntry != NULL) { nCount++; pEntry->AddRef(); VERBOSE( VB_UPNP, QString( " * \t\t%1\t | %2\t | %3 " ) .arg( pEntry->m_sUSN ) .arg( pEntry->ExpiresInSecs() ) .arg( pEntry->m_sLocation )); pEntry->Release(); } } VERBOSE( VB_UPNP, " "); pEntries->Unlock(); } } VERBOSE( VB_UPNP, "-------------------------------------------------------------------------------" ); VERBOSE( VB_UPNP, QString( " Found: %1 Entries - %2 have been Allocated. " ) .arg( nCount ) .arg( DeviceLocation::g_nAllocated )); VERBOSE( VB_UPNP, "===============================================================================" ); Unlock(); } }
void SSDPExtension::GetDeviceList( HTTPRequest *pRequest ) { SSDPCache* pCache = SSDPCache::Instance(); int nCount = 0; NameValues list; VERBOSE( VB_UPNP, "SSDPExtension::GetDeviceList" ); pCache->Lock(); QString sXML = ""; QTextStream os( &sXML, QIODevice::WriteOnly ); for (SSDPCacheEntriesMap::Iterator it = pCache->Begin(); it != pCache->End(); ++it ) { SSDPCacheEntries *pEntries = *it; if (pEntries != NULL) { os << "<Device uri='" << it.key() << "'>" << endl; pEntries->Lock(); EntryMap *pMap = pEntries->GetEntryMap(); for (EntryMap::Iterator itEntry = pMap->begin(); itEntry != pMap->end(); ++itEntry ) { DeviceLocation *pEntry = *itEntry; if (pEntry != NULL) { nCount++; pEntry->AddRef(); os << "<Service usn='" << pEntry->m_sUSN << "' expiresInSecs='" << pEntry->ExpiresInSecs() << "' url='" << pEntry->m_sLocation << "' />" << endl; pEntry->Release(); } } os << "</Device>" << endl; pEntries->Unlock(); } } os << flush; list.push_back( NameValue("DeviceCount" , pCache->Count() )); list.push_back( NameValue("DevicesAllocated" , SSDPCacheEntries::g_nAllocated)); list.push_back( NameValue("CacheEntriesFound" , nCount )); list.push_back( NameValue("CacheEntriesAllocated", DeviceLocation::g_nAllocated )); list.push_back( NameValue("DeviceList" , sXML )); pCache->Unlock(); pRequest->FormatActionResponse( list ); pRequest->m_eResponseType = ResponseTypeXML; pRequest->m_nResponseStatus = 200; }