// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information. using System.Reactive.Concurrency; using System.Threading; #if HAS_WINRT #endif namespace System.Reactive.Linq { using ObservableImpl; // // BREAKING CHANGE v2 > v1.x - FromEvent[Pattern] now has an implicit SubscribeOn and Publish operation. // // See FromEvent.cs for more information. // internal partial class QueryLanguage { #region + FromEventPattern + #region Strongly typed #region Action public virtual IObservable> FromEventPattern(Action addHandler, Action removeHandler) { return FromEventPattern_(addHandler, removeHandler, GetSchedulerForCurrentContext()); } public virtual IObservable> FromEventPattern(Action addHandler, Action removeHandler, IScheduler scheduler) { return FromEventPattern_(addHandler, removeHandler, scheduler); } #region Implementation private static IObservable> FromEventPattern_(Action addHandler, Action removeHandler, IScheduler scheduler) { return new FromEventPattern.Impl(e => new EventHandler(e), addHandler, removeHandler, scheduler); } #endregion #endregion #region Action public virtual IObservable> FromEventPattern(Action addHandler, Action removeHandler) { return FromEventPattern_(addHandler, removeHandler, GetSchedulerForCurrentContext()); } public virtual IObservable> FromEventPattern(Action addHandler, Action removeHandler, IScheduler scheduler) { return FromEventPattern_(addHandler, removeHandler, scheduler); } #region Implementation private static IObservable> FromEventPattern_(Action addHandler, Action removeHandler, IScheduler scheduler) { return new FromEventPattern.Impl(addHandler, removeHandler, scheduler); } #endregion public virtual IObservable> FromEventPattern(Func, TDelegate> conversion, Action addHandler, Action removeHandler) { return FromEventPattern_(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public virtual IObservable> FromEventPattern(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IScheduler scheduler) { return FromEventPattern_(conversion, addHandler, removeHandler, scheduler); } #region Implementation private static IObservable> FromEventPattern_(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IScheduler scheduler) { return new FromEventPattern.Impl(conversion, addHandler, removeHandler, scheduler); } #endregion public virtual IObservable> FromEventPattern(Action addHandler, Action removeHandler) { return FromEventPattern_(addHandler, removeHandler, GetSchedulerForCurrentContext()); } public virtual IObservable> FromEventPattern(Action addHandler, Action removeHandler, IScheduler scheduler) { return FromEventPattern_(addHandler, removeHandler, scheduler); } #region Implementation private static IObservable> FromEventPattern_(Action addHandler, Action removeHandler, IScheduler scheduler) { return new FromEventPattern.Impl(addHandler, removeHandler, scheduler); } #endregion #endregion #region Action> public virtual IObservable> FromEventPattern(Action> addHandler, Action> removeHandler) { return FromEventPattern_(addHandler, removeHandler, GetSchedulerForCurrentContext()); } public virtual IObservable> FromEventPattern(Action> addHandler, Action> removeHandler, IScheduler scheduler) { return FromEventPattern_(addHandler, removeHandler, scheduler); } #region Implementation private static IObservable> FromEventPattern_(Action> addHandler, Action> removeHandler, IScheduler scheduler) { return new FromEventPattern.Impl, TEventArgs>(handler => handler, addHandler, removeHandler, scheduler); } #endregion #endregion #endregion #region Reflection #region Instance events public virtual IObservable> FromEventPattern(object target, string eventName) { return FromEventPattern_(target, eventName, GetSchedulerForCurrentContext()); } public virtual IObservable> FromEventPattern(object target, string eventName, IScheduler scheduler) { return FromEventPattern_(target, eventName, scheduler); } #region Implementation private static IObservable> FromEventPattern_(object target, string eventName, IScheduler scheduler) { return FromEventPattern_>(target.GetType(), target, eventName, (sender, args) => new EventPattern(sender, args), scheduler); } #endregion public virtual IObservable> FromEventPattern(object target, string eventName) { return FromEventPattern_(target, eventName, GetSchedulerForCurrentContext()); } public virtual IObservable> FromEventPattern(object target, string eventName, IScheduler scheduler) { return FromEventPattern_(target, eventName, scheduler); } #region Implementation private static IObservable> FromEventPattern_(object target, string eventName, IScheduler scheduler) { return FromEventPattern_>(target.GetType(), target, eventName, (sender, args) => new EventPattern(sender, args), scheduler); } #endregion public virtual IObservable> FromEventPattern(object target, string eventName) { return FromEventPattern_(target, eventName, GetSchedulerForCurrentContext()); } public virtual IObservable> FromEventPattern(object target, string eventName, IScheduler scheduler) { return FromEventPattern_(target, eventName, scheduler); } #region Implementation private static IObservable> FromEventPattern_(object target, string eventName, IScheduler scheduler) { return FromEventPattern_>(target.GetType(), target, eventName, (sender, args) => new EventPattern(sender, args), scheduler); } #endregion #endregion #region Static events public virtual IObservable> FromEventPattern(Type type, string eventName) { return FromEventPattern_(type, eventName, GetSchedulerForCurrentContext()); } public virtual IObservable> FromEventPattern(Type type, string eventName, IScheduler scheduler) { return FromEventPattern_(type, eventName, scheduler); } #region Implementation private static IObservable> FromEventPattern_(Type type, string eventName, IScheduler scheduler) { return FromEventPattern_>(type, null, eventName, (sender, args) => new EventPattern(sender, args), scheduler); } #endregion public virtual IObservable> FromEventPattern(Type type, string eventName) { return FromEventPattern_(type, eventName, GetSchedulerForCurrentContext()); } public virtual IObservable> FromEventPattern(Type type, string eventName, IScheduler scheduler) { return FromEventPattern_(type, eventName, scheduler); } #region Implementation private static IObservable> FromEventPattern_(Type type, string eventName, IScheduler scheduler) { return FromEventPattern_>(type, null, eventName, (sender, args) => new EventPattern(sender, args), scheduler); } #endregion public virtual IObservable> FromEventPattern(Type type, string eventName) { return FromEventPattern_(type, eventName, GetSchedulerForCurrentContext()); } public virtual IObservable> FromEventPattern(Type type, string eventName, IScheduler scheduler) { return FromEventPattern_(type, eventName, scheduler); } #region Implementation private static IObservable> FromEventPattern_(Type type, string eventName, IScheduler scheduler) { return FromEventPattern_>(type, null, eventName, (sender, args) => new EventPattern(sender, args), scheduler); } #endregion #endregion #region Helper methods private static IObservable FromEventPattern_(Type targetType, object target, string eventName, Func getResult, IScheduler scheduler) { ReflectionUtils.GetEventMethods(targetType, target, eventName, out var addMethod, out var removeMethod, out var delegateType, out var isWinRT); #if HAS_WINRT if (isWinRT) { return new FromEventPattern.Handler(target, delegateType, addMethod, removeMethod, getResult, true, scheduler); } #endif return new FromEventPattern.Handler(target, delegateType, addMethod, removeMethod, getResult, false, scheduler); } #endregion #endregion #endregion #region FromEvent public virtual IObservable FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler) { return FromEvent_(conversion, addHandler, removeHandler, GetSchedulerForCurrentContext()); } public virtual IObservable FromEvent(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IScheduler scheduler) { return FromEvent_(conversion, addHandler, removeHandler, scheduler); } #region Implementation private static IObservable FromEvent_(Func, TDelegate> conversion, Action addHandler, Action removeHandler, IScheduler scheduler) { return new FromEvent(conversion, addHandler, removeHandler, scheduler); } #endregion public virtual IObservable FromEvent(Action addHandler, Action removeHandler) { return FromEvent_(addHandler, removeHandler, GetSchedulerForCurrentContext()); } public virtual IObservable FromEvent(Action addHandler, Action removeHandler, IScheduler scheduler) { return FromEvent_(addHandler, removeHandler, scheduler); } #region Implementation private static IObservable FromEvent_(Action addHandler, Action removeHandler, IScheduler scheduler) { return new FromEvent(addHandler, removeHandler, scheduler); } #endregion public virtual IObservable FromEvent(Action> addHandler, Action> removeHandler) { return FromEvent_(addHandler, removeHandler, GetSchedulerForCurrentContext()); } public virtual IObservable FromEvent(Action> addHandler, Action> removeHandler, IScheduler scheduler) { return FromEvent_(addHandler, removeHandler, scheduler); } #region Implementation private static IObservable FromEvent_(Action> addHandler, Action> removeHandler, IScheduler scheduler) { return new FromEvent, TEventArgs>(h => h, addHandler, removeHandler, scheduler); } #endregion public virtual IObservable FromEvent(Action addHandler, Action removeHandler) { return FromEvent_(addHandler, removeHandler, GetSchedulerForCurrentContext()); } public virtual IObservable FromEvent(Action addHandler, Action removeHandler, IScheduler scheduler) { return FromEvent_(addHandler, removeHandler, scheduler); } #region Implementation private static IObservable FromEvent_(Action addHandler, Action removeHandler, IScheduler scheduler) { return new FromEvent(h => new Action(() => h(new Unit())), addHandler, removeHandler, scheduler); } #endregion #endregion #region Helpers private static IScheduler GetSchedulerForCurrentContext() { var context = SynchronizationContext.Current; if (context != null) { return new SynchronizationContextScheduler(context, false); } return SchedulerDefaults.ConstantTimeOperations; } #endregion } }