public StackPacket DecodePdu(byte[] data)
{
// Check data length
if (null == data)
{
throw new FormatException(ConstValue.ERROR_MESSAGE_DATA_NULL_REF);
}
if (0 == data.Length)
{
throw new FormatException(ConstValue.ERROR_MESSAGE_DATA_INDEX_OUT_OF_RANGE);
}
// Check slow-path/fast-path type
StackPacket pdu = null;
if (ConstValue.SLOW_PATH_PDU_INDICATOR_VALUE == data[ConstValue.SLOW_PATH_PDU_INDICATOR_INDEX])
{
// Slow-Path Situation
if (data.Length <= ConstValue.X224_TPDU_TYPE_INDICATOR_INDEX)
{
throw new FormatException(ConstValue.ERROR_MESSAGE_DATA_INDEX_OUT_OF_RANGE);
}
X224_TPDU_TYPE x224Type = (X224_TPDU_TYPE)data[ConstValue.X224_TPDU_TYPE_INDICATOR_INDEX];
switch (x224Type)
{
// X224 Connection Confirm PDU
case X224_TPDU_TYPE.ConnectionConfirm:
pdu = DecodeX224ConnectionConfirmPDU(data);
break;
// MCS PDU
case X224_TPDU_TYPE.Data:
pdu = SwitchDecodeMcsPDU(data);
break;
default:
throw new FormatException(ConstValue.ERROR_MESSAGE_ENUM_UNRECOGNIZED);
}
}
else
{
// Fast-Path Situation
pdu = DecodeTsFpUpdatePDU(data);
}
return pdu;
}