gsm: wire up USSD Respond function (bgo #638038)
This commit is contained in:

committed by
Dan Williams

parent
807120996f
commit
d44ae44558
@@ -3830,10 +3830,10 @@ ussd_update_state (MMGenericGsm *self, MMModemGsmUssdState new_state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ussd_initiate_done (MMAtSerialPort *port,
|
ussd_send_done (MMAtSerialPort *port,
|
||||||
GString *response,
|
GString *response,
|
||||||
GError *error,
|
GError *error,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
MMCallbackInfo *info = (MMCallbackInfo *) user_data;
|
MMCallbackInfo *info = (MMCallbackInfo *) user_data;
|
||||||
MMGenericGsmPrivate *priv;
|
MMGenericGsmPrivate *priv;
|
||||||
@@ -3860,10 +3860,7 @@ ussd_initiate_done (MMAtSerialPort *port,
|
|||||||
case 0: /* no further action required */
|
case 0: /* no further action required */
|
||||||
ussd_state = MM_MODEM_GSM_USSD_STATE_IDLE;
|
ussd_state = MM_MODEM_GSM_USSD_STATE_IDLE;
|
||||||
break;
|
break;
|
||||||
case 1: /* Not an error but not yet implemented */
|
case 1: /* further action required */
|
||||||
info->error = g_error_new (MM_MODEM_ERROR,
|
|
||||||
MM_MODEM_ERROR_GENERAL,
|
|
||||||
"Further action required.");
|
|
||||||
ussd_state = MM_MODEM_GSM_USSD_STATE_USER_RESPONSE;
|
ussd_state = MM_MODEM_GSM_USSD_STATE_USER_RESPONSE;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
@@ -3919,10 +3916,10 @@ done:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ussd_initiate (MMModemGsmUssd *modem,
|
ussd_send (MMModemGsmUssd *modem,
|
||||||
const char *command,
|
const char *command,
|
||||||
MMModemStringFn callback,
|
MMModemStringFn callback,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
MMCallbackInfo *info;
|
MMCallbackInfo *info;
|
||||||
char *atc_command;
|
char *atc_command;
|
||||||
@@ -3947,12 +3944,56 @@ ussd_initiate (MMModemGsmUssd *modem,
|
|||||||
atc_command = g_strdup_printf ("+CUSD=1,\"%s\",15", hex);
|
atc_command = g_strdup_printf ("+CUSD=1,\"%s\",15", hex);
|
||||||
g_free (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);
|
g_free (atc_command);
|
||||||
|
|
||||||
ussd_update_state (MM_GENERIC_GSM (modem), MM_MODEM_GSM_USSD_STATE_ACTIVE);
|
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
|
static void
|
||||||
ussd_cancel_done (MMAtSerialPort *port,
|
ussd_cancel_done (MMAtSerialPort *port,
|
||||||
GString *response,
|
GString *response,
|
||||||
@@ -4633,6 +4674,7 @@ static void
|
|||||||
modem_gsm_ussd_init (MMModemGsmUssd *class)
|
modem_gsm_ussd_init (MMModemGsmUssd *class)
|
||||||
{
|
{
|
||||||
class->initiate = ussd_initiate;
|
class->initiate = ussd_initiate;
|
||||||
|
class->respond = ussd_respond;
|
||||||
class->cancel = ussd_cancel;
|
class->cancel = ussd_cancel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
void
|
||||||
mm_modem_gsm_ussd_cancel (MMModemGsmUssd *self,
|
mm_modem_gsm_ussd_cancel (MMModemGsmUssd *self,
|
||||||
MMModemFn callback,
|
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
|
static void
|
||||||
ussd_initiate_auth_cb (MMAuthRequest *req,
|
ussd_initiate_auth_cb (MMAuthRequest *req,
|
||||||
GObject *owner,
|
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
|
static void
|
||||||
ussd_cancel_auth_cb (MMAuthRequest *req,
|
ussd_cancel_auth_cb (MMAuthRequest *req,
|
||||||
GObject *owner,
|
GObject *owner,
|
||||||
|
@@ -46,6 +46,11 @@ struct _MMModemGsmUssd {
|
|||||||
MMModemStringFn callback,
|
MMModemStringFn callback,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
|
|
||||||
|
void (*respond) (MMModemGsmUssd *modem,
|
||||||
|
const char *command,
|
||||||
|
MMModemStringFn callback,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
void (*cancel) (MMModemGsmUssd *modem,
|
void (*cancel) (MMModemGsmUssd *modem,
|
||||||
MMModemFn callback,
|
MMModemFn callback,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
@@ -58,6 +63,11 @@ void mm_modem_gsm_ussd_initiate (MMModemGsmUssd *self,
|
|||||||
MMModemStringFn callback,
|
MMModemStringFn callback,
|
||||||
gpointer user_data);
|
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,
|
void mm_modem_gsm_ussd_cancel (MMModemGsmUssd *self,
|
||||||
MMModemFn callback,
|
MMModemFn callback,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
|
Reference in New Issue
Block a user