diff options
author | Marco Bascetta <marco.bascetta@sadel.it> | 2015-05-05 18:00:09 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2015-08-02 10:39:13 +0200 |
commit | 6d85146bba3edceeaf9f23e0e7a5281fda527d59 (patch) | |
tree | e09cc3e936ec9fc60cd4bac01da72e3118999ae8 /src/mm-iface-modem-voice.c | |
parent | c53bc10092563eb361b4980afb00080009067661 (diff) |
core: handle incoming calls (RING/CRING, CLIP, NO CARRIER).
Diffstat (limited to 'src/mm-iface-modem-voice.c')
-rw-r--r-- | src/mm-iface-modem-voice.c | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/mm-iface-modem-voice.c b/src/mm-iface-modem-voice.c index 990ebee4..6b896dbd 100644 --- a/src/mm-iface-modem-voice.c +++ b/src/mm-iface-modem-voice.c @@ -46,6 +46,110 @@ mm_iface_modem_voice_create_call (MMIfaceModemVoice *self) return MM_IFACE_MODEM_VOICE_GET_INTERFACE (self)->create_call (self); } +//BASCETTA:TODO: bisogna aggiungere la gestione degli errori. +MMBaseCall * +mm_iface_modem_voice_create_incoming_call (MMIfaceModemVoice *self) +{ + MMBaseCall *call = NULL; + MMCallList *list = NULL; + + g_object_get (MM_BASE_MODEM (self), + MM_IFACE_MODEM_VOICE_CALL_LIST, &list, + NULL); + + if( list ) { + + call = mm_call_list_get_new_incoming(list); + if( !call ) { + + mm_dbg("[%s:%d] Incoming call does not exist; create it", __func__, __LINE__); + + call = mm_base_call_new (MM_BASE_MODEM (self)); + g_object_set (call, + "state", MM_CALL_STATE_RINGING_IN, + "state-reason", MM_CALL_STATE_REASON_INCOMING_NEW, + "direction", MM_CALL_DIRECTION_INCOMING, + NULL); + + /* Only export once properly created */ + mm_base_call_export (call); + mm_dbg ("[%s:%d] New call exported to DBUS", __func__, __LINE__); + + mm_call_list_add_call(list, call); + mm_dbg ("[%s:%d] Call added to list", __func__, __LINE__); + + } else { +// mm_dbg("[%s:%d] Incoming call already exist. Do nothing", __func__, __LINE__); + } + + g_object_unref (list); + } + + return call; +} + +gboolean mm_iface_modem_voice_update_incoming_call_number (MMIfaceModemVoice *self, gchar *number, guint type, guint validity) +{ + gboolean updated = FALSE; + MMBaseCall *call = NULL; + MMCallList *list = NULL; + + g_object_get (MM_BASE_MODEM (self), + MM_IFACE_MODEM_VOICE_CALL_LIST, &list, + NULL); + + if( list ) { + + call = mm_call_list_get_new_incoming(list); + if( call ) { + g_object_set (call, "number", number, NULL); + mm_gdbus_call_set_number(MM_GDBUS_CALL (call), number); + + //TODO: Maybe also this parameters should be used + (void)type; + (void)validity; + + updated = TRUE; + } else { + mm_dbg("[%s:%d] Incoming call does not exist yet", __func__, __LINE__); + } + } + + return updated; +} + +gboolean mm_iface_modem_voice_network_hangup (MMIfaceModemVoice *self) +{ + gboolean updated = FALSE; + MMBaseCall *call = NULL; + MMCallList *list = NULL; + + g_object_get (MM_BASE_MODEM (self), + MM_IFACE_MODEM_VOICE_CALL_LIST, &list, + NULL); + + if( list ) { + + call = mm_call_list_get_first_non_terminated_call(list); + if( call ) { + //BASCETTA:TODO: Hang this call! + g_object_set (call, + "state", MM_CALL_STATE_TERMINATED, + "state-reason", MM_CALL_STATE_REASON_TERMINATED, + NULL); + mm_gdbus_call_set_state(MM_GDBUS_CALL (call), MM_CALL_STATE_TERMINATED); + mm_gdbus_call_set_state_reason(MM_GDBUS_CALL (call), MM_CALL_STATE_REASON_TERMINATED); + updated = TRUE; + + //BASCETTA:TODO: I have to signal state change... + + } else { + mm_dbg("[%s:%d] Incoming call does not exist yet", __func__, __LINE__); + } + } + + return updated; +} /*****************************************************************************/ typedef struct { |