in dbus-java/src/main/java/org/freedesktop/dbus/messages/DBusSignal.java [240:325]
protected DBusSignal(String objectpath, Object... args) throws DBusException {
super(DBusConnection.getEndianness(), Message.MessageType.SIGNAL, (byte) 0);
if (!objectpath.matches(AbstractConnection.OBJECT_REGEX)) {
throw new DBusException("Invalid object path: " + objectpath);
}
Class<? extends DBusSignal> tc = getClass();
String member;
if (tc.isAnnotationPresent(DBusMemberName.class)) {
member = tc.getAnnotation(DBusMemberName.class).value();
} else {
member = tc.getSimpleName();
}
String iface = null;
Class<? extends Object> enc = tc.getEnclosingClass();
if (null == enc || !DBusInterface.class.isAssignableFrom(enc) || enc.getName().equals(enc.getSimpleName())) {
throw new DBusException(
"Signals must be declared as a member of a class implementing DBusInterface which is the member of a package.");
} else if (null != enc.getAnnotation(DBusInterfaceName.class)) {
iface = enc.getAnnotation(DBusInterfaceName.class).value();
} else {
iface = AbstractConnection.DOLLAR_PATTERN.matcher(enc.getName()).replaceAll(".");
}
getHeaders().put(Message.HeaderField.PATH, objectpath);
getHeaders().put(Message.HeaderField.MEMBER, member);
getHeaders().put(Message.HeaderField.INTERFACE, iface);
List<Object> hargs = new ArrayList<>();
hargs.add(new Object[] {
Message.HeaderField.PATH, new Object[] {
ArgumentType.OBJECT_PATH_STRING, objectpath
}
});
hargs.add(new Object[] {
Message.HeaderField.INTERFACE, new Object[] {
ArgumentType.STRING_STRING, iface
}
});
hargs.add(new Object[] {
Message.HeaderField.MEMBER, new Object[] {
ArgumentType.STRING_STRING, member
}
});
String sig = null;
if (0 < args.length) {
try {
Type[] types = TYPE_CACHE.get(tc);
if (null == types) {
Constructor<? extends DBusSignal> con =
(Constructor<? extends DBusSignal>) tc.getDeclaredConstructors()[0];
CONSTRUCTOR_CACHE.put(tc, con);
Type[] ts = con.getGenericParameterTypes();
types = new Type[ts.length - 1];
for (int i = 1; i <= types.length; i++) {
if (ts[i] instanceof TypeVariable) {
types[i - 1] = ((TypeVariable<GenericDeclaration>) ts[i]).getBounds()[0];
} else {
types[i - 1] = ts[i];
}
}
TYPE_CACHE.put(tc, types);
}
sig = Marshalling.getDBusType(types);
hargs.add(new Object[] {
Message.HeaderField.SIGNATURE, new Object[] {
ArgumentType.SIGNATURE_STRING, sig
}
});
getHeaders().put(Message.HeaderField.SIGNATURE, sig);
setArgs(args);
} catch (Exception e) {
logger.debug("", e);
throw new DBusException("Failed to add signal parameters: " + e.getMessage());
}
}
blen = new byte[4];
appendBytes(blen);
long newSerial = getSerial() + 1;
setSerial(newSerial);
append("ua(yv)", newSerial, hargs.toArray());
pad((byte) 8);
}