2005-07-01 [colin] 1.9.12cvs8
[claws.git] / src / common / log.c
index a26470de8c76370a7c208ed7b25a17e54b2e0a30..665bdfc43ed9928d7df6dce8d3e8e247bfbd187c 100644 (file)
 #  include "config.h"
 #endif
 
+#include "defs.h"
+
 #include <stdio.h>
 #include <glib.h>
 
-#include "defs.h"
 #include "utils.h"
 #include "log.h"
 #include "hooks.h"
 
 static FILE *log_fp = NULL;
 
+gboolean invoke_hook_cb (gpointer data)
+{
+       LogText *logtext = (LogText *)data;
+       hooks_invoke(LOG_APPEND_TEXT_HOOKLIST, logtext);
+       g_free(logtext->text);
+       g_free(logtext);
+       return FALSE;
+}
+
 void set_log_file(const gchar *filename)
 {
-       if (log_fp) return;
+       if (log_fp)
+               return;
+
+       /* backup old logfile if existing */
+       if (is_file_exist(filename)) {
+               gchar *backupname;
+               
+               backupname = g_strconcat(filename, ".bak", NULL);
+               if (rename(filename, backupname) < 0)
+                       FILE_OP_ERROR(filename, "rename");
+               g_free(backupname);
+       }
+
        log_fp = fopen(filename, "wb");
        if (!log_fp)
                FILE_OP_ERROR(filename, "fopen");
@@ -47,97 +69,85 @@ void close_log_file(void)
        }
 }
 
-static guint log_verbosity_count = 0;
-
-void log_verbosity_set(gboolean verbose)
-{
-       if (verbose)
-               log_verbosity_count++;
-       else if (log_verbosity_count > 0)
-               log_verbosity_count--;
-}
-
-#define TIME_LEN       11
-
 void log_print(const gchar *format, ...)
 {
        va_list args;
-       gchar buf[BUFFSIZE + TIME_LEN];
+       gchar buf[BUFFSIZE + LOG_TIME_LEN];
        time_t t;
-       LogText logtext;
-
+       LogText *logtext = g_new0(LogText, 1);
+       
        time(&t);
-       strftime(buf, TIME_LEN + 1, "[%H:%M:%S] ", localtime(&t));
+       strftime(buf, LOG_TIME_LEN + 1, "[%H:%M:%S] ", localtime(&t));
 
        va_start(args, format);
-       g_vsnprintf(buf + TIME_LEN, BUFFSIZE, format, args);
+       g_vsnprintf(buf + LOG_TIME_LEN, BUFFSIZE, format, args);
        va_end(args);
 
        if (debug_get_mode()) fputs(buf, stdout);
-       logtext.text = buf;
-       logtext.type = LOG_NORMAL;
-       hooks_invoke(LOG_APPEND_TEXT_HOOKLIST, &logtext);
+
+       logtext->text = g_strdup(buf);
+       logtext->type = LOG_NORMAL;
+       
+       g_timeout_add(0, invoke_hook_cb, logtext);
+       
        if (log_fp) {
                fputs(buf, log_fp);
                fflush(log_fp);
        }
-
-       logtext.text = buf + TIME_LEN;
-       if (log_verbosity_count)
-               hooks_invoke(STATUSBAR_PUTS_ALL_HOOKLIST, &logtext);
 }
 
 void log_message(const gchar *format, ...)
 {
        va_list args;
-       gchar buf[BUFFSIZE + TIME_LEN];
+       gchar buf[BUFFSIZE + LOG_TIME_LEN];
        time_t t;
-       LogText logtext;
+       LogText *logtext = g_new0(LogText, 1);
 
        time(&t);
-       strftime(buf, TIME_LEN + 1, "[%H:%M:%S] ", localtime(&t));
+       strftime(buf, LOG_TIME_LEN + 1, "[%H:%M:%S] ", localtime(&t));
 
        va_start(args, format);
-       g_vsnprintf(buf + TIME_LEN, BUFFSIZE, format, args);
+       g_vsnprintf(buf + LOG_TIME_LEN, BUFFSIZE, format, args);
        va_end(args);
 
-       if (debug_get_mode()) g_message("%s", buf + TIME_LEN);
-       logtext.text = buf + TIME_LEN;
-       logtext.type = LOG_MSG;
-       hooks_invoke(LOG_APPEND_TEXT_HOOKLIST, &logtext);
+       if (debug_get_mode()) g_message("%s", buf + LOG_TIME_LEN);
+       logtext->text = g_strdup(buf + LOG_TIME_LEN);
+       logtext->type = LOG_MSG;
+       
+       g_timeout_add(0, invoke_hook_cb, logtext);
+
        if (log_fp) {
-               fwrite(buf, TIME_LEN, 1, log_fp);
+               fwrite(buf, 1, LOG_TIME_LEN, log_fp);
                fputs("* message: ", log_fp);
-               fputs(buf + TIME_LEN, log_fp);
+               fputs(buf + LOG_TIME_LEN, log_fp);
                fflush(log_fp);
        }
-
-       logtext.text = buf + TIME_LEN;
-       hooks_invoke(STATUSBAR_PUTS_ALL_HOOKLIST, &logtext);
 }
 
 void log_warning(const gchar *format, ...)
 {
        va_list args;
-       gchar buf[BUFFSIZE + TIME_LEN];
+       gchar buf[BUFFSIZE + LOG_TIME_LEN];
        time_t t;
-       LogText logtext;
+       LogText *logtext = g_new0(LogText, 1);
 
        time(&t);
-       strftime(buf, TIME_LEN + 1, "[%H:%M:%S] ", localtime(&t));
+       strftime(buf, LOG_TIME_LEN + 1, "[%H:%M:%S] ", localtime(&t));
 
        va_start(args, format);
-       g_vsnprintf(buf + TIME_LEN, BUFFSIZE, format, args);
+       g_vsnprintf(buf + LOG_TIME_LEN, BUFFSIZE, format, args);
        va_end(args);
 
        g_warning("%s", buf);
-       logtext.text = buf + TIME_LEN;
-       logtext.type = LOG_WARN;
-       hooks_invoke(LOG_APPEND_TEXT_HOOKLIST, &logtext);
+       logtext->text = g_strdup(buf + LOG_TIME_LEN);
+       logtext->type = LOG_WARN;
+       
+       g_timeout_add(0, invoke_hook_cb, logtext);
+
        if (log_fp) {
-               fwrite(buf, TIME_LEN, 1, log_fp);
+               fwrite(buf, 1, LOG_TIME_LEN, log_fp);
                fputs("** warning: ", log_fp);
-               fputs(buf + TIME_LEN, log_fp);
+               fputs(buf + LOG_TIME_LEN, log_fp);
                fflush(log_fp);
        }
 }
