Add sms_extract_common function
authorDenis Kenzior <denkenz@gmail.com>
Sat, 13 Jun 2009 02:05:06 +0000 (21:05 -0500)
committerDenis Kenzior <denkenz@gmail.com>
Sat, 13 Jun 2009 02:39:13 +0000 (21:39 -0500)
Extract common attributes from the various SMS types

src/smsutil.c
src/smsutil.h

index abf6419..725e409 100644 (file)
@@ -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 */
index caf4ab4..71c88af 100644 (file)
@@ -330,6 +330,9 @@ gboolean sms_encode(const struct sms *in, int *len, int *tpdu_len,
 int sms_udl_in_bytes(guint8 ud_len, guint8 dcs);
 
 time_t sms_scts_to_time(const struct sms_scts *scts, struct tm *remote);
+const guint8 *sms_extract_common(const struct sms *sms, gboolean *out_udhi,
+                                       guint8 *out_dcs, guint8 *out_udl,
+                                       guint8 *out_max);
 
 gboolean sms_udh_iter_init(const struct sms *sms, struct sms_udh_iter *iter);
 enum sms_iei sms_udh_iter_get_ie_type(struct sms_udh_iter *iter);