Attached is added feature for Indonesia Esia HTTP SMSC.
--- gateway-1.4.1/gw/smsc/smsc_http.c
+++ smsc_http.c
@@ -142,6 +142,7 @@
int no_coding; /* this, too */
int no_sep; /* not to mention this */
Octstr *proxy; /* proxy a constant string */
+ Octstr *my_number;
/* callback functions set by HTTP-SMSC type */
void (*send_sms) (SMSCConn *conn, Msg *msg);
@@ -164,6 +165,7 @@
octstr_destroy(conndata->password);
octstr_destroy(conndata->proxy);
octstr_destroy(conndata->system_id);
+ octstr_destroy(conndata->my_number);
gw_free(conndata);
}
@@ -1290,6 +1292,200 @@
}
}
+/*----------------------------------------------------------------
+ * Indonesia Esia
+ * Indirect Scheme
+ * Willy Mularto <[EMAIL PROTECTED]>
+ */
+
+/* Esia MT */
+static void esia_send_sms(SMSCConn *conn, Msg *sms)
+{
+ ConnData *conndata = conn->data;
+ Octstr *url;
+ List *headers;
+
+ url = octstr_format("%S/?",
+ conndata->send_url);
+
+ /* Get usr */
+ if (octstr_search(url, octstr_create("usr="), 0) == -1) {
+ octstr_format_append(url, "usr=%S", conndata->username);
+ }
+ /* Get pwd */
+ if (octstr_search(url, octstr_create("pwd="), 0) == -1) {
+ octstr_format_append(url, "&pwd=%S", conndata->password);
+ }
+ /* Get dn */
+ if (octstr_search(url, octstr_create("dn="), 0) == -1) {
+ octstr_format_append(url, "&dn=%S", sms->sms.receiver);
+ }
+ /* Get from */
+ if (octstr_search(url, octstr_create("from="), 0) == -1) {
+ octstr_format_append(url, "&from=%S", sms->sms.sender);
+ }
+ /* Get moid */
+ if (octstr_search(url, octstr_create("moid="), 0) == -1) {
+ octstr_format_append(url, "&moid=%S", sms->sms.binfo);
+ }
+ /* Get mtcode */
+ if (octstr_search(url, octstr_create("mtcode="), 0) == -1) {
+ octstr_format_append(url, "&mtcode=%d", sms->sms.account);
+ }
+ /* Get msg */
+ if (octstr_search(url, octstr_create("msg="), 0) == -1) {
+ octstr_format_append(url, "&msg=%E", sms->sms.msgdata);
+ }
+
+ sms->sms.dlr_mask = 31;
+ headers = gwlist_create();
+ debug("smsc.http.esia", 0, "HTTP[%s]: Start request",
+ octstr_get_cstr(conn->id));
+ http_start_request(conndata->http_ref, HTTP_METHOD_GET, url,
headers,
+ NULL, 0, sms, NULL);
+
+ octstr_destroy(url);
+ http_destroy_headers(headers);
+}
+
+/* Esia Parse HTTP DLR Response */
+static void esia_parse_reply(SMSCConn *conn, Msg *msg, int status,
+ List *headers, Octstr *body)
+{
+ Octstr *tid, *dest, *code, *desc;
+ int dlrstat, ret, httpstatus = HTTP_UNAUTHORIZED;
+ Msg *dlrmsg;
+ List *reply_headers;
+
+ tid = octstr_duplicate(msg->sms.binfo);
+ dest = octstr_duplicate(msg->sms.receiver);
+ if (DLR_IS_ENABLED_DEVICE(msg->sms.dlr_mask))
+ dlr_add(conn->id, tid, msg);
+
+
+ /*SUCCESS*/
+ if ((status == HTTP_OK || status == HTTP_ACCEPTED)
+ && (octstr_case_search(body, octstr_imm("ERROR=0000"), 0) ==
0)) {
+ dlrstat = 1;
+ bb_smscconn_sent(conn, msg, NULL);
+ }
+ /*Server Error Try Again*/
+ else if ((status == HTTP_OK || status == HTTP_ACCEPTED)
+ && (octstr_case_search(body, octstr_imm("ERROR=4444"), 0) ==
0)) {
+ dlrstat = 4;
+ bb_smscconn_sent(conn, msg, NULL);
+ }
+ /*Not User Push SMS*/
+ else if ((status == HTTP_OK || status == HTTP_ACCEPTED)
+ && (octstr_case_search(body, octstr_imm("ERROR=2222"), 0) ==
0)) {
+ dlrstat = 2;
+ bb_smscconn_sent(conn, msg, NULL);
+ }
+ /*Wrong Username, Password and or Not Allowed IP*/
+ else if ((status == HTTP_OK || status == HTTP_ACCEPTED)
+ && (octstr_case_search(body, octstr_imm("ERROR=1111"), 0) ==
0)) {
+ dlrstat = 16;
+ bb_smscconn_sent(conn, msg, NULL);
+ }
+ /*MOID Empty*/
+ else if ((status == HTTP_OK || status == HTTP_ACCEPTED)
+ && (octstr_case_search(body, octstr_imm("ERROR=1000"), 0) ==
0)) {
+ dlrstat = 16;
+ bb_smscconn_sent(conn, msg, NULL);
+ }
+ /*MTCODE Empty*/
+ else if ((status == HTTP_OK || status == HTTP_ACCEPTED)
+ && (octstr_case_search(body, octstr_imm("ERROR=2000"), 0) ==
0)) {
+ dlrstat = 16;
+ bb_smscconn_sent(conn, msg, NULL);
+ }
+ /*MOID Wrong Format*/
+ else if ((status == HTTP_OK || status == HTTP_ACCEPTED)
+ && (octstr_case_search(body, octstr_imm("ERROR=3000"), 0) ==
0)) {
+ dlrstat = 16;
+ bb_smscconn_sent(conn, msg, NULL);
+ }
+ /*MTCODE Wrong Format*/
+ else if ((status == HTTP_OK || status == HTTP_ACCEPTED)
+ && (octstr_case_search(body, octstr_imm("ERROR=4000"), 0) ==
0)) {
+ dlrstat = 16;
+ bb_smscconn_sent(conn, msg, NULL);
+ }
+ else {
+ bb_smscconn_send_failed(conn, msg,
+ SMSCCONN_FAILED_MALFORMED, octstr_duplicate(body));
+ }
+ dlrmsg = dlr_find(conn->id,
+ tid,
+ dest ,
+ dlrstat);
+
+ if (dlrmsg != NULL) {
+
+ dlrmsg->sms.sms_type = report_mo;
+
+ if (tid) {
+
+ dlrmsg->sms.binfo =
octstr_duplicate(tid);
+ }
+ ret = bb_smscconn_receive(conn, dlrmsg);
+ httpstatus = (ret == 0 ? HTTP_OK : HTTP_FORBIDDEN);
+ }
+ octstr_destroy(tid);
+}
+
+/* Esia MO */
+static void esia_receive_sms(SMSCConn *conn, HTTPClient *client,
+ List *headers, Octstr *body, List
*cgivars)
+{
+ ConnData *conndata = conn->data;
+ Octstr *id, *dn, *to, *motext, *retmsg;
+ List *reply_headers;
+ int ret, httpstatus = HTTP_UNAUTHORIZED;
+
+
+
+ id = http_cgi_variable(cgivars, "id");
+ dn = http_cgi_variable(cgivars, "dn");
+ to = http_cgi_variable(cgivars, "to");
+ motext = http_cgi_variable(cgivars, "msg");
+
+ debug("smsc.http.esia", 0, "HTTP[%s]: Received a request",
+ octstr_get_cstr(conn->id));
+
+ if (dn == NULL || motext == NULL) {
+ error(0, "HTTP[%s]: Insufficient args.",
+ octstr_get_cstr(conn->id));
+ retmsg = octstr_create("Insufficient arguments, rejected.");
+ }
+ else {
+ Msg *msg;
+ msg = msg_create(sms);
+
+ debug("smsc.http.esia", 0, "HTTP[%s]: Incoming MO from[%s]to[%
s]text[%s]",
+ octstr_get_cstr(conn->id), octstr_get_cstr(dn),
octstr_get_cstr(to), octstr_get_cstr(motext));
+
+ msg->sms.sender = octstr_duplicate(dn);
+ msg->sms.receiver = octstr_duplicate(to);
+ msg->sms.msgdata = octstr_duplicate(motext);
+ msg->sms.smsc_id = octstr_duplicate(conn->id);
+ msg->sms.time = time(NULL);
+ msg->sms.binfo = octstr_duplicate(id);;
+
+ ret = bb_smscconn_receive(conn, msg);
+ httpstatus = (ret == 0 ? HTTP_OK : HTTP_FORBIDDEN);
+ }
+
+ reply_headers = gwlist_create();
+
+ http_header_add(reply_headers, "Content-Type", "text/plain");
+ debug("smsc.http.esia", 0, "HTTP[%s]: Sending reply with HTTP
status <%d>.",
+ octstr_get_cstr(conn->id), httpstatus);
+
+ http_send_reply(client, httpstatus, reply_headers, NULL);
+ http_destroy_headers(reply_headers);
+}
+
/*
* static void wapme_smsproxy_receive_sms(SMSCConn *conn, HTTPClient
*client,
* List *headers, Octstr *body, List
*cgivars)
@@ -1379,6 +1575,7 @@
cfg_get_bool(&conndata->no_coding, cfg, octstr_imm("no-coding"));
cfg_get_bool(&conndata->no_sep, cfg, octstr_imm("no-sep"));
conndata->proxy = cfg_get(cfg, octstr_imm("system-id"));
+ conndata->my_number = cfg_get(cfg, octstr_imm("my-number"));
if (conndata->send_url == NULL)
panic(0, "HTTP[%s]: Sending not allowed. No 'send-url'
specified.",
@@ -1434,6 +1631,16 @@
conndata->send_sms = clickatell_send_sms;
conndata->parse_reply = clickatell_parse_reply;
}
+ else if (octstr_case_compare(type, octstr_imm("esia")) == 0) {
+ if (conndata->username == NULL || conndata->password == NULL) {
+ error(0, "HTTP[%s]: 'username' and 'password' required for
Esia http smsc",
+ octstr_get_cstr(conn->id));
+ goto error;
+ }
+ conndata->receive_sms = esia_receive_sms;
+ conndata->send_sms = esia_send_sms;
+ conndata->parse_reply = esia_parse_reply;
+ }
/*
* ADD NEW HTTP SMSC TYPES HERE
*/
Let me know for any bugs. TIA
Willy