//----
        protected override int MakeVariableLengthHeader(byte[] buf, int offset,
                                                        ElementTypeDescriptor etd, out HeaderWriteState headerState)
        {
            bool seqOrAltToStore = false;

            if (!this.aboveBase)
            {
                Debug.Assert(etd == ElementTypeDescriptor.ElementSequence,
                             "Outer element is a SEQ!  Or are we called elsewhere!?");
                this.aboveBase = true;
            }
            else if (this.isInSeqOrAlt)
            {
                // Child of a SEQ/ALT, will be written from byte buffer.
            }
            else if (etd == ElementTypeDescriptor.ElementSequence ||
                     etd == ElementTypeDescriptor.ElementAlternative)
            {
                seqOrAltToStore = true;
            }
            //
            int ret = base.MakeVariableLengthHeader(buf, offset, etd, out headerState);

            //
            if (seqOrAltToStore)
            {
                this.isInSeqOrAlt = true; // Ignore individual elements
                headerState.widcommNeedsStoring = true;
            }
            return(ret);
        }
示例#2
0
 protected virtual int MakeVariableLengthHeader(byte[] buf, int offset, ElementTypeDescriptor elementTypeDescriptor, out HeaderWriteState headerState)
 {
     HackFxCopHintNonStaticMethod();
     // We only support one-byte length fields (currently?).
     headerState = new HeaderWriteState(elementTypeDescriptor, buf, offset, SizeIndex.AdditionalUInt8, 2);
     return(headerState.HeaderLength);
 }
示例#3
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);
        }
 protected override void CompleteHeaderWrite(HeaderWriteState headerState,
                                             byte[] buf, int offsetAtEndOfWritten, out int totalLength)
 {
     base.CompleteHeaderWrite(headerState, buf, offsetAtEndOfWritten, out totalLength);
     //
     if (headerState.widcommNeedsStoring)
     {
         Debug.Assert(!this.needWrite, "overwrite");
         Debug.Assert(this.isInSeqOrAlt);
         this.isInSeqOrAlt = false;
         int    startOffset = headerState.HeaderOffset + headerState.HeaderLength;
         byte[] val         = new byte[offsetAtEndOfWritten - startOffset];
         Array.Copy(buf, startOffset, val, 0, val.Length);
         this.value     = val;
         this.dt        = ToDESC_TYPE(headerState.Etd);
         this.needWrite = true;
     }
 }
示例#5
0
        protected virtual void CompleteHeaderWrite(HeaderWriteState headerState, byte[] buf, int offsetAtEndOfWritten, out int totalLength)
        {
            HackFxCopHintNonStaticMethod();
            byte headerByte = CreateHeaderByte(headerState.Etd, headerState.SizeIndex);

            buf[headerState.HeaderOffset] = headerByte;
            //
            if (headerState.SizeIndex == SizeIndex.LengthOneByteOrNil ||
                headerState.SizeIndex == SizeIndex.LengthTwoBytes ||
                headerState.SizeIndex == SizeIndex.LengthFourBytes ||
                headerState.SizeIndex == SizeIndex.LengthEightBytes ||
                headerState.SizeIndex == SizeIndex.LengthSixteenBytes)
            {
                // Nothing to write-out here.
                totalLength = offsetAtEndOfWritten - headerState.HeaderOffset;
            }
            else
            {
                System.Diagnostics.Debug.Assert(
                    headerState.SizeIndex == SizeIndex.AdditionalUInt8 ||
                    headerState.SizeIndex == SizeIndex.AdditionalUInt16 ||
                    headerState.SizeIndex == SizeIndex.AdditionalUInt32);
                int contentLength = offsetAtEndOfWritten - headerState.HeaderOffset - headerState.HeaderLength;
                System.Diagnostics.Debug.Assert(headerState.SizeIndex == SizeIndex.AdditionalUInt8,
                                                "WriteHeader not AdditionalUInt8 but that's all that MakeHeaderSpace supports...");
                if (headerState.SizeIndex == SizeIndex.AdditionalUInt8)
                {
                    if (contentLength > Byte.MaxValue)
                    {
                        throw new NotSupportedException(ErrorMsgSupportOnlyLength255);
                    }
                    buf[headerState.HeaderOffset + 1] = checked ((byte)contentLength);
                }
                totalLength = offsetAtEndOfWritten - headerState.HeaderOffset;
            }
        }
 private void CompleteHeaderWrite(HeaderWriteState headerState, byte[] buf, int offsetAtEndOfWritten, out int totalLength)
 {
     HackFxCopHintNonStaticMethod();
     byte headerByte = CreateHeaderByte(headerState.Etd, headerState.SizeIndex);
     buf[headerState.HeaderOffset] = headerByte;
     //
     if (headerState.SizeIndex == SizeIndex.LengthOneByteOrNil
             || headerState.SizeIndex == SizeIndex.LengthTwoBytes
             || headerState.SizeIndex == SizeIndex.LengthFourBytes
             || headerState.SizeIndex == SizeIndex.LengthEightBytes
             || headerState.SizeIndex == SizeIndex.LengthSixteenBytes) {
         // Nothing to write-out here.
         totalLength = offsetAtEndOfWritten - headerState.HeaderOffset;
     } else {
         System.Diagnostics.Debug.Assert(
             headerState.SizeIndex == SizeIndex.AdditionalUInt8
             || headerState.SizeIndex == SizeIndex.AdditionalUInt16
             || headerState.SizeIndex == SizeIndex.AdditionalUInt32);
         int contentLength = offsetAtEndOfWritten - headerState.HeaderOffset - headerState.HeaderLength;
         System.Diagnostics.Debug.Assert(headerState.SizeIndex == SizeIndex.AdditionalUInt8,
             "WriteHeader not AdditionalUInt8 but that's all that MakeHeaderSpace supports...");
         if (headerState.SizeIndex == SizeIndex.AdditionalUInt8) {
             if (contentLength > Byte.MaxValue) {
                 throw new NotSupportedException(ErrorMsgSupportOnlyLength255);
             }
             buf[headerState.HeaderOffset + 1] = checked((byte)contentLength);
         }
         totalLength = offsetAtEndOfWritten - headerState.HeaderOffset;
     }
 }
 private int MakeVariableLengthHeader(byte[] buf, int offset, ElementTypeDescriptor elementTypeDescriptor, out HeaderWriteState headerState)
 {
     HackFxCopHintNonStaticMethod();
     // We only support one-byte length fields (currently?).
     headerState = new HeaderWriteState(elementTypeDescriptor, buf, offset, SizeIndex.AdditionalUInt8, 2);
     return headerState.HeaderLength;
 }
 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;
 }