Beispiel #1
0
        private static byte CreateHeaderByte(ElementTypeDescriptor etd, SizeIndex sizeIndex)
        {
            System.Diagnostics.Debug.Assert((int)etd < 32);
            byte headerByte = (byte)((int)etd << ServiceRecordParser.ElementTypeDescriptorOffset);

            System.Diagnostics.Debug.Assert((int)sizeIndex < 8);
            headerByte |= (byte)sizeIndex;
            return(headerByte);
        }
Beispiel #2
0
        private int WriteHeaderFixedLength(ElementTypeDescriptor elementTypeDescriptor, int contentLength,
                                           byte[] buf, int offset,
                                           out int totalLength)
        {
            SizeIndex sizeIndex = FixedLengthToSizeIndex(contentLength);
            int       len       = WriteHeaderFixedLength_(elementTypeDescriptor, contentLength, sizeIndex, buf, offset, out totalLength);

            return(len);
        }
Beispiel #3
0
 internal HeaderWriteState(ElementTypeDescriptor elementTypeDescriptor, byte[] buf, int offset, SizeIndex sizeIndex, int headerLength)
 {
     this.Etd          = elementTypeDescriptor;
     this.HeaderOffset = offset;
     this.SizeIndex    = sizeIndex;
     this.HeaderLength = headerLength;
     //
     VerifyWriteSpaceRemaining(HeaderLength, buf, offset);
     ServiceRecordParser.VerifyAllowedSizeIndex(Etd, SizeIndex, false);
 }
Beispiel #4
0
        //----
        static int FromSizeIndex(SizeIndex sizeIndex)
        {
            int len;

            switch (sizeIndex)
            {
            case SizeIndex.LengthOneByteOrNil:
                len = 1;
                break;

            case SizeIndex.LengthTwoBytes:
                len = 2;
                break;

            case SizeIndex.LengthFourBytes:
                len = 4;
                break;

            case SizeIndex.LengthEightBytes:
                len = 8;
                break;

            case SizeIndex.LengthSixteenBytes:
                len = 16;
                break;

            case SizeIndex.AdditionalUInt8:
                len = 1;
                break;

            case SizeIndex.AdditionalUInt16:
                len = 1;
                break;

            case SizeIndex.AdditionalUInt32:
                len = 1;
                break;

            default:
                len = 1;
                break;
            }
            return(len);
        }
Beispiel #5
0
        private void DoTest(ElementTypeDescriptor expectedEtd, SizeIndex expectedSizeIndex, byte headerByte)
        {
            ServiceRecordParser parser = new ServiceRecordParser();
            //
            // Test the (original) individual methods.
            ElementTypeDescriptor resultEtd = ServiceRecordParser.GetElementTypeDescriptor(headerByte);

            Assert.AreEqual(expectedEtd, resultEtd);
            //
            SizeIndex resultSI = ServiceRecordParser.GetSizeIndex(headerByte);

            Assert.AreEqual(expectedSizeIndex, resultSI);
            //
            // Test the single method (which calls each of the individual methods).
            ElementTypeDescriptor resultEtd2;
            SizeIndex             resultSI2;

            ServiceRecordParser.SplitHeaderByte(headerByte, out resultEtd2, out resultSI2);
            Assert.AreEqual(expectedEtd, resultEtd2);
            Assert.AreEqual(expectedSizeIndex, resultSI2);
        }
