Fix TCP mode
[umurmur.git] / src / messages.c
index 3014f88ca34f19b882f1776b080cf891ec95803e..b7d245d32d21b704cf72c290d57b60819b31bcdd 100644 (file)
@@ -75,16 +75,17 @@ 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:
-               len = mumble_proto__udptunnel__get_packed_size(msg->payload.UDPTunnel);
-               if (len > MAX_MSGSIZE) {
+       case UDPTunnel: /* Non-standard handling of tunneled voice traffic. */
+               if (msg->payload.UDPTunnel->packet.len > MAX_MSGSIZE) {
                        Log_warn("Too big tx message. Discarding");
                        break;
                }
-               Msg_addPreamble(buffer, msg->messageType, len);
-               mumble_proto__udptunnel__pack(msg->payload.UDPTunnel, bufptr);          
+               Msg_addPreamble(buffer, msg->messageType, msg->payload.UDPTunnel->packet.len);
+               memcpy(bufptr, msg->payload.UDPTunnel->packet.data, msg->payload.UDPTunnel->packet.len);
                break;
        case Authenticate:
                len = mumble_proto__authenticate__get_packed_size(msg->payload.authenticate);
@@ -194,6 +195,15 @@ int Msg_messageToNetwork(message_t *msg, uint8_t *buffer)
                Msg_addPreamble(buffer, msg->messageType, len);
                mumble_proto__codec_version__pack(msg->payload.codecVersion, bufptr);
                break;
+       case PermissionQuery:
+               len = mumble_proto__permission_query__get_packed_size(msg->payload.permissionQuery);
+               if (len > MAX_MSGSIZE) {
+                       Log_warn("Too big tx message. Discarding");
+                       break;
+                       }
+               Msg_addPreamble(buffer, msg->messageType, len);
+               mumble_proto__permission_query__pack(msg->payload.permissionQuery, bufptr);
+               break;
 
        default:
                Log_warn("Unsupported message %d", msg->messageType);
@@ -274,6 +284,10 @@ message_t *Msg_create(messageType_t messageType)
                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;
 
        default:
                Log_warn("Msg_create: Unsupported message %d", msg->messageType);
@@ -294,12 +308,17 @@ void Msg_free(message_t *msg)
        if (msg->refcount > 0)
                return;
 
-       /* XXX - add free for locally generated messages too */
        switch (msg->messageType) {
        case Version:
                if (msg->unpacked)
                        mumble_proto__version__free_unpacked(msg->payload.version, NULL);
                else {
+                       if (msg->payload.version->release)
+                               free(msg->payload.version->release);
+                       if (msg->payload.version->os)
+                               free(msg->payload.version->os);
+                       if (msg->payload.version->os_version)
+                               free(msg->payload.version->os_version);
                        free(msg->payload.version);
                }
                break;
@@ -406,6 +425,13 @@ void Msg_free(message_t *msg)
                        free(msg->payload.channelState);
                }
                break;
+       case PermissionQuery:
+               if (msg->unpacked)
+                       mumble_proto__permission_query__free_unpacked(msg->payload.permissionQuery, NULL);
+               else {
+                       free(msg->payload.permissionQuery);
+               }
+               break;
 
        default:
                Log_warn("Msg_free: Unsupported message %d", msg->messageType);
@@ -450,11 +476,18 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg->payload.version = mumble_proto__version__unpack(NULL, msgLen, msgData);
                break;
        }
-       case UDPTunnel:
+       case UDPTunnel: /* Non-standard handling of tunneled voice data */
        {
                msg = Msg_create(UDPTunnel);
-               msg->unpacked = true;
-               msg->payload.UDPTunnel = mumble_proto__udptunnel__unpack(NULL, msgLen, msgData);
+               msg->unpacked = false;
+               msg->payload.UDPTunnel = malloc(sizeof(struct _MumbleProto__UDPTunnel));
+               if (msg->payload.UDPTunnel == NULL)
+                       Log_fatal("Out of memory");
+               msg->payload.UDPTunnel->packet.data = malloc(msgLen);
+               if (msg->payload.UDPTunnel->packet.data == NULL)
+                       Log_fatal("Out of memory");
+               memcpy(msg->payload.UDPTunnel->packet.data, msgData, msgLen);
+               msg->payload.UDPTunnel->packet.len = msgLen;
                break;
        }
        case Authenticate:
@@ -534,6 +567,13 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg->payload.codecVersion = mumble_proto__codec_version__unpack(NULL, msgLen, msgData);
                break;
        }
+       case PermissionQuery:
+       {
+               msg = Msg_create(PermissionQuery);
+               msg->unpacked = true;
+               msg->payload.permissionQuery = mumble_proto__permission_query__unpack(NULL, msgLen, msgData);
+               break;
+       }
 
        default:
                Log_warn("Unsupported message %d", messageType);