| 1 /** |
1 /** |
| 2 * @file gtklog.c GTK+ Log viewer |
2 * @file gtklog.c GTK+ Log viewer |
| 3 * @ingroup gtkui |
3 * @ingroup gtkui |
| 4 * |
4 * |
| 5 * gaim |
5 * purple |
| 6 * |
6 * |
| 7 * Gaim is the legal property of its developers, whose names are too numerous |
7 * Purple is the legal property of its developers, whose names are too numerous |
| 8 * to list here. Please refer to the COPYRIGHT file distributed with this |
8 * to list here. Please refer to the COPYRIGHT file distributed with this |
| 9 * source distribution. |
9 * source distribution. |
| 10 * |
10 * |
| 11 * This program is free software; you can redistribute it and/or modify |
11 * This program is free software; you can redistribute it and/or modify |
| 12 * it under the terms of the GNU General Public License as published by |
12 * it under the terms of the GNU General Public License as published by |
| 41 static GHashTable *log_viewers = NULL; |
41 static GHashTable *log_viewers = NULL; |
| 42 static void populate_log_tree(PidginLogViewer *lv); |
42 static void populate_log_tree(PidginLogViewer *lv); |
| 43 static PidginLogViewer *syslog_viewer = NULL; |
43 static PidginLogViewer *syslog_viewer = NULL; |
| 44 |
44 |
| 45 struct log_viewer_hash_t { |
45 struct log_viewer_hash_t { |
| 46 GaimLogType type; |
46 PurpleLogType type; |
| 47 char *screenname; |
47 char *screenname; |
| 48 GaimAccount *account; |
48 PurpleAccount *account; |
| 49 GaimContact *contact; |
49 PurpleContact *contact; |
| 50 }; |
50 }; |
| 51 |
51 |
| 52 static guint log_viewer_hash(gconstpointer data) |
52 static guint log_viewer_hash(gconstpointer data) |
| 53 { |
53 { |
| 54 const struct log_viewer_hash_t *viewer = data; |
54 const struct log_viewer_hash_t *viewer = data; |
| 55 |
55 |
| 56 if (viewer->contact != NULL) |
56 if (viewer->contact != NULL) |
| 57 return g_direct_hash(viewer->contact); |
57 return g_direct_hash(viewer->contact); |
| 58 |
58 |
| 59 return g_str_hash(viewer->screenname) + |
59 return g_str_hash(viewer->screenname) + |
| 60 g_str_hash(gaim_account_get_username(viewer->account)); |
60 g_str_hash(purple_account_get_username(viewer->account)); |
| 61 } |
61 } |
| 62 |
62 |
| 63 static gboolean log_viewer_equal(gconstpointer y, gconstpointer z) |
63 static gboolean log_viewer_equal(gconstpointer y, gconstpointer z) |
| 64 { |
64 { |
| 65 const struct log_viewer_hash_t *a, *b; |
65 const struct log_viewer_hash_t *a, *b; |
| 108 gtk_tree_selection_select_path(gtk_tree_view_get_selection(GTK_TREE_VIEW(lv->treeview)), path); |
108 gtk_tree_selection_select_path(gtk_tree_view_get_selection(GTK_TREE_VIEW(lv->treeview)), path); |
| 109 |
109 |
| 110 gtk_tree_path_free(path); |
110 gtk_tree_path_free(path); |
| 111 } |
111 } |
| 112 |
112 |
| 113 static const char *log_get_date(GaimLog *log) |
113 static const char *log_get_date(PurpleLog *log) |
| 114 { |
114 { |
| 115 if (log->tm) |
115 if (log->tm) |
| 116 return gaim_date_format_full(log->tm); |
116 return purple_date_format_full(log->tm); |
| 117 else |
117 else |
| 118 return gaim_date_format_full(localtime(&log->time)); |
118 return purple_date_format_full(localtime(&log->time)); |
| 119 } |
119 } |
| 120 |
120 |
| 121 static void search_cb(GtkWidget *button, PidginLogViewer *lv) |
121 static void search_cb(GtkWidget *button, PidginLogViewer *lv) |
| 122 { |
122 { |
| 123 const char *search_term = gtk_entry_get_text(GTK_ENTRY(lv->entry)); |
123 const char *search_term = gtk_entry_get_text(GTK_ENTRY(lv->entry)); |
| 148 |
148 |
| 149 gtk_tree_store_clear(lv->treestore); |
149 gtk_tree_store_clear(lv->treestore); |
| 150 gtk_imhtml_clear(GTK_IMHTML(lv->imhtml)); |
150 gtk_imhtml_clear(GTK_IMHTML(lv->imhtml)); |
| 151 |
151 |
| 152 for (logs = lv->logs; logs != NULL; logs = logs->next) { |
152 for (logs = lv->logs; logs != NULL; logs = logs->next) { |
| 153 char *read = gaim_log_read((GaimLog*)logs->data, NULL); |
153 char *read = purple_log_read((PurpleLog*)logs->data, NULL); |
| 154 if (read && *read && gaim_strcasestr(read, search_term)) { |
154 if (read && *read && purple_strcasestr(read, search_term)) { |
| 155 GtkTreeIter iter; |
155 GtkTreeIter iter; |
| 156 GaimLog *log = logs->data; |
156 PurpleLog *log = logs->data; |
| 157 |
157 |
| 158 gtk_tree_store_append (lv->treestore, &iter, NULL); |
158 gtk_tree_store_append (lv->treestore, &iter, NULL); |
| 159 gtk_tree_store_set(lv->treestore, &iter, |
159 gtk_tree_store_set(lv->treestore, &iter, |
| 160 0, log_get_date(log), |
160 0, log_get_date(log), |
| 161 1, log, -1); |
161 1, log, -1); |
| 170 static void destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) { |
170 static void destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) { |
| 171 PidginLogViewer *lv = syslog_viewer; |
171 PidginLogViewer *lv = syslog_viewer; |
| 172 |
172 |
| 173 #ifdef _WIN32 |
173 #ifdef _WIN32 |
| 174 if (resp == GTK_RESPONSE_HELP) { |
174 if (resp == GTK_RESPONSE_HELP) { |
| 175 char *logdir = g_build_filename(gaim_user_dir(), "logs", NULL); |
175 char *logdir = g_build_filename(purple_user_dir(), "logs", NULL); |
| 176 winpidgin_shell_execute(logdir, "explore", NULL); |
176 winpidgin_shell_execute(logdir, "explore", NULL); |
| 177 g_free(logdir); |
177 g_free(logdir); |
| 178 return; |
178 return; |
| 179 } |
179 } |
| 180 #endif |
180 #endif |
| 243 } |
243 } |
| 244 |
244 |
| 245 static void log_delete_log_cb(GtkWidget *menuitem, gpointer *data) |
245 static void log_delete_log_cb(GtkWidget *menuitem, gpointer *data) |
| 246 { |
246 { |
| 247 PidginLogViewer *lv = data[0]; |
247 PidginLogViewer *lv = data[0]; |
| 248 GaimLog *log = data[1]; |
248 PurpleLog *log = data[1]; |
| 249 const char *time = log_get_date(log); |
249 const char *time = log_get_date(log); |
| 250 const char *name; |
250 const char *name; |
| 251 char *tmp; |
251 char *tmp; |
| 252 gpointer *data2; |
252 gpointer *data2; |
| 253 |
253 |
| 254 if (log->type == GAIM_LOG_IM) |
254 if (log->type == PURPLE_LOG_IM) |
| 255 { |
255 { |
| 256 GaimBuddy *buddy = gaim_find_buddy(log->account, log->name); |
256 PurpleBuddy *buddy = purple_find_buddy(log->account, log->name); |
| 257 if (buddy != NULL) |
257 if (buddy != NULL) |
| 258 name = gaim_buddy_get_contact_alias(buddy); |
258 name = purple_buddy_get_contact_alias(buddy); |
| 259 else |
259 else |
| 260 name = log->name; |
260 name = log->name; |
| 261 |
261 |
| 262 tmp = g_strdup_printf(_("Are you sure you want to permanently delete the log of the " |
262 tmp = g_strdup_printf(_("Are you sure you want to permanently delete the log of the " |
| 263 "conversation with %s which started at %s?"), name, time); |
263 "conversation with %s which started at %s?"), name, time); |
| 264 } |
264 } |
| 265 else if (log->type == GAIM_LOG_CHAT) |
265 else if (log->type == PURPLE_LOG_CHAT) |
| 266 { |
266 { |
| 267 GaimChat *chat = gaim_blist_find_chat(log->account, log->name); |
267 PurpleChat *chat = purple_blist_find_chat(log->account, log->name); |
| 268 if (chat != NULL) |
268 if (chat != NULL) |
| 269 name = gaim_chat_get_name(chat); |
269 name = purple_chat_get_name(chat); |
| 270 else |
270 else |
| 271 name = log->name; |
271 name = log->name; |
| 272 |
272 |
| 273 tmp = g_strdup_printf(_("Are you sure you want to permanently delete the log of the " |
273 tmp = g_strdup_printf(_("Are you sure you want to permanently delete the log of the " |
| 274 "conversation in %s which started at %s?"), name, time); |
274 "conversation in %s which started at %s?"), name, time); |
| 275 } |
275 } |
| 276 else if (log->type == GAIM_LOG_SYSTEM) |
276 else if (log->type == PURPLE_LOG_SYSTEM) |
| 277 { |
277 { |
| 278 tmp = g_strdup_printf(_("Are you sure you want to permanently delete the system log " |
278 tmp = g_strdup_printf(_("Are you sure you want to permanently delete the system log " |
| 279 "which started at %s?"), time); |
279 "which started at %s?"), time); |
| 280 } |
280 } |
| 281 else |
281 else |
| 288 * either way. */ |
288 * either way. */ |
| 289 data2 = g_new(gpointer, 3); |
289 data2 = g_new(gpointer, 3); |
| 290 data2[0] = lv->treestore; |
290 data2[0] = lv->treestore; |
| 291 data2[1] = data[3]; /* iter */ |
291 data2[1] = data[3]; /* iter */ |
| 292 data2[2] = log; |
292 data2[2] = log; |
| 293 gaim_request_action(lv, NULL, "Delete Log?", tmp, |
293 purple_request_action(lv, NULL, "Delete Log?", tmp, |
| 294 0, data2, 2, _("Delete"), delete_log_cb, _("Cancel"), delete_log_cleanup_cb); |
294 0, data2, 2, _("Delete"), delete_log_cb, _("Cancel"), delete_log_cleanup_cb); |
| 295 g_free(tmp); |
295 g_free(tmp); |
| 296 } |
296 } |
| 297 |
297 |
| 298 static void log_show_popup_menu(GtkWidget *treeview, GdkEventButton *event, gpointer *data) |
298 static void log_show_popup_menu(GtkWidget *treeview, GdkEventButton *event, gpointer *data) |
| 299 { |
299 { |
| 300 GtkWidget *menu = gtk_menu_new(); |
300 GtkWidget *menu = gtk_menu_new(); |
| 301 GtkWidget *menuitem = gtk_menu_item_new_with_label("Delete Log..."); |
301 GtkWidget *menuitem = gtk_menu_item_new_with_label("Delete Log..."); |
| 302 |
302 |
| 303 if (!gaim_log_is_deletable((GaimLog *)data[1])) |
303 if (!purple_log_is_deletable((PurpleLog *)data[1])) |
| 304 gtk_widget_set_sensitive(menuitem, FALSE); |
304 gtk_widget_set_sensitive(menuitem, FALSE); |
| 305 |
305 |
| 306 g_signal_connect(menuitem, "activate", G_CALLBACK(log_delete_log_cb), data); |
306 g_signal_connect(menuitem, "activate", G_CALLBACK(log_delete_log_cb), data); |
| 307 g_object_set_data_full(G_OBJECT(menuitem), "log-viewer-data", data, g_free); |
307 g_object_set_data_full(G_OBJECT(menuitem), "log-viewer-data", data, g_free); |
| 308 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
308 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
| 318 if (event->type == GDK_BUTTON_PRESS && event->button == 3) |
318 if (event->type == GDK_BUTTON_PRESS && event->button == 3) |
| 319 { |
319 { |
| 320 GtkTreePath *path; |
320 GtkTreePath *path; |
| 321 GtkTreeIter *iter; |
321 GtkTreeIter *iter; |
| 322 GValue val; |
322 GValue val; |
| 323 GaimLog *log; |
323 PurpleLog *log; |
| 324 gpointer *data; |
324 gpointer *data; |
| 325 |
325 |
| 326 if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(treeview), event->x, event->y, &path, NULL, NULL, NULL)) |
326 if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(treeview), event->x, event->y, &path, NULL, NULL, NULL)) |
| 327 return FALSE; |
327 return FALSE; |
| 328 iter = g_new(GtkTreeIter, 1); |
328 iter = g_new(GtkTreeIter, 1); |
| 354 static gboolean log_popup_menu_cb(GtkWidget *treeview, PidginLogViewer *lv) |
354 static gboolean log_popup_menu_cb(GtkWidget *treeview, PidginLogViewer *lv) |
| 355 { |
355 { |
| 356 GtkTreeSelection *sel; |
356 GtkTreeSelection *sel; |
| 357 GtkTreeIter *iter; |
357 GtkTreeIter *iter; |
| 358 GValue val; |
358 GValue val; |
| 359 GaimLog *log; |
359 PurpleLog *log; |
| 360 gpointer *data; |
360 gpointer *data; |
| 361 |
361 |
| 362 iter = g_new(GtkTreeIter, 1); |
362 iter = g_new(GtkTreeIter, 1); |
| 363 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(lv)); |
363 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(lv)); |
| 364 if (!gtk_tree_selection_get_selected(sel, NULL, iter)) |
364 if (!gtk_tree_selection_get_selected(sel, NULL, iter)) |
| 411 if (log == NULL) |
411 if (log == NULL) |
| 412 return; |
412 return; |
| 413 |
413 |
| 414 pidgin_set_cursor(viewer->window, GDK_WATCH); |
414 pidgin_set_cursor(viewer->window, GDK_WATCH); |
| 415 |
415 |
| 416 if (log->type != GAIM_LOG_SYSTEM) { |
416 if (log->type != PURPLE_LOG_SYSTEM) { |
| 417 char *title; |
417 char *title; |
| 418 if (log->type == GAIM_LOG_CHAT) |
418 if (log->type == PURPLE_LOG_CHAT) |
| 419 title = g_strdup_printf(_("<span size='larger' weight='bold'>Conversation in %s on %s</span>"), |
419 title = g_strdup_printf(_("<span size='larger' weight='bold'>Conversation in %s on %s</span>"), |
| 420 log->name, log_get_date(log)); |
420 log->name, log_get_date(log)); |
| 421 else |
421 else |
| 422 title = g_strdup_printf(_("<span size='larger' weight='bold'>Conversation with %s on %s</span>"), |
422 title = g_strdup_printf(_("<span size='larger' weight='bold'>Conversation with %s on %s</span>"), |
| 423 log->name, log_get_date(log)); |
423 log->name, log_get_date(log)); |
| 424 |
424 |
| 425 gtk_label_set_markup(GTK_LABEL(viewer->label), title); |
425 gtk_label_set_markup(GTK_LABEL(viewer->label), title); |
| 426 g_free(title); |
426 g_free(title); |
| 427 } |
427 } |
| 428 |
428 |
| 429 read = gaim_log_read(log, &flags); |
429 read = purple_log_read(log, &flags); |
| 430 viewer->flags = flags; |
430 viewer->flags = flags; |
| 431 |
431 |
| 432 gtk_imhtml_clear(GTK_IMHTML(viewer->imhtml)); |
432 gtk_imhtml_clear(GTK_IMHTML(viewer->imhtml)); |
| 433 gtk_imhtml_set_protocol_name(GTK_IMHTML(viewer->imhtml), |
433 gtk_imhtml_set_protocol_name(GTK_IMHTML(viewer->imhtml), |
| 434 gaim_account_get_protocol_name(log->account)); |
434 purple_account_get_protocol_name(log->account)); |
| 435 |
435 |
| 436 gaim_signal_emit(pidgin_log_get_handle(), "log-displaying", viewer, log); |
436 purple_signal_emit(pidgin_log_get_handle(), "log-displaying", viewer, log); |
| 437 |
437 |
| 438 gtk_imhtml_append_text(GTK_IMHTML(viewer->imhtml), read, |
438 gtk_imhtml_append_text(GTK_IMHTML(viewer->imhtml), read, |
| 439 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_TITLE | GTK_IMHTML_NO_SCROLL | |
439 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_TITLE | GTK_IMHTML_NO_SCROLL | |
| 440 ((flags & GAIM_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0)); |
440 ((flags & PURPLE_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0)); |
| 441 g_free(read); |
441 g_free(read); |
| 442 |
442 |
| 443 if (viewer->search != NULL) { |
443 if (viewer->search != NULL) { |
| 444 gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml)); |
444 gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml)); |
| 445 g_idle_add(search_find_cb, viewer); |
445 g_idle_add(search_find_cb, viewer); |
| 462 char prev_top_month[30] = ""; |
462 char prev_top_month[30] = ""; |
| 463 GtkTreeIter toplevel, child; |
463 GtkTreeIter toplevel, child; |
| 464 GList *logs = lv->logs; |
464 GList *logs = lv->logs; |
| 465 |
465 |
| 466 while (logs != NULL) { |
466 while (logs != NULL) { |
| 467 GaimLog *log = logs->data; |
467 PurpleLog *log = logs->data; |
| 468 |
468 |
| 469 month = gaim_utf8_strftime(_("%B %Y"), |
469 month = purple_utf8_strftime(_("%B %Y"), |
| 470 log->tm ? log->tm : localtime(&log->time)); |
470 log->tm ? log->tm : localtime(&log->time)); |
| 471 |
471 |
| 472 if (strcmp(month, prev_top_month) != 0) |
472 if (strcmp(month, prev_top_month) != 0) |
| 473 { |
473 { |
| 474 /* top level */ |
474 /* top level */ |
| 510 { |
510 { |
| 511 /* No logs were found. */ |
511 /* No logs were found. */ |
| 512 const char *log_preferences = NULL; |
512 const char *log_preferences = NULL; |
| 513 |
513 |
| 514 if (ht == NULL) { |
514 if (ht == NULL) { |
| 515 if (!gaim_prefs_get_bool("/core/logging/log_system")) |
515 if (!purple_prefs_get_bool("/core/logging/log_system")) |
| 516 log_preferences = _("System events will only be logged if the \"Log all status changes to system log\" preference is enabled."); |
516 log_preferences = _("System events will only be logged if the \"Log all status changes to system log\" preference is enabled."); |
| 517 } else { |
517 } else { |
| 518 if (ht->type == GAIM_LOG_IM) { |
518 if (ht->type == PURPLE_LOG_IM) { |
| 519 if (!gaim_prefs_get_bool("/core/logging/log_ims")) |
519 if (!purple_prefs_get_bool("/core/logging/log_ims")) |
| 520 log_preferences = _("Instant messages will only be logged if the \"Log all instant messages\" preference is enabled."); |
520 log_preferences = _("Instant messages will only be logged if the \"Log all instant messages\" preference is enabled."); |
| 521 } else if (ht->type == GAIM_LOG_CHAT) { |
521 } else if (ht->type == PURPLE_LOG_CHAT) { |
| 522 if (!gaim_prefs_get_bool("/core/logging/log_chats")) |
522 if (!purple_prefs_get_bool("/core/logging/log_chats")) |
| 523 log_preferences = _("Chats will only be logged if the \"Log all chats\" preference is enabled."); |
523 log_preferences = _("Chats will only be logged if the \"Log all chats\" preference is enabled."); |
| 524 } |
524 } |
| 525 } |
525 } |
| 526 |
526 |
| 527 gaim_notify_info(NULL, title, _("No logs were found"), log_preferences); |
527 purple_notify_info(NULL, title, _("No logs were found"), log_preferences); |
| 528 return NULL; |
528 return NULL; |
| 529 } |
529 } |
| 530 |
530 |
| 531 lv = g_new0(PidginLogViewer, 1); |
531 lv = g_new0(PidginLogViewer, 1); |
| 532 lv->logs = logs; |
532 lv->logs = logs; |
| 600 g_signal_connect(lv->treeview, "button-press-event", G_CALLBACK(log_button_press_cb), lv); |
600 g_signal_connect(lv->treeview, "button-press-event", G_CALLBACK(log_button_press_cb), lv); |
| 601 g_signal_connect(lv->treeview, "popup-menu", G_CALLBACK(log_popup_menu_cb), lv); |
601 g_signal_connect(lv->treeview, "popup-menu", G_CALLBACK(log_popup_menu_cb), lv); |
| 602 |
602 |
| 603 /* Log size ************/ |
603 /* Log size ************/ |
| 604 if(log_size) { |
604 if(log_size) { |
| 605 char *sz_txt = gaim_str_size_to_units(log_size); |
605 char *sz_txt = purple_str_size_to_units(log_size); |
| 606 text = g_strdup_printf("<span weight='bold'>%s</span> %s", _("Total log size:"), sz_txt); |
606 text = g_strdup_printf("<span weight='bold'>%s</span> %s", _("Total log size:"), sz_txt); |
| 607 size_label = gtk_label_new(NULL); |
607 size_label = gtk_label_new(NULL); |
| 608 gtk_label_set_markup(GTK_LABEL(size_label), text); |
608 gtk_label_set_markup(GTK_LABEL(size_label), text); |
| 609 /* gtk_paned_add1(GTK_PANED(pane), size_label); */ |
609 /* gtk_paned_add1(GTK_PANED(pane), size_label); */ |
| 610 gtk_misc_set_alignment(GTK_MISC(size_label), 0, 0); |
610 gtk_misc_set_alignment(GTK_MISC(size_label), 0, 0); |
| 663 g_free(ht->screenname); |
663 g_free(ht->screenname); |
| 664 g_free(ht); |
664 g_free(ht); |
| 665 return; |
665 return; |
| 666 } |
666 } |
| 667 |
667 |
| 668 if (type == GAIM_LOG_CHAT) { |
668 if (type == PURPLE_LOG_CHAT) { |
| 669 GaimChat *chat; |
669 PurpleChat *chat; |
| 670 |
670 |
| 671 chat = gaim_blist_find_chat(account, screenname); |
671 chat = purple_blist_find_chat(account, screenname); |
| 672 if (chat != NULL) |
672 if (chat != NULL) |
| 673 name = gaim_chat_get_name(chat); |
673 name = purple_chat_get_name(chat); |
| 674 |
674 |
| 675 title = g_strdup_printf(_("Conversations in %s"), name); |
675 title = g_strdup_printf(_("Conversations in %s"), name); |
| 676 } else { |
676 } else { |
| 677 GaimBuddy *buddy; |
677 PurpleBuddy *buddy; |
| 678 |
678 |
| 679 buddy = gaim_find_buddy(account, screenname); |
679 buddy = purple_find_buddy(account, screenname); |
| 680 if (buddy != NULL) |
680 if (buddy != NULL) |
| 681 name = gaim_buddy_get_contact_alias(buddy); |
681 name = purple_buddy_get_contact_alias(buddy); |
| 682 |
682 |
| 683 title = g_strdup_printf(_("Conversations with %s"), name); |
683 title = g_strdup_printf(_("Conversations with %s"), name); |
| 684 } |
684 } |
| 685 |
685 |
| 686 display_log_viewer(ht, gaim_log_get_logs(type, screenname, account), |
686 display_log_viewer(ht, purple_log_get_logs(type, screenname, account), |
| 687 title, gtk_image_new_from_pixbuf(pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_MEDIUM)), |
687 title, gtk_image_new_from_pixbuf(pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_MEDIUM)), |
| 688 gaim_log_get_total_size(type, screenname, account)); |
688 purple_log_get_total_size(type, screenname, account)); |
| 689 g_free(title); |
689 g_free(title); |
| 690 } |
690 } |
| 691 |
691 |
| 692 void pidgin_log_show_contact(GaimContact *contact) { |
692 void pidgin_log_show_contact(PurpleContact *contact) { |
| 693 struct log_viewer_hash_t *ht = g_new0(struct log_viewer_hash_t, 1); |
693 struct log_viewer_hash_t *ht = g_new0(struct log_viewer_hash_t, 1); |
| 694 GaimBlistNode *child; |
694 PurpleBlistNode *child; |
| 695 PidginLogViewer *lv = NULL; |
695 PidginLogViewer *lv = NULL; |
| 696 GList *logs = NULL; |
696 GList *logs = NULL; |
| 697 GdkPixbuf *pixbuf; |
697 GdkPixbuf *pixbuf; |
| 698 GtkWidget *image = gtk_image_new(); |
698 GtkWidget *image = gtk_image_new(); |
| 699 const char *name = NULL; |
699 const char *name = NULL; |
| 700 char *title; |
700 char *title; |
| 701 int total_log_size = 0; |
701 int total_log_size = 0; |
| 702 |
702 |
| 703 g_return_if_fail(contact != NULL); |
703 g_return_if_fail(contact != NULL); |
| 704 |
704 |
| 705 ht->type = GAIM_LOG_IM; |
705 ht->type = PURPLE_LOG_IM; |
| 706 ht->contact = contact; |
706 ht->contact = contact; |
| 707 |
707 |
| 708 if (log_viewers == NULL) { |
708 if (log_viewers == NULL) { |
| 709 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); |
709 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); |
| 710 } else if ((lv = g_hash_table_lookup(log_viewers, ht))) { |
710 } else if ((lv = g_hash_table_lookup(log_viewers, ht))) { |
| 712 g_free(ht); |
712 g_free(ht); |
| 713 return; |
713 return; |
| 714 } |
714 } |
| 715 |
715 |
| 716 for (child = contact->node.child ; child ; child = child->next) { |
716 for (child = contact->node.child ; child ; child = child->next) { |
| 717 if (!GAIM_BLIST_NODE_IS_BUDDY(child)) |
717 if (!PURPLE_BLIST_NODE_IS_BUDDY(child)) |
| 718 continue; |
718 continue; |
| 719 |
719 |
| 720 logs = g_list_concat(gaim_log_get_logs(GAIM_LOG_IM, ((GaimBuddy *)child)->name, |
720 logs = g_list_concat(purple_log_get_logs(PURPLE_LOG_IM, ((PurpleBuddy *)child)->name, |
| 721 ((GaimBuddy *)child)->account), logs); |
721 ((PurpleBuddy *)child)->account), logs); |
| 722 total_log_size += gaim_log_get_total_size(GAIM_LOG_IM, ((GaimBuddy *)child)->name, ((GaimBuddy *)child)->account); |
722 total_log_size += purple_log_get_total_size(PURPLE_LOG_IM, ((PurpleBuddy *)child)->name, ((PurpleBuddy *)child)->account); |
| 723 } |
723 } |
| 724 logs = g_list_sort(logs, gaim_log_compare); |
724 logs = g_list_sort(logs, purple_log_compare); |
| 725 |
725 |
| 726 pixbuf = gtk_widget_render_icon (image, PIDGIN_STOCK_STATUS_PERSON, |
726 pixbuf = gtk_widget_render_icon (image, PIDGIN_STOCK_STATUS_PERSON, |
| 727 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_SMALL), "GtkWindow"); |
727 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_SMALL), "GtkWindow"); |
| 728 gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf); |
728 gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf); |
| 729 |
729 |
| 730 if (contact->alias != NULL) |
730 if (contact->alias != NULL) |
| 731 name = contact->alias; |
731 name = contact->alias; |
| 732 else if (contact->priority != NULL) |
732 else if (contact->priority != NULL) |
| 733 name = gaim_buddy_get_contact_alias(contact->priority); |
733 name = purple_buddy_get_contact_alias(contact->priority); |
| 734 |
734 |
| 735 title = g_strdup_printf(_("Conversations with %s"), name); |
735 title = g_strdup_printf(_("Conversations with %s"), name); |
| 736 display_log_viewer(ht, logs, title, image, total_log_size); |
736 display_log_viewer(ht, logs, title, image, total_log_size); |
| 737 g_free(title); |
737 g_free(title); |
| 738 } |
738 } |
| 745 if (syslog_viewer != NULL) { |
745 if (syslog_viewer != NULL) { |
| 746 gtk_window_present(GTK_WINDOW(syslog_viewer->window)); |
746 gtk_window_present(GTK_WINDOW(syslog_viewer->window)); |
| 747 return; |
747 return; |
| 748 } |
748 } |
| 749 |
749 |
| 750 for(accounts = gaim_accounts_get_all(); accounts != NULL; accounts = accounts->next) { |
750 for(accounts = purple_accounts_get_all(); accounts != NULL; accounts = accounts->next) { |
| 751 |
751 |
| 752 GaimAccount *account = (GaimAccount *)accounts->data; |
752 PurpleAccount *account = (PurpleAccount *)accounts->data; |
| 753 if(gaim_find_prpl(gaim_account_get_protocol_id(account)) == NULL) |
753 if(purple_find_prpl(purple_account_get_protocol_id(account)) == NULL) |
| 754 continue; |
754 continue; |
| 755 |
755 |
| 756 logs = g_list_concat(gaim_log_get_system_logs(account), logs); |
756 logs = g_list_concat(purple_log_get_system_logs(account), logs); |
| 757 } |
757 } |
| 758 logs = g_list_sort(logs, gaim_log_compare); |
758 logs = g_list_sort(logs, purple_log_compare); |
| 759 |
759 |
| 760 syslog_viewer = display_log_viewer(NULL, logs, _("System Log"), NULL, 0); |
760 syslog_viewer = display_log_viewer(NULL, logs, _("System Log"), NULL, 0); |
| 761 } |
761 } |
| 762 |
762 |
| 763 /**************************************************************************** |
763 /**************************************************************************** |
| 774 |
774 |
| 775 void pidgin_log_init(void) |
775 void pidgin_log_init(void) |
| 776 { |
776 { |
| 777 void *handle = pidgin_log_get_handle(); |
777 void *handle = pidgin_log_get_handle(); |
| 778 |
778 |
| 779 gaim_signal_register(handle, "log-displaying", |
779 purple_signal_register(handle, "log-displaying", |
| 780 gaim_marshal_VOID__POINTER_POINTER, |
780 purple_marshal_VOID__POINTER_POINTER, |
| 781 NULL, 2, |
781 NULL, 2, |
| 782 gaim_value_new(GAIM_TYPE_BOXED, |
782 purple_value_new(PURPLE_TYPE_BOXED, |
| 783 "PidginLogViewer *"), |
783 "PidginLogViewer *"), |
| 784 gaim_value_new(GAIM_TYPE_SUBTYPE, |
784 purple_value_new(PURPLE_TYPE_SUBTYPE, |
| 785 GAIM_SUBTYPE_LOG)); |
785 PURPLE_SUBTYPE_LOG)); |
| 786 } |
786 } |
| 787 |
787 |
| 788 void |
788 void |
| 789 pidgin_log_uninit(void) |
789 pidgin_log_uninit(void) |
| 790 { |
790 { |
| 791 gaim_signals_unregister_by_instance(pidgin_log_get_handle()); |
791 purple_signals_unregister_by_instance(pidgin_log_get_handle()); |
| 792 } |
792 } |