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;
}