Example #1
0
        private ComEventSinkMethod FindSinkMethod(string name)
        {
            if (_comEventSinkMethods == null)
            {
                return(null);
            }

            ComEventSinkMethod site = _comEventSinkMethods.Find(element => element._name == name);

            return(site);
        }
Example #2
0
        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();
                }
            }
        }
Example #3
0
        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;
            }
        }
Example #4
0
        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);
            }
        }
Example #5
0
        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;
            }
        }
Example #6
0
        public object ExecuteHandler(string name, object[] args)
        {
            ComEventSinkMethod site = FindSinkMethod(name);

            return(site?._handlers?.Invoke(args));
        }
Example #7
0
        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);
            }
        }