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; 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.setCaseSensitive( FALSE ); request.m_sSearchList = QStringList::split( rMatch, request.m_sSearchCriteria ); 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", FALSE ) > 0) { QStringList sParts = QStringList::split( ' ', *it ); if (sParts.count() > 2) { request.m_sSearchClass = sParts[2].stripWhiteSpace(); 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 )); UPnpCDSExtension *pExtension = m_extensions.first(); //bool bSearchDone = false; while (( pExtension != NULL ) && (pResult == NULL)) { //VERBOSE(VB_UPNP, QString("UPNP Search : Searching for : %1 / ObjectID : %2").arg(pExtension->m_sExtensionId).arg(request.m_sObjectId)); pResult = pExtension->Search( &request ); pExtension = m_extensions.next(); } 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(); //bSearchDone = true; } delete pResult; } // nUpdateID = 0; //VERBOSE(VB_UPNP,sResultXML); if (eErrorCode == UPnPResult_Success) { NameValueList list; QString sResults = DIDL_LITE_BEGIN; sResults += sResultXML; sResults += DIDL_LITE_END; list.append( new NameValue( "Result" , sResults )); list.append( new NameValue( "NumberReturned", QString::number( nNumberReturned ))); list.append( new NameValue( "TotalMatches" , QString::number( nTotalMatches ))); list.append( new NameValue( "UpdateID" , QString::number( nUpdateID ))); pRequest->FormatActionResponse( &list ); } else UPnp::FormatErrorResponse( pRequest, eErrorCode, sErrorDesc ); }
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 ); }