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,43 @@
1
+
2
+ # Media Event includes both the Events generated by the media
3
+ # client as well as the responses to the requests sent.
4
+ #
5
+ module Media
6
+
7
+ class SipperMediaEvent
8
+ attr_accessor :session
9
+ def initialize(session)
10
+ @session = session
11
+ end
12
+
13
+ def short_to_s
14
+ self.to_s
15
+ end
16
+
17
+ end
18
+
19
+ class SmReply < SipperMediaEvent
20
+ attr_reader :cmd, :media_id, :reason, :recv_ip, :recv_port, :result, :otherparams
21
+ def initialize(session, cmd, result, mediaid=nil, reason=nil, recvip=nil, recvport=nil, otherparam=nil)
22
+ super(session)
23
+ @cmd = cmd
24
+ @result = result
25
+ @media_id = mediaid
26
+ @reason = reason
27
+ @recv_ip = recvip
28
+ @recv_port = recvport
29
+ @otherparams = otherparam
30
+ end
31
+ end
32
+
33
+ class SmEvent < SipperMediaEvent
34
+ attr_reader :codec, :event, :dtmf, :media_id
35
+ def initialize(session, mediaid, codec, event, dtmf=nil)
36
+ super(session)
37
+ @codec = codec
38
+ @event = event
39
+ @dtmf = dtmf
40
+ @media_id = mediaid
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,145 @@
1
+ require 'singleton'
2
+
3
+
4
+ module Media
5
+ class SipperMediaManager
6
+
7
+ include SipLogger
8
+
9
+ include Singleton
10
+
11
+ def initialize()
12
+ @cal = Monitor.new # command send lock
13
+
14
+ @csl = Monitor.new # command status lock
15
+ @csl_cmd = @csl.new_cond
16
+
17
+ @media_clients = {}
18
+ @media_clients.extend(MonitorMixin)
19
+
20
+ start
21
+ end
22
+
23
+ def set_queue(q)
24
+ @q = q
25
+ end
26
+
27
+ def enqueue_event(event)
28
+ @q << event
29
+ end
30
+
31
+ def start
32
+ return false unless SipperConfigurator[:SipperMedia]
33
+ @t = TCPSocket.new(SipperConfigurator[:LocalSipperIP], SIP::Locator[:Smd].controller_port)
34
+
35
+ Thread.new do
36
+ while true do
37
+ ready = select([@t], nil, nil, nil)
38
+ next if not ready
39
+ ready[0].each do |s|
40
+ next if s.eof
41
+ msg_len = s.readpartial(4).unpack("N")[0]
42
+ r = s.readpartial(msg_len)
43
+
44
+ logd("Message received on socket Len[#{msg_len}] Msg[#{r}]")
45
+
46
+ if r.include?'TYPE=Result;'
47
+ cm = rs = md = rn = ri = rp = nil
48
+ otherparams={}
49
+ r.split(';').each do |x|
50
+ y = x.split('=')
51
+ case y[0]
52
+ when 'COMMAND'
53
+ cm = y[1]
54
+ when 'MEDIAID'
55
+ md = y[1]
56
+ when 'RESULT'
57
+ rs = y[1]
58
+ when 'RECVIP'
59
+ ri = y[1]
60
+ when 'RECVPORT'
61
+ rp = y[1]
62
+ when 'REASON'
63
+ rn = y[1]
64
+ else
65
+ otherparams[y[0]] = y[1]
66
+ end
67
+ end
68
+
69
+ reply = Media::SmReply.new(nil, cm, rs, md, rn, ri, rp, otherparams)
70
+ _process_reply(reply)
71
+
72
+ elsif r.include?'TYPE=EVENT;'
73
+ md = cd = ev = dt = nil
74
+ r.split(';').each do |x|
75
+ y = x.split('=')
76
+ case y[0]
77
+ when 'CODEC'
78
+ cd = y[1]
79
+ when 'MEDIAID'
80
+ md = y[1]
81
+ when 'EVENT'
82
+ ev = y[1]
83
+ when 'DTMF'
84
+ dt = y[1]
85
+ end
86
+ end
87
+
88
+ event_client = nil
89
+
90
+ @media_clients.synchronize do
91
+ event_client = @media_clients[md]
92
+ end
93
+
94
+ if event_client == nil
95
+ logd("Stray event received.#{r}")
96
+ else
97
+ evt = Media::SmEvent.new(event_client.session, md, cd, ev, dt)
98
+ enqueue_event(evt)
99
+ end
100
+ end
101
+ end
102
+ end #listener loop
103
+ end # thread
104
+ return true
105
+ end
106
+
107
+ def _process_reply(reply)
108
+ @csl.synchronize do
109
+ @command_result = reply
110
+ @csl_cmd.signal
111
+ end
112
+ end
113
+
114
+ def send_command(mediaClient, commandStr)
115
+ @cal.synchronize do
116
+ @csl.synchronize do
117
+ logd("Sending media Len[#{commandStr.length}] Command[#{commandStr}]")
118
+ @t << [commandStr.length].pack("N") << commandStr
119
+
120
+ 5.times do
121
+ if @csl_cmd.wait(10)
122
+ returnVal = @command_result
123
+ @command_result = nil
124
+ returnVal.session = mediaClient.session
125
+
126
+ @media_clients.synchronize do
127
+ if returnVal.cmd == "CREATE MEDIA" && returnVal.result == "Success"
128
+ @media_clients[returnVal.media_id] = mediaClient
129
+ end
130
+
131
+ if returnVal.cmd == "DESTROY MEDIA" && returnVal.result == "Success"
132
+ @media_clients.delete(returnVal.media_id)
133
+ end
134
+ end
135
+
136
+ return returnVal
137
+ end
138
+ end
139
+ logd("Unable to get result after 5 retries 50Sec. Command: #{commandStr}")
140
+ Process.exit(1)
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,60 @@
1
+ require 'sipper_configurator'
2
+ require 'util/sipper_util'
3
+
4
+
5
+ module Media
6
+ class SipperMediaProxy
7
+
8
+ include SipLogger
9
+ attr_reader :controller_port
10
+
11
+ def initialize(controller_port=nil)
12
+ @controller_port = controller_port || SipperConfigurator[:SipperMediaDefaultControlPort]
13
+
14
+ return if SipperConfigurator[:SipperMediaProcessReuse] && self.ping
15
+
16
+ if self.ping
17
+ loop do
18
+ self.shutdown
19
+ sleep 2
20
+ break unless self.ping
21
+ end
22
+ end
23
+ Thread.new do
24
+ x = system(File.join(SipperConfigurator[:SipperBasePath], "sipper", "bin", "SipperMedia") +" -p " + "#{@controller_port.to_s}")
25
+ end
26
+ loop do
27
+ sleep 2
28
+ break if self.ping
29
+ end
30
+ end
31
+
32
+ def ping
33
+ begin
34
+ t = TCPSocket.new(SipperConfigurator[:LocalSipperIP], @controller_port)
35
+ rescue SystemCallError
36
+ return false
37
+ end
38
+ t.close
39
+ return true
40
+ end
41
+
42
+ def shutdown
43
+ begin
44
+ t = TCPSocket.new(SipperConfigurator[:LocalSipperIP], @controller_port)
45
+ #t.setsockopt(Socket::IPPROTO_TCP, Socket::NONBLOCK, true)
46
+ t.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, true)
47
+ rescue SystemCallError
48
+ return
49
+ end
50
+ command = "COMMAND=SHUTDOWN"
51
+ t << [command.length].pack("N") << command
52
+ len = t.readpartial(4).unpack("N")[0]
53
+ reply = t.readpartial(len)
54
+ logd ("Received media shutdown Reply #{reply}")
55
+ t.close
56
+ end
57
+
58
+
59
+ end
60
+ end
@@ -0,0 +1,285 @@
1
+ require 'media/sipper_media_client'
2
+
3
+ module Media
4
+ class SipperOfferAnswer
5
+ include SipLogger
6
+ attr_accessor :peerSdp, :ourSdp,
7
+ :playspec, :recspec, :dtmfspec
8
+
9
+ =begin
10
+ state values
11
+ 0 = None
12
+ 1 = Stable (After Offer and Answer.)
13
+ 2 = PeerOffered
14
+ 3 = OurOffered
15
+ 4 = OfferGenerated
16
+ =end
17
+
18
+ def initialize(session)
19
+ @session = session
20
+ @state = 0
21
+ @client = []
22
+ end
23
+
24
+ def close()
25
+ logd("Media close called.")
26
+ @client.each do |curr|
27
+ logd("Calling close on #{curr}")
28
+ curr.destroy_media if curr
29
+ end
30
+ end
31
+
32
+ def setup_media_spec(playspec, recspec, dtmfspec)
33
+ @playspec = playspec
34
+ @recspec = recspec
35
+ @dtmfspec = dtmfspec
36
+
37
+ @client.each do |currclient|
38
+ if currclient
39
+ currclient.set_dtmf_command(dtmfspec) if dtmfspec
40
+ end
41
+ end
42
+ end
43
+
44
+ def make_new_offer(codecs = nil, status = "sendrecv")
45
+ return if @state == 2 || @state == 3
46
+ codecs = SipperMediaClient::get_supported_codecs unless codecs
47
+
48
+ unless @client[0]
49
+ @client[0] = SipperMediaClient.new(@session) if SipperConfigurator[:SipperMedia]
50
+ @client[0] = SipperDummyMediaClient.new(@session) unless @client[0]
51
+ end
52
+
53
+ if @state == 0
54
+ @ourSdp = SDP::SdpGenerator.make_sdp(nil, @client[0].recv_ip, @client[0].recv_port, codecs, status)
55
+ else
56
+ currversion = @ourSdp.get_owner_version
57
+ @ourSdp = SDP::SdpGenerator.make_sdp(@ourSdp.session_lines, @client[0].recv_ip, @client[0].recv_port, codecs, status)
58
+ @ourSdp.set_owner_version(currversion + 1)
59
+ end
60
+
61
+ @state = 4
62
+ end
63
+
64
+ def _make_our_answer()
65
+ logd("Client making new answer")
66
+ peerMediaLines = @peerSdp.media_lines
67
+ unless @client[0]
68
+ @client[0] = SipperMediaClient.new(@session) if SipperConfigurator[:SipperMedia]
69
+ @client[0] = SipperDummyMediaClient.new(@session) unless @client[0]
70
+ end
71
+
72
+ @ourSdp = SDP::SdpGenerator.make_no_media_sdp(nil, @client[0].recv_ip) unless @ourSdp
73
+ @ourSdp.media_lines = [] unless @ourSdp.media_lines
74
+
75
+ versionchange = false
76
+
77
+ length = 0
78
+ length = peerMediaLines.length if peerMediaLines
79
+
80
+ (0..length - 1).each do |idx|
81
+ unless @client[idx]
82
+ @client[idx] = SipperMediaClient.new(@session) if SipperConfigurator[:SipperMedia]
83
+ @client[idx] = SipperDummyMediaClient.new(@session) unless @client[idx]
84
+ end
85
+
86
+ @client[idx].play_spec = @playspec
87
+ @client[idx].record_file = @recspec
88
+ @client[idx].dtmf_play_spec = @dtmfspec
89
+
90
+ currPeerM = peerMediaLines[idx]
91
+ peerCodecs = SDP::get_codecs_in_media(currPeerM)
92
+ ourCodecs = peerCodecs
93
+
94
+ ourCodecs.delete("G711A") if ourCodecs.include?("G711U")
95
+ ourMediaStatus = SDP::get_answer_status(SDP::get_media_status(currPeerM))
96
+
97
+ ourMedia = SDP::SdpGenerator.make_sdp_media(nil, @client[idx].recv_port, ourCodecs, ourMediaStatus)
98
+ SDP.copy_media_type_transport(currPeerM, ourMedia)
99
+
100
+ if @ourSdp.media_lines[idx]
101
+ unless SDP::is_media_equal(ourMedia, @ourSdp.media_lines[idx])
102
+ @ourSdp.media_lines[idx] = ourMedia
103
+ versionchange = true
104
+ end
105
+ else
106
+ @ourSdp.media_lines[idx] = ourMedia
107
+ versionchange = true
108
+ end
109
+ end
110
+
111
+ if(versionchange)
112
+ @ourSdp.increment_owner_version
113
+ end
114
+ end
115
+
116
+ def refresh_sipper_media()
117
+ return unless SipperConfigurator[:SipperMedia]
118
+
119
+ peerMediaLines = @peerSdp.media_lines
120
+ ourMediaLines = @ourSdp.media_lines
121
+
122
+ length = peerMediaLines.length
123
+ (0..length - 1).each do |idx|
124
+ @client[idx].play_spec = @playspec
125
+ @client[idx].record_file = @recspec
126
+ @client[idx].dtmf_play_spec = @dtmfspec
127
+ @client[idx].set_sdp_media(ourMediaLines[idx], peerMediaLines[idx]) if @client[idx]
128
+ end
129
+ length = 1 if length == 0
130
+ (length..@client.length - 1).each do |idx|
131
+ @client[idx].destroy_media if @client[idx]
132
+ @client[idx] = nil
133
+ end
134
+ end
135
+
136
+ def update_sipper_media()
137
+ return unless SipperConfigurator[:SipperMedia]
138
+
139
+ logd("update_sipper_media PeerSDP:\n#{@peerSdp}\nOurSDP:\n#{ourSdp}\n")
140
+ peerMediaLines = @peerSdp.media_lines
141
+ ourMediaLines = @ourSdp.media_lines
142
+
143
+ length = peerMediaLines.length
144
+ (0..length - 1).each do |idx|
145
+ @client[idx].update_sdp_media(peerMediaLines[idx], ourMediaLines[idx]) if @client[idx]
146
+ end
147
+ length = 1 if length == 0
148
+ (length..@client.length - 1).each do |idx|
149
+ @client[idx].destroy_media if @client[idx]
150
+ @client[idx] = nil
151
+ end
152
+ end
153
+
154
+ def _check_peer_offer(inPeerSdp)
155
+ @state = 2
156
+ if @peerSdp == nil
157
+ @peerSdp = inPeerSdp.clone()
158
+ _make_our_answer()
159
+ elsif (inPeerSdp.get_owner_version() == @peerSdp.get_owner_version())
160
+ return
161
+ else
162
+ @peerSdp = inPeerSdp.clone()
163
+ _make_our_answer()
164
+ end
165
+
166
+ update_sipper_media()
167
+ end
168
+
169
+ def _check_peer_answer(peerSdp)
170
+ currVersion = @ourSdp.get_owner_version
171
+ _check_peer_offer(peerSdp)
172
+ @ourSdp.set_owner_version(currVersion)
173
+ @state = 1
174
+ end
175
+
176
+ def handle_incoming_request(request)
177
+ if request.method == "INVITE"
178
+ @last_recv_invite = request
179
+ end
180
+
181
+ return unless request.sdp
182
+ return unless (request.method == "INVITE" || request.method == "ACK" || request.method == "UPDATE" || request.method == "PRACK")
183
+ return unless (@state != 2)
184
+
185
+ case @state
186
+ when 0
187
+ return if request.method != "INVITE"
188
+ _check_peer_offer(request.sdp)
189
+ when 1
190
+ return if request.method == "ACK"
191
+ _check_peer_offer(request.sdp)
192
+ when 3
193
+ return if request.method == "UPDATE" || request.method == "INVITE"
194
+ _check_peer_answer(request.sdp)
195
+ when 4
196
+ return if request.method == "ACK" && @peerSdp
197
+ return if request.method != "INVITE" && (@peerSdp == nil)
198
+ _check_peer_offer(request.sdp)
199
+ end
200
+ end
201
+
202
+ def handle_incoming_response(response)
203
+ return unless response.sdp
204
+ return unless (response.get_request_method == "INVITE" || response.get_request_method == "PRACK" || response.get_request_method == "UPDATE")
205
+ return unless (@state != 2)
206
+
207
+ return if response.code <= 100
208
+ return if response.code > 300
209
+ if response.code < 200
210
+ return unless response["require".to_sym]
211
+ return unless response.require.to_s.include?("100rel")
212
+ end
213
+
214
+ case @state
215
+ when 0
216
+ return if response.get_request_method != "INVITE"
217
+ _check_peer_offer(response.sdp)
218
+ when 1
219
+ return if response.get_request_method != "INVITE"
220
+ _check_peer_offer(response.sdp)
221
+ when 3
222
+ _check_peer_answer(response.sdp)
223
+ when 4
224
+ return if response.get_request_method != "INVITE"
225
+ _check_peer_offer(response.sdp)
226
+ end
227
+ end
228
+
229
+ def handle_outgoing_request(request)
230
+ return if request.sdp
231
+ return unless (request.method == "INVITE" || request.method == "PRACK" || request.method == "UPDATE" || request.method == "ACK")
232
+
233
+ case @state
234
+ when 0
235
+ return
236
+ when 1
237
+ return
238
+ when 2
239
+ return if request.method == "INVITE" || request.method == "UPDATE"
240
+ request.sdp = @ourSdp.clone()
241
+ @state = 1
242
+ when 3
243
+ return
244
+ when 4
245
+ return if request.method == "ACK"
246
+ request.sdp = @ourSdp.clone()
247
+ @state = 3
248
+ end
249
+ end
250
+
251
+ def handle_outgoing_response(response)
252
+
253
+ return if response.sdp
254
+ return unless (response.get_request_method == "INVITE" || response.get_request_method == "PRACK" || response.get_request_method == "UPDATE")
255
+
256
+ return if response.code <= 100
257
+ return if response.code > 300
258
+ if response.code < 200
259
+ return unless response["require".to_sym]
260
+ return unless response.require.to_s.include?("100rel")
261
+ end
262
+
263
+ logd("Outgoing response checking state #{@state}")
264
+ case @state
265
+ when 0
266
+ return
267
+ when 1
268
+ return if response.get_request_method != "INVITE"
269
+ return if @last_recv_invite.sdp
270
+ response.sdp = @ourSdp.clone()
271
+ @state = 3
272
+ return
273
+ when 2
274
+ response.sdp = @ourSdp.clone()
275
+ @state = 1
276
+ when 3
277
+ return
278
+ when 4
279
+ return if response.get_request_method != "INVITE"
280
+ response.sdp = @ourSdp.clone()
281
+ @state = 3
282
+ end
283
+ end
284
+ end
285
+ end