From be174b78167bf9f2b77901b4b318606144a5ae58 Mon Sep 17 00:00:00 2001 From: laforge Date: Fri, 17 Aug 2007 08:31:21 +0000 Subject: From: Andrzej Zaborowski Date: Fri, 27 Jul 2007 19:39:15 +0200 Subject: [PATCH] Cell Broadcast message decoding and presentation in libgsmd-tool. This time Cell Broadcast is tested to work, I should have made tests earlier. Now I'm correctly getting a CB message with the human readable name of the city and district when I'm connecting. In the previous patches the CB PDU was not being decoded at all. git-svn-id: http://svn.openmoko.org/trunk/src/target/gsm@2723 99fdad57-331a-0410-800a-d7fa5415bdb3 --- src/gsmd/sms_pdu.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) (limited to 'src/gsmd/sms_pdu.c') diff --git a/src/gsmd/sms_pdu.c b/src/gsmd/sms_pdu.c index c9b9327..665fdcb 100644 --- a/src/gsmd/sms_pdu.c +++ b/src/gsmd/sms_pdu.c @@ -26,6 +26,7 @@ #include #include +#include static int sms_number_bytelen(u_int8_t type, u_int8_t len) { @@ -50,7 +51,7 @@ static int sms_data_bytelen(u_int8_t data_coding_scheme, u_int8_t len) return 0; } -static int sms_address2ascii(struct gsmd_addr *dst, u_int8_t *src) +static int sms_address2ascii(struct gsmd_addr *dst, const u_int8_t *src) { int i; @@ -80,7 +81,7 @@ static int sms_address2ascii(struct gsmd_addr *dst, u_int8_t *src) } int sms_pdu_to_msg(struct gsmd_sms_list *dst, - u_int8_t *src, int pdulen, int len) + const u_int8_t *src, int pdulen, int len) { int i, vpf; if (len < 1 || len < 1 + src[0] + pdulen || pdulen < 1) @@ -200,7 +201,7 @@ int sms_pdu_to_msg(struct gsmd_sms_list *dst, } /* Refer to GSM 03.40 subclause 9.2.3.3, for SMS-SUBMIT */ -int sms_pdu_make_smssubmit(char *dest, struct gsmd_sms_submit *src) +int sms_pdu_make_smssubmit(char *dest, const struct gsmd_sms_submit *src) { /* FIXME: ALPHANUMERIC encoded addresses can be longer than 13B */ u_int8_t header[15 + GSMD_ADDR_MAXLEN]; @@ -259,3 +260,25 @@ int sms_pdu_make_smssubmit(char *dest, struct gsmd_sms_submit *src) return pos + len; } + +/* Refer to GSM 03.41 subclause 9.3 */ +int cbs_pdu_to_msg(struct gsmd_cbm *dst, u_int8_t *src, int pdulen, int len) +{ + if (len != pdulen || len != CBM_MAX_PDU_SIZE) + return 1; + + dst->serial.scope = (src[0] >> 6) & 3; + dst->serial.msg_code = ((src[0] << 4) | (src[1] >> 4)) & 0x3ff; + dst->serial.update_num = src[1] & 0xf; + + dst->msg_id = (src[2] << 8) | src[3]; + + dst->language = src[4] & 0xf; + dst->coding_scheme = ((src[4] >> 4) & 3) << 2; + + dst->pages = src[5] & 0xf; + dst->page = src[5] >> 4; + + memcpy(dst->data, src + 6, len - 6); + return 0; +} -- cgit v1.2.3