Commit 389e7720 authored by Julian Sparber's avatar Julian Sparber Committed by Julian Sparber
Browse files

DummyPlugin: fix events emits for call-removed, origin-*

This fixes this two issues:
- Emit the events origin-removed, origin-added when required.

- Remove call immediately when disconnected and emit events:
  By using `g_idle_add ()` we can't be sure when the call is actually
  removed and could stay potentionaly for evere, as long the main loop is
  busy. This can lead to unexpected behavior. If the calls shouldn't be
  freed then it's required to increase the ref count. This is similar how
  the `remove` event works in a `GtkContainer`.
parent 113dbbba
......@@ -87,9 +87,10 @@ remove_call (CallsDummyOrigin *self,
CallsOrigin *origin;
origin = CALLS_ORIGIN (self);
self->calls = g_list_remove (self->calls, call);
g_signal_emit_by_name (origin, "call-removed", call, reason);
self->calls = g_list_remove (self->calls, call);
g_object_unref (G_OBJECT (call));
}
......@@ -97,14 +98,18 @@ remove_call (CallsDummyOrigin *self,
static void
remove_calls (CallsDummyOrigin *self, const gchar *reason)
{
GList *node, *next;
gpointer call;
GList *next;
for (node = self->calls; node; node = next)
{
next = node->next;
while (self->calls != NULL) {
call = self->calls->data;
next = self->calls->next;
g_list_free_1 (self->calls);
self->calls = next;
remove_call (self, CALLS_CALL (node->data), reason);
}
g_signal_emit_by_name (self, "call-removed", call, reason);
g_object_unref (call);
}
}
......@@ -115,25 +120,12 @@ struct DisconnectedData
};
static gboolean
disconnected_cb (struct DisconnectedData *data)
{
remove_call (data->self, data->call, "Disconnected");
g_object_unref (G_OBJECT (data->call));
g_object_unref (G_OBJECT (data->self));
g_free (data);
return FALSE;
}
static void
call_state_changed_cb (CallsDummyOrigin *self,
CallsCallState new_state,
CallsCallState old_state,
CallsCall *call)
{
struct DisconnectedData *data;
if (new_state != CALLS_CALL_STATE_DISCONNECTED)
{
return;
......@@ -142,16 +134,7 @@ call_state_changed_cb (CallsDummyOrigin *self,
g_return_if_fail (CALLS_IS_DUMMY_ORIGIN (self));
g_return_if_fail (CALLS_IS_CALL (call));
// We add an idle callback so that all of the state change handlers
// are dealt with before the removal
data = g_new (struct DisconnectedData, 1);
data->self = self;
data->call = call;
g_object_ref (G_OBJECT (self));
g_object_ref (G_OBJECT (call));
g_idle_add ((GSourceFunc)disconnected_cb, data);
remove_call (self, call, "Disconnected");
}
......
......@@ -135,10 +135,19 @@ get_property (GObject *object,
static void
dispose (GObject *object)
{
gpointer origin;
GList *next;
CallsDummyProvider *self = CALLS_DUMMY_PROVIDER (object);
g_list_free_full (self->origins, g_object_unref);
self->origins = NULL;
while (self->origins != NULL) {
origin = self->origins->data;
next = self->origins->next;
g_list_free_1 (self->origins);
self->origins = next;
g_signal_emit_by_name (self, "origin-removed", origin);
g_object_unref (origin);
}
G_OBJECT_CLASS (calls_dummy_provider_parent_class)->dispose (object);
}
......@@ -181,8 +190,10 @@ void
calls_dummy_provider_add_origin (CallsDummyProvider *self,
const gchar *name)
{
self->origins = g_list_append (self->origins,
calls_dummy_origin_new (name));
CallsDummyOrigin *origin = calls_dummy_origin_new (name);
self->origins = g_list_append (self->origins, origin);
g_signal_emit_by_name (CALLS_PROVIDER (self), "origin-added", CALLS_ORIGIN (origin));
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment