diff --git a/src/net/clientthread.h b/src/net/clientthread.h index 947e2240..5aa42483 100644 --- a/src/net/clientthread.h +++ b/src/net/clientthread.h @@ -87,11 +87,13 @@ protected: bool GetCachedPlayerInfo(unsigned id, PlayerInfo &info) const; void RequestPlayerInfo(unsigned id); void SetPlayerInfo(unsigned id, const PlayerInfo &info, bool retrieveAvatar = true); + void SetUnknownPlayer(unsigned id); void SetNewGameAdmin(unsigned id); void AddTempAvatarData(unsigned playerId, unsigned avatarSize, AvatarFileType type); void StoreInTempAvatarData(unsigned playerId, const std::vector &data); void CompleteTempAvatarData(unsigned playerId); + void SetUnknownAvatar(unsigned playerId); const ClientContext &GetContext() const; ClientContext &GetContext(); diff --git a/src/net/common/clientstate.cpp b/src/net/common/clientstate.cpp index 78aec34b..f5612a66 100644 --- a/src/net/common/clientstate.cpp +++ b/src/net/common/clientstate.cpp @@ -396,6 +396,12 @@ AbstractClientStateReceiving::Process(ClientThread &client) tmpPacket->ToNetPacketPlayerInfo()->GetData(infoData); client.SetPlayerInfo(infoData.playerId, infoData.playerInfo); } + else if (tmpPacket->ToNetPacketUnknownPlayerId()) + { + NetPacketUnknownPlayerId::Data unknownIdData; + tmpPacket->ToNetPacketUnknownPlayerId()->GetData(unknownIdData); + client.SetUnknownPlayer(unknownIdData.playerId); + } else if (tmpPacket->ToNetPacketRemovedFromGame()) { NetPacketRemovedFromGame::Data removedData; @@ -500,6 +506,12 @@ AbstractClientStateReceiving::Process(ClientThread &client) tmpPacket->ToNetPacketAvatarEnd()->GetData(endData); client.CompleteTempAvatarData(endData.requestId); } + else if (tmpPacket->ToNetPacketUnknownAvatar()) + { + NetPacketUnknownAvatar::Data unknownAvatarData; + tmpPacket->ToNetPacketUnknownAvatar()->GetData(unknownAvatarData); + client.SetUnknownAvatar(unknownAvatarData.requestId); + } else if (tmpPacket->ToNetPacketError()) { // Server reported an error. diff --git a/src/net/common/clientthread.cpp b/src/net/common/clientthread.cpp index 05596fe8..6d951135 100644 --- a/src/net/common/clientthread.cpp +++ b/src/net/common/clientthread.cpp @@ -418,7 +418,7 @@ ClientThread::SetPlayerInfo(unsigned id, const PlayerInfo &info, bool retrieveAv m_tempAvatarMap[id] = boost::shared_ptr(); } - // Remove from request list. + // Remove it from the request list. m_playerInfoRequestList.remove(id); // Notify GUI @@ -426,6 +426,14 @@ ClientThread::SetPlayerInfo(unsigned id, const PlayerInfo &info, bool retrieveAv } +void +ClientThread::SetUnknownPlayer(unsigned id) +{ + // Just remove it from the request list. + m_playerInfoRequestList.remove(id); + // TODO log error +} + void ClientThread::SetNewGameAdmin(unsigned id) { @@ -484,6 +492,13 @@ ClientThread::CompleteTempAvatarData(unsigned playerId) SetPlayerInfo(playerId, tmpPlayerInfo, false); } +void +ClientThread::SetUnknownAvatar(unsigned playerId) +{ + m_tempAvatarMap.erase(playerId); + // TODO log error +} + const ClientContext & ClientThread::GetContext() const { diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index 2bb3e2d9..036f4abf 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -308,6 +308,8 @@ ServerLobbyThread::ProcessLoop() HandleNetPacketInit(session, *packet->ToNetPacketInit()); else if (packet->ToNetPacketAvatarHeader()) HandleNetPacketAvatarHeader(session, *packet->ToNetPacketAvatarHeader()); + else if (packet->ToNetPacketUnknownAvatar()) + HandleNetPacketUnknownAvatar(session, *packet->ToNetPacketUnknownAvatar()); else SessionError(session, ERR_SOCK_INVALID_STATE); } @@ -419,6 +421,18 @@ ServerLobbyThread::HandleNetPacketAvatarHeader(SessionWrapper session, const Net } } +void +ServerLobbyThread::HandleNetPacketUnknownAvatar(SessionWrapper session, const NetPacketUnknownAvatar &/*tmpPacket*/) +{ + if (session.playerData.get()) + { + // Free memory (just in case). + session.playerData->SetNetAvatarData(boost::shared_ptr()); + // Start session. + EstablishSession(session); + } +} + void ServerLobbyThread::HandleNetPacketAvatarFile(SessionWrapper session, const NetPacketAvatarFile &tmpPacket) { @@ -492,12 +506,21 @@ ServerLobbyThread::HandleNetPacketRetrievePlayerInfo(SessionWrapper session, con static_cast(info.get())->SetData(infoData); GetSender().Send(session.sessionData->GetSocket(), info); } - // TODO: handle error + else + { + // Unknown player id - notify client. + boost::shared_ptr unknown(new NetPacketUnknownPlayerId); + NetPacketUnknownPlayerId::Data unknownData; + unknownData.playerId = request.playerId; + static_cast(unknown.get())->SetData(unknownData); + GetSender().Send(session.sessionData->GetSocket(), unknown); + } } void ServerLobbyThread::HandleNetPacketRetrieveAvatar(SessionWrapper session, const NetPacketRetrieveAvatar &tmpPacket) { + bool avatarFound = false; NetPacketRetrieveAvatar::Data request; tmpPacket.GetData(request); @@ -506,8 +529,21 @@ ServerLobbyThread::HandleNetPacketRetrieveAvatar(SessionWrapper session, const N { NetPacketList tmpPackets; if (GetAvatarManager().AvatarFileToNetPackets(tmpFile, request.requestId, tmpPackets)) + { + avatarFound = true; GetSender().SendLowPrio(session.sessionData->GetSocket(), tmpPackets); - // TODO handle error + } + // TODO Log error + } + + if (!avatarFound) + { + // Notify client we didn't find the avatar. + boost::shared_ptr unknown(new NetPacketUnknownAvatar); + NetPacketUnknownAvatar::Data unknownData; + unknownData.requestId = request.requestId; + static_cast(unknown.get())->SetData(unknownData); + GetSender().Send(session.sessionData->GetSocket(), unknown); } } diff --git a/src/net/serverlobbythread.h b/src/net/serverlobbythread.h index 6ea50dda..443dca99 100644 --- a/src/net/serverlobbythread.h +++ b/src/net/serverlobbythread.h @@ -90,6 +90,7 @@ protected: void ProcessLoop(); void HandleNetPacketInit(SessionWrapper session, const NetPacketInit &tmpPacket); void HandleNetPacketAvatarHeader(SessionWrapper session, const NetPacketAvatarHeader &tmpPacket); + void HandleNetPacketUnknownAvatar(SessionWrapper session, const NetPacketUnknownAvatar &tmpPacket); void HandleNetPacketAvatarFile(SessionWrapper session, const NetPacketAvatarFile &tmpPacket); void HandleNetPacketAvatarEnd(SessionWrapper session, const NetPacketAvatarEnd &tmpPacket); void HandleNetPacketRetrievePlayerInfo(SessionWrapper session, const NetPacketRetrievePlayerInfo &tmpPacket);