diff options
author | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-09-23 12:00:32 +0200 |
---|---|---|
committer | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-09-23 12:00:32 +0200 |
commit | dbf9f3c110994ecc9dc595f19372e0c0257280f2 (patch) | |
tree | c92738637a8f56f6c6622ce8f42363e811b5ca5e /src/messages.c | |
parent | a53405c6808b6a30339e5f4974e374006d727f05 (diff) | |
download | cmumble-dbf9f3c110994ecc9dc595f19372e0c0257280f2.tar.gz cmumble-dbf9f3c110994ecc9dc595f19372e0c0257280f2.tar.bz2 cmumble-dbf9f3c110994ecc9dc595f19372e0c0257280f2.zip |
Rename messages.[ch] to message.[ch]
Diffstat (limited to 'src/messages.c')
-rw-r--r-- | src/messages.c | 148 |
1 files changed, 0 insertions, 148 deletions
diff --git a/src/messages.c b/src/messages.c deleted file mode 100644 index bbc08f2..0000000 --- a/src/messages.c +++ /dev/null @@ -1,148 +0,0 @@ -#include "messages.h" -#include "cmumble.h" - -#define PREAMBLE_SIZE 6 - -GStaticMutex write_mutex = G_STATIC_MUTEX_INIT; - -static const struct { - const ProtobufCMessageDescriptor *descriptor; - const char *name; -} messages[] = { -#define MUMBLE_MSG(a,b) { &mumble_proto__##b##__descriptor, #a }, - MUMBLE_MSGS -#undef MUMBLE_MSG -}; - -static void -add_preamble(uint8_t *buffer, uint16_t type, uint32_t len) -{ - buffer[1] = (type) & 0xff; - buffer[0] = (type >> 8) & 0xff; - - buffer[5] = (len) & 0xff; - buffer[4] = (len >> 8) & 0xff; - buffer[3] = (len >> 16) & 0xff; - buffer[2] = (len >> 24) & 0xff; -} - -static void -get_preamble(uint8_t *buffer, int *type, int *len) -{ - uint16_t msgType; - uint32_t msgLen; - - msgType = buffer[1] | (buffer[0] << 8); - msgLen = buffer[5] | (buffer[4] << 8) | (buffer[3] << 16) | (buffer[2] << 24); - *type = (int)msgType; - *len = (int)msgLen; -} - -void -cmumble_send_msg(struct context *ctx, ProtobufCMessage *msg) -{ - uint8_t pad[128]; - uint8_t preamble[PREAMBLE_SIZE]; - int type = -1; - int i; - ProtobufCBufferSimple buffer = PROTOBUF_C_BUFFER_SIMPLE_INIT(pad); - - for (i = 0; i < G_N_ELEMENTS(messages); ++i) - if (messages[i].descriptor == msg->descriptor) - type = i; - assert(type >= 0); - - if (type == UDPTunnel) { - MumbleProto__UDPTunnel *tunnel = (MumbleProto__UDPTunnel *) msg; - buffer.data = tunnel->packet.data; - buffer.len = tunnel->packet.len; - buffer.must_free_data = 0; - } else { - protobuf_c_message_pack_to_buffer(msg, &buffer.base); - } - - add_preamble(preamble, type, buffer.len); - - g_static_mutex_lock(&write_mutex); - g_output_stream_write(ctx->con.output, preamble, PREAMBLE_SIZE, NULL, NULL); - g_output_stream_write(ctx->con.output, buffer.data, buffer.len, NULL, NULL); - g_static_mutex_unlock(&write_mutex); - - PROTOBUF_C_BUFFER_SIMPLE_CLEAR(&buffer); -} - -int -cmumble_recv_msg(struct context *ctx) -{ - uint8_t preamble[PREAMBLE_SIZE]; - ProtobufCMessage *msg; - gchar *data; - int type, len; - gssize ret; - GError *error = NULL; - - g_assert(ctx->callbacks); - - ret = g_pollable_input_stream_read_nonblocking(ctx->con.input, - preamble, PREAMBLE_SIZE, - NULL, &error); - - if (ret <= 0) { - if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) - return 0; - g_printerr("read failed: %ld\n", ret); - return 0; - } - - get_preamble(preamble, &type, &len); - - if (!(type >= 0 && type < G_N_ELEMENTS(messages))) { - printf("unknown message type: %d\n", type); - return 0; - } - - if (len <= 0) { - g_printerr("length 0\n"); - return 0; - } - - data = g_malloc(len); - if (data == NULL) { - g_printerr("out of mem\n"); - g_main_loop_quit (ctx->loop); - } - ret = g_input_stream_read(G_INPUT_STREAM(ctx->con.input), - data, len, NULL, NULL); - - /* tunneled udp data - not a regular protobuf message - * create dummy ProtobufCMessage */ - if (type == UDPTunnel) { - MumbleProto__UDPTunnel udptunnel; - mumble_proto__udptunnel__init(&udptunnel); - - udptunnel.packet.len = len; - udptunnel.packet.data = (uint8_t *) data; - - if (ctx->callbacks[UDPTunnel]) - ctx->callbacks[UDPTunnel](&udptunnel.base, ctx); - - g_free(data); - return 0; - } - - msg = protobuf_c_message_unpack(messages[type].descriptor, NULL, - len, (uint8_t *) data); - if (msg == NULL) { - g_printerr("message unpack failure\n"); - return 0; - } - - g_print("debug: received message: %s type:%d, len:%d\n", messages[type].name, type, len); - if (ctx->callbacks[type]) - ctx->callbacks[type](msg, ctx); - - protobuf_c_message_free_unpacked(msg, NULL); - g_free(data); - - return 1; -} |