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.
- data/sipper/README.rb +26 -0
- data/sipper/b2bua_controller.rb +163 -0
- data/sipper/b2bua_session_mixin.rb +24 -0
- data/sipper/base_controller.rb +425 -0
- data/sipper/bin/common.rb +42 -0
- data/sipper/bin/generate.rb +70 -0
- data/sipper/bin/project.rb +44 -0
- data/sipper/bin/run.rb +85 -0
- data/sipper/bin/run_smoke.rb +8 -0
- data/sipper/config/log4r.xml +71 -0
- data/sipper/controller_class_loader.rb +29 -0
- data/sipper/controller_selector.rb +119 -0
- data/sipper/controllers/invite_controller.rb +30 -0
- data/sipper/controllers/order.yaml +3 -0
- data/sipper/custom_message.rb +4 -0
- data/sipper/detached_session.rb +11 -0
- data/sipper/docs/manual.txt +1621 -0
- data/sipper/generators/README +12 -0
- data/sipper/generators/gen_controller.rb +228 -0
- data/sipper/generators/gen_project.rb +45 -0
- data/sipper/generators/gen_test.rb +72 -0
- data/sipper/generators/project_template_dir/Rakefile +56 -0
- data/sipper/generators/project_template_dir/config/sipper.cfg +31 -0
- data/sipper/generators/project_template_dir/controllers/README.txt +2 -0
- data/sipper/generators/project_template_dir/dot_sipper.proj +2 -0
- data/sipper/generators/project_template_dir/logs/README.txt +2 -0
- data/sipper/generators/project_template_dir/tests/README.txt +2 -0
- data/sipper/lib/smc/statemap.rb +194 -0
- data/sipper/logs/dialog_info_store +0 -0
- data/sipper/logs/r.cmd +6 -0
- data/sipper/logs/r.sh +6 -0
- data/sipper/media/sipper_media_client.rb +268 -0
- data/sipper/media/sipper_media_event.rb +43 -0
- data/sipper/media/sipper_media_manager.rb +145 -0
- data/sipper/media/sipper_media_proxy.rb +60 -0
- data/sipper/media/sipper_offer_answer.rb +285 -0
- data/sipper/message.rb +512 -0
- data/sipper/modified_pattern_formatter.rb +119 -0
- data/sipper/proxy_controller.rb +143 -0
- data/sipper/registration.rb +52 -0
- data/sipper/request.rb +109 -0
- data/sipper/response.rb +123 -0
- data/sipper/ruby_ext/module.rb +27 -0
- data/sipper/ruby_ext/mutable_class.rb +17 -0
- data/sipper/ruby_ext/object.rb +38 -0
- data/sipper/ruby_ext/pqueue.rb +190 -0
- data/sipper/ruby_ext/snapshot.rb +201 -0
- data/sipper/ruby_ext/string.rb +18 -0
- data/sipper/ruby_ext/time.rb +9 -0
- data/sipper/run/run_sipper1.rb +28 -0
- data/sipper/run/run_sipper2.rb +56 -0
- data/sipper/sdp/sdp.rb +257 -0
- data/sipper/sdp/sdp_generator.rb +131 -0
- data/sipper/sdp/sdp_parser.rb +136 -0
- data/sipper/session.rb +1952 -0
- data/sipper/session_manager.rb +170 -0
- data/sipper/session_recorder.rb +190 -0
- data/sipper/session_state/DialogState.sm +54 -0
- data/sipper/session_state/DialogState_sm.rb +337 -0
- data/sipper/session_state/dialog_routes.rb +141 -0
- data/sipper/sip_headers/header.rb +632 -0
- data/sipper/sip_headers/sipuri.rb +352 -0
- data/sipper/sip_logger.rb +65 -0
- data/sipper/sip_message_router.rb +231 -0
- data/sipper/sip_test_driver_controller.rb +10 -0
- data/sipper/sipper.rb +329 -0
- data/sipper/sipper_assertions.rb +21 -0
- data/sipper/sipper_configurator.rb +376 -0
- data/sipper/sipper_http/sipper_http_request_dispatcher.rb +71 -0
- data/sipper/sipper_http/sipper_http_response.rb +25 -0
- data/sipper/stray_message_manager.rb +40 -0
- data/sipper/test_completion_signaling_helper.rb +77 -0
- data/sipper/transaction/Ict.sm +59 -0
- data/sipper/transaction/Ict_sm.rb +430 -0
- data/sipper/transaction/Ist.sm +74 -0
- data/sipper/transaction/Ist_sm.rb +460 -0
- data/sipper/transaction/Nict.sm +51 -0
- data/sipper/transaction/Nict_sm.rb +325 -0
- data/sipper/transaction/Nist.sm +59 -0
- data/sipper/transaction/Nist_sm.rb +356 -0
- data/sipper/transaction/invite_client_transaction.rb +274 -0
- data/sipper/transaction/invite_server_transaction.rb +319 -0
- data/sipper/transaction/non_invite_client_transaction.rb +230 -0
- data/sipper/transaction/non_invite_server_transaction.rb +263 -0
- data/sipper/transaction/state_machine_wrapper.rb +58 -0
- data/sipper/transaction/transaction.rb +212 -0
- data/sipper/transport/base_transport.rb +84 -0
- data/sipper/transport/rel_unrel.rb +19 -0
- data/sipper/transport/transport_and_route_resolver.rb +67 -0
- data/sipper/transport/udp_transport.rb +156 -0
- data/sipper/transport_manager.rb +33 -0
- data/sipper/udp_session.rb +17 -0
- data/sipper/util/command_element.rb +62 -0
- data/sipper/util/compact_converter.rb +50 -0
- data/sipper/util/counter.rb +26 -0
- data/sipper/util/digest/digest_authorizer.rb +204 -0
- data/sipper/util/expectation_parser.rb +164 -0
- data/sipper/util/locator.rb +31 -0
- data/sipper/util/message_fill.rb +58 -0
- data/sipper/util/persistence/ps_sipper_map.rb +63 -0
- data/sipper/util/persistence/sipper_map.rb +41 -0
- data/sipper/util/sipper_util.rb +305 -0
- data/sipper/util/timer/sip_timer_helper.rb +26 -0
- data/sipper/util/timer/timer_manager.rb +80 -0
- data/sipper/util/timer/timer_task.rb +56 -0
- data/sipper/util/validations.rb +44 -0
- data/sipper/version.rb +10 -0
- data/sipper_test/_test_media_uas.rb +79 -0
- data/sipper_test/base_test_case.rb +31 -0
- data/sipper_test/c_134.txt +7 -0
- data/sipper_test/driven_sip_test_case.rb +96 -0
- data/sipper_test/gold.txt +10 -0
- data/sipper_test/gold_res.txt +8 -0
- data/sipper_test/gold_sub.txt +9 -0
- data/sipper_test/hello_sipper.au +0 -0
- data/sipper_test/in_sipper.au +0 -0
- data/sipper_test/nonrr_proxy.rb +17 -0
- data/sipper_test/order_tests.yaml +4 -0
- data/sipper_test/rake_res.txt +399 -0
- data/sipper_test/rr_proxy.rb +17 -0
- data/sipper_test/run_test.cmd +94 -0
- data/sipper_test/sip_test_case.rb +104 -0
- data/sipper_test/test2xx_retransmission.rb +80 -0
- data/sipper_test/test2xx_retransmission_with_limit.rb +81 -0
- data/sipper_test/test2xx_retransmission_with_nist.rb +91 -0
- data/sipper_test/test2xx_retransmission_with_txns.rb +94 -0
- data/sipper_test/test_address_header.rb +66 -0
- data/sipper_test/test_b2bua1.rb +130 -0
- data/sipper_test/test_b2bua2.rb +120 -0
- data/sipper_test/test_b2bua3.rb +160 -0
- data/sipper_test/test_b2bua4.rb +130 -0
- data/sipper_test/test_base_controller.rb +110 -0
- data/sipper_test/test_base_transport.rb +37 -0
- data/sipper_test/test_cancel.rb +21 -0
- data/sipper_test/test_cancel_after2xx.rb +81 -0
- data/sipper_test/test_cancel_retransmission.rb +105 -0
- data/sipper_test/test_cancel_with481.rb +83 -0
- data/sipper_test/test_cancel_with487.rb +70 -0
- data/sipper_test/test_cancel_with_ist_without_nist.rb +99 -0
- data/sipper_test/test_cancel_with_nist.rb +84 -0
- data/sipper_test/test_cancel_without487.rb +77 -0
- data/sipper_test/test_command_element.rb +38 -0
- data/sipper_test/test_compact_converter.rb +33 -0
- data/sipper_test/test_controller_class_loader.rb +37 -0
- data/sipper_test/test_controller_selector.rb +53 -0
- data/sipper_test/test_controller_using_compact_headers.rb +74 -0
- data/sipper_test/test_controller_using_header_order.rb +85 -0
- data/sipper_test/test_controller_using_ict.rb +64 -0
- data/sipper_test/test_controller_using_ict_with_non_success.rb +72 -0
- data/sipper_test/test_controller_using_ict_with_tcbh.rb +24 -0
- data/sipper_test/test_controller_using_ict_with_tcbh_no_action.rb +24 -0
- data/sipper_test/test_controller_using_ist.rb +70 -0
- data/sipper_test/test_controller_using_ist_with_tcbh.rb +24 -0
- data/sipper_test/test_controller_using_nict.rb +115 -0
- data/sipper_test/test_controller_using_nict_with_tcbh.rb +24 -0
- data/sipper_test/test_controller_using_nist.rb +63 -0
- data/sipper_test/test_controller_using_pre_existing_rs0.rb +73 -0
- data/sipper_test/test_controller_using_pre_existing_rs1.rb +75 -0
- data/sipper_test/test_controller_using_pre_existing_rs2.rb +71 -0
- data/sipper_test/test_controller_using_route_set.rb +86 -0
- data/sipper_test/test_controller_with_sdp.rb +80 -0
- data/sipper_test/test_controllers/cancel/order.yaml +2 -0
- data/sipper_test/test_controllers/cancel/uac_cancel_controller.rb +35 -0
- data/sipper_test/test_controllers/cancel/uas_cancel_controller.rb +25 -0
- data/sipper_test/test_controllers/class_loading/ordered/first_ordered_controller.rb +5 -0
- data/sipper_test/test_controllers/class_loading/ordered/order.yaml +3 -0
- data/sipper_test/test_controllers/class_loading/ordered/recond_ordered_controller.rb +6 -0
- data/sipper_test/test_controllers/class_loading/ordered/second_ordered_controller.rb +6 -0
- data/sipper_test/test_controllers/class_loading/unordered/first_unordered_controller.rb +7 -0
- data/sipper_test/test_controllers/class_loading/unordered/second_unordered_controller.rb +6 -0
- data/sipper_test/test_controllers/ctrl_trhandler/lib/transport_filters/my_transport_handler.rb +22 -0
- data/sipper_test/test_controllers/ctrl_trhandler/uac_tr_handler_controller.rb +27 -0
- data/sipper_test/test_controllers/ctrl_trhandler/uas_tr_handler_controller.rb +21 -0
- data/sipper_test/test_controllers/ete/order.yaml +1 -0
- data/sipper_test/test_controllers/ete/uac_controller.rb +39 -0
- data/sipper_test/test_controllers/ete/uas_controller.rb +34 -0
- data/sipper_test/test_controllers/extensions/extension_uac_controller.rb +24 -0
- data/sipper_test/test_controllers/extensions/extension_uas_controller.rb +35 -0
- data/sipper_test/test_controllers/extensions/lib/sipper_extensions/my_from_extension.rb +16 -0
- data/sipper_test/test_controllers/ict_tcbh/lib/transaction_handlers/app_ict_handler.rb +23 -0
- data/sipper_test/test_controllers/ict_tcbh/uac_ict_tcbh_controller.rb +27 -0
- data/sipper_test/test_controllers/ict_tcbh/uac_ict_tcbh_no_action_controller.rb +28 -0
- data/sipper_test/test_controllers/ict_tcbh/uas_ict_tcbh_controller.rb +29 -0
- data/sipper_test/test_controllers/ict_tcbh/uas_ict_tcbh_no_action_controller.rb +31 -0
- data/sipper_test/test_controllers/ist_tcbh/lib/app_ist_handler.rb +13 -0
- data/sipper_test/test_controllers/ist_tcbh/uac_ist_tcbh_controller.rb +22 -0
- data/sipper_test/test_controllers/ist_tcbh/uas_ist_tcbh_controller.rb +31 -0
- data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/in_order.yaml +2 -0
- data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/my_transport_handler1.rb +21 -0
- data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/my_transport_handler2.rb +21 -0
- data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/out_order.yaml +2 -0
- data/sipper_test/test_controllers/multi_trhandlers/uac_multi_tr_handler_controller.rb +27 -0
- data/sipper_test/test_controllers/multi_trhandlers/uas_multi_tr_handler_controller.rb +29 -0
- data/sipper_test/test_controllers/multiple/lib/blank_test.rb +2 -0
- data/sipper_test/test_controllers/multiple/uac_info_controller.rb +21 -0
- data/sipper_test/test_controllers/multiple/uac_msg_controller.rb +20 -0
- data/sipper_test/test_controllers/multiple/uas_info_controller.rb +15 -0
- data/sipper_test/test_controllers/multiple/uas_msg_controller.rb +14 -0
- data/sipper_test/test_controllers/nict_tcbh/lib/transaction_handlers/app_nict_handler.rb +13 -0
- data/sipper_test/test_controllers/nict_tcbh/uac_nict_tcbh_controller.rb +26 -0
- data/sipper_test/test_controllers/nict_tcbh/uas_nict_tcbh_controller.rb +20 -0
- data/sipper_test/test_controllers/state_machine_based/lib/CreditControl.sm +43 -0
- data/sipper_test/test_controllers/state_machine_based/lib/CreditControl_sm.rb +194 -0
- data/sipper_test/test_controllers/state_machine_based/order.yaml +1 -0
- data/sipper_test/test_controllers/state_machine_based/uac_message_controller.rb +34 -0
- data/sipper_test/test_controllers/state_machine_based/uas_message_controller.rb +44 -0
- data/sipper_test/test_controllers/stray_message/lib/sipper_extensions/my_stray_handler.rb +9 -0
- data/sipper_test/test_controllers/stray_message/stray_uac_controller.rb +24 -0
- data/sipper_test/test_controllers/stray_message/stray_uas_controller.rb +31 -0
- data/sipper_test/test_controllers/string/order.yaml +1 -0
- data/sipper_test/test_controllers/string/uac_controller.rb +29 -0
- data/sipper_test/test_controllers/string/uas_controller.rb +22 -0
- data/sipper_test/test_controllers/test_controller.rb +24 -0
- data/sipper_test/test_detached_session1.rb +78 -0
- data/sipper_test/test_dialog_routes.rb +139 -0
- data/sipper_test/test_digest_challenge1.rb +89 -0
- data/sipper_test/test_digest_challenge2.rb +90 -0
- data/sipper_test/test_dynamic_parse.rb +249 -0
- data/sipper_test/test_empty_sdp.rb +89 -0
- data/sipper_test/test_ete.rb +37 -0
- data/sipper_test/test_expectation_parser.rb +76 -0
- data/sipper_test/test_extensions.rb +28 -0
- data/sipper_test/test_freeze.rb +81 -0
- data/sipper_test/test_generated.rb +90 -0
- data/sipper_test/test_header_parameters.rb +75 -0
- data/sipper_test/test_header_parse.rb +141 -0
- data/sipper_test/test_http_client1.rb +84 -0
- data/sipper_test/test_http_client2.rb +90 -0
- data/sipper_test/test_ict_with_timeout.rb +62 -0
- data/sipper_test/test_in_dialog_request.rb +61 -0
- data/sipper_test/test_inline_controller.rb +67 -0
- data/sipper_test/test_invite_client_transaction.rb +272 -0
- data/sipper_test/test_invite_replace.rb +147 -0
- data/sipper_test/test_invite_retransmission.rb +90 -0
- data/sipper_test/test_invite_server_transaction.rb +208 -0
- data/sipper_test/test_lower_cseq.rb +79 -0
- data/sipper_test/test_media.rb +52 -0
- data/sipper_test/test_message.rb +392 -0
- data/sipper_test/test_method_specific_response_handling.rb +81 -0
- data/sipper_test/test_multi_homed1.rb +127 -0
- data/sipper_test/test_multi_homed2.rb +109 -0
- data/sipper_test/test_multi_homed_duplicate.rb +87 -0
- data/sipper_test/test_multi_homed_with_detached.rb +88 -0
- data/sipper_test/test_multiple.rb +49 -0
- data/sipper_test/test_multiple_contacts.rb +89 -0
- data/sipper_test/test_non2xx_retransmission_with_ist.rb +87 -0
- data/sipper_test/test_non_invite_client_transaction.rb +210 -0
- data/sipper_test/test_non_invite_retransmission.rb +91 -0
- data/sipper_test/test_non_invite_server_transaction.rb +202 -0
- data/sipper_test/test_offer_answer_prack.rb +103 -0
- data/sipper_test/test_pickup.rb +258 -0
- data/sipper_test/test_prack.rb +105 -0
- data/sipper_test/test_prack_store_and_dispatch.rb +101 -0
- data/sipper_test/test_prack_timer.rb +105 -0
- data/sipper_test/test_ps_sipper_map.rb +56 -0
- data/sipper_test/test_re_invite_uas_ongoing_ict.rb +81 -0
- data/sipper_test/test_re_invite_uas_ongoing_ist.rb +84 -0
- data/sipper_test/test_re_invite_with_ongoing_ict.rb +101 -0
- data/sipper_test/test_re_invite_with_ongoing_ist.rb +89 -0
- data/sipper_test/test_recorder_swap.rb +157 -0
- data/sipper_test/test_refer.rb +121 -0
- data/sipper_test/test_registeration_clearing.rb +97 -0
- data/sipper_test/test_registrar.rb +109 -0
- data/sipper_test/test_registration_controller.rb +73 -0
- data/sipper_test/test_registration_timeout.rb +90 -0
- data/sipper_test/test_remote_controller.rb +39 -0
- data/sipper_test/test_remote_target_update_on2xx.rb +140 -0
- data/sipper_test/test_request.rb +106 -0
- data/sipper_test/test_response.rb +40 -0
- data/sipper_test/test_response_without_to_tag.rb +92 -0
- data/sipper_test/test_rport.rb +88 -0
- data/sipper_test/test_sdp.rb +91 -0
- data/sipper_test/test_sdp_parser.rb +145 -0
- data/sipper_test/test_session.rb +276 -0
- data/sipper_test/test_session_callback_handler.rb +68 -0
- data/sipper_test/test_session_lifetime.rb +66 -0
- data/sipper_test/test_session_manager.rb +141 -0
- data/sipper_test/test_session_recorder.rb +145 -0
- data/sipper_test/test_session_state_user_defined.rb +84 -0
- data/sipper_test/test_session_states.rb +91 -0
- data/sipper_test/test_simple_dialog_state.rb +86 -0
- data/sipper_test/test_simple_re_invite.rb +86 -0
- data/sipper_test/test_sip_uri.rb +234 -0
- data/sipper_test/test_sipper_util.rb +45 -0
- data/sipper_test/test_smc_controller.rb +17 -0
- data/sipper_test/test_smoke.rb +80 -0
- data/sipper_test/test_stray.rb +28 -0
- data/sipper_test/test_stray_inline.rb +89 -0
- data/sipper_test/test_stray_res_acked.rb +103 -0
- data/sipper_test/test_stray_respond.rb +104 -0
- data/sipper_test/test_stray_retry.rb +92 -0
- data/sipper_test/test_stray_retry_failure.rb +93 -0
- data/sipper_test/test_stray_retry_initial.rb +100 -0
- data/sipper_test/test_strict_router_with_angled.rb +84 -0
- data/sipper_test/test_string_record.rb +31 -0
- data/sipper_test/test_subscribe_notify.rb +141 -0
- data/sipper_test/test_subscribe_notify_client_timeout.rb +158 -0
- data/sipper_test/test_subscribe_notify_dialog.rb +146 -0
- data/sipper_test/test_subscribe_notify_expires.rb +155 -0
- data/sipper_test/test_subscribe_notify_multiple_subscription.rb +157 -0
- data/sipper_test/test_subscribe_notify_server_timeout.rb +144 -0
- data/sipper_test/test_subsequent_unsent.rb +88 -0
- data/sipper_test/test_target_refresh_proxy_detached.rb +128 -0
- data/sipper_test/test_target_refresh_proxy_udp.rb +130 -0
- data/sipper_test/test_target_refresh_rr_proxy_udp.rb +133 -0
- data/sipper_test/test_target_refresh_with_new_port.rb +158 -0
- data/sipper_test/test_target_refresh_with_proxy1.rb +113 -0
- data/sipper_test/test_target_refresh_with_rr_update_proxy.rb +145 -0
- data/sipper_test/test_target_refresh_with_update_proxy.rb +144 -0
- data/sipper_test/test_target_refresh_with_update_proxy2.rb +139 -0
- data/sipper_test/test_timer_manager.rb +71 -0
- data/sipper_test/test_timer_task.rb +60 -0
- data/sipper_test/test_transport_handler.rb +19 -0
- data/sipper_test/test_transport_multi_handler.rb +18 -0
- data/sipper_test/test_udp_transport.rb +119 -0
- data/sipper_test/test_unparsed.rb +70 -0
- data/sipper_test/test_validations.rb +69 -0
- data/sipper_test/test_with_rr_proxy.rb +111 -0
- data/sipper_test/testmediacontroller.rb +71 -0
- data/sipper_test/tracing.rb +23 -0
- data/sipper_test/transaction_test_helper.rb +176 -0
- data/sipper_test/transport_filters.rb +26 -0
- data/sipper_test/ts_sipper.rb +91 -0
- data/sipper_test/ts_smoke.rb +3 -0
- data/sipper_test/tt.cmd +20 -0
- metadata +455 -0
|
@@ -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
|
|
Binary file
|
data/sipper/logs/r.cmd
ADDED
data/sipper/logs/r.sh
ADDED
|
@@ -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
|