package org.eclipse.paho.mqttv5.client.internal;

import java.io.EOFException;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Properties;
import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import org.eclipse.paho.mqttv5.client.MqttActionListener;
import org.eclipse.paho.mqttv5.client.MqttClientPersistence;
import org.eclipse.paho.mqttv5.client.MqttPingSender;
import org.eclipse.paho.mqttv5.client.MqttToken;
import org.eclipse.paho.mqttv5.client.logging.Logger;
import org.eclipse.paho.mqttv5.client.logging.LoggerFactory;
import org.eclipse.paho.mqttv5.common.MqttException;
import org.eclipse.paho.mqttv5.common.MqttMessage;
import org.eclipse.paho.mqttv5.common.MqttPersistable;
import org.eclipse.paho.mqttv5.common.MqttPersistenceException;
import org.eclipse.paho.mqttv5.common.packet.MqttAck;
import org.eclipse.paho.mqttv5.common.packet.MqttAuth;
import org.eclipse.paho.mqttv5.common.packet.MqttConnAck;
import org.eclipse.paho.mqttv5.common.packet.MqttConnect;
import org.eclipse.paho.mqttv5.common.packet.MqttPingReq;
import org.eclipse.paho.mqttv5.common.packet.MqttPingResp;
import org.eclipse.paho.mqttv5.common.packet.MqttProperties;
import org.eclipse.paho.mqttv5.common.packet.MqttPubAck;
import org.eclipse.paho.mqttv5.common.packet.MqttPubComp;
import org.eclipse.paho.mqttv5.common.packet.MqttPubRec;
import org.eclipse.paho.mqttv5.common.packet.MqttPubRel;
import org.eclipse.paho.mqttv5.common.packet.MqttPublish;
import org.eclipse.paho.mqttv5.common.packet.MqttReturnCode;
import org.eclipse.paho.mqttv5.common.packet.MqttWireMessage;

/* JADX INFO: loaded from: classes2.dex */
public class ClientState implements MqttState {
    private static final String CLASS_NAME = "org.eclipse.paho.mqttv5.client.internal.ClientState";
    private static final int MAX_MSG_ID = 65535;
    private static final int MIN_MSG_ID = 1;
    private static final String PERSISTENCE_CONFIRMED_PREFIX = "sc-";
    private static final String PERSISTENCE_RECEIVED_PREFIX = "r-";
    private static final String PERSISTENCE_SENT_BUFFERED_PREFIX = "sb-";
    private static final String PERSISTENCE_SENT_PREFIX = "s-";
    private int actualInFlight;
    private CommsCallback callback;
    private boolean cleanStart;
    private ClientComms clientComms;
    private boolean connected;
    private int inFlightPubRels;
    private ConcurrentHashMap<Integer, Integer> inUseMsgIds;
    private ConcurrentHashMap<Integer, MqttWireMessage> inboundQoS2;
    private Hashtable<Integer, String> incomingTopicAliases;
    private long lastInboundActivity;
    private long lastOutboundActivity;
    private long lastPing;
    private Logger log;
    private MqttConnectionState mqttConnection;
    private int nextMsgId;
    private ConcurrentHashMap<Integer, MqttWireMessage> outboundQoS0;
    private ConcurrentHashMap<Integer, MqttWireMessage> outboundQoS1;
    private ConcurrentHashMap<Integer, MqttWireMessage> outboundQoS2;
    private Hashtable<String, Integer> outgoingTopicAliases;
    private volatile Vector<MqttWireMessage> pendingFlows;
    private volatile Vector<MqttWireMessage> pendingMessages;
    private MqttClientPersistence persistence;
    private MqttWireMessage pingCommand;
    private int pingOutstanding;
    private final Object pingOutstandingLock;
    private MqttPingSender pingSender;
    private final Object queueLock;
    private final Object quiesceLock;
    private boolean quiescing;
    private CommsTokenStore tokenStore;

    protected ClientState(MqttClientPersistence mqttClientPersistence, CommsTokenStore commsTokenStore, CommsCallback commsCallback, ClientComms clientComms, MqttPingSender mqttPingSender, MqttConnectionState mqttConnectionState) throws MqttException {
        String str = CLASS_NAME;
        this.log = LoggerFactory.getLogger(LoggerFactory.MQTT_CLIENT_MSG_CAT, str);
        this.nextMsgId = 0;
        this.clientComms = null;
        this.callback = null;
        this.actualInFlight = 0;
        this.inFlightPubRels = 0;
        this.queueLock = new Object();
        this.quiesceLock = new Object();
        this.quiescing = false;
        this.lastOutboundActivity = 0L;
        this.lastInboundActivity = 0L;
        this.lastPing = 0L;
        this.pingOutstandingLock = new Object();
        this.pingOutstanding = 0;
        this.connected = false;
        this.outboundQoS2 = null;
        this.outboundQoS1 = null;
        this.outboundQoS0 = null;
        this.inboundQoS2 = null;
        this.pingSender = null;
        this.log.setResourceName(clientComms.getClient().getClientId());
        this.log.finer(str, "<Init>", "");
        this.inUseMsgIds = new ConcurrentHashMap<>();
        this.pendingFlows = new Vector<>();
        this.pendingMessages = new Vector<>(mqttConnectionState.getReceiveMaximum().intValue());
        this.outboundQoS2 = new ConcurrentHashMap<>();
        this.outboundQoS1 = new ConcurrentHashMap<>();
        this.outboundQoS0 = new ConcurrentHashMap<>();
        this.inboundQoS2 = new ConcurrentHashMap<>();
        this.pingCommand = new MqttPingReq();
        this.inFlightPubRels = 0;
        this.actualInFlight = 0;
        this.outgoingTopicAliases = new Hashtable<>();
        this.incomingTopicAliases = new Hashtable<>();
        this.persistence = mqttClientPersistence;
        this.callback = commsCallback;
        this.tokenStore = commsTokenStore;
        this.clientComms = clientComms;
        this.pingSender = mqttPingSender;
        this.mqttConnection = mqttConnectionState;
        restoreState();
    }

    protected void setCleanStart(boolean z) {
        this.cleanStart = z;
    }

    protected boolean getCleanStart() {
        return this.cleanStart;
    }

    private String getSendPersistenceKey(MqttWireMessage mqttWireMessage) {
        return PERSISTENCE_SENT_PREFIX + mqttWireMessage.getMessageId();
    }

