⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mms_mm7soap.c

📁 一个非常实用的手机mms开发包,能够满足大部分不同品牌和型号手机的开发
💻 C
📖 第 1 页 / 共 3 页
字号:
	  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 + -