private Object optimizePrimitives()

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;
    }