From 222874299eb16cba8e71ff2b4152d364615f2235 Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Mon, 1 Jul 2019 15:21:18 +0200 Subject: [PATCH] api,call: new Deflect() method This method allows deflecting an incoming or waiting call to a different number. --- cli/mmcli-call.c | 65 +++++++++- .../libmm-glib/libmm-glib-sections.txt | 7 ++ include/ModemManager-enums.h | 2 + .../org.freedesktop.ModemManager1.Call.xml | 15 +++ libmm-glib/mm-call.c | 85 ++++++++++++++ libmm-glib/mm-call.h | 15 +++ src/mm-base-call.c | 111 ++++++++++++++++++ src/mm-base-call.h | 9 ++ 8 files changed, 304 insertions(+), 5 deletions(-) diff --git a/cli/mmcli-call.c b/cli/mmcli-call.c index a871dbc0..83a0c017 100644 --- a/cli/mmcli-call.c +++ b/cli/mmcli-call.c @@ -46,11 +46,12 @@ typedef struct { static Context *ctx; /* Options */ -static gboolean info_flag; /* set when no action found */ -static gboolean start_flag; -static gboolean accept_flag; -static gboolean hangup_flag; -static gchar *dtmf_request; +static gboolean info_flag; /* set when no action found */ +static gboolean start_flag; +static gboolean accept_flag; +static gchar *deflect_str; +static gboolean hangup_flag; +static gchar *dtmf_request; static GOptionEntry entries[] = { { "start", 0, 0, G_OPTION_ARG_NONE, &start_flag, @@ -61,6 +62,10 @@ static GOptionEntry entries[] = { "Accept the incoming call", NULL, }, + { "deflect", 0, 0, G_OPTION_ARG_STRING, &deflect_str, + "Deflect the incoming call", + "[NUMBER]", + }, { "hangup", 0, 0, G_OPTION_ARG_NONE, &hangup_flag, "Hang up the call", NULL, @@ -99,6 +104,7 @@ mmcli_call_options_enabled (void) n_actions = (start_flag + accept_flag + + !!deflect_str + hangup_flag + !!dtmf_request); @@ -227,6 +233,33 @@ accept_ready (MMCall *call, mmcli_async_operation_done (); } +static void +deflect_process_reply (gboolean result, + const GError *error) +{ + if (!result) { + g_printerr ("error: couldn't deflect the call: '%s'\n", + error ? error->message : "unknown error"); + exit (EXIT_FAILURE); + } + + g_print ("successfully deflected the call\n"); +} + +static void +deflect_ready (MMCall *call, + GAsyncResult *result, + gpointer nothing) +{ + gboolean operation_result; + GError *error = NULL; + + operation_result = mm_call_deflect_finish (call, result, &error); + deflect_process_reply (operation_result, error); + + mmcli_async_operation_done (); +} + static void hangup_process_reply (gboolean result, const GError *error) @@ -313,6 +346,16 @@ get_call_ready (GObject *source, return; } + /* Requesting to deflect the call? */ + if (deflect_str) { + mm_call_deflect (ctx->call, + deflect_str, + ctx->cancellable, + (GAsyncReadyCallback)deflect_ready, + NULL); + return; + } + /* Requesting to hangup the call? */ if (hangup_flag) { mm_call_hangup (ctx->call, @@ -398,6 +441,18 @@ mmcli_call_run_synchronous (GDBusConnection *connection) return; } + /* Requesting to deflect the call? */ + if (deflect_str) { + gboolean operation_result; + + operation_result = mm_call_deflect_sync (ctx->call, + deflect_str, + NULL, + &error); + deflect_process_reply (operation_result, error); + return; + } + /* Requesting to hangup the call? */ if (hangup_flag) { gboolean operation_result; diff --git a/docs/reference/libmm-glib/libmm-glib-sections.txt b/docs/reference/libmm-glib/libmm-glib-sections.txt index b1727913..5daaff5c 100644 --- a/docs/reference/libmm-glib/libmm-glib-sections.txt +++ b/docs/reference/libmm-glib/libmm-glib-sections.txt @@ -1345,6 +1345,9 @@ mm_call_hangup_sync mm_call_send_dtmf mm_call_send_dtmf_finish mm_call_send_dtmf_sync +mm_call_deflect +mm_call_deflect_finish +mm_call_deflect_sync MMCallClass MMCallPrivate @@ -3256,6 +3259,9 @@ mm_gdbus_call_call_hangup_sync mm_gdbus_call_call_send_dtmf mm_gdbus_call_call_send_dtmf_finish mm_gdbus_call_call_send_dtmf_sync +mm_gdbus_call_call_deflect +mm_gdbus_call_call_deflect_finish +mm_gdbus_call_call_deflect_sync mm_gdbus_call_set_direction mm_gdbus_call_set_number @@ -3267,6 +3273,7 @@ mm_gdbus_call_complete_accept mm_gdbus_call_complete_hangup mm_gdbus_call_complete_send_dtmf mm_gdbus_call_complete_start +mm_gdbus_call_complete_deflect mm_gdbus_call_interface_info mm_gdbus_call_override_properties mm_gdbus_call_emit_dtmf_received diff --git a/include/ModemManager-enums.h b/include/ModemManager-enums.h index 15d701e2..f84eafc2 100644 --- a/include/ModemManager-enums.h +++ b/include/ModemManager-enums.h @@ -1387,6 +1387,7 @@ typedef enum { /*< underscore_name=mm_call_state >*/ * @MM_CALL_STATE_REASON_ERROR: Wrong number or generic network error. * @MM_CALL_STATE_REASON_AUDIO_SETUP_FAILED: Error setting up audio channel. * @MM_CALL_STATE_REASON_TRANSFERRED: Call has been transferred. Since 1.12. + * @MM_CALL_STATE_REASON_DEFLECTED: Call has been deflected to a new number. Since 1.12. * * Reason for the state change in the call. */ @@ -1400,6 +1401,7 @@ typedef enum { /*< underscore_name=mm_call_state_reason >*/ MM_CALL_STATE_REASON_ERROR = 6, MM_CALL_STATE_REASON_AUDIO_SETUP_FAILED = 7, MM_CALL_STATE_REASON_TRANSFERRED = 8, + MM_CALL_STATE_REASON_DEFLECTED = 9, } MMCallStateReason; /** diff --git a/introspection/org.freedesktop.ModemManager1.Call.xml b/introspection/org.freedesktop.ModemManager1.Call.xml index f53f5b7b..0f704f2f 100644 --- a/introspection/org.freedesktop.ModemManager1.Call.xml +++ b/introspection/org.freedesktop.ModemManager1.Call.xml @@ -37,6 +37,21 @@ --> + + + + +