private ComEventSinkMethod FindSinkMethod(string name) { if (_comEventSinkMethods == null) { return(null); } ComEventSinkMethod site = _comEventSinkMethods.Find(element => element._name == name); return(site); }
public void RemoveHandler(int dispid, object func) { string name = string.Format(CultureInfo.InvariantCulture, "[DISPID={0}]", dispid); lock (_lockObject) { ComEventSinkMethod sinkEntry = FindSinkMethod(name); if (sinkEntry == null) { return; } // Remove the delegate from multicast delegate chain. // We will need to find the delegate that corresponds // to the func handler we want to remove. This will be // easy since we Target property of the delegate object // is a ComEventCallContext object. Delegate[] delegates = sinkEntry._handlers.GetInvocationList(); foreach (Delegate d in delegates) { SplatCallSite callContext = d.Target as SplatCallSite; if (callContext != null && callContext._callable.Equals(func)) { sinkEntry._handlers -= d as Func <object[], object>; break; } } // If the delegates chain is empty - we can remove // corresponding ComEvenSinkEntry if (sinkEntry._handlers == null) { _comEventSinkMethods.Remove(sinkEntry); } // We can Unadvise from the ConnectionPoint if no more sink entries // are registered for this interface // (calling Dispose will call IConnectionPoint.Unadvise). if (_comEventSinkMethods.Count == 0) { // notice that we do not remove // ComEventSinkEntry from the list, we will re-use this data structure // if a new handler needs to be attached. Dispose(); } } }
public void AddHandler(int dispid, object func) { string name = String.Format(CultureInfo.InvariantCulture, "[DISPID={0}]", dispid); lock (_lockObject) { ComEventSinkMethod sinkMethod = FindSinkMethod(name); if (sinkMethod == null) { if (_comEventSinkMethods == null) { _comEventSinkMethods = new List <ComEventSinkMethod>(); } sinkMethod = new ComEventSinkMethod(); sinkMethod._name = name; _comEventSinkMethods.Add(sinkMethod); } sinkMethod._handlers += new SplatCallSite(func).Invoke; } }
public void AddHandler(int dispid, object func) { string name = String.Format(CultureInfo.InvariantCulture, "[DISPID={0}]", dispid); ComEventCallHandler handler = new ComEventCallContext(func).Call; lock (_lockObject) { ComEventSinkMethod sinkMethod; sinkMethod = FindSinkMethod(name); if (sinkMethod == null) { if (_comEventSinkMethods == null) { _comEventSinkMethods = new List <ComEventSinkMethod>(); } sinkMethod = new ComEventSinkMethod(); sinkMethod._name = name; _comEventSinkMethods.Add(sinkMethod); } sinkMethod._target = Delegate.Combine(sinkMethod._target, handler); } }
public void AddHandler(int dispid, object func) { string name = String.Format(CultureInfo.InvariantCulture, "[DISPID={0}]", dispid); lock (_lockObject) { ComEventSinkMethod sinkMethod; sinkMethod = FindSinkMethod(name); if (sinkMethod == null) { if (_comEventSinkMethods == null) { _comEventSinkMethods = new List<ComEventSinkMethod>(); } sinkMethod = new ComEventSinkMethod(); sinkMethod._name = name; _comEventSinkMethods.Add(sinkMethod); } sinkMethod._handlers += new SplatCallSite(func).Invoke; } }
public object ExecuteHandler(string name, object[] args) { ComEventSinkMethod site = FindSinkMethod(name); return(site?._handlers?.Invoke(args)); }
public void AddHandler(int dispid, object func) { string name = String.Format(CultureInfo.InvariantCulture, "[DISPID={0}]", dispid); ComEventCallHandler handler = new ComEventCallContext(func).Call; lock (_lockObject) { ComEventSinkMethod sinkMethod; sinkMethod = FindSinkMethod(name); if (sinkMethod == null) { if (_comEventSinkMethods == null) { _comEventSinkMethods = new List<ComEventSinkMethod>(); } sinkMethod = new ComEventSinkMethod(); sinkMethod._name = name; _comEventSinkMethods.Add(sinkMethod); } sinkMethod._target = Delegate.Combine(sinkMethod._target, handler); } }