📄 mms_msg.c
字号:
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 + -