comparison finch/gntlog.c @ 23290:5f9793c8510a

Added "View All Logs" menu in the buddylist to display a list of all IM logs.
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Thu, 05 Jun 2008 10:23:58 +0000
parents adde385c7904
children 53c27ca1bb71 3da0957e7821
comparison
equal deleted inserted replaced
23289:173c612752ea 23290:5f9793c8510a
59 const struct log_viewer_hash_t *viewer = data; 59 const struct log_viewer_hash_t *viewer = data;
60 60
61 if (viewer->contact != NULL) 61 if (viewer->contact != NULL)
62 return g_direct_hash(viewer->contact); 62 return g_direct_hash(viewer->contact);
63 63
64 return g_str_hash(viewer->screenname) + 64 if (viewer->account) {
65 g_str_hash(purple_account_get_username(viewer->account)); 65 return g_str_hash(viewer->screenname) +
66 g_str_hash(purple_account_get_username(viewer->account));
67 }
68
69 return (guint)viewer;
66 } 70 }
67 71
68 static gboolean log_viewer_equal(gconstpointer y, gconstpointer z) 72 static gboolean log_viewer_equal(gconstpointer y, gconstpointer z)
69 { 73 {
70 const struct log_viewer_hash_t *a, *b; 74 const struct log_viewer_hash_t *a, *b;
82 } else { 86 } else {
83 if (b->contact != NULL) 87 if (b->contact != NULL)
84 return FALSE; 88 return FALSE;
85 } 89 }
86 90
87 normal = g_strdup(purple_normalize(a->account, a->screenname)); 91 if (a->screenname && b->screenname) {
88 ret = (a->account == b->account) && 92 normal = g_strdup(purple_normalize(a->account, a->screenname));
89 !strcmp(normal, purple_normalize(b->account, b->screenname)); 93 ret = (a->account == b->account) &&
90 g_free(normal); 94 !strcmp(normal, purple_normalize(b->account, b->screenname));
95 g_free(normal);
96 } else {
97 ret = (a == b);
98 }
91 99
92 return ret; 100 return ret;
93 } 101 }
94 102
95 static const char *log_get_date(PurpleLog *log) 103 static const char *log_get_date(PurpleLog *log)
346 gnt_widget_show(lv->window); 354 gnt_widget_show(lv->window);
347 355
348 return lv; 356 return lv;
349 } 357 }
350 358
351 void finch_log_show(PurpleLogType type, const char *screenname, PurpleAccount *account) { 359 static void
360 our_logging_blows(PurpleLogSet *set, PurpleLogSet *setagain, GList **list)
361 {
362 /* The iteration happens on the first list. So we use the shorter list in front */
363 if (set->type != PURPLE_LOG_IM)
364 return;
365 *list = g_list_concat(purple_log_get_logs(PURPLE_LOG_IM, set->name, set->account), *list);
366 }
367
368 void finch_log_show(PurpleLogType type, const char *screenname, PurpleAccount *account)
369 {
352 struct log_viewer_hash_t *ht; 370 struct log_viewer_hash_t *ht;
353 FinchLogViewer *lv = NULL; 371 FinchLogViewer *lv = NULL;
354 const char *name = screenname; 372 const char *name = screenname;
355 char *title; 373 char *title;
356 374 GList *logs = NULL;
357 g_return_if_fail(account != NULL); 375 int size = 0;
358 g_return_if_fail(screenname != NULL); 376
377 if (type != PURPLE_LOG_IM) {
378 g_return_if_fail(account != NULL);
379 g_return_if_fail(screenname != NULL);
380 }
359 381
360 ht = g_new0(struct log_viewer_hash_t, 1); 382 ht = g_new0(struct log_viewer_hash_t, 1);
361 383
362 ht->type = type; 384 ht->type = type;
363 ht->screenname = g_strdup(screenname); 385 ht->screenname = g_strdup(screenname);
381 403
382 title = g_strdup_printf(_("Conversations in %s"), name); 404 title = g_strdup_printf(_("Conversations in %s"), name);
383 } else { 405 } else {
384 PurpleBuddy *buddy; 406 PurpleBuddy *buddy;
385 407
386 buddy = purple_find_buddy(account, screenname); 408 if (screenname) {
387 if (buddy != NULL) 409 buddy = purple_find_buddy(account, screenname);
388 name = purple_buddy_get_contact_alias(buddy); 410 if (buddy != NULL)
389 411 name = purple_buddy_get_contact_alias(buddy);
390 title = g_strdup_printf(_("Conversations with %s"), name); 412 title = g_strdup_printf(_("Conversations with %s"), name);
391 } 413 } else {
392 414 title = g_strdup(_("All Conversations"));
393 display_log_viewer(ht, purple_log_get_logs(type, screenname, account), 415 }
394 title, purple_log_get_total_size(type, screenname, account)); 416 }
417
418 if (screenname) {
419 logs = purple_log_get_logs(type, screenname, account);
420 size = purple_log_get_total_size(type, screenname, account);
421 } else {
422 /* This will happen only for IMs */
423 GHashTable *table = purple_log_get_log_sets();
424 g_hash_table_foreach(table, (GHFunc)our_logging_blows, &logs);
425 g_hash_table_destroy(table);
426 logs = g_list_sort(logs, purple_log_compare);
427 size = 0;
428 }
429
430 display_log_viewer(ht, logs, title, size);
395 431
396 g_free(title); 432 g_free(title);
397 } 433 }
398 434
399 void finch_log_show_contact(PurpleContact *contact) { 435 void finch_log_show_contact(PurpleContact *contact)
436 {
400 struct log_viewer_hash_t *ht; 437 struct log_viewer_hash_t *ht;
401 PurpleBlistNode *child; 438 PurpleBlistNode *child;
402 FinchLogViewer *lv = NULL; 439 FinchLogViewer *lv = NULL;
403 GList *logs = NULL; 440 GList *logs = NULL;
404 const char *name = NULL; 441 const char *name = NULL;