    private String getSendConfirmPersistenceKey(MqttWireMessage mqttWireMessage) {
        return PERSISTENCE_CONFIRMED_PREFIX + mqttWireMessage.getMessageId();
    }

    private String getReceivedPersistenceKey(MqttWireMessage mqttWireMessage) {
        return PERSISTENCE_RECEIVED_PREFIX + mqttWireMessage.getMessageId();
    }

    private String getReceivedPersistenceKey(int i) {
        return PERSISTENCE_RECEIVED_PREFIX + i;
    }

    private String getSendBufferedPersistenceKey(MqttWireMessage mqttWireMessage) {
        return PERSISTENCE_SENT_BUFFERED_PREFIX + mqttWireMessage.getMessageId();
    }

    protected void clearState() throws MqttException {
        this.log.fine(CLASS_NAME, "clearState", ">");
        this.persistence.clear();
        this.inUseMsgIds.clear();
        this.pendingMessages.clear();
        this.pendingFlows.clear();
        this.outboundQoS2.clear();
        this.outboundQoS1.clear();
        this.outboundQoS0.clear();
        this.inboundQoS2.clear();
        this.tokenStore.clear();
        this.outgoingTopicAliases.clear();
        this.incomingTopicAliases.clear();
    }

    protected void clearConnectionState() throws MqttException {
        this.log.fine(CLASS_NAME, "clearConnectionState", "665");
        this.outgoingTopicAliases.clear();
        this.incomingTopicAliases.clear();
    }

    private MqttWireMessage restoreMessage(String str, MqttPersistable mqttPersistable) throws MqttException {
        MqttWireMessage mqttWireMessageCreateWireMessage;
        try {
            mqttWireMessageCreateWireMessage = MqttWireMessage.createWireMessage(mqttPersistable);
        } catch (MqttException e) {
            this.log.fine(CLASS_NAME, "restoreMessage", "602", new Object[]{str}, e);
            if (!(e.getCause() instanceof EOFException)) {
                throw e;
            }
            if (str != null) {
                this.persistence.remove(str);
            }
            mqttWireMessageCreateWireMessage = null;
        }
        this.log.fine(CLASS_NAME, "restoreMessage", "601", new Object[]{str, mqttWireMessageCreateWireMessage});
        return mqttWireMessageCreateWireMessage;
    }

    private void insertInOrder(Vector<MqttWireMessage> vector, MqttWireMessage mqttWireMessage) {
        int messageId = mqttWireMessage.getMessageId();
        for (int i = 0; i < vector.size(); i++) {
            if (vector.elementAt(i).getMessageId() > messageId) {
                vector.insertElementAt(mqttWireMessage, i);
                return;
            }
        }
        vector.addElement(mqttWireMessage);
    }

    private Vector<MqttWireMessage> reOrder(Vector<MqttWireMessage> vector) {
        Vector<MqttWireMessage> vector2 = new Vector<>();
        if (vector.size() == 0) {
            return vector2;
        }
        int i = 0;
        int i2 = 0;
        int i3 = 0;
        int i4 = 0;
        while (i < vector.size()) {
            int messageId = vector.elementAt(i).getMessageId();
            int i5 = messageId - i2;
            if (i5 > i3) {
                i4 = i;
                i3 = i5;
            }
            i++;
            i2 = messageId;
        }
        int i6 = (65535 - i2) + vector.elementAt(0).getMessageId() > i3 ? 0 : i4;
        for (int i7 = i6; i7 < vector.size(); i7++) {
            vector2.addElement(vector.elementAt(i7));
        }
        for (int i8 = 0; i8 < i6; i8++) {
            vector2.addElement(vector.elementAt(i8));
        }
        return vector2;
    }

    protected void restoreState() throws MqttException {
        Enumeration<String> enumerationKeys = this.persistence.keys();
        int iMax = this.nextMsgId;
        Vector vector = new Vector();
        this.log.fine(CLASS_NAME, "restoreState", "600");
        while (enumerationKeys.hasMoreElements()) {
            String strNextElement = enumerationKeys.nextElement();
            MqttWireMessage mqttWireMessageRestoreMessage = restoreMessage(strNextElement, this.persistence.get(strNextElement));
            if (mqttWireMessageRestoreMessage != null) {
                if (strNextElement.startsWith(PERSISTENCE_RECEIVED_PREFIX)) {
                    this.log.fine(CLASS_NAME, "restoreState", "604", new Object[]{strNextElement, mqttWireMessageRestoreMessage});
                    this.inboundQoS2.put(Integer.valueOf(mqttWireMessageRestoreMessage.getMessageId()), mqttWireMessageRestoreMessage);
                } else if (strNextElement.startsWith(PERSISTENCE_SENT_PREFIX)) {
                    MqttPublish mqttPublish = (MqttPublish) mqttWireMessageRestoreMessage;
                    iMax = Math.max(mqttPublish.getMessageId(), iMax);
                    if (this.persistence.containsKey(getSendConfirmPersistenceKey(mqttPublish))) {
                        MqttPubRel mqttPubRel = (MqttPubRel) restoreMessage(strNextElement, this.persistence.get(getSendConfirmPersistenceKey(mqttPublish)));
                        if (mqttPubRel != null) {
                            this.log.fine(CLASS_NAME, "restoreState", "605", new Object[]{strNextElement, mqttWireMessageRestoreMessage});
                            this.outboundQoS2.put(Integer.valueOf(mqttPubRel.getMessageId()), mqttPubRel);
                        } else {
                            this.log.fine(CLASS_NAME, "restoreState", "606", new Object[]{strNextElement, mqttWireMessageRestoreMessage});
                        }
                    } else {
                        mqttPublish.setDuplicate(true);
                        if (mqttPublish.getMessage().getQos() == 2) {
                            this.log.fine(CLASS_NAME, "restoreState", "607", new Object[]{strNextElement, mqttWireMessageRestoreMessage});
                            this.outboundQoS2.put(Integer.valueOf(mqttPublish.getMessageId()), mqttPublish);
                        } else {
                            this.log.fine(CLASS_NAME, "restoreState", "608", new Object[]{strNextElement, mqttWireMessageRestoreMessage});
                            this.outboundQoS1.put(Integer.valueOf(mqttPublish.getMessageId()), mqttPublish);
                        }
                    }
                    this.tokenStore.restoreToken(mqttPublish).internalTok.setClient(this.clientComms.getClient());
                    this.inUseMsgIds.put(Integer.valueOf(mqttPublish.getMessageId()), Integer.valueOf(mqttPublish.getMessageId()));
                } else if (strNextElement.startsWith(PERSISTENCE_SENT_BUFFERED_PREFIX)) {
                    MqttPublish mqttPublish2 = (MqttPublish) mqttWireMessageRestoreMessage;
                    iMax = Math.max(mqttPublish2.getMessageId(), iMax);
                    if (mqttPublish2.getMessage().getQos() == 2) {
                        this.log.fine(CLASS_NAME, "restoreState", "607", new Object[]{strNextElement, mqttWireMessageRestoreMessage});
                        this.outboundQoS2.put(Integer.valueOf(mqttPublish2.getMessageId()), mqttPublish2);
                    } else if (mqttPublish2.getMessage().getQos() == 1) {
                        this.log.fine(CLASS_NAME, "restoreState", "608", new Object[]{strNextElement, mqttWireMessageRestoreMessage});
                        this.outboundQoS1.put(Integer.valueOf(mqttPublish2.getMessageId()), mqttPublish2);
                    } else {
                        this.log.fine(CLASS_NAME, "restoreState", "511", new Object[]{strNextElement, mqttWireMessageRestoreMessage});
                        this.outboundQoS0.put(Integer.valueOf(mqttPublish2.getMessageId()), mqttPublish2);
                        this.persistence.remove(strNextElement);
                    }
                    this.tokenStore.restoreToken(mqttPublish2).internalTok.setClient(this.clientComms.getClient());
                    this.inUseMsgIds.put(Integer.valueOf(mqttPublish2.getMessageId()), Integer.valueOf(mqttPublish2.getMessageId()));
                } else if (strNextElement.startsWith(PERSISTENCE_CONFIRMED_PREFIX) && !this.persistence.containsKey(getSendPersistenceKey((MqttPubRel) mqttWireMessageRestoreMessage))) {
                    vector.addElement(strNextElement);
                }
            }
        }
        Enumeration enumerationElements = vector.elements();
        while (enumerationElements.hasMoreElements()) {
            String str = (String) enumerationElements.nextElement();
            this.log.fine(CLASS_NAME, "restoreState", "609", new Object[]{str});
            this.persistence.remove(str);
        }
        this.nextMsgId = iMax;
    }

