From 793c34699a0de8a384cea359821beea66c1a00a4 Mon Sep 17 00:00:00 2001 From: Jim Hull Date: Tue, 13 Sep 2011 09:43:24 -0700 Subject: [PATCH] rework SendBuffer fixing an issue where ClearBuffer() nuked the buffer after playing to the first client --- Chan.cpp | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/Chan.cpp b/Chan.cpp index 0f52b092..30d467af 100644 --- a/Chan.cpp +++ b/Chan.cpp @@ -543,12 +543,23 @@ void CChan::SendBuffer(CClient* pClient) { if (m_pNetwork && m_pNetwork->IsUserAttached()) { const vector& vsBuffer = GetBuffer(); + // 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 thus vClients at this + // point can't be empty. + // + // This loop has to be cycled twice to maintain the existing behavior which is + // 1. OnChanBufferStarting + // 2. OnChanBufferPlayLine + // 3. ClearBuffer() if not keeping the buffer + // 4. OnChanBufferEnding + // + // With the exception of ClearBuffer(), this needs to happen per client, and + // if pClient is not NULL, the loops break after the first iteration. + // + // Rework this if you like ... if (vsBuffer.size()) { const vector & vClients = m_pNetwork->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 ... CClient * pUseClient = ( pClient ? pClient : vClients[uClient] ); bool bSkipStatusMsg = false; @@ -564,21 +575,29 @@ void CChan::SendBuffer(CClient* pClient) { m_pNetwork->PutUser(sLine, pUseClient); } - if (!KeepBuffer()) { - ClearBuffer(); - } + if( pClient ) + break; - bSkipStatusMsg = false; + } + + if (!KeepBuffer()) { + ClearBuffer(); + } + + for( size_t uClient = 0; uClient < vClients.size(); ++uClient ) { + + CClient * pUseClient = ( pClient ? pClient : vClients[uClient] ); + bool bSkipStatusMsg = false; NETWORKMODULECALL(OnChanBufferEnding(*this, *pUseClient), m_pNetwork->GetUser(), m_pNetwork, NULL, bSkipStatusMsg = true); if (!bSkipStatusMsg) { m_pNetwork->PutUser(":***!znc@znc.in PRIVMSG " + GetName() + " :Playback Complete.", pUseClient); } - if( pClient ) + if( pClient ) break; - } + } } }