pidgin/gtklog.c

changeset 26378
e85d894af8a5
parent 25889
26d9ca30335c
child 29045
bbafcef9ffbb
child 29500
1e0464dad92b
child 32439
2c681e5daeeb
equal deleted inserted replaced
26377:9124a345ed3a 26378:e85d894af8a5
43 static void populate_log_tree(PidginLogViewer *lv); 43 static void populate_log_tree(PidginLogViewer *lv);
44 static PidginLogViewer *syslog_viewer = NULL; 44 static PidginLogViewer *syslog_viewer = NULL;
45 45
46 struct log_viewer_hash_t { 46 struct log_viewer_hash_t {
47 PurpleLogType type; 47 PurpleLogType type;
48 char *screenname; 48 char *buddyname;
49 PurpleAccount *account; 49 PurpleAccount *account;
50 PurpleContact *contact; 50 PurpleContact *contact;
51 }; 51 };
52 52
53 static guint log_viewer_hash(gconstpointer data) 53 static guint log_viewer_hash(gconstpointer data)
55 const struct log_viewer_hash_t *viewer = data; 55 const struct log_viewer_hash_t *viewer = data;
56 56
57 if (viewer->contact != NULL) 57 if (viewer->contact != NULL)
58 return g_direct_hash(viewer->contact); 58 return g_direct_hash(viewer->contact);
59 59
60 return g_str_hash(viewer->screenname) + 60 return g_str_hash(viewer->buddyname) +
61 g_str_hash(purple_account_get_username(viewer->account)); 61 g_str_hash(purple_account_get_username(viewer->account));
62 } 62 }
63 63
64 static gboolean log_viewer_equal(gconstpointer y, gconstpointer z) 64 static gboolean log_viewer_equal(gconstpointer y, gconstpointer z)
65 { 65 {
78 } else { 78 } else {
79 if (b->contact != NULL) 79 if (b->contact != NULL)
80 return FALSE; 80 return FALSE;
81 } 81 }
82 82
83 normal = g_strdup(purple_normalize(a->account, a->screenname)); 83 normal = g_strdup(purple_normalize(a->account, a->buddyname));
84 ret = (a->account == b->account) && 84 ret = (a->account == b->account) &&
85 !strcmp(normal, purple_normalize(b->account, b->screenname)); 85 !strcmp(normal, purple_normalize(b->account, b->buddyname));
86 g_free(normal); 86 g_free(normal);
87 87
88 return ret; 88 return ret;
89 } 89 }
90 90
207 207
208 if (ht != NULL) { 208 if (ht != NULL) {
209 lv = g_hash_table_lookup(log_viewers, ht); 209 lv = g_hash_table_lookup(log_viewers, ht);
210 g_hash_table_remove(log_viewers, ht); 210 g_hash_table_remove(log_viewers, ht);
211 211
212 g_free(ht->screenname); 212 g_free(ht->buddyname);
213 g_free(ht); 213 g_free(ht);
214 } else 214 } else
215 syslog_viewer = NULL; 215 syslog_viewer = NULL;
216 216
217 purple_request_close_with_handle(lv); 217 purple_request_close_with_handle(lv);
554 log_preferences = _("Instant messages will only be logged if the \"Log all instant messages\" preference is enabled."); 554 log_preferences = _("Instant messages will only be logged if the \"Log all instant messages\" preference is enabled.");
555 } else if (ht->type == PURPLE_LOG_CHAT) { 555 } else if (ht->type == PURPLE_LOG_CHAT) {
556 if (!purple_prefs_get_bool("/purple/logging/log_chats")) 556 if (!purple_prefs_get_bool("/purple/logging/log_chats"))
557 log_preferences = _("Chats will only be logged if the \"Log all chats\" preference is enabled."); 557 log_preferences = _("Chats will only be logged if the \"Log all chats\" preference is enabled.");
558 } 558 }
559 g_free(ht->screenname); 559 g_free(ht->buddyname);
560 g_free(ht); 560 g_free(ht);
561 } 561 }
562 562
563 if(icon != NULL) 563 if(icon != NULL)
564 gtk_widget_destroy(icon); 564 gtk_widget_destroy(icon);
679 gtk_widget_show_all(lv->window); 679 gtk_widget_show_all(lv->window);
680 680
681 return lv; 681 return lv;
682 } 682 }
683 683
684 void pidgin_log_show(PurpleLogType type, const char *screenname, PurpleAccount *account) { 684 void pidgin_log_show(PurpleLogType type, const char *buddyname, PurpleAccount *account) {
685 struct log_viewer_hash_t *ht; 685 struct log_viewer_hash_t *ht;
686 PidginLogViewer *lv = NULL; 686 PidginLogViewer *lv = NULL;
687 const char *name = screenname; 687 const char *name = buddyname;
688 char *title; 688 char *title;
689 GdkPixbuf *prpl_icon; 689 GdkPixbuf *prpl_icon;
690 690
691 g_return_if_fail(account != NULL); 691 g_return_if_fail(account != NULL);
692 g_return_if_fail(screenname != NULL); 692 g_return_if_fail(buddyname != NULL);
693 693
694 ht = g_new0(struct log_viewer_hash_t, 1); 694 ht = g_new0(struct log_viewer_hash_t, 1);
695 695
696 ht->type = type; 696 ht->type = type;
697 ht->screenname = g_strdup(screenname); 697 ht->buddyname = g_strdup(buddyname);
698 ht->account = account; 698 ht->account = account;
699 699
700 if (log_viewers == NULL) { 700 if (log_viewers == NULL) {
701 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); 701 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal);
702 } else if ((lv = g_hash_table_lookup(log_viewers, ht))) { 702 } else if ((lv = g_hash_table_lookup(log_viewers, ht))) {
703 gtk_window_present(GTK_WINDOW(lv->window)); 703 gtk_window_present(GTK_WINDOW(lv->window));
704 g_free(ht->screenname); 704 g_free(ht->buddyname);
705 g_free(ht); 705 g_free(ht);
706 return; 706 return;
707 } 707 }
708 708
709 if (type == PURPLE_LOG_CHAT) { 709 if (type == PURPLE_LOG_CHAT) {
710 PurpleChat *chat; 710 PurpleChat *chat;
711 711
712 chat = purple_blist_find_chat(account, screenname); 712 chat = purple_blist_find_chat(account, buddyname);
713 if (chat != NULL) 713 if (chat != NULL)
714 name = purple_chat_get_name(chat); 714 name = purple_chat_get_name(chat);
715 715
716 title = g_strdup_printf(_("Conversations in %s"), name); 716 title = g_strdup_printf(_("Conversations in %s"), name);
717 } else { 717 } else {
718 PurpleBuddy *buddy; 718 PurpleBuddy *buddy;
719 719
720 buddy = purple_find_buddy(account, screenname); 720 buddy = purple_find_buddy(account, buddyname);
721 if (buddy != NULL) 721 if (buddy != NULL)
722 name = purple_buddy_get_contact_alias(buddy); 722 name = purple_buddy_get_contact_alias(buddy);
723 723
724 title = g_strdup_printf(_("Conversations with %s"), name); 724 title = g_strdup_printf(_("Conversations with %s"), name);
725 } 725 }
726 726
727 prpl_icon = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_MEDIUM); 727 prpl_icon = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_MEDIUM);
728 728
729 display_log_viewer(ht, purple_log_get_logs(type, screenname, account), 729 display_log_viewer(ht, purple_log_get_logs(type, buddyname, account),
730 title, gtk_image_new_from_pixbuf(prpl_icon), 730 title, gtk_image_new_from_pixbuf(prpl_icon),
731 purple_log_get_total_size(type, screenname, account)); 731 purple_log_get_total_size(type, buddyname, account));
732 732
733 if (prpl_icon) 733 if (prpl_icon)
734 g_object_unref(prpl_icon); 734 g_object_unref(prpl_icon);
735 g_free(title); 735 g_free(title);
736 } 736 }
758 gtk_window_present(GTK_WINDOW(lv->window)); 758 gtk_window_present(GTK_WINDOW(lv->window));
759 g_free(ht); 759 g_free(ht);
760 return; 760 return;
761 } 761 }
762 762
763 for (child = contact->node.child ; child ; child = child->next) { 763 for (child = purple_blist_node_get_first_child((PurpleBlistNode*)contact) ;
764 child != NULL ;
765 child = purple_blist_node_get_sibling_next(child)) {
766 const char *buddy_name;
767 PurpleAccount *account;
768
764 if (!PURPLE_BLIST_NODE_IS_BUDDY(child)) 769 if (!PURPLE_BLIST_NODE_IS_BUDDY(child))
765 continue; 770 continue;
766 771
767 logs = g_list_concat(purple_log_get_logs(PURPLE_LOG_IM, ((PurpleBuddy *)child)->name, 772 buddy_name = purple_buddy_get_name((PurpleBuddy *)child);
768 ((PurpleBuddy *)child)->account), logs); 773 account = purple_buddy_get_account((PurpleBuddy *)child);
769 total_log_size += purple_log_get_total_size(PURPLE_LOG_IM, ((PurpleBuddy *)child)->name, ((PurpleBuddy *)child)->account); 774 logs = g_list_concat(purple_log_get_logs(PURPLE_LOG_IM, buddy_name, account), logs);
775 total_log_size += purple_log_get_total_size(PURPLE_LOG_IM, buddy_name, account);
770 } 776 }
771 logs = g_list_sort(logs, purple_log_compare); 777 logs = g_list_sort(logs, purple_log_compare);
772 778
773 image = gtk_image_new(); 779 image = gtk_image_new();
774 pixbuf = gtk_widget_render_icon(image, PIDGIN_STOCK_STATUS_PERSON, 780 pixbuf = gtk_widget_render_icon(image, PIDGIN_STOCK_STATUS_PERSON,

mercurial