More work to let clients download avatars from an external server.

This commit is contained in:
lotodore
2009-03-21 11:36:10 +00:00
parent 55a29f9a38
commit c3dc770c2e
5 changed files with 56 additions and 22 deletions
+4 -1
View File
@@ -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<NetPacket> tmpPacket =
client.GetReceiver().Recv(client.GetContext().GetSocket(), client.GetContext().GetReceiveBuffer());
+39 -19
View File
@@ -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> 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<AvatarData> tmpAvatar(new AvatarData);
m_avatarDownloader->GetDownloadResult(playerId, tmpAvatar->fileData);
tmpAvatar->reportedSize = tmpAvatar->fileData.size();
PassAvatarDataToManager(playerId, tmpAvatar);
}
}
void
ClientThread::UnsubscribeLobbyMsg()
{
+8 -1
View File
@@ -50,7 +50,14 @@ DownloaderThread::QueueDownload(unsigned downloadId, const std::string &url, con
}
bool
DownloaderThread::PollDownloadResult(unsigned &downloadId, std::vector<unsigned char> &filedata)
DownloaderThread::HasDownloadResult() const
{
boost::mutex::scoped_lock lock(m_downloadDoneQueueMutex);
return !m_downloadDoneQueue.empty();
}
bool
DownloaderThread::GetDownloadResult(unsigned &downloadId, std::vector<unsigned char> &filedata)
{
bool result = false;
boost::mutex::scoped_lock lock(m_downloadDoneQueueMutex);