- 论坛徽章:
- 0
|
// WSP_PDU.def 文件
PDU(Connect, "...",
TYPE(8, 1)
UINT(version, "WSP protocol version", 8)
UINTVAR(capabilities_len, "Length of capabilities")
UINTVAR(headers_len, "Length of session headers")
OCTSTR(capabilities, "Requested capabilities", capabilities_len)
OCTSTR(headers, "Session headers", headers_len)
, 1)
//WSP_PDU.C 文件
//开始定义数据包结构体
struct wsp_pdu {
int type;
union {
/* For each PDU, declare a structure with its fields, named after the PDU */
#define PDU(name, docstring, fields, is_valid) struct name { fields } name;
#define UINT(field, docstring, bits) unsigned long field;
#define UINTVAR(field, docstring) unsigned long field;
#define OCTSTR(field, docstring, lengthfield) Octstr *field;
#define REST(field, docstring) Octstr *field;
#define TYPE(bits, value)
#define RESERVED(bits)
#define TPI(confield)
#include "wsp_pdu.def" // 问: 这里将WSP_PDU.DEF 文件 include 进来是出于什么目的呢?
#undef RESERVED
#undef TYPE
#undef REST
#undef OCTSTR
#undef UINTVAR
#undef UINT
#undef PDU
} u;
};
// 组包函数
WSP_PDU *wsp_pdu_unpack(Octstr *data) {
WSP_PDU *pdu = NULL;
long bitpos = 0;
gw_assert(data != NULL);
pdu = gw_malloc(sizeof(*pdu));
pdu->type = wsp_pdu_type(data);
switch (pdu->type) {
#define PDU(name, docstring, fields, is_valid) \
case name: { \
struct name *p = &pdu->u.name; \
fields \
gw_assert(bitpos % 8 == 0); \
if (bitpos / 8 != octstr_len(data)) { \
warning(0, "Bad length for " #name " PDU, " \
"expected %ld", bitpos / 8); \
} \
if (!(is_valid)) { \
warning(0, #name " PDU failed %s", #is_valid); \
} \
} break; // 问:这里是在做什么呢? 为什么在这里要定义 #define PDU(name, docstring, fields, is_valid)
#define UINT(field, docstring, bits) \
p->field = octstr_get_bits(data, bitpos, (bits)); \
bitpos += (bits);
#define UINTVAR(field, docstring) \
gw_assert(bitpos % 8 == 0); \
p->field = octstr_get_bits(data, bitpos + 1, 7); \
while (octstr_get_bits(data, bitpos, 1)) { \
bitpos += 8; \
p->field <<= 7; \
p->field |= octstr_get_bits(data, bitpos + 1, 7); \
} \
bitpos += 8;
#define OCTSTR(field, docstring, lengthfield) \
gw_assert(bitpos % 8 == 0); \
p->field = octstr_copy(data, bitpos / 8, p->lengthfield); \
bitpos += 8 * p->lengthfield;
#define REST(field, docstring) \
gw_assert(bitpos % 8 == 0); \
if (bitpos / 8 <= octstr_len(data)) { \
p->field = octstr_copy(data, bitpos / 8, \
octstr_len(data) - bitpos / 8); \
bitpos = octstr_len(data) * 8; \
} else { \
p->field = octstr_create(""); \
}
#define TYPE(bits, value) bitpos += (bits);
#define RESERVED(bits) bitpos += (bits);
#include "wsp_pdu.def" //问:再次 将DEF 文件include 进来有什么用呢?
#undef TYPE
#undef REST
#undef OCTSTR
#undef UINTVAR
#undef UINT
#undef PDU
default:
warning(0, "WSP PDU with unknown type %d", pdu->type);
gw_free(pdu);
return NULL;
}
return pdu;
}
请高手解答一下哈
[ 本帖最后由 longhongxu 于 2008-7-1 16:19 编辑 ] |
|