Beispiel #6
0
        private static void Map(StackConsts.SdpType_uint8_t sdpDataElementType,
                                out ElementTypeDescriptor etd, out SizeIndex sizeIndex)
        {
            const SizeIndex NotUsed = SizeIndex.LengthOneByteOrNil;

            switch (sdpDataElementType)
            {
            // Signed/Unsigned Integer
            case StackConsts.SdpType_uint8_t.UINT8:
                etd       = ElementTypeDescriptor.UnsignedInteger;
                sizeIndex = SizeIndex.LengthOneByteOrNil;
                break;

            case StackConsts.SdpType_uint8_t.INT8:
                etd       = ElementTypeDescriptor.TwosComplementInteger;
                sizeIndex = SizeIndex.LengthOneByteOrNil;
                break;

            case StackConsts.SdpType_uint8_t.UINT16:
                etd       = ElementTypeDescriptor.UnsignedInteger;
                sizeIndex = SizeIndex.LengthTwoBytes;
                break;

            case StackConsts.SdpType_uint8_t.INT16:
                etd       = ElementTypeDescriptor.TwosComplementInteger;
                sizeIndex = SizeIndex.LengthTwoBytes;
                break;

            case StackConsts.SdpType_uint8_t.UINT32:
                etd       = ElementTypeDescriptor.UnsignedInteger;
                sizeIndex = SizeIndex.LengthFourBytes;
                break;

            case StackConsts.SdpType_uint8_t.INT32:
                etd       = ElementTypeDescriptor.TwosComplementInteger;
                sizeIndex = SizeIndex.LengthFourBytes;
                break;

            case StackConsts.SdpType_uint8_t.UINT64:
                etd       = ElementTypeDescriptor.UnsignedInteger;
                sizeIndex = SizeIndex.LengthEightBytes;
                break;

            case StackConsts.SdpType_uint8_t.INT64:
                etd       = ElementTypeDescriptor.TwosComplementInteger;
                sizeIndex = SizeIndex.LengthEightBytes;
                break;

            case StackConsts.SdpType_uint8_t.UINT128:
                etd       = ElementTypeDescriptor.UnsignedInteger;
                sizeIndex = SizeIndex.LengthSixteenBytes;
                break;

            case StackConsts.SdpType_uint8_t.INT128:
                etd       = ElementTypeDescriptor.TwosComplementInteger;
                sizeIndex = SizeIndex.LengthSixteenBytes;
                break;

            // Strings
            case StackConsts.SdpType_uint8_t.TEXT_STR_UNSPEC:
            case StackConsts.SdpType_uint8_t.TEXT_STR8:
            case StackConsts.SdpType_uint8_t.TEXT_STR16:
            case StackConsts.SdpType_uint8_t.TEXT_STR32:
                etd       = ElementTypeDescriptor.TextString;
                sizeIndex = NotUsed;
                break;

            case StackConsts.SdpType_uint8_t.URL_STR_UNSPEC:
            case StackConsts.SdpType_uint8_t.URL_STR8:
            case StackConsts.SdpType_uint8_t.URL_STR16:
            case StackConsts.SdpType_uint8_t.URL_STR32:
                etd       = ElementTypeDescriptor.Url;
                sizeIndex = NotUsed;
                break;

            // UUID
            case StackConsts.SdpType_uint8_t.UUID16:
                etd       = ElementTypeDescriptor.Uuid;
                sizeIndex = SizeIndex.LengthTwoBytes;
                break;

            case StackConsts.SdpType_uint8_t.UUID32:
                etd       = ElementTypeDescriptor.Uuid;
                sizeIndex = SizeIndex.LengthFourBytes;
                break;

            case StackConsts.SdpType_uint8_t.UUID128:
                etd       = ElementTypeDescriptor.Uuid;
                sizeIndex = SizeIndex.LengthSixteenBytes;
                break;

            case StackConsts.SdpType_uint8_t.UUID_UNSPEC:
                throw new NotSupportedException("UUID_UNSPEC");

            // Seq/Alt
            case StackConsts.SdpType_uint8_t.SEQ_UNSPEC:
            case StackConsts.SdpType_uint8_t.SEQ8:
            case StackConsts.SdpType_uint8_t.SEQ16:
            case StackConsts.SdpType_uint8_t.SEQ32:
                etd       = ElementTypeDescriptor.ElementSequence;
                sizeIndex = NotUsed;
                break;

            case StackConsts.SdpType_uint8_t.ALT_UNSPEC:
            case StackConsts.SdpType_uint8_t.ALT8:
            case StackConsts.SdpType_uint8_t.ALT16:
            case StackConsts.SdpType_uint8_t.ALT32:
                etd       = ElementTypeDescriptor.ElementAlternative;
                sizeIndex = NotUsed;
                break;

            // Nil/Boolean/etc.
            case StackConsts.SdpType_uint8_t.BOOL:
                etd       = ElementTypeDescriptor.Boolean;
                sizeIndex = SizeIndex.LengthOneByteOrNil;
                break;

            case StackConsts.SdpType_uint8_t.DATA_NIL:
                etd       = ElementTypeDescriptor.Nil;
                sizeIndex = SizeIndex.LengthOneByteOrNil;
                break;

            //
            default:
                Debug.Fail("Unexpected SdpType_uint8_t: 0x" + ((int)sdpDataElementType).ToString("X"));
                etd       = ElementTypeDescriptor.Unknown;
                sizeIndex = SizeIndex.AdditionalUInt32;
                break;
            }
        }
