void cLuaTCPLink::OnReceivedData(const char * a_Data, size_t a_Length) { // Check if we're still valid: if (!m_Callbacks.IsValid()) { return; } // If we're running in SSL mode, put the data into the SSL decryptor: auto sslContext = m_SslContext; if (sslContext != nullptr) { sslContext->StoreReceivedData(a_Data, a_Length); return; } // Call the callback: cPluginLua::cOperation Op(m_Plugin); if (!Op().Call(cLuaState::cTableRef(m_Callbacks, "OnReceivedData"), this, AString(a_Data, a_Length))) { LOGINFO("cTCPLink OnReceivedData callback failed in plugin %s.", m_Plugin.GetName().c_str()); } }
void cTCPLinkImpl::ReadCallback(bufferevent * a_BufferEvent, void * a_Self) { ASSERT(a_Self != nullptr); cTCPLinkImpl * Self = static_cast<cTCPLinkImpl *>(a_Self); ASSERT(Self->m_BufferEvent == a_BufferEvent); ASSERT(Self->m_Callbacks != nullptr); // Read all the incoming data, in 1024-byte chunks: char data[1024]; size_t length; auto tlsContext = Self->m_TlsContext; while ((length = bufferevent_read(a_BufferEvent, data, sizeof(data))) > 0) { if (tlsContext != nullptr) { ASSERT(tlsContext->IsLink(Self)); tlsContext->StoreReceivedData(data, length); } else { Self->ReceivedCleartextData(data, length); } } }