Mercurial > hg > batmud > maputils
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;