bool plRingBuffer::Put(const char * data, int len) { bool ans = false; if (len > BufferAvailable()) Compress(); if (len <= BufferAvailable()) { memcpy(GetBufferOpen(), data, len); fEndPos += len; ans = true; } return ans; }
int plBufferedSocketReader::ReadFrom(plTcpSocket & sck) // this is where things get ugly. { int ans = kSuccessNoData; int readSize = BufferAvailable(); if(readSize < 1) { Compress(); readSize = BufferAvailable(); } if(readSize > 0) { char * dst = GetBufferOpen(); int nBytesRead = sck.RecvData(dst, readSize); if(nBytesRead < 0) { int err = plNet::GetError(); if(err != kBlockingError) { ans = kFailedReadError; } } else if(nBytesRead > 0) { fEndPos += nBytesRead; ans = kSuccessWithData; } else { ans = kFailedSocketClosed; } } else { ans = kFailedNoBufferSpace; } return ans; }
int plBufferedSocketWriter::WriteBlock(const char * data, int len, plTcpSocket & sck) { int ans = kSuccessNoDataSent; if(len > BufferAvailable()) ans = Flush(sck); if(ans >= 0) ans = WriteBlock(data,len); if(ans >= 0 && fFlushPoint >= 0 && fFlushPoint < AmountBuffered()) ans = Flush(sck); return ans; }