mms_pdu.c
来自「mms client」· C语言 代码 · 共 568 行 · 第 1/2 页
C
568 行
p->field = unpack_nul_string(context); \ break;#define OCTSTRE(field, fieldnr, docstring) \ case fieldnr: \ p->field = e_unpack_ ## field(context); \ break;#define REST(field, docstring) \ case 0: \ p->field = parse_get_octets(context, parse_octets_left(context)); \ octstr_dump(p->field, 0); \ break; #include "mms_pdu.def"#undef REST#undef ENCSTRVAL#undef ENCSTRVALE#undef ULONG#undef ULONGABSREL#undef OCTSTR#undef OCTSTRE#undef MMSVERSION#undef UINT#undef PDU default: warning(0, "MMS PDU with unknown type %d", pdu->type); parse_context_destroy(context); mms_pdu_destroy(pdu); return NULL; } parse_context_destroy(context); return pdu;}int pack_value_length(Octstr *data, unsigned long len) { if (len > 30) octstr_append_uintvar(data, len); else octstr_append_char(data, (int)len);}void pack_absoluterelative(Octstr *data, unsigned long value, int absrelindication) { Octstr *intvalue = octstr_create(""); pack_integer_value(data, value); pack_value_length(data, octstr_len(intvalue) + 1); octstr_append_char(data, absrelindication); octstr_append(data, intvalue);}void pack_encoded_string(Octstr *data, Octstr *value, unsigned long charset) { unsigned long len; Octstr *charencoding; if (charset == (unsigned long)128 || charset == (unsigned long)0) { /* normal text string encoding */ pack_text(data, value); } else { len = octstr_len(value); charencoding = octstr_create(""); pack_integer_value(charencoding, charset); /* combined length */ pack_value_length(data, len + (unsigned long)octstr_len(charencoding)); /* the character encoding */ octstr_append(data, charencoding); pack_text(data, value); }}/* some MMS pdu's have a very specific coding */void e_pack_from(Octstr *data, Octstr *value, unsigned long charset) { Octstr *esv; if (data == NULL) { pack_value_length(data, 1); octstr_append_char(data, MMS_FALSE_TOKEN); } else { esv = octstr_create(""); pack_encoded_string (data, value, charset); pack_value_length(data, 1 + octstr_len(esv)); octstr_append_char(data, MMS_TRUE_TOKEN); octstr_append(data, esv); }}void e_pack_content_type(Octstr *data, Octstr *field) { pack_content_type(data, field);}/* rely on mms_pdu.def to have the first three fields in the right order */Octstr *mms_pdu_pack(MMS_PDU *pdu) { Octstr *data; data = octstr_create(""); switch (pdu->type) {#define PDU(name, pdutype, docstring, fields, is_valid) \ case name: { \ struct name *p = &pdu->u.name; \ octstr_append_char(data, 140); \ octstr_append_char(data, pdutype); \ fields \ } break;#define UINT(field, fieldnr, docstring) \ if (p->field > 0) \ { \ octstr_append_char(data, fieldnr + 128); \ octstr_append_char(data, p->field); \ }#define MMSVERSION(field, fieldnr, docstring) \ octstr_append_char(data, fieldnr + 128); \ pack_version_value(data, p->field);#define ULONG(field, fieldnr, docstring) \ if (p->field >= 0) { \ octstr_append_char(data, fieldnr + 128); \ pack_integer_value(data, p->field); \ }#define ULONGABSREL(field, fieldnr, docstring) \ if (p->field >= 0) { \ octstr_append_char(data, fieldnr + 128); \ pack_absoluterelative(data, p->field, p->field ## _absrelind); \ }#define ENCSTRVAL(field, fieldnr, docstring) \ if (p->field != NULL) { \ octstr_append_char(data, fieldnr + 128); \ pack_encoded_string(data, p->field, p->field ## _charset); \ }#define ENCSTRVALE(field, fieldnr, docstring) \ if (p->field != NULL) { \ octstr_append_char(data, fieldnr + 128); \ e_pack_ ## field(data, p->field, p->field ## _charset); \ }#define OCTSTR(field, fieldnr, docstring) \ if (p->field != NULL) { \ octstr_append_char(data, fieldnr + 128); \ pack_text(data, p->field); \ }#define OCTSTRE(field, fieldnr, docstring) \ if (p->field != NULL) { \ octstr_append_char(data, fieldnr + 128); \ e_pack_ ## field(data, p->field); \ }#define REST(field, docstring) \ if (p->field != NULL) \ octstr_append(data, p->field);#include "mms_pdu.def"#undef REST#undef ENCSTRVAL#undef ENCSTRVALE#undef ULONG#undef ULONGABSREL#undef OCTSTR#undef OCTSTRE#undef MMSVERSION#undef UINT#undef PDU default: panic(0, "Packing unknown MMS PDU type %ld", (long) pdu->type); } return data;}//* packing to xml format (for delivery to client software *//* rely on mms_pdu.def to have the first three fields in the right order TODO need to escape stuff */Octstr *mms_pdu_to_xml(MMS_PDU *pdu) { Octstr *data, *temp; data = octstr_create("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"); octstr_append(data, octstr_imm("<mms>\n")); switch (pdu->type) {#define PDU(name, pdutype, docstring, fields, is_valid) \ case name: { \ struct name *p = &pdu->u.name; \ octstr_append(data, octstr_format(" <x_mms_message_type>%ld</x_mms_message_type>\n", pdutype)); \ fields \ } break;#define TYPE(fields, value) \ octstr_append_char(data, 12); \ octstr_append_char(data, value);#define UINT(field, fieldnr, docstring) \ if (p->field > 0) \ octstr_append(data, octstr_format(" <" #field ">%d</" #field ">\n", p->field));#define MMSVERSION(field, fieldnr, docstring) \ if (p->field >= 0) \ octstr_append(data, octstr_format(" <" #field ">%s</" #field ">\n", octstr_get_cstr(p->field)));#define ULONG(field, fieldnr, docstring) \ if (p->field >= 0) \ octstr_append(data, octstr_format(" <" #field ">%ld</" #field ">\n", p->field)); #define ULONGABSREL(field, fieldnr, docstring) \ if (p->field >= 0) { \ octstr_append(data, octstr_format(" <" #field ">%ld</" #field ">\n", p->field)); \ if (p->field ## _absrelind == MMS_TRUE_TOKEN) \ octstr_append(data, octstr_imm(" <" #field "_absolute>true<" #field "_absolute\n>")); \ else \ octstr_append(data, octstr_imm(" <" #field "_absolute>false<" #field "_absolute\n>")); \ }#define ENCSTRVAL(field, fieldnr, docstring) \ if (p->field != NULL) { \ octstr_append(data, octstr_format(" <" #field "_charset>%ld</" #field "_charset>\n", p->field ## _charset)); \ if (p->field ## _charset == 0 || p->field ## _charset == 128) \ octstr_append(data, octstr_format(" <" #field ">%s</" #field ">\n", octstr_get_cstr(p->field))); \ else { \ temp = octstr_duplicate(p->field); octstr_binary_to_base64(temp); \ octstr_append(data, octstr_format(" <" #field " encoding=\"base64\">%s</" #field ">\n", octstr_get_cstr(temp))); \ octstr_destroy(temp); \ } \ }#define ENCSTRVALE(field, fieldnr, docstring) \ if (p->field != NULL) { \ octstr_append(data, octstr_format(" <" #field "_charset>%ld</" #field "_charset>\n", p->field ## _charset)); \ if (p->field ## _charset == 0 || p->field ## _charset == 128) \ octstr_append(data, octstr_format(" <" #field ">%s</" #field ">\n", octstr_get_cstr(p->field))); \ else { \ temp = octstr_duplicate(p->field); octstr_binary_to_base64(temp); \ octstr_append(data, octstr_format(" <" #field " encoding=\"base64\">%s</" #field ">\n", octstr_get_cstr(temp))); \ octstr_destroy(temp); \ } \ }#define OCTSTR(field, fieldnr, docstring) \ if (p->field != NULL) { \ temp = octstr_duplicate(p->field); \ simple_xml_escape(temp); \ octstr_append(data, octstr_format(" <" #field ">%s</" #field ">\n", octstr_get_cstr(temp))); \ octstr_destroy(temp); \ }#define OCTSTRE(field, fieldnr, docstring) \ if (p->field != NULL) { \ temp = octstr_duplicate(p->field); \ simple_xml_escape(temp); \ octstr_append(data, octstr_format(" <" #field ">%s</" #field ">\n", octstr_get_cstr(temp))); \ octstr_destroy(temp); \ }#define REST(field, docstring) \ if (p->field != NULL) { \ temp = octstr_duplicate(p->field); octstr_binary_to_base64(temp); \ octstr_append(data, octstr_format(" <" #field " encoding=\"base64\">%s</" #field ">\n", octstr_get_cstr(temp))); \ octstr_destroy(temp); \ }#include "mms_pdu.def"#undef REST#undef ENCSTRVAL#undef ENCSTRVALE#undef ULONG#undef ULONGABSREL#undef OCTSTR#undef OCTSTRE#undef MMSVERSION#undef UINT#undef PDU default: panic(0, "Packing unknown MMS PDU type %ld", (long) pdu->type); } octstr_append(data, octstr_imm("</mms>\n")); return data;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?