diff options
author | Denis Kenzior <denkenz@gmail.com> | 2009-06-12 21:05:06 -0500 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2009-06-12 21:39:13 -0500 |
commit | f0954911a83b281680632b01b129c850901be7b2 (patch) | |
tree | 2cbed61a5ac1f01e6525b8e30fb04be03bc2aa34 /src/smsutil.c | |
parent | b08c403815fee2e436e06946cad59cb0499ff3e9 (diff) | |
download | ofono-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.c | 72 |
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 */ |