    private void restoreInflightMessages() {
        this.pendingMessages = new Vector<>(this.mqttConnection.getReceiveMaximum().intValue());
        this.pendingFlows = new Vector<>();
        Enumeration<Integer> enumerationKeys = this.outboundQoS2.keys();
        while (enumerationKeys.hasMoreElements()) {
            Integer numNextElement = enumerationKeys.nextElement();
            MqttWireMessage mqttWireMessage = this.outboundQoS2.get(numNextElement);
            if (mqttWireMessage instanceof MqttPublish) {
                this.log.fine(CLASS_NAME, "restoreInflightMessages", "610", new Object[]{numNextElement});
                mqttWireMessage.setDuplicate(true);
                insertInOrder(this.pendingMessages, (MqttPublish) mqttWireMessage);
            } else if (mqttWireMessage instanceof MqttPubRel) {
                this.log.fine(CLASS_NAME, "restoreInflightMessages", "611", new Object[]{numNextElement});
                insertInOrder(this.pendingFlows, (MqttPubRel) mqttWireMessage);
            }
        }
        Enumeration<Integer> enumerationKeys2 = this.outboundQoS1.keys();
        while (enumerationKeys2.hasMoreElements()) {
            Integer numNextElement2 = enumerationKeys2.nextElement();
            MqttPublish mqttPublish = (MqttPublish) this.outboundQoS1.get(numNextElement2);
            mqttPublish.setDuplicate(true);
            this.log.fine(CLASS_NAME, "restoreInflightMessages", "612", new Object[]{numNextElement2});
            insertInOrder(this.pendingMessages, mqttPublish);
        }
        Enumeration<Integer> enumerationKeys3 = this.outboundQoS0.keys();
        while (enumerationKeys3.hasMoreElements()) {
            Integer numNextElement3 = enumerationKeys3.nextElement();
            MqttPublish mqttPublish2 = (MqttPublish) this.outboundQoS0.get(numNextElement3);
            this.log.fine(CLASS_NAME, "restoreInflightMessages", "512", new Object[]{numNextElement3});
            insertInOrder(this.pendingMessages, mqttPublish2);
        }
        this.pendingFlows = reOrder(this.pendingFlows);
        this.pendingMessages = reOrder(this.pendingMessages);
    }

