diff options
author | Naveen Verma <naveen.verma@nokia.com> | 2009-08-19 16:25:51 +0300 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2009-08-19 15:55:37 +0100 |
commit | 063f515dd919c6988ed63c52d7b49d8ff5ad7e10 (patch) | |
tree | 5c549ef21353f26724bd1c40ad5a1749650341f4 | |
parent | 781e360f0734363275144331831be67f95820244 (diff) |
Detect missed calls correctly
Signed-off-by: Simon McVittie <simon.mcvittie@collabora.co.uk>
-rw-r--r-- | src/mcd-channel.c | 24 |
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; } |