-/* Copyright (C) 2010, Martin Johansson <martin@fatbob.nu>
+/* Copyright (C) 2009-2010, Martin Johansson <martin@fatbob.nu>
Copyright (C) 2005-2010, Thorvald Natvig <thorvald@natvig.com>
All rights reserved.
#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);
*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) {
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. */
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;
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) {
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)
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);
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);
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);
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;
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);
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);