in dbus-java/src/main/java/org/freedesktop/dbus/connections/AbstractConnection.java [857:938]
private void handleMessage(final DBusSignal _signal, boolean _useThreadPool) {
logger.debug("Handling incoming signal: {}", _signal);
List<DBusSigHandler<? extends DBusSignal>> handlers = new ArrayList<>();
List<DBusSigHandler<DBusSignal>> genericHandlers = new ArrayList<>();
Queue<DBusSigHandler<? extends DBusSignal>> t;
t = getHandledSignals().get(new SignalTuple(_signal.getInterface(), _signal.getName(), null, null));
if (null != t) {
handlers.addAll(t);
}
t = getHandledSignals().get(new SignalTuple(_signal.getInterface(), _signal.getName(), _signal.getPath(), null));
if (null != t) {
handlers.addAll(t);
}
t = getHandledSignals().get(new SignalTuple(_signal.getInterface(), _signal.getName(), null, _signal.getSource()));
if (null != t) {
handlers.addAll(t);
}
t = getHandledSignals().get(new SignalTuple(_signal.getInterface(), _signal.getName(), _signal.getPath(), _signal.getSource()));
if (null != t) {
handlers.addAll(t);
}
Queue<DBusSigHandler<DBusSignal>> gt;
Set<SignalTuple> allTuples = SignalTuple.getAllPossibleTuples(_signal.getInterface(), _signal.getName(), _signal.getPath(), _signal.getSource());
for( SignalTuple tuple : allTuples ){
gt = getGenericHandledSignals().get(tuple);
if (null != gt) {
genericHandlers.addAll(gt);
}
}
if (handlers.isEmpty() && genericHandlers.isEmpty()) {
return;
}
final AbstractConnection conn = this;
for (final DBusSigHandler<? extends DBusSignal> h : handlers) {
logger.trace("Adding Runnable for signal {} with handler {}", _signal, h);
Runnable command = new Runnable() {
@Override
public void run() {
try {
DBusSignal rs;
if (_signal instanceof InternalSignal || _signal.getClass().equals(DBusSignal.class)) {
rs = _signal.createReal(conn);
} else {
rs = _signal;
}
((DBusSigHandler<DBusSignal>) h).handle(rs);
} catch (DBusException _ex) {
logger.warn("Exception while running signal handler '{}' for signal '{}':", h, _signal, _ex);
handleException(conn, _signal, new DBusExecutionException("Error handling signal " + _signal.getInterface()
+ "." + _signal.getName() + ": " + _ex.getMessage()));
}
}
};
if (_useThreadPool) {
executeInWorkerThreadPool(command);
} else {
command.run();
}
}
for (final DBusSigHandler<DBusSignal> h : genericHandlers) {
logger.trace("Adding Runnable for signal {} with handler {}", _signal, h);
Runnable command = new Runnable() {
@Override
public void run() {
h.handle(_signal);
}
};
if (_useThreadPool) {
executeInWorkerThreadPool(command);
} else {
command.run();
}
}
}