mms_pdu.c

来自「mms client」· C语言 代码 · 共 566 行 · 第 1/2 页

C
566
字号
                    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_rest(context); \                    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 + -
显示快捷键?