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); } }
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; }
/** * 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; }
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; }
/// <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); }
/// <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); }
public static int GetId(this MaxSegments segments) { return((int)segments); }