Пример #1
0
        public static int GetMaxSegments(this MaxSegments segments)
        {
            switch (segments)
            {
            case MaxSegments.UP_TO_2:
                return(2);

            case MaxSegments.UP_TO_4:
                return(4);

            case MaxSegments.UP_TO_8:
                return(8);

            case MaxSegments.UP_TO_16:
                return(16);

            case MaxSegments.UP_TO_32:
                return(32);

            case MaxSegments.UP_TO_64:
                return(64);

            case MaxSegments.MORE_THAN_64:
            case MaxSegments.UNSPECIFIED:
            default:
                return(int.MaxValue);
            }
        }
Пример #2
0
        public ConfirmedRequest(bool segmentedMessage, bool moreFollows, bool segmentedResponseAccepted,
                                MaxSegments maxSegmentsAccepted, MaxApduLength maxApduLengthAccepted, byte invokeId, int sequenceNumber,
                                int proposedWindowSize, byte serviceChoice, ByteStream serviceData)
        {
            setFields(segmentedMessage, moreFollows, segmentedResponseAccepted, maxSegmentsAccepted,
                      maxApduLengthAccepted,
                      invokeId, sequenceNumber, proposedWindowSize, serviceChoice);

            ServiceData = serviceData;
        }
Пример #3
0
        /**
         * This field is used to allow parsing of only the APDU so that those fields are available in case there is a
         * problem parsing the service request.
         */

        public ConfirmedRequest(bool segmentedMessage, bool moreFollows, bool segmentedResponseAccepted,
                                MaxSegments maxSegmentsAccepted, MaxApduLength maxApduLengthAccepted, byte invokeId, int sequenceNumber,
                                int proposedWindowSize, ConfirmedRequestService serviceRequest)
        {
            setFields(segmentedMessage, moreFollows, segmentedResponseAccepted, maxSegmentsAccepted,
                      maxApduLengthAccepted,
                      invokeId, sequenceNumber, proposedWindowSize, serviceRequest.ChoiceId);

            ServiceRequest = serviceRequest;
        }
Пример #4
0
 private void setFields(bool segmentedMessage, bool moreFollows, bool segmentedResponseAccepted,
                        MaxSegments maxSegmentsAccepted, MaxApduLength maxApduLengthAccepted, byte invokeId, int sequenceNumber,
                        int proposedWindowSize, byte serviceChoice)
 {
     IsSegmentedMessage          = segmentedMessage;
     IsMoreFollows               = moreFollows;
     IsSegmentedResponseAccepted = segmentedResponseAccepted;
     MaxSegmentsAccepted         = maxSegmentsAccepted;
     MaxApduLengthAccepted       = maxApduLengthAccepted;
     InvokeId           = invokeId;
     SequenceNumber     = sequenceNumber;
     ProposedWindowSize = proposedWindowSize;
     this.serviceChoice = serviceChoice;
 }
Пример #5
0
        /// <summary>
        /// Serializes the confirmed request message
        /// to a buffer
        /// </summary>
        /// <param name="buffer">The buffer to serialize to</param>
        /// <param name="offset">The offset to begin serializing</param>
        /// <returns>The new offset</returns>
        public int Serialize(byte[] buffer, int offset)
        {
            byte header = (byte)Type;

            header         <<= 4;
            header          |= (byte)(Segmented ? 0x08 : 0x00);
            header          |= (byte)(MoreFollows ? 0x04 : 0x00);
            header          |= (byte)(SegmentedResponseAccepted ? 0x02 : 0x00);
            buffer[offset++] = header;

            MaxSegments      maxSegments      = MaxSegments.Unspecified;
            MaxAppgramLength maxAppgramLength = MaxAppgramLength._50;

            if (MaxSegmentsAccepted > 64)
            {
                maxSegments = MaxSegments.GreaterThanSixtyFour;
            }
            else if (MaxSegmentsAccepted == 64)
            {
                maxSegments = MaxSegments.SixtyFour;
            }
            else if (MaxSegmentsAccepted >= 32)
            {
                maxSegments = MaxSegments.ThirtyTwo;
            }
            else if (MaxSegmentsAccepted >= 16)
            {
                maxSegments = MaxSegments.Sixteen;
            }
            else if (MaxSegmentsAccepted >= 8)
            {
                maxSegments = MaxSegments.Eight;
            }
            else if (MaxSegmentsAccepted >= 4)
            {
                maxSegments = MaxSegments.Four;
            }
            else if (MaxSegmentsAccepted >= 2)
            {
                maxSegments = MaxSegments.Two;
            }
            else
            {
                maxSegments = MaxSegments.Unspecified;
            }

            if (MaxAppgramLengthAccepted >= 1476)
            {
                maxAppgramLength = MaxAppgramLength._1476;
            }
            else if (MaxAppgramLengthAccepted >= 1024)
            {
                maxAppgramLength = MaxAppgramLength._1024;
            }
            else if (MaxAppgramLengthAccepted >= 480)
            {
                maxAppgramLength = MaxAppgramLength._480;
            }
            else if (MaxAppgramLengthAccepted >= 206)
            {
                maxAppgramLength = MaxAppgramLength._206;
            }
            else if (MaxAppgramLengthAccepted >= 128)
            {
                maxAppgramLength = MaxAppgramLength._128;
            }
            else if (MaxAppgramLengthAccepted >= 50)
            {
                maxAppgramLength = MaxAppgramLength._50;
            }
            else
            {
                throw new Exception("MaxAppgramLengthAccepted is small than minimum value");
            }

            header           = (byte)maxSegments;
            header         <<= 4;
            header          |= (byte)maxAppgramLength;
            buffer[offset++] = header;

            buffer[offset++] = InvokeId;
            if (Segmented)
            {
                buffer[offset++] = SequenceNumber;
                buffer[offset++] = ProposedWindowSize;
            }

            buffer[offset++] = ServiceChoice;

            return(offset);
        }
