bool TCPConnection::ProcessReceivedData(char* errbuf) { if (errbuf) errbuf[0] = 0; if (!recvbuf) return true; #if TCPN_DEBUG_Console >= 4 if (recvbuf_used) { std::cout << "Starting Processing: recvbuf=" << recvbuf_used << std::endl; DumpPacket(recvbuf, recvbuf_used); } #endif for (int i=0; i < recvbuf_used; i++) { if (GetEcho() && i >= recvbuf_echo) { Send(&recvbuf[i], 1); recvbuf_echo = i + 1; } switch(recvbuf[i]) { case 0: { // 0 is the code for clear buffer if (i==0) { recvbuf_used--; recvbuf_echo--; memmove(recvbuf, &recvbuf[1], recvbuf_used); i = -1; } else { if (i == recvbuf_used) { safe_delete_array(recvbuf); i = -1; } else { uchar* tmpdel = recvbuf; recvbuf = new uchar[recvbuf_size]; memcpy(recvbuf, &tmpdel[i+1], recvbuf_used-i); recvbuf_used -= i + 1; recvbuf_echo -= i + 1; safe_delete_array(tmpdel); i = -1; } } #if TCPN_DEBUG_Console >= 5 std::cout << "Removed 0x00" << std::endl; if (recvbuf_used) { std::cout << "recvbuf left: " << recvbuf_used << std::endl; DumpPacket(recvbuf, recvbuf_used); } else std::cout << "recbuf left: None" << std::endl; #endif m_previousLineEnd = false; break; } case 10: case 13: // newline marker { char *line = nullptr; if (i==0) { // empty line if(!m_previousLineEnd) { //char right before this was NOT a CR, report the empty line. line = new char[1]; line[0] = '\0'; m_previousLineEnd = true; } else { m_previousLineEnd = false; } recvbuf_used--; recvbuf_echo--; memcpy(recvbuf, &recvbuf[1], recvbuf_used); i = -1; } else { line = new char[i+1]; memset(line, 0, i+1); memcpy(line, recvbuf, i); #if TCPN_DEBUG_Console >= 3 std::cout << "Line Out: " << std::endl; DumpPacket((uchar*) line, i); #endif //line[i] = 0; uchar* tmpdel = recvbuf; recvbuf = new uchar[recvbuf_size]; recvbuf_used -= i+1; recvbuf_echo -= i+1; memcpy(recvbuf, &tmpdel[i+1], recvbuf_used); #if TCPN_DEBUG_Console >= 5 std::cout << "i+1=" << i+1 << std::endl; if (recvbuf_used) { std::cout << "recvbuf left: " << recvbuf_used << std::endl; DumpPacket(recvbuf, recvbuf_used); } else std::cout << "recbuf left: None" << std::endl; #endif safe_delete_array(tmpdel); i = -1; m_previousLineEnd = true; } if(line != nullptr) { bool finish_proc = false; finish_proc = LineOutQueuePush(line); if(finish_proc) return(true); //break early as requested by LineOutQueuePush } break; } case 8: // backspace { if (i==0) { // nothin to backspace recvbuf_used--; recvbuf_echo--; memmove(recvbuf, &recvbuf[1], recvbuf_used); i = -1; } else { uchar* tmpdel = recvbuf; recvbuf = new uchar[recvbuf_size]; memcpy(recvbuf, tmpdel, i-1); memcpy(&recvbuf[i-1], &tmpdel[i+1], recvbuf_used-i); recvbuf_used -= 2; recvbuf_echo -= 2; safe_delete_array(tmpdel); i -= 2; } break; m_previousLineEnd = false; } default: m_previousLineEnd = false; } } if (recvbuf_used < 0) safe_delete_array(recvbuf); return true; }
std::string deserializeEcho( const zeroeq::Event& event ) { const auto& data = GetEcho( event.getData( )); return data->message()->c_str(); }