summaryrefslogtreecommitdiffstats
path: root/src/smsutil.c
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2009-06-12 21:05:06 -0500
committerDenis Kenzior <denkenz@gmail.com>2009-06-12 21:39:13 -0500
commitf0954911a83b281680632b01b129c850901be7b2 (patch)
tree2cbed61a5ac1f01e6525b8e30fb04be03bc2aa34 /src/smsutil.c
parentb08c403815fee2e436e06946cad59cb0499ff3e9 (diff)
downloadofono-f0954911a83b281680632b01b129c850901be7b2.tar.bz2
Add sms_extract_common function
Extract common attributes from the various SMS types
Diffstat (limited to 'src/smsutil.c')
-rw-r--r--src/smsutil.c72
1 files changed, 57 insertions, 15 deletions
diff --git a/src/smsutil.c b/src/smsutil.c
index abf64195..725e409e 100644
--- a/src/smsutil.c
+++ b/src/smsutil.c
@@ -1438,67 +1438,109 @@ gboolean sms_decode(const unsigned char *pdu, int len, gboolean outgoing,
return FALSE;
}
-gboolean sms_udh_iter_init(const struct sms *sms, struct sms_udh_iter *iter)
+const guint8 *sms_extract_common(const struct sms *sms, gboolean *out_udhi,
+ guint8 *out_dcs, guint8 *out_udl,
+ guint8 *out_max)
{
- gboolean udhi = FALSE;
- const guint8 *hdr;
+ const guint8 *ud = NULL;
guint8 udl;
+ guint8 max;
+ gboolean udhi;
guint8 dcs;
- guint8 max_len;
- guint8 offset;
- guint8 max_offset;
switch (sms->type) {
case SMS_TYPE_DELIVER:
udhi = sms->deliver.udhi;
- hdr = sms->deliver.ud;
+ ud = sms->deliver.ud;
udl = sms->deliver.udl;
dcs = sms->deliver.dcs;
+ max = sizeof(sms->deliver.ud);
break;
case SMS_TYPE_DELIVER_REPORT_ACK:
udhi = sms->deliver_ack_report.udhi;
- hdr = sms->deliver_ack_report.ud;
+ ud = sms->deliver_ack_report.ud;
udl = sms->deliver_ack_report.udl;
dcs = sms->deliver_ack_report.dcs;
+ max = sizeof(sms->deliver_ack_report.ud);
break;
case SMS_TYPE_DELIVER_REPORT_ERROR:
udhi = sms->deliver_err_report.udhi;
- hdr = sms->deliver_err_report.ud;
+ ud = sms->deliver_err_report.ud;
udl = sms->deliver_err_report.udl;
dcs = sms->deliver_err_report.dcs;
+ max = sizeof(sms->deliver_err_report.ud);
break;
case SMS_TYPE_STATUS_REPORT:
udhi = sms->status_report.udhi;
- hdr = sms->status_report.ud;
+ ud = sms->status_report.ud;
udl = sms->status_report.udl;
dcs = sms->status_report.dcs;
+ max = sizeof(sms->status_report.ud);
break;
case SMS_TYPE_SUBMIT:
udhi = sms->submit.udhi;
- hdr = sms->submit.ud;
+ ud = sms->submit.ud;
udl = sms->submit.udl;
dcs = sms->submit.dcs;
+ max = sizeof(sms->submit.ud);
break;
case SMS_TYPE_SUBMIT_REPORT_ACK:
udhi = sms->submit_ack_report.udhi;
- hdr = sms->submit_ack_report.ud;
+ ud = sms->submit_ack_report.ud;
udl = sms->submit_ack_report.udl;
dcs = sms->submit_ack_report.dcs;
+ max = sizeof(sms->submit_ack_report.ud);
break;
case SMS_TYPE_SUBMIT_REPORT_ERROR:
udhi = sms->submit_err_report.udhi;
- hdr = sms->submit_err_report.ud;
+ ud = sms->submit_err_report.ud;
udl = sms->submit_err_report.udl;
dcs = sms->submit_err_report.dcs;
+ max = sizeof(sms->submit_err_report.ud);
break;
case SMS_TYPE_COMMAND:
udhi = sms->command.udhi;
- hdr = sms->command.cd;
+ ud = sms->command.cd;
udl = sms->command.cdl;
dcs = 0;
+ max = sizeof(sms->command.cd);
break;
};
+ if (!ud)
+ return NULL;
+
+ if (out_udhi)
+ *out_udhi = udhi;
+
+ if (out_dcs)
+ *out_dcs = dcs;
+
+ if (out_udl)
+ *out_udl = udl;
+
+ if (out_max)
+ *out_max = max;
+
+ return ud;
+}
+
+gboolean sms_udh_iter_init(const struct sms *sms, struct sms_udh_iter *iter)
+{
+ gboolean udhi = FALSE;
+ const guint8 *hdr;
+ guint8 udl;
+ guint8 dcs;
+ guint8 max_len;
+ guint8 offset;
+ guint8 max_offset;
+ guint8 max_ud_len;
+
+ hdr = sms_extract_common(sms, &udhi, &dcs, &udl, &max_ud_len);
+
+ if (!hdr)
+ return FALSE;
+
if (!udhi)
return FALSE;
@@ -1511,7 +1553,7 @@ gboolean sms_udh_iter_init(const struct sms *sms, struct sms_udh_iter *iter)
if (max_len < 3)
return FALSE;
- if (max_len > 140)
+ if (max_len > max_ud_len)
return FALSE;
/* Must have at least one information-element if udhi is true */