Пример #6
0
        /// <summary>
        /// Deserializes the confirmed request message
        /// from a buffer
        /// </summary>
        /// <param name="buffer">The buffer to deserialize from</param>
        /// <param name="offset">The offset to begin deserializing</param>
        /// <param name="end">The end of the buffer content</param>
        /// <returns>The new offset</returns>
        public int Deserialize(byte[] buffer, int offset, int end)
        {
            byte header = buffer.ReadUInt8(offset++);

            if ((MessageType)(header >> 4) != MessageType.ConfirmedRequest)
            {
                throw new Exception("Could not deserialize an unconfirmed request message");
            }

            this.Segmented   = (header & 0x08) > 0;
            this.MoreFollows = (header & 0x04) > 0;
            this.SegmentedResponseAccepted = (header & 0x02) > 0;

            header = buffer.ReadUInt8(offset++);
            MaxSegments      maxSegments      = (MaxSegments)((header & 0x70) >> 4);
            MaxAppgramLength maxAppgramLength = (MaxAppgramLength)(header & 0x0F);

            switch (maxSegments)
            {
            case MaxSegments.Unspecified:
                this.MaxSegmentsAccepted = 1;
                break;

            case MaxSegments.Two:
                this.MaxSegmentsAccepted = 2;
                break;

            case MaxSegments.Four:
                this.MaxSegmentsAccepted = 4;
                break;

            case MaxSegments.Eight:
                this.MaxSegmentsAccepted = 8;
                break;

            case MaxSegments.Sixteen:
                this.MaxSegmentsAccepted = 16;
                break;

            case MaxSegments.ThirtyTwo:
                this.MaxSegmentsAccepted = 32;
                break;

            case MaxSegments.SixtyFour:
                this.MaxSegmentsAccepted = 64;
                break;

            case MaxSegments.GreaterThanSixtyFour:
                this.MaxSegmentsAccepted = Int32.MaxValue;
                break;

            default:
                throw new Exception("Unrecognized max segments value");
            }

            switch (maxAppgramLength)
            {
            case MaxAppgramLength._50:
                this.MaxAppgramLengthAccepted = 50;
                break;

            case MaxAppgramLength._128:
                this.MaxAppgramLengthAccepted = 128;
                break;

            case MaxAppgramLength._206:
                this.MaxAppgramLengthAccepted = 206;
                break;

            case MaxAppgramLength._480:
                this.MaxAppgramLengthAccepted = 480;
                break;

            case MaxAppgramLength._1024:
                this.MaxAppgramLengthAccepted = 1024;
                break;

            case MaxAppgramLength._1476:
                this.MaxAppgramLengthAccepted = 1476;
                break;

            default:
                throw new Exception("Unrecognized max appgram length value");
            }

            this.InvokeId = buffer[offset++];
            if (this.Segmented)
            {
                this.SequenceNumber     = buffer[offset++];
                this.ProposedWindowSize = buffer[offset++];
            }
            this.ServiceChoice = buffer[offset++];

            return(offset);
        }
Пример #7
0
 public static int GetId(this MaxSegments segments)
 {
     return((int)segments);
 }