summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndrzej Zaborowski <andrew.zaborowski@intel.com>2010-06-11 12:39:55 +0200
committerDenis Kenzior <denkenz@gmail.com>2010-06-15 12:36:31 -0500
commit6720f90e13756a98314a243ad25614c22dcc4d2a (patch)
tree9a7a49988c9110c6873e7a87e5f4e61311e3374e /src
parentdf8f6115ca30e564c90cb7c9ce487c054bfe47bc (diff)
downloadofono-6720f90e13756a98314a243ad25614c22dcc4d2a.tar.bz2
stkutil: Add MMS Transfer Status envelope builder
Diffstat (limited to 'src')
-rw-r--r--src/stkutil.c84
-rw-r--r--src/stkutil.h11
2 files changed, 95 insertions, 0 deletions
diff --git a/src/stkutil.c b/src/stkutil.c
index 2efd25a8..ada63daf 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -3589,6 +3589,43 @@ static gboolean build_dataobj_ussd_string(struct stk_tlv_builder *tlv,
stk_tlv_builder_close_container(tlv);
}
+/* Described in TS 102.223 Section 8.18 */
+static gboolean build_dataobj_file_list(struct stk_tlv_builder *tlv,
+ const void *data, gboolean cr)
+{
+ GSList *l = (void *) data;
+ const struct stk_file *file;
+ unsigned char tag = STK_DATA_OBJECT_TYPE_FILE_LIST;
+
+ if (stk_tlv_builder_open_container(tlv, cr, tag, TRUE) != TRUE)
+ return FALSE;
+
+ if (stk_tlv_builder_append_byte(tlv, g_slist_length(l)) != TRUE)
+ return FALSE;
+
+ for (; l; l = l->next) {
+ file = l->data;
+
+ if (stk_tlv_builder_append_bytes(tlv, file->file,
+ file->len) != TRUE)
+ return FALSE;
+ }
+
+ return stk_tlv_builder_close_container(tlv);
+}
+
+/* Shortcut for a single File element */
+static gboolean build_dataobj_file(struct stk_tlv_builder *tlv,
+ const void *data, gboolean cr)
+{
+ GSList l = {
+ .data = (void *) data,
+ .next = NULL,
+ };
+
+ return build_dataobj_file_list(tlv, &l, cr);
+}
+
/* Described in TS 102.223 Section 8.19 */
static gboolean build_dataobj_location_info(struct stk_tlv_builder *tlv,
const void *data, gboolean cr)
@@ -4319,6 +4356,40 @@ static gboolean build_dataobj_meid(struct stk_tlv_builder *tlv,
stk_tlv_builder_close_container(tlv);
}
+/* Described in TS 102.223 Section 8.83 */
+static gboolean build_dataobj_mms_id(struct stk_tlv_builder *tlv,
+ const void *data, gboolean cr)
+{
+ const struct stk_mms_id *id = data;
+ unsigned char tag = STK_DATA_OBJECT_TYPE_MMS_ID;
+
+ /* Assume the length is never 0 for a valid ID, however the whole
+ * data object's presence is conditional. */
+ if (id->len == 0)
+ return TRUE;
+
+ return stk_tlv_builder_open_container(tlv, cr, tag, FALSE) &&
+ stk_tlv_builder_append_bytes(tlv, id->id, id->len) &&
+ stk_tlv_builder_close_container(tlv);
+}
+
+/* Described in TS 102.223 Section 8.84 */
+static gboolean build_dataobj_mms_transfer_status(struct stk_tlv_builder *tlv,
+ const void *data, gboolean cr)
+{
+ const struct stk_mms_transfer_status *mts = data;
+ unsigned char tag = STK_DATA_OBJECT_TYPE_MMS_TRANSFER_STATUS;
+
+ /* Assume the length is never 0 for a valid Result message, however
+ * the whole data object's presence is conditional. */
+ if (mts->len == 0)
+ return TRUE;
+
+ return stk_tlv_builder_open_container(tlv, cr, tag, FALSE) &&
+ stk_tlv_builder_append_bytes(tlv, mts->status, mts->len) &&
+ stk_tlv_builder_close_container(tlv);
+}
+
/* Described in TS 131.111 Section 8.84 */
static gboolean build_dataobj_i_wlan_access_status(struct stk_tlv_builder *tlv,
const void *data, gboolean cr)
@@ -5065,6 +5136,19 @@ const unsigned char *stk_pdu_from_envelope(const struct stk_envelope *envelope,
&envelope->ussd_data_download.string,
NULL);
break;
+ case STK_ENVELOPE_TYPE_MMS_TRANSFER_STATUS:
+ ok = build_dataobj(&builder,
+ build_envelope_dataobj_device_ids,
+ DATAOBJ_FLAG_CR,
+ envelope,
+ build_dataobj_file, DATAOBJ_FLAG_CR,
+ &envelope->mms_status.transfer_file,
+ build_dataobj_mms_id, 0,
+ &envelope->mms_status.id,
+ build_dataobj_mms_transfer_status, 0,
+ &envelope->mms_status.transfer_status,
+ NULL);
+ break;
default:
return NULL;
};
diff --git a/src/stkutil.h b/src/stkutil.h
index 74ec6009..fdc79ed0 100644
--- a/src/stkutil.h
+++ b/src/stkutil.h
@@ -32,6 +32,10 @@ enum stk_envelope_type {
STK_ENVELOPE_TYPE_EVENT_DOWNLOAD = 0xD6,
STK_ENVELOPE_TYPE_TIMER_EXPIRATION = 0xD7,
STK_ENVELOPE_TYPE_USSD_DOWNLOAD = 0xD9,
+ STK_ENVELOPE_TYPE_MMS_TRANSFER_STATUS = 0xDA,
+ STK_ENVELOPE_TYPE_MMS_NOTIFICATION = 0xDB,
+ STK_ENVELOPE_TYPE_TERMINAL_APP = 0xDC,
+ STK_ENVELOPE_TYPE_GEOLOCATION_REPORT = 0xDD,
};
/* TS 102.223 Section 9.4 */
@@ -1437,6 +1441,12 @@ struct stk_envelope_ussd_data_download {
struct stk_ussd_string string;
};
+struct stk_envelope_mms_transfer_status {
+ struct stk_file transfer_file;
+ struct stk_mms_id id;
+ struct stk_mms_transfer_status transfer_status;
+};
+
struct stk_envelope {
enum stk_envelope_type type;
enum stk_device_identity_type src;
@@ -1450,6 +1460,7 @@ struct stk_envelope {
struct stk_envelope_event_download event_download;
struct stk_envelope_timer_expiration timer_expiration;
struct stk_envelope_ussd_data_download ussd_data_download;
+ struct stk_envelope_mms_transfer_status mms_status;
};
};