static message_t *Msg_create_nopayload(messageType_t messageType);
static void Msg_addPreamble(uint8_t *buffer, uint16_t type, uint32_t len)
-{
- type = htons(type);
- len = htonl(len);
-
- buffer[0] = (type) & 0xff;
- buffer[1] = (type >> 8) & 0xff;
+{
+ buffer[1] = (type) & 0xff;
+ buffer[0] = (type >> 8) & 0xff;
- buffer[2] = (len) & 0xff;
- buffer[3] = (len >> 8) & 0xff;
- buffer[4] = (len >> 16) & 0xff;
- buffer[5] = (len >> 24) & 0xff;
+ buffer[5] = (len) & 0xff;
+ buffer[4] = (len >> 8) & 0xff;
+ buffer[3] = (len >> 16) & 0xff;
+ buffer[2] = (len >> 24) & 0xff;
}
static void Msg_getPreamble(uint8_t *buffer, int *type, int *len)
uint16_t msgType;
uint32_t 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);
+ msgType = buffer[1] | (buffer[0] << 8);
+ msgLen = buffer[5] | (buffer[4] << 8) | (buffer[3] << 16) | (buffer[2] << 24);
+ *type = (int)msgType;
+ *len = (int)msgLen;
}
#define MAX_MSGSIZE (BUFSIZE - PREAMBLE_SIZE)
Msg_addPreamble(buffer, msg->messageType, len);
mumble_proto__channel_remove__pack(msg->payload.channelRemove, bufptr);
break;
+ case UserStats:
+ {
+ len = mumble_proto__user_stats__get_packed_size(msg->payload.userStats);
+ if (len > MAX_MSGSIZE) {
+ Log_warn("Too big tx message. Discarding");
+ break;
+ }
+ Msg_addPreamble(buffer, msg->messageType, len);
+ mumble_proto__user_stats__pack(msg->payload.userStats, bufptr);
+ break;
+ }
+ case ServerConfig:
+ len = mumble_proto__server_config__get_packed_size(msg->payload.serverConfig);
+ if (len > MAX_MSGSIZE) {
+ Log_warn("Too big tx message. Discarding");
+ break;
+ }
+ Msg_addPreamble(buffer, msg->messageType, len);
+ mumble_proto__server_config__pack(msg->payload.serverConfig, bufptr);
+ break;
default:
Log_warn("Msg_MessageToNetwork: Unsupported message %d", msg->messageType);
msg->payload.channelRemove = malloc(sizeof(MumbleProto__ChannelRemove));
mumble_proto__channel_remove__init(msg->payload.channelRemove);
break;
+ case UserStats:
+ msg->payload.userStats = malloc(sizeof(MumbleProto__UserStats));
+ mumble_proto__user_stats__init(msg->payload.userStats);
+
+ msg->payload.userStats->from_client = malloc(sizeof(MumbleProto__UserStats__Stats));
+ mumble_proto__user_stats__stats__init(msg->payload.userStats->from_client);
+
+ msg->payload.userStats->from_server = malloc(sizeof(MumbleProto__UserStats__Stats));
+ mumble_proto__user_stats__stats__init(msg->payload.userStats->from_server);
+
+ msg->payload.userStats->version = malloc(sizeof(MumbleProto__Version));
+ mumble_proto__version__init(msg->payload.userStats->version);
+
+ if (!msg->payload.userStats || !msg->payload.userStats->from_client ||
+ !msg->payload.userStats->from_server || !msg->payload.userStats->version)
+ Log_fatal("Out of memory");
+ break;
+ case ServerConfig:
+ msg->payload.serverConfig = malloc(sizeof(MumbleProto__ServerConfig));
+ mumble_proto__server_config__init(msg->payload.serverConfig);
+ break;
default:
Log_warn("Msg_create: Unsupported message %d", msg->messageType);
if (msg->unpacked)
mumble_proto__text_message__free_unpacked(msg->payload.textMessage, NULL);
else {
+ if (msg->payload.textMessage->message)
+ free(msg->payload.textMessage->message);
+ if (msg->payload.textMessage->session)
+ free(msg->payload.textMessage->session);
+ if (msg->payload.textMessage->channel_id)
+ free(msg->payload.textMessage->channel_id);
+ if (msg->payload.textMessage->tree_id)
+ free(msg->payload.textMessage->tree_id);
free(msg->payload.textMessage);
}
break;
free(msg->payload.channelRemove);
}
break;
+ case UserStats:
+ if (msg->unpacked)
+ mumble_proto__user_stats__free_unpacked(msg->payload.userStats, NULL);
+ else {
+ if (msg->payload.userStats->from_client)
+ free(msg->payload.userStats->from_client);
+ if (msg->payload.userStats->from_server)
+ free(msg->payload.userStats->from_server);
+ if (msg->payload.userStats->version) {
+ if (msg->payload.userStats->version->release)
+ free(msg->payload.userStats->version->release);
+ if (msg->payload.userStats->version->os)
+ free(msg->payload.userStats->version->os);
+ if (msg->payload.userStats->version->os_version)
+ free(msg->payload.userStats->version->os_version);
+
+ free(msg->payload.userStats->version);
+ }
+ if (msg->payload.userStats->celt_versions)
+ free(msg->payload.userStats->celt_versions);
+ if (msg->payload.userStats->certificates) {
+ if (msg->payload.userStats->certificates->data)
+ free(msg->payload.userStats->certificates->data);
+ free(msg->payload.userStats->certificates);
+ }
+ if (msg->payload.userStats->address.data)
+ free(msg->payload.userStats->address.data);
+
+ free(msg->payload.userStats);
+ }
+ break;
+ case ServerConfig:
+ if (msg->unpacked)
+ mumble_proto__server_config__free_unpacked(msg->payload.serverConfig, NULL);
+ else {
+ free(msg->payload.serverConfig);
+ }
+ break;
default:
Log_warn("Msg_free: Unsupported message %d", msg->messageType);
goto err_out;
break;
}
+ case UserStats:
+ {
+ msg = Msg_create_nopayload(UserStats);
+ msg->unpacked = true;
+ msg->payload.userStats = mumble_proto__user_stats__unpack(NULL, msgLen, msgData);
+ if (msg->payload.userStats == NULL)
+ goto err_out;
+ break;
+ }
default:
Log_warn("Unsupported message %d", messageType);