System.Net.WebSockets.WebSocketBuffer.CreateProperties C# (CSharp) Method

CreateProperties() private method

private CreateProperties ( bool useZeroMaskingKey ) : Interop.WebSocket.Property[]
useZeroMaskingKey bool
return Interop.WebSocket.Property[]
        internal Interop.WebSocket.Property[] CreateProperties(bool useZeroMaskingKey)
        {
            ThrowIfDisposed();

            // serialize marshaled property values in the property segment of the internal buffer
            // m_GCHandle.AddrOfPinnedObject() points to the address of m_InternalBuffer.Array
            IntPtr internalBufferPtr = _gcHandle.AddrOfPinnedObject();
            int offset = _propertyBuffer.Offset;
            Marshal.WriteInt32(internalBufferPtr, offset, _receiveBufferSize);
            offset += s_SizeOfUInt;
            Marshal.WriteInt32(internalBufferPtr, offset, _sendBufferSize);
            offset += s_SizeOfUInt;
            Marshal.WriteIntPtr(internalBufferPtr, offset, internalBufferPtr + _internalBuffer.Offset);
            offset += IntPtr.Size;
            Marshal.WriteInt32(internalBufferPtr, offset, useZeroMaskingKey ? (int)1 : (int)0);

            int propertyCount = useZeroMaskingKey ? 4 : 3;
            Interop.WebSocket.Property[] properties =
                new Interop.WebSocket.Property[propertyCount];

            // Calculate the pointers to the positions of the properties within the internal buffer
            offset = _propertyBuffer.Offset;
            properties[0] = new Interop.WebSocket.Property()
            {
                Type = WebSocketProtocolComponent.PropertyType.ReceiveBufferSize,
                PropertySize = (uint)s_SizeOfUInt,
                PropertyData = IntPtr.Add(internalBufferPtr, offset)
            };
            offset += s_SizeOfUInt;

            properties[1] = new Interop.WebSocket.Property()
            {
                Type = WebSocketProtocolComponent.PropertyType.SendBufferSize,
                PropertySize = (uint)s_SizeOfUInt,
                PropertyData = IntPtr.Add(internalBufferPtr, offset)
            };
            offset += s_SizeOfUInt;

            properties[2] = new Interop.WebSocket.Property()
            {
                Type = WebSocketProtocolComponent.PropertyType.AllocatedBuffer,
                PropertySize = (uint)_nativeBuffer.Count,
                PropertyData = IntPtr.Add(internalBufferPtr, offset)
            };
            offset += IntPtr.Size;

            if (useZeroMaskingKey)
            {
                properties[3] = new Interop.WebSocket.Property()
                {
                    Type = WebSocketProtocolComponent.PropertyType.DisableMasking,
                    PropertySize = (uint)s_SizeOfBool,
                    PropertyData = IntPtr.Add(internalBufferPtr, offset)
                };
            }

            return properties;
        }