/* * Add a new chat room member to the room's roster */ gboolean muc_add_to_roster(const char * const room, const char * const nick, const char * const show, const char * const status, const char * const caps_str) { ChatRoom *chat_room = g_hash_table_lookup(rooms, room); gboolean updated = FALSE; if (chat_room != NULL) { PContact old = g_hash_table_lookup(chat_room->roster, nick); if (old == NULL) { updated = TRUE; autocomplete_add(chat_room->nick_ac, nick); } else if ((g_strcmp0(p_contact_presence(old), show) != 0) || (g_strcmp0(p_contact_status(old), status) != 0)) { updated = TRUE; } PContact contact = p_contact_new(nick, NULL, NULL, NULL, NULL, FALSE); resource_presence_t resource_presence = resource_presence_from_string(show); Resource *resource = resource_new(nick, resource_presence, status, 0, caps_str); p_contact_set_presence(contact, resource); g_hash_table_replace(chat_room->roster, strdup(nick), contact); } return updated; }
gboolean roster_add(const char *const barejid, const char *const name, GSList *groups, const char *const subscription, gboolean pending_out) { assert(roster != NULL); PContact contact = roster_get_contact(barejid); if (contact) { return FALSE; } contact = p_contact_new(barejid, name, groups, subscription, NULL, pending_out); // add groups GSList *curr_new_group = groups; while (curr_new_group) { char *new_group = curr_new_group->data; if (g_hash_table_contains(roster->group_count, new_group)) { int count = GPOINTER_TO_INT(g_hash_table_lookup(roster->group_count, new_group)); g_hash_table_insert(roster->group_count, strdup(new_group), GINT_TO_POINTER(count + 1)); } else { g_hash_table_insert(roster->group_count, strdup(new_group), GINT_TO_POINTER(1)); autocomplete_add(roster->groups_ac, new_group); } curr_new_group = g_slist_next(curr_new_group); } g_hash_table_insert(roster->contacts, strdup(barejid), contact); autocomplete_add(roster->barejid_ac, barejid); _add_name_and_barejid(name, barejid); return TRUE; }
void contact_jid_when_name_not_exists(void **state) { PContact contact = p_contact_new("*****@*****.**", NULL, NULL, "both", "is offline", FALSE); const char *jid = p_contact_name_or_jid(contact); assert_string_equal("*****@*****.**", jid); p_contact_free(contact); }
void contact_not_available(void **state) { PContact contact = p_contact_new("*****@*****.**", "bob", NULL, NULL, "is offline", FALSE); gboolean result = p_contact_is_available(contact); assert_false(result); p_contact_free(contact); }
void contact_subscribed_when_both(void **state) { PContact contact = p_contact_new("*****@*****.**", "bob", NULL, "both", "is offline", FALSE); gboolean result = p_contact_subscribed(contact); assert_true(result); p_contact_free(contact); }
void contact_not_subscribed_when_no_subscription_value(void **state) { PContact contact = p_contact_new("*****@*****.**", "bob", NULL, NULL, "is offline", FALSE); gboolean result = p_contact_subscribed(contact); assert_false(result); p_contact_free(contact); }
void contact_presence_offline(void **state) { PContact contact = p_contact_new("*****@*****.**", "bob", NULL, "both", "is offline", FALSE); const char *presence = p_contact_presence(contact); assert_string_equal("offline", presence); p_contact_free(contact); }
void contact_string_when_default_resource(void **state) { PContact contact = p_contact_new("*****@*****.**", "bob", NULL, "both", "is offline", FALSE); char *str = p_contact_create_display_string(contact, "__prof_default"); assert_string_equal("bob", str); p_contact_free(contact); free(str); }
void contact_string_when_name_not_exists(void **state) { PContact contact = p_contact_new("*****@*****.**", NULL, NULL, "both", "is offline", FALSE); char *str = p_contact_create_display_string(contact, "laptop"); assert_string_equal("[email protected] (laptop)", str); p_contact_free(contact); free(str); }
void contact_not_in_group(void **state) { GSList *groups = NULL; groups = g_slist_append(groups, strdup("somegroup")); PContact contact = p_contact_new("*****@*****.**", "bob", groups, "both", "is offline", FALSE); gboolean result = p_contact_in_group(contact, "othergroup"); assert_false(result); p_contact_free(contact); // g_slist_free(groups); }
void contact_presence_dnd(void **state) { PContact contact = p_contact_new("*****@*****.**", "bob", NULL, "both", "is offline", FALSE); Resource *resource_dnd = resource_new("resource_dnd", RESOURCE_DND, NULL, 10); p_contact_set_presence(contact, resource_dnd); const char *presence = p_contact_presence(contact); assert_string_equal("dnd", presence); p_contact_free(contact); }
void contact_presence_away_when_same_prioroty(void **state) { PContact contact = p_contact_new("*****@*****.**", "bob", NULL, "both", "is offline", FALSE); Resource *resource_away = resource_new("resource_away", RESOURCE_AWAY, NULL, 10); Resource *resource_xa = resource_new("resource_xa", RESOURCE_XA, NULL, 10); Resource *resource_dnd = resource_new("resource_dnd", RESOURCE_DND, NULL, 10); p_contact_set_presence(contact, resource_away); p_contact_set_presence(contact, resource_xa); p_contact_set_presence(contact, resource_dnd); const char *presence = p_contact_presence(contact); assert_string_equal("away", presence); p_contact_free(contact); }
void contact_available_when_highest_priority_chat(void **state) { PContact contact = p_contact_new("*****@*****.**", "bob", NULL, NULL, "is offline", FALSE); Resource *resource_online = resource_new("resource_online", RESOURCE_ONLINE, NULL, 10); Resource *resource_chat = resource_new("resource_chat", RESOURCE_CHAT, NULL, 20); Resource *resource_away = resource_new("resource_away", RESOURCE_AWAY, NULL, 10); Resource *resource_xa = resource_new("resource_xa", RESOURCE_XA, NULL, 10); Resource *resource_dnd = resource_new("resource_dnd", RESOURCE_DND, NULL, 10); p_contact_set_presence(contact, resource_online); p_contact_set_presence(contact, resource_chat); p_contact_set_presence(contact, resource_away); p_contact_set_presence(contact, resource_xa); p_contact_set_presence(contact, resource_dnd); gboolean result = p_contact_is_available(contact); assert_true(result); p_contact_free(contact); }
void contact_presence_uses_highest_priority(void **state) { PContact contact = p_contact_new("*****@*****.**", "bob", NULL, "both", "is offline", FALSE); Resource *resource10 = resource_new("resource10", RESOURCE_ONLINE, NULL, 10); Resource *resource20 = resource_new("resource20", RESOURCE_CHAT, NULL, 20); Resource *resource30 = resource_new("resource30", RESOURCE_AWAY, NULL, 30); Resource *resource1 = resource_new("resource1", RESOURCE_XA, NULL, 1); Resource *resource2 = resource_new("resource2", RESOURCE_DND, NULL, 2); p_contact_set_presence(contact, resource10); p_contact_set_presence(contact, resource20); p_contact_set_presence(contact, resource30); p_contact_set_presence(contact, resource1); p_contact_set_presence(contact, resource2); const char *presence = p_contact_presence(contact); assert_string_equal("away", presence); p_contact_free(contact); }
gboolean roster_add(const char * const barejid, const char * const name, GSList *groups, const char * const subscription, gboolean pending_out) { PContact contact = g_hash_table_lookup(contacts, barejid); if (contact != NULL) { return FALSE; } contact = p_contact_new(barejid, name, groups, subscription, NULL, pending_out); // add groups while (groups != NULL) { autocomplete_add(groups_ac, groups->data); groups = g_slist_next(groups); } g_hash_table_insert(contacts, strdup(barejid), contact); autocomplete_add(barejid_ac, barejid); _add_name_and_barejid(name, barejid); return TRUE; }