summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2007-11-11 14:36:34 +0100
committerSebastien Helleu <flashcode@flashtux.org>2007-11-11 14:36:34 +0100
commitcdc08d6fc38d0c81e4826930b266f74a33ca2185 (patch)
tree50b6c599cfa6cae19ce9e5f9d7bd1ffd684b236f /src
parent4478777876a5b285c78a3daef02fd970eb2d5597 (diff)
downloadweechat-cdc08d6fc38d0c81e4826930b266f74a33ca2185.zip
Added logger plugin
Diffstat (limited to 'src')
-rw-r--r--src/gui/CMakeLists.txt5
-rw-r--r--src/gui/Makefile.am2
-rw-r--r--src/gui/gui-buffer.c32
-rw-r--r--src/gui/gui-buffer.h4
-rw-r--r--src/gui/gui-log.c150
-rw-r--r--src/plugins/CMakeLists.txt12
-rw-r--r--src/plugins/Makefile.am38
-rw-r--r--src/plugins/logger/CMakeLists.txt22
-rw-r--r--src/plugins/logger/Makefile.am25
-rw-r--r--src/plugins/logger/logger-buffer.c143
-rw-r--r--src/plugins/logger/logger-buffer.h40
-rw-r--r--src/plugins/logger/logger.c392
-rw-r--r--src/plugins/logger/logger.h (renamed from src/gui/gui-log.h)16
-rw-r--r--src/plugins/plugin-api.c2
14 files changed, 659 insertions, 224 deletions
diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt
index fd9483960..2863f557b 100644
--- a/src/gui/CMakeLists.txt
+++ b/src/gui/CMakeLists.txt
@@ -21,9 +21,8 @@ ENDIF(NOT DISABLE_NCURSES)
SET(LIB_GUI_COMMON_SRC gui-action.c gui-action.h gui-buffer.c gui-buffer.h
gui-chat.c gui-chat.h gui-color.c gui-color.h gui-completion.c gui-completion.h
gui-history.c gui-history.h gui-hotlist.c gui-hotlist.h gui-infobar.c
-gui-infobar.h gui-input.c gui-input.h gui-keyboard.c gui-keyboard.h gui-log.c
-gui-log.h gui-main.h gui-nicklist.c gui-nicklist.h gui-status.h gui-window.c
-gui-window.h)
+gui-infobar.h gui-input.c gui-input.h gui-keyboard.c gui-keyboard.h gui-main.h
+gui-nicklist.c gui-nicklist.h gui-status.h gui-window.c gui-window.h)
INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR})
ADD_LIBRARY(weechat_gui_common STATIC ${LIB_GUI_COMMON_SRC})
diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am
index 65bd8b7ab..d53474ead 100644
--- a/src/gui/Makefile.am
+++ b/src/gui/Makefile.am
@@ -38,8 +38,6 @@ lib_weechat_gui_common_a_SOURCES = gui-action.c \
gui-input.h \
gui-keyboard.c \
gui-keyboard.h \
- gui-log.c \
- gui-log.h \
gui-main.h \
gui-status.h \
gui-window.c \
diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c
index aee0c03be..e477541c7 100644
--- a/src/gui/gui-buffer.c
+++ b/src/gui/gui-buffer.c
@@ -39,7 +39,6 @@
#include "gui-input.h"
#include "gui-main.h"
#include "gui-nicklist.h"
-#include "gui-log.h"
#include "gui-status.h"
#include "gui-window.h"
#include "../core/wee-command.h"
@@ -98,10 +97,6 @@ gui_buffer_new (void *plugin, char *category, char *name)
new_buffer->notify_level = GUI_BUFFER_NOTIFY_LEVEL_DEFAULT;
new_buffer->num_displayed = 0;
- /* create/append to log file */
- new_buffer->log_filename = NULL;
- new_buffer->log_file = NULL;
-
/* title */
new_buffer->title = NULL;
@@ -241,23 +236,6 @@ gui_buffer_set_name (struct t_gui_buffer *buffer, char *name)
}
/*
- * gui_buffer_set_log: set log file for a buffer
- */
-
-void
-gui_buffer_set_log (struct t_gui_buffer *buffer, char *log_filename)
-{
- if (buffer->log_file)
- gui_log_end (buffer);
-
- if (log_filename)
- {
- buffer->log_filename = strdup (log_filename);
- gui_log_start (buffer);
- }
-}
-
-/*
* gui_buffer_set_title: set title for a buffer
*/
@@ -327,10 +305,6 @@ gui_buffer_set (struct t_gui_buffer *buffer, char *property, char *value)
gui_buffer_set_name (buffer, value);
gui_status_draw (buffer, 1);
}
- else if (string_strcasecmp (property, "log") == 0)
- {
- gui_buffer_set_log (buffer, value);
- }
else if (string_strcasecmp (property, "title") == 0)
{
gui_buffer_set_title (buffer, value);
@@ -632,10 +606,6 @@ gui_buffer_free (struct t_gui_buffer *buffer, int switch_to_another)
gui_chat_line_free (buffer->lines);
buffer->lines = ptr_line;
}
-
- /* close log if opened */
- if (buffer->log_file)
- gui_log_end (buffer);
}
if (buffer->input_buffer)
@@ -984,8 +954,6 @@ gui_buffer_print_log ()
weechat_log_printf (" type . . . . . . . . . : %d\n", ptr_buffer->type);
weechat_log_printf (" notify_level . . . . . : %d\n", ptr_buffer->notify_level);
weechat_log_printf (" num_displayed. . . . . : %d\n", ptr_buffer->num_displayed);
- weechat_log_printf (" log_filename . . . . . : '%s'\n", ptr_buffer->log_filename);
- weechat_log_printf (" log_file . . . . . . . : 0x%X\n", ptr_buffer->log_file);
weechat_log_printf (" title. . . . . . . . . : '%s'\n", ptr_buffer->title);
weechat_log_printf (" lines. . . . . . . . . : 0x%X\n", ptr_buffer->lines);
weechat_log_printf (" last_line. . . . . . . : 0x%X\n", ptr_buffer->last_line);
diff --git a/src/gui/gui-buffer.h b/src/gui/gui-buffer.h
index 9adac88a2..95985bd9f 100644
--- a/src/gui/gui-buffer.h
+++ b/src/gui/gui-buffer.h
@@ -75,10 +75,6 @@ struct t_gui_buffer
/* 3 = highlight + msg + join/part */
int num_displayed; /* number of windows displaying buf. */
- /* logging */
- char *log_filename; /* filename for saving content */
- FILE *log_file; /* file descriptor for log */
-
/* buffer title */
char *title; /* buffer title */
diff --git a/src/gui/gui-log.c b/src/gui/gui-log.c
deleted file mode 100644
index 253170936..000000000
--- a/src/gui/gui-log.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* gui-log.c: log buffers to files */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-
-#include "../core/weechat.h"
-#include "../core/wee-config.h"
-#include "../core/wee-log.h"
-#include "../core/wee-string.h"
-#include "gui-log.h"
-
-
-/*
- * gui_log_write_date: writes date to log file
- */
-
-void
-gui_log_write_date (struct t_gui_buffer *buffer)
-{
- static char buf_time[256];
- static time_t seconds;
- struct tm *date_tmp;
-
- if (buffer->log_file)
- {
- seconds = time (NULL);
- date_tmp = localtime (&seconds);
- if (date_tmp)
- {
- strftime (buf_time, sizeof (buf_time) - 1,
- cfg_log_time_format, date_tmp);
- fprintf (buffer->log_file, "%s ", buf_time);
- fflush (buffer->log_file);
- }
- }
-}
-
-/*
- * gui_log_write_line: writes a line to log file
- */
-
-void
-gui_log_write_line (struct t_gui_buffer *buffer, char *message)
-{
- char *msg_no_color;
-
- if (buffer->log_file)
- {
- msg_no_color = (char *)gui_color_decode ((unsigned char *)message);
- string_iconv_fprintf (buffer->log_file,
- "%s\n", (msg_no_color) ? msg_no_color : message);
- fflush (buffer->log_file);
- if (msg_no_color)
- free (msg_no_color);
- }
-}
-
-/*
- * gui_log_write: writes a message to log file
- */
-
-void
-gui_log_write (struct t_gui_buffer *buffer, char *message)
-{
- char *msg_no_color;
-
- if (buffer->log_file)
- {
- msg_no_color = (char *)gui_color_decode ((unsigned char *)message);
- string_iconv_fprintf (buffer->log_file,
- "%s", (msg_no_color) ? msg_no_color : message);
- fflush (buffer->log_file);
- if (msg_no_color)
- free (msg_no_color);
- }
-}
-
-/*
- * gui_log_start: starts a log
- */
-
-void
-gui_log_start (struct t_gui_buffer *buffer)
-{
- if (buffer->log_filename)
- {
- buffer->log_file = fopen (buffer->log_filename, "a");
- if (!buffer->log_file)
- {
- weechat_log_printf (_("Unable to write log file \"%s\"\n"),
- buffer->log_filename);
- gui_chat_printf (NULL,
- _("%sError: Unable to write log file \"%s\"\n"),
- gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
- buffer->log_filename);
- free (buffer->log_filename);
- return;
- }
-
- gui_log_write (buffer, _("**** Beginning of log "));
- gui_log_write_date (buffer);
- gui_log_write (buffer, "****\n");
- }
-}
-
-/*
- * gui_log_end: ends a log
- */
-
-void
-gui_log_end (struct t_gui_buffer *buffer)
-{
- if (buffer->log_file)
- {
- gui_log_write (buffer, _("**** End of log "));
- gui_log_write_date (buffer);
- gui_log_write (buffer, "****\n");
- fclose (buffer->log_file);
- buffer->log_file = NULL;
- }
- if (buffer->log_filename)
- {
- free (buffer->log_filename);
- buffer->log_filename = NULL;
- }
-}
diff --git a/src/plugins/CMakeLists.txt b/src/plugins/CMakeLists.txt
index 8ee79046b..7fb61b9e2 100644
--- a/src/plugins/CMakeLists.txt
+++ b/src/plugins/CMakeLists.txt
@@ -28,10 +28,6 @@ IF(NOT DISABLE_IRC)
ADD_SUBDIRECTORY( irc )
ENDIF(NOT DISABLE_IRC)
-IF(NOT DISABLE_PERL AND NOT DISABLE_PYTHON AND NOT DISABLE_RUBY AND NOT DISABLE_LUA)
- ADD_SUBDIRECTORY( scripts )
-ENDIF(NOT DISABLE_PERL AND NOT DISABLE_PYTHON AND NOT DISABLE_RUBY AND NOT DISABLE_LUA)
-
IF(NOT DISABLE_ASPELL)
# Check for aspell libraries
FIND_PACKAGE(Aspell)
@@ -51,10 +47,18 @@ IF(NOT DISABLE_FIFO)
ADD_SUBDIRECTORY( fifo )
ENDIF(NOT DISABLE_FIFO)
+IF(NOT DISABLE_LOGGER)
+ ADD_SUBDIRECTORY( logger )
+ENDIF(NOT DISABLE_LOGGER)
+
IF(NOT DISABLE_TRIGGER)
ADD_SUBDIRECTORY( trigger )
ENDIF(NOT DISABLE_TRIGGER)
+IF(NOT DISABLE_PERL AND NOT DISABLE_PYTHON AND NOT DISABLE_RUBY AND NOT DISABLE_LUA)
+ ADD_SUBDIRECTORY( scripts )
+ENDIF(NOT DISABLE_PERL AND NOT DISABLE_PYTHON AND NOT DISABLE_RUBY AND NOT DISABLE_LUA)
+
IF(ENABLE_DEMO)
ADD_SUBDIRECTORY( demo )
ENDIF(ENABLE_TRIGGER)
diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am
index cae0dbf2d..0a6162543 100644
--- a/src/plugins/Makefile.am
+++ b/src/plugins/Makefile.am
@@ -32,22 +32,6 @@ if PLUGIN_IRC
irc_dir = irc
endif
-if PLUGIN_PERL
-script_dir = scripts
-endif
-
-if PLUGIN_PYTHON
-script_dir = scripts
-endif
-
-if PLUGIN_RUBY
-script_dir = scripts
-endif
-
-if PLUGIN_LUA
-script_dir = scripts
-endif
-
if PLUGIN_ASPELL
aspell_dir = aspell
endif
@@ -60,12 +44,32 @@ if PLUGIN_FIFO
fifo_dir = fifo
endif
+if PLUGIN_LOGGER
+logger_dir = logger
+endif
+
if PLUGIN_TRIGGER
trigger_dir = trigger
endif
+if PLUGIN_PERL
+script_dir = scripts
+endif
+
+if PLUGIN_PYTHON
+script_dir = scripts
+endif
+
+if PLUGIN_RUBY
+script_dir = scripts
+endif
+
+if PLUGIN_LUA
+script_dir = scripts
+endif
+
if PLUGIN_DEMO
demo_dir = demo
endif
-SUBDIRS = . $(irc_dir) $(script_dir) $(aspell_dir) $(charset_dir) $(fifo_dir) $(trigger_dir) $(demo_dir)
+SUBDIRS = . $(irc_dir) $(aspell_dir) $(charset_dir) $(fifo_dir) $(logger_dir) $(trigger_dir) $(demo_dir) $(script_dir)
diff --git a/src/plugins/logger/CMakeLists.txt b/src/plugins/logger/CMakeLists.txt
new file mode 100644
index 000000000..3f2943b83
--- /dev/null
+++ b/src/plugins/logger/CMakeLists.txt
@@ -0,0 +1,22 @@
+# Copyright (c) 2003-2007 FlashCode <flashcode@flashtux.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+ADD_LIBRARY(logger MODULE logger.c logger.h logger-buffer.c logger-buffer.h)
+SET_TARGET_PROPERTIES(logger PROPERTIES PREFIX "")
+
+TARGET_LINK_LIBRARIES(logger)
+
+INSTALL(TARGETS logger LIBRARY DESTINATION lib/${PROJECT_NAME}/plugins)
diff --git a/src/plugins/logger/Makefile.am b/src/plugins/logger/Makefile.am
new file mode 100644
index 000000000..9376992f3
--- /dev/null
+++ b/src/plugins/logger/Makefile.am
@@ -0,0 +1,25 @@
+# Copyright (c) 2003-2007 FlashCode <flashcode@flashtux.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+INCLUDES = -DLOCALEDIR=\"$(datadir)/locale\" $(LOGGER_CFLAGS)
+
+libdir = ${weechat_libdir}/plugins
+
+lib_LTLIBRARIES = logger.la
+
+logger_la_SOURCES = logger.c logger.h logger-buffer.c logger-buffer.h
+logger_la_LDFLAGS = -module
+logger_la_LIBADD = $(LOGGER_LFLAGS)
diff --git a/src/plugins/logger/logger-buffer.c b/src/plugins/logger/logger-buffer.c
new file mode 100644
index 000000000..e50acf5ee
--- /dev/null
+++ b/src/plugins/logger/logger-buffer.c
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
+ * See README for License detail, AUTHORS for developers list.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* logger-buffer.c: manages logger buffer list */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "logger-buffer.h"
+
+
+struct t_logger_buffer *logger_buffers = NULL;
+struct t_logger_buffer *last_logger_buffer = NULL;
+
+
+/*
+ * logger_buffer_add: add a new buffer for logging
+ */
+
+struct t_logger_buffer *
+logger_buffer_add (void *buffer, char *log_filename)
+{
+ struct t_logger_buffer *new_logger_buffer;
+
+ if (!buffer || !log_filename)
+ return NULL;
+
+ new_logger_buffer = (struct t_logger_buffer *)malloc (sizeof (struct t_logger_buffer));
+ if (new_logger_buffer)
+ {
+ new_logger_buffer->buffer = buffer;
+ new_logger_buffer->log_filename = strdup (log_filename);
+ new_logger_buffer->log_file = NULL;
+
+ new_logger_buffer->prev_buffer = last_logger_buffer;
+ new_logger_buffer->next_buffer = NULL;
+ if (logger_buffers)
+ last_logger_buffer->next_buffer = new_logger_buffer;
+ else
+ logger_buffers = new_logger_buffer;
+ last_logger_buffer = new_logger_buffer;
+ }
+
+ return new_logger_buffer;
+}
+
+/*
+ * logger_buffer_search: search a logger buffer by buffer pointer
+ */
+
+struct t_logger_buffer *
+logger_buffer_search (void *buffer)
+{
+ struct t_logger_buffer *ptr_logger_buffer;
+
+ for (ptr_logger_buffer = logger_buffers; ptr_logger_buffer;
+ ptr_logger_buffer = ptr_logger_buffer->next_buffer)
+ {
+ if (ptr_logger_buffer->buffer == (struct t_gui_buffer *)buffer)
+ return ptr_logger_buffer;
+ }
+
+ /* logger buffer not found */
+ return NULL;
+}
+
+/*
+ * logger_buffer_free: remove a logger buffer from list
+ */
+
+void
+logger_buffer_free (struct t_logger_buffer *logger_buffer)
+{
+ struct t_logger_buffer *new_logger_buffers;
+
+ /* remove logger buffer */
+ if (last_logger_buffer == logger_buffer)
+ last_logger_buffer = logger_buffer->prev_buffer;
+ if (logger_buffer->prev_buffer)
+ {
+ (logger_buffer->prev_buffer)->next_buffer = logger_buffer->next_buffer;
+ new_logger_buffers = logger_buffers;
+ }
+ else
+ new_logger_buffers = logger_buffer->next_buffer;
+
+ if (logger_buffer->next_buffer)
+ (logger_buffer->next_buffer)->prev_buffer = logger_buffer->prev_buffer;
+
+ /* free data */
+ if (logger_buffer->log_filename)
+ free (logger_buffer->log_filename);
+
+ logger_buffers = new_logger_buffers;
+}
+
+/*
+ * logger_buffer_remove: remove a buffer from list
+ */
+
+void
+logger_buffer_remove (void *buffer)
+{
+ struct t_logger_buffer *ptr_logger_buffer;
+
+ ptr_logger_buffer = logger_buffer_search (buffer);
+ if (ptr_logger_buffer)
+ logger_buffer_free (ptr_logger_buffer);
+}
+
+/*
+ * logger_buffer_remove_all: remove all buffers from list
+ */
+
+void
+logger_buffer_remove_all ()
+{
+ while (logger_buffers)
+ {
+ logger_buffer_free (logger_buffers);
+ }
+}
diff --git a/src/plugins/logger/logger-buffer.h b/src/plugins/logger/logger-buffer.h
new file mode 100644
index 000000000..1d7ee8225
--- /dev/null
+++ b/src/plugins/logger/logger-buffer.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
+ * See README for License detail, AUTHORS for developers list.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef __WEECHAT_LOGGER_BUFFER_H
+#define __WEECHAT_LOGGER_BUFFER_H 1
+
+struct t_logger_buffer
+{
+ struct t_gui_buffer *buffer; /* pointer to buffer */
+ char *log_filename; /* log filename */
+ FILE *log_file; /* log file */
+ struct t_logger_buffer *prev_buffer; /* link to previous buffer */
+ struct t_logger_buffer *next_buffer; /* link to next buffer */
+};
+
+extern struct t_logger_buffer *logger_buffers;
+extern struct t_logger_buffer *last_logger_buffer;
+
+extern struct t_logger_buffer *logger_buffer_add (void *, char *);
+extern struct t_logger_buffer *logger_buffer_search (void *);
+extern void logger_buffer_remove (void *);
+extern void logger_buffer_remove_all ();
+
+#endif /* logger-buffer.h */
diff --git a/src/plugins/logger/logger.c b/src/plugins/logger/logger.c
new file mode 100644
index 000000000..0458a0395
--- /dev/null
+++ b/src/plugins/logger/logger.c
@@ -0,0 +1,392 @@
+/*
+ * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
+ * See README for License detail, AUTHORS for developers list.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* logger.c: Logger plugin for WeeChat */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <time.h>
+
+#include "../weechat-plugin.h"
+#include "logger.h"
+#include "logger-buffer.h"
+
+
+static struct t_weechat_plugin *weechat_plugin = NULL;
+static char *logger_path = NULL;
+static char *logger_time_format = NULL;
+
+
+/*
+ * logger_config_read: read config options for logger plugin
+ */
+
+static void
+logger_config_read ()
+{
+ if (logger_path)
+ free (logger_path);
+ logger_path = weechat_plugin_config_get ("path");
+ if (!logger_path)
+ {
+ weechat_plugin_config_set ("path", "%h/logs/");
+ logger_path = weechat_plugin_config_get ("path");
+ }
+
+ if (logger_time_format)
+ free (logger_time_format);
+ logger_time_format = weechat_plugin_config_get ("time_format");
+ if (!logger_time_format)
+ {
+ weechat_plugin_config_set ("time_format", "%Y %b %d %H:%M:%S");
+ logger_time_format = weechat_plugin_config_get ("time_format");
+ }
+}
+
+/*
+ * logger_get_filename: build log filename for a buffer
+ */
+
+char *
+logger_get_filename (void *buffer)
+{
+ struct t_plugin_list *ptr_list;
+ char *res;
+ char *dir_separator, *weechat_dir, *log_path, *log_path2;
+ char *category, *category2, *name, *name2;
+ int length;
+
+ res = NULL;
+
+ dir_separator = weechat_info_get ("dir_separator");
+ weechat_dir = weechat_info_get ("weechat_dir");
+ log_path = weechat_string_replace (logger_path, "~", getenv ("HOME"));
+ log_path2 = weechat_string_replace (log_path, "%h", weechat_dir);
+
+ if (dir_separator && weechat_dir && log_path && log_path2)
+ {
+ ptr_list = weechat_list_get ("buffer", buffer);
+ if (ptr_list)
+ {
+ category2 = NULL;
+ name2 = NULL;
+ if (weechat_list_next (ptr_list))
+ {
+ category = weechat_list_string (ptr_list, "category");
+ category2 = (category) ?
+ weechat_string_replace (category, dir_separator, "_") : NULL;
+ name = weechat_list_string (ptr_list, "name");
+ name2 = (name) ?
+ weechat_string_replace (name, dir_separator, "_") : NULL;
+ }
+ length = strlen (log_path2);
+ if (category2)
+ length += strlen (category2);
+ if (name2)
+ length += strlen (name2);
+ length += 16;
+ res = (char *)malloc (length);
+ if (res)
+ {
+ strcpy (res, log_path2);
+ if (category2)
+ {
+ strcat (res, category2);
+ strcat (res, ".");
+ }
+ if (name2)
+ {
+ strcat (res, name2);
+ strcat (res, ".");
+ }
+ strcat (res, "weechatlog");
+ }
+ if (category2)
+ free (category2);
+ if (name2)
+ free (name2);
+ weechat_list_free (ptr_list);
+ }
+ }
+
+ if (dir_separator)
+ free (dir_separator);
+ if (weechat_dir)
+ free (weechat_dir);
+ if (log_path)
+ free (log_path);
+ if (log_path2)
+ free (log_path2);
+
+ return res;
+}
+
+/*
+ * logger_write_line: write a line to log file
+ */
+
+void
+logger_write_line (struct t_logger_buffer *logger_buffer, char *format, ...)
+{
+ va_list argptr;
+ char buf[4096], *charset, *message;
+
+ if (logger_buffer->log_file)
+ {
+ va_start (argptr, format);
+ vsnprintf (buf, sizeof (buf) - 1, format, argptr);
+ va_end (argptr);
+
+ charset = weechat_info_get ("charset_terminal");
+ message = (charset) ?
+ weechat_iconv_from_internal (charset, buf) : NULL;
+
+ fprintf (logger_buffer->log_file,
+ "%s\n", (message) ? message : buf);
+ fflush (logger_buffer->log_file);
+
+ if (charset)
+ free (charset);
+ if (message)
+ free (message);
+ }
+}
+
+/*
+ * logger_start_buffer: start a log for a buffer
+ */
+
+void
+logger_start_buffer (void *buffer)
+{
+ struct t_logger_buffer *ptr_logger_buffer;
+ char *log_filename;
+ time_t seconds;
+ struct tm *date_tmp;
+ char buf_time[256];
+
+ if (!buffer)
+ return;
+
+ ptr_logger_buffer = logger_buffer_search (buffer);
+ if (!ptr_logger_buffer)
+ {
+ log_filename = logger_get_filename (buffer);
+ if (!log_filename)
+ return;
+ ptr_logger_buffer = logger_buffer_add (buffer, log_filename);
+ free (log_filename);
+ }
+ if (ptr_logger_buffer)
+ {
+ if (ptr_logger_buffer->log_filename)
+ {
+ if (ptr_logger_buffer->log_file)
+ fclose (ptr_logger_buffer->log_file);
+ ptr_logger_buffer->log_file =
+ fopen (ptr_logger_buffer->log_filename, "a");
+ if (!ptr_logger_buffer->log_file)
+ {
+ weechat_printf (NULL,
+ _("%sLogger: unable to write log file \"%s\"\n"),
+ weechat_prefix ("error"),
+ ptr_logger_buffer->log_filename);
+ free (ptr_logger_buffer->log_filename);
+ return;
+ }
+
+ seconds = time (NULL);
+ date_tmp = localtime (&seconds);
+ buf_time[0] = '\0';
+ if (date_tmp)
+ strftime (buf_time, sizeof (buf_time) - 1,
+ logger_time_format, date_tmp);
+ logger_write_line (ptr_logger_buffer,
+ _("**** Beginning of log %s ****"),
+ buf_time);
+ }
+ }
+}
+
+/*
+ * logger_start_buffer_all: start log buffer for all buffers
+ */
+
+void
+logger_start_buffer_all ()
+{
+ struct t_plugin_list *ptr_list;
+
+ ptr_list = weechat_list_get ("buffer", NULL);
+ while (weechat_list_next (ptr_list))
+ {
+ logger_start_buffer (weechat_list_pointer (ptr_list, "pointer"));
+ }
+}
+
+/*
+ * logger_end: end log for a logger buffer
+ */
+
+void
+logger_end (struct t_logger_buffer *logger_buffer)
+{
+ time_t seconds;
+ struct tm *date_tmp;
+ char buf_time[256];
+
+ if (!logger_buffer)
+ return;
+
+ if (logger_buffer->log_file)
+ {
+ seconds = time (NULL);
+ date_tmp = localtime (&seconds);
+ buf_time[0] = '\0';
+ if (date_tmp)
+ strftime (buf_time, sizeof (buf_time) - 1,
+ logger_time_format, date_tmp);
+ logger_write_line (logger_buffer,
+ _("**** End of log %s ****"),
+ buf_time);
+ fclose (logger_buffer->log_file);
+ logger_buffer->log_file = NULL;
+ logger_buffer_remove (logger_buffer);
+ }
+}
+
+/*
+ * logger_end_all: end log for all buffers
+ */
+
+void
+logger_end_all ()
+{
+ struct t_logger_buffer *ptr_logger_buffer;
+
+ for (ptr_logger_buffer = logger_buffers; ptr_logger_buffer;
+ ptr_logger_buffer = ptr_logger_buffer->next_buffer)
+ {
+ logger_end (ptr_logger_buffer);
+ }
+}
+
+/*
+ * logger_event_cb: callback for event hook
+ */
+
+static int
+logger_event_cb (void *data, char *event, void *pointer)
+{
+ /* make C compiler happy */
+ (void) data;
+ (void) pointer;
+
+ if (weechat_strcasecmp (event, "buffer_open") == 0)
+ {
+ logger_start_buffer (pointer);
+ }
+ else if (weechat_strcasecmp (event, "buffer_close") == 0)
+ {
+ logger_end (logger_buffer_search (pointer));
+ }
+
+ return PLUGIN_RC_SUCCESS;
+}
+
+/*
+ * logger_print_cb: callback for print hook
+ */
+
+static int
+logger_print_cb (void *data, void *buffer, time_t date, char *prefix,
+ char *message)
+{
+ struct t_logger_buffer *ptr_logger_buffer;
+ struct tm *date_tmp;
+ char buf_time[256];
+
+ /* make C compiler happy */
+ (void) data;
+
+ ptr_logger_buffer = logger_buffer_search (buffer);
+ if (ptr_logger_buffer && ptr_logger_buffer->log_file)
+ {
+ date_tmp = localtime (&date);
+ buf_time[0] = '\0';
+ if (date_tmp)
+ strftime (buf_time, sizeof (buf_time) - 1,
+ logger_time_format, date_tmp);
+
+ logger_write_line (ptr_logger_buffer,
+ "%s%s%s%s%s",
+ buf_time,
+ (buf_time[0]) ? " " : "",
+ (prefix) ? prefix : "",
+ (prefix && prefix[0]) ? " " : "",
+ message);
+ }
+
+ return PLUGIN_RC_SUCCESS;
+}
+
+/*
+ * weechat_plugin_init: init logger plugin
+ */
+
+int
+weechat_plugin_init (struct t_weechat_plugin *plugin)
+{
+ weechat_plugin = plugin;
+
+ logger_config_read ();
+ if (!logger_path || !logger_time_format)
+ return PLUGIN_RC_FAILED;
+
+ logger_start_buffer_all ();
+
+ weechat_hook_event ("buffer_open", logger_event_cb, NULL);
+ weechat_hook_event ("buffer_close", logger_event_cb, NULL);
+
+ weechat_hook_print (NULL, NULL, 1, logger_print_cb, NULL);
+
+ return PLUGIN_RC_SUCCESS;
+}
+
+/*
+ * weechat_plugin_end: end logger plugin
+ */
+
+int
+weechat_plugin_end ()
+{
+ logger_end_all ();
+
+ return PLUGIN_RC_SUCCESS;
+}
diff --git a/src/gui/gui-log.h b/src/plugins/logger/logger.h
index 52635ec70..1d2a483aa 100644
--- a/src/gui/gui-log.h
+++ b/src/plugins/logger/logger.h
@@ -17,15 +17,11 @@
*/
-#ifndef __WEECHAT_GUI_LOG_H
-#define __WEECHAT_GUI_LOG_H 1
+#ifndef __WEECHAT_LOGGER_H
+#define __WEECHAT_LOGGER_H 1
-/* log functions */
+char plugin_name[] = "logger";
+char plugin_version[] = "0.1";
+char plugin_description[] = "Logger plugin for WeeChat";
-extern void gui_log_write_date (struct t_gui_buffer *);
-extern void gui_log_write_line (struct t_gui_buffer *, char *);
-extern void gui_log_write (struct t_gui_buffer *, char *);
-extern void gui_log_start (struct t_gui_buffer *);
-extern void gui_log_end (struct t_gui_buffer *);
-
-#endif /* gui-log.h */
+#endif /* logger.h */
diff --git a/src/plugins/plugin-api.c b/src/plugins/plugin-api.c
index 4b0a11c13..1b26bea60 100644
--- a/src/plugins/plugin-api.c
+++ b/src/plugins/plugin-api.c
@@ -825,8 +825,6 @@ plugin_api_list_get_add_buffer (struct t_plugin_list *list,
return 0;
if (!plugin_list_new_var_int (ptr_item, "num_displayed", buffer->num_displayed))
return 0;
- if (!plugin_list_new_var_string (ptr_item, "log_filename", buffer->log_filename))
- return 0;
if (!plugin_list_new_var_string (ptr_item, "title", buffer->title))
return 0;
if (!plugin_list_new_var_int (ptr_item, "input", buffer->input))