コード例 #1
0
ファイル: control_vlm.c プロジェクト: mahaserver/MHSVLC
char* libvlc_vlm_show_media( libvlc_instance_t *p_instance, char *psz_name,
                             libvlc_exception_t *p_exception )
{
    char *psz_message;
    vlm_message_t *answer;
    char *psz_response;

    CHECK_VLM;
#ifdef ENABLE_VLM
    asprintf( &psz_message, "show %s", psz_name );
    asprintf( &psz_response, "", psz_name );
    vlm_ExecuteCommand( p_instance->p_vlm, psz_message, &answer );
    if( answer->psz_value )
    {
        libvlc_exception_raise( p_exception, "Unable to call show %s: %s",
                                psz_name, answer->psz_value );
    }
    else
    {
        if ( answer->child )
        {
            psz_response = recurse_answer( "", answer );
        }
    }
    free( psz_message );
    return(psz_response );
#else
    libvlc_exception_raise( p_exception, "VLM has been disabled in this libvlc." );
    return NULL;
#endif
}
コード例 #2
0
ファイル: control_vlm.c プロジェクト: mahaserver/MHSVLC
/* local function to be used in libvlc_vlm_show_media only */
static char* recurse_answer( char* psz_prefix, vlm_message_t *p_answer ) {
    char* psz_childprefix;
    char* psz_response="";
    char* response_tmp;
    int i;
    vlm_message_t *aw_child, **paw_child;

    asprintf( &psz_childprefix, "%s%s.", psz_prefix, p_answer->psz_name );

    if ( p_answer->i_child )
    {
        paw_child = p_answer->child;
        aw_child = *( paw_child );
        for( i = 0; i < p_answer->i_child; i++ )
        {
            asprintf( &response_tmp, "%s%s%s:%s\n",
                      psz_response, psz_prefix, aw_child->psz_name,
                      aw_child->psz_value );
            free( psz_response );
            psz_response = response_tmp;
            if ( aw_child->i_child )
            {
                asprintf(&response_tmp, "%s%s", psz_response,
                         recurse_answer(psz_childprefix, aw_child));
                free( psz_response );
                psz_response = response_tmp;
            }
            paw_child++;
            aw_child = *( paw_child );
        }
    }
    free( psz_childprefix );
    return psz_response;
}
コード例 #3
0
ファイル: vlm.c プロジェクト: FLYKingdom/vlc
const char* libvlc_vlm_show_media( libvlc_instance_t *p_instance,
                                   const char *psz_name,
                                   libvlc_exception_t *p_exception )
{
    char *psz_message = NULL;
    vlm_message_t *answer = NULL;
    char *psz_response = NULL;
    const char *psz_fmt = NULL;
    const char *psz_delimiter = NULL;
    int i_list;
    vlm_t *p_vlm = NULL;

    VLM_RET(p_vlm, NULL);

    assert( psz_name );

    if( asprintf( &psz_message, "show %s", psz_name ) == -1 )
    {
        libvlc_exception_raise( p_exception );
        libvlc_printerr( "Not enough memory" );
        return NULL;
    }

    vlm_ExecuteCommand( p_vlm, psz_message, &answer );
    if( answer->psz_value )
    {
        libvlc_exception_raise( p_exception );
        libvlc_printerr( "Unable to call show %s: %s",
                         psz_name, answer->psz_value );
    }
    else if ( answer->child )
    {   /* in case everything was requested  */
        if ( strcmp( psz_name, "" ) == 0 )
        {
            psz_fmt = "{\n\t%s\n}\n";
            psz_delimiter = "\n\t";
            i_list = 0;
        }
        else
        {
            psz_fmt = "%s\n";
            psz_delimiter = "\n";
            i_list = 1;
        }
        if( asprintf( &psz_response, psz_fmt,
                      recurse_answer( answer, psz_delimiter, i_list ) ) == -1 )
        {
            libvlc_exception_raise( p_exception );
            libvlc_printerr( "Out of memory" );
        }
    }
    free( psz_message );
    return( psz_response );
}
コード例 #4
0
ファイル: vlm.c プロジェクト: Aakash-729/vlc
/* local function to be used in libvlc_vlm_show_media only */
static char* recurse_answer( vlm_message_t *p_answer, const char* psz_delim,
                             const int i_list ) {
    char* psz_childdelim = NULL;
    char* psz_nametag = NULL;
    char* psz_response = strdup( "" );
    char *psz_tmp;
    int i_success = 0;
    int i;
    vlm_message_t *aw_child, **paw_child;

    i_success = asprintf( &psz_childdelim, "%s\t", psz_delim);
    if( i_success == -1 )
        return psz_response;

    paw_child = p_answer->child;
    aw_child = *( paw_child );
    /* Iterate over children */
    for( i = 0; i < p_answer->i_child; i++ )
    {
        /* Spare comma if it is the last element */
        char c_comma = ',';
        if( i == (p_answer->i_child - 1) )
            c_comma = ' ';

        /* Append name of child node, if not in a list */
        if( !i_list )
        {
            i_success = asprintf( &psz_tmp, "%s\"%s\": ",
                          psz_response, aw_child->psz_name );
            if( i_success == -1 ) break;
            free( psz_response );
            psz_response = psz_tmp;
        }

        /* If child node has children, */
        if( aw_child->i_child )
        {
            /* If the parent node is a list (hence the child node is
             * inside a list), create a property of its name as if it
             * had a name value node
             */
            free( psz_nametag );
            if( i_list )
            {
                i_success = asprintf( &psz_nametag, "\"name\": \"%s\",%s",
                              aw_child->psz_name, psz_childdelim );
                if( i_success == -1 )
                {
                    psz_nametag = NULL;
                    break;
                }
            }
            else
            {
                psz_nametag = strdup( "" );
            }
            /* If the child is a list itself, format it accordingly and
             * recurse through the child's children, telling them that
             * they are inside a list.
             */
            if( strcmp( aw_child->psz_name, "media" ) == 0 ||
                strcmp( aw_child->psz_name, "inputs" ) == 0 ||
                strcmp( aw_child->psz_name, "options" ) == 0 )
            {
                char *psz_recurse = recurse_answer( aw_child, psz_childdelim, 1 );
                i_success = asprintf( &psz_tmp, "%s[%s%s%s]%c%s",
                                      psz_response, psz_childdelim, psz_recurse,
                                      psz_delim, c_comma, psz_delim );
                free( psz_recurse );
                if( i_success == -1 ) break;
                free( psz_response );
                psz_response = psz_tmp;
            }
            /* Not a list, so format the child as a JSON object and
             * recurse through the child's children
             */
            else
            {
                char *psz_recurse = recurse_answer( aw_child, psz_childdelim, 0 );
                i_success = asprintf( &psz_tmp, "%s{%s%s%s%s}%c%s",
                                      psz_response, psz_childdelim, psz_nametag,
                                      psz_recurse, psz_delim, c_comma, psz_delim );
                free( psz_recurse );
                if( i_success == -1 ) break;
                free( psz_response );
                psz_response = psz_tmp;
            }
        }
        /* Otherwise - when no children are present - the node is a
         * value node. So print the value string
         */
        else
        {
            /* If value is equivalent to NULL, print it as null */
            if( aw_child->psz_value == NULL
                || strcmp( aw_child->psz_value, "(null)" ) == 0 )
            {
                i_success = asprintf( &psz_tmp, "%snull%c%s",
                                      psz_response, c_comma, psz_delim );
                if( i_success == -1 ) break;
                free( psz_response );
                psz_response = psz_tmp;
            }
            /* Otherwise print the value in quotation marks */
            else
            {
                i_success = asprintf( &psz_tmp, "%s\"%s\"%c%s",
                                      psz_response, aw_child->psz_value,
                                      c_comma, psz_delim );
                if( i_success == -1 ) break;
                free( psz_response );
                psz_response = psz_tmp;
            }
        }
        /* getting next child */
        paw_child++;
        aw_child = *( paw_child );
    }
    free( psz_nametag );
    free( psz_childdelim );
    if( i_success == -1 )
    {
        free( psz_response );
        psz_response = strdup( "" );
    }
    return psz_response;
}