in dbus-java/src/main/java/org/freedesktop/dbus/Marshalling.java [324:421]
public static int getJavaType(String _dbusType, List<Type> _resultValue, int _limit) throws DBusException {
if (null == _dbusType || "".equals(_dbusType) || 0 == _limit) {
return 0;
}
try {
int idx = 0;
for (; idx < _dbusType.length() && (-1 == _limit || _limit > _resultValue.size()); idx++) {
switch (_dbusType.charAt(idx)) {
case Message.ArgumentType.STRUCT1:
int structIdx = idx + 1;
for (int structLen = 1; structLen > 0; structIdx++) {
if (Message.ArgumentType.STRUCT2 == _dbusType.charAt(structIdx)) {
structLen--;
} else if (Message.ArgumentType.STRUCT1 == _dbusType.charAt(structIdx)) {
structLen++;
}
}
List<Type> contained = new ArrayList<>();
int javaType = getJavaType(_dbusType.substring(idx + 1, structIdx - 1), contained, -1);
_resultValue.add(new DBusStructType(contained.toArray(new Type[0])));
idx = structIdx - 1; //-1 because j already points to the next signature char
break;
case Message.ArgumentType.ARRAY:
if (Message.ArgumentType.DICT_ENTRY1 == _dbusType.charAt(idx + 1)) {
contained = new ArrayList<>();
javaType = getJavaType(_dbusType.substring(idx + 2), contained, 2);
_resultValue.add(new DBusMapType(contained.get(0), contained.get(1)));
idx += (javaType + 2);
} else {
contained = new ArrayList<>();
javaType = getJavaType(_dbusType.substring(idx + 1), contained, 1);
_resultValue.add(new DBusListType(contained.get(0)));
idx += javaType;
}
break;
case Message.ArgumentType.VARIANT:
_resultValue.add(Variant.class);
break;
case Message.ArgumentType.BOOLEAN:
_resultValue.add(Boolean.class);
break;
case Message.ArgumentType.INT16:
_resultValue.add(Short.class);
break;
case Message.ArgumentType.BYTE:
_resultValue.add(Byte.class);
break;
case Message.ArgumentType.OBJECT_PATH:
_resultValue.add(DBusPath.class);
break;
case Message.ArgumentType.UINT16:
_resultValue.add(UInt16.class);
break;
case Message.ArgumentType.INT32:
_resultValue.add(Integer.class);
break;
case Message.ArgumentType.UINT32:
_resultValue.add(UInt32.class);
break;
case Message.ArgumentType.INT64:
_resultValue.add(Long.class);
break;
case Message.ArgumentType.UINT64:
_resultValue.add(UInt64.class);
break;
case Message.ArgumentType.DOUBLE:
_resultValue.add(Double.class);
break;
case Message.ArgumentType.FLOAT:
_resultValue.add(Float.class);
break;
case Message.ArgumentType.STRING:
_resultValue.add(CharSequence.class);
break;
case Message.ArgumentType.FILEDESCRIPTOR:
_resultValue.add(FileDescriptor.class);
break;
case Message.ArgumentType.SIGNATURE:
_resultValue.add(Type[].class);
break;
case Message.ArgumentType.DICT_ENTRY1:
_resultValue.add(Map.Entry.class);
contained = new ArrayList<>();
javaType = getJavaType(_dbusType.substring(idx + 1), contained, 2);
idx += javaType + 1;
break;
default:
throw new DBusException(String.format("Failed to parse DBus type signature: %s (%s).", _dbusType, _dbusType.charAt(idx)));
}
}
return idx;
} catch (IndexOutOfBoundsException _ex) {
LOGGER.debug("Failed to parse DBus type signature.", _ex);
throw new DBusException("Failed to parse DBus type signature: " + _dbusType);
}
}