public override int Read(byte[] buffer, int offset, int count) { if (!CanRead) { throw new IOException("The stream does not currently support reading."); } ByteBufferChecks(buffer, offset, count); int currentOffset = offset; int currentCount = count; int totalLength = 0; int length; do { if (FragmentCurrent == null || !FragmentCurrent.CanRead) { FragmentReadNext(); } length = FragmentCurrent.Read(buffer, currentOffset, currentCount); totalLength += length; currentOffset += length; currentCount -= length; Position += totalLength; //if (CompletionCheck()) // break; }while (currentCount > 0 && CanRead); return(totalLength); }
/// <summary> /// This method loads the message for read access. /// </summary> /// <param name="buffer">The buffer to load from.</param> /// <param name="offset">The offset.</param> /// <param name="count">The data length.</param> public override int Load(byte[] buffer, int offset, int count) { if (Loaded) { throw new MessageLoadException("The message is already loaded."); } if (Initializing) { throw new MessageLoadException("The message is in the initialization phase."); } ByteBufferChecks(buffer, offset, count); int currentOffset = offset; int currentCount = count; int totalLength = 0; int length; do { if (FragmentCurrent == null || !FragmentCurrent.CanWrite) { FragmentSetNext(); } length = FragmentCurrent.Load(buffer, currentOffset, currentCount); totalLength += length; currentOffset += length; currentCount -= length; if (CompletionCheck()) { break; } }while (currentCount > 0); Direction = MessageDirection.Read; Position = 0; return(totalLength); }
/// <summary> /// This method writes bytes to the message. /// </summary> /// <param name="buffer">The buffer to read from.</param> /// <param name="offset">The buffer offset.</param> /// <param name="count">The number of bytes to read from the buffer.</param> /// <returns>Returns the number of bytes read from the buffer.</returns> public override int Write(byte[] buffer, int offset, int count) { if (!CanWrite) { throw new IOException("The stream does not currently support writing."); } ByteBufferChecks(buffer, offset, count); lock (syncAccess) { int currentOffset = offset; int currentCount = count; int totalLength = 0; int length; do { if (FragmentCurrent == null || !FragmentCurrent.CanWrite) { FragmentSetNext(); } length = FragmentCurrent.Write(buffer, currentOffset, currentCount); totalLength += length; currentOffset += length; currentCount -= length; if (CompletionCheck()) { break; } }while (currentCount > 0); if (FragmentCurrent == null || !FragmentCurrent.CanWrite && !CompletionCheck()) { FragmentSetNext(); } return(totalLength); } }