From 54fc2dd830418f1307cd4a37b51beded268343f0 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Wed, 20 Jul 2016 09:14:47 +0200 Subject: [PATCH] Generic templates for data packing/unpacking replaced with specific to avoid accidental use --- lib/EAPBase/include/EAPSerial.h | 173 ++++++++++++++++++++++++++++---- 1 file changed, 156 insertions(+), 17 deletions(-) diff --git a/lib/EAPBase/include/EAPSerial.h b/lib/EAPBase/include/EAPSerial.h index 4b591ea..f49c190 100644 --- a/lib/EAPBase/include/EAPSerial.h +++ b/lib/EAPBase/include/EAPSerial.h @@ -29,29 +29,106 @@ namespace eapserial { /// - /// Packs a primitive data + /// Packs a boolean /// /// \param[inout] cursor Memory cursor /// \param[in] val Variable with data to pack /// - template inline void pack(_Inout_ unsigned char *&cursor, _In_ const T &val); + inline void pack(_Inout_ unsigned char *&cursor, _In_ const bool &val); /// - /// Returns packed size of a primitive data + /// Returns packed size of a boolean /// /// \param[in] val Data to pack /// /// \returns Size of data when packed (in bytes) /// - template inline size_t get_pk_size(_In_ const T &val); + inline size_t get_pk_size(_In_ const bool &val); /// - /// Unpacks a primitive data + /// Unpacks a boolean /// /// \param[inout] cursor Memory cursor /// \param[out] val Variable to receive unpacked value /// - template inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ T &val); + inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ bool &val); + + /// + /// Packs a byte + /// + /// \param[inout] cursor Memory cursor + /// \param[in] val Variable with data to pack + /// + inline void pack(_Inout_ unsigned char *&cursor, _In_ const unsigned char &val); + + /// + /// Returns packed size of a byte + /// + /// \param[in] val Data to pack + /// + /// \returns Size of data when packed (in bytes) + /// + inline size_t get_pk_size(_In_ const unsigned char &val); + + /// + /// Unpacks a byte + /// + /// \param[inout] cursor Memory cursor + /// \param[out] val Variable to receive unpacked value + /// + inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ unsigned char &val); + + /// + /// Packs an unsigned int + /// + /// \param[inout] cursor Memory cursor + /// \param[in] val Variable with data to pack + /// + inline void pack(_Inout_ unsigned char *&cursor, _In_ const unsigned int &val); + + /// + /// Returns packed size of an unsigned int + /// + /// \param[in] val Data to pack + /// + /// \returns Size of data when packed (in bytes) + /// + inline size_t get_pk_size(_In_ const unsigned int &val); + + /// + /// Unpacks an unsigned int + /// + /// \param[inout] cursor Memory cursor + /// \param[out] val Variable to receive unpacked value + /// + inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ unsigned int &val); + +#ifdef _WIN64 + /// + /// Packs a size_t + /// + /// \param[inout] cursor Memory cursor + /// \param[in] val Variable with data to pack + /// + inline void pack(_Inout_ unsigned char *&cursor, _In_ const size_t &val); + + /// + /// Returns packed size of a size_t + /// + /// \param[in] val Data to pack + /// + /// \returns Size of data when packed (in bytes) + /// + inline size_t get_pk_size(_In_ const size_t &val); + + /// + /// Unpacks a size_t + /// + /// \param[inout] cursor Memory cursor + /// \param[out] val Variable to receive unpacked value + /// + inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ size_t &val); +#endif /// /// Packs a string @@ -184,30 +261,92 @@ namespace eapserial namespace eapserial { - template - inline void pack(_Inout_ unsigned char *&cursor, _In_ const T &val) + inline void pack(_Inout_ unsigned char *&cursor, _In_ const bool &val) { - memcpy(cursor, &val, sizeof(T)); - cursor += sizeof(T); + *cursor = val ? 1 : 0; + cursor++; } - template - inline size_t get_pk_size(_In_ const T &val) + inline size_t get_pk_size(_In_ const bool &val) { UNREFERENCED_PARAMETER(val); - return sizeof(T); + return sizeof(unsigned char); } - template - inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ T &val) + inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ bool &val) { - memcpy(&val, cursor, sizeof(T)); - cursor += sizeof(T); + val = *cursor ? true : false; + cursor++; } + inline void pack(_Inout_ unsigned char *&cursor, _In_ const unsigned char &val) + { + *cursor = val; + cursor++; + } + + + inline size_t get_pk_size(_In_ const unsigned char &val) + { + UNREFERENCED_PARAMETER(val); + return sizeof(unsigned char); + } + + + inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ unsigned char &val) + { + val = *cursor; + cursor++; + } + + + inline void pack(_Inout_ unsigned char *&cursor, _In_ const unsigned int &val) + { + *(unsigned int*)cursor = val; + cursor += sizeof(unsigned int); + } + + + inline size_t get_pk_size(_In_ const unsigned int &val) + { + UNREFERENCED_PARAMETER(val); + return sizeof(unsigned int); + } + + + inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ unsigned int &val) + { + val = *(unsigned int*)cursor; + cursor += sizeof(unsigned int); + } + + +#ifdef _WIN64 + inline void pack(_Inout_ unsigned char *&cursor, _In_ const size_t &val) + { + *(size_t*)cursor = val; + cursor += sizeof(size_t); + } + + + inline size_t get_pk_size(_In_ const size_t &val) + { + UNREFERENCED_PARAMETER(val); + return sizeof(size_t); + } + + + inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ size_t &val) + { + val = *(size_t*)cursor; + cursor += sizeof(size_t); + } +#endif + + template inline void pack(_Inout_ unsigned char *&cursor, _In_ const std::basic_string<_Elem, _Traits, _Ax> &val) {