talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 09775efd07295f8e79550c5fb93580f9d3dd590a
parent 1d0f98b4876e7710fa7f121d4cd60fb27592a625
Author: Tristan Chabredier <wwp@claws-mail.org>
Date:   Sat,  2 Jun 2012 09:06:29 +0000

2012-06-02 [wwp]	3.8.0cvs52

	* doc/man/claws-mail.1
	* src/main.c
	* src/main.h
	* src/inc.c
	* src/procmsg.c
	* src/gtk/about.c
		Introduce a new feature: basic session statistics (from the about dialog
		or the command-line).

Diffstat:
MChangeLog | 11+++++++++++
MPATCHSETS | 1+
Mconfigure.ac | 2+-
Mdoc/man/claws-mail.1 | 12++++++++++++
Msrc/gtk/about.c | 114+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/inc.c | 18++++++++++++++++--
Msrc/main.c | 79++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Msrc/main.h | 12++++++++++++
Msrc/procmsg.c | 15+++++++++++++++
9 files changed, 258 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,14 @@ +2012-06-02 [wwp] 3.8.0cvs52 + + * doc/man/claws-mail.1 + * src/main.c + * src/main.h + * src/inc.c + * src/procmsg.c + * src/gtk/about.c + Introduce a new feature: basic session statistics (from the about dialog + or the command-line). + 2012-06-02 [wwp] 3.8.0cvs51 * src/compose.c diff --git a/PATCHSETS b/PATCHSETS @@ -4368,3 +4368,4 @@ ( cvs diff -u -r 1.9.2.51 -r 1.9.2.52 src/common/ssl.c; ) > 3.8.0cvs49.patchset ( cvs diff -u -r 1.382.2.601 -r 1.382.2.602 src/compose.c; cvs diff -u -r 1.274.2.345 -r 1.274.2.346 src/mainwindow.c; cvs diff -u -r 1.94.2.232 -r 1.94.2.233 src/messageview.c; ) > 3.8.0cvs50.patchset ( cvs diff -u -r 1.382.2.602 -r 1.382.2.603 src/compose.c; ) > 3.8.0cvs51.patchset +( cvs diff -u -r 1.1.2.9 -r 1.1.2.10 doc/man/claws-mail.1; cvs diff -u -r 1.115.2.249 -r 1.115.2.250 src/main.c; cvs diff -u -r 1.7.2.20 -r 1.7.2.21 src/main.h; cvs diff -u -r 1.149.2.106 -r 1.149.2.107 src/inc.c; cvs diff -u -r 1.150.2.123 -r 1.150.2.124 src/procmsg.c; cvs diff -u -r 1.4.2.83 -r 1.4.2.84 src/gtk/about.c; ) > 3.8.0cvs52.patchset diff --git a/configure.ac b/configure.ac @@ -12,7 +12,7 @@ MINOR_VERSION=8 MICRO_VERSION=0 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=51 +EXTRA_VERSION=52 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/doc/man/claws-mail.1 b/doc/man/claws-mail.1 @@ -113,6 +113,10 @@ This list is not complete. .br \fB \-\-status\-full\fR .br +\fB \-\-statistics\fR +.br +\fB \-\-reset-statistics\fR +.br \fB \-\-select [#mh/mailbox/]folder[/msg|/msgid]\fR .br \fB \-\-online\fR @@ -283,6 +287,14 @@ show the total number of messages per folder .br [new][unread][unread answers to marked][total] .TP +\fB\-\-statistics\fR +.br +show session statistics +.TP +\fB\-\-reset-statistics\fR +.br +reset session statistics +.TP \fB\-\-select [#mh/mailbox/]folder[/msg|/msgid]\fR on startup, jumps to the specified folder/message .TP diff --git a/src/gtk/about.c b/src/gtk/about.c @@ -42,6 +42,10 @@ #include "codeconv.h" #include "menu.h" #include "textview.h" +#include "main.h" + +extern SessionStats session_stats; +static GtkTextBuffer *stats_text_buffer; static GtkWidget *window; static gchar* uri_hover = NULL; @@ -64,6 +68,7 @@ static gboolean about_textview_leave_notify(GtkWidget *widget, static void about_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation); static void about_textview_uri_update(GtkWidget *textview, gint x, gint y); +static void about_update_stats(void); static GtkWidget *link_popupmenu; @@ -72,8 +77,10 @@ void about_show(void) { if (!window) about_create(); - else + else { + about_update_stats(); gtk_window_present(GTK_WINDOW(window)); + } } @@ -219,7 +226,7 @@ static GtkWidget *about_create_child_page_authors(void) buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)); gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0); - /* init formatting tag: indentation for list items */ + /* init formatting tag: indentation for list items */ gtk_text_buffer_create_tag(buffer, "indented-list-item", "indent", 8, NULL); @@ -633,6 +640,101 @@ static GtkWidget *about_create_child_page_release_notes(void) return scrolledwin; } +static GtkWidget *about_create_child_page_session_stats(void) +{ + GtkWidget *scrolledwin; + GtkWidget *text; + GtkTextIter iter; + + scrolledwin = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwin), + GTK_SHADOW_IN); + text = gtk_text_view_new(); + gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE); + gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD); + gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text), 6); + gtk_text_view_set_right_margin(GTK_TEXT_VIEW(text), 6); + gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(text), FALSE); + gtk_container_add(GTK_CONTAINER(scrolledwin), text); + + stats_text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)); + + gtk_text_buffer_get_iter_at_offset(stats_text_buffer, &iter, 0); + gtk_text_buffer_create_tag(stats_text_buffer, "indented-list-item", + "indent", 8, + NULL); + gtk_text_buffer_create_tag(stats_text_buffer, "underlined-list-title", + "underline", PANGO_UNDERLINE_SINGLE, + NULL); + gtk_text_buffer_create_tag(stats_text_buffer, "bold", "weight", PANGO_WEIGHT_BOLD, + NULL); + + about_update_stats(); + + return scrolledwin; +} + +static void about_update_stats(void) +{ + if (stats_text_buffer != NULL) + { + GtkTextIter start, end, iter; + gchar buf[1024]; + + gtk_text_buffer_get_start_iter(stats_text_buffer, &start); + gtk_text_buffer_get_end_iter(stats_text_buffer, &end); + gtk_text_buffer_delete(stats_text_buffer, &start, &end); + + gtk_text_buffer_get_iter_at_offset(stats_text_buffer, &iter, 0); + + gtk_text_buffer_insert_with_tags_by_name(stats_text_buffer, &iter, + (_("Session statistics\n")), -1, + "underlined-list-title", NULL); + + g_snprintf(buf, sizeof(buf), _("Started: %s\n"), + ctime(&session_stats.time_started)); + gtk_text_buffer_insert_with_tags_by_name(stats_text_buffer, &iter, buf, -1, + "indented-list-item", NULL); + + gtk_text_buffer_insert_with_tags_by_name(stats_text_buffer, &iter, + (_("Incoming traffic\n")), -1, + "underlined-list-title", NULL); + + g_snprintf(buf, sizeof(buf), _("Received messages: %d\n"), + session_stats.received); + gtk_text_buffer_insert_with_tags_by_name(stats_text_buffer, &iter, buf, -1, + "indented-list-item", "bold", NULL); + + gtk_text_buffer_insert(stats_text_buffer, &iter, "\n", 1); + gtk_text_buffer_insert_with_tags_by_name(stats_text_buffer, &iter, + (_("Outgoing traffic\n")), -1, + "underlined-list-title", NULL); + + g_snprintf(buf, sizeof(buf), _("New/redirected messages: %d\n"), + session_stats.sent); + gtk_text_buffer_insert_with_tags_by_name(stats_text_buffer, &iter, buf, -1, + "indented-list-item", NULL); + + g_snprintf(buf, sizeof(buf), _("Replied messages: %d\n"), + session_stats.replied); + gtk_text_buffer_insert_with_tags_by_name(stats_text_buffer, &iter, buf, -1, + "indented-list-item", NULL); + + g_snprintf(buf, sizeof(buf), _("Forwarded messages: %d\n"), + session_stats.forwarded); + gtk_text_buffer_insert_with_tags_by_name(stats_text_buffer, &iter, buf, -1, + "indented-list-item", NULL); + + g_snprintf(buf, sizeof(buf), _("Total outgoing messages: %d\n"), + (session_stats.sent + session_stats.replied + + session_stats.forwarded)); + gtk_text_buffer_insert_with_tags_by_name(stats_text_buffer, &iter, buf, -1, + "indented-list-item", "bold", NULL); + } +} + static void about_create(void) { GtkWidget *vbox1; @@ -648,6 +750,8 @@ static void about_create(void) GtkWidget *close_button; static GdkGeometry geometry; + stats_text_buffer = NULL; + window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "about"); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ALWAYS); gtk_window_set_title(GTK_WINDOW(window), _("About Claws Mail")); @@ -751,6 +855,12 @@ static void about_create(void) gtk_label_new_with_mnemonic(_("_Release Notes"))); } + if ((scrolledwin = about_create_child_page_session_stats()) != NULL) { + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), + scrolledwin, + gtk_label_new_with_mnemonic(_("_Statistics"))); + } + gtk_box_pack_start(GTK_BOX(vbox1), notebook, TRUE, TRUE, 0); gtkut_stock_button_set_create(&confirm_area, &close_button, GTK_STOCK_CLOSE, diff --git a/src/inc.c b/src/inc.c @@ -78,6 +78,8 @@ static gboolean maemo_warned_offline = FALSE; #endif #endif +extern SessionStats session_stats; + static GList *inc_dialog_list = NULL; guint inc_lock_count = 0; @@ -88,6 +90,7 @@ static GdkPixbuf *okpix; #define MSGBUFSIZE 8192 +static void inc_update_stats(gint new_msgs); static void inc_finished (MainWindow *mainwin, gboolean new_messages, gboolean autocheck); @@ -153,7 +156,15 @@ static gint inc_autocheck_func (gpointer data); static void inc_notify_cmd (gint new_msgs, gboolean notify); - + +static void inc_update_stats(gint new_msgs) +{ + /* update session statistics */ + session_stats.received += new_msgs; +fprintf(stdout, "++ STATS ++ INC %d %d\n", session_stats.received, new_msgs); +fflush(stdout); +} + /** * inc_finished: * @mainwin: Main window. @@ -214,6 +225,7 @@ void inc_mail(MainWindow *mainwin, gboolean notify) new_msgs += account_new_msgs; } + inc_update_stats(new_msgs); inc_finished(mainwin, new_msgs > 0, FALSE); main_window_unlock(mainwin); inc_notify_cmd(new_msgs, notify); @@ -307,6 +319,7 @@ gint inc_account_mail(MainWindow *mainwin, PrefsAccount *account) new_msgs = inc_account_mail_real(mainwin, account); + inc_update_stats(new_msgs); inc_finished(mainwin, new_msgs > 0, FALSE); main_window_unlock(mainwin); inc_autocheck_timer_set(); @@ -335,6 +348,7 @@ void inc_all_account_mail(MainWindow *mainwin, gboolean autocheck, list = account_get_list(); if (!list) { + inc_update_stats(new_msgs); inc_finished(mainwin, new_msgs > 0, autocheck); main_window_unlock(mainwin); inc_notify_cmd(new_msgs, notify); @@ -390,6 +404,7 @@ void inc_all_account_mail(MainWindow *mainwin, gboolean autocheck, new_msgs += inc_start(inc_dialog); } + inc_update_stats(new_msgs); inc_finished(mainwin, new_msgs > 0, autocheck); main_window_unlock(mainwin); inc_notify_cmd(new_msgs, notify); @@ -1407,7 +1422,6 @@ osso_context_t *get_osso_context(void); static void inc_notify_cmd(gint new_msgs, gboolean notify) { - #ifndef MAEMO gchar *buf, *numpos, *ret_str; gssize by_read = 0, by_written = 0; diff --git a/src/main.c b/src/main.c @@ -207,6 +207,8 @@ static struct RemoteCmd { gboolean search_recursive; gboolean status; gboolean status_full; + gboolean statistics; + gboolean reset_statistics; GPtrArray *status_folders; GPtrArray *status_full_folders; gboolean send; @@ -219,6 +221,10 @@ static struct RemoteCmd { const gchar *target; } cmd; +SessionStats session_stats; + +static void reset_statistics(void); + static void parse_cmd_opt(int argc, char *argv[]); static gint prohibit_duplicate_launch (void); @@ -1031,6 +1037,16 @@ static void install_dbus_status_handler(void) } #endif +static void reset_statistics(void) +{ + /* (re-)initialize session statistics */ + session_stats.received = 0; + session_stats.sent = 0; + session_stats.replied = 0; + session_stats.forwarded = 0; + session_stats.time_started = time(NULL); +} + int main(int argc, char *argv[]) { #ifdef MAEMO @@ -1106,7 +1122,8 @@ int main(int argc, char *argv[]) return 0; } - if (cmd.status || cmd.status_full || cmd.search) { + if (cmd.status || cmd.status_full || cmd.search || + cmd.statistics || cmd.reset_statistics) { puts("0 Claws Mail not running."); lock_socket_remove(); return 0; @@ -1117,6 +1134,8 @@ int main(int argc, char *argv[]) if (!g_thread_supported()) g_thread_init(NULL); + reset_statistics(); + gtk_set_locale(); gtk_init(&argc, &argv); @@ -2000,6 +2019,10 @@ static void parse_cmd_opt(int argc, char *argv[]) cmd.online_mode = ONLINE_MODE_ONLINE; } else if (!strncmp(argv[i], "--offline", 9)) { cmd.online_mode = ONLINE_MODE_OFFLINE; + } else if (!strncmp(argv[i], "--statistics", 12)) { + cmd.statistics = TRUE; + } else if (!strncmp(argv[i], "--reset-statistics", 18)) { + cmd.reset_statistics = TRUE; } else if (!strncmp(argv[i], "--help", 6) || !strncmp(argv[i], "-h", 2)) { gchar *base = g_path_get_basename(argv[0]); @@ -2028,6 +2051,8 @@ static void parse_cmd_opt(int argc, char *argv[]) g_print("%s\n", _(" --status [folder]... show the total number of messages")); g_print("%s\n", _(" --status-full [folder]...\n" " show the status of each folder")); + g_print("%s\n", _(" --statistics show session statistics")); + g_print("%s\n", _(" --reset-statistics reset session statistics")); g_print("%s\n", _(" --select folder[/msg] jumps to the specified folder/message\n" " folder is a folder id like 'folder/sub_folder'")); g_print("%s\n", _(" --online switch to online mode")); @@ -2373,6 +2398,16 @@ static gint prohibit_duplicate_launch(void) } } else if (cmd.exit) { fd_write_all(uxsock, "exit\n", 5); + } else if (cmd.statistics) { + gchar buf[BUFSIZ]; + fd_write(uxsock, "statistics\n", 11); + for (;;) { + fd_gets(uxsock, buf, sizeof(buf)); + if (!strncmp(buf, ".\n", 2)) break; + fputs(buf, stdout); + } + } else if (cmd.reset_statistics) { + fd_write(uxsock, "reset_statistics\n", 17); } else if (cmd.target) { gchar *str = g_strdup_printf("select %s\n", cmd.target); fd_write_all(uxsock, str, strlen(str)); @@ -2532,6 +2567,48 @@ static void lock_socket_input_cb(gpointer data, fd_write_all(sock, ".\n", 2); g_free(status); if (folders) g_ptr_array_free(folders, TRUE); + } else if (!strncmp(buf, "statistics", 10)) { + gchar tmp[BUFSIZ]; + + g_snprintf(tmp, sizeof(tmp), _("Session statistics\n")); + fd_write_all(sock, tmp, strlen(tmp)); + + g_snprintf(tmp, sizeof(tmp), _("Started: %s\n"), + ctime(&session_stats.time_started)); + fd_write_all(sock, tmp, strlen(tmp)); + + g_snprintf(tmp, sizeof(tmp), _("Incoming traffic\n")); + fd_write_all(sock, tmp, strlen(tmp)); + + g_snprintf(tmp, sizeof(tmp), _("Received messages: %d\n"), + session_stats.received); + fd_write_all(sock, tmp, strlen(tmp)); + + fd_write_all(sock, "\n", 1); + + g_snprintf(tmp, sizeof(tmp), _("Outgoing traffic\n")); + fd_write_all(sock, tmp, strlen(tmp)); + + g_snprintf(tmp, sizeof(tmp), _("New/redirected messages: %d\n"), + session_stats.sent); + fd_write_all(sock, tmp, strlen(tmp)); + + g_snprintf(tmp, sizeof(tmp), _("Replied messages: %d\n"), + session_stats.replied); + fd_write_all(sock, tmp, strlen(tmp)); + + g_snprintf(tmp, sizeof(tmp), _("Forwarded messages: %d\n"), + session_stats.forwarded); + fd_write_all(sock, tmp, strlen(tmp)); + + g_snprintf(tmp, sizeof(tmp), _("Total outgoing messages: %d\n"), + (session_stats.sent + session_stats.replied + + session_stats.forwarded)); + fd_write_all(sock, tmp, strlen(tmp)); + + fd_write_all(sock, ".\n", 2); + } else if (!strncmp(buf, "reset_statistics", 16)) { + reset_statistics(); } else if (!strncmp(buf, "select ", 7)) { const gchar *target = buf+7; mainwindow_jump_to(target, TRUE); diff --git a/src/main.h b/src/main.h @@ -30,6 +30,7 @@ #include <hildon-widgets/hildon-window.h> #endif #endif +#include <sys/time.h> extern gchar *prog_version; extern gboolean debug_mode; @@ -38,6 +39,17 @@ extern gboolean debug_mode; extern HildonProgram *hildon_program; #endif +typedef struct _SessionStats SessionStats; + +struct _SessionStats +{ + gint received; + gint sent; + gint replied; + gint forwarded; + time_t time_started; +}; + void app_will_exit (GtkWidget *widget, gpointer data); gboolean clean_quit (gpointer data); gboolean claws_is_exiting(void); diff --git a/src/procmsg.c b/src/procmsg.c @@ -49,6 +49,8 @@ #include "timing.h" #include "inc.h" +extern SessionStats session_stats; + static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_session, gchar **errstr, FolderItem *queue, gint msgnum, gboolean *queued_removed); static void procmsg_update_unread_children (MsgInfo *info, @@ -1761,6 +1763,19 @@ send_mail: fclose(fp); + /* update session statistics */ + if (mailval == 0 && newsval == 0) { + /* update session stats */ + if (replymessageid) + session_stats.replied++; + else if (fwdmessageid) + session_stats.forwarded++; + else + session_stats.sent++; +fprintf(stdout, "++ STATS ++ SENT %d %d %d\n", session_stats.sent, session_stats.replied, session_stats.forwarded); +fflush(stdout); + } + /* save message to outbox */ if (mailval == 0 && newsval == 0 && savecopyfolder) { FolderItem *outbox;