亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mms_mm7soap.c

?? 手機端彩信的編解碼、以及接收和發送。非常有用。
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*
 * Mbuni - Open  Source MMS Gateway 
 * 
 * MM7/SOAP message encoder/decoder and helper functions
 * 
 * Copyright (C) 2003 - 2005, Digital Solutions Ltd. - http://www.dsmagic.com
 *
 * Paul Bagyenda <bagyenda@dsmagic.com>
 * 
 * This program is free software, distributed under the terms of
 * the GNU General Public License, with a few exceptions granted (see LICENSE)
 */

#include "mms_mm7soap.h"

/* function to traverse SOAP env:Body extracting useful headers. */

#define dfltstr(e) ((e) ? ((char *)(e)) : "")

#define content(n) ((n)->xmlChildrenNode ? dfltstr(((n)->xmlChildrenNode)->content) : dfltstr((n)->content))

struct MSoapMsg_t {
     List *envelope; /* of http headers. */
     MIMEEntity *msg; /* XXX - be sure to copy some headers to this from envelope before convert...*/
};

/* We expect ISO formatted time, or interval. */

static Octstr *parse_time(char *s)
{
     time_t t = time(NULL);
     Octstr *p = octstr_create(s);
     int i = 0, secs = 0;

     octstr_strip_blanks(p);

     if (s && s[0] != 'P') {
	  struct universaltime tt;
	  if (date_parse_iso(&tt, p) >= 0)
	       t = date_convert_universal(&tt);
	  goto done;
     } else 
	  i++;

     while (i < octstr_len(p)) {
	  long n = 0;
	  int ch;
	  
	  if (octstr_get_char(p, i) == 'T') {
	       secs = 1;
	       i++;
	  }
	  
	  i = octstr_parse_long(&n, p, i, 10);
	  
	  if (i < 0)
	       break;
	  ch = octstr_get_char(p, i);
	  i++;
	  switch(ch) {
	  case 'Y': /* years. approx to 365 1/4 days. */
	       t += (365.25*24*3600*n);
	       break;
	  case 'M': /* month or minutes. approx month = 30 days. */
	       if (secs)
		    t += n*60;
	       else 
		    t += 30*24*3600*n; 
	       break;
	  case 'D':
	       t += n*24*3600;
	       break;
	  case 'H': /* hours. */
	       t += n*3600;
	       break;
	  case 'S':
	       t += n;
	       break;
	  default:
	       break;
	  }
     }     

 done:
     octstr_destroy(p);
     return date_format_http(t);
}

