Added voice target (whisper) functionality.
[umurmur.git] / src / voicetarget.c
diff --git a/src/voicetarget.c b/src/voicetarget.c
new file mode 100644 (file)
index 0000000..3a8e0fd
--- /dev/null
@@ -0,0 +1,125 @@
+/* Copyright (C) 2009, Martin Johansson <martin@fatbob.nu>
+   Copyright (C) 2005-2009, Thorvald Natvig <thorvald@natvig.com>
+
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   - Redistributions of source code must retain the above copyright notice,
+     this list of conditions and the following disclaimer.
+   - Redistributions in binary form must reproduce the above copyright notice,
+     this list of conditions and the following disclaimer in the documentation
+     and/or other materials provided with the distribution.
+   - Neither the name of the Developers nor the names of its contributors may
+     be used to endorse or promote products derived from this software without
+     specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include "voicetarget.h"
+#include "log.h"
+
+void Voicetarget_add_session(client_t *client, int targetId, int sessionId)
+{
+       struct dlist *itr;
+       voicetarget_t *vt;
+       
+       list_iterate(itr, &client->voicetargets) {
+               if (targetId == list_get_entry(itr, voicetarget_t, node)->id) {
+                       int i;
+                       vt = list_get_entry(itr, voicetarget_t, node);
+                       for (i = 0; i < TARGET_MAX_SESSIONS; i++) {
+                               if (vt->sessions[i] == -1) {
+                                       vt->sessions[i] = sessionId;
+                                       Log_debug("Adding session ID %d to voicetarget ID %d", sessionId, targetId);
+                                       return;
+                               }
+                       }
+               }
+       }
+}
+
+void Voicetarget_add_channel(client_t *client, int targetId, int channelId)
+{
+       struct dlist *itr;
+       voicetarget_t *vt;
+       
+       list_iterate(itr, &client->voicetargets) {
+               if (targetId == list_get_entry(itr, voicetarget_t, node)->id) {
+                       int i;
+                       vt = list_get_entry(itr, voicetarget_t, node);
+                       for (i = 0; i < TARGET_MAX_CHANNELS; i++) {
+                               if (vt->channels[i] == -1) {
+                                       vt->channels[i] = channelId;
+                                       Log_debug("Adding channel ID %d to voicetarget ID %d", channelId, targetId);
+                                       return;
+                               }
+                       }
+               }
+       }       
+}
+
+void Voicetarget_add_id(client_t *client, int targetId)
+{
+       voicetarget_t *newtarget;
+       int i;
+       
+       Voicetarget_del_id(client, targetId);
+       newtarget = malloc(sizeof(voicetarget_t));
+       if (!newtarget)
+               Log_fatal("Out of memory");
+       memset(newtarget, 0, sizeof(voicetarget_t));
+       for (i = 0; i < TARGET_MAX_CHANNELS; i++)
+               newtarget->channels[i] = -1;
+       for (i = 0; i < TARGET_MAX_SESSIONS; i++)
+               newtarget->sessions[i] = -1;
+       newtarget->id = targetId;
+       list_add_tail(&newtarget->node, &client->voicetargets);
+}
+
+void Voicetarget_del_id(client_t *client, int targetId)
+{
+       struct dlist *itr;
+       list_iterate(itr, &client->voicetargets) {
+               if (targetId == list_get_entry(itr, voicetarget_t, node)->id) {
+                       list_del(&list_get_entry(itr, voicetarget_t, node)->node);
+                       free(list_get_entry(itr, voicetarget_t, node));
+                       Log_debug("Removing voicetarget ID %d", targetId);
+               }
+       }
+}
+
+voicetarget_t *Voicetarget_get_id(client_t *client, int targetId)
+{
+       struct dlist *itr;
+       list_iterate(itr, &client->voicetargets) {
+               if (targetId == list_get_entry(itr, voicetarget_t, node)->id) {
+                       return list_get_entry(itr, voicetarget_t, node);
+               }
+       }
+       return NULL;
+}
+
+
+void Voicetarget_free_all(client_t *client)
+{
+       struct dlist *itr, *save;
+
+       list_iterate_safe(itr, save, &client->voicetargets) {
+               list_del(&list_get_entry(itr, voicetarget_t, node)->node);
+               free(list_get_entry(itr, voicetarget_t, node));
+       }
+}