in dbus-java/src/main/java/org/freedesktop/dbus/connections/AbstractConnection.java [996:1056]
private void handleMessage(final MethodReturn mr) {
logger.debug("Handling incoming method return: {}", mr);
MethodCall m = null;
if (null == getPendingCalls()) {
return;
}
synchronized (getPendingCalls()) {
if (getPendingCalls().containsKey(mr.getReplySerial())) {
m = getPendingCalls().remove(mr.getReplySerial());
}
}
if (null != m) {
m.setReply(mr);
mr.setCall(m);
@SuppressWarnings("rawtypes")
CallbackHandler cbh = callbackManager.getCallback(m);
DBusAsyncReply<?> asr = callbackManager.getCallbackReply(m);
callbackManager.removeCallback(m);
// queue callback for execution
if (null != cbh) {
final CallbackHandler<Object> fcbh = cbh;
final DBusAsyncReply<?> fasr = asr;
if (fasr == null) {
logger.debug("Cannot add runnable for method, given method callback was null");
return;
}
logger.trace("Adding Runnable for method {} with callback handler {}", fcbh,
fasr != null ? fasr.getMethod() : null);
Runnable r = new Runnable() {
@Override
public synchronized void run() {
try {
logger.trace("Running Callback for {}", mr);
DBusCallInfo info = new DBusCallInfo(mr);
INFOMAP.put(Thread.currentThread(), info);
Object convertRV = RemoteInvocationHandler.convertRV(mr.getSig(), mr.getParameters(),
fasr.getMethod(), fasr.getConnection());
fcbh.handle(convertRV);
INFOMAP.remove(Thread.currentThread());
} catch (Exception e) {
logger.debug("Exception while running callback.", e);
}
}
};
executeInWorkerThreadPool(r);
}
} else {
try {
sendMessage(new Error(mr, new DBusExecutionException(
"Spurious reply. No message with the given serial id was awaiting a reply.")));
} catch (DBusException exDe) {
}
}
}