Beispiel #1
0
        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 += sizeof(uint);
            Marshal.WriteInt32(internalBufferPtr, offset, _sendBufferSize);
            offset += sizeof(uint);
            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)sizeof(uint),
                PropertyData = IntPtr.Add(internalBufferPtr, offset)
            };
            offset += sizeof(uint);

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

            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)sizeof(uint),
                    PropertyData = IntPtr.Add(internalBufferPtr, offset)
                };
            }

            return(properties);
        }
Beispiel #2
0
        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;
        }