diff --git a/gnome/src/contacts/calltree.c b/gnome/src/contacts/calltree.c index 33f76cacbd4f9136d755f79be898d2847503083a..0bbf2c014fb323686a34cec9839a1e3a1b1f4c90 100644 --- a/gnome/src/contacts/calltree.c +++ b/gnome/src/contacts/calltree.c @@ -748,7 +748,7 @@ calltree_update_call_recursive(calltab_t* tab, callable_obj_t * c, GtkTreeIter * void calltree_update_call(calltab_t* tab, callable_obj_t * c) { - return calltree_update_call_recursive(tab, c, NULL); + calltree_update_call_recursive(tab, c, NULL); } void calltree_add_call(calltab_t* tab, callable_obj_t * c, GtkTreeIter *parent) diff --git a/gnome/src/dbus/dbus.c b/gnome/src/dbus/dbus.c index cbf8537ddffa088a0432ab879dd7a2eef8eeb17f..452957d3bc2aea05b75ee75ada56b07b7f3496de 100644 --- a/gnome/src/dbus/dbus.c +++ b/gnome/src/dbus/dbus.c @@ -145,63 +145,111 @@ incoming_message_cb(DBusGProxy *proxy UNUSED, const gchar* callID UNUSED, const im_widget_add_message(IM_WIDGET(*widget), from, msg, 0); } -static void -call_state_cb(DBusGProxy *proxy UNUSED, const gchar* callID, const gchar* state, - void * foo UNUSED) +/** + * Perform the right sflphone action based on the requested state + */ +static void process_existant_call_state_change(callable_obj_t *c, const gchar *state) { - callable_obj_t *c = calllist_get_call(current_calls_tab, callID); + if(c == NULL) { + ERROR("Pointer to call is NULL in %s\n", __func__); + return; + } - if (c) { - if (g_strcmp0(state, "HUNGUP") == 0) { - if (c->_state == CALL_STATE_CURRENT) { - time(&c->_time_stop); - calltree_update_call(history_tab, c); - } + if(state == NULL) { + ERROR("Pointer to state is NULL in %s\n", __func__); + return; + } + if (g_strcmp0(state, "HUNGUP") == 0) { + if (c->_state == CALL_STATE_CURRENT) { + time(&c->_time_stop); calltree_update_call(history_tab, c); - status_bar_display_account(); - sflphone_hung_up(c); - } else if (g_strcmp0(state, "UNHOLD_CURRENT") == 0) { - sflphone_current(c); - } else if (g_strcmp0(state, "UNHOLD_RECORD") == 0) { - sflphone_record(c); - } else if (g_strcmp0(state, "HOLD") == 0) { - sflphone_hold(c); - } else if (g_strcmp0(state, "RINGING") == 0) { - sflphone_ringing(c); - } else if (g_strcmp0(state, "CURRENT") == 0) { - sflphone_current(c); - } else if (g_strcmp0(state, "RECORD") == 0) { - sflphone_record(c); - } else if (g_strcmp0(state, "FAILURE") == 0) { - sflphone_fail(c); - } else if (g_strcmp0(state, "BUSY") == 0) { - sflphone_busy(c); } - } else { - ERROR("DBUS: Error: Call is NULL in %s", __func__); - // The callID is unknow, threat it like a new call - // If it were an incoming call, we won't be here - // It means that a new call has been initiated with an other client (cli for instance) - if ((g_strcmp0(state, "RINGING")) == 0 || - (g_strcmp0(state, "CURRENT")) == 0 || - (g_strcmp0(state, "RECORD"))) { + calltree_update_call(history_tab, c); + status_bar_display_account(); + sflphone_hung_up(c); + } else if (g_strcmp0(state, "UNHOLD_CURRENT") == 0) { + sflphone_current(c); + } else if (g_strcmp0(state, "UNHOLD_RECORD") == 0) { + sflphone_record(c); + } else if (g_strcmp0(state, "HOLD") == 0) { + sflphone_hold(c); + } else if (g_strcmp0(state, "RINGING") == 0) { + sflphone_ringing(c); + } else if (g_strcmp0(state, "CURRENT") == 0) { + sflphone_current(c); + } else if (g_strcmp0(state, "RECORD") == 0) { + sflphone_record(c); + } else if (g_strcmp0(state, "FAILURE") == 0) { + sflphone_fail(c); + } else if (g_strcmp0(state, "BUSY") == 0) { + sflphone_busy(c); + } - DEBUG("DBUS: New ringing call! accountID: %s", callID); + return; +} - // We fetch the details associated to the specified call - GHashTable *call_details = dbus_get_call_details(callID); - callable_obj_t *new_call = create_new_call_from_details(callID, call_details); - new_call->_history_state = (g_strcasecmp(g_hash_table_lookup(call_details, "CALL_TYPE"), INCOMING_STRING) == 0) +/** + * This function process call state changes in case the call have not been created yet. + * This mainly occurs when anotehr SFLphone client takes actions. + */ +static void process_inexistant_call_state_change(const gchar *callID, const gchar *state) +{ + if(callID == NULL) { + ERROR("Pointer to call id is NULL in %s\n", __func__); + return; + } + + if(state == NULL) { + ERROR("Pointer to state is NULL in %s\n", __func__); + return; + } + + // Could occur if a user picked up the phone and hung up without making a call + if(g_strcmp0(state, "HUNGUP") == 0) + return; + + // The callID is unknow, threat it like a new call + // If it were an incoming call, we won't be here + // It means that a new call has been initiated with an other client (cli for instance) + if ((g_strcmp0(state, "RINGING")) == 0 || + (g_strcmp0(state, "CURRENT")) == 0 || + (g_strcmp0(state, "RECORD"))) { + + DEBUG("DBUS: New ringing call! accountID: %s", callID); + + // We fetch the details associated to the specified call + GHashTable *call_details = dbus_get_call_details(callID); + callable_obj_t *new_call = create_new_call_from_details(callID, call_details); + + new_call->_history_state = (g_strcasecmp(g_hash_table_lookup(call_details, "CALL_TYPE"), INCOMING_STRING) == 0) ? g_strdup(INCOMING_STRING) : g_strdup(OUTGOING_STRING); - calllist_add_call(current_calls_tab, new_call); - calltree_add_call(current_calls_tab, new_call, NULL); - update_actions(); - calltree_display(current_calls_tab); - } + calllist_add_call(current_calls_tab, new_call); + calltree_add_call(current_calls_tab, new_call, NULL); + update_actions(); + calltree_display(current_calls_tab); + } + +} + +/** + * Callback called when a + */ +static void +call_state_cb(DBusGProxy *proxy UNUSED, const gchar* callID, const gchar* state, + void * foo UNUSED) +{ + callable_obj_t *c = calllist_get_call(current_calls_tab, callID); + + if (c) { + process_existant_call_state_change(c, state); + } else { + WARN("DBUS: Call does not exist in %s", __func__); + + process_inexistant_call_state_change(callID, state); } }