private async Task <bool> FindNextDelimiter(Func <DataType, object, DataAdditionResult> dataAction) { var dataAdditionResult = new DataAdditionResult(DataType.ASCIILine, -1); while (true) { if (dataAdditionResult.NextDataType == DataType.ASCIILine) { string line; if ((line = await ReadASCIILineAsync()) == null) { return(false); } if (line.StartsWith(DataSetDelimiter, StringComparison.InvariantCultureIgnoreCase)) { return(true); } dataAdditionResult = dataAction(dataAdditionResult.NextDataType, line); continue; } if (dataAdditionResult.NextDataType == DataType.BinaryData) { dataAdditionResult = await ProcessBinaryData(dataAdditionResult, dataAction); continue; } return(false); } }
private async Task <DataAdditionResult> ProcessBinaryData(DataAdditionResult previousDataAdditionResult, Func <DataType, object, DataAdditionResult> dataAction) { var byteBuffer = new byte[previousDataAdditionResult.NextDataLength]; if (await ReadBytesAsync(byteBuffer, 0, byteBuffer.Length) < byteBuffer.Length) { throw new InvalidDataException("Stream is ended before all bytes could be read."); } return(dataAction(previousDataAdditionResult.NextDataType, byteBuffer)); }