More work to let clients download avatars from an external server.
This commit is contained in:
@@ -106,8 +106,11 @@ protected:
|
|||||||
void AddTempAvatarData(unsigned playerId, unsigned avatarSize, AvatarFileType type);
|
void AddTempAvatarData(unsigned playerId, unsigned avatarSize, AvatarFileType type);
|
||||||
void StoreInTempAvatarData(unsigned playerId, const std::vector<unsigned char> &data);
|
void StoreInTempAvatarData(unsigned playerId, const std::vector<unsigned char> &data);
|
||||||
void CompleteTempAvatarData(unsigned playerId);
|
void CompleteTempAvatarData(unsigned playerId);
|
||||||
|
void PassAvatarDataToManager(unsigned playerId, boost::shared_ptr<AvatarData> avatarData);
|
||||||
void SetUnknownAvatar(unsigned playerId);
|
void SetUnknownAvatar(unsigned playerId);
|
||||||
|
|
||||||
|
void CheckAvatarDownloads();
|
||||||
|
|
||||||
void UnsubscribeLobbyMsg();
|
void UnsubscribeLobbyMsg();
|
||||||
void ResubscribeLobbyMsg();
|
void ResubscribeLobbyMsg();
|
||||||
|
|
||||||
|
|||||||
@@ -658,7 +658,10 @@ AbstractClientStateReceiving::Process(ClientThread &client)
|
|||||||
{
|
{
|
||||||
int retVal = MSG_SOCK_INTERNAL_PENDING;
|
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 =
|
boost::shared_ptr<NetPacket> tmpPacket =
|
||||||
client.GetReceiver().Recv(client.GetContext().GetSocket(), client.GetContext().GetReceiveBuffer());
|
client.GetReceiver().Recv(client.GetContext().GetSocket(), client.GetContext().GetReceiveBuffer());
|
||||||
|
|
||||||
|
|||||||
@@ -612,30 +612,37 @@ ClientThread::CompleteTempAvatarData(unsigned playerId)
|
|||||||
if (avatarSize != tmpAvatar->reportedSize)
|
if (avatarSize != tmpAvatar->reportedSize)
|
||||||
LOG_ERROR("Client received invalid avatar file size!");
|
LOG_ERROR("Client received invalid avatar file size!");
|
||||||
else
|
else
|
||||||
{
|
PassAvatarDataToManager(playerId, tmpAvatar);
|
||||||
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.");
|
|
||||||
|
|
||||||
// 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.
|
// Free memory.
|
||||||
m_tempAvatarMap.erase(pos);
|
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
|
void
|
||||||
ClientThread::SetUnknownAvatar(unsigned playerId)
|
ClientThread::SetUnknownAvatar(unsigned playerId)
|
||||||
{
|
{
|
||||||
@@ -643,6 +650,19 @@ ClientThread::SetUnknownAvatar(unsigned playerId)
|
|||||||
LOG_ERROR("Server reported unknown avatar for player: " << 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
|
void
|
||||||
ClientThread::UnsubscribeLobbyMsg()
|
ClientThread::UnsubscribeLobbyMsg()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -50,7 +50,14 @@ DownloaderThread::QueueDownload(unsigned downloadId, const std::string &url, con
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
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;
|
bool result = false;
|
||||||
boost::mutex::scoped_lock lock(m_downloadDoneQueueMutex);
|
boost::mutex::scoped_lock lock(m_downloadDoneQueueMutex);
|
||||||
|
|||||||
@@ -38,7 +38,8 @@ public:
|
|||||||
virtual ~DownloaderThread();
|
virtual ~DownloaderThread();
|
||||||
|
|
||||||
void QueueDownload(unsigned downloadId, const std::string &url, const std::string &filename);
|
void QueueDownload(unsigned downloadId, const std::string &url, const std::string &filename);
|
||||||
bool PollDownloadResult(unsigned &downloadId, std::vector<unsigned char> &filedata);
|
bool HasDownloadResult() const;
|
||||||
|
bool GetDownloadResult(unsigned &downloadId, std::vector<unsigned char> &filedata);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
struct DownloadData
|
struct DownloadData
|
||||||
|
|||||||
Reference in New Issue
Block a user