aboutsummaryrefslogtreecommitdiff
path: root/protocol.h
diff options
context:
space:
mode:
Diffstat (limited to 'protocol.h')
-rw-r--r--protocol.h61
1 files changed, 30 insertions, 31 deletions
diff --git a/protocol.h b/protocol.h
index 84d636f..5d9344b 100644
--- a/protocol.h
+++ b/protocol.h
@@ -49,6 +49,7 @@ typedef u64 ID;
typedef struct {
u16 version;
u8 type;
+ ID id;
} HeaderMessage;
typedef enum {
@@ -60,7 +61,7 @@ typedef enum {
HEADER_TYPE_ERROR
} HeaderType;
// shorthand for creating a header with a value from the enum
-#define HEADER_INIT(t) {.version = PROTOCOL_VERSION, .type = t}
+#define HEADER_INIT(t) {.version = PROTOCOL_VERSION, .type = t, .id = 0}
// from Tsoding video on minicel (https://youtu.be/HCAgvKQDJng?t=4546)
// sv(https://github.com/tsoding/sv)
#define HEADER_FMT "header: v%d %s(%d)"
@@ -69,11 +70,9 @@ typedef enum {
// For sending texts to other clients
// - 13 bytes for the author
// - 8 bytes for the timestamp
-// - 8 bytes for id
// - 2 bytes for the text length
// - x*4 bytes for the text
typedef struct {
- ID id;
u64 timestamp; // timestamp of when the message was sent
u16 len;
wchar_t* text; // placeholder for indexing
@@ -97,19 +96,9 @@ typedef struct {
#define INTRODUCTION_FMT "introduction: %s"
#define INTRODUCTION_ARG(message) message.author
-// Request IntroductionMessage for client with that id.
-// See "First connection" if this message is used when the client connects for the first time.
-// be used to retrieve information about a client with an unknown ID.
-// - 8 bytes for id
-typedef struct {
- ID id;
-} IDMessage;
-
// Notifying the sender's state, such as "connected", "disconnected", "AFK", ...
-// - 8 bytes for id
// - 1 byte for type
typedef struct {
- ID id;
u8 type;
} PresenceMessage;
typedef enum {
@@ -141,11 +130,11 @@ typedef struct {
u8*
headerTypeString(HeaderType type)
{
- switch (type) {
+ switch (type)
+ {
case HEADER_TYPE_TEXT: return (u8*)"TextMessage";
case HEADER_TYPE_HISTORY: return (u8*)"HistoryMessage";
case HEADER_TYPE_PRESENCE: return (u8*)"PresenceMessage";
- case HEADER_TYPE_ID: return (u8*)"IDMessage";
case HEADER_TYPE_INTRODUCTION: return (u8*)"IntroductionMessage";
case HEADER_TYPE_ERROR: return (u8*)"ErrorMessage";
default: return (u8*)"Unknown";
@@ -155,7 +144,8 @@ headerTypeString(HeaderType type)
u8*
presenceTypeString(PresenceType type)
{
- switch (type) {
+ switch (type)
+ {
case PRESENCE_TYPE_CONNECTED: return (u8*)"connected";
case PRESENCE_TYPE_DISCONNECTED: return (u8*)"disconnected";
case PRESENCE_TYPE_AFK: return (u8*)"afk";
@@ -166,7 +156,8 @@ presenceTypeString(PresenceType type)
u8*
errorTypeString(ErrorType type)
{
- switch (type) {
+ switch (type)
+ {
case ERROR_TYPE_BADMESSAGE: return (u8*)"bad message";
case ERROR_TYPE_NOTFOUND: return (u8*)"not found";
case ERROR_TYPE_SUCCESS: return (u8*)"success";
@@ -217,10 +208,11 @@ u32
getMessageSize(HeaderType type)
{
u32 size = 0;
- switch (type) {
+ switch (type)
+ {
case HEADER_TYPE_ERROR: size = sizeof(ErrorMessage); break;
case HEADER_TYPE_HISTORY: size = sizeof(HistoryMessage); break;
- case HEADER_TYPE_ID: size = sizeof(IDMessage); break;
+ case HEADER_TYPE_ID: size = sizeof(HeaderMessage); break;
case HEADER_TYPE_INTRODUCTION: size = sizeof(IntroductionMessage); break;
case HEADER_TYPE_PRESENCE: size = sizeof(PresenceMessage); break;
default: assert(0);
@@ -237,7 +229,8 @@ recvAnyMessageType(s32 fd, HeaderMessage* header, void *anyMessage, HeaderType t
assert(nrecv == sizeof(*header));
s32 size = 0;
- switch (type) {
+ switch (type)
+ {
case HEADER_TYPE_ERROR:
case HEADER_TYPE_HISTORY:
case HEADER_TYPE_ID:
@@ -245,7 +238,8 @@ recvAnyMessageType(s32 fd, HeaderMessage* header, void *anyMessage, HeaderType t
case HEADER_TYPE_PRESENCE:
size = getMessageSize(header->type);
break;
- case HEADER_TYPE_TEXT: {
+ case HEADER_TYPE_TEXT:
+ {
TextMessage* message = anyMessage;
size = TEXTMESSAGE_SIZE + message->len * sizeof(*message->text);
} break;
@@ -270,7 +264,8 @@ recvAnyMessage(Arena* arena, s32 fd)
assert(nrecv == sizeof(*header));
s32 size = 0;
- switch (header->type) {
+ switch (header->type)
+ {
case HEADER_TYPE_ERROR:
case HEADER_TYPE_HISTORY:
case HEADER_TYPE_ID:
@@ -278,7 +273,8 @@ recvAnyMessage(Arena* arena, s32 fd)
case HEADER_TYPE_PRESENCE:
size = getMessageSize(header->type);
break;
- case HEADER_TYPE_TEXT: {
+ case HEADER_TYPE_TEXT:
+ {
Message result;
result.header = header;
result.message = recvTextMessage(arena, fd);
@@ -303,7 +299,8 @@ Message
waitForMessageType(Arena* arena, Arena* queueArena, u32 fd, HeaderType type)
{
Message message;
- while (1) {
+ while (1)
+ {
message = recvAnyMessage(arena, fd);
if (message.header->type == type)
break;
@@ -315,24 +312,26 @@ waitForMessageType(Arena* arena, Arena* queueArena, u32 fd, HeaderType type)
// Generic sending function for sending any type of message to fd
// Returns number of bytes sent in message or -1 if there was an error.
s32
-sendAnyMessage(u32 fd, HeaderMessage* header, void* anyMessage)
+sendAnyMessage(u32 fd, HeaderMessage header, void* anyMessage)
{
s32 nsend_total;
- s32 nsend = send(fd, header, sizeof(*header), 0);
+ s32 nsend = send(fd, &header, sizeof(header), 0);
if (nsend == -1) return nsend;
- assert(nsend == sizeof(*header));
+ assert(nsend == sizeof(header));
nsend_total = nsend;
s32 size = 0;
- switch (header->type) {
+ switch (header.type)
+ {
case HEADER_TYPE_ERROR:
case HEADER_TYPE_HISTORY:
case HEADER_TYPE_ID:
case HEADER_TYPE_INTRODUCTION:
case HEADER_TYPE_PRESENCE:
- size = getMessageSize(header->type);
+ size = getMessageSize(header.type);
break;
- case HEADER_TYPE_TEXT: {
+ case HEADER_TYPE_TEXT:
+ {
nsend = send(fd, anyMessage, TEXTMESSAGE_SIZE, 0);
assert(nsend != -1);
assert(nsend == TEXTMESSAGE_SIZE);
@@ -345,7 +344,7 @@ sendAnyMessage(u32 fd, HeaderMessage* header, void* anyMessage)
anyMessage = &message->text;
} break;
default:
- fprintf(stdout, "sendAnyMessage(%d)|Cannot send %s\n", fd, headerTypeString(header->type));
+ fprintf(stdout, "sendAnyMessage(%d)|Cannot send %s\n", fd, headerTypeString(header.type));
return 0;
}