]> git.sesse.net Git - vlc/blobdiff - plugins/text/logger.c
* ALL: got rid of p_object->p_this which is now useless.
[vlc] / plugins / text / logger.c
index 72c0d915e72de55aaf1d675d7f2ccec7322ce1f3..e6c3a31c7d68214cdbc105cbfcacc09b976cdbfa 100644 (file)
@@ -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 <sam@zoy.org>
  *
 #include <errno.h>                                                 /* ENOMEM */
 #include <stdio.h>
 
-#include <videolan/vlc.h>
+#include <vlc/vlc.h>
+#include <vlc/intf.h>
 
-#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 \
+    "<html>\n" \
+    "  <head>\n" \
+    "    <title>vlc log</title>\n" \
+    "  </head>\n" \
+    "  <body bgcolor=\"#000000\" text=\"#aaaaaa\">\n" \
+    "    <pre>\n" \
+    "      <b>-- logger module started --</b>\n"
+#define HTML_FOOTER \
+    "      <b>-- logger module stopped --</b>\n" \
+    "    </pre>\n" \
+    "  </body>\n" \
+    "</html>\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] = { "<font color=\"#ffffff\">",
+                                         "<font color=\"#ff6666\">",
+                                         "<font color=\"#ffff66\">",
+                                         "<font color=\"#aaaaaa\">" };
+
+    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( "</font>\n", p_file );
+}
+