    @Override // org.eclipse.paho.mqttv5.client.internal.MqttState
    public void send(MqttWireMessage mqttWireMessage, MqttToken mqttToken) throws MqttException {
        MqttConnectionState mqttConnectionState;
        if (mqttWireMessage.isMessageIdRequired() && mqttWireMessage.getMessageId() == 0) {
            mqttWireMessage.setMessageId(getNextMessageId());
        }
        boolean z = mqttWireMessage instanceof MqttPublish;
        if (z) {
            MqttPublish mqttPublish = (MqttPublish) mqttWireMessage;
            if (mqttPublish.getTopicName() != null && (mqttConnectionState = this.mqttConnection) != null && mqttConnectionState.getOutgoingTopicAliasMaximum().intValue() > 0) {
                String topicName = mqttPublish.getTopicName();
                if (this.outgoingTopicAliases.containsKey(topicName)) {
                    mqttPublish.getProperties().setTopicAlias(this.outgoingTopicAliases.get(topicName));
                    mqttPublish.setTopicName(null);
                } else {
                    int iIntValue = this.mqttConnection.getNextOutgoingTopicAlias().intValue();
                    if (iIntValue <= this.mqttConnection.getOutgoingTopicAliasMaximum().intValue()) {
                        mqttPublish.getProperties().setTopicAlias(Integer.valueOf(iIntValue));
                        this.outgoingTopicAliases.put(mqttPublish.getTopicName(), Integer.valueOf(iIntValue));
                    }
                }
            }
        }
        if (mqttToken != null) {
            try {
                mqttToken.internalTok.setMessageID(mqttWireMessage.getMessageId());
            } catch (Exception unused) {
            }
        }
        if (z) {
            synchronized (this.queueLock) {
                if (this.actualInFlight >= this.mqttConnection.getReceiveMaximum().intValue()) {
                    this.log.fine(CLASS_NAME, "send", "613", new Object[]{Integer.valueOf(this.actualInFlight)});
                    throw new MqttException(32202);
                }
                MqttMessage message = ((MqttPublish) mqttWireMessage).getMessage();
                this.log.fine(CLASS_NAME, "send", "628", new Object[]{Integer.valueOf(mqttWireMessage.getMessageId()), Integer.valueOf(message.getQos()), mqttWireMessage});
                int qos = message.getQos();
                if (qos == 1) {
                    this.outboundQoS1.put(Integer.valueOf(mqttWireMessage.getMessageId()), mqttWireMessage);
                    this.persistence.put(getSendPersistenceKey(mqttWireMessage), (MqttPublish) mqttWireMessage);
                } else if (qos == 2) {
                    this.outboundQoS2.put(Integer.valueOf(mqttWireMessage.getMessageId()), mqttWireMessage);
                    this.persistence.put(getSendPersistenceKey(mqttWireMessage), (MqttPublish) mqttWireMessage);
                }
                this.tokenStore.saveToken(mqttToken, mqttWireMessage);
                this.pendingMessages.addElement(mqttWireMessage);
                this.queueLock.notifyAll();
            }
            return;
        }
        this.log.fine(CLASS_NAME, "send", "615", new Object[]{Integer.valueOf(mqttWireMessage.getMessageId()), mqttWireMessage});
        if (mqttWireMessage instanceof MqttConnect) {
            synchronized (this.queueLock) {
                this.tokenStore.saveToken(mqttToken, mqttWireMessage);
                this.pendingFlows.insertElementAt(mqttWireMessage, 0);
                this.queueLock.notifyAll();
            }
            return;
        }
        if (mqttWireMessage instanceof MqttPingReq) {
            this.pingCommand = mqttWireMessage;
        } else if (mqttWireMessage instanceof MqttPubRel) {
            this.outboundQoS2.put(Integer.valueOf(mqttWireMessage.getMessageId()), mqttWireMessage);
            this.persistence.put(getSendConfirmPersistenceKey(mqttWireMessage), (MqttPubRel) mqttWireMessage);
        } else if (mqttWireMessage instanceof MqttPubComp) {
            this.persistence.remove(getReceivedPersistenceKey(mqttWireMessage));
        }
        synchronized (this.queueLock) {
            if (!(mqttWireMessage instanceof MqttAck)) {
                this.tokenStore.saveToken(mqttToken, mqttWireMessage);
            }
            this.pendingFlows.addElement(mqttWireMessage);
            this.queueLock.notifyAll();
        }
    }

    @Override // org.eclipse.paho.mqttv5.client.internal.MqttState
    public void persistBufferedMessage(MqttWireMessage mqttWireMessage) {
        String sendBufferedPersistenceKey = getSendBufferedPersistenceKey(mqttWireMessage);
        try {
            mqttWireMessage.setMessageId(getNextMessageId());
            String sendBufferedPersistenceKey2 = getSendBufferedPersistenceKey(mqttWireMessage);
            try {
                this.persistence.put(sendBufferedPersistenceKey2, (MqttPublish) mqttWireMessage);
            } catch (MqttPersistenceException unused) {
                this.log.fine(CLASS_NAME, "persistBufferedMessage", "515");
                this.persistence.open(this.clientComms.getClient().getClientId());
                this.persistence.put(sendBufferedPersistenceKey2, (MqttPublish) mqttWireMessage);
            }
            this.log.fine(CLASS_NAME, "persistBufferedMessage", "513", new Object[]{sendBufferedPersistenceKey2});
        } catch (MqttException unused2) {
            this.log.warning(CLASS_NAME, "persistBufferedMessage", "513", new Object[]{sendBufferedPersistenceKey});
        }
    }

    @Override // org.eclipse.paho.mqttv5.client.internal.MqttState
    public void unPersistBufferedMessage(MqttWireMessage mqttWireMessage) {
        try {
            this.log.fine(CLASS_NAME, "unPersistBufferedMessage", "517", new Object[]{mqttWireMessage.getKey()});
            this.persistence.remove(getSendBufferedPersistenceKey(mqttWireMessage));
        } catch (MqttPersistenceException unused) {
            this.log.fine(CLASS_NAME, "unPersistBufferedMessage", "518", new Object[]{mqttWireMessage.getKey()});
        }
    }

    protected void undo(MqttPublish mqttPublish) throws MqttPersistenceException {
        synchronized (this.queueLock) {
            this.log.fine(CLASS_NAME, "undo", "618", new Object[]{Integer.valueOf(mqttPublish.getMessageId()), Integer.valueOf(mqttPublish.getMessage().getQos())});
            if (mqttPublish.getMessage().getQos() == 1) {
                this.outboundQoS1.remove(Integer.valueOf(mqttPublish.getMessageId()));
            } else {
                this.outboundQoS2.remove(Integer.valueOf(mqttPublish.getMessageId()));
            }
            this.pendingMessages.removeElement(mqttPublish);
            this.persistence.remove(getSendPersistenceKey(mqttPublish));
            this.tokenStore.removeToken(mqttPublish);
            if (mqttPublish.getMessage().getQos() > 0) {
                releaseMessageId(mqttPublish.getMessageId());
                mqttPublish.setMessageId(0);
            }
            checkQuiesceLock();
        }
    }

