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