Network: Propagate Room closing to connected members
This commit is contained in:
		@@ -84,6 +84,11 @@ public:
 | 
			
		||||
     */
 | 
			
		||||
    void SendJoinSuccess(ENetPeer* client, MacAddress mac_address);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Notifies the members that the room is closed,
 | 
			
		||||
     */
 | 
			
		||||
    void SendCloseMessage();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sends the information about the room, along with the list of members
 | 
			
		||||
     * to every connected client in the room.
 | 
			
		||||
@@ -159,6 +164,8 @@ void Room::RoomImpl::ServerLoop() {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    // Close the connection to all members:
 | 
			
		||||
    SendCloseMessage();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Room::RoomImpl::StartLoop() {
 | 
			
		||||
@@ -266,6 +273,20 @@ void Room::RoomImpl::SendJoinSuccess(ENetPeer* client, MacAddress mac_address) {
 | 
			
		||||
    enet_host_flush(server);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Room::RoomImpl::SendCloseMessage() {
 | 
			
		||||
    Packet packet;
 | 
			
		||||
    packet << static_cast<MessageID>(IdCloseRoom);
 | 
			
		||||
    ENetPacket* enet_packet =
 | 
			
		||||
        enet_packet_create(packet.GetData(), packet.GetDataSize(), ENET_PACKET_FLAG_RELIABLE);
 | 
			
		||||
    for (auto& member : members) {
 | 
			
		||||
        enet_peer_send(member.peer, 0, enet_packet);
 | 
			
		||||
    }
 | 
			
		||||
    enet_host_flush(server);
 | 
			
		||||
    for (auto& member : members) {
 | 
			
		||||
        enet_peer_disconnect(member.peer, 0);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Room::RoomImpl::BroadcastRoomInformation() {
 | 
			
		||||
    Packet packet;
 | 
			
		||||
    packet << static_cast<MessageID>(IdRoomInformation);
 | 
			
		||||
 
 | 
			
		||||
@@ -127,6 +127,9 @@ void RoomMember::RoomMemberImpl::MemberLoop() {
 | 
			
		||||
                case IdVersionMismatch:
 | 
			
		||||
                    SetState(State::WrongVersion);
 | 
			
		||||
                    break;
 | 
			
		||||
                case IdCloseRoom:
 | 
			
		||||
                    SetState(State::LostConnection);
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
@@ -307,7 +310,7 @@ RoomInformation RoomMember::GetRoomInformation() const {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RoomMember::Join(const std::string& nick, const char* server_addr, u16 server_port,
 | 
			
		||||
                      u16 client_port) {
 | 
			
		||||
                      u16 client_port, const MacAddress& preferred_mac) {
 | 
			
		||||
    // If the member is connected, kill the connection first
 | 
			
		||||
    if (room_member_impl->loop_thread && room_member_impl->loop_thread->joinable()) {
 | 
			
		||||
        room_member_impl->SetState(State::Error);
 | 
			
		||||
@@ -336,7 +339,7 @@ void RoomMember::Join(const std::string& nick, const char* server_addr, u16 serv
 | 
			
		||||
        room_member_impl->nickname = nick;
 | 
			
		||||
        room_member_impl->SetState(State::Joining);
 | 
			
		||||
        room_member_impl->StartLoop();
 | 
			
		||||
        room_member_impl->SendJoinRequest(nick);
 | 
			
		||||
        room_member_impl->SendJoinRequest(nick, preferred_mac);
 | 
			
		||||
    } else {
 | 
			
		||||
        room_member_impl->SetState(State::CouldNotConnect);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -97,7 +97,8 @@ public:
 | 
			
		||||
     * This may fail if the username is already taken.
 | 
			
		||||
     */
 | 
			
		||||
    void Join(const std::string& nickname, const char* server_addr = "127.0.0.1",
 | 
			
		||||
              const u16 serverPort = DefaultRoomPort, const u16 clientPort = 0);
 | 
			
		||||
              const u16 serverPort = DefaultRoomPort, const u16 clientPort = 0,
 | 
			
		||||
              const MacAddress& preferred_mac = NoPreferredMac);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sends a WiFi packet to the room.
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user