    @Override // org.eclipse.paho.mqttv5.client.internal.MqttState
    public MqttToken checkForActivity(MqttActionListener mqttActionListener) throws MqttException {
        Logger logger = this.log;
        String str = CLASS_NAME;
        logger.fine(str, "checkForActivity", "616", new Object[0]);
        synchronized (this.quiesceLock) {
            MqttToken mqttToken = null;
            if (this.quiescing) {
                return null;
            }
            long nanos = TimeUnit.MILLISECONDS.toNanos(this.mqttConnection.getKeepAlive());
            if (this.connected && this.mqttConnection.getKeepAlive() > 0) {
                long jNanoTime = System.nanoTime();
                synchronized (this.pingOutstandingLock) {
                    int i = this.pingOutstanding;
                    if (i > 0 && jNanoTime - this.lastInboundActivity >= ((long) 100000) + nanos) {
                        this.log.severe(str, "checkForActivity", "619", new Object[]{Long.valueOf(nanos), Long.valueOf(this.lastOutboundActivity), Long.valueOf(this.lastInboundActivity), Long.valueOf(jNanoTime), Long.valueOf(this.lastPing)});
                        throw ExceptionHelper.createMqttException(32000);
                    }
                    if (i == 0 && jNanoTime - this.lastOutboundActivity >= 2 * nanos) {
                        this.log.severe(str, "checkForActivity", "642", new Object[]{Long.valueOf(nanos), Long.valueOf(this.lastOutboundActivity), Long.valueOf(this.lastInboundActivity), Long.valueOf(jNanoTime), Long.valueOf(this.lastPing)});
                        throw ExceptionHelper.createMqttException(32002);
                    }
                    if ((i == 0 && jNanoTime - this.lastInboundActivity >= nanos - ((long) 100000)) || jNanoTime - this.lastOutboundActivity >= nanos - ((long) 100000)) {
                        this.log.fine(str, "checkForActivity", "620", new Object[]{Long.valueOf(nanos), Long.valueOf(this.lastOutboundActivity), Long.valueOf(this.lastInboundActivity)});
                        MqttToken mqttToken2 = new MqttToken(this.clientComms.getClient().getClientId());
                        if (mqttActionListener != null) {
                            mqttToken2.setActionCallback(mqttActionListener);
                        }
                        this.tokenStore.saveToken(mqttToken2, this.pingCommand);
                        this.pendingFlows.insertElementAt(this.pingCommand, 0);
                        notifyQueueLock();
                        mqttToken = mqttToken2;
                    } else {
                        this.log.fine(str, "checkForActivity", "634", null);
                        nanos = Math.max(1L, nanos - (jNanoTime - this.lastOutboundActivity));
                    }
                }
                this.log.fine(str, "checkForActivity", "624", new Object[]{Long.valueOf(nanos)});
                this.pingSender.schedule(TimeUnit.NANOSECONDS.toMillis(nanos));
            }
            return mqttToken;
        }
    }

    protected MqttWireMessage get() throws MqttException {
        synchronized (this.queueLock) {
            MqttWireMessage mqttWireMessageRemove = null;
            while (mqttWireMessageRemove == null) {
                if ((this.pendingMessages.isEmpty() && this.pendingFlows.isEmpty()) || (this.pendingFlows.isEmpty() && this.actualInFlight >= this.mqttConnection.getReceiveMaximum().intValue())) {
                    try {
                        Logger logger = this.log;
                        String str = CLASS_NAME;
                        logger.fine(str, "get", "644");
                        this.queueLock.wait();
                        this.log.fine(str, "get", "647");
                    } catch (InterruptedException unused) {
                    }
                }
                if (this.pendingFlows != null && (this.connected || (!this.pendingFlows.isEmpty() && (this.pendingFlows.elementAt(0) instanceof MqttConnect)))) {
                    if (!this.pendingFlows.isEmpty()) {
                        mqttWireMessageRemove = this.pendingFlows.remove(0);
                        if (mqttWireMessageRemove instanceof MqttPubRel) {
                            int i = this.inFlightPubRels + 1;
                            this.inFlightPubRels = i;
                            this.log.fine(CLASS_NAME, "get", "617", new Object[]{Integer.valueOf(i)});
                        }
                        checkQuiesceLock();
                    } else if (!this.pendingMessages.isEmpty()) {
                        if (this.actualInFlight < this.mqttConnection.getReceiveMaximum().intValue()) {
                            mqttWireMessageRemove = this.pendingMessages.elementAt(0);
                            this.pendingMessages.removeElementAt(0);
                            int i2 = this.actualInFlight + 1;
                            this.actualInFlight = i2;
                            this.log.fine(CLASS_NAME, "get", "623", new Object[]{Integer.valueOf(i2)});
                        } else {
                            this.log.fine(CLASS_NAME, "get", "622");
                        }
                    }
                }
                this.log.fine(CLASS_NAME, "get", "621");
                return null;
            }
            return mqttWireMessageRemove;
        }
    }

    @Override // org.eclipse.paho.mqttv5.client.internal.MqttState
    public void notifySentBytes(int i) {
        if (i > 0) {
            this.lastOutboundActivity = System.nanoTime();
        }
        this.log.fine(CLASS_NAME, "notifySentBytes", "643", new Object[]{Integer.valueOf(i)});
    }

    protected void notifySent(MqttWireMessage mqttWireMessage) {
        int i;
        this.lastOutboundActivity = System.nanoTime();
        Logger logger = this.log;
        String str = CLASS_NAME;
        logger.fine(str, "notifySent", "625", new Object[]{mqttWireMessage.getKey()});
        MqttToken token = this.tokenStore.getToken(mqttWireMessage);
        if (token == null) {
            return;
        }
        token.internalTok.notifySent();
        if (mqttWireMessage instanceof MqttPingReq) {
            synchronized (this.pingOutstandingLock) {
                long jNanoTime = System.nanoTime();
                synchronized (this.pingOutstandingLock) {
                    this.lastPing = jNanoTime;
                    i = this.pingOutstanding + 1;
                    this.pingOutstanding = i;
                }
                this.log.fine(str, "notifySent", "635", new Object[]{Integer.valueOf(i)});
            }
            return;
        }
        if ((mqttWireMessage instanceof MqttPublish) && ((MqttPublish) mqttWireMessage).getMessage().getQos() == 0) {
            token.internalTok.markComplete(null, null);
            this.callback.asyncOperationComplete(token);
            decrementInFlight();
            releaseMessageId(mqttWireMessage.getMessageId());
            this.tokenStore.removeToken(mqttWireMessage);
            checkQuiesceLock();
        }
    }

    private void decrementInFlight() {
        synchronized (this.queueLock) {
            int i = this.actualInFlight - 1;
            this.actualInFlight = i;
            this.log.fine(CLASS_NAME, "decrementInFlight", "646", new Object[]{Integer.valueOf(i)});
            if (!checkQuiesceLock()) {
                this.queueLock.notifyAll();
            }
        }
    }

    protected boolean checkQuiesceLock() {
        int iCount = this.tokenStore.count();
        if (!this.quiescing || iCount != 0 || this.pendingFlows.size() != 0 || !this.callback.isQuiesced()) {
            return false;
        }
        this.log.fine(CLASS_NAME, "checkQuiesceLock", "626", new Object[]{Boolean.valueOf(this.quiescing), Integer.valueOf(this.actualInFlight), Integer.valueOf(this.pendingFlows.size()), Integer.valueOf(this.inFlightPubRels), Boolean.valueOf(this.callback.isQuiesced()), Integer.valueOf(iCount)});
        synchronized (this.quiesceLock) {
            this.quiesceLock.notifyAll();
        }
        return true;
    }

