[vlc-devel] [PATCH] upnp: fetch all media items correctly. (#6716)

mirsal mirsal at mirsal.fr
Mon Apr 30 13:15:04 CEST 2012


Hi Naohiro

Thanks for the patch !
A few comments inline.

On Mon, 2012-04-30 at 18:02 +0900, Naohiro KORIYAMA wrote:
> From 21a97945ce3e867a0856e6fc663b79f106f5b875 Mon Sep 17 00:00:00 2001
> From: Naohiro KORIYAMA <nkoriyama at gmail.com>
> Date: Mon, 30 Apr 2012 17:57:19 +0900
> Subject: [PATCH 17/17] upnp: fetch all media items correctly. (#6716)
> 
> ---
>  modules/services_discovery/upnp.cpp |   87
> +++++++++++++++++++++++++++++++----
>  modules/services_discovery/upnp.hpp |    2 +-
>  2 files changed, 78 insertions(+), 11 deletions(-)
> 
> diff --git a/modules/services_discovery/upnp.cpp
> b/modules/services_discovery/upnp.cpp
> index dc239f3..ff38462 100644
> --- a/modules/services_discovery/upnp.cpp
> +++ b/modules/services_discovery/upnp.cpp
> @@ -236,13 +242,47 @@ IXML_Document* parseBrowseResult( IXML_Document*
> p_doc )
>      IXML_Node* p_text_node = ixmlNode_getFirstChild( p_result_node );
>      if ( !p_text_node ) return 0;
>  
> -    const char* psz_result_string =
> ixmlNode_getNodeValue( p_text_node );
> +    return ixmlNode_getNodeValue( p_text_node );
> +}
> +
> +/*
> + * Extracts the result document from a SOAP response
> + */
> +IXML_Document* parseBrowseResult( IXML_Document* p_doc )
> +{
> +    ixmlRelaxParser( 1 );
> +
> +    const char* psz_result_string = xml_getChildElementValue( p_doc,
> "Result" );
> +    if( !psz_result_string ) return 0;
>  
>      IXML_Document* p_browse_doc = ixmlParseBuffer( psz_result_string
> );
>  
>      return p_browse_doc;
>  }
>  
> +/*
> + * Get the number value from a SOAP response
> + */
> +int parseBrowseNumberValue( IXML_Document* p_doc,
> +                            const char* psz_tag_name_ )
> +{
> +    ixmlRelaxParser( 1 );

You shouldn't need to relax the parser more than once,
does it fail if you remove that ?

> +    const char* psz_number_string = xml_getChildElementValue( p_doc,
> +
> psz_tag_name_ );
> +    if( !psz_number_string ) return 0;
> +
> +    char *psz_end;
> +    long l = strtol( psz_number_string, &psz_end, 10 );
> +    if( *psz_end || l < 0 || l > INT_MAX )
> +    {
> +        return 0;
> +    }
> +    else
> +    {
> +        return (int)l;
> +    }
> +}
>  
>  /*
>   * Handles all UPnP events
> @@ -709,7 +749,7 @@ void MediaServer::fetchContents()
>  
>      Container* root = new Container( 0, "0", getFriendlyName() );
>  
> -    _fetchContents( root );
> +    _fetchContents( root, 0 );
>  
>      _p_contents = root;
>      _p_contents->setInputItem( _p_input_item );
> @@ -720,7 +760,7 @@ void MediaServer::fetchContents()
>  /*
>   * Fetches and parses the UPNP response
>   */
> -bool MediaServer::_fetchContents( Container* p_parent )
> +bool MediaServer::_fetchContents( Container* p_parent, int
> i_starting_index )
>  {
>      if (!p_parent)
>      {
> @@ -728,9 +768,21 @@ bool MediaServer::_fetchContents( Container*
> p_parent )
>          return false;
>      }
>  
> +    char* psz_starting_index;
> +    if( asprintf( &psz_starting_index, "%d", i_starting_index ) < 0 )
> +    {
> +        msg_Err( _p_sd, "asprintf error:%d", i_starting_index );
> +        return false;
> +    }
> +
>      IXML_Document* p_response =
> _browseAction( p_parent->getObjectID(),
>                                        "BrowseDirectChildren",
> -                                      "*", "0", "0", "" );
> +                                      "*", /* Filter */
> +                                      psz_starting_index, /*
> StartingIndex */
> +                                      "0", /* RequestedCount */
> +                                      "" /* SortCriteria */
> +                                      );
> +    free( psz_starting_index );
>      if ( !p_response )
>      {
>          msg_Err( _p_sd, "No response from browse() action" );
> @@ -738,6 +790,12 @@ bool MediaServer::_fetchContents( Container*
> p_parent )
>      }
>  
>      IXML_Document* p_result = parseBrowseResult( p_response );
> +    int i_number_returned = parseBrowseNumberValue( p_response,
> "NumberReturned" );
> +    int i_total_matches = parseBrowseNumberValue( p_response ,
> "TotalMatches" );

Please use #define for tag names.

> +#ifndef NDEBUG
> +    msg_Dbg( _p_sd, "i_starting_index[%d]i_number_returned[%
> d]_total_matches[%d]\n",
> +             i_starting_index, i_number_returned, i_total_matches );
> +#endif
>      ixmlDocument_free( p_response );
>  
>      if ( !p_result )
> @@ -777,7 +835,7 @@ bool MediaServer::_fetchContents( Container*
> p_parent )
>  
>              Container* container = new Container( p_parent, objectID,
> title );
>              p_parent->addContainer( container );
> -            _fetchContents( container );
> +            _fetchContents( container, 0 );
>          }
>          ixmlNodeList_free( containerNodeList );
>      }
> @@ -833,6 +891,15 @@ bool MediaServer::_fetchContents( Container*
> p_parent )
>      }
>  
>      ixmlDocument_free( p_result );
> +
> +    if( i_starting_index + i_number_returned < i_total_matches )
> +    {
> +        if( !_fetchContents( p_parent, i_starting_index +
> i_number_returned ) )
> +        {
> +            return false;
> +        }
> +    }
> +
>      return true;
>  }

I'd rather have:

if( i_starting_index + i_number_returned < i_total_matches )
{
    return _fetchContents( p_parent,
                           i_starting_index + i_number_returned );
}

return true;

Best regards,
> 
-- 
mirsal 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 490 bytes
Desc: This is a digitally signed message part
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20120430/834d8c20/attachment.sig>


More information about the vlc-devel mailing list