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,2 @@
1
+ README
2
+ Contains the controllers.
@@ -0,0 +1,2 @@
1
+ # empty file to indicate sipper project
2
+ # used by run.rb to make use of project specific settings
@@ -0,0 +1,2 @@
1
+ README
2
+ Contains the logs.
@@ -0,0 +1,2 @@
1
+ README
2
+ Contains the logs.
@@ -0,0 +1,194 @@
1
+ #
2
+ # The contents of this file are subject to the Mozilla Public
3
+ # License Version 1.1 (the "License"); you may not use this file
4
+ # except in compliance with the License. You may obtain a copy of
5
+ # the License at http://www.mozilla.org/MPL/
6
+ #
7
+ # Software distributed under the License is distributed on an "AS
8
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
9
+ # implied. See the License for the specific language governing
10
+ # rights and limitations under the License.
11
+ #
12
+ # The Original Code is State Machine Compiler (SMC).
13
+ #
14
+ # The Initial Developer of the Original Code is Charles W. Rapp.
15
+ #
16
+ # Port to Ruby by Francois Perrad, francois.perrad@gadz.org
17
+ # Copyright 2004, Francois Perrad.
18
+ # All Rights Reserved.
19
+ #
20
+ # Contributor(s):
21
+ #
22
+ # RCS ID
23
+ # $Id: statemap.rb,v 1.1 2007/04/15 02:34:39 rnakhan Exp $
24
+ #
25
+
26
+ # This namespace contains two class (and two exceptions) :
27
+ #* State
28
+ # the base State class
29
+ #* FSMContext
30
+ # the Finite State Machine Context class
31
+ #
32
+ #See: http://smc.sourceforge.net/
33
+ module Statemap
34
+
35
+ # A StateUndefinedException is thrown by
36
+ # an SMC-generated state machine whenever a transition is taken
37
+ # and there is no state currently set. This occurs when a
38
+ # transition is issued from with a transition action.
39
+ class StateUndefinedException < Exception
40
+ end
41
+
42
+ # A TransitionUndefinedException is thrown by
43
+ # an SMC-generated state machine whenever a transition is taken
44
+ # which:
45
+ #
46
+ # * Is not explicitly defined in the current state.
47
+ # * Is not explicitly defined in the current FSM's default state.
48
+ # * There is no Default transition in the current state.
49
+ class TransitionUndefinedException < Exception
50
+ end
51
+
52
+ # base State class
53
+ class State
54
+
55
+ def initialize(name, id)
56
+ @_name = name
57
+ @_id = id
58
+ end
59
+
60
+ # Returns the state's printable name.
61
+ def getName()
62
+ return @_name
63
+ end
64
+
65
+ # Returns the state's unique identifier.
66
+ def getId()
67
+ return @_id
68
+ end
69
+
70
+ end
71
+
72
+ # The user can derive FSM contexts from this class and interface
73
+ # to them with the methods of this class.
74
+ #
75
+ # The finite state machine needs to be initialized to the starting
76
+ # state of the FSM. This must be done manually in the constructor
77
+ # of the derived class.
78
+ class FSMContext
79
+
80
+ def initialize()
81
+ @_state = nil
82
+ @_previous_state = nil
83
+ @_state_stack = []
84
+ @_transition = nil
85
+ @_debug_flag = nil
86
+ @_debug_stream = $stderr
87
+ end
88
+
89
+ # Returns the debug flag's current setting.
90
+ def getDebugFlag()
91
+ return @_debug_flag
92
+ end
93
+
94
+ # Sets the debug flag.
95
+ #
96
+ # A true value means debugging is on and false means off.
97
+ def setDebugFlag(flag)
98
+ @_debug_flag = flag
99
+ end
100
+
101
+ # Returns the stream to which debug output is written.
102
+ def getDebugStream()
103
+ return @_debug_stream
104
+ end
105
+
106
+ # Sets the debug output stream.
107
+ def setDebugStream(stream)
108
+ @_debug_stream = stream
109
+ end
110
+
111
+ # Is this state machine already inside a transition?
112
+ #
113
+ # True if state is undefined.
114
+ def isInTransition()
115
+ return @_state == nil
116
+ end
117
+
118
+ # Returns the current transition's name.
119
+ #
120
+ # Used only for debugging purposes.
121
+ def getTransition()
122
+ return @_transition
123
+ end
124
+
125
+ # Clears the current state.
126
+ def clearState()
127
+ @_previous_state = @_state
128
+ @_state = nil
129
+ end
130
+
131
+ # Returns the state which a transition left.
132
+ #
133
+ # May be nil.
134
+ def getPreviousState()
135
+ return @_previous_state
136
+ end
137
+
138
+ # Sets the current state to the specified state.
139
+ def setState(state)
140
+ raise "undefined state.\n" if state.nil?
141
+ raise "#{state} is not a Statemap.State.\n" unless state.is_a?(Statemap::State)
142
+ @_state = state
143
+ if @_debug_flag then
144
+ @_debug_stream.puts "NEW STATE : %s\n" % @_state.getName
145
+ end
146
+ end
147
+
148
+ # Returns true if the state stack is empty and false otherwise.
149
+ def isStateStackEmpty()
150
+ return @_state_stack.empty?
151
+ end
152
+
153
+ # Returns the state stack's depth.
154
+ def getStateStackDepth()
155
+ return @_state_stack.size
156
+ end
157
+
158
+ # Push the current state on top of the state stack
159
+ # and make the specified state the current state.
160
+ def pushState(state)
161
+ raise "undefined state.\n" if state.nil?
162
+ raise "#{state} is not a Statemap.State.\n" unless state.is_a?(Statemap::State)
163
+ unless @_state.nil?
164
+ @_state_stack.push @_state
165
+ end
166
+ @_state = state
167
+ if @_debug_flag then
168
+ @_debug_stream.puts "PUSH TO STATE: %s\n" % @_state.getName
169
+ end
170
+ end
171
+
172
+ # Make the state on top of the state stack the current state.
173
+ def popState()
174
+ if @_state_stack.empty? then
175
+ if @_debug_flag then
176
+ @_debug_stream.puts "POPPING ON EMPTY STATE STACK.\n"
177
+ end
178
+ raise "empty state stack.\n"
179
+ else
180
+ @_state = @_state_stack.pop
181
+ if @_debug_flag then
182
+ @_debug_stream.puts "POP TO STATE : %s\n" % @_state.getName
183
+ end
184
+ end
185
+ end
186
+
187
+ # Remove all states from the state stack.
188
+ def emptyStateStack()
189
+ @_state_stack = []
190
+ end
191
+
192
+ end
193
+
194
+ end
@@ -0,0 +1,6 @@
1
+ rm *.log
2
+ rm *_in
3
+ rm *_out
4
+ rm *_unknown
5
+ rm precall*
6
+ rm -r .Test*
@@ -0,0 +1,6 @@
1
+ rm -f *.log
2
+ rm -f *_in
3
+ rm -f *_out
4
+ rm -f *_unknown
5
+ rm -f precall*
6
+ rm -rf .Test*
@@ -0,0 +1,268 @@
1
+ require 'util/locator'
2
+ require 'sipper_configurator'
3
+ require 'media/sipper_media_manager'
4
+ require 'media/sipper_media_event'
5
+ require 'sip_logger'
6
+ require 'util/sipper_util'
7
+ require 'monitor'
8
+ require 'ostruct'
9
+
10
+
11
+ module Media
12
+ class SipperDummyMediaClient
13
+ include SipLogger
14
+
15
+ attr_accessor :media_id, :recv_ip, :recv_port,
16
+ :send_ip, :send_port,
17
+ :codec,
18
+ :play_spec, :record_file,
19
+ :dtmf_play_spec,
20
+ :session
21
+
22
+ def recv_ip
23
+ return "10.10.10.10"
24
+ end
25
+
26
+ def recv_port
27
+ return "6060"
28
+ end
29
+
30
+ def set_sdp_media(peerMedia, ourMedia)
31
+ end
32
+
33
+ def update_sdp_media(peerMedia, ourMedia)
34
+ end
35
+
36
+ def destroy_media
37
+ end
38
+
39
+ def initialize(session)
40
+ logd("Dummy media client created.")
41
+ end
42
+
43
+ def set_dtmf_command(cmd)
44
+ end
45
+ end
46
+
47
+ class SipperMediaClient
48
+ include SipLogger
49
+
50
+ attr_accessor :media_id, :recv_ip, :recv_port,
51
+ :send_ip, :send_port,
52
+ :codec,
53
+ :session
54
+
55
+ attr_reader :play_spec, :record_file,
56
+ :dtmf_play_spec
57
+
58
+ def play_spec=(inValue)
59
+ return unless inValue
60
+ @play_spec = inValue
61
+ @play_spec = nil if @play_spec && (@play_spec.length == 0)
62
+ end
63
+
64
+ def record_file=(inValue)
65
+ return unless inValue
66
+ @record_file = inValue
67
+ @record_file = nil if @record_file && (@record_file.length == 0)
68
+ end
69
+
70
+ def dtmf_play_spec=(inValue)
71
+ return unless inValue
72
+ @dtmf_play_spec = inValue
73
+ @dtmf_play_spec = nil if @dtmf_play_spec && (@dtmf_play_spec.length == 0)
74
+ end
75
+
76
+ def initialize(session)
77
+ @session = session
78
+ @media_manager = Media::SipperMediaManager.instance
79
+ @recvpayloadnum = []
80
+ @sendpayloadnum = []
81
+ @codec = []
82
+ create_media
83
+ end
84
+
85
+ def create_media(type="RTP")
86
+ res = _send_command("COMMAND=CREATE MEDIA;MEDIATYPE=#{type}")
87
+
88
+ if res.result == "Success"
89
+ @media_id = res.media_id
90
+ @recv_ip = res.recv_ip
91
+ @recv_port = res.recv_port
92
+ end
93
+ end
94
+
95
+ def destroy_media
96
+ res = _send_command("COMMAND=DESTROY MEDIA;MEDIAID=#{@media_id}") if @media_id
97
+
98
+ if res.result == "Success"
99
+ @media_id = nil
100
+ end
101
+
102
+ end
103
+
104
+ def send_info(send_ip, send_port)
105
+ res = _send_command("COMMAND=SEND INFO;MEDIAID=#{@media_id};SENDIP=#{send_ip};SENDPORT=#{send_port}")
106
+
107
+ if res.result == "Success"
108
+ @send_ip = send_ip
109
+ @send_port = send_port
110
+ end
111
+ end
112
+
113
+ def add_codecs(c, r, s)
114
+ cmd = "COMMAND=ADD CODECS;MEDIAID=#{@media_id};RECVPAYLOADNUM=#{r};SENDPAYLOADNUM=#{s};CODEC=#{c}"
115
+ cmd << ";SENDFILE=#{@play_spec}" if @play_spec && c != 'DTMF'
116
+ cmd << ";SENDFILE=#{@dtmf_play_spec}" if @dtmf_play_spec && c == 'DTMF'
117
+ cmd << ";RECVFILE=#{@record_file}" if @record_file && c != 'DTMF'
118
+ res = _send_command(cmd)
119
+
120
+ if res.result == "Success"
121
+ @codec << r
122
+ end
123
+ end
124
+
125
+ def set_dtmf_command(cmd)
126
+ _send_command("COMMAND=SEND DTMF;MEDIAID=#{@media_id};DTMFCOMMAND=#{cmd}")
127
+ end
128
+
129
+ def set_status(status)
130
+ _send_command("COMMAND=SET STATUS;MEDIAID=#{@media_id};MEDIASTATUS=#{status.upcase}")
131
+ end
132
+
133
+ def clear_codecs()
134
+ _send_command("COMMAND=CLEAR CODECS;MEDIAID=#{@media_id}")
135
+ @codec.clear
136
+ end
137
+
138
+ def _send_command(cmd)
139
+ result = @media_manager.send_command(self, cmd)
140
+ return result
141
+ end
142
+
143
+ def SipperMediaClient.get_supported_codecs
144
+ return ["G711U", "G711A", "DTMF"]
145
+ end
146
+
147
+ def SipperMediaClient.get_dtmf_codec(medialine)
148
+ medialine[:a].split("||").each do |val|
149
+ return val.split(" ")[0].split(":")[1].to_i if val.include?("telephone-event")
150
+ end
151
+
152
+ return nil
153
+ end
154
+
155
+ def set_sdp_media(ourMedia, peerMedia)
156
+ clear_codecs
157
+ peerCLine = peerMedia[:c]
158
+ peerMLine = peerMedia[:m]
159
+
160
+ peerMLineVars = peerMLine.split(" ")
161
+ peerCLineVars = peerCLine.split(" ")
162
+ send_info(peerCLineVars[2], peerMLineVars[1])
163
+
164
+ peerCodecs = peerMLineVars[3..-1]
165
+ ourCodecs = ourMedia[:m].split(" ")[3..-1]
166
+
167
+ if peerCodecs.include?("0") && ourCodecs.include?("0")
168
+ add_codecs("G711U", 0, 0)
169
+ else
170
+ if peerCodecs.include?("8") && ourCodecs.include?("8")
171
+ add_codecs("G711A", 8, 8)
172
+ end
173
+ end
174
+
175
+ peerdtmf = SipperMediaClient::get_dtmf_codec(peerMedia)
176
+ ourdtmf = SipperMediaClient::get_dtmf_codec(ourMedia)
177
+
178
+ if peerdtmf && ourdtmf
179
+ add_codecs("DTMF", peerdtmf, ourdtmf)
180
+ end
181
+
182
+ ourstatus = "SENDRECV"
183
+ ourMedia[:a].split("||").each do |val|
184
+ ourstatus = "INACTIVE" if val == "inactive"
185
+ ourstatus = "SENDONLY" if val == "recvonly"
186
+ ourstatus = "RECVONLY" if val == "sendonly"
187
+ end
188
+
189
+ set_status(ourstatus)
190
+ end
191
+
192
+ def update_sdp_media(peerMedia, ourMedia)
193
+ peerCLine = peerMedia[:c]
194
+ peerMLine = peerMedia[:m]
195
+
196
+ peerMLineVars = peerMLine.split(" ")
197
+ peerCLineVars = peerCLine.split(" ")
198
+
199
+ if (peerMedia[:m].split(" ")[1].to_i == 0 ||
200
+ ourMedia[:m].split(" ")[1].to_i == 0)
201
+ clear_codecs
202
+ return
203
+ end
204
+
205
+ send_info(peerCLineVars[2], peerMLineVars[1])
206
+
207
+ peerCodecs = peerMLineVars[3..-1]
208
+ ourCodecs = ourMedia[:m].split(" ")[3..-1]
209
+
210
+ if peerCodecs.include?("0") && ourCodecs.include?("0")
211
+ if @codec.include?(8)
212
+ set_sdp_media(ourMedia, peerMedia)
213
+ return
214
+ end
215
+ add_codecs("G711U", 0, 0) unless @codec.include?(0)
216
+ else
217
+ if @codec.include?(0)
218
+ set_sdp_media(ourMedia, peerMedia)
219
+ return
220
+ end
221
+ if peerCodecs.include?("8") && ourCodecs.include?("8")
222
+ add_codecs("G711A", 8, 8) unless @codec.include?(8)
223
+ else
224
+ if @codec.include?(8)
225
+ set_sdp_media(ourMedia, peerMedia)
226
+ return
227
+ end
228
+ end
229
+ end
230
+
231
+ peerdtmf = nil
232
+ peerMedia[:a].split("||").each do |val|
233
+ peerdtmf = val.split(" ")[0].split(":")[1] if val.include?("telephone-event")
234
+ end
235
+ ourdtmf = nil
236
+ ourMedia[:a].split("||").each do |val|
237
+ ourdtmf = val.split(" ")[0].split(":")[1] if val.include?("telephone-event")
238
+ end
239
+
240
+ if peerdtmf && ourdtmf
241
+ add_codecs("DTMF", peerdtmf, ourdtmf) unless @codec.include?(peerdtmf)
242
+ diffcodec = @codec - [0, 8, peerdtmf]
243
+ if diffcodec.length > 0
244
+ set_sdp_media(ourMedia, peerMedia)
245
+ return
246
+ end
247
+ else
248
+ diffcodec = @codec - [0, 8]
249
+ if diffcodec.length > 0
250
+ set_sdp_media(ourMedia, peerMedia)
251
+ return
252
+ end
253
+ end
254
+
255
+ ourstatus = "SENDRECV"
256
+ ourMedia[:a].split("||").each do |val|
257
+ ourstatus = "INACTIVE" if val == "inactive"
258
+ ourstatus = "SENDONLY" if val == "sendonly"
259
+ ourstatus = "RECVONLY" if val == "recvonly"
260
+ end
261
+
262
+ set_status(ourstatus)
263
+ end
264
+
265
+ private :_send_command
266
+
267
+ end
268
+ end