protected final ProtonIncomingDelivery handleRemoteTransfer()

in protonj2/src/main/java/org/apache/qpid/protonj2/engine/impl/ProtonReceiver.java [387:439]


    protected final ProtonIncomingDelivery handleRemoteTransfer(Transfer transfer, ProtonBuffer payload) {
        final ProtonIncomingDelivery delivery;

        if (!currentDeliveryId.isEmpty() && (!transfer.hasDeliveryId() || currentDeliveryId.equals((int) transfer.getDeliveryId()))) {
            delivery = unsettled.get(currentDeliveryId.intValue());
        } else {
            verifyNewDeliveryIdSequence(transfer, currentDeliveryId);

            delivery = new ProtonIncomingDelivery(this, transfer.getDeliveryId(), transfer.getDeliveryTag());
            delivery.setMessageFormat((int) transfer.getMessageFormat());

            unsettled.put((int) transfer.getDeliveryId(), delivery);
            currentDeliveryId.set((int) transfer.getDeliveryId());
        }

        if (transfer.hasState()) {
            delivery.remoteState(transfer.getState());
        }

        if (transfer.getSettled() || transfer.getAborted()) {
            delivery.remotelySettled();
        }

        if (payload != null) {
            delivery.appendTransferPayload(payload);
        }

        final boolean done = transfer.getAborted() || !transfer.getMore();
        if (done) {
            getCreditState().decrementCredit();
            getCreditState().incrementDeliveryCount();
            currentDeliveryId.reset();

            if (transfer.getAborted()) {
                delivery.aborted();
            } else {
                delivery.completed();
            }
        }

        if (transfer.getAborted()) {
            signalDeliveryAborted(delivery);
        } else {
            signalDeliveryRead(delivery);
        }

        if (isDraining() && getCredit() == 0) {
            drainStateSnapshot = null;
            signalLinkCreditStateUpdated();
        }

        return delivery;
    }