Sipper 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. data/sipper/README.rb +26 -0
  2. data/sipper/b2bua_controller.rb +163 -0
  3. data/sipper/b2bua_session_mixin.rb +24 -0
  4. data/sipper/base_controller.rb +425 -0
  5. data/sipper/bin/common.rb +42 -0
  6. data/sipper/bin/generate.rb +70 -0
  7. data/sipper/bin/project.rb +44 -0
  8. data/sipper/bin/run.rb +85 -0
  9. data/sipper/bin/run_smoke.rb +8 -0
  10. data/sipper/config/log4r.xml +71 -0
  11. data/sipper/controller_class_loader.rb +29 -0
  12. data/sipper/controller_selector.rb +119 -0
  13. data/sipper/controllers/invite_controller.rb +30 -0
  14. data/sipper/controllers/order.yaml +3 -0
  15. data/sipper/custom_message.rb +4 -0
  16. data/sipper/detached_session.rb +11 -0
  17. data/sipper/docs/manual.txt +1621 -0
  18. data/sipper/generators/README +12 -0
  19. data/sipper/generators/gen_controller.rb +228 -0
  20. data/sipper/generators/gen_project.rb +45 -0
  21. data/sipper/generators/gen_test.rb +72 -0
  22. data/sipper/generators/project_template_dir/Rakefile +56 -0
  23. data/sipper/generators/project_template_dir/config/sipper.cfg +31 -0
  24. data/sipper/generators/project_template_dir/controllers/README.txt +2 -0
  25. data/sipper/generators/project_template_dir/dot_sipper.proj +2 -0
  26. data/sipper/generators/project_template_dir/logs/README.txt +2 -0
  27. data/sipper/generators/project_template_dir/tests/README.txt +2 -0
  28. data/sipper/lib/smc/statemap.rb +194 -0
  29. data/sipper/logs/dialog_info_store +0 -0
  30. data/sipper/logs/r.cmd +6 -0
  31. data/sipper/logs/r.sh +6 -0
  32. data/sipper/media/sipper_media_client.rb +268 -0
  33. data/sipper/media/sipper_media_event.rb +43 -0
  34. data/sipper/media/sipper_media_manager.rb +145 -0
  35. data/sipper/media/sipper_media_proxy.rb +60 -0
  36. data/sipper/media/sipper_offer_answer.rb +285 -0
  37. data/sipper/message.rb +512 -0
  38. data/sipper/modified_pattern_formatter.rb +119 -0
  39. data/sipper/proxy_controller.rb +143 -0
  40. data/sipper/registration.rb +52 -0
  41. data/sipper/request.rb +109 -0
  42. data/sipper/response.rb +123 -0
  43. data/sipper/ruby_ext/module.rb +27 -0
  44. data/sipper/ruby_ext/mutable_class.rb +17 -0
  45. data/sipper/ruby_ext/object.rb +38 -0
  46. data/sipper/ruby_ext/pqueue.rb +190 -0
  47. data/sipper/ruby_ext/snapshot.rb +201 -0
  48. data/sipper/ruby_ext/string.rb +18 -0
  49. data/sipper/ruby_ext/time.rb +9 -0
  50. data/sipper/run/run_sipper1.rb +28 -0
  51. data/sipper/run/run_sipper2.rb +56 -0
  52. data/sipper/sdp/sdp.rb +257 -0
  53. data/sipper/sdp/sdp_generator.rb +131 -0
  54. data/sipper/sdp/sdp_parser.rb +136 -0
  55. data/sipper/session.rb +1952 -0
  56. data/sipper/session_manager.rb +170 -0
  57. data/sipper/session_recorder.rb +190 -0
  58. data/sipper/session_state/DialogState.sm +54 -0
  59. data/sipper/session_state/DialogState_sm.rb +337 -0
  60. data/sipper/session_state/dialog_routes.rb +141 -0
  61. data/sipper/sip_headers/header.rb +632 -0
  62. data/sipper/sip_headers/sipuri.rb +352 -0
  63. data/sipper/sip_logger.rb +65 -0
  64. data/sipper/sip_message_router.rb +231 -0
  65. data/sipper/sip_test_driver_controller.rb +10 -0
  66. data/sipper/sipper.rb +329 -0
  67. data/sipper/sipper_assertions.rb +21 -0
  68. data/sipper/sipper_configurator.rb +376 -0
  69. data/sipper/sipper_http/sipper_http_request_dispatcher.rb +71 -0
  70. data/sipper/sipper_http/sipper_http_response.rb +25 -0
  71. data/sipper/stray_message_manager.rb +40 -0
  72. data/sipper/test_completion_signaling_helper.rb +77 -0
  73. data/sipper/transaction/Ict.sm +59 -0
  74. data/sipper/transaction/Ict_sm.rb +430 -0
  75. data/sipper/transaction/Ist.sm +74 -0
  76. data/sipper/transaction/Ist_sm.rb +460 -0
  77. data/sipper/transaction/Nict.sm +51 -0
  78. data/sipper/transaction/Nict_sm.rb +325 -0
  79. data/sipper/transaction/Nist.sm +59 -0
  80. data/sipper/transaction/Nist_sm.rb +356 -0
  81. data/sipper/transaction/invite_client_transaction.rb +274 -0
  82. data/sipper/transaction/invite_server_transaction.rb +319 -0
  83. data/sipper/transaction/non_invite_client_transaction.rb +230 -0
  84. data/sipper/transaction/non_invite_server_transaction.rb +263 -0
  85. data/sipper/transaction/state_machine_wrapper.rb +58 -0
  86. data/sipper/transaction/transaction.rb +212 -0
  87. data/sipper/transport/base_transport.rb +84 -0
  88. data/sipper/transport/rel_unrel.rb +19 -0
  89. data/sipper/transport/transport_and_route_resolver.rb +67 -0
  90. data/sipper/transport/udp_transport.rb +156 -0
  91. data/sipper/transport_manager.rb +33 -0
  92. data/sipper/udp_session.rb +17 -0
  93. data/sipper/util/command_element.rb +62 -0
  94. data/sipper/util/compact_converter.rb +50 -0
  95. data/sipper/util/counter.rb +26 -0
  96. data/sipper/util/digest/digest_authorizer.rb +204 -0
  97. data/sipper/util/expectation_parser.rb +164 -0
  98. data/sipper/util/locator.rb +31 -0
  99. data/sipper/util/message_fill.rb +58 -0
  100. data/sipper/util/persistence/ps_sipper_map.rb +63 -0
  101. data/sipper/util/persistence/sipper_map.rb +41 -0
  102. data/sipper/util/sipper_util.rb +305 -0
  103. data/sipper/util/timer/sip_timer_helper.rb +26 -0
  104. data/sipper/util/timer/timer_manager.rb +80 -0
  105. data/sipper/util/timer/timer_task.rb +56 -0
  106. data/sipper/util/validations.rb +44 -0
  107. data/sipper/version.rb +10 -0
  108. data/sipper_test/_test_media_uas.rb +79 -0
  109. data/sipper_test/base_test_case.rb +31 -0
  110. data/sipper_test/c_134.txt +7 -0
  111. data/sipper_test/driven_sip_test_case.rb +96 -0
  112. data/sipper_test/gold.txt +10 -0
  113. data/sipper_test/gold_res.txt +8 -0
  114. data/sipper_test/gold_sub.txt +9 -0
  115. data/sipper_test/hello_sipper.au +0 -0
  116. data/sipper_test/in_sipper.au +0 -0
  117. data/sipper_test/nonrr_proxy.rb +17 -0
  118. data/sipper_test/order_tests.yaml +4 -0
  119. data/sipper_test/rake_res.txt +399 -0
  120. data/sipper_test/rr_proxy.rb +17 -0
  121. data/sipper_test/run_test.cmd +94 -0
  122. data/sipper_test/sip_test_case.rb +104 -0
  123. data/sipper_test/test2xx_retransmission.rb +80 -0
  124. data/sipper_test/test2xx_retransmission_with_limit.rb +81 -0
  125. data/sipper_test/test2xx_retransmission_with_nist.rb +91 -0
  126. data/sipper_test/test2xx_retransmission_with_txns.rb +94 -0
  127. data/sipper_test/test_address_header.rb +66 -0
  128. data/sipper_test/test_b2bua1.rb +130 -0
  129. data/sipper_test/test_b2bua2.rb +120 -0
  130. data/sipper_test/test_b2bua3.rb +160 -0
  131. data/sipper_test/test_b2bua4.rb +130 -0
  132. data/sipper_test/test_base_controller.rb +110 -0
  133. data/sipper_test/test_base_transport.rb +37 -0
  134. data/sipper_test/test_cancel.rb +21 -0
  135. data/sipper_test/test_cancel_after2xx.rb +81 -0
  136. data/sipper_test/test_cancel_retransmission.rb +105 -0
  137. data/sipper_test/test_cancel_with481.rb +83 -0
  138. data/sipper_test/test_cancel_with487.rb +70 -0
  139. data/sipper_test/test_cancel_with_ist_without_nist.rb +99 -0
  140. data/sipper_test/test_cancel_with_nist.rb +84 -0
  141. data/sipper_test/test_cancel_without487.rb +77 -0
  142. data/sipper_test/test_command_element.rb +38 -0
  143. data/sipper_test/test_compact_converter.rb +33 -0
  144. data/sipper_test/test_controller_class_loader.rb +37 -0
  145. data/sipper_test/test_controller_selector.rb +53 -0
  146. data/sipper_test/test_controller_using_compact_headers.rb +74 -0
  147. data/sipper_test/test_controller_using_header_order.rb +85 -0
  148. data/sipper_test/test_controller_using_ict.rb +64 -0
  149. data/sipper_test/test_controller_using_ict_with_non_success.rb +72 -0
  150. data/sipper_test/test_controller_using_ict_with_tcbh.rb +24 -0
  151. data/sipper_test/test_controller_using_ict_with_tcbh_no_action.rb +24 -0
  152. data/sipper_test/test_controller_using_ist.rb +70 -0
  153. data/sipper_test/test_controller_using_ist_with_tcbh.rb +24 -0
  154. data/sipper_test/test_controller_using_nict.rb +115 -0
  155. data/sipper_test/test_controller_using_nict_with_tcbh.rb +24 -0
  156. data/sipper_test/test_controller_using_nist.rb +63 -0
  157. data/sipper_test/test_controller_using_pre_existing_rs0.rb +73 -0
  158. data/sipper_test/test_controller_using_pre_existing_rs1.rb +75 -0
  159. data/sipper_test/test_controller_using_pre_existing_rs2.rb +71 -0
  160. data/sipper_test/test_controller_using_route_set.rb +86 -0
  161. data/sipper_test/test_controller_with_sdp.rb +80 -0
  162. data/sipper_test/test_controllers/cancel/order.yaml +2 -0
  163. data/sipper_test/test_controllers/cancel/uac_cancel_controller.rb +35 -0
  164. data/sipper_test/test_controllers/cancel/uas_cancel_controller.rb +25 -0
  165. data/sipper_test/test_controllers/class_loading/ordered/first_ordered_controller.rb +5 -0
  166. data/sipper_test/test_controllers/class_loading/ordered/order.yaml +3 -0
  167. data/sipper_test/test_controllers/class_loading/ordered/recond_ordered_controller.rb +6 -0
  168. data/sipper_test/test_controllers/class_loading/ordered/second_ordered_controller.rb +6 -0
  169. data/sipper_test/test_controllers/class_loading/unordered/first_unordered_controller.rb +7 -0
  170. data/sipper_test/test_controllers/class_loading/unordered/second_unordered_controller.rb +6 -0
  171. data/sipper_test/test_controllers/ctrl_trhandler/lib/transport_filters/my_transport_handler.rb +22 -0
  172. data/sipper_test/test_controllers/ctrl_trhandler/uac_tr_handler_controller.rb +27 -0
  173. data/sipper_test/test_controllers/ctrl_trhandler/uas_tr_handler_controller.rb +21 -0
  174. data/sipper_test/test_controllers/ete/order.yaml +1 -0
  175. data/sipper_test/test_controllers/ete/uac_controller.rb +39 -0
  176. data/sipper_test/test_controllers/ete/uas_controller.rb +34 -0
  177. data/sipper_test/test_controllers/extensions/extension_uac_controller.rb +24 -0
  178. data/sipper_test/test_controllers/extensions/extension_uas_controller.rb +35 -0
  179. data/sipper_test/test_controllers/extensions/lib/sipper_extensions/my_from_extension.rb +16 -0
  180. data/sipper_test/test_controllers/ict_tcbh/lib/transaction_handlers/app_ict_handler.rb +23 -0
  181. data/sipper_test/test_controllers/ict_tcbh/uac_ict_tcbh_controller.rb +27 -0
  182. data/sipper_test/test_controllers/ict_tcbh/uac_ict_tcbh_no_action_controller.rb +28 -0
  183. data/sipper_test/test_controllers/ict_tcbh/uas_ict_tcbh_controller.rb +29 -0
  184. data/sipper_test/test_controllers/ict_tcbh/uas_ict_tcbh_no_action_controller.rb +31 -0
  185. data/sipper_test/test_controllers/ist_tcbh/lib/app_ist_handler.rb +13 -0
  186. data/sipper_test/test_controllers/ist_tcbh/uac_ist_tcbh_controller.rb +22 -0
  187. data/sipper_test/test_controllers/ist_tcbh/uas_ist_tcbh_controller.rb +31 -0
  188. data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/in_order.yaml +2 -0
  189. data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/my_transport_handler1.rb +21 -0
  190. data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/my_transport_handler2.rb +21 -0
  191. data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/out_order.yaml +2 -0
  192. data/sipper_test/test_controllers/multi_trhandlers/uac_multi_tr_handler_controller.rb +27 -0
  193. data/sipper_test/test_controllers/multi_trhandlers/uas_multi_tr_handler_controller.rb +29 -0
  194. data/sipper_test/test_controllers/multiple/lib/blank_test.rb +2 -0
  195. data/sipper_test/test_controllers/multiple/uac_info_controller.rb +21 -0
  196. data/sipper_test/test_controllers/multiple/uac_msg_controller.rb +20 -0
  197. data/sipper_test/test_controllers/multiple/uas_info_controller.rb +15 -0
  198. data/sipper_test/test_controllers/multiple/uas_msg_controller.rb +14 -0
  199. data/sipper_test/test_controllers/nict_tcbh/lib/transaction_handlers/app_nict_handler.rb +13 -0
  200. data/sipper_test/test_controllers/nict_tcbh/uac_nict_tcbh_controller.rb +26 -0
  201. data/sipper_test/test_controllers/nict_tcbh/uas_nict_tcbh_controller.rb +20 -0
  202. data/sipper_test/test_controllers/state_machine_based/lib/CreditControl.sm +43 -0
  203. data/sipper_test/test_controllers/state_machine_based/lib/CreditControl_sm.rb +194 -0
  204. data/sipper_test/test_controllers/state_machine_based/order.yaml +1 -0
  205. data/sipper_test/test_controllers/state_machine_based/uac_message_controller.rb +34 -0
  206. data/sipper_test/test_controllers/state_machine_based/uas_message_controller.rb +44 -0
  207. data/sipper_test/test_controllers/stray_message/lib/sipper_extensions/my_stray_handler.rb +9 -0
  208. data/sipper_test/test_controllers/stray_message/stray_uac_controller.rb +24 -0
  209. data/sipper_test/test_controllers/stray_message/stray_uas_controller.rb +31 -0
  210. data/sipper_test/test_controllers/string/order.yaml +1 -0
  211. data/sipper_test/test_controllers/string/uac_controller.rb +29 -0
  212. data/sipper_test/test_controllers/string/uas_controller.rb +22 -0
  213. data/sipper_test/test_controllers/test_controller.rb +24 -0
  214. data/sipper_test/test_detached_session1.rb +78 -0
  215. data/sipper_test/test_dialog_routes.rb +139 -0
  216. data/sipper_test/test_digest_challenge1.rb +89 -0
  217. data/sipper_test/test_digest_challenge2.rb +90 -0
  218. data/sipper_test/test_dynamic_parse.rb +249 -0
  219. data/sipper_test/test_empty_sdp.rb +89 -0
  220. data/sipper_test/test_ete.rb +37 -0
  221. data/sipper_test/test_expectation_parser.rb +76 -0
  222. data/sipper_test/test_extensions.rb +28 -0
  223. data/sipper_test/test_freeze.rb +81 -0
  224. data/sipper_test/test_generated.rb +90 -0
  225. data/sipper_test/test_header_parameters.rb +75 -0
  226. data/sipper_test/test_header_parse.rb +141 -0
  227. data/sipper_test/test_http_client1.rb +84 -0
  228. data/sipper_test/test_http_client2.rb +90 -0
  229. data/sipper_test/test_ict_with_timeout.rb +62 -0
  230. data/sipper_test/test_in_dialog_request.rb +61 -0
  231. data/sipper_test/test_inline_controller.rb +67 -0
  232. data/sipper_test/test_invite_client_transaction.rb +272 -0
  233. data/sipper_test/test_invite_replace.rb +147 -0
  234. data/sipper_test/test_invite_retransmission.rb +90 -0
  235. data/sipper_test/test_invite_server_transaction.rb +208 -0
  236. data/sipper_test/test_lower_cseq.rb +79 -0
  237. data/sipper_test/test_media.rb +52 -0
  238. data/sipper_test/test_message.rb +392 -0
  239. data/sipper_test/test_method_specific_response_handling.rb +81 -0
  240. data/sipper_test/test_multi_homed1.rb +127 -0
  241. data/sipper_test/test_multi_homed2.rb +109 -0
  242. data/sipper_test/test_multi_homed_duplicate.rb +87 -0
  243. data/sipper_test/test_multi_homed_with_detached.rb +88 -0
  244. data/sipper_test/test_multiple.rb +49 -0
  245. data/sipper_test/test_multiple_contacts.rb +89 -0
  246. data/sipper_test/test_non2xx_retransmission_with_ist.rb +87 -0
  247. data/sipper_test/test_non_invite_client_transaction.rb +210 -0
  248. data/sipper_test/test_non_invite_retransmission.rb +91 -0
  249. data/sipper_test/test_non_invite_server_transaction.rb +202 -0
  250. data/sipper_test/test_offer_answer_prack.rb +103 -0
  251. data/sipper_test/test_pickup.rb +258 -0
  252. data/sipper_test/test_prack.rb +105 -0
  253. data/sipper_test/test_prack_store_and_dispatch.rb +101 -0
  254. data/sipper_test/test_prack_timer.rb +105 -0
  255. data/sipper_test/test_ps_sipper_map.rb +56 -0
  256. data/sipper_test/test_re_invite_uas_ongoing_ict.rb +81 -0
  257. data/sipper_test/test_re_invite_uas_ongoing_ist.rb +84 -0
  258. data/sipper_test/test_re_invite_with_ongoing_ict.rb +101 -0
  259. data/sipper_test/test_re_invite_with_ongoing_ist.rb +89 -0
  260. data/sipper_test/test_recorder_swap.rb +157 -0
  261. data/sipper_test/test_refer.rb +121 -0
  262. data/sipper_test/test_registeration_clearing.rb +97 -0
  263. data/sipper_test/test_registrar.rb +109 -0
  264. data/sipper_test/test_registration_controller.rb +73 -0
  265. data/sipper_test/test_registration_timeout.rb +90 -0
  266. data/sipper_test/test_remote_controller.rb +39 -0
  267. data/sipper_test/test_remote_target_update_on2xx.rb +140 -0
  268. data/sipper_test/test_request.rb +106 -0
  269. data/sipper_test/test_response.rb +40 -0
  270. data/sipper_test/test_response_without_to_tag.rb +92 -0
  271. data/sipper_test/test_rport.rb +88 -0
  272. data/sipper_test/test_sdp.rb +91 -0
  273. data/sipper_test/test_sdp_parser.rb +145 -0
  274. data/sipper_test/test_session.rb +276 -0
  275. data/sipper_test/test_session_callback_handler.rb +68 -0
  276. data/sipper_test/test_session_lifetime.rb +66 -0
  277. data/sipper_test/test_session_manager.rb +141 -0
  278. data/sipper_test/test_session_recorder.rb +145 -0
  279. data/sipper_test/test_session_state_user_defined.rb +84 -0
  280. data/sipper_test/test_session_states.rb +91 -0
  281. data/sipper_test/test_simple_dialog_state.rb +86 -0
  282. data/sipper_test/test_simple_re_invite.rb +86 -0
  283. data/sipper_test/test_sip_uri.rb +234 -0
  284. data/sipper_test/test_sipper_util.rb +45 -0
  285. data/sipper_test/test_smc_controller.rb +17 -0
  286. data/sipper_test/test_smoke.rb +80 -0
  287. data/sipper_test/test_stray.rb +28 -0
  288. data/sipper_test/test_stray_inline.rb +89 -0
  289. data/sipper_test/test_stray_res_acked.rb +103 -0
  290. data/sipper_test/test_stray_respond.rb +104 -0
  291. data/sipper_test/test_stray_retry.rb +92 -0
  292. data/sipper_test/test_stray_retry_failure.rb +93 -0
  293. data/sipper_test/test_stray_retry_initial.rb +100 -0
  294. data/sipper_test/test_strict_router_with_angled.rb +84 -0
  295. data/sipper_test/test_string_record.rb +31 -0
  296. data/sipper_test/test_subscribe_notify.rb +141 -0
  297. data/sipper_test/test_subscribe_notify_client_timeout.rb +158 -0
  298. data/sipper_test/test_subscribe_notify_dialog.rb +146 -0
  299. data/sipper_test/test_subscribe_notify_expires.rb +155 -0
  300. data/sipper_test/test_subscribe_notify_multiple_subscription.rb +157 -0
  301. data/sipper_test/test_subscribe_notify_server_timeout.rb +144 -0
  302. data/sipper_test/test_subsequent_unsent.rb +88 -0
  303. data/sipper_test/test_target_refresh_proxy_detached.rb +128 -0
  304. data/sipper_test/test_target_refresh_proxy_udp.rb +130 -0
  305. data/sipper_test/test_target_refresh_rr_proxy_udp.rb +133 -0
  306. data/sipper_test/test_target_refresh_with_new_port.rb +158 -0
  307. data/sipper_test/test_target_refresh_with_proxy1.rb +113 -0
  308. data/sipper_test/test_target_refresh_with_rr_update_proxy.rb +145 -0
  309. data/sipper_test/test_target_refresh_with_update_proxy.rb +144 -0
  310. data/sipper_test/test_target_refresh_with_update_proxy2.rb +139 -0
  311. data/sipper_test/test_timer_manager.rb +71 -0
  312. data/sipper_test/test_timer_task.rb +60 -0
  313. data/sipper_test/test_transport_handler.rb +19 -0
  314. data/sipper_test/test_transport_multi_handler.rb +18 -0
  315. data/sipper_test/test_udp_transport.rb +119 -0
  316. data/sipper_test/test_unparsed.rb +70 -0
  317. data/sipper_test/test_validations.rb +69 -0
  318. data/sipper_test/test_with_rr_proxy.rb +111 -0
  319. data/sipper_test/testmediacontroller.rb +71 -0
  320. data/sipper_test/tracing.rb +23 -0
  321. data/sipper_test/transaction_test_helper.rb +176 -0
  322. data/sipper_test/transport_filters.rb +26 -0
  323. data/sipper_test/ts_sipper.rb +91 -0
  324. data/sipper_test/ts_smoke.rb +3 -0
  325. data/sipper_test/tt.cmd +20 -0
  326. metadata +455 -0
