[vlc-devel] [PATCH] PnP discovery: Evaluate "TotalMatches" and "NumberReturned"
Andreas Krug
akrug at arcor.de
Thu Apr 16 15:22:05 CEST 2020
Hi All,
I was asked again by a user for this patch because VLC-Player Version
3.0.9.2 Vetinari does not have a solution.
Who can review the patch?
Is there a process to set priority?
Next ticket created around that 4 months ago:
https://trac.videolan.org/vlc/ticket/23554
and theses are still open:
https://trac.videolan.org/vlc/ticket/15876
https://trac.videolan.org/vlc/ticket/21381
Thanks
Andreas
On 18.11.19 23:07, Andreas Krug wrote:
> 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