From 7245572a971ed0dcb729b9a21e8e23120a62a4b6 Mon Sep 17 00:00:00 2001 From: "Tristan B. Velloza Kildaire" Date: Sat, 25 Mar 2023 20:59:38 +0200 Subject: [PATCH] - Restructured whole package --- source/bformat/marshall.d | 85 +++++++++++++++++++++++ source/bformat/package.d | 3 + source/{bmessage.d => bformat/sockets.d} | 88 ++++-------------------- 3 files changed, 103 insertions(+), 73 deletions(-) create mode 100644 source/bformat/marshall.d create mode 100644 source/bformat/package.d rename source/{bmessage.d => bformat/sockets.d} (58%) diff --git a/source/bformat/marshall.d b/source/bformat/marshall.d new file mode 100644 index 0000000..5656829 --- /dev/null +++ b/source/bformat/marshall.d @@ -0,0 +1,85 @@ +module bformat.marshall; + +/** + * + * Params: + * bformatBytes = + * Returns: + */ +public byte[] decodeMessage(byte[] bformatBytes) +{ + /* Construct a buffer to receive into */ + byte[] receiveBuffer; + + /* Get the length of the message */ + byte[4] messageLengthBytes = bformatBytes[0..4]; + + /* Response message length */ + uint messageLength; + + /* Little endian version you simply read if off the bone (it's already in the correct order) */ + version(LittleEndian) + { + messageLength = *cast(int*)messageLengthBytes.ptr; + } + + /* Big endian requires we byte-sapped the little-endian encoded number */ + version(BigEndian) + { + byte[] swappedLength; + swappedLength.length = 4; + + swappedLength[0] = messageLengthBytes[3]; + swappedLength[1] = messageLengthBytes[2]; + swappedLength[2] = messageLengthBytes[1]; + swappedLength[3] = messageLengthBytes[0]; + + messageLength = *cast(int*)swappedLength.ptr; + } + + + /* Read the full message */ + receiveBuffer = bformatBytes[4..4+messageLength]; + + return receiveBuffer; +} + +/** + * + * Params: + * message = + * Returns: + */ +public byte[] encodeBformat(byte[] message) +{ + /* The message buffer */ + byte[] messageBuffer; + + /* Encode the 4 byte message length header (little endian) */ + int payloadLength = cast(int)message.length; + byte* lengthBytes = cast(byte*)&payloadLength; + + /* On little endian simply get the bytes as is (it would be encoded as little endian) */ + version(LittleEndian) + { + messageBuffer ~= *(lengthBytes+0); + messageBuffer ~= *(lengthBytes+1); + messageBuffer ~= *(lengthBytes+2); + messageBuffer ~= *(lengthBytes+3); + } + + /* On Big Endian you must swap the big-endian-encoded number to be in little endian ordering */ + version(BigEndian) + { + messageBuffer ~= *(lengthBytes+3); + messageBuffer ~= *(lengthBytes+2); + messageBuffer ~= *(lengthBytes+1); + messageBuffer ~= *(lengthBytes+0); + } + + + /* Add the message to the buffer */ + messageBuffer ~= cast(byte[])message; + + return messageBuffer; +} \ No newline at end of file diff --git a/source/bformat/package.d b/source/bformat/package.d new file mode 100644 index 0000000..90a864a --- /dev/null +++ b/source/bformat/package.d @@ -0,0 +1,3 @@ +module bformat; + +public import bformat.sockets : sendMessage, receiveMessage; \ No newline at end of file diff --git a/source/bmessage.d b/source/bformat/sockets.d similarity index 58% rename from source/bmessage.d rename to source/bformat/sockets.d index abb0d03..57450e8 100644 --- a/source/bmessage.d +++ b/source/bformat/sockets.d @@ -1,45 +1,14 @@ -module bmessage; +module bformat.sockets; import std.socket : Socket, SocketFlags, MSG_WAITALL; -public byte[] decodeMessage(byte[] bformatBytes) -{ - /* Construct a buffer to receive into */ - byte[] receiveBuffer; - - /* Get the length of the message */ - byte[4] messageLengthBytes = bformatBytes[0..4]; - - /* Response message length */ - uint messageLength; - - /* Little endian version you simply read if off the bone (it's already in the correct order) */ - version(LittleEndian) - { - messageLength = *cast(int*)messageLengthBytes.ptr; - } - - /* Big endian requires we byte-sapped the little-endian encoded number */ - version(BigEndian) - { - byte[] swappedLength; - swappedLength.length = 4; - - swappedLength[0] = messageLengthBytes[3]; - swappedLength[1] = messageLengthBytes[2]; - swappedLength[2] = messageLengthBytes[1]; - swappedLength[3] = messageLengthBytes[0]; - - messageLength = *cast(int*)swappedLength.ptr; - } - - - /* Read the full message */ - receiveBuffer = bformatBytes[4..4+messageLength]; - - return receiveBuffer; -} - +/** + * + * Params: + * originator = + * receiveMessage = + * Returns: + */ public bool receiveMessage(Socket originator, ref byte[] receiveMessage) { /* Construct a buffer to receive into */ @@ -106,40 +75,13 @@ public bool receiveMessage(Socket originator, ref byte[] receiveMessage) return status; } -public byte[] encodeBformat(byte[] message) -{ - /* The message buffer */ - byte[] messageBuffer; - - /* Encode the 4 byte message length header (little endian) */ - int payloadLength = cast(int)message.length; - byte* lengthBytes = cast(byte*)&payloadLength; - - /* On little endian simply get the bytes as is (it would be encoded as little endian) */ - version(LittleEndian) - { - messageBuffer ~= *(lengthBytes+0); - messageBuffer ~= *(lengthBytes+1); - messageBuffer ~= *(lengthBytes+2); - messageBuffer ~= *(lengthBytes+3); - } - - /* On Big Endian you must swap the big-endian-encoded number to be in little endian ordering */ - version(BigEndian) - { - messageBuffer ~= *(lengthBytes+3); - messageBuffer ~= *(lengthBytes+2); - messageBuffer ~= *(lengthBytes+1); - messageBuffer ~= *(lengthBytes+0); - } - - - /* Add the message to the buffer */ - messageBuffer ~= cast(byte[])message; - - return messageBuffer; -} - +/** + * + * Params: + * recipient = + * message = + * Returns: + */ public bool sendMessage(Socket recipient, byte[] message) { /* The message buffer */