From c713c2c5f9ef8b1e674833932e9b91fbcca97050 Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Thu, 27 Jun 2019 14:03:19 +0200 Subject: [PATCH] api,voice: new HoldAndAccept() method This method will put the currently active call on hold, and right away accept the next available call. The user of the API does not need to specify explicitly which is the next call to accept, because that is decided automatically: * If there is any waiting call, it will accept it right away. * If there is no waiting call but there is a held call, it will make the held call active again. --- cli/mmcli-modem-voice.c | 49 ++++++ .../libmm-glib/libmm-glib-sections.txt | 7 + ....freedesktop.ModemManager1.Modem.Voice.xml | 17 ++ libmm-glib/mm-modem-voice.c | 79 ++++++++++ libmm-glib/mm-modem-voice.h | 11 ++ src/mm-iface-modem-voice.c | 146 ++++++++++++++++++ src/mm-iface-modem-voice.h | 8 + 7 files changed, 317 insertions(+) diff --git a/cli/mmcli-modem-voice.c b/cli/mmcli-modem-voice.c index f1d24e16..e1f1426a 100644 --- a/cli/mmcli-modem-voice.c +++ b/cli/mmcli-modem-voice.c @@ -50,6 +50,7 @@ static Context *ctx; static gboolean list_flag; static gchar *create_str; static gchar *delete_str; +static gboolean hold_and_accept_flag; static gboolean hangup_and_accept_flag; static GOptionEntry entries[] = { @@ -65,6 +66,10 @@ static GOptionEntry entries[] = { "Delete a call from a given modem", "[PATH|INDEX]" }, + { "voice-hold-and-accept", 0, 0, G_OPTION_ARG_NONE, &hold_and_accept_flag, + "Places all active calls in hold and accepts the next waiting or held call", + NULL + }, { "voice-hangup-and-accept", 0, 0, G_OPTION_ARG_NONE, &hangup_and_accept_flag, "Hangs up all active calls and accepts the next waiting or held call", NULL @@ -99,6 +104,7 @@ mmcli_modem_voice_options_enabled (void) n_actions = (list_flag + !!create_str + !!delete_str + + hold_and_accept_flag + hangup_and_accept_flag); if (n_actions > 1) { @@ -206,6 +212,31 @@ hangup_and_accept_ready (MMModemVoice *modem, mmcli_async_operation_done (); } +static void +hold_and_accept_process_reply (const GError *error) +{ + if (error) { + g_printerr ("error: couldn't hold and accept: '%s'\n", + error->message); + exit (EXIT_FAILURE); + } + + g_print ("operation successful\n"); +} + +static void +hold_and_accept_ready (MMModemVoice *modem, + GAsyncResult *result, + gpointer nothing) +{ + GError *error = NULL; + + mm_modem_voice_hold_and_accept_finish (modem, result, &error); + hold_and_accept_process_reply (error); + + mmcli_async_operation_done (); +} + static void list_process_reply (GList *result, const GError *error) @@ -365,6 +396,16 @@ get_modem_ready (GObject *source, return; } + /* Request to hold and accept? */ + if (hold_and_accept_flag) { + g_debug ("Asynchronously holding and accepting next call..."); + mm_modem_voice_hold_and_accept (ctx->modem_voice, + ctx->cancellable, + (GAsyncReadyCallback)hold_and_accept_ready, + NULL); + return; + } + /* Request to hangup and accept? */ if (hangup_and_accept_flag) { g_debug ("Asynchronously hanging up and accepting next call..."); @@ -471,6 +512,14 @@ mmcli_modem_voice_run_synchronous (GDBusConnection *connection) return; } + /* Request to hold and accept? */ + if (hold_and_accept_flag) { + g_debug ("Synchronously holding and accepting call..."); + mm_modem_voice_hold_and_accept_sync (ctx->modem_voice, NULL, &error); + hold_and_accept_process_reply (error); + return; + } + /* Request to hangup and accept? */ if (hangup_and_accept_flag) { g_debug ("Synchronously hanging up and accepting call..."); diff --git a/docs/reference/libmm-glib/libmm-glib-sections.txt b/docs/reference/libmm-glib/libmm-glib-sections.txt index 65ba689d..a2087f38 100644 --- a/docs/reference/libmm-glib/libmm-glib-sections.txt +++ b/docs/reference/libmm-glib/libmm-glib-sections.txt @@ -1015,6 +1015,9 @@ mm_modem_voice_list_calls_sync mm_modem_voice_hangup_and_accept mm_modem_voice_hangup_and_accept_finish mm_modem_voice_hangup_and_accept_sync +mm_modem_voice_hold_and_accept +mm_modem_voice_hold_and_accept_finish +mm_modem_voice_hold_and_accept_sync MMModemVoiceClass MMModemVoicePrivate @@ -2841,6 +2844,9 @@ mm_gdbus_modem_voice_call_list_calls_sync mm_gdbus_modem_voice_call_hangup_and_accept mm_gdbus_modem_voice_call_hangup_and_accept_finish mm_gdbus_modem_voice_call_hangup_and_accept_sync +mm_gdbus_modem_voice_call_hold_and_accept +mm_gdbus_modem_voice_call_hold_and_accept_finish +mm_gdbus_modem_voice_call_hold_and_accept_sync mm_gdbus_modem_voice_set_calls mm_gdbus_modem_voice_emit_call_added @@ -2849,6 +2855,7 @@ mm_gdbus_modem_voice_complete_create_call mm_gdbus_modem_voice_complete_delete_call mm_gdbus_modem_voice_complete_list_calls mm_gdbus_modem_voice_complete_hangup_and_accept +mm_gdbus_modem_voice_complete_hold_and_accept mm_gdbus_modem_voice_interface_info mm_gdbus_modem_voice_override_properties diff --git a/introspection/org.freedesktop.ModemManager1.Modem.Voice.xml b/introspection/org.freedesktop.ModemManager1.Modem.Voice.xml index 37b70260..b6c16f13 100644 --- a/introspection/org.freedesktop.ModemManager1.Modem.Voice.xml +++ b/introspection/org.freedesktop.ModemManager1.Modem.Voice.xml @@ -63,6 +63,23 @@ + + +