diff options
author | Denis Loh <denis.loh@gmail.com> | 2010-01-27 13:50:27 +0100 |
---|---|---|
committer | Denis Loh <denis.loh@gmail.com> | 2010-01-27 13:50:27 +0100 |
commit | a26c93fa92a87187dded8d0492ed6988ac725585 (patch) | |
tree | a241bbf8e845631ce7ae78a36753c12a01017fcf /database/object.cpp | |
parent | 2f45223f577c91db7fd962020b3473f5a34f369c (diff) | |
download | vdr-plugin-upnp-a26c93fa92a87187dded8d0492ed6988ac725585.tar.gz vdr-plugin-upnp-a26c93fa92a87187dded8d0492ed6988ac725585.tar.bz2 |
Added filter functionality, added max length of metadata
Diffstat (limited to 'database/object.cpp')
-rw-r--r-- | database/object.cpp | 148 |
1 files changed, 101 insertions, 47 deletions
diff --git a/database/object.cpp b/database/object.cpp index 71dfe63..b193567 100644 --- a/database/object.cpp +++ b/database/object.cpp @@ -334,30 +334,22 @@ IXML_Node* cUPnPClassItem::createDIDLFragment(IXML_Document* Document, cStringLi MESSAGE(VERBOSE_DIDL, "ParentID: %s", *this->getParentID()); MESSAGE(VERBOSE_DIDL, "Restricted: %s", this->isRestricted()?"1":"0"); MESSAGE(VERBOSE_DIDL, "Class: %s", this->getClass()); + MESSAGE(VERBOSE_DIDL, "Filter: %d", Filter?Filter->Size():-1); IXML_Node* Didl = ixmlNode_getFirstChild((IXML_Node*) this->mDIDLFragment); IXML_Element* eItem = ixmlDocument_createElement(this->mDIDLFragment, "item"); - ixmlElement_setAttribute(eItem, att(UPNP_PROP_OBJECTID), *this->getID()); - ixmlElement_setAttribute(eItem, att(UPNP_PROP_PARENTID), *this->getParentID()); - ixmlElement_setAttribute(eItem, att(UPNP_PROP_RESTRICTED), this->isRestricted()?"1":"0"); - ixmlNode_appendChild(Didl, (IXML_Node*) eItem); - IXML_Element* eTitle = ixmlDocument_createElement(this->mDIDLFragment, UPNP_PROP_TITLE); - IXML_Node* Title = ixmlDocument_createTextNode(this->mDIDLFragment, this->getTitle()); - - IXML_Element* eClass = ixmlDocument_createElement(this->mDIDLFragment, UPNP_PROP_CLASS); - IXML_Node* Class = ixmlDocument_createTextNode(this->mDIDLFragment, this->getClass()); + ixmlAddProperty(this->mDIDLFragment, eItem, UPNP_PROP_OBJECTID, *this->getID()); + ixmlAddProperty(this->mDIDLFragment, eItem, UPNP_PROP_PARENTID, *this->getParentID()); + ixmlAddProperty(this->mDIDLFragment, eItem, UPNP_PROP_RESTRICTED, this->isRestricted()?"1":"0"); + ixmlAddProperty(this->mDIDLFragment, eItem, UPNP_PROP_TITLE, this->getTitle()); + ixmlAddProperty(this->mDIDLFragment, eItem, UPNP_PROP_CLASS, this->getClass()); - ixmlNode_appendChild((IXML_Node*) eTitle, Title); - ixmlNode_appendChild((IXML_Node*) eClass, Class); - ixmlNode_appendChild((IXML_Node*) eItem, (IXML_Node*) eTitle); - ixmlNode_appendChild((IXML_Node*) eItem, (IXML_Node*) eClass); - -// if(Filter==NULL || Filter->Find(UPNP_PROP_CREATOR)) ixmlAddProperty(this->mDIDLFragment, eItem, UPNP_PROP_CREATOR, this->getCreator()); -// if(Filter==NULL || Filter->Find(UPNP_PROP_WRITESTATUS)) ixmlAddProperty(this->mDIDLFragment, eItem, UPNP_PROP_WRITESTATUS, itoa(this->getWriteStatus())); -// if(Filter==NULL || Filter->Find(UPNP_PROP_REFERENCEID)) ixmlAddProperty(this->mDIDLFragment, eItem, UPNP_PROP_REFERENCEID, *this->getReferenceID()); + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_CREATOR, this->getCreator()); + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_WRITESTATUS, itoa(this->getWriteStatus())); + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_REFERENCEID, ((int)(this->getReferenceID())<0)?"":*this->getReferenceID()); for(cUPnPResource* Resource = this->getResources()->First(); Resource; Resource = this->getResources()->Next(Resource)){ MESSAGE(VERBOSE_DIDL, "Resource: %s", Resource->getResource()); @@ -367,18 +359,17 @@ IXML_Node* cUPnPClassItem::createDIDLFragment(IXML_Document* Document, cStringLi cString ResourceURL = cString::sprintf("%s%s/get?resId=%d", *URLBase, UPNP_DIR_SHARES, Resource->getID()); MESSAGE(VERBOSE_DIDL, "Resource-URI: %s", *ResourceURL); + + IXML_Element* eRes = ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_RESOURCE, *ResourceURL); + if(eRes){ + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eRes, UPNP_PROP_BITRATE, itoa(Resource->getBitrate())); + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eRes, UPNP_PROP_BITSPERSAMPLE, itoa(Resource->getBitsPerSample())); + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eRes, UPNP_PROP_COLORDEPTH, itoa(Resource->getColorDepth())); + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eRes, UPNP_PROP_DURATION, Resource->getDuration()); + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eRes, UPNP_PROP_PROTOCOLINFO, Resource->getProtocolInfo()); + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eRes, UPNP_PROP_SIZE, cString::sprintf("%lld", Resource->getFileSize())); + } - IXML_Element* eRes = ixmlDocument_createElement(this->mDIDLFragment, UPNP_PROP_RESOURCE); - IXML_Node* Res = ixmlDocument_createTextNode(this->mDIDLFragment, *ResourceURL); - ixmlNode_appendChild((IXML_Node*) eRes, Res); - - if(Resource->getBitrate()) ixmlElement_setAttribute(eRes, att(UPNP_PROP_BITRATE), itoa(Resource->getBitrate())); - if(Resource->getBitsPerSample()) ixmlElement_setAttribute(eRes, att(UPNP_PROP_BITSPERSAMPLE), itoa(Resource->getBitsPerSample())); - if(Resource->getColorDepth()) ixmlElement_setAttribute(eRes, att(UPNP_PROP_COLORDEPTH), itoa(Resource->getColorDepth())); - if(Resource->getDuration()) ixmlElement_setAttribute(eRes, att(UPNP_PROP_DURATION), Resource->getDuration()); - if(Resource->getProtocolInfo()) ixmlElement_setAttribute(eRes, att(UPNP_PROP_PROTOCOLINFO), Resource->getProtocolInfo()); - - ixmlNode_appendChild((IXML_Node*) eItem, (IXML_Node*) eRes); } return (IXML_Node*)eItem; @@ -411,25 +402,38 @@ IXML_Node* cUPnPClassContainer::createDIDLFragment(IXML_Document* Document, cStr MESSAGE(VERBOSE_DIDL, "ParentID: %s", *this->getParentID()); MESSAGE(VERBOSE_DIDL, "Restricted: %s", this->isRestricted()?"1":"0"); MESSAGE(VERBOSE_DIDL, "Class: %s", this->getClass()); + MESSAGE(VERBOSE_DIDL, "Filter: %d", Filter?Filter->Size():-1); IXML_Node* Didl = ixmlNode_getFirstChild((IXML_Node*) this->mDIDLFragment); IXML_Element* eItem = ixmlDocument_createElement(this->mDIDLFragment, "container"); - ixmlElement_setAttribute(eItem, att(UPNP_PROP_OBJECTID), *this->getID()); - ixmlElement_setAttribute(eItem, att(UPNP_PROP_PARENTID), *this->getParentID()); - ixmlElement_setAttribute(eItem, att(UPNP_PROP_RESTRICTED), this->isRestricted()?"1":"0"); ixmlNode_appendChild(Didl, (IXML_Node*) eItem); - IXML_Element* eTitle = ixmlDocument_createElement(this->mDIDLFragment, UPNP_PROP_TITLE); - IXML_Node* Title = ixmlDocument_createTextNode(this->mDIDLFragment, this->getTitle()); - - IXML_Element* eClass = ixmlDocument_createElement(this->mDIDLFragment, UPNP_PROP_CLASS); - IXML_Node* Class = ixmlDocument_createTextNode(this->mDIDLFragment, this->getClass()); - - ixmlNode_appendChild((IXML_Node*) eTitle, Title); - ixmlNode_appendChild((IXML_Node*) eClass, Class); - ixmlNode_appendChild((IXML_Node*) eItem, (IXML_Node*) eTitle); - ixmlNode_appendChild((IXML_Node*) eItem, (IXML_Node*) eClass); + ixmlAddProperty(this->mDIDLFragment, eItem, UPNP_PROP_OBJECTID, *this->getID()); + ixmlAddProperty(this->mDIDLFragment, eItem, UPNP_PROP_PARENTID, *this->getParentID()); + ixmlAddProperty(this->mDIDLFragment, eItem, UPNP_PROP_RESTRICTED, this->isRestricted()?"1":"0"); + ixmlAddProperty(this->mDIDLFragment, eItem, UPNP_PROP_TITLE, this->getTitle()); + ixmlAddProperty(this->mDIDLFragment, eItem, UPNP_PROP_CLASS, this->getClass()); + + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_DLNA_CONTAINERTYPE, this->getContainerType()); + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_CHILDCOUNT, itoa(this->getChildCount())); + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_SEARCHABLE, this->isSearchable()?"1":"0"); + + const tClassVector* CreateClasses = this->getCreateClasses(); + for(unsigned int i = 0; i < CreateClasses->size(); i++){ + cClass CreateClass = CreateClasses->at(i); + IXML_Element* eCreateClasses = ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_CREATECLASS, CreateClass.ID); + if(eCreateClasses) + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_CCLASSDERIVED, CreateClass.includeDerived?"1":"0"); + } + const tClassVector* SearchClasses = this->getSearchClasses(); + for(unsigned int i = 0; i < SearchClasses->size(); i++){ + cClass SearchClass = SearchClasses->at(i); + IXML_Element* eSearchClasses = ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_SEARCHCLASS, SearchClass.ID); + if(eSearchClasses) + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_SCLASSDERIVED, SearchClass.includeDerived?"1":"0"); + } + return (IXML_Node*)eItem; } @@ -596,9 +600,52 @@ cUPnPClassVideoItem::cUPnPClassVideoItem(){ cUPnPClassVideoItem::~cUPnPClassVideoItem(){ } -//cString cUPnPClassVideoItem::createDIDLFragment(cStringList* Filter){ -// return NULL; -//} +IXML_Node* cUPnPClassVideoItem::createDIDLFragment(IXML_Document* Document, cStringList* Filter){ + IXML_Element* eItem = (IXML_Element*) cUPnPClassItem::createDIDLFragment(Document, Filter); + + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_LONGDESCRIPTION, this->getLongDescription()); + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_DESCRIPTION, this->getDescription()); + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_LANGUAGE, this->getLanguage()); + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_RATING, this->getRating()); + + char* genre = strtok(strdup0(this->getGenre()), ","); + while(genre){ + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_GENRE, genre); + genre = strtok(NULL, ","); + } + + char* producer = strtok(strdup0(this->getProducers()), ","); + while(producer){ + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_PRODUCER, producer); + producer = strtok(NULL, ","); + } + + char* actor = strtok(strdup0(this->getActors()), ","); + while(actor){ + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_ACTOR, actor); + actor = strtok(NULL, ","); + } + + char* director = strtok(strdup0(this->getDirectors()), ","); + while(director){ + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_DIRECTOR, director); + director = strtok(NULL, ","); + } + + char* publisher = strtok(strdup0(this->getPublishers()), ","); + while(publisher){ + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_PUBLISHER, publisher); + publisher = strtok(NULL, ","); + } + + char* relation = strtok(strdup0(this->getRelations()), ","); + while(relation){ + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_RELATION, relation); + relation = strtok(NULL, ","); + } + + return (IXML_Node*) eItem; +} cStringList* cUPnPClassVideoItem::getPropertyList(){ cStringList* Properties = cUPnPClassItem::getPropertyList(); @@ -754,9 +801,16 @@ cUPnPClassVideoBroadcast::cUPnPClassVideoBroadcast(){ cUPnPClassVideoBroadcast::~cUPnPClassVideoBroadcast(){ } -//cString cUPnPClassVideoBroadcast::createDIDLFragment(cStringList* Filter){ -// return NULL; -//} +IXML_Node* cUPnPClassVideoBroadcast::createDIDLFragment(IXML_Document* Document, cStringList* Filter){ + IXML_Element* eItem = (IXML_Element*) cUPnPClassItem::createDIDLFragment(Document, Filter); + + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_CHANNELNAME, this->getChannelName()); + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_CHANNELNR, itoa(this->getChannelNr())); + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_ICON, this->getIcon()); + ixmlAddFilteredProperty(Filter, this->mDIDLFragment, eItem, UPNP_PROP_REGION, this->getRegion()); + + return (IXML_Node*) eItem; +} cStringList* cUPnPClassVideoBroadcast::getPropertyList(){ cStringList* Properties = cUPnPClassVideoItem::getPropertyList(); |