diff options
author | Cosimo Alfarano <cosimo.alfarano@collabora.co.uk> | 2010-02-24 03:32:57 +0800 |
---|---|---|
committer | Cosimo Alfarano <cosimo.alfarano@collabora.co.uk> | 2010-02-26 01:26:57 +0800 |
commit | 8d4d46e440c7a6bd321fc098265db8ede27c07de (patch) | |
tree | bcdffe751459a38bd950d5424d628d831c5243a7 /libempathy-gtk/empathy-log-window.c | |
parent | 8e24107b437f63d9b2ca93e0d5b7379ee87af98d (diff) | |
download | gsoc2013-empathy-8d4d46e440c7a6bd321fc098265db8ede27c07de.tar gsoc2013-empathy-8d4d46e440c7a6bd321fc098265db8ede27c07de.tar.gz gsoc2013-empathy-8d4d46e440c7a6bd321fc098265db8ede27c07de.tar.bz2 gsoc2013-empathy-8d4d46e440c7a6bd321fc098265db8ede27c07de.tar.lz gsoc2013-empathy-8d4d46e440c7a6bd321fc098265db8ede27c07de.tar.xz gsoc2013-empathy-8d4d46e440c7a6bd321fc098265db8ede27c07de.tar.zst gsoc2013-empathy-8d4d46e440c7a6bd321fc098265db8ede27c07de.zip |
TPL Enabling patch, all-in-one.
By default TPL is disabled, use --enable-tpl configure option to enable it.
Diffstat (limited to 'libempathy-gtk/empathy-log-window.c')
-rw-r--r-- | libempathy-gtk/empathy-log-window.c | 533 |
1 files changed, 526 insertions, 7 deletions
diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index f12abf374..7044d2e91 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -31,8 +31,13 @@ #include <gtk/gtk.h> #include <telepathy-glib/account-manager.h> +#ifdef ENABLE_TPL +#include <telepathy-logger/log-manager.h> +#endif /* ENABLE_TPL */ +#ifndef ENABLE_TPL #include <libempathy/empathy-log-manager.h> +#endif /* ENABLE_TPL */ #include <libempathy/empathy-chatroom-manager.h> #include <libempathy/empathy-chatroom.h> #include <libempathy/empathy-message.h> @@ -71,7 +76,11 @@ typedef struct { gchar *last_find; +#ifndef ENABLE_TPL EmpathyLogManager *log_manager; +#else + TplLogManager *log_manager; +#endif /* ENABLE_TPL */ /* Those are only used while waiting for the account chooser to be ready */ TpAccount *selected_account; @@ -204,7 +213,11 @@ empathy_log_window_show (TpAccount *account, } window = g_new0 (EmpathyLogWindow, 1); +#ifndef ENABLE_TPL window->log_manager = empathy_log_manager_dup_singleton (); +#else + window->log_manager = tpl_log_manager_dup_singleton (); +#endif /* ENABLE_TPL */ filename = empathy_file_lookup ("empathy-log-window.ui", "libempathy-gtk"); @@ -339,6 +352,64 @@ log_window_entry_find_changed_cb (GtkWidget *entry, gtk_widget_set_sensitive (window->button_find, is_sensitive); } +#ifdef ENABLE_TPL +static void +got_messages_for_date_cb (GObject *manager, + GAsyncResult *result, + gpointer user_data) +{ + EmpathyLogWindow *window = user_data; + GList *messages; + GList *l; + gboolean can_do_previous; + gboolean can_do_next; + GError *error = NULL; + + messages = tpl_log_manager_async_operation_finish (result, &error); + + if (error != NULL) { + DEBUG ("Unable to retrieve messages for the selected date: %s. Aborting", + error->message); + empathy_chat_view_append_event (window->chatview_find, + "Unable to retrieve messages for the selected date"); + g_error_free (error); + return; + } + + for (l = messages; l; l = l->next) { + EmpathyMessage *message; + + g_assert (TPL_IS_LOG_ENTRY (l->data)); + + message = empathy_message_from_tpl_log_entry (l->data); + g_object_unref (l->data); + empathy_chat_view_append_message (window->chatview_find, message); + g_object_unref (message); + } + g_list_free (messages); + + /* Scroll to the most recent messages */ + empathy_chat_view_scroll (window->chatview_find, TRUE); + + /* Highlight and find messages */ + empathy_chat_view_highlight (window->chatview_find, + window->last_find, + FALSE); + empathy_chat_view_find_next (window->chatview_find, + window->last_find, + TRUE, + FALSE); + empathy_chat_view_find_abilities (window->chatview_find, + window->last_find, + FALSE, + &can_do_previous, + &can_do_next); + gtk_widget_set_sensitive (window->button_previous, can_do_previous); + gtk_widget_set_sensitive (window->button_next, can_do_next); + gtk_widget_set_sensitive (window->button_find, FALSE); +} +#endif /* ENABLE_TPL */ + static void log_window_find_changed_cb (GtkTreeSelection *selection, EmpathyLogWindow *window) @@ -350,11 +421,13 @@ log_window_find_changed_cb (GtkTreeSelection *selection, gchar *chat_id; gboolean is_chatroom; gchar *date; +#ifndef ENABLE_TPL EmpathyMessage *message; GList *messages; GList *l; gboolean can_do_previous; gboolean can_do_next; +#endif /* ENABLE_TPL */ /* Get selected information */ view = GTK_TREE_VIEW (window->treeview_find); @@ -386,15 +459,26 @@ log_window_find_changed_cb (GtkTreeSelection *selection, empathy_chat_view_scroll (window->chatview_find, FALSE); /* Get messages */ +#ifndef ENABLE_TPL messages = empathy_log_manager_get_messages_for_date (window->log_manager, account, chat_id, is_chatroom, date); +#else + tpl_log_manager_get_messages_for_date_async (window->log_manager, + account, + chat_id, + is_chatroom, + date, + got_messages_for_date_cb, + window); +#endif /* ENABLE_TPL */ g_object_unref (account); g_free (date); g_free (chat_id); +#ifndef ENABLE_TPL for (l = messages; l; l = l->next) { message = l->data; empathy_chat_view_append_message (window->chatview_find, message); @@ -420,19 +504,89 @@ log_window_find_changed_cb (GtkTreeSelection *selection, gtk_widget_set_sensitive (window->button_previous, can_do_previous); gtk_widget_set_sensitive (window->button_next, can_do_next); gtk_widget_set_sensitive (window->button_find, FALSE); +#endif /* ENABLE_TPL */ +} + + +#ifdef ENABLE_TPL +static void +log_manager_searched_new_cb (GObject *manager, + GAsyncResult *result, + gpointer user_data) +{ + GList *hits; + GList *l; + GtkTreeIter iter; + GtkListStore *store = user_data; + GError *error = NULL; + + hits = tpl_log_manager_async_operation_finish (result, &error); + + if (error != NULL) { + DEBUG ("%s. Aborting", error->message); + g_error_free (error); + return; + } + + for (l = hits; l; l = l->next) { + TplLogSearchHit *hit; + const gchar *account_name; + const gchar *account_icon; + gchar *date_readable; + + hit = l->data; + + /* Protect against invalid data (corrupt or old log files. */ + if (!hit->account || !hit->chat_id) { + continue; + } + + date_readable = tpl_log_manager_get_date_readable (hit->date); + account_name = tp_account_get_display_name (hit->account); + account_icon = tp_account_get_icon_name (hit->account); + + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, + COL_FIND_ACCOUNT_ICON, account_icon, + COL_FIND_ACCOUNT_NAME, account_name, + COL_FIND_ACCOUNT, hit->account, + COL_FIND_CHAT_NAME, hit->chat_id, /* FIXME */ + COL_FIND_CHAT_ID, hit->chat_id, + COL_FIND_IS_CHATROOM, hit->is_chatroom, + COL_FIND_DATE, hit->date, + COL_FIND_DATE_READABLE, date_readable, + -1); + + g_free (date_readable); + + /* FIXME: Update COL_FIND_CHAT_NAME */ + if (hit->is_chatroom) { + } else { + } + } + + if (hits) { + tpl_log_manager_search_free (hits); + } } +#endif /* ENABLE_TPL */ + static void log_window_find_populate (EmpathyLogWindow *window, const gchar *search_criteria) { +#ifndef ENABLE_TPL GList *hits, *l; +#endif /* ENABLE_TPL */ GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkListStore *store; +#ifndef ENABLE_TPL GtkTreeIter iter; +#endif /* ENABLE_TPL */ view = GTK_TREE_VIEW (window->treeview_find); model = gtk_tree_view_get_model (view); @@ -448,6 +602,10 @@ log_window_find_populate (EmpathyLogWindow *window, return; } +#ifdef ENABLE_TPL + tpl_log_manager_search_new_async (window->log_manager, search_criteria, + log_manager_searched_new_cb, (gpointer) store); +#else hits = empathy_log_manager_search_new (window->log_manager, search_criteria); for (l = hits; l; l = l->next) { @@ -490,6 +648,7 @@ log_window_find_populate (EmpathyLogWindow *window, if (hits) { empathy_log_manager_search_free (hits); } +#endif /* ENABLE_TPL */ } static void @@ -655,18 +814,87 @@ log_window_chats_changed_cb (GtkTreeSelection *selection, log_window_chats_get_messages (window, NULL); } +#ifdef ENABLE_TPL +static void +log_manager_got_chats_cb (GObject *manager, + GAsyncResult *result, + gpointer user_data) +{ + EmpathyLogWindow *window = user_data; + GList *chats; + GList *l; + EmpathyAccountChooser *account_chooser; + TpAccount *account; + GtkTreeView *view; + GtkTreeModel *model; + GtkTreeSelection *selection; + GtkListStore *store; + GtkTreeIter iter; + GError *error = NULL; + + chats = tpl_log_manager_async_operation_finish (result, &error); + + if (error != NULL) { + DEBUG ("%s. Aborting", error->message); + g_error_free (error); + return; + } + + account_chooser = EMPATHY_ACCOUNT_CHOOSER (window->account_chooser_chats); + account = empathy_account_chooser_dup_account (account_chooser); + + view = GTK_TREE_VIEW (window->treeview_chats); + model = gtk_tree_view_get_model (view); + selection = gtk_tree_view_get_selection (view); + store = GTK_LIST_STORE (model); + + for (l = chats; l; l = l->next) { + TplLogSearchHit *hit; + + hit = l->data; + + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, + COL_CHAT_ICON, "empathy-available", /* FIXME */ + COL_CHAT_NAME, hit->chat_id, + COL_CHAT_ACCOUNT, account, + COL_CHAT_ID, hit->chat_id, + COL_CHAT_IS_CHATROOM, hit->is_chatroom, + -1); + + /* FIXME: Update COL_CHAT_ICON/NAME */ + if (hit->is_chatroom) { + } else { + } + } + tpl_log_manager_search_free (chats); + + /* Unblock signals */ + g_signal_handlers_unblock_by_func (selection, + log_window_chats_changed_cb, + window); + + g_object_unref (account); +} +#endif /* ENABLE_TPL */ + + static void log_window_chats_populate (EmpathyLogWindow *window) { EmpathyAccountChooser *account_chooser; TpAccount *account; +#ifndef ENABLE_TPL GList *chats, *l; +#endif /* ENABLE_TPL */ GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkListStore *store; +#ifndef ENABLE_TPL GtkTreeIter iter; +#endif /* ENABLE_TPL */ account_chooser = EMPATHY_ACCOUNT_CHOOSER (window->account_chooser_chats); account = empathy_account_chooser_dup_account (account_chooser); @@ -688,6 +916,10 @@ log_window_chats_populate (EmpathyLogWindow *window) gtk_list_store_clear (store); +#ifdef ENABLE_TPL + tpl_log_manager_get_chats_async (window->log_manager, account, + log_manager_got_chats_cb, (gpointer) window); +#else chats = empathy_log_manager_get_chats (window->log_manager, account); for (l = chats; l; l = l->next) { EmpathyLogSearchHit *hit; @@ -717,6 +949,7 @@ log_window_chats_populate (EmpathyLogWindow *window) g_object_unref (account); +#endif /* ENABLE_TPL */ } static void @@ -886,6 +1119,219 @@ log_window_chats_get_selected (EmpathyLogWindow *window, return TRUE; } +#ifdef ENABLE_TPL +static void +log_window_got_messages_for_date_cb (GObject *manager, + GAsyncResult *result, + gpointer user_data) +{ + EmpathyLogWindow *window = user_data; + GList *messages; + GList *l; + GError *error = NULL; + + messages = tpl_log_manager_async_operation_finish (result, &error); + + if (error != NULL) { + DEBUG ("Unable to retrieve messages for the selected date: %s. Aborting", + error->message); + empathy_chat_view_append_event (window->chatview_find, + "Unable to retrieve messages for the selected date"); + g_error_free (error); + return; + } + + for (l = messages; l; l = l->next) { + EmpathyMessage *message = empathy_message_from_tpl_log_entry (l->data); + g_object_unref (l->data); + empathy_chat_view_append_message (window->chatview_chats, + message); + g_object_unref (message); + } + g_list_free (messages); + + /* Turn back on scrolling */ + empathy_chat_view_scroll (window->chatview_find, TRUE); + + /* Give the search entry main focus */ + gtk_widget_grab_focus (window->entry_chats); +} + + +static void +log_window_get_messages_for_date (EmpathyLogWindow *window, + const gchar *date) +{ + TpAccount *account; + gchar *chat_id; + gboolean is_chatroom; + + gtk_calendar_clear_marks (GTK_CALENDAR (window->calendar_chats)); + + if (!log_window_chats_get_selected (window, &account, + &chat_id, &is_chatroom)) { + return; + } + + /* Clear all current messages shown in the textview */ + empathy_chat_view_clear (window->chatview_chats); + + /* Turn off scrolling temporarily */ + empathy_chat_view_scroll (window->chatview_find, FALSE); + + /* Get messages */ + tpl_log_manager_get_messages_for_date_async (window->log_manager, + account, chat_id, + is_chatroom, + date, + log_window_got_messages_for_date_cb, + (gpointer) window); +} + +static void +log_manager_got_dates_cb (GObject *manager, + GAsyncResult *result, + gpointer user_data) +{ + EmpathyLogWindow *window = user_data; + GList *dates; + GList *l; + guint year_selected; + guint year; + guint month; + guint month_selected; + guint day; + gboolean day_selected = FALSE; + const gchar *date = NULL; + GError *error = NULL; + + dates = tpl_log_manager_async_operation_finish (result, &error); + + if (error != NULL) { + DEBUG ("Unable to retrieve messages' dates: %s. Aborting", + error->message); + empathy_chat_view_append_event (window->chatview_find, + "Unable to retrieve messages' dates"); + return; + } + + for (l = dates; l; l = l->next) { + const gchar *str; + + str = l->data; + if (!str) { + continue; + } + + sscanf (str, "%4d%2d%2d", &year, &month, &day); + gtk_calendar_get_date (GTK_CALENDAR (window->calendar_chats), + &year_selected, + &month_selected, + NULL); + + month_selected++; + + if (!l->next) { + date = str; + } + + if (year != year_selected || month != month_selected) { + continue; + } + + DEBUG ("Marking date:'%s'", str); + gtk_calendar_mark_day (GTK_CALENDAR (window->calendar_chats), day); + + if (l->next) { + continue; + } + + day_selected = TRUE; + + gtk_calendar_select_day (GTK_CALENDAR (window->calendar_chats), day); + } + + if (!day_selected) { + /* Unselect the day in the calendar */ + gtk_calendar_select_day (GTK_CALENDAR (window->calendar_chats), 0); + } + + g_signal_handlers_unblock_by_func (window->calendar_chats, + log_window_calendar_chats_day_selected_cb, + window); + + if (date) { + log_window_get_messages_for_date (window, date); + } + + g_list_foreach (dates, (GFunc) g_free, NULL); + g_list_free (dates); +} + + +static void +log_window_chats_get_messages (EmpathyLogWindow *window, + const gchar *date_to_show) +{ + TpAccount *account; + gchar *chat_id; + gboolean is_chatroom; + const gchar *date; + guint year_selected; + guint year; + guint month; + guint month_selected; + guint day; + + + if (!log_window_chats_get_selected (window, &account, + &chat_id, &is_chatroom)) { + return; + } + + g_signal_handlers_block_by_func (window->calendar_chats, + log_window_calendar_chats_day_selected_cb, + window); + + /* Either use the supplied date or get the last */ + date = date_to_show; + if (!date) { + /* Get a list of dates and show them on the calendar */ + tpl_log_manager_get_dates_async (window->log_manager, + account, chat_id, + is_chatroom, + log_manager_got_dates_cb, (gpointer) window); + /* signal unblocked at the end of the CB flow */ + } else { + sscanf (date, "%4d%2d%2d", &year, &month, &day); + gtk_calendar_get_date (GTK_CALENDAR (window->calendar_chats), + &year_selected, + &month_selected, + NULL); + + month_selected++; + + if (year != year_selected && month != month_selected) { + day = 0; + } + + gtk_calendar_select_day (GTK_CALENDAR (window->calendar_chats), day); + + g_signal_handlers_unblock_by_func (window->calendar_chats, + log_window_calendar_chats_day_selected_cb, + window); + } + + if (date) { + log_window_get_messages_for_date (window, date); + } + + g_object_unref (account); + g_free (chat_id); +} + +#else + static void log_window_chats_get_messages (EmpathyLogWindow *window, const gchar *date_to_show) @@ -1022,6 +1468,8 @@ OUT: g_free (chat_id); } +#endif /* ENABLE_TPL */ + static void log_window_calendar_chats_day_selected_cb (GtkWidget *calendar, EmpathyLogWindow *window) @@ -1046,6 +1494,67 @@ log_window_calendar_chats_day_selected_cb (GtkWidget *calendar, g_free (date); } + +#ifdef ENABLE_TPL +static void +log_window_updating_calendar_month_cb (GObject *manager, + GAsyncResult *result, gpointer user_data) +{ + EmpathyLogWindow *window = user_data; + GList *dates; + GList *l; + guint year_selected; + guint month_selected; + GError *error = NULL; + + dates = tpl_log_manager_async_operation_finish (result, &error); + + if (error != NULL) { + DEBUG ("Unable to retrieve messages' dates: %s. Aborting", + error->message); + empathy_chat_view_append_event (window->chatview_find, + "Unable to retrieve messages' dates"); + g_error_free (error); + return; + } + + gtk_calendar_clear_marks (GTK_CALENDAR (window->calendar_chats)); + g_object_get (window->calendar_chats, + "month", &month_selected, + "year", &year_selected, + NULL); + + /* We need this here because it appears that the months start from 0 */ + month_selected++; + + for (l = dates; l; l = l->next) { + const gchar *str; + guint year; + guint month; + guint day; + + str = l->data; + if (!str) { + continue; + } + + sscanf (str, "%4d%2d%2d", &year, &month, &day); + + if (year == year_selected && month == month_selected) { + DEBUG ("Marking date:'%s'", str); + gtk_calendar_mark_day (GTK_CALENDAR (window->calendar_chats), day); + } + } + + g_list_foreach (dates, (GFunc) g_free, NULL); + g_list_free (dates); + + DEBUG ("Currently showing month %d and year %d", month_selected, + year_selected); +} +#endif /* ENABLE_TPL */ + + static void log_window_calendar_chats_month_changed_cb (GtkWidget *calendar, EmpathyLogWindow *window) @@ -1053,11 +1562,13 @@ log_window_calendar_chats_month_changed_cb (GtkWidget *calendar, TpAccount *account; gchar *chat_id; gboolean is_chatroom; +#ifndef ENABLE_TPL guint year_selected; guint month_selected; GList *dates; GList *l; +#endif /* ENABLE_TPL */ gtk_calendar_clear_marks (GTK_CALENDAR (calendar)); @@ -1067,20 +1578,24 @@ log_window_calendar_chats_month_changed_cb (GtkWidget *calendar, return; } + /* Get the log object for this contact */ +#ifdef ENABLE_TPL + tpl_log_manager_get_dates_async (window->log_manager, account, + chat_id, is_chatroom, + log_window_updating_calendar_month_cb, + (gpointer) window); +#else + dates = empathy_log_manager_get_dates (window->log_manager, account, + chat_id, is_chatroom); + g_object_get (calendar, "month", &month_selected, "year", &year_selected, NULL); - /* We need this hear because it appears that the months start from 0 */ + /* We need this here because it appears that the months start from 0 */ month_selected++; - /* Get the log object for this contact */ - dates = empathy_log_manager_get_dates (window->log_manager, account, - chat_id, is_chatroom); - g_object_unref (account); - g_free (chat_id); - for (l = dates; l; l = l->next) { const gchar *str; guint year; @@ -1105,6 +1620,10 @@ log_window_calendar_chats_month_changed_cb (GtkWidget *calendar, DEBUG ("Currently showing month %d and year %d", month_selected, year_selected); +#endif /* ENABLE_TPL */ + + g_object_unref (account); + g_free (chat_id); } static void |