Example #1
0
        private void HandleSignal(Message msg)
        {
            var sender = msg.Header.Sender ?? string.Empty;
            var rule   = new SignalMatchRule(@interface: msg.Header.Interface,
                                             member: msg.Header.Member,
                                             path: msg.Header.Path.Value,
                                             sender: sender);
            SignalHandler signalHandler = null;

            lock (_gate)
            {
                if (_signalHandlers.TryGetValue(rule, out SignalHandler handler))
                {
                    signalHandler = handler;
                }
            }
            if (signalHandler != null)
            {
                try
                {
                    signalHandler(msg);
                }
                catch (Exception e)
                {
                    throw new InvalidOperationException("Signal handler for " + msg.Header.Interface + "." + msg.Header.Member + " threw an exception", e);
                }
            }
        }
Example #2
0
        public override bool Equals(object o)
        {
            SignalMatchRule r = o as SignalMatchRule;

            if (o == null)
            {
                return(false);
            }

            return(Interface == r.Interface &&
                   Member == r.Member &&
                   Path == r.Path);
        }
Example #3
0
 private void RemoveSignalHandler(SignalMatchRule rule, SignalHandler dlg)
 {
     lock (_gate)
     {
         if (_signalHandlers?.ContainsKey(rule) == true)
         {
             _signalHandlers[rule] = (SignalHandler)Delegate.Remove(_signalHandlers[rule], dlg);
             if (_signalHandlers[rule] == null)
             {
                 _signalHandlers.Remove(rule);
                 if (ConnectionInfo.RemoteIsBus)
                 {
                     CallRemoveMatchRule(rule.ToString());
                 }
             }
         }
     }
 }
Example #4
0
        public async Task <IDisposable> WatchSignalAsync(ObjectPath path, string @interface, string signalName, SignalHandler handler)
        {
            SignalMatchRule rule = new SignalMatchRule()
            {
                Interface = @interface,
                Member    = signalName,
                Path      = path
            };

            Task task = null;

            lock (_gate)
            {
                ThrowIfNotConnected();
                if (_signalHandlers.ContainsKey(rule))
                {
                    _signalHandlers[rule] = (SignalHandler)Delegate.Combine(_signalHandlers[rule], handler);
                    task = Task.CompletedTask;
                }
                else
                {
                    _signalHandlers[rule] = handler;
                    if (ConnectionInfo.RemoteIsBus)
                    {
                        task = CallAddMatchRuleAsync(rule.ToString());
                    }
                }
            }
            SignalHandlerRegistration registration = new SignalHandlerRegistration(this, rule, handler);

            try
            {
                if (task != null)
                {
                    await task;
                }
            }
            catch
            {
                registration.Dispose();
                throw;
            }
            return(registration);
        }
Example #5
0
 Task RemoveSignalHandler(SignalMatchRule rule, SignalHandler dlg)
 {
     lock (_gate)
     {
         if (_signalHandlers.ContainsKey(rule))
         {
             var sh = _signalHandlers[rule];
             _signalHandlers[rule] = (SignalHandler)Delegate.Remove(sh, dlg);
             if (_signalHandlers[rule] == null)
             {
                 _signalHandlers.Remove(rule);
                 if (RemoteIsBus == true)
                 {
                     return(DBus.RemoveMatch(rule.ToString()));
                 }
             }
         }
     }
     return(Task.CompletedTask);
 }
Example #6
0
        private void HandleSignal(Message msg)
        {
            switch (msg.Header.Interface)
            {
            case "org.freedesktop.DBus":
                switch (msg.Header.Member)
                {
                case "NameAcquired":
                case "NameLost":
                {
                    MessageReader reader         = new MessageReader(msg, null);
                    var           name           = reader.ReadString();
                    bool          aquiredNotLost = msg.Header.Member == "NameAcquired";
                    OnNameAcquiredOrLost(name, aquiredNotLost);
                    return;
                }

                case "NameOwnerChanged":
                {
                    MessageReader reader      = new MessageReader(msg, null);
                    var           serviceName = reader.ReadString();
                    if (serviceName[0] == ':')
                    {
                        return;
                    }
                    var oldOwner = reader.ReadString();
                    oldOwner = string.IsNullOrEmpty(oldOwner) ? null : oldOwner;
                    var newOwner = reader.ReadString();
                    newOwner = string.IsNullOrEmpty(newOwner) ? null : newOwner;
                    Action <ServiceOwnerChangedEventArgs, Exception> watchers = null;
                    var splitName = serviceName.Split(s_dot);
                    var keys      = new string[splitName.Length + 2];
                    keys[0] = ".*";
                    var sb = new StringBuilder();
                    for (int i = 0; i < splitName.Length; i++)
                    {
                        sb.Append(splitName[i]);
                        sb.Append(".*");
                        keys[i + 1] = sb.ToString();
                        sb.Remove(sb.Length - 1, 1);
                    }
                    keys[keys.Length - 1] = serviceName;
                    lock (_gate)
                    {
                        foreach (var key in keys)
                        {
                            Action <ServiceOwnerChangedEventArgs, Exception> keyWatchers = null;
                            if (_nameOwnerWatchers?.TryGetValue(key, out keyWatchers) == true)
                            {
                                watchers += keyWatchers;
                            }
                        }
                    }
                    watchers?.Invoke(new ServiceOwnerChangedEventArgs(serviceName, oldOwner, newOwner), null);
                    return;
                }

                default:
                    break;
                }
                break;

            default:
                break;
            }

            SignalMatchRule rule = new SignalMatchRule()
            {
                Interface = msg.Header.Interface,
                Member    = msg.Header.Member,
                Path      = msg.Header.Path.Value
            };

            SignalHandler signalHandler = null;

            lock (_gate)
            {
                if (_signalHandlers?.TryGetValue(rule, out signalHandler) == true)
                {
                    try
                    {
                        signalHandler(msg, null);
                    }
                    catch (Exception e)
                    {
                        throw new InvalidOperationException("Signal handler for " + msg.Header.Interface + "." + msg.Header.Member + " threw an exception", e);
                    }
                }
            }
        }
Example #7
0
 public SignalHandlerRegistration(DBusConnection dbusConnection, SignalMatchRule rule, SignalHandler handler)
 {
     _connection = dbusConnection;
     _rule       = rule;
     _handler    = handler;
 }