void UPnpCDSExtension::CreateItems( UPnpCDSRequest *pRequest, UPnpCDSExtensionResults *pResults, int nNodeIdx, const QString &sKey, bool bAddRef ) { pResults->m_nTotalMatches = 0; pResults->m_nUpdateID = 1; UPnpCDSRootInfo *pInfo = GetRootInfo( nNodeIdx ); if (pInfo == NULL) return; pResults->m_nTotalMatches = GetCount( pInfo->column, sKey ); pResults->m_nUpdateID = 1; if (pRequest->m_nRequestedCount == 0) pRequest->m_nRequestedCount = SHRT_MAX; MSqlQuery query(MSqlQuery::InitCon()); if (query.isConnected()) { QString sWhere( "" ); QString sOrder( "" ); if ( sKey.length() > 0) { sWhere = QString( "WHERE %1=:KEY " ) .arg( pInfo->column ); } QString orderColumn( pInfo->orderColumn ); if (orderColumn.length() != 0) { sOrder = QString( "ORDER BY %1 " ) .arg( orderColumn ); } QString sSQL = QString( "%1 %2 LIMIT %3, %4" ) .arg( GetItemListSQL( pInfo->column ) ) .arg( sWhere + sOrder ) .arg( pRequest->m_nStartingIndex ) .arg( pRequest->m_nRequestedCount ); query.prepare ( sSQL ); if ( sKey.length() ) query.bindValue(":KEY", sKey ); if (query.exec()) { while(query.next()) AddItem( pRequest, pRequest->m_sObjectId, pResults, bAddRef, query ); } } }
UPnpCDSExtensionResults *UPnpCDSExtension::ProcessAll ( UPnpCDSRequest *pRequest, UPnpCDSExtensionResults *pResults, QStringList &/*idPath*/ ) { pResults->m_nTotalMatches = 0; pResults->m_nUpdateID = 1; // ---------------------------------------------------------------------- // // ---------------------------------------------------------------------- switch( pRequest->m_eBrowseFlag ) { case CDS_BrowseMetadata: { // -------------------------------------------------------------- // Return Container Object Only // -------------------------------------------------------------- UPnpCDSRootInfo *pInfo = GetRootInfo( 0 ); if (pInfo != NULL) { pResults->m_nTotalMatches = 1; pResults->m_nUpdateID = 1; CDSObject *pItem = CreateContainer( pRequest->m_sObjectId, QObject::tr( pInfo->title ), m_sExtensionId ); pItem->SetChildCount( GetDistinctCount( pInfo ) ); pResults->Add( pItem ); } break; } case CDS_BrowseDirectChildren: { CreateItems( pRequest, pResults, 0, "", false ); break; } case CDS_BrowseUnknown: default: break; } return pResults; }
UPnpCDSExtensionResults *UPnpCDSExtension::ProcessKey( UPnpCDSRequest *pRequest, UPnpCDSExtensionResults *pResults, QStringList &idPath ) { pResults->m_nTotalMatches = 0; pResults->m_nUpdateID = 1; // ---------------------------------------------------------------------- // // ---------------------------------------------------------------------- QString sKey = idPath.last().section( '=', 1, 1 ); QUrl::decode( sKey ); if (sKey.length() > 0) { int nNodeIdx = idPath[ idPath.count() - 2 ].toInt(); switch( pRequest->m_eBrowseFlag ) { case CDS_BrowseMetadata: { UPnpCDSRootInfo *pInfo = GetRootInfo( nNodeIdx ); if (pInfo == NULL) return pResults; pRequest->m_sParentId = RemoveToken( "/", pRequest->m_sObjectId, 1 ); // -------------------------------------------------------------- // Since Key is not always the title, we need to lookup title. // -------------------------------------------------------------- MSqlQuery query(MSqlQuery::InitCon()); if (query.isConnected()) { QString sSQL = QString( pInfo->sql ) .arg( pInfo->where ); // -=>TODO: There is a problem when called for an Item, instead of a container // sKey = '<KeyName>/item?ChanId' which is incorrect. query.prepare ( sSQL ); query.bindValue( ":KEY", sKey ); query.exec(); if (query.isActive() && query.size() > 0) { if ( query.next() ) { // ---------------------------------------------- // Return Container Object Only // ---------------------------------------------- pResults->m_nTotalMatches = 1; pResults->m_nUpdateID = 1; CDSObject *pItem = CreateContainer( pRequest->m_sObjectId, query.value(1).toString(), pRequest->m_sParentId ); pItem->SetChildCount( GetDistinctCount( pInfo )); pResults->Add( pItem ); } } } break; } case CDS_BrowseDirectChildren: { CreateItems( pRequest, pResults, nNodeIdx, sKey, true ); break; } case CDS_BrowseUnknown: default: break; } } return pResults; }
UPnpCDSExtensionResults *UPnpCDSExtension::ProcessRoot( UPnpCDSRequest *pRequest, UPnpCDSExtensionResults *pResults, QStringList &/*idPath*/ ) { pResults->m_nTotalMatches = 0; pResults->m_nUpdateID = 1; short nRootCount = GetRootCount(); switch( pRequest->m_eBrowseFlag ) { case CDS_BrowseMetadata: { // -------------------------------------------------------------- // Return Root Object Only // -------------------------------------------------------------- pResults->m_nTotalMatches = 1; pResults->m_nUpdateID = 1; CDSObject *pRoot = CreateContainer( m_sExtensionId, m_sName, "0"); pRoot->SetChildCount( nRootCount ); pResults->Add( pRoot ); break; } case CDS_BrowseDirectChildren: { VERBOSE(VB_UPNP, "CDS_BrowseDirectChildren"); pResults->m_nUpdateID = 1; pResults->m_nTotalMatches = nRootCount ; if ( pRequest->m_nRequestedCount == 0) pRequest->m_nRequestedCount = nRootCount ; short nStart = Max( pRequest->m_nStartingIndex, short( 0 )); short nEnd = Min( nRootCount, short( nStart + pRequest->m_nRequestedCount)); if (nStart < nRootCount) { for (short nIdx = nStart; nIdx < nEnd; nIdx++) { UPnpCDSRootInfo *pInfo = GetRootInfo( nIdx ); if (pInfo != NULL) { QString sId = QString( "%1/%2" ).arg( pRequest->m_sObjectId ) .arg( nIdx ); CDSObject *pItem = CreateContainer( sId, QObject::tr( pInfo->title ), m_sExtensionId ); pItem->SetChildCount( GetDistinctCount( pInfo ) ); pResults->Add( pItem ); } } } } case CDS_BrowseUnknown: default: break; } return pResults; }
UPnpCDSExtensionResults *UPnpCDSExtension::ProcessContainer( UPnpCDSRequest *pRequest, UPnpCDSExtensionResults *pResults, int nNodeIdx, QStringList &/*idPath*/ ) { pResults->m_nUpdateID = 1; pResults->m_nTotalMatches = 0; UPnpCDSRootInfo *pInfo = GetRootInfo( nNodeIdx ); if (pInfo == NULL) return pResults; switch( pRequest->m_eBrowseFlag ) { case CDS_BrowseMetadata: { // -------------------------------------------------------------- // Return Container Object Only // -------------------------------------------------------------- pResults->m_nTotalMatches = 1; pResults->m_nUpdateID = 1; CDSObject *pItem = CreateContainer( pRequest->m_sObjectId, QObject::tr( pInfo->title ), m_sExtensionId ); pItem->SetChildCount( GetDistinctCount( pInfo )); pResults->Add( pItem ); break; } case CDS_BrowseDirectChildren: { pResults->m_nTotalMatches = GetDistinctCount( pInfo ); pResults->m_nUpdateID = 1; if (pRequest->m_nRequestedCount == 0) pRequest->m_nRequestedCount = SHRT_MAX; MSqlQuery query(MSqlQuery::InitCon()); if (query.isConnected()) { // Remove where clause placeholder. QString sSQL = pInfo->sql; sSQL.replace( "%1", "" ); sSQL += QString( " LIMIT %2, %3" ) .arg( pRequest->m_nStartingIndex ) .arg( pRequest->m_nRequestedCount ); query.prepare( sSQL ); query.exec(); if (query.isActive() && query.size() > 0) { while(query.next()) { QString sKey = query.value(0).toString(); QString sTitle = QString::fromUtf8(query.value(1).toString()); long nCount = query.value(2).toInt(); if (sTitle.length() == 0) sTitle = "(undefined)"; QString sId = QString( "%1/key=%2" ) .arg( pRequest->m_sParentId ) .arg( sKey ); CDSObject *pRoot = CreateContainer( sId, sTitle, pRequest->m_sParentId ); pRoot->SetChildCount( nCount ); pResults->Add( pRoot ); } } } break; } case CDS_BrowseUnknown: break; } return pResults; }