From 244052f0de87f5c7f8e4920244cdb72de98fee98 Mon Sep 17 00:00:00 2001 From: Jim Hull Date: Mon, 12 Sep 2011 23:03:03 -0700 Subject: [PATCH] fixed a null reference to pClient in hooks 'OnChanBufferStarting,OnChanBufferStarting,OnChanBufferEnding,OnChanBufferEnding', such that when pClient is NULL the hooks are called on all clients associated to that user Conflicts: Chan.cpp Signed-off-by: Uli Schlachter --- Chan.cpp | 45 ++++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/Chan.cpp b/Chan.cpp index 287eecb3..b0b22079 100644 --- a/Chan.cpp +++ b/Chan.cpp @@ -547,28 +547,39 @@ void CChan::SendBuffer(CClient* pClient) { const vector& vsBuffer = GetBuffer(); if (vsBuffer.size()) { - bool bSkipStatusMsg = false; - MODULECALL(OnChanBufferStarting(*this, *pClient), m_pUser, NULL, bSkipStatusMsg = true); + const vector & vClients = m_pUser->GetClients(); + for( size_t uClient = 0; uClient < vClients.size(); ++uClient ) { + // in the event that pClient is NULL, need to send this to all clients for the user + // I'm presuming here that pClient is listed inside vClients so thus vClients at this + // point can't be empty. Rework this if you like ... - if (!bSkipStatusMsg) { - m_pUser->PutUser(":***!znc@znc.in PRIVMSG " + GetName() + " :Buffer Playback...", pClient); - } + CClient * pUseClient = ( pClient ? pClient : vClients[uClient] ); + bool bSkipStatusMsg = false; + MODULECALL(OnChanBufferStarting(*this, *pUseClient), m_pUser, NULL, bSkipStatusMsg = true); - for (unsigned int a = 0; a < vsBuffer.size(); a++) { - CString sLine(vsBuffer[a]); - MODULECALL(OnChanBufferPlayLine(*this, *pClient, sLine), m_pUser, NULL, continue); - m_pUser->PutUser(sLine, pClient); - } + if (!bSkipStatusMsg) { + m_pUser->PutUser(":***!znc@znc.in PRIVMSG " + GetName() + " :Buffer Playback...", pUseClient); + } - if (!KeepBuffer()) { - ClearBuffer(); - } + for (unsigned int a = 0; a < vsBuffer.size(); a++) { + CString sLine(vsBuffer[a]); + MODULECALL(OnChanBufferPlayLine(*this, *pUseClient, sLine), m_pUser, NULL, continue); + m_pUser->PutUser(sLine, pUseClient); + } - bSkipStatusMsg = false; - MODULECALL(OnChanBufferEnding(*this, *pClient), m_pUser, NULL, bSkipStatusMsg = true); + if (!KeepBuffer()) { + ClearBuffer(); + } - if (!bSkipStatusMsg) { - m_pUser->PutUser(":***!znc@znc.in PRIVMSG " + GetName() + " :Playback Complete.", pClient); + bSkipStatusMsg = false; + MODULECALL(OnChanBufferEnding(*this, *pUseClient), m_pUser, NULL, bSkipStatusMsg = true); + + if (!bSkipStatusMsg) { + m_pUser->PutUser(":***!znc@znc.in PRIVMSG " + GetName() + " :Playback Complete.", pUseClient); + } + + if( pClient ) + break; } } }