From c7df54e693e34de4037a8cc8b7a28828302c7fa5 Mon Sep 17 00:00:00 2001 From: fatbob313 Date: Thu, 14 Jan 2010 20:26:26 +0000 Subject: [PATCH] Add support for plugin contexts and strip positional data from voice messages when different contexts communicate (untested). --- src/client.c | 34 ++++++++++++++++++++-------------- src/client.h | 4 ++-- src/messagehandler.c | 11 ++++++++++- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/client.c b/src/client.c index 99ebb8c..2294b3a 100644 --- a/src/client.c +++ b/src/client.c @@ -234,7 +234,9 @@ void Client_free(client_t *client) if (client->os) free(client->os); if (client->playerName) - free(client->playerName); + free(client->playerName); + if (client->context) + free(client->context); free(client); } @@ -598,6 +600,16 @@ out: return 0; } +static inline void Client_send_voice(client_t *src, client_t *dst, uint8_t *data, int len, int poslen) +{ + if (IS_AUTH(dst) && dst != src && !dst->deaf) { + if (poslen > 0 && strcmp(src->context, dst->context) == 0) + Client_send_udp(dst, data, len); + else + Client_send_udp(dst, data, len - poslen); + } +} + /* Handle decrypted voice message */ int Client_voiceMsg(client_t *client, uint8_t *data, int len) { @@ -627,7 +639,7 @@ int Client_voiceMsg(client_t *client, uint8_t *data, int len) offset = Pds_skip(pdi, counter & 0x7f); } while ((counter & 0x80) && offset > 0); - poslen = pdi->maxsize - pdi->offset; /* XXX - Add stripping of positional audio */ + poslen = pdi->maxsize - pdi->offset; /* For stripping of positional info */ Pds_add_numval(pds, client->sessionId); Pds_append_data_nosize(pds, data + 1, len - 1); @@ -645,9 +657,7 @@ int Client_voiceMsg(client_t *client, uint8_t *data, int len) list_iterate(itr, &ch->clients) { client_t *c; c = list_get_entry(itr, client_t, chan_node); - if (c != client && !c->deaf) { - Client_send_udp(c, buffer, pds->offset + 1); - } + Client_send_voice(client, c, buffer, pds->offset + 1, poslen); } /* Channel links */ if (!list_empty(&ch->channel_links)) { @@ -658,10 +668,8 @@ int Client_voiceMsg(client_t *client, uint8_t *data, int len) list_iterate(itr, &ch_link->clients) { client_t *c; c = list_get_entry(itr, client_t, chan_node); - if (c != client && !c->deaf) { - Log_debug("Linked voice from %s -> %s", ch->name, ch_link->name); - Client_send_udp(c, buffer, pds->offset + 1); - } + Log_debug("Linked voice from %s -> %s", ch->name, ch_link->name); + Client_send_voice(client, c, buffer, pds->offset + 1, poslen); } } } @@ -677,9 +685,7 @@ int Client_voiceMsg(client_t *client, uint8_t *data, int len) list_iterate(itr, &ch->clients) { client_t *c; c = list_get_entry(itr, client_t, chan_node); - if (c != client && !c->deaf && IS_AUTH(c)) { - Client_send_udp(c, buffer, pds->offset + 1); - } + Client_send_voice(client, c, buffer, pds->offset + 1, poslen); } } /* Sessions */ @@ -687,8 +693,8 @@ int Client_voiceMsg(client_t *client, uint8_t *data, int len) client_t *c; Log_debug("Whisper session %d", vt->sessions[i]); while (Client_iterate(&c) != NULL) { - if (c->sessionId == vt->sessions[i] && c != client && !c->deaf && IS_AUTH(c)) { - Client_send_udp(c, buffer, pds->offset + 1); + if (c->sessionId == vt->sessions[i]) { + Client_send_voice(client, c, buffer, pds->offset + 1, poslen); break; } } diff --git a/src/client.h b/src/client.h index b2e4923..1239e55 100644 --- a/src/client.h +++ b/src/client.h @@ -80,8 +80,8 @@ typedef struct { struct dlist node; struct dlist txMsgQueue; int txQueueCount; - /* Channel */ - void *channel; /*Ugly... */ + void *channel; /* Ugly... */ + char *context; struct dlist chan_node; struct dlist voicetargets; } client_t; diff --git a/src/messagehandler.c b/src/messagehandler.c index 8b4b94a..089aec0 100644 --- a/src/messagehandler.c +++ b/src/messagehandler.c @@ -315,13 +315,22 @@ void Mh_handle_message(client_t *client, message_t *msg) if (msg->payload.userState->has_channel_id) { Chan_playerJoin_id(msg->payload.userState->channel_id, client); } + if (msg->payload.userState->plugin_context != NULL) { + if (client->context) + free(client->context); + client->context = strdup(msg->payload.userState->plugin_context); + if (client->context == NULL) + Log_fatal("Out of memory"); + + break; /* Don't inform other users about this state */ + } + /* Re-use message */ Msg_inc_ref(msg); msg->payload.userState->has_actor = true; msg->payload.userState->actor = client->sessionId; Client_send_message_except(NULL, msg); break; - case TextMessage: msg->payload.textMessage->has_actor = true; msg->payload.textMessage->actor = client->sessionId; -- 2.30.2