Michael Tung wrote:
Alright, I guess that would give me a
head start.
Would appreciate it. Will try to get the
rest of the code done.
What do you mean by modifying the UDH?
I'm not very
familiar with that. I thought DLRs through
GSM modems comes
as an unsolicited message to the modem
itself?
-----
Original Message -----
Sent:
Saturday, July 13, 2002 1:57 AM
Subject:
Re: at2 - support for DLR?
Michael Tung wrote:
Dear all,
Has anyone implemented a working DLR
support for at2?
Or anyone who can point me in the right way to do it?
I have implemented partial DLR support (SMSC_SUCCESS/FAIL) for AT2, and
willing to share the code - it you are interested in it. for acheiving
better support you need to modify the UDH, which shouldn't be too hard,
but I've yet to do that - low priority.
Ok, it's not that simple as Andrea pointed out. it shouldn't be hard to do if UDH is already set, but what if UDH has not been set ? setting it will require some of the space reserved for the SM itself, and if the SM is too large after setting the UDH, what then ?
anyway - here is the simple patch attached.
--
Oded Arbel
m-Wise mobile solutions
--- kannel-dev/gateway/gw/smsc_at2.c 2002-06-06 17:09:24.000000000 +0000
+++ gateway/gw/smsc_at2.c 2002-07-15 12:53:27.000000000 +0000
@@ -1438,6 +1454,7 @@
int ret = -1;
char sc[3];
int retries = RETRY_SEND;
+ Octstr* dlrmsgid = NULL; // message id for DLR
if (octstr_len(privdata->my_number)) {
octstr_destroy(msg->sms.sender);
@@ -1456,6 +1473,22 @@
strcpy(sc, "00");
if (msg_type(msg) == sms) {
+ /* experimental DLR for AT2 : */
+ // calculate DLR msg id
+ dlrmsgid = octstr_format("%ld%d",time(NULL), gw_rand());
+
+ // remove DLR types we don't currently support
+ msg->sms.dlr_mask &= DLR_SMSC_FAIL | DLR_SMSC_SUCCESS;
+
+ if (msg->sms.dlr_mask) // anything left ?
+ // create DLR
+ dlr_add(octstr_get_cstr(privdata->conn->id),
+ octstr_get_cstr(dlrmsgid),
+ octstr_get_cstr(msg->sms.receiver),
+ octstr_get_cstr(msg->sms.service),
+ octstr_get_cstr(msg->sms.dlr_url),
+ msg->sms.dlr_mask);
+ /* end experimental DLR for AT2 */
at2_pdu_encode(msg, &pdu[0], privdata);
ret = -99;
@@ -1487,11 +1520,57 @@
if (ret != 0) /* OK only */
continue;
+ /* experimental DLR for AT2 : */
+ /* gen DLR_SMSC_SUCCESS */
+ if (msg->sms.dlr_mask & DLR_SMSC_SUCCESS)
+ {
+ Octstr *reply;
+ Msg* dlrmsg;
+
+ dlrmsg = dlr_find(octstr_get_cstr(privdata->conn->id),
+ octstr_get_cstr(dlrmsgid),
+ octstr_get_cstr(msg->sms.receiver), /* destination */
+ DLR_SMSC_SUCCESS);
+
+ if (dlrmsg != NULL)
+ {
+ reply = octstr_create("Success/");
+ octstr_insert(dlrmsg->sms.msgdata, reply, 0);
+ octstr_destroy(reply);
+ bb_smscconn_receive(privdata->conn, dlrmsg);
+ }
+ else
+ error(0,"Got SMSC_ACK but couldnt find message");
+ }
+ /* end experimental DLR for AT2 */
counter_increase(privdata->conn->sent);
bb_smscconn_sent(privdata->conn, msg);
}
if (ret != 0) {
+ /* experimental DLR for AT2 : */
+ /* gen DLR_SMSC_FAIL */
+ if (msg->sms.dlr_mask & DLR_SMSC_FAIL)
+ {
+ Octstr *reply;
+ Msg* dlrmsg;
+
+ dlrmsg = dlr_find(
+ octstr_get_cstr(privdata->conn->id),
+ octstr_get_cstr(dlrmsgid),
+ octstr_get_cstr(msg->sms.receiver), DLR_SMSC_FAIL);
+
+ if (dlrmsg != NULL)
+ {
+ reply = octstr_create("Success/");
+ octstr_insert(dlrmsg->sms.msgdata, reply, 0);
+ octstr_destroy(reply);
+ bb_smscconn_receive(privdata->conn, dlrmsg);
+ }
+ else
+ error(0,"Got SMSC_NACK but couldnt find message");
+ }
+ /* end experimental DLR for AT2 */
/*
* no need to do counter_increase(privdata->conn->failed) here,
* since bb_smscconn_send_failed() will inc the counter on
@@ -1500,6 +1579,7 @@
bb_smscconn_send_failed(privdata->conn, msg, SMSCCONN_FAILED_MALFORMED);
}
}
+ O_DESTROY(dlrmsgid);
}