diff --git a/src/calls-call-display.c b/src/calls-call-display.c index dc97dcc..a8c3431 100644 --- a/src/calls-call-display.c +++ b/src/calls-call-display.c @@ -177,6 +177,7 @@ call_state_changed_cb (CallsCallDisplay *self, calls_call_state_to_string (state_str, state); gtk_label_set_text (self->status, state_str->str); + g_debug ("Call state changed to `%s'", state_str->str); g_string_free (state_str, TRUE); switch (state) diff --git a/src/calls-mm-call.c b/src/calls-mm-call.c index 67dfa88..6c86e7c 100644 --- a/src/calls-mm-call.c +++ b/src/calls-mm-call.c @@ -151,22 +151,23 @@ set_disconnect_reason (CallsMMCall *self, struct CallsMMCallStateMap { - MMCallState mm; - CallsCallState calls; + MMCallState mm; + CallsCallState calls; + const gchar *name; }; static const struct CallsMMCallStateMap STATE_MAP[] = { -#define row(MMENUM,CALLSENUM) \ - { MM_CALL_STATE_##MMENUM, CALLS_CALL_STATE_##CALLSENUM } \ +#define row(MMENUM,CALLSENUM) \ + { MM_CALL_STATE_##MMENUM, CALLS_CALL_STATE_##CALLSENUM, #MMENUM } \ - row (DIALING, DIALING), - row (RINGING_OUT, INCOMING), - row (RINGING_IN, ALERTING), - row (ACTIVE, ACTIVE), - row (HELD, HELD), - row (WAITING, INCOMING), - row (TERMINATED, DISCONNECTED), + row (DIALING, DIALING), + row (RINGING_OUT, ALERTING), + row (RINGING_IN, INCOMING), + row (ACTIVE, ACTIVE), + row (HELD, HELD), + row (WAITING, INCOMING), + row (TERMINATED, DISCONNECTED), #undef row @@ -191,6 +192,8 @@ state_changed_cb (CallsMMCall *self, { if (map_row->mm == mm_new) { + g_debug ("MM call state changed to `%s'", + map_row->name); change_state (self, map_row->calls); return; } @@ -296,6 +299,7 @@ constructed (GObject *object) GObjectClass *parent_class = g_type_class_peek (G_TYPE_OBJECT); CallsMMCall *self = CALLS_MM_CALL (object); MmGdbusCall *gdbus_call = MM_GDBUS_CALL (self->mm_call); + MMCallState state; g_signal_connect_swapped (gdbus_call, "notify::number", G_CALLBACK (notify_number_cb), self); @@ -304,8 +308,14 @@ constructed (GObject *object) notify_number_cb (self, mm_call_get_number (self->mm_call)); + state = mm_call_get_state (self->mm_call); + state_changed_cb (self, + MM_MODEM_STATE_UNKNOWN, + state, + mm_call_get_state_reason (self->mm_call)); + /* Start outgoing call */ - if (mm_call_get_state (self->mm_call) == MM_CALL_STATE_UNKNOWN + if (state == MM_CALL_STATE_UNKNOWN && mm_call_get_direction (self->mm_call) == MM_CALL_DIRECTION_OUTGOING) { start_call (CALLS_CALL (self)); diff --git a/src/calls-mm-origin.c b/src/calls-mm-origin.c index e3636b3..1884462 100644 --- a/src/calls-mm-origin.c +++ b/src/calls-mm-origin.c @@ -182,19 +182,13 @@ delete_call_cb (MMModemVoice *voice, static void -call_state_changed_cb (CallsMMOrigin *self, - CallsCallState state, - CallsCall *call) +delete_call (CallsMMOrigin *self, + CallsMMCall *call) { const gchar *path; struct CallsMMOriginDeleteCallData *data; - if (state != CALLS_CALL_STATE_DISCONNECTED) - { - return; - } - - path = calls_mm_call_get_object_path (CALLS_MM_CALL (call)); + path = calls_mm_call_get_object_path (call); data = g_new0 (struct CallsMMOriginDeleteCallData, 1); data->self = self; @@ -204,10 +198,23 @@ call_state_changed_cb (CallsMMOrigin *self, (self->voice, path, NULL, - (GAsyncReadyCallback) delete_call_cb, + (GAsyncReadyCallback)delete_call_cb, data); } +static void +call_state_changed_cb (CallsMMOrigin *self, + CallsCallState state, + CallsCall *call) +{ + if (state != CALLS_CALL_STATE_DISCONNECTED) + { + return; + } + + delete_call (self, CALLS_MM_CALL (call)); +} + static void add_call (CallsMMOrigin *self, @@ -228,6 +235,12 @@ add_call (CallsMMOrigin *self, g_signal_emit_by_name (CALLS_ORIGIN(self), "call-added", CALLS_CALL(call)); + if (mm_call_get_state (mm_call) == MM_CALL_STATE_TERMINATED) + { + // Delete any remnant disconnected call + delete_call (self, call); + } + g_debug ("Call `%s' added", path); }