Beispiel #7
0
        private static void Map(StackConsts.SDP_Data_Element_Type sdpDataElementType,
                                out ElementTypeDescriptor etd, out SizeIndex sizeIndex)
        {
            const SizeIndex NotUsed = SizeIndex.LengthOneByteOrNil;

            switch (sdpDataElementType)
            {
            // Signed/Unsigned Integer
            case StackConsts.SDP_Data_Element_Type.UnsignedInteger1Byte:
                etd       = ElementTypeDescriptor.UnsignedInteger;
                sizeIndex = SizeIndex.LengthOneByteOrNil;
                break;

            case StackConsts.SDP_Data_Element_Type.SignedInteger1Byte:
                etd       = ElementTypeDescriptor.TwosComplementInteger;
                sizeIndex = SizeIndex.LengthOneByteOrNil;
                break;

            case StackConsts.SDP_Data_Element_Type.UnsignedInteger2Bytes:
                etd       = ElementTypeDescriptor.UnsignedInteger;
                sizeIndex = SizeIndex.LengthTwoBytes;
                break;

            case StackConsts.SDP_Data_Element_Type.SignedInteger2Bytes:
                etd       = ElementTypeDescriptor.TwosComplementInteger;
                sizeIndex = SizeIndex.LengthTwoBytes;
                break;

            case StackConsts.SDP_Data_Element_Type.UnsignedInteger4Bytes:
                etd       = ElementTypeDescriptor.UnsignedInteger;
                sizeIndex = SizeIndex.LengthFourBytes;
                break;

            case StackConsts.SDP_Data_Element_Type.SignedInteger4Bytes:
                etd       = ElementTypeDescriptor.TwosComplementInteger;
                sizeIndex = SizeIndex.LengthFourBytes;
                break;

            case StackConsts.SDP_Data_Element_Type.UnsignedInteger8Bytes:
                etd       = ElementTypeDescriptor.UnsignedInteger;
                sizeIndex = SizeIndex.LengthEightBytes;
                break;

            case StackConsts.SDP_Data_Element_Type.SignedInteger8Bytes:
                etd       = ElementTypeDescriptor.TwosComplementInteger;
                sizeIndex = SizeIndex.LengthEightBytes;
                break;

            case StackConsts.SDP_Data_Element_Type.UnsignedInteger16Bytes:
                etd       = ElementTypeDescriptor.UnsignedInteger;
                sizeIndex = SizeIndex.LengthSixteenBytes;
                break;

            case StackConsts.SDP_Data_Element_Type.SignedInteger16Bytes:
                etd       = ElementTypeDescriptor.TwosComplementInteger;
                sizeIndex = SizeIndex.LengthSixteenBytes;
                break;

            // Strings
            case StackConsts.SDP_Data_Element_Type.TextString:
                etd       = ElementTypeDescriptor.TextString;
                sizeIndex = NotUsed;
                break;

            case StackConsts.SDP_Data_Element_Type.URL:
                etd       = ElementTypeDescriptor.Url;
                sizeIndex = NotUsed;
                break;

            // UUID
            case StackConsts.SDP_Data_Element_Type.UUID_16:
                etd       = ElementTypeDescriptor.Uuid;
                sizeIndex = SizeIndex.LengthTwoBytes;
                break;

            case StackConsts.SDP_Data_Element_Type.UUID_32:
                etd       = ElementTypeDescriptor.Uuid;
                sizeIndex = SizeIndex.LengthTwoBytes;
                break;

            case StackConsts.SDP_Data_Element_Type.UUID_128:
                etd       = ElementTypeDescriptor.Uuid;
                sizeIndex = SizeIndex.LengthFourBytes;
                break;

            // Seq/Alt
            case StackConsts.SDP_Data_Element_Type.Sequence:
                etd       = ElementTypeDescriptor.ElementSequence;
                sizeIndex = NotUsed;
                break;

            case StackConsts.SDP_Data_Element_Type.Alternative:
                etd       = ElementTypeDescriptor.ElementAlternative;
                sizeIndex = NotUsed;
                break;

            // Nil/Boolean/etc.
            case StackConsts.SDP_Data_Element_Type.Boolean:
                etd       = ElementTypeDescriptor.Boolean;
                sizeIndex = SizeIndex.LengthOneByteOrNil;
                break;

            case StackConsts.SDP_Data_Element_Type.NIL:
                etd       = ElementTypeDescriptor.Nil;
                sizeIndex = SizeIndex.LengthOneByteOrNil;
                break;

            case StackConsts.SDP_Data_Element_Type.NULL:
                Debug.Fail("SDP_Data_Element_Type.deNULL");
                etd       = ElementTypeDescriptor.Unknown;
                sizeIndex = SizeIndex.LengthOneByteOrNil;
                break;

            //
            default:
                Debug.Fail("Unexpected SDP_Data_Element_Type: 0x" + ((int)sdpDataElementType).ToString("X"));
                etd       = ElementTypeDescriptor.Unknown;
                sizeIndex = SizeIndex.AdditionalUInt32;
                break;
            }
        }
Beispiel #8
0
        private int WriteHeaderFixedLength_(ElementTypeDescriptor elementTypeDescriptor, int contentLength, SizeIndex sizeIndex,
                                            byte[] buf, int offset,
                                            out int totalLength)
        {
            System.Diagnostics.Debug.Assert(
                sizeIndex == SizeIndex.LengthOneByteOrNil ||
                sizeIndex == SizeIndex.LengthTwoBytes ||
                sizeIndex == SizeIndex.LengthFourBytes ||
                sizeIndex == SizeIndex.LengthEightBytes ||
                sizeIndex == SizeIndex.LengthSixteenBytes);
            ServiceRecordParser.VerifyAllowedSizeIndex(elementTypeDescriptor, sizeIndex, false);
            HeaderWriteState headerState = new HeaderWriteState(elementTypeDescriptor, buf, offset, sizeIndex, 1);

            CompleteHeaderWrite(headerState, buf, offset + contentLength + headerState.HeaderLength, out totalLength);
            return(headerState.HeaderLength);
        }
 internal HeaderWriteState(ElementTypeDescriptor elementTypeDescriptor, byte[] buf, int offset, SizeIndex sizeIndex, int headerLength)
 {
     this.Etd = elementTypeDescriptor;
     this.HeaderOffset = offset;
     this.SizeIndex = sizeIndex;
     this.HeaderLength = headerLength;
     //
     VerifyWriteSpaceRemaining(HeaderLength, buf, offset);
     ServiceRecordParser.VerifyAllowedSizeIndex(Etd, SizeIndex, false);
 }
 private static byte CreateHeaderByte(ElementTypeDescriptor etd, SizeIndex sizeIndex)
 {
     System.Diagnostics.Debug.Assert((int)etd < 32);
     byte headerByte = (byte)((int)etd << ServiceRecordParser.ElementTypeDescriptorOffset);
     System.Diagnostics.Debug.Assert((int)sizeIndex < 8);
     headerByte |= (byte)sizeIndex;
     return headerByte;
 }
 private int WriteHeaderFixedLength_(ElementTypeDescriptor elementTypeDescriptor, int contentLength, SizeIndex sizeIndex,
     byte[] buf, int offset,
     out int totalLength)
 {
     System.Diagnostics.Debug.Assert(
         sizeIndex == SizeIndex.LengthOneByteOrNil
         || sizeIndex == SizeIndex.LengthTwoBytes
         || sizeIndex == SizeIndex.LengthFourBytes
         || sizeIndex == SizeIndex.LengthEightBytes
         || sizeIndex == SizeIndex.LengthSixteenBytes);
     ServiceRecordParser.VerifyAllowedSizeIndex(elementTypeDescriptor, sizeIndex, false);
     HeaderWriteState headerState = new HeaderWriteState(elementTypeDescriptor, buf, offset, sizeIndex, 1);
     CompleteHeaderWrite(headerState, buf, offset + contentLength + headerState.HeaderLength, out totalLength);
     return headerState.HeaderLength;
 }