in dbus-java/src/main/java/org/freedesktop/dbus/messages/Message.java [1031:1120]
private Object optimizePrimitives(byte[] _signatureBuf, byte[] _dataBuf, int[] _offsets, long size, byte algn,
int length)
throws DBusException {
Object rv;
switch (_signatureBuf[_offsets[OFFSET_SIG]]) {
case ArgumentType.BYTE:
rv = new byte[length];
System.arraycopy(_dataBuf, _offsets[OFFSET_DATA], rv, 0, length);
_offsets[OFFSET_DATA] += size;
break;
case ArgumentType.INT16:
rv = new short[length];
for (int j = 0; j < length; j++, _offsets[OFFSET_DATA] += algn) {
((short[]) rv)[j] = (short) demarshallint(_dataBuf, _offsets[OFFSET_DATA], algn);
}
break;
case ArgumentType.INT32:
rv = new int[length];
for (int j = 0; j < length; j++, _offsets[OFFSET_DATA] += algn) {
((int[]) rv)[j] = (int) demarshallint(_dataBuf, _offsets[OFFSET_DATA], algn);
}
break;
case ArgumentType.INT64:
rv = new long[length];
for (int j = 0; j < length; j++, _offsets[OFFSET_DATA] += algn) {
((long[]) rv)[j] = demarshallint(_dataBuf, _offsets[OFFSET_DATA], algn);
}
break;
case ArgumentType.BOOLEAN:
rv = new boolean[length];
for (int j = 0; j < length; j++, _offsets[OFFSET_DATA] += algn) {
((boolean[]) rv)[j] = (1 == demarshallint(_dataBuf, _offsets[OFFSET_DATA], algn));
}
break;
case ArgumentType.FLOAT:
rv = new float[length];
for (int j = 0; j < length; j++, _offsets[OFFSET_DATA] += algn) {
((float[]) rv)[j] = Float.intBitsToFloat((int) demarshallint(_dataBuf, _offsets[OFFSET_DATA], algn));
}
break;
case ArgumentType.DOUBLE:
rv = new double[length];
for (int j = 0; j < length; j++, _offsets[OFFSET_DATA] += algn) {
((double[]) rv)[j] = Double.longBitsToDouble(demarshallint(_dataBuf, _offsets[OFFSET_DATA], algn));
}
break;
case ArgumentType.DICT_ENTRY1:
if (0 == size) {
// advance the type parser even on 0-size arrays.
List<Type> temp = new ArrayList<>();
byte[] temp2 = new byte[_signatureBuf.length - _offsets[OFFSET_SIG]];
System.arraycopy(_signatureBuf, _offsets[OFFSET_SIG], temp2, 0, temp2.length);
String temp3 = new String(temp2);
// ofs[OFFSET_SIG] gets incremented anyway. Leave one character on the stack
int temp4 = Marshalling.getJavaType(temp3, temp, 1) - 1;
_offsets[OFFSET_SIG] += temp4;
logger.trace("Aligned type: {} {} {}", temp3, temp4, _offsets[OFFSET_SIG]);
}
int ofssave = _offsets[OFFSET_SIG];
long end = _offsets[OFFSET_DATA] + size;
List<Object[]> entries = new ArrayList<>();
while (_offsets[OFFSET_DATA] < end) {
_offsets[OFFSET_SIG] = ofssave;
entries.add((Object[]) extractOne(_signatureBuf, _dataBuf, _offsets, true));
}
rv = new DBusMap<>(entries.toArray(new Object[0][]));
break;
default:
if (0 == size) {
// advance the type parser even on 0-size arrays.
List<Type> temp = new ArrayList<>();
byte[] temp2 = new byte[_signatureBuf.length - _offsets[OFFSET_SIG]];
System.arraycopy(_signatureBuf, _offsets[OFFSET_SIG], temp2, 0, temp2.length);
String temp3 = new String(temp2);
// ofs[OFFSET_SIG] gets incremented anyway. Leave one character on the stack
int temp4 = Marshalling.getJavaType(temp3, temp, 1) - 1;
_offsets[OFFSET_SIG] += temp4;
logger.trace("Aligned type: {} {} {}", temp3, temp4, _offsets[OFFSET_SIG]);
}
ofssave = _offsets[OFFSET_SIG];
end = _offsets[OFFSET_DATA] + size;
List<Object> contents = new ArrayList<>();
while (_offsets[OFFSET_DATA] < end) {
_offsets[OFFSET_SIG] = ofssave;
contents.add(extractOne(_signatureBuf, _dataBuf, _offsets, true));
}
rv = contents;
}
return rv;
}