⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 messages.c

📁 uclinux 下的vlc播放器源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
                      const char *psz_module,                      const char *psz_format, va_list _args ){    int         i_header_size;             /* Size of the additionnal header */    vlc_object_t *p_obj;    msg_bank_t  *p_bank;                                     /* message bank */    msg_queue_t *p_queue = NULL;    char *       psz_str = NULL;                 /* formatted message string */    char *       psz_header = NULL;    va_list      args;    msg_item_t * p_item = NULL;                        /* pointer to message */    msg_item_t   item;                    /* message in case of a full queue */#if !defined(HAVE_VASPRINTF) || defined(__APPLE__) || defined(SYS_BEOS)    int          i_size = strlen(psz_format) + INTF_MAX_MSG_SIZE;#endif    int i;    if( p_this == NULL || p_this->i_flags & OBJECT_FLAGS_QUIET ||        (p_this->i_flags & OBJECT_FLAGS_NODBG && i_type == VLC_MSG_DBG) )    {        return;    }    p_bank = &p_this->p_libvlc->msg_bank;    /*     * Convert message to string     */#if defined(HAVE_VASPRINTF) && !defined(__APPLE__) && !defined( SYS_BEOS )    vlc_va_copy( args, _args );    vasprintf( &psz_str, psz_format, args );    va_end( args );#else    psz_str = (char*) malloc( i_size * sizeof(char) );#endif    if( psz_str == NULL )    {        fprintf( stderr, "main warning: can't store message (%s): ",                 strerror(errno) );        vlc_va_copy( args, _args );        /* We should use utf8_vfprintf - but it calls malloc()... */        vfprintf( stderr, psz_format, args );        va_end( args );        fputs( "\n", stderr );        return;    }    i_header_size = 0;    p_obj = p_this;    while( p_obj != NULL )    {        char *psz_old = NULL;        if( p_obj == NULL ) break;        if( p_obj->psz_header )        {            i_header_size += strlen( p_obj->psz_header ) + 4;            if( psz_header )            {                psz_old = strdup( psz_header );                psz_header = (char*)realloc( psz_header, i_header_size );                snprintf( psz_header, i_header_size , "[%s] %s",                          p_obj->psz_header, psz_old );            }            else            {                psz_header = (char *)malloc( i_header_size );                snprintf( psz_header, i_header_size, "[%s]",                          p_obj->psz_header );            }        }        if( psz_old ) free( psz_old );        p_obj = p_obj->p_parent;    }#if !defined(HAVE_VASPRINTF) || defined(__APPLE__) || defined(SYS_BEOS)    vlc_va_copy( args, _args );    vsnprintf( psz_str, i_size, psz_format, args );    va_end( args );    psz_str[ i_size - 1 ] = 0; /* Just in case */#endif    /* Put message in queue */    vlc_mutex_lock( &p_bank->lock );    for( i = 0 ; i <p_bank->i_queues ;i++ )    {        if( p_bank->pp_queues[i]->i_id == i_queue_id )        {            p_queue = p_bank->pp_queues[i];        }    }    if( p_queue == NULL )    {        vlc_mutex_unlock( &p_bank->lock );        if( psz_str ) free( psz_str );        if( psz_header ) free( psz_header );        return;    }    vlc_mutex_lock( &p_queue->lock );    /* Check there is room in the queue for our message */    if( p_queue->b_overflow )    {        FlushMsg( p_queue );        if( ((p_queue->i_stop - p_queue->i_start + 1) % VLC_MSG_QSIZE) == 0 )        {            /* Still in overflow mode, print from a dummy item */            p_item = &item;        }        else        {            /* Pheeew, at last, there is room in the queue! */            p_queue->b_overflow = VLC_FALSE;        }    }    else if( ((p_queue->i_stop - p_queue->i_start + 2) % VLC_MSG_QSIZE) == 0 )    {        FlushMsg( p_queue );        if( ((p_queue->i_stop - p_queue->i_start + 2) % VLC_MSG_QSIZE) == 0 )        {            p_queue->b_overflow = VLC_TRUE;            if( p_queue->i_id == MSG_QUEUE_NORMAL )            {               /* Put the overflow message in the queue */                p_item = p_queue->msg + p_queue->i_stop;                p_queue->i_stop = (p_queue->i_stop + 1) % VLC_MSG_QSIZE;                p_item->i_type =        VLC_MSG_WARN;                p_item->i_object_id =   p_this->i_object_id;                p_item->i_object_type = p_this->i_object_type;                p_item->psz_module =    strdup( "message" );                p_item->psz_msg =       strdup( "message queue overflowed" );                p_item->psz_header =    NULL;               PrintMsg( p_this, p_item );               /* We print from a dummy item */               p_item = &item;            }        }    }    if( !p_queue->b_overflow )    {        /* Put the message in the queue */        p_item = p_queue->msg + p_queue->i_stop;        p_queue->i_stop = (p_queue->i_stop + 1) % VLC_MSG_QSIZE;    }    /* Fill message information fields */    p_item->i_type =        i_type;    p_item->i_object_id =   p_this->i_object_id;    p_item->i_object_type = p_this->i_object_type;    p_item->psz_module =    strdup( psz_module );    p_item->psz_msg =       psz_str;    p_item->psz_header =    psz_header;    if( p_queue->i_id == MSG_QUEUE_NORMAL )        PrintMsg( p_this, p_item );    if( p_queue->b_overflow )    {        if( p_item->psz_module )            free( p_item->psz_module );        if( p_item->psz_msg )            free( p_item->psz_msg );        if( p_item->psz_header )            free( p_item->psz_header );    }    vlc_mutex_unlock ( &p_queue->lock );    vlc_mutex_unlock( &p_bank->lock );}/* following functions are local *//***************************************************************************** * FlushMsg ***************************************************************************** * Print all messages remaining in queue. MESSAGE QUEUE MUST BE LOCKED, since * this function does not check the lock. *****************************************************************************/static void FlushMsg ( msg_queue_t *p_queue ){    int i_index, i_start, i_stop;    /* Get the maximum message index that can be freed */    i_stop = p_queue->i_stop;    /* Check until which value we can free messages */    for( i_index = 0; i_index < p_queue->i_sub; i_index++ )    {        i_start = p_queue->pp_sub[ i_index ]->i_start;        /* If this subscriber is late, we don't free messages before         * his i_start value, otherwise he'll miss messages */        if(   ( i_start < i_stop               && (p_queue->i_stop <= i_start || i_stop <= p_queue->i_stop) )           || ( i_stop < i_start               && (i_stop <= p_queue->i_stop && p_queue->i_stop <= i_start) ) )        {            i_stop = i_start;        }    }    /* Free message data */    for( i_index = p_queue->i_start;         i_index != i_stop;         i_index = (i_index+1) % VLC_MSG_QSIZE )    {        if( p_queue->msg[i_index].psz_msg )            free( p_queue->msg[i_index].psz_msg );        if( p_queue->msg[i_index].psz_module )            free( p_queue->msg[i_index].psz_module );        if( p_queue->msg[i_index].psz_header )            free( p_queue->msg[i_index].psz_header );    }    /* Update the new start value */    p_queue->i_start = i_index;}/***************************************************************************** * PrintMsg: output a standard message item to stderr ***************************************************************************** * Print a message to stderr, with colour formatting if needed. *****************************************************************************/static void PrintMsg ( vlc_object_t * p_this, msg_item_t * p_item ){#   define COL(x)  "\033[" #x ";1m"#   define RED     COL(31)#   define GREEN   COL(32)#   define YELLOW  COL(33)#   define WHITE   COL(37)#   define GRAY    "\033[0m"#ifdef UNDER_CE    int i_dummy;#endif    static const char * ppsz_type[4] = { "", " error", " warning", " debug" };    static const char *ppsz_color[4] = { WHITE, RED, YELLOW, GRAY };    char *psz_object = "private";    int i_type = p_item->i_type;    switch( i_type )    {        case VLC_MSG_ERR:            if( p_this->p_libvlc->i_verbose < 0 ) return;            break;        case VLC_MSG_INFO:            if( p_this->p_libvlc->i_verbose < 0 ) return;            break;        case VLC_MSG_WARN:            if( p_this->p_libvlc->i_verbose < 1 ) return;            break;        case VLC_MSG_DBG:            if( p_this->p_libvlc->i_verbose < 2 ) return;            break;    }    psz_object = msg_GetObjectTypeName(p_item->i_object_type);#ifdef UNDER_CE#   define CE_WRITE(str) WriteFile( p_this->p_libvlc->msg_bank.pp_queues[MSG_QUEUE_NORMAL]->logfile, \                                    str, strlen(str), &i_dummy, NULL );    CE_WRITE( p_item->psz_module );    CE_WRITE( " " );    CE_WRITE( psz_object );    CE_WRITE( ppsz_type[i_type] );    CE_WRITE( ": " );    CE_WRITE( p_item->psz_msg );    CE_WRITE( "\r\n" );    FlushFileBuffers( p_this->p_libvlc->msg_bank.pp_queues[MSG_QUEUE_NORMAL]->logfile );#else    /* Send the message to stderr */    if( p_this->p_libvlc->b_color )    {        if( p_item->psz_header )        {            utf8_fprintf( stderr, "[" GREEN "%.8i" GRAY "] %s %s %s%s: %s%s" GRAY                              "\n",                         p_item->i_object_id, p_item->psz_header,                         p_item->psz_module, psz_object,                         ppsz_type[i_type], ppsz_color[i_type],                         p_item->psz_msg );        }        else        {             utf8_fprintf( stderr, "[" GREEN "%.8i" GRAY "] %s %s%s: %s%s" GRAY "\n",                         p_item->i_object_id, p_item->psz_module, psz_object,                         ppsz_type[i_type], ppsz_color[i_type],                         p_item->psz_msg );        }    }    else    {        if( p_item->psz_header )        {            utf8_fprintf( stderr, "[%.8i] %s %s %s%s: %s\n", p_item->i_object_id,                         p_item->psz_header, p_item->psz_module,                         psz_object, ppsz_type[i_type], p_item->psz_msg );        }        else        {            utf8_fprintf( stderr, "[%.8i] %s %s%s: %s\n", p_item->i_object_id,                         p_item->psz_module, psz_object, ppsz_type[i_type],                         p_item->psz_msg );        }    }#   if defined(WIN32)    fflush( stderr );#   endif#endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -