From: <bi...@us...> - 2006-07-17 21:53:33
|
Revision: 16512 Author: billatq Date: 2006-07-17 14:53:28 -0700 (Mon, 17 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16512&view=rev Log Message: ----------- Partially plumbed async logging. Still needs to hook up a g_idle callback for each, incremental reading and something that understands being called multiple times from the event loop. Log sizing for the moment is out. Modified Paths: -------------- branches/soc-2006-db-logger/src/gtklog.c branches/soc-2006-db-logger/src/log.c branches/soc-2006-db-logger/src/log.h Modified: branches/soc-2006-db-logger/src/gtklog.c =================================================================== --- branches/soc-2006-db-logger/src/gtklog.c 2006-07-17 21:33:50 UTC (rev 16511) +++ branches/soc-2006-db-logger/src/gtklog.c 2006-07-17 21:53:28 UTC (rev 16512) @@ -281,7 +281,59 @@ } } -static GaimGtkLogViewer *display_log_viewer(struct log_viewer_hash_t *ht, GList *logs, +static void update_log_viewer_cb(GList *logs, gpointer data) +{ + const char *month; + char prev_top_month[30] = ""; + GtkTreeIter toplevel, child; + GaimGtkLogViewer *lv; + gboolean first_run = FALSE; + + lv = (GaimGtkLogViewer *) data; + if(NULL == lv->logs) { first_run = TRUE; } + + // Concat the new batch of logs to the logviewer, but also keep them around to add to the tree view + lv->logs = g_list_concat(lv->logs, logs); + + while (logs != NULL) { + GaimLog *log = logs->data; + + month = gaim_utf8_strftime(_("%B %Y"), + log->tm ? log->tm : localtime(&log->time)); + + if (strcmp(month, prev_top_month) != 0) + { + /* top level */ + gtk_tree_store_append(lv->treestore, &toplevel, NULL); + gtk_tree_store_set(lv->treestore, &toplevel, 0, month, 1, NULL, -1); + + strncpy(prev_top_month, month, sizeof(prev_top_month)); + } + + /* sub */ + gtk_tree_store_append(lv->treestore, &child, &toplevel); + gtk_tree_store_set(lv->treestore, &child, + 0, log->tm ? gaim_date_format_full(log->tm) : gaim_date_format_full(localtime(&log->time)), + 1, log, + -1); + + logs = logs->next; + } + + if(first_run) + { + select_first_log(lv); + } + +} + +static void finish_update_log_viewer_cb(GList *logs, gpointer data) +{ + // TODO: Do something specific to being finished here + update_log_viewer_cb(logs, data); +} + +static GaimGtkLogViewer *display_log_viewer(struct log_viewer_hash_t *ht, const char *title, GdkPixbuf *pixbuf, int log_size) { GaimGtkLogViewer *lv; @@ -298,30 +350,26 @@ GtkWidget *button; GtkWidget *size_label; - if (logs == NULL) - { - /* No logs were found. */ - const char *log_preferences = NULL; + /* Does logging seem to be disabled? */ + const char *log_preferences = NULL; - if (ht == NULL) { - if (!gaim_prefs_get_bool("/core/logging/log_system")) - log_preferences = _("System events will only be logged if the \"Log all status changes to system log\" preference is enabled."); - } else { - if (ht->type == GAIM_LOG_IM) { - if (!gaim_prefs_get_bool("/core/logging/log_ims")) - log_preferences = _("Instant messages will only be logged if the \"Log all instant messages\" preference is enabled."); - } else if (ht->type == GAIM_LOG_CHAT) { - if (!gaim_prefs_get_bool("/core/logging/log_chats")) - log_preferences = _("Chats will only be logged if the \"Log all chats\" preference is enabled."); - } + if (ht == NULL) { + if (!gaim_prefs_get_bool("/core/logging/log_system")) + log_preferences = _("System events will only be logged if the \"Log all status changes to system log\" preference is enabled."); + } else { + if (ht->type == GAIM_LOG_IM) { + if (!gaim_prefs_get_bool("/core/logging/log_ims")) + log_preferences = _("Instant messages will only be logged if the \"Log all instant messages\" preference is enabled."); + } else if (ht->type == GAIM_LOG_CHAT) { + if (!gaim_prefs_get_bool("/core/logging/log_chats")) + log_preferences = _("Chats will only be logged if the \"Log all chats\" preference is enabled."); } - + gaim_notify_info(NULL, title, _("No logs were found"), log_preferences); - return NULL; } lv = g_new0(GaimGtkLogViewer, 1); - lv->logs = logs; + lv->logs = NULL; if (ht != NULL) g_hash_table_insert(log_viewers, ht, lv); @@ -426,7 +474,7 @@ g_signal_connect(GTK_ENTRY(lv->entry), "activate", G_CALLBACK(search_cb), lv); g_signal_connect(GTK_BUTTON(button), "clicked", G_CALLBACK(search_cb), lv); - select_first_log(lv); +/* select_first_log(lv); */ gtk_widget_show_all(lv->window); @@ -471,9 +519,12 @@ title = g_strdup_printf(_("Conversations with %s"), name); } - - display_log_viewer(ht, gaim_log_get_logs(type, screenname, account), - title, gaim_gtk_create_prpl_icon(account, 0.5), gaim_log_get_total_size(type, screenname, account)); + + // Set up log lister + gaim_log_get_logs(type, screenname, account, update_log_viewer_cb, lv, finish_update_log_viewer_cb, lv, NULL); + // XXX: Fix log sizing + display_log_viewer(ht, title, gaim_gtk_create_prpl_icon(account, 0.5), 0); + g_free(title); } @@ -505,9 +556,10 @@ if (!GAIM_BLIST_NODE_IS_BUDDY(child)) continue; - logs = g_list_concat(gaim_log_get_logs(GAIM_LOG_IM, ((GaimBuddy *)child)->name, - ((GaimBuddy *)child)->account), logs); - total_log_size += gaim_log_get_total_size(GAIM_LOG_IM, ((GaimBuddy *)child)->name, ((GaimBuddy *)child)->account); + gaim_log_get_logs(GAIM_LOG_IM, ((GaimBuddy *)child)->name, ((GaimBuddy *)child)->account, update_log_viewer_cb, lv, finish_update_log_viewer_cb, lv, NULL); + // XXX: For simplicity's sake, pretend the log size is zero for now +// total_log_size += gaim_log_get_total_size(GAIM_LOG_IM, ((GaimBuddy *)child)->name, ((GaimBuddy *)child)->account); + total_log_size = 0; } logs = g_list_sort(logs, gaim_log_compare); @@ -521,7 +573,7 @@ name = gaim_buddy_get_contact_alias(contact->priority); title = g_strdup_printf(_("Conversations with %s"), name); - display_log_viewer(ht, logs, title, pixbuf, total_log_size); + display_log_viewer(ht, title, pixbuf, total_log_size); g_free(title); } @@ -534,7 +586,8 @@ gtk_window_present(GTK_WINDOW(syslog_viewer->window)); return; } - + /* TODO: Finish this after the other bits */ +#if 0 for(accounts = gaim_accounts_get_all(); accounts != NULL; accounts = accounts->next) { GaimAccount *account = (GaimAccount *)accounts->data; @@ -544,8 +597,9 @@ logs = g_list_concat(gaim_log_get_system_logs(account), logs); } logs = g_list_sort(logs, gaim_log_compare); - - syslog_viewer = display_log_viewer(NULL, logs, _("System Log"), NULL, 0); +#endif + // XXX: Implement this thing +// syslog_viewer = display_log_viewer(NULL, logs, _("System Log"), NULL, 0); } /**************************************************************************** Modified: branches/soc-2006-db-logger/src/log.c =================================================================== --- branches/soc-2006-db-logger/src/log.c 2006-07-17 21:33:50 UTC (rev 16511) +++ branches/soc-2006-db-logger/src/log.c 2006-07-17 21:53:28 UTC (rev 16512) @@ -49,12 +49,12 @@ static gsize html_logger_write(GaimLog *log, GaimMessageFlags type, const char *from, time_t time, const char *message); static void html_logger_finalize(GaimLog *log); -static GList *html_logger_list(GaimLogType type, const char *sn, GaimAccount *account); +static GList *html_logger_list(GaimLogType type, const char *sn, GaimAccount *account, GaimLogListCallback *cb, gpointer data); static GList *html_logger_list_syslog(GaimAccount *account); static char *html_logger_read(GaimLog *log, GaimLogReadFlags *flags); static int html_logger_total_size(GaimLogType type, const char *name, GaimAccount *account); -static GList *old_logger_list(GaimLogType type, const char *sn, GaimAccount *account); +static GList *old_logger_list(GaimLogType type, const char *sn, GaimAccount *account, GaimLogListCallback *cb, gpointer data); static int old_logger_total_size(GaimLogType type, const char *name, GaimAccount *account); static char * old_logger_read (GaimLog *log, GaimLogReadFlags *flags); static int old_logger_size (GaimLog *log); @@ -65,7 +65,7 @@ GaimMessageFlags type, const char *from, time_t time, const char *message); static void txt_logger_finalize(GaimLog *log); -static GList *txt_logger_list(GaimLogType type, const char *sn, GaimAccount *account); +static GList *txt_logger_list(GaimLogType type, const char *sn, GaimAccount *account, GaimLogListCallback *cb, gpointer data); static GList *txt_logger_list_syslog(GaimAccount *account); static char *txt_logger_read(GaimLog *log, GaimLogReadFlags *flags); static int txt_logger_total_size(GaimLogType type, const char *name, GaimAccount *account); @@ -209,6 +209,7 @@ int gaim_log_get_total_size(GaimLogType type, const char *name, GaimAccount *account) { gpointer ptrsize; + gpointer data; int size = 0; GSList *n; struct _gaim_logsize_user *lu; @@ -226,9 +227,13 @@ GaimLogLogger *logger = n->data; if(logger->total_size){ - size += (logger->total_size)(type, name, account); + // TODO: Fix this + //size += (logger->total_size)(type, name, account, gaim_log_get_logs_cb, data); + size = 0; } else if(logger->list) { - GList *logs = (logger->list)(type, name, account); + // TODO: Fix this + //GList *logs = (logger->list)(type, name, account, gaim_log_get_logs_cb, data); + /* int this_size = 0; while (logs) { @@ -239,6 +244,7 @@ } size += this_size; + */ } } @@ -417,18 +423,34 @@ return b->time - a->time; } -GList *gaim_log_get_logs(GaimLogType type, const char *name, GaimAccount *account) +// Target of the callback from the logger list +void gaim_log_get_logs_cb(GList *logs, gpointer data) { - GList *logs = NULL; + // ... +} + +void gaim_log_get_logs(GaimLogType type, + const char *name, + GaimAccount *account, + GaimLogListCallback *cb, + gpointer cb_data, + GaimLogListCallback *done_cb, + gpointer done_cb_data, + GList *logs) +{ + +//GList *gaim_log_get_logs(GaimLogType type, const char *name, GaimAccount *account) +//{ GSList *n; + gpointer data; for (n = loggers; n; n = n->next) { GaimLogLogger *logger = n->data; if (!logger->list) continue; - logs = g_list_concat(logger->list(type, name, account), logs); + logger->list(type, name, account, gaim_log_get_logs_cb, data); } - return g_list_sort(logs, gaim_log_compare); + //return g_list_sort(logs, gaim_log_compare); } gint gaim_log_set_compare(gconstpointer y, gconstpointer z) @@ -1143,7 +1165,7 @@ } } -static GList *html_logger_list(GaimLogType type, const char *sn, GaimAccount *account) +static GList *html_logger_list(GaimLogType type, const char *sn, GaimAccount *account, GaimLogListCallback *cb, gpointer data) { return gaim_log_common_lister(type, sn, account, ".html", html_logger); } @@ -1275,7 +1297,7 @@ } } -static GList *txt_logger_list(GaimLogType type, const char *sn, GaimAccount *account) +static GList *txt_logger_list(GaimLogType type, const char *sn, GaimAccount *account, GaimLogListCallback *cb, gpointer data) { return gaim_log_common_lister(type, sn, account, ".txt", txt_logger); } @@ -1328,7 +1350,7 @@ int length; }; -static GList *old_logger_list(GaimLogType type, const char *sn, GaimAccount *account) +static GList *old_logger_list(GaimLogType type, const char *sn, GaimAccount *account, GaimLogListCallback *cb, gpointer cb_data) { char *logfile = g_strdup_printf("%s.log", gaim_normalize(account, sn)); char *pathstr = g_build_filename(gaim_user_dir(), "logs", logfile, NULL); Modified: branches/soc-2006-db-logger/src/log.h =================================================================== --- branches/soc-2006-db-logger/src/log.h 2006-07-17 21:33:50 UTC (rev 16511) +++ branches/soc-2006-db-logger/src/log.h 2006-07-17 21:53:28 UTC (rev 16512) @@ -50,6 +50,7 @@ #include "account.h" #include "conversation.h" +typedef void (*GaimLogListCallback) (GList *logs, gpointer data); typedef void (*GaimLogSetCallback) (GHashTable *sets, GaimLogSet *set); /** @@ -77,7 +78,7 @@ void (*finalize)(GaimLog *log); /** This function returns a sorted GList of available GaimLogs */ - GList *(*list)(GaimLogType type, const char *name, GaimAccount *account); + GList *(*list)(GaimLogType type, const char *name, GaimAccount *account, GaimLogListCallback *cb, gpointer cb_data); /** Given one of the logs returned by the logger's list function, * this returns the contents of the log in GtkIMHtml markup */ @@ -177,6 +178,8 @@ /***************************************/ /*@{*/ +void gaim_log_get_logs_cb(GList *logs, gpointer data); + /** * Creates a new log * @@ -226,6 +229,8 @@ */ char *gaim_log_read(GaimLog *log, GaimLogReadFlags *flags); +// TODO: Update Documentation + /** * Returns a list of all available logs * @@ -234,7 +239,14 @@ * @param account The account * @return A sorted list of GaimLogs */ -GList *gaim_log_get_logs(GaimLogType type, const char *name, GaimAccount *account); +void gaim_log_get_logs(GaimLogType type, + const char *name, + GaimAccount *account, + GaimLogListCallback *cb, + gpointer cb_data, + GaimLogListCallback *done_cb, + gpointer done_cb_data, + GList *logs); /** * Returns a GHashTable of GaimLogSets. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |