static gboolean add_room_member()

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;
}