diff options
| author | jserv <jserv@99fdad57-331a-0410-800a-d7fa5415bdb3> | 2007-10-17 06:10:26 +0000 | 
|---|---|---|
| committer | jserv <jserv@99fdad57-331a-0410-800a-d7fa5415bdb3> | 2007-10-17 06:10:26 +0000 | 
| commit | 6a95defd8355634eabcacc088db4704d42499f1a (patch) | |
| tree | 8d22c61bc880813d07cb7e436323ef058515df47 /src | |
| parent | 370e88780fd9caf011bbfe79fe8f99810a34bf96 (diff) | |
SMS status report
From: Erin Yueh <erin_yueh@openmoko.com>
Subject: [PATCH] SMS status report
I made a patch for SMS status report. It can change SMS-Submit messages
and ask for a status report. When  the destination address receives our
message, the service center will send a SMS-STATUS-REPORT to us. We can
tell what messages we sent by TP-MR (message reference number) value and
can know the sending result by TP-ST (Status) value from status report
messages.
git-svn-id: http://svn.openmoko.org/trunk/src/target/gsm@3200 99fdad57-331a-0410-800a-d7fa5415bdb3
Diffstat (limited to 'src')
| -rw-r--r-- | src/gsmd/sms_pdu.c | 54 | ||||
| -rw-r--r-- | src/util/event.c | 6 | 
2 files changed, 48 insertions, 12 deletions
diff --git a/src/gsmd/sms_pdu.c b/src/gsmd/sms_pdu.c index 665fdcb..d1235dd 100644 --- a/src/gsmd/sms_pdu.c +++ b/src/gsmd/sms_pdu.c @@ -139,6 +139,17 @@ int sms_pdu_to_msg(struct gsmd_sms_list *dst,  		/* Skip TP-PID */  		len -= 9;  		src += 9; + +		/* TP-UDL */ +		dst->payload.length = src[0]; +		i = sms_data_bytelen(dst->payload.coding_scheme, src[0]); + +		/* TP-UD */ +		if (len < 1 + i || i > GSMD_SMS_DATA_MAXLEN) +			return 1; +		memcpy(dst->payload.data, src + 1, i); +		dst->payload.data[i] = 0; +  		break;  	case GSMD_SMS_TP_MTI_SUBMIT:  		if (len < 4) @@ -179,23 +190,44 @@ int sms_pdu_to_msg(struct gsmd_sms_list *dst,  		src += vpf ? 3 : 2;  		memset(dst->time_stamp, 0, 7); + +		/* TP-UDL */ +		dst->payload.length = src[0]; +		i = sms_data_bytelen(dst->payload.coding_scheme, src[0]); + +		/* TP-UD */ +		if (len < 1 + i || i > GSMD_SMS_DATA_MAXLEN) +			return 1; +		memcpy(dst->payload.data, src + 1, i); +		dst->payload.data[i] = 0;  		break;  	case GSMD_SMS_TP_MTI_STATUS_REPORT: -		/* TODO */ +		if (len < 3) +			return 1; + +		/* TP-MR set it gsmd_sms_list.index*/ +		dst->index = (int) src[1]; +		/* TP-STATUS set it to coding_scheme */ +		dst->payload.coding_scheme = (int) src[len-1]; +		/* TP-RA */ +		i = sms_number_bytelen(src[3], src[2]); +		if (len < 13 + i) +			return 1; +		if (sms_address2ascii(&dst->addr, src + 2)) +			return 1; +		len -= 4 + i; +		src += 4 + i; +		/* TP-SCTS */ +		memcpy(dst->time_stamp, src, 7); +		/* TP-UD  */ +		dst->payload.length = 0; +		dst->payload.data[0] = 0; +		break;  	default:  		/* Unknown PDU type */  		return 1;  	} -	/* TP-UDL */ -	dst->payload.length = src[0]; -	i = sms_data_bytelen(dst->payload.coding_scheme, src[0]); - -	/* TP-UD */ -	if (len < 1 + i || i > GSMD_SMS_DATA_MAXLEN) -		return 1; -	memcpy(dst->payload.data, src + 1, i); -	dst->payload.data[i] = 0;  	return 0;  } @@ -215,7 +247,7 @@ int sms_pdu_make_smssubmit(char *dest, const struct gsmd_sms_submit *src)  		GSMD_SMS_TP_MTI_SUBMIT |  		(0 << 2) |		/* Reject Duplicates: 0 */  		GSMD_SMS_TP_VPF_NOT_PRESENT | -		GSMD_SMS_TP_SRR_NOT_REQUEST | +		GSMD_SMS_TP_SRR_STATUS_REQUEST |  		(src->payload.has_header ? GSMD_SMS_TP_UDHI_WITH_HEADER :  		 GSMD_SMS_TP_UDHI_NO_HEADER) |  		GSMD_SMS_TP_RP_NOT_SET; diff --git a/src/util/event.c b/src/util/event.c index ea8ad3b..ea0dcb4 100644 --- a/src/util/event.c +++ b/src/util/event.c @@ -128,8 +128,12 @@ static int incbm_handler(struct lgsm_handle *lh, int evt,  static int inds_handler(struct lgsm_handle *lh, int evt,  		struct gsmd_evt_auxdata *aux)  { -	if (aux->u.ds.inlined) +	if (aux->u.ds.inlined) { +		struct gsmd_sms_list *sms; +		sms = (struct gsmd_sms_list *) aux->data;  		printf("EVENT: Incoming Status Report\n"); +		printf("message ref = %d, status = %d\n", sms->index,sms->payload.coding_scheme); +	}  	else  		printf("EVENT: Incoming Status Report stored at location %i\n",  				aux->u.ds.index);  | 
