+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
( 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
MICRO_VERSION=0
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=51
+EXTRA_VERSION=52
EXTRA_RELEASE=
EXTRA_GTK2_VERSION=
.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
.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
#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;
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;
{
if (!window)
about_create();
- else
+ else {
+ about_update_stats();
gtk_window_present(GTK_WINDOW(window));
+ }
}
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);
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;
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"));
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,
#endif
#endif
+extern SessionStats session_stats;
+
static GList *inc_dialog_list = NULL;
guint inc_lock_count = 0;
#define MSGBUFSIZE 8192
+static void inc_update_stats(gint new_msgs);
static void inc_finished (MainWindow *mainwin,
gboolean new_messages,
gboolean autocheck);
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.
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);
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();
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);
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);
static void inc_notify_cmd(gint new_msgs, gboolean notify)
{
-
#ifndef MAEMO
gchar *buf, *numpos, *ret_str;
gssize by_read = 0, by_written = 0;
gboolean search_recursive;
gboolean status;
gboolean status_full;
+ gboolean statistics;
+ gboolean reset_statistics;
GPtrArray *status_folders;
GPtrArray *status_full_folders;
gboolean send;
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);
}
#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
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;
if (!g_thread_supported())
g_thread_init(NULL);
+ reset_statistics();
+
gtk_set_locale();
gtk_init(&argc, &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]);
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"));
}
} 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));
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);
#include <hildon-widgets/hildon-window.h>
#endif
#endif
+#include <sys/time.h>
extern gchar *prog_version;
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);
#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,
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;