event more pointers, now everything works

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/hilnius@13182 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
hilnius
2013-07-11 13:30:16 +00:00
parent 64c1ee950f
commit 4334472a3a
6 changed files with 38 additions and 31 deletions

View File

@@ -56,20 +56,20 @@ Event::Event(ENetEvent* event)
enet_packet_destroy(m_packet); // we got all we need, just remove the data.
std::vector<STKPeer*> peers = NetworkManager::getInstance()->getPeers();
peer = NULL;
peer = new STKPeer*;
for (unsigned int i = 0; i < peers.size(); i++)
{
if (peers[i]->m_peer == event->peer)
{
peer = peers[i];
*peer = peers[i];
return;
}
}
if (peer == NULL) // peer does not exist, create him
if (*peer == NULL) // peer does not exist, create him
{
STKPeer* new_peer = new STKPeer();
new_peer->m_peer = event->peer;
peer = new_peer;
*peer = new_peer;
Log::verbose("Event", "Creating a new peer, address are STKPeer:%ld, Peer:%ld", (long int)(new_peer), (long int)(event->peer));
}
}
@@ -79,7 +79,7 @@ Event::Event(const Event& event)
m_packet = NULL;
data = event.data;
// copy the peer
peer = new STKPeer(*event.peer);
peer = event.peer;
type = event.type;
}

View File

@@ -66,8 +66,8 @@ class Event
void removeFront(int size);
EVENT_TYPE type; //!< Type of the event.
NetworkString data; //!< Copy of the data passed by the event.
STKPeer* peer; //!< Pointer to the peer that triggered that event.
NetworkString data; //!< Copy of the data passed by the event.
STKPeer** peer; //!< Pointer to the peer that triggered that event.
private:
ENetPacket* m_packet; //!< A pointer on the ENetPacket to be deleted.

View File

