📄 smsbox.c
字号:
{ return counter_value(num_outstanding_requests);}/*********************************************************************** * Thread for receiving reply from HTTP query and sending it to phone. */static void strip_prefix_and_suffix(Octstr *html, Octstr *prefix, Octstr *suffix){ long prefix_end, suffix_start; if (prefix == NULL || suffix == NULL) return; prefix_end = octstr_case_search(html, prefix, 0); if (prefix_end == -1) return; prefix_end += octstr_len(prefix); suffix_start = octstr_case_search(html, suffix, prefix_end); if (suffix_start == -1) return; octstr_delete(html, 0, prefix_end); octstr_truncate(html, suffix_start - prefix_end);}static void get_x_kannel_from_headers(List *headers, Octstr **from, Octstr **to, Octstr **udh, Octstr **user, Octstr **pass, Octstr **smsc, int *mclass, int *mwi, int *coding, int *compress, int *validity, int *deferred, int *dlr_mask, Octstr **dlr_url, Octstr **account, int *pid, int *alt_dcs, int *rpi, Octstr **binfo, int *priority){ Octstr *name, *val; long l; for(l=0; l<list_len(headers); l++) { http_header_get(headers, l, &name, &val); if (octstr_case_compare(name, octstr_imm("X-Kannel-From")) == 0) { *from = octstr_duplicate(val); octstr_strip_blanks(*from); } else if (octstr_case_compare(name, octstr_imm("X-Kannel-To")) == 0) { *to = octstr_duplicate(val); octstr_strip_blanks(*to); } else if (octstr_case_compare(name, octstr_imm("X-Kannel-Username")) == 0) { if (user != NULL) { *user = octstr_duplicate(val); octstr_strip_blanks(*user); } } else if (octstr_case_compare(name, octstr_imm("X-Kannel-Password")) == 0) { if (pass != NULL) { *pass = octstr_duplicate(val); octstr_strip_blanks(*pass); } } else if (octstr_case_compare(name, octstr_imm("X-Kannel-SMSC")) == 0) { if (smsc != NULL) { *smsc = octstr_duplicate(val); octstr_strip_blanks(*smsc); } } else if (octstr_case_compare(name, octstr_imm("X-Kannel-UDH")) == 0) { *udh = octstr_duplicate(val); octstr_strip_blanks(*udh); if (octstr_hex_to_binary(*udh) == -1) { if (octstr_url_decode(*udh) == -1) { warning(0, "Invalid UDH received in X-Kannel-UDH"); octstr_destroy(*udh); *udh = NULL; } } } else if (octstr_case_compare(name, octstr_imm("X-Kannel-DLR-URL")) == 0) { *dlr_url = octstr_duplicate(val); octstr_strip_blanks(*dlr_url); } else if (octstr_case_compare(name, octstr_imm("X-Kannel-Account")) == 0) { *account = octstr_duplicate(val); octstr_strip_blanks(*account); } else if (octstr_case_compare(name, octstr_imm("X-Kannel-BInfo")) == 0) { *binfo = octstr_duplicate(val); octstr_strip_blanks(*binfo); } 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-PID")) == 0) { sscanf(octstr_get_cstr(val),"%d", pid); } else if (octstr_case_compare(name, octstr_imm("X-Kannel-MWI")) == 0) { sscanf(octstr_get_cstr(val),"%d", mwi); } else if (octstr_case_compare(name, octstr_imm("X-Kannel-MClass")) == 0) { sscanf(octstr_get_cstr(val),"%d", mclass); } else if (octstr_case_compare(name, octstr_imm("X-Kannel-Alt-DCS")) == 0) { sscanf(octstr_get_cstr(val),"%d", alt_dcs); } else if (octstr_case_compare(name, octstr_imm("X-Kannel-Compress")) == 0) { sscanf(octstr_get_cstr(val),"%d", compress); } else if (octstr_case_compare(name, octstr_imm("X-Kannel-Validity")) == 0) { sscanf(octstr_get_cstr(val),"%d", validity); } else if (octstr_case_compare(name, octstr_imm("X-Kannel-Deferred")) == 0) { sscanf(octstr_get_cstr(val),"%d", deferred); } else if (octstr_case_compare(name, octstr_imm("X-Kannel-DLR-Mask")) == 0) { sscanf(octstr_get_cstr(val),"%d", dlr_mask); } else if (octstr_case_compare(name, octstr_imm("X-Kannel-RPI")) == 0) { sscanf(octstr_get_cstr(val),"%d", rpi); } else if (octstr_case_compare(name, octstr_imm("X-Kannel-Priority")) == 0) { sscanf(octstr_get_cstr(val),"%d", priority); } octstr_destroy(name); octstr_destroy(val); }}static long get_tag(Octstr *body, Octstr *tag, Octstr **value, long pos, int nostrip) { long start, end; int taglen; Octstr *tmp; tmp = octstr_create("<"); octstr_append(tmp, tag); octstr_append(tmp, octstr_imm(">")); taglen = octstr_len(tmp); start = octstr_search(body, tmp, pos); octstr_destroy(tmp); if(start != -1) { tmp = octstr_create("</"); octstr_append(tmp, tag); octstr_append(tmp, octstr_imm(">")); end = octstr_search(body, tmp, start); octstr_destroy(tmp); if(end != -1) { octstr_destroy(*value); *value = octstr_copy(body, start + taglen, end - start - taglen); if(nostrip == 0) { octstr_strip_blanks(*value); debug("sms", 0, "XMLParsing: tag <%s> value <%s>", octstr_get_cstr(tag), octstr_get_cstr(*value)); } return end + taglen + 1; } else { debug("sms", 0, "XMLParsing: end tag </%s> not found", octstr_get_cstr(tag)); return -1; } } else { /* debug("sms", 0, "XMLParsing: tag <%s> not found", octstr_get_cstr(tag)); */ return -1; }}/* requesttype = mt_reply or mt_push. for example, auth is only read on mt_push * parse body and populate fields, including replacing body for <ud> value and * type to text/plain */static void get_x_kannel_from_xml(int requesttype , Octstr **type, Octstr **body, List *headers, Octstr **from, Octstr **to, Octstr **udh, Octstr **user, Octstr **pass, Octstr **smsc, int *mclass, int *mwi, int *coding, int *compress, int *validity, int *deferred, int *dlr_mask, Octstr **dlr_url, Octstr **account, int *pid, int *alt_dcs, int *rpi, List **tolist, Octstr **charset, Octstr **binfo, int *priority){ Octstr *text, *tmp, *tmp2; long tmplong, where; tmp = tmp2 = text = NULL; debug("sms", 0, "XMLParsing: XML: <%s>", octstr_get_cstr(*body)); /* auth */ get_tag(*body, octstr_imm("from"), &tmp, 0, 0); if(tmp) { if(requesttype == mt_push) { /* user */ get_tag(tmp, octstr_imm("user"), user, 0, 0); get_tag(tmp, octstr_imm("username"), user, 0, 0); /* pass */ get_tag(tmp, octstr_imm("pass"), pass, 0, 0); get_tag(tmp, octstr_imm("password"), pass, 0, 0); } /* account */ get_tag(tmp, octstr_imm("account"), account, 0, 0); /* binfo */ get_tag(tmp, octstr_imm("binfo"), binfo, 0, 0); O_DESTROY(tmp); } if(requesttype == mt_push) { /* to (da/number) Multiple tags */ *tolist = list_create(); where = get_tag(*body, octstr_imm("da"), &tmp, 0, 0); if(tmp) { get_tag(tmp, octstr_imm("number"), to, 0, 0); list_append(*tolist, octstr_duplicate(*to)); O_DESTROY(*to); while(tmp && where != -1) { O_DESTROY(tmp); where = get_tag(*body, octstr_imm("da"), &tmp, where, 0); if(tmp) { get_tag(tmp, octstr_imm("number"), &tmp2, 0, 0); if(tmp2 != NULL) { list_append(*tolist, octstr_duplicate(tmp2)); O_DESTROY(tmp2); } } } } } /* udh */ get_tag(*body, octstr_imm("udh"), &tmp, 0, 0); if(tmp) { O_DESTROY(*udh); *udh = octstr_duplicate(tmp); if(octstr_hex_to_binary(*udh) == -1) octstr_url_decode(*udh); O_DESTROY(tmp); } /* smsc */ get_tag(*body, octstr_imm("to"), &tmp, 0, 0); if(tmp) { get_tag(tmp, octstr_imm("account"), smsc, 0, 0); O_DESTROY(tmp); } /* pid */ get_tag(*body, octstr_imm("pid"), &tmp, 0, 0); if(tmp) { if(octstr_parse_long(&tmplong, tmp, 0, 10) != -1) *pid = tmplong; O_DESTROY(tmp); } /* rpi */ get_tag(*body, octstr_imm("rpi"), &tmp, 0, 0); if(tmp) { if(octstr_parse_long(&tmplong, tmp, 0, 10) != -1) *rpi = tmplong; O_DESTROY(tmp); } /* dcs* (dcs/ *) */ get_tag(*body, octstr_imm("dcs"), &tmp, 0, 0); if(tmp) { /* mclass (dcs/mclass) */ get_tag(tmp, octstr_imm("mclass"), &tmp2, 0, 0); if(tmp2) { if(octstr_parse_long(&tmplong, tmp2, 0, 10) != -1) *mclass = tmplong; O_DESTROY(tmp2); } /* mwi (dcs/mwi) */ get_tag(tmp, octstr_imm("mwi"), &tmp2, 0, 0); if(tmp2) { if(octstr_parse_long(&tmplong, tmp2, 0, 10) != -1) *mwi = tmplong; O_DESTROY(tmp2); } /* coding (dcs/coding) */ get_tag(tmp, octstr_imm("coding"), &tmp2, 0, 0); if(tmp2) { if(octstr_parse_long(&tmplong, tmp2, 0, 10) != -1) *coding = tmplong; O_DESTROY(tmp2); } /* compress (dcs/compress) */ get_tag(tmp, octstr_imm("compress"), &tmp2, 0, 0); if(tmp2) { if(octstr_parse_long(&tmplong, tmp2, 0, 10) != -1) *compress = tmplong; O_DESTROY(tmp2); } /* alt-dcs (dcs/alt-dcs) */ get_tag(tmp, octstr_imm("alt-dcs"), &tmp2, 0, 0); if(tmp2) { if(octstr_parse_long(&tmplong, tmp2, 0, 10) != -1) *alt_dcs = tmplong; O_DESTROY(tmp2); } O_DESTROY(tmp); } /* statusrequest* (statusrequest/ *) */ get_tag(*body, octstr_imm("statusrequest"), &tmp, 0, 0); if(tmp) { /* dlr-mask (statusrequest/dlr-mask) */ get_tag(tmp, octstr_imm("dlr-mask"), &tmp2, 0, 0); if(tmp2) { if(octstr_parse_long(&tmplong, tmp2, 0, 10) != -1) *dlr_mask = tmplong; O_DESTROY(tmp2); } get_tag(tmp, octstr_imm("dlr-url"), dlr_url, 0, 0); O_DESTROY(tmp); } /* validity (vp/delay) */ get_tag(*body, octstr_imm("vp"), &tmp, 0, 0); if(tmp) { get_tag(tmp, octstr_imm("delay"), &tmp2, 0, 0); if(tmp2) { if(octstr_parse_long(&tmplong, tmp2, 0, 10) != -1) *validity = tmplong; O_DESTROY(tmp2); } O_DESTROY(tmp); } /* deferred (timing/delay) */ get_tag(*body, octstr_imm("timing"), &tmp, 0, 0); if(tmp) { get_tag(tmp, octstr_imm("delay"), &tmp2, 0, 0); if(tmp2) { if(octstr_parse_long(&tmplong, tmp2, 0, 10) != -1) *deferred = tmplong; O_DESTROY(tmp2); } O_DESTROY(tmp); } /* priority */ get_tag(*body, octstr_imm("priority"), &tmp, 0, 0); if(tmp) { if(octstr_parse_long(&tmplong, tmp, 0, 10) != -1) *priority = tmplong; O_DESTROY(tmp); } /* charset from <?xml...encoding=?> */ tmp = find_charset_encoding(*body); O_DESTROY(*charset); if(tmp) { *charset = octstr_duplicate(tmp); O_DESTROY(tmp); } else { *charset = octstr_create("UTF-8"); } /* text */ text = NULL; get_tag(*body, octstr_imm("ud"), &tmp, 0, 0); if(tmp) { O_DESTROY(text); text = octstr_duplicate(tmp); if(octstr_hex_to_binary(text) == -1) octstr_url_decode(text); O_DESTROY(tmp); } O_DESTROY(*body); if(text) *body = text; else *body = octstr_create(""); O_DESTROY(*type); *type = octstr_create("text/plain");}static void fill_message(Msg *msg, URLTranslation *trans, Octstr *replytext, int octet_stream, 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, int rpi, Octstr *smsc, Octstr *account, Octstr *charset, Octstr *binfo, int priority){ msg->sms.msgdata = replytext; msg->sms.time = time(NULL); if (charset) msg->sms.charset = charset;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -