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

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * wsp_server_method_states.def
  3.  *
  4.  * Macro calls to generate rows of the state table. See the documentation for
  5.  * guidance how to use and update these.
  6.  *
  7.  * Note that the `NULL' state has been renamed to `NULL_METHOD' because
  8.  * NULL is reserved by C.
  9.  */
  10. STATE_NAME(NULL_METHOD)
  11. STATE_NAME(HOLDING)
  12. STATE_NAME(REQUESTING)
  13. STATE_NAME(PROCESSING)
  14. STATE_NAME(REPLYING)
  15. /* MISSING: TR_Invoke.ind, N_Methods == MOM */
  16. ROW(NULL_METHOD,
  17. TR_Invoke_Ind,
  18. e->tcl == 2 && pdu->type == Get,
  19. {
  20. List *headers;
  21. WAPEvent *invoke;
  22. int method;
  23. Octstr *method_name;
  24. /* Prepare the MethodInvoke here, because we have all
  25.  * the information nicely available. */
  26. if (octstr_len(pdu->u.Get.headers) > 0)
  27. headers = wsp_headers_unpack(pdu->u.Get.headers, 0);
  28. else
  29. headers = NULL;
  30. invoke = wap_event_create(S_MethodInvoke_Ind);
  31. invoke->u.S_MethodInvoke_Ind.server_transaction_id =
  32. msm->transaction_id;
  33. method = GET_METHODS + pdu->u.Get.subtype;
  34. method_name = wsp_method_to_string(method);
  35. if (method_name == NULL)
  36. method_name = octstr_format("UNKNOWN%02X", method);
  37. invoke->u.S_MethodInvoke_Ind.method = method_name;
  38. invoke->u.S_MethodInvoke_Ind.request_uri =
  39. octstr_duplicate(pdu->u.Get.uri);
  40. invoke->u.S_MethodInvoke_Ind.request_headers = headers;
  41. invoke->u.S_MethodInvoke_Ind.request_body = NULL;
  42. invoke->u.S_MethodInvoke_Ind.session_headers =
  43. http_header_duplicate(sm->http_headers);
  44. invoke->u.S_MethodInvoke_Ind.addr_tuple =
  45. wap_addr_tuple_duplicate(sm->addr_tuple);
  46. invoke->u.S_MethodInvoke_Ind.client_SDU_size =
  47. sm->client_SDU_size;
  48. invoke->u.S_MethodInvoke_Ind.session_id =
  49. msm->session_id;
  50. msm->invoke = invoke;
  51. },
  52. HOLDING)
  53. ROW(NULL_METHOD,
  54. TR_Invoke_Ind,
  55. e->tcl == 2 && pdu->type == Post,
  56. {
  57. List *headers;
  58. WAPEvent *invoke;
  59. int req_body_size;
  60. int method;
  61. Octstr *method_name;
  62. /* Prepare the MethodInvoke here, because we have all
  63.  * the information nicely available. */
  64. if (octstr_len(pdu->u.Post.headers) > 0)
  65. headers = wsp_headers_unpack(pdu->u.Post.headers, 1);
  66. else
  67. headers = NULL;
  68. invoke = wap_event_create(S_MethodInvoke_Ind);
  69. invoke->u.S_MethodInvoke_Ind.server_transaction_id =
  70. msm->transaction_id;
  71. method = POST_METHODS + pdu->u.Get.subtype;
  72. method_name = wsp_method_to_string(method);
  73. if (method_name == NULL)
  74. method_name = octstr_format("UNKNOWN%02X", method);
  75. invoke->u.S_MethodInvoke_Ind.method = method_name;
  76. invoke->u.S_MethodInvoke_Ind.request_uri =
  77. octstr_duplicate(pdu->u.Post.uri);
  78. invoke->u.S_MethodInvoke_Ind.request_headers = headers;
  79. /*
  80.  * The Siemens S35 adds an extra NUL character to the end
  81.  * of the request body which may not work with certain cgi
  82.  * scripts. It is removed here by truncating the length.
  83.  */
  84. req_body_size = octstr_len(pdu->u.Post.data);
  85. if(octstr_get_char(pdu->u.Post.data,(req_body_size - 1)) == 0)
  86. octstr_truncate(pdu->u.Post.data,(req_body_size - 1));
  87. invoke->u.S_MethodInvoke_Ind.request_body = 
  88. octstr_duplicate(pdu->u.Post.data);
  89. invoke->u.S_MethodInvoke_Ind.session_headers =
  90. http_header_duplicate(sm->http_headers);
  91. invoke->u.S_MethodInvoke_Ind.addr_tuple =
  92. wap_addr_tuple_duplicate(sm->addr_tuple);
  93. invoke->u.S_MethodInvoke_Ind.client_SDU_size =
  94. sm->client_SDU_size;
  95. invoke->u.S_MethodInvoke_Ind.session_id =
  96. msm->session_id;
  97. msm->invoke = invoke;
  98. },
  99. HOLDING)
  100. ROW(HOLDING,
  101. Release_Event,
  102. 1,
  103. {
  104. /* S-MethodInvoke.ind */
  105. dispatch_to_appl(msm->invoke);
  106. msm->invoke = NULL;
  107. },
  108. REQUESTING)
  109. ROW(HOLDING,
  110. Abort_Event,
  111. 1,
  112. {
  113. /* Decrement N_Methods */
  114. /* we don't keep track of N_Methods because it's unlimited */
  115. /* Tr-Abort.req(abort reason) the method */
  116. method_abort(msm, e->reason);
  117. },
  118. NULL_METHOD)
  119. ROW(HOLDING,
  120. TR_Abort_Ind,
  121. e->abort_code == WSP_ABORT_DISCONNECT,
  122. {
  123. WAPEvent *wsp_event;
  124. /* Disconnect the session */
  125. wsp_event = wap_event_create(Disconnect_Event);
  126. wsp_event->u.Disconnect_Event.session_handle = msm->session_id;
  127. /* We put this on the queue instead of doing it right away,
  128.  * because the session machine is currently our caller and
  129.  * we don't want to recurse.  We put it in the front of
  130.  * the queue because the state machine definitions expect
  131.  * an event to be handled completely before the next is
  132.  * started. */
  133. list_insert(queue, 0, wsp_event);
  134. },
  135. HOLDING)
  136. ROW(HOLDING,
  137. TR_Abort_Ind,
  138. e->abort_code == WSP_ABORT_SUSPEND,
  139. {
  140. WAPEvent *wsp_event;
  141. /* Suspend the session */
  142. wsp_event = wap_event_create(Suspend_Event);
  143. wsp_event->u.Suspend_Event.session_handle = msm->session_id;
  144. /* See story for Disconnect, above */
  145. list_insert(queue, 0, wsp_event);
  146. },
  147. HOLDING)
  148. ROW(HOLDING,
  149. TR_Abort_Ind,
  150. e->abort_code != WSP_ABORT_DISCONNECT
  151. && e->abort_code != WSP_ABORT_SUSPEND,
  152. {
  153. /* Decrement N_Methods */
  154. /* we don't keep track of N_Methods because it's unlimited */
  155. },
  156. NULL_METHOD)
  157. ROW(REQUESTING,
  158. S_MethodInvoke_Res,
  159. 1,
  160. {
  161. WAPEvent *wtp_event;
  162. /* Send TR-Invoke.res to WTP */
  163. wtp_event = wap_event_create(TR_Invoke_Res);
  164. wtp_event->u.TR_Invoke_Res.handle = msm->transaction_id;
  165. dispatch_to_wtp_resp(wtp_event);
  166. },
  167. PROCESSING)
  168. /* MISSING: REQUESTING, S-MethodAbort.req */
  169. ROW(REQUESTING,
  170. Abort_Event,
  171. 1,
  172. {
  173. /* Decrement N_Methods */
  174. /* we don't keep track of N_Methods because it's unlimited */
  175. /* TR-Abort.req(abort reason) the method */
  176. method_abort(msm, e->reason);
  177. /* S-MethodAbort.ind(abort reason) */
  178. indicate_method_abort(msm, e->reason);
  179. },
  180. NULL_METHOD)
  181. ROW(REQUESTING,
  182. TR_Abort_Ind,
  183. e->abort_code == WSP_ABORT_DISCONNECT,
  184. {
  185. WAPEvent *wsp_event;
  186. /* Disconnect the session */
  187. wsp_event = wap_event_create(Disconnect_Event);
  188. wsp_event->u.Disconnect_Event.session_handle = msm->session_id;
  189. list_insert(queue, 0, wsp_event);
  190. },
  191. REQUESTING)
  192. ROW(REQUESTING,
  193. TR_Abort_Ind,
  194. e->abort_code == WSP_ABORT_SUSPEND,
  195. {
  196. WAPEvent *wsp_event;
  197. /* Suspend the session */
  198. wsp_event = wap_event_create(Suspend_Event);
  199. wsp_event->u.Suspend_Event.session_handle = msm->session_id;
  200. list_insert(queue, 0, wsp_event);
  201. },
  202. REQUESTING)
  203. ROW(REQUESTING,
  204. TR_Abort_Ind,
  205. e->abort_code != WSP_ABORT_DISCONNECT
  206. && e->abort_code != WSP_ABORT_SUSPEND,
  207. {
  208. /* Decrement N_Methods */
  209. /* we don't keep track of N_Methods because it's unlimited */
  210. /* S-MethodAbort.ind(abort reason) */
  211. indicate_method_abort(msm, e->abort_code);
  212. },
  213. NULL_METHOD)
  214. ROW(PROCESSING,
  215. S_MethodResult_Req,
  216. 1,
  217. {
  218. WAPEvent *wtp_event;
  219. WSP_PDU *new_pdu;
  220. /* TR-Result.req */
  221. new_pdu = wsp_pdu_create(Reply);
  222. new_pdu->u.Reply.status = 
  223. wsp_convert_http_status_to_wsp_status(e->status);
  224. new_pdu->u.Reply.headers = 
  225. wsp_headers_pack(e->response_headers, 1);
  226. new_pdu->u.Reply.data = octstr_duplicate(e->response_body);
  227. /* Send TR-Result.req to WTP */
  228. wtp_event = wap_event_create(TR_Result_Req);
  229. wtp_event->u.TR_Result_Req.user_data = wsp_pdu_pack(new_pdu);
  230. wtp_event->u.TR_Result_Req.handle = msm->transaction_id;
  231. dispatch_to_wtp_resp(wtp_event);
  232. wsp_pdu_destroy(new_pdu);
  233. },
  234. REPLYING)
  235. /* MISSING: PROCESSING, S-MethodAbort.req */
  236. ROW(PROCESSING,
  237. Abort_Event,
  238. 1,
  239. {
  240. /* Decrement N_Methods */
  241. /* we don't keep track of N_Methods because it's unlimited */
  242. /* TR-Abort.req(abort reason) the method */
  243. method_abort(msm, e->reason);
  244. /* S-MethodAbort.ind(abort reason) */
  245. indicate_method_abort(msm, e->reason);
  246. },
  247. NULL_METHOD)
  248. ROW(PROCESSING,
  249. TR_Abort_Ind,
  250. e->abort_code == WSP_ABORT_DISCONNECT,
  251. {
  252. WAPEvent *wsp_event;
  253. /* Disconnect the session */
  254. wsp_event = wap_event_create(Disconnect_Event);
  255. wsp_event->u.Disconnect_Event.session_handle = msm->session_id;
  256. list_insert(queue, 0, wsp_event);
  257. },
  258. PROCESSING)
  259. ROW(PROCESSING,
  260. TR_Abort_Ind,
  261. e->abort_code == WSP_ABORT_SUSPEND,
  262. {
  263. WAPEvent *wsp_event;
  264. /* Suspend the session */
  265. wsp_event = wap_event_create(Suspend_Event);
  266. wsp_event->u.Suspend_Event.session_handle = msm->session_id;
  267. list_insert(queue, 0, wsp_event);
  268. },
  269. PROCESSING)
  270. ROW(PROCESSING,
  271. TR_Abort_Ind,
  272. e->abort_code != WSP_ABORT_DISCONNECT
  273. && e->abort_code != WSP_ABORT_SUSPEND,
  274. {
  275. /* Decrement N_Methods */
  276. /* we don't keep track of N_Methods because it's unlimited */
  277. /* S-MethodAbort.ind(abort reason) */
  278. indicate_method_abort(msm, e->abort_code);
  279. },
  280. NULL_METHOD)
  281. /* MISSING: REPLYING, S-MethodAbort.req */
  282. ROW(REPLYING,
  283. Abort_Event,
  284. 1,
  285. {
  286. /* Decrement N_Methods */
  287. /* we don't keep track of N_Methods because it's unlimited */
  288. /* TR-Abort.req(abort reason) the method */
  289. method_abort(msm, e->reason);
  290. /* S-MethodAbort.ind(abort reason) */
  291. indicate_method_abort(msm, e->reason);
  292. },
  293. NULL_METHOD)
  294. ROW(REPLYING,
  295. TR_Result_Cnf,
  296. 1,
  297. {
  298. WAPEvent *new_event;
  299. /* Decrement N_Methods */
  300. /* we don't keep track of N_Methods because it's unlimited */
  301. /* S-MethodResult.cnf */
  302. /* we don't do acknowledgement headers */
  303. new_event = wap_event_create(S_MethodResult_Cnf);
  304. new_event->u.S_MethodResult_Cnf.server_transaction_id =
  305. msm->transaction_id;
  306. new_event->u.S_MethodResult_Cnf.session_id = msm->session_id;
  307. dispatch_to_appl(new_event);
  308. },
  309. NULL_METHOD)
  310. ROW(REPLYING,
  311. TR_Abort_Ind,
  312. e->abort_code == WSP_ABORT_DISCONNECT,
  313. {
  314. WAPEvent *wsp_event;
  315. /* Disconnect the session */
  316. wsp_event = wap_event_create(Disconnect_Event);
  317. wsp_event->u.Disconnect_Event.session_handle = msm->session_id;
  318. list_insert(queue, 0, wsp_event);
  319. },
  320. REPLYING)
  321. ROW(REPLYING,
  322. TR_Abort_Ind,
  323. e->abort_code == WSP_ABORT_SUSPEND,
  324. {
  325. WAPEvent *wsp_event;
  326. /* Suspend the session */
  327. wsp_event = wap_event_create(Suspend_Event);
  328. wsp_event->u.Suspend_Event.session_handle = msm->session_id;
  329. list_insert(queue, 0, wsp_event);
  330. },
  331. REPLYING)
  332. ROW(REPLYING,
  333. TR_Abort_Ind,
  334. e->abort_code != WSP_ABORT_DISCONNECT
  335. && e->abort_code != WSP_ABORT_SUSPEND,
  336. {
  337. /* Decrement N_Methods */
  338. /* we don't keep track of N_Methods because it's unlimited */
  339. /* S-MethodAbort.ind(abort reason) */
  340. indicate_method_abort(msm, e->abort_code);
  341. },
  342. NULL_METHOD)
  343. #undef ROW
  344. #undef STATE_NAME