[vlc-devel] [PATCH] PnP discovery: Evaluate "TotalMatches" and "NumberReturned"

Andreas Krug akrug at arcor.de
Mon Nov 18 23:07:08 CET 2019


Hi All,

ping again for review.

Seems that there some more user than me facing this issue with 
Panasonic, received an e-mail on Friday from a user.

Affected tickets:

https://trac.videolan.org/vlc/ticket/15876
https://trac.videolan.org/vlc/ticket/22496
https://trac.videolan.org/vlc/ticket/21381

Thanks

Andreas


On 16.07.19 16:14, Andreas Krug wrote:
>      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 *);
>   


More information about the vlc-devel mailing list