Mercurial > ~mikael > mcabber > hg
comparison mcabber/src/roster.c @ 1437:071c8170b7de
Add option 'statefile' to keep track of unread messages across restarts
(Suggested by micressor)
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Mon, 25 Feb 2008 20:27:56 +0100 |
parents | 486809ccffc0 |
children | c5d937d5530b |
comparison
equal
deleted
inserted
replaced
1436:6fb141142388 | 1437:071c8170b7de |
---|---|
22 #include <string.h> | 22 #include <string.h> |
23 | 23 |
24 #include "roster.h" | 24 #include "roster.h" |
25 #include "utils.h" | 25 #include "utils.h" |
26 | 26 |
27 extern void hlog_save_state(void); | |
27 | 28 |
28 char *strrole[] = { /* Should match enum in roster.h */ | 29 char *strrole[] = { /* Should match enum in roster.h */ |
29 "none", | 30 "none", |
30 "moderator", | 31 "moderator", |
31 "participant", | 32 "participant", |
116 GList *current_buddy; | 117 GList *current_buddy; |
117 GList *alternate_buddy; | 118 GList *alternate_buddy; |
118 | 119 |
119 static roster roster_special; | 120 static roster roster_special; |
120 | 121 |
121 void unread_jid_add(const char *jid); | 122 static int unread_jid_del(const char *jid); |
122 int unread_jid_del(const char *jid); | |
123 | 123 |
124 #define DFILTER_ALL 63 | 124 #define DFILTER_ALL 63 |
125 #define DFILTER_ONLINE 62 | 125 #define DFILTER_ONLINE 62 |
126 | 126 |
127 | 127 |
588 void roster_msg_setflag(const char *jid, guint special, guint value) | 588 void roster_msg_setflag(const char *jid, guint special, guint value) |
589 { | 589 { |
590 GSList *sl_user; | 590 GSList *sl_user; |
591 roster *roster_usr, *roster_grp; | 591 roster *roster_usr, *roster_grp; |
592 int new_roster_item = FALSE; | 592 int new_roster_item = FALSE; |
593 guint unread_list_modified = FALSE; | |
593 | 594 |
594 if (special) { | 595 if (special) { |
595 //sl_user = roster_find(jid, namesearch, ROSTER_TYPE_SPECIAL); | 596 //sl_user = roster_find(jid, namesearch, ROSTER_TYPE_SPECIAL); |
596 //if (!sl_user) return; | 597 //if (!sl_user) return; |
597 //roster_usr = (roster*)sl_user->data; | 598 //roster_usr = (roster*)sl_user->data; |
620 } | 621 } |
621 | 622 |
622 roster_usr = (roster*)sl_user->data; | 623 roster_usr = (roster*)sl_user->data; |
623 roster_grp = (roster*)roster_usr->list->data; | 624 roster_grp = (roster*)roster_usr->list->data; |
624 if (value) { | 625 if (value) { |
626 if (!(roster_usr->flags & ROSTER_FLAG_MSG)) | |
627 unread_list_modified = TRUE; | |
625 // Message flag is TRUE. This is easy, we just have to set both flags | 628 // Message flag is TRUE. This is easy, we just have to set both flags |
626 // to TRUE... | 629 // to TRUE... |
627 roster_usr->flags |= ROSTER_FLAG_MSG; | 630 roster_usr->flags |= ROSTER_FLAG_MSG; |
628 roster_grp->flags |= ROSTER_FLAG_MSG; // group | 631 roster_grp->flags |= ROSTER_FLAG_MSG; // group |
629 // Append the roster_usr to unread_list, but avoid duplicates | 632 // Append the roster_usr to unread_list, but avoid duplicates |
630 if (!g_slist_find(unread_list, roster_usr)) | 633 if (!g_slist_find(unread_list, roster_usr)) |
631 unread_list = g_slist_append(unread_list, roster_usr); | 634 unread_list = g_slist_append(unread_list, roster_usr); |
632 } else { | 635 } else { |
633 // Message flag is FALSE. | 636 // Message flag is FALSE. |
634 guint msg = FALSE; | 637 guint msg = FALSE; |
638 if (roster_usr->flags & ROSTER_FLAG_MSG) | |
639 unread_list_modified = TRUE; | |
635 roster_usr->flags &= ~ROSTER_FLAG_MSG; | 640 roster_usr->flags &= ~ROSTER_FLAG_MSG; |
636 if (unread_list) { | 641 if (unread_list) { |
637 GSList *node = g_slist_find(unread_list, roster_usr); | 642 GSList *node = g_slist_find(unread_list, roster_usr); |
638 if (node) unread_list = g_slist_delete_link(unread_list, node); | 643 if (node) unread_list = g_slist_delete_link(unread_list, node); |
639 } | 644 } |
658 // ROSTER_FLAG_MSG should already be set... | 663 // ROSTER_FLAG_MSG should already be set... |
659 } | 664 } |
660 | 665 |
661 if (buddylist && (new_roster_item || !g_list_find(buddylist, roster_usr))) | 666 if (buddylist && (new_roster_item || !g_list_find(buddylist, roster_usr))) |
662 buddylist_build(); | 667 buddylist_build(); |
668 | |
669 if (unread_list_modified) | |
670 hlog_save_state(); | |
663 } | 671 } |
664 | 672 |
665 const char *roster_getname(const char *jid) | 673 const char *roster_getname(const char *jid) |
666 { | 674 { |
667 GSList *sl_user; | 675 GSList *sl_user; |
1539 g_hash_table_insert(unread_jids, g_strdup(jid), unread_jids); | 1547 g_hash_table_insert(unread_jids, g_strdup(jid), unread_jids); |
1540 } | 1548 } |
1541 | 1549 |
1542 // unread_jid_del(jid) | 1550 // unread_jid_del(jid) |
1543 // Return TRUE if jid is found in the table (and remove it), FALSE if not | 1551 // Return TRUE if jid is found in the table (and remove it), FALSE if not |
1544 int unread_jid_del(const char *jid) | 1552 static int unread_jid_del(const char *jid) |
1545 { | 1553 { |
1546 if (!unread_jids) | 1554 if (!unread_jids) |
1547 return FALSE; | 1555 return FALSE; |
1548 return g_hash_table_remove(unread_jids, jid); | 1556 return g_hash_table_remove(unread_jids, jid); |
1549 } | 1557 } |
1550 | 1558 |
1559 // unread_jid_get_list() | |
1560 // Return the JID list. | |
1561 // The content of the list should not be modified or freed. | |
1562 // The caller should call g_list_free() after use. | |
1563 GList *unread_jid_get_list(void) | |
1564 { | |
1565 if (!unread_jids) | |
1566 return NULL; | |
1567 return g_hash_table_get_keys(unread_jids); | |
1568 } | |
1569 | |
1551 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ | 1570 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ |