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); } } }
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); }
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()); } } } } }
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); }
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); }
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); } } } }
public SignalHandlerRegistration(DBusConnection dbusConnection, SignalMatchRule rule, SignalHandler handler) { _connection = dbusConnection; _rule = rule; _handler = handler; }