示例#1
0
        internal virtual bool accumulate(
            int frameNumber, int headerSize, IncomingFrame frame)
        {
            if (frameNumber == 1)
            {
                // this is the first frame for this message
                // (the header size is taken from the first frame only,
                // information from other frames is ignored)
                messageHeaderSize = headerSize;
            }

            int realFrameNumber;

            if (frameNumber >= 0)
            {
                realFrameNumber = frameNumber;
            }
            else
            {
                // the given frame is a closing one
                realFrameNumber        = -frameNumber;
                messageLastFrameNumber = realFrameNumber;
            }

            if (frames.Keys.Contains(realFrameNumber))
            {
                // the frame with the same number was already store
                // - treat it as malformed network junk
                throw new UnexpectedValueException(
                          "Corrupted message received.");
            }

            frames.Add(realFrameNumber, frame);

            if (messageLastFrameNumber != 0)
            {
                // the last frame was already stored for this message
                // - the message is complete if all other frames
                // are already collected
                return(frames.Count == messageLastFrameNumber);
            }

            // the last frame was not yet received
            // - the message is not complete
            return(false);
        }
        internal virtual bool accumulate(
            int frameNumber, int headerSize, IncomingFrame frame)
        {
            if (frameNumber == 1)
            {
            // this is the first frame for this message
            // (the header size is taken from the first frame only,
            // information from other frames is ignored)
                messageHeaderSize = headerSize;
            }

            int realFrameNumber;
            if (frameNumber >= 0)
            {
                realFrameNumber = frameNumber;
            }
            else
            {
            // the given frame is a closing one
                realFrameNumber = -frameNumber;
                messageLastFrameNumber = realFrameNumber;
            }

            if(frames.Keys.Contains(realFrameNumber))
            {
                // the frame with the same number was already store
                // - treat it as malformed network junk
                throw new UnexpectedValueException(
                    "Corrupted message received.");
            }

            frames.Add(realFrameNumber, frame);

            if (messageLastFrameNumber != 0)
            {
            // the last frame was already stored for this message
            // - the message is complete if all other frames
            // are already collected
                return frames.Count == messageLastFrameNumber;
            }

            // the last frame was not yet received
            // - the message is not complete
            return false;
        }
示例#3
0
 private void createCurrentIncomingFrame(int payloadSize)
 {
     currentIncomingFrame = new IncomingFrame(payloadSize);
 }
示例#4
0
        internal virtual void getAllBuffers(
            IList <byte[]> headerBuffers, IList <byte[]> bodyBuffers)
        {
            int remainedForHeader = messageHeaderSize;

            for (int frameNumber = 1;
                 frameNumber <= messageLastFrameNumber;
                 ++frameNumber)
            {
                IncomingFrame frame           = frames[Convert.ToInt32(frameNumber)];
                byte[]        frameData       = frame.data;
                int           frameDataLength = frameData.Length;

                if (remainedForHeader > 0)
                {
                    // there is still some header data to be collected

                    if (frameDataLength > remainedForHeader)
                    {
                        // this frame needs to be split
                        // between header and body parts

                        byte[] headerPart = new byte[remainedForHeader];
                        Array.Copy(frameData, headerPart, remainedForHeader);

                        byte[] bodyPart =
                            new byte[frameDataLength - remainedForHeader];
                        Array.Copy(
                            frameData, remainedForHeader,
                            bodyPart, 0, bodyPart.Length
                            );

                        headerBuffers.Add(headerPart);
                        bodyBuffers.Add(bodyPart);

                        remainedForHeader -= headerPart.Length;
                    }
                    else
                    {
                        // this frame contains only header data

                        headerBuffers.Add(frameData);

                        remainedForHeader -= frameDataLength;
                    }
                }
                else
                {
                    // this frame contains only body data

                    bodyBuffers.Add(frameData);
                }
            }

            if (remainedForHeader > 0)
            {
                // the collection of frames does not have enough data
                // for the message header

                throw new UnexpectedValueException(
                          "Corrupted message received.");
            }
        }
示例#5
0
 private void createCurrentIncomingFrame(int payloadSize)
 {
     currentIncomingFrame = new IncomingFrame(payloadSize);
 }