eeeeey...it works and it's gross :(
This commit is contained in:
parent
f16908e7fb
commit
7ba0ec5e07
7 changed files with 382 additions and 35 deletions
|
@ -25,24 +25,19 @@ static int answer_phone_version_message(skipstone_message_service *service,
|
||||||
|
|
||||||
static int answer_media_message(skipstone_message_service *service,
|
static int answer_media_message(skipstone_message_service *service,
|
||||||
void *buf, uint16_t size, uint16_t id, void *context) {
|
void *buf, uint16_t size, uint16_t id, void *context) {
|
||||||
struct {
|
skipstone_message *message = skipstone_message_new(32);
|
||||||
uint8_t command;
|
|
||||||
uint8_t artist_len;
|
|
||||||
char artist[5];
|
|
||||||
uint8_t album_len;
|
|
||||||
char album[5];
|
|
||||||
uint8_t title_len;
|
|
||||||
char title[5];
|
|
||||||
} play_track = {
|
|
||||||
0x10,
|
|
||||||
5, { 'K', 'M', 'F', 'D', 'M' },
|
|
||||||
5, { 'N', 'i', 'h', 'i', 'l' },
|
|
||||||
5, { 'U', 'l', 't', 'r', 'a' }
|
|
||||||
};
|
|
||||||
|
|
||||||
printf("Got message on endpoint %hu\n", id);
|
uint8_t out[4096];
|
||||||
|
uint16_t outsz;
|
||||||
|
|
||||||
skipstone_message_service_queue(service, &play_track, sizeof(play_track), 32);
|
skipstone_message_append_uint8(message, 0x10);
|
||||||
|
skipstone_message_append_string(message, "KMFDM", 5);
|
||||||
|
skipstone_message_append_string(message, "Nihil", 5);
|
||||||
|
skipstone_message_append_string(message, "Ultra", 5);
|
||||||
|
|
||||||
|
skipstone_message_pack(message, &out, &outsz);
|
||||||
|
|
||||||
|
skipstone_message_service_queue(service, &out, outsz, 32);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,24 +25,19 @@ static int answer_phone_version_message(skipstone_message_service *service,
|
||||||
|
|
||||||
static int answer_media_message(skipstone_message_service *service,
|
static int answer_media_message(skipstone_message_service *service,
|
||||||
void *buf, uint16_t size, uint16_t id, void *context) {
|
void *buf, uint16_t size, uint16_t id, void *context) {
|
||||||
struct {
|
skipstone_message *message = skipstone_message_new(32);
|
||||||
uint8_t command;
|
|
||||||
uint8_t artist_len;
|
|
||||||
char artist[5];
|
|
||||||
uint8_t album_len;
|
|
||||||
char album[5];
|
|
||||||
uint8_t title_len;
|
|
||||||
char title[5];
|
|
||||||
} play_track = {
|
|
||||||
0x10,
|
|
||||||
5, { 'K', 'M', 'F', 'D', 'M' },
|
|
||||||
5, { 'N', 'i', 'h', 'i', 'l' },
|
|
||||||
5, { 'U', 'l', 't', 'r', 'a' }
|
|
||||||
};
|
|
||||||
|
|
||||||
printf("Got message on endpoint %hu\n", id);
|
uint8_t out[4096];
|
||||||
|
uint16_t outsz;
|
||||||
|
|
||||||
skipstone_message_service_queue(service, &play_track, sizeof(play_track), 32);
|
skipstone_message_append_uint8(message, 0x10);
|
||||||
|
skipstone_message_append_string(message, "KMFDM", 5);
|
||||||
|
skipstone_message_append_string(message, "Nihil", 5);
|
||||||
|
skipstone_message_append_string(message, "Ultra", 5);
|
||||||
|
|
||||||
|
skipstone_message_pack(message, &out, &outsz);
|
||||||
|
|
||||||
|
skipstone_message_service_queue(service, &out, outsz, 32);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,11 @@ enum {
|
||||||
SKIPSTONE_MESSAGE_ENDPOINT_PHONE_CONTROL = 33
|
SKIPSTONE_MESSAGE_ENDPOINT_PHONE_CONTROL = 33
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum skipstone_message_endianness {
|
||||||
|
SKIPSTONE_MESSAGE_ENDIAN_LITTLE,
|
||||||
|
SKIPSTONE_MESSAGE_ENDIAN_BIG
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct _skipstone_message_header {
|
typedef struct _skipstone_message_header {
|
||||||
uint16_t size,
|
uint16_t size,
|
||||||
id;
|
id;
|
||||||
|
@ -26,8 +31,24 @@ typedef struct _skipstone_message_header {
|
||||||
|
|
||||||
typedef struct _skipstone_message_service skipstone_message_service;
|
typedef struct _skipstone_message_service skipstone_message_service;
|
||||||
|
|
||||||
|
typedef struct _skipstone_message skipstone_message;
|
||||||
|
|
||||||
typedef int (skipstone_message_handler)(skipstone_message_service *service,
|
typedef int (skipstone_message_handler)(skipstone_message_service *service,
|
||||||
void *buf, uint16_t size, uint16_t id, void *context);
|
void *buf, uint16_t size, uint16_t id, void *context);
|
||||||
|
|
||||||
|
skipstone_message *skipstone_message_new(uint16_t id);
|
||||||
|
|
||||||
|
int skipstone_message_append_string(skipstone_message *message,
|
||||||
|
char *string, uint8_t size);
|
||||||
|
|
||||||
|
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_pack(skipstone_message *message,
|
||||||
|
void *buf, uint16_t *size);
|
||||||
|
|
||||||
skipstone_message_service *skipstone_message_service_new();
|
skipstone_message_service *skipstone_message_service_new();
|
||||||
|
|
||||||
|
|
|
@ -134,6 +134,12 @@ error_toobig:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int skipstone_link_send_message(skipstone_link *link, skipstone_message *message, uint16_t id) {
|
||||||
|
skipstone_message_header header;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int skipstone_link_recv(skipstone_link *link, void *buf, uint16_t *size, uint16_t *id) {
|
int skipstone_link_recv(skipstone_link *link, void *buf, uint16_t *size, uint16_t *id) {
|
||||||
skipstone_message_header header;
|
skipstone_message_header header;
|
||||||
|
|
||||||
|
|
|
@ -134,6 +134,12 @@ error_toobig:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int skipstone_link_send_message(skipstone_link *link, skipstone_message *message, uint16_t id) {
|
||||||
|
skipstone_message_header header;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int skipstone_link_recv(skipstone_link *link, void *buf, uint16_t *size, uint16_t *id) {
|
int skipstone_link_recv(skipstone_link *link, void *buf, uint16_t *size, uint16_t *id) {
|
||||||
skipstone_message_header header;
|
skipstone_message_header header;
|
||||||
|
|
||||||
|
|
164
src/message.c
164
src/message.c
|
@ -6,10 +6,27 @@
|
||||||
#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 {
|
||||||
|
enum part_type type;
|
||||||
|
enum skipstone_message_endianness endianness;
|
||||||
|
uint16_t size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _skipstone_message {
|
||||||
|
uint16_t size, id;
|
||||||
|
skipstone_queue *parts;
|
||||||
|
};
|
||||||
|
|
||||||
struct endpoint {
|
struct endpoint {
|
||||||
uint16_t id;
|
|
||||||
skipstone_message_handler *handler;
|
skipstone_message_handler *handler;
|
||||||
void *context;
|
void *context;
|
||||||
|
uint16_t id;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _skipstone_message_service {
|
struct _skipstone_message_service {
|
||||||
|
@ -17,6 +34,151 @@ struct _skipstone_message_service {
|
||||||
skipstone_queue *pending;
|
skipstone_queue *pending;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
skipstone_message *skipstone_message_new(uint16_t id) {
|
||||||
|
skipstone_message *message;
|
||||||
|
|
||||||
|
if ((message = malloc(sizeof(*message))) == NULL) {
|
||||||
|
goto error_malloc_message;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((message->parts = skipstone_queue_new()) == NULL) {
|
||||||
|
goto error_queue_new_parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
message->size = 0;
|
||||||
|
message->id = id;
|
||||||
|
|
||||||
|
return message;
|
||||||
|
|
||||||
|
error_queue_new_parts:
|
||||||
|
free(message);
|
||||||
|
|
||||||
|
error_malloc_message:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int skipstone_message_append_string(skipstone_message *message,
|
||||||
|
char *string, uint8_t size) {
|
||||||
|
struct part *part;
|
||||||
|
|
||||||
|
if ((part = malloc(sizeof(*part) + size)) == NULL) {
|
||||||
|
goto error_malloc_part;
|
||||||
|
}
|
||||||
|
|
||||||
|
part->type = SKIPSTONE_MESSAGE_PART_STRING;
|
||||||
|
part->endianness = SKIPSTONE_MESSAGE_ENDIAN_LITTLE;
|
||||||
|
part->size = size;
|
||||||
|
|
||||||
|
memcpy(part + 1, string, size);
|
||||||
|
|
||||||
|
if (skipstone_queue_add(message->parts, part) < 0) {
|
||||||
|
goto error_queue_add_parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error_queue_add_parts:
|
||||||
|
free(part);
|
||||||
|
|
||||||
|
error_malloc_part:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int skipstone_message_append_uint8(skipstone_message *message,
|
||||||
|
uint8_t value) {
|
||||||
|
struct part *part;
|
||||||
|
|
||||||
|
if ((part = malloc(sizeof(*part) + sizeof(uint8_t))) == NULL) {
|
||||||
|
goto error_malloc_part;
|
||||||
|
}
|
||||||
|
|
||||||
|
part->type = SKIPSTONE_MESSAGE_PART_UINT8;
|
||||||
|
part->endianness = SKIPSTONE_MESSAGE_ENDIAN_LITTLE;
|
||||||
|
part->size = sizeof(uint8_t);
|
||||||
|
|
||||||
|
((uint8_t *)(part + 1))[0] = value;
|
||||||
|
|
||||||
|
if (skipstone_queue_add(message->parts, part) < 0) {
|
||||||
|
goto error_queue_add_parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error_queue_add_parts:
|
||||||
|
free(part);
|
||||||
|
|
||||||
|
error_malloc_part:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int skipstone_message_append_uint16(skipstone_message *message,
|
||||||
|
uint16_t value) {
|
||||||
|
struct part *part;
|
||||||
|
|
||||||
|
if ((part = malloc(sizeof(*part) + sizeof(uint16_t))) == NULL) {
|
||||||
|
goto error_malloc_part;
|
||||||
|
}
|
||||||
|
|
||||||
|
part->type = SKIPSTONE_MESSAGE_PART_UINT16;
|
||||||
|
part->endianness = SKIPSTONE_MESSAGE_ENDIAN_LITTLE;
|
||||||
|
part->size = sizeof(uint16_t);
|
||||||
|
|
||||||
|
((uint16_t *)(part + 1))[0] = value;
|
||||||
|
|
||||||
|
if (skipstone_queue_add(message->parts, part) < 0) {
|
||||||
|
goto error_queue_add_parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error_queue_add_parts:
|
||||||
|
free(part);
|
||||||
|
|
||||||
|
error_malloc_part:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int skipstone_message_pack(skipstone_message *message,
|
||||||
|
void *buf, uint16_t *size) {
|
||||||
|
size_t offset = 0;
|
||||||
|
|
||||||
|
struct part *part;
|
||||||
|
|
||||||
|
while (skipstone_queue_remove(message->parts, (void **)&part)) {
|
||||||
|
switch (part->type) {
|
||||||
|
case SKIPSTONE_MESSAGE_PART_STRING: {
|
||||||
|
((uint8_t *)buf)[offset] = part->size;
|
||||||
|
|
||||||
|
memcpy((uint8_t *)buf + offset + sizeof(uint8_t), part + 1, 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;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
skipstone_message_service *skipstone_message_service_new() {
|
skipstone_message_service *skipstone_message_service_new() {
|
||||||
skipstone_message_service *service;
|
skipstone_message_service *service;
|
||||||
|
|
||||||
|
|
164
src/message.c-e
164
src/message.c-e
|
@ -6,10 +6,27 @@
|
||||||
#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 {
|
||||||
|
enum part_type type;
|
||||||
|
enum skipstone_message_endianness endianness;
|
||||||
|
uint16_t size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _skipstone_message {
|
||||||
|
uint16_t size, id;
|
||||||
|
skipstone_queue *parts;
|
||||||
|
};
|
||||||
|
|
||||||
struct endpoint {
|
struct endpoint {
|
||||||
uint16_t id;
|
|
||||||
skipstone_message_handler *handler;
|
skipstone_message_handler *handler;
|
||||||
void *context;
|
void *context;
|
||||||
|
uint16_t id;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _skipstone_message_service {
|
struct _skipstone_message_service {
|
||||||
|
@ -17,6 +34,151 @@ struct _skipstone_message_service {
|
||||||
skipstone_queue *pending;
|
skipstone_queue *pending;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
skipstone_message *skipstone_message_new(uint16_t id) {
|
||||||
|
skipstone_message *message;
|
||||||
|
|
||||||
|
if ((message = malloc(sizeof(*message))) == NULL) {
|
||||||
|
goto error_malloc_message;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((message->parts = skipstone_queue_new()) == NULL) {
|
||||||
|
goto error_queue_new_parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
message->size = 0;
|
||||||
|
message->id = id;
|
||||||
|
|
||||||
|
return message;
|
||||||
|
|
||||||
|
error_queue_new_parts:
|
||||||
|
free(message);
|
||||||
|
|
||||||
|
error_malloc_message:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int skipstone_message_append_string(skipstone_message *message,
|
||||||
|
char *string, uint8_t size) {
|
||||||
|
struct part *part;
|
||||||
|
|
||||||
|
if ((part = malloc(sizeof(*part) + size)) == NULL) {
|
||||||
|
goto error_malloc_part;
|
||||||
|
}
|
||||||
|
|
||||||
|
part->type = SKIPSTONE_MESSAGE_PART_STRING;
|
||||||
|
part->endianness = SKIPSTONE_MESSAGE_ENDIAN_LITTLE;
|
||||||
|
part->size = size;
|
||||||
|
|
||||||
|
memcpy(part + 1, string, size);
|
||||||
|
|
||||||
|
if (skipstone_queue_add(message->parts, part) < 0) {
|
||||||
|
goto error_queue_add_parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error_queue_add_parts:
|
||||||
|
free(part);
|
||||||
|
|
||||||
|
error_malloc_part:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int skipstone_message_append_uint8(skipstone_message *message,
|
||||||
|
uint8_t value) {
|
||||||
|
struct part *part;
|
||||||
|
|
||||||
|
if ((part = malloc(sizeof(*part) + sizeof(uint8_t))) == NULL) {
|
||||||
|
goto error_malloc_part;
|
||||||
|
}
|
||||||
|
|
||||||
|
part->type = SKIPSTONE_MESSAGE_PART_UINT8;
|
||||||
|
part->endianness = SKIPSTONE_MESSAGE_ENDIAN_LITTLE;
|
||||||
|
part->size = sizeof(uint8_t);
|
||||||
|
|
||||||
|
((uint8_t *)(part + 1))[0] = value;
|
||||||
|
|
||||||
|
if (skipstone_queue_add(message->parts, part) < 0) {
|
||||||
|
goto error_queue_add_parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error_queue_add_parts:
|
||||||
|
free(part);
|
||||||
|
|
||||||
|
error_malloc_part:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int skipstone_message_append_uint16(skipstone_message *message,
|
||||||
|
uint16_t value) {
|
||||||
|
struct part *part;
|
||||||
|
|
||||||
|
if ((part = malloc(sizeof(*part) + sizeof(uint16_t))) == NULL) {
|
||||||
|
goto error_malloc_part;
|
||||||
|
}
|
||||||
|
|
||||||
|
part->type = SKIPSTONE_MESSAGE_PART_UINT16;
|
||||||
|
part->endianness = SKIPSTONE_MESSAGE_ENDIAN_LITTLE;
|
||||||
|
part->size = sizeof(uint16_t);
|
||||||
|
|
||||||
|
((uint16_t *)(part + 1))[0] = value;
|
||||||
|
|
||||||
|
if (skipstone_queue_add(message->parts, part) < 0) {
|
||||||
|
goto error_queue_add_parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error_queue_add_parts:
|
||||||
|
free(part);
|
||||||
|
|
||||||
|
error_malloc_part:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int skipstone_message_pack(skipstone_message *message,
|
||||||
|
void *buf, uint16_t *size) {
|
||||||
|
size_t offset = 0;
|
||||||
|
|
||||||
|
struct part *part;
|
||||||
|
|
||||||
|
while (skipstone_queue_remove(message->parts, (void **)&part)) {
|
||||||
|
switch (part->type) {
|
||||||
|
case SKIPSTONE_MESSAGE_PART_STRING: {
|
||||||
|
((uint8_t *)buf)[offset] = part->size;
|
||||||
|
|
||||||
|
memcpy((uint8_t *)buf + offset + sizeof(uint8_t), part + 1, 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;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
skipstone_message_service *skipstone_message_service_new() {
|
skipstone_message_service *skipstone_message_service_new() {
|
||||||
skipstone_message_service *service;
|
skipstone_message_service *service;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue