diff options
Diffstat (limited to 'packages/gsm/files/025_sms-status-report.patch')
-rw-r--r-- | packages/gsm/files/025_sms-status-report.patch | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/packages/gsm/files/025_sms-status-report.patch b/packages/gsm/files/025_sms-status-report.patch new file mode 100644 index 0000000000..560e72e380 --- /dev/null +++ b/packages/gsm/files/025_sms-status-report.patch @@ -0,0 +1,133 @@ +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. + +PS. if you don't want to ask a status report, you can change this value +back. Replace "GSMD_SMS_TP_SRR_STATUS_REQUEST" with +"GSMD_SMS_TP_SRR_NOT_REQUEST". +header[pos ++] = + 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; + +Signed-off-by: Jim Huang <jserv@openmoko.org> +--- + src/gsmd/sms_pdu.c | 54 +++++++++++++++++++++++++++++++++++++++++++----------- + src/util/event.c | 6 +++++- + 2 files changed, 48 insertions(+), 12 deletions(-) + +Index: gsm/src/gsmd/sms_pdu.c +=================================================================== +--- gsm.orig/src/gsmd/sms_pdu.c 2007-09-06 11:14:34.000000000 +0800 ++++ gsm/src/gsmd/sms_pdu.c 2007-09-17 23:39:20.000000000 +0800 +@@ -139,6 +139,17 @@ + /* 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 @@ + 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 @@ + 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; +Index: gsm/src/util/event.c +=================================================================== +--- gsm.orig/src/util/event.c 2007-09-06 11:14:34.000000000 +0800 ++++ gsm/src/util/event.c 2007-09-17 23:39:47.000000000 +0800 +@@ -128,8 +128,12 @@ + 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); |