summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaveen Verma <naveen.verma@nokia.com>2009-08-19 16:25:51 +0300
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2009-08-19 15:55:37 +0100
commit063f515dd919c6988ed63c52d7b49d8ff5ad7e10 (patch)
tree5c549ef21353f26724bd1c40ad5a1749650341f4
parent781e360f0734363275144331831be67f95820244 (diff)
Detect missed calls correctly
Signed-off-by: Simon McVittie <simon.mcvittie@collabora.co.uk>
-rw-r--r--src/mcd-channel.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/mcd-channel.c b/src/mcd-channel.c
index ce6dd178..fb9443e3 100644
--- a/src/mcd-channel.c
+++ b/src/mcd-channel.c
@@ -144,12 +144,17 @@ on_members_changed (TpChannel *proxy, const gchar *message,
{
McdChannelPrivate *priv = channel->priv;
TpHandle self_handle;
+ TpHandle conn_self_handle = 0;
+ TpHandle removed_handle = 0;
guint i;
- DEBUG ("called (actor %u, reason %u, self_handle %u)",
- actor, reason, tp_channel_group_get_self_handle (proxy));
-
self_handle = tp_channel_group_get_self_handle (proxy);
+ conn_self_handle =
+ tp_connection_get_self_handle (tp_channel_borrow_connection (proxy));
+
+ DEBUG ("called (actor %u, reason %u, self_handle %u, conn_self_handle %u)",
+ actor, reason, tp_channel_group_get_self_handle (proxy),
+ conn_self_handle);
if (added && added->len > 0)
{
@@ -170,15 +175,18 @@ on_members_changed (TpChannel *proxy, const gchar *message,
}
}
- if (removed && removed->len > 0 && actor != self_handle)
+ if (removed && removed->len > 0 &&
+ (actor == 0 || (actor != self_handle && actor != conn_self_handle)))
{
for (i = 0; i < removed->len; i++)
{
- DEBUG ("removed member %u", g_array_index (removed, guint, i));
- if (actor == g_array_index (removed, guint, i))
+ removed_handle = g_array_index (removed, guint, i);
+ DEBUG ("removed member %u", removed_handle);
+ if (removed_handle == self_handle ||
+ removed_handle == conn_self_handle)
{
- /* the remote removed itself; if we didn't accept the call,
- * it's a missed channel */
+ /* We are removed (end of call), marking as missed, if not
+ * already accespted the call */
if (!priv->members_accepted) priv->missed = TRUE;
break;
}