[PATCH] [GATEWAY] Expose replace-if-present flag
Germán Bobr <[email protected]> Fri, 18 Sep 2015 13:00:33 -0300
| Newsgroups | gmane.comp.mobile.kannel.devel |
|---|---|
| Message-ID | <CAGNSKr77Rv-pwWktCib2+O9yi0Uohhev+yYpdv6feAEExT7kxA@mail.gmail.com> |
Hi I needed to use the replace-if-present smpp flag in my submits, and found out that the PDU definition in gw/smsc/smpp_pdu.def had the flag in its definition but there was no code to expose said flag. I have changed gw/smsbox.c, gw/msg-decl.h and gw/smsc/smsc_smpp.c to expose that flag in cgi, and X-Kannel-Headers The new cgi variable is called "rip" and the header is "X-Kannel-RIP" Please, feel free to apply this patch for the next kannel version. Regards, -- *Germán Bobr *[email protected] [image: Description: redmond]
image001.png
(image/png, 10.2 KB) - not displayed
replace-if-present.diff
(text/plain, 12.4 KB)
Index: gw/msg-decl.h
===================================================================
--- gw/msg-decl.h (revisión: 5149)
+++ gw/msg-decl.h (copia de trabajo)
@@ -99,6 +99,7 @@
INTEGER(deferred)
INTEGER(dlr_mask)
OCTSTR(dlr_url)
+ INTEGER(rip)
INTEGER(pid)
INTEGER(alt_dcs)
INTEGER(rpi)
Index: gw/smsbox.c
===================================================================
--- gw/smsbox.c (revisión: 5149)
+++ gw/smsbox.c (copia de trabajo)
@@ -538,7 +538,7 @@
int *coding, int *compress,
int *validity, int *deferred,
int *dlr_mask, Octstr **dlr_url,
- Octstr **account, int *pid, int *alt_dcs,
+ Octstr **account, int *rip, int *pid, int *alt_dcs,
int *rpi, Octstr **binfo, int *priority, Octstr **meta_data)
{
Octstr *name, *val;
@@ -599,6 +599,9 @@
else if (octstr_case_compare(name, octstr_imm("X-Kannel-Coding")) == 0) {
sscanf(octstr_get_cstr(val),"%d", coding);
}
+ else if (octstr_case_compare(name, octstr_imm("X-Kannel-RIP")) == 0) {
+ sscanf(octstr_get_cstr(val),"%d", rip);
+ }
else if (octstr_case_compare(name, octstr_imm("X-Kannel-PID")) == 0) {
sscanf(octstr_get_cstr(val),"%d", pid);
}
@@ -649,7 +652,7 @@
int *coding, int *compress,
int *validity, int *deferred,
int *dlr_mask, Octstr **dlr_url,
- Octstr **account, int *pid, int *alt_dcs,
+ Octstr **account, int *rip, int *pid, int *alt_dcs,
int *rpi, List **tolist, Octstr **charset,
Octstr **binfo, int *priority, Octstr **meta_data)
{
@@ -752,6 +755,9 @@
if (*smsc == NULL)
XPATH_SEARCH_OCTSTR("/message/submit/to", *smsc, 0);
+ /* rip */
+ XPATH_SEARCH_NUMBER("/message/submit/rip", *rip);
+
/* pid */
XPATH_SEARCH_NUMBER("/message/submit/pid", *pid);
@@ -821,7 +827,7 @@
Octstr *replytext, Octstr *from, Octstr *to, Octstr *udh,
int mclass, int mwi, int coding, int compress,
int validity, int deferred,
- Octstr *dlr_url, int dlr_mask, int pid, int alt_dcs,
+ Octstr *dlr_url, int dlr_mask, int rip, int pid, int alt_dcs,
int rpi, Octstr *smsc, Octstr *account,
Octstr *charset, Octstr *binfo, int priority, Octstr *meta_data)
{
@@ -888,6 +894,12 @@
else
warning(0, "Tried to set MClass field, denied.");
}
+ if (rip != SMS_PARAM_UNDEFINED) {
+ if (urltrans_accept_x_kannel_headers(trans))
+ msg->sms.rip = rip;
+ else
+ warning(0, "Tried to set rip field, denied.");
+ }
if (pid != SMS_PARAM_UNDEFINED) {
if (urltrans_accept_x_kannel_headers(trans))
msg->sms.pid = pid;
@@ -1059,7 +1071,7 @@
Octstr *reply_body, *charset, *alt_charset;
Octstr *udh, *from, *to, *dlr_url, *account, *smsc, *binfo, *meta_data;
- int dlr_mask, mclass, mwi, coding, compress, pid, alt_dcs, rpi;
+ int dlr_mask, mclass, mwi, coding, compress, rip, pid, alt_dcs, rpi;
int validity, deferred, priority;
text_html = octstr_imm("text/html");
@@ -1077,7 +1089,7 @@
from = to = udh = smsc = dlr_url = account = binfo = charset
= alt_charset = meta_data = NULL;
- mclass = mwi = compress = pid = alt_dcs = rpi = dlr_mask =
+ mclass = mwi = compress = rip = pid = alt_dcs = rpi = dlr_mask =
validity = deferred = priority = SMS_PARAM_UNDEFINED;
coding = DC_7BIT;
@@ -1102,7 +1114,7 @@
NULL, NULL, &smsc, &mclass, &mwi,
&coding, &compress, &validity,
&deferred, &dlr_mask, &dlr_url,
- &account, &pid, &alt_dcs, &rpi,
+ &account, &rip, &pid, &alt_dcs, &rpi,
&binfo, &priority, &meta_data);
} else if (octstr_case_compare(type, text_plain) == 0) {
replytext = octstr_duplicate(reply_body);
@@ -1112,7 +1124,7 @@
NULL, NULL, &smsc, &mclass, &mwi,
&coding, &compress, &validity,
&deferred, &dlr_mask, &dlr_url,
- &account, &pid, &alt_dcs, &rpi,
+ &account, &rip, &pid, &alt_dcs, &rpi,
&binfo, &priority, &meta_data);
} else if (octstr_case_compare(type, text_xml) == 0) {
replytext = octstr_duplicate(reply_body);
@@ -1121,7 +1133,7 @@
get_x_kannel_from_xml(mt_reply, &type, &replytext, reply_headers,
&from, &to, &udh, NULL, NULL, &smsc, &mclass, &mwi,
&coding, &compress, &validity, &deferred, &dlr_mask,
- &dlr_url, &account, &pid, &alt_dcs, &rpi, NULL, &charset,
+ &dlr_url, &account, &rip, &pid, &alt_dcs, &rpi, NULL, &charset,
&binfo, &priority, &meta_data);
} else if (octstr_case_compare(type, octet_stream) == 0) {
replytext = octstr_duplicate(reply_body);
@@ -1132,7 +1144,7 @@
NULL, NULL, &smsc, &mclass, &mwi,
&coding, &compress, &validity,
&deferred, &dlr_mask, &dlr_url,
- &account, &pid, &alt_dcs, &rpi,
+ &account, &rip, &pid, &alt_dcs, &rpi,
&binfo, &priority, &meta_data);
} else {
replytext = octstr_duplicate(reply_couldnotrepresent);
@@ -1175,7 +1187,7 @@
if (msg->sms.sms_type != report_mo) {
fill_message(msg, trans, replytext, from, to, udh, mclass,
mwi, coding, compress, validity, deferred, dlr_url,
- dlr_mask, pid, alt_dcs, rpi, smsc, account, charset,
+ dlr_mask, rip, pid, alt_dcs, rpi, smsc, account, charset,
binfo, priority, meta_data);
alog("SMS HTTP-request sender:%s request: '%s' url: '%s' reply: %d '%s'",
@@ -1362,6 +1374,12 @@
http_header_add(request_headers, "X-Kannel-MClass", octstr_get_cstr(os));
octstr_destroy(os);
}
+ if (msg->sms.rip != SMS_PARAM_UNDEFINED) {
+ Octstr *os;
+ os = octstr_format("%d",msg->sms.rip);
+ http_header_add(request_headers, "X-Kannel-RIP", octstr_get_cstr(os));
+ octstr_destroy(os);
+ }
if (msg->sms.pid != SMS_PARAM_UNDEFINED) {
Octstr *os;
os = octstr_format("%d",msg->sms.pid);
@@ -1519,6 +1537,10 @@
OCTSTR_APPEND_XML_OCTSTR(xml, "ud", msg->sms.msgdata);
}
+ /* rip */
+ if (msg->sms.rip != SMS_PARAM_UNDEFINED)
+ OCTSTR_APPEND_XML_NUMBER(xml, "rip", msg->sms.rip);
+
/* pid */
if (msg->sms.pid != SMS_PARAM_UNDEFINED)
OCTSTR_APPEND_XML_NUMBER(xml, "pid", msg->sms.pid);
@@ -1949,7 +1971,7 @@
int mclass, int mwi, int coding, int compress,
int validity, int deferred,
int *status, int dlr_mask, Octstr *dlr_url,
- Octstr *account, int pid, int alt_dcs, int rpi,
+ Octstr *account, int rip, int pid, int alt_dcs, int rpi,
List *receiver, Octstr *binfo, int priority, Octstr *meta_data)
{
Msg *msg = NULL;
@@ -2192,6 +2214,12 @@
}
msg->sms.mclass = mclass;
+ if ( rip < -1 || rip > 7 ) {
+ returnerror = octstr_create("RIP field misformed, rejected");
+ goto field_error;
+ }
+ msg->sms.rip = rip;
+
if ( pid < -1 || pid > 255 ) {
returnerror = octstr_create("PID field misformed, rejected");
goto field_error;
@@ -2462,12 +2490,12 @@
Octstr *tmp_string;
Octstr *from, *to, *charset, *text, *udh, *smsc, *dlr_url, *account;
Octstr *binfo, *meta_data;
- int dlr_mask, mclass, mwi, coding, compress, validity, deferred, pid;
+ int dlr_mask, mclass, mwi, coding, compress, validity, deferred, rip, pid;
int alt_dcs, rpi, priority;
from = to = udh = text = smsc = account = dlr_url = charset = binfo = meta_data = NULL;
mclass = mwi = coding = compress = validity = deferred = dlr_mask =
- pid = alt_dcs = rpi = priority = SMS_PARAM_UNDEFINED;
+ rip = pid = alt_dcs = rpi = priority = SMS_PARAM_UNDEFINED;
/* check the username and password */
t = authorise_user(args, client_ip);
@@ -2503,6 +2531,10 @@
if(tmp_string != NULL)
sscanf(octstr_get_cstr(tmp_string),"%d", &mclass);
+ tmp_string = http_cgi_variable(args, "rip");
+ if(tmp_string != NULL)
+ sscanf(octstr_get_cstr(tmp_string),"%d", &rip);
+
tmp_string = http_cgi_variable(args, "pid");
if(tmp_string != NULL)
sscanf(octstr_get_cstr(tmp_string),"%d", &pid);
@@ -2559,7 +2591,7 @@
return smsbox_req_handle(t, client_ip, client, from, to, text, charset, udh,
smsc, mclass, mwi, coding, compress, validity,
deferred, status, dlr_mask, dlr_url, account,
- pid, alt_dcs, rpi, NULL, binfo, priority, meta_data);
+ rip, pid, alt_dcs, rpi, NULL, binfo, priority, meta_data);
}
@@ -2579,7 +2611,7 @@
Octstr *text;
Octstr *from, *to, *udh, *smsc, *charset, *dlr_url, *account, *binfo, *meta_data;
int dlr_mask, mclass, mwi, coding, compress, validity, deferred;
- int pid, alt_dcs, rpi, priority;
+ int rip, pid, alt_dcs, rpi, priority;
text_html = octstr_imm("text/html");
text_wml = octstr_imm("text/vnd.wap.wml");
@@ -2591,7 +2623,7 @@
tolist = NULL;
from = to = udh = smsc = account = dlr_url = charset = binfo = meta_data = NULL;
mclass = mwi = coding = compress = validity = deferred = dlr_mask =
- pid = alt_dcs = rpi = priority = SMS_PARAM_UNDEFINED;
+ rip = pid = alt_dcs = rpi = priority = SMS_PARAM_UNDEFINED;
http_header_get_content_type(headers, &type, &charset);
if (octstr_case_compare(type, text_html) == 0 ||
@@ -2603,7 +2635,7 @@
&user, &pass, &smsc, &mclass, &mwi,
&coding, &compress, &validity,
&deferred, &dlr_mask, &dlr_url,
- &account, &pid, &alt_dcs, &rpi,
+ &account, &rip, &pid, &alt_dcs, &rpi,
&binfo, &priority, &meta_data);
} else if (octstr_case_compare(type, text_plain) == 0 ||
octstr_case_compare(type, octet_stream) == 0) {
@@ -2611,13 +2643,13 @@
&user, &pass, &smsc, &mclass, &mwi,
&coding, &compress, &validity,
&deferred, &dlr_mask, &dlr_url,
- &account, &pid, &alt_dcs, &rpi,
+ &account, &rip, &pid, &alt_dcs, &rpi,
&binfo, &priority, &meta_data);
} else if (octstr_case_compare(type, text_xml) == 0) {
get_x_kannel_from_xml(mt_push, &type, &body, headers,
&from, &to, &udh, &user, &pass, &smsc, &mclass,
&mwi, &coding, &compress, &validity, &deferred,
- &dlr_mask, &dlr_url, &account, &pid, &alt_dcs,
+ &dlr_mask, &dlr_url, &account, &rip, &pid, &alt_dcs,
&rpi, &tolist, &charset, &binfo, &priority, &meta_data);
} else {
*status = HTTP_BAD_REQUEST;
@@ -2662,7 +2694,7 @@
ret = smsbox_req_handle(t, client_ip, client, from, to, body, charset,
udh, smsc, mclass, mwi, coding, compress,
validity, deferred, status, dlr_mask,
- dlr_url, account, pid, alt_dcs, rpi, tolist,
+ dlr_url, account, rip, pid, alt_dcs, rpi, tolist,
binfo, priority, meta_data);
}
Index: gw/smsc/smsc_smpp.c
===================================================================
--- gw/smsc/smsc_smpp.c (revisión: 5149)
+++ gw/smsc/smsc_smpp.c (copia de trabajo)
@@ -701,6 +701,7 @@
handle_mo_dcs(msg, smpp->alt_charset, pdu->u.deliver_sm.data_coding, pdu->u.deliver_sm.esm_class);
msg->sms.pid = pdu->u.deliver_sm.protocol_id;
+ msg->sms.rip = pdu->u.deliver_sm.replace_if_present_flag;
/* set priority flag */
msg->sms.priority = pdu->u.deliver_sm.priority_flag;
@@ -1021,6 +1022,10 @@
if (msg->sms.pid != SMS_PARAM_UNDEFINED)
pdu->u.submit_sm.protocol_id = msg->sms.pid;
+ /* set rip */
+ if (msg->sms.rip != SMS_PARAM_UNDEFINED)
+ pdu->u.submit_sm.replace_if_present_flag = msg->sms.rip;
+
/*
* set the esm_class field
* default is store and forward, plus udh and rpi if requested