Microsoft.Protocols.TestTools.StackSdk.RemoteDesktop.Rdpeudp.RdpeudpSocket.CreateAckVectorHeader C# (CSharp) Method

CreateAckVectorHeader() public method

Create RDPUDP_ACK_VECTOR_HEADER Structure for packet sending
public CreateAckVectorHeader ( ) : RDPUDP_ACK_VECTOR_HEADER
return RDPUDP_ACK_VECTOR_HEADER
        public RDPUDP_ACK_VECTOR_HEADER CreateAckVectorHeader()
        {
            RDPUDP_ACK_VECTOR_HEADER ackVectorHeader = new RDPUDP_ACK_VECTOR_HEADER();
            if (inPacketDic.Count == 0)
            {
                // Not receive any source packet
                ackVectorHeader.uAckVectorSize = 0;
                ackVectorHeader.AckVectorElement = null;
                ackVectorHeader.Padding = null;
            }
            else
            {
                lock (inPacketDic)
                {
                    // Generate an ACK header.
                    List<AckVector> ackVectorElements = new List<AckVector>();
                    VECTOR_ELEMENT_STATE currentState = inPacketDic.ContainsKey(InSnAckOfAcksSeqNum) ? VECTOR_ELEMENT_STATE.DATAGRAM_RECEIVED : VECTOR_ELEMENT_STATE.DATAGRAM_NOT_YET_RECEIVED;
                    AckVector ackVectorElement = new AckVector();
                    ackVectorElement.State = currentState;
                    ackVectorElement.Length = 0;

                    // RLE encoding.
                    for (uint i = InSnAckOfAcksSeqNum + 1; i <= SnSourceAck; i++)
                    {
                        currentState = inPacketDic.ContainsKey(i) ? VECTOR_ELEMENT_STATE.DATAGRAM_RECEIVED : VECTOR_ELEMENT_STATE.DATAGRAM_NOT_YET_RECEIVED;

                        // 0x40 is the max length of state length, of which I believe sould be indicate from soket config or types config not hard code here.
                        if (currentState != ackVectorElement.State || ackVectorElement.Length >= 0x40)
                        {
                            // If current state differs from last state, assign a new ack vector.
                            ackVectorElements.Add(ackVectorElement);
                            ackVectorElement = new AckVector();
                            ackVectorElement.State = currentState;
                            ackVectorElement.Length = 0;
                        }
                        else
                        {
                            // Else count++.
                            ackVectorElement.Length++;
                        }
                    }
                    ackVectorElements.Add(ackVectorElement);
                    ackVectorHeader.uAckVectorSize = (ushort)ackVectorElements.Count;
                    ackVectorHeader.AckVectorElement = ackVectorElements.ToArray();

                    // ACK Vector created for all received packet, set number of received packets for ACK to 0
                    sourceNumNotAcked = 0;
                }
            }

            return ackVectorHeader;
        }