X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=plugins%2Ftext%2Flogger.c;h=e6c3a31c7d68214cdbc105cbfcacc09b976cdbfa;hb=71ec135b95bd6fa66b042dccc16ac928ae225ee3;hp=72c0d915e72de55aaf1d675d7f2ccec7322ce1f3;hpb=4f6c862b021281a7e44a93aa5c774e6bb07a6a78;p=vlc diff --git a/plugins/text/logger.c b/plugins/text/logger.c index 72c0d915e7..e6c3a31c7d 100644 --- a/plugins/text/logger.c +++ b/plugins/text/logger.c @@ -2,7 +2,7 @@ * logger.c : file logging plugin for vlc ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: logger.c,v 1.6 2002/04/19 13:56:11 sam Exp $ + * $Id: logger.c,v 1.11 2002/06/01 18:04:49 sam Exp $ * * Authors: Samuel Hocevar * @@ -30,22 +30,42 @@ #include /* ENOMEM */ #include -#include +#include +#include -#include "interface.h" +#define MODE_TEXT 0 +#define MODE_HTML 1 -#define LOG_FILE "vlc.log" +#define LOG_FILE "vlc-log.txt" #define LOG_STRING( msg, file ) fwrite( msg, strlen( msg ), 1, file ); +#define TEXT_HEADER "-- logger module started --\n" +#define TEXT_FOOTER "-- logger module stopped --\n" + +#define HTML_HEADER \ + "\n" \ + " \n" \ + " vlc log\n" \ + " \n" \ + " \n" \ + "
\n" \
+    "      -- logger module started --\n"
+#define HTML_FOOTER \
+    "      -- logger module stopped --\n" \
+    "    
\n" \ + " \n" \ + "\n" + /***************************************************************************** * intf_sys_t: description and status of log interface *****************************************************************************/ -typedef struct intf_sys_s +struct intf_sys_s { - FILE * p_file; /* The log file */ - intf_subscription_t *p_sub; + int i_mode; -} intf_sys_t; + FILE * p_file; /* The log file */ + msg_subscription_t *p_sub; +}; /***************************************************************************** * Local prototypes. @@ -55,18 +75,22 @@ static int intf_Open ( intf_thread_t *p_intf ); static void intf_Close ( intf_thread_t *p_intf ); static void intf_Run ( intf_thread_t *p_intf ); -static void FlushQueue ( intf_subscription_t *, FILE * ); +static void FlushQueue ( msg_subscription_t *, FILE *, int ); +static void TextPrint ( const msg_item_t *, FILE * ); +static void HtmlPrint ( const msg_item_t *, FILE * ); /***************************************************************************** * Build configuration tree. *****************************************************************************/ MODULE_CONFIG_START + ADD_CATEGORY_HINT( N_("Miscellaneous"), NULL ) + ADD_STRING( "logfile", NULL, NULL, N_("log filename"), N_("Specify the log filename.") ) + ADD_STRING( "logmode", NULL, NULL, N_("log format"), N_("Specify the log format. Available choices are \"text\" (default) and \"html\"") ) MODULE_CONFIG_STOP MODULE_INIT_START SET_DESCRIPTION( _("file logging interface module") ) ADD_CAPABILITY( INTF, 1 ) - ADD_SHORTCUT( "logger" ) MODULE_INIT_STOP MODULE_ACTIVATE_START @@ -92,57 +116,95 @@ static void intf_getfunctions( function_list_t * p_function_list ) *****************************************************************************/ static int intf_Open( intf_thread_t *p_intf ) { - char *psz_filename_tmp, *psz_filename; + char *psz_mode, *psz_file; + +#ifdef WIN32 + AllocConsole(); + freopen( "CONOUT$", "w", stdout ); + freopen( "CONOUT$", "w", stderr ); + freopen( "CONIN$", "r", stdin ); + msg_Info( p_intf, VERSION_MESSAGE ); + msg_Info( p_intf, _("\nUsing the logger interface plugin...") ); +#endif /* Allocate instance and initialize some members */ p_intf->p_sys = (intf_sys_t *)malloc( sizeof( intf_sys_t ) ); if( p_intf->p_sys == NULL ) { - intf_ErrMsg( "intf error: %s", strerror(ENOMEM) ); + msg_Err( p_intf, "out of memory" ); return -1; } - if( !(psz_filename = psz_filename_tmp - = config_GetPszVariable( "intf" )) ) + psz_mode = config_GetPsz( p_intf, "logmode" ); + if( psz_mode ) { - intf_ErrMsg( "intf error: configuration variable intf empty" ); - return -1; - } + if( !strcmp( psz_mode, "text" ) ) + { + p_intf->p_sys->i_mode = MODE_TEXT; + } + else if( !strcmp( psz_mode, "html" ) ) + { + p_intf->p_sys->i_mode = MODE_HTML; + } + else + { + msg_Err( p_intf, "invalid log mode `%s', using `text'", psz_mode ); + p_intf->p_sys->i_mode = MODE_TEXT; + } - while( *psz_filename && *psz_filename != ':' ) - { - psz_filename++; + free( psz_mode ); } - - if( *psz_filename == ':' ) + else { - psz_filename++; + msg_Warn( p_intf, "no log mode specified, using `text'" ); + p_intf->p_sys->i_mode = MODE_TEXT; } - else + + psz_file = config_GetPsz( p_intf, "logfile" ); + if( !psz_file ) { - intf_ErrMsg( "intf error: no log filename provided, using `%s'", - LOG_FILE ); - psz_filename = LOG_FILE; + switch( p_intf->p_sys->i_mode ) + { + case MODE_HTML: + psz_file = strdup( "vlc-log.html" ); + break; + case MODE_TEXT: + default: + psz_file = strdup( "vlc-log.txt" ); + break; + } + + msg_Warn( p_intf, "no log filename provided, using `%s'", psz_file ); } - /* Open the log file */ - intf_WarnMsg( 1, "intf: opening logfile `%s'", psz_filename ); - p_intf->p_sys->p_file = fopen( psz_filename, "w" ); + /* Open the log file and remove any buffering for the stream */ + msg_Dbg( p_intf, "opening logfile `%s'", psz_file ); + p_intf->p_sys->p_file = fopen( psz_file, "wt" ); + setvbuf( p_intf->p_sys->p_file, NULL, _IONBF, 0 ); - p_intf->p_sys->p_sub = intf_MsgSub(); + p_intf->p_sys->p_sub = msg_Subscribe( p_intf ); if( p_intf->p_sys->p_file == NULL ) { - intf_ErrMsg( "intf error: error opening logfile `%s'", psz_filename ); + msg_Err( p_intf, "error opening logfile `%s'", psz_file ); free( p_intf->p_sys ); - intf_MsgUnsub( p_intf->p_sys->p_sub ); - free( psz_filename_tmp ); + msg_Unsubscribe( p_intf, p_intf->p_sys->p_sub ); + free( psz_file ); return -1; } - free( psz_filename_tmp ); + free( psz_file ); - LOG_STRING( "-- log plugin started --\n", p_intf->p_sys->p_file ); + switch( p_intf->p_sys->i_mode ) + { + case MODE_HTML: + LOG_STRING( HTML_HEADER, p_intf->p_sys->p_file ); + break; + case MODE_TEXT: + default: + LOG_STRING( TEXT_HEADER, p_intf->p_sys->p_file ); + break; + } return 0; } @@ -153,10 +215,20 @@ static int intf_Open( intf_thread_t *p_intf ) static void intf_Close( intf_thread_t *p_intf ) { /* Flush the queue and unsubscribe from the message queue */ - FlushQueue( p_intf->p_sys->p_sub, p_intf->p_sys->p_file ); - intf_MsgUnsub( p_intf->p_sys->p_sub ); + FlushQueue( p_intf->p_sys->p_sub, p_intf->p_sys->p_file, + p_intf->p_sys->i_mode ); + msg_Unsubscribe( p_intf, p_intf->p_sys->p_sub ); - LOG_STRING( "-- log plugin stopped --\n", p_intf->p_sys->p_file ); + switch( p_intf->p_sys->i_mode ) + { + case MODE_HTML: + LOG_STRING( HTML_FOOTER, p_intf->p_sys->p_file ); + break; + case MODE_TEXT: + default: + LOG_STRING( TEXT_FOOTER, p_intf->p_sys->p_file ); + break; + } /* Close the log file */ fclose( p_intf->p_sys->p_file ); @@ -173,11 +245,10 @@ static void intf_Close( intf_thread_t *p_intf ) *****************************************************************************/ static void intf_Run( intf_thread_t *p_intf ) { - while( !p_intf->b_die ) + while( !p_intf->p_vlc->b_die ) { - p_intf->pf_manage( p_intf ); - - FlushQueue( p_intf->p_sys->p_sub, p_intf->p_sys->p_file ); + FlushQueue( p_intf->p_sys->p_sub, p_intf->p_sys->p_file, + p_intf->p_sys->i_mode ); msleep( INTF_IDLE_SLEEP ); } @@ -186,10 +257,9 @@ static void intf_Run( intf_thread_t *p_intf ) /***************************************************************************** * FlushQueue: flush the message queue into the log file *****************************************************************************/ -static void FlushQueue( intf_subscription_t *p_sub, FILE *p_file ) +static void FlushQueue( msg_subscription_t *p_sub, FILE *p_file, int i_mode ) { int i_start, i_stop; - char *psz_msg; vlc_mutex_lock( p_sub->p_lock ); i_stop = *p_sub->pi_stop; @@ -200,11 +270,18 @@ static void FlushQueue( intf_subscription_t *p_sub, FILE *p_file ) /* Append all messages to log file */ for( i_start = p_sub->i_start; i_start != i_stop; - i_start = (i_start+1) % INTF_MSG_QSIZE ) + i_start = (i_start+1) % VLC_MSG_QSIZE ) { - psz_msg = p_sub->p_msg[i_start].psz_msg; - LOG_STRING( psz_msg, p_file ); - LOG_STRING( "\n", p_file ); + switch( i_mode ) + { + case MODE_HTML: + HtmlPrint( &p_sub->p_msg[i_start], p_file ); + break; + case MODE_TEXT: + default: + TextPrint( &p_sub->p_msg[i_start], p_file ); + break; + } } vlc_mutex_lock( p_sub->p_lock ); @@ -213,3 +290,28 @@ static void FlushQueue( intf_subscription_t *p_sub, FILE *p_file ) } } +static const char *ppsz_type[4] = { ": ", " error: ", + " warning: ", " debug: " }; + +static void TextPrint( const msg_item_t *p_msg, FILE *p_file ) +{ + LOG_STRING( p_msg->psz_module, p_file ); + LOG_STRING( ppsz_type[p_msg->i_type], p_file ); + LOG_STRING( p_msg->psz_msg, p_file ); + LOG_STRING( "\n", p_file ); +} + +static void HtmlPrint( const msg_item_t *p_msg, FILE *p_file ) +{ + static const char *ppsz_color[4] = { "", + "", + "", + "" }; + + LOG_STRING( p_msg->psz_module, p_file ); + LOG_STRING( ppsz_type[p_msg->i_type], p_file ); + LOG_STRING( ppsz_color[p_msg->i_type], p_file ); + LOG_STRING( p_msg->psz_msg, p_file ); + LOG_STRING( "\n", p_file ); +} +