13 #include <QTextStream>
20 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
22 #define QT_FLUSH flush
24 #define QT_ENDL Qt::endl
25 #define QT_FLUSH Qt::flush
28 inline QString
GetBool(
bool bVal ) {
return( (bVal) ?
"1" :
"0" ); }
39 const QString &sTitle,
40 const QString &sParentId )
101 QList<Property*> props;
118 const QString &sType )
123 if ((*it)->m_bMultiValue)
125 LOG(VB_UPNP, LOG_WARNING,
126 QString(
"SetPropValue(%1) called on property with bAllowMulti. "
127 "Only the last inserted property will be updated.").
arg(sName));
129 (*it)->SetValue(sValue);
131 if (!sType.isEmpty())
132 (*it)->AddAttribute(
"type", sType );
135 LOG(VB_UPNP, LOG_WARNING,
136 QString(
"SetPropValue(%1) called with non-existent property.").
arg(sName));
145 Properties::const_iterator it =
m_properties.find(sName);
149 if ((*it)->m_bMultiValue)
151 LOG(VB_UPNP, LOG_WARNING,
152 QString(
"GetPropValue(%1) called on property with bAllowMulti. "
153 "Only the last inserted property will be return."));
155 return (*it)->GetValue().toUtf8();
187 CDSObjects::iterator it;
194 if (pChild->
m_sId == sID)
207 auto *pRes =
new Resource( sProtocol, sURI );
265 bool ignoreChildren )
const
268 QTextStream os( &sXML, QIODevice::WriteOnly );
269 os.setCodec(QTextCodec::codecForName(
"UTF-8"));
270 toXml(os, filter, ignoreChildren);
280 bool ignoreChildren )
const
282 QString sEndTag =
"";
310 if (filter.contains(
"*"))
317 if (bFilter && filter.contains(
"container#"))
320 os <<
"<container id=\"" <<
m_sId
324 if (!bFilter || filter.contains(
"@searchable"))
327 if (!bFilter || filter.contains(
"@childCount"))
330 if (!bFilter || filter.contains(
"@childContainerCount"))
335 sEndTag =
"</container>";
341 if (bFilter && filter.contains(
"item#"))
344 os <<
"<item id=\"" <<
m_sId
365 if (pProp->m_bRequired || (!pProp->GetValue().isEmpty()))
369 if (!pProp->m_sNameSpace.isEmpty())
370 sName = pProp->m_sNameSpace +
':' + pProp->m_sName;
372 sName = pProp->m_sName;
374 if (pProp->m_bRequired ||
378 bool filterAttributes =
true;
379 if (!bFilter || filter.contains(QString(
"%1#").
arg(sName)))
380 filterAttributes =
false;
384 for (
const auto & attr : qAsConst(pProp->m_lstAttributes))
386 QString filterName = QString(
"%1@%2").arg(sName)
388 if (attr.m_bRequired || !filterAttributes ||
389 filter.contains(filterName))
390 os <<
" " << attr.m_sName <<
"=\"" << attr.m_sValue <<
"\"";
394 os << pProp->GetEncodedValue();
395 os <<
"</" << sName <<
">" <<
QT_ENDL;
404 if (!bFilter || filter.contains(
"res"))
406 bool filterAttributes =
true;
407 if (!bFilter || filter.contains(
"res#"))
408 filterAttributes =
false;
411 os <<
"<res protocolInfo=\"" << resource->m_sProtocolInfo <<
"\" ";
414 for (
const auto & attr : qAsConst(resource->m_lstAttributes))
416 filterName = QString(
"res@%1").arg(attr.m_sName);
417 if (attr.m_bRequired || !filterAttributes ||
418 filter.contains(filterName))
419 os << attr.m_sName <<
"=\"" << attr.m_sValue <<
"\" ";
422 os <<
">" << resource->m_sURI;
434 cit->toXml(os, filter);
452 if (pObject ==
nullptr)
454 pObject =
new CDSObject( sId, sTitle, sParentId );
470 if (pObject ==
nullptr)
472 pObject =
new CDSObject( sId, sTitle, sParentId );
473 pObject->
m_sClass =
"object.container";
497 if (pObject ==
nullptr)
499 pObject =
new CDSObject( sId, sTitle, sParentId );
500 pObject->
m_sClass =
"object.item.audioItem";
503 CreateItem( sId, sTitle, sParentId, pObject );
523 if (pObject ==
nullptr)
525 pObject =
new CDSObject( sId, sTitle, sParentId );
526 pObject->
m_sClass =
"object.item.audioItem.musicTrack";
565 if (pObject ==
nullptr)
567 pObject =
new CDSObject( sId, sTitle, sParentId );
568 pObject->
m_sClass =
"object.item.audioItem.audioBroadcast";
586 if (pObject ==
nullptr)
588 pObject =
new CDSObject( sId, sTitle, sParentId );
589 pObject->
m_sClass =
"object.item.audioItem.audioBook";
605 if (pObject ==
nullptr)
607 pObject =
new CDSObject( sId, sTitle, sParentId );
608 pObject->
m_sClass =
"object.item.videoItem";
611 CreateItem( sId, sTitle, sParentId, pObject );
663 if (pObject ==
nullptr)
665 pObject =
new CDSObject( sId, sTitle, sParentId );
666 pObject->
m_sClass =
"object.item.videoItem.movie";
681 if (pObject ==
nullptr)
683 pObject =
new CDSObject( sId, sTitle, sParentId );
684 pObject->
m_sClass =
"object.item.videoItem.videoBroadcast";
699 if (pObject ==
nullptr)
701 pObject =
new CDSObject( sId, sTitle, sParentId );
702 pObject->
m_sClass =
"object.item.videoItem.musicVideoClip";
719 if (pObject ==
nullptr)
721 pObject =
new CDSObject( sId, sTitle, sParentId );
722 pObject->
m_sClass =
"object.item.imageItem";
725 CreateItem( sId, sTitle, sParentId, pObject );
744 if (pObject ==
nullptr)
746 pObject =
new CDSObject( sId, sTitle, sParentId );
747 pObject->
m_sClass =
"object.item.imageItem.photo";
761 if (pObject ==
nullptr)
763 pObject =
new CDSObject( sId, sTitle, sParentId );
764 pObject->
m_sClass =
"object.item.playlistItem";
767 CreateItem( sId, sTitle, sParentId, pObject );
783 if (pObject ==
nullptr)
785 pObject =
new CDSObject( sId, sTitle, sParentId );
786 pObject->
m_sClass =
"object.item.textItem";
789 CreateItem( sId, sTitle, sParentId, pObject );
810 if (pObject ==
nullptr)
812 pObject =
new CDSObject( sId, sTitle, sParentId );
813 pObject->
m_sClass =
"object.container.album";
837 if (pObject ==
nullptr)
839 pObject =
new CDSObject( sId, sTitle, sParentId );
840 pObject->
m_sClass =
"object.container.album.musicAlbum";
857 if (pObject ==
nullptr)
859 pObject =
new CDSObject( sId, sTitle, sParentId );
860 pObject->
m_sClass =
"object.container.album.photoAlbum";
872 if (pObject ==
nullptr)
874 pObject =
new CDSObject( sId, sTitle, sParentId );
875 pObject->
m_sClass =
"object.container.genre";
887 if (pObject ==
nullptr)
889 pObject =
new CDSObject( sId, sTitle, sParentId );
890 pObject->
m_sClass =
"object.container.genre.musicGenre";
902 if (pObject ==
nullptr)
904 pObject =
new CDSObject( sId, sTitle, sParentId );
905 pObject->
m_sClass =
"object.container.genre.movieGenre";
917 if (pObject ==
nullptr)
919 pObject =
new CDSObject( sId, sTitle, sParentId );
920 pObject->
m_sClass =
"object.container.playlistContainer";
940 if (pObject ==
nullptr)
942 pObject =
new CDSObject( sId, sTitle, sParentId );
943 pObject->
m_sClass =
"object.container.person";
957 if (pObject ==
nullptr)
959 pObject =
new CDSObject( sId, sTitle, sParentId );
960 pObject->
m_sClass =
"object.container.person.musicArtist";
975 if (pObject ==
nullptr)
977 pObject =
new CDSObject( sId, sTitle, sParentId );
978 pObject->
m_sClass =
"object.container.storageSystem";
996 if (pObject ==
nullptr)
998 pObject =
new CDSObject( sId, sTitle, sParentId );
999 pObject->
m_sClass =
"object.container.storageVolume";
1016 if (pObject ==
nullptr)
1018 pObject =
new CDSObject( sId, sTitle, sParentId );
1019 pObject->
m_sClass =
"object.container.storageFolder";
1035 if (filter.contains(name, Qt::CaseInsensitive))
1042 QString dependentAttribute = QString(
"%1@").arg(name);
1043 QStringList matches = filter.filter(name, Qt::CaseInsensitive);
1044 QStringList::iterator it;
1045 for (it = matches.begin(); it != matches.end(); ++it)
1047 if ((*it).startsWith(dependentAttribute))