in dbus-java/src/main/java/org/freedesktop/dbus/messages/DBusSignal.java [177:230]
public DBusSignal createReal(AbstractConnection conn) throws DBusException {
String intname = INT_NAMES.get(getInterface());
String signame = SIGNAL_NAMES.get(getName());
if (null == intname) {
intname = getInterface();
}
if (null == signame) {
signame = getName();
}
if (null == clazz) {
clazz = createSignalClass(intname, signame);
}
logger.debug("Converting signal to type: {}", clazz);
Type[] types = TYPE_CACHE.get(clazz);
Constructor<? extends DBusSignal> con = CONSTRUCTOR_CACHE.get(clazz);
if (null == types) {
con = (Constructor<? extends DBusSignal>) clazz.getDeclaredConstructors()[0];
CONSTRUCTOR_CACHE.put(clazz, con);
Type[] ts = con.getGenericParameterTypes();
types = new Type[ts.length - 1];
for (int i = 1; i < ts.length; i++) {
if (ts[i] instanceof TypeVariable) {
for (Type b : ((TypeVariable<GenericDeclaration>) ts[i]).getBounds()) {
types[i - 1] = b;
}
} else {
types[i - 1] = ts[i];
}
}
TYPE_CACHE.put(clazz, types);
}
try {
DBusSignal s;
Object[] args = Marshalling.deSerializeParameters(getParameters(), types, conn);
if (null == args) {
s = con.newInstance(getPath());
} else {
Object[] params = new Object[args.length + 1];
params[0] = getPath();
System.arraycopy(args, 0, params, 1, args.length);
logger.debug("Creating signal of type {} with parameters {}", clazz, Arrays.deepToString(params));
s = con.newInstance(params);
}
s.getHeaders().putAll(getHeaders());
s.setWiredata(getWireData());
s.setByteCounter(getWireData().length);
return s;
} catch (Exception _ex) {
throw new DBusException(_ex);
}
}