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); }
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; }