[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
Steve Lhomme
robux4 at ycbcr.xyz
Tue Jul 16 08:13:27 CEST 2019
On 2019-07-16 0:06, Sean McGovern wrote:
> Hi,
>
> Please please PLEASE, shorten your commit message.
>
> Quick header line summarizing the change, then a blank line and then add detailed information there.
Big +1
> -- 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
> _______________________________________________
> 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