added definitions for sending and receiving messages
This commit is contained in:
@@ -14,6 +14,7 @@ typedef struct PacketHeader {
|
||||
u8 _reserved1;
|
||||
u16 type;
|
||||
u32 _reserved4;
|
||||
/* size of request/response struct */
|
||||
u64 content_size;
|
||||
} ATTRIBUTE_ALIGNED(64) PacketHeader;
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
str validateUsername_cstr(char username[USERNAME_SIZE_MAX+1], str* out_username_str){
|
||||
// must end with 0
|
||||
if(username[USERNAME_SIZE_MAX] != '\0'){
|
||||
return STR("Username string doesn't end correctly");
|
||||
return str_copy(STR("Username string doesn't end correctly"));
|
||||
}
|
||||
|
||||
str u = str_from_cstr(username);
|
||||
@@ -16,8 +16,13 @@ str validateUsername_cstr(char username[USERNAME_SIZE_MAX+1], str* out_username_
|
||||
}
|
||||
|
||||
str validateUsername_str(str username){
|
||||
if(username.size < USERNAME_SIZE_MIN){
|
||||
return STR("Username length is too small");
|
||||
if(username.size < USERNAME_SIZE_MIN || username.size > USERNAME_SIZE_MAX){
|
||||
return str_from_cstr(
|
||||
sprintf_malloc(
|
||||
"username length (in bytes) must be >= %i and <= %i\n",
|
||||
USERNAME_SIZE_MIN, USERNAME_SIZE_MAX
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
for(u32 i = 0; i < username.size; i++){
|
||||
@@ -28,8 +33,8 @@ str validateUsername_str(str username){
|
||||
c == '.' || c == '_' || c == '-')
|
||||
continue;
|
||||
|
||||
return STR("Username contains restricted characters. "
|
||||
"Allowed characters: latin, digits, ._-");
|
||||
return str_copy(STR("Username contains restricted characters. "
|
||||
"Allowed characters: latin, digits, ._-"));
|
||||
}
|
||||
|
||||
return str_null;
|
||||
@@ -88,9 +93,9 @@ Result(void) LoginRequest_tryConstruct(LoginRequest *ptr, PacketHeader* header,
|
||||
_PacketHeader_construct(LoginRequest);
|
||||
memset(ptr, 0, sizeof(*ptr));
|
||||
|
||||
str username_check_error = validateUsername_str(username);
|
||||
if(username_check_error.data){
|
||||
Return RESULT_ERROR(username_check_error.data, false);
|
||||
str name_error_str = validateUsername_str(username);
|
||||
if(name_error_str.data){
|
||||
Return RESULT_ERROR(name_error_str.data, true);
|
||||
}
|
||||
memcpy(ptr->username, username.data, username.size);
|
||||
|
||||
@@ -117,9 +122,9 @@ Result(void) RegisterRequest_tryConstruct(RegisterRequest *ptr, PacketHeader* he
|
||||
_PacketHeader_construct(RegisterRequest);
|
||||
memset(ptr, 0, sizeof(*ptr));
|
||||
|
||||
str username_check_error = validateUsername_str(username);
|
||||
if(username_check_error.data){
|
||||
Return RESULT_ERROR(username_check_error.data, false);
|
||||
str name_error_str = validateUsername_str(username);
|
||||
if(name_error_str.data){
|
||||
Return RESULT_ERROR(name_error_str.data, true);
|
||||
}
|
||||
memcpy(ptr->username, username.data, username.size);
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
#include "tlibc/errors.h"
|
||||
#include "tlibc/string/str.h"
|
||||
#include "tlibc/time.h"
|
||||
#include "network/tcp-chat-protocol/constant.h"
|
||||
|
||||
#define PROTOCOL_VERSION 1 /* 1.0.0 */
|
||||
@@ -15,7 +16,7 @@ Valid username:
|
||||
- allowed characters: latin, digits, ._-
|
||||
*/
|
||||
/// validates username char[] and constructs str from it
|
||||
/// @return str_null on success, stack-allocated error message on fail
|
||||
/// @return str_null on success, heap-allocated error message on fail
|
||||
str validateUsername_cstr(char username[USERNAME_SIZE_MAX+1], str* out_username_str) ATTRIBUTE_WARN_UNUSED_RESULT;
|
||||
|
||||
str validateUsername_str(str username) ATTRIBUTE_WARN_UNUSED_RESULT;
|
||||
@@ -119,3 +120,38 @@ void RegisterResponse_construct(RegisterResponse* ptr, PacketHeader* header,
|
||||
u64 user_id);
|
||||
|
||||
|
||||
typedef struct SendMessageRequest {
|
||||
u64 channel_id;
|
||||
u16 data_size;
|
||||
/* stream of size data_size */
|
||||
} ALIGN_PACKET_STRUCT SendMessageRequest;
|
||||
|
||||
void SendMessageRequest_construct(SendMessageRequest* ptr, PacketHeader* header,
|
||||
u64 channel_id, u16 data_size);
|
||||
|
||||
|
||||
typedef struct SendMessageResponse {
|
||||
u64 message_id;
|
||||
DateTime receiving_time_utc;
|
||||
} ALIGN_PACKET_STRUCT SendMessageResponse;
|
||||
|
||||
void SendMessageResponse_construct(SendMessageResponse* ptr, PacketHeader* header,
|
||||
u64 message_id, DateTime receiving_time_utc);
|
||||
|
||||
|
||||
typedef struct GetMessageBlockRequest {
|
||||
u64 message_block_id;
|
||||
} ALIGN_PACKET_STRUCT GetMessageBlockRequest;
|
||||
|
||||
void GetMessageBlockRequest_construct(GetMessageBlockRequest* ptr, PacketHeader* header,
|
||||
u64 message_block_id);
|
||||
|
||||
|
||||
typedef struct GetMessageBlockResponse {
|
||||
u32 data_size;
|
||||
/* stream of size data_size */
|
||||
} ALIGN_PACKET_STRUCT GetMessageBlockResponse;
|
||||
|
||||
void GetMessageBlockResponse_construct(GetMessageBlockResponse* ptr, PacketHeader* header,
|
||||
u32 data_size);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user