diff --git a/mbuni/ChangeLog b/mbuni/ChangeLog index 2fd4cad..5173a73 100644 --- a/mbuni/ChangeLog +++ b/mbuni/ChangeLog @@ -1,3 +1,5 @@ +2008-09-29 P. A. Bagyenda + * Improved mmsbox DLR routing for status Forwarded 2008-09-15 P. A. Bagyenda * Order of XML tags in MM7 packet changed (shouldn't matter, but...) 2008-09-12 P. A. Bagyenda diff --git a/mbuni/mmsbox/bearerbox.c b/mbuni/mmsbox/bearerbox.c index c8c60dc..3bad1fb 100644 --- a/mbuni/mmsbox/bearerbox.c +++ b/mbuni/mmsbox/bearerbox.c @@ -131,11 +131,11 @@ static int mmsbox_send_report(Octstr *from, char *report_type, mms_url_fetch_content(HTTP_METHOD_GET, url, rh, octstr_imm(""), &rph, &rb); /* At what point do we delete it? For now, when we get a read report, - * and also when we get a delivery report that is not 'deferred' or sent + * and also when we get a delivery report that is not 'deferred' or sent or forwarded */ if (strcmp(report_type, "read-report") == 0 || (octstr_case_compare(status, octstr_imm("Deferred")) != 0 && - octstr_case_compare(status, octstr_imm("Sent")) != 0)) + octstr_case_compare(status, octstr_imm("Forwarded")) != 0)) mms_dlr_url_remove(msgid, report_type, mmc_gid); done: @@ -401,6 +401,52 @@ static void handle_report_dispatch(MmscGrp *m, Octstr *hfrom, char *rtype, List octstr_destroy(value3); } +/* helper function for queueing delivery reports. */ +static int queue_dlr(MmscGrp *mmc, Octstr *from, Octstr *to, Octstr *msgid, Octstr *status, char *interf) +{ + Octstr *mmc_id = NULL, *qdir; + MmsMsg *m = mms_deliveryreport(msgid, from, to, time(NULL), status); + List *lto = gwlist_create(); + int ret; + + gwlist_append(lto, octstr_duplicate(to)); + qdir = get_mmsbox_queue_dir(from, lto, mmc, &mmc_id); /* get routing info. */ + + if (mmc_id != NULL) { /* internal routing. */ + Octstr *qf; + fixup_relayed_report(m, mmc, "delivery-report"); /* fix it up if it is relayed. */ + qf = qfs->mms_queue_add(from, lto, NULL, + mmc->id, mmc_id, + 0, time(NULL) + default_msgexpiry, m, NULL, + NULL, NULL, + NULL, NULL, + NULL, + 0, + octstr_get_cstr(qdir), + interf, + NULL); + if (qf) { + /* Log to access log */ + mms_log("Received DLR", from, lto, -1, NULL, NULL, mmc->id, "MMSBox", NULL, NULL); + ret = 0; + } else + ret = -1; + octstr_destroy(qf); + } else { + List *mh = mms_message_headers(m); + handle_report_dispatch(mmc, from, "delivery-report", mh, octstr_imm("X-Mms-Status")); + + http_destroy_headers(mh); + ret = 0; + } + + gwlist_destroy(lto, (void *)octstr_destroy); + octstr_destroy(mmc_id); + mms_destroy(m); + + return ret; +} + static int mm7eaif_receive(MmsBoxHTTPClientInfo *h) { MmsMsg *m = NULL; @@ -1346,15 +1392,30 @@ static int sendMsg(MmsEnvelope *e) done: if (res == MMS_SEND_OK || res == MMS_SEND_QUEUED) { to->process = 0; + + if (e->msgtype == MMS_MSGTYPE_SEND_REQ || + e->msgtype == MMS_MSGTYPE_RETRIEVE_CONF) /* queue dlr as needed. */ + queue_dlr(mmc, e->from, to->rcpt, new_msgid, octstr_imm("Forwarded"), "MM7-Out"); +#if 0 mmsbox_send_report(to->rcpt, "delivery-report", e->url1, - octstr_imm("Sent"), new_msgid, NULL, + octstr_imm("Forwarded"), new_msgid, NULL, mmc->id, mmc->group_id, otransid, NULL, -1); - } else if (res == MMS_SEND_ERROR_FATAL && mmc) +#endif + } else if (res == MMS_SEND_ERROR_FATAL && mmc) { + if (e->msgtype == MMS_MSGTYPE_SEND_REQ || + e->msgtype == MMS_MSGTYPE_RETRIEVE_CONF) /* queue dlr as needed. */ + queue_dlr(mmc, e->from, to->rcpt, e->msgId, + (e->expiryt != 0 && e->expiryt < tnow) ? + octstr_imm("Expired") : octstr_imm("Rejected"), + "MM7-Out"); +#if 0 mmsbox_send_report(to->rcpt, "delivery-report", e->url1, (e->expiryt != 0 && e->expiryt < tnow) ? octstr_imm("Expired") : octstr_imm("Rejected"), e->msgId, NULL, mmc->id, mmc->group_id, otransid, NULL, -1); +#endif + } if (res == MMS_SEND_ERROR_FATAL) to->process = 0; /* No more attempts. */