Exemplo n.º 1
0
 public virtual ENetInterceptionResult Intercept(Native.ENetAddress *address, byte **buffer, UIntPtr *count, Native.ENetEvent *e)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 2
0
        private ENetInterceptionResult InterceptCallback(IntPtr host, Native.ENetEvent *e)
        {
            if (Interceptor.Method == ENetInterceptor.InterceptionMethod.Unmanaged)
            {
                return(Interceptor.Intercept(m_pReceivedAddress, (byte **)m_pReceivedData, m_pReceivedDataLength, e));
            }

            if (Interceptor.Method == ENetInterceptor.InterceptionMethod.Managed)
            {
                IPEndPoint endPoint = (*m_pReceivedAddress).ToEndPoint();
                byte[]     buffer   = new byte[(*m_pReceivedDataLength).ToUInt32()];

                fixed(byte *dest = buffer)
                {
                    Platform.Current.MemoryCopy((IntPtr)dest, *m_pReceivedData, *m_pReceivedDataLength);
                }

                byte[] bufferRef = buffer;
                var    result    = Interceptor.Intercept(endPoint, ref bufferRef, out ENetEvent @event);

                if (result == ENetInterceptionResult.Error)
                {
                    return(result);
                }

                if (bufferRef == buffer)
                {
                    fixed(byte *src = bufferRef)
                    {
                        Platform.Current.MemoryCopy((IntPtr)src, *m_pReceivedData, *m_pReceivedDataLength);
                    }
                }
                else if (bufferRef != null)
                {
                    Marshal.FreeHGlobal(*m_pReceivedData);
                    var bufferPtr             = Marshal.AllocHGlobal(bufferRef.Length);
                    *   m_pReceivedData       = bufferPtr;
                    *   m_pReceivedDataLength = (UIntPtr)bufferRef.Length;

                    fixed(byte *src = bufferRef)
                    {
                        Platform.Current.MemoryCopy((IntPtr)src, bufferPtr, (UIntPtr)bufferRef.Length);
                    }
                }

                if (result == ENetInterceptionResult.Ignore)
                {
                    return(result);
                }

                if (@event == null)
                {
                    e->Type = ENetEventType.None;
                    return(result);
                }

                if (@event is ENetConnectEventArgs)
                {
                    var connect = @event as ENetConnectEventArgs;
                    e->Type = ENetEventType.Connect;
                    e->Peer = connect.Peer.Unsafe;
                    e->Data = connect.Data;
                    return(result);
                }

                if (@event is ENetDisconnectEventArgs)
                {
                    var disconnect = @event as ENetConnectEventArgs;
                    e->Type = ENetEventType.Disconnect;
                    e->Peer = disconnect.Peer.Unsafe;
                    e->Data = disconnect.Data;
                    return(result);
                }

                if (@event is ENetReceiveEventArgs)
                {
                    var receive = @event as ENetReceiveEventArgs;
                    e->Type      = ENetEventType.Receive;
                    e->Peer      = receive.Peer.Unsafe;
                    e->ChannelID = receive.Packet.Channel;
                    fixed(byte *data = receive.Packet.m_Payload)
                    {
                        e->Packet = LibENet.PacketCreate((IntPtr)data, (UIntPtr)receive.Packet.m_Payload.Length, receive.Packet.Flags & ~ENetPacketFlags.NoAllocate);
                    }

                    return(result);
                }
            }

            throw new NotImplementedException(Interceptor.Method.ToString());
        }