private void PerformDefaultSegmentHandling(BacnetClient sender, BacnetAddress adr, BacnetPduTypes type, BacnetConfirmedServices service, byte invoke_id, BacnetMaxSegments max_segments, BacnetMaxAdpu max_adpu, byte sequence_number, bool first, bool more_follows, byte[] buffer, int offset, int length)
{
if (first)
{
//clear any leftover segments
m_segments.Clear();
//copy buffer + encode new adpu header
type &= ~BacnetPduTypes.SEGMENTED_MESSAGE;
int adpu_header_len = 3;
if ((type & BacnetPduTypes.PDU_TYPE_MASK) == BacnetPduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST) adpu_header_len = 4;
byte[] copy = new byte[length + adpu_header_len];
Array.Copy(buffer, offset, copy, adpu_header_len, length);
if ((type & BacnetPduTypes.PDU_TYPE_MASK) == BacnetPduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST)
APDU.EncodeConfirmedServiceRequest(new EncodeBuffer(copy, 0), type, service, max_segments, max_adpu, invoke_id, 0, 0);
else
APDU.EncodeComplexAck(new EncodeBuffer(copy, 0), type, service, invoke_id, 0, 0);
m_segments.AddLast(copy); //doesn't include BVLC or NPDU
}
else
{
//copy only content part
byte[] copy = new byte[length];
Array.Copy(buffer, offset, copy, 0, copy.Length);
m_segments.AddLast(copy);
}
//process when finished
if (!more_follows)
{
//assemble whole part
byte[] apdu_buffer = AssembleSegments();
m_segments.Clear();
//process
ProcessApdu(adr, type, apdu_buffer, 0, apdu_buffer.Length);
}
}