gsm: wire up USSD Respond function (bgo #638038)

This commit is contained in:
Guido Günther
2011-01-14 12:25:05 -06:00
committed by Dan Williams
parent 807120996f
commit d44ae44558
3 changed files with 132 additions and 23 deletions

View File

@@ -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,12 +3944,56 @@ 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,
@@ -4633,6 +4674,7 @@ static void
modem_gsm_ussd_init (MMModemGsmUssd *class)
{
class->initiate = ussd_initiate;
class->respond = ussd_respond;
class->cancel = ussd_cancel;
}

View File

@@ -105,6 +105,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,
@@ -148,16 +165,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,
@@ -208,6 +215,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,

View File

@@ -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);