void pidgin_log_show(PurpleLogType type, const char *screenname, PurpleAccount *account) { struct log_viewer_hash_t *ht; PidginLogViewer *lv = NULL; const char *name = screenname; char *title; GdkPixbuf *prpl_icon; g_return_if_fail(account != NULL); g_return_if_fail(screenname != NULL); ht = g_new0(struct log_viewer_hash_t, 1); ht->type = type; ht->screenname = g_strdup(screenname); ht->account = account; if (log_viewers == NULL) { log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); } else if ((lv = g_hash_table_lookup(log_viewers, ht))) { gtk_window_present(GTK_WINDOW(lv->window)); g_free(ht->screenname); g_free(ht); return; } if (type == PURPLE_LOG_CHAT) { PurpleChat *chat; chat = purple_blist_find_chat(account, screenname); if (chat != NULL) name = purple_chat_get_name(chat); title = g_strdup_printf(_("Conversations in %s"), name); } else { PurpleBuddy *buddy; buddy = purple_find_buddy(account, screenname); if (buddy != NULL) name = purple_buddy_get_contact_alias(buddy); title = g_strdup_printf(_("Conversations with %s"), name); } prpl_icon = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_MEDIUM); display_log_viewer(ht, purple_log_get_logs(type, screenname, account), title, gtk_image_new_from_pixbuf(prpl_icon), purple_log_get_total_size(type, screenname, account)); if (prpl_icon) g_object_unref(prpl_icon); g_free(title); }
static gint compare_logsize(PurpleBlistNode *node1, PurpleBlistNode *node2) { PurpleBlistNode *child; int logsize1=0, logsize2=0; if(PURPLE_BLIST_NODE_IS_CONTACT(node1)) { for (child = node1->child; child; child = child->next) { if(PURPLE_BLIST_NODE_IS_BUDDY(child)) { logsize1 += purple_log_get_total_size( PURPLE_LOG_IM, ((PurpleBuddy*)(child))->name, ((PurpleBuddy*)(child))->account ); } } } if(PURPLE_BLIST_NODE_IS_BUDDY(node1)) { logsize1 = purple_log_get_total_size( PURPLE_LOG_IM, PURPLE_BLIST_NODE_NAME(node1), ((PurpleBuddy *)node1)->account ); } if(PURPLE_BLIST_NODE_IS_CHAT(node1)) { logsize1 = purple_log_get_total_size( PURPLE_LOG_CHAT, PURPLE_BLIST_NODE_NAME(node1), ((PurpleChat *)node1)->account ); } if(PURPLE_BLIST_NODE_IS_CONTACT(node2)) { for (child = node2->child; child; child = child->next) { if(PURPLE_BLIST_NODE_IS_BUDDY(child)) { logsize2 += purple_log_get_total_size( PURPLE_LOG_IM, ((PurpleBuddy*)(child))->name, ((PurpleBuddy*)(child))->account ); } } } if(PURPLE_BLIST_NODE_IS_BUDDY(node2)) { logsize2 = purple_log_get_total_size( PURPLE_LOG_IM, PURPLE_BLIST_NODE_NAME(node2), ((PurpleBuddy *)node2)->account ); } if(PURPLE_BLIST_NODE_IS_CHAT(node2)) { logsize2 = purple_log_get_total_size( PURPLE_LOG_CHAT, PURPLE_BLIST_NODE_NAME(node2), ((PurpleChat *)node2)->account ); } if(logsize1 > logsize2) return -1; if(logsize2 > logsize1) return 1; return 0; }
void pidgin_log_show_contact(PurpleContact *contact) { struct log_viewer_hash_t *ht; PurpleBlistNode *child; PidginLogViewer *lv = NULL; GList *logs = NULL; GdkPixbuf *pixbuf; GtkWidget *image; const char *name = NULL; char *title; int total_log_size = 0; g_return_if_fail(contact != NULL); ht = g_new0(struct log_viewer_hash_t, 1); ht->type = PURPLE_LOG_IM; ht->contact = contact; if (log_viewers == NULL) { log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); } else if ((lv = g_hash_table_lookup(log_viewers, ht))) { gtk_window_present(GTK_WINDOW(lv->window)); g_free(ht); return; } for (child = contact->node.child ; child ; child = child->next) { if (!PURPLE_BLIST_NODE_IS_BUDDY(child)) continue; logs = g_list_concat(purple_log_get_logs(PURPLE_LOG_IM, ((PurpleBuddy *)child)->name, ((PurpleBuddy *)child)->account), logs); total_log_size += purple_log_get_total_size(PURPLE_LOG_IM, ((PurpleBuddy *)child)->name, ((PurpleBuddy *)child)->account); } logs = g_list_sort(logs, purple_log_compare); image = gtk_image_new(); pixbuf = gtk_widget_render_icon(image, PIDGIN_STOCK_STATUS_PERSON, gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_SMALL), "GtkWindow"); if (pixbuf) { gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf); g_object_unref(pixbuf); } else { gtk_widget_destroy(image); image = NULL; } if (contact->alias != NULL) name = contact->alias; else if (contact->priority != NULL) name = purple_buddy_get_contact_alias(contact->priority); /* This will happen if the contact doesn't have an alias, * and none of the contact's buddies are online. * There is probably a better way to deal with this. */ if (name == NULL) { if (contact->node.child != NULL && PURPLE_BLIST_NODE_IS_BUDDY(contact->node.child)) name = purple_buddy_get_contact_alias((PurpleBuddy *) contact->node.child); if (name == NULL) name = ""; } title = g_strdup_printf(_("Conversations with %s"), name); display_log_viewer(ht, logs, title, image, total_log_size); g_free(title); }