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 }
/* 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; }
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 ); }
/* 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; }