diff options
author | Pekka Pessi <Pekka.Pessi@nokia.com> | 2011-01-21 15:39:14 +0200 |
---|---|---|
committer | Pekka Pessi <Pekka.Pessi@nokia.com> | 2011-01-21 15:39:14 +0200 |
commit | 653532918d68517d2e2bd8c995aa3ce1d9dee10c (patch) | |
tree | 575a93ad13e0a47e028ca710be14957135ce6354 /src | |
parent | d8c674ea30c77378d7fe97629e96bb96a6d3f5cd (diff) | |
parent | bb5b149908878b58d50e8e47ff4613c0a2643f49 (diff) |
Merge commit 'refs/merge-requests/8' of git://gitorious.org/meego-cellular/telepathy-ring into merger
Diffstat (limited to 'src')
-rw-r--r-- | src/ring-call-channel.c | 12 | ||||
-rw-r--r-- | src/ring-conference-channel.c | 13 | ||||
-rw-r--r-- | src/ring-member-channel.c | 2 |
3 files changed, 20 insertions, 7 deletions
diff --git a/src/ring-call-channel.c b/src/ring-call-channel.c index 8ad659a..abac196 100644 --- a/src/ring-call-channel.c +++ b/src/ring-call-channel.c @@ -413,9 +413,6 @@ ring_call_channel_set_property(GObject *obj, case PROP_TERMINATING: priv->terminating = g_value_get_boolean(value); break; - case PROP_MEMBER: - priv->member.handle = g_value_get_uint(value); - break; case PROP_INITIAL_EMERGENCY_SERVICE: priv->initial_emergency_service = g_value_dup_string(value); break; @@ -655,8 +652,8 @@ ring_call_channel_close(RingMediaChannel *_self, gboolean immediately) "Member channel closed", actor, reason); + /* above emit calls ring_member_channel_left() */ g_assert(priv->member.conference == NULL); - priv->member.conference = NULL; } if (self->base.call_instance) { @@ -1163,8 +1160,8 @@ on_modem_call_notify_multiparty(ModemCall *ci, GParamSpec *pspec, gpointer user_ priv->member.conference, RING_MEMBER_CHANNEL(self), "Conference call split", actor, reason); + /* above emit calls ring_member_channel_left() */ g_assert(priv->member.conference == NULL); - priv->member.conference = NULL; } } @@ -1691,6 +1688,8 @@ ring_call_channel_released(RingCallChannel *self, ring_conference_channel_emit_channel_removed( self->priv->member.conference, RING_MEMBER_CHANNEL(self), message, actor, reason); + /* above emit calls ring_member_channel_left() */ + g_assert(self->priv->member.conference == NULL); } g_free(dbus_error); @@ -1848,6 +1847,7 @@ ring_member_channel_joined(RingMemberChannel *iface, RingCallChannelPrivate *priv = self->priv; if (priv->member.conference) { + DEBUG("switching to a new conference"); if (priv->member.conference == conference) return; ring_conference_channel_emit_channel_removed( @@ -1855,6 +1855,8 @@ ring_member_channel_joined(RingMemberChannel *iface, "Joined new conference", self->group.self_handle, TP_CHANNEL_GROUP_CHANGE_REASON_INVITED); + /* above emit calls ring_member_channel_left() */ + g_assert(priv->member.conference == NULL); } g_assert(priv->member.conference == NULL); diff --git a/src/ring-conference-channel.c b/src/ring-conference-channel.c index 33fd0b0..8636f13 100644 --- a/src/ring-conference-channel.c +++ b/src/ring-conference-channel.c @@ -1014,6 +1014,10 @@ ring_conference_channel_dispose(GObject *obj) } } + while (!g_queue_is_empty (self->priv->requests)) { + modem_request_cancel (g_queue_pop_head (self->priv->requests)); + } + ((GObjectClass *)ring_conference_channel_parent_class)->dispose(obj); } @@ -1434,6 +1438,10 @@ ring_conference_channel_emit_channel_removed( if (i >= MODEM_MAX_CALLS) return; + /* note: as this function may lead to tearing down the whole + * conference, keep a local self-reference */ + g_object_ref (self); + while (member) { TpIntSet *remove = tp_intset_new(); @@ -1491,7 +1499,7 @@ ring_conference_channel_emit_channel_removed( } if (n > 2) - return; + goto out; DEBUG("Too few members, close channel %p", self); @@ -1500,6 +1508,9 @@ ring_conference_channel_emit_channel_removed( * not hangup. */ ring_conference_channel_close_impl (self, FALSE, FALSE); + +out: + g_object_unref (self); } diff --git a/src/ring-member-channel.c b/src/ring-member-channel.c index 7f5caaa..620c418 100644 --- a/src/ring-member-channel.c +++ b/src/ring-member-channel.c @@ -43,7 +43,7 @@ ring_member_channel_base_init(gpointer klass) "Member Handle", "Handle representing the channel target in conference", 0, G_MAXUINT, 0, - G_PARAM_READWRITE | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_interface_install_property( |