protected void handleDataPdu()

in services/console-proxy/rdpconsole/src/main/java/rdpclient/rdp/ServerIOChannelRouter.java [250:457]


    protected void handleDataPdu(ByteBuffer buf) {

        // (4 bytes): A 32-bit, unsigned integer. Share identifier for the packet.
        long shareId = buf.readUnsignedIntLE();
        if (shareId != state.serverShareId)
            throw new RuntimeException("Unexpected share ID: " + shareId + ".");
//    buf.skipBytes(4);

        // Padding.
        buf.skipBytes(1);

        // (1 byte): An 8-bit, unsigned integer. The stream identifier for the
        // packet.
        // int streamId = buf.readUnsignedByte();
        buf.skipBytes(1);

        // (2 bytes): A 16-bit, unsigned integer. The uncompressed length of the
        // packet in bytes.
        int uncompressedLength = buf.readUnsignedShortLE();

        // (1 byte): An 8-bit, unsigned integer. The type of Data PDU.
        int type2 = buf.readUnsignedByte();

        // (1 byte): An 8-bit, unsigned integer. The compression type and flags
        // specifying the data following the Share Data Header
        int compressedType = buf.readUnsignedByte();
        if (compressedType != 0)
            throw new RuntimeException("Compression of protocol packets is not supported. Data: " + buf + ".");

        // (2 bytes): A 16-bit, unsigned integer. The compressed length of the
        // packet in bytes.
        int compressedLength = buf.readUnsignedShortLE();
        if (compressedLength != 0)
            throw new RuntimeException("Compression of protocol packets is not supported. Data: " + buf + ".");

        ByteBuffer data = buf.readBytes(uncompressedLength - 18);
        buf.unref();

        switch (type2) {

        case PDUTYPE2_UPDATE: {

            // (2 bytes): A 16-bit, unsigned integer. Type of the graphics update.
            int updateType = data.readUnsignedShortLE();
            ByteBuffer payload = data.readBytes(data.length - data.cursor);
            data.unref();

            switch (updateType) {
            case UPDATETYPE_ORDERS:
                pushDataToPad("orders", payload);
                break;
            case UPDATETYPE_BITMAP:
                pushDataToPad("bitmap", payload);
                break;
            case UPDATETYPE_PALETTE:
                pushDataToPad("palette", payload);
                break;
            case UPDATETYPE_SYNCHRONIZE:
                // Ignore
                payload.unref();
                break;
            }

            break;
        }
        case PDUTYPE2_CONTROL:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_CONTROL ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_POINTER:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_POINTER ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_INPUT:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_INPUT ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_SYNCHRONIZE:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_SYNCHRONIZE ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_REFRESH_RECT:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_REFRESH_RECT ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_PLAY_SOUND:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_PLAY_SOUND ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_SUPPRESS_OUTPUT:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_SUPPRESS_OUTPUT ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_SHUTDOWN_REQUEST:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_SHUTDOWN_REQUEST ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_SHUTDOWN_DENIED:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_SHUTDOWN_DENIED ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_SAVE_SESSION_INFO:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_SAVE_SESSION_INFO ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_FONTLIST:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_FONTLIST ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_FONTMAP:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_FONTMAP ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_SET_KEYBOARD_INDICATORS:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_SET_KEYBOARD_INDICATORS ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_BITMAPCACHE_PERSISTENT_LIST:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_BITMAPCACHE_PERSISTENT_LIST ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_BITMAPCACHE_ERROR_PDU:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_BITMAPCACHE_ERROR_PDU ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_SET_KEYBOARD_IME_STATUS:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_SET_KEYBOARD_IME_STATUS ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_OFFSCRCACHE_ERROR_PDU:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_OFFSCRCACHE_ERROR_PDU ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_SET_ERROR_INFO_PDU:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_SET_ERROR_INFO_PDU ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_DRAWNINEGRID_ERROR_PDU:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_DRAWNINEGRID_ERROR_PDU ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_DRAWGDIPLUS_ERROR_PDU:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_DRAWGDIPLUS_ERROR_PDU ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_ARC_STATUS_PDU:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_ARC_STATUS_PDU ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_STATUS_INFO_PDU:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_STATUS_INFO_PDU ignored.");
            // Ignore
            data.unref();
            break;
        case PDUTYPE2_MONITOR_LAYOUT_PDU:
            if (verbose)
                System.out.println("[" + this + "] INFO: Packet PDUTYPE2_MONITOR_LAYOUT_PDU ignored.");
            // Ignore
            data.unref();
            break;

        default:
            throw new RuntimeException("Unknown data PDU type: " + type2 + ", data: " + buf + ".");
        }
    }