summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/stkutil.c57
-rw-r--r--src/stkutil.h7
2 files changed, 64 insertions, 0 deletions
diff --git a/src/stkutil.c b/src/stkutil.c
index f3610d89..9d25143a 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -4428,6 +4428,38 @@ static gboolean build_dataobj_last_envelope(struct stk_tlv_builder *tlv,
stk_tlv_builder_close_container(tlv);
}
+/* Described in TS 102.223 Section 8.88 */
+static gboolean build_dataobj_registry_application_data(
+ struct stk_tlv_builder *tlv,
+ const void *data, gboolean cr)
+{
+ const struct stk_registry_application_data *rad = data;
+ unsigned char tag = STK_DATA_OBJECT_TYPE_REGISTRY_APPLICATION_DATA;
+ guint8 dcs, *name;
+ gsize len;
+ long gsmlen;
+
+ name = convert_utf8_to_gsm(rad->name, -1, NULL, &gsmlen, 0);
+ len = gsmlen;
+ dcs = 0x04;
+ if (name == NULL) {
+ name = (guint8 *) g_convert((const gchar *) rad->name, -1,
+ "UCS-2BE", "UTF-8//TRANSLIT",
+ NULL, &len, NULL);
+ dcs = 0x08;
+
+ if (name == NULL)
+ return FALSE;
+ }
+
+ return stk_tlv_builder_open_container(tlv, cr, tag, TRUE) &&
+ stk_tlv_builder_append_short(tlv, rad->port) &&
+ stk_tlv_builder_append_byte(tlv, dcs) &&
+ stk_tlv_builder_append_byte(tlv, rad->type) &&
+ stk_tlv_builder_append_bytes(tlv, name, len) &&
+ stk_tlv_builder_close_container(tlv);
+}
+
/* Described in TS 102.223 Section 8.90 */
static gboolean build_dataobj_broadcast_network_information(
struct stk_tlv_builder *tlv,
@@ -5068,6 +5100,28 @@ static gboolean build_envelope_event_download(struct stk_tlv_builder *builder,
}
}
+static gboolean build_envelope_terminal_apps(struct stk_tlv_builder *builder,
+ const struct stk_envelope *envelope)
+{
+ const struct stk_envelope_terminal_apps *ta = &envelope->terminal_apps;
+ int i;
+
+ if (build_dataobj(builder,
+ build_envelope_dataobj_device_ids,
+ DATAOBJ_FLAG_CR, envelope, NULL) == FALSE)
+ return FALSE;
+
+ for (i = 0; i < ta->count; i++)
+ if (build_dataobj(builder,
+ build_dataobj_registry_application_data,
+ 0, &ta->list[i], NULL) == FALSE)
+ return FALSE;
+
+ return build_dataobj(builder,
+ build_dataobj_last_envelope,
+ 0, &ta->last, NULL);
+}
+
const unsigned char *stk_pdu_from_envelope(const struct stk_envelope *envelope,
unsigned int *out_length)
{
@@ -5187,6 +5241,9 @@ const unsigned char *stk_pdu_from_envelope(const struct stk_envelope *envelope,
&envelope->mms_notification.last,
NULL);
break;
+ case STK_ENVELOPE_TYPE_TERMINAL_APP:
+ ok = build_envelope_terminal_apps(&builder, envelope);
+ break;
default:
return NULL;
};
diff --git a/src/stkutil.h b/src/stkutil.h
index dac8dcc1..eb59fed2 100644
--- a/src/stkutil.h
+++ b/src/stkutil.h
@@ -1452,6 +1452,12 @@ struct stk_envelope_mms_notification_download {
ofono_bool_t last;
};
+struct stk_envelope_terminal_apps {
+ struct stk_registry_application_data *list;
+ int count;
+ ofono_bool_t last;
+};
+
struct stk_envelope {
enum stk_envelope_type type;
enum stk_device_identity_type src;
@@ -1467,6 +1473,7 @@ struct stk_envelope {
struct stk_envelope_ussd_data_download ussd_data_download;
struct stk_envelope_mms_transfer_status mms_status;
struct stk_envelope_mms_notification_download mms_notification;
+ struct stk_envelope_terminal_apps terminal_apps;
};
};