Detect avatar file type for download. Not fully working yet.
This commit is contained in:
@@ -332,6 +332,7 @@ Server Reply: Player Info
|
|||||||
Player Flags:
|
Player Flags:
|
||||||
0x01 set: Player is human
|
0x01 set: Player is human
|
||||||
0x02 set: Player has avatar
|
0x02 set: Player has avatar
|
||||||
|
0x04/0x08 set: Avatar type
|
||||||
|
|
||||||
|
|
||||||
Server Reply: Unknown Player Id
|
Server Reply: Unknown Player Id
|
||||||
|
|||||||
@@ -53,6 +53,8 @@ public:
|
|||||||
static unsigned ChunkReadAvatarFile(boost::shared_ptr<AvatarFileState> fileState, unsigned char *data, unsigned chunkSize);
|
static unsigned ChunkReadAvatarFile(boost::shared_ptr<AvatarFileState> fileState, unsigned char *data, unsigned chunkSize);
|
||||||
|
|
||||||
static int AvatarFileToNetPackets(const std::string &fileName, unsigned requestId, NetPacketList &packets);
|
static int AvatarFileToNetPackets(const std::string &fileName, unsigned requestId, NetPacketList &packets);
|
||||||
|
static AvatarFileType GetAvatarFileType(const std::string &fileName);
|
||||||
|
static std::string GetAvatarFileExtension(AvatarFileType fileType);
|
||||||
|
|
||||||
bool GetHashForAvatar(const std::string &fileName, MD5Buf &md5buf) const;
|
bool GetHashForAvatar(const std::string &fileName, MD5Buf &md5buf) const;
|
||||||
bool GetAvatarFileName(const MD5Buf &md5buf, std::string &fileName) const;
|
bool GetAvatarFileName(const MD5Buf &md5buf, std::string &fileName) const;
|
||||||
|
|||||||
@@ -129,18 +129,10 @@ boost::shared_ptr<AvatarFileState>
|
|||||||
AvatarManager::OpenAvatarFileForChunkRead(const std::string &fileName, unsigned &outFileSize, AvatarFileType &outFileType)
|
AvatarManager::OpenAvatarFileForChunkRead(const std::string &fileName, unsigned &outFileSize, AvatarFileType &outFileType)
|
||||||
{
|
{
|
||||||
outFileSize = 0;
|
outFileSize = 0;
|
||||||
outFileType = AVATAR_FILE_TYPE_UNKNOWN;
|
|
||||||
boost::shared_ptr<AvatarFileState> retVal;
|
boost::shared_ptr<AvatarFileState> retVal;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
path filePath(fileName);
|
outFileType = GetAvatarFileType(fileName);
|
||||||
string ext(extension(filePath));
|
|
||||||
if (boost::algorithm::iequals(ext, ".png"))
|
|
||||||
outFileType = AVATAR_FILE_TYPE_PNG;
|
|
||||||
else if (boost::algorithm::iequals(ext, ".jpg") || boost::algorithm::iequals(ext, ".jpeg"))
|
|
||||||
outFileType = AVATAR_FILE_TYPE_JPG;
|
|
||||||
else if (boost::algorithm::iequals(ext, ".gif"))
|
|
||||||
outFileType = AVATAR_FILE_TYPE_GIF;
|
|
||||||
boost::shared_ptr<AvatarFileState> fileState(new AvatarFileState);
|
boost::shared_ptr<AvatarFileState> fileState(new AvatarFileState);
|
||||||
fileState->inputStream.open(fileName.c_str(), ios_base::in | ios_base::binary);
|
fileState->inputStream.open(fileName.c_str(), ios_base::in | ios_base::binary);
|
||||||
if (!fileState->inputStream.fail())
|
if (!fileState->inputStream.fail())
|
||||||
@@ -243,6 +235,46 @@ AvatarManager::AvatarFileToNetPackets(const string &fileName, unsigned requestId
|
|||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AvatarFileType
|
||||||
|
AvatarManager::GetAvatarFileType(const string &fileName)
|
||||||
|
{
|
||||||
|
AvatarFileType fileType;
|
||||||
|
|
||||||
|
path filePath(fileName);
|
||||||
|
string ext(extension(filePath));
|
||||||
|
if (boost::algorithm::iequals(ext, ".png"))
|
||||||
|
fileType = AVATAR_FILE_TYPE_PNG;
|
||||||
|
else if (boost::algorithm::iequals(ext, ".jpg") || boost::algorithm::iequals(ext, ".jpeg"))
|
||||||
|
fileType = AVATAR_FILE_TYPE_JPG;
|
||||||
|
else if (boost::algorithm::iequals(ext, ".gif"))
|
||||||
|
fileType = AVATAR_FILE_TYPE_GIF;
|
||||||
|
else
|
||||||
|
fileType = AVATAR_FILE_TYPE_UNKNOWN;
|
||||||
|
|
||||||
|
return fileType;
|
||||||
|
}
|
||||||
|
|
||||||
|
string
|
||||||
|
AvatarManager::GetAvatarFileExtension(AvatarFileType fileType)
|
||||||
|
{
|
||||||
|
string ext;
|
||||||
|
switch (fileType)
|
||||||
|
{
|
||||||
|
case AVATAR_FILE_TYPE_PNG:
|
||||||
|
ext = ".png";
|
||||||
|
break;
|
||||||
|
case AVATAR_FILE_TYPE_JPG:
|
||||||
|
ext = ".jpg";
|
||||||
|
break;
|
||||||
|
case AVATAR_FILE_TYPE_GIF:
|
||||||
|
ext = ".gif";
|
||||||
|
break;
|
||||||
|
case AVATAR_FILE_TYPE_UNKNOWN:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return ext;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
AvatarManager::GetHashForAvatar(const std::string &fileName, MD5Buf &md5buf) const
|
AvatarManager::GetHashForAvatar(const std::string &fileName, MD5Buf &md5buf) const
|
||||||
{
|
{
|
||||||
@@ -337,21 +369,7 @@ AvatarManager::StoreAvatarInCache(const MD5Buf &md5buf, AvatarFileType avatarFil
|
|||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
string ext;
|
string ext(GetAvatarFileExtension(avatarFileType));
|
||||||
switch (avatarFileType)
|
|
||||||
{
|
|
||||||
case AVATAR_FILE_TYPE_PNG:
|
|
||||||
ext = ".png";
|
|
||||||
break;
|
|
||||||
case AVATAR_FILE_TYPE_JPG:
|
|
||||||
ext = ".jpg";
|
|
||||||
break;
|
|
||||||
case AVATAR_FILE_TYPE_GIF:
|
|
||||||
ext = ".gif";
|
|
||||||
break;
|
|
||||||
case AVATAR_FILE_TYPE_UNKNOWN:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!ext.empty() && !cacheDir.empty())
|
if (!ext.empty() && !cacheDir.empty())
|
||||||
{
|
{
|
||||||
// Check header before storing file.
|
// Check header before storing file.
|
||||||
|
|||||||
@@ -557,7 +557,7 @@ ClientThread::RetrieveAvatarIfNeeded(unsigned id, const PlayerInfo &info)
|
|||||||
string avatarServerAddress(GetContext().GetAvatarServerAddr());
|
string avatarServerAddress(GetContext().GetAvatarServerAddr());
|
||||||
if (!avatarServerAddress.empty() && m_avatarDownloader)
|
if (!avatarServerAddress.empty() && m_avatarDownloader)
|
||||||
{
|
{
|
||||||
string serverFileName(info.avatar.ToString() + ".jpg"); // TODO!
|
string serverFileName(info.avatar.ToString() + AvatarManager::GetAvatarFileExtension(info.avatarType));
|
||||||
m_avatarDownloader->QueueDownload(
|
m_avatarDownloader->QueueDownload(
|
||||||
id, avatarServerAddress + serverFileName, GetContext().GetCacheDir() + TEMP_AVATAR_FILENAME);
|
id, avatarServerAddress + serverFileName, GetContext().GetCacheDir() + TEMP_AVATAR_FILENAME);
|
||||||
}
|
}
|
||||||
@@ -621,7 +621,7 @@ ClientThread::PassAvatarDataToManager(unsigned playerId, boost::shared_ptr<Avata
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (avatarData->fileType == AVATAR_FILE_TYPE_UNKNOWN)
|
if (avatarData->fileType == AVATAR_FILE_TYPE_UNKNOWN)
|
||||||
avatarData->fileType = AVATAR_FILE_TYPE_JPG; // TODO!
|
avatarData->fileType = tmpPlayerInfo.avatarType;
|
||||||
if (!GetAvatarManager().StoreAvatarInCache(tmpPlayerInfo.avatar, avatarData->fileType, &avatarData->fileData[0], avatarData->reportedSize, false))
|
if (!GetAvatarManager().StoreAvatarInCache(tmpPlayerInfo.avatar, avatarData->fileType, &avatarData->fileData[0], avatarData->reportedSize, false))
|
||||||
LOG_ERROR("Failed to store avatar in cache directory.");
|
LOG_ERROR("Failed to store avatar in cache directory.");
|
||||||
|
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ using namespace std;
|
|||||||
|
|
||||||
#define NET_PLAYER_FLAG_HUMAN 0x01
|
#define NET_PLAYER_FLAG_HUMAN 0x01
|
||||||
#define NET_PLAYER_FLAG_HAS_AVATAR 0x02
|
#define NET_PLAYER_FLAG_HAS_AVATAR 0x02
|
||||||
|
#define NET_PLAYER_FLAG_AVATAR_TYPE_MASK 0x0c
|
||||||
|
|
||||||
#define NET_START_FLAG_FILL_WITH_CPU_PLAYERS 0x01
|
#define NET_START_FLAG_FILL_WITH_CPU_PLAYERS 0x01
|
||||||
|
|
||||||
@@ -2454,6 +2455,7 @@ NetPacketPlayerInfo::SetData(const NetPacketPlayerInfo::Data &inData)
|
|||||||
if (inData.playerInfo.hasAvatar)
|
if (inData.playerInfo.hasAvatar)
|
||||||
{
|
{
|
||||||
tmpPlayerFlags |= NET_PLAYER_FLAG_HAS_AVATAR;
|
tmpPlayerFlags |= NET_PLAYER_FLAG_HAS_AVATAR;
|
||||||
|
tmpPlayerFlags |= ((inData.playerInfo.avatarType) << 2);
|
||||||
char *avatarPtr = (char *)tmpData + sizeof(NetPacketPlayerInfoData);
|
char *avatarPtr = (char *)tmpData + sizeof(NetPacketPlayerInfoData);
|
||||||
memcpy(avatarPtr, inData.playerInfo.avatar.data, MD5_DATA_SIZE);
|
memcpy(avatarPtr, inData.playerInfo.avatar.data, MD5_DATA_SIZE);
|
||||||
}
|
}
|
||||||
@@ -2479,6 +2481,21 @@ NetPacketPlayerInfo::GetData(NetPacketPlayerInfo::Data &outData) const
|
|||||||
|
|
||||||
if (outData.playerInfo.hasAvatar)
|
if (outData.playerInfo.hasAvatar)
|
||||||
{
|
{
|
||||||
|
switch ((tmpPlayerFlags & NET_PLAYER_FLAG_AVATAR_TYPE_MASK) >> 2)
|
||||||
|
{
|
||||||
|
case AVATAR_FILE_TYPE_PNG :
|
||||||
|
outData.playerInfo.avatarType = AVATAR_FILE_TYPE_PNG;
|
||||||
|
break;
|
||||||
|
case AVATAR_FILE_TYPE_JPG :
|
||||||
|
outData.playerInfo.avatarType = AVATAR_FILE_TYPE_JPG;
|
||||||
|
break;
|
||||||
|
case AVATAR_FILE_TYPE_GIF :
|
||||||
|
outData.playerInfo.avatarType = AVATAR_FILE_TYPE_GIF;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
outData.playerInfo.avatarType = AVATAR_FILE_TYPE_UNKNOWN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
char *avatarPtr = (char *)tmpData + sizeof(NetPacketPlayerInfoData);
|
char *avatarPtr = (char *)tmpData + sizeof(NetPacketPlayerInfoData);
|
||||||
memcpy(outData.playerInfo.avatar.data, avatarPtr, MD5_DATA_SIZE);
|
memcpy(outData.playerInfo.avatar.data, avatarPtr, MD5_DATA_SIZE);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -523,9 +523,10 @@ ServerLobbyThread::HandleNetPacketInit(SessionWrapper session, const NetPacketIn
|
|||||||
m_sessionManager.SetSessionPlayerData(session.sessionData->GetId(), tmpPlayerData);
|
m_sessionManager.SetSessionPlayerData(session.sessionData->GetId(), tmpPlayerData);
|
||||||
session.playerData = tmpPlayerData;
|
session.playerData = tmpPlayerData;
|
||||||
|
|
||||||
|
string avatarFileName;
|
||||||
if (initData.showAvatar
|
if (initData.showAvatar
|
||||||
&& !initData.avatar.IsZero()
|
&& !initData.avatar.IsZero()
|
||||||
&& !GetAvatarManager().HasAvatar(initData.avatar))
|
&& !GetAvatarManager().GetAvatarFileName(initData.avatar, avatarFileName))
|
||||||
{
|
{
|
||||||
bool avatarRecentlyRequested = false;
|
bool avatarRecentlyRequested = false;
|
||||||
{
|
{
|
||||||
@@ -540,6 +541,8 @@ ServerLobbyThread::HandleNetPacketInit(SessionWrapper session, const NetPacketIn
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (!avatarFileName.empty())
|
||||||
|
session.playerData->SetAvatarFile(avatarFileName);
|
||||||
EstablishSession(session);
|
EstablishSession(session);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -619,6 +622,10 @@ ServerLobbyThread::HandleNetPacketAvatarEnd(SessionWrapper session, const NetPac
|
|||||||
|
|
||||||
// Free memory.
|
// Free memory.
|
||||||
session.playerData->SetNetAvatarData(boost::shared_ptr<AvatarData>());
|
session.playerData->SetNetAvatarData(boost::shared_ptr<AvatarData>());
|
||||||
|
// Set avatar file name.
|
||||||
|
string avatarFileName;
|
||||||
|
if (GetAvatarManager().GetAvatarFileName(avatarMD5, avatarFileName))
|
||||||
|
session.playerData->SetAvatarFile(avatarFileName);
|
||||||
// Init finished - start session.
|
// Init finished - start session.
|
||||||
EstablishSession(session);
|
EstablishSession(session);
|
||||||
}
|
}
|
||||||
@@ -656,7 +663,10 @@ ServerLobbyThread::HandleNetPacketRetrievePlayerInfo(SessionWrapper session, con
|
|||||||
infoData.playerInfo.playerName = tmpPlayer->GetName();
|
infoData.playerInfo.playerName = tmpPlayer->GetName();
|
||||||
infoData.playerInfo.hasAvatar = !tmpPlayer->GetAvatarMD5().IsZero();
|
infoData.playerInfo.hasAvatar = !tmpPlayer->GetAvatarMD5().IsZero();
|
||||||
if (infoData.playerInfo.hasAvatar)
|
if (infoData.playerInfo.hasAvatar)
|
||||||
|
{
|
||||||
infoData.playerInfo.avatar = tmpPlayer->GetAvatarMD5();
|
infoData.playerInfo.avatar = tmpPlayer->GetAvatarMD5();
|
||||||
|
infoData.playerInfo.avatarType = AvatarManager::GetAvatarFileType(tmpPlayer->GetAvatarFile());
|
||||||
|
}
|
||||||
static_cast<NetPacketPlayerInfo *>(info.get())->SetData(infoData);
|
static_cast<NetPacketPlayerInfo *>(info.get())->SetData(infoData);
|
||||||
session.sessionData->GetSender().Send(session.sessionData, info);
|
session.sessionData->GetSender().Send(session.sessionData, info);
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -61,11 +61,12 @@ struct AvatarData
|
|||||||
|
|
||||||
struct PlayerInfo
|
struct PlayerInfo
|
||||||
{
|
{
|
||||||
PlayerInfo() : ptype(PLAYER_TYPE_HUMAN) {}
|
PlayerInfo() : ptype(PLAYER_TYPE_HUMAN), hasAvatar(false), avatarType(AVATAR_FILE_TYPE_UNKNOWN) {}
|
||||||
std::string playerName;
|
std::string playerName;
|
||||||
PlayerType ptype;
|
PlayerType ptype;
|
||||||
bool hasAvatar;
|
bool hasAvatar;
|
||||||
MD5Buf avatar;
|
MD5Buf avatar;
|
||||||
|
AvatarFileType avatarType;
|
||||||
};
|
};
|
||||||
|
|
||||||
class PlayerData
|
class PlayerData
|
||||||
|
|||||||
Reference in New Issue
Block a user