#pragma once #include "Amf3.h" #include "BitStream.h" #include #include #include class AMFDeserialize { public: // Most entries one array may hold, in each of its dense and associative parts. static constexpr uint32_t MaxArraySize = 10'000; // Deepest nesting of arrays allowed. Client UI messages nest a handful of levels. static constexpr uint32_t MaxDepth = 32; // Most values one deserializer will read over its lifetime. static constexpr uint32_t MaxValues = 100'000; /** * Read an AMF3 value from a bitstream. * * @param inStream inStream to read value from. * @return Returns an AMFValue with all the information from the bitStream in it. */ std::unique_ptr Read(RakNet::BitStream& inStream); private: /** * @brief Private method to read a U29 integer from a bitstream * * @param inStream bitstream to read data from * @return The number as an unsigned 29 bit integer */ static uint32_t ReadU29(RakNet::BitStream& inStream); /** * @brief Reads a string from a bitstream * * @param inStream bitStream to read data from * @return The read string */ const std::string ReadString(RakNet::BitStream& inStream); /** * @brief Read an AMFDouble value from a bitStream * * @param inStream bitStream to read data from * @return Double value represented as an AMFValue */ static std::unique_ptr ReadAmfDouble(RakNet::BitStream& inStream); /** * @brief Read an AMFArray from a bitStream * * @param inStream bitStream to read data from * @return Array value represented as an AMFValue */ std::unique_ptr ReadAmfArray(RakNet::BitStream& inStream); /** * @brief Read an AMFString from a bitStream * * @param inStream bitStream to read data from * @return String value represented as an AMFValue */ std::unique_ptr ReadAmfString(RakNet::BitStream& inStream); /** * @brief Read an AMFInteger from a bitStream * * @param inStream bitStream to read data from * @return Integer value represented as an AMFValue */ static std::unique_ptr ReadAmfInteger(RakNet::BitStream& inStream); /** * List of strings read so far saved to be read by reference. */ std::vector accessedElements; // How deeply nested the array being read is. uint32_t m_Depth = 0; // How many values have been read so far. uint32_t m_ValuesRead = 0; };