@@ -145,25 +155,27 @@ void log_warning(const gchar *format, ...)
 void log_error(const gchar *format, ...)
 {
        va_list args;
-       gchar buf[BUFFSIZE + TIME_LEN];
+       gchar buf[BUFFSIZE + LOG_TIME_LEN];
        time_t t;
-       LogText logtext;
+       LogText *logtext = g_new0(LogText, 1);
 
        time(&t);
-       strftime(buf, TIME_LEN + 1, "[%H:%M:%S] ", localtime(&t));
+       strftime(buf, LOG_TIME_LEN + 1, "[%H:%M:%S] ", localtime(&t));
 
        va_start(args, format);
-       g_vsnprintf(buf + TIME_LEN, BUFFSIZE, format, args);
+       g_vsnprintf(buf + LOG_TIME_LEN, BUFFSIZE, format, args);
        va_end(args);
 
        g_warning("%s", buf);
-       logtext.text = buf + TIME_LEN;
-       logtext.type = LOG_ERROR;
-       hooks_invoke(LOG_APPEND_TEXT_HOOKLIST, &logtext);
+       logtext->text = g_strdup(buf + LOG_TIME_LEN);
+       logtext->type = LOG_ERROR;
+       
+       g_timeout_add(0, invoke_hook_cb, logtext);
+
        if (log_fp) {
-               fwrite(buf, TIME_LEN, 1, log_fp);
+               fwrite(buf, 1, LOG_TIME_LEN, log_fp);
                fputs("*** error: ", log_fp);
-               fputs(buf + TIME_LEN, log_fp);
+               fputs(buf + LOG_TIME_LEN, log_fp);
                fflush(log_fp);
        }
 }