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

📄 mms_msg.c

📁 手机端彩信的编解码、以及接收和发送。非常有用。
💻 C
📖 第 1 页 / 共 5 页
字号:
	  else if (ret == WSP_FIELD_VALUE_DATA) 
	       decoded = wsp_unpack_accept_general_form(context);

	  break;
	  
     case MMS_HEADER_DELIVERY_TIME:
     case MMS_HEADER_EXPIRY:
     case MMS_HEADER_REPLY_CHARGING_DEADLINE:
	  
	  
	  if (ret != WSP_FIELD_VALUE_DATA) 
		    warning(0, "Error in value format, field %s!",
			    hname);
	  else {
	       int n = parse_get_char(context);
	       
	       if (n == 0x80) /* Absolute time */
		    decoded = wsp_unpack_date_value(context);
	       else if (n == 0x81) { /* Relative time. */			 
		    long l = 0;
		    time_t t = time(NULL);
		    Octstr *s = wsp_unpack_integer_value(context);
		    
		    octstr_parse_long(&l, s, 0, 10);
		    octstr_destroy(s);			 
		    
		    t += l;
		    decoded = date_format_http(t);			 
	       } else
		    decoded = date_format_http(time(NULL)); /* A default. */
	  }	       
	  break;
     case MMS_HEADER_FROM:
	       if (ret != WSP_FIELD_VALUE_DATA) 
		    warning(0, "Error in value format, field %s!",hname);
	       
	       else {	       
		    int n = parse_get_char(context);
		    
		    if (n == 0x80) { /* Address present. */
			 decoded = decode_encoded_string_value(-1,context, hname);
			 if (mms_validate_address(decoded))
			      warning(0, "Faulty address [%s] format in field %s!", 
				      octstr_get_cstr(decoded), hname);			 
		    } else /* Insert address. */
			 decoded = octstr_duplicate(xfrom);
	       }
	       break;
     case MMS_HEADER_PREVIOUSLY_SENT_BY:
     case MMS_HEADER_PREVIOUSLY_SENT_DATE:
	  if (ret != WSP_FIELD_VALUE_DATA) 
	       warning(0, "Error in value format, field %s!",hname);
	  else {
	       Octstr *t;
	       decoded = wsp_unpack_integer_value(context);
	       
	       if (field_type == MMS_HEADER_PREVIOUSLY_SENT_BY) 
		    t = decode_encoded_string_value(-1, context, hname);
	       else
		    t = wsp_unpack_date_value(context);
	       
	       octstr_append(decoded, t);
	       octstr_destroy(t);
	  }
	  break;  
     /* From here on, these are MMS v1.2 thingies. a few are above as well... */
     case MMS_HEADER_ATTRIBUTES:
	  ch = mms_header_to_cstr(val);
	  break;

     case MMS_HEADER_ELEMENT_DESCRIPTOR:
	  if (ret != WSP_FIELD_VALUE_DATA)
	       warning(0, "Faulty header value for %s!\n", hname);
	  else { /* We expect a content reference and a list of parameters. */
	       Octstr *cr = parse_get_nul_string(context);
	       List *params = http_create_empty_headers();
	       Octstr *ps;
	       while (parse_octets_left(context) > 0) {
		    int val, ret;
		    Octstr *pname = NULL, *pval = NULL;
		    ret = wsp_field_value(context, &val);
		    if (ret == WSP_FIELD_VALUE_ENCODED)
			 pname = mms_descriptor_params_to_string(val|0x80);
		    else if (ret == WSP_FIELD_VALUE_NUL_STRING)
			 pname = parse_get_nul_string(context);

		    if (!pname)
			 continue;
		    ret = wsp_field_value(context, &val);
		    if (ret == WSP_FIELD_VALUE_ENCODED)
			 pval = wsp_content_type_to_string(val);
		    else if (ret == WSP_FIELD_VALUE_NUL_STRING)
			 pval = parse_get_nul_string(context);
		    
		    if (pval) {
			 http_header_add(params, octstr_get_cstr(pname), octstr_get_cstr(pval));
			 octstr_destroy(pval);
		    }		    
		    octstr_destroy(pname);		    
	       }
	       ps = make_value_parameters(params);
	       decoded = octstr_format("%S%s%S", cr, 
				       (ps && octstr_len(ps) > 0) ? "; " : "", 
				       ps);
	       octstr_destroy(cr);
	       octstr_destroy(ps);
	       http_destroy_headers(params);
	  }
	  break;

     case MMS_HEADER_MBOX_TOTALS:
     case MMS_HEADER_MBOX_QUOTAS:
	  if (ret != WSP_FIELD_VALUE_DATA)
	       warning(0, "Faulty header value for %s!\n", hname);
	  else {
	       int n = parse_get_char(context);
	       decoded = wsp_unpack_integer_value(context);	       
	       octstr_format_append(decoded, " %s", (n == 0x80) ? "msgs" : "bytes");
	  }	  
	  break;
     case MMS_HEADER_MM_FLAGS:
	  if (ret != WSP_FIELD_VALUE_DATA)
	       warning(0, "Faulty header value for %s!\n", hname);
	  else {
	       int n = parse_get_char(context);	 
	       char *s;
	       Octstr *p;
	       
	       if (n == 0x80) /* Add, subtract or filter. */
		    s = "+";
	       else if (n == 0x81)
		    s = "-";
	       else 
		    s = "/";
	       
	       p = decode_encoded_string_value(-1,context, hname);
	       decoded = octstr_format("%s%S", s, p);
	       octstr_destroy(p);
	  }
	  break;
     case MMS_HEADER_MM_STATE:
	  ch = mms_mm_state_to_cstr(val);
	  break;
     case MMS_HEADER_STORE_STATUS:
	  ch = mms_store_status_to_cstr(val|0x80);
	  break;
	  
     default:
	  warning(0, "MMS: Unknown header with code 0x%02x!", field_type);
     }

     if (ret == WSP_FIELD_VALUE_DATA) {
	  parse_skip_to_limit(context);
	  parse_pop_limit(context);
     }

     if (ch == NULL && decoded != NULL)
	  ch = (unsigned char *)octstr_get_cstr(decoded);
     
     if (ch == NULL)
	  goto value_error;
     
     if (!hname) {
	  warning(0, "Unknown header number 0x%02x.", field_type);
	  goto value_error;
     }
     
     http_header_add(unpacked, (char *)hname, (char *)ch);
     if (decoded) octstr_destroy(decoded);
     return val;
     
 value_error:
     warning(0, "Skipping faulty header [code=%d, val=%d]!", field_type, val);
     octstr_destroy(decoded);     
     return -1;
}

