Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit cb90339

Browse files
Make server resource file checksumming code memory-efficient (PR #3924)
1 parent e0ce8b6 commit cb90339

File tree

4 files changed

+14
-16
lines changed

4 files changed

+14
-16
lines changed

‎Client/mods/deathmatch/logic/CResource.cpp‎

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -317,10 +317,7 @@ void CResource::Load()
317317
else if (pResourceFile->IsAutoDownload())
318318
{
319319
// Check the file contents
320-
if (CChecksum::GenerateChecksumFromFileUnsafe(pResourceFile->GetName()) == pResourceFile->GetServerChecksum())
321-
{
322-
}
323-
else
320+
if (CChecksum::GenerateChecksumFromFileUnsafe(pResourceFile->GetName()) != pResourceFile->GetServerChecksum())
324321
{
325322
HandleDownloadedFileTrouble(pResourceFile, false);
326323
}

‎Server/mods/deathmatch/logic/CResource.cpp‎

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -510,13 +510,14 @@ std::future<SString> CResource::GenerateChecksumForFile(CResourceFile* pResource
510510
if (!GetFilePath(pResourceFile->GetName(), strPath))
511511
return SString();
512512

513-
std::vector<char> buffer;
514-
FileLoad(strPath, buffer);
515-
uint uiFileSize = buffer.size();
516-
const char* pFileContents = uiFileSize ? buffer.data() : "";
517-
CChecksum Checksum = CChecksum::GenerateChecksumFromBuffer(pFileContents, uiFileSize);
518-
pResourceFile->SetLastChecksum(Checksum);
519-
pResourceFile->SetLastFileSize(uiFileSize);
513+
auto checksumOrError = CChecksum::GenerateChecksumFromFile(strPath);
514+
if (std::holds_alternative<std::string>(checksumOrError))
515+
{
516+
return SString(std::get<std::string>(checksumOrError));
517+
}
518+
519+
pResourceFile->SetLastChecksum(std::get<CChecksum>(checksumOrError));
520+
pResourceFile->SetLastFileSizeHint(FileSize(strPath));
520521

521522
// Check if file is blocked
522523
char szHashResult[33];
@@ -547,7 +548,7 @@ std::future<SString> CResource::GenerateChecksumForFile(CResourceFile* pResource
547548

548549
if (pResourceFile->GetLastChecksum() != cachedChecksum)
549550
{
550-
if (!FileSave(strCachedFilePath, pFileContents, uiFileSize))
551+
if (!FileCopy(strPath, strCachedFilePath))
551552
{
552553
return SString("Could not copy '%s' to '%s'\n", *strPath, *strCachedFilePath);
553554
}

‎Server/mods/deathmatch/logic/CResourceFile.h‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class CResourceFile
4545
eResourceType m_type;
4646
class CLuaMain* m_pVM;
4747
CChecksum m_checksum; // Checksum last time this was loaded, generated by GenerateChecksum()
48-
uint m_uiFileSize;
48+
uint m_uiFileSizeHint;
4949
map<string, string> m_attributeMap; // Map of attributes from the meta.xml file
5050

5151
public:
@@ -65,9 +65,9 @@ class CResourceFile
6565

6666
CChecksum GetLastChecksum() { return m_checksum; }
6767
void SetLastChecksum(CChecksum checksum) { m_checksum = checksum; }
68-
void SetLastFileSize(uint uiFileSize) { m_uiFileSize = uiFileSize; }
68+
void SetLastFileSizeHint(uint uiFileSizeHint) { m_uiFileSizeHint = uiFileSizeHint; }
6969

70-
doubleGetApproxSize() { return m_uiFileSize; } // Only used by download counters
70+
uint GetSizeHint() { return m_uiFileSizeHint; } // Only used by download counters
7171
string GetMetaFileAttribute(const string& key) { return m_attributeMap[key]; }
7272
SString GetCachedPathFilename(bool bForceClientCachePath = false);
7373
};

‎Server/mods/deathmatch/logic/packets/CResourceStartPacket.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ bool CResourceStartPacket::Write(NetBitStreamInterface& BitStream) const
115115
CChecksum checksum = (*iter)->GetLastChecksum();
116116
BitStream.Write(checksum.ulCRC);
117117
BitStream.Write((const char*)checksum.md5.data, sizeof(checksum.md5.data));
118-
BitStream.Write((*iter)->GetApproxSize());
118+
BitStream.Write((double)(*iter)->GetSizeHint());// Has to be double for bitstream format compatibility
119119
if ((*iter)->GetType() == CResourceScriptItem::RESOURCE_FILE_TYPE_CLIENT_FILE)
120120
{
121121
CResourceClientFileItem* pRCFItem = reinterpret_cast<CResourceClientFileItem*>(*iter);

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /