summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPekka Pessi <Pekka.Pessi@nokia.com>2011-01-21 15:39:14 +0200
committerPekka Pessi <Pekka.Pessi@nokia.com>2011-01-21 15:39:14 +0200
commit653532918d68517d2e2bd8c995aa3ce1d9dee10c (patch)
tree575a93ad13e0a47e028ca710be14957135ce6354 /src
parentd8c674ea30c77378d7fe97629e96bb96a6d3f5cd (diff)
parentbb5b149908878b58d50e8e47ff4613c0a2643f49 (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.c12
-rw-r--r--src/ring-conference-channel.c13
-rw-r--r--src/ring-member-channel.c2
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(