public void ReadBytes(int length, IntrusiveByteArrayWriter writer) { if (length > 0) { writer.EnsureCapacity(length); var bytesRead = stream.Read(writer.Buffer, writer.Length, length); if (bytesRead == -1) throw new IOException("Could not read bytes from the stream"); while (bytesRead < length) { var t = stream.Read(writer.Buffer, writer.Length + bytesRead, length - bytesRead); if (bytesRead == -1) throw new IOException("Could not read bytes from the stream"); bytesRead += t; } // TODO: *puke* writer.Length += bytesRead; } }
internal InputStreamBytes(IntrusiveByteArrayWriter writer) { this.Bytes = writer.Buffer; this.Length = writer.Length; }
public IResponseState Parse(Header header, IEndianAwareReader reader) { // How many bytes will we read from the stream? var numBytes = reader.ReadInt32(); // Fill the byte array with bytes left from the previous read. // This is neccessary when reading chunks of data var writer = new IntrusiveByteArrayWriter(); writer.Insert(previousState.BytesLeft); // Read the bytes into the intrusive byte array reader.ReadBytes(numBytes, writer); if (writer.Length > 0) { if (header.IsMultipart) return ReadJournal(new InputStreamBytes(writer), false); else return ReadJournal(new InputStreamBytes(writer), true); } else return new ReadJournalResponseState(0, new List<Event>(), true, new byte[0]); }