+message_t *Msg_banList_create(int n_bans)
+{
+ message_t *msg = Msg_create_nopayload(BanList);
+ int i;
+
+ msg->payload.banList = Memory_safeCalloc(1, sizeof(MumbleProto__BanList));
+ mumble_proto__ban_list__init(msg->payload.banList);
+ msg->payload.banList->n_bans = n_bans;
+ msg->payload.banList->bans = Memory_safeMalloc(n_bans, sizeof(MumbleProto__BanList__BanEntry *));
+ for (i = 0; i < n_bans; i++) {
+ msg->payload.banList->bans[i] = Memory_safeCalloc(1, 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 = Memory_safeMalloc(1, 16);
+ 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;
+}
+
+