summaryrefslogtreecommitdiff
path: root/telepathy-glib/base-media-call-stream.c
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.com>2012-03-18 16:56:36 -0400
committerOlivier CrĂȘte <olivier.crete@collabora.com>2012-03-20 15:56:55 -0400
commitafcafad122ed2dc8734c2a15bbb64044287b35a4 (patch)
tree6eaeb523794e1578809bb05e3295fee1508fe5a4 /telepathy-glib/base-media-call-stream.c
parentfedc390e969be494dc14ece7a8a6b2a53260896d (diff)
downloadtelepathy-glib-afcafad122ed2dc8734c2a15bbb64044287b35a4.tar.gz
BaseMediaCallStream: Only emit STUNServersChanged if they have changed
Diffstat (limited to 'telepathy-glib/base-media-call-stream.c')
-rw-r--r--telepathy-glib/base-media-call-stream.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/telepathy-glib/base-media-call-stream.c b/telepathy-glib/base-media-call-stream.c
index bf4d03104..24a25f791 100644
--- a/telepathy-glib/base-media-call-stream.c
+++ b/telepathy-glib/base-media-call-stream.c
@@ -145,6 +145,8 @@
#include "base-media-call-stream.h"
+#include <string.h>
+
#define DEBUG_FLAG TP_DEBUG_CALL
#include "telepathy-glib/base-call-content.h"
#include "telepathy-glib/base-call-channel.h"
@@ -625,7 +627,41 @@ tp_base_media_call_stream_set_stun_servers (TpBaseMediaCallStream *self,
g_return_if_fail (TP_IS_BASE_MEDIA_CALL_STREAM (self));
g_return_if_fail (stun_servers != NULL);
- tp_clear_pointer (&self->priv->stun_servers, g_ptr_array_unref);
+ if (self->priv->stun_servers != NULL)
+ {
+ if (stun_servers->len == self->priv->stun_servers->len)
+ {
+ guint i;
+ gboolean equal = TRUE;
+
+ for (i = 0; i < stun_servers->len; i++)
+ {
+ GValueArray *gva1 = g_ptr_array_index (stun_servers, i);
+ GValueArray *gva2 = g_ptr_array_index (self->priv->stun_servers,
+ i);
+ gchar *ip1, *ip2;
+ guint port1, port2;
+
+ tp_value_array_unpack (gva1, 2, &ip1, &port1);
+ tp_value_array_unpack (gva2, 2, &ip2, &port2);
+
+ if (port1 != port2 || strcmp (ip1, ip2))
+ {
+ equal = FALSE;
+ break;
+ }
+ }
+
+ if (equal)
+ {
+ g_ptr_array_unref (stun_servers);
+ return;
+ }
+ }
+
+ g_ptr_array_unref (self->priv->stun_servers);
+ }
+
self->priv->stun_servers = g_ptr_array_ref (stun_servers);
tp_svc_call_stream_interface_media_emit_stun_servers_changed (self,