string TcpSocket::ReadLine(int64_t max) { // prep result byte buffer ByteArray result; size_t bufferMax = ((max > static_cast<int64_t>(UINT_MAX)) ? UINT_MAX : static_cast<size_t>(max)); result.Resize(bufferMax); // read data int64_t readBytes(0); if ( result.Size() == 0 ) { if ( bufferMax == 0 ) bufferMax = UINT_MAX; result.Resize(1); int64_t readResult; do { result.Resize( static_cast<size_t>(min(bufferMax, result.Size() + DEFAULT_BUFFER_SIZE)) ); readResult = ReadLine(result.Data()+readBytes, result.Size()-readBytes); if ( readResult > 0 || readBytes == 0 ) readBytes += readResult; } while ( readResult == DEFAULT_BUFFER_SIZE && result[static_cast<size_t>(readBytes-1)] != '\n' ); } else readBytes = ReadLine(result.Data(), result.Size()); // clean up byte buffer if ( readBytes <= 0 ) result.Clear(); else result.Resize(static_cast<size_t>(readBytes)); // return byte buffer as string return string( result.ConstData(), result.Size() ); }