diff options
author | Guido Günther <agx@sigxcpu.org> | 2011-01-14 12:25:05 -0600 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2011-01-14 12:25:05 -0600 |
commit | d44ae44558b9d1da289372e8593263c7d2b025c8 (patch) | |
tree | 8be2571fe449fc872025dd7039f83c9133081d14 | |
parent | 807120996f2eb9e3ddcac5ba6f9826feac440175 (diff) |
gsm: wire up USSD Respond function (bgo #638038)
-rw-r--r-- | src/mm-generic-gsm.c | 68 | ||||
-rw-r--r-- | src/mm-modem-gsm-ussd.c | 77 | ||||
-rw-r--r-- | src/mm-modem-gsm-ussd.h | 10 |
3 files changed, 132 insertions, 23 deletions
diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c index 7f28dd5c..9e898198 100644 --- a/src/mm-generic-gsm.c +++ b/src/mm-generic-gsm.c @@ -3830,10 +3830,10 @@ ussd_update_state (MMGenericGsm *self, MMModemGsmUssdState new_state) } static void -ussd_initiate_done (MMAtSerialPort *port, - GString *response, - GError *error, - gpointer user_data) +ussd_send_done (MMAtSerialPort *port, + GString *response, + GError *error, + gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; MMGenericGsmPrivate *priv; @@ -3860,10 +3860,7 @@ ussd_initiate_done (MMAtSerialPort *port, case 0: /* no further action required */ ussd_state = MM_MODEM_GSM_USSD_STATE_IDLE; break; - case 1: /* Not an error but not yet implemented */ - info->error = g_error_new (MM_MODEM_ERROR, - MM_MODEM_ERROR_GENERAL, - "Further action required."); + case 1: /* further action required */ ussd_state = MM_MODEM_GSM_USSD_STATE_USER_RESPONSE; break; case 2: @@ -3919,10 +3916,10 @@ done: } static void -ussd_initiate (MMModemGsmUssd *modem, - const char *command, - MMModemStringFn callback, - gpointer user_data) +ussd_send (MMModemGsmUssd *modem, + const char *command, + MMModemStringFn callback, + gpointer user_data) { MMCallbackInfo *info; char *atc_command; @@ -3947,13 +3944,57 @@ ussd_initiate (MMModemGsmUssd *modem, atc_command = g_strdup_printf ("+CUSD=1,\"%s\",15", hex); g_free (hex); - mm_at_serial_port_queue_command (port, atc_command, 10, ussd_initiate_done, info); + mm_at_serial_port_queue_command (port, atc_command, 10, ussd_send_done, info); g_free (atc_command); ussd_update_state (MM_GENERIC_GSM (modem), MM_MODEM_GSM_USSD_STATE_ACTIVE); } static void +ussd_initiate (MMModemGsmUssd *modem, + const char *command, + MMModemStringFn callback, + gpointer user_data) +{ + MMCallbackInfo *info; + MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (modem); + info = mm_callback_info_string_new (MM_MODEM (modem), callback, user_data); + + if (priv->ussd_state != MM_MODEM_GSM_USSD_STATE_IDLE) { + info->error = g_error_new (MM_MODEM_ERROR, + MM_MODEM_ERROR_GENERAL, + "USSD session already active."); + mm_callback_info_schedule (info); + return; + } + + ussd_send (modem, command, callback, user_data); + return; +} + +static void +ussd_respond (MMModemGsmUssd *modem, + const char *command, + MMModemStringFn callback, + gpointer user_data) +{ + MMCallbackInfo *info; + MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (modem); + info = mm_callback_info_string_new (MM_MODEM (modem), callback, user_data); + + if (priv->ussd_state != MM_MODEM_GSM_USSD_STATE_USER_RESPONSE) { + info->error = g_error_new (MM_MODEM_ERROR, + MM_MODEM_ERROR_GENERAL, + "No active USSD session, cannot respond."); + mm_callback_info_schedule (info); + return; + } + + ussd_send (modem, command, callback, user_data); + return; +} + +static void ussd_cancel_done (MMAtSerialPort *port, GString *response, GError *error, @@ -4633,6 +4674,7 @@ static void modem_gsm_ussd_init (MMModemGsmUssd *class) { class->initiate = ussd_initiate; + class->respond = ussd_respond; class->cancel = ussd_cancel; } diff --git a/src/mm-modem-gsm-ussd.c b/src/mm-modem-gsm-ussd.c index def22134..f90a8458 100644 --- a/src/mm-modem-gsm-ussd.c +++ b/src/mm-modem-gsm-ussd.c @@ -106,6 +106,23 @@ mm_modem_gsm_ussd_initiate (MMModemGsmUssd *self, } void +mm_modem_gsm_ussd_respond (MMModemGsmUssd *self, + const char *command, + MMModemStringFn callback, + gpointer user_data) +{ + g_return_if_fail (MM_IS_MODEM_GSM_USSD (self)); + g_return_if_fail (command != NULL); + g_return_if_fail (callback != NULL); + + if (MM_MODEM_GSM_USSD_GET_INTERFACE (self)->respond) + MM_MODEM_GSM_USSD_GET_INTERFACE (self)->respond(self, command, callback, user_data); + else + str_call_not_supported (self, callback, user_data); + +} + +void mm_modem_gsm_ussd_cancel (MMModemGsmUssd *self, MMModemFn callback, gpointer user_data) @@ -149,16 +166,6 @@ ussd_auth_info_new (const char* command) /*****************************************************************************/ static void -impl_modem_gsm_ussd_respond (MMModemGsmUssd *modem, - const char *responste, - DBusGMethodInvocation *context) -{ - async_call_not_supported (modem, async_call_done, context); -} - -/*****************************************************************************/ - -static void ussd_initiate_auth_cb (MMAuthRequest *req, GObject *owner, DBusGMethodInvocation *context, @@ -209,6 +216,56 @@ impl_modem_gsm_ussd_initiate (MMModemGsmUssd *modem, } static void +ussd_respond_auth_cb (MMAuthRequest *req, + GObject *owner, + DBusGMethodInvocation *context, + gpointer user_data) +{ + MMModemGsmUssd *self = MM_MODEM_GSM_USSD (owner); + UssdAuthInfo *info = user_data; + GError *error = NULL; + + /* Return any authorization error, otherwise respond to the USSD */ + if (!mm_modem_auth_finish (MM_MODEM (self), req, &error)) + goto done; + + if (!info->command) { + error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_GENERAL, + "Missing USSD command"); + } + +done: + if (error) { + str_call_done (MM_MODEM (self), NULL, error, context); + g_error_free (error); + } else + mm_modem_gsm_ussd_respond (self, info->command, str_call_done, context); +} + +static void +impl_modem_gsm_ussd_respond (MMModemGsmUssd *modem, + const char *command, + DBusGMethodInvocation *context) +{ + GError *error = NULL; + UssdAuthInfo *info; + + info = ussd_auth_info_new (command); + + /* Make sure the caller is authorized to respond to the USSD */ + if (!mm_modem_auth_request (MM_MODEM (modem), + MM_AUTHORIZATION_USSD, + context, + ussd_respond_auth_cb, + info, + ussd_auth_info_destroy, + &error)) { + dbus_g_method_return_error (context, error); + g_error_free (error); + } +} + +static void ussd_cancel_auth_cb (MMAuthRequest *req, GObject *owner, DBusGMethodInvocation *context, diff --git a/src/mm-modem-gsm-ussd.h b/src/mm-modem-gsm-ussd.h index d0da59be..c8f652b9 100644 --- a/src/mm-modem-gsm-ussd.h +++ b/src/mm-modem-gsm-ussd.h @@ -46,6 +46,11 @@ struct _MMModemGsmUssd { MMModemStringFn callback, gpointer user_data); + void (*respond) (MMModemGsmUssd *modem, + const char *command, + MMModemStringFn callback, + gpointer user_data); + void (*cancel) (MMModemGsmUssd *modem, MMModemFn callback, gpointer user_data); @@ -58,6 +63,11 @@ void mm_modem_gsm_ussd_initiate (MMModemGsmUssd *self, MMModemStringFn callback, gpointer user_data); +void mm_modem_gsm_ussd_respond (MMModemGsmUssd *self, + const char *command, + MMModemStringFn callback, + gpointer user_data); + void mm_modem_gsm_ussd_cancel (MMModemGsmUssd *self, MMModemFn callback, gpointer user_data); |