From 8374c4dfd44d47d403413ce1ff568fd63bef8ddd Mon Sep 17 00:00:00 2001
From: Nicolas Adenis-Lamarre <nicolas.adenis.lamarre@gmail.com>
Date: Sat, 11 May 2024 19:49:20 +0000
Subject: [PATCH] feat: move to big endian for network communications

Signed-off-by: Nicolas Adenis-Lamarre <nicolas.adenis.lamarre@gmail.com>
---
 src/dmdServer.cpp | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/src/dmdServer.cpp b/src/dmdServer.cpp
index daf394d..f0da358 100644
--- a/src/dmdServer.cpp
+++ b/src/dmdServer.cpp
@@ -77,6 +77,21 @@ void DMDUTILCALLBACK LogCallback(DMDUtil_LogLevel logLevel, const char* format,
   fprintf(stderr, "%s\n", buffer);
 }
 
+void convertFromNetwork(DMDUtil::DMD::Update* o) {
+  // use case ?
+}
+
+void convertFromNetwork(DMDUtil::DMD::StreamHeader* o) {
+  o->mode   = (DMDUtil::DMD::Mode) ntohl((uint32_t)o->mode);
+  o->width  = ntohs(o->width);
+  o->height = ntohs(o->height);
+  o->length = ntohl(o->length);
+}
+
+void convertFromNetwork(DMDUtil::DMD::PathsHeader* o) {
+  // nothing to do
+}
+
 void run(sockpp::tcp_socket sock, uint32_t threadId)
 {
   uint8_t buffer[sizeof(DMDUtil::DMD::Update)];
@@ -95,9 +110,9 @@ void run(sockpp::tcp_socket sock, uint32_t threadId)
 
     if (n == sizeof(DMDUtil::DMD::StreamHeader))
     {
-      // At the moment the server only listens on localhost.
-      // Therefore, we don't have to take care about litte vs. big endian and can use memcpy.
       memcpy(pStreamHeader, buffer, n);
+      convertFromNetwork(pStreamHeader);
+
       if (strcmp(pStreamHeader->header, "DMDStream") == 0 && pStreamHeader->version == 1)
       {
         if (opt_verbose)
@@ -125,6 +140,7 @@ void run(sockpp::tcp_socket sock, uint32_t threadId)
             {
               DMDUtil::DMD::PathsHeader pathsHeader;
               memcpy(&pathsHeader, buffer, n);
+              convertFromNetwork(&pathsHeader);
 
               if (strcmp(pathsHeader.header, "Paths") == 0 &&
                   (n = sock.read_n(buffer, sizeof(DMDUtil::DMD::Update))) == sizeof(DMDUtil::DMD::Update) &&
@@ -136,6 +152,7 @@ void run(sockpp::tcp_socket sock, uint32_t threadId)
                                pathsHeader.name, pathsHeader.altColorPath, pathsHeader.pupVideosPath);
                 DMDUtil::DMD::Update data;
                 memcpy(&data, buffer, n);
+		convertFromNetwork(&data);
 
                 if (data.width <= DMDSERVER_MAX_WIDTH && data.height <= DMDSERVER_MAX_HEIGHT)
                 {
@@ -166,9 +183,6 @@ void run(sockpp::tcp_socket sock, uint32_t threadId)
                 threadId == currentThreadId && pStreamHeader->width <= DMDSERVER_MAX_WIDTH &&
                 pStreamHeader->height <= DMDSERVER_MAX_HEIGHT)
             {
-              // At the moment the server only listens on localhost.
-              // Therefore, we don't have to take care about litte vs. big endian and can use the buffer as uint16_t as
-              // it is.
               pDmd->UpdateRGB16Data((uint16_t*)buffer, pStreamHeader->width, pStreamHeader->height,
                                     pStreamHeader->buffered == 1);
             }