A tiny bit more compact and straightforward?
This commit is contained in:
parent
9e92c2b05b
commit
af4299f155
4 changed files with 62 additions and 92 deletions
|
@ -16,8 +16,6 @@ static int answer_phone_version_message(skipstone_message_service *service,
|
||||||
1, 0xff, 0xff, 0xff, 0xff, 0x80, 0, 0, 0, 0, 0, 0, 0x32
|
1, 0xff, 0xff, 0xff, 0xff, 0x80, 0, 0, 0, 0, 0, 0, 0x32
|
||||||
};
|
};
|
||||||
|
|
||||||
printf("Got message on endpoint %hu\n", id);
|
|
||||||
|
|
||||||
skipstone_message_service_queue(service, &response, sizeof(response), id);
|
skipstone_message_service_queue(service, &response, sizeof(response), id);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -16,8 +16,6 @@ static int answer_phone_version_message(skipstone_message_service *service,
|
||||||
1, 0xff, 0xff, 0xff, 0xff, 0x80, 0, 0, 0, 0, 0, 0, 0x32
|
1, 0xff, 0xff, 0xff, 0xff, 0x80, 0, 0, 0, 0, 0, 0, 0x32
|
||||||
};
|
};
|
||||||
|
|
||||||
printf("Got message on endpoint %hu\n", id);
|
|
||||||
|
|
||||||
skipstone_message_service_queue(service, &response, sizeof(response), id);
|
skipstone_message_service_queue(service, &response, sizeof(response), id);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -6,15 +6,7 @@
|
||||||
#include <skipstone/queue.h>
|
#include <skipstone/queue.h>
|
||||||
#include <skipstone/message.h>
|
#include <skipstone/message.h>
|
||||||
|
|
||||||
enum part_type {
|
|
||||||
SKIPSTONE_MESSAGE_PART_STRING,
|
|
||||||
SKIPSTONE_MESSAGE_PART_UINT8,
|
|
||||||
SKIPSTONE_MESSAGE_PART_UINT16
|
|
||||||
};
|
|
||||||
|
|
||||||
struct part {
|
struct part {
|
||||||
enum part_type type;
|
|
||||||
enum skipstone_message_endianness endianness;
|
|
||||||
uint8_t size;
|
uint8_t size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -56,17 +48,14 @@ error_malloc_message:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int append_part(skipstone_message *message,
|
static int append_part(skipstone_message *message, void *buf, uint8_t size) {
|
||||||
void *buf, uint8_t size, enum part_type type) {
|
|
||||||
struct part *part;
|
struct part *part;
|
||||||
|
|
||||||
if ((part = malloc(sizeof(*part) + size)) == NULL) {
|
if ((part = malloc(sizeof(*part) + size)) == NULL) {
|
||||||
goto error_malloc_part;
|
goto error_malloc_part;
|
||||||
}
|
}
|
||||||
|
|
||||||
part->type = type;
|
part->size = size;
|
||||||
part->endianness = SKIPSTONE_MESSAGE_ENDIAN_LITTLE;
|
|
||||||
part->size = size;
|
|
||||||
|
|
||||||
memcpy(part + 1, buf, size);
|
memcpy(part + 1, buf, size);
|
||||||
|
|
||||||
|
@ -85,17 +74,35 @@ error_malloc_part:
|
||||||
|
|
||||||
int skipstone_message_append_string(skipstone_message *message,
|
int skipstone_message_append_string(skipstone_message *message,
|
||||||
char *string, uint8_t size) {
|
char *string, uint8_t size) {
|
||||||
if (append_part(message, string, size, SKIPSTONE_MESSAGE_PART_STRING) < 0) {
|
struct part *part;
|
||||||
return -1;
|
uint8_t bodysz = sizeof(size) + size;
|
||||||
|
|
||||||
|
if ((part = malloc(sizeof(*part) + bodysz)) == NULL) {
|
||||||
|
goto error_malloc_part;
|
||||||
}
|
}
|
||||||
|
|
||||||
message->size += sizeof(size) + size;
|
part->size = bodysz;
|
||||||
|
|
||||||
|
memcpy(part + 1, &size, sizeof(size));
|
||||||
|
memcpy(((uint8_t *)(part + 1)) + sizeof(size), string, size);
|
||||||
|
|
||||||
|
if (skipstone_queue_add(message->parts, part) < 0) {
|
||||||
|
goto error_queue_add_part;
|
||||||
|
}
|
||||||
|
|
||||||
|
message->size += bodysz;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
error_queue_add_part:
|
||||||
|
free(part);
|
||||||
|
|
||||||
|
error_malloc_part:
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int skipstone_message_append_uint8(skipstone_message *message, uint8_t value) {
|
int skipstone_message_append_uint8(skipstone_message *message, uint8_t value) {
|
||||||
if (append_part(message, &value, sizeof(value), SKIPSTONE_MESSAGE_PART_UINT8) < 0) {
|
if (append_part(message, &value, sizeof(value)) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,7 +112,7 @@ int skipstone_message_append_uint8(skipstone_message *message, uint8_t value) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int skipstone_message_append_uint16(skipstone_message *message, uint16_t value) {
|
int skipstone_message_append_uint16(skipstone_message *message, uint16_t value) {
|
||||||
if (append_part(message, &value, sizeof(value), SKIPSTONE_MESSAGE_PART_UINT16) < 0) {
|
if (append_part(message, &value, sizeof(value)) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,34 +127,14 @@ int skipstone_message_pack(skipstone_message *message,
|
||||||
|
|
||||||
struct part *part;
|
struct part *part;
|
||||||
|
|
||||||
|
if (message->size > SKIPSTONE_MESSAGE_MAX_PAYLOAD) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
while (skipstone_queue_remove(message->parts, (void **)&part)) {
|
while (skipstone_queue_remove(message->parts, (void **)&part)) {
|
||||||
switch (part->type) {
|
memcpy(((uint8_t *)buf) + offset, part + 1, part->size);
|
||||||
case SKIPSTONE_MESSAGE_PART_STRING: {
|
|
||||||
((uint8_t *)buf)[offset] = part->size;
|
|
||||||
|
|
||||||
memcpy((uint8_t *)buf + offset + sizeof(uint8_t), part + 1, part->size);
|
offset += part->size;
|
||||||
|
|
||||||
offset += sizeof(uint8_t) + part->size;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case SKIPSTONE_MESSAGE_PART_UINT8: {
|
|
||||||
((uint8_t *)buf)[offset] = ((uint8_t *)(part + 1))[0];
|
|
||||||
|
|
||||||
offset += sizeof(uint8_t);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case SKIPSTONE_MESSAGE_PART_UINT16: {
|
|
||||||
((uint16_t *)((uint8_t *)buf + offset))[0] = ((uint16_t *)(part + 1))[0];
|
|
||||||
|
|
||||||
offset += sizeof(uint16_t);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*size = offset;
|
*size = offset;
|
||||||
|
|
|
@ -6,15 +6,7 @@
|
||||||
#include <skipstone/queue.h>
|
#include <skipstone/queue.h>
|
||||||
#include <skipstone/message.h>
|
#include <skipstone/message.h>
|
||||||
|
|
||||||
enum part_type {
|
|
||||||
SKIPSTONE_MESSAGE_PART_STRING,
|
|
||||||
SKIPSTONE_MESSAGE_PART_UINT8,
|
|
||||||
SKIPSTONE_MESSAGE_PART_UINT16
|
|
||||||
};
|
|
||||||
|
|
||||||
struct part {
|
struct part {
|
||||||
enum part_type type;
|
|
||||||
enum skipstone_message_endianness endianness;
|
|
||||||
uint8_t size;
|
uint8_t size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -56,17 +48,14 @@ error_malloc_message:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int append_part(skipstone_message *message,
|
static int append_part(skipstone_message *message, void *buf, uint8_t size) {
|
||||||
void *buf, uint8_t size, enum part_type type) {
|
|
||||||
struct part *part;
|
struct part *part;
|
||||||
|
|
||||||
if ((part = malloc(sizeof(*part) + size)) == NULL) {
|
if ((part = malloc(sizeof(*part) + size)) == NULL) {
|
||||||
goto error_malloc_part;
|
goto error_malloc_part;
|
||||||
}
|
}
|
||||||
|
|
||||||
part->type = type;
|
part->size = size;
|
||||||
part->endianness = SKIPSTONE_MESSAGE_ENDIAN_LITTLE;
|
|
||||||
part->size = size;
|
|
||||||
|
|
||||||
memcpy(part + 1, buf, size);
|
memcpy(part + 1, buf, size);
|
||||||
|
|
||||||
|
@ -85,17 +74,35 @@ error_malloc_part:
|
||||||
|
|
||||||
int skipstone_message_append_string(skipstone_message *message,
|
int skipstone_message_append_string(skipstone_message *message,
|
||||||
char *string, uint8_t size) {
|
char *string, uint8_t size) {
|
||||||
if (append_part(message, string, size, SKIPSTONE_MESSAGE_PART_STRING) < 0) {
|
struct part *part;
|
||||||
return -1;
|
uint8_t bodysz = sizeof(size) + size;
|
||||||
|
|
||||||
|
if ((part = malloc(sizeof(*part) + bodysz)) == NULL) {
|
||||||
|
goto error_malloc_part;
|
||||||
}
|
}
|
||||||
|
|
||||||
message->size += sizeof(size) + size;
|
part->size = bodysz;
|
||||||
|
|
||||||
|
memcpy(part + 1, &size, sizeof(size));
|
||||||
|
memcpy(((uint8_t *)(part + 1)) + sizeof(size), string, size);
|
||||||
|
|
||||||
|
if (skipstone_queue_add(message->parts, part) < 0) {
|
||||||
|
goto error_queue_add_part;
|
||||||
|
}
|
||||||
|
|
||||||
|
message->size += bodysz;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
error_queue_add_part:
|
||||||
|
free(part);
|
||||||
|
|
||||||
|
error_malloc_part:
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int skipstone_message_append_uint8(skipstone_message *message, uint8_t value) {
|
int skipstone_message_append_uint8(skipstone_message *message, uint8_t value) {
|
||||||
if (append_part(message, &value, sizeof(value), SKIPSTONE_MESSAGE_PART_UINT8) < 0) {
|
if (append_part(message, &value, sizeof(value)) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,7 +112,7 @@ int skipstone_message_append_uint8(skipstone_message *message, uint8_t value) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int skipstone_message_append_uint16(skipstone_message *message, uint16_t value) {
|
int skipstone_message_append_uint16(skipstone_message *message, uint16_t value) {
|
||||||
if (append_part(message, &value, sizeof(value), SKIPSTONE_MESSAGE_PART_UINT16) < 0) {
|
if (append_part(message, &value, sizeof(value)) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,34 +127,14 @@ int skipstone_message_pack(skipstone_message *message,
|
||||||
|
|
||||||
struct part *part;
|
struct part *part;
|
||||||
|
|
||||||
|
if (message->size > SKIPSTONE_MESSAGE_MAX_PAYLOAD) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
while (skipstone_queue_remove(message->parts, (void **)&part)) {
|
while (skipstone_queue_remove(message->parts, (void **)&part)) {
|
||||||
switch (part->type) {
|
memcpy(((uint8_t *)buf) + offset, part + 1, part->size);
|
||||||
case SKIPSTONE_MESSAGE_PART_STRING: {
|
|
||||||
((uint8_t *)buf)[offset] = part->size;
|
|
||||||
|
|
||||||
memcpy((uint8_t *)buf + offset + sizeof(uint8_t), part + 1, part->size);
|
offset += part->size;
|
||||||
|
|
||||||
offset += sizeof(uint8_t) + part->size;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case SKIPSTONE_MESSAGE_PART_UINT8: {
|
|
||||||
((uint8_t *)buf)[offset] = ((uint8_t *)(part + 1))[0];
|
|
||||||
|
|
||||||
offset += sizeof(uint8_t);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case SKIPSTONE_MESSAGE_PART_UINT16: {
|
|
||||||
((uint16_t *)((uint8_t *)buf + offset))[0] = ((uint16_t *)(part + 1))[0];
|
|
||||||
|
|
||||||
offset += sizeof(uint16_t);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*size = offset;
|
*size = offset;
|
||||||
|
|
Loading…
Add table
Reference in a new issue