From 946ec64e7f44d95e8f89d5356fb163621a560d08 Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Mon, 14 May 2012 21:04:04 -0300 Subject: [PATCH] new protocol system fixes --- src/framework/luafunctions.cpp | 6 ++++++ src/framework/net/inputmessage.cpp | 29 ++++++++------------------ src/framework/net/inputmessage.h | 15 ++++++++----- src/framework/net/outputmessage.h | 3 ++- src/otclient/luafunctions.cpp | 2 +- src/otclient/net/protocolgame.h | 2 +- src/otclient/net/protocolgameparse.cpp | 6 +++--- src/otclient/net/protocolgamesend.cpp | 4 ++-- 8 files changed, 34 insertions(+), 33 deletions(-) diff --git a/src/framework/luafunctions.cpp b/src/framework/luafunctions.cpp index 82c1961e..bdb147f3 100644 --- a/src/framework/luafunctions.cpp +++ b/src/framework/luafunctions.cpp @@ -430,9 +430,14 @@ void Application::registerLuaFunctions() g_lua.bindClassMemberFunction("getU32", &InputMessage::getU32); g_lua.bindClassMemberFunction("getU64", &InputMessage::getU64); g_lua.bindClassMemberFunction("getString", &InputMessage::getString); + g_lua.bindClassMemberFunction("peekU8", &InputMessage::peekU8); + g_lua.bindClassMemberFunction("peekU16", &InputMessage::peekU16); + g_lua.bindClassMemberFunction("peekU32", &InputMessage::peekU32); + g_lua.bindClassMemberFunction("peekU64", &InputMessage::peekU64); g_lua.bindClassMemberFunction("decryptRSA", &InputMessage::decryptRSA); g_lua.bindClassMemberFunction("getReadSize", &InputMessage::getReadSize); g_lua.bindClassMemberFunction("getUnreadSize", &InputMessage::getUnreadSize); + g_lua.bindClassMemberFunction("getMessageSize", &InputMessage::getMessageSize); g_lua.bindClassMemberFunction("eof", &InputMessage::eof); // OutputMessage @@ -447,6 +452,7 @@ void Application::registerLuaFunctions() g_lua.bindClassMemberFunction("addString", &OutputMessage::addString); g_lua.bindClassMemberFunction("addPaddingBytes", &OutputMessage::addPaddingBytes); g_lua.bindClassMemberFunction("encryptRSA", &OutputMessage::encryptRSA); + g_lua.bindClassMemberFunction("getMessageSize", &OutputMessage::getMessageSize); // Application g_lua.registerStaticClass("g_app"); diff --git a/src/framework/net/inputmessage.cpp b/src/framework/net/inputmessage.cpp index e843a772..454e8756 100644 --- a/src/framework/net/inputmessage.cpp +++ b/src/framework/net/inputmessage.cpp @@ -30,6 +30,7 @@ InputMessage::InputMessage() void InputMessage::reset() { + m_messageSize = 0; m_readPos = MAX_HEADER_SIZE; m_headerPos = MAX_HEADER_SIZE; } @@ -42,47 +43,35 @@ void InputMessage::setBuffer(const std::string& buffer) m_messageSize = buffer.size(); } -uint8 InputMessage::getU8(bool peek) +uint8 InputMessage::getU8() { checkRead(1); uint8 v = m_buffer[m_readPos]; - - if(!peek) - m_readPos += 1; - + m_readPos += 1; return v; } -uint16 InputMessage::getU16(bool peek) +uint16 InputMessage::getU16() { checkRead(2); uint16 v = Fw::readLE16(m_buffer + m_readPos); - - if(!peek) - m_readPos += 2; - + m_readPos += 2; return v; } -uint32 InputMessage::getU32(bool peek) +uint32 InputMessage::getU32() { checkRead(4); uint32 v = Fw::readLE32(m_buffer + m_readPos); - - if(!peek) - m_readPos += 4; - + m_readPos += 4; return v; } -uint64 InputMessage::getU64(bool peek) +uint64 InputMessage::getU64() { checkRead(8); uint64 v = Fw::readLE64(m_buffer + m_readPos); - - if(!peek) - m_readPos += 8; - + m_readPos += 8; return v; } diff --git a/src/framework/net/inputmessage.h b/src/framework/net/inputmessage.h index 69dcab2f..4e23c98e 100644 --- a/src/framework/net/inputmessage.h +++ b/src/framework/net/inputmessage.h @@ -40,16 +40,22 @@ public: void setBuffer(const std::string& buffer); void skipBytes(uint16 bytes) { m_readPos += bytes; } - uint8 getU8(bool peek = false); - uint16 getU16(bool peek = false); - uint32 getU32(bool peek = false); - uint64 getU64(bool peek = false); + uint8 getU8(); + uint16 getU16(); + uint32 getU32(); + uint64 getU64(); std::string getString(); + uint8 peekU8() { uint8 v = getU8(); m_readPos-=1; return v; } + uint16 peekU16() { uint16 v = getU16(); m_readPos-=2; return v; } + uint32 peekU32() { uint32 v = getU32(); m_readPos-=4; return v; } + uint64 peekU64() { uint64 v = getU64(); m_readPos-=8; return v; } + void decryptRSA(int size, const std::string& p, const std::string& q, const std::string& d); int getReadSize() { return m_readPos - m_headerPos; } int getUnreadSize() { return m_messageSize - (m_readPos - m_headerPos); } + uint16 getMessageSize() { return m_messageSize; } bool eof() { return (m_readPos - m_headerPos) >= m_messageSize; } @@ -64,7 +70,6 @@ protected: uint8* getHeaderBuffer() { return m_buffer + m_headerPos; } uint8* getDataBuffer() { return m_buffer + MAX_HEADER_SIZE; } uint16 getHeaderSize() { return (MAX_HEADER_SIZE - m_headerPos); } - uint16 getMessageSize() { return m_messageSize; } uint16 readSize() { return getU16(); } bool readChecksum(); diff --git a/src/framework/net/outputmessage.h b/src/framework/net/outputmessage.h index ac8b0503..0f5a3869 100644 --- a/src/framework/net/outputmessage.h +++ b/src/framework/net/outputmessage.h @@ -51,11 +51,12 @@ public: void encryptRSA(int size, const std::string& key); + uint16 getMessageSize() { return m_messageSize; } + protected: uint8* getWriteBuffer() { return m_buffer + m_writePos; } uint8* getHeaderBuffer() { return m_buffer + m_headerPos; } uint8* getDataBuffer() { return m_buffer + MAX_HEADER_SIZE; } - uint16 getMessageSize() { return m_messageSize; } void writeChecksum(); void writeMessageSize(); diff --git a/src/otclient/luafunctions.cpp b/src/otclient/luafunctions.cpp index a739e29f..edf2518e 100644 --- a/src/otclient/luafunctions.cpp +++ b/src/otclient/luafunctions.cpp @@ -177,7 +177,7 @@ void OTClient::registerLuaFunctions() g_lua.registerClass(); g_lua.bindClassStaticFunction("create", []{ return ProtocolGamePtr(new ProtocolGame); }); g_lua.bindClassMemberFunction("login", &ProtocolGame::login); - g_lua.bindClassMemberFunction("send", &ProtocolGame::send); + g_lua.bindClassMemberFunction("safeSend", &ProtocolGame::safeSend); g_lua.bindClassMemberFunction("sendExtendedOpcode", &ProtocolGame::sendExtendedOpcode); g_lua.bindClassMemberFunction("addPosition", &ProtocolGame::addPosition); g_lua.bindClassMemberFunction("setMapDescription", &ProtocolGame::setMapDescription); diff --git a/src/otclient/net/protocolgame.h b/src/otclient/net/protocolgame.h index eb68594e..cfd3d1f7 100644 --- a/src/otclient/net/protocolgame.h +++ b/src/otclient/net/protocolgame.h @@ -32,7 +32,7 @@ class ProtocolGame : public Protocol { public: void login(const std::string& accountName, const std::string& accountPassword, const std::string& host, uint16 port, const std::string& characterName); - void send(const OutputMessagePtr& outputMessage); + void safeSend(const OutputMessagePtr& outputMessage); void sendExtendedOpcode(uint8 opcode, const std::string& buffer); protected: diff --git a/src/otclient/net/protocolgameparse.cpp b/src/otclient/net/protocolgameparse.cpp index c73e51b8..c8451396 100644 --- a/src/otclient/net/protocolgameparse.cpp +++ b/src/otclient/net/protocolgameparse.cpp @@ -431,7 +431,7 @@ void ProtocolGame::parseMapMoveWest(const InputMessagePtr& msg) void ProtocolGame::parseUpdateTile(const InputMessagePtr& msg) { Position tilePos = getPosition(msg); - int thingId = msg->getU16(true); + int thingId = msg->peekU16(); if(thingId == 0xFF01) { msg->getU16(); } else { @@ -1249,7 +1249,7 @@ int ProtocolGame::setFloorDescription(const InputMessagePtr& msg, int x, int y, g_map.cleanTile(tilePos); if(skip == 0) { - int tileOpt = msg->getU16(true); + int tileOpt = msg->peekU16(); if(tileOpt >= 0xFF00) skip = (msg->getU16() & 0xFF); else { @@ -1274,7 +1274,7 @@ void ProtocolGame::setTileDescription(const InputMessagePtr& msg, Position posit int stackPos = 0; while(true) { - int inspectItemId = msg->getU16(true); + int inspectItemId = msg->peekU16(); if(inspectItemId >= 0xFF00) { return; } diff --git a/src/otclient/net/protocolgamesend.cpp b/src/otclient/net/protocolgamesend.cpp index 57293c2c..922e3e14 100644 --- a/src/otclient/net/protocolgamesend.cpp +++ b/src/otclient/net/protocolgamesend.cpp @@ -23,7 +23,7 @@ #include "protocolgame.h" #include -void ProtocolGame::send(const OutputMessagePtr& outputMessage) +void ProtocolGame::safeSend(const OutputMessagePtr& outputMessage) { // avoid usage of automated sends (bot modules) if(!g_game.checkBotProtection()) @@ -37,7 +37,7 @@ void ProtocolGame::sendExtendedOpcode(uint8 opcode, const std::string& buffer) msg->addU8(Proto::ClientExtendedOpcode); msg->addU8(opcode); msg->addString(buffer); - send(msg); + safeSend(msg); } void ProtocolGame::sendLoginPacket(uint challangeTimestamp, uint8 challangeRandom)