X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Fmessages.c;h=e40ae8f3b119f1dbadf88d7dc2122f818361fcd9;hb=ccdcbaf61751aa59a4afb6828c513bedf11dcd37;hp=f7526c11e82b1dc324e8a0ee013cde0f2c94b374;hpb=5e3eca4e7c1a3ece4f7a6f94bc4a5f7295cd39ac;p=umurmur.git diff --git a/src/messages.c b/src/messages.c index f7526c1..e40ae8f 100644 --- a/src/messages.c +++ b/src/messages.c @@ -1,5 +1,5 @@ -/* Copyright (C) 2009, Martin Johansson - Copyright (C) 2005-2009, Thorvald Natvig +/* Copyright (C) 2009-2010, Martin Johansson + Copyright (C) 2005-2010, Thorvald Natvig All rights reserved. @@ -39,33 +39,41 @@ #include "pds.h" #include "log.h" +#define PREAMBLE_SIZE 6 void dumpmsg(uint8_t *data, int size); static message_t *Msg_create_nopayload(messageType_t messageType); void Msg_addPreamble(uint8_t *buffer, uint16_t type, uint32_t len) { - uint16_t *msgType = (uint16_t *) &buffer[0]; - uint32_t *msgLen = (uint32_t *) &buffer[2]; + type = htons(type); + len = htonl(len); - *msgType = htons(type); - *msgLen = htonl(len); + buffer[0] = (type) & 0xff; + buffer[1] = (type >> 8) & 0xff; + + buffer[2] = (len) & 0xff; + buffer[3] = (len >> 8) & 0xff; + buffer[4] = (len >> 16) & 0xff; + buffer[5] = (len >> 24) & 0xff; } static void Msg_getPreamble(uint8_t *buffer, int *type, int *len) { - uint16_t *msgType = (uint16_t *) &buffer[0]; - uint32_t *msgLen = (uint32_t *) &buffer[2]; + uint16_t msgType; + uint32_t msgLen; - *type = (int)ntohs(*msgType); - *len = (int)ntohl(*msgLen); + msgType = buffer[0] | (buffer[1] << 8); + msgLen = buffer[2] | (buffer[3] << 8) | (buffer[4] << 16) | (buffer[5] << 24); + *type = (int)ntohs(msgType); + *len = (int)ntohl(msgLen); } -#define MAX_MSGSIZE (BUFSIZE - 6) +#define MAX_MSGSIZE (BUFSIZE - PREAMBLE_SIZE) int Msg_messageToNetwork(message_t *msg, uint8_t *buffer) { int len; - uint8_t *bufptr = buffer + 6; + uint8_t *bufptr = buffer + PREAMBLE_SIZE; Log_debug("To net: msg type %d", msg->messageType); switch (msg->messageType) { @@ -76,8 +84,6 @@ int Msg_messageToNetwork(message_t *msg, uint8_t *buffer) break; } Msg_addPreamble(buffer, msg->messageType, len); - Log_debug("To net: Version->release: %s Version->os: %s", - msg->payload.version->release, msg->payload.version->os); mumble_proto__version__pack(msg->payload.version, bufptr); break; case UDPTunnel: /* Non-standard handling of tunneled voice traffic. */ @@ -85,6 +91,7 @@ int Msg_messageToNetwork(message_t *msg, uint8_t *buffer) Log_warn("Too big tx message. Discarding"); break; } + len = msg->payload.UDPTunnel->packet.len; Msg_addPreamble(buffer, msg->messageType, msg->payload.UDPTunnel->packet.len); memcpy(bufptr, msg->payload.UDPTunnel->packet.data, msg->payload.UDPTunnel->packet.len); break; @@ -169,6 +176,15 @@ int Msg_messageToNetwork(message_t *msg, uint8_t *buffer) Msg_addPreamble(buffer, msg->messageType, len); mumble_proto__user_state__pack(msg->payload.userState, bufptr); break; + case UserRemove: + len = mumble_proto__user_remove__get_packed_size(msg->payload.userRemove); + if (len > MAX_MSGSIZE) { + Log_warn("Too big tx message. Discarding"); + break; + } + Msg_addPreamble(buffer, msg->messageType, len); + mumble_proto__user_remove__pack(msg->payload.userRemove, bufptr); + break; case ChannelState: len = mumble_proto__channel_state__get_packed_size(msg->payload.channelState); if (len > MAX_MSGSIZE) { @@ -205,12 +221,21 @@ int Msg_messageToNetwork(message_t *msg, uint8_t *buffer) Msg_addPreamble(buffer, msg->messageType, len); mumble_proto__permission_query__pack(msg->payload.permissionQuery, bufptr); break; + case ChannelRemove: + len = mumble_proto__channel_remove__get_packed_size(msg->payload.channelRemove); + if (len > MAX_MSGSIZE) { + Log_warn("Too big tx message. Discarding"); + break; + } + Msg_addPreamble(buffer, msg->messageType, len); + mumble_proto__channel_remove__pack(msg->payload.channelRemove, bufptr); + break; default: - Log_warn("Unsupported message %d", msg->messageType); + Log_warn("Msg_networkToMessage: Unsupported message %d", msg->messageType); return 0; } - return len + 6; + return len + PREAMBLE_SIZE; } message_t *Msg_create_nopayload(messageType_t messageType) @@ -275,6 +300,10 @@ message_t *Msg_create(messageType_t messageType) msg->payload.userState = malloc(sizeof(MumbleProto__UserState)); mumble_proto__user_state__init(msg->payload.userState); break; + case ChannelState: + msg->payload.channelState = malloc(sizeof(MumbleProto__ChannelState)); + mumble_proto__channel_state__init(msg->payload.channelState); + break; case UserRemove: msg->payload.userRemove = malloc(sizeof(MumbleProto__UserRemove)); mumble_proto__user_remove__init(msg->payload.userRemove); @@ -287,14 +316,14 @@ message_t *Msg_create(messageType_t messageType) msg->payload.codecVersion = malloc(sizeof(MumbleProto__CodecVersion)); mumble_proto__codec_version__init(msg->payload.codecVersion); break; - case ChannelState: - msg->payload.channelState = malloc(sizeof(MumbleProto__ChannelState)); - mumble_proto__channel_state__init(msg->payload.channelState); - break; case PermissionQuery: msg->payload.permissionQuery = malloc(sizeof(MumbleProto__PermissionQuery)); mumble_proto__permission_query__init(msg->payload.permissionQuery); break; + case ChannelRemove: + msg->payload.channelRemove = malloc(sizeof(MumbleProto__ChannelRemove)); + mumble_proto__channel_remove__init(msg->payload.channelRemove); + break; default: Log_warn("Msg_create: Unsupported message %d", msg->messageType); @@ -403,6 +432,15 @@ void Msg_free(message_t *msg) free(msg->payload.userState); } break; + case ChannelState: + if (msg->unpacked) + mumble_proto__channel_state__free_unpacked(msg->payload.channelState, NULL); + else { + free(msg->payload.channelState->name); + free(msg->payload.channelState->description); + free(msg->payload.channelState); + } + break; case UserRemove: if (msg->unpacked) mumble_proto__user_remove__free_unpacked(msg->payload.userRemove, NULL); @@ -424,21 +462,18 @@ void Msg_free(message_t *msg) free(msg->payload.codecVersion); } break; - case ChannelState: + case PermissionQuery: if (msg->unpacked) - mumble_proto__channel_state__free_unpacked(msg->payload.channelState, NULL); + mumble_proto__permission_query__free_unpacked(msg->payload.permissionQuery, NULL); else { - if (msg->payload.channelState->description) - free(msg->payload.channelState->description); - free(msg->payload.channelState->name); - free(msg->payload.channelState); + free(msg->payload.permissionQuery); } break; - case PermissionQuery: + case ChannelRemove: if (msg->unpacked) - mumble_proto__permission_query__free_unpacked(msg->payload.permissionQuery, NULL); + mumble_proto__channel_remove__free_unpacked(msg->payload.channelRemove, NULL); else { - free(msg->payload.permissionQuery); + free(msg->payload.channelRemove); } break; @@ -562,6 +597,13 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) msg->payload.userState = mumble_proto__user_state__unpack(NULL, msgLen, msgData); break; } + case ChannelState: + { + msg = Msg_create_nopayload(ChannelState); + msg->unpacked = true; + msg->payload.channelState = mumble_proto__channel_state__unpack(NULL, msgLen, msgData); + break; + } case VoiceTarget: { msg = Msg_create_nopayload(VoiceTarget); @@ -583,6 +625,13 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) msg->payload.permissionQuery = mumble_proto__permission_query__unpack(NULL, msgLen, msgData); break; } + case ChannelRemove: + { + msg = Msg_create_nopayload(ChannelRemove); + msg->unpacked = true; + msg->payload.channelRemove = mumble_proto__channel_remove__unpack(NULL, msgLen, msgData); + break; + } default: Log_warn("Unsupported message %d", messageType);