[vlc-devel] [PATCHv2 04/13] upnp: refactor items addition

Thomas Guillem thomas at gllm.fr
Tue May 3 19:02:31 CEST 2016


---
 modules/services_discovery/upnp.cpp | 159 +++++++++++++++++++-----------------
 modules/services_discovery/upnp.hpp |   1 +
 2 files changed, 86 insertions(+), 74 deletions(-)

diff --git a/modules/services_discovery/upnp.cpp b/modules/services_discovery/upnp.cpp
index 02ca710..2326b87 100644
--- a/modules/services_discovery/upnp.cpp
+++ b/modules/services_discovery/upnp.cpp
@@ -800,6 +800,90 @@ bool MediaServer::addContainer( IXML_Element* containerElement )
     return true;
 }
 
+bool MediaServer::addItem( IXML_Element* itemElement )
+{
+    const char* objectID = ixmlElement_getAttribute( itemElement, "id" );
+    if ( !objectID )
+        return false;
+
+    const char* title = xml_getChildElementValue( itemElement, "dc:title" );
+    if ( !title )
+        return false;
+
+    const char* psz_subtitles = xml_getChildElementValue( itemElement, "sec:CaptionInfo" );
+    if ( !psz_subtitles )
+    {
+        psz_subtitles = xml_getChildElementValue( itemElement, "sec:CaptionInfoEx" );
+        if ( !psz_subtitles )
+            psz_subtitles = xml_getChildElementValue( itemElement, "pv:subtitlefile" );
+    }
+
+    /* Try to extract all resources in DIDL */
+    IXML_NodeList* p_resource_list = ixmlDocument_getElementsByTagName( (IXML_Document*) itemElement, "res" );
+    if ( !p_resource_list || ixmlNodeList_length( p_resource_list ) <= 0 )
+    {
+        if ( p_resource_list )
+            ixmlNodeList_free( p_resource_list );
+        return false;
+    }
+
+    mtime_t i_duration = -1;
+    IXML_Element* p_resource = ( IXML_Element* ) ixmlNodeList_item( p_resource_list, 0 );
+    const char* psz_resource_url = xml_getChildElementValue( p_resource, "res" );
+    if( !psz_resource_url )
+    {
+        ixmlNodeList_free( p_resource_list );
+        return false;
+    }
+    const char* psz_duration = ixmlElement_getAttribute( p_resource, "duration" );
+
+    if ( psz_duration )
+    {
+        int i_hours, i_minutes, i_seconds;
+        if( sscanf( psz_duration, "%d:%02d:%02d", &i_hours, &i_minutes, &i_seconds ) )
+            i_duration = INT64_C(1000000) * ( i_hours * 3600 + i_minutes * 60 +
+                                              i_seconds );
+    }
+
+    input_item_t* p_item =
+        input_item_NewExt( psz_resource_url, title, i_duration,
+                           ITEM_TYPE_FILE, ITEM_NET );
+    if ( p_item == NULL )
+    {
+        ixmlNodeList_free( p_resource_list );
+        return false;
+    }
+    const char* psz_artist = xml_getChildElementValue( itemElement, "upnp:artist" );
+
+    if ( psz_artist != NULL )
+        input_item_SetArtist( p_item, psz_artist );
+    const char* psz_genre = xml_getChildElementValue( itemElement, "upnp:genre" );
+    if ( psz_genre != NULL )
+        input_item_SetGenre( p_item, psz_genre );
+    const char* psz_album = xml_getChildElementValue( itemElement, "upnp:album" );
+    if ( psz_album != NULL )
+        input_item_SetAlbum( p_item, psz_album );
+    const char* psz_date = xml_getChildElementValue( itemElement, "dc:date" );
+    if ( psz_date != NULL )
+        input_item_SetDate( p_item, psz_date );
+    const char* psz_orig_track_nb = xml_getChildElementValue( itemElement, "upnp:originalTrackNumber" );
+    if ( psz_orig_track_nb != NULL )
+        input_item_SetTrackNumber( p_item, psz_orig_track_nb );
+    const char* psz_album_artist = xml_getChildElementValue( itemElement, "upnp:albumArtist" );
+    if ( psz_album_artist != NULL )
+        input_item_SetAlbumArtist( p_item, psz_album_artist );
+    const char* psz_albumArt = xml_getChildElementValue( itemElement, "upnp:albumArtURI" );
+    if ( psz_albumArt != NULL )
+        input_item_SetArtworkURL( p_item, psz_albumArt );
+
+    input_item_CopyOptions( p_item, node_->p_item );
+    input_item_node_AppendItem( node_, p_item );
+    input_item_Release( p_item );
+
+    ixmlNodeList_free( p_resource_list );
+    return true;
+}
+
 int MediaServer::sendActionCb( Upnp_EventType eventType,
                                void *p_event, void *p_cookie )
 {
@@ -962,80 +1046,7 @@ bool MediaServer::fetchContents()
     if ( itemNodeList )
     {
         for ( unsigned int i = 0; i < ixmlNodeList_length( itemNodeList ); i++ )
-        {
-            IXML_Element* itemElement =
-                        ( IXML_Element* )ixmlNodeList_item( itemNodeList, i );
-
-            const char* objectID =
-                        ixmlElement_getAttribute( itemElement, "id" );
-            if ( !objectID )
-                continue;
-
-            const char* title = xml_getChildElementValue( itemElement, "dc:title" );
-            if ( !title )
-                continue;
-
-            const char* psz_subtitles = xml_getChildElementValue( itemElement, "sec:CaptionInfo" );
-
-            if ( !psz_subtitles )
-                psz_subtitles = xml_getChildElementValue( itemElement, "sec:CaptionInfoEx" );
-
-            if ( !psz_subtitles )
-                psz_subtitles = xml_getChildElementValue( itemElement, "pv:subtitlefile" );
-
-            /* Try to extract all resources in DIDL */
-            IXML_NodeList* p_resource_list = ixmlDocument_getElementsByTagName( (IXML_Document*) itemElement, "res" );
-            if ( p_resource_list && ixmlNodeList_length( p_resource_list ) > 0 )
-            {
-                mtime_t i_duration = -1;
-                IXML_Element* p_resource = ( IXML_Element* ) ixmlNodeList_item( p_resource_list, 0 );
-                const char* psz_resource_url = xml_getChildElementValue( p_resource, "res" );
-                if( !psz_resource_url )
-                    continue;
-                const char* psz_duration = ixmlElement_getAttribute( p_resource, "duration" );
-
-                if ( psz_duration )
-                {
-                    int i_hours, i_minutes, i_seconds;
-                    if( sscanf( psz_duration, "%d:%02d:%02d", &i_hours, &i_minutes, &i_seconds ) )
-                        i_duration = INT64_C(1000000) * ( i_hours * 3600 +
-                                                          i_minutes * 60 +
-                                                          i_seconds );
-                }
-
-                input_item_t* p_item =
-                    input_item_NewExt( psz_resource_url, title, i_duration,
-                                       ITEM_TYPE_FILE, ITEM_NET );
-                if ( p_item != NULL )
-                {
-                    const char* psz_artist = xml_getChildElementValue( itemElement, "upnp:artist" );
-                    if ( psz_artist != NULL )
-                        input_item_SetArtist( p_item, psz_artist );
-                    const char* psz_genre = xml_getChildElementValue( itemElement, "upnp:genre" );
-                    if ( psz_genre != NULL )
-                        input_item_SetGenre( p_item, psz_genre );
-                    const char* psz_album = xml_getChildElementValue( itemElement, "upnp:album" );
-                    if ( psz_album != NULL )
-                        input_item_SetAlbum( p_item, psz_album );
-                    const char* psz_date = xml_getChildElementValue( itemElement, "dc:date" );
-                    if ( psz_date != NULL )
-                        input_item_SetDate( p_item, psz_date );
-                    const char* psz_orig_track_nb = xml_getChildElementValue( itemElement, "upnp:originalTrackNumber" );
-                    if ( psz_orig_track_nb != NULL )
-                        input_item_SetTrackNumber( p_item, psz_orig_track_nb );
-                    const char* psz_album_artist = xml_getChildElementValue( itemElement, "upnp:albumArtist" );
-                    if ( psz_album_artist != NULL )
-                        input_item_SetAlbumArtist( p_item, psz_album_artist );
-                    const char* psz_albumArt = xml_getChildElementValue( itemElement, "upnp:albumArtURI" );
-                    if ( psz_albumArt != NULL )
-                        input_item_SetArtworkURL( p_item, psz_albumArt );
-                }
-                input_item_CopyOptions( p_item, node_->p_item );
-                input_item_node_AppendItem( node_, p_item );
-                input_item_Release( p_item );
-            }
-            ixmlNodeList_free( p_resource_list );
-        }
+            addItem( (IXML_Element*)ixmlNodeList_item( itemNodeList, i ) );
         ixmlNodeList_free( itemNodeList );
     }
 
diff --git a/modules/services_discovery/upnp.hpp b/modules/services_discovery/upnp.hpp
index a1cfa97..4e0b45f 100644
--- a/modules/services_discovery/upnp.hpp
+++ b/modules/services_discovery/upnp.hpp
@@ -150,6 +150,7 @@ private:
     MediaServer& operator=(const MediaServer&);
 
     bool addContainer( IXML_Element* containerElement );
+    bool addItem( IXML_Element* itemElement );
 
     IXML_Document* _browseAction(const char*, const char*,
             const char*, const char*, const char* );
-- 
2.8.0.rc3



More information about the vlc-devel mailing list