feat(object): implement ObjectCompressedUpdateHandler

This commit is contained in:
fallenoak 2026-01-08 22:06:16 -06:00
parent 424b2c5227
commit 7db0561473
No known key found for this signature in database
GPG Key ID: 7628F8E61AEA070D

View File

@ -1,9 +1,62 @@
#include "object/client/MessageHandlers.hpp" #include "object/client/MessageHandlers.hpp"
#include "util/Unimplemented.hpp" #include "util/Unimplemented.hpp"
#include "util/Zlib.hpp"
#include <common/DataStore.hpp> #include <common/DataStore.hpp>
#include <storm/Error.hpp>
#include <storm/Memory.hpp>
int32_t ObjectCompressedUpdateHandler(void* param, NETMESSAGE msgId, uint32_t time, CDataStore* msg) { int32_t ObjectCompressedUpdateHandler(void* param, NETMESSAGE msgId, uint32_t time, CDataStore* msg) {
WHOA_UNIMPLEMENTED(0); uint32_t origSize;
msg->Get(origSize);
uint32_t sourceSize = msg->Size() - msg->Tell();
void* source;
msg->GetDataInSitu(source, sourceSize);
void* buffer;
bool bufferOnStack;
// Stack allocate buffer if original size is less than 8KB
if (origSize >= 8192) {
buffer = STORM_ALLOC(origSize);
bufferOnStack = false;
} else {
buffer = alloca(origSize);
bufferOnStack = true;
}
auto dest = buffer;
auto destSize = origSize;
auto zlibResult = ZlibDecompress(dest, &destSize, source, sourceSize);
// Error during decompression
if (zlibResult != 0) {
if (!bufferOnStack) {
STORM_FREE(buffer);
}
return 0;
}
// Successful decompression
STORM_ASSERT(origSize == destSize);
// TODO WDataStore
CDataStore decompMsg;
decompMsg.PutData(dest, destSize);
decompMsg.Finalize();
int32_t result = ObjectUpdateHandler(nullptr, SMSG_UPDATE_OBJECT, time, &decompMsg);
if (!bufferOnStack) {
STORM_FREE(buffer);
}
return result;
} }
int32_t ObjectUpdateHandler(void* param, NETMESSAGE msgId, uint32_t time, CDataStore* msg) { int32_t ObjectUpdateHandler(void* param, NETMESSAGE msgId, uint32_t time, CDataStore* msg) {