diff --git a/Source/Contents/Emblems/EmblemDataDownloadAsyncWork.cpp b/Source/Contents/Emblems/EmblemDataDownloadAsyncWork.cpp index e4056a78..6bacf519 100644 --- a/Source/Contents/Emblems/EmblemDataDownloadAsyncWork.cpp +++ b/Source/Contents/Emblems/EmblemDataDownloadAsyncWork.cpp @@ -1,5 +1,5 @@ #include "Contents/Emblems/EmblemDataDownloadAsyncWork.h" -#include "Contents/Emblems/EmblemDownload.h" +#include "Contents/Emblems/EmblemDataMgr.h" #include "Network/Http/CURLPostHander.h" #include "Network/TextEncoding.h" #include "Utility/Cipher/XorBytes.h" @@ -128,5 +128,6 @@ bool CEmblemDataDownloadAsyncWork::Execute() { // OFFSET: 0x005EA360 // FUNCTION: fn_03967 void CEmblemDataDownloadAsyncWork::Complete() { - CompleteEmblemDownload(this->m_diagnostic, this->m_responseCode, this->m_response, this->m_guildId, this->m_version, *this->m_connection); + CEmblemDataMgr* emblems = g_emblemDataMgr; + emblems->CompleteDownload(this->m_diagnostic, this->m_responseCode, this->m_response, this->m_guildId, this->m_version); } diff --git a/Source/Contents/Emblems/EmblemDataMgr.h b/Source/Contents/Emblems/EmblemDataMgr.h index c4954df0..c96d3770 100644 --- a/Source/Contents/Emblems/EmblemDataMgr.h +++ b/Source/Contents/Emblems/EmblemDataMgr.h @@ -22,6 +22,7 @@ public: ); bool Upload(std::uint32_t guildId, std::string path); void CompleteUpload(AsyncDiagnostic diagnostic, std::string response, std::uint32_t guildId); + void CompleteDownload(AsyncDiagnostic diagnostic, int responseCode, std::string response, std::uint32_t guildId, std::uint32_t version); protected: /* 0004 */ bool m_enabled; diff --git a/Source/Contents/Emblems/EmblemDownload.cpp b/Source/Contents/Emblems/EmblemDownload.cpp index aecada00..d90b2109 100644 --- a/Source/Contents/Emblems/EmblemDownload.cpp +++ b/Source/Contents/Emblems/EmblemDownload.cpp @@ -5,74 +5,64 @@ #include #include #include +#include namespace { #pragma pack(push, 1) struct EmblemPacket { - std::uint16_t id; - std::uint16_t bytes; - std::uint16_t state; - std::uint32_t guildId; - std::uint32_t version; - unsigned char data[1010]; + /* 0000 */ std::uint16_t id; + /* 0002 */ std::int16_t bytes; + /* 0004 */ std::uint16_t state; + /* 0006 */ std::uint32_t guildId; + /* 000A */ std::uint32_t version; + /* 000E */ unsigned char data[1010]; }; #pragma pack(pop) static_assert(sizeof(EmblemPacket) == 1024); - - struct EmblemPacketAllocation { - std::uint32_t marker; - std::uint32_t unused; - EmblemPacket packet; - }; - static_assert(sizeof(EmblemPacketAllocation) == 1032); } // OFFSET: 0x005EB800 // FUNCTION: fn_03975 -void CompleteEmblemDownload( - AsyncDiagnostic diagnostic, int responseCode, std::string response, std::uint32_t guildId, std::uint32_t version, CConnection& connection -) { +void CEmblemDataMgr::CompleteDownload(AsyncDiagnostic diagnostic, int responseCode, std::string response, std::uint32_t guildId, std::uint32_t version) { if (!diagnostic.success || responseCode != 200) { return; } - auto* storage = static_cast(std::malloc(sizeof(EmblemPacketAllocation))); - - if (!storage) { + auto* packet = static_cast( + _MallocaComputeSize(sizeof(EmblemPacket)) <= _ALLOCA_S_THRESHOLD + ? _MarkAllocaS(_alloca(_MallocaComputeSize(sizeof(EmblemPacket))), _ALLOCA_S_STACK_MARKER) + : _MarkAllocaS(std::malloc(_MallocaComputeSize(sizeof(EmblemPacket))), _ALLOCA_S_HEAP_MARKER) + ); + if (!packet) { return; } - storage->marker = 0xDDDD; - EmblemPacket& packet = storage->packet; - packet.id = 0x0B36; - packet.bytes = 14; - packet.state = 2; - packet.guildId = guildId; - packet.version = version; - connection.Prepend(packet.bytes, &packet); + packet->id = 0x0B36; + packet->bytes = 14; + packet->state = 2; + packet->guildId = guildId; + packet->version = version; + GetRagConnection().Prepend(packet->bytes, packet); + int remaining = static_cast(response.size()); - while (remaining > 0) { - const int bytes = std::min(remaining, 1010); + const int bytes = std::min(1010, remaining); + packet->id = 0x0B36; + packet->state = 1; + packet->bytes = static_cast(bytes + 14); + packet->guildId = guildId; + packet->version = version; + memcpy_s(packet->data, packet->bytes - 14, response.substr(remaining - bytes, remaining).c_str(), bytes); + GetRagConnection().Prepend(packet->bytes, packet); remaining -= bytes; - packet.id = 0x0B36; - packet.bytes = static_cast(bytes + 14); - packet.state = 1; - packet.guildId = guildId; - packet.version = version; - - std::memcpy(packet.data, response.data() + remaining, bytes); - connection.Prepend(packet.bytes, &packet); } - packet.id = 0x0B36; - packet.bytes = 14; - packet.state = 0; - packet.guildId = guildId; - packet.version = version; - connection.Prepend(packet.bytes, &packet); + packet->id = 0x0B36; + packet->bytes = 14; + packet->state = 0; + packet->guildId = guildId; + packet->version = version; + GetRagConnection().Prepend(packet->bytes, packet); - if (storage->marker == 0xDDDD) { - std::free(storage); - } + _freea(packet); } diff --git a/Source/Contents/Emblems/EmblemDownload.h b/Source/Contents/Emblems/EmblemDownload.h index 730e640a..9c74b876 100644 --- a/Source/Contents/Emblems/EmblemDownload.h +++ b/Source/Contents/Emblems/EmblemDownload.h @@ -1,14 +1,6 @@ #ifndef RAGNAROK_SOURCE_CONTENTS_EMBLEMS_EMBLEMDOWNLOAD_H #define RAGNAROK_SOURCE_CONTENTS_EMBLEMS_EMBLEMDOWNLOAD_H -#include -#include - -class CConnection; -struct AsyncDiagnostic; - -void CompleteEmblemDownload( - AsyncDiagnostic diagnostic, int responseCode, std::string response, std::uint32_t guildId, std::uint32_t version, CConnection& connection -); +#include "Contents/Emblems/EmblemDataMgr.h" #endif