void SSDPExtension::GetDeviceList( HTTPRequest *pRequest ) { LOG(VB_UPNP, LOG_DEBUG, "SSDPExtension::GetDeviceList"); QString sXML; QTextStream os(&sXML, QIODevice::WriteOnly); uint nDevCount, nEntryCount; SSDPCache::Instance()->OutputXML(os, &nDevCount, &nEntryCount); NameValues list; list.push_back( NameValue("DeviceCount", (int)nDevCount)); list.push_back( NameValue("DevicesAllocated", SSDPCacheEntries::g_nAllocated)); list.push_back( NameValue("CacheEntriesFound", (int)nEntryCount)); list.push_back( NameValue("CacheEntriesAllocated", DeviceLocation::g_nAllocated)); list.push_back( NameValue("DeviceList", sXML)); pRequest->FormatActionResponse(list); pRequest->m_eResponseType = ResponseTypeXML; pRequest->m_nResponseStatus = 200; }
void UPnpCMGR::HandleGetProtocolInfo( HTTPRequest *pRequest ) { NameValues list; list.push_back( NameValue("Source", GetValue<QString>("SourceProtocolInfo"))); list.push_back( NameValue("Sink", GetValue<QString>("SinkProtocolInfo"))); pRequest->FormatActionResponse(list); }
void UPnpCMGR::HandleGetCurrentConnectionIDs ( HTTPRequest *pRequest ) { NameValues list; list.push_back( NameValue("ConnectionIDs", GetValue<QString>("CurrentConnectionIDs"))); pRequest->FormatActionResponse(list); }
void UPnpMSRR::HandleRegisterDevice( HTTPRequest *pRequest ) { /* Sure, register, we don't really care */ VERBOSE(VB_UPNP, QString("UPnpMSRR::HandleRegisterDevice")); NameValues list; list.push_back(NameValue("Result", "1")); pRequest->FormatActionResponse(list); }
void UPnpCMGR::HandleGetFeatureList(HTTPRequest* pRequest) { NameValues list; QString sResults = m_features.toXML(); list.push_back(NameValue("FeatureList", sResults)); pRequest->FormatActionResponse(list); }
void UPnpCMGR::HandleGetCurrentConnectionInfo( HTTPRequest *pRequest ) { unsigned short nId = pRequest->m_mapParams[ "ConnectionID" ].toUShort(); if ( nId != 0) { UPnp::FormatErrorResponse( pRequest, UPnPResult_CMGR_InvalidConnectionRef ); return; } NameValues list; list.push_back(NameValue( "RcsID" , "-1" )); list.push_back(NameValue( "AVTransportID" , "-1" )); list.push_back(NameValue( "ProtocolInfo" , "http-get:*:*:*" )); list.push_back(NameValue( "PeerConnectionManager", "/" )); list.push_back(NameValue( "PeerConnectionID" , "-1" )); list.push_back(NameValue( "Direction" , "Output" )); list.push_back(NameValue( "Status" , "Unknown" )); pRequest->FormatActionResponse(list); }
void UPnpMSRR::HandleIsAuthorized( HTTPRequest *pRequest ) { /* Always tell the user they are authorized to access this data */ VERBOSE(VB_UPNP, QString("UPnpMSRR::HandleIsAuthorized")); NameValues list; list.push_back(NameValue("Result", "1")); list.back().AddAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes"); list.back().AddAttribute("dt:dt", "int"); pRequest->FormatActionResponse(list); }
void UPnpCDS::HandleGetSystemUpdateID( HTTPRequest *pRequest ) { NameValues list; LOG(VB_UPNP, LOG_INFO, QString("UPnpCDS::ProcessRequest : %1 : %2") .arg(pRequest->m_sBaseUrl) .arg(pRequest->m_sMethod)); unsigned short nId = GetValue<unsigned short>("SystemUpdateID"); list.push_back(NameValue("Id", nId)); pRequest->FormatActionResponse(list); }
void UPnpMSRR::HandleIsValidated( HTTPRequest *pRequest ) { /* You are valid sir */ VERBOSE(VB_UPNP, QString("UPnpMSRR::HandleIsValidated")); NameValues list; list.push_back(NameValue("Result", "1")); list.back().AddAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes"); list.back().AddAttribute( "dt:dt", "int"); pRequest->FormatActionResponse(list); }
void UPnpCDS::HandleGetSortCapabilities( HTTPRequest *pRequest ) { NameValues list; LOG(VB_UPNP, LOG_INFO, QString("UPnpCDS::ProcessRequest : %1 : %2") .arg(pRequest->m_sBaseUrl) .arg(pRequest->m_sMethod)); // -=>TODO: Need to implement based on CDS Extension Capabilities list.push_back( NameValue("SortCaps", "dc:title,dc:creator,dc:date,upnp:class,res@size")); pRequest->FormatActionResponse(list); }
void UPnpCDS::HandleSearch( HTTPRequest *pRequest ) { UPnpCDSExtensionResults *pResult = NULL; UPnpCDSRequest request; UPnPResultCode eErrorCode = UPnPResult_InvalidAction; QString sErrorDesc = ""; short nNumberReturned = 0; short nTotalMatches = 0; short nUpdateID = 0; QString sResultXML; DetermineClient( pRequest, &request ); request.m_sObjectId = pRequest->m_mapParams[ "ObjectID" ]; request.m_sContainerID = pRequest->m_mapParams[ "ContainerID" ]; request.m_sFilter = pRequest->m_mapParams[ "Filter" ]; request.m_nStartingIndex = pRequest->m_mapParams[ "StartingIndex" ].toLong(); request.m_nRequestedCount = pRequest->m_mapParams[ "RequestedCount"].toLong(); request.m_sSortCriteria = pRequest->m_mapParams[ "SortCriteria" ]; request.m_sSearchCriteria = pRequest->m_mapParams[ "SearchCriteria"]; LOG(VB_UPNP, LOG_INFO, QString("UPnpCDS::HandleSearch ObjectID=%1, ContainerId=%2") .arg(request.m_sObjectId) .arg(request.m_sContainerID)); // ---------------------------------------------------------------------- // Break the SearchCriteria into it's parts // -=>TODO: This DOES NOT handle ('s or other complex expressions // ---------------------------------------------------------------------- QRegExp rMatch( "\\b(or|and)\\b" ); rMatch.setCaseSensitivity(Qt::CaseInsensitive); request.m_sSearchList = request.m_sSearchCriteria.split( rMatch, QString::SkipEmptyParts); request.m_sSearchClass = "object"; // Default to all objects. // ---------------------------------------------------------------------- // -=>TODO: Need to process all expressions in searchCriteria... for now, // Just focus on the "upnp:class derivedfrom" expression // ---------------------------------------------------------------------- for ( QStringList::Iterator it = request.m_sSearchList.begin(); it != request.m_sSearchList.end(); ++it ) { if ((*it).contains("upnp:class derivedfrom", Qt::CaseInsensitive)) { QStringList sParts = (*it).split(' ', QString::SkipEmptyParts); if (sParts.count() > 2) { request.m_sSearchClass = sParts[2].trimmed(); request.m_sSearchClass.remove( '"' ); break; } } } // ---------------------------------------------------------------------- LOG(VB_UPNP, LOG_INFO, QString("UPnpCDS::ProcessRequest \n" ": url = %1 \n" ": Method = %2 \n" ": ObjectId = %3 \n" ": SearchCriteria = %4 \n" ": Filter = %5 \n" ": StartingIndex = %6 \n" ": RequestedCount = %7 \n" ": SortCriteria = %8 \n" ": SearchClass = %9" ) .arg( pRequest->m_sBaseUrl ) .arg( pRequest->m_sMethod ) .arg( request.m_sObjectId ) .arg( request.m_sSearchCriteria) .arg( request.m_sFilter ) .arg( request.m_nStartingIndex ) .arg( request.m_nRequestedCount) .arg( request.m_sSortCriteria ) .arg( request.m_sSearchClass )); #if 0 bool bSearchDone = false; #endif UPnpCDSExtensionList::iterator it = m_extensions.begin(); for (; (it != m_extensions.end()) && !pResult; ++it) pResult = (*it)->Search(&request); if (pResult != NULL) { eErrorCode = pResult->m_eErrorCode; sErrorDesc = pResult->m_sErrorDesc; if (eErrorCode == UPnPResult_Success) { FilterMap filter = (FilterMap) request.m_sFilter.split(','); nNumberReturned = pResult->m_List.count(); nTotalMatches = pResult->m_nTotalMatches; nUpdateID = pResult->m_nUpdateID; sResultXML = pResult->GetResultXML(filter); #if 0 bSearchDone = true; #endif } delete pResult; } #if 0 nUpdateID = 0; LOG(VB_UPNP, LOG_DEBUG, sResultXML); #endif if (eErrorCode == UPnPResult_Success) { NameValues list; QString sResults = DIDL_LITE_BEGIN; sResults += sResultXML; sResults += DIDL_LITE_END; list.push_back(NameValue("Result", sResults)); list.push_back(NameValue("NumberReturned", nNumberReturned)); list.push_back(NameValue("TotalMatches", nTotalMatches)); list.push_back(NameValue("UpdateID", nUpdateID)); pRequest->FormatActionResponse(list); } else UPnp::FormatErrorResponse( pRequest, eErrorCode, sErrorDesc ); }
void UPnpCDS::HandleBrowse( HTTPRequest *pRequest ) { UPnpCDSExtensionResults *pResult = NULL; UPnpCDSRequest request; DetermineClient( pRequest, &request ); request.m_sObjectId = pRequest->m_mapParams[ "ObjectID" ]; request.m_sContainerID = pRequest->m_mapParams[ "ContainerID" ]; request.m_sParentId = "0"; request.m_eBrowseFlag = GetBrowseFlag( pRequest->m_mapParams[ "BrowseFlag" ] ); request.m_sFilter = pRequest->m_mapParams[ "Filter" ]; request.m_nStartingIndex = pRequest->m_mapParams[ "StartingIndex" ].toLong(); request.m_nRequestedCount = pRequest->m_mapParams[ "RequestedCount"].toLong(); request.m_sSortCriteria = pRequest->m_mapParams[ "SortCriteria" ]; #if 0 LOG(VB_UPNP, LOG_DEBUG, QString("UPnpCDS::ProcessRequest \n" ": url = %1 \n" ": Method = %2 \n" ": ObjectId = %3 \n" ": BrowseFlag = %4 \n" ": Filter = %5 \n" ": StartingIndex = %6 \n" ": RequestedCount = %7 \n" ": SortCriteria = %8 " ) .arg( pRequest->m_sBaseUrl ) .arg( pRequest->m_sMethod ) .arg( request.m_sObjectId ) .arg( request.m_eBrowseFlag ) .arg( request.m_sFilter ) .arg( request.m_nStartingIndex ) .arg( request.m_nRequestedCount) .arg( request.m_sSortCriteria )); #endif UPnPResultCode eErrorCode = UPnPResult_CDS_NoSuchObject; QString sErrorDesc = ""; short nNumberReturned = 0; short nTotalMatches = 0; short nUpdateID = 0; QString sResultXML; FilterMap filter = (FilterMap) request.m_sFilter.split(','); LOG(VB_UPNP, LOG_INFO, QString("UPnpCDS::HandleBrowse ObjectID=%1, ContainerId=%2") .arg(request.m_sObjectId) .arg(request.m_sContainerID)); if (request.m_sObjectId == "0") { // ------------------------------------------------------------------ // This is for the root object... lets handle it. // ------------------------------------------------------------------ switch( request.m_eBrowseFlag ) { case CDS_BrowseMetadata: { // ----------------------------------------------------------- // Return Root Object Only // ----------------------------------------------------------- eErrorCode = UPnPResult_Success; nNumberReturned = 1; nTotalMatches = 1; nUpdateID = m_root.m_nUpdateId; m_root.SetChildCount( m_extensions.count() ); sResultXML = m_root.toXml(filter); break; } case CDS_BrowseDirectChildren: { // Loop Through each extension and Build the Root Folders // -=>TODO: Need to handle StartingIndex & RequestedCount eErrorCode = UPnPResult_Success; nTotalMatches = m_extensions.count(); nUpdateID = m_root.m_nUpdateId; if (request.m_nRequestedCount == 0) request.m_nRequestedCount = nTotalMatches; short nStart = Max( request.m_nStartingIndex, short( 0 )); short nCount = Min( nTotalMatches, request.m_nRequestedCount ); UPnpCDSRequest childRequest; DetermineClient( pRequest, &request ); childRequest.m_sParentId = "0"; childRequest.m_eBrowseFlag = CDS_BrowseMetadata; childRequest.m_sFilter = ""; childRequest.m_nStartingIndex = 0; childRequest.m_nRequestedCount = 1; childRequest.m_sSortCriteria = ""; for (uint i = nStart; (i < (uint)m_extensions.size()) && (nNumberReturned < nCount); i++) { UPnpCDSExtension *pExtension = m_extensions[i]; childRequest.m_sObjectId = pExtension->m_sExtensionId; pResult = pExtension->Browse( &childRequest ); if (pResult != NULL) { if (pResult->m_eErrorCode == UPnPResult_Success) { sResultXML += pResult->GetResultXML(filter); nNumberReturned ++; } delete pResult; } } break; } default: break; } } else { // ------------------------------------------------------------------ // Look for a CDS Extension that knows how to handle this ObjectID // ------------------------------------------------------------------ UPnpCDSExtensionList::iterator it = m_extensions.begin(); for (; (it != m_extensions.end()) && !pResult; ++it) { LOG(VB_UPNP, LOG_INFO, QString("UPNP Browse : Searching for : %1 / ObjectID : %2") .arg((*it)->m_sExtensionId).arg(request.m_sObjectId)); pResult = (*it)->Browse(&request); } if (pResult != NULL) { eErrorCode = pResult->m_eErrorCode; sErrorDesc = pResult->m_sErrorDesc; if (eErrorCode == UPnPResult_Success) { nNumberReturned = pResult->m_List.count(); nTotalMatches = pResult->m_nTotalMatches; nUpdateID = pResult->m_nUpdateID; sResultXML = pResult->GetResultXML(filter); } delete pResult; } } // ---------------------------------------------------------------------- // Output Results of Browse Method // ---------------------------------------------------------------------- if (eErrorCode == UPnPResult_Success) { NameValues list; QString sResults = DIDL_LITE_BEGIN; sResults += sResultXML; sResults += DIDL_LITE_END; list.push_back(NameValue("Result", sResults)); list.push_back(NameValue("NumberReturned", nNumberReturned)); list.push_back(NameValue("TotalMatches", nTotalMatches)); list.push_back(NameValue("UpdateID", nUpdateID)); pRequest->FormatActionResponse(list); } else UPnp::FormatErrorResponse ( pRequest, eErrorCode, sErrorDesc ); }
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; }