static int parse_header(xmlNodePtr node, List *headers, int *sigparent)
{
     int skip = 0;
     int tag;
     char *hname;
     unsigned char *s = NULL;
     char *nvalue;
     Octstr *value = NULL, *tmp;
     
     
     if (!node || node->type != XML_ELEMENT_NODE)
	  return -1;

     /* look at each node in turn, extract meaning.
      * we ignore some tags: senderidentification, etc because we don't need them.
      * we are also not strict on syntax (when receiving): we will be on sending!
      */
     
     hname = (char *)node->name;
     nvalue = content(node);

     tmp = octstr_create(hname);
     tag = mms_string_to_mm7tag(tmp);
     octstr_destroy(tmp);

     switch(tag) {
     case MM7_TAG_CancelReq:
     case MM7_TAG_CancelRsp:
     case MM7_TAG_DeliverReq:
     case MM7_TAG_DeliverRsp:
     case MM7_TAG_DeliveryReportReq:
     case MM7_TAG_DeliveryReportRsp:
     case MM7_TAG_RSErrorRsp:
     case MM7_TAG_ReadReplyReq:
     case MM7_TAG_ReadReplyRsp:
     case MM7_TAG_ReplaceReq:
     case MM7_TAG_ReplaceRsp:
     case MM7_TAG_SubmitReq:
     case MM7_TAG_SubmitRsp:
     case MM7_TAG_VASPErrorRsp:
	  hname = "MessageType";
	  value = mms_mm7tag_to_string(tag);
	  break;
     case MM7_TAG_SenderIdentification:
     case MM7_TAG_Recipients:

       skip = 1;
       break;

     case MM7_TAG_Recipient:
	  *sigparent = MM7_TAG_To; /* make it a To field. */

	  break;
     case MM7_TAG_To:
     case MM7_TAG_Cc:
     case MM7_TAG_Bcc:
     case MM7_TAG_Sender:	  
     case MM7_TAG_SenderAddress:	  
	  skip = 1;
	  
	  *sigparent = tag; /* We wait for number and stuff below. */
	  break;
     case MM7_TAG_Content: 	  
       if ((s = xmlGetProp(node, (unsigned char *)"href")) != NULL) {
	    value = octstr_create((char *)s); 
	       xmlFree(s);
	  }
	  /* we keep 'cid:' bit.  ignore the bit about adaptation. */
	  break;
     case MM7_TAG_ShortCode:
     case MM7_TAG_Number: /* we will not normalise number here, that's for upper level. */
	  value = octstr_format("%s/TYPE=PLMN", nvalue);

	  /* -- fall through. -- */
     case MM7_TAG_RFC2822Address:
	  if (!value)
	       value = octstr_create(nvalue);
	  hname = (char *)mms_mm7tag_to_cstr(*sigparent); /* real tag is parent. */
	  
	  s = xmlGetProp(node, (unsigned char *)"displayOnly");
	  if (s && strcasecmp((char *)s, "true") == 0) /* a '-' indicates don't use this to send. */
	       octstr_insert(value, octstr_imm("- "), 0);
	  else 
	       octstr_insert(value, octstr_imm("+ "), 0);
	  if (s)
	       xmlFree(s);
 	  break;

     case MM7_TAG_EarliestDeliveryTime:
     case MM7_TAG_ExpiryDate:
     case MM7_TAG_TimeStamp:
     case MM7_TAG_Date:
	  value = parse_time(nvalue);
	  break;
	  
     case MM7_TAG_ReplyCharging:
	  value = octstr_create("Requested");
	  
	  if ((s = xmlGetProp(node, (unsigned char *)"replyChargingSize")) != NULL) {
	       http_header_add(headers, "replyChargingSize", (char *)s);
	       xmlFree(s);
	  }
	  if ((s = xmlGetProp(node, (unsigned char *)"replyDeadline")) != NULL) {
	       Octstr *t = parse_time((char *)s);	       
	       http_header_add(headers, "replyDeadline", octstr_get_cstr(t));
	       xmlFree(s);
	       octstr_destroy(t);
	  }
	  break;	  
     default:
	  break;
     }
     
     if (!value) 
	  value = octstr_create(nvalue);
     octstr_strip_blanks(value);

     if (!skip && tag >= 0 && hname != NULL) {
	  http_header_add(headers, hname, octstr_get_cstr(value));     
#if 1
	  info(0, "parse.soap, h=%s, v=%s!", hname, octstr_get_cstr(value));
#endif 
     }
     octstr_destroy(value);

     return 0;
}

static int parse_headers(xmlNodePtr start, List *h, int sigparent)
{
     xmlNodePtr x;

     for (x = start; x; x = x->next) 
	  if (x->type != XML_COMMENT_NODE) {
	       parse_header(x, h, &sigparent);	       
	       parse_headers(x->xmlChildrenNode, h, sigparent);
	  }
     return 0;
}

