Changeset 815 for trunk/libtransmission


Ignore:
Timestamp:
Aug 22, 2006, 2:12:58 AM (15 years ago)
Author:
joshe
Message:

Rework the message stuff again to be easier on the frontend.

Location:
trunk/libtransmission
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/transmission.c

    r791 r815  
    4545    int           i, r;
    4646
     47    tr_msgInit();
    4748    tr_netResolveThreadInit();
    4849
  • trunk/libtransmission/transmission.h

    r803 r815  
    6262
    6363/***********************************************************************
    64  * tr_setMessageFunction
    65  ***********************************************************************
    66  * Sets the function used to display libtransmission messages.  This
    67  * function must be reentrant, it may be called from different threads.
    68  * A NULL argument means to print messages to stderr.  The function's
    69  * prototype should look like this: void myMsgFunc( int, const char * );
    70  **********************************************************************/
    71 void tr_setMessageFunction( void (*func)( int, const char * ) );
    72 
    73 /***********************************************************************
    7464 * tr_setMessageLevel
    7565 ***********************************************************************
    76  * Set the level of messages to be output
     66 * Set the level of messages to be output or queued
    7767 **********************************************************************/
    7868#define TR_MSG_ERR 1
     
    8171void tr_setMessageLevel( int );
    8272int tr_getMessageLevel( void );
     73
     74/***********************************************************************
     75 * tr_setMessageQueuing
     76 ***********************************************************************
     77 * Enable or disable message queuing
     78 **********************************************************************/
     79typedef struct tr_msg_list_s tr_msg_list_t;
     80void tr_setMessageQueuing( int );
     81
     82/***********************************************************************
     83 * tr_getQueuedMessages
     84 ***********************************************************************
     85 * Return a list of queued messages
     86 **********************************************************************/
     87tr_msg_list_t * tr_getQueuedMessages( void );
     88void tr_freeMessageList( tr_msg_list_t * list );
    8389
    8490/***********************************************************************
     
    345351};
    346352
     353struct tr_msg_list_s
     354{
     355    int                    level;
     356    char                 * message;
     357    struct tr_msg_list_s * next;
     358};
     359
    347360#ifdef __TRANSMISSION__
    348361#  include "internal.h"
  • trunk/libtransmission/utils.c

    r803 r815  
    2525#include "transmission.h"
    2626
    27 static void (*messageFunc)( int, const char * );
    28 
    29 static int verboseLevel = 0;
    30 
    31 void tr_setMessageFunction( void (*func)( int, const char * ) )
    32 {
    33     messageFunc = func;
     27static tr_lock_t      * messageLock = NULL;
     28static int              messageLevel = 0;
     29static int              messageQueuing = 0;
     30static tr_msg_list_t *  messageQueue = NULL;
     31static tr_msg_list_t ** messageQueueTail = &messageQueue;
     32
     33void tr_msgInit( void )
     34{
     35    if( NULL == messageLock )
     36    {
     37        messageLock = calloc( 1, sizeof( *messageLock ) );
     38        tr_lockInit( messageLock );
     39    }
    3440}
    3541
    3642void tr_setMessageLevel( int level )
    3743{
    38     verboseLevel = MAX( 0, level );
     44    tr_lockLock( messageLock );
     45    messageLevel = MAX( 0, level );
     46    tr_lockUnlock( messageLock );
    3947}
    4048
    4149int tr_getMessageLevel( void )
    4250{
    43     return verboseLevel;
     51    int ret;
     52
     53    tr_lockLock( messageLock );
     54    ret = messageLevel;
     55    tr_lockUnlock( messageLock );
     56
     57    return ret;
     58}
     59
     60void tr_setMessageQueuing( int enabled )
     61{
     62    tr_lockLock( messageLock );
     63    messageQueuing = enabled;
     64    tr_lockUnlock( messageLock );
     65}
     66
     67tr_msg_list_t * tr_getQueuedMessages( void )
     68{
     69    tr_msg_list_t * ret;
     70
     71    tr_lockLock( messageLock );
     72    ret = messageQueue;
     73    messageQueue = NULL;
     74    messageQueueTail = &messageQueue;
     75    tr_lockUnlock( messageLock );
     76
     77    return ret;
     78}
     79
     80void tr_freeMessageList( tr_msg_list_t * list )
     81{
     82    tr_msg_list_t * next;
     83
     84    while( NULL != list )
     85    {
     86        next = list->next;
     87        free( list->message );
     88        free( list );
     89        list = next;
     90    }
    4491}
    4592
    4693void tr_msg( int level, char * msg, ... )
    4794{
    48     char         string[256];
    49     va_list      args;
    50 
    51     if( !verboseLevel )
     95    va_list          args;
     96    tr_msg_list_t * newmsg;
     97
     98    tr_lockLock( messageLock );
     99
     100    if( !messageLevel )
    52101    {
    53102        char * env;
    54103        env          = getenv( "TR_DEBUG" );
    55         verboseLevel = ( env ? atoi( env ) : 0 ) + 1;
    56         verboseLevel = MAX( 1, verboseLevel );
    57     }
    58 
    59     if( verboseLevel < level )
    60     {
    61         return;
    62     }
    63 
    64     va_start( args, msg );
    65     vsnprintf( string, sizeof( string ), msg, args );
    66     va_end( args );
    67 
    68     if( NULL == messageFunc )
    69     {
    70         fprintf( stderr, "%s\n", string );
    71     }
    72     else
    73     {
    74         messageFunc( level, string );
    75     }
     104        messageLevel = ( env ? atoi( env ) : 0 ) + 1;
     105        messageLevel = MAX( 1, messageLevel );
     106    }
     107
     108    if( messageLevel >= level )
     109    {
     110        va_start( args, msg );
     111        if( messageQueuing )
     112        {
     113            newmsg = calloc( 1, sizeof( *newmsg ) );
     114            if( NULL != newmsg )
     115            {
     116                newmsg->level = level;
     117                vasprintf( &newmsg->message, msg, args );
     118                if( NULL == newmsg->message )
     119                {
     120                    free( newmsg );
     121                }
     122                else
     123                {
     124                    *messageQueueTail = newmsg;
     125                    messageQueueTail = &newmsg->next;
     126                }
     127            }
     128        }
     129        else
     130        {
     131            vfprintf( stderr, msg, args );
     132            fputc( '\n', stderr );
     133        }
     134        va_end( args );
     135    }
     136
     137    tr_lockUnlock( messageLock );
    76138}
    77139
  • trunk/libtransmission/utils.h

    r798 r815  
    2525#ifndef TR_UTILS_H
    2626#define TR_UTILS_H 1
     27
     28void tr_msgInit( void );
    2729
    2830#define tr_err( a... ) tr_msg( TR_MSG_ERR, ## a )
Note: See TracChangeset for help on using the changeset viewer.