    @Override // org.eclipse.paho.mqttv5.client.internal.MqttState
    public void notifyReceivedBytes(int i) {
        if (i > 0) {
            this.lastInboundActivity = System.nanoTime();
        }
        this.log.fine(CLASS_NAME, "notifyReceivedBytes", "630", new Object[]{Integer.valueOf(i)});
    }

    protected void notifyReceivedAck(MqttAck mqttAck) throws MqttException {
        this.lastInboundActivity = System.nanoTime();
        Logger logger = this.log;
        String str = CLASS_NAME;
        logger.fine(str, "notifyReceivedAck", "627", new Object[]{Integer.valueOf(mqttAck.getMessageId()), mqttAck});
        MqttToken token = this.tokenStore.getToken(mqttAck);
        if (token == null) {
            this.log.fine(str, "notifyReceivedAck", "662", new Object[]{Integer.valueOf(mqttAck.getMessageId())});
        } else if (mqttAck instanceof MqttPubRec) {
            MqttPubRec mqttPubRec = (MqttPubRec) mqttAck;
            if (mqttPubRec.getReasonCodes()[0] > 128) {
                this.log.severe(str, "notifyReceivedAck", "664", new Object[]{Integer.valueOf(mqttAck.getMessageId()), Integer.valueOf(mqttAck.getReasonCodes()[0]), mqttAck.toString()});
                throw new MqttException(mqttPubRec.getReasonCodes()[0]);
            }
            updateResult(mqttAck, token, null);
            send(new MqttPubRel(0, mqttAck.getMessageId(), new MqttProperties()), token);
        } else if ((mqttAck instanceof MqttPubAck) || (mqttAck instanceof MqttPubComp)) {
            notifyResult(mqttAck, token, null);
        } else if (mqttAck instanceof MqttPingResp) {
            synchronized (this.pingOutstandingLock) {
                this.pingOutstanding = Math.max(0, this.pingOutstanding - 1);
                notifyResult(mqttAck, token, null);
                if (this.pingOutstanding == 0) {
                    this.tokenStore.removeToken(mqttAck);
                }
            }
            this.log.fine(str, "notifyReceivedAck", "636", new Object[]{Integer.valueOf(this.pingOutstanding)});
        } else if (mqttAck instanceof MqttConnAck) {
            MqttConnAck mqttConnAck = (MqttConnAck) mqttAck;
            int returnCode = mqttConnAck.getReturnCode();
            if (returnCode == 0) {
                synchronized (this.queueLock) {
                    if (this.cleanStart) {
                        clearState();
                        this.tokenStore.saveToken(token, mqttAck);
                    }
                    this.inFlightPubRels = 0;
                    this.actualInFlight = 0;
                    restoreInflightMessages();
                    connected();
                }
                this.clientComms.connectComplete(mqttConnAck, null);
                notifyResult(mqttAck, token, null);
                this.tokenStore.removeToken(mqttAck);
                synchronized (this.queueLock) {
                    this.queueLock.notifyAll();
                }
            } else {
                throw ExceptionHelper.createMqttException(returnCode);
            }
        } else {
            notifyResult(mqttAck, token, null);
            releaseMessageId(mqttAck.getMessageId());
            this.tokenStore.removeToken(mqttAck);
        }
        checkQuiesceLock();
    }

    protected void handleOrphanedAcks(MqttAck mqttAck) throws MqttException {
        this.log.fine(CLASS_NAME, "handleOrphanedAcks", "666", new Object[]{Integer.valueOf(mqttAck.getMessageId()), mqttAck});
        if (mqttAck instanceof MqttPubAck) {
            return;
        }
        if (mqttAck instanceof MqttPubRec) {
            MqttProperties mqttProperties = new MqttProperties();
            if (this.mqttConnection.isSendReasonMessages()) {
                mqttProperties.setReasonString(String.format("Message identifier [%d] was not found. Discontinuing QoS 2 flow.", Integer.valueOf(mqttAck.getMessageId())));
            }
            send(new MqttPubRel(MqttReturnCode.RETURN_CODE_PACKET_ID_NOT_FOUND, mqttAck.getMessageId(), new MqttProperties()), null);
            return;
        }
        boolean z = mqttAck instanceof MqttPubComp;
    }

    protected void handleInboundPubRel(MqttPubRel mqttPubRel) throws MqttException {
        if (mqttPubRel.getReasonCodes()[0] > 128) {
            this.log.severe(CLASS_NAME, "handleInboundPubRel", "667", new Object[]{Integer.valueOf(mqttPubRel.getMessageId()), mqttPubRel.toString(), Integer.valueOf(mqttPubRel.getReasonCodes()[0])});
            throw new MqttException(mqttPubRel.getReasonCodes()[0]);
        }
        MqttPubComp mqttPubComp = new MqttPubComp(0, mqttPubRel.getMessageId(), new MqttProperties());
        this.log.info(CLASS_NAME, "handleInboundPubRel", "668", new Object[]{mqttPubComp.toString()});
        send(mqttPubComp, null);
    }

    protected void notifyReceivedMsg(MqttWireMessage mqttWireMessage) throws MqttException {
        this.lastInboundActivity = System.nanoTime();
        Logger logger = this.log;
        String str = CLASS_NAME;
        logger.fine(str, "notifyReceivedMsg", "651", new Object[]{Integer.valueOf(mqttWireMessage.getMessageId()), mqttWireMessage});
        if (this.quiescing) {
            return;
        }
        if (mqttWireMessage instanceof MqttPublish) {
            MqttPublish mqttPublish = (MqttPublish) mqttWireMessage;
            if (mqttPublish.getProperties().getTopicAlias() != null) {
                int iIntValue = mqttPublish.getProperties().getTopicAlias().intValue();
                if (iIntValue > this.mqttConnection.getIncomingTopicAliasMax().intValue() || iIntValue == 0) {
                    this.log.severe(str, "notifyReceivedMsg", "653", new Object[]{Integer.valueOf(this.mqttConnection.getIncomingTopicAliasMax().intValue()), Integer.valueOf(iIntValue)});
                    CommsCallback commsCallback = this.callback;
                    if (commsCallback != null) {
                        commsCallback.mqttErrorOccurred(new MqttException(MqttException.REASON_CODE_INVALID_TOPIC_ALAS));
                    }
                    throw new MqttException(32301);
                }
                if (mqttPublish.getTopicName() != null) {
                    this.log.fine(str, "notifyReceivedMsg", "652", new Object[]{Integer.valueOf(mqttPublish.getProperties().getTopicAlias().intValue()), mqttPublish.getTopicName()});
                    this.incomingTopicAliases.put(mqttPublish.getProperties().getTopicAlias(), mqttPublish.getTopicName());
                } else if (this.incomingTopicAliases.contains(Integer.valueOf(iIntValue))) {
                    mqttPublish.setTopicName(this.incomingTopicAliases.get(Integer.valueOf(iIntValue)));
                } else {
                    this.log.severe(str, "notifyReceivedMsg", "654", new Object[]{Integer.valueOf(mqttPublish.getProperties().getTopicAlias().intValue())});
                    throw new MqttException(32302);
                }
            }
            int qos = mqttPublish.getMessage().getQos();
            if (qos == 0 || qos == 1) {
                CommsCallback commsCallback2 = this.callback;
                if (commsCallback2 != null) {
                    commsCallback2.messageArrived(mqttPublish);
                    return;
                }
                return;
            }
            if (qos != 2) {
                return;
            }
            this.persistence.put(getReceivedPersistenceKey(mqttWireMessage), mqttPublish);
            this.inboundQoS2.put(Integer.valueOf(mqttPublish.getMessageId()), mqttPublish);
            CommsCallback commsCallback3 = this.callback;
            if (commsCallback3 != null) {
                commsCallback3.messageArrived(mqttPublish);
            }
            send(new MqttPubRec(0, mqttPublish.getMessageId(), new MqttProperties()), null);
            return;
        }
        if (mqttWireMessage instanceof MqttPubRel) {
            handleInboundPubRel((MqttPubRel) mqttWireMessage);
        } else if (mqttWireMessage instanceof MqttAuth) {
            this.callback.authMessageReceived((MqttAuth) mqttWireMessage);
        }
    }

    protected void notifyComplete(MqttToken mqttToken) throws MqttException {
        MqttWireMessage wireMessage = mqttToken.internalTok.getWireMessage();
        if (wireMessage == null || !(wireMessage instanceof MqttAck)) {
            return;
        }
        Logger logger = this.log;
        String str = CLASS_NAME;
        logger.fine(str, "notifyComplete", "629", new Object[]{Integer.valueOf(wireMessage.getMessageId()), mqttToken, wireMessage});
        MqttAck mqttAck = (MqttAck) wireMessage;
        if (mqttAck instanceof MqttPubAck) {
            this.persistence.remove(getSendPersistenceKey(wireMessage));
            this.persistence.remove(getSendBufferedPersistenceKey(wireMessage));
            this.outboundQoS1.remove(Integer.valueOf(mqttAck.getMessageId()));
            decrementInFlight();
            releaseMessageId(wireMessage.getMessageId());
            this.tokenStore.removeToken(wireMessage);
            this.log.fine(str, "notifyComplete", "650", new Object[]{Integer.valueOf(mqttAck.getMessageId())});
        } else if (mqttAck instanceof MqttPubComp) {
            this.persistence.remove(getSendPersistenceKey(wireMessage));
            this.persistence.remove(getSendConfirmPersistenceKey(wireMessage));
            this.persistence.remove(getSendBufferedPersistenceKey(wireMessage));
            this.outboundQoS2.remove(Integer.valueOf(mqttAck.getMessageId()));
            this.inFlightPubRels--;
            decrementInFlight();
            releaseMessageId(wireMessage.getMessageId());
            this.tokenStore.removeToken(wireMessage);
            this.log.fine(str, "notifyComplete", "645", new Object[]{Integer.valueOf(mqttAck.getMessageId()), Integer.valueOf(this.inFlightPubRels)});
        }
        checkQuiesceLock();
    }

    protected void updateResult(MqttWireMessage mqttWireMessage, MqttToken mqttToken, MqttException mqttException) {
        mqttToken.internalTok.update(mqttWireMessage, mqttException);
    }

    protected void notifyResult(MqttWireMessage mqttWireMessage, MqttToken mqttToken, MqttException mqttException) {
        mqttToken.internalTok.markComplete(mqttWireMessage, mqttException);
        mqttToken.internalTok.notifyComplete();
        if (mqttWireMessage != null && (mqttWireMessage instanceof MqttAck) && !(mqttWireMessage instanceof MqttPubRec)) {
            this.log.fine(CLASS_NAME, "notifyResult", "648", new Object[]{mqttToken.internalTok.getKey(), mqttWireMessage, mqttException});
            this.callback.asyncOperationComplete(mqttToken);
        }
        if (mqttWireMessage == null) {
            this.log.fine(CLASS_NAME, "notifyResult", "649", new Object[]{mqttToken.internalTok.getKey(), mqttException});
            this.callback.asyncOperationComplete(mqttToken);
        }
    }

    @Override // org.eclipse.paho.mqttv5.client.internal.MqttState
    public void connected() {
        this.log.fine(CLASS_NAME, "connected", "631");
        this.connected = true;
        this.pingSender.start();
    }

    @Override // org.eclipse.paho.mqttv5.client.internal.MqttState
    public Vector<MqttToken> resolveOldTokens(MqttException mqttException) {
        this.log.fine(CLASS_NAME, "resolveOldTokens", "632", new Object[]{mqttException});
        if (mqttException == null) {
            mqttException = new MqttException(32102);
        }
        Vector<MqttToken> outstandingTokens = this.tokenStore.getOutstandingTokens();
        Enumeration<MqttToken> enumerationElements = outstandingTokens.elements();
        while (enumerationElements.hasMoreElements()) {
            MqttToken mqttTokenNextElement = enumerationElements.nextElement();
            synchronized (mqttTokenNextElement) {
                if (!mqttTokenNextElement.isComplete() && !mqttTokenNextElement.internalTok.isCompletePending() && mqttTokenNextElement.getException() == null) {
                    mqttTokenNextElement.internalTok.setException(mqttException);
                }
            }
            if (!mqttTokenNextElement.internalTok.isDeliveryToken()) {
                this.tokenStore.removeToken(mqttTokenNextElement.internalTok.getKey());
            }
        }
        return outstandingTokens;
    }

    @Override // org.eclipse.paho.mqttv5.client.internal.MqttState
    public void disconnected(MqttException mqttException) {
        this.log.fine(CLASS_NAME, "disconnected", "633", new Object[]{mqttException});
        this.connected = false;
        try {
            if (this.cleanStart) {
                clearState();
            }
            clearConnectionState();
            this.pendingMessages.clear();
            this.pendingFlows.clear();
            synchronized (this.pingOutstandingLock) {
                this.pingOutstanding = 0;
            }
        } catch (MqttException unused) {
        }
    }

    private synchronized void releaseMessageId(int i) {
        this.inUseMsgIds.remove(Integer.valueOf(i));
    }

    private synchronized int getNextMessageId() throws MqttException {
        int i;
        int i2 = this.nextMsgId;
        int i3 = 0;
        do {
            int i4 = this.nextMsgId + 1;
            this.nextMsgId = i4;
            if (i4 > 65535) {
                this.nextMsgId = 1;
            }
            i = this.nextMsgId;
            if (i == i2 && (i3 = i3 + 1) == 2) {
                throw ExceptionHelper.createMqttException(32001);
            }
        } while (this.inUseMsgIds.containsKey(Integer.valueOf(i)));
        Integer numValueOf = Integer.valueOf(this.nextMsgId);
        this.inUseMsgIds.put(numValueOf, numValueOf);
        return this.nextMsgId;
    }

    @Override // org.eclipse.paho.mqttv5.client.internal.MqttState
    public void quiesce(long j) {
        if (j > 0) {
            Logger logger = this.log;
            String str = CLASS_NAME;
            logger.fine(str, "quiesce", "637", new Object[]{Long.valueOf(j)});
            synchronized (this.queueLock) {
                this.quiescing = true;
            }
            this.callback.quiesce();
            notifyQueueLock();
            synchronized (this.quiesceLock) {
                try {
                    int iCount = this.tokenStore.count();
                    if (iCount > 0 || this.pendingFlows.size() > 0 || !this.callback.isQuiesced()) {
                        this.log.fine(str, "quiesce", "639", new Object[]{Integer.valueOf(this.actualInFlight), Integer.valueOf(this.pendingFlows.size()), Integer.valueOf(this.inFlightPubRels), Integer.valueOf(iCount)});
                        this.quiesceLock.wait(j);
                    }
                } catch (InterruptedException unused) {
                }
            }
            synchronized (this.queueLock) {
                this.pendingMessages.clear();
                this.pendingFlows.clear();
                this.quiescing = false;
                this.actualInFlight = 0;
            }
            this.log.fine(CLASS_NAME, "quiesce", "640");
        }
    }

    @Override // org.eclipse.paho.mqttv5.client.internal.MqttState
    public void notifyQueueLock() {
        synchronized (this.queueLock) {
            this.log.fine(CLASS_NAME, "notifyQueueLock", "638");
            this.queueLock.notifyAll();
        }
    }

    protected void deliveryComplete(MqttPublish mqttPublish) throws MqttPersistenceException {
        this.log.fine(CLASS_NAME, "deliveryComplete", "641", new Object[]{Integer.valueOf(mqttPublish.getMessageId())});
        this.persistence.remove(getReceivedPersistenceKey(mqttPublish));
        this.inboundQoS2.remove(Integer.valueOf(mqttPublish.getMessageId()));
    }

    protected void deliveryComplete(int i) throws MqttPersistenceException {
        this.log.fine(CLASS_NAME, "deliveryComplete", "641", new Object[]{Integer.valueOf(i)});
        this.persistence.remove(getReceivedPersistenceKey(i));
        this.inboundQoS2.remove(Integer.valueOf(i));
    }

    @Override // org.eclipse.paho.mqttv5.client.internal.MqttState
    public int getActualInFlight() {
        return this.actualInFlight;
    }

    @Override // org.eclipse.paho.mqttv5.client.internal.MqttState
    public Long getOutgoingMaximumPacketSize() {
        return this.mqttConnection.getIncomingMaximumPacketSize();
    }

    @Override // org.eclipse.paho.mqttv5.client.internal.MqttState
    public Long getIncomingMaximumPacketSize() {
        return this.mqttConnection.getOutgoingMaximumPacketSize();
    }

    protected void close() {
        this.inUseMsgIds.clear();
        if (this.pendingMessages != null) {
            this.pendingMessages.clear();
        }
        this.pendingFlows.clear();
        this.outboundQoS2.clear();
        this.outboundQoS1.clear();
        this.outboundQoS0.clear();
        this.inboundQoS2.clear();
        this.tokenStore.clear();
        this.inUseMsgIds = null;
        this.pendingMessages = null;
        this.pendingFlows = null;
        this.outboundQoS2 = null;
        this.outboundQoS1 = null;
        this.outboundQoS0 = null;
        this.inboundQoS2 = null;
        this.tokenStore = null;
        this.callback = null;
        this.clientComms = null;
        this.persistence = null;
        this.pingCommand = null;
    }

    @Override // org.eclipse.paho.mqttv5.client.internal.MqttState
    public Properties getDebug() {
        Properties properties = new Properties();
        properties.put("In use msgids", this.inUseMsgIds);
        properties.put("pendingMessages", this.pendingMessages);
        properties.put("pendingFlows", this.pendingFlows);
        properties.put("serverReceiveMaximum", Integer.valueOf(this.mqttConnection.getReceiveMaximum().intValue()));
        properties.put("nextMsgID", Integer.valueOf(this.nextMsgId));
        properties.put("actualInFlight", Integer.valueOf(this.actualInFlight));
        properties.put("inFlightPubRels", Integer.valueOf(this.inFlightPubRels));
        properties.put("quiescing", Boolean.valueOf(this.quiescing));
        properties.put("pingoutstanding", Integer.valueOf(this.pingOutstanding));
        properties.put("lastOutboundActivity", Long.valueOf(this.lastOutboundActivity));
        properties.put("lastInboundActivity", Long.valueOf(this.lastInboundActivity));
        properties.put("outboundQoS2", this.outboundQoS2);
        properties.put("outboundQoS1", this.outboundQoS1);
        properties.put("outboundQoS0", this.outboundQoS0);
        properties.put("inboundQoS2", this.inboundQoS2);
        properties.put("tokens", this.tokenStore);
        return properties;
    }
}