MSoapMsg_t *mm7_parse_soap(List *headers, Octstr *body)
{
     MIMEEntity  *mime = mime_http_to_entity(headers, body), *start = NULL;
     Octstr *xml = NULL, *cloc;
     xmlDocPtr doc;
     MIMEEntity *msg = NULL;
     List *h;
     int s = -1;     
     MSoapMsg_t *smsg = NULL;
     
     if (!mime) 
	  return NULL;
     /* Find the start element: 
      * - either the mime entity is multipart and has start param (or implicitly first element) ...
      * - or entity is not multipart, so body is xml
      */
          
     if ((start = mime_multipart_start_elem(mime)) != NULL) 
	  xml = mime_entity_body(start);
     else
	  xml = mime_entity_body(mime);
     
     if (!xml) 
	  goto done;
#if  1
     info(0, "XML sent is: %s!", octstr_get_cstr(xml));
#endif
     doc = xmlParseMemory(octstr_get_cstr(xml), octstr_len(xml));
     if (!doc || !doc->xmlChildrenNode)
	  goto done;
     
     h = http_create_empty_headers();

     parse_headers(doc->xmlChildrenNode, h, s);
     xmlFreeDoc(doc);
     
     if (!h)
	  goto done;
     
     cloc = http_header_value(h, octstr_imm("Content"));
     
     if (cloc) {
	  /* XXXX only support content that is inline.  easy to add external. */
	  MIMEEntity *c = NULL;
	  int i, n;
	  char *loc = octstr_get_cstr(cloc);
	  
	  if (octstr_case_search(cloc, octstr_imm("cid:"), 0) == 0) /* skip 'cid:' part. */
	       loc += 4; /* XXX This should always be there, but some MMC don't put it there. */
	  
	  for (i = 0, n = mime_entity_num_parts(mime); i<n; i++) {
	       MIMEEntity *x = mime_entity_get_part(mime, i);
	       List *headers = mime_entity_headers(x); 
	       Octstr *y = headers ? http_header_value(headers, octstr_imm("Content-ID")) : NULL;
	       char *cid = (y && octstr_get_char(y, 0) == '<') ? octstr_get_cstr(y) + 1 : (y ? octstr_get_cstr(y) : "");
	       int cid_len = (y && octstr_get_char(y, 0) == '<') ? octstr_len(y) - 2 : (y ? octstr_len(y) : 0);
	       
	       if (y && 
		   (strncmp(loc, cid, cid_len) == 0 ||
		    octstr_compare(y, cloc) == 0)) /* XXX seems wrong, but some MMC out there behave badly, so we support it */
		    c = mime_entity_duplicate(x);
	       
	       if (y) 
		    octstr_destroy(y);
	       http_destroy_headers(headers);
	       mime_entity_destroy(x);
	       if (c) 
		    break;
	  } 
	  if (c)
	       msg = c; /* this is already a copy. */	  
	  octstr_destroy(cloc);	  
     } else {
	       /* XXX Sigh! Broken MMC don't set this parameter. Lets try to be kind to them! */
	       int i, n = mime_entity_num_parts(mime);
	       int found = 0;
	       for (i = 0; !found && i < n; i++) {
		    MIMEEntity *x = mime_entity_get_part(mime,i);
		    List *hx = NULL;
		    Octstr *xctype = NULL, *xparams = NULL;
		    if (!x)
			 goto loop;
		    hx = mime_entity_headers(x);
		    get_content_type(hx, &xctype, &xparams);
		    
		    if (xctype && octstr_case_compare(xctype, octstr_imm("text/xml")) != 0) {
			 /* Found something that might be the body, since its not XML. 
			  * Perhaps we compare bodies? For broken ones anyway, so no bother!
			  */
			 found = 1;
			 msg = x;
		    }
	       loop:
		    if (x && !found) mime_entity_destroy(x);
		    if (hx) http_destroy_headers(hx);
		    octstr_destroy(xctype);
		    octstr_destroy(xparams);
	       }
     }
          
     smsg = gw_malloc(sizeof *smsg);
     smsg->envelope = h;
     smsg->msg = msg;

 done:
     if (mime)
	  mime_entity_destroy(mime);
     if (start)
	  mime_entity_destroy(start);
     if (xml)
	  octstr_destroy(xml);
     return smsg;
}

