in dbus-java/src/main/java/org/freedesktop/dbus/RemoteInvocationHandler.java [47:92]
public static Object convertRV(String sig, Object[] rp, Method m, AbstractConnection conn) throws DBusException {
Class<? extends Object> c = m.getReturnType();
if (null == rp) {
if (null == c || Void.TYPE.equals(c)) {
return null;
} else {
throw new DBusException("Wrong return type (got void, expected a value)");
}
} else {
try {
LOGGER.trace("Converting return parameters from {} to type {}",Arrays.deepToString(rp), m.getGenericReturnType());
rp = Marshalling.deSerializeParameters(rp, new Type[] {
m.getGenericReturnType()
}, conn);
} catch (Exception e) {
LOGGER.debug("Wrong return type.", e);
throw new DBusException(String.format("Wrong return type (failed to de-serialize correct types: %s )", e.getMessage()));
}
}
switch (rp.length) {
case 0:
if (null == c || Void.TYPE.equals(c)) {
return null;
} else {
throw new DBusException("Wrong return type (got void, expected a value)");
}
case 1:
return rp[0];
default:
// check we are meant to return multiple values
if (!Tuple.class.isAssignableFrom(c)) {
throw new DBusException("Wrong return type (not expecting Tuple)");
}
Constructor<? extends Object> cons = c.getConstructors()[0];
try {
return cons.newInstance(rp);
} catch (Exception e) {
LOGGER.debug("", e);
throw new DBusException(e.getMessage());
}
}
}