summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Andreyev <aa13q@ya.ru>2021-02-19 15:47:42 +0300
committerDenis Kenzior <denkenz@gmail.com>2021-02-22 10:02:16 -0600
commitce86a6c207222fd5c42b53bc6c4a39c545f543de (patch)
tree38aba74c05fcb8633ad690114f8529f4d3d7aadd
parentcfcb6a7d9c44d55d09a64c16695b96407b71c6cc (diff)
downloadofono-ce86a6c207222fd5c42b53bc6c4a39c545f543de.tar.gz
qmimodem: Add USSD indication support
Handle USSD QMI indication messages. Add support for UCS2 USS Data coding scheme. Check for User Action TLV type.
-rw-r--r--drivers/qmimodem/ussd.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/drivers/qmimodem/ussd.c b/drivers/qmimodem/ussd.c
index 1e613032..e5399b9d 100644
--- a/drivers/qmimodem/ussd.c
+++ b/drivers/qmimodem/ussd.c
@@ -67,6 +67,12 @@ static int convert_qmi_dcs_gsm_dcs(int qmi_dcs, int *gsm_dcs)
case QMI_USSD_DCS_ASCII:
*gsm_dcs = USSD_DCS_8BIT;
break;
+ case QMI_USSD_DCS_8BIT:
+ *gsm_dcs = USSD_DCS_8BIT;
+ break;
+ case QMI_USSD_DCS_UCS2:
+ *gsm_dcs = USSD_DCS_UCS2;
+ break;
default:
return 1;
}
@@ -74,6 +80,41 @@ static int convert_qmi_dcs_gsm_dcs(int qmi_dcs, int *gsm_dcs)
return 0;
}
+static void async_ind(struct qmi_result *result, void *user_data)
+{
+ struct ofono_ussd *ussd = user_data;
+ const struct qmi_ussd_data *qmi_ussd;
+ uint8_t user_action_required = 0;
+ int notify_status = OFONO_USSD_STATUS_NOTIFY;
+ uint16_t len;
+ int gsm_dcs;
+
+ DBG("");
+
+ qmi_ussd = qmi_result_get(result, QMI_VOICE_PARAM_USSD_IND_DATA, &len);
+ if (qmi_ussd == NULL)
+ return;
+
+ if (validate_ussd_data(qmi_ussd, len))
+ goto error;
+
+ if (convert_qmi_dcs_gsm_dcs(qmi_ussd->dcs, &gsm_dcs))
+ goto error;
+
+ if (qmi_result_get_uint8(result, QMI_VOICE_PARAM_USSD_IND_USER_ACTION,
+ &user_action_required)) {
+ if (user_action_required == QMI_USSD_USER_ACTION_REQUIRED)
+ notify_status = OFONO_USSD_STATUS_ACTION_REQUIRED;
+ }
+
+ ofono_ussd_notify(ussd, notify_status, gsm_dcs,
+ qmi_ussd->data, qmi_ussd->length);
+ return;
+
+error:
+ ofono_ussd_notify(ussd, OFONO_USSD_STATUS_TERMINATED, 0, NULL, 0);
+}
+
static void async_orig_ind(struct qmi_result *result, void *user_data)
{
struct ofono_ussd *ussd = user_data;
@@ -141,6 +182,9 @@ static void create_voice_cb(struct qmi_service *service, void *user_data)
data->voice = qmi_service_ref(service);
+ qmi_service_register(data->voice, QMI_VOICE_USSD_IND,
+ async_ind, ussd, NULL);
+
qmi_service_register(data->voice, QMI_VOICE_ASYNC_ORIG_USSD,
async_orig_ind, ussd, NULL);