Пример #1
0
        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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
            }
        }