static int append_address(Octstr *p, Octstr *addr_spec)
{
     Octstr *v = addr_spec;
     char *y;
     int j, ch = octstr_get_char(v, 0);
     if (ch == '-')
	  y = " displayOnly=\"true\"";
     else 
	  y = "";
     j = octstr_case_search(v, octstr_imm("/TYPE=PLMN"),0);
     if (j >= 0) {
	  Octstr *z = octstr_copy(v, 2, j-2); /* skip the initial char that is only for info purposes. */
	  octstr_format_append(p, "<mm7:Number%s>%S</mm7:Number>\n", y, z);
	  octstr_destroy(z);
     } else 
	  octstr_format_append(p, "<mm7:RFC2822Address%s>%s</mm7:RFC2822Address>\n", 
			       y, octstr_get_cstr(v) + 2); /* as above... */
     return 0;
}

static void output_rcpt(char *hdr, List *hdrs, Octstr *p)
{
     List *l = http_header_find_all(hdrs, hdr);
     char x[32];
     int i, n;

     for (i = 0, n = gwlist_len(l), x[0]=0; i < n; i++) {
	  Octstr *h = NULL, *v  = NULL;
	  http_header_get(l, i, &h, &v);

	  if (octstr_str_compare(h, x) != 0) {
	       if (x[0])
		    octstr_format_append(p, "</mm7:%s>\n", x);
	       strncpy(x, octstr_get_cstr(h), sizeof x);
	       octstr_format_append(p, "<mm7:%S>\n", h);
	  }
	  octstr_destroy(h);
	  append_address(p, v); /* put the address in */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产99久久久久久免费看农村| 亚洲欧洲日产国产综合网| 日韩一级完整毛片| 国产日韩影视精品| 亚洲永久免费av| 99视频精品全部免费在线| 欧美一区二区免费观在线| 色综合久久精品| 2020国产精品| 亚洲成人动漫在线观看| 国产麻豆91精品| 欧美人与禽zozo性伦| 国产日韩精品一区二区三区| 午夜精品福利一区二区三区av| 国产成人精品亚洲午夜麻豆| 欧美另类videos死尸| 国产婷婷色一区二区三区在线| 亚洲午夜私人影院| 成人一区在线看| 欧美一区二区三区成人| 亚洲欧美日韩国产综合在线| 国产成人在线视频免费播放| 欧美年轻男男videosbes| 欧美一区二区不卡视频| 欧美亚洲高清一区| 91精品国产丝袜白色高跟鞋| 国产一区二区三区视频在线播放| 中文字幕一区二区三区在线不卡| 欧美日韩国产高清一区二区三区 | 国产成人欧美日韩在线电影| 久久人人爽爽爽人久久久| 日韩欧美区一区二| 福利一区二区在线| 国产亚洲欧洲一区高清在线观看| 美女视频第一区二区三区免费观看网站| 欧美日韩精品欧美日韩精品| 亚洲国产精品久久人人爱| 欧美性淫爽ww久久久久无| 亚洲欧美国产毛片在线| 91在线精品一区二区三区| 一区在线观看视频| 一本大道久久a久久精二百 | 爽好久久久欧美精品| 欧美三级乱人伦电影| 丁香婷婷综合激情五月色| 欧美精品亚洲二区| 日韩一级成人av| 欧美岛国在线观看| 精品中文av资源站在线观看| 精品日韩av一区二区| 国产成人无遮挡在线视频| 国产精品视频一二三区| 99国产精品久| 亚洲第一电影网| 日韩欧美区一区二| 粗大黑人巨茎大战欧美成人| 国产精品久久久久久久久晋中| 色综合久久久久久久久| 天天影视色香欲综合网老头| 精品成人a区在线观看| 成人综合婷婷国产精品久久蜜臀| 亚洲欧美日韩久久| 91精品国产91久久综合桃花| 国产乱理伦片在线观看夜一区| 国产精品久久久久久久久动漫| 在线看不卡av| 久久国产精品第一页| 中文字幕一区日韩精品欧美| 欧洲国内综合视频| 黄色资源网久久资源365| 国产精品日产欧美久久久久| 欧美日韩综合在线免费观看| 国产最新精品免费| 亚洲蜜桃精久久久久久久| 欧美一级日韩免费不卡| 成人午夜电影小说| 秋霞电影网一区二区| 中文字幕色av一区二区三区| 日韩一级片在线播放| 99久久99久久精品免费观看| 免费观看日韩av| 一区二区三区在线免费视频 | 99v久久综合狠狠综合久久| 久久精品久久综合| 欧美大片拔萝卜| 91丨porny丨在线| 久久精品99国产国产精| 亚洲综合无码一区二区| 中文字幕精品一区| 日韩美一区二区三区| 在线观看欧美日本| 懂色av一区二区三区免费看| 日韩福利电影在线| 亚洲靠逼com| 中文字幕欧美日韩一区| 欧美mv日韩mv国产网站app| 欧美日韩高清在线播放| 91浏览器打开| 成人a免费在线看| 国产呦萝稀缺另类资源| 日本美女一区二区三区| 亚洲午夜私人影院| 亚洲一区二区在线视频| 中文字幕日本不卡| 国产精品成人一区二区艾草 | 亚洲日本免费电影| 国产视频一区二区在线| 精品国产一区二区亚洲人成毛片| 欧美日韩一区视频| 欧美曰成人黄网| 日本精品一区二区三区四区的功能| 国产91丝袜在线18| 国产成人在线看| 狠狠网亚洲精品| 国内成+人亚洲+欧美+综合在线| 奇米在线7777在线精品 | 美腿丝袜亚洲色图| 日韩精品成人一区二区在线| 五月激情综合婷婷| 日韩精品欧美精品| 另类小说综合欧美亚洲| 美腿丝袜亚洲色图| 国产在线精品视频| 国产成人精品在线看| 成人性色生活片免费看爆迷你毛片| 国产精品小仙女| 岛国精品在线观看| 99这里都是精品| 在线观看日韩高清av| 欧洲一区二区三区免费视频| 欧美视频在线观看一区二区| 欧美日韩亚洲高清一区二区| 欧美另类一区二区三区| 日韩欧美国产综合| 久久精品一区八戒影视| 国产精品视频一区二区三区不卡| 国产精品传媒入口麻豆| 亚洲综合在线观看视频| 日韩二区三区四区| 国产一区二区美女| 99精品在线免费| 欧美人妖巨大在线| 精品99999| 亚洲猫色日本管| 婷婷亚洲久悠悠色悠在线播放| 日韩成人伦理电影在线观看| 国产一区久久久| 色呦呦国产精品| 欧美xxxxx牲另类人与| 国产肉丝袜一区二区| 一区二区欧美国产| 久久99蜜桃精品| 97国产一区二区| 日韩女同互慰一区二区| 国产精品福利一区| 蜜臀久久99精品久久久久久9 | 欧美精品一区二区三区蜜桃| 欧美国产精品一区| 亚洲不卡一区二区三区| 国产一区二区不卡老阿姨| 色久综合一二码| 欧美成人bangbros| 一区二区三区不卡视频 | 亚洲国产wwwccc36天堂| 国产综合一区二区| 91福利在线看| 国产网站一区二区三区| 日韩成人午夜电影| 91香蕉视频污在线| 久久理论电影网| 亚洲成精国产精品女| 不卡视频在线看| 精品成人私密视频| 爽爽淫人综合网网站| 99久久免费视频.com| 精品国免费一区二区三区| 亚洲综合色在线| 成人app下载| 久久嫩草精品久久久精品| 性欧美疯狂xxxxbbbb| 91麻豆国产福利精品| 国产欧美在线观看一区| 免费在线观看一区| 欧美亚洲高清一区| 国产精品福利av| 成人综合在线观看| 久久久久99精品国产片| 麻豆91小视频| 91.麻豆视频| 五月天激情综合网| 欧美日韩一区二区三区四区五区| 国产精品国产三级国产a| 福利视频网站一区二区三区| 久久精品72免费观看| 国产精品久久精品日日| 欧美老肥妇做.爰bbww| 国产麻豆精品在线观看| 蜜臀va亚洲va欧美va天堂| 日本成人中文字幕| 日本视频在线一区|