@@ -0,0 +1,170 @@
1
+ require 'monitor'
2
+
3
+ require 'session'
4
+ require 'sip_logger'
5
+
6
+ class SessionManager
7
+ include SipLogger
8
+
9
+ # When a new call is created and the request is sent out only From tag
10
+ # is present, at this time the entry is local_tag+call_id and the session
11
+ # gets in the half_dialogs hash.
12
+ #
13
+ # When a response is received, the full_dialogs is searched first, if not
14
+ # found then half_dialogs is searched. If the response is final and has a To tag
15
+ # we transition the session from half_dialogs hash to full_dialogs
16
+ # hash with the key as local_tag+call_id+remote_tag, actually half dialog entry still
17
+ # remains to absorb retransmissions.
18
+ #
19
+ # When request is received and it contains no To tag then a new session is
20
+ # created and entry goes to half dialogs when a response is sent out the session
21
+ # transitions to full_dialogs hash if the response is final.
22
+ #
23
+ # We do not remove the entry from the half dialog maps even when getting or receiving
24
+ # final responses. Instead we record the half dialog key in the session object and also
25
+ # add the session in the full dialog map. This is to take care of retransmission of both
26
+ # Request and Responses (if we retransmitted request before). Then entry shall be removed
27
+ # from the half dialog map when the transaction completes or on session termination.
28
+ #
29
+ # If a request is received with a To tag, only full_dialogs is searched.
30
+ #
31
+ # The session is removed either explicitly by calling invalidate or when
32
+ # timeout happens todo timeouts
33
+ #
34
+ @@full_dialogs = {}
35
+ # both local and remote dialogs are half dialogs
36
+ # local is for requests generated by us and remote
37
+ # or the far end UA. We transition to full map on dialog establishment from
38
+ # both of these.
39
+ @@half_dialogs = {}
40
+ @@sm_lock = Monitor.new
41
+
42
+
43
+ # Invoked on all incoming responses with or w/out remote tag
44
+ # and incoming requests with or without both tags.
45
+ # For requests without to tag a new session is created and when
46
+ # responded to, it transitions to full_dialogs from half dialogs
47
+ #
48
+ def SessionManager.find_session call_id, local, remote, final=false
49
+ SipLogger['siplog::sessionmanager'].info("Finding session for key |#{local}|#{call_id}|#{remote}|")
50
+ #SipLogger['siplog::sessionmanager'].debug("Half map at this time is #{@@half_dialogs.keys.join(',')}")
51
+ #SipLogger['siplog::sessionmanager'].debug("Full map at this time is #{@@full_dialogs.keys.join(',')}")
52
+ s = nil
53
+ key = sprintf("|%s|%s|%s|",local, call_id, remote)
54
+ @@sm_lock.synchronize do
55
+ if remote
56
+ if local
57
+ s = @@full_dialogs[key]
58
+ unless s
59
+ SipLogger['siplog::sessionmanager'].info("Not found in full dialog map looking in half")
60
+ key_l = sprintf("|%s|%s|%s|",local, call_id, nil)
61
+ if (s = @@half_dialogs[key_l])
62
+ if final
63
+ #@@half_dialogs[key_l] = nil #instead of removing from half, just record half dialog.
64
+ s.half_dialog_key = key_l
65
+ s.session_map = :full
66
+ s.session_key = key
67
+ SipLogger['siplog::sessionmanager'].info("Found in half copying to full")
68
+ else
69
+ SipLogger['siplog::sessionmanager'].info("Found in half NOT copying to full")
70
+ end
71
+ @@full_dialogs[key] = s
72
+ end
73
+ else
74
+ SipLogger['siplog::sessionmanager'].info("Found in the full dialogs map")
75
+ # cleaning up in case a NOTIFY came before 2xx and now we have 2xx
76
+ if final
77
+ key_l = sprintf("|%s|%s|%s|",local, call_id, nil)
78
+ #@@half_dialogs[key_l] = nil #instead of removing from half, just record half dialog.
79
+ s.half_dialog_key = key_l
80
+ s.session_map = :full
81
+ s.session_key = key
82
+ SipLogger['siplog::sessionmanager'].info("Found in full NOW moving to full")
83
+ end
84
+ end
85
+ else #local not present but remote present
86
+ s = @@half_dialogs[key]
87
+ end
88
+ else #remote not present
89
+ s = @@half_dialogs[key]
90
+ end
91
+ end
92
+ return s
93
+ end
94
+
95
+
96
+ # addition of session happens on new req out, resp out for new req,
97
+ # But this is called whenever any message is being sent out. If both the
98
+ # local and remote tags are present then add in the full_dialogs hash, otherwise
99
+ # just add in the half_dialogs hash, in both cases mark in the session
100
+ # if the session was in half dialog hash and you are adding in full then remove
101
+ # from HD Map. If the session is already in full then do not do anything.
102
+
103
+ def SessionManager.add_session session, final=false
104
+ SipLogger['siplog::sessionmanager'].debug("Trying to add session with session.session_map #{session.session_map} local_tag=#{session.local_tag} and remote_tag=#{session.remote_tag}")
105
+ if session.session_map == :full && !session.force_update_session_map
106
+ SipLogger['siplog::sessionmanager'].info("Already in full map")
107
+ return
108
+ end
109
+ if ((session.session_map == :half) &&
110
+ !(session.remote_tag && session.local_tag)) &&
111
+ !session.force_update_session_map
112
+ SipLogger['siplog::sessionmanager'].info("Already in half map, nothing new")
113
+ return
114
+ end
115
+ key = sprintf("|%s|%s|%s|", session.local_tag, session.call_id, session.remote_tag)
116
+ if session.remote_tag
117
+ if session.local_tag
118
+ @@sm_lock.synchronize do
119
+ @@full_dialogs[key] = session
120
+ #@@half_dialogs[session.session_key] = nil if ((session.session_map == :half) && final)
121
+ session.half_dialog_key = session.session_key
122
+ end
123
+ session.session_map = :full
124
+ else # incoming request and 100 responses out
125
+ @@sm_lock.synchronize do
126
+ @@half_dialogs[key] = session
127
+ end
128
+ session.session_map = :half
129
+ end
130
+ else
131
+ @@sm_lock.synchronize do
132
+ @@half_dialogs[key] = session
133
+ end
134
+ session.session_map = :half
135
+ end
136
+ SipLogger['siplog::sessionmanager'].debug("Setting the session_key as #{key}")
137
+ session.session_key = key
138
+ end
139
+
140
+
141
+ def SessionManager.remove_session session, half_only=false
142
+ @@sm_lock.synchronize do
143
+ @@half_dialogs[session.half_dialog_key] = nil if session.half_dialog_key
144
+ SipLogger['siplog::sessionmanager'].info("Removed session with key #{session.half_dialog_key} from half_dialogs map")
145
+ return if half_only
146
+ end
147
+ if session.session_map == :full
148
+ @@sm_lock.synchronize do
149
+ @@full_dialogs[session.session_key] = nil
150
+ end
151
+ SipLogger['siplog::sessionmanager'].info("Removed session with key #{session.session_key} from full_dialogs map")
152
+ elsif session.session_map == :half
153
+ @@sm_lock.synchronize do
154
+ @@half_dialogs[session.session_key] = nil
155
+ end
156
+ SipLogger['siplog::sessionmanager'].info("Removed session with key #{session.session_key} from half_dialogs map")
157
+ else
158
+ SipLogger['siplog::sessionmanager'].warn("Session with call_id #{session.call_id } does not have any map information")
159
+ end
160
+ end
161
+
162
+ def SessionManager.clean_all
163
+ @@sm_lock.synchronize do
164
+ @@full_dialogs = {}
165
+ @@half_dialogs = {}
166
+ end
167
+ end
168
+
169
+
170
+ end
@@ -0,0 +1,190 @@
1
+ require 'yaml'
2
+ require 'sipper_configurator'
3
+ require 'message'
4
+
5
+ # Recording of a session happens, either when you have
6
+ # the global setting for recording :SessionRecord= true or you
7
+ # get the P header P-Session-Record, the values for the global
8
+ # var or the header can be "msg-info" or "msg-debug"
9
+ # msg-info just records the in-out messages and msg-debug records
10
+ # full SIP messages.
11
+ #
12
+
13
+ require 'sip_logger'
14
+ require 'stringio'
15
+ require 'monitor'
16
+
17
+ class SessionRecorder
18
+ include SipLogger
19
+
20
+ attr_accessor :level
21
+
22
+ private_class_method :new
23
+
24
+ @@count = 0
25
+ @@val = 0
26
+ @@base = 0
27
+ @@class_lock = Monitor.new
28
+
29
+ def SessionRecorder.get_new_count
30
+ @@class_lock.synchronize do
31
+ @@count += 1
32
+ if @@count == 10
33
+ @@count = 0
34
+ @@base = @@val*10
35
+ end
36
+ @@val = @@base + @@count
37
+ end
38
+ end
39
+
40
+ def SessionRecorder.create_and_record(io, msg, msg_s, direction, session_setting=nil)
41
+ if msg[:p_session_record]
42
+ level = msg.p_session_record.to_s
43
+ elsif session_setting
44
+ level = session_setting
45
+ else
46
+ level = SipperConfigurator[:SessionRecord]
47
+ end
48
+ if level
49
+ if io
50
+ sr = new(nil, io, level)
51
+ else
52
+ sr = new(SessionRecorder.get_new_count.to_s+"_"+msg.call_id.to_s+"_"+direction , nil, level)
53
+ end
54
+ end
55
+ sr.record(direction, msg, msg_s) if sr
56
+ return sr
57
+ end
58
+
59
+
60
+ def initialize(f, io, l="msg-info")
61
+ @messages = []
62
+ @io = io
63
+ @level = l
64
+ path = SipperConfigurator[:SessionRecordPath]||SipperConfigurator[:LogPath]
65
+ @filename = File.join(path, f) if f
66
+ @recordable = true
67
+ end
68
+
69
+ def io=(io)
70
+ ensure_recordable
71
+ @io.close if @io
72
+ @io = io
73
+ end
74
+
75
+ def open_file_if_unopened
76
+ return if @io
77
+ io = File.new(@filename, "w+")
78
+ io.flock(File::LOCK_EX) if SipperConfigurator[:EnableRecordingLock]
79
+ self.io = io
80
+ end
81
+
82
+ # Record takes both sip message and also the optional string representation of
83
+ # the message as the message is filled as we go along the stack and populate the
84
+ # message. The string representation is the final string that goes out from the
85
+ # transport.
86
+
87
+ def record(direction, msg, msg_s=nil )
88
+ ensure_recordable
89
+ open_file_if_unopened
90
+ case @level
91
+ when "msg-info"
92
+ if msg.class == Request
93
+ m = msg.method
94
+ elsif msg.class == Response
95
+ m = msg.code.to_s
96
+ else
97
+ m = msg.to_s
98
+ end
99
+ when "msg-debug"
100
+ m = msg_s.nil? ? msg.to_s : msg_s
101
+ else
102
+ m = "Unknown_record_level #{@level}, I know only msg-info and msg-debug"
103
+ end
104
+ if direction == "in"
105
+ m = "< " + m
106
+ elsif direction == "out"
107
+ m = "> " + m
108
+ elsif direction == "neutral"
109
+ m = "! " + m
110
+ else
111
+ m = "UNKNOWN DIRECTION " + m
112
+ end
113
+ @messages << m
114
+ end
115
+
116
+ def get_recording
117
+ @messages
118
+ end
119
+
120
+ def get_info_only_recording
121
+ return @messages if @level == "msg-info"
122
+ @messages.map do |msg|
123
+ prefix = msg[0..1]
124
+ message = msg[2..-1]
125
+ unless prefix == "! " #neutral
126
+ begin
127
+ m = Message.parse([message, ["AF_INET", 33302, "localhost.localdomain", "127.0.0.1"]])
128
+ if m.class == Request
129
+ prefix + m.method
130
+ elsif m.class == Response
131
+ prefix + m.code.to_s
132
+ end
133
+ rescue ArgumentError
134
+ msg
135
+ end
136
+ else
137
+ msg
138
+ end
139
+ end
140
+ end
141
+
142
+
143
+ def save
144
+ ensure_recordable
145
+ logd("Trying to save the recording in #{@io.path||@io}")
146
+ @recordable = false
147
+ begin
148
+ @io.write(YAML::dump(self))
149
+ @io.flush
150
+ ensure
151
+ @io.flock(File::LOCK_UN) if @io.class == File if SipperConfigurator[:EnableRecordingLock]
152
+ @io.close unless @io.class == StringIO
153
+ end
154
+ logd("Saved the recording in #{@io.path||@io}")
155
+ end
156
+
157
+ def SessionRecorder.load(f)
158
+ SipLogger['siplog::sessionrecorder'].debug("Reading the recording from #{f}")
159
+ begin
160
+ case f
161
+ when String
162
+ io = File.new(f, "r")
163
+ io.flock(File::LOCK_EX) if SipperConfigurator[:EnableRecordingLock]
164
+ when StringIO
165
+ io = f
166
+ end
167
+ obj = YAML::load(io)
168
+ if obj.class == SessionRecorder
169
+ return obj
170
+ else
171
+ msg = "Object read from file #{f} is not a recording"
172
+ SipLogger['siplog::sessionrecorder'].error(msg)
173
+ raise TypeError, msg
174
+ end
175
+ rescue IOError
176
+ msg = "#{f} is not a proper file"
177
+ SipLogger['siplog::sessionrecorder'].error(msg)
178
+ raise TypeError, msg
179
+ ensure
180
+ io.flock(File::LOCK_UN) if io.class == File if SipperConfigurator[:EnableRecordingLock]
181
+ io.close if io
182
+ end
183
+ end
184
+
185
+ def ensure_recordable
186
+ raise RuntimeError, "This recorder is now closed for recording" unless @recordable
187
+ end
188
+
189
+ private :open_file_if_unopened, :ensure_recordable
190
+ end
@@ -0,0 +1,54 @@
1
+ // Dialog state machine, refer to RFC 4235
2
+ // This is not being used currently, put here for future
3
+
4
+ %class Dsm
5
+
6
+ %start DsmMap::Trying
7
+
8
+ %map DsmMap
9
+
10
+ %%
11
+
12
+ Trying
13
+ {
14
+ one_xx_no_tag Proceeding {}
15
+ one_xx_tag Early {}
16
+ two_xx Confirmed {}
17
+ cancelled_rejected Terminated {}
18
+ three_xx Terminated {}
19
+ }
20
+
21
+
22
+ Proceeding
23
+ {
24
+ one_xx_tag Early {}
25
+ two_xx Confirmed {}
26
+ cancelled_rejected Terminated {}
27
+ three_xx Terminated {}
28
+ }
29
+
30
+ Early
31
+ {
32
+ replaced Terminated {}
33
+ two_xx Confirmed {}
34
+ one_xx_tag nil {}
35
+ three_xx Terminated {}
36
+ }
37
+
38
+ Confirmed
39
+ {
40
+ error Terminated {}
41
+ timeout Terminated {}
42
+ replaced Terminated {}
43
+ bye Terminated {}
44
+ two_xx nil {}
45
+ }
46
+
47
+ Terminated
48
+ {
49
+ timeout nil {}
50
+ bye nil {}
51
+ }
52
+
53
+
54
+ %%
@@ -0,0 +1,337 @@
1
+ # DO NOT EDIT.
2
+ # generated by smc (http://smc.sourceforge.net/)
3
+ # from file : DialogState.sm
4
+
5
+ require 'statemap'
6
+
7
+ class DsmState < Statemap::State
8
+
9
+ def Entry(fsm) end
10
+
11
+ def Exit(fsm) end
12
+
13
+ def bye(fsm)
14
+ Default(fsm)
15
+ end
16
+
17
+ def cancelled_rejected(fsm)
18
+ Default(fsm)
19
+ end
20
+
21
+ def error(fsm)
22
+ Default(fsm)
23
+ end
24
+
25
+ def one_xx_no_tag(fsm)
26
+ Default(fsm)
27
+ end
28
+
29
+ def one_xx_tag(fsm)
30
+ Default(fsm)
31
+ end
32
+
33
+ def replaced(fsm)
34
+ Default(fsm)
35
+ end
36
+
37
+ def three_xx(fsm)
38
+ Default(fsm)
39
+ end
40
+
41
+ def timeout(fsm)
42
+ Default(fsm)
43
+ end
44
+
45
+ def two_xx(fsm)
46
+ Default(fsm)
47
+ end
48
+
49
+ def Default(fsm)
50
+ if fsm.getDebugFlag then
51
+ fsm.getDebugStream.write("TRANSITION : Default\n")
52
+ end
53
+ msg = "\nState: " + fsm.getState.getName +
54
+ "\nTransition: " + fsm.getTransition + "\n"
55
+ raise Statemap::TransitionUndefinedException, msg
56
+ end
57
+
58
+ end
59
+
60
+ class DsmMap_Default < DsmState
61
+
62
+ end
63
+
64
+ class DsmMap_Trying < DsmMap_Default
65
+
66
+ def cancelled_rejected(fsm)
67
+ if fsm.getDebugFlag then
68
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Trying.cancelled_rejected\n")
69
+ end
70
+ fsm.getState.Exit(fsm)
71
+ fsm.setState(DsmMap::Terminated)
72
+ fsm.getState.Entry(fsm)
73
+ end
74
+
75
+ def one_xx_no_tag(fsm)
76
+ if fsm.getDebugFlag then
77
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Trying.one_xx_no_tag\n")
78
+ end
79
+ fsm.getState.Exit(fsm)
80
+ fsm.setState(DsmMap::Proceeding)
81
+ fsm.getState.Entry(fsm)
82
+ end
83
+
84
+ def one_xx_tag(fsm)
85
+ if fsm.getDebugFlag then
86
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Trying.one_xx_tag\n")
87
+ end
88
+ fsm.getState.Exit(fsm)
89
+ fsm.setState(DsmMap::Early)
90
+ fsm.getState.Entry(fsm)
91
+ end
92
+
93
+ def three_xx(fsm)
94
+ if fsm.getDebugFlag then
95
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Trying.three_xx\n")
96
+ end
97
+ fsm.getState.Exit(fsm)
98
+ fsm.setState(DsmMap::Terminated)
99
+ fsm.getState.Entry(fsm)
100
+ end
101
+
102
+ def two_xx(fsm)
103
+ if fsm.getDebugFlag then
104
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Trying.two_xx\n")
105
+ end
106
+ fsm.getState.Exit(fsm)
107
+ fsm.setState(DsmMap::Confirmed)
108
+ fsm.getState.Entry(fsm)
109
+ end
110
+
111
+ end
112
+
113
+ class DsmMap_Proceeding < DsmMap_Default
114
+
115
+ def cancelled_rejected(fsm)
116
+ if fsm.getDebugFlag then
117
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Proceeding.cancelled_rejected\n")
118
+ end
119
+ fsm.getState.Exit(fsm)
120
+ fsm.setState(DsmMap::Terminated)
121
+ fsm.getState.Entry(fsm)
122
+ end
123
+
124
+ def one_xx_tag(fsm)
125
+ if fsm.getDebugFlag then
126
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Proceeding.one_xx_tag\n")
127
+ end
128
+ fsm.getState.Exit(fsm)
129
+ fsm.setState(DsmMap::Early)
130
+ fsm.getState.Entry(fsm)
131
+ end
132
+
133
+ def three_xx(fsm)
134
+ if fsm.getDebugFlag then
135
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Proceeding.three_xx\n")
136
+ end
137
+ fsm.getState.Exit(fsm)
138
+ fsm.setState(DsmMap::Terminated)
139
+ fsm.getState.Entry(fsm)
140
+ end
141
+
142
+ def two_xx(fsm)
143
+ if fsm.getDebugFlag then
144
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Proceeding.two_xx\n")
145
+ end
146
+ fsm.getState.Exit(fsm)
147
+ fsm.setState(DsmMap::Confirmed)
148
+ fsm.getState.Entry(fsm)
149
+ end
150
+
151
+ end
152
+
153
+ class DsmMap_Early < DsmMap_Default
154
+
155
+ def one_xx_tag(fsm)
156
+ if fsm.getDebugFlag then
157
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Early.one_xx_tag\n")
158
+ end
159
+ end
160
+
161
+ def replaced(fsm)
162
+ if fsm.getDebugFlag then
163
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Early.replaced\n")
164
+ end
165
+ fsm.getState.Exit(fsm)
166
+ fsm.setState(DsmMap::Terminated)
167
+ fsm.getState.Entry(fsm)
168
+ end
169
+
170
+ def three_xx(fsm)
171
+ if fsm.getDebugFlag then
172
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Early.three_xx\n")
173
+ end
174
+ fsm.getState.Exit(fsm)
175
+ fsm.setState(DsmMap::Terminated)
176
+ fsm.getState.Entry(fsm)
177
+ end
178
+
179
+ def two_xx(fsm)
180
+ if fsm.getDebugFlag then
181
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Early.two_xx\n")
182
+ end
183
+ fsm.getState.Exit(fsm)
184
+ fsm.setState(DsmMap::Confirmed)
185
+ fsm.getState.Entry(fsm)
186
+ end
187
+
188
+ end
189
+
190
+ class DsmMap_Confirmed < DsmMap_Default
191
+
192
+ def bye(fsm)
193
+ if fsm.getDebugFlag then
194
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Confirmed.bye\n")
195
+ end
196
+ fsm.getState.Exit(fsm)
197
+ fsm.setState(DsmMap::Terminated)
198
+ fsm.getState.Entry(fsm)
199
+ end
200
+
201
+ def error(fsm)
202
+ if fsm.getDebugFlag then
203
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Confirmed.error\n")
204
+ end
205
+ fsm.getState.Exit(fsm)
206
+ fsm.setState(DsmMap::Terminated)
207
+ fsm.getState.Entry(fsm)
208
+ end
209
+
210
+ def replaced(fsm)
211
+ if fsm.getDebugFlag then
212
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Confirmed.replaced\n")
213
+ end
214
+ fsm.getState.Exit(fsm)
215
+ fsm.setState(DsmMap::Terminated)
216
+ fsm.getState.Entry(fsm)
217
+ end
218
+
219
+ def timeout(fsm)
220
+ if fsm.getDebugFlag then
221
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Confirmed.timeout\n")
222
+ end
223
+ fsm.getState.Exit(fsm)
224
+ fsm.setState(DsmMap::Terminated)
225
+ fsm.getState.Entry(fsm)
226
+ end
227
+
228
+ def two_xx(fsm)
229
+ if fsm.getDebugFlag then
230
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Confirmed.two_xx\n")
231
+ end
232
+ end
233
+
234
+ end
235
+
236
+ class DsmMap_Terminated < DsmMap_Default
237
+
238
+ def bye(fsm)
239
+ if fsm.getDebugFlag then
240
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Terminated.bye\n")
241
+ end
242
+ end
243
+
244
+ def timeout(fsm)
245
+ if fsm.getDebugFlag then
246
+ fsm.getDebugStream.write("TRANSITION : DsmMap::Terminated.timeout\n")
247
+ end
248
+ end
249
+
250
+ end
251
+
252
+ module DsmMap
253
+
254
+ Trying = DsmMap_Trying::new('DsmMap.Trying', 0).freeze
255
+ Proceeding = DsmMap_Proceeding::new('DsmMap.Proceeding', 1).freeze
256
+ Early = DsmMap_Early::new('DsmMap.Early', 2).freeze
257
+ Confirmed = DsmMap_Confirmed::new('DsmMap.Confirmed', 3).freeze
258
+ Terminated = DsmMap_Terminated::new('DsmMap.Terminated', 4).freeze
259
+ Default = DsmMap_Default::new('DsmMap.Default', -1).freeze
260
+
261
+ end
262
+
263
+ class Dsm_sm < Statemap::FSMContext
264
+
265
+ def initialize(owner)
266
+ super()
267
+ @_owner = owner
268
+ setState(DsmMap::Trying)
269
+ DsmMap::Trying.Entry(self)
270
+ end
271
+
272
+ def bye()
273
+ @_transition = 'bye'
274
+ getState.bye(self)
275
+ @_transition = nil
276
+ end
277
+
278
+ def cancelled_rejected()
279
+ @_transition = 'cancelled_rejected'
280
+ getState.cancelled_rejected(self)
281
+ @_transition = nil
282
+ end
283
+
284
+ def error()
285
+ @_transition = 'error'
286
+ getState.error(self)
287
+ @_transition = nil
288
+ end
289
+
290
+ def one_xx_no_tag()
291
+ @_transition = 'one_xx_no_tag'
292
+ getState.one_xx_no_tag(self)
293
+ @_transition = nil
294
+ end
295
+
296
+ def one_xx_tag()
297
+ @_transition = 'one_xx_tag'
298
+ getState.one_xx_tag(self)
299
+ @_transition = nil
300
+ end
301
+
302
+ def replaced()
303
+ @_transition = 'replaced'
304
+ getState.replaced(self)
305
+ @_transition = nil
306
+ end
307
+
308
+ def three_xx()
309
+ @_transition = 'three_xx'
310
+ getState.three_xx(self)
311
+ @_transition = nil
312
+ end
313
+
314
+ def timeout()
315
+ @_transition = 'timeout'
316
+ getState.timeout(self)
317
+ @_transition = nil
318
+ end
319
+
320
+ def two_xx()
321
+ @_transition = 'two_xx'
322
+ getState.two_xx(self)
323
+ @_transition = nil
324
+ end
325
+
326
+ def getState()
327
+ if @_state.nil? then
328
+ raise Statemap::StateUndefinedException
329
+ end
330
+ return @_state
331
+ end
332
+
333
+ def getOwner()
334
+ return @_owner
335
+ end
336
+
337
+ end