📄 mms_mm7soap.c
字号:
octstr_destroy(v);
}
if (x[0]) /* close it off. */
octstr_format_append(p, "</mm7:%s>\n", x);
http_destroy_headers(l);
}
/* compare two mm7 version xmlns strings. Crude, but should generally work. */
static int ver_compare(MM7Version_t *v1, MM7Version_t *v2)
{
return (v1->major-v2->major)*1000 + (v1->minor1-v2->minor1)*100 + (v1->minor2-v2->minor2);
}
#define XMLNSMM7 "http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-0"
#define SOAP_ENV "SOAP-ENV"
/* Construct by hand. */
static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver)
{
Octstr *s = octstr_create("<?xml version='1.0' encoding='UTF-8'?>\n");
Octstr *xmlns = octstr_create((ver->xmlns[0]) ? ver->xmlns : XMLNSMM7);
Octstr *p, *q, *r, *fault, *mtype;
int i, n, mtag;
time_t t;
MM7Version_t min_ver = {5,1,0}; /* minimum version we deal with. */
octstr_append_cstr(s,
"<" SOAP_ENV ":Envelope xmlns:" SOAP_ENV "=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
"<" SOAP_ENV ":Header>\n");
p = http_header_value(hdrs, octstr_imm("TransactionID"));
octstr_format_append(s, "<mm7:TransactionID xmlns:mm7=\"%s\" " SOAP_ENV ":mustUnderstand=\"1\">%S</mm7:TransactionID>\n",
octstr_get_cstr(xmlns), p ? p : octstr_imm("none"));
if (p)
octstr_destroy(p);
octstr_append_cstr(s, "</" SOAP_ENV ":Header>\n<" SOAP_ENV ":Body>\n");
fault = http_header_value(hdrs, octstr_imm("Fault"));
if (fault) {
Octstr *fc = http_header_value(hdrs, octstr_imm("faultcode"));
Octstr *fs = http_header_value(hdrs, octstr_imm("faultstring"));
octstr_append_cstr(s, "<" SOAP_ENV ":Fault>\n");
if (fc) {
octstr_format_append(s, "<faultcode>%S</faultcode>\n", fc);
octstr_destroy(fc);
}
if (fs) {
octstr_format_append(s, "<faultstring>%S</faultstring>\n", fs);
octstr_destroy(fs);
}
octstr_append_cstr(s, "<detail>\n");
}
mtype = http_header_value(hdrs, octstr_imm("MessageType"));
mtag = mms_string_to_mm7tag(mtype);
octstr_format_append(s, "<mm7:%S xmlns:mm7=\"%s\">\n", mtype, octstr_get_cstr(xmlns));
/* Output the details. */
if ((p = http_header_value(hdrs, octstr_imm("MM7Version"))) != NULL) {
octstr_format_append(s, "<mm7:MM7Version>%S</mm7:MM7Version>\n", p);
octstr_destroy(p);
} else
octstr_format_append(s, "<mm7:MM7Version>%d.%d.%d</mm7:MM7Version>\n",
ver->major, ver->minor1, ver->minor2);
p = http_header_value(hdrs, octstr_imm("VASPID"));
q = http_header_value(hdrs, octstr_imm("VASID"));
r = http_header_value(hdrs, octstr_imm("SenderAddress"));
if (p || q || r) {
octstr_append_cstr(s, "<mm7:SenderIdentification>\n");
if (p)
octstr_format_append(s, "<mm7:VASPID>%S</mm7:VASPID>\n", p);
if (q)
octstr_format_append(s, "<mm7:VASID>%S</mm7:VASID>\n", q);
if (r) {
Octstr *xx = octstr_create("");
if (ver_compare(ver,&min_ver) > 0)
append_address(xx, r);
else if (octstr_get_char(r, 0) != '-') /* not display only. */
octstr_format_append(xx, "%s", octstr_get_cstr(r) + 1);
if (octstr_len(xx) > 0)
octstr_format_append(s, "<mm7:SenderAddress>%S</mm7:SenderAddress>\n", xx);
octstr_destroy(xx);
}
octstr_append_cstr(s, "</mm7:SenderIdentification>\n");
if (p) octstr_destroy(p);
if (q) octstr_destroy(q);
if (r) octstr_destroy(r);
}
p = octstr_create("");
if (mtag == MM7_TAG_SubmitReq ||
mtag == MM7_TAG_DeliverReq) { /* Multiple recipients,... */
output_rcpt("To", hdrs, p);
output_rcpt("Cc", hdrs, p);
output_rcpt("Bcc", hdrs, p);
if (octstr_len(p) > 0)
octstr_format_append(s, "<mm7:Recipients>\n%S</mm7:Recipients>\n", p);
} else if ((q = http_header_value(hdrs, octstr_imm("To"))) != NULL) {
append_address(p, q);
octstr_format_append(s, "<mm7:Recipient>\n%S</mm7:Recipient>\n", p);
octstr_destroy(q);
}
octstr_destroy(p);
octstr_destroy(xmlns);
/* cycle through rest of headers. */
for (i = 0, n = gwlist_len(hdrs); i < n; i++) {
Octstr *h = NULL, *v = NULL;
char *zz;
int tag;
int skip = 0;
http_header_get(hdrs, i, &h, &v);
tag = mms_string_to_mm7tag(h);
zz = octstr_get_cstr(h);
switch(tag) {
case MM7_TAG_MessageType:
case MM7_TAG_To:
case MM7_TAG_Cc:
case MM7_TAG_Bcc:
case MM7_TAG_Fault:
case MM7_TAG_faultstring:
case MM7_TAG_faultcode:
case MM7_TAG_VASID:
case MM7_TAG_VASPID:
case MM7_TAG_MM7Version:
case MM7_TAG_replyChargingSize:
case MM7_TAG_replyDeadline:
case MM7_TAG_TransactionID:
case MM7_TAG_StatusCode:
case MM7_TAG_StatusText:
case MM7_TAG_Details:
case MM7_TAG_SenderAddress:
case MM7_TAG_allowAdaptations:
skip = 1;
break;
case MM7_TAG_Sender:
p = octstr_create("");
if (ver_compare(ver,&min_ver) > 0)
append_address(p, v);
else if (octstr_get_char(v, 0) != '-') /* not display only. */
octstr_format_append(p, "%s", octstr_get_cstr(v) + 1);
if (octstr_len(p) > 0)
octstr_format_append(s, "<mm7:Sender>%S</mm7:Sender>\n", p);
octstr_destroy(p);
skip = 1;
break;
case MM7_TAG_Content:
if ((p = http_header_value(hdrs, octstr_imm("allowAdaptations"))) != NULL)
p = octstr_format(" allowAdaptations=\"%S\"", p);
else
p = octstr_imm("");
octstr_format_append(s, "<mm7:Content href=\"%S\"%S/>\n", v,p);
octstr_destroy(p);
skip = 1;
break;
case MM7_TAG_ReplyCharging:
p = http_header_value(hdrs, octstr_imm("replyChargingSize"));
q = http_header_value(hdrs, octstr_imm("replyDeadline"));
octstr_append_cstr(s, "<mm7:ReplyCharging");
if (p) {
octstr_format_append(s, " replyChargingSize=\"%S\"", p);
octstr_destroy(p);
}
if (q) {
octstr_format_append(s, " replyDeadline=\"%S\"", q);
octstr_destroy(q);
}
octstr_append_cstr(s, "/>\n");
skip = 1;
break;
case MM7_TAG_EarliestDeliveryTime:
case MM7_TAG_ExpiryDate:
case MM7_TAG_TimeStamp:
case MM7_TAG_Date:
t = date_parse_http(v);
octstr_destroy(v);
v = date_create_iso(t); /* format as ISO time... */
break;
case MM7_TAG_Status:
p = http_header_value(hdrs, octstr_imm("StatusCode"));
q = http_header_value(hdrs, octstr_imm("StatusText"));
octstr_append_cstr(s, "<mm7:Status>\n");
if (p) {
octstr_format_append(s, "<mm7:StatusCode>%S</mm7:StatusCode>\n", p);
octstr_destroy(p);
}
if (q) {
octstr_format_append(s, "<mm7:StatusText>%S</mm7:StatusText>\n", q);
octstr_destroy(q);
}
q = http_header_value(hdrs, octstr_imm("Details"));
if (q) {
octstr_format_append(s, "<mm7:Details>%S</mm7:Details>\n", q);
octstr_destroy(q);
}
octstr_append_cstr(s, "</mm7:Status>\n");
skip = 1;
break;
default:
break;
}
if (!skip && h && v)
octstr_format_append(s, "<mm7:%S>%S</mm7:%S>\n", h, v, h);
if (h) octstr_destroy(h);
if (v) octstr_destroy(v);
}
octstr_format_append(s, "</mm7:%S>\n", mtype);
octstr_destroy(mtype);
if (fault) {
octstr_append_cstr(s, "</detail>\n");
octstr_append_cstr(s, "</" SOAP_ENV ":Fault>\n");
octstr_destroy(fault);
}
octstr_append_cstr(s, "</" SOAP_ENV ":Body>\n");
octstr_append_cstr(s, "</" SOAP_ENV ":Envelope>\n");
return s;
}
int mm7_soapmsg_to_httpmsg(MSoapMsg_t *m, MM7Version_t *ver, List **hdrs, Octstr **body)
{
MIMEEntity *mime;
Octstr *ctype, *s;
List *headers;
mime = mime_entity_create();
if (m->msg) {
MIMEEntity *c = mime_entity_duplicate(m->msg);
Octstr *cloc = octstr_format("cid:c%ld.%d.%c%c.msg",
time(NULL), random(),
'A' + random() % 26,
'a' + random() % 26);
Octstr *cloc_str = octstr_format("<%s>", octstr_get_cstr(cloc) + 4);
Octstr *envloc = octstr_format("<s%ld.%d.%c%c.msg>",
time(NULL), random(),
'A' + random() % 26,
'a' + random() % 26);
MIMEEntity *xml = mime_entity_create();
List *hh = http_header_duplicate(m->envelope);
List *hx;
/* Replace in envelope. */
http_header_remove_all(hh, "Content");
http_header_add(hh, "Content", octstr_get_cstr(cloc));
/* Replace content location in msg part. */
hx = mime_entity_headers(c);
http_header_remove_all(hx, "Content-ID");
http_header_add(hx, "Content-ID", octstr_get_cstr(cloc_str));
mime_replace_headers(c, hx);
http_destroy_headers(hx);
hx = http_create_empty_headers();
http_header_add(hx, "Content-Type", "text/xml");
http_header_add(hx, "Content-ID", octstr_get_cstr(envloc));
mime_replace_headers(xml, hx);
http_destroy_headers(hx);
s = headers_to_soapxml(hh,ver);
mime_entity_set_body(xml, s);
octstr_destroy(s);
mime_entity_add_part(mime, xml);
mime_entity_add_part(mime, c);
http_destroy_headers(hh);
ctype = octstr_format("multipart/related; type=\"text/xml\"; start=\"%S\"",
envloc);
octstr_destroy(envloc);
octstr_destroy(cloc);
octstr_destroy(cloc_str);
mime_entity_destroy(xml);
mime_entity_destroy(c);
} else {
ctype = octstr_imm("text/xml");
s = headers_to_soapxml(m->envelope, ver);
mime_entity_set_body(mime,s);
octstr_destroy(s);
}
headers = http_create_empty_headers();
http_header_add(headers, "Content-Type", octstr_get_cstr(ctype));
http_header_add(headers, "SOAPAction", "\"\"");
mime_replace_headers(mime, headers);
http_destroy_headers(headers);
*body = mime_entity_body(mime);
*hdrs = mime_entity_headers(mime);
mime_entity_destroy(mime);
return 0;
}
int mm7_msgtype(MSoapMsg_t *m)
{
Octstr *typ = http_header_value(m->envelope, octstr_imm("MessageType"));
int ret;
if (!typ)
return -1;
ret = mms_string_to_mm7tag(typ);
octstr_destroy(typ);
return ret;
}
static int get_rcptvalues(List *to, List *headers, char *hname)
{
List *l;
int i, n;
l = http_header_find_all(headers, hname);
for (i = 0, n = (l) ? gwlist_len(l) : 0; i < n; i++) {
Octstr *h, *v;
int ch;
http_header_get(l, i, &h, &v);
ch = octstr_get_char(v, 0);
if (ch == '+')
gwlist_append(to, octstr_copy(v, 2, octstr_len(v)));
octstr_destroy(h);
octstr_destroy(v);
}
http_destroy_headers(l);
return 0;
}
int mm7_get_envelope(MSoapMsg_t *m,
Octstr **sender,
List **to, Octstr **subject,
Octstr **vasid,
time_t *expiry_t,
time_t *delivery_t)
{
Octstr *s;
if (*to == NULL)
*to = gwlist_create();
get_rcptvalues(*to, m->envelope, "To");
get_rcptvalues(*to, m->envelope, "Cc");
get_rcptvalues(*to, m->envelope, "Bcc");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -