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 Particle::do_show(std::ostream& out) const { internal::PrefixStream preout(&out); preout << "index: " << get_index() << (get_is_active()? " (active)":" (dead)"); preout << std::endl; if (get_is_part_of_model()) { { FloatKeys fks= get_float_keys(); if (!fks.empty()) { preout << "float attributes:" << std::endl; preout.set_prefix(" "); for (FloatKeys::const_iterator it= fks.begin(); it != fks.end(); ++it) { FloatKey k =*it; preout << k << ": " << get_model()->get_attribute(k, id_, false); preout << " (" << get_model()->get_derivative(k, id_, false) << ") "; preout << (get_is_optimized(k)?" (optimized)":""); preout << std::endl; } preout.set_prefix(""); } } show_attributes(get_model(), get_int_keys(), id_, "int", IdentityValue(), preout); show_attributes(get_model(), get_string_keys(), id_, "string", IdentityValue(), preout); show_attributes(get_model(), get_model()->internal::ParticleAttributeTable ::get_attribute_keys(id_) , id_, "particle", NameValue(get_model()), preout); show_attributes(get_model(), get_model()->internal::ObjectAttributeTable ::get_attribute_keys(id_) , id_, "object", DirectNameValue(), preout); show_attributes(get_model(), get_model()->internal ::ParticlesAttributeTable ::get_attribute_keys(id_), id_, "particles", SizeValue<NameValue>(NameValue(get_model())), preout); show_attributes(get_model(), get_model()->internal::ObjectsAttributeTable ::get_attribute_keys(id_), id_, "objects", SizeValue<DirectNameValue>(), preout); show_attributes(get_model(), get_model()->internal::IntsAttributeTable ::get_attribute_keys(id_), id_, "ints", SizeValue<IdentityValue>(), preout); } }
void UPnpDeviceDesc::_InternalLoad( QDomNode oNode, UPnpDevice *pCurDevice ) { QString pin = GetMythDB()->GetSetting( "SecurityPin", ""); pCurDevice->m_securityPin = !(pin.isEmpty() || pin == "0000"); for ( oNode = oNode.firstChild(); !oNode.isNull(); oNode = oNode.nextSibling() ) { QDomElement e = oNode.toElement(); if (e.isNull()) continue; // TODO: make this table driven (using offset within structure) if ( e.tagName() == "deviceType" ) SetStrValue( e, pCurDevice->m_sDeviceType); else if ( e.tagName() == "friendlyName" ) SetStrValue( e, pCurDevice->m_sFriendlyName ); else if ( e.tagName() == "manufacturer" ) SetStrValue( e, pCurDevice->m_sManufacturer ); else if ( e.tagName() == "manufacturerURL" ) SetStrValue( e, pCurDevice->m_sManufacturerURL ); else if ( e.tagName() == "modelDescription" ) SetStrValue( e, pCurDevice->m_sModelDescription); else if ( e.tagName() == "modelName" ) SetStrValue( e, pCurDevice->m_sModelName ); else if ( e.tagName() == "modelNumber" ) SetStrValue( e, pCurDevice->m_sModelNumber ); else if ( e.tagName() == "modelURL" ) SetStrValue( e, pCurDevice->m_sModelURL ); else if ( e.tagName() == "serialNumber" ) SetStrValue( e, pCurDevice->m_sSerialNumber ); else if ( e.tagName() == "UPC" ) SetStrValue( e, pCurDevice->m_sUPC ); else if ( e.tagName() == "presentationURL" ) SetStrValue( e, pCurDevice->m_sPresentationURL ); else if ( e.tagName() == "UDN" ) SetStrValue( e, pCurDevice->m_sUDN ); else if ( e.tagName() == "iconList" ) ProcessIconList( oNode, pCurDevice ); else if ( e.tagName() == "serviceList" ) ProcessServiceList( oNode, pCurDevice ); else if ( e.tagName() == "deviceList" ) ProcessDeviceList ( oNode, pCurDevice ); else if ( e.tagName() == "mythtv:X_secure" ) SetBoolValue( e, pCurDevice->m_securityPin ); else if ( e.tagName() == "mythtv:X_protocol" ) SetStrValue( e, pCurDevice->m_protocolVersion ); else { // Not one of the expected element names... add to extra list. QString sValue = ""; SetStrValue( e, sValue ); pCurDevice->m_lstExtra.push_back(NameValue(e.tagName(), sValue)); } } }
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 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; VERBOSE(VB_UPNP,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; VERBOSE(VB_UPNP,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 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 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; }
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"]; VERBOSE(VB_UPNP, 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; } } } // ---------------------------------------------------------------------- VERBOSE(VB_UPNP,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 )); //bool bSearchDone = false; 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); //bSearchDone = true; } delete pResult; } // nUpdateID = 0; //VERBOSE(VB_UPNP,sResultXML); 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" ]; /* VERBOSE(VB_UPNP,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 )); */ 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(','); VERBOSE(VB_UPNP, 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) { VERBOSE(VB_UPNP, 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 ); }