static int decode_msgheaders(ParseContext *context, List *hdrs, Octstr *from, int stop_on_ctype)
{
     int fcont = 1;
     int msgtype = 0;
     
     gw_assert(hdrs != NULL);
     
     while (fcont && parse_octets_left(context) && 
	  !parse_error(context)) {
	  int byte = parse_get_char(context);
	  int val = 0;
	  
	  if (byte >= 0x80)
	       val = mms_unpack_well_known_field(hdrs, byte&0x7f, context, from, msgtype);
	  else {
	       parse_skip(context, -1); /* Go back a bit. */
	       wsp_unpack_app_header(hdrs, context);
	  }
	  if ((byte&0x7f) ==  MMS_HEADER_CONTENT_TYPE && 
	       stop_on_ctype)
	       fcont = 0;
	  if ((byte&0x7f) ==  MMS_HEADER_MESSAGE_TYPE)
	       msgtype = val;
     }
     
     return 0;
}


static void mms_pack_well_known_field(Octstr *os, int field_type, Octstr *value)
{
     Octstr *encoded = octstr_create("");
     int ch = 0;
     unsigned char c;

     switch (field_type) {
	  
     case MMS_HEADER_TO:
     case MMS_HEADER_CC:
     case MMS_HEADER_BCC:
     case MMS_HEADER_SUBJECT:
     case MMS_HEADER_TRANSACTION_ID:
     case MMS_HEADER_MESSAGE_ID:
     case MMS_HEADER_REPLY_CHARGING_ID:
     case MMS_HEADER_RETRIEVE_TEXT:

     case MMS_HEADER_STORE_STATUS_TEXT:
	  
	  wsp_pack_text(os, value); /* XXX need to deal with charset issues. */
	  break;	       
	  
     case MMS_HEADER_RESPONSE_TEXT: /* make sure response status does not begin with digit!! Has special meaning*/
     case MMS_HEADER_CONTENT_LOCATION:
	  if (isdigit(octstr_get_char(value, 0))) { /* begins with number. */
	       long i, l;
	       Octstr *s;
	       i = octstr_parse_long(&l, value, 0, 10);
	       if (i < 0) {
		    warning(0, "Bad counter for field %s!", 
			    mms_header_to_cstr(field_type));
		    i = 0;
	       }
	       wsp_pack_integer_value(encoded, l);
	       s = octstr_copy(value, i, octstr_len(value));
	       octstr_strip_blanks(s);

	       wsp_pack_text(encoded,s);
	       wsp_pack_value(os, encoded);
	       
	       octstr_destroy(s);
	  } else
	       wsp_pack_text(os, value);
	  break;
     case MMS_HEADER_MMS_VERSION:
	  wsp_pack_version_value(os, value);
	  break;
	  /* integer/octet values: Need to stream line this with better error-checking */
     case MMS_HEADER_DELIVERY_REPORT:	 
     case MMS_HEADER_REPORT_ALLOWED:
     case MMS_HEADER_READ_REPORT:
	  
     case MMS_HEADER_DISTRIBUTION_INDICATOR:
     case MMS_HEADER_QUOTAS:
	  
     case MMS_HEADER_STORE:
     case MMS_HEADER_STORED:
     case MMS_HEADER_TOTALS:

	  pack_short_integer(os, mms_string_to_reports(value));
	  break;
     case MMS_HEADER_MESSAGE_TYPE:
	   pack_short_integer(os, mms_string_to_message_type(value));
	  break;
     case MMS_HEADER_PRIORITY:
	  pack_short_integer(os, mms_string_to_priority(value));
	  break;
     case MMS_HEADER_READ_STATUS:
	  pack_short_integer(os, mms_string_to_read_status(value));
	  break;	  
     case MMS_HEADER_REPLY_CHARGING:
	  pack_short_integer(os, mms_string_to_reply_charging(value));
	  break;

     case MMS_HEADER_RESPONSE_STATUS:
	  if (isdigit(octstr_get_char(value, 0))) { /* begins with number. */
	       long i, l;
	       Octstr *s;
	       i = octstr_parse_long(&l, value, 0, 10);
	       if (i < 0) {
		    warning(0, "Bad counter for field %s!", 
			    mms_header_to_cstr(field_type));
		    i = 0;
	       }
	       wsp_pack_integer_value(encoded, l);
	       s = octstr_copy(value, i, octstr_len(value));
	       octstr_strip_blanks(s);

	       pack_short_integer(encoded, mms_string_to_response_status(s));
	       wsp_pack_value(os, encoded);
	       
	       octstr_destroy(s);
	  } else
	       pack_short_integer(os, mms_string_to_response_status(value));
	  break;
     case MMS_HEADER_RETRIEVE_STATUS:
	  pack_short_integer(os, mms_string_to_retrieve_status(value));
	  break;
     case MMS_HEADER_STATUS:
	  pack_short_integer(os, mms_string_to_status(value));
	  break;
     case MMS_HEADER_SENDER_VISIBILITY:
	  pack_short_integer(os, mms_string_to_visibility(value));
	  break;
     case MMS_HEADER_MESSAGE_CLASS: 	  
	  ch = mms_string_to_message_class(value);
	  if (ch < 0)
	       wsp_pack_text(os, value);
	  else
	       pack_short_integer(os, ch);
	  break;
	  
     case MMS_HEADER_DATE: /* Date values. */	       
	  wsp_pack_date(os, value);
	  break;	  

     case MMS_HEADER_MESSAGE_SIZE:

     case MMS_HEADER_REPLY_CHARGING_SIZE:
     case MMS_HEADER_START:

     case MMS_HEADER_LIMIT:
     case MMS_HEADER_MESSAGE_COUNT:

	  wsp_pack_integer_string(os, value);
	  break;
	  
     case MMS_HEADER_CONTENT_TYPE:
	  wsp_pack_content_type(os, value);
	  break;
	  
     case MMS_HEADER_DELIVERY_TIME:
     case MMS_HEADER_EXPIRY:
     case MMS_HEADER_REPLY_CHARGING_DEADLINE:

	  if (octstr_isnum(value) == 1) { 	       /* A delta value. */

	       long l;

	       sscanf(octstr_get_cstr(value), "%ld", &l);
	       c = 129;
	       octstr_append_char(encoded, c);
	       wsp_pack_long_integer(encoded, l);
	  } else {  /* Must be a date value .*/
	       c = 128;
	       octstr_append_char(encoded, c);	       
	       wsp_pack_date(encoded, value);
	  }

	  wsp_pack_value(os, encoded);

	  break;
     case MMS_HEADER_FROM:

	  if (octstr_compare(octstr_imm("#insert"), value) == 0) {
	       c = 129;
	       octstr_append_data(encoded, (char *)&c, 1);
	  } else {
	       c = 128;
	       octstr_append_data(encoded, (char *)&c, 1);
	       wsp_pack_text(encoded, value);
	  }
	  wsp_pack_value(os, encoded);
	  
	  break;
     case MMS_HEADER_PREVIOUSLY_SENT_BY:
     case MMS_HEADER_PREVIOUSLY_SENT_DATE:
     {
	  long i, l;
	  Octstr *s;
	  
	  i = octstr_parse_long(&l, value, 0, 10);
	  if (i <0) {
	       warning(0, "Bad counter indicator for field!");
	       i = 0;
	  }
	  
	  wsp_pack_integer_value(encoded, l);
	  s = octstr_copy(value, i, octstr_len(value));

	  octstr_strip_blanks(s);

	  if (field_type == MMS_HEADER_PREVIOUSLY_SENT_BY) 		
	       wsp_pack_text(encoded, s);
	  else
	      wsp_pack_date(encoded, s);
	       
	  octstr_destroy(s);
	  wsp_pack_value(os, encoded);
     }
     break;     

     case MMS_HEADER_MM_STATE:
	  pack_short_integer(os, mms_string_to_mm_state(value));
	  break;
	  
     case MMS_HEADER_STORE_STATUS:
	  pack_short_integer(os, mms_string_to_store_status(value));
	  break;
     case MMS_HEADER_MM_FLAGS:
     {
	  Octstr *s;
	  int i = 1;
	  ch = octstr_get_char(value, 0);
	  
	  if (ch == '+') 
	       pack_short_integer(encoded, 0x80);
	  else if (ch == '-') 
	       pack_short_integer(encoded, 0x81);
 	  else if (ch == '/')
	       pack_short_integer(encoded, 0x82);
	  else {
	       i = 0;
	       pack_short_integer(encoded, 0x82); /* default is filter. */
	  }
	  s = octstr_copy(value, i, octstr_len(value));
	  wsp_pack_text(encoded, s);
	  wsp_pack_value(os, encoded);
	  
	  octstr_destroy(s);
     }
     break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -