wap_events.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:5k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * wap_events.c - functions for manipulating wapbox events
  3.  *
  4.  * Aarno Syv鋘en
  5.  * Lars Wirzenius
  6.  */
  7. #include "gwlib/gwlib.h"
  8. #include "wsp_caps.h"
  9. #include "wap_events.h"
  10. #include "wtls_pdu.h"
  11. WAPEvent *wap_event_create(WAPEventName type) {
  12. WAPEvent *event;
  13. gw_assert(type >= 0);
  14. gw_assert(type < WAPEventNameCount);
  15. event = gw_malloc(sizeof(WAPEvent));
  16. event->type = type;
  17. switch (event->type) {
  18. #define WAPEVENT(name, prettyname, fields) 
  19. case name: 
  20. { struct name *p = &event->u.name; fields } 
  21. break;
  22. #define OCTSTR(name) p->name = NULL;
  23. #define OPTIONAL_OCTSTR(name) p->name = NULL;
  24. #define INTEGER(name) p->name = 0;
  25. #define WTLSPDUS(name) p->name = NULL;
  26. #define HTTPHEADER(name) p->name = NULL;
  27. #define ADDRTUPLE(name) p->name = NULL;
  28. #define CAPABILITIES(name) p->name = NULL;
  29. #include "wap_events.def"
  30. default:
  31. panic(0, "Unknown WAP event type %d", event->type);
  32. }
  33. return event;
  34. }
  35. void wap_event_destroy(WAPEvent *event) {
  36. if (event == NULL)
  37. return;
  38. wap_event_assert(event);
  39. switch (event->type) {
  40. #define WAPEVENT(name, prettyname, fields) 
  41. case name: 
  42. { struct name *p = &event->u.name; fields; } 
  43. break;
  44. #define OCTSTR(name) octstr_destroy(p->name);
  45. #define OPTIONAL_OCTSTR(name) octstr_destroy(p->name);
  46. #define INTEGER(name) p->name = 0;
  47.     #define WTLSPDUS(name) debug("wap.events",0,"You need to create wtls_pdulist_destroy!");
  48. #define HTTPHEADER(name) http_destroy_headers(p->name);
  49. #define ADDRTUPLE(name) wap_addr_tuple_destroy(p->name);
  50. #define CAPABILITIES(name) wsp_cap_destroy_list(p->name);
  51. #include "wap_events.def"
  52. default:
  53. panic(0, "Unknown WAPEvent type %d", (int) event->type);
  54. }
  55. gw_free(event);
  56. }
  57. void wap_event_destroy_item(void *event) {
  58. wap_event_destroy(event);
  59. }
  60. WAPEvent *wap_event_duplicate(WAPEvent *event) {
  61. WAPEvent *new;
  62. if (event == NULL)
  63. return NULL;
  64. wap_event_assert(event);
  65. new = gw_malloc(sizeof(WAPEvent));
  66. new->type = event->type;
  67. switch (event->type) {
  68. #define WAPEVENT(name, prettyname, fields) 
  69. case name: 
  70. { struct name *p = &new->u.name; 
  71.   struct name *q = &event->u.name; 
  72.   fields } 
  73. break;
  74. #define OCTSTR(name) p->name = octstr_duplicate(q->name);
  75. #define OPTIONAL_OCTSTR(name) p->name = octstr_duplicate(q->name);
  76. #define INTEGER(name) p->name = q->name;
  77.     #define WTLSPDUS(name) debug("wap.events",0,"You need to implement wtls_pdulist_duplicate!");
  78. #define HTTPHEADER(name) p->name = http_header_duplicate(q->name);
  79. #define ADDRTUPLE(name) p->name = wap_addr_tuple_duplicate(q->name);
  80. #define CAPABILITIES(name) p->name = wsp_cap_duplicate_list(q->name);
  81. #include "wap_events.def"
  82. default:
  83. panic(0, "Unknown WAP event type %d", event->type);
  84. }
  85. return new;
  86. }
  87. const char *wap_event_name(WAPEventName type) {
  88. switch (type) {
  89. #define WAPEVENT(name, prettyname, fields) 
  90. case name: return prettyname;
  91. #include "wap_events.def"
  92. default:
  93. panic(0, "Unknown WAPEvent type %d", (int) type);
  94. return "unknown WAPEventName";
  95. }
  96. }
  97. void wap_event_dump(WAPEvent *event) {
  98. debug("wap.event", 0, "Dumping WAPEvent %p", (void *) event);
  99. if (event != NULL) {
  100. debug("wap.event", 0, "  type = %s", 
  101. wap_event_name(event->type));
  102. switch (event->type) {
  103. #define WAPEVENT(name, prettyname, fields) 
  104. case name: 
  105. { struct name *p = &event->u.name; fields; break; }
  106. #define OCTSTR(name) 
  107. debug("wap.event", 0, "%s =", #name); 
  108. octstr_dump(p->name, 1);
  109. #define OPTIONAL_OCTSTR(name) 
  110. if (p->name == NULL) 
  111. debug("wap.event", 0, "%s = NULL", #name); 
  112. else { 
  113. debug("wap.event", 0, "%s =", #name); 
  114. octstr_dump(p->name, 1); 
  115. }
  116. #define INTEGER(name) 
  117. debug("wap.event", 0, "  %s = %ld", #name, p->name);
  118.         #define WTLSPDUS(name) 
  119. debug("wap.event",0,"You need to implement wtls_payloadlist_dump!");
  120. #define HTTPHEADER(name) 
  121. if (p->name == NULL) 
  122. debug("wap.event", 0, "%s = NULL", #name); 
  123. else 
  124.     http_header_dump(p->name);
  125. #define ADDRTUPLE(name)     wap_addr_tuple_dump(p->name);
  126. #define CAPABILITIES(name)  wsp_cap_dump_list(p->name);
  127. #include "wap_events.def"
  128. default:
  129. debug("wap.event", 0, "Unknown type");
  130. }
  131. }
  132. debug("wap.event", 0, "WAPEvent dump ends.");
  133. }
  134. void wap_event_assert(WAPEvent *event) {
  135. gw_assert(event != NULL),
  136. gw_assert(event->type >= 0);
  137. gw_assert(event->type < WAPEventNameCount);
  138. switch (event->type) {
  139. #define WAPEVENT(name, prettyname, fields) 
  140. case name: 
  141. { struct name *p = &event->u.name; fields; p = NULL; break; }
  142. #define OCTSTR(name) 
  143. gw_assert(p->name != NULL); 
  144. /* This is a trick to make the Octstr module run its assertions */ 
  145. gw_assert(octstr_len(p->name) >= 0);
  146. #define OPTIONAL_OCTSTR(name) 
  147. gw_assert(p->name == NULL || octstr_len(p->name) >= 0);
  148. #define INTEGER(name)
  149. #define WTLSPDUS(name)
  150. #define HTTPHEADER(name)
  151. #define ADDRTUPLE(name) 
  152. gw_assert(p->name != NULL);
  153. #define CAPABILITIES(name)
  154. #include "wap_events.def"
  155. default:
  156. debug("wap.event", 0, "Unknown type");
  157. }
  158. }