From 6bcb6ac6ca5087d250d37ef5affe1803eb73d2ec Mon Sep 17 00:00:00 2001
From: NB Grey <serge.rumyancev@gmail.com>
Date: Tue, 31 Dec 2024 22:29:03 +0300
Subject: [PATCH] add response code conversion for mqtt 3.1.1

---
 .../kotlin/io/github/davidepianca98/MQTTClient.kt  |  4 +++-
 .../mqtt/packets/mqttv4/ConnectReturnCode.kt       | 14 +++++++++++++-
 .../mqtt/packets/mqttv4/SubackReturnCode.kt        |  2 +-
 .../mqtt/packets/mqttv5/ReasonCode.kt              |  2 +-
 4 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/MQTTClient.kt b/kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/MQTTClient.kt
index 5492e3b..dd25dae 100644
--- a/kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/MQTTClient.kt
+++ b/kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/MQTTClient.kt
@@ -41,6 +41,7 @@ import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Pubcomp
 import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Publish
 import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Suback
 import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Subscribe
+import io.github.davidepianca98.mqtt.packets.mqttv4.toReasonCode
 import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Auth
 import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Connack
 import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Connect
@@ -539,7 +540,8 @@ public class MQTTClient(
             enhancedAuthCallback(packet.properties.authenticationData)
         } else if (packet is MQTT4Connack) {
             if (packet.connectReturnCode != ConnectReturnCode.CONNECTION_ACCEPTED) {
-                throw IOException("Connection failed with code: ${packet.connectReturnCode}")
+                throw MQTTException(packet.connectReturnCode.toReasonCode())
+//                throw IOException("Connection failed with code: ${packet.connectReturnCode}")
             }
         }
 
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/ConnectReturnCode.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/ConnectReturnCode.kt
index 8346c22..09ad45d 100644
--- a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/ConnectReturnCode.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/ConnectReturnCode.kt
@@ -1,5 +1,8 @@
 package io.github.davidepianca98.mqtt.packets.mqttv4
 
+import io.github.davidepianca98.mqtt.packets.mqttv4.ConnectReturnCode.*
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+
 public enum class ConnectReturnCode(public val value: Int) {
     CONNECTION_ACCEPTED(0),
     UNACCEPTABLE_PROTOCOL_VERSION(1),
@@ -9,6 +12,15 @@ public enum class ConnectReturnCode(public val value: Int) {
     NOT_AUTHORIZED(5);
 
     public companion object {
-        public fun valueOf(value: Int): ConnectReturnCode? = values().firstOrNull { it.value == value }
+        public fun valueOf(value: Int): ConnectReturnCode? = entries.firstOrNull { it.value == value }
     }
 }
+
+public fun ConnectReturnCode.toReasonCode() : ReasonCode = when (this) {
+    CONNECTION_ACCEPTED -> ReasonCode.SUCCESS
+    UNACCEPTABLE_PROTOCOL_VERSION -> ReasonCode.UNSUPPORTED_PROTOCOL_VERSION
+    IDENTIFIER_REJECTED -> ReasonCode.CLIENT_IDENTIFIER_NOT_VALID
+    SERVER_UNAVAILABLE -> ReasonCode.SERVER_UNAVAILABLE
+    BAD_USERNAME_PASSWORD -> ReasonCode.BAD_USER_NAME_OR_PASSWORD
+    NOT_AUTHORIZED -> ReasonCode.NOT_AUTHORIZED
+}
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/SubackReturnCode.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/SubackReturnCode.kt
index 0c8331f..7972483 100644
--- a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/SubackReturnCode.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/SubackReturnCode.kt
@@ -9,7 +9,7 @@ public enum class SubackReturnCode(public val value: Int) {
     FAILURE(128);
 
     public companion object {
-        public fun valueOf(value: Int): SubackReturnCode? = values().firstOrNull { it.value == value }
+        public fun valueOf(value: Int): SubackReturnCode? = entries.firstOrNull { it.value == value }
     }
 }
 
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/ReasonCode.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/ReasonCode.kt
index dfba46b..2b61f53 100644
--- a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/ReasonCode.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/ReasonCode.kt
@@ -46,6 +46,6 @@ public enum class ReasonCode(public val value: Int) {
     WILDCARD_SUBSCRIPTIONS_NOT_SUPPORTED(162);
 
     public companion object {
-        public fun valueOf(value: Int): ReasonCode? = values().firstOrNull { it.value == value }
+        public fun valueOf(value: Int): ReasonCode? = entries.firstOrNull { it.value == value }
     }
 }
-- 
GitLab