/** * Process "presence changed" message. */ static void process_presence(fetion_account *ac, const gchar *sipmsg) { GSList *list; GSList *pos; fetion_buddy *buddy; HybridBuddy *imbuddy; list = sip_parse_presence(ac, sipmsg); for (pos = list; pos; pos = pos->next) { buddy = (fetion_buddy*)pos->data; imbuddy = hybrid_blist_find_buddy(ac->account, buddy->userid); if (buddy->localname && *(buddy->localname) != '\0') { hybrid_blist_set_buddy_name(imbuddy, buddy->localname); } hybrid_blist_set_buddy_mood(imbuddy, buddy->mood_phrase); switch (buddy->state) { case P_ONLINE: hybrid_blist_set_buddy_state(imbuddy, HYBRID_STATE_ONLINE); break; case P_OFFLINE: hybrid_blist_set_buddy_state(imbuddy, HYBRID_STATE_OFFLINE); break; case P_INVISIBLE: hybrid_blist_set_buddy_state(imbuddy, HYBRID_STATE_OFFLINE); break; case P_AWAY: hybrid_blist_set_buddy_state(imbuddy, HYBRID_STATE_AWAY); break; case P_BUSY: hybrid_blist_set_buddy_state(imbuddy, HYBRID_STATE_BUSY); break; default: hybrid_blist_set_buddy_state(imbuddy, HYBRID_STATE_AWAY); break; } fetion_update_portrait(ac, buddy); } }
void fetion_buddies_init(fetion_account *ac) { GSList *pos; gchar *start, *stop, *id; fetion_buddy *buddy; HybridGroup *imgroup; HybridBuddy *imbuddy; for (pos = ac->buddies; pos; pos = pos->next) { buddy = (fetion_buddy*)pos->data; start = buddy->groups; stop = buddy->groups; while (*stop) { for (; *stop && *stop != ';'; stop ++); id = g_strndup(start, stop - start); imgroup = hybrid_blist_find_group(ac->account, id); imbuddy = hybrid_blist_add_buddy(ac->account, imgroup, buddy->userid, buddy->localname); if (*(imbuddy->name) == '\0') { hybrid_blist_set_buddy_name(imbuddy, buddy->sid); } hybrid_blist_set_buddy_status(imbuddy, buddy->status == 1 ? TRUE : FALSE); g_free(id); if (*stop) { stop ++; start = stop; } else { break; } } } }