changeset 1841:f8a154acd29c

Add a wrapper function for lws_write to implement the pre-padding of the data buffer required by libwebsockets.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 31 Oct 2017 22:38:09 +0200
parents 5f574f78eff6
children ac74a0ab50d9
files mapsearch.c
diffstat 1 files changed, 29 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mapsearch.c	Tue Oct 31 20:50:02 2017 +0200
+++ b/mapsearch.c	Tue Oct 31 22:38:09 2017 +0200
@@ -635,6 +635,31 @@
 }
 
 
+//
+// This wrapper function for lws_write exists because of the
+// libwebsockets' requirement for pre-pad of the data buffer
+// for header information.
+//
+int mapLWSWrite(struct lws *wsi, const unsigned char *data, const size_t len)
+{
+    const size_t pad = ((LWS_PRE / sizeof(void *)) + 1) * sizeof(void);
+    unsigned char *buf;
+    int ret;
+
+    if (wsi == NULL)
+        return 0;
+
+    if ((buf = th_malloc(len + pad)) == NULL)
+        return -1;
+
+    memcpy(buf + pad, data, len);
+    ret = lws_write(wsi, buf + pad, len, LWS_WRITE_TEXT);
+
+    th_free(buf);
+    return ret;
+}
+
+
 void mapPerformSearch(struct lws *wsi, unsigned char *data, const size_t len, char **verr)
 {
     int width, height, centerX, centerY;
@@ -840,8 +865,7 @@
     th_strbuf_puts(&buf, &bufSize, &bufLen, "]");
     THMSG(2, "%s\n", buf);
 
-    if (wsi != NULL)
-        lws_write(wsi, (unsigned char *) buf, bufLen, LWS_WRITE_TEXT);
+    mapLWSWrite(wsi, (unsigned char *) buf, bufLen);
 
     th_free(buf);
 }
@@ -902,7 +926,7 @@
                 }
 
                 th_strbuf_puts(&buf, &bufSize, &bufLen, "]");
-                lws_write(wsi, (unsigned char *) buf, bufLen, LWS_WRITE_TEXT);
+                mapLWSWrite(wsi, (unsigned char *) buf, bufLen);
             }
             else
             {
@@ -915,13 +939,13 @@
             {
                 THERR("[%p] %s\n", wsi, verr);
                 char *vstr = th_strdup_printf("ERROR:%s", verr);
-                lws_write(wsi, (unsigned char *) vstr, strlen(vstr), LWS_WRITE_TEXT);
+                mapLWSWrite(wsi, (unsigned char *) vstr, strlen(vstr));
                 th_free(vstr);
             }
 
             // End communication
             verr = "END";
-            lws_write(wsi, (unsigned char *) verr, strlen(verr), LWS_WRITE_TEXT);
+            mapLWSWrite(wsi, (unsigned char *) verr, strlen(verr));
             lws_close_reason(wsi, LWS_CLOSE_STATUS_NOSTATUS, NULL, 0);
             }
             break;