From 864af81193d8d2a25833517716054f9937262f81 Mon Sep 17 00:00:00 2001 From: lotodore Date: Thu, 1 Nov 2007 18:36:03 +0000 Subject: [PATCH] Don't request own avatar from the server. Only request avatars of other players after joining a game. --- src/core/avatarmanager.h | 2 ++ src/core/common/avatarmanager.cpp | 28 ++++++++++++++++++++ src/net/clientthread.h | 7 +++-- src/net/common/clientstate.cpp | 4 ++- src/net/common/clientthread.cpp | 44 ++++++++++++++++++++++--------- src/session.cpp | 3 +++ src/session.h | 2 +- 7 files changed, 74 insertions(+), 16 deletions(-) diff --git a/src/core/avatarmanager.h b/src/core/avatarmanager.h index 99f2b7c9..49dee178 100644 --- a/src/core/avatarmanager.h +++ b/src/core/avatarmanager.h @@ -45,6 +45,8 @@ public: bool Init(const std::string &dataDir, const std::string &cacheDir); + void AddSingleAvatar(const std::string &fileName); + boost::shared_ptr OpenAvatarFileForChunkRead(const std::string &fileName, unsigned &outFileSize, AvatarFileType &outFileType); unsigned ChunkReadAvatarFile(boost::shared_ptr fileState, unsigned char *data, unsigned chunkSize); diff --git a/src/core/common/avatarmanager.cpp b/src/core/common/avatarmanager.cpp index 94ba0610..8ff60e8b 100644 --- a/src/core/common/avatarmanager.cpp +++ b/src/core/common/avatarmanager.cpp @@ -20,6 +20,7 @@ #include "avatarmanager.h" #include #include +#include #include #include @@ -93,6 +94,33 @@ AvatarManager::Init(const std::string &dataDir, const std::string &cacheDir) return retVal; } +void +AvatarManager::AddSingleAvatar(const std::string &fileName) +{ + path filePath(fileName); + string tmpFileName(filePath.file_string()); + + if (!fileName.empty() && !tmpFileName.empty()) + { + unsigned outFileSize; + AvatarFileType outFileType; + boost::shared_ptr tmpFileState = OpenAvatarFileForChunkRead(tmpFileName, outFileSize, outFileType); + + // Check whether the avatar file is valid. + if (tmpFileState.get()) + { + tmpFileState.reset(); + + MD5Buf md5buf; + if (CryptHelper::MD5Sum(tmpFileName, md5buf)) + { + boost::mutex::scoped_lock lock(m_avatarsMutex); + m_avatars.insert(AvatarMap::value_type(md5buf, tmpFileName)); + } + } + } +} + boost::shared_ptr AvatarManager::OpenAvatarFileForChunkRead(const std::string &fileName, unsigned &outFileSize, AvatarFileType &outFileType) { diff --git a/src/net/clientthread.h b/src/net/clientthread.h index c62bb8ec..4950c243 100644 --- a/src/net/clientthread.h +++ b/src/net/clientthread.h @@ -88,10 +88,11 @@ protected: void SendPacketLoop(); bool GetCachedPlayerInfo(unsigned id, PlayerInfo &info) const; - void RequestPlayerInfo(unsigned id); - void SetPlayerInfo(unsigned id, const PlayerInfo &info, bool retrieveAvatar = true); + void RequestPlayerInfo(unsigned id, bool requestAvatar = false); + void SetPlayerInfo(unsigned id, const PlayerInfo &info); void SetUnknownPlayer(unsigned id); void SetNewGameAdmin(unsigned id); + void RetrieveAvatarIfNeeded(unsigned id, const PlayerInfo &info); void AddTempAvatarData(unsigned playerId, unsigned avatarSize, AvatarFileType type); void StoreInTempAvatarData(unsigned playerId, const std::vector &data); @@ -171,6 +172,8 @@ private: PlayerInfoMap m_playerInfoMap; mutable boost::mutex m_playerInfoMapMutex; PlayerIdList m_playerInfoRequestList; + PlayerIdList m_avatarShouldRequestList; + PlayerIdList m_avatarHasRequestedList; unsigned m_curGameId; mutable boost::mutex m_curGameIdMutex; diff --git a/src/net/common/clientstate.cpp b/src/net/common/clientstate.cpp index 1a195520..5dc80755 100644 --- a/src/net/common/clientstate.cpp +++ b/src/net/common/clientstate.cpp @@ -696,6 +696,8 @@ ClientStateWaitGame::InternalProcess(ClientThread &client, boost::shared_ptrSetAvatarFile(avatarFile); + else + client.RetrieveAvatarIfNeeded(netPlayerData.playerId, info); } } else @@ -704,7 +706,7 @@ ClientStateWaitGame::InternalProcess(ClientThread &client, boost::shared_ptr retrieveAvatar(new NetPacketRetrieveAvatar); - NetPacketRetrieveAvatar::Data retrieveAvatarData; - retrieveAvatarData.requestId = id; - retrieveAvatarData.avatar = info.avatar; - static_cast(retrieveAvatar.get())->SetData(retrieveAvatarData); - GetSender().Send(GetContext().GetSessionData(), retrieveAvatar); + m_avatarShouldRequestList.remove(id); + // Retrieve avatar if needed. + RetrieveAvatarIfNeeded(id, info); } // Remove it from the request list. @@ -453,6 +455,7 @@ ClientThread::SetUnknownPlayer(unsigned id) { // Just remove it from the request list. m_playerInfoRequestList.remove(id); + m_avatarShouldRequestList.remove(id); LOG_ERROR("Server reported unknown player id: " << id); } @@ -468,6 +471,24 @@ ClientThread::SetNewGameAdmin(unsigned id) } } +void +ClientThread::RetrieveAvatarIfNeeded(unsigned id, const PlayerInfo &info) +{ + if (find(m_avatarHasRequestedList.begin(), m_avatarHasRequestedList.end(), id) == m_avatarHasRequestedList.end()) + { + if (info.hasAvatar && !info.avatar.IsZero() && !GetAvatarManager().HasAvatar(info.avatar)) + { + m_avatarHasRequestedList.push_back(id); // Never remove from this list. Only request once. + boost::shared_ptr retrieveAvatar(new NetPacketRetrieveAvatar); + NetPacketRetrieveAvatar::Data retrieveAvatarData; + retrieveAvatarData.requestId = id; + retrieveAvatarData.avatar = info.avatar; + static_cast(retrieveAvatar.get())->SetData(retrieveAvatarData); + GetSender().Send(GetContext().GetSessionData(), retrieveAvatar); + } + } +} + void ClientThread::AddTempAvatarData(unsigned playerId, unsigned avatarSize, AvatarFileType type) { @@ -495,7 +516,6 @@ ClientThread::CompleteTempAvatarData(unsigned playerId) AvatarDataMap::iterator pos = m_tempAvatarMap.find(playerId); if (pos == m_tempAvatarMap.end()) throw ClientException(__FILE__, __LINE__, ERR_NET_INVALID_REQUEST_ID, 0); - boost::shared_ptr tmpAvatar = pos->second; unsigned avatarSize = (unsigned)tmpAvatar->fileData.size(); if (avatarSize != tmpAvatar->reportedSize) @@ -511,7 +531,7 @@ ClientThread::CompleteTempAvatarData(unsigned playerId) LOG_ERROR("Failed to store avatar in cache directory."); // Update player info, but never re-request avatar. - SetPlayerInfo(playerId, tmpPlayerInfo, false); + SetPlayerInfo(playerId, tmpPlayerInfo); string fileName; if (GetAvatarManager().GetAvatarFileName(tmpPlayerInfo.avatar, fileName)) diff --git a/src/session.cpp b/src/session.cpp index b3dcd029..a6149086 100755 --- a/src/session.cpp +++ b/src/session.cpp @@ -57,6 +57,9 @@ bool Session::init() { myAvatarManager.reset(new AvatarManager); bool retVal = myAvatarManager->Init(myConfig->readConfigString("AppDataDir"), myConfig->readConfigString("CacheDir")); +#ifndef POKERTH_DEDICATED_SERVER + myAvatarManager->AddSingleAvatar(myConfig->readConfigString("MyAvatar")); +#endif myAvatarManager->RemoveOldAvatarCacheEntries(); return retVal; } diff --git a/src/session.h b/src/session.h index aba32210..e7f24eb1 100755 --- a/src/session.h +++ b/src/session.h @@ -24,7 +24,7 @@ #include "game_defs.h" #include #include -#include +#include class GuiInterface; class Game;