private static IReadOnlyDictionary <uint, NetworkEventInfo> BuildEventInformation(Type interfaceType)
        {
            var events        = interfaceType.GetEvents();
            var networkEvents = new Dictionary <uint, NetworkEventInfo>(events.Length);

            foreach (var eventInfo in events)
            {
                var eventHandlerType = eventInfo.EventHandlerType;
                if (!eventHandlerType.IsGenericType)
                {
                    if (eventHandlerType == typeof(EventHandler))
                    {
                        continue;
                    }
                }

                if (!(eventHandlerType.IsGenericType && eventHandlerType.GetGenericTypeDefinition() == typeof(EventHandler <>)))
                {
                    throw new ArgumentException("All events must be of type EventHandler or EventHandler<>",
                                                nameof(interfaceType));
                }

                var networkEvent = new NetworkEventInfo(eventInfo);
                networkEvents.Add(networkEvent.EventId, networkEvent);
            }

            return(networkEvents);
        }
Exemplo n.º 2
0
        private async void HandleEventAction(NetworkEventInfo eventInfo, object parameter)
        {
            if (_isDisposed)
            {
                return;
            }

            //RETURN:
            //HEAD      - byte                      - response type
            //HEAD      - uinteger                  - event id

            //(BODY     - integer                   - body length)
            //(BODY     - body length               - the serialized object)

            var dataLength = 1 /* response type */ + 4 /* event id */;

            if (parameter != null)
            {
                dataLength += 4 /* length */;
            }

            var takenBuffer = Cache.Pool.Rent(dataLength + EstimatedEventParameterSize + CustomOffset);
            var data        = takenBuffer;

            int parameterLength;

            if (parameter != null)
            {
                parameterLength = _serializer.Serialize(eventInfo.EventArgsType, ref data, CustomOffset + 9, parameter,
                                                        Cache.Pool);
                if (data != takenBuffer)
                {
                    Cache.Pool.Return(takenBuffer);
                }

                data[CustomOffset] = (byte)NetworkCallResponse.TriggerEventWithParameter;
                BinaryUtils.WriteInt32(data, CustomOffset + 5, parameterLength);
            }
            else
            {
                parameterLength    = 0;
                data[CustomOffset] = (byte)NetworkCallResponse.TriggerEvent;
            }

            BinaryUtils.WriteUInt32(data, CustomOffset + 1, eventInfo.EventId);

            Task eventLockTask;

            lock (_disposedLock)
            {
                if (_isDisposed)
                {
                    Cache.Pool.Return(data);
                    return;
                }

                eventLockTask = _eventLock.EnterAsync();
            }

            //keep event order
            await eventLockTask;

            try
            {
                await OnSendData(new BufferSegment(data, CustomOffset, dataLength + parameterLength, Cache.Pool));
            }
            finally
            {
                _eventLock.Release();
            }
        }