in chime/chime-room.c [733:771]
static gboolean add_room_member(ChimeConnection *cxn, ChimeRoom *room, JsonNode *node)
{
JsonObject *obj = json_node_get_object(node);
JsonNode *member_node = json_object_get_member(obj, "Member");
if (!member_node)
return FALSE;
ChimeContact *contact = chime_connection_parse_conversation_contact(cxn, member_node, NULL);
if (!contact)
return FALSE;
ChimeRoomMember *member = g_hash_table_lookup(room->members, chime_contact_get_profile_id(contact));
if (!member) {
member = g_new0(ChimeRoomMember, 1);
member->contact = contact;
g_hash_table_insert(room->members, (void *)chime_contact_get_profile_id(contact), member);
} else {
g_object_unref(contact);
}
const char *role, *presence, *status, *last_read, *last_delivered;
if (parse_string(member_node, "LastRead", &last_read) &&
g_strcmp0(last_read, member->last_read)) {
g_free(member->last_read);
member->last_read = g_strdup(last_read);
}
if (parse_string(member_node, "LastDelivered", &last_delivered) &&
g_strcmp0(last_delivered, member->last_delivered)) {
g_free(member->last_delivered);
member->last_delivered = g_strdup(last_delivered);
}
member->admin = parse_string(node, "Role", &role) && !strcmp(role, "administrator");
member->present = parse_string(node, "Presence", &presence) && !strcmp(presence, "present");
member->active = parse_string(node, "Status", &status) && !strcmp(status, "active");
g_signal_emit(room, signals[MEMBERSHIP], 0, member);
return TRUE;
}