-/* Copyright (C) 2009-2010, Martin Johansson <martin@fatbob.nu>
- Copyright (C) 2005-2010, Thorvald Natvig <thorvald@natvig.com>
+/* Copyright (C) 2009-2014, Martin Johansson <martin@fatbob.nu>
+ Copyright (C) 2005-2014, Thorvald Natvig <thorvald@natvig.com>
All rights reserved.
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;
+ case BanList:
+ len = mumble_proto__ban_list__get_packed_size(msg->payload.banList);
+ if (len > MAX_MSGSIZE) {
+ Log_warn("Too big tx message. Discarding");
+ break;
+ }
+ Msg_addPreamble(buffer, msg->messageType, len);
+ Log_debug("Msg_MessageToNetwork: BanList size %d", len);
+ mumble_proto__ban_list__pack(msg->payload.banList, bufptr);
+ break;
default:
Log_warn("Msg_MessageToNetwork: Unsupported message %d", msg->messageType);
return 0;
message_t *Msg_create(messageType_t messageType)
{
message_t *msg = Msg_create_nopayload(messageType);
+ int i;
switch (messageType) {
case Version:
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);
return msg;
}
+message_t *Msg_banList_create(int n_bans)
+{
+ message_t *msg = Msg_create_nopayload(BanList);
+ int i;
+
+ msg->payload.banList = malloc(sizeof(MumbleProto__BanList));
+ if (msg->payload.banList == NULL)
+ Log_fatal("Out of memory");
+ memset(msg->payload.banList, 0, sizeof(MumbleProto__BanList));
+ mumble_proto__ban_list__init(msg->payload.banList);
+ msg->payload.banList->n_bans = n_bans;
+ msg->payload.banList->bans = malloc(sizeof(MumbleProto__BanList__BanEntry *) * n_bans);
+ if (msg->payload.banList->bans == NULL)
+ Log_fatal("Out of memory");
+ for (i = 0; i < n_bans; i++) {
+ msg->payload.banList->bans[i] = malloc(sizeof(MumbleProto__BanList__BanEntry));
+ if (msg->payload.banList->bans[i] == NULL)
+ Log_fatal("Out of memory");
+ memset(msg->payload.banList->bans[i], 0, sizeof(MumbleProto__BanList__BanEntry));
+ mumble_proto__ban_list__ban_entry__init(msg->payload.banList->bans[i]);
+ }
+ return msg;
+}
+
+void Msg_banList_addEntry(message_t *msg, int index, uint8_t *address, uint32_t mask,
+ char *name, char *hash, char *reason, char *start, uint32_t duration)
+{
+ MumbleProto__BanList__BanEntry *entry = msg->payload.banList->bans[index];
+
+ entry->address.data = malloc(16);
+ if (!entry->address.data)
+ Log_fatal("Out of memory");
+ memcpy(entry->address.data, address, 16);
+ entry->address.len = 16;
+ entry->mask = mask;
+ entry->name = strdup(name);
+ entry->hash = strdup(hash);
+ entry->reason = strdup(reason);
+ entry->start = strdup(start);
+ if (!entry->name || !entry->hash || !entry->reason || !entry->start)
+ Log_fatal("Out of memory");
+
+ if (duration > 0) {
+ entry->duration = duration;
+ entry->has_duration = true;
+ }
+ Log_debug("Msg_banList_addEntry: %s %s %s %s %s", entry->name, entry->hash, entry->address.data, entry->reason, entry->start);
+}
+
+void Msg_banList_getEntry(message_t *msg, int index, uint8_t **address, uint32_t *mask,
+ char **name, char **hash, char **reason, char **start, uint32_t *duration)
+{
+ MumbleProto__BanList__BanEntry *entry = msg->payload.banList->bans[index];
+
+ *address = entry->address.data;
+ *mask = entry->mask;
+ *name = entry->name;
+ *hash = entry->hash;
+ *reason = entry->reason;
+ *start = entry->start;
+ if (entry->has_duration)
+ *duration = entry->duration;
+ else
+ *duration = 0;
+}
+
+
void Msg_inc_ref(message_t *msg)
{
msg->refcount++;
void Msg_free(message_t *msg)
{
+ int i;
+
if (msg->refcount) msg->refcount--;
if (msg->refcount > 0)
return;
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;
+ case BanList:
+ if (msg->unpacked)
+ mumble_proto__ban_list__free_unpacked(msg->payload.banList, NULL);
+ else {
+ for (i = 0; i < msg->payload.banList->n_bans; i++) {
+ free(msg->payload.banList->bans[i]->address.data);
+ free(msg->payload.banList->bans[i]->name);
+ free(msg->payload.banList->bans[i]->hash);
+ free(msg->payload.banList->bans[i]->reason);
+ free(msg->payload.banList->bans[i]->start);
+ free(msg->payload.banList->bans[i]);
+ }
+ free(msg->payload.banList->bans);
+ free(msg->payload.banList);
+ }
+ 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;
+ }
+ case UserRemove:
+ {
+ msg = Msg_create_nopayload(UserRemove);
+ msg->unpacked = true;
+ msg->payload.userRemove = mumble_proto__user_remove__unpack(NULL, msgLen, msgData);
+ if (msg->payload.userRemove == NULL)
+ goto err_out;
+ break;
+ }
+ case BanList:
+ {
+ msg = Msg_create_nopayload(BanList);
+ msg->unpacked = true;
+ msg->payload.banList = mumble_proto__ban_list__unpack(NULL, msgLen, msgData);
+ if (msg->payload.banList == NULL)
+ goto err_out;
+ break;
+ }
default:
- Log_warn("Unsupported message %d", messageType);
+ Log_warn("Msg_networkToMessage: Unsupported message %d", messageType);
break;
}
return msg;