src/Proton.TestPeer/Codec/Impl/BinaryElement.cs (87 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System.IO; using Apache.Qpid.Proton.Test.Driver.Codec.Primitives; namespace Apache.Qpid.Proton.Test.Driver.Codec.Impl { public sealed class BinaryElement : AtomicElement { private readonly Binary value; public BinaryElement(IElement parent, IElement prev, Binary value) : base(parent, prev) { this.value = value; } public override uint GetSize() { return ComputeSize(); } public override object Value => value; public Binary BinaryValue => value; public override DataType DataType => DataType.Binary; public override uint Encode(Stream stream) { uint size = GetSize(); if (!stream.IsWritable()) { return 0; } if (IsElementOfArray()) { ArrayElement parent = (ArrayElement)Parent; if (parent.ConstructorType == ConstructorType.Small) { stream.WriteByte((byte)value.Length); } else { stream.WriteInt(value.Length); } } else if (value.Length <= 255) { stream.WriteByte((byte)EncodingCodes.VBin8); stream.WriteByte((byte)value.Length); } else { stream.WriteByte((byte)EncodingCodes.VBin32); stream.WriteInt(value.Length); } stream.Write(value.Array, 0, value.Length); return size; } private uint ComputeSize() { uint length = (uint)value.Length; if (IsElementOfArray()) { ArrayElement parent = (ArrayElement)Parent; if (parent.ConstructorType == ConstructorType.Small) { if (length > 255) { parent.ConstructorType = ConstructorType.Large; return 4 + length; } else { return 1 + length; } } else { return 4 + length; } } else { if (length > 255) { return 5 + length; } else { return 2 + length; } } } } }