Don't wait endlessly for player or avatar requests to complete if the other side does not have the required data. Send notifications and react accordingly.

This commit is contained in:
lotodore
2007-10-11 20:42:44 +00:00
parent 488e909838
commit 5218e038d4
5 changed files with 69 additions and 3 deletions
+2
View File
@@ -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<unsigned char> &data);
void CompleteTempAvatarData(unsigned playerId);
void SetUnknownAvatar(unsigned playerId);
const ClientContext &GetContext() const;
ClientContext &GetContext();
+12
View File
@@ -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.
+16 -1
View File
@@ -418,7 +418,7 @@ ClientThread::SetPlayerInfo(unsigned id, const PlayerInfo &info, bool retrieveAv
m_tempAvatarMap[id] = boost::shared_ptr<AvatarData>();
}
// 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
{
+38 -2
View File
@@ -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<AvatarData>());
// Start session.
EstablishSession(session);
}
}
void
ServerLobbyThread::HandleNetPacketAvatarFile(SessionWrapper session, const NetPacketAvatarFile &tmpPacket)
{
@@ -492,12 +506,21 @@ ServerLobbyThread::HandleNetPacketRetrievePlayerInfo(SessionWrapper session, con
static_cast<NetPacketPlayerInfo *>(info.get())->SetData(infoData);
GetSender().Send(session.sessionData->GetSocket(), info);
}
// TODO: handle error
else
{
// Unknown player id - notify client.
boost::shared_ptr<NetPacket> unknown(new NetPacketUnknownPlayerId);
NetPacketUnknownPlayerId::Data unknownData;
unknownData.playerId = request.playerId;
static_cast<NetPacketUnknownPlayerId *>(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<NetPacket> unknown(new NetPacketUnknownAvatar);
NetPacketUnknownAvatar::Data unknownData;
unknownData.requestId = request.requestId;
static_cast<NetPacketUnknownAvatar *>(unknown.get())->SetData(unknownData);
GetSender().Send(session.sessionData->GetSocket(), unknown);
}
}
+1
View File
@@ -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);