From ff2c246de28689f086d1ea8f73be8c9d52c53ed0 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Fri, 17 Jul 2020 18:46:50 +0100 Subject: cProtocolRecognizer goes on a diet (#4770) - Removed inheritance from cProtocol --- src/ClientHandle.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'src/ClientHandle.cpp') diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 9fbc9f89d..4aa3dd9d7 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -32,7 +32,7 @@ #include "Root.h" #include "Protocol/Authenticator.h" -#include "Protocol/ProtocolRecognizer.h" +#include "Protocol/Protocol.h" #include "CompositeChat.h" #include "Items/ItemSword.h" @@ -100,8 +100,6 @@ cClientHandle::cClientHandle(const AString & a_IPString, int a_ViewDistance) : m_LastPlacedSign(0, -1, 0), m_ProtocolVersion(0) { - m_Protocol = cpp14::make_unique(this); - s_ClientCount++; // Not protected by CS because clients are always constructed from the same thread m_UniqueID = s_ClientCount; m_PingStartTime = std::chrono::steady_clock::now(); @@ -141,8 +139,6 @@ cClientHandle::~cClientHandle() m_Player = nullptr; } - m_Protocol.reset(); - LOGD("ClientHandle at %p deleted", static_cast(this)); } @@ -2489,7 +2485,7 @@ void cClientHandle::SendChunkData(int a_ChunkX, int a_ChunkZ, cChunkDataSerializ return; } - if (m_Protocol == nullptr) + if (!m_Protocol.VersionRecognitionSuccessful()) { // TODO (#2588): investigate if and why this occurs return; @@ -2542,7 +2538,7 @@ void cClientHandle::SendDisconnect(const AString & a_Reason) if (!m_HasSentDC) { LOGD("Sending a DC: \"%s\"", StripColorCodes(a_Reason).c_str()); - m_Protocol->SendDisconnect(a_Reason); + m_Protocol.SendDisconnect(*this, a_Reason); m_HasSentDC = true; // csKicked means m_Link will be shut down on the next tick. The // disconnect packet data is sent in the tick thread so the connection @@ -3385,9 +3381,10 @@ void cClientHandle::ProcessProtocolInOut(void) cCSLock Lock(m_CSIncomingData); std::swap(IncomingData, m_IncomingData); } + if (!IncomingData.empty()) { - m_Protocol->DataReceived(IncomingData.data(), IncomingData.size()); + m_Protocol.HandleIncomingData(*this, IncomingData); } // Send any queued outgoing data: @@ -3396,10 +3393,13 @@ void cClientHandle::ProcessProtocolInOut(void) cCSLock Lock(m_CSOutgoingData); std::swap(OutgoingData, m_OutgoingData); } - auto link = m_Link; - if ((link != nullptr) && !OutgoingData.empty()) + + // Capture the link to prevent it being reset between the null check and the Send: + auto Link = m_Link; + + if ((Link != nullptr) && !OutgoingData.empty()) { - link->Send(OutgoingData.data(), OutgoingData.size()); + Link->Send(OutgoingData.data(), OutgoingData.size()); } } -- cgit v1.2.3