From c3dc770c2e5eff7150ae2dffa716a4ee3596a6ae Mon Sep 17 00:00:00 2001 From: lotodore Date: Sat, 21 Mar 2009 11:36:10 +0000 Subject: [PATCH] More work to let clients download avatars from an external server. --- src/net/clientthread.h | 3 ++ src/net/common/clientstate.cpp | 5 ++- src/net/common/clientthread.cpp | 58 +++++++++++++++++++---------- src/net/common/downloaderthread.cpp | 9 ++++- src/net/downloaderthread.h | 3 +- 5 files changed, 56 insertions(+), 22 deletions(-) diff --git a/src/net/clientthread.h b/src/net/clientthread.h index 87cf2650..219adc36 100644 --- a/src/net/clientthread.h +++ b/src/net/clientthread.h @@ -106,8 +106,11 @@ protected: void AddTempAvatarData(unsigned playerId, unsigned avatarSize, AvatarFileType type); void StoreInTempAvatarData(unsigned playerId, const std::vector &data); void CompleteTempAvatarData(unsigned playerId); + void PassAvatarDataToManager(unsigned playerId, boost::shared_ptr avatarData); void SetUnknownAvatar(unsigned playerId); + void CheckAvatarDownloads(); + void UnsubscribeLobbyMsg(); void ResubscribeLobbyMsg(); diff --git a/src/net/common/clientstate.cpp b/src/net/common/clientstate.cpp index ce094f39..43c1b655 100644 --- a/src/net/common/clientstate.cpp +++ b/src/net/common/clientstate.cpp @@ -658,7 +658,10 @@ AbstractClientStateReceiving::Process(ClientThread &client) { int retVal = MSG_SOCK_INTERNAL_PENDING; - // delegate to receiver helper class + // Check for avatar downloads. + client.CheckAvatarDownloads(); + + // Delegate to receiver helper class. boost::shared_ptr tmpPacket = client.GetReceiver().Recv(client.GetContext().GetSocket(), client.GetContext().GetReceiveBuffer()); diff --git a/src/net/common/clientthread.cpp b/src/net/common/clientthread.cpp index ab792b9d..6f4ff8a4 100644 --- a/src/net/common/clientthread.cpp +++ b/src/net/common/clientthread.cpp @@ -612,30 +612,37 @@ ClientThread::CompleteTempAvatarData(unsigned playerId) if (avatarSize != tmpAvatar->reportedSize) LOG_ERROR("Client received invalid avatar file size!"); else - { - PlayerInfo tmpPlayerInfo; - if (!GetCachedPlayerInfo(playerId, tmpPlayerInfo)) - LOG_ERROR("Client received invalid player id!"); - else - { - if (!GetAvatarManager().StoreAvatarInCache(tmpPlayerInfo.avatar, tmpAvatar->fileType, &tmpAvatar->fileData[0], avatarSize, false)) - LOG_ERROR("Failed to store avatar in cache directory."); + PassAvatarDataToManager(playerId, tmpAvatar); - // Update player info, but never re-request avatar. - SetPlayerInfo(playerId, tmpPlayerInfo); - - string fileName; - if (GetAvatarManager().GetAvatarFileName(tmpPlayerInfo.avatar, fileName)) - { - // Dynamically update avatar in GUI. - GetGui().setPlayerAvatar(playerId, GetQtToolsInterface().stringToUtf8(fileName)); - } - } - } // Free memory. m_tempAvatarMap.erase(pos); } +void +ClientThread::PassAvatarDataToManager(unsigned playerId, boost::shared_ptr avatarData) +{ + PlayerInfo tmpPlayerInfo; + if (!GetCachedPlayerInfo(playerId, tmpPlayerInfo)) + LOG_ERROR("Client received invalid player id!"); + else + { + if (avatarData->fileType == AVATAR_FILE_TYPE_UNKNOWN) + avatarData->fileType = AVATAR_FILE_TYPE_PNG; // TODO! + if (!GetAvatarManager().StoreAvatarInCache(tmpPlayerInfo.avatar, avatarData->fileType, &avatarData->fileData[0], avatarData->reportedSize, false)) + LOG_ERROR("Failed to store avatar in cache directory."); + + // Update player info, but never re-request avatar. + SetPlayerInfo(playerId, tmpPlayerInfo); + + string fileName; + if (GetAvatarManager().GetAvatarFileName(tmpPlayerInfo.avatar, fileName)) + { + // Dynamically update avatar in GUI. + GetGui().setPlayerAvatar(playerId, GetQtToolsInterface().stringToUtf8(fileName)); + } + } +} + void ClientThread::SetUnknownAvatar(unsigned playerId) { @@ -643,6 +650,19 @@ ClientThread::SetUnknownAvatar(unsigned playerId) LOG_ERROR("Server reported unknown avatar for player: " << playerId); } +void +ClientThread::CheckAvatarDownloads() +{ + if (m_avatarDownloader && m_avatarDownloader->HasDownloadResult()) + { + unsigned playerId; + boost::shared_ptr tmpAvatar(new AvatarData); + m_avatarDownloader->GetDownloadResult(playerId, tmpAvatar->fileData); + tmpAvatar->reportedSize = tmpAvatar->fileData.size(); + PassAvatarDataToManager(playerId, tmpAvatar); + } +} + void ClientThread::UnsubscribeLobbyMsg() { diff --git a/src/net/common/downloaderthread.cpp b/src/net/common/downloaderthread.cpp index ffd6d2a2..573284bc 100644 --- a/src/net/common/downloaderthread.cpp +++ b/src/net/common/downloaderthread.cpp @@ -50,7 +50,14 @@ DownloaderThread::QueueDownload(unsigned downloadId, const std::string &url, con } bool -DownloaderThread::PollDownloadResult(unsigned &downloadId, std::vector &filedata) +DownloaderThread::HasDownloadResult() const +{ + boost::mutex::scoped_lock lock(m_downloadDoneQueueMutex); + return !m_downloadDoneQueue.empty(); +} + +bool +DownloaderThread::GetDownloadResult(unsigned &downloadId, std::vector &filedata) { bool result = false; boost::mutex::scoped_lock lock(m_downloadDoneQueueMutex); diff --git a/src/net/downloaderthread.h b/src/net/downloaderthread.h index c26b753e..c1fa2e51 100644 --- a/src/net/downloaderthread.h +++ b/src/net/downloaderthread.h @@ -38,7 +38,8 @@ public: virtual ~DownloaderThread(); void QueueDownload(unsigned downloadId, const std::string &url, const std::string &filename); - bool PollDownloadResult(unsigned &downloadId, std::vector &filedata); + bool HasDownloadResult() const; + bool GetDownloadResult(unsigned &downloadId, std::vector &filedata); protected: struct DownloadData