@@ -89,17 +89,16 @@ void NetworkManager::setManualSocketsMode(bool manual)
void NetworkManager::notifyEvent(Event* event)
{
Log::info("NetworkManager", "EVENT received of type %d", (int)(event->type));
STKPeer* peer = *event->peer;
if (event->type == EVENT_TYPE_CONNECTED)
{
Log::info("NetworkManager", "A client has just connected. There are now %lu peers.", m_peers.size() + 1);
Log::verbose("NetworkManager", "Address of event->peer after connection : %ld", (long int)(event->peer));
// create the new peer:
m_peers.push_back(event->peer);
m_peers.push_back(peer);
}
if (event->type == EVENT_TYPE_MESSAGE)
{
uint32_t addr = event->peer->getAddress();
uint32_t addr = peer->getAddress();
Log::info("NetworkManager", "Message, Sender : %i.%i.%i.%i, message = \"%s\"",
((addr>>24)&0xff),
((addr>>16)&0xff),
@@ -113,20 +112,24 @@ void NetworkManager::notifyEvent(Event* event)
if (event->type == EVENT_TYPE_DISCONNECTED)
{
Log::debug("NetworkManager", "Disconnected host: %i.%i.%i.%i:%i", event->peer->getAddress()>>24&0xff, event->peer->getAddress()>>16&0xff, event->peer->getAddress()>>8&0xff, event->peer->getAddress()&0xff,event->peer->getPort());
Log::debug("NetworkManager", "Disconnected host: %i.%i.%i.%i:%i",
peer->getAddress()>>24&0xff,
peer->getAddress()>>16&0xff,
peer->getAddress()>>8&0xff,
peer->getAddress()&0xff,
peer->getPort());
// remove the peer:
bool removed = false;
for (unsigned int i = 0; i < m_peers.size(); i++)
{
Log::error("NetworkManager", "Saved : %ld, Sender : %ld", (long int)(m_peers[i]), (long int)(event->peer));
if (m_peers[i]->isSamePeer(event->peer) && !removed) // remove only one
if (m_peers[i]->isSamePeer(peer) && !removed) // remove only one
{
delete m_peers[i];
m_peers.erase(m_peers.begin()+i, m_peers.begin()+i+1);
Log::verbose("NetworkManager", "The peer has been removed from the Network Manager.");
removed = true;
}
else if (m_peers[i]->isSamePeer(event->peer))
else if (m_peers[i]->isSamePeer(peer))
{
Log::fatal("NetworkManager", "Multiple peers match the disconnected one.");
}

View File

@@ -261,8 +261,7 @@ void ProtocolManager::update()
Log::debug("ProtocolManager", "Message is \"%s\"", event->data.c_str());
}
// because we made a copy of the event and the peer
delete event->peer;
// because we made a copy of the event
delete event;
}

View File

@@ -58,10 +58,11 @@ void ClientLobbyRoomProtocol::requestKartSelection(std::string kart_name)
void ClientLobbyRoomProtocol::notifyEvent(Event* event)
{
assert(m_setup); // assert that the setup exists
STKPeer* peer = *(event->peer);
if (event->type == EVENT_TYPE_MESSAGE)
{
assert(event->data.size()); // assert that data isn't empty
Log::verbose("ClientLobbyRoomProtocol", "Message from %u : \"%s\"", event->peer->getAddress(), event->data.c_str());
Log::verbose("ClientLobbyRoomProtocol", "Message from %u : \"%s\"", peer->getAddress(), event->data.c_str());
uint8_t message_type = event->data.getAndRemoveUInt8();
if (message_type == 0x01) // new player connected
@@ -203,6 +204,7 @@ void ClientLobbyRoomProtocol::connectionAccepted(Event* event)
Log::error("ClientLobbyRoomProtocol", "A message notifying an accepted connection wasn't formated as expected.");
return;
}
STKPeer* peer = *(event->peer);
NetworkPlayerProfile* profile = new NetworkPlayerProfile();
profile->kart_name = "";
@@ -214,8 +216,8 @@ void ClientLobbyRoomProtocol::connectionAccepted(Event* event)
Log::info("ClientLobbyRoomProtocol", "The server accepted the connection.");
profile->user_profile = CurrentOnlineUser::get();
m_setup->addPlayer(profile);
event->peer->setClientServerToken(token);
m_server = event->peer;
peer->setClientServerToken(token);
m_server = *(event->peer);
m_state = CONNECTED;
}
}

View File

@@ -164,11 +164,12 @@ void ServerLobbyRoomProtocol::update()
void ServerLobbyRoomProtocol::kartDisconnected(Event* event)
{
STKPeer* peer = *(event->peer);
Log::info("ServerLobbyRoomProtocol", "Player disconnected.");
if (event->peer->getPlayerProfile() != NULL) // others knew him
if (peer->getPlayerProfile() != NULL) // others knew him
{
NetworkString msg;
msg.ai8(0x02).ai8(1).ai8(event->peer->getPlayerProfile()->race_id);
msg.ai8(0x02).ai8(1).ai8(peer->getPlayerProfile()->race_id);
m_listener->sendMessage(this, msg);
}
else
@@ -189,6 +190,7 @@ void ServerLobbyRoomProtocol::kartDisconnected(Event* event)
*/
void ServerLobbyRoomProtocol::connectionRequested(Event* event)
{
STKPeer* peer = *(event->peer);
if (event->data.size() != 5 || event->data[0] != 4)
{
Log::warn("ServerLobbyRoomProtocol", "The server is sending a badly formated message. Size is %d and first byte %d", event->data.size(), event->data[0]);
@@ -207,7 +209,7 @@ void ServerLobbyRoomProtocol::connectionRequested(Event* event)
NetworkString message;
// new player (1) -- size of id -- id -- size of local id -- local id;
message.ai8(1).ai8(4).ai32(player_id).ai8(1).ai8(m_next_id);
m_listener->sendMessageExcept(this, event->peer, message);
m_listener->sendMessageExcept(this, peer, message);
// send a message to the one that asked to connect
NetworkString message_ack;
// 0b10000001 (connection success) ;
@@ -219,16 +221,16 @@ void ServerLobbyRoomProtocol::connectionRequested(Event* event)
((token_generator.get(RAND_MAX) & 0xff)));
// connection success (129) -- size of token -- token
message_ack.ai8(0x81).ai8(1).ai8(m_next_id).ai8(4).ai32(token).ai8(4).ai32(player_id);
m_listener->sendMessage(this, event->peer, message_ack);
m_listener->sendMessage(this, peer, message_ack);
event->peer->setClientServerToken(token);
peer->setClientServerToken(token);
NetworkPlayerProfile* profile = new NetworkPlayerProfile();
profile->race_id = m_next_id;
profile->kart_name = "";
profile->user_profile = new OnlineUser("Unnamed Player");
m_setup->addPlayer(profile);
event->peer->setPlayerProfile(profile);
peer->setPlayerProfile(profile);
} // accept player
else // refuse the connection with code 0 (too much players)
{
@@ -237,7 +239,7 @@ void ServerLobbyRoomProtocol::connectionRequested(Event* event)
message.ai8(1); // 1 bytes for the error code
message.ai8(0); // 0 = too much players
// send only to the peer that made the request
m_listener->sendMessage(this, event->peer, message);
m_listener->sendMessage(this, peer, message);
}
}
@@ -262,8 +264,9 @@ void ServerLobbyRoomProtocol::kartSelectionRequested(Event* event)
event->data.size(), event->data[0]);
return;
}
STKPeer* peer = *(event->peer);
uint32_t token = event->data.gui32(1);
if (token != event->peer->getClientServerToken())
if (token != peer->getClientServerToken())
{
Log::warn("ServerLobbyRoomProtocol", "Peer sending bad token. Request "
"aborted.");
@@ -281,7 +284,7 @@ void ServerLobbyRoomProtocol::kartSelectionRequested(Event* event)
{
NetworkString answer;
answer.ai8(0x82).ai8(1).ai8(0); // kart is already taken
m_listener->sendMessage(this, event->peer, answer);
m_listener->sendMessage(this, peer, answer);
return;
}
// check if this kart is authorized
@@ -289,13 +292,13 @@ void ServerLobbyRoomProtocol::kartSelectionRequested(Event* event)
{
NetworkString answer;
answer.ai8(0x82).ai8(1).ai8(1); // kart is not authorized
m_listener->sendMessage(this, event->peer, answer);
m_listener->sendMessage(this, peer, answer);
return;
}
// send a kart update to everyone
NetworkString answer;
// kart update (3), 1, race id
answer.ai8(0x03).ai8(1).ai8(event->peer->getPlayerProfile()->race_id);
answer.ai8(0x03).ai8(1).ai8(peer->getPlayerProfile()->race_id);
// kart name size, kart name
answer.ai8(kart_name.size()).as(kart_name);
m_listener->sendMessage(this, answer);