// Copyright (c) 2010, Peter Smith
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// Redistributions of source code must retain the above copyright notice, this list
// of conditions and the following disclaimer.
//
// Redistributions in binary form must reproduce the above copyright notice, this
// list of conditions and the following disclaimer in the documentation and/or
// other materials provided with the distribution.
//
// Neither the name of the Author nor the names of its contributors may be used to
// endorse or promote products derived from this software without specific prior
// written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
// OF THE POSSIBILITY OF SUCH DAMAGE.
namespace PS
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/// <summary>
/// Override needed for the DIS VOIP implementation
/// </summary>
public class PDUProcessorClass_Overrides : DISnet.Utilities.PDUProcessor
{
#region Methods
protected override List<byte[]> ProcessRawPDU(byte[] buf)
{
List<byte[]> pduCollection = new List<byte[]>();
if (buf.Length < 1)
{
return pduCollection;
}
int length = buf.Length;
byte pdu_type;
byte pdu_version;
int countBytes = 0;
uint pduLength = 0;
//used to interate over all PDU(s) within the byte array
while (countBytes < length)
{
try
{
if (this.edian == DISnet.DataStreamUtilities.EndianTypes.Endian.BIG)
{
Array.Reverse(buf, (int)PDU_LENGTH_POSITION + countBytes, 2);
}
pduLength = System.BitConverter.ToUInt16(buf, (int)PDU_LENGTH_POSITION + countBytes);
//Must be at end of datastream
if (pduLength == 0)
break;
pdu_type = buf[PDU_TYPE_POSITION + countBytes];
pdu_version = buf[PDU_VERSION_POSITION + countBytes];
//Only care about Transmit or Signal PDU
if (pdu_type == 25 || pdu_type == 26)
{
byte[] PDUBufferStorage = new byte[pduLength];
//Could potentially be a problem since pduLength is an unsigned int,
//changed due to windows mobile does not accept a long for 4th parameter
Array.Copy(buf, countBytes, PDUBufferStorage, 0, (int)pduLength);
pduCollection.Add(PDUBufferStorage);
}
countBytes += (int)pduLength;
}
catch (Exception ex)//Wow something bad just happened, could be bad/misalgined PDU
{
break;
}
}
return pduCollection;
}
#endregion Methods
}
}