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; }
private void createCurrentIncomingFrame(int payloadSize) { currentIncomingFrame = new IncomingFrame(payloadSize); }
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."); } }