From e258289edb19613c8ab8a24f652b24e323585a7e Mon Sep 17 00:00:00 2001 From: Henrique Date: Sat, 21 May 2011 16:02:37 -0300 Subject: [PATCH] network message --- CMakeLists.txt | 2 + src/framework/net/inputmessage.cpp | 90 ++++++++++++++++++++++++++ src/framework/net/inputmessage.h | 58 +++++++++++++++++ src/framework/net/outputmessage.cpp | 98 +++++++++++++++++++++++++++++ src/framework/net/outputmessage.h | 56 +++++++++++++++++ 5 files changed, 304 insertions(+) create mode 100644 src/framework/net/inputmessage.cpp create mode 100644 src/framework/net/inputmessage.h create mode 100644 src/framework/net/outputmessage.cpp create mode 100644 src/framework/net/outputmessage.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d916483..f450d56f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,6 +106,8 @@ SET(SOURCES # framework net src/framework/net/connection.cpp src/framework/net/protocol.cpp + src/framework/net/inputmessage.cpp + src/framework/net/outputmessage.cpp ) IF(WIN32) diff --git a/src/framework/net/inputmessage.cpp b/src/framework/net/inputmessage.cpp new file mode 100644 index 00000000..d779a122 --- /dev/null +++ b/src/framework/net/inputmessage.cpp @@ -0,0 +1,90 @@ +/* The MIT License + * + * Copyright (c) 2010 OTClient, https://github.com/edubart/otclient + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include + +InputMessage::InputMessage() +{ + reset(); +} + +void InputMessage::reset() +{ + m_readPos = 0; + m_messageSize = 0; +} + +uint8 InputMessage::getU8() +{ + if(!canRead(1)) + return 0; + + return m_buffer[m_readPos++]; +} + +uint16 InputMessage::getU16() +{ + if(!canRead(2)) + return 0; + + uint16 v = *(uint16_t*)(m_buffer + m_readPos); + m_readPos += 2; + return v; +} + +uint32 InputMessage::getU32() +{ + if(!canRead(4)) + return 0; + + uint32 v = *(uint32*)(m_buffer + m_readPos); + m_readPos += 4; + return v; +} + +uint64 InputMessage::getU64() +{ + if(!canRead(8)) + return 0; + + uint64 v = *(uint64*)(m_buffer + m_readPos); + m_readPos += 8; + return v; +} + +std::string InputMessage::getString() +{ + uint16 stringLength = getU16(); + if(!canRead(stringLength)) + return std::string(); + + char* v = (char*)(m_buffer + m_readPos); + m_readPos += stringLength; + return std::string(v, stringLength); +} + +bool InputMessage::canRead(int bytes) +{ + return (m_readPos + bytes <= m_messageSize) && (m_readPos + bytes <= BUFFER_MAXSIZE); +} diff --git a/src/framework/net/inputmessage.h b/src/framework/net/inputmessage.h new file mode 100644 index 00000000..a81169ba --- /dev/null +++ b/src/framework/net/inputmessage.h @@ -0,0 +1,58 @@ +/* The MIT License + * + * Copyright (c) 2010 OTClient, https://github.com/edubart/otclient + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef INPUTMESSAGE_H +#define INPUTMESSAGE_H + +#include + +class InputMessage +{ +public: + enum { + BUFFER_MAXSIZE = 256, + HEADER_LENGTH = 2, + CHECKSUM_LENGTH = 4 + }; + + InputMessage(); + + void reset(); + + uint8 getU8(); + uint16 getU16(); + uint32 getU32(); + uint64 getU64(); + std::string getString(); + + +private: + bool canRead(int bytes); + + uint16_t m_readPos; + uint16_t m_messageSize; + uint8_t m_buffer[BUFFER_MAXSIZE]; +}; + +#endif diff --git a/src/framework/net/outputmessage.cpp b/src/framework/net/outputmessage.cpp new file mode 100644 index 00000000..300b4e68 --- /dev/null +++ b/src/framework/net/outputmessage.cpp @@ -0,0 +1,98 @@ +/* The MIT License + * + * Copyright (c) 2010 OTClient, https://github.com/edubart/otclient + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include + +OutputMessage::OutputMessage() +{ + reset(); +} + +void OutputMessage::reset() +{ + m_writePos = 0; + m_messageSize = 0; +} + +void OutputMessage::addU8(uint8 value) +{ + if(!canWrite(1)) + return; + + m_buffer[m_writePos] = value; + m_writePos += 1; + m_messageSize += 1; +} + +void OutputMessage::addU16(uint16 value) +{ + if(!canWrite(2)) + return; + + *(uint16_t*)(m_buffer + m_writePos) = value; + m_writePos += 2; + m_messageSize += 2; +} + +void OutputMessage::addU32(uint32 value) +{ + if(!canWrite(4)) + return; + + *(uint32*)(m_buffer + m_writePos) = value; + m_writePos += 4; + m_messageSize += 4; +} + +void OutputMessage::addU64(uint64 value) +{ + if(!canWrite(8)) + return; + + *(uint64*)(m_buffer + m_writePos) = value; + m_writePos += 8; + m_messageSize += 8; +} + +void OutputMessage::addString(const char* value) +{ + size_t stringLength = strlen(value); + if(stringLength > 0xFFFF || !canWrite(stringLength + 2)) + return; + + addU16(stringLength); + strcpy((char*)(m_buffer + m_writePos), value); + m_writePos += stringLength; + m_messageSize += stringLength; +} + +void OutputMessage::addString(const std::string &value) +{ + addString(value.c_str()); +} + +bool OutputMessage::canWrite(int bytes) +{ + return (m_writePos + bytes <= BUFFER_MAXSIZE); +} diff --git a/src/framework/net/outputmessage.h b/src/framework/net/outputmessage.h new file mode 100644 index 00000000..c3533c65 --- /dev/null +++ b/src/framework/net/outputmessage.h @@ -0,0 +1,56 @@ +/* The MIT License + * + * Copyright (c) 2010 OTClient, https://github.com/edubart/otclient + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef OUTPUTMESSAGE_H +#define OUTPUTMESSAGE_H + +#include + +class OutputMessage +{ +public: + enum { + BUFFER_MAXSIZE = 1024 + }; + + OutputMessage(); + + void reset(); + + void addU8(uint8 value); + void addU16(uint16 value); + void addU32(uint32 value); + void addU64(uint64 value); + void addString(const char* value); + void addString(const std::string &value); + +private: + bool canWrite(int bytes); + + uint16_t m_writePos; + uint16_t m_messageSize; + uint8_t m_buffer[BUFFER_MAXSIZE]; +}; + +#endif