From 67bc9b9d234b2a7d5ec642c63c1adaadab967f86 Mon Sep 17 00:00:00 2001
From: Pim van Pelt <pim@ipng.nl>
Date: Fri, 22 Dec 2017 21:38:19 +0100
Subject: [PATCH] Simplify MQTT structure

---
 unittest/data/TestWidget-MQTT.json |  5 ++++-
 unittest/test_widget.c             | 29 ++++++++++-------------------
 2 files changed, 14 insertions(+), 20 deletions(-)

diff --git a/unittest/data/TestWidget-MQTT.json b/unittest/data/TestWidget-MQTT.json
index 57e9435..7a1d144 100644
--- a/unittest/data/TestWidget-MQTT.json
+++ b/unittest/data/TestWidget-MQTT.json
@@ -6,5 +6,8 @@
   "h": 56,
   "label": "On",
   "type": 1,
-  "mqtt": [ "/topic1 Hello", "/t2 Wereld", "/topic3", "", "/top4" ]
+  "mqtt": [
+    { "topic": "/topic1", "message": {"string": 100, "args": {"int":100, "str":"string1"}}},
+    { "topic": "/topic2", "message": {"string": 200, "args": { "int":200, "str":"string2"}}}
+  ]
 }
diff --git a/unittest/test_widget.c b/unittest/test_widget.c
index 9a9f254..03620e1 100644
--- a/unittest/test_widget.c
+++ b/unittest/test_widget.c
@@ -83,29 +83,20 @@ static void widget_default_mqtt_send(struct widget_t *w, void *ev_data) {
   LOG(LL_INFO, ("MQTT string: '%s'", (char *)w->user_data));
   // Traverse Array
   for (idx = 0; json_scanf_array_elem(w->user_data, strlen(w->user_data), "", idx, &val) > 0; idx++) {
-    char *t=NULL, *m=NULL;
-    uint16_t t_len=0, m_len=0;
-    char *topic;
+    char *topic, *message;
 
     LOG(LL_DEBUG, ("Index %d, token [%.*s]", idx, val.len, val.ptr));
-    t=(char*)val.ptr;
-    m=strstr(val.ptr, " ");
-    if (m-val.ptr <= val.len) {
-      LOG(LL_INFO, ("Space found"));
-      t_len=m-t;
-      m++;
-      m_len=val.len-t_len-1;
-    } else {
-      t_len=val.len;
-      m_len=0;
-      m=NULL;
+    if (val.len==0) {
+      LOG(LL_ERROR, ("mqtt element %d is empty token", idx));
+      continue;
     }
-    if ((topic=malloc(t_len+1))) {
-      memcpy(topic, t, t_len);
-      topic[t_len]=0;
-      LOG(LL_INFO, ("Sending topic='%s', message='%.*s'", topic, m_len, m));
-      free(topic);
+    if (json_scanf(val.ptr, val.len, "{topic:%Q, message:%Q}", &topic, &message) != 2) {
+      LOG(LL_ERROR, ("mqtt element %d ('%.*s'), required fields 'topic' and 'message'", idx, val.len, val.ptr));
+      continue;
     }
+    LOG(LL_INFO, ("topic='%s', message='%s'", topic, message));
+    if (topic) free(topic);
+    if (message) free(message);
   }
   (void) ev_data;
 }