Esempio n. 1
0
    public void ServerEventRespondsToOptions(bool registerOn)
    {
        var streams = FullDuplexStream.CreateStreams();
        var rpc     = new JsonRpc(streams.Item1, streams.Item1);
        var options = new JsonRpcTargetOptions {
            NotifyClientOfEvents = registerOn
        };
        var server = new Server();

        rpc.AddLocalRpcTarget(server, options);
        if (registerOn)
        {
            Assert.NotNull(server.ServerEventAccessor);
            Assert.NotNull(server.ServerEventWithCustomArgsAccessor);
        }
        else
        {
            Assert.Null(server.ServerEventAccessor);
            Assert.Null(server.ServerEventWithCustomArgsAccessor);
        }
    }
Esempio n. 2
0
            internal EventReceiver(JsonRpc jsonRpc, object server, EventInfo eventInfo, JsonRpcTargetOptions options)
            {
                Requires.NotNull(jsonRpc, nameof(jsonRpc));
                Requires.NotNull(server, nameof(server));
                Requires.NotNull(eventInfo, nameof(eventInfo));

                options = options ?? JsonRpcTargetOptions.Default;

                this.jsonRpc   = jsonRpc;
                this.server    = server;
                this.eventInfo = eventInfo;

                this.rpcEventName = options.EventNameTransform is not null?options.EventNameTransform(eventInfo.Name) : eventInfo.Name;

                try
                {
                    // This might throw if our EventHandler-modeled method doesn't "fit" the event delegate signature.
                    // It will work for EventHandler and EventHandler<T>, at least.
                    // If we want to support more, we'll likely have to use lightweight code-gen to generate a method
                    // with the right signature.
                    ParameterInfo[] eventHandlerParameters = eventInfo.EventHandlerType !.GetTypeInfo().GetMethod("Invoke") !.GetParameters();
                    if (eventHandlerParameters.Length != 2)
                    {
                        throw new NotSupportedException($"Unsupported event handler type for: \"{eventInfo.Name}\". Expected 2 parameters but had {eventHandlerParameters.Length}.");
                    }

                    Type argsType = eventHandlerParameters[1].ParameterType;
                    if (typeof(EventArgs).GetTypeInfo().IsAssignableFrom(argsType))
                    {
                        this.registeredHandler = OnEventRaisedMethodInfo.CreateDelegate(eventInfo.EventHandlerType !, this);
                    }
                    else
                    {
                        MethodInfo closedGenericMethod = OnEventRaisedGenericMethodInfo.MakeGenericMethod(argsType);
                        this.registeredHandler = closedGenericMethod.CreateDelegate(eventInfo.EventHandlerType !, this);
                    }
                }
                catch (ArgumentException ex)
                {
                    throw new NotSupportedException("Unsupported event handler type for: " + eventInfo.Name, ex);
                }

                eventInfo.AddEventHandler(server, this.registeredHandler);
            }