void Torrent::deletePeer(Peer::Id id){ qDebug() << "Removing peer: " << id; PeerPtr peerPtr = findPeer(id); mPeers.remove(id); emit onPeerDisconnected(peerPtr); }
void PNetworkServer::update() { if (m_state == NETWORK_CONNECTED) { pint32 ret; while ((ret = enet_host_service(m_data->server, &m_data->event, P_NETWORK_POLL_TIME)) > 0) // FIXME: why enet_host_check_events doesn't work as enet_host_service()? //while ((ret = enet_host_check_events(m_data->server, &m_data->event)) > 0) { switch (m_data->event.type) { case ENET_EVENT_TYPE_CONNECT: { puint32 id = m_nextId++; PNetworkPeer *peer = onPeerConnected(id); if (peer != P_NULL) { m_peers.insert(id, peer); peer->data()->peer = m_data->event.peer; } m_data->event.peer->data = PNEW(puint32); *(puint32*)(m_data->event.peer->data) = id; } break; case ENET_EVENT_TYPE_RECEIVE: { puint32 id = *(puint32*)(m_data->event.peer->data); PMap<puint32, PNetworkPeer*>::iterator it = m_peers.find(id); if (it != m_peers.end()) { onMessageReceived(it.value(), (const puint8 *)(m_data->event.packet->data), m_data->event.packet->dataLength); } else { PLOG_ERROR("Failed to find network connection %d.", id); } enet_packet_destroy (m_data->event.packet); } break; case ENET_EVENT_TYPE_DISCONNECT: { puint32 id = *(puint32*)(m_data->event.peer->data); PMap<puint32, PNetworkPeer*>::iterator it = m_peers.find(id); if (it != m_peers.end()) { onPeerDisconnected(it.value()); PDELETE(it.value()); m_peers.erase(it); puint32 *tmp = (puint32*)(m_data->event.peer->data); PDELETE(tmp); } else { PLOG_ERROR("Failed to find network connection %d.", id); } } break; default: PASSERT_NOTREACHABLE("Unknown server side event."); break; } } if (ret < 0) { m_state = NETWORK_ERROR; } } }