[vlc-devel] [PATCH] uPnP discovery: Evaluate "TotalMatches" and "NumberReturned" browse again with increased "StartingIndex" and adapted "RequestCount". Solves #21381 Panasonic Viera returns maximal 20 items on uPnP #22496 DLNA/UPnP - Panasonic recorder 12 records limit

Sean McGovern gseanmcg at gmail.com
Tue Jul 16 00:06:13 CEST 2019


Hi,

Please please PLEASE, shorten your commit message.

Quick header line summarizing the change, then a blank line and then add detailed information there.

-- Sean McGovern



	  Original Message  



From: akrug at arcor.de
Sent: July 15, 2019 2:42 PM
To: vlc-devel at videolan.org
Reply-to: vlc-devel at videolan.org
Cc: akrug at arcor.de
Subject: [vlc-devel] [PATCH] uPnP discovery: Evaluate "TotalMatches" and "NumberReturned" browse again with increased "StartingIndex" and adapted "RequestCount". Solves #21381 Panasonic Viera returns maximal 20 items on uPnP #22496 DLNA/UPnP - Panasonic recorder 12 records limit


---
modules/services_discovery/upnp.cpp | 60 +++++++++++++++++++----------
modules/services_discovery/upnp.hpp |  2 +-
2 files changed, 41 insertions(+), 21 deletions(-)

diff --git a/modules/services_discovery/upnp.cpp b/modules/services_discovery/upnp.cpp
index f1037c82c8..26d62c25e6 100644
--- a/modules/services_discovery/upnp.cpp
+++ b/modules/services_discovery/upnp.cpp
@@ -1142,6 +1142,7 @@ int MediaServer::sendActionCb( Upnp_EventType eventType,
IXML_Document* MediaServer::_browseAction( const char* psz_object_id_,
                                            const char* psz_browser_flag_,
                                            const char* psz_filter_,
+                                           const char* psz_starting_index,
                                            const char* psz_requested_count_,
                                            const char* psz_sort_criteria_ )
{
@@ -1186,7 +1187,7 @@ IXML_Document* MediaServer::_browseAction( const char* psz_object_id_,
     }

     i_res = UpnpAddToAction( &p_action, "Browse",
-            CONTENT_DIRECTORY_SERVICE_TYPE, "StartingIndex", "0" );
+            CONTENT_DIRECTORY_SERVICE_TYPE, "StartingIndex", psz_starting_index );
     if ( i_res != UPNP_E_SUCCESS )
     {
         msg_Dbg( m_access, "AddToAction 'StartingIndex' failed: %s",
@@ -1242,53 +1243,72 @@ browseActionCleanup:
  */
bool MediaServer::fetchContents()
{
-    IXML_Document* p_response = _browseAction( m_psz_objectId,
+    std::string StartingIndex = "0";
+    std::string RequestedCount = "5000";
+    const char* psz_TotalMatches = "0";
+    const char* psz_NumberReturned = "0";
+    long  l_reqCount = 0;
+
+    do
+    {
+      IXML_Document* p_response = _browseAction( m_psz_objectId,
                                       "BrowseDirectChildren",
                                       "*",
+                                      StartingIndex.c_str(),
                                       // Some servers don't understand "0" as "no-limit"
-                                      "5000", /* RequestedCount */
+                                      RequestedCount.c_str(), /* RequestedCount */
                                       "" /* SortCriteria */
                                       );
-    if ( !p_response )
-    {
+      if ( !p_response )
+      {
         msg_Err( m_access, "No response from browse() action" );
         return false;
-    }
+      }

-    IXML_Document* p_result = parseBrowseResult( p_response );
+      psz_TotalMatches = xml_getChildElementValue( (IXML_Element*)p_response, "TotalMatches" );
+      psz_NumberReturned = xml_getChildElementValue( (IXML_Element*)p_response, "NumberReturned" );

-    ixmlDocument_free( p_response );
+      StartingIndex = std::to_string(  std::stol(psz_NumberReturned) + std::stol(StartingIndex) );
+      l_reqCount = std::stol(psz_TotalMatches) - std::stol(StartingIndex) ;
+      RequestedCount = std::to_string(l_reqCount);

-    if ( !p_result )
-    {
+      IXML_Document* p_result = parseBrowseResult( p_response );
+
+      ixmlDocument_free( p_response );
+
+      if ( !p_result )
+      {
         msg_Err( m_access, "browse() response parsing failed" );
         return false;
-    }
+      }

#ifndef NDEBUG
-    msg_Dbg( m_access, "Got DIDL document: %s", ixmlPrintDocument( p_result ) );
+     msg_Dbg( m_access, "Got DIDL document: %s", ixmlPrintDocument( p_result ) );
#endif

-    IXML_NodeList* containerNodeList =
+     IXML_NodeList* containerNodeList =
                 ixmlDocument_getElementsByTagName( p_result, "container" );

-    if ( containerNodeList )
-    {
+     if ( containerNodeList )
+     {
         for ( unsigned int i = 0; i < ixmlNodeList_length( containerNodeList ); i++ )
             addContainer( (IXML_Element*)ixmlNodeList_item( containerNodeList, i ) );
         ixmlNodeList_free( containerNodeList );
-    }
+     }

-    IXML_NodeList* itemNodeList = ixmlDocument_getElementsByTagName( p_result,
+     IXML_NodeList* itemNodeList = ixmlDocument_getElementsByTagName( p_result,
                                                                      "item" );
-    if ( itemNodeList )
-    {
+     if ( itemNodeList )
+     {
         for ( unsigned int i = 0; i < ixmlNodeList_length( itemNodeList ); i++ )
             addItem( (IXML_Element*)ixmlNodeList_item( itemNodeList, i ) );
         ixmlNodeList_free( itemNodeList );
+      }
+
+      ixmlDocument_free( p_result );
     }
+    while( l_reqCount );

-    ixmlDocument_free( p_result );
     return true;
}

diff --git a/modules/services_discovery/upnp.hpp b/modules/services_discovery/upnp.hpp
index 9c128905d0..ab3e9c999b 100644
--- a/modules/services_discovery/upnp.hpp
+++ b/modules/services_discovery/upnp.hpp
@@ -157,7 +157,7 @@ private:
     bool addContainer( IXML_Element* containerElement );
     bool addItem( IXML_Element* itemElement );

-    IXML_Document* _browseAction(const char*, const char*,
+    IXML_Document* _browseAction(const char*, const char*, const char*,
             const char*, const char*, const char* );
     static int sendActionCb( Upnp_EventType, UpnpEventPtr, void *);

--
2.22.0

_______________________________________________
vlc-devel mailing list
To unsubscribe or modify your subscription options:
https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list