From d96205b2457f4aa0565fc2653924ef076959f518 Mon Sep 17 00:00:00 2001 From: bossiel Date: Wed, 2 May 2012 10:42:55 +0000 Subject: [PATCH] - ICE (Interactive Connectivity Establishment): Full implementation of RFC 5245 for NAT Traversal - 1080p (Full HD): all platforms supports full HD video negotiation. Off course it depends on your CPU and network bandwidth. The preferred video size could be changed from the QoS/QoS screen. - Adaptive video jitter buffer: A video jitter buffer with advanced features like error correction, packet loss retransmission, delay recovery... - RTP/AVPF profile as per RFC 4585 - RTCP: Full support for RTCP (3550) and many extensions such as: PLI (RFC 4585), SLI (RFC 4585), RPSI (RFC 4585), FIR (RFC 5104), NACK (4585), TMMBN (RFC 5104)... - rtcp-mux as per 5761 - Negotiation of Generic Image Attributes in the SDP as per RFC 6236 - Source-Specific Media Attributes in SDP as per draft-lennox-mmusic-sdp-source-attributes-01 - Explicit Call Transfer as per 3GPP TS 24.629 --- .../2.0/doubango/android-projects/root.mk | 6 +- .../bindings/_common/MediaSessionMgr.cxx | 27 +- .../bindings/_common/MediaSessionMgr.h | 8 +- .../bindings/_common/ProxyProducer.cxx | 7 +- .../doubango/bindings/_common/SipSession.cxx | 20 + .../doubango/bindings/_common/SipSession.h | 1 + .../2.0/doubango/bindings/_common/SipStack.i | 91 +- .../doubango/bindings/csharp/ActionConfig.cs | 12 +- .../bindings/csharp/AudioResampler.cs | 12 +- .../doubango/bindings/csharp/CallSession.cs | 19 +- .../bindings/csharp/DDebugCallback.cs | 20 +- .../doubango/bindings/csharp/DialogEvent.cs | 14 +- .../2.0/doubango/bindings/csharp/InfoEvent.cs | 14 +- .../doubango/bindings/csharp/InfoSession.cs | 14 +- .../doubango/bindings/csharp/InviteEvent.cs | 14 +- .../doubango/bindings/csharp/InviteSession.cs | 14 +- .../doubango/bindings/csharp/MediaContent.cs | 12 +- .../bindings/csharp/MediaContentCPIM.cs | 14 +- .../bindings/csharp/MediaSessionMgr.cs | 32 +- .../bindings/csharp/MessagingEvent.cs | 14 +- .../bindings/csharp/MessagingSession.cs | 14 +- .../doubango/bindings/csharp/MsrpCallback.cs | 14 +- .../2.0/doubango/bindings/csharp/MsrpEvent.cs | 12 +- .../doubango/bindings/csharp/MsrpMessage.cs | 12 +- .../doubango/bindings/csharp/MsrpSession.cs | 14 +- .../doubango/bindings/csharp/OptionsEvent.cs | 14 +- .../bindings/csharp/OptionsSession.cs | 14 +- .../bindings/csharp/ProxyAudioConsumer.cs | 14 +- .../csharp/ProxyAudioConsumerCallback.cs | 20 +- .../bindings/csharp/ProxyAudioProducer.cs | 14 +- .../csharp/ProxyAudioProducerCallback.cs | 20 +- .../doubango/bindings/csharp/ProxyPlugin.cs | 12 +- .../bindings/csharp/ProxyPluginMgr.cs | 12 +- .../bindings/csharp/ProxyPluginMgrCallback.cs | 16 +- .../bindings/csharp/ProxyVideoConsumer.cs | 14 +- .../csharp/ProxyVideoConsumerCallback.cs | 24 +- .../bindings/csharp/ProxyVideoFrame.cs | 12 +- .../bindings/csharp/ProxyVideoProducer.cs | 14 +- .../csharp/ProxyVideoProducerCallback.cs | 20 +- .../bindings/csharp/PublicationEvent.cs | 14 +- .../bindings/csharp/PublicationSession.cs | 14 +- .../2.0/doubango/bindings/csharp/RPMessage.cs | 12 +- .../bindings/csharp/RegistrationEvent.cs | 14 +- .../bindings/csharp/RegistrationSession.cs | 14 +- .../2.0/doubango/bindings/csharp/SMSData.cs | 12 +- .../doubango/bindings/csharp/SMSEncoder.cs | 12 +- .../doubango/bindings/csharp/SafeObject.cs | 12 +- .../doubango/bindings/csharp/SdpMessage.cs | 12 +- .../doubango/bindings/csharp/SipCallback.cs | 30 +- .../2.0/doubango/bindings/csharp/SipEvent.cs | 12 +- .../doubango/bindings/csharp/SipMessage.cs | 12 +- .../doubango/bindings/csharp/SipSession.cs | 12 +- .../2.0/doubango/bindings/csharp/SipStack.cs | 14 +- .../2.0/doubango/bindings/csharp/SipUri.cs | 12 +- .../doubango/bindings/csharp/StackEvent.cs | 14 +- .../bindings/csharp/SubscriptionEvent.cs | 14 +- .../bindings/csharp/SubscriptionSession.cs | 14 +- .../doubango/bindings/csharp/XcapCallback.cs | 14 +- .../2.0/doubango/bindings/csharp/XcapEvent.cs | 12 +- .../doubango/bindings/csharp/XcapMessage.cs | 12 +- .../doubango/bindings/csharp/XcapSelector.cs | 12 +- .../2.0/doubango/bindings/csharp/XcapStack.cs | 12 +- .../bindings/csharp/tdav_codec_id_t.cs | 11 +- .../bindings/csharp/thttp_event_type_t.cs | 2 +- .../2.0/doubango/bindings/csharp/tinyWRAP.cs | 2 +- .../bindings/csharp/tinyWRAPPINVOKE.cs | 117 +- .../bindings/csharp/tinyWRAP_wrap.cxx | 503 +- .../doubango/bindings/csharp/tinyWRAP_wrap.h | 2 +- .../csharp/tmedia_bandwidth_level_t.cs | 2 +- .../bindings/csharp/tmedia_chroma_t.cs | 2 +- .../csharp/tmedia_pref_video_size_t.cs | 26 + .../bindings/csharp/tmedia_profile_t.cs | 16 + .../bindings/csharp/tmedia_qos_strength_t.cs | 2 +- .../bindings/csharp/tmedia_qos_stype_t.cs | 2 +- .../bindings/csharp/tmedia_srtp_mode_t.cs | 2 +- .../bindings/csharp/tmsrp_event_type_t.cs | 2 +- .../bindings/csharp/tmsrp_request_type_t.cs | 2 +- .../bindings/csharp/tsip_event_type_t.cs | 2 +- .../bindings/csharp/tsip_info_event_type_t.cs | 2 +- .../csharp/tsip_invite_event_type_t.cs | 2 +- .../csharp/tsip_message_event_type_t.cs | 2 +- .../csharp/tsip_options_event_type_t.cs | 2 +- .../csharp/tsip_publish_event_type_t.cs | 2 +- .../csharp/tsip_register_event_type_t.cs | 2 +- .../bindings/csharp/tsip_request_type_t.cs | 2 +- .../csharp/tsip_subscribe_event_type_t.cs | 2 +- .../bindings/csharp/twrap_media_type_t.cs | 2 +- .../csharp/twrap_proxy_plugin_type_t.cs | 2 +- .../bindings/csharp/twrap_rpmessage_type_t.cs | 2 +- .../bindings/csharp/twrap_sms_type_t.cs | 2 +- .../doubango/bindings/java/ActionConfig.java | 16 +- .../bindings/java/AudioResampler.java | 16 +- .../doubango/bindings/java/CallSession.java | 22 +- .../bindings/java/DDebugCallback.java | 16 +- .../doubango/bindings/java/DialogEvent.java | 18 +- .../2.0/doubango/bindings/java/InfoEvent.java | 18 +- .../doubango/bindings/java/InfoSession.java | 18 +- .../doubango/bindings/java/InviteEvent.java | 18 +- .../doubango/bindings/java/InviteSession.java | 18 +- .../doubango/bindings/java/MediaContent.java | 16 +- .../bindings/java/MediaContentCPIM.java | 18 +- .../bindings/java/MediaSessionMgr.java | 32 +- .../bindings/java/MessagingEvent.java | 18 +- .../bindings/java/MessagingSession.java | 18 +- .../doubango/bindings/java/MsrpCallback.java | 16 +- .../2.0/doubango/bindings/java/MsrpEvent.java | 16 +- .../doubango/bindings/java/MsrpMessage.java | 16 +- .../doubango/bindings/java/MsrpSession.java | 18 +- .../doubango/bindings/java/OptionsEvent.java | 18 +- .../bindings/java/OptionsSession.java | 18 +- .../bindings/java/ProxyAudioConsumer.java | 18 +- .../java/ProxyAudioConsumerCallback.java | 16 +- .../bindings/java/ProxyAudioProducer.java | 18 +- .../java/ProxyAudioProducerCallback.java | 16 +- .../doubango/bindings/java/ProxyPlugin.java | 16 +- .../bindings/java/ProxyPluginMgr.java | 16 +- .../bindings/java/ProxyPluginMgrCallback.java | 16 +- .../bindings/java/ProxyVideoConsumer.java | 18 +- .../java/ProxyVideoConsumerCallback.java | 16 +- .../bindings/java/ProxyVideoFrame.java | 16 +- .../bindings/java/ProxyVideoProducer.java | 18 +- .../java/ProxyVideoProducerCallback.java | 16 +- .../bindings/java/PublicationEvent.java | 18 +- .../bindings/java/PublicationSession.java | 18 +- .../2.0/doubango/bindings/java/RPMessage.java | 16 +- .../bindings/java/RegistrationEvent.java | 18 +- .../bindings/java/RegistrationSession.java | 18 +- .../2.0/doubango/bindings/java/SMSData.java | 16 +- .../doubango/bindings/java/SMSEncoder.java | 16 +- .../doubango/bindings/java/SafeObject.java | 16 +- .../doubango/bindings/java/SdpMessage.java | 16 +- .../doubango/bindings/java/SipCallback.java | 16 +- .../2.0/doubango/bindings/java/SipEvent.java | 16 +- .../doubango/bindings/java/SipMessage.java | 16 +- .../doubango/bindings/java/SipSession.java | 16 +- .../2.0/doubango/bindings/java/SipStack.java | 18 +- .../2.0/doubango/bindings/java/SipUri.java | 16 +- .../doubango/bindings/java/StackEvent.java | 18 +- .../bindings/java/SubscriptionEvent.java | 18 +- .../bindings/java/SubscriptionSession.java | 18 +- .../doubango/bindings/java/XcapCallback.java | 16 +- .../2.0/doubango/bindings/java/XcapEvent.java | 16 +- .../doubango/bindings/java/XcapMessage.java | 16 +- .../doubango/bindings/java/XcapSelector.java | 16 +- .../2.0/doubango/bindings/java/XcapStack.java | 16 +- .../bindings/java/android/ActionConfig.java | 16 +- .../bindings/java/android/AudioResampler.java | 16 +- .../bindings/java/android/CallSession.java | 22 +- .../bindings/java/android/DDebugCallback.java | 16 +- .../bindings/java/android/DialogEvent.java | 18 +- .../bindings/java/android/InfoEvent.java | 18 +- .../bindings/java/android/InfoSession.java | 18 +- .../bindings/java/android/InviteEvent.java | 18 +- .../bindings/java/android/InviteSession.java | 18 +- .../bindings/java/android/MediaContent.java | 16 +- .../java/android/MediaContentCPIM.java | 18 +- .../java/android/MediaSessionMgr.java | 32 +- .../bindings/java/android/MessagingEvent.java | 18 +- .../java/android/MessagingSession.java | 18 +- .../bindings/java/android/MsrpCallback.java | 16 +- .../bindings/java/android/MsrpEvent.java | 16 +- .../bindings/java/android/MsrpMessage.java | 16 +- .../bindings/java/android/MsrpSession.java | 18 +- .../bindings/java/android/OptionsEvent.java | 18 +- .../bindings/java/android/OptionsSession.java | 18 +- .../java/android/ProxyAudioConsumer.java | 18 +- .../android/ProxyAudioConsumerCallback.java | 16 +- .../java/android/ProxyAudioProducer.java | 18 +- .../android/ProxyAudioProducerCallback.java | 16 +- .../bindings/java/android/ProxyPlugin.java | 16 +- .../bindings/java/android/ProxyPluginMgr.java | 16 +- .../java/android/ProxyPluginMgrCallback.java | 16 +- .../java/android/ProxyVideoConsumer.java | 18 +- .../android/ProxyVideoConsumerCallback.java | 16 +- .../java/android/ProxyVideoFrame.java | 16 +- .../java/android/ProxyVideoProducer.java | 18 +- .../android/ProxyVideoProducerCallback.java | 16 +- .../java/android/PublicationEvent.java | 18 +- .../java/android/PublicationSession.java | 18 +- .../bindings/java/android/RPMessage.java | 16 +- .../java/android/RegistrationEvent.java | 18 +- .../java/android/RegistrationSession.java | 18 +- .../bindings/java/android/SMSData.java | 16 +- .../bindings/java/android/SMSEncoder.java | 16 +- .../bindings/java/android/SafeObject.java | 16 +- .../bindings/java/android/SdpMessage.java | 16 +- .../bindings/java/android/SipCallback.java | 16 +- .../bindings/java/android/SipEvent.java | 16 +- .../bindings/java/android/SipMessage.java | 16 +- .../bindings/java/android/SipSession.java | 16 +- .../bindings/java/android/SipStack.java | 18 +- .../bindings/java/android/SipUri.java | 16 +- .../bindings/java/android/StackEvent.java | 18 +- .../java/android/SubscriptionEvent.java | 18 +- .../java/android/SubscriptionSession.java | 18 +- .../bindings/java/android/XcapCallback.java | 16 +- .../bindings/java/android/XcapEvent.java | 16 +- .../bindings/java/android/XcapMessage.java | 16 +- .../bindings/java/android/XcapSelector.java | 16 +- .../bindings/java/android/XcapStack.java | 16 +- .../bindings/java/android/buildAll.sh | 2 +- .../bindings/java/android/commercial.sh | 4 +- .../bindings/java/android/droid-makefile | 2 +- .../2.0/doubango/bindings/java/android/gpl.sh | 4 +- .../doubango/bindings/java/android/lgpl.sh | 4 +- .../doubango/bindings/java/android/minimal.sh | 4 +- .../java/android/tdav_codec_id_t.java | 11 +- .../java/android/thttp_event_type_t.java | 2 +- .../bindings/java/android/tinyWRAP.java | 2 +- .../java/android/tinyWRAPConstants.java | 2 +- .../bindings/java/android/tinyWRAPJNI.java | 57 +- .../bindings/java/android/tinyWRAP_wrap.cxx | 267 +- .../bindings/java/android/tinyWRAP_wrap.h | 2 +- .../android/tmedia_bandwidth_level_t.java | 2 +- .../java/android/tmedia_chroma_t.java | 2 +- .../android/tmedia_pref_video_size_t.java | 62 + .../java/android/tmedia_profile_t.java | 52 + .../java/android/tmedia_qos_strength_t.java | 2 +- .../java/android/tmedia_qos_stype_t.java | 2 +- .../java/android/tmedia_srtp_mode_t.java | 2 +- .../java/android/tmsrp_event_type_t.java | 2 +- .../java/android/tmsrp_request_type_t.java | 2 +- .../java/android/tsip_event_type_t.java | 2 +- .../java/android/tsip_info_event_type_t.java | 2 +- .../android/tsip_invite_event_type_t.java | 2 +- .../android/tsip_message_event_type_t.java | 2 +- .../android/tsip_options_event_type_t.java | 2 +- .../android/tsip_publish_event_type_t.java | 2 +- .../android/tsip_register_event_type_t.java | 2 +- .../java/android/tsip_request_type_t.java | 2 +- .../android/tsip_subscribe_event_type_t.java | 2 +- .../java/android/twrap_media_type_t.java | 2 +- .../android/twrap_proxy_plugin_type_t.java | 2 +- .../java/android/twrap_rpmessage_type_t.java | 2 +- .../java/android/twrap_sms_type_t.java | 2 +- .../bindings/java/tdav_codec_id_t.java | 11 +- .../bindings/java/thttp_event_type_t.java | 2 +- .../2.0/doubango/bindings/java/tinyWRAP.java | 2 +- .../bindings/java/tinyWRAPConstants.java | 2 +- .../doubango/bindings/java/tinyWRAPJNI.java | 57 +- .../doubango/bindings/java/tinyWRAP_wrap.cxx | 859 +- .../doubango/bindings/java/tinyWRAP_wrap.h | 2 +- .../java/tmedia_bandwidth_level_t.java | 2 +- .../bindings/java/tmedia_chroma_t.java | 2 +- .../java/tmedia_pref_video_size_t.java | 62 + .../bindings/java/tmedia_profile_t.java | 52 + .../bindings/java/tmedia_qos_strength_t.java | 2 +- .../bindings/java/tmedia_qos_stype_t.java | 2 +- .../bindings/java/tmedia_srtp_mode_t.java | 2 +- .../bindings/java/tmsrp_event_type_t.java | 2 +- .../bindings/java/tmsrp_request_type_t.java | 2 +- .../bindings/java/tsip_event_type_t.java | 2 +- .../bindings/java/tsip_info_event_type_t.java | 2 +- .../java/tsip_invite_event_type_t.java | 2 +- .../java/tsip_message_event_type_t.java | 2 +- .../java/tsip_options_event_type_t.java | 2 +- .../java/tsip_publish_event_type_t.java | 2 +- .../java/tsip_register_event_type_t.java | 2 +- .../bindings/java/tsip_request_type_t.java | 2 +- .../java/tsip_subscribe_event_type_t.java | 2 +- .../bindings/java/twrap_media_type_t.java | 2 +- .../java/twrap_proxy_plugin_type_t.java | 2 +- .../bindings/java/twrap_rpmessage_type_t.java | 2 +- .../bindings/java/twrap_sms_type_t.java | 2 +- .../2.0/doubango/bindings/perl/tinyWRAP.pm | 40 +- .../doubango/bindings/perl/tinyWRAP_wrap.cxx | 4039 +++++---- .../2.0/doubango/bindings/python/tinyWRAP.py | 82 +- .../bindings/python/tinyWRAP_wrap.cxx | 7879 +++++++++-------- .../doubango/bindings/python/tinyWRAP_wrap.h | 128 +- .../documentation/Doubango_Layers.png | Bin 0 -> 83207 bytes .../thirdparties/android/include/vpx/vp8.h | 4 +- .../thirdparties/android/include/vpx/vp8cx.h | 23 +- .../thirdparties/android/include/vpx/vp8dx.h | 4 +- .../thirdparties/android/include/vpx/vp8e.h | 4 +- .../android/include/vpx/vpx_codec.h | 2 +- .../android/include/vpx/vpx_decoder.h | 14 - .../android/include/vpx/vpx_decoder_compat.h | 2 +- .../android/include/vpx/vpx_encoder.h | 69 +- .../android/include/vpx/vpx_integer.h | 13 +- .../thirdparties/android/lib/libvpx_armv5te.a | Bin 431044 -> 387086 bytes .../thirdparties/android/lib/libvpx_armv7-a.a | Bin 558922 -> 504334 bytes .../thirdparties/win32/include/vpx/vp8.h | 4 +- .../thirdparties/win32/include/vpx/vp8cx.h | 23 +- .../thirdparties/win32/include/vpx/vp8dx.h | 4 +- .../thirdparties/win32/include/vpx/vp8e.h | 4 +- .../win32/include/vpx/vpx_codec.h | 2 +- .../win32/include/vpx/vpx_decoder.h | 14 - .../win32/include/vpx/vpx_decoder_compat.h | 2 +- .../win32/include/vpx/vpx_encoder.h | 69 +- .../win32/include/vpx/vpx_integer.h | 13 +- .../win32/include/webrtc/echo_cancellation.h | 44 +- .../win32/include/webrtc/noise_suppression.h | 42 +- .../include/webrtc/noise_suppression_x.h | 42 +- .../win32/include/webrtc/typedefs.h | 145 +- .../thirdparties/win32/lib/speex/libspeex.a | Bin 356620 -> 298668 bytes .../win32/lib/speex/libspeexdsp.a | Bin 218746 -> 184784 bytes .../thirdparties/win32/lib/vpx/vpxmd.lib | Bin 768632 -> 622626 bytes .../thirdparties/win32/lib/webrtc/CNG.lib | Bin 25740 -> 25740 bytes .../thirdparties/win32/lib/webrtc/G711.lib | Bin 16656 -> 16656 bytes .../thirdparties/win32/lib/webrtc/G722.lib | Bin 37846 -> 37846 bytes .../thirdparties/win32/lib/webrtc/NetEq.lib | Bin 361472 -> 361472 bytes .../thirdparties/win32/lib/webrtc/PCM16B.lib | Bin 6392 -> 6392 bytes .../thirdparties/win32/lib/webrtc/aec.lib | Bin 124402 -> 121208 bytes .../thirdparties/win32/lib/webrtc/aecm.lib | Bin 62554 -> 53802 bytes .../thirdparties/win32/lib/webrtc/agc.lib | Bin 44100 -> 44100 bytes .../win32/lib/webrtc/audio_coding_module.lib | Bin 865444 -> 865426 bytes .../lib/webrtc/audio_conference_mixer.lib | Bin 136772 -> 136772 bytes .../win32/lib/webrtc/audio_device.lib | Bin 1117090 -> 1117090 bytes .../thirdparties/win32/lib/webrtc/iLBC.lib | Bin 425882 -> 425882 bytes .../thirdparties/win32/lib/webrtc/iSAC.lib | Bin 557288 -> 557176 bytes .../thirdparties/win32/lib/webrtc/iSACFix.lib | Bin 366068 -> 366068 bytes .../win32/lib/webrtc/libjingle_app.lib | Bin 9081612 -> 9081612 bytes .../win32/lib/webrtc/libjingle_p2p.lib | Bin 39548322 -> 39548322 bytes .../win32/lib/webrtc/media_file.lib | Bin 272368 -> 260504 bytes .../thirdparties/win32/lib/webrtc/ns.lib | Bin 57560 -> 57560 bytes .../win32/lib/webrtc/resampler.lib | Bin 27840 -> 27840 bytes .../win32/lib/webrtc/rtp_rtcp.lib | Bin 1975732 -> 1975956 bytes .../thirdparties/win32/lib/webrtc/spl.lib | Bin 281790 -> 282284 bytes .../win32/lib/webrtc/system_wrappers.lib | Bin 2206626 -> 2209294 bytes .../win32/lib/webrtc/udp_transport.lib | Bin 758816 -> 758864 bytes .../thirdparties/win32/lib/webrtc/vad.lib | Bin 55826 -> 55826 bytes .../win32/lib/webrtc/video_capture_module.lib | Bin 996480 -> 996480 bytes .../win32/lib/webrtc/video_engine_core.lib | Bin 1887384 -> 1887550 bytes .../win32/lib/webrtc/video_processing.lib | Bin 277516 -> 277514 bytes .../win32/lib/webrtc/video_render_module.lib | Bin 1754290 -> 1724264 bytes .../win32/lib/webrtc/voice_engine_core.lib | Bin 2195030 -> 2195252 bytes .../win32/lib/webrtc/webrtc_i420.lib | Bin 31468 -> 29230 bytes .../win32/lib/webrtc/webrtc_jpeg.lib | Bin 26530 -> 26828 bytes .../win32/lib/webrtc/webrtc_utility.lib | Bin 292032 -> 292042 bytes .../win32/lib/webrtc/webrtc_video_coding.lib | Bin 975640 -> 973226 bytes .../win32/lib/webrtc/webrtc_vp8.lib | Bin 55678 -> 65020 bytes .../win32/lib/webrtc/webrtc_vplib.lib | Bin 132200 -> 132234 bytes branches/2.0/doubango/tinyDAV/droid-makefile | 10 +- .../tinydav/audio/tdav_session_audio.h | 45 +- .../tinydav/codecs/fec/tdav_codec_red.h | 47 + .../tinydav/codecs/fec/tdav_codec_ulpfec.h | 46 + .../tinydav/codecs/g711/tdav_codec_g711.h | 1 - .../tinydav/codecs/h263/tdav_codec_h263.h | 64 - .../tinydav/codecs/h264/tdav_codec_h264.h | 39 +- .../codecs/h264/tdav_codec_h264_common.h | 110 +- .../tinydav/codecs/h264/tdav_codec_h264_rtp.h | 10 +- .../tinydav/codecs/mp4ves/tdav_codec_mp4ves.h | 35 - .../tinydav/codecs/theora/tdav_codec_theora.h | 42 - .../tinydav/codecs/vpx/tdav_codec_vp8.h | 36 - .../doubango/tinyDAV/include/tinydav/tdav.h | 10 +- .../tinyDAV/include/tinydav/tdav_session_av.h | 109 + .../tinydav/video/jb/tdav_video_frame.h | 65 + .../include/tinydav/video/jb/tdav_video_jb.h | 83 + .../tinydav/video/tdav_session_video.h | 76 +- .../tinydav/video/tdav_video_jitterbuffer.h | 77 - .../audio/directsound/tdav_consumer_dsound.c | 57 +- .../audio/directsound/tdav_producer_dsound.c | 50 +- .../tinyDAV/src/audio/tdav_session_audio.c | 650 +- .../src/audio/tdav_speex_jitterbuffer.c | 4 +- .../tinyDAV/src/codecs/amr/tdav_codec_amr.c | 34 +- .../tinyDAV/src/codecs/bv/tdav_codec_bv16.c | 8 +- .../tinyDAV/src/codecs/dtmf/tdav_codec_dtmf.c | 17 +- .../tinyDAV/src/codecs/fec/tdav_codec_red.c | 264 + .../src/codecs/fec/tdav_codec_ulpfec.c | 424 + .../tinyDAV/src/codecs/g711/tdav_codec_g711.c | 22 +- .../tinyDAV/src/codecs/g722/tdav_codec_g722.c | 11 +- .../tinyDAV/src/codecs/g729/tdav_codec_g729.c | 44 +- .../tinyDAV/src/codecs/gsm/tdav_codec_gsm.c | 11 +- .../tinyDAV/src/codecs/h261/tdav_codec_h261.c | 38 +- .../tinyDAV/src/codecs/h263/tdav_codec_h263.c | 353 +- .../tinyDAV/src/codecs/h264/tdav_codec_h264.c | 452 +- .../src/codecs/h264/tdav_codec_h264_cuda.cxx | 732 +- .../src/codecs/h264/tdav_codec_h264_rtp.c | 40 +- .../tinyDAV/src/codecs/ilbc/tdav_codec_ilbc.c | 57 +- .../src/codecs/mp4ves/tdav_codec_mp4ves.c | 208 +- .../tinyDAV/src/codecs/msrp/tdav_codec_msrp.c | 13 +- .../src/codecs/speex/tdav_codec_speex.c | 27 +- .../src/codecs/theora/tdav_codec_theora.c | 217 +- .../tinyDAV/src/codecs/vpx/tdav_codec_vp8.c | 386 +- branches/2.0/doubango/tinyDAV/src/tdav.c | 28 +- .../doubango/tinyDAV/src/tdav_session_av.c | 778 ++ .../tinyDAV/src/video/jb/tdav_video_frame.c | 184 + .../tinyDAV/src/video/jb/tdav_video_jb.c | 375 + .../tinyDAV/src/video/tdav_session_video.c | 1231 +-- .../src/video/tdav_video_jitterbuffer.c | 299 - branches/2.0/doubango/tinyDAV/tinyDAV.vcproj | 64 +- .../tinyDSHOW/include/tinydshow/DSUtils.h | 10 +- .../2.0/doubango/tinyDSHOW/src/DSDisplay.cxx | 28 +- .../2.0/doubango/tinyDSHOW/src/DSUtils.cxx | 125 +- .../tinyDSHOW/src/plugin/DSConsumer.cxx | 44 +- .../tinyDSHOW/src/plugin/DSProducer.cxx | 36 +- .../2.0/doubango/tinyDSHOW/tinyDSHOW.vcproj | 2 +- .../2.0/doubango/tinyHTTP/include/thttp.h | 4 +- .../2.0/doubango/tinyHTTP/include/tinyhttp.h | 4 +- .../include/tinyhttp/auth/thttp_auth.h | 4 +- .../include/tinyhttp/auth/thttp_challenge.h | 4 +- .../include/tinyhttp/headers/thttp_header.h | 4 +- .../headers/thttp_header_Authorization.h | 4 +- .../headers/thttp_header_Content_Length.h | 4 +- .../headers/thttp_header_Content_Type.h | 4 +- .../tinyhttp/headers/thttp_header_Dummy.h | 4 +- .../tinyhttp/headers/thttp_header_ETag.h | 4 +- .../headers/thttp_header_Transfer_Encoding.h | 4 +- .../headers/thttp_header_WWW_Authenticate.h | 4 +- .../tinyhttp/parsers/thttp_parser_header.h | 4 +- .../tinyhttp/parsers/thttp_parser_message.h | 4 +- .../tinyhttp/parsers/thttp_parser_url.h | 4 +- .../tinyHTTP/include/tinyhttp/thttp_action.h | 4 +- .../tinyHTTP/include/tinyhttp/thttp_dialog.h | 4 +- .../tinyHTTP/include/tinyhttp/thttp_event.h | 4 +- .../tinyHTTP/include/tinyhttp/thttp_message.h | 4 +- .../tinyHTTP/include/tinyhttp/thttp_session.h | 4 +- .../tinyHTTP/include/tinyhttp/thttp_url.h | 4 +- .../tinyHTTP/include/tinyhttp_config.h | 2 +- .../tinyHTTP/ragel/thttp_machine_header.rl | 4 +- .../tinyHTTP/ragel/thttp_machine_message.rl | 4 +- .../tinyHTTP/ragel/thttp_machine_utils.rl | 4 +- .../tinyHTTP/ragel/thttp_parser_header.rl | 4 +- .../thttp_parser_header_Authorization.rl | 4 +- .../thttp_parser_header_Content_Length.rl | 4 +- .../ragel/thttp_parser_header_Content_Type.rl | 4 +- .../ragel/thttp_parser_header_Dummy.rl | 4 +- .../ragel/thttp_parser_header_ETag.rl | 4 +- .../thttp_parser_header_Transfer_Encoding.rl | 4 +- .../thttp_parser_header_WWW_Authenticate.rl | 4 +- .../tinyHTTP/ragel/thttp_parser_message.rl | 4 +- .../tinyHTTP/ragel/thttp_parser_url.rl | 4 +- .../doubango/tinyHTTP/src/auth/thttp_auth.c | 4 +- .../tinyHTTP/src/auth/thttp_challenge.c | 4 +- .../tinyHTTP/src/headers/thttp_header.c | 10 +- .../src/headers/thttp_header_Authorization.c | 454 +- .../src/headers/thttp_header_Content_Length.c | 250 +- .../src/headers/thttp_header_Content_Type.c | 280 +- .../tinyHTTP/src/headers/thttp_header_Dummy.c | 288 +- .../tinyHTTP/src/headers/thttp_header_ETag.c | 294 +- .../headers/thttp_header_Transfer_Encoding.c | 280 +- .../headers/thttp_header_WWW_Authenticate.c | 398 +- .../src/parsers/thttp_parser_header.c | 646 +- .../src/parsers/thttp_parser_message.c | 428 +- .../tinyHTTP/src/parsers/thttp_parser_url.c | 210 +- branches/2.0/doubango/tinyHTTP/src/thttp.c | 4 +- .../2.0/doubango/tinyHTTP/src/thttp_action.c | 4 +- .../2.0/doubango/tinyHTTP/src/thttp_dialog.c | 4 +- .../2.0/doubango/tinyHTTP/src/thttp_event.c | 4 +- .../2.0/doubango/tinyHTTP/src/thttp_message.c | 4 +- .../2.0/doubango/tinyHTTP/src/thttp_session.c | 4 +- .../2.0/doubango/tinyHTTP/src/thttp_url.c | 4 +- .../doubango/tinyIPSec/src/tinyipsec_config.h | 2 +- branches/2.0/doubango/tinyIPSec/src/tipsec.c | 4 +- branches/2.0/doubango/tinyIPSec/src/tipsec.h | 4 +- .../doubango/tinyIPSec/src/tipsec_common.c | 4 +- .../doubango/tinyIPSec/src/tipsec_common.h | 4 +- .../doubango/tinyIPSec/src/tipsec_racoon.c | 4 +- .../doubango/tinyIPSec/src/tipsec_racoon.h | 4 +- .../2.0/doubango/tinyIPSec/src/tipsec_vista.c | 4 +- .../2.0/doubango/tinyIPSec/src/tipsec_vista.h | 4 +- .../2.0/doubango/tinyIPSec/src/tipsec_xp.c | 4 +- .../2.0/doubango/tinyIPSec/src/tipsec_xp.h | 4 +- .../2.0/doubango/tinyMEDIA/droid-makefile | 1 + .../doubango/tinyMEDIA/include/tinymedia.h | 5 +- .../tinymedia/content/tmedia_content.h | 4 +- .../tinymedia/content/tmedia_content_cpim.h | 4 +- .../tinyMEDIA/include/tinymedia/tmedia.h | 4 +- .../include/tinymedia/tmedia_codec.h | 75 +- .../include/tinymedia/tmedia_codec_dummy.h | 4 +- .../include/tinymedia/tmedia_common.h | 112 +- .../include/tinymedia/tmedia_consumer.h | 4 +- .../include/tinymedia/tmedia_defaults.h | 20 +- .../include/tinymedia/tmedia_denoise.h | 4 +- .../include/tinymedia/tmedia_imageattr.h | 108 + .../include/tinymedia/tmedia_jitterbuffer.h | 4 +- .../include/tinymedia/tmedia_params.h | 4 +- .../include/tinymedia/tmedia_producer.h | 8 +- .../tinyMEDIA/include/tinymedia/tmedia_qos.h | 4 +- .../include/tinymedia/tmedia_resampler.h | 4 +- .../include/tinymedia/tmedia_session.h | 12 +- .../include/tinymedia/tmedia_session_dummy.h | 4 +- .../include/tinymedia/tmedia_session_ghost.h | 4 +- .../tinyMEDIA/include/tinymedia_config.h | 2 +- branches/2.0/doubango/tinyMEDIA/ragel.sh | 19 +- .../tinyMEDIA/ragel/tmedia_content_cpim.rl | 6 +- .../tinyMEDIA/ragel/tmedia_imageattr.rl | 181 + .../tinyMEDIA/ragel/tmedia_machine_utils.rl | 4 +- .../tinyMEDIA/src/content/tmedia_content.c | 4 +- .../src/content/tmedia_content_cpim.c | 474 +- branches/2.0/doubango/tinyMEDIA/src/tmedia.c | 4 +- .../2.0/doubango/tinyMEDIA/src/tmedia_codec.c | 134 +- .../tinyMEDIA/src/tmedia_codec_dummy.c | 47 +- .../doubango/tinyMEDIA/src/tmedia_common.c | 224 +- .../doubango/tinyMEDIA/src/tmedia_consumer.c | 4 +- .../doubango/tinyMEDIA/src/tmedia_defaults.c | 216 +- .../doubango/tinyMEDIA/src/tmedia_denoise.c | 5 +- .../doubango/tinyMEDIA/src/tmedia_imageattr.c | 952 ++ .../tinyMEDIA/src/tmedia_jitterbuffer.c | 4 +- .../doubango/tinyMEDIA/src/tmedia_params.c | 8 +- .../doubango/tinyMEDIA/src/tmedia_producer.c | 6 +- .../2.0/doubango/tinyMEDIA/src/tmedia_qos.c | 4 +- .../doubango/tinyMEDIA/src/tmedia_resampler.c | 4 +- .../doubango/tinyMEDIA/src/tmedia_session.c | 179 +- .../tinyMEDIA/src/tmedia_session_dummy.c | 4 +- .../tinyMEDIA/src/tmedia_session_ghost.c | 4 +- branches/2.0/doubango/tinyMEDIA/test/test.c | 10 +- .../2.0/doubango/tinyMEDIA/test/test.vcproj | 6 +- .../doubango/tinyMEDIA/test/test_image_attr.h | 54 + .../doubango/tinyMEDIA/test/test_sessions.h | 2 +- .../2.0/doubango/tinyMEDIA/tinyMEDIA.vcproj | 12 + branches/2.0/doubango/tinyNET/droid-makefile | 7 +- .../doubango/tinyNET/ragel/tnet_dns_regexp.rl | 8 +- .../tinyNET/ragel/tnet_dns_resolvconf.rl | 4 +- .../2.0/doubango/tinyNET/src/dhcp/tnet_dhcp.c | 4 +- .../2.0/doubango/tinyNET/src/dhcp/tnet_dhcp.h | 4 +- .../tinyNET/src/dhcp/tnet_dhcp_message.c | 4 +- .../tinyNET/src/dhcp/tnet_dhcp_message.h | 4 +- .../tinyNET/src/dhcp/tnet_dhcp_option.c | 4 +- .../tinyNET/src/dhcp/tnet_dhcp_option.h | 4 +- .../tinyNET/src/dhcp/tnet_dhcp_option_sip.c | 4 +- .../tinyNET/src/dhcp/tnet_dhcp_option_sip.h | 4 +- .../doubango/tinyNET/src/dhcp6/tnet_dhcp6.c | 4 +- .../doubango/tinyNET/src/dhcp6/tnet_dhcp6.h | 4 +- .../tinyNET/src/dhcp6/tnet_dhcp6_duid.c | 4 +- .../tinyNET/src/dhcp6/tnet_dhcp6_duid.h | 4 +- .../tinyNET/src/dhcp6/tnet_dhcp6_message.c | 4 +- .../tinyNET/src/dhcp6/tnet_dhcp6_message.h | 4 +- .../tinyNET/src/dhcp6/tnet_dhcp6_option.c | 4 +- .../tinyNET/src/dhcp6/tnet_dhcp6_option.h | 4 +- .../2.0/doubango/tinyNET/src/dns/tnet_dns.c | 4 +- .../2.0/doubango/tinyNET/src/dns/tnet_dns.h | 4 +- .../2.0/doubango/tinyNET/src/dns/tnet_dns_a.c | 4 +- .../2.0/doubango/tinyNET/src/dns/tnet_dns_a.h | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_aaaa.c | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_aaaa.h | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_cname.c | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_cname.h | 4 +- .../tinyNET/src/dns/tnet_dns_message.c | 4 +- .../tinyNET/src/dns/tnet_dns_message.h | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_mx.c | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_mx.h | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_naptr.c | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_naptr.h | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_ns.c | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_ns.h | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_opt.c | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_opt.h | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_ptr.c | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_ptr.h | 4 +- .../tinyNET/src/dns/tnet_dns_regexp.c | 8 +- .../tinyNET/src/dns/tnet_dns_regexp.h | 4 +- .../tinyNET/src/dns/tnet_dns_resolvconf.c | 4 +- .../tinyNET/src/dns/tnet_dns_resolvconf.h | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_rr.c | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_rr.h | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_soa.c | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_soa.h | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_srv.c | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_srv.h | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_txt.c | 4 +- .../doubango/tinyNET/src/dns/tnet_dns_txt.h | 4 +- .../tinyNET/src/ice/tnet_ice_candidate.c | 618 ++ .../tinyNET/src/ice/tnet_ice_candidate.h | 122 + .../doubango/tinyNET/src/ice/tnet_ice_ctx.c | 1466 +++ .../doubango/tinyNET/src/ice/tnet_ice_ctx.h | 78 + .../doubango/tinyNET/src/ice/tnet_ice_event.c | 84 + .../doubango/tinyNET/src/ice/tnet_ice_event.h | 72 + .../doubango/tinyNET/src/ice/tnet_ice_pair.c | 632 ++ .../doubango/tinyNET/src/ice/tnet_ice_pair.h | 76 + .../doubango/tinyNET/src/ice/tnet_ice_utils.c | 145 + .../doubango/tinyNET/src/ice/tnet_ice_utils.h | 40 + .../2.0/doubango/tinyNET/src/stun/tnet_stun.c | 15 +- .../2.0/doubango/tinyNET/src/stun/tnet_stun.h | 4 +- .../tinyNET/src/stun/tnet_stun_attribute.c | 468 +- .../tinyNET/src/stun/tnet_stun_attribute.h | 61 +- .../tinyNET/src/stun/tnet_stun_message.c | 121 +- .../tinyNET/src/stun/tnet_stun_message.h | 32 +- branches/2.0/doubango/tinyNET/src/tinynet.h | 9 +- .../2.0/doubango/tinyNET/src/tinynet_config.h | 33 +- .../2.0/doubango/tinyNET/src/tls/tnet_tls.c | 4 +- .../2.0/doubango/tinyNET/src/tls/tnet_tls.h | 4 +- branches/2.0/doubango/tinyNET/src/tnet.c | 4 +- branches/2.0/doubango/tinyNET/src/tnet.h | 4 +- branches/2.0/doubango/tinyNET/src/tnet_auth.c | 4 +- branches/2.0/doubango/tinyNET/src/tnet_auth.h | 4 +- .../doubango/tinyNET/src/tnet_endianness.c | 4 +- .../doubango/tinyNET/src/tnet_endianness.h | 6 +- .../2.0/doubango/tinyNET/src/tnet_hardwares.h | 4 +- branches/2.0/doubango/tinyNET/src/tnet_nat.c | 4 +- branches/2.0/doubango/tinyNET/src/tnet_nat.h | 4 +- branches/2.0/doubango/tinyNET/src/tnet_poll.c | 2 +- branches/2.0/doubango/tinyNET/src/tnet_poll.h | 4 +- .../2.0/doubango/tinyNET/src/tnet_proto.h | 4 +- .../2.0/doubango/tinyNET/src/tnet_socket.c | 13 +- .../2.0/doubango/tinyNET/src/tnet_socket.h | 4 +- .../2.0/doubango/tinyNET/src/tnet_transport.c | 74 +- .../2.0/doubango/tinyNET/src/tnet_transport.h | 5 +- .../tinyNET/src/tnet_transport_poll.c | 4 +- .../tinyNET/src/tnet_transport_win32.c | 8 +- .../2.0/doubango/tinyNET/src/tnet_types.h | 4 +- .../2.0/doubango/tinyNET/src/tnet_utils.c | 121 +- .../2.0/doubango/tinyNET/src/tnet_utils.h | 8 +- .../2.0/doubango/tinyNET/src/turn/tnet_turn.c | 4 +- .../2.0/doubango/tinyNET/src/turn/tnet_turn.h | 4 +- .../tinyNET/src/turn/tnet_turn_attribute.c | 4 +- .../tinyNET/src/turn/tnet_turn_attribute.h | 4 +- .../tinyNET/src/turn/tnet_turn_message.c | 4 +- .../tinyNET/src/turn/tnet_turn_message.h | 4 +- branches/2.0/doubango/tinyNET/test/stdafx.c | 2 +- branches/2.0/doubango/tinyNET/test/stdafx.h | 2 +- branches/2.0/doubango/tinyNET/test/test.c | 12 +- .../2.0/doubango/tinyNET/test/test.vcproj | 6 +- .../2.0/doubango/tinyNET/test/test_auth.h | 2 +- .../2.0/doubango/tinyNET/test/test_dhcp.h | 2 +- .../2.0/doubango/tinyNET/test/test_dhcp6.h | 2 +- branches/2.0/doubango/tinyNET/test/test_dns.h | 6 +- branches/2.0/doubango/tinyNET/test/test_ice.h | 145 + .../2.0/doubango/tinyNET/test/test_ifaces.h | 2 +- branches/2.0/doubango/tinyNET/test/test_nat.h | 2 +- .../2.0/doubango/tinyNET/test/test_sockets.h | 2 +- .../2.0/doubango/tinyNET/test/test_stun.h | 2 +- branches/2.0/doubango/tinyNET/test/test_tls.h | 2 +- .../doubango/tinyNET/test/test_transport.h | 2 +- branches/2.0/doubango/tinyNET/tinyNET.sln | 7 + branches/2.0/doubango/tinyNET/tinyNET.vcproj | 40 +- branches/2.0/doubango/tinyRTP/droid-makefile | 14 +- .../2.0/doubango/tinyRTP/include/tinyrtp.h | 2 +- .../include/tinyrtp/rtcp/trtp_rtcp_header.h | 12 +- .../include/tinyrtp/rtcp/trtp_rtcp_packet.h | 26 +- .../include/tinyrtp/rtcp/trtp_rtcp_rblock.h | 13 +- .../include/tinyrtp/rtcp/trtp_rtcp_report.h | 2 +- .../tinyrtp/rtcp/trtp_rtcp_report_bye.h | 45 + .../tinyrtp/rtcp/trtp_rtcp_report_fb.h | 132 + .../tinyrtp/rtcp/trtp_rtcp_report_rr.h | 24 +- .../tinyrtp/rtcp/trtp_rtcp_report_sdes.h | 12 +- .../tinyrtp/rtcp/trtp_rtcp_report_sr.h | 23 +- .../tinyrtp/rtcp/trtp_rtcp_report_xr.h | 2 +- .../tinyrtp/rtcp/trtp_rtcp_sdes_chunck.h | 15 +- .../tinyrtp/rtcp/trtp_rtcp_sdes_item.h | 133 +- .../include/tinyrtp/rtcp/trtp_rtcp_session.h | 26 +- .../include/tinyrtp/rtp/trtp_rtp_header.h | 2 +- .../include/tinyrtp/rtp/trtp_rtp_packet.h | 5 +- .../include/tinyrtp/rtp/trtp_rtp_session.h | 6 +- .../doubango/tinyRTP/include/tinyrtp/trtp.h | 2 +- .../tinyRTP/include/tinyrtp/trtp_manager.h | 49 +- .../doubango/tinyRTP/include/tinyrtp_config.h | 2 +- .../tinyRTP/src/rtcp/trtp_rtcp_header.c | 68 +- .../tinyRTP/src/rtcp/trtp_rtcp_packet.c | 260 +- .../tinyRTP/src/rtcp/trtp_rtcp_rblock.c | 151 +- .../tinyRTP/src/rtcp/trtp_rtcp_report.c | 2 +- .../tinyRTP/src/rtcp/trtp_rtcp_report_bye.c | 225 + .../tinyRTP/src/rtcp/trtp_rtcp_report_fb.c | 555 ++ .../tinyRTP/src/rtcp/trtp_rtcp_report_rr.c | 215 +- .../tinyRTP/src/rtcp/trtp_rtcp_report_sdes.c | 196 +- .../tinyRTP/src/rtcp/trtp_rtcp_report_sr.c | 261 +- .../tinyRTP/src/rtcp/trtp_rtcp_report_xr.c | 2 +- .../tinyRTP/src/rtcp/trtp_rtcp_sdes_chunck.c | 194 +- .../tinyRTP/src/rtcp/trtp_rtcp_sdes_item.c | 641 +- .../tinyRTP/src/rtcp/trtp_rtcp_session.c | 1434 ++- .../tinyRTP/src/rtp/trtp_rtp_header.c | 8 +- .../tinyRTP/src/rtp/trtp_rtp_packet.c | 24 +- .../tinyRTP/src/rtp/trtp_rtp_session.c | 2 +- branches/2.0/doubango/tinyRTP/src/trtp.c | 2 +- .../2.0/doubango/tinyRTP/src/trtp_manager.c | 672 +- branches/2.0/doubango/tinyRTP/src/trtp_srtp.c | 3 +- branches/2.0/doubango/tinyRTP/tinyRTP.vcproj | 16 + .../2.0/doubango/tinySAK/src/tinysak_config.h | 8 +- branches/2.0/doubango/tinySAK/src/tsk.c | 2 +- branches/2.0/doubango/tinySAK/src/tsk.h | 4 +- .../2.0/doubango/tinySAK/src/tsk_base64.c | 4 +- .../2.0/doubango/tinySAK/src/tsk_base64.h | 4 +- .../doubango/tinySAK/src/tsk_binaryutils.c | 4 +- .../doubango/tinySAK/src/tsk_binaryutils.h | 4 +- .../2.0/doubango/tinySAK/src/tsk_buffer.c | 4 +- .../2.0/doubango/tinySAK/src/tsk_buffer.h | 4 +- .../2.0/doubango/tinySAK/src/tsk_common.h | 4 +- .../2.0/doubango/tinySAK/src/tsk_condwait.c | 4 +- .../2.0/doubango/tinySAK/src/tsk_condwait.h | 4 +- branches/2.0/doubango/tinySAK/src/tsk_debug.c | 4 +- branches/2.0/doubango/tinySAK/src/tsk_debug.h | 4 +- branches/2.0/doubango/tinySAK/src/tsk_errno.h | 4 +- branches/2.0/doubango/tinySAK/src/tsk_fsm.c | 33 +- branches/2.0/doubango/tinySAK/src/tsk_fsm.h | 8 +- branches/2.0/doubango/tinySAK/src/tsk_hmac.c | 4 +- branches/2.0/doubango/tinySAK/src/tsk_hmac.h | 4 +- branches/2.0/doubango/tinySAK/src/tsk_list.c | 51 +- branches/2.0/doubango/tinySAK/src/tsk_list.h | 14 +- branches/2.0/doubango/tinySAK/src/tsk_md5.c | 6 +- branches/2.0/doubango/tinySAK/src/tsk_md5.h | 4 +- .../2.0/doubango/tinySAK/src/tsk_memory.c | 4 +- .../2.0/doubango/tinySAK/src/tsk_memory.h | 4 +- branches/2.0/doubango/tinySAK/src/tsk_mutex.c | 4 +- branches/2.0/doubango/tinySAK/src/tsk_mutex.h | 4 +- .../2.0/doubango/tinySAK/src/tsk_object.c | 20 +- .../2.0/doubango/tinySAK/src/tsk_object.h | 12 +- .../2.0/doubango/tinySAK/src/tsk_options.c | 4 +- .../2.0/doubango/tinySAK/src/tsk_options.h | 4 +- .../2.0/doubango/tinySAK/src/tsk_params.c | 4 +- .../2.0/doubango/tinySAK/src/tsk_params.h | 4 +- .../2.0/doubango/tinySAK/src/tsk_ppfcs16.c | 4 +- .../2.0/doubango/tinySAK/src/tsk_ppfcs16.h | 4 +- .../2.0/doubango/tinySAK/src/tsk_ppfcs32.c | 4 +- .../2.0/doubango/tinySAK/src/tsk_ppfcs32.h | 4 +- .../doubango/tinySAK/src/tsk_ragel_state.c | 4 +- .../doubango/tinySAK/src/tsk_ragel_state.h | 4 +- .../2.0/doubango/tinySAK/src/tsk_runnable.c | 4 +- .../2.0/doubango/tinySAK/src/tsk_runnable.h | 4 +- .../2.0/doubango/tinySAK/src/tsk_safeobj.c | 4 +- .../2.0/doubango/tinySAK/src/tsk_safeobj.h | 4 +- .../2.0/doubango/tinySAK/src/tsk_semaphore.c | 4 +- .../2.0/doubango/tinySAK/src/tsk_semaphore.h | 4 +- branches/2.0/doubango/tinySAK/src/tsk_sha1.c | 4 +- branches/2.0/doubango/tinySAK/src/tsk_sha1.h | 8 +- .../2.0/doubango/tinySAK/src/tsk_string.c | 4 +- .../2.0/doubango/tinySAK/src/tsk_string.h | 4 +- .../2.0/doubango/tinySAK/src/tsk_thread.c | 4 +- .../2.0/doubango/tinySAK/src/tsk_thread.h | 4 +- branches/2.0/doubango/tinySAK/src/tsk_time.c | 67 +- branches/2.0/doubango/tinySAK/src/tsk_time.h | 7 +- branches/2.0/doubango/tinySAK/src/tsk_timer.c | 23 +- branches/2.0/doubango/tinySAK/src/tsk_timer.h | 4 +- branches/2.0/doubango/tinySAK/src/tsk_url.c | 4 +- branches/2.0/doubango/tinySAK/src/tsk_url.h | 4 +- branches/2.0/doubango/tinySAK/src/tsk_uuid.c | 4 +- branches/2.0/doubango/tinySAK/src/tsk_uuid.h | 4 +- branches/2.0/doubango/tinySAK/src/tsk_xml.c | 4 +- branches/2.0/doubango/tinySAK/src/tsk_xml.h | 4 +- .../2.0/doubango/tinySAK/test/test_sha1.h | 5 + .../2.0/doubango/tinySDP/include/tinysdp.h | 4 +- .../include/tinysdp/headers/tsdp_header.h | 4 +- .../include/tinysdp/headers/tsdp_header_A.h | 4 +- .../include/tinysdp/headers/tsdp_header_B.h | 4 +- .../include/tinysdp/headers/tsdp_header_C.h | 4 +- .../tinysdp/headers/tsdp_header_Dummy.h | 4 +- .../include/tinysdp/headers/tsdp_header_E.h | 4 +- .../include/tinysdp/headers/tsdp_header_I.h | 4 +- .../include/tinysdp/headers/tsdp_header_K.h | 4 +- .../include/tinysdp/headers/tsdp_header_M.h | 11 +- .../include/tinysdp/headers/tsdp_header_O.h | 4 +- .../include/tinysdp/headers/tsdp_header_P.h | 4 +- .../include/tinysdp/headers/tsdp_header_R.h | 4 +- .../include/tinysdp/headers/tsdp_header_S.h | 4 +- .../include/tinysdp/headers/tsdp_header_T.h | 4 +- .../include/tinysdp/headers/tsdp_header_U.h | 4 +- .../include/tinysdp/headers/tsdp_header_V.h | 4 +- .../include/tinysdp/headers/tsdp_header_Z.h | 4 +- .../tinysdp/parsers/tsdp_parser_message.h | 4 +- .../tinySDP/include/tinysdp/tsdp_message.h | 7 +- .../doubango/tinySDP/include/tinysdp_config.h | 2 +- branches/2.0/doubango/tinySDP/include/tsdp.h | 4 +- .../tinySDP/ragel/tsdp_machine_utils.rl | 4 +- .../tinySDP/ragel/tsdp_parser_header_A.rl | 4 +- .../tinySDP/ragel/tsdp_parser_header_B.rl | 4 +- .../tinySDP/ragel/tsdp_parser_header_C.rl | 4 +- .../tinySDP/ragel/tsdp_parser_header_Dummy.rl | 4 +- .../tinySDP/ragel/tsdp_parser_header_E.rl | 4 +- .../tinySDP/ragel/tsdp_parser_header_I.rl | 4 +- .../tinySDP/ragel/tsdp_parser_header_K.rl | 4 +- .../tinySDP/ragel/tsdp_parser_header_M.rl | 73 +- .../tinySDP/ragel/tsdp_parser_header_O.rl | 4 +- .../tinySDP/ragel/tsdp_parser_header_P.rl | 4 +- .../tinySDP/ragel/tsdp_parser_header_R.rl | 4 +- .../tinySDP/ragel/tsdp_parser_header_S.rl | 4 +- .../tinySDP/ragel/tsdp_parser_header_T.rl | 4 +- .../tinySDP/ragel/tsdp_parser_header_U.rl | 4 +- .../tinySDP/ragel/tsdp_parser_header_V.rl | 4 +- .../tinySDP/ragel/tsdp_parser_header_Z.rl | 4 +- .../tinySDP/ragel/tsdp_parser_message.rl | 4 +- .../tinySDP/src/headers/tsdp_header.c | 4 +- .../tinySDP/src/headers/tsdp_header_A.c | 4 +- .../tinySDP/src/headers/tsdp_header_B.c | 4 +- .../tinySDP/src/headers/tsdp_header_C.c | 4 +- .../tinySDP/src/headers/tsdp_header_Dummy.c | 4 +- .../tinySDP/src/headers/tsdp_header_E.c | 4 +- .../tinySDP/src/headers/tsdp_header_I.c | 4 +- .../tinySDP/src/headers/tsdp_header_K.c | 4 +- .../tinySDP/src/headers/tsdp_header_M.c | 73 +- .../tinySDP/src/headers/tsdp_header_O.c | 4 +- .../tinySDP/src/headers/tsdp_header_P.c | 4 +- .../tinySDP/src/headers/tsdp_header_R.c | 4 +- .../tinySDP/src/headers/tsdp_header_S.c | 4 +- .../tinySDP/src/headers/tsdp_header_T.c | 4 +- .../tinySDP/src/headers/tsdp_header_U.c | 4 +- .../tinySDP/src/headers/tsdp_header_V.c | 4 +- .../tinySDP/src/headers/tsdp_header_Z.c | 4 +- .../tinySDP/src/parsers/tsdp_parser_message.c | 4 +- branches/2.0/doubango/tinySDP/src/tsdp.c | 4 +- .../2.0/doubango/tinySDP/src/tsdp_message.c | 52 +- branches/2.0/doubango/tinySIGCOMP/src/tcomp.c | 2 +- branches/2.0/doubango/tinySIGCOMP/src/tcomp.h | 2 +- .../doubango/tinySIGCOMP/src/tcomp_buffer.c | 2 +- .../doubango/tinySIGCOMP/src/tcomp_buffer.h | 2 +- .../tinySIGCOMP/src/tcomp_compartment.c | 2 +- .../tinySIGCOMP/src/tcomp_compartment.h | 2 +- .../tinySIGCOMP/src/tcomp_compressor.h | 2 +- .../src/tcomp_compressor_deflate.c | 2 +- .../src/tcomp_compressor_deflate.h | 2 +- .../tinySIGCOMP/src/tcomp_compressor_dummy.c | 2 +- .../tinySIGCOMP/src/tcomp_compressor_dummy.h | 2 +- .../tinySIGCOMP/src/tcomp_compressordata.c | 2 +- .../tinySIGCOMP/src/tcomp_compressordata.h | 2 +- .../tinySIGCOMP/src/tcomp_compressordisp.c | 2 +- .../tinySIGCOMP/src/tcomp_compressordisp.h | 2 +- .../tinySIGCOMP/src/tcomp_decompressordisp.c | 2 +- .../tinySIGCOMP/src/tcomp_decompressordisp.h | 2 +- .../tinySIGCOMP/src/tcomp_deflatedata.c | 2 +- .../tinySIGCOMP/src/tcomp_deflatedata.ghost.c | 2 +- .../tinySIGCOMP/src/tcomp_deflatedata.h | 2 +- .../tinySIGCOMP/src/tcomp_deflatedata.zlib.c | 2 +- .../doubango/tinySIGCOMP/src/tcomp_dicts.c | 2 +- .../doubango/tinySIGCOMP/src/tcomp_dicts.h | 2 +- .../tinySIGCOMP/src/tcomp_headers_index.h | 2 +- .../tinySIGCOMP/src/tcomp_instructions.h | 2 +- .../doubango/tinySIGCOMP/src/tcomp_manager.c | 2 +- .../doubango/tinySIGCOMP/src/tcomp_manager.h | 2 +- .../doubango/tinySIGCOMP/src/tcomp_message.c | 2 +- .../doubango/tinySIGCOMP/src/tcomp_message.h | 2 +- .../tinySIGCOMP/src/tcomp_nack_codes.h | 2 +- .../doubango/tinySIGCOMP/src/tcomp_nackinfo.c | 2 +- .../doubango/tinySIGCOMP/src/tcomp_nackinfo.h | 2 +- .../doubango/tinySIGCOMP/src/tcomp_operands.h | 2 +- .../doubango/tinySIGCOMP/src/tcomp_params.c | 2 +- .../doubango/tinySIGCOMP/src/tcomp_params.h | 2 +- .../doubango/tinySIGCOMP/src/tcomp_reqfeed.c | 2 +- .../doubango/tinySIGCOMP/src/tcomp_reqfeed.h | 2 +- .../doubango/tinySIGCOMP/src/tcomp_result.c | 2 +- .../doubango/tinySIGCOMP/src/tcomp_result.h | 2 +- .../src/tcomp_rfc3485_dictionary_sip.h | 2 +- .../tinySIGCOMP/src/tcomp_rfc5049_sip.h | 2 +- .../src/tcomp_rfc5112_dictionary_presence.h | 2 +- .../doubango/tinySIGCOMP/src/tcomp_state.c | 2 +- .../doubango/tinySIGCOMP/src/tcomp_state.h | 2 +- .../tinySIGCOMP/src/tcomp_statehandler.c | 2 +- .../tinySIGCOMP/src/tcomp_statehandler.h | 2 +- .../doubango/tinySIGCOMP/src/tcomp_types.h | 2 +- .../tinySIGCOMP/src/tcomp_udvm.bytecopy.c | 2 +- .../2.0/doubango/tinySIGCOMP/src/tcomp_udvm.c | 2 +- .../2.0/doubango/tinySIGCOMP/src/tcomp_udvm.h | 2 +- .../tinySIGCOMP/src/tcomp_udvm.instructions.c | 2 +- .../tinySIGCOMP/src/tcomp_udvm.nack.c | 2 +- .../tinySIGCOMP/src/tcomp_udvm.operands.c | 2 +- .../src/tcomp_udvm.statemanagment.c | 2 +- .../tinySIGCOMP/src/tinysigcomp_config.h | 2 +- branches/2.0/doubango/tinySIP/droid-makefile | 1 + .../2.0/doubango/tinySIP/include/tinysip.h | 4 +- .../include/tinysip/api/tsip_api_common.h | 4 +- .../include/tinysip/api/tsip_api_invite.h | 4 +- .../include/tinysip/api/tsip_api_message.h | 4 +- .../include/tinysip/api/tsip_api_options.h | 4 +- .../include/tinysip/api/tsip_api_publish.h | 4 +- .../include/tinysip/api/tsip_api_register.h | 4 +- .../include/tinysip/api/tsip_api_subscribe.h | 4 +- .../tinysip/authentication/tsip_challenge.h | 4 +- .../tinysip/authentication/tsip_milenage.h | 4 +- .../tinysip/authentication/tsip_rijndael.h | 4 +- .../include/tinysip/dialogs/tsip_dialog.h | 6 +- .../tinysip/dialogs/tsip_dialog_info.h | 2 +- .../dialogs/tsip_dialog_invite.common.h | 6 +- .../tinysip/dialogs/tsip_dialog_invite.h | 22 +- .../tinysip/dialogs/tsip_dialog_layer.h | 4 +- .../tinysip/dialogs/tsip_dialog_message.h | 4 +- .../tinysip/dialogs/tsip_dialog_options.h | 4 +- .../tinysip/dialogs/tsip_dialog_publish.h | 4 +- .../dialogs/tsip_dialog_register.common.h | 2 +- .../tinysip/dialogs/tsip_dialog_register.h | 4 +- .../tinysip/dialogs/tsip_dialog_subscribe.h | 4 +- .../include/tinysip/headers/tsip_header.h | 4 +- .../headers/tsip_header_Accept_Contact.h | 4 +- .../headers/tsip_header_Accept_Encoding.h | 4 +- .../headers/tsip_header_Accept_Language.h | 4 +- .../tsip_header_Accept_Resource_Priority.h | 4 +- .../tinysip/headers/tsip_header_Alert_Info.h | 4 +- .../tinysip/headers/tsip_header_Allow.h | 4 +- .../headers/tsip_header_Allow_Events.h | 4 +- .../headers/tsip_header_Authentication_Info.h | 4 +- .../headers/tsip_header_Authorization.h | 4 +- .../tinysip/headers/tsip_header_CSeq.h | 4 +- .../tinysip/headers/tsip_header_Call_ID.h | 4 +- .../tinysip/headers/tsip_header_Call_Info.h | 4 +- .../tinysip/headers/tsip_header_Contact.h | 4 +- .../headers/tsip_header_Content_Disposition.h | 4 +- .../headers/tsip_header_Content_Encoding.h | 4 +- .../headers/tsip_header_Content_Language.h | 4 +- .../headers/tsip_header_Content_Length.h | 4 +- .../headers/tsip_header_Content_Type.h | 4 +- .../tinysip/headers/tsip_header_Date.h | 4 +- .../tinysip/headers/tsip_header_Dummy.h | 4 +- .../tinysip/headers/tsip_header_Error_Info.h | 4 +- .../tinysip/headers/tsip_header_Event.h | 4 +- .../tinysip/headers/tsip_header_Expires.h | 4 +- .../tinysip/headers/tsip_header_From.h | 4 +- .../headers/tsip_header_History_Info.h | 4 +- .../tinysip/headers/tsip_header_Identity.h | 4 +- .../headers/tsip_header_Identity_Info.h | 4 +- .../tinysip/headers/tsip_header_In_Reply_To.h | 4 +- .../tinysip/headers/tsip_header_Join.h | 4 +- .../headers/tsip_header_MIME_Version.h | 4 +- .../headers/tsip_header_Max_Forwards.h | 4 +- .../tinysip/headers/tsip_header_Min_Expires.h | 4 +- .../tinysip/headers/tsip_header_Min_SE.h | 4 +- .../headers/tsip_header_Organization.h | 4 +- .../tsip_header_P_Access_Network_Info.h | 4 +- .../headers/tsip_header_P_Answer_State.h | 4 +- .../headers/tsip_header_P_Asserted_Identity.h | 4 +- .../headers/tsip_header_P_Associated_URI.h | 4 +- .../headers/tsip_header_P_Called_Party_ID.h | 4 +- ...sip_header_P_Charging_Function_Addresses.h | 4 +- .../headers/tsip_header_P_Charging_Vector.h | 4 +- .../headers/tsip_header_P_DCS_Billing_Info.h | 4 +- .../tinysip/headers/tsip_header_P_DCS_LAES.h | 4 +- .../tinysip/headers/tsip_header_P_DCS_OSPS.h | 4 +- .../headers/tsip_header_P_DCS_Redirect.h | 4 +- .../tsip_header_P_DCS_Trace_Party_ID.h | 4 +- .../headers/tsip_header_P_Early_Media.h | 4 +- .../tsip_header_P_Media_Authorization.h | 4 +- .../tsip_header_P_Preferred_Identity.h | 4 +- .../headers/tsip_header_P_Profile_Key.h | 4 +- .../headers/tsip_header_P_User_Database.h | 4 +- .../tsip_header_P_Visited_Network_ID.h | 4 +- .../tinysip/headers/tsip_header_Path.h | 4 +- .../tinysip/headers/tsip_header_Priority.h | 4 +- .../tinysip/headers/tsip_header_Privacy.h | 4 +- .../headers/tsip_header_Proxy_Authenticate.h | 4 +- .../headers/tsip_header_Proxy_Authorization.h | 4 +- .../headers/tsip_header_Proxy_Require.h | 4 +- .../tinysip/headers/tsip_header_RAck.h | 4 +- .../tinysip/headers/tsip_header_RSeq.h | 4 +- .../tinysip/headers/tsip_header_Reason.h | 4 +- .../headers/tsip_header_Record_Route.h | 4 +- .../tinysip/headers/tsip_header_Refer_Sub.h | 4 +- .../tinysip/headers/tsip_header_Refer_To.h | 4 +- .../tinysip/headers/tsip_header_Referred_By.h | 4 +- .../headers/tsip_header_Reject_Contact.h | 4 +- .../tinysip/headers/tsip_header_Replaces.h | 4 +- .../tinysip/headers/tsip_header_Reply_To.h | 4 +- .../headers/tsip_header_Request_Disposition.h | 4 +- .../tinysip/headers/tsip_header_Require.h | 4 +- .../headers/tsip_header_Resource_Priority.h | 4 +- .../tinysip/headers/tsip_header_Retry_After.h | 4 +- .../tinysip/headers/tsip_header_Route.h | 4 +- .../tinysip/headers/tsip_header_SIP_ETag.h | 4 +- .../headers/tsip_header_SIP_If_Match.h | 4 +- .../headers/tsip_header_Security_Client.h | 2 +- .../headers/tsip_header_Security_Server.h | 2 +- .../headers/tsip_header_Security_Verify.h | 2 +- .../tinysip/headers/tsip_header_Server.h | 4 +- .../headers/tsip_header_Service_Route.h | 4 +- .../headers/tsip_header_Session_Expires.h | 4 +- .../tinysip/headers/tsip_header_Subject.h | 4 +- .../headers/tsip_header_Subscription_State.h | 4 +- .../tinysip/headers/tsip_header_Supported.h | 4 +- .../headers/tsip_header_Target_Dialog.h | 4 +- .../tinysip/headers/tsip_header_Timestamp.h | 4 +- .../include/tinysip/headers/tsip_header_To.h | 4 +- .../tinysip/headers/tsip_header_Unsupported.h | 4 +- .../tinysip/headers/tsip_header_User_Agent.h | 4 +- .../include/tinysip/headers/tsip_header_Via.h | 4 +- .../headers/tsip_header_WWW_Authenticate.h | 4 +- .../tinysip/headers/tsip_header_Warning.h | 4 +- .../tinysip/headers/tsip_header_accept.h | 4 +- .../include/tinysip/headers/tsip_headers.h | 4 +- .../tinysip/parsers/tsip_parser_header.h | 4 +- .../tinysip/parsers/tsip_parser_message.h | 4 +- .../include/tinysip/parsers/tsip_parser_uri.h | 4 +- .../include/tinysip/sigcomp/tsip_sigcomp.h | 4 +- .../tinysip/transactions/tsip_transac.h | 4 +- .../tinysip/transactions/tsip_transac_ict.h | 4 +- .../tinysip/transactions/tsip_transac_ist.h | 4 +- .../tinysip/transactions/tsip_transac_layer.h | 4 +- .../tinysip/transactions/tsip_transac_nict.h | 4 +- .../tinysip/transactions/tsip_transac_nist.h | 4 +- .../tinysip/transports/tsip_transport.h | 4 +- .../tinysip/transports/tsip_transport_ipsec.h | 4 +- .../tinysip/transports/tsip_transport_layer.h | 4 +- .../tinysip/transports/tsip_transport_tls.h | 4 +- .../tinySIP/include/tinysip/tsip_action.h | 4 +- .../tinySIP/include/tinysip/tsip_event.h | 4 +- .../tinySIP/include/tinysip/tsip_message.h | 4 +- .../include/tinysip/tsip_message_common.h | 4 +- .../tinySIP/include/tinysip/tsip_ssession.h | 18 +- .../tinySIP/include/tinysip/tsip_timers.h | 4 +- .../tinySIP/include/tinysip/tsip_uri.h | 4 +- .../doubango/tinySIP/include/tinysip_config.h | 2 +- branches/2.0/doubango/tinySIP/include/tsip.h | 4 +- .../tinySIP/ragel/tsip_machine_header.rl | 4 +- .../tinySIP/ragel/tsip_machine_message.rl | 4 +- .../tinySIP/ragel/tsip_machine_utils.rl | 4 +- .../tinySIP/ragel/tsip_parser_header.rl | 90 +- .../tinySIP/ragel/tsip_parser_header_Allow.rl | 4 +- .../ragel/tsip_parser_header_Allow_Events.rl | 4 +- .../ragel/tsip_parser_header_Authorization.rl | 4 +- .../tinySIP/ragel/tsip_parser_header_CSeq.rl | 4 +- .../ragel/tsip_parser_header_Call_ID.rl | 4 +- .../ragel/tsip_parser_header_Contact.rl | 4 +- .../tsip_parser_header_Content_Length.rl | 4 +- .../ragel/tsip_parser_header_Content_Type.rl | 4 +- .../tinySIP/ragel/tsip_parser_header_Date.rl | 4 +- .../tinySIP/ragel/tsip_parser_header_Dummy.rl | 4 +- .../tinySIP/ragel/tsip_parser_header_Event.rl | 4 +- .../ragel/tsip_parser_header_Expires.rl | 4 +- .../tinySIP/ragel/tsip_parser_header_From.rl | 4 +- .../ragel/tsip_parser_header_Max_Forwards.rl | 4 +- .../ragel/tsip_parser_header_Min_Expires.rl | 4 +- .../ragel/tsip_parser_header_Min_SE.rl | 4 +- ...sip_parser_header_P_Access_Network_Info.rl | 4 +- .../tsip_parser_header_P_Asserted_Identity.rl | 4 +- .../tsip_parser_header_P_Associated_URI.rl | 4 +- ...er_header_P_Charging_Function_Addresses.rl | 4 +- ...tsip_parser_header_P_Preferred_Identity.rl | 4 +- .../tinySIP/ragel/tsip_parser_header_Path.rl | 4 +- .../ragel/tsip_parser_header_Privacy.rl | 4 +- .../tsip_parser_header_Proxy_Authenticate.rl | 4 +- .../tsip_parser_header_Proxy_Authorization.rl | 4 +- .../ragel/tsip_parser_header_Proxy_Require.rl | 4 +- .../tinySIP/ragel/tsip_parser_header_RAck.rl | 4 +- .../tinySIP/ragel/tsip_parser_header_RSeq.rl | 4 +- .../ragel/tsip_parser_header_Record_Route.rl | 4 +- .../ragel/tsip_parser_header_Refer_Sub.rl | 4 +- .../ragel/tsip_parser_header_Refer_To.rl | 4 +- .../ragel/tsip_parser_header_Referred_By.rl | 4 +- .../ragel/tsip_parser_header_Require.rl | 4 +- .../tinySIP/ragel/tsip_parser_header_Route.rl | 4 +- .../ragel/tsip_parser_header_SIP_ETag.rl | 4 +- .../ragel/tsip_parser_header_SIP_If_Match.rl | 4 +- .../tsip_parser_header_Security_Client.rl | 4 +- .../tsip_parser_header_Security_Server.rl | 4 +- .../tsip_parser_header_Security_Verify.rl | 4 +- .../ragel/tsip_parser_header_Server.rl | 4 +- .../ragel/tsip_parser_header_Service_Route.rl | 4 +- .../tsip_parser_header_Session_Expires.rl | 4 +- .../tsip_parser_header_Subscription_State.rl | 4 +- .../ragel/tsip_parser_header_Supported.rl | 4 +- .../tinySIP/ragel/tsip_parser_header_To.rl | 4 +- .../ragel/tsip_parser_header_User_Agent.rl | 4 +- .../tinySIP/ragel/tsip_parser_header_Via.rl | 4 +- .../tsip_parser_header_WWW_Authenticate.rl | 4 +- .../ragel/tsip_parser_header_Warning.rl | 4 +- .../tinySIP/ragel/tsip_parser_message.rl | 4 +- .../doubango/tinySIP/ragel/tsip_parser_uri.rl | 4 +- .../tinySIP/src/api/tsip_api_common.c | 4 +- .../doubango/tinySIP/src/api/tsip_api_info.c | 2 +- .../tinySIP/src/api/tsip_api_invite.c | 14 +- .../tinySIP/src/api/tsip_api_message.c | 4 +- .../tinySIP/src/api/tsip_api_options.c | 4 +- .../tinySIP/src/api/tsip_api_publish.c | 4 +- .../tinySIP/src/api/tsip_api_register.c | 4 +- .../tinySIP/src/api/tsip_api_subscribe.c | 4 +- .../src/authentication/tsip_challenge.c | 4 +- .../src/authentication/tsip_milenage.c | 2 +- .../src/authentication/tsip_rijndael.c | 2 +- .../tinySIP/src/dialogs/tsip_dialog.c | 17 +- .../tinySIP/src/dialogs/tsip_dialog_info.c | 3 +- .../tinySIP/src/dialogs/tsip_dialog_invite.c | 121 +- .../src/dialogs/tsip_dialog_invite.client.c | 27 +- .../src/dialogs/tsip_dialog_invite.ect.c | 22 +- .../src/dialogs/tsip_dialog_invite.hold.c | 10 +- .../src/dialogs/tsip_dialog_invite.ice.c | 471 + .../src/dialogs/tsip_dialog_invite.qos.c | 4 +- .../src/dialogs/tsip_dialog_invite.server.c | 40 +- .../src/dialogs/tsip_dialog_invite.timers.c | 4 +- .../tinySIP/src/dialogs/tsip_dialog_layer.c | 10 +- .../tinySIP/src/dialogs/tsip_dialog_message.c | 8 +- .../tinySIP/src/dialogs/tsip_dialog_options.c | 8 +- .../src/dialogs/tsip_dialog_publish.client.c | 20 +- .../src/dialogs/tsip_dialog_register.c | 14 +- .../src/dialogs/tsip_dialog_register.client.c | 14 +- .../src/dialogs/tsip_dialog_register.server.c | 8 +- .../dialogs/tsip_dialog_subscribe.client.c | 20 +- .../tinySIP/src/headers/tsip_header.c | 4 +- .../tinySIP/src/headers/tsip_header_Allow.c | 4 +- .../src/headers/tsip_header_Allow_Events.c | 4 +- .../src/headers/tsip_header_Authorization.c | 4 +- .../tinySIP/src/headers/tsip_header_CSeq.c | 4 +- .../tinySIP/src/headers/tsip_header_Call_ID.c | 4 +- .../tinySIP/src/headers/tsip_header_Contact.c | 4 +- .../src/headers/tsip_header_Content_Length.c | 4 +- .../src/headers/tsip_header_Content_Type.c | 4 +- .../tinySIP/src/headers/tsip_header_Date.c | 4 +- .../tinySIP/src/headers/tsip_header_Dummy.c | 4 +- .../tinySIP/src/headers/tsip_header_Event.c | 4 +- .../tinySIP/src/headers/tsip_header_Expires.c | 4 +- .../tinySIP/src/headers/tsip_header_From.c | 4 +- .../src/headers/tsip_header_Max_Forwards.c | 4 +- .../src/headers/tsip_header_Min_Expires.c | 4 +- .../tinySIP/src/headers/tsip_header_Min_SE.c | 4 +- .../tsip_header_P_Access_Network_Info.c | 4 +- .../headers/tsip_header_P_Asserted_Identity.c | 4 +- .../headers/tsip_header_P_Associated_URI.c | 4 +- ...sip_header_P_Charging_Function_Addresses.c | 4 +- .../tsip_header_P_Preferred_Identity.c | 4 +- .../tinySIP/src/headers/tsip_header_Path.c | 4 +- .../tinySIP/src/headers/tsip_header_Privacy.c | 4 +- .../headers/tsip_header_Proxy_Authenticate.c | 4 +- .../headers/tsip_header_Proxy_Authorization.c | 4 +- .../src/headers/tsip_header_Proxy_Require.c | 4 +- .../tinySIP/src/headers/tsip_header_RAck.c | 4 +- .../tinySIP/src/headers/tsip_header_RSeq.c | 4 +- .../src/headers/tsip_header_Record_Route.c | 4 +- .../src/headers/tsip_header_Refer_Sub.c | 4 +- .../src/headers/tsip_header_Refer_To.c | 4 +- .../src/headers/tsip_header_Referred_By.c | 4 +- .../tinySIP/src/headers/tsip_header_Require.c | 4 +- .../tinySIP/src/headers/tsip_header_Route.c | 4 +- .../src/headers/tsip_header_SIP_ETag.c | 4 +- .../src/headers/tsip_header_SIP_If_Match.c | 4 +- .../src/headers/tsip_header_Security_Client.c | 4 +- .../src/headers/tsip_header_Security_Server.c | 4 +- .../src/headers/tsip_header_Security_Verify.c | 4 +- .../tinySIP/src/headers/tsip_header_Server.c | 4 +- .../src/headers/tsip_header_Service_Route.c | 4 +- .../src/headers/tsip_header_Session_Expires.c | 4 +- .../headers/tsip_header_Subscription_State.c | 4 +- .../src/headers/tsip_header_Supported.c | 4 +- .../tinySIP/src/headers/tsip_header_To.c | 4 +- .../src/headers/tsip_header_User_Agent.c | 4 +- .../tinySIP/src/headers/tsip_header_Via.c | 4 +- .../headers/tsip_header_WWW_Authenticate.c | 4 +- .../tinySIP/src/headers/tsip_header_Warning.c | 4 +- .../tinySIP/src/headers/tsip_header_accept.c | 4 +- .../tinySIP/src/parsers/tsip_parser_header.c | 92 +- .../tinySIP/src/parsers/tsip_parser_message.c | 4 +- .../tinySIP/src/parsers/tsip_parser_uri.c | 4 +- .../tinySIP/src/sigcomp/tsip_sigcomp.c | 4 +- .../tinySIP/src/transactions/tsip_transac.c | 4 +- .../src/transactions/tsip_transac_ict.c | 4 +- .../src/transactions/tsip_transac_ist.c | 42 +- .../src/transactions/tsip_transac_layer.c | 4 +- .../src/transactions/tsip_transac_nict.c | 4 +- .../src/transactions/tsip_transac_nist.c | 4 +- .../tinySIP/src/transports/tsip_transport.c | 4 +- .../src/transports/tsip_transport_ipsec.c | 4 +- .../src/transports/tsip_transport_layer.c | 4 +- branches/2.0/doubango/tinySIP/src/tsip.c | 6 +- .../2.0/doubango/tinySIP/src/tsip_action.c | 4 +- .../2.0/doubango/tinySIP/src/tsip_event.c | 6 +- .../2.0/doubango/tinySIP/src/tsip_message.c | 4 +- .../2.0/doubango/tinySIP/src/tsip_ssession.c | 21 +- .../2.0/doubango/tinySIP/src/tsip_timers.c | 4 +- branches/2.0/doubango/tinySIP/src/tsip_uri.c | 4 +- branches/2.0/doubango/tinySIP/test/stdafx.c | 2 +- branches/2.0/doubango/tinySIP/test/stdafx.h | 2 +- branches/2.0/doubango/tinySIP/test/test.c | 2 +- .../2.0/doubango/tinySIP/test/test_imsaka.h | 2 +- .../doubango/tinySIP/test/test_sipmessages.h | 2 +- .../2.0/doubango/tinySIP/test/test_stack.h | 2 +- .../2.0/doubango/tinySIP/test/test_transac.h | 2 +- branches/2.0/doubango/tinySIP/test/test_uri.h | 2 +- branches/2.0/doubango/tinySIP/tinySIP.sln | 39 + branches/2.0/doubango/tinySIP/tinySIP.vcproj | 4 + .../2.0/doubango/website/Doubango_Layers.png | Bin 0 -> 83207 bytes 1141 files changed, 29725 insertions(+), 16692 deletions(-) create mode 100644 branches/2.0/doubango/bindings/csharp/tmedia_pref_video_size_t.cs create mode 100644 branches/2.0/doubango/bindings/csharp/tmedia_profile_t.cs create mode 100644 branches/2.0/doubango/bindings/java/android/tmedia_pref_video_size_t.java create mode 100644 branches/2.0/doubango/bindings/java/android/tmedia_profile_t.java create mode 100644 branches/2.0/doubango/bindings/java/tmedia_pref_video_size_t.java create mode 100644 branches/2.0/doubango/bindings/java/tmedia_profile_t.java create mode 100644 branches/2.0/doubango/documentation/Doubango_Layers.png create mode 100644 branches/2.0/doubango/tinyDAV/include/tinydav/codecs/fec/tdav_codec_red.h create mode 100644 branches/2.0/doubango/tinyDAV/include/tinydav/codecs/fec/tdav_codec_ulpfec.h create mode 100644 branches/2.0/doubango/tinyDAV/include/tinydav/tdav_session_av.h create mode 100644 branches/2.0/doubango/tinyDAV/include/tinydav/video/jb/tdav_video_frame.h create mode 100644 branches/2.0/doubango/tinyDAV/include/tinydav/video/jb/tdav_video_jb.h delete mode 100644 branches/2.0/doubango/tinyDAV/include/tinydav/video/tdav_video_jitterbuffer.h create mode 100644 branches/2.0/doubango/tinyDAV/src/codecs/fec/tdav_codec_red.c create mode 100644 branches/2.0/doubango/tinyDAV/src/codecs/fec/tdav_codec_ulpfec.c create mode 100644 branches/2.0/doubango/tinyDAV/src/tdav_session_av.c create mode 100644 branches/2.0/doubango/tinyDAV/src/video/jb/tdav_video_frame.c create mode 100644 branches/2.0/doubango/tinyDAV/src/video/jb/tdav_video_jb.c delete mode 100644 branches/2.0/doubango/tinyDAV/src/video/tdav_video_jitterbuffer.c create mode 100644 branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_imageattr.h create mode 100644 branches/2.0/doubango/tinyMEDIA/ragel/tmedia_imageattr.rl create mode 100644 branches/2.0/doubango/tinyMEDIA/src/tmedia_imageattr.c create mode 100644 branches/2.0/doubango/tinyMEDIA/test/test_image_attr.h create mode 100644 branches/2.0/doubango/tinyNET/src/ice/tnet_ice_candidate.c create mode 100644 branches/2.0/doubango/tinyNET/src/ice/tnet_ice_candidate.h create mode 100644 branches/2.0/doubango/tinyNET/src/ice/tnet_ice_ctx.c create mode 100644 branches/2.0/doubango/tinyNET/src/ice/tnet_ice_ctx.h create mode 100644 branches/2.0/doubango/tinyNET/src/ice/tnet_ice_event.c create mode 100644 branches/2.0/doubango/tinyNET/src/ice/tnet_ice_event.h create mode 100644 branches/2.0/doubango/tinyNET/src/ice/tnet_ice_pair.c create mode 100644 branches/2.0/doubango/tinyNET/src/ice/tnet_ice_pair.h create mode 100644 branches/2.0/doubango/tinyNET/src/ice/tnet_ice_utils.c create mode 100644 branches/2.0/doubango/tinyNET/src/ice/tnet_ice_utils.h create mode 100644 branches/2.0/doubango/tinyNET/test/test_ice.h create mode 100644 branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_bye.h create mode 100644 branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_fb.h create mode 100644 branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_bye.c create mode 100644 branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_fb.c create mode 100644 branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.ice.c create mode 100644 branches/2.0/doubango/website/Doubango_Layers.png diff --git a/branches/2.0/doubango/android-projects/root.mk b/branches/2.0/doubango/android-projects/root.mk index 82441bea..818287b4 100644 --- a/branches/2.0/doubango/android-projects/root.mk +++ b/branches/2.0/doubango/android-projects/root.mk @@ -61,7 +61,7 @@ export CFLAGS_COMMON=$(CFLAGS) $(DEBUG_FLAGS) -I$(ANDROID_NDK_BASE)/$(ANDROID_PL -MMD \ -MP \ -fno-short-enums \ --DANDROID +-DANDROID=1 ifeq ($(NEON), yes) export MARCH=armv7-a @@ -76,9 +76,7 @@ export CFLAGS_LIB= $(CFLAGS_COMMON) \ -Os \ -fomit-frame-pointer \ -fno-strict-aliasing \ --finline-limit=64 \ --DANDROID -#-mthumb +-finline-limit=64 export LDFLAGS_COMMON=$(LDFLAGS) -Wl,-rpath=/system/lib,-rpath-link=$(ANDROID_NDK_BASE)/$(ANDROID_PLATFORM)/arch-arm/usr/lib,-rpath-link=$(OUTPUT_DIR),-dynamic-linker=/system/bin/linker,-T,$(ANDROID_NDK_TOOL_BASE)/arm-eabi/lib/ldscripts/armelf.xsc -L$(ANDROID_NDK_BASE)/$(ANDROID_PLATFORM)/arch-arm/usr/lib export LDFLAGS_COMMON+=-nostdlib -lc -ldl -L$(OUTPUT_DIR) diff --git a/branches/2.0/doubango/bindings/_common/MediaSessionMgr.cxx b/branches/2.0/doubango/bindings/_common/MediaSessionMgr.cxx index becdf903..6d2e62af 100644 --- a/branches/2.0/doubango/bindings/_common/MediaSessionMgr.cxx +++ b/branches/2.0/doubango/bindings/_common/MediaSessionMgr.cxx @@ -123,18 +123,18 @@ const ProxyPlugin* MediaSessionMgr::findProxyPlugin(twrap_media_type_t media, bo if(session){ if(session->plugin == tdav_session_audio_plugin_def_t){ if(consumer){ - plugin = manager->findPlugin(TDAV_SESSION_AUDIO(session)->consumer); + plugin = manager->findPlugin(TDAV_SESSION_AV(session)->consumer); } else{ - plugin = manager->findPlugin(TDAV_SESSION_AUDIO(session)->producer); + plugin = manager->findPlugin(TDAV_SESSION_AV(session)->producer); } } else if(session->plugin == tdav_session_video_plugin_def_t){ if(consumer){ - plugin = manager->findPlugin(TDAV_SESSION_VIDEO(session)->consumer); + plugin = manager->findPlugin(TDAV_SESSION_AV(session)->consumer); } else{ - plugin = manager->findPlugin(TDAV_SESSION_VIDEO(session)->producer); + plugin = manager->findPlugin(TDAV_SESSION_AV(session)->producer); } } else{ @@ -176,6 +176,16 @@ uint64_t MediaSessionMgr::getSessionId(twrap_media_type_t media)const return id; } +bool MediaSessionMgr::defaultsSetProfile(tmedia_profile_t profile) +{ + return (tmedia_defaults_set_profile(profile) == 0); +} + +tmedia_profile_t MediaSessionMgr::defaultsGetProfile() +{ + return tmedia_defaults_get_profile(); +} + bool MediaSessionMgr::defaultsSetBandwidthLevel(tmedia_bandwidth_level_t bl) { return tmedia_defaults_set_bl(bl) == 0; @@ -186,6 +196,11 @@ tmedia_bandwidth_level_t MediaSessionMgr::defaultsGetBandwidthLevel() return tmedia_defaults_get_bl(); } +bool MediaSessionMgr::defaultsSetPrefVideoSize(tmedia_pref_video_size_t pref_video_size) +{ + return tmedia_defaults_set_pref_video_size(pref_video_size) == 0; +} + bool MediaSessionMgr::defaultsSetJbMargin(uint32_t jb_margin_ms) { return tmedia_defaults_set_jb_margin(jb_margin_ms) == 0; @@ -315,4 +330,8 @@ bool MediaSessionMgr::defaultsSetInviteSessionTimers(int32_t timeout, const char bool MediaSessionMgr::defaultsSetSRtpMode(tmedia_srtp_mode_t mode){ return (tmedia_defaults_set_srtp_mode(mode) == 0); +} + +bool MediaSessionMgr::defaultsSetIceEnabled(bool ice_enabled){ + return (tmedia_defaults_set_ice_enabled(ice_enabled ? tsk_true : tsk_false) == 0); } \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/_common/MediaSessionMgr.h b/branches/2.0/doubango/bindings/_common/MediaSessionMgr.h index 29a1fdcd..d89645ef 100644 --- a/branches/2.0/doubango/bindings/_common/MediaSessionMgr.h +++ b/branches/2.0/doubango/bindings/_common/MediaSessionMgr.h @@ -59,8 +59,11 @@ public: uint64_t getSessionId(twrap_media_type_t media)const; // Defaults - static bool defaultsSetBandwidthLevel(tmedia_bandwidth_level_t bl); - static tmedia_bandwidth_level_t defaultsGetBandwidthLevel(); + static bool defaultsSetProfile(tmedia_profile_t profile); + static tmedia_profile_t defaultsGetProfile(); + static bool defaultsSetBandwidthLevel(tmedia_bandwidth_level_t bl); // @deprecated + static tmedia_bandwidth_level_t defaultsGetBandwidthLevel(); // @deprecated + static bool defaultsSetPrefVideoSize(tmedia_pref_video_size_t pref_video_size); static bool defaultsSetJbMargin(uint32_t jb_margin_ms); static bool defaultsSetJbMaxLateRate(uint32_t jb_late_rate_percent); static bool defaultsSetEchoTail(uint32_t echo_tail); @@ -88,6 +91,7 @@ public: static int32_t defaultsGetVolume(); static bool defaultsSetInviteSessionTimers(int32_t timeout, const char* refresher); static bool defaultsSetSRtpMode(tmedia_srtp_mode_t mode); + static bool defaultsSetIceEnabled(bool ice_enabled); private: tmedia_session_mgr_t* m_pWrappedMgr; diff --git a/branches/2.0/doubango/bindings/_common/ProxyProducer.cxx b/branches/2.0/doubango/bindings/_common/ProxyProducer.cxx index aa472d95..e0295a85 100644 --- a/branches/2.0/doubango/bindings/_common/ProxyProducer.cxx +++ b/branches/2.0/doubango/bindings/_common/ProxyProducer.cxx @@ -477,10 +477,15 @@ int ProxyVideoProducer::push(const void* pBuffer, unsigned nSize) } // send() "as is" +// only used by telepresence system with a H.264 SVC hardaware encoder int ProxyVideoProducer::send(const void* pBuffer, unsigned nSize, unsigned nDuration, bool bMarker) { if(m_pWrappedPlugin && TMEDIA_PRODUCER(m_pWrappedPlugin)->raw_cb.callback){ - return TMEDIA_PRODUCER(m_pWrappedPlugin)->raw_cb.callback(TMEDIA_PRODUCER(m_pWrappedPlugin)->raw_cb.callback_data, pBuffer, nSize, nDuration, bMarker); + TMEDIA_PRODUCER(m_pWrappedPlugin)->raw_cb.chunck_curr.buffer.ptr = pBuffer; + TMEDIA_PRODUCER(m_pWrappedPlugin)->raw_cb.chunck_curr.buffer.size = nSize; + TMEDIA_PRODUCER(m_pWrappedPlugin)->raw_cb.chunck_curr.duration = nDuration; + TMEDIA_PRODUCER(m_pWrappedPlugin)->raw_cb.chunck_curr.last_chunck = (bMarker == true); + return TMEDIA_PRODUCER(m_pWrappedPlugin)->raw_cb.callback(&TMEDIA_PRODUCER(m_pWrappedPlugin)->raw_cb.chunck_curr); } return 0; } diff --git a/branches/2.0/doubango/bindings/_common/SipSession.cxx b/branches/2.0/doubango/bindings/_common/SipSession.cxx index 44b21dfd..b6d48017 100644 --- a/branches/2.0/doubango/bindings/_common/SipSession.cxx +++ b/branches/2.0/doubango/bindings/_common/SipSession.cxx @@ -538,6 +538,26 @@ bool CallSession::set100rel(bool enabled) } } +bool CallSession::setICE(bool enabled) +{ + if(enabled){ + return (tsip_ssession_set(m_pHandle, + TSIP_SSESSION_SET_MEDIA( + TSIP_MSESSION_SET_ICE(), + TSIP_MSESSION_SET_NULL() + ), + TSIP_SSESSION_SET_NULL()) == 0); + } + else{ + return (tsip_ssession_set(m_pHandle, + TSIP_SSESSION_SET_MEDIA( + TSIP_MSESSION_UNSET_ICE(), + TSIP_MSESSION_SET_NULL() + ), + TSIP_SSESSION_SET_NULL()) == 0); + } +} + bool CallSession::setQoS(tmedia_qos_stype_t type, tmedia_qos_strength_t strength) { return (tsip_ssession_set(m_pHandle, diff --git a/branches/2.0/doubango/bindings/_common/SipSession.h b/branches/2.0/doubango/bindings/_common/SipSession.h index 316fb2d3..3661aa43 100644 --- a/branches/2.0/doubango/bindings/_common/SipSession.h +++ b/branches/2.0/doubango/bindings/_common/SipSession.h @@ -111,6 +111,7 @@ public: /* Public functions */ bool callVideo(const SipUri* remoteUri, ActionConfig* config=tsk_null); bool setSessionTimer(unsigned timeout, const char* refresher); bool set100rel(bool enabled); + bool setICE(bool enabled); bool setQoS(tmedia_qos_stype_t type, tmedia_qos_strength_t strength); bool hold(ActionConfig* config=tsk_null); bool resume(ActionConfig* config=tsk_null); diff --git a/branches/2.0/doubango/bindings/_common/SipStack.i b/branches/2.0/doubango/bindings/_common/SipStack.i index 6c760b40..0402a654 100644 --- a/branches/2.0/doubango/bindings/_common/SipStack.i +++ b/branches/2.0/doubango/bindings/_common/SipStack.i @@ -210,33 +210,6 @@ typedef enum tsip_invite_event_type_e tsip_invite_event_type_t; - -/* ====== From "tinymedia/tmedia_common.h" ====== */ -// used by tinyWRAP -typedef enum tmedia_chroma_e -{ - tmedia_chroma_none=0, - tmedia_chroma_rgb24, // will be stored as bgr24 on x86 (little endians) machines; e.g. WindowsPhone7 - tmedia_chroma_bgr24, // used by windows consumer (DirectShow) - - tmedia_chroma_rgb32, // used by iOS4 consumer (iPhone and iPod touch) - tmedia_chroma_rgb565le, // (used by both android and wince consumers) - tmedia_chroma_rgb565be, - tmedia_chroma_nv12, // used by iOS4 producer (iPhone and iPod Touch 3GS and 4) - tmedia_chroma_nv21, // Yuv420 SP (used by android producer) - tmedia_chroma_yuv422p, - tmedia_chroma_uyvy422, // used by iOS4 producer (iPhone and iPod Touch 3G) - tmedia_chroma_yuv420p, // Default -} -tmedia_chroma_t; - -typedef enum tmedia_srtp_mode_e -{ - tmedia_srtp_mode_none, - tmedia_srtp_mode_optional, - tmedia_srtp_mode_mandatory -} -tmedia_srtp_mode_t; - /* ====== From "tinymedia/tmedia_qos.h" ====== */ typedef enum tmedia_qos_stype_e { @@ -259,7 +232,44 @@ typedef enum tmedia_qos_strength_e } tmedia_qos_strength_t; + /* ====== From "tinymedia/tmedia_common.h" ====== */ +// used by tinyWRAP +typedef enum tmedia_chroma_e +{ + tmedia_chroma_none=0, + tmedia_chroma_rgb24, // will be stored as bgr24 on x86 (little endians) machines; e.g. WindowsPhone7 + tmedia_chroma_bgr24, // used by windows consumer (DirectShow) - + tmedia_chroma_rgb32, // used by iOS4 consumer (iPhone and iPod touch) + tmedia_chroma_rgb565le, // (used by both android and wince consumers) + tmedia_chroma_rgb565be, + tmedia_chroma_nv12, // used by iOS4 producer (iPhone and iPod Touch 3GS and 4) + tmedia_chroma_nv21, // Yuv420 SP (used by android producer) + tmedia_chroma_yuv422p, + tmedia_chroma_uyvy422, // used by iOS4 producer (iPhone and iPod Touch 3G) + tmedia_chroma_yuv420p, // Default +} +tmedia_chroma_t; + +/* ====== From "tinymedia/tmedia_common.h" ====== */ +typedef enum tmedia_srtp_mode_e +{ + tmedia_srtp_mode_none, + tmedia_srtp_mode_optional, + tmedia_srtp_mode_mandatory +} +tmedia_srtp_mode_t; + +/* ====== From "tinymedia/tmedia_common.h" ====== */ +typedef enum tmedia_profile_e +{ + tmedia_profile_default, + tmedia_profile_rtcweb +} +tmedia_profile_t; + +/* ====== From "tinymedia/tmedia_common.h" ====== */ +// @deprecated typedef enum tmedia_bandwidth_level_e { tmedia_bl_low, @@ -269,6 +279,24 @@ typedef enum tmedia_bandwidth_level_e } tmedia_bandwidth_level_t; +/* ====== From "tinymedia/tmedia_common.h" ====== */ +typedef enum tmedia_pref_video_size_s +{ /* must be sorted like this */ + tmedia_pref_video_size_sqcif, // 128 x 98 + tmedia_pref_video_size_qcif, // 176 x 144 + tmedia_pref_video_size_qvga, // 320 x 240 + tmedia_pref_video_size_cif, // 352 x 288 + tmedia_pref_video_size_hvga, // 480 x 320 + tmedia_pref_video_size_vga, // 640 x 480 + tmedia_pref_video_size_4cif, // 704 x 576 + tmedia_pref_video_size_svga, // 800 x 600 + tmedia_pref_video_size_480p, // 852 x 480 + tmedia_pref_video_size_720p, // 1280 x 720 + tmedia_pref_video_size_16cif, // 1408 x 1152 + tmedia_pref_video_size_1080p, // 1920 x 1080 +} +tmedia_pref_video_size_t; + /* ====== From "tinydav/tdav.h" ====== */ typedef enum tdav_codec_id_e @@ -298,9 +326,12 @@ typedef enum tdav_codec_id_e tdav_codec_id_h263 = 0x00010000<<1, tdav_codec_id_h263p = 0x00010000<<2, tdav_codec_id_h263pp = 0x00010000<<3, - tdav_codec_id_h264_bp10 = 0x00010000<<4, - tdav_codec_id_h264_bp20 = 0x00010000<<5, - tdav_codec_id_h264_bp30 = 0x00010000<<6, + tdav_codec_id_h264_bp = 0x00010000<<4, + tdav_codec_id_h264_mp = 0x00010000<<5, + tdav_codec_id_h264_hp = 0x00010000<<6, + tdav_codec_id_h264_bp10 = tdav_codec_id_h264_bp, // @deprecated + tdav_codec_id_h264_bp20 = tdav_codec_id_h264_bp, // @deprecated + tdav_codec_id_h264_bp30 = tdav_codec_id_h264_bp, // @deprecated tdav_codec_id_h264_svc = 0x00010000<<7, tdav_codec_id_theora = 0x00010000<<8, tdav_codec_id_mp4ves_es = 0x00010000<<9, diff --git a/branches/2.0/doubango/bindings/csharp/ActionConfig.cs b/branches/2.0/doubango/bindings/csharp/ActionConfig.cs index 3a32e7e2..dccd50de 100644 --- a/branches/2.0/doubango/bindings/csharp/ActionConfig.cs +++ b/branches/2.0/doubango/bindings/csharp/ActionConfig.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class ActionConfig : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_ActionConfig(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_ActionConfig(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/AudioResampler.cs b/branches/2.0/doubango/bindings/csharp/AudioResampler.cs index ea67e76f..5342645c 100644 --- a/branches/2.0/doubango/bindings/csharp/AudioResampler.cs +++ b/branches/2.0/doubango/bindings/csharp/AudioResampler.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class AudioResampler : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_AudioResampler(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_AudioResampler(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/CallSession.cs b/branches/2.0/doubango/bindings/csharp/CallSession.cs index e11d1fbb..99c50892 100644 --- a/branches/2.0/doubango/bindings/csharp/CallSession.cs +++ b/branches/2.0/doubango/bindings/csharp/CallSession.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class CallSession : InviteSession { private HandleRef swigCPtr; - internal CallSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.CallSessionUpcast(cPtr), cMemoryOwn) { + internal CallSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.CallSession_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class CallSession : InviteSession { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_CallSession(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_CallSession(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } @@ -111,6 +113,11 @@ public class CallSession : InviteSession { return ret; } + public bool setICE(bool enabled) { + bool ret = tinyWRAPPINVOKE.CallSession_setICE(swigCPtr, enabled); + return ret; + } + public bool setQoS(tmedia_qos_stype_t type, tmedia_qos_strength_t strength) { bool ret = tinyWRAPPINVOKE.CallSession_setQoS(swigCPtr, (int)type, (int)strength); return ret; diff --git a/branches/2.0/doubango/bindings/csharp/DDebugCallback.cs b/branches/2.0/doubango/bindings/csharp/DDebugCallback.cs index eef4626d..a9274372 100644 --- a/branches/2.0/doubango/bindings/csharp/DDebugCallback.cs +++ b/branches/2.0/doubango/bindings/csharp/DDebugCallback.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class DDebugCallback : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_DDebugCallback(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_DDebugCallback(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } @@ -44,22 +46,22 @@ public class DDebugCallback : IDisposable { } public virtual int OnDebugInfo(string message) { - int ret = ((this.GetType() == typeof(DDebugCallback)) ? tinyWRAPPINVOKE.DDebugCallback_OnDebugInfo(swigCPtr, message) : tinyWRAPPINVOKE.DDebugCallback_OnDebugInfoSwigExplicitDDebugCallback(swigCPtr, message)); + int ret = (SwigDerivedClassHasMethod("OnDebugInfo", swigMethodTypes0) ? tinyWRAPPINVOKE.DDebugCallback_OnDebugInfoSwigExplicitDDebugCallback(swigCPtr, message) : tinyWRAPPINVOKE.DDebugCallback_OnDebugInfo(swigCPtr, message)); return ret; } public virtual int OnDebugWarn(string message) { - int ret = ((this.GetType() == typeof(DDebugCallback)) ? tinyWRAPPINVOKE.DDebugCallback_OnDebugWarn(swigCPtr, message) : tinyWRAPPINVOKE.DDebugCallback_OnDebugWarnSwigExplicitDDebugCallback(swigCPtr, message)); + int ret = (SwigDerivedClassHasMethod("OnDebugWarn", swigMethodTypes1) ? tinyWRAPPINVOKE.DDebugCallback_OnDebugWarnSwigExplicitDDebugCallback(swigCPtr, message) : tinyWRAPPINVOKE.DDebugCallback_OnDebugWarn(swigCPtr, message)); return ret; } public virtual int OnDebugError(string message) { - int ret = ((this.GetType() == typeof(DDebugCallback)) ? tinyWRAPPINVOKE.DDebugCallback_OnDebugError(swigCPtr, message) : tinyWRAPPINVOKE.DDebugCallback_OnDebugErrorSwigExplicitDDebugCallback(swigCPtr, message)); + int ret = (SwigDerivedClassHasMethod("OnDebugError", swigMethodTypes2) ? tinyWRAPPINVOKE.DDebugCallback_OnDebugErrorSwigExplicitDDebugCallback(swigCPtr, message) : tinyWRAPPINVOKE.DDebugCallback_OnDebugError(swigCPtr, message)); return ret; } public virtual int OnDebugFatal(string message) { - int ret = ((this.GetType() == typeof(DDebugCallback)) ? tinyWRAPPINVOKE.DDebugCallback_OnDebugFatal(swigCPtr, message) : tinyWRAPPINVOKE.DDebugCallback_OnDebugFatalSwigExplicitDDebugCallback(swigCPtr, message)); + int ret = (SwigDerivedClassHasMethod("OnDebugFatal", swigMethodTypes3) ? tinyWRAPPINVOKE.DDebugCallback_OnDebugFatalSwigExplicitDDebugCallback(swigCPtr, message) : tinyWRAPPINVOKE.DDebugCallback_OnDebugFatal(swigCPtr, message)); return ret; } diff --git a/branches/2.0/doubango/bindings/csharp/DialogEvent.cs b/branches/2.0/doubango/bindings/csharp/DialogEvent.cs index e8bfc0dc..15dbe9d9 100644 --- a/branches/2.0/doubango/bindings/csharp/DialogEvent.cs +++ b/branches/2.0/doubango/bindings/csharp/DialogEvent.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class DialogEvent : SipEvent { private HandleRef swigCPtr; - internal DialogEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.DialogEventUpcast(cPtr), cMemoryOwn) { + internal DialogEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.DialogEvent_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class DialogEvent : SipEvent { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_DialogEvent(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_DialogEvent(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/InfoEvent.cs b/branches/2.0/doubango/bindings/csharp/InfoEvent.cs index f5ee2306..80c7e817 100644 --- a/branches/2.0/doubango/bindings/csharp/InfoEvent.cs +++ b/branches/2.0/doubango/bindings/csharp/InfoEvent.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class InfoEvent : SipEvent { private HandleRef swigCPtr; - internal InfoEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.InfoEventUpcast(cPtr), cMemoryOwn) { + internal InfoEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.InfoEvent_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class InfoEvent : SipEvent { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_InfoEvent(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_InfoEvent(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/InfoSession.cs b/branches/2.0/doubango/bindings/csharp/InfoSession.cs index c6433765..5c53a5cc 100644 --- a/branches/2.0/doubango/bindings/csharp/InfoSession.cs +++ b/branches/2.0/doubango/bindings/csharp/InfoSession.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class InfoSession : SipSession { private HandleRef swigCPtr; - internal InfoSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.InfoSessionUpcast(cPtr), cMemoryOwn) { + internal InfoSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.InfoSession_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class InfoSession : SipSession { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_InfoSession(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_InfoSession(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/InviteEvent.cs b/branches/2.0/doubango/bindings/csharp/InviteEvent.cs index 4c489d69..1487ce18 100644 --- a/branches/2.0/doubango/bindings/csharp/InviteEvent.cs +++ b/branches/2.0/doubango/bindings/csharp/InviteEvent.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class InviteEvent : SipEvent { private HandleRef swigCPtr; - internal InviteEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.InviteEventUpcast(cPtr), cMemoryOwn) { + internal InviteEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.InviteEvent_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class InviteEvent : SipEvent { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_InviteEvent(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_InviteEvent(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/InviteSession.cs b/branches/2.0/doubango/bindings/csharp/InviteSession.cs index 6711b67f..56a03662 100644 --- a/branches/2.0/doubango/bindings/csharp/InviteSession.cs +++ b/branches/2.0/doubango/bindings/csharp/InviteSession.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class InviteSession : SipSession { private HandleRef swigCPtr; - internal InviteSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.InviteSessionUpcast(cPtr), cMemoryOwn) { + internal InviteSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.InviteSession_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class InviteSession : SipSession { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_InviteSession(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_InviteSession(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/MediaContent.cs b/branches/2.0/doubango/bindings/csharp/MediaContent.cs index c4aca0aa..4fb8050e 100644 --- a/branches/2.0/doubango/bindings/csharp/MediaContent.cs +++ b/branches/2.0/doubango/bindings/csharp/MediaContent.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class MediaContent : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_MediaContent(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_MediaContent(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/MediaContentCPIM.cs b/branches/2.0/doubango/bindings/csharp/MediaContentCPIM.cs index 8bab1c81..85c94048 100644 --- a/branches/2.0/doubango/bindings/csharp/MediaContentCPIM.cs +++ b/branches/2.0/doubango/bindings/csharp/MediaContentCPIM.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class MediaContentCPIM : MediaContent { private HandleRef swigCPtr; - internal MediaContentCPIM(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.MediaContentCPIMUpcast(cPtr), cMemoryOwn) { + internal MediaContentCPIM(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.MediaContentCPIM_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class MediaContentCPIM : MediaContent { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_MediaContentCPIM(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_MediaContentCPIM(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/MediaSessionMgr.cs b/branches/2.0/doubango/bindings/csharp/MediaSessionMgr.cs index 2da2aecf..d32a7fdd 100644 --- a/branches/2.0/doubango/bindings/csharp/MediaSessionMgr.cs +++ b/branches/2.0/doubango/bindings/csharp/MediaSessionMgr.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class MediaSessionMgr : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_MediaSessionMgr(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_MediaSessionMgr(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } @@ -86,6 +88,16 @@ public class MediaSessionMgr : IDisposable { return ret; } + public static bool defaultsSetProfile(tmedia_profile_t profile) { + bool ret = tinyWRAPPINVOKE.MediaSessionMgr_defaultsSetProfile((int)profile); + return ret; + } + + public static tmedia_profile_t defaultsGetProfile() { + tmedia_profile_t ret = (tmedia_profile_t)tinyWRAPPINVOKE.MediaSessionMgr_defaultsGetProfile(); + return ret; + } + public static bool defaultsSetBandwidthLevel(tmedia_bandwidth_level_t bl) { bool ret = tinyWRAPPINVOKE.MediaSessionMgr_defaultsSetBandwidthLevel((int)bl); return ret; @@ -96,6 +108,11 @@ public class MediaSessionMgr : IDisposable { return ret; } + public static bool defaultsSetPrefVideoSize(tmedia_pref_video_size_t pref_video_size) { + bool ret = tinyWRAPPINVOKE.MediaSessionMgr_defaultsSetPrefVideoSize((int)pref_video_size); + return ret; + } + public static bool defaultsSetJbMargin(uint jb_margin_ms) { bool ret = tinyWRAPPINVOKE.MediaSessionMgr_defaultsSetJbMargin(jb_margin_ms); return ret; @@ -231,6 +248,11 @@ public class MediaSessionMgr : IDisposable { return ret; } + public static bool defaultsSetIceEnabled(bool ice_enabled) { + bool ret = tinyWRAPPINVOKE.MediaSessionMgr_defaultsSetIceEnabled(ice_enabled); + return ret; + } + } } diff --git a/branches/2.0/doubango/bindings/csharp/MessagingEvent.cs b/branches/2.0/doubango/bindings/csharp/MessagingEvent.cs index 6c41de2f..6e6f7508 100644 --- a/branches/2.0/doubango/bindings/csharp/MessagingEvent.cs +++ b/branches/2.0/doubango/bindings/csharp/MessagingEvent.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class MessagingEvent : SipEvent { private HandleRef swigCPtr; - internal MessagingEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.MessagingEventUpcast(cPtr), cMemoryOwn) { + internal MessagingEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.MessagingEvent_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class MessagingEvent : SipEvent { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_MessagingEvent(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_MessagingEvent(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/MessagingSession.cs b/branches/2.0/doubango/bindings/csharp/MessagingSession.cs index 6174dbec..501a0c83 100644 --- a/branches/2.0/doubango/bindings/csharp/MessagingSession.cs +++ b/branches/2.0/doubango/bindings/csharp/MessagingSession.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class MessagingSession : SipSession { private HandleRef swigCPtr; - internal MessagingSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.MessagingSessionUpcast(cPtr), cMemoryOwn) { + internal MessagingSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.MessagingSession_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class MessagingSession : SipSession { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_MessagingSession(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_MessagingSession(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/MsrpCallback.cs b/branches/2.0/doubango/bindings/csharp/MsrpCallback.cs index 98fd5b3e..c17fde7c 100644 --- a/branches/2.0/doubango/bindings/csharp/MsrpCallback.cs +++ b/branches/2.0/doubango/bindings/csharp/MsrpCallback.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class MsrpCallback : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_MsrpCallback(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_MsrpCallback(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } @@ -44,7 +46,7 @@ public class MsrpCallback : IDisposable { } public virtual int OnEvent(MsrpEvent e) { - int ret = ((this.GetType() == typeof(MsrpCallback)) ? tinyWRAPPINVOKE.MsrpCallback_OnEvent(swigCPtr, MsrpEvent.getCPtr(e)) : tinyWRAPPINVOKE.MsrpCallback_OnEventSwigExplicitMsrpCallback(swigCPtr, MsrpEvent.getCPtr(e))); + int ret = (SwigDerivedClassHasMethod("OnEvent", swigMethodTypes0) ? tinyWRAPPINVOKE.MsrpCallback_OnEventSwigExplicitMsrpCallback(swigCPtr, MsrpEvent.getCPtr(e)) : tinyWRAPPINVOKE.MsrpCallback_OnEvent(swigCPtr, MsrpEvent.getCPtr(e))); return ret; } diff --git a/branches/2.0/doubango/bindings/csharp/MsrpEvent.cs b/branches/2.0/doubango/bindings/csharp/MsrpEvent.cs index 92956e3d..d76668b7 100644 --- a/branches/2.0/doubango/bindings/csharp/MsrpEvent.cs +++ b/branches/2.0/doubango/bindings/csharp/MsrpEvent.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class MsrpEvent : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_MsrpEvent(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_MsrpEvent(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/MsrpMessage.cs b/branches/2.0/doubango/bindings/csharp/MsrpMessage.cs index b020faf7..5f09be25 100644 --- a/branches/2.0/doubango/bindings/csharp/MsrpMessage.cs +++ b/branches/2.0/doubango/bindings/csharp/MsrpMessage.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class MsrpMessage : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_MsrpMessage(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_MsrpMessage(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/MsrpSession.cs b/branches/2.0/doubango/bindings/csharp/MsrpSession.cs index cafe8616..34c9368c 100644 --- a/branches/2.0/doubango/bindings/csharp/MsrpSession.cs +++ b/branches/2.0/doubango/bindings/csharp/MsrpSession.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class MsrpSession : InviteSession { private HandleRef swigCPtr; - internal MsrpSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.MsrpSessionUpcast(cPtr), cMemoryOwn) { + internal MsrpSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.MsrpSession_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class MsrpSession : InviteSession { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_MsrpSession(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_MsrpSession(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/OptionsEvent.cs b/branches/2.0/doubango/bindings/csharp/OptionsEvent.cs index 379c34e8..44f4ebac 100644 --- a/branches/2.0/doubango/bindings/csharp/OptionsEvent.cs +++ b/branches/2.0/doubango/bindings/csharp/OptionsEvent.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class OptionsEvent : SipEvent { private HandleRef swigCPtr; - internal OptionsEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.OptionsEventUpcast(cPtr), cMemoryOwn) { + internal OptionsEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.OptionsEvent_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class OptionsEvent : SipEvent { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_OptionsEvent(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_OptionsEvent(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/OptionsSession.cs b/branches/2.0/doubango/bindings/csharp/OptionsSession.cs index 6e6843b4..43fee1f5 100644 --- a/branches/2.0/doubango/bindings/csharp/OptionsSession.cs +++ b/branches/2.0/doubango/bindings/csharp/OptionsSession.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class OptionsSession : SipSession { private HandleRef swigCPtr; - internal OptionsSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.OptionsSessionUpcast(cPtr), cMemoryOwn) { + internal OptionsSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.OptionsSession_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class OptionsSession : SipSession { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_OptionsSession(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_OptionsSession(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/ProxyAudioConsumer.cs b/branches/2.0/doubango/bindings/csharp/ProxyAudioConsumer.cs index b7729b1e..9357cfac 100644 --- a/branches/2.0/doubango/bindings/csharp/ProxyAudioConsumer.cs +++ b/branches/2.0/doubango/bindings/csharp/ProxyAudioConsumer.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class ProxyAudioConsumer : ProxyPlugin { private HandleRef swigCPtr; - internal ProxyAudioConsumer(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.ProxyAudioConsumerUpcast(cPtr), cMemoryOwn) { + internal ProxyAudioConsumer(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.ProxyAudioConsumer_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class ProxyAudioConsumer : ProxyPlugin { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_ProxyAudioConsumer(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_ProxyAudioConsumer(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/ProxyAudioConsumerCallback.cs b/branches/2.0/doubango/bindings/csharp/ProxyAudioConsumerCallback.cs index 9e4661ed..9670fed6 100644 --- a/branches/2.0/doubango/bindings/csharp/ProxyAudioConsumerCallback.cs +++ b/branches/2.0/doubango/bindings/csharp/ProxyAudioConsumerCallback.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class ProxyAudioConsumerCallback : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_ProxyAudioConsumerCallback(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_ProxyAudioConsumerCallback(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } @@ -44,22 +46,22 @@ public class ProxyAudioConsumerCallback : IDisposable { } public virtual int prepare(int ptime, int rate, int channels) { - int ret = ((this.GetType() == typeof(ProxyAudioConsumerCallback)) ? tinyWRAPPINVOKE.ProxyAudioConsumerCallback_prepare(swigCPtr, ptime, rate, channels) : tinyWRAPPINVOKE.ProxyAudioConsumerCallback_prepareSwigExplicitProxyAudioConsumerCallback(swigCPtr, ptime, rate, channels)); + int ret = (SwigDerivedClassHasMethod("prepare", swigMethodTypes0) ? tinyWRAPPINVOKE.ProxyAudioConsumerCallback_prepareSwigExplicitProxyAudioConsumerCallback(swigCPtr, ptime, rate, channels) : tinyWRAPPINVOKE.ProxyAudioConsumerCallback_prepare(swigCPtr, ptime, rate, channels)); return ret; } public virtual int start() { - int ret = ((this.GetType() == typeof(ProxyAudioConsumerCallback)) ? tinyWRAPPINVOKE.ProxyAudioConsumerCallback_start(swigCPtr) : tinyWRAPPINVOKE.ProxyAudioConsumerCallback_startSwigExplicitProxyAudioConsumerCallback(swigCPtr)); + int ret = (SwigDerivedClassHasMethod("start", swigMethodTypes1) ? tinyWRAPPINVOKE.ProxyAudioConsumerCallback_startSwigExplicitProxyAudioConsumerCallback(swigCPtr) : tinyWRAPPINVOKE.ProxyAudioConsumerCallback_start(swigCPtr)); return ret; } public virtual int pause() { - int ret = ((this.GetType() == typeof(ProxyAudioConsumerCallback)) ? tinyWRAPPINVOKE.ProxyAudioConsumerCallback_pause(swigCPtr) : tinyWRAPPINVOKE.ProxyAudioConsumerCallback_pauseSwigExplicitProxyAudioConsumerCallback(swigCPtr)); + int ret = (SwigDerivedClassHasMethod("pause", swigMethodTypes2) ? tinyWRAPPINVOKE.ProxyAudioConsumerCallback_pauseSwigExplicitProxyAudioConsumerCallback(swigCPtr) : tinyWRAPPINVOKE.ProxyAudioConsumerCallback_pause(swigCPtr)); return ret; } public virtual int stop() { - int ret = ((this.GetType() == typeof(ProxyAudioConsumerCallback)) ? tinyWRAPPINVOKE.ProxyAudioConsumerCallback_stop(swigCPtr) : tinyWRAPPINVOKE.ProxyAudioConsumerCallback_stopSwigExplicitProxyAudioConsumerCallback(swigCPtr)); + int ret = (SwigDerivedClassHasMethod("stop", swigMethodTypes3) ? tinyWRAPPINVOKE.ProxyAudioConsumerCallback_stopSwigExplicitProxyAudioConsumerCallback(swigCPtr) : tinyWRAPPINVOKE.ProxyAudioConsumerCallback_stop(swigCPtr)); return ret; } diff --git a/branches/2.0/doubango/bindings/csharp/ProxyAudioProducer.cs b/branches/2.0/doubango/bindings/csharp/ProxyAudioProducer.cs index 2215c614..d8b5db51 100644 --- a/branches/2.0/doubango/bindings/csharp/ProxyAudioProducer.cs +++ b/branches/2.0/doubango/bindings/csharp/ProxyAudioProducer.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class ProxyAudioProducer : ProxyPlugin { private HandleRef swigCPtr; - internal ProxyAudioProducer(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.ProxyAudioProducerUpcast(cPtr), cMemoryOwn) { + internal ProxyAudioProducer(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.ProxyAudioProducer_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class ProxyAudioProducer : ProxyPlugin { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_ProxyAudioProducer(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_ProxyAudioProducer(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/ProxyAudioProducerCallback.cs b/branches/2.0/doubango/bindings/csharp/ProxyAudioProducerCallback.cs index 81064713..8a94a360 100644 --- a/branches/2.0/doubango/bindings/csharp/ProxyAudioProducerCallback.cs +++ b/branches/2.0/doubango/bindings/csharp/ProxyAudioProducerCallback.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class ProxyAudioProducerCallback : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_ProxyAudioProducerCallback(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_ProxyAudioProducerCallback(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } @@ -44,22 +46,22 @@ public class ProxyAudioProducerCallback : IDisposable { } public virtual int prepare(int ptime, int rate, int channels) { - int ret = ((this.GetType() == typeof(ProxyAudioProducerCallback)) ? tinyWRAPPINVOKE.ProxyAudioProducerCallback_prepare(swigCPtr, ptime, rate, channels) : tinyWRAPPINVOKE.ProxyAudioProducerCallback_prepareSwigExplicitProxyAudioProducerCallback(swigCPtr, ptime, rate, channels)); + int ret = (SwigDerivedClassHasMethod("prepare", swigMethodTypes0) ? tinyWRAPPINVOKE.ProxyAudioProducerCallback_prepareSwigExplicitProxyAudioProducerCallback(swigCPtr, ptime, rate, channels) : tinyWRAPPINVOKE.ProxyAudioProducerCallback_prepare(swigCPtr, ptime, rate, channels)); return ret; } public virtual int start() { - int ret = ((this.GetType() == typeof(ProxyAudioProducerCallback)) ? tinyWRAPPINVOKE.ProxyAudioProducerCallback_start(swigCPtr) : tinyWRAPPINVOKE.ProxyAudioProducerCallback_startSwigExplicitProxyAudioProducerCallback(swigCPtr)); + int ret = (SwigDerivedClassHasMethod("start", swigMethodTypes1) ? tinyWRAPPINVOKE.ProxyAudioProducerCallback_startSwigExplicitProxyAudioProducerCallback(swigCPtr) : tinyWRAPPINVOKE.ProxyAudioProducerCallback_start(swigCPtr)); return ret; } public virtual int pause() { - int ret = ((this.GetType() == typeof(ProxyAudioProducerCallback)) ? tinyWRAPPINVOKE.ProxyAudioProducerCallback_pause(swigCPtr) : tinyWRAPPINVOKE.ProxyAudioProducerCallback_pauseSwigExplicitProxyAudioProducerCallback(swigCPtr)); + int ret = (SwigDerivedClassHasMethod("pause", swigMethodTypes2) ? tinyWRAPPINVOKE.ProxyAudioProducerCallback_pauseSwigExplicitProxyAudioProducerCallback(swigCPtr) : tinyWRAPPINVOKE.ProxyAudioProducerCallback_pause(swigCPtr)); return ret; } public virtual int stop() { - int ret = ((this.GetType() == typeof(ProxyAudioProducerCallback)) ? tinyWRAPPINVOKE.ProxyAudioProducerCallback_stop(swigCPtr) : tinyWRAPPINVOKE.ProxyAudioProducerCallback_stopSwigExplicitProxyAudioProducerCallback(swigCPtr)); + int ret = (SwigDerivedClassHasMethod("stop", swigMethodTypes3) ? tinyWRAPPINVOKE.ProxyAudioProducerCallback_stopSwigExplicitProxyAudioProducerCallback(swigCPtr) : tinyWRAPPINVOKE.ProxyAudioProducerCallback_stop(swigCPtr)); return ret; } diff --git a/branches/2.0/doubango/bindings/csharp/ProxyPlugin.cs b/branches/2.0/doubango/bindings/csharp/ProxyPlugin.cs index cb62dd6c..eacfd30c 100644 --- a/branches/2.0/doubango/bindings/csharp/ProxyPlugin.cs +++ b/branches/2.0/doubango/bindings/csharp/ProxyPlugin.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class ProxyPlugin : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_ProxyPlugin(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_ProxyPlugin(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/ProxyPluginMgr.cs b/branches/2.0/doubango/bindings/csharp/ProxyPluginMgr.cs index 5e58b552..85384d4f 100644 --- a/branches/2.0/doubango/bindings/csharp/ProxyPluginMgr.cs +++ b/branches/2.0/doubango/bindings/csharp/ProxyPluginMgr.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class ProxyPluginMgr : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_ProxyPluginMgr(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_ProxyPluginMgr(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/ProxyPluginMgrCallback.cs b/branches/2.0/doubango/bindings/csharp/ProxyPluginMgrCallback.cs index f391f36f..f6d71cff 100644 --- a/branches/2.0/doubango/bindings/csharp/ProxyPluginMgrCallback.cs +++ b/branches/2.0/doubango/bindings/csharp/ProxyPluginMgrCallback.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class ProxyPluginMgrCallback : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_ProxyPluginMgrCallback(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_ProxyPluginMgrCallback(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } @@ -44,12 +46,12 @@ public class ProxyPluginMgrCallback : IDisposable { } public virtual int OnPluginCreated(ulong id, twrap_proxy_plugin_type_t type) { - int ret = ((this.GetType() == typeof(ProxyPluginMgrCallback)) ? tinyWRAPPINVOKE.ProxyPluginMgrCallback_OnPluginCreated(swigCPtr, id, (int)type) : tinyWRAPPINVOKE.ProxyPluginMgrCallback_OnPluginCreatedSwigExplicitProxyPluginMgrCallback(swigCPtr, id, (int)type)); + int ret = (SwigDerivedClassHasMethod("OnPluginCreated", swigMethodTypes0) ? tinyWRAPPINVOKE.ProxyPluginMgrCallback_OnPluginCreatedSwigExplicitProxyPluginMgrCallback(swigCPtr, id, (int)type) : tinyWRAPPINVOKE.ProxyPluginMgrCallback_OnPluginCreated(swigCPtr, id, (int)type)); return ret; } public virtual int OnPluginDestroyed(ulong id, twrap_proxy_plugin_type_t type) { - int ret = ((this.GetType() == typeof(ProxyPluginMgrCallback)) ? tinyWRAPPINVOKE.ProxyPluginMgrCallback_OnPluginDestroyed(swigCPtr, id, (int)type) : tinyWRAPPINVOKE.ProxyPluginMgrCallback_OnPluginDestroyedSwigExplicitProxyPluginMgrCallback(swigCPtr, id, (int)type)); + int ret = (SwigDerivedClassHasMethod("OnPluginDestroyed", swigMethodTypes1) ? tinyWRAPPINVOKE.ProxyPluginMgrCallback_OnPluginDestroyedSwigExplicitProxyPluginMgrCallback(swigCPtr, id, (int)type) : tinyWRAPPINVOKE.ProxyPluginMgrCallback_OnPluginDestroyed(swigCPtr, id, (int)type)); return ret; } diff --git a/branches/2.0/doubango/bindings/csharp/ProxyVideoConsumer.cs b/branches/2.0/doubango/bindings/csharp/ProxyVideoConsumer.cs index 1863ee0d..26b7d2fc 100644 --- a/branches/2.0/doubango/bindings/csharp/ProxyVideoConsumer.cs +++ b/branches/2.0/doubango/bindings/csharp/ProxyVideoConsumer.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class ProxyVideoConsumer : ProxyPlugin { private HandleRef swigCPtr; - internal ProxyVideoConsumer(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.ProxyVideoConsumerUpcast(cPtr), cMemoryOwn) { + internal ProxyVideoConsumer(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.ProxyVideoConsumer_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class ProxyVideoConsumer : ProxyPlugin { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_ProxyVideoConsumer(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_ProxyVideoConsumer(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/ProxyVideoConsumerCallback.cs b/branches/2.0/doubango/bindings/csharp/ProxyVideoConsumerCallback.cs index 59b80bf4..c9fd8cc8 100644 --- a/branches/2.0/doubango/bindings/csharp/ProxyVideoConsumerCallback.cs +++ b/branches/2.0/doubango/bindings/csharp/ProxyVideoConsumerCallback.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class ProxyVideoConsumerCallback : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_ProxyVideoConsumerCallback(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_ProxyVideoConsumerCallback(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } @@ -44,32 +46,32 @@ public class ProxyVideoConsumerCallback : IDisposable { } public virtual int prepare(int nWidth, int nHeight, int nFps) { - int ret = ((this.GetType() == typeof(ProxyVideoConsumerCallback)) ? tinyWRAPPINVOKE.ProxyVideoConsumerCallback_prepare(swigCPtr, nWidth, nHeight, nFps) : tinyWRAPPINVOKE.ProxyVideoConsumerCallback_prepareSwigExplicitProxyVideoConsumerCallback(swigCPtr, nWidth, nHeight, nFps)); + int ret = (SwigDerivedClassHasMethod("prepare", swigMethodTypes0) ? tinyWRAPPINVOKE.ProxyVideoConsumerCallback_prepareSwigExplicitProxyVideoConsumerCallback(swigCPtr, nWidth, nHeight, nFps) : tinyWRAPPINVOKE.ProxyVideoConsumerCallback_prepare(swigCPtr, nWidth, nHeight, nFps)); return ret; } public virtual int consume(ProxyVideoFrame frame) { - int ret = ((this.GetType() == typeof(ProxyVideoConsumerCallback)) ? tinyWRAPPINVOKE.ProxyVideoConsumerCallback_consume(swigCPtr, ProxyVideoFrame.getCPtr(frame)) : tinyWRAPPINVOKE.ProxyVideoConsumerCallback_consumeSwigExplicitProxyVideoConsumerCallback(swigCPtr, ProxyVideoFrame.getCPtr(frame))); + int ret = (SwigDerivedClassHasMethod("consume", swigMethodTypes1) ? tinyWRAPPINVOKE.ProxyVideoConsumerCallback_consumeSwigExplicitProxyVideoConsumerCallback(swigCPtr, ProxyVideoFrame.getCPtr(frame)) : tinyWRAPPINVOKE.ProxyVideoConsumerCallback_consume(swigCPtr, ProxyVideoFrame.getCPtr(frame))); return ret; } public virtual int bufferCopied(uint nCopiedSize, uint nAvailableSize) { - int ret = ((this.GetType() == typeof(ProxyVideoConsumerCallback)) ? tinyWRAPPINVOKE.ProxyVideoConsumerCallback_bufferCopied(swigCPtr, nCopiedSize, nAvailableSize) : tinyWRAPPINVOKE.ProxyVideoConsumerCallback_bufferCopiedSwigExplicitProxyVideoConsumerCallback(swigCPtr, nCopiedSize, nAvailableSize)); + int ret = (SwigDerivedClassHasMethod("bufferCopied", swigMethodTypes2) ? tinyWRAPPINVOKE.ProxyVideoConsumerCallback_bufferCopiedSwigExplicitProxyVideoConsumerCallback(swigCPtr, nCopiedSize, nAvailableSize) : tinyWRAPPINVOKE.ProxyVideoConsumerCallback_bufferCopied(swigCPtr, nCopiedSize, nAvailableSize)); return ret; } public virtual int start() { - int ret = ((this.GetType() == typeof(ProxyVideoConsumerCallback)) ? tinyWRAPPINVOKE.ProxyVideoConsumerCallback_start(swigCPtr) : tinyWRAPPINVOKE.ProxyVideoConsumerCallback_startSwigExplicitProxyVideoConsumerCallback(swigCPtr)); + int ret = (SwigDerivedClassHasMethod("start", swigMethodTypes3) ? tinyWRAPPINVOKE.ProxyVideoConsumerCallback_startSwigExplicitProxyVideoConsumerCallback(swigCPtr) : tinyWRAPPINVOKE.ProxyVideoConsumerCallback_start(swigCPtr)); return ret; } public virtual int pause() { - int ret = ((this.GetType() == typeof(ProxyVideoConsumerCallback)) ? tinyWRAPPINVOKE.ProxyVideoConsumerCallback_pause(swigCPtr) : tinyWRAPPINVOKE.ProxyVideoConsumerCallback_pauseSwigExplicitProxyVideoConsumerCallback(swigCPtr)); + int ret = (SwigDerivedClassHasMethod("pause", swigMethodTypes4) ? tinyWRAPPINVOKE.ProxyVideoConsumerCallback_pauseSwigExplicitProxyVideoConsumerCallback(swigCPtr) : tinyWRAPPINVOKE.ProxyVideoConsumerCallback_pause(swigCPtr)); return ret; } public virtual int stop() { - int ret = ((this.GetType() == typeof(ProxyVideoConsumerCallback)) ? tinyWRAPPINVOKE.ProxyVideoConsumerCallback_stop(swigCPtr) : tinyWRAPPINVOKE.ProxyVideoConsumerCallback_stopSwigExplicitProxyVideoConsumerCallback(swigCPtr)); + int ret = (SwigDerivedClassHasMethod("stop", swigMethodTypes5) ? tinyWRAPPINVOKE.ProxyVideoConsumerCallback_stopSwigExplicitProxyVideoConsumerCallback(swigCPtr) : tinyWRAPPINVOKE.ProxyVideoConsumerCallback_stop(swigCPtr)); return ret; } diff --git a/branches/2.0/doubango/bindings/csharp/ProxyVideoFrame.cs b/branches/2.0/doubango/bindings/csharp/ProxyVideoFrame.cs index f8af974c..dff98bf1 100644 --- a/branches/2.0/doubango/bindings/csharp/ProxyVideoFrame.cs +++ b/branches/2.0/doubango/bindings/csharp/ProxyVideoFrame.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class ProxyVideoFrame : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_ProxyVideoFrame(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_ProxyVideoFrame(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/ProxyVideoProducer.cs b/branches/2.0/doubango/bindings/csharp/ProxyVideoProducer.cs index e88f8e59..16255b09 100644 --- a/branches/2.0/doubango/bindings/csharp/ProxyVideoProducer.cs +++ b/branches/2.0/doubango/bindings/csharp/ProxyVideoProducer.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class ProxyVideoProducer : ProxyPlugin { private HandleRef swigCPtr; - internal ProxyVideoProducer(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.ProxyVideoProducerUpcast(cPtr), cMemoryOwn) { + internal ProxyVideoProducer(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.ProxyVideoProducer_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class ProxyVideoProducer : ProxyPlugin { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_ProxyVideoProducer(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_ProxyVideoProducer(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/ProxyVideoProducerCallback.cs b/branches/2.0/doubango/bindings/csharp/ProxyVideoProducerCallback.cs index 7deb2a75..db49b626 100644 --- a/branches/2.0/doubango/bindings/csharp/ProxyVideoProducerCallback.cs +++ b/branches/2.0/doubango/bindings/csharp/ProxyVideoProducerCallback.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class ProxyVideoProducerCallback : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_ProxyVideoProducerCallback(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_ProxyVideoProducerCallback(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } @@ -44,22 +46,22 @@ public class ProxyVideoProducerCallback : IDisposable { } public virtual int prepare(int width, int height, int fps) { - int ret = ((this.GetType() == typeof(ProxyVideoProducerCallback)) ? tinyWRAPPINVOKE.ProxyVideoProducerCallback_prepare(swigCPtr, width, height, fps) : tinyWRAPPINVOKE.ProxyVideoProducerCallback_prepareSwigExplicitProxyVideoProducerCallback(swigCPtr, width, height, fps)); + int ret = (SwigDerivedClassHasMethod("prepare", swigMethodTypes0) ? tinyWRAPPINVOKE.ProxyVideoProducerCallback_prepareSwigExplicitProxyVideoProducerCallback(swigCPtr, width, height, fps) : tinyWRAPPINVOKE.ProxyVideoProducerCallback_prepare(swigCPtr, width, height, fps)); return ret; } public virtual int start() { - int ret = ((this.GetType() == typeof(ProxyVideoProducerCallback)) ? tinyWRAPPINVOKE.ProxyVideoProducerCallback_start(swigCPtr) : tinyWRAPPINVOKE.ProxyVideoProducerCallback_startSwigExplicitProxyVideoProducerCallback(swigCPtr)); + int ret = (SwigDerivedClassHasMethod("start", swigMethodTypes1) ? tinyWRAPPINVOKE.ProxyVideoProducerCallback_startSwigExplicitProxyVideoProducerCallback(swigCPtr) : tinyWRAPPINVOKE.ProxyVideoProducerCallback_start(swigCPtr)); return ret; } public virtual int pause() { - int ret = ((this.GetType() == typeof(ProxyVideoProducerCallback)) ? tinyWRAPPINVOKE.ProxyVideoProducerCallback_pause(swigCPtr) : tinyWRAPPINVOKE.ProxyVideoProducerCallback_pauseSwigExplicitProxyVideoProducerCallback(swigCPtr)); + int ret = (SwigDerivedClassHasMethod("pause", swigMethodTypes2) ? tinyWRAPPINVOKE.ProxyVideoProducerCallback_pauseSwigExplicitProxyVideoProducerCallback(swigCPtr) : tinyWRAPPINVOKE.ProxyVideoProducerCallback_pause(swigCPtr)); return ret; } public virtual int stop() { - int ret = ((this.GetType() == typeof(ProxyVideoProducerCallback)) ? tinyWRAPPINVOKE.ProxyVideoProducerCallback_stop(swigCPtr) : tinyWRAPPINVOKE.ProxyVideoProducerCallback_stopSwigExplicitProxyVideoProducerCallback(swigCPtr)); + int ret = (SwigDerivedClassHasMethod("stop", swigMethodTypes3) ? tinyWRAPPINVOKE.ProxyVideoProducerCallback_stopSwigExplicitProxyVideoProducerCallback(swigCPtr) : tinyWRAPPINVOKE.ProxyVideoProducerCallback_stop(swigCPtr)); return ret; } diff --git a/branches/2.0/doubango/bindings/csharp/PublicationEvent.cs b/branches/2.0/doubango/bindings/csharp/PublicationEvent.cs index 55de1e3f..b1df32a5 100644 --- a/branches/2.0/doubango/bindings/csharp/PublicationEvent.cs +++ b/branches/2.0/doubango/bindings/csharp/PublicationEvent.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class PublicationEvent : SipEvent { private HandleRef swigCPtr; - internal PublicationEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.PublicationEventUpcast(cPtr), cMemoryOwn) { + internal PublicationEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.PublicationEvent_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class PublicationEvent : SipEvent { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_PublicationEvent(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_PublicationEvent(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/PublicationSession.cs b/branches/2.0/doubango/bindings/csharp/PublicationSession.cs index 3c38aff9..e9381540 100644 --- a/branches/2.0/doubango/bindings/csharp/PublicationSession.cs +++ b/branches/2.0/doubango/bindings/csharp/PublicationSession.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class PublicationSession : SipSession { private HandleRef swigCPtr; - internal PublicationSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.PublicationSessionUpcast(cPtr), cMemoryOwn) { + internal PublicationSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.PublicationSession_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class PublicationSession : SipSession { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_PublicationSession(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_PublicationSession(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/RPMessage.cs b/branches/2.0/doubango/bindings/csharp/RPMessage.cs index c984c070..90f32f8d 100644 --- a/branches/2.0/doubango/bindings/csharp/RPMessage.cs +++ b/branches/2.0/doubango/bindings/csharp/RPMessage.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class RPMessage : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_RPMessage(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_RPMessage(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/RegistrationEvent.cs b/branches/2.0/doubango/bindings/csharp/RegistrationEvent.cs index 21dbc2ae..44fa5b86 100644 --- a/branches/2.0/doubango/bindings/csharp/RegistrationEvent.cs +++ b/branches/2.0/doubango/bindings/csharp/RegistrationEvent.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class RegistrationEvent : SipEvent { private HandleRef swigCPtr; - internal RegistrationEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.RegistrationEventUpcast(cPtr), cMemoryOwn) { + internal RegistrationEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.RegistrationEvent_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class RegistrationEvent : SipEvent { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_RegistrationEvent(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_RegistrationEvent(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/RegistrationSession.cs b/branches/2.0/doubango/bindings/csharp/RegistrationSession.cs index 82c55401..af0b4b61 100644 --- a/branches/2.0/doubango/bindings/csharp/RegistrationSession.cs +++ b/branches/2.0/doubango/bindings/csharp/RegistrationSession.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class RegistrationSession : SipSession { private HandleRef swigCPtr; - internal RegistrationSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.RegistrationSessionUpcast(cPtr), cMemoryOwn) { + internal RegistrationSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.RegistrationSession_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class RegistrationSession : SipSession { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_RegistrationSession(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_RegistrationSession(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/SMSData.cs b/branches/2.0/doubango/bindings/csharp/SMSData.cs index 4d17a218..2e62a38a 100644 --- a/branches/2.0/doubango/bindings/csharp/SMSData.cs +++ b/branches/2.0/doubango/bindings/csharp/SMSData.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class SMSData : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_SMSData(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_SMSData(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/SMSEncoder.cs b/branches/2.0/doubango/bindings/csharp/SMSEncoder.cs index 30eaaff2..d12ea5ca 100644 --- a/branches/2.0/doubango/bindings/csharp/SMSEncoder.cs +++ b/branches/2.0/doubango/bindings/csharp/SMSEncoder.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class SMSEncoder : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_SMSEncoder(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_SMSEncoder(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/SafeObject.cs b/branches/2.0/doubango/bindings/csharp/SafeObject.cs index 28217da6..7c188185 100644 --- a/branches/2.0/doubango/bindings/csharp/SafeObject.cs +++ b/branches/2.0/doubango/bindings/csharp/SafeObject.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class SafeObject : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_SafeObject(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_SafeObject(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/SdpMessage.cs b/branches/2.0/doubango/bindings/csharp/SdpMessage.cs index 2a54b1a5..cfcc7600 100644 --- a/branches/2.0/doubango/bindings/csharp/SdpMessage.cs +++ b/branches/2.0/doubango/bindings/csharp/SdpMessage.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class SdpMessage : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_SdpMessage(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_SdpMessage(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/SipCallback.cs b/branches/2.0/doubango/bindings/csharp/SipCallback.cs index 4b3ef859..f30a9896 100644 --- a/branches/2.0/doubango/bindings/csharp/SipCallback.cs +++ b/branches/2.0/doubango/bindings/csharp/SipCallback.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class SipCallback : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_SipCallback(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_SipCallback(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } @@ -44,47 +46,47 @@ public class SipCallback : IDisposable { } public virtual int OnDialogEvent(DialogEvent e) { - int ret = ((this.GetType() == typeof(SipCallback)) ? tinyWRAPPINVOKE.SipCallback_OnDialogEvent(swigCPtr, DialogEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnDialogEventSwigExplicitSipCallback(swigCPtr, DialogEvent.getCPtr(e))); + int ret = (SwigDerivedClassHasMethod("OnDialogEvent", swigMethodTypes0) ? tinyWRAPPINVOKE.SipCallback_OnDialogEventSwigExplicitSipCallback(swigCPtr, DialogEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnDialogEvent(swigCPtr, DialogEvent.getCPtr(e))); return ret; } public virtual int OnStackEvent(StackEvent e) { - int ret = ((this.GetType() == typeof(SipCallback)) ? tinyWRAPPINVOKE.SipCallback_OnStackEvent(swigCPtr, StackEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnStackEventSwigExplicitSipCallback(swigCPtr, StackEvent.getCPtr(e))); + int ret = (SwigDerivedClassHasMethod("OnStackEvent", swigMethodTypes1) ? tinyWRAPPINVOKE.SipCallback_OnStackEventSwigExplicitSipCallback(swigCPtr, StackEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnStackEvent(swigCPtr, StackEvent.getCPtr(e))); return ret; } public virtual int OnInviteEvent(InviteEvent e) { - int ret = ((this.GetType() == typeof(SipCallback)) ? tinyWRAPPINVOKE.SipCallback_OnInviteEvent(swigCPtr, InviteEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnInviteEventSwigExplicitSipCallback(swigCPtr, InviteEvent.getCPtr(e))); + int ret = (SwigDerivedClassHasMethod("OnInviteEvent", swigMethodTypes2) ? tinyWRAPPINVOKE.SipCallback_OnInviteEventSwigExplicitSipCallback(swigCPtr, InviteEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnInviteEvent(swigCPtr, InviteEvent.getCPtr(e))); return ret; } public virtual int OnMessagingEvent(MessagingEvent e) { - int ret = ((this.GetType() == typeof(SipCallback)) ? tinyWRAPPINVOKE.SipCallback_OnMessagingEvent(swigCPtr, MessagingEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnMessagingEventSwigExplicitSipCallback(swigCPtr, MessagingEvent.getCPtr(e))); + int ret = (SwigDerivedClassHasMethod("OnMessagingEvent", swigMethodTypes3) ? tinyWRAPPINVOKE.SipCallback_OnMessagingEventSwigExplicitSipCallback(swigCPtr, MessagingEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnMessagingEvent(swigCPtr, MessagingEvent.getCPtr(e))); return ret; } public virtual int OnInfoEvent(InfoEvent e) { - int ret = ((this.GetType() == typeof(SipCallback)) ? tinyWRAPPINVOKE.SipCallback_OnInfoEvent(swigCPtr, InfoEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnInfoEventSwigExplicitSipCallback(swigCPtr, InfoEvent.getCPtr(e))); + int ret = (SwigDerivedClassHasMethod("OnInfoEvent", swigMethodTypes4) ? tinyWRAPPINVOKE.SipCallback_OnInfoEventSwigExplicitSipCallback(swigCPtr, InfoEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnInfoEvent(swigCPtr, InfoEvent.getCPtr(e))); return ret; } public virtual int OnOptionsEvent(OptionsEvent e) { - int ret = ((this.GetType() == typeof(SipCallback)) ? tinyWRAPPINVOKE.SipCallback_OnOptionsEvent(swigCPtr, OptionsEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnOptionsEventSwigExplicitSipCallback(swigCPtr, OptionsEvent.getCPtr(e))); + int ret = (SwigDerivedClassHasMethod("OnOptionsEvent", swigMethodTypes5) ? tinyWRAPPINVOKE.SipCallback_OnOptionsEventSwigExplicitSipCallback(swigCPtr, OptionsEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnOptionsEvent(swigCPtr, OptionsEvent.getCPtr(e))); return ret; } public virtual int OnPublicationEvent(PublicationEvent e) { - int ret = ((this.GetType() == typeof(SipCallback)) ? tinyWRAPPINVOKE.SipCallback_OnPublicationEvent(swigCPtr, PublicationEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnPublicationEventSwigExplicitSipCallback(swigCPtr, PublicationEvent.getCPtr(e))); + int ret = (SwigDerivedClassHasMethod("OnPublicationEvent", swigMethodTypes6) ? tinyWRAPPINVOKE.SipCallback_OnPublicationEventSwigExplicitSipCallback(swigCPtr, PublicationEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnPublicationEvent(swigCPtr, PublicationEvent.getCPtr(e))); return ret; } public virtual int OnRegistrationEvent(RegistrationEvent e) { - int ret = ((this.GetType() == typeof(SipCallback)) ? tinyWRAPPINVOKE.SipCallback_OnRegistrationEvent(swigCPtr, RegistrationEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnRegistrationEventSwigExplicitSipCallback(swigCPtr, RegistrationEvent.getCPtr(e))); + int ret = (SwigDerivedClassHasMethod("OnRegistrationEvent", swigMethodTypes7) ? tinyWRAPPINVOKE.SipCallback_OnRegistrationEventSwigExplicitSipCallback(swigCPtr, RegistrationEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnRegistrationEvent(swigCPtr, RegistrationEvent.getCPtr(e))); return ret; } public virtual int OnSubscriptionEvent(SubscriptionEvent e) { - int ret = ((this.GetType() == typeof(SipCallback)) ? tinyWRAPPINVOKE.SipCallback_OnSubscriptionEvent(swigCPtr, SubscriptionEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnSubscriptionEventSwigExplicitSipCallback(swigCPtr, SubscriptionEvent.getCPtr(e))); + int ret = (SwigDerivedClassHasMethod("OnSubscriptionEvent", swigMethodTypes8) ? tinyWRAPPINVOKE.SipCallback_OnSubscriptionEventSwigExplicitSipCallback(swigCPtr, SubscriptionEvent.getCPtr(e)) : tinyWRAPPINVOKE.SipCallback_OnSubscriptionEvent(swigCPtr, SubscriptionEvent.getCPtr(e))); return ret; } diff --git a/branches/2.0/doubango/bindings/csharp/SipEvent.cs b/branches/2.0/doubango/bindings/csharp/SipEvent.cs index f81cc554..b221599a 100644 --- a/branches/2.0/doubango/bindings/csharp/SipEvent.cs +++ b/branches/2.0/doubango/bindings/csharp/SipEvent.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class SipEvent : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_SipEvent(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_SipEvent(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/SipMessage.cs b/branches/2.0/doubango/bindings/csharp/SipMessage.cs index 9862228c..825ae467 100644 --- a/branches/2.0/doubango/bindings/csharp/SipMessage.cs +++ b/branches/2.0/doubango/bindings/csharp/SipMessage.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class SipMessage : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_SipMessage(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_SipMessage(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/SipSession.cs b/branches/2.0/doubango/bindings/csharp/SipSession.cs index 94fc020f..fe8c64ab 100644 --- a/branches/2.0/doubango/bindings/csharp/SipSession.cs +++ b/branches/2.0/doubango/bindings/csharp/SipSession.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class SipSession : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_SipSession(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_SipSession(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/SipStack.cs b/branches/2.0/doubango/bindings/csharp/SipStack.cs index 4bedf602..daa02bc3 100644 --- a/branches/2.0/doubango/bindings/csharp/SipStack.cs +++ b/branches/2.0/doubango/bindings/csharp/SipStack.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class SipStack : SafeObject { private HandleRef swigCPtr; - internal SipStack(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.SipStackUpcast(cPtr), cMemoryOwn) { + internal SipStack(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.SipStack_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class SipStack : SafeObject { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_SipStack(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_SipStack(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/SipUri.cs b/branches/2.0/doubango/bindings/csharp/SipUri.cs index 3ff26e5f..daa04388 100644 --- a/branches/2.0/doubango/bindings/csharp/SipUri.cs +++ b/branches/2.0/doubango/bindings/csharp/SipUri.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class SipUri : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_SipUri(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_SipUri(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/StackEvent.cs b/branches/2.0/doubango/bindings/csharp/StackEvent.cs index e2220426..f194964e 100644 --- a/branches/2.0/doubango/bindings/csharp/StackEvent.cs +++ b/branches/2.0/doubango/bindings/csharp/StackEvent.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class StackEvent : SipEvent { private HandleRef swigCPtr; - internal StackEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.StackEventUpcast(cPtr), cMemoryOwn) { + internal StackEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.StackEvent_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class StackEvent : SipEvent { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_StackEvent(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_StackEvent(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/SubscriptionEvent.cs b/branches/2.0/doubango/bindings/csharp/SubscriptionEvent.cs index a00691c4..9f093c43 100644 --- a/branches/2.0/doubango/bindings/csharp/SubscriptionEvent.cs +++ b/branches/2.0/doubango/bindings/csharp/SubscriptionEvent.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class SubscriptionEvent : SipEvent { private HandleRef swigCPtr; - internal SubscriptionEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.SubscriptionEventUpcast(cPtr), cMemoryOwn) { + internal SubscriptionEvent(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.SubscriptionEvent_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class SubscriptionEvent : SipEvent { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_SubscriptionEvent(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_SubscriptionEvent(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/SubscriptionSession.cs b/branches/2.0/doubango/bindings/csharp/SubscriptionSession.cs index 0726174c..48d39a49 100644 --- a/branches/2.0/doubango/bindings/csharp/SubscriptionSession.cs +++ b/branches/2.0/doubango/bindings/csharp/SubscriptionSession.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; public class SubscriptionSession : SipSession { private HandleRef swigCPtr; - internal SubscriptionSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.SubscriptionSessionUpcast(cPtr), cMemoryOwn) { + internal SubscriptionSession(IntPtr cPtr, bool cMemoryOwn) : base(tinyWRAPPINVOKE.SubscriptionSession_SWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } @@ -28,11 +28,13 @@ public class SubscriptionSession : SipSession { public override void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_SubscriptionSession(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_SubscriptionSession(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); base.Dispose(); } diff --git a/branches/2.0/doubango/bindings/csharp/XcapCallback.cs b/branches/2.0/doubango/bindings/csharp/XcapCallback.cs index 29af4217..97fadbd0 100644 --- a/branches/2.0/doubango/bindings/csharp/XcapCallback.cs +++ b/branches/2.0/doubango/bindings/csharp/XcapCallback.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class XcapCallback : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_XcapCallback(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_XcapCallback(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } @@ -44,7 +46,7 @@ public class XcapCallback : IDisposable { } public virtual int onEvent(XcapEvent e) { - int ret = ((this.GetType() == typeof(XcapCallback)) ? tinyWRAPPINVOKE.XcapCallback_onEvent(swigCPtr, XcapEvent.getCPtr(e)) : tinyWRAPPINVOKE.XcapCallback_onEventSwigExplicitXcapCallback(swigCPtr, XcapEvent.getCPtr(e))); + int ret = (SwigDerivedClassHasMethod("onEvent", swigMethodTypes0) ? tinyWRAPPINVOKE.XcapCallback_onEventSwigExplicitXcapCallback(swigCPtr, XcapEvent.getCPtr(e)) : tinyWRAPPINVOKE.XcapCallback_onEvent(swigCPtr, XcapEvent.getCPtr(e))); return ret; } diff --git a/branches/2.0/doubango/bindings/csharp/XcapEvent.cs b/branches/2.0/doubango/bindings/csharp/XcapEvent.cs index 4358aec4..5eb305b4 100644 --- a/branches/2.0/doubango/bindings/csharp/XcapEvent.cs +++ b/branches/2.0/doubango/bindings/csharp/XcapEvent.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class XcapEvent : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_XcapEvent(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_XcapEvent(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/XcapMessage.cs b/branches/2.0/doubango/bindings/csharp/XcapMessage.cs index 38506448..2f9f5429 100644 --- a/branches/2.0/doubango/bindings/csharp/XcapMessage.cs +++ b/branches/2.0/doubango/bindings/csharp/XcapMessage.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class XcapMessage : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_XcapMessage(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_XcapMessage(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/XcapSelector.cs b/branches/2.0/doubango/bindings/csharp/XcapSelector.cs index bb420a10..d342db4b 100644 --- a/branches/2.0/doubango/bindings/csharp/XcapSelector.cs +++ b/branches/2.0/doubango/bindings/csharp/XcapSelector.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class XcapSelector : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_XcapSelector(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_XcapSelector(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/XcapStack.cs b/branches/2.0/doubango/bindings/csharp/XcapStack.cs index 04d0f52a..02473ee2 100644 --- a/branches/2.0/doubango/bindings/csharp/XcapStack.cs +++ b/branches/2.0/doubango/bindings/csharp/XcapStack.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,11 +30,13 @@ public class XcapStack : IDisposable { public virtual void Dispose() { lock(this) { - if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPPINVOKE.delete_XcapStack(swigCPtr); + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPPINVOKE.delete_XcapStack(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); } - swigCPtr = new HandleRef(null, IntPtr.Zero); GC.SuppressFinalize(this); } } diff --git a/branches/2.0/doubango/bindings/csharp/tdav_codec_id_t.cs b/branches/2.0/doubango/bindings/csharp/tdav_codec_id_t.cs index 5d68aaa2..2306d3b8 100644 --- a/branches/2.0/doubango/bindings/csharp/tdav_codec_id_t.cs +++ b/branches/2.0/doubango/bindings/csharp/tdav_codec_id_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,9 +30,12 @@ public enum tdav_codec_id_t { tdav_codec_id_h263 = 0x00010000 << 1, tdav_codec_id_h263p = 0x00010000 << 2, tdav_codec_id_h263pp = 0x00010000 << 3, - tdav_codec_id_h264_bp10 = 0x00010000 << 4, - tdav_codec_id_h264_bp20 = 0x00010000 << 5, - tdav_codec_id_h264_bp30 = 0x00010000 << 6, + tdav_codec_id_h264_bp = 0x00010000 << 4, + tdav_codec_id_h264_mp = 0x00010000 << 5, + tdav_codec_id_h264_hp = 0x00010000 << 6, + tdav_codec_id_h264_bp10 = tdav_codec_id_h264_bp, + tdav_codec_id_h264_bp20 = tdav_codec_id_h264_bp, + tdav_codec_id_h264_bp30 = tdav_codec_id_h264_bp, tdav_codec_id_h264_svc = 0x00010000 << 7, tdav_codec_id_theora = 0x00010000 << 8, tdav_codec_id_mp4ves_es = 0x00010000 << 9, diff --git a/branches/2.0/doubango/bindings/csharp/thttp_event_type_t.cs b/branches/2.0/doubango/bindings/csharp/thttp_event_type_t.cs index fa1b85be..0250253b 100644 --- a/branches/2.0/doubango/bindings/csharp/thttp_event_type_t.cs +++ b/branches/2.0/doubango/bindings/csharp/thttp_event_type_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/tinyWRAP.cs b/branches/2.0/doubango/bindings/csharp/tinyWRAP.cs index cfd0c640..defa2981 100644 --- a/branches/2.0/doubango/bindings/csharp/tinyWRAP.cs +++ b/branches/2.0/doubango/bindings/csharp/tinyWRAP.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/tinyWRAPPINVOKE.cs b/branches/2.0/doubango/bindings/csharp/tinyWRAPPINVOKE.cs index 58ba7849..0e272a20 100644 --- a/branches/2.0/doubango/bindings/csharp/tinyWRAPPINVOKE.cs +++ b/branches/2.0/doubango/bindings/csharp/tinyWRAPPINVOKE.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -185,6 +185,10 @@ class tinyWRAPPINVOKE { static protected SWIGStringHelper swigStringHelper = new SWIGStringHelper(); + static tinyWRAPPINVOKE() { + } + + [DllImport("tinyWRAP", EntryPoint="CSharp_new_DDebugCallback")] public static extern IntPtr new_DDebugCallback(); @@ -287,12 +291,21 @@ class tinyWRAPPINVOKE { [DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_getSessionId")] public static extern ulong MediaSessionMgr_getSessionId(HandleRef jarg1, int jarg2); + [DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsSetProfile")] + public static extern bool MediaSessionMgr_defaultsSetProfile(int jarg1); + + [DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsGetProfile")] + public static extern int MediaSessionMgr_defaultsGetProfile(); + [DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsSetBandwidthLevel")] public static extern bool MediaSessionMgr_defaultsSetBandwidthLevel(int jarg1); [DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsGetBandwidthLevel")] public static extern int MediaSessionMgr_defaultsGetBandwidthLevel(); + [DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsSetPrefVideoSize")] + public static extern bool MediaSessionMgr_defaultsSetPrefVideoSize(int jarg1); + [DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsSetJbMargin")] public static extern bool MediaSessionMgr_defaultsSetJbMargin(uint jarg1); @@ -374,6 +387,9 @@ class tinyWRAPPINVOKE { [DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsSetSRtpMode")] public static extern bool MediaSessionMgr_defaultsSetSRtpMode(int jarg1); + [DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsSetIceEnabled")] + public static extern bool MediaSessionMgr_defaultsSetIceEnabled(bool jarg1); + [DllImport("tinyWRAP", EntryPoint="CSharp_delete_MediaContent")] public static extern void delete_MediaContent(HandleRef jarg1); @@ -737,6 +753,9 @@ class tinyWRAPPINVOKE { [DllImport("tinyWRAP", EntryPoint="CSharp_CallSession_set100rel")] public static extern bool CallSession_set100rel(HandleRef jarg1, bool jarg2); + [DllImport("tinyWRAP", EntryPoint="CSharp_CallSession_setICE")] + public static extern bool CallSession_setICE(HandleRef jarg1, bool jarg2); + [DllImport("tinyWRAP", EntryPoint="CSharp_CallSession_setQoS")] public static extern bool CallSession_setQoS(HandleRef jarg1, int jarg2, int jarg3); @@ -1805,77 +1824,77 @@ class tinyWRAPPINVOKE { [DllImport("tinyWRAP", EntryPoint="CSharp_MsrpCallback_director_connect")] public static extern void MsrpCallback_director_connect(HandleRef jarg1, MsrpCallback.SwigDelegateMsrpCallback_0 delegate0); - [DllImport("tinyWRAP", EntryPoint="CSharp_MediaContentCPIMUpcast")] - public static extern IntPtr MediaContentCPIMUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_MediaContentCPIM_SWIGUpcast")] + public static extern IntPtr MediaContentCPIM_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_DialogEventUpcast")] - public static extern IntPtr DialogEventUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_DialogEvent_SWIGUpcast")] + public static extern IntPtr DialogEvent_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_StackEventUpcast")] - public static extern IntPtr StackEventUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_StackEvent_SWIGUpcast")] + public static extern IntPtr StackEvent_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_InviteEventUpcast")] - public static extern IntPtr InviteEventUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_InviteEvent_SWIGUpcast")] + public static extern IntPtr InviteEvent_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_MessagingEventUpcast")] - public static extern IntPtr MessagingEventUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_MessagingEvent_SWIGUpcast")] + public static extern IntPtr MessagingEvent_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_InfoEventUpcast")] - public static extern IntPtr InfoEventUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_InfoEvent_SWIGUpcast")] + public static extern IntPtr InfoEvent_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_OptionsEventUpcast")] - public static extern IntPtr OptionsEventUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_OptionsEvent_SWIGUpcast")] + public static extern IntPtr OptionsEvent_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_PublicationEventUpcast")] - public static extern IntPtr PublicationEventUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_PublicationEvent_SWIGUpcast")] + public static extern IntPtr PublicationEvent_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_RegistrationEventUpcast")] - public static extern IntPtr RegistrationEventUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_RegistrationEvent_SWIGUpcast")] + public static extern IntPtr RegistrationEvent_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_SubscriptionEventUpcast")] - public static extern IntPtr SubscriptionEventUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_SubscriptionEvent_SWIGUpcast")] + public static extern IntPtr SubscriptionEvent_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_InviteSessionUpcast")] - public static extern IntPtr InviteSessionUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_InviteSession_SWIGUpcast")] + public static extern IntPtr InviteSession_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_CallSessionUpcast")] - public static extern IntPtr CallSessionUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_CallSession_SWIGUpcast")] + public static extern IntPtr CallSession_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_MsrpSessionUpcast")] - public static extern IntPtr MsrpSessionUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_MsrpSession_SWIGUpcast")] + public static extern IntPtr MsrpSession_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_MessagingSessionUpcast")] - public static extern IntPtr MessagingSessionUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_MessagingSession_SWIGUpcast")] + public static extern IntPtr MessagingSession_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_InfoSessionUpcast")] - public static extern IntPtr InfoSessionUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_InfoSession_SWIGUpcast")] + public static extern IntPtr InfoSession_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_OptionsSessionUpcast")] - public static extern IntPtr OptionsSessionUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_OptionsSession_SWIGUpcast")] + public static extern IntPtr OptionsSession_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_PublicationSessionUpcast")] - public static extern IntPtr PublicationSessionUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_PublicationSession_SWIGUpcast")] + public static extern IntPtr PublicationSession_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_RegistrationSessionUpcast")] - public static extern IntPtr RegistrationSessionUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_RegistrationSession_SWIGUpcast")] + public static extern IntPtr RegistrationSession_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_SubscriptionSessionUpcast")] - public static extern IntPtr SubscriptionSessionUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_SubscriptionSession_SWIGUpcast")] + public static extern IntPtr SubscriptionSession_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_ProxyAudioConsumerUpcast")] - public static extern IntPtr ProxyAudioConsumerUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_ProxyAudioConsumer_SWIGUpcast")] + public static extern IntPtr ProxyAudioConsumer_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_ProxyVideoConsumerUpcast")] - public static extern IntPtr ProxyVideoConsumerUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_ProxyVideoConsumer_SWIGUpcast")] + public static extern IntPtr ProxyVideoConsumer_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_ProxyAudioProducerUpcast")] - public static extern IntPtr ProxyAudioProducerUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_ProxyAudioProducer_SWIGUpcast")] + public static extern IntPtr ProxyAudioProducer_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_ProxyVideoProducerUpcast")] - public static extern IntPtr ProxyVideoProducerUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_ProxyVideoProducer_SWIGUpcast")] + public static extern IntPtr ProxyVideoProducer_SWIGUpcast(IntPtr jarg1); - [DllImport("tinyWRAP", EntryPoint="CSharp_SipStackUpcast")] - public static extern IntPtr SipStackUpcast(IntPtr objectRef); + [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_SWIGUpcast")] + public static extern IntPtr SipStack_SWIGUpcast(IntPtr jarg1); } } diff --git a/branches/2.0/doubango/bindings/csharp/tinyWRAP_wrap.cxx b/branches/2.0/doubango/bindings/csharp/tinyWRAP_wrap.cxx index 2e956ac6..f0f2b255 100644 --- a/branches/2.0/doubango/bindings/csharp/tinyWRAP_wrap.cxx +++ b/branches/2.0/doubango/bindings/csharp/tinyWRAP_wrap.cxx @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make @@ -35,114 +35,114 @@ template T SwigValueInit() { } #endif -/* ----------------------------------------------------------------------------- - * This section contains generic SWIG labels for method/variable - * declarations/attributes, and other compiler dependent labels. - * ----------------------------------------------------------------------------- */ - -/* template workaround for compilers that cannot correctly implement the C++ standard */ -#ifndef SWIGTEMPLATEDISAMBIGUATOR -# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) -# define SWIGTEMPLATEDISAMBIGUATOR template -# elif defined(__HP_aCC) -/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ -/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ -# define SWIGTEMPLATEDISAMBIGUATOR template -# else -# define SWIGTEMPLATEDISAMBIGUATOR -# endif -#endif - -/* inline attribute */ -#ifndef SWIGINLINE -# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) -# define SWIGINLINE inline -# else -# define SWIGINLINE -# endif -#endif - -/* attribute recognised by some compilers to avoid 'unused' warnings */ -#ifndef SWIGUNUSED -# if defined(__GNUC__) -# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -# define SWIGUNUSED __attribute__ ((__unused__)) -# else -# define SWIGUNUSED -# endif -# elif defined(__ICC) -# define SWIGUNUSED __attribute__ ((__unused__)) -# else -# define SWIGUNUSED -# endif -#endif - -#ifndef SWIG_MSC_UNSUPPRESS_4505 -# if defined(_MSC_VER) -# pragma warning(disable : 4505) /* unreferenced local function has been removed */ -# endif -#endif - -#ifndef SWIGUNUSEDPARM -# ifdef __cplusplus -# define SWIGUNUSEDPARM(p) -# else -# define SWIGUNUSEDPARM(p) p SWIGUNUSED -# endif -#endif - -/* internal SWIG method */ -#ifndef SWIGINTERN -# define SWIGINTERN static SWIGUNUSED -#endif - -/* internal inline SWIG method */ -#ifndef SWIGINTERNINLINE -# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE -#endif - -/* exporting methods */ -#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) -# ifndef GCC_HASCLASSVISIBILITY -# define GCC_HASCLASSVISIBILITY -# endif -#endif - -#ifndef SWIGEXPORT -# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) -# if defined(STATIC_LINKED) -# define SWIGEXPORT -# else -# define SWIGEXPORT __declspec(dllexport) -# endif -# else -# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) -# define SWIGEXPORT __attribute__ ((visibility("default"))) -# else -# define SWIGEXPORT -# endif -# endif -#endif - -/* calling conventions for Windows */ -#ifndef SWIGSTDCALL -# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) -# define SWIGSTDCALL __stdcall -# else -# define SWIGSTDCALL -# endif -#endif - -/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ -#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) -# define _CRT_SECURE_NO_DEPRECATE -#endif - -/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ -#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) -# define _SCL_SECURE_NO_DEPRECATE -#endif - +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ + +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif + +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif + +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif + +#ifndef SWIG_MSC_UNSUPPRESS_4505 +# if defined(_MSC_VER) +# pragma warning(disable : 4505) /* unreferenced local function has been removed */ +# endif +#endif + +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif + +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + #include @@ -202,7 +202,7 @@ static SWIG_CSharpException_t SWIG_csharp_exceptions[] = { static SWIG_CSharpExceptionArgument_t SWIG_csharp_exceptions_argument[] = { { SWIG_CSharpArgumentException, NULL }, { SWIG_CSharpArgumentNullException, NULL }, - { SWIG_CSharpArgumentOutOfRangeException, NULL }, + { SWIG_CSharpArgumentOutOfRangeException, NULL } }; static void SWIGUNUSED SWIG_CSharpSetPendingException(SWIG_CSharpExceptionCodes code, const char *msg) { @@ -280,56 +280,53 @@ SWIGEXPORT void SWIGSTDCALL SWIGRegisterStringCallback_tinyWRAP(SWIG_CSharpStrin #define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException, msg, ""); return nullreturn; } else -/* ----------------------------------------------------------------------------- - * See the LICENSE file for information on copyright, usage and redistribution - * of SWIG, and the README file for authors - http://www.swig.org/release.html. - * - * director.swg - * - * This file contains support for director classes so that C# proxy - * methods can be called from C++. - * ----------------------------------------------------------------------------- */ - -#ifdef __cplusplus - -#if defined(DEBUG_DIRECTOR_OWNED) -#include -#endif -#include - -namespace Swig { - /* Director base class - not currently used in C# directors */ - class Director { - }; - - /* Base class for director exceptions */ - class DirectorException { - protected: - std::string swig_msg; - - public: - DirectorException(const char* msg) : swig_msg(msg) { - } - DirectorException(const std::string &msg) : swig_msg(msg) { - } - const std::string& what() const { - return swig_msg; - } - virtual ~DirectorException() { - } - }; - - /* Pure virtual method exception */ - class DirectorPureVirtualException : public Swig::DirectorException { - public: - DirectorPureVirtualException(const char* msg) : DirectorException(std::string("Attempt to invoke pure virtual method ") + msg) { - } - }; -} - -#endif /* __cplusplus */ - - +/* ----------------------------------------------------------------------------- + * director.swg + * + * This file contains support for director classes so that C# proxy + * methods can be called from C++. + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus + +#if defined(DEBUG_DIRECTOR_OWNED) +#include +#endif +#include + +namespace Swig { + /* Director base class - not currently used in C# directors */ + class Director { + }; + + /* Base class for director exceptions */ + class DirectorException { + protected: + std::string swig_msg; + + public: + DirectorException(const char* msg) : swig_msg(msg) { + } + DirectorException(const std::string &msg) : swig_msg(msg) { + } + const std::string& what() const { + return swig_msg; + } + virtual ~DirectorException() { + } + }; + + /* Pure virtual method exception */ + class DirectorPureVirtualException : public Swig::DirectorException { + public: + DirectorPureVirtualException(const char* msg) : DirectorException(std::string("Attempt to invoke pure virtual method ") + msg) { + } + }; +} + +#endif /* __cplusplus */ + + #include // Use the C99 official header @@ -1585,6 +1582,28 @@ SWIGEXPORT unsigned long long SWIGSTDCALL CSharp_MediaSessionMgr_getSessionId(vo } +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_MediaSessionMgr_defaultsSetProfile(int jarg1) { + unsigned int jresult ; + tmedia_profile_t arg1 ; + bool result; + + arg1 = (tmedia_profile_t)jarg1; + result = (bool)MediaSessionMgr::defaultsSetProfile(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_MediaSessionMgr_defaultsGetProfile() { + int jresult ; + tmedia_profile_t result; + + result = (tmedia_profile_t)MediaSessionMgr::defaultsGetProfile(); + jresult = result; + return jresult; +} + + SWIGEXPORT unsigned int SWIGSTDCALL CSharp_MediaSessionMgr_defaultsSetBandwidthLevel(int jarg1) { unsigned int jresult ; tmedia_bandwidth_level_t arg1 ; @@ -1607,6 +1626,18 @@ SWIGEXPORT int SWIGSTDCALL CSharp_MediaSessionMgr_defaultsGetBandwidthLevel() { } +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_MediaSessionMgr_defaultsSetPrefVideoSize(int jarg1) { + unsigned int jresult ; + tmedia_pref_video_size_t arg1 ; + bool result; + + arg1 = (tmedia_pref_video_size_t)jarg1; + result = (bool)MediaSessionMgr::defaultsSetPrefVideoSize(arg1); + jresult = result; + return jresult; +} + + SWIGEXPORT unsigned int SWIGSTDCALL CSharp_MediaSessionMgr_defaultsSetJbMargin(unsigned int jarg1) { unsigned int jresult ; uint32_t arg1 ; @@ -1921,6 +1952,18 @@ SWIGEXPORT unsigned int SWIGSTDCALL CSharp_MediaSessionMgr_defaultsSetSRtpMode(i } +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_MediaSessionMgr_defaultsSetIceEnabled(unsigned int jarg1) { + unsigned int jresult ; + bool arg1 ; + bool result; + + arg1 = jarg1 ? true : false; + result = (bool)MediaSessionMgr::defaultsSetIceEnabled(arg1); + jresult = result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_delete_MediaContent(void * jarg1) { MediaContent *arg1 = (MediaContent *) 0 ; @@ -3446,6 +3489,20 @@ SWIGEXPORT unsigned int SWIGSTDCALL CSharp_CallSession_set100rel(void * jarg1, u } +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_CallSession_setICE(void * jarg1, unsigned int jarg2) { + unsigned int jresult ; + CallSession *arg1 = (CallSession *) 0 ; + bool arg2 ; + bool result; + + arg1 = (CallSession *)jarg1; + arg2 = jarg2 ? true : false; + result = (bool)(arg1)->setICE(arg2); + jresult = result; + return jresult; +} + + SWIGEXPORT unsigned int SWIGSTDCALL CSharp_CallSession_setQoS(void * jarg1, int jarg2, int jarg3) { unsigned int jresult ; CallSession *arg1 = (CallSession *) 0 ; @@ -6697,7 +6754,7 @@ SWIGEXPORT int SWIGSTDCALL CSharp_tsip_event_code_dialog_transport_error_get() { int jresult ; int result; - result = (int) 702; + result = (int)(702); jresult = result; return jresult; } @@ -6707,7 +6764,7 @@ SWIGEXPORT int SWIGSTDCALL CSharp_tsip_event_code_dialog_global_error_get() { int jresult ; int result; - result = (int) 703; + result = (int)(703); jresult = result; return jresult; } @@ -6717,7 +6774,7 @@ SWIGEXPORT int SWIGSTDCALL CSharp_tsip_event_code_dialog_message_error_get() { int jresult ; int result; - result = (int) 704; + result = (int)(704); jresult = result; return jresult; } @@ -6727,7 +6784,7 @@ SWIGEXPORT int SWIGSTDCALL CSharp_tsip_event_code_dialog_request_incoming_get() int jresult ; int result; - result = (int) 800; + result = (int)(800); jresult = result; return jresult; } @@ -6737,7 +6794,7 @@ SWIGEXPORT int SWIGSTDCALL CSharp_tsip_event_code_dialog_request_outgoing_get() int jresult ; int result; - result = (int) 802; + result = (int)(802); jresult = result; return jresult; } @@ -6747,7 +6804,7 @@ SWIGEXPORT int SWIGSTDCALL CSharp_tsip_event_code_dialog_request_cancelled_get() int jresult ; int result; - result = (int) 803; + result = (int)(803); jresult = result; return jresult; } @@ -6757,7 +6814,7 @@ SWIGEXPORT int SWIGSTDCALL CSharp_tsip_event_code_dialog_request_sent_get() { int jresult ; int result; - result = (int) 804; + result = (int)(804); jresult = result; return jresult; } @@ -6767,7 +6824,7 @@ SWIGEXPORT int SWIGSTDCALL CSharp_tsip_event_code_dialog_connecting_get() { int jresult ; int result; - result = (int) 900; + result = (int)(900); jresult = result; return jresult; } @@ -6777,7 +6834,7 @@ SWIGEXPORT int SWIGSTDCALL CSharp_tsip_event_code_dialog_connected_get() { int jresult ; int result; - result = (int) 901; + result = (int)(901); jresult = result; return jresult; } @@ -6787,7 +6844,7 @@ SWIGEXPORT int SWIGSTDCALL CSharp_tsip_event_code_dialog_terminating_get() { int jresult ; int result; - result = (int) 902; + result = (int)(902); jresult = result; return jresult; } @@ -6797,7 +6854,7 @@ SWIGEXPORT int SWIGSTDCALL CSharp_tsip_event_code_dialog_terminated_get() { int jresult ; int result; - result = (int) 903; + result = (int)(903); jresult = result; return jresult; } @@ -6807,7 +6864,7 @@ SWIGEXPORT int SWIGSTDCALL CSharp_tsip_event_code_stack_started_get() { int jresult ; int result; - result = (int) 950; + result = (int)(950); jresult = result; return jresult; } @@ -6817,7 +6874,7 @@ SWIGEXPORT int SWIGSTDCALL CSharp_tsip_event_code_stack_stopped_get() { int jresult ; int result; - result = (int) 951; + result = (int)(951); jresult = result; return jresult; } @@ -6827,7 +6884,7 @@ SWIGEXPORT int SWIGSTDCALL CSharp_tsip_event_code_stack_failed_to_start_get() { int jresult ; int result; - result = (int) 952; + result = (int)(952); jresult = result; return jresult; } @@ -6837,7 +6894,7 @@ SWIGEXPORT int SWIGSTDCALL CSharp_tsip_event_code_stack_failed_to_stop_get() { int jresult ; int result; - result = (int) 953; + result = (int)(953); jresult = result; return jresult; } @@ -8044,100 +8101,100 @@ SWIGEXPORT void SWIGSTDCALL CSharp_MsrpCallback_director_connect(void *objarg, S } -SWIGEXPORT MediaContent * SWIGSTDCALL CSharp_MediaContentCPIMUpcast(MediaContentCPIM *objectRef) { - return (MediaContent *)objectRef; +SWIGEXPORT MediaContent * SWIGSTDCALL CSharp_MediaContentCPIM_SWIGUpcast(MediaContentCPIM *jarg1) { + return (MediaContent *)jarg1; } -SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_DialogEventUpcast(DialogEvent *objectRef) { - return (SipEvent *)objectRef; +SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_DialogEvent_SWIGUpcast(DialogEvent *jarg1) { + return (SipEvent *)jarg1; } -SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_StackEventUpcast(StackEvent *objectRef) { - return (SipEvent *)objectRef; +SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_StackEvent_SWIGUpcast(StackEvent *jarg1) { + return (SipEvent *)jarg1; } -SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_InviteEventUpcast(InviteEvent *objectRef) { - return (SipEvent *)objectRef; +SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_InviteEvent_SWIGUpcast(InviteEvent *jarg1) { + return (SipEvent *)jarg1; } -SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_MessagingEventUpcast(MessagingEvent *objectRef) { - return (SipEvent *)objectRef; +SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_MessagingEvent_SWIGUpcast(MessagingEvent *jarg1) { + return (SipEvent *)jarg1; } -SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_InfoEventUpcast(InfoEvent *objectRef) { - return (SipEvent *)objectRef; +SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_InfoEvent_SWIGUpcast(InfoEvent *jarg1) { + return (SipEvent *)jarg1; } -SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_OptionsEventUpcast(OptionsEvent *objectRef) { - return (SipEvent *)objectRef; +SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_OptionsEvent_SWIGUpcast(OptionsEvent *jarg1) { + return (SipEvent *)jarg1; } -SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_PublicationEventUpcast(PublicationEvent *objectRef) { - return (SipEvent *)objectRef; +SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_PublicationEvent_SWIGUpcast(PublicationEvent *jarg1) { + return (SipEvent *)jarg1; } -SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_RegistrationEventUpcast(RegistrationEvent *objectRef) { - return (SipEvent *)objectRef; +SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_RegistrationEvent_SWIGUpcast(RegistrationEvent *jarg1) { + return (SipEvent *)jarg1; } -SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_SubscriptionEventUpcast(SubscriptionEvent *objectRef) { - return (SipEvent *)objectRef; +SWIGEXPORT SipEvent * SWIGSTDCALL CSharp_SubscriptionEvent_SWIGUpcast(SubscriptionEvent *jarg1) { + return (SipEvent *)jarg1; } -SWIGEXPORT SipSession * SWIGSTDCALL CSharp_InviteSessionUpcast(InviteSession *objectRef) { - return (SipSession *)objectRef; +SWIGEXPORT SipSession * SWIGSTDCALL CSharp_InviteSession_SWIGUpcast(InviteSession *jarg1) { + return (SipSession *)jarg1; } -SWIGEXPORT InviteSession * SWIGSTDCALL CSharp_CallSessionUpcast(CallSession *objectRef) { - return (InviteSession *)objectRef; +SWIGEXPORT InviteSession * SWIGSTDCALL CSharp_CallSession_SWIGUpcast(CallSession *jarg1) { + return (InviteSession *)jarg1; } -SWIGEXPORT InviteSession * SWIGSTDCALL CSharp_MsrpSessionUpcast(MsrpSession *objectRef) { - return (InviteSession *)objectRef; +SWIGEXPORT InviteSession * SWIGSTDCALL CSharp_MsrpSession_SWIGUpcast(MsrpSession *jarg1) { + return (InviteSession *)jarg1; } -SWIGEXPORT SipSession * SWIGSTDCALL CSharp_MessagingSessionUpcast(MessagingSession *objectRef) { - return (SipSession *)objectRef; +SWIGEXPORT SipSession * SWIGSTDCALL CSharp_MessagingSession_SWIGUpcast(MessagingSession *jarg1) { + return (SipSession *)jarg1; } -SWIGEXPORT SipSession * SWIGSTDCALL CSharp_InfoSessionUpcast(InfoSession *objectRef) { - return (SipSession *)objectRef; +SWIGEXPORT SipSession * SWIGSTDCALL CSharp_InfoSession_SWIGUpcast(InfoSession *jarg1) { + return (SipSession *)jarg1; } -SWIGEXPORT SipSession * SWIGSTDCALL CSharp_OptionsSessionUpcast(OptionsSession *objectRef) { - return (SipSession *)objectRef; +SWIGEXPORT SipSession * SWIGSTDCALL CSharp_OptionsSession_SWIGUpcast(OptionsSession *jarg1) { + return (SipSession *)jarg1; } -SWIGEXPORT SipSession * SWIGSTDCALL CSharp_PublicationSessionUpcast(PublicationSession *objectRef) { - return (SipSession *)objectRef; +SWIGEXPORT SipSession * SWIGSTDCALL CSharp_PublicationSession_SWIGUpcast(PublicationSession *jarg1) { + return (SipSession *)jarg1; } -SWIGEXPORT SipSession * SWIGSTDCALL CSharp_RegistrationSessionUpcast(RegistrationSession *objectRef) { - return (SipSession *)objectRef; +SWIGEXPORT SipSession * SWIGSTDCALL CSharp_RegistrationSession_SWIGUpcast(RegistrationSession *jarg1) { + return (SipSession *)jarg1; } -SWIGEXPORT SipSession * SWIGSTDCALL CSharp_SubscriptionSessionUpcast(SubscriptionSession *objectRef) { - return (SipSession *)objectRef; +SWIGEXPORT SipSession * SWIGSTDCALL CSharp_SubscriptionSession_SWIGUpcast(SubscriptionSession *jarg1) { + return (SipSession *)jarg1; } -SWIGEXPORT ProxyPlugin * SWIGSTDCALL CSharp_ProxyAudioConsumerUpcast(ProxyAudioConsumer *objectRef) { - return (ProxyPlugin *)objectRef; +SWIGEXPORT ProxyPlugin * SWIGSTDCALL CSharp_ProxyAudioConsumer_SWIGUpcast(ProxyAudioConsumer *jarg1) { + return (ProxyPlugin *)jarg1; } -SWIGEXPORT ProxyPlugin * SWIGSTDCALL CSharp_ProxyVideoConsumerUpcast(ProxyVideoConsumer *objectRef) { - return (ProxyPlugin *)objectRef; +SWIGEXPORT ProxyPlugin * SWIGSTDCALL CSharp_ProxyVideoConsumer_SWIGUpcast(ProxyVideoConsumer *jarg1) { + return (ProxyPlugin *)jarg1; } -SWIGEXPORT ProxyPlugin * SWIGSTDCALL CSharp_ProxyAudioProducerUpcast(ProxyAudioProducer *objectRef) { - return (ProxyPlugin *)objectRef; +SWIGEXPORT ProxyPlugin * SWIGSTDCALL CSharp_ProxyAudioProducer_SWIGUpcast(ProxyAudioProducer *jarg1) { + return (ProxyPlugin *)jarg1; } -SWIGEXPORT ProxyPlugin * SWIGSTDCALL CSharp_ProxyVideoProducerUpcast(ProxyVideoProducer *objectRef) { - return (ProxyPlugin *)objectRef; +SWIGEXPORT ProxyPlugin * SWIGSTDCALL CSharp_ProxyVideoProducer_SWIGUpcast(ProxyVideoProducer *jarg1) { + return (ProxyPlugin *)jarg1; } -SWIGEXPORT SafeObject * SWIGSTDCALL CSharp_SipStackUpcast(SipStack *objectRef) { - return (SafeObject *)objectRef; +SWIGEXPORT SafeObject * SWIGSTDCALL CSharp_SipStack_SWIGUpcast(SipStack *jarg1) { + return (SafeObject *)jarg1; } #ifdef __cplusplus diff --git a/branches/2.0/doubango/bindings/csharp/tinyWRAP_wrap.h b/branches/2.0/doubango/bindings/csharp/tinyWRAP_wrap.h index 4e63e598..b4e0a0c4 100644 --- a/branches/2.0/doubango/bindings/csharp/tinyWRAP_wrap.h +++ b/branches/2.0/doubango/bindings/csharp/tinyWRAP_wrap.h @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make diff --git a/branches/2.0/doubango/bindings/csharp/tmedia_bandwidth_level_t.cs b/branches/2.0/doubango/bindings/csharp/tmedia_bandwidth_level_t.cs index 9dd278fb..f4839340 100644 --- a/branches/2.0/doubango/bindings/csharp/tmedia_bandwidth_level_t.cs +++ b/branches/2.0/doubango/bindings/csharp/tmedia_bandwidth_level_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/tmedia_chroma_t.cs b/branches/2.0/doubango/bindings/csharp/tmedia_chroma_t.cs index f7427748..eb450ee1 100644 --- a/branches/2.0/doubango/bindings/csharp/tmedia_chroma_t.cs +++ b/branches/2.0/doubango/bindings/csharp/tmedia_chroma_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/tmedia_pref_video_size_t.cs b/branches/2.0/doubango/bindings/csharp/tmedia_pref_video_size_t.cs new file mode 100644 index 00000000..66cb9f1c --- /dev/null +++ b/branches/2.0/doubango/bindings/csharp/tmedia_pref_video_size_t.cs @@ -0,0 +1,26 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +namespace org.doubango.tinyWRAP { + +public enum tmedia_pref_video_size_t { + tmedia_pref_video_size_sqcif, + tmedia_pref_video_size_qcif, + tmedia_pref_video_size_qvga, + tmedia_pref_video_size_cif, + tmedia_pref_video_size_hvga, + tmedia_pref_video_size_vga, + tmedia_pref_video_size_4cif, + tmedia_pref_video_size_svga, + tmedia_pref_video_size_480p, + tmedia_pref_video_size_720p, + tmedia_pref_video_size_16cif, + tmedia_pref_video_size_1080p +} + +} diff --git a/branches/2.0/doubango/bindings/csharp/tmedia_profile_t.cs b/branches/2.0/doubango/bindings/csharp/tmedia_profile_t.cs new file mode 100644 index 00000000..5185d03c --- /dev/null +++ b/branches/2.0/doubango/bindings/csharp/tmedia_profile_t.cs @@ -0,0 +1,16 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +namespace org.doubango.tinyWRAP { + +public enum tmedia_profile_t { + tmedia_profile_default, + tmedia_profile_rtcweb +} + +} diff --git a/branches/2.0/doubango/bindings/csharp/tmedia_qos_strength_t.cs b/branches/2.0/doubango/bindings/csharp/tmedia_qos_strength_t.cs index 6727f16e..6e049018 100644 --- a/branches/2.0/doubango/bindings/csharp/tmedia_qos_strength_t.cs +++ b/branches/2.0/doubango/bindings/csharp/tmedia_qos_strength_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/tmedia_qos_stype_t.cs b/branches/2.0/doubango/bindings/csharp/tmedia_qos_stype_t.cs index 22d93fac..5f9f471d 100644 --- a/branches/2.0/doubango/bindings/csharp/tmedia_qos_stype_t.cs +++ b/branches/2.0/doubango/bindings/csharp/tmedia_qos_stype_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/tmedia_srtp_mode_t.cs b/branches/2.0/doubango/bindings/csharp/tmedia_srtp_mode_t.cs index 741e1a42..1e10e1df 100644 --- a/branches/2.0/doubango/bindings/csharp/tmedia_srtp_mode_t.cs +++ b/branches/2.0/doubango/bindings/csharp/tmedia_srtp_mode_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/tmsrp_event_type_t.cs b/branches/2.0/doubango/bindings/csharp/tmsrp_event_type_t.cs index f11ee64a..817e37d9 100644 --- a/branches/2.0/doubango/bindings/csharp/tmsrp_event_type_t.cs +++ b/branches/2.0/doubango/bindings/csharp/tmsrp_event_type_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/tmsrp_request_type_t.cs b/branches/2.0/doubango/bindings/csharp/tmsrp_request_type_t.cs index a3f53cce..aec5e67f 100644 --- a/branches/2.0/doubango/bindings/csharp/tmsrp_request_type_t.cs +++ b/branches/2.0/doubango/bindings/csharp/tmsrp_request_type_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/tsip_event_type_t.cs b/branches/2.0/doubango/bindings/csharp/tsip_event_type_t.cs index 4ad66edd..e2a1b537 100644 --- a/branches/2.0/doubango/bindings/csharp/tsip_event_type_t.cs +++ b/branches/2.0/doubango/bindings/csharp/tsip_event_type_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/tsip_info_event_type_t.cs b/branches/2.0/doubango/bindings/csharp/tsip_info_event_type_t.cs index 36b43071..4b3357cd 100644 --- a/branches/2.0/doubango/bindings/csharp/tsip_info_event_type_t.cs +++ b/branches/2.0/doubango/bindings/csharp/tsip_info_event_type_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/tsip_invite_event_type_t.cs b/branches/2.0/doubango/bindings/csharp/tsip_invite_event_type_t.cs index 554d5b65..6a7e82ff 100644 --- a/branches/2.0/doubango/bindings/csharp/tsip_invite_event_type_t.cs +++ b/branches/2.0/doubango/bindings/csharp/tsip_invite_event_type_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/tsip_message_event_type_t.cs b/branches/2.0/doubango/bindings/csharp/tsip_message_event_type_t.cs index b4072593..343e36af 100644 --- a/branches/2.0/doubango/bindings/csharp/tsip_message_event_type_t.cs +++ b/branches/2.0/doubango/bindings/csharp/tsip_message_event_type_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/tsip_options_event_type_t.cs b/branches/2.0/doubango/bindings/csharp/tsip_options_event_type_t.cs index b90d62bf..aa6f14ad 100644 --- a/branches/2.0/doubango/bindings/csharp/tsip_options_event_type_t.cs +++ b/branches/2.0/doubango/bindings/csharp/tsip_options_event_type_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/tsip_publish_event_type_t.cs b/branches/2.0/doubango/bindings/csharp/tsip_publish_event_type_t.cs index 52b850b0..c59cd702 100644 --- a/branches/2.0/doubango/bindings/csharp/tsip_publish_event_type_t.cs +++ b/branches/2.0/doubango/bindings/csharp/tsip_publish_event_type_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/tsip_register_event_type_t.cs b/branches/2.0/doubango/bindings/csharp/tsip_register_event_type_t.cs index 7d5929ae..c636c189 100644 --- a/branches/2.0/doubango/bindings/csharp/tsip_register_event_type_t.cs +++ b/branches/2.0/doubango/bindings/csharp/tsip_register_event_type_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/tsip_request_type_t.cs b/branches/2.0/doubango/bindings/csharp/tsip_request_type_t.cs index 2771c382..01e4e162 100644 --- a/branches/2.0/doubango/bindings/csharp/tsip_request_type_t.cs +++ b/branches/2.0/doubango/bindings/csharp/tsip_request_type_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/tsip_subscribe_event_type_t.cs b/branches/2.0/doubango/bindings/csharp/tsip_subscribe_event_type_t.cs index afaa290e..6fdf0cb5 100644 --- a/branches/2.0/doubango/bindings/csharp/tsip_subscribe_event_type_t.cs +++ b/branches/2.0/doubango/bindings/csharp/tsip_subscribe_event_type_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/twrap_media_type_t.cs b/branches/2.0/doubango/bindings/csharp/twrap_media_type_t.cs index b66fcdbd..8d41b68b 100644 --- a/branches/2.0/doubango/bindings/csharp/twrap_media_type_t.cs +++ b/branches/2.0/doubango/bindings/csharp/twrap_media_type_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/twrap_proxy_plugin_type_t.cs b/branches/2.0/doubango/bindings/csharp/twrap_proxy_plugin_type_t.cs index 0e2613e9..e01c7310 100644 --- a/branches/2.0/doubango/bindings/csharp/twrap_proxy_plugin_type_t.cs +++ b/branches/2.0/doubango/bindings/csharp/twrap_proxy_plugin_type_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/twrap_rpmessage_type_t.cs b/branches/2.0/doubango/bindings/csharp/twrap_rpmessage_type_t.cs index 03cde348..ffda5975 100644 --- a/branches/2.0/doubango/bindings/csharp/twrap_rpmessage_type_t.cs +++ b/branches/2.0/doubango/bindings/csharp/twrap_rpmessage_type_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/csharp/twrap_sms_type_t.cs b/branches/2.0/doubango/bindings/csharp/twrap_sms_type_t.cs index 42980dd1..0bdab393 100644 --- a/branches/2.0/doubango/bindings/csharp/twrap_sms_type_t.cs +++ b/branches/2.0/doubango/bindings/csharp/twrap_sms_type_t.cs @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/ActionConfig.java b/branches/2.0/doubango/bindings/java/ActionConfig.java index ff0f9cd2..f3e0acd3 100644 --- a/branches/2.0/doubango/bindings/java/ActionConfig.java +++ b/branches/2.0/doubango/bindings/java/ActionConfig.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ActionConfig { private long swigCPtr; protected boolean swigCMemOwn; - protected ActionConfig(long cPtr, boolean cMemoryOwn) { + public ActionConfig(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ActionConfig obj) { + public static long getCPtr(ActionConfig obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ActionConfig { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ActionConfig(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ActionConfig(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public ActionConfig() { diff --git a/branches/2.0/doubango/bindings/java/AudioResampler.java b/branches/2.0/doubango/bindings/java/AudioResampler.java index 2ced31fb..c9912513 100644 --- a/branches/2.0/doubango/bindings/java/AudioResampler.java +++ b/branches/2.0/doubango/bindings/java/AudioResampler.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class AudioResampler { private long swigCPtr; protected boolean swigCMemOwn; - protected AudioResampler(long cPtr, boolean cMemoryOwn) { + public AudioResampler(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(AudioResampler obj) { + public static long getCPtr(AudioResampler obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class AudioResampler { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_AudioResampler(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_AudioResampler(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public AudioResampler(long nInFreq, long nOutFreq, long nFrameDuration, long nChannels, long nQuality) { diff --git a/branches/2.0/doubango/bindings/java/CallSession.java b/branches/2.0/doubango/bindings/java/CallSession.java index ecc840ec..44b1c50a 100644 --- a/branches/2.0/doubango/bindings/java/CallSession.java +++ b/branches/2.0/doubango/bindings/java/CallSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class CallSession extends InviteSession { private long swigCPtr; - protected CallSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGCallSessionUpcast(cPtr), cMemoryOwn); + public CallSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.CallSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(CallSession obj) { + public static long getCPtr(CallSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class CallSession extends InviteSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_CallSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_CallSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } @@ -93,6 +95,10 @@ public class CallSession extends InviteSession { return tinyWRAPJNI.CallSession_set100rel(swigCPtr, this, enabled); } + public boolean setICE(boolean enabled) { + return tinyWRAPJNI.CallSession_setICE(swigCPtr, this, enabled); + } + public boolean setQoS(tmedia_qos_stype_t type, tmedia_qos_strength_t strength) { return tinyWRAPJNI.CallSession_setQoS(swigCPtr, this, type.swigValue(), strength.swigValue()); } diff --git a/branches/2.0/doubango/bindings/java/DDebugCallback.java b/branches/2.0/doubango/bindings/java/DDebugCallback.java index ebef9cec..604d090b 100644 --- a/branches/2.0/doubango/bindings/java/DDebugCallback.java +++ b/branches/2.0/doubango/bindings/java/DDebugCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class DDebugCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected DDebugCallback(long cPtr, boolean cMemoryOwn) { + public DDebugCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(DDebugCallback obj) { + public static long getCPtr(DDebugCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class DDebugCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_DDebugCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_DDebugCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/DialogEvent.java b/branches/2.0/doubango/bindings/java/DialogEvent.java index ac409f64..9e4692fa 100644 --- a/branches/2.0/doubango/bindings/java/DialogEvent.java +++ b/branches/2.0/doubango/bindings/java/DialogEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class DialogEvent extends SipEvent { private long swigCPtr; - protected DialogEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGDialogEventUpcast(cPtr), cMemoryOwn); + public DialogEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.DialogEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(DialogEvent obj) { + public static long getCPtr(DialogEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class DialogEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_DialogEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_DialogEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/InfoEvent.java b/branches/2.0/doubango/bindings/java/InfoEvent.java index 54cd846d..5b006729 100644 --- a/branches/2.0/doubango/bindings/java/InfoEvent.java +++ b/branches/2.0/doubango/bindings/java/InfoEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class InfoEvent extends SipEvent { private long swigCPtr; - protected InfoEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGInfoEventUpcast(cPtr), cMemoryOwn); + public InfoEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.InfoEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(InfoEvent obj) { + public static long getCPtr(InfoEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class InfoEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_InfoEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_InfoEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/InfoSession.java b/branches/2.0/doubango/bindings/java/InfoSession.java index 8ef82f6f..f6ce584d 100644 --- a/branches/2.0/doubango/bindings/java/InfoSession.java +++ b/branches/2.0/doubango/bindings/java/InfoSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class InfoSession extends SipSession { private long swigCPtr; - protected InfoSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGInfoSessionUpcast(cPtr), cMemoryOwn); + public InfoSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.InfoSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(InfoSession obj) { + public static long getCPtr(InfoSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class InfoSession extends SipSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_InfoSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_InfoSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/InviteEvent.java b/branches/2.0/doubango/bindings/java/InviteEvent.java index e7a79c9e..2449a230 100644 --- a/branches/2.0/doubango/bindings/java/InviteEvent.java +++ b/branches/2.0/doubango/bindings/java/InviteEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class InviteEvent extends SipEvent { private long swigCPtr; - protected InviteEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGInviteEventUpcast(cPtr), cMemoryOwn); + public InviteEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.InviteEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(InviteEvent obj) { + public static long getCPtr(InviteEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class InviteEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_InviteEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_InviteEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/InviteSession.java b/branches/2.0/doubango/bindings/java/InviteSession.java index a42ed88f..94ff5bd1 100644 --- a/branches/2.0/doubango/bindings/java/InviteSession.java +++ b/branches/2.0/doubango/bindings/java/InviteSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class InviteSession extends SipSession { private long swigCPtr; - protected InviteSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGInviteSessionUpcast(cPtr), cMemoryOwn); + public InviteSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.InviteSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(InviteSession obj) { + public static long getCPtr(InviteSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class InviteSession extends SipSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_InviteSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_InviteSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/MediaContent.java b/branches/2.0/doubango/bindings/java/MediaContent.java index 2a499c30..6d54a205 100644 --- a/branches/2.0/doubango/bindings/java/MediaContent.java +++ b/branches/2.0/doubango/bindings/java/MediaContent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class MediaContent { private long swigCPtr; protected boolean swigCMemOwn; - protected MediaContent(long cPtr, boolean cMemoryOwn) { + public MediaContent(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(MediaContent obj) { + public static long getCPtr(MediaContent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class MediaContent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MediaContent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MediaContent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public String getType() { diff --git a/branches/2.0/doubango/bindings/java/MediaContentCPIM.java b/branches/2.0/doubango/bindings/java/MediaContentCPIM.java index b4e53eff..93c2d375 100644 --- a/branches/2.0/doubango/bindings/java/MediaContentCPIM.java +++ b/branches/2.0/doubango/bindings/java/MediaContentCPIM.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class MediaContentCPIM extends MediaContent { private long swigCPtr; - protected MediaContentCPIM(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGMediaContentCPIMUpcast(cPtr), cMemoryOwn); + public MediaContentCPIM(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.MediaContentCPIM_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(MediaContentCPIM obj) { + public static long getCPtr(MediaContentCPIM obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class MediaContentCPIM extends MediaContent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MediaContentCPIM(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MediaContentCPIM(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/MediaSessionMgr.java b/branches/2.0/doubango/bindings/java/MediaSessionMgr.java index 98c5d84b..cfc1887a 100644 --- a/branches/2.0/doubango/bindings/java/MediaSessionMgr.java +++ b/branches/2.0/doubango/bindings/java/MediaSessionMgr.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class MediaSessionMgr { private long swigCPtr; protected boolean swigCMemOwn; - protected MediaSessionMgr(long cPtr, boolean cMemoryOwn) { + public MediaSessionMgr(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(MediaSessionMgr obj) { + public static long getCPtr(MediaSessionMgr obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class MediaSessionMgr { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MediaSessionMgr(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MediaSessionMgr(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public boolean sessionSetInt32(twrap_media_type_t media, String key, int value) { @@ -71,6 +73,14 @@ public class MediaSessionMgr { return tinyWRAPJNI.MediaSessionMgr_getSessionId(swigCPtr, this, media.swigValue()); } + public static boolean defaultsSetProfile(tmedia_profile_t profile) { + return tinyWRAPJNI.MediaSessionMgr_defaultsSetProfile(profile.swigValue()); + } + + public static tmedia_profile_t defaultsGetProfile() { + return tmedia_profile_t.swigToEnum(tinyWRAPJNI.MediaSessionMgr_defaultsGetProfile()); + } + public static boolean defaultsSetBandwidthLevel(tmedia_bandwidth_level_t bl) { return tinyWRAPJNI.MediaSessionMgr_defaultsSetBandwidthLevel(bl.swigValue()); } @@ -79,6 +89,10 @@ public class MediaSessionMgr { return tmedia_bandwidth_level_t.swigToEnum(tinyWRAPJNI.MediaSessionMgr_defaultsGetBandwidthLevel()); } + public static boolean defaultsSetPrefVideoSize(tmedia_pref_video_size_t pref_video_size) { + return tinyWRAPJNI.MediaSessionMgr_defaultsSetPrefVideoSize(pref_video_size.swigValue()); + } + public static boolean defaultsSetJbMargin(long jb_margin_ms) { return tinyWRAPJNI.MediaSessionMgr_defaultsSetJbMargin(jb_margin_ms); } @@ -187,4 +201,8 @@ public class MediaSessionMgr { return tinyWRAPJNI.MediaSessionMgr_defaultsSetSRtpMode(mode.swigValue()); } + public static boolean defaultsSetIceEnabled(boolean ice_enabled) { + return tinyWRAPJNI.MediaSessionMgr_defaultsSetIceEnabled(ice_enabled); + } + } diff --git a/branches/2.0/doubango/bindings/java/MessagingEvent.java b/branches/2.0/doubango/bindings/java/MessagingEvent.java index c502d313..adee48fa 100644 --- a/branches/2.0/doubango/bindings/java/MessagingEvent.java +++ b/branches/2.0/doubango/bindings/java/MessagingEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class MessagingEvent extends SipEvent { private long swigCPtr; - protected MessagingEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGMessagingEventUpcast(cPtr), cMemoryOwn); + public MessagingEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.MessagingEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(MessagingEvent obj) { + public static long getCPtr(MessagingEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class MessagingEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MessagingEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MessagingEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/MessagingSession.java b/branches/2.0/doubango/bindings/java/MessagingSession.java index a59b055d..75e687d5 100644 --- a/branches/2.0/doubango/bindings/java/MessagingSession.java +++ b/branches/2.0/doubango/bindings/java/MessagingSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class MessagingSession extends SipSession { private long swigCPtr; - protected MessagingSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGMessagingSessionUpcast(cPtr), cMemoryOwn); + public MessagingSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.MessagingSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(MessagingSession obj) { + public static long getCPtr(MessagingSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class MessagingSession extends SipSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MessagingSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MessagingSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/MsrpCallback.java b/branches/2.0/doubango/bindings/java/MsrpCallback.java index 35071895..433cb938 100644 --- a/branches/2.0/doubango/bindings/java/MsrpCallback.java +++ b/branches/2.0/doubango/bindings/java/MsrpCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class MsrpCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected MsrpCallback(long cPtr, boolean cMemoryOwn) { + public MsrpCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(MsrpCallback obj) { + public static long getCPtr(MsrpCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class MsrpCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MsrpCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MsrpCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/MsrpEvent.java b/branches/2.0/doubango/bindings/java/MsrpEvent.java index 4703fdea..b8fdefaf 100644 --- a/branches/2.0/doubango/bindings/java/MsrpEvent.java +++ b/branches/2.0/doubango/bindings/java/MsrpEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class MsrpEvent { private long swigCPtr; protected boolean swigCMemOwn; - protected MsrpEvent(long cPtr, boolean cMemoryOwn) { + public MsrpEvent(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(MsrpEvent obj) { + public static long getCPtr(MsrpEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class MsrpEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MsrpEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MsrpEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public tmsrp_event_type_t getType() { diff --git a/branches/2.0/doubango/bindings/java/MsrpMessage.java b/branches/2.0/doubango/bindings/java/MsrpMessage.java index 03340881..03e507c0 100644 --- a/branches/2.0/doubango/bindings/java/MsrpMessage.java +++ b/branches/2.0/doubango/bindings/java/MsrpMessage.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class MsrpMessage { private long swigCPtr; protected boolean swigCMemOwn; - protected MsrpMessage(long cPtr, boolean cMemoryOwn) { + public MsrpMessage(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(MsrpMessage obj) { + public static long getCPtr(MsrpMessage obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class MsrpMessage { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MsrpMessage(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MsrpMessage(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public MsrpMessage() { diff --git a/branches/2.0/doubango/bindings/java/MsrpSession.java b/branches/2.0/doubango/bindings/java/MsrpSession.java index 4ac2c5cf..57a65e00 100644 --- a/branches/2.0/doubango/bindings/java/MsrpSession.java +++ b/branches/2.0/doubango/bindings/java/MsrpSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class MsrpSession extends InviteSession { private long swigCPtr; - protected MsrpSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGMsrpSessionUpcast(cPtr), cMemoryOwn); + public MsrpSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.MsrpSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(MsrpSession obj) { + public static long getCPtr(MsrpSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class MsrpSession extends InviteSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MsrpSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MsrpSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/OptionsEvent.java b/branches/2.0/doubango/bindings/java/OptionsEvent.java index 32fd47c6..f0059693 100644 --- a/branches/2.0/doubango/bindings/java/OptionsEvent.java +++ b/branches/2.0/doubango/bindings/java/OptionsEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class OptionsEvent extends SipEvent { private long swigCPtr; - protected OptionsEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGOptionsEventUpcast(cPtr), cMemoryOwn); + public OptionsEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.OptionsEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(OptionsEvent obj) { + public static long getCPtr(OptionsEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class OptionsEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_OptionsEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_OptionsEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/OptionsSession.java b/branches/2.0/doubango/bindings/java/OptionsSession.java index 5a1698fd..baf42854 100644 --- a/branches/2.0/doubango/bindings/java/OptionsSession.java +++ b/branches/2.0/doubango/bindings/java/OptionsSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class OptionsSession extends SipSession { private long swigCPtr; - protected OptionsSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGOptionsSessionUpcast(cPtr), cMemoryOwn); + public OptionsSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.OptionsSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(OptionsSession obj) { + public static long getCPtr(OptionsSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class OptionsSession extends SipSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_OptionsSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_OptionsSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/ProxyAudioConsumer.java b/branches/2.0/doubango/bindings/java/ProxyAudioConsumer.java index c79089fe..3294e4d3 100644 --- a/branches/2.0/doubango/bindings/java/ProxyAudioConsumer.java +++ b/branches/2.0/doubango/bindings/java/ProxyAudioConsumer.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class ProxyAudioConsumer extends ProxyPlugin { private long swigCPtr; - protected ProxyAudioConsumer(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGProxyAudioConsumerUpcast(cPtr), cMemoryOwn); + public ProxyAudioConsumer(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.ProxyAudioConsumer_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(ProxyAudioConsumer obj) { + public static long getCPtr(ProxyAudioConsumer obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class ProxyAudioConsumer extends ProxyPlugin { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyAudioConsumer(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyAudioConsumer(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/ProxyAudioConsumerCallback.java b/branches/2.0/doubango/bindings/java/ProxyAudioConsumerCallback.java index 3d78ff4f..20aa7e8d 100644 --- a/branches/2.0/doubango/bindings/java/ProxyAudioConsumerCallback.java +++ b/branches/2.0/doubango/bindings/java/ProxyAudioConsumerCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ProxyAudioConsumerCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected ProxyAudioConsumerCallback(long cPtr, boolean cMemoryOwn) { + public ProxyAudioConsumerCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ProxyAudioConsumerCallback obj) { + public static long getCPtr(ProxyAudioConsumerCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ProxyAudioConsumerCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyAudioConsumerCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyAudioConsumerCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/ProxyAudioProducer.java b/branches/2.0/doubango/bindings/java/ProxyAudioProducer.java index 2ab4e60f..7963a6b4 100644 --- a/branches/2.0/doubango/bindings/java/ProxyAudioProducer.java +++ b/branches/2.0/doubango/bindings/java/ProxyAudioProducer.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class ProxyAudioProducer extends ProxyPlugin { private long swigCPtr; - protected ProxyAudioProducer(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGProxyAudioProducerUpcast(cPtr), cMemoryOwn); + public ProxyAudioProducer(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.ProxyAudioProducer_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(ProxyAudioProducer obj) { + public static long getCPtr(ProxyAudioProducer obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class ProxyAudioProducer extends ProxyPlugin { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyAudioProducer(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyAudioProducer(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/ProxyAudioProducerCallback.java b/branches/2.0/doubango/bindings/java/ProxyAudioProducerCallback.java index 1f190e39..48f7d85d 100644 --- a/branches/2.0/doubango/bindings/java/ProxyAudioProducerCallback.java +++ b/branches/2.0/doubango/bindings/java/ProxyAudioProducerCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ProxyAudioProducerCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected ProxyAudioProducerCallback(long cPtr, boolean cMemoryOwn) { + public ProxyAudioProducerCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ProxyAudioProducerCallback obj) { + public static long getCPtr(ProxyAudioProducerCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ProxyAudioProducerCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyAudioProducerCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyAudioProducerCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/ProxyPlugin.java b/branches/2.0/doubango/bindings/java/ProxyPlugin.java index 62e2afc7..7358db4d 100644 --- a/branches/2.0/doubango/bindings/java/ProxyPlugin.java +++ b/branches/2.0/doubango/bindings/java/ProxyPlugin.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ProxyPlugin { private long swigCPtr; protected boolean swigCMemOwn; - protected ProxyPlugin(long cPtr, boolean cMemoryOwn) { + public ProxyPlugin(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ProxyPlugin obj) { + public static long getCPtr(ProxyPlugin obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ProxyPlugin { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyPlugin(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyPlugin(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public twrap_proxy_plugin_type_t getType() { diff --git a/branches/2.0/doubango/bindings/java/ProxyPluginMgr.java b/branches/2.0/doubango/bindings/java/ProxyPluginMgr.java index 31607765..ae4ce168 100644 --- a/branches/2.0/doubango/bindings/java/ProxyPluginMgr.java +++ b/branches/2.0/doubango/bindings/java/ProxyPluginMgr.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ProxyPluginMgr { private long swigCPtr; protected boolean swigCMemOwn; - protected ProxyPluginMgr(long cPtr, boolean cMemoryOwn) { + public ProxyPluginMgr(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ProxyPluginMgr obj) { + public static long getCPtr(ProxyPluginMgr obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ProxyPluginMgr { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyPluginMgr(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyPluginMgr(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public static ProxyPluginMgr createInstance(ProxyPluginMgrCallback pCallback) { diff --git a/branches/2.0/doubango/bindings/java/ProxyPluginMgrCallback.java b/branches/2.0/doubango/bindings/java/ProxyPluginMgrCallback.java index 1a313045..9250ea0e 100644 --- a/branches/2.0/doubango/bindings/java/ProxyPluginMgrCallback.java +++ b/branches/2.0/doubango/bindings/java/ProxyPluginMgrCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ProxyPluginMgrCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected ProxyPluginMgrCallback(long cPtr, boolean cMemoryOwn) { + public ProxyPluginMgrCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ProxyPluginMgrCallback obj) { + public static long getCPtr(ProxyPluginMgrCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ProxyPluginMgrCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyPluginMgrCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyPluginMgrCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/ProxyVideoConsumer.java b/branches/2.0/doubango/bindings/java/ProxyVideoConsumer.java index 8686d61e..8c9a708d 100644 --- a/branches/2.0/doubango/bindings/java/ProxyVideoConsumer.java +++ b/branches/2.0/doubango/bindings/java/ProxyVideoConsumer.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class ProxyVideoConsumer extends ProxyPlugin { private long swigCPtr; - protected ProxyVideoConsumer(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGProxyVideoConsumerUpcast(cPtr), cMemoryOwn); + public ProxyVideoConsumer(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.ProxyVideoConsumer_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(ProxyVideoConsumer obj) { + public static long getCPtr(ProxyVideoConsumer obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class ProxyVideoConsumer extends ProxyPlugin { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyVideoConsumer(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyVideoConsumer(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/ProxyVideoConsumerCallback.java b/branches/2.0/doubango/bindings/java/ProxyVideoConsumerCallback.java index 9a5c01d1..16bc6b50 100644 --- a/branches/2.0/doubango/bindings/java/ProxyVideoConsumerCallback.java +++ b/branches/2.0/doubango/bindings/java/ProxyVideoConsumerCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ProxyVideoConsumerCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected ProxyVideoConsumerCallback(long cPtr, boolean cMemoryOwn) { + public ProxyVideoConsumerCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ProxyVideoConsumerCallback obj) { + public static long getCPtr(ProxyVideoConsumerCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ProxyVideoConsumerCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyVideoConsumerCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyVideoConsumerCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/ProxyVideoFrame.java b/branches/2.0/doubango/bindings/java/ProxyVideoFrame.java index e487bf41..4264cdf9 100644 --- a/branches/2.0/doubango/bindings/java/ProxyVideoFrame.java +++ b/branches/2.0/doubango/bindings/java/ProxyVideoFrame.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ProxyVideoFrame { private long swigCPtr; protected boolean swigCMemOwn; - protected ProxyVideoFrame(long cPtr, boolean cMemoryOwn) { + public ProxyVideoFrame(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ProxyVideoFrame obj) { + public static long getCPtr(ProxyVideoFrame obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ProxyVideoFrame { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyVideoFrame(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyVideoFrame(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public long getSize() { diff --git a/branches/2.0/doubango/bindings/java/ProxyVideoProducer.java b/branches/2.0/doubango/bindings/java/ProxyVideoProducer.java index 1281beac..7b046d2e 100644 --- a/branches/2.0/doubango/bindings/java/ProxyVideoProducer.java +++ b/branches/2.0/doubango/bindings/java/ProxyVideoProducer.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class ProxyVideoProducer extends ProxyPlugin { private long swigCPtr; - protected ProxyVideoProducer(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGProxyVideoProducerUpcast(cPtr), cMemoryOwn); + public ProxyVideoProducer(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.ProxyVideoProducer_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(ProxyVideoProducer obj) { + public static long getCPtr(ProxyVideoProducer obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class ProxyVideoProducer extends ProxyPlugin { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyVideoProducer(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyVideoProducer(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/ProxyVideoProducerCallback.java b/branches/2.0/doubango/bindings/java/ProxyVideoProducerCallback.java index d05440e9..5c7d08b8 100644 --- a/branches/2.0/doubango/bindings/java/ProxyVideoProducerCallback.java +++ b/branches/2.0/doubango/bindings/java/ProxyVideoProducerCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ProxyVideoProducerCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected ProxyVideoProducerCallback(long cPtr, boolean cMemoryOwn) { + public ProxyVideoProducerCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ProxyVideoProducerCallback obj) { + public static long getCPtr(ProxyVideoProducerCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ProxyVideoProducerCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyVideoProducerCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyVideoProducerCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/PublicationEvent.java b/branches/2.0/doubango/bindings/java/PublicationEvent.java index 88541683..3d824593 100644 --- a/branches/2.0/doubango/bindings/java/PublicationEvent.java +++ b/branches/2.0/doubango/bindings/java/PublicationEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class PublicationEvent extends SipEvent { private long swigCPtr; - protected PublicationEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGPublicationEventUpcast(cPtr), cMemoryOwn); + public PublicationEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.PublicationEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(PublicationEvent obj) { + public static long getCPtr(PublicationEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class PublicationEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_PublicationEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_PublicationEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/PublicationSession.java b/branches/2.0/doubango/bindings/java/PublicationSession.java index f80f3dcb..79e5c1d8 100644 --- a/branches/2.0/doubango/bindings/java/PublicationSession.java +++ b/branches/2.0/doubango/bindings/java/PublicationSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class PublicationSession extends SipSession { private long swigCPtr; - protected PublicationSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGPublicationSessionUpcast(cPtr), cMemoryOwn); + public PublicationSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.PublicationSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(PublicationSession obj) { + public static long getCPtr(PublicationSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class PublicationSession extends SipSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_PublicationSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_PublicationSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/RPMessage.java b/branches/2.0/doubango/bindings/java/RPMessage.java index 711f9907..9e0f5439 100644 --- a/branches/2.0/doubango/bindings/java/RPMessage.java +++ b/branches/2.0/doubango/bindings/java/RPMessage.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class RPMessage { private long swigCPtr; protected boolean swigCMemOwn; - protected RPMessage(long cPtr, boolean cMemoryOwn) { + public RPMessage(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(RPMessage obj) { + public static long getCPtr(RPMessage obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class RPMessage { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_RPMessage(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_RPMessage(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public RPMessage() { diff --git a/branches/2.0/doubango/bindings/java/RegistrationEvent.java b/branches/2.0/doubango/bindings/java/RegistrationEvent.java index 6ae317b1..7aba3521 100644 --- a/branches/2.0/doubango/bindings/java/RegistrationEvent.java +++ b/branches/2.0/doubango/bindings/java/RegistrationEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class RegistrationEvent extends SipEvent { private long swigCPtr; - protected RegistrationEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGRegistrationEventUpcast(cPtr), cMemoryOwn); + public RegistrationEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.RegistrationEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(RegistrationEvent obj) { + public static long getCPtr(RegistrationEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class RegistrationEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_RegistrationEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_RegistrationEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/RegistrationSession.java b/branches/2.0/doubango/bindings/java/RegistrationSession.java index 08305ef5..49f89a41 100644 --- a/branches/2.0/doubango/bindings/java/RegistrationSession.java +++ b/branches/2.0/doubango/bindings/java/RegistrationSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class RegistrationSession extends SipSession { private long swigCPtr; - protected RegistrationSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGRegistrationSessionUpcast(cPtr), cMemoryOwn); + public RegistrationSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.RegistrationSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(RegistrationSession obj) { + public static long getCPtr(RegistrationSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class RegistrationSession extends SipSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_RegistrationSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_RegistrationSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/SMSData.java b/branches/2.0/doubango/bindings/java/SMSData.java index 12957ecd..1dda6d14 100644 --- a/branches/2.0/doubango/bindings/java/SMSData.java +++ b/branches/2.0/doubango/bindings/java/SMSData.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SMSData { private long swigCPtr; protected boolean swigCMemOwn; - protected SMSData(long cPtr, boolean cMemoryOwn) { + public SMSData(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SMSData obj) { + public static long getCPtr(SMSData obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SMSData { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SMSData(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SMSData(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public SMSData() { diff --git a/branches/2.0/doubango/bindings/java/SMSEncoder.java b/branches/2.0/doubango/bindings/java/SMSEncoder.java index 3e445730..9af2aa59 100644 --- a/branches/2.0/doubango/bindings/java/SMSEncoder.java +++ b/branches/2.0/doubango/bindings/java/SMSEncoder.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SMSEncoder { private long swigCPtr; protected boolean swigCMemOwn; - protected SMSEncoder(long cPtr, boolean cMemoryOwn) { + public SMSEncoder(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SMSEncoder obj) { + public static long getCPtr(SMSEncoder obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SMSEncoder { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SMSEncoder(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SMSEncoder(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public static RPMessage encodeSubmit(int mr, String smsc, String destination, String ascii) { diff --git a/branches/2.0/doubango/bindings/java/SafeObject.java b/branches/2.0/doubango/bindings/java/SafeObject.java index 4cef0759..cde86033 100644 --- a/branches/2.0/doubango/bindings/java/SafeObject.java +++ b/branches/2.0/doubango/bindings/java/SafeObject.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SafeObject { private long swigCPtr; protected boolean swigCMemOwn; - protected SafeObject(long cPtr, boolean cMemoryOwn) { + public SafeObject(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SafeObject obj) { + public static long getCPtr(SafeObject obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SafeObject { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SafeObject(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SafeObject(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public SafeObject() { diff --git a/branches/2.0/doubango/bindings/java/SdpMessage.java b/branches/2.0/doubango/bindings/java/SdpMessage.java index 410ba163..3318a1e5 100644 --- a/branches/2.0/doubango/bindings/java/SdpMessage.java +++ b/branches/2.0/doubango/bindings/java/SdpMessage.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SdpMessage { private long swigCPtr; protected boolean swigCMemOwn; - protected SdpMessage(long cPtr, boolean cMemoryOwn) { + public SdpMessage(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SdpMessage obj) { + public static long getCPtr(SdpMessage obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SdpMessage { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SdpMessage(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SdpMessage(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public SdpMessage() { diff --git a/branches/2.0/doubango/bindings/java/SipCallback.java b/branches/2.0/doubango/bindings/java/SipCallback.java index c1e62ba5..ff07c19c 100644 --- a/branches/2.0/doubango/bindings/java/SipCallback.java +++ b/branches/2.0/doubango/bindings/java/SipCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SipCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected SipCallback(long cPtr, boolean cMemoryOwn) { + public SipCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SipCallback obj) { + public static long getCPtr(SipCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SipCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SipCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SipCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/SipEvent.java b/branches/2.0/doubango/bindings/java/SipEvent.java index 48cab3a9..41e65493 100644 --- a/branches/2.0/doubango/bindings/java/SipEvent.java +++ b/branches/2.0/doubango/bindings/java/SipEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SipEvent { private long swigCPtr; protected boolean swigCMemOwn; - protected SipEvent(long cPtr, boolean cMemoryOwn) { + public SipEvent(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SipEvent obj) { + public static long getCPtr(SipEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SipEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SipEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public short getCode() { diff --git a/branches/2.0/doubango/bindings/java/SipMessage.java b/branches/2.0/doubango/bindings/java/SipMessage.java index b968cd39..df29460a 100644 --- a/branches/2.0/doubango/bindings/java/SipMessage.java +++ b/branches/2.0/doubango/bindings/java/SipMessage.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SipMessage { private long swigCPtr; protected boolean swigCMemOwn; - protected SipMessage(long cPtr, boolean cMemoryOwn) { + public SipMessage(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SipMessage obj) { + public static long getCPtr(SipMessage obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SipMessage { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SipMessage(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SipMessage(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public byte[] getSipContent() { diff --git a/branches/2.0/doubango/bindings/java/SipSession.java b/branches/2.0/doubango/bindings/java/SipSession.java index eaff336c..781a645d 100644 --- a/branches/2.0/doubango/bindings/java/SipSession.java +++ b/branches/2.0/doubango/bindings/java/SipSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SipSession { private long swigCPtr; protected boolean swigCMemOwn; - protected SipSession(long cPtr, boolean cMemoryOwn) { + public SipSession(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SipSession obj) { + public static long getCPtr(SipSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SipSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SipSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SipSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected java.nio.ByteBuffer getByteBuffer(byte[] bytes) { diff --git a/branches/2.0/doubango/bindings/java/SipStack.java b/branches/2.0/doubango/bindings/java/SipStack.java index f0f8a346..351cd804 100644 --- a/branches/2.0/doubango/bindings/java/SipStack.java +++ b/branches/2.0/doubango/bindings/java/SipStack.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class SipStack extends SafeObject { private long swigCPtr; - protected SipStack(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGSipStackUpcast(cPtr), cMemoryOwn); + public SipStack(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.SipStack_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(SipStack obj) { + public static long getCPtr(SipStack obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class SipStack extends SafeObject { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SipStack(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SipStack(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/SipUri.java b/branches/2.0/doubango/bindings/java/SipUri.java index be2fb7ad..8e1b9eb9 100644 --- a/branches/2.0/doubango/bindings/java/SipUri.java +++ b/branches/2.0/doubango/bindings/java/SipUri.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SipUri { private long swigCPtr; protected boolean swigCMemOwn; - protected SipUri(long cPtr, boolean cMemoryOwn) { + public SipUri(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SipUri obj) { + public static long getCPtr(SipUri obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SipUri { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SipUri(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SipUri(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public SipUri(String uriString, String displayName) { diff --git a/branches/2.0/doubango/bindings/java/StackEvent.java b/branches/2.0/doubango/bindings/java/StackEvent.java index ee0ba843..98aa6a95 100644 --- a/branches/2.0/doubango/bindings/java/StackEvent.java +++ b/branches/2.0/doubango/bindings/java/StackEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class StackEvent extends SipEvent { private long swigCPtr; - protected StackEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGStackEventUpcast(cPtr), cMemoryOwn); + public StackEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.StackEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(StackEvent obj) { + public static long getCPtr(StackEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class StackEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_StackEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_StackEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/SubscriptionEvent.java b/branches/2.0/doubango/bindings/java/SubscriptionEvent.java index 03d6345c..688913bf 100644 --- a/branches/2.0/doubango/bindings/java/SubscriptionEvent.java +++ b/branches/2.0/doubango/bindings/java/SubscriptionEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class SubscriptionEvent extends SipEvent { private long swigCPtr; - protected SubscriptionEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGSubscriptionEventUpcast(cPtr), cMemoryOwn); + public SubscriptionEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.SubscriptionEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(SubscriptionEvent obj) { + public static long getCPtr(SubscriptionEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class SubscriptionEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SubscriptionEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SubscriptionEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/SubscriptionSession.java b/branches/2.0/doubango/bindings/java/SubscriptionSession.java index a69036a9..322655c3 100644 --- a/branches/2.0/doubango/bindings/java/SubscriptionSession.java +++ b/branches/2.0/doubango/bindings/java/SubscriptionSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class SubscriptionSession extends SipSession { private long swigCPtr; - protected SubscriptionSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGSubscriptionSessionUpcast(cPtr), cMemoryOwn); + public SubscriptionSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.SubscriptionSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(SubscriptionSession obj) { + public static long getCPtr(SubscriptionSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class SubscriptionSession extends SipSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SubscriptionSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SubscriptionSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/XcapCallback.java b/branches/2.0/doubango/bindings/java/XcapCallback.java index 030d99b8..0bb9af07 100644 --- a/branches/2.0/doubango/bindings/java/XcapCallback.java +++ b/branches/2.0/doubango/bindings/java/XcapCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class XcapCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected XcapCallback(long cPtr, boolean cMemoryOwn) { + public XcapCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(XcapCallback obj) { + public static long getCPtr(XcapCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class XcapCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_XcapCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_XcapCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/XcapEvent.java b/branches/2.0/doubango/bindings/java/XcapEvent.java index 86ed7971..f6f0940a 100644 --- a/branches/2.0/doubango/bindings/java/XcapEvent.java +++ b/branches/2.0/doubango/bindings/java/XcapEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class XcapEvent { private long swigCPtr; protected boolean swigCMemOwn; - protected XcapEvent(long cPtr, boolean cMemoryOwn) { + public XcapEvent(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(XcapEvent obj) { + public static long getCPtr(XcapEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class XcapEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_XcapEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_XcapEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public thttp_event_type_t getType() { diff --git a/branches/2.0/doubango/bindings/java/XcapMessage.java b/branches/2.0/doubango/bindings/java/XcapMessage.java index 07dbfbb8..1dc578bc 100644 --- a/branches/2.0/doubango/bindings/java/XcapMessage.java +++ b/branches/2.0/doubango/bindings/java/XcapMessage.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class XcapMessage { private long swigCPtr; protected boolean swigCMemOwn; - protected XcapMessage(long cPtr, boolean cMemoryOwn) { + public XcapMessage(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(XcapMessage obj) { + public static long getCPtr(XcapMessage obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class XcapMessage { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_XcapMessage(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_XcapMessage(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public byte[] getXcapContent() { diff --git a/branches/2.0/doubango/bindings/java/XcapSelector.java b/branches/2.0/doubango/bindings/java/XcapSelector.java index efcda497..467cc441 100644 --- a/branches/2.0/doubango/bindings/java/XcapSelector.java +++ b/branches/2.0/doubango/bindings/java/XcapSelector.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class XcapSelector { private long swigCPtr; protected boolean swigCMemOwn; - protected XcapSelector(long cPtr, boolean cMemoryOwn) { + public XcapSelector(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(XcapSelector obj) { + public static long getCPtr(XcapSelector obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class XcapSelector { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_XcapSelector(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_XcapSelector(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public XcapSelector(XcapStack stack) { diff --git a/branches/2.0/doubango/bindings/java/XcapStack.java b/branches/2.0/doubango/bindings/java/XcapStack.java index 95d28e9d..d8c5f62d 100644 --- a/branches/2.0/doubango/bindings/java/XcapStack.java +++ b/branches/2.0/doubango/bindings/java/XcapStack.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class XcapStack { private long swigCPtr; protected boolean swigCMemOwn; - protected XcapStack(long cPtr, boolean cMemoryOwn) { + public XcapStack(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(XcapStack obj) { + public static long getCPtr(XcapStack obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class XcapStack { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_XcapStack(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_XcapStack(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public XcapStack(XcapCallback callback, String xui, String password, String xcap_root) { diff --git a/branches/2.0/doubango/bindings/java/android/ActionConfig.java b/branches/2.0/doubango/bindings/java/android/ActionConfig.java index ff0f9cd2..f3e0acd3 100644 --- a/branches/2.0/doubango/bindings/java/android/ActionConfig.java +++ b/branches/2.0/doubango/bindings/java/android/ActionConfig.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ActionConfig { private long swigCPtr; protected boolean swigCMemOwn; - protected ActionConfig(long cPtr, boolean cMemoryOwn) { + public ActionConfig(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ActionConfig obj) { + public static long getCPtr(ActionConfig obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ActionConfig { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ActionConfig(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ActionConfig(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public ActionConfig() { diff --git a/branches/2.0/doubango/bindings/java/android/AudioResampler.java b/branches/2.0/doubango/bindings/java/android/AudioResampler.java index 2ced31fb..c9912513 100644 --- a/branches/2.0/doubango/bindings/java/android/AudioResampler.java +++ b/branches/2.0/doubango/bindings/java/android/AudioResampler.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class AudioResampler { private long swigCPtr; protected boolean swigCMemOwn; - protected AudioResampler(long cPtr, boolean cMemoryOwn) { + public AudioResampler(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(AudioResampler obj) { + public static long getCPtr(AudioResampler obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class AudioResampler { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_AudioResampler(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_AudioResampler(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public AudioResampler(long nInFreq, long nOutFreq, long nFrameDuration, long nChannels, long nQuality) { diff --git a/branches/2.0/doubango/bindings/java/android/CallSession.java b/branches/2.0/doubango/bindings/java/android/CallSession.java index ecc840ec..44b1c50a 100644 --- a/branches/2.0/doubango/bindings/java/android/CallSession.java +++ b/branches/2.0/doubango/bindings/java/android/CallSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class CallSession extends InviteSession { private long swigCPtr; - protected CallSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGCallSessionUpcast(cPtr), cMemoryOwn); + public CallSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.CallSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(CallSession obj) { + public static long getCPtr(CallSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class CallSession extends InviteSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_CallSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_CallSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } @@ -93,6 +95,10 @@ public class CallSession extends InviteSession { return tinyWRAPJNI.CallSession_set100rel(swigCPtr, this, enabled); } + public boolean setICE(boolean enabled) { + return tinyWRAPJNI.CallSession_setICE(swigCPtr, this, enabled); + } + public boolean setQoS(tmedia_qos_stype_t type, tmedia_qos_strength_t strength) { return tinyWRAPJNI.CallSession_setQoS(swigCPtr, this, type.swigValue(), strength.swigValue()); } diff --git a/branches/2.0/doubango/bindings/java/android/DDebugCallback.java b/branches/2.0/doubango/bindings/java/android/DDebugCallback.java index e84922c4..d27436d9 100644 --- a/branches/2.0/doubango/bindings/java/android/DDebugCallback.java +++ b/branches/2.0/doubango/bindings/java/android/DDebugCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class DDebugCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected DDebugCallback(long cPtr, boolean cMemoryOwn) { + public DDebugCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(DDebugCallback obj) { + public static long getCPtr(DDebugCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class DDebugCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_DDebugCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_DDebugCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/android/DialogEvent.java b/branches/2.0/doubango/bindings/java/android/DialogEvent.java index ac409f64..9e4692fa 100644 --- a/branches/2.0/doubango/bindings/java/android/DialogEvent.java +++ b/branches/2.0/doubango/bindings/java/android/DialogEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class DialogEvent extends SipEvent { private long swigCPtr; - protected DialogEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGDialogEventUpcast(cPtr), cMemoryOwn); + public DialogEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.DialogEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(DialogEvent obj) { + public static long getCPtr(DialogEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class DialogEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_DialogEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_DialogEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/InfoEvent.java b/branches/2.0/doubango/bindings/java/android/InfoEvent.java index 54cd846d..5b006729 100644 --- a/branches/2.0/doubango/bindings/java/android/InfoEvent.java +++ b/branches/2.0/doubango/bindings/java/android/InfoEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class InfoEvent extends SipEvent { private long swigCPtr; - protected InfoEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGInfoEventUpcast(cPtr), cMemoryOwn); + public InfoEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.InfoEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(InfoEvent obj) { + public static long getCPtr(InfoEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class InfoEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_InfoEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_InfoEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/InfoSession.java b/branches/2.0/doubango/bindings/java/android/InfoSession.java index 8ef82f6f..f6ce584d 100644 --- a/branches/2.0/doubango/bindings/java/android/InfoSession.java +++ b/branches/2.0/doubango/bindings/java/android/InfoSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class InfoSession extends SipSession { private long swigCPtr; - protected InfoSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGInfoSessionUpcast(cPtr), cMemoryOwn); + public InfoSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.InfoSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(InfoSession obj) { + public static long getCPtr(InfoSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class InfoSession extends SipSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_InfoSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_InfoSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/InviteEvent.java b/branches/2.0/doubango/bindings/java/android/InviteEvent.java index e7a79c9e..2449a230 100644 --- a/branches/2.0/doubango/bindings/java/android/InviteEvent.java +++ b/branches/2.0/doubango/bindings/java/android/InviteEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class InviteEvent extends SipEvent { private long swigCPtr; - protected InviteEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGInviteEventUpcast(cPtr), cMemoryOwn); + public InviteEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.InviteEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(InviteEvent obj) { + public static long getCPtr(InviteEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class InviteEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_InviteEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_InviteEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/InviteSession.java b/branches/2.0/doubango/bindings/java/android/InviteSession.java index a42ed88f..94ff5bd1 100644 --- a/branches/2.0/doubango/bindings/java/android/InviteSession.java +++ b/branches/2.0/doubango/bindings/java/android/InviteSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class InviteSession extends SipSession { private long swigCPtr; - protected InviteSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGInviteSessionUpcast(cPtr), cMemoryOwn); + public InviteSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.InviteSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(InviteSession obj) { + public static long getCPtr(InviteSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class InviteSession extends SipSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_InviteSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_InviteSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/MediaContent.java b/branches/2.0/doubango/bindings/java/android/MediaContent.java index 2a499c30..6d54a205 100644 --- a/branches/2.0/doubango/bindings/java/android/MediaContent.java +++ b/branches/2.0/doubango/bindings/java/android/MediaContent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class MediaContent { private long swigCPtr; protected boolean swigCMemOwn; - protected MediaContent(long cPtr, boolean cMemoryOwn) { + public MediaContent(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(MediaContent obj) { + public static long getCPtr(MediaContent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class MediaContent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MediaContent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MediaContent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public String getType() { diff --git a/branches/2.0/doubango/bindings/java/android/MediaContentCPIM.java b/branches/2.0/doubango/bindings/java/android/MediaContentCPIM.java index b4e53eff..93c2d375 100644 --- a/branches/2.0/doubango/bindings/java/android/MediaContentCPIM.java +++ b/branches/2.0/doubango/bindings/java/android/MediaContentCPIM.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class MediaContentCPIM extends MediaContent { private long swigCPtr; - protected MediaContentCPIM(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGMediaContentCPIMUpcast(cPtr), cMemoryOwn); + public MediaContentCPIM(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.MediaContentCPIM_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(MediaContentCPIM obj) { + public static long getCPtr(MediaContentCPIM obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class MediaContentCPIM extends MediaContent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MediaContentCPIM(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MediaContentCPIM(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/MediaSessionMgr.java b/branches/2.0/doubango/bindings/java/android/MediaSessionMgr.java index 98c5d84b..cfc1887a 100644 --- a/branches/2.0/doubango/bindings/java/android/MediaSessionMgr.java +++ b/branches/2.0/doubango/bindings/java/android/MediaSessionMgr.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class MediaSessionMgr { private long swigCPtr; protected boolean swigCMemOwn; - protected MediaSessionMgr(long cPtr, boolean cMemoryOwn) { + public MediaSessionMgr(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(MediaSessionMgr obj) { + public static long getCPtr(MediaSessionMgr obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class MediaSessionMgr { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MediaSessionMgr(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MediaSessionMgr(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public boolean sessionSetInt32(twrap_media_type_t media, String key, int value) { @@ -71,6 +73,14 @@ public class MediaSessionMgr { return tinyWRAPJNI.MediaSessionMgr_getSessionId(swigCPtr, this, media.swigValue()); } + public static boolean defaultsSetProfile(tmedia_profile_t profile) { + return tinyWRAPJNI.MediaSessionMgr_defaultsSetProfile(profile.swigValue()); + } + + public static tmedia_profile_t defaultsGetProfile() { + return tmedia_profile_t.swigToEnum(tinyWRAPJNI.MediaSessionMgr_defaultsGetProfile()); + } + public static boolean defaultsSetBandwidthLevel(tmedia_bandwidth_level_t bl) { return tinyWRAPJNI.MediaSessionMgr_defaultsSetBandwidthLevel(bl.swigValue()); } @@ -79,6 +89,10 @@ public class MediaSessionMgr { return tmedia_bandwidth_level_t.swigToEnum(tinyWRAPJNI.MediaSessionMgr_defaultsGetBandwidthLevel()); } + public static boolean defaultsSetPrefVideoSize(tmedia_pref_video_size_t pref_video_size) { + return tinyWRAPJNI.MediaSessionMgr_defaultsSetPrefVideoSize(pref_video_size.swigValue()); + } + public static boolean defaultsSetJbMargin(long jb_margin_ms) { return tinyWRAPJNI.MediaSessionMgr_defaultsSetJbMargin(jb_margin_ms); } @@ -187,4 +201,8 @@ public class MediaSessionMgr { return tinyWRAPJNI.MediaSessionMgr_defaultsSetSRtpMode(mode.swigValue()); } + public static boolean defaultsSetIceEnabled(boolean ice_enabled) { + return tinyWRAPJNI.MediaSessionMgr_defaultsSetIceEnabled(ice_enabled); + } + } diff --git a/branches/2.0/doubango/bindings/java/android/MessagingEvent.java b/branches/2.0/doubango/bindings/java/android/MessagingEvent.java index c502d313..adee48fa 100644 --- a/branches/2.0/doubango/bindings/java/android/MessagingEvent.java +++ b/branches/2.0/doubango/bindings/java/android/MessagingEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class MessagingEvent extends SipEvent { private long swigCPtr; - protected MessagingEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGMessagingEventUpcast(cPtr), cMemoryOwn); + public MessagingEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.MessagingEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(MessagingEvent obj) { + public static long getCPtr(MessagingEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class MessagingEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MessagingEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MessagingEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/MessagingSession.java b/branches/2.0/doubango/bindings/java/android/MessagingSession.java index a59b055d..75e687d5 100644 --- a/branches/2.0/doubango/bindings/java/android/MessagingSession.java +++ b/branches/2.0/doubango/bindings/java/android/MessagingSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class MessagingSession extends SipSession { private long swigCPtr; - protected MessagingSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGMessagingSessionUpcast(cPtr), cMemoryOwn); + public MessagingSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.MessagingSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(MessagingSession obj) { + public static long getCPtr(MessagingSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class MessagingSession extends SipSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MessagingSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MessagingSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/MsrpCallback.java b/branches/2.0/doubango/bindings/java/android/MsrpCallback.java index 021bd93c..c64e578c 100644 --- a/branches/2.0/doubango/bindings/java/android/MsrpCallback.java +++ b/branches/2.0/doubango/bindings/java/android/MsrpCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class MsrpCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected MsrpCallback(long cPtr, boolean cMemoryOwn) { + public MsrpCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(MsrpCallback obj) { + public static long getCPtr(MsrpCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class MsrpCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MsrpCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MsrpCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/android/MsrpEvent.java b/branches/2.0/doubango/bindings/java/android/MsrpEvent.java index 4703fdea..b8fdefaf 100644 --- a/branches/2.0/doubango/bindings/java/android/MsrpEvent.java +++ b/branches/2.0/doubango/bindings/java/android/MsrpEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class MsrpEvent { private long swigCPtr; protected boolean swigCMemOwn; - protected MsrpEvent(long cPtr, boolean cMemoryOwn) { + public MsrpEvent(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(MsrpEvent obj) { + public static long getCPtr(MsrpEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class MsrpEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MsrpEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MsrpEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public tmsrp_event_type_t getType() { diff --git a/branches/2.0/doubango/bindings/java/android/MsrpMessage.java b/branches/2.0/doubango/bindings/java/android/MsrpMessage.java index 03340881..03e507c0 100644 --- a/branches/2.0/doubango/bindings/java/android/MsrpMessage.java +++ b/branches/2.0/doubango/bindings/java/android/MsrpMessage.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class MsrpMessage { private long swigCPtr; protected boolean swigCMemOwn; - protected MsrpMessage(long cPtr, boolean cMemoryOwn) { + public MsrpMessage(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(MsrpMessage obj) { + public static long getCPtr(MsrpMessage obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class MsrpMessage { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MsrpMessage(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MsrpMessage(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public MsrpMessage() { diff --git a/branches/2.0/doubango/bindings/java/android/MsrpSession.java b/branches/2.0/doubango/bindings/java/android/MsrpSession.java index 4ac2c5cf..57a65e00 100644 --- a/branches/2.0/doubango/bindings/java/android/MsrpSession.java +++ b/branches/2.0/doubango/bindings/java/android/MsrpSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class MsrpSession extends InviteSession { private long swigCPtr; - protected MsrpSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGMsrpSessionUpcast(cPtr), cMemoryOwn); + public MsrpSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.MsrpSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(MsrpSession obj) { + public static long getCPtr(MsrpSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class MsrpSession extends InviteSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_MsrpSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_MsrpSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/OptionsEvent.java b/branches/2.0/doubango/bindings/java/android/OptionsEvent.java index 32fd47c6..f0059693 100644 --- a/branches/2.0/doubango/bindings/java/android/OptionsEvent.java +++ b/branches/2.0/doubango/bindings/java/android/OptionsEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class OptionsEvent extends SipEvent { private long swigCPtr; - protected OptionsEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGOptionsEventUpcast(cPtr), cMemoryOwn); + public OptionsEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.OptionsEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(OptionsEvent obj) { + public static long getCPtr(OptionsEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class OptionsEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_OptionsEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_OptionsEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/OptionsSession.java b/branches/2.0/doubango/bindings/java/android/OptionsSession.java index 5a1698fd..baf42854 100644 --- a/branches/2.0/doubango/bindings/java/android/OptionsSession.java +++ b/branches/2.0/doubango/bindings/java/android/OptionsSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class OptionsSession extends SipSession { private long swigCPtr; - protected OptionsSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGOptionsSessionUpcast(cPtr), cMemoryOwn); + public OptionsSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.OptionsSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(OptionsSession obj) { + public static long getCPtr(OptionsSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class OptionsSession extends SipSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_OptionsSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_OptionsSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/ProxyAudioConsumer.java b/branches/2.0/doubango/bindings/java/android/ProxyAudioConsumer.java index c79089fe..3294e4d3 100644 --- a/branches/2.0/doubango/bindings/java/android/ProxyAudioConsumer.java +++ b/branches/2.0/doubango/bindings/java/android/ProxyAudioConsumer.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class ProxyAudioConsumer extends ProxyPlugin { private long swigCPtr; - protected ProxyAudioConsumer(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGProxyAudioConsumerUpcast(cPtr), cMemoryOwn); + public ProxyAudioConsumer(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.ProxyAudioConsumer_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(ProxyAudioConsumer obj) { + public static long getCPtr(ProxyAudioConsumer obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class ProxyAudioConsumer extends ProxyPlugin { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyAudioConsumer(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyAudioConsumer(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/ProxyAudioConsumerCallback.java b/branches/2.0/doubango/bindings/java/android/ProxyAudioConsumerCallback.java index 836c7e8f..26341dd4 100644 --- a/branches/2.0/doubango/bindings/java/android/ProxyAudioConsumerCallback.java +++ b/branches/2.0/doubango/bindings/java/android/ProxyAudioConsumerCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ProxyAudioConsumerCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected ProxyAudioConsumerCallback(long cPtr, boolean cMemoryOwn) { + public ProxyAudioConsumerCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ProxyAudioConsumerCallback obj) { + public static long getCPtr(ProxyAudioConsumerCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ProxyAudioConsumerCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyAudioConsumerCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyAudioConsumerCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/android/ProxyAudioProducer.java b/branches/2.0/doubango/bindings/java/android/ProxyAudioProducer.java index 2ab4e60f..7963a6b4 100644 --- a/branches/2.0/doubango/bindings/java/android/ProxyAudioProducer.java +++ b/branches/2.0/doubango/bindings/java/android/ProxyAudioProducer.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class ProxyAudioProducer extends ProxyPlugin { private long swigCPtr; - protected ProxyAudioProducer(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGProxyAudioProducerUpcast(cPtr), cMemoryOwn); + public ProxyAudioProducer(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.ProxyAudioProducer_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(ProxyAudioProducer obj) { + public static long getCPtr(ProxyAudioProducer obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class ProxyAudioProducer extends ProxyPlugin { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyAudioProducer(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyAudioProducer(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/ProxyAudioProducerCallback.java b/branches/2.0/doubango/bindings/java/android/ProxyAudioProducerCallback.java index a54e2812..728d00d9 100644 --- a/branches/2.0/doubango/bindings/java/android/ProxyAudioProducerCallback.java +++ b/branches/2.0/doubango/bindings/java/android/ProxyAudioProducerCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ProxyAudioProducerCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected ProxyAudioProducerCallback(long cPtr, boolean cMemoryOwn) { + public ProxyAudioProducerCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ProxyAudioProducerCallback obj) { + public static long getCPtr(ProxyAudioProducerCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ProxyAudioProducerCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyAudioProducerCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyAudioProducerCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/android/ProxyPlugin.java b/branches/2.0/doubango/bindings/java/android/ProxyPlugin.java index 62e2afc7..7358db4d 100644 --- a/branches/2.0/doubango/bindings/java/android/ProxyPlugin.java +++ b/branches/2.0/doubango/bindings/java/android/ProxyPlugin.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ProxyPlugin { private long swigCPtr; protected boolean swigCMemOwn; - protected ProxyPlugin(long cPtr, boolean cMemoryOwn) { + public ProxyPlugin(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ProxyPlugin obj) { + public static long getCPtr(ProxyPlugin obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ProxyPlugin { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyPlugin(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyPlugin(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public twrap_proxy_plugin_type_t getType() { diff --git a/branches/2.0/doubango/bindings/java/android/ProxyPluginMgr.java b/branches/2.0/doubango/bindings/java/android/ProxyPluginMgr.java index 31607765..ae4ce168 100644 --- a/branches/2.0/doubango/bindings/java/android/ProxyPluginMgr.java +++ b/branches/2.0/doubango/bindings/java/android/ProxyPluginMgr.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ProxyPluginMgr { private long swigCPtr; protected boolean swigCMemOwn; - protected ProxyPluginMgr(long cPtr, boolean cMemoryOwn) { + public ProxyPluginMgr(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ProxyPluginMgr obj) { + public static long getCPtr(ProxyPluginMgr obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ProxyPluginMgr { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyPluginMgr(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyPluginMgr(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public static ProxyPluginMgr createInstance(ProxyPluginMgrCallback pCallback) { diff --git a/branches/2.0/doubango/bindings/java/android/ProxyPluginMgrCallback.java b/branches/2.0/doubango/bindings/java/android/ProxyPluginMgrCallback.java index 8a8c6846..cb198104 100644 --- a/branches/2.0/doubango/bindings/java/android/ProxyPluginMgrCallback.java +++ b/branches/2.0/doubango/bindings/java/android/ProxyPluginMgrCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ProxyPluginMgrCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected ProxyPluginMgrCallback(long cPtr, boolean cMemoryOwn) { + public ProxyPluginMgrCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ProxyPluginMgrCallback obj) { + public static long getCPtr(ProxyPluginMgrCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ProxyPluginMgrCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyPluginMgrCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyPluginMgrCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/android/ProxyVideoConsumer.java b/branches/2.0/doubango/bindings/java/android/ProxyVideoConsumer.java index 8686d61e..8c9a708d 100644 --- a/branches/2.0/doubango/bindings/java/android/ProxyVideoConsumer.java +++ b/branches/2.0/doubango/bindings/java/android/ProxyVideoConsumer.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class ProxyVideoConsumer extends ProxyPlugin { private long swigCPtr; - protected ProxyVideoConsumer(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGProxyVideoConsumerUpcast(cPtr), cMemoryOwn); + public ProxyVideoConsumer(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.ProxyVideoConsumer_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(ProxyVideoConsumer obj) { + public static long getCPtr(ProxyVideoConsumer obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class ProxyVideoConsumer extends ProxyPlugin { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyVideoConsumer(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyVideoConsumer(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/ProxyVideoConsumerCallback.java b/branches/2.0/doubango/bindings/java/android/ProxyVideoConsumerCallback.java index 1c0a8e64..007f77ee 100644 --- a/branches/2.0/doubango/bindings/java/android/ProxyVideoConsumerCallback.java +++ b/branches/2.0/doubango/bindings/java/android/ProxyVideoConsumerCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ProxyVideoConsumerCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected ProxyVideoConsumerCallback(long cPtr, boolean cMemoryOwn) { + public ProxyVideoConsumerCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ProxyVideoConsumerCallback obj) { + public static long getCPtr(ProxyVideoConsumerCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ProxyVideoConsumerCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyVideoConsumerCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyVideoConsumerCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/android/ProxyVideoFrame.java b/branches/2.0/doubango/bindings/java/android/ProxyVideoFrame.java index e487bf41..4264cdf9 100644 --- a/branches/2.0/doubango/bindings/java/android/ProxyVideoFrame.java +++ b/branches/2.0/doubango/bindings/java/android/ProxyVideoFrame.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ProxyVideoFrame { private long swigCPtr; protected boolean swigCMemOwn; - protected ProxyVideoFrame(long cPtr, boolean cMemoryOwn) { + public ProxyVideoFrame(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ProxyVideoFrame obj) { + public static long getCPtr(ProxyVideoFrame obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ProxyVideoFrame { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyVideoFrame(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyVideoFrame(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public long getSize() { diff --git a/branches/2.0/doubango/bindings/java/android/ProxyVideoProducer.java b/branches/2.0/doubango/bindings/java/android/ProxyVideoProducer.java index 1281beac..7b046d2e 100644 --- a/branches/2.0/doubango/bindings/java/android/ProxyVideoProducer.java +++ b/branches/2.0/doubango/bindings/java/android/ProxyVideoProducer.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class ProxyVideoProducer extends ProxyPlugin { private long swigCPtr; - protected ProxyVideoProducer(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGProxyVideoProducerUpcast(cPtr), cMemoryOwn); + public ProxyVideoProducer(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.ProxyVideoProducer_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(ProxyVideoProducer obj) { + public static long getCPtr(ProxyVideoProducer obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class ProxyVideoProducer extends ProxyPlugin { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyVideoProducer(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyVideoProducer(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/ProxyVideoProducerCallback.java b/branches/2.0/doubango/bindings/java/android/ProxyVideoProducerCallback.java index 3c533c2e..ecfe2613 100644 --- a/branches/2.0/doubango/bindings/java/android/ProxyVideoProducerCallback.java +++ b/branches/2.0/doubango/bindings/java/android/ProxyVideoProducerCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class ProxyVideoProducerCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected ProxyVideoProducerCallback(long cPtr, boolean cMemoryOwn) { + public ProxyVideoProducerCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(ProxyVideoProducerCallback obj) { + public static long getCPtr(ProxyVideoProducerCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class ProxyVideoProducerCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_ProxyVideoProducerCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_ProxyVideoProducerCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/android/PublicationEvent.java b/branches/2.0/doubango/bindings/java/android/PublicationEvent.java index 88541683..3d824593 100644 --- a/branches/2.0/doubango/bindings/java/android/PublicationEvent.java +++ b/branches/2.0/doubango/bindings/java/android/PublicationEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class PublicationEvent extends SipEvent { private long swigCPtr; - protected PublicationEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGPublicationEventUpcast(cPtr), cMemoryOwn); + public PublicationEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.PublicationEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(PublicationEvent obj) { + public static long getCPtr(PublicationEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class PublicationEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_PublicationEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_PublicationEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/PublicationSession.java b/branches/2.0/doubango/bindings/java/android/PublicationSession.java index f80f3dcb..79e5c1d8 100644 --- a/branches/2.0/doubango/bindings/java/android/PublicationSession.java +++ b/branches/2.0/doubango/bindings/java/android/PublicationSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class PublicationSession extends SipSession { private long swigCPtr; - protected PublicationSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGPublicationSessionUpcast(cPtr), cMemoryOwn); + public PublicationSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.PublicationSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(PublicationSession obj) { + public static long getCPtr(PublicationSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class PublicationSession extends SipSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_PublicationSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_PublicationSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/RPMessage.java b/branches/2.0/doubango/bindings/java/android/RPMessage.java index 711f9907..9e0f5439 100644 --- a/branches/2.0/doubango/bindings/java/android/RPMessage.java +++ b/branches/2.0/doubango/bindings/java/android/RPMessage.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class RPMessage { private long swigCPtr; protected boolean swigCMemOwn; - protected RPMessage(long cPtr, boolean cMemoryOwn) { + public RPMessage(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(RPMessage obj) { + public static long getCPtr(RPMessage obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class RPMessage { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_RPMessage(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_RPMessage(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public RPMessage() { diff --git a/branches/2.0/doubango/bindings/java/android/RegistrationEvent.java b/branches/2.0/doubango/bindings/java/android/RegistrationEvent.java index 6ae317b1..7aba3521 100644 --- a/branches/2.0/doubango/bindings/java/android/RegistrationEvent.java +++ b/branches/2.0/doubango/bindings/java/android/RegistrationEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class RegistrationEvent extends SipEvent { private long swigCPtr; - protected RegistrationEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGRegistrationEventUpcast(cPtr), cMemoryOwn); + public RegistrationEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.RegistrationEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(RegistrationEvent obj) { + public static long getCPtr(RegistrationEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class RegistrationEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_RegistrationEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_RegistrationEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/RegistrationSession.java b/branches/2.0/doubango/bindings/java/android/RegistrationSession.java index 08305ef5..49f89a41 100644 --- a/branches/2.0/doubango/bindings/java/android/RegistrationSession.java +++ b/branches/2.0/doubango/bindings/java/android/RegistrationSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class RegistrationSession extends SipSession { private long swigCPtr; - protected RegistrationSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGRegistrationSessionUpcast(cPtr), cMemoryOwn); + public RegistrationSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.RegistrationSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(RegistrationSession obj) { + public static long getCPtr(RegistrationSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class RegistrationSession extends SipSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_RegistrationSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_RegistrationSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/SMSData.java b/branches/2.0/doubango/bindings/java/android/SMSData.java index 12957ecd..1dda6d14 100644 --- a/branches/2.0/doubango/bindings/java/android/SMSData.java +++ b/branches/2.0/doubango/bindings/java/android/SMSData.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SMSData { private long swigCPtr; protected boolean swigCMemOwn; - protected SMSData(long cPtr, boolean cMemoryOwn) { + public SMSData(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SMSData obj) { + public static long getCPtr(SMSData obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SMSData { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SMSData(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SMSData(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public SMSData() { diff --git a/branches/2.0/doubango/bindings/java/android/SMSEncoder.java b/branches/2.0/doubango/bindings/java/android/SMSEncoder.java index 3e445730..9af2aa59 100644 --- a/branches/2.0/doubango/bindings/java/android/SMSEncoder.java +++ b/branches/2.0/doubango/bindings/java/android/SMSEncoder.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SMSEncoder { private long swigCPtr; protected boolean swigCMemOwn; - protected SMSEncoder(long cPtr, boolean cMemoryOwn) { + public SMSEncoder(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SMSEncoder obj) { + public static long getCPtr(SMSEncoder obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SMSEncoder { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SMSEncoder(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SMSEncoder(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public static RPMessage encodeSubmit(int mr, String smsc, String destination, String ascii) { diff --git a/branches/2.0/doubango/bindings/java/android/SafeObject.java b/branches/2.0/doubango/bindings/java/android/SafeObject.java index 4cef0759..cde86033 100644 --- a/branches/2.0/doubango/bindings/java/android/SafeObject.java +++ b/branches/2.0/doubango/bindings/java/android/SafeObject.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SafeObject { private long swigCPtr; protected boolean swigCMemOwn; - protected SafeObject(long cPtr, boolean cMemoryOwn) { + public SafeObject(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SafeObject obj) { + public static long getCPtr(SafeObject obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SafeObject { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SafeObject(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SafeObject(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public SafeObject() { diff --git a/branches/2.0/doubango/bindings/java/android/SdpMessage.java b/branches/2.0/doubango/bindings/java/android/SdpMessage.java index 410ba163..3318a1e5 100644 --- a/branches/2.0/doubango/bindings/java/android/SdpMessage.java +++ b/branches/2.0/doubango/bindings/java/android/SdpMessage.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SdpMessage { private long swigCPtr; protected boolean swigCMemOwn; - protected SdpMessage(long cPtr, boolean cMemoryOwn) { + public SdpMessage(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SdpMessage obj) { + public static long getCPtr(SdpMessage obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SdpMessage { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SdpMessage(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SdpMessage(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public SdpMessage() { diff --git a/branches/2.0/doubango/bindings/java/android/SipCallback.java b/branches/2.0/doubango/bindings/java/android/SipCallback.java index 3db9b243..0481fdc8 100644 --- a/branches/2.0/doubango/bindings/java/android/SipCallback.java +++ b/branches/2.0/doubango/bindings/java/android/SipCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SipCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected SipCallback(long cPtr, boolean cMemoryOwn) { + public SipCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SipCallback obj) { + public static long getCPtr(SipCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SipCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SipCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SipCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/android/SipEvent.java b/branches/2.0/doubango/bindings/java/android/SipEvent.java index 48cab3a9..41e65493 100644 --- a/branches/2.0/doubango/bindings/java/android/SipEvent.java +++ b/branches/2.0/doubango/bindings/java/android/SipEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SipEvent { private long swigCPtr; protected boolean swigCMemOwn; - protected SipEvent(long cPtr, boolean cMemoryOwn) { + public SipEvent(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SipEvent obj) { + public static long getCPtr(SipEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SipEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SipEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public short getCode() { diff --git a/branches/2.0/doubango/bindings/java/android/SipMessage.java b/branches/2.0/doubango/bindings/java/android/SipMessage.java index b968cd39..df29460a 100644 --- a/branches/2.0/doubango/bindings/java/android/SipMessage.java +++ b/branches/2.0/doubango/bindings/java/android/SipMessage.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SipMessage { private long swigCPtr; protected boolean swigCMemOwn; - protected SipMessage(long cPtr, boolean cMemoryOwn) { + public SipMessage(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SipMessage obj) { + public static long getCPtr(SipMessage obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SipMessage { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SipMessage(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SipMessage(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public byte[] getSipContent() { diff --git a/branches/2.0/doubango/bindings/java/android/SipSession.java b/branches/2.0/doubango/bindings/java/android/SipSession.java index eaff336c..781a645d 100644 --- a/branches/2.0/doubango/bindings/java/android/SipSession.java +++ b/branches/2.0/doubango/bindings/java/android/SipSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SipSession { private long swigCPtr; protected boolean swigCMemOwn; - protected SipSession(long cPtr, boolean cMemoryOwn) { + public SipSession(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SipSession obj) { + public static long getCPtr(SipSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SipSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SipSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SipSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected java.nio.ByteBuffer getByteBuffer(byte[] bytes) { diff --git a/branches/2.0/doubango/bindings/java/android/SipStack.java b/branches/2.0/doubango/bindings/java/android/SipStack.java index f0f8a346..351cd804 100644 --- a/branches/2.0/doubango/bindings/java/android/SipStack.java +++ b/branches/2.0/doubango/bindings/java/android/SipStack.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class SipStack extends SafeObject { private long swigCPtr; - protected SipStack(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGSipStackUpcast(cPtr), cMemoryOwn); + public SipStack(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.SipStack_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(SipStack obj) { + public static long getCPtr(SipStack obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class SipStack extends SafeObject { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SipStack(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SipStack(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/SipUri.java b/branches/2.0/doubango/bindings/java/android/SipUri.java index be2fb7ad..8e1b9eb9 100644 --- a/branches/2.0/doubango/bindings/java/android/SipUri.java +++ b/branches/2.0/doubango/bindings/java/android/SipUri.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class SipUri { private long swigCPtr; protected boolean swigCMemOwn; - protected SipUri(long cPtr, boolean cMemoryOwn) { + public SipUri(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(SipUri obj) { + public static long getCPtr(SipUri obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class SipUri { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SipUri(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SipUri(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public SipUri(String uriString, String displayName) { diff --git a/branches/2.0/doubango/bindings/java/android/StackEvent.java b/branches/2.0/doubango/bindings/java/android/StackEvent.java index ee0ba843..98aa6a95 100644 --- a/branches/2.0/doubango/bindings/java/android/StackEvent.java +++ b/branches/2.0/doubango/bindings/java/android/StackEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class StackEvent extends SipEvent { private long swigCPtr; - protected StackEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGStackEventUpcast(cPtr), cMemoryOwn); + public StackEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.StackEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(StackEvent obj) { + public static long getCPtr(StackEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class StackEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_StackEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_StackEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/SubscriptionEvent.java b/branches/2.0/doubango/bindings/java/android/SubscriptionEvent.java index 03d6345c..688913bf 100644 --- a/branches/2.0/doubango/bindings/java/android/SubscriptionEvent.java +++ b/branches/2.0/doubango/bindings/java/android/SubscriptionEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class SubscriptionEvent extends SipEvent { private long swigCPtr; - protected SubscriptionEvent(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGSubscriptionEventUpcast(cPtr), cMemoryOwn); + public SubscriptionEvent(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.SubscriptionEvent_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(SubscriptionEvent obj) { + public static long getCPtr(SubscriptionEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class SubscriptionEvent extends SipEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SubscriptionEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SubscriptionEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/SubscriptionSession.java b/branches/2.0/doubango/bindings/java/android/SubscriptionSession.java index a69036a9..322655c3 100644 --- a/branches/2.0/doubango/bindings/java/android/SubscriptionSession.java +++ b/branches/2.0/doubango/bindings/java/android/SubscriptionSession.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -11,12 +11,12 @@ package org.doubango.tinyWRAP; public class SubscriptionSession extends SipSession { private long swigCPtr; - protected SubscriptionSession(long cPtr, boolean cMemoryOwn) { - super(tinyWRAPJNI.SWIGSubscriptionSessionUpcast(cPtr), cMemoryOwn); + public SubscriptionSession(long cPtr, boolean cMemoryOwn) { + super(tinyWRAPJNI.SubscriptionSession_SWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } - protected static long getCPtr(SubscriptionSession obj) { + public static long getCPtr(SubscriptionSession obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -25,11 +25,13 @@ public class SubscriptionSession extends SipSession { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_SubscriptionSession(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_SubscriptionSession(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; super.delete(); } diff --git a/branches/2.0/doubango/bindings/java/android/XcapCallback.java b/branches/2.0/doubango/bindings/java/android/XcapCallback.java index 5a588915..922ecd43 100644 --- a/branches/2.0/doubango/bindings/java/android/XcapCallback.java +++ b/branches/2.0/doubango/bindings/java/android/XcapCallback.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class XcapCallback { private long swigCPtr; protected boolean swigCMemOwn; - protected XcapCallback(long cPtr, boolean cMemoryOwn) { + public XcapCallback(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(XcapCallback obj) { + public static long getCPtr(XcapCallback obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class XcapCallback { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_XcapCallback(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_XcapCallback(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } protected void swigDirectorDisconnect() { diff --git a/branches/2.0/doubango/bindings/java/android/XcapEvent.java b/branches/2.0/doubango/bindings/java/android/XcapEvent.java index 86ed7971..f6f0940a 100644 --- a/branches/2.0/doubango/bindings/java/android/XcapEvent.java +++ b/branches/2.0/doubango/bindings/java/android/XcapEvent.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class XcapEvent { private long swigCPtr; protected boolean swigCMemOwn; - protected XcapEvent(long cPtr, boolean cMemoryOwn) { + public XcapEvent(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(XcapEvent obj) { + public static long getCPtr(XcapEvent obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class XcapEvent { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_XcapEvent(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_XcapEvent(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public thttp_event_type_t getType() { diff --git a/branches/2.0/doubango/bindings/java/android/XcapMessage.java b/branches/2.0/doubango/bindings/java/android/XcapMessage.java index 07dbfbb8..1dc578bc 100644 --- a/branches/2.0/doubango/bindings/java/android/XcapMessage.java +++ b/branches/2.0/doubango/bindings/java/android/XcapMessage.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class XcapMessage { private long swigCPtr; protected boolean swigCMemOwn; - protected XcapMessage(long cPtr, boolean cMemoryOwn) { + public XcapMessage(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(XcapMessage obj) { + public static long getCPtr(XcapMessage obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class XcapMessage { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_XcapMessage(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_XcapMessage(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public byte[] getXcapContent() { diff --git a/branches/2.0/doubango/bindings/java/android/XcapSelector.java b/branches/2.0/doubango/bindings/java/android/XcapSelector.java index efcda497..467cc441 100644 --- a/branches/2.0/doubango/bindings/java/android/XcapSelector.java +++ b/branches/2.0/doubango/bindings/java/android/XcapSelector.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class XcapSelector { private long swigCPtr; protected boolean swigCMemOwn; - protected XcapSelector(long cPtr, boolean cMemoryOwn) { + public XcapSelector(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(XcapSelector obj) { + public static long getCPtr(XcapSelector obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class XcapSelector { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_XcapSelector(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_XcapSelector(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public XcapSelector(XcapStack stack) { diff --git a/branches/2.0/doubango/bindings/java/android/XcapStack.java b/branches/2.0/doubango/bindings/java/android/XcapStack.java index 95d28e9d..d8c5f62d 100644 --- a/branches/2.0/doubango/bindings/java/android/XcapStack.java +++ b/branches/2.0/doubango/bindings/java/android/XcapStack.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -12,12 +12,12 @@ public class XcapStack { private long swigCPtr; protected boolean swigCMemOwn; - protected XcapStack(long cPtr, boolean cMemoryOwn) { + public XcapStack(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } - protected static long getCPtr(XcapStack obj) { + public static long getCPtr(XcapStack obj) { return (obj == null) ? 0 : obj.swigCPtr; } @@ -26,11 +26,13 @@ public class XcapStack { } public synchronized void delete() { - if(swigCPtr != 0 && swigCMemOwn) { - swigCMemOwn = false; - tinyWRAPJNI.delete_XcapStack(swigCPtr); + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + tinyWRAPJNI.delete_XcapStack(swigCPtr); + } + swigCPtr = 0; } - swigCPtr = 0; } public XcapStack(XcapCallback callback, String xui, String password, String xcap_root) { diff --git a/branches/2.0/doubango/bindings/java/android/buildAll.sh b/branches/2.0/doubango/bindings/java/android/buildAll.sh index 4876c291..cfa17fff 100644 --- a/branches/2.0/doubango/bindings/java/android/buildAll.sh +++ b/branches/2.0/doubango/bindings/java/android/buildAll.sh @@ -2,7 +2,7 @@ # Build tinyWRAP for Google Android Systems for project in tinySAK tinyNET tinyHTTP tinyXCAP tinyIPSec tinySMS tinySIGCOMP tinySDP tinyRTP tinyMSRP tinyMEDIA tinyDAV tinySIP -#for project in tinyRTP +#for project in tinyNET do echo -e building "$project with parameters=$@\n" make PROJECT=$project clean diff --git a/branches/2.0/doubango/bindings/java/android/commercial.sh b/branches/2.0/doubango/bindings/java/android/commercial.sh index a4ece7c1..eb66f57f 100644 --- a/branches/2.0/doubango/bindings/java/android/commercial.sh +++ b/branches/2.0/doubango/bindings/java/android/commercial.sh @@ -2,10 +2,10 @@ # Build tinyWRAP for Google Android Systems # GPL parameters -export COMMERCIAL_PARAMS="LICENSE=lgpl FFMPEG=yes H264=no THEORA=yes OPENCORE_AMR=no SPEEX_DSP=yes SPEEX_JB=yes SPEEX_RESAMPLER=yes SPEEX_DENOISE=yes SPEEX=yes ILBC=yes LIBGSM=yes G729=no SRTP=yes TLS=yes" +export COMMERCIAL_PARAMS="LICENSE=lgpl FFMPEG=yes VPX=yes H264=no THEORA=yes OPENCORE_AMR=no SPEEX_DSP=yes SPEEX_JB=yes SPEEX_RESAMPLER=yes SPEEX_DENOISE=yes SPEEX=yes ILBC=yes LIBGSM=yes G729=no SRTP=yes TLS=yes" for IS_NEON in no yes do -../bindings/java/android/buildAll.sh $@ NEON=$IS_NEON $COMMERCIAL_PARAMS VPX=$IS_NEON HAVE_WEBRTC=$IS_NEON HAVE_WEBRTC_DENOISE=$IS_NEON +../bindings/java/android/buildAll.sh $@ NEON=$IS_NEON $COMMERCIAL_PARAMS HAVE_WEBRTC=$IS_NEON HAVE_WEBRTC_DENOISE=$IS_NEON done diff --git a/branches/2.0/doubango/bindings/java/android/droid-makefile b/branches/2.0/doubango/bindings/java/android/droid-makefile index eeb87037..6df0e4e6 100644 --- a/branches/2.0/doubango/bindings/java/android/droid-makefile +++ b/branches/2.0/doubango/bindings/java/android/droid-makefile @@ -3,7 +3,7 @@ APP := lib$(PROJECT)_$(MARCH).$(EXT) CFLAGS := $(CFLAGS_LIB) -fno-rtti -fno-exceptions -I../../_common -I../../. -I../../../tinySAK/src -I../../../tinyNET/src -I../../../tinyHTTP/include -I../../../tinyXCAP/include \ -I../../../tinySMS/include -I../../../tinySDP/include -I../../../tinyMEDIA/include -I../../../tinyMSRP/include -I../../../tinyDAV/include -I../../../tinySIP/include -# Because of the static build, you need all librarires +# Because of the static build, we need all librarires THIRDPARTIES_LIB := ../../../thirdparties/android/lib THIRDPARTIES_MARCH_LIB := ../../../thirdparties/android/lib/$(MARCH) diff --git a/branches/2.0/doubango/bindings/java/android/gpl.sh b/branches/2.0/doubango/bindings/java/android/gpl.sh index b4aa52f5..2af8c1c9 100644 --- a/branches/2.0/doubango/bindings/java/android/gpl.sh +++ b/branches/2.0/doubango/bindings/java/android/gpl.sh @@ -2,10 +2,10 @@ # Build tinyWRAP for Google Android Systems # GPL parameters -export GPL_PARAMS="LICENSE=gpl NO_FREE=yes FFMPEG=yes H264=yes THEORA=yes OPENCORE_AMR=yes SPEEX_DSP=yes SPEEX_JB=yes SPEEX_RESAMPLER=yes SPEEX_DENOISE=1 SPEEX=yes ILBC=yes LIBGSM=yes G729=yes SRTP=yes TLS=yes" +export GPL_PARAMS="LICENSE=gpl NO_FREE=yes FFMPEG=yes VPX=yes H264=yes THEORA=yes OPENCORE_AMR=yes SPEEX_DSP=yes SPEEX_JB=yes SPEEX_RESAMPLER=yes SPEEX_DENOISE=1 SPEEX=yes ILBC=yes LIBGSM=yes G729=yes SRTP=yes TLS=yes" for IS_NEON in no yes do -../bindings/java/android/buildAll.sh $@ NEON=$IS_NEON $GPL_PARAMS VPX=$IS_NEON HAVE_WEBRTC=$IS_NEON HAVE_WEBRTC_DENOISE=$IS_NEON +../bindings/java/android/buildAll.sh $@ NEON=$IS_NEON $GPL_PARAMS HAVE_WEBRTC=$IS_NEON HAVE_WEBRTC_DENOISE=$IS_NEON done diff --git a/branches/2.0/doubango/bindings/java/android/lgpl.sh b/branches/2.0/doubango/bindings/java/android/lgpl.sh index dc10bead..28a87fdc 100644 --- a/branches/2.0/doubango/bindings/java/android/lgpl.sh +++ b/branches/2.0/doubango/bindings/java/android/lgpl.sh @@ -2,10 +2,10 @@ # Build tinyWRAP for Google Android Systems # GPL parameters -export LGPL_PARAMS="LICENSE=lgpl FFMPEG=yes H264=no THEORA=yes OPENCORE_AMR=yes SPEEX_DSP=yes SPEEX_JB=yes SPEEX_RESAMPLER=yes SPEEX_DENOISE=yes SPEEX=yes ILBC=yes LIBGSM=yes G729=yes SRTP=yes TLS=yes" +export LGPL_PARAMS="LICENSE=lgpl FFMPEG=yes VPX=yes H264=no THEORA=yes OPENCORE_AMR=yes SPEEX_DSP=yes SPEEX_JB=yes SPEEX_RESAMPLER=yes SPEEX_DENOISE=yes SPEEX=yes ILBC=yes LIBGSM=yes G729=yes SRTP=yes TLS=yes" for IS_NEON in no yes do -../bindings/java/android/buildAll.sh $@ NEON=$IS_NEON $LGPL_PARAMS VPX=$IS_NEON HAVE_WEBRTC=$IS_NEON HAVE_WEBRTC_DENOISE=$IS_NEON +../bindings/java/android/buildAll.sh $@ NEON=$IS_NEON $LGPL_PARAMS HAVE_WEBRTC=$IS_NEON HAVE_WEBRTC_DENOISE=$IS_NEON done diff --git a/branches/2.0/doubango/bindings/java/android/minimal.sh b/branches/2.0/doubango/bindings/java/android/minimal.sh index e60dcd03..1652ca62 100644 --- a/branches/2.0/doubango/bindings/java/android/minimal.sh +++ b/branches/2.0/doubango/bindings/java/android/minimal.sh @@ -2,9 +2,9 @@ # Build tinyWRAP for Google Android Systems # GPL parameters -export MINIMAL_PARAMS="FFMPEG=no H264=no THEORA=no OPENCORE_AMR=no SPEEX_DSP=yes SPEEX_JB=yes SPEEX_RESAMPLER=yes SPEEX_DENOISE=yes SPEEX=no ILBC=no LIBGSM=no G729=no SRTP=yes TLS=yes" +export MINIMAL_PARAMS="FFMPEG=no VPX=yes H264=no THEORA=no OPENCORE_AMR=no SPEEX_DSP=yes SPEEX_JB=yes SPEEX_RESAMPLER=yes SPEEX_DENOISE=yes SPEEX=no ILBC=no LIBGSM=no G729=no SRTP=yes TLS=yes" for IS_NEON in no yes do -../bindings/java/android/buildAll.sh $@ NEON=$IS_NEON $MINIMAL_PARAMS VPX=$IS_NEON HAVE_WEBRTC=$IS_NEON HAVE_WEBRTC_DENOISE=$IS_NEON +../bindings/java/android/buildAll.sh $@ NEON=$IS_NEON $MINIMAL_PARAMS HAVE_WEBRTC=$IS_NEON HAVE_WEBRTC_DENOISE=$IS_NEON done diff --git a/branches/2.0/doubango/bindings/java/android/tdav_codec_id_t.java b/branches/2.0/doubango/bindings/java/android/tdav_codec_id_t.java index 3cb12c5b..39db9fe7 100644 --- a/branches/2.0/doubango/bindings/java/android/tdav_codec_id_t.java +++ b/branches/2.0/doubango/bindings/java/android/tdav_codec_id_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,9 +30,12 @@ public enum tdav_codec_id_t { tdav_codec_id_h263(0x00010000 << 1), tdav_codec_id_h263p(0x00010000 << 2), tdav_codec_id_h263pp(0x00010000 << 3), - tdav_codec_id_h264_bp10(0x00010000 << 4), - tdav_codec_id_h264_bp20(0x00010000 << 5), - tdav_codec_id_h264_bp30(0x00010000 << 6), + tdav_codec_id_h264_bp(0x00010000 << 4), + tdav_codec_id_h264_mp(0x00010000 << 5), + tdav_codec_id_h264_hp(0x00010000 << 6), + tdav_codec_id_h264_bp10(tdav_codec_id_h264_bp), + tdav_codec_id_h264_bp20(tdav_codec_id_h264_bp), + tdav_codec_id_h264_bp30(tdav_codec_id_h264_bp), tdav_codec_id_h264_svc(0x00010000 << 7), tdav_codec_id_theora(0x00010000 << 8), tdav_codec_id_mp4ves_es(0x00010000 << 9), diff --git a/branches/2.0/doubango/bindings/java/android/thttp_event_type_t.java b/branches/2.0/doubango/bindings/java/android/thttp_event_type_t.java index de06855b..b7b89ef0 100644 --- a/branches/2.0/doubango/bindings/java/android/thttp_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/android/thttp_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tinyWRAP.java b/branches/2.0/doubango/bindings/java/android/tinyWRAP.java index d10c59ad..e87f5af5 100644 --- a/branches/2.0/doubango/bindings/java/android/tinyWRAP.java +++ b/branches/2.0/doubango/bindings/java/android/tinyWRAP.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tinyWRAPConstants.java b/branches/2.0/doubango/bindings/java/android/tinyWRAPConstants.java index 1c7f7324..79ebc50f 100644 --- a/branches/2.0/doubango/bindings/java/android/tinyWRAPConstants.java +++ b/branches/2.0/doubango/bindings/java/android/tinyWRAPConstants.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tinyWRAPJNI.java b/branches/2.0/doubango/bindings/java/android/tinyWRAPJNI.java index a77d95e6..6c706aca 100644 --- a/branches/2.0/doubango/bindings/java/android/tinyWRAPJNI.java +++ b/branches/2.0/doubango/bindings/java/android/tinyWRAPJNI.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -8,7 +8,7 @@ package org.doubango.tinyWRAP; -class tinyWRAPJNI { +public class tinyWRAPJNI { public final static native long new_DDebugCallback(); public final static native void delete_DDebugCallback(long jarg1); public final static native int DDebugCallback_OnDebugInfo(long jarg1, DDebugCallback jarg1_, String jarg2); @@ -44,8 +44,11 @@ class tinyWRAPJNI { public final static native long MediaSessionMgr_findProxyPluginConsumer(long jarg1, MediaSessionMgr jarg1_, int jarg2); public final static native long MediaSessionMgr_findProxyPluginProducer(long jarg1, MediaSessionMgr jarg1_, int jarg2); public final static native java.math.BigInteger MediaSessionMgr_getSessionId(long jarg1, MediaSessionMgr jarg1_, int jarg2); + public final static native boolean MediaSessionMgr_defaultsSetProfile(int jarg1); + public final static native int MediaSessionMgr_defaultsGetProfile(); public final static native boolean MediaSessionMgr_defaultsSetBandwidthLevel(int jarg1); public final static native int MediaSessionMgr_defaultsGetBandwidthLevel(); + public final static native boolean MediaSessionMgr_defaultsSetPrefVideoSize(int jarg1); public final static native boolean MediaSessionMgr_defaultsSetJbMargin(long jarg1); public final static native boolean MediaSessionMgr_defaultsSetJbMaxLateRate(long jarg1); public final static native boolean MediaSessionMgr_defaultsSetEchoTail(long jarg1); @@ -73,6 +76,7 @@ class tinyWRAPJNI { public final static native int MediaSessionMgr_defaultsGetVolume(); public final static native boolean MediaSessionMgr_defaultsSetInviteSessionTimers(int jarg1, String jarg2); public final static native boolean MediaSessionMgr_defaultsSetSRtpMode(int jarg1); + public final static native boolean MediaSessionMgr_defaultsSetIceEnabled(boolean jarg1); public final static native void delete_MediaContent(long jarg1); public final static native String MediaContent_getType(long jarg1, MediaContent jarg1_); public final static native long MediaContent_getDataLength(long jarg1, MediaContent jarg1_); @@ -194,6 +198,7 @@ class tinyWRAPJNI { public final static native boolean CallSession_callVideo__SWIG_3(long jarg1, CallSession jarg1_, long jarg2, SipUri jarg2_); public final static native boolean CallSession_setSessionTimer(long jarg1, CallSession jarg1_, long jarg2, String jarg3); public final static native boolean CallSession_set100rel(long jarg1, CallSession jarg1_, boolean jarg2); + public final static native boolean CallSession_setICE(long jarg1, CallSession jarg1_, boolean jarg2); public final static native boolean CallSession_setQoS(long jarg1, CallSession jarg1_, int jarg2, int jarg3); public final static native boolean CallSession_hold__SWIG_0(long jarg1, CallSession jarg1_, long jarg2, ActionConfig jarg2_); public final static native boolean CallSession_hold__SWIG_1(long jarg1, CallSession jarg1_); @@ -543,30 +548,30 @@ class tinyWRAPJNI { public final static native int MsrpCallback_OnEventSwigExplicitMsrpCallback(long jarg1, MsrpCallback jarg1_, long jarg2, MsrpEvent jarg2_); public final static native void MsrpCallback_director_connect(MsrpCallback obj, long cptr, boolean mem_own, boolean weak_global); public final static native void MsrpCallback_change_ownership(MsrpCallback obj, long cptr, boolean take_or_release); - public final static native long SWIGMediaContentCPIMUpcast(long jarg1); - public final static native long SWIGDialogEventUpcast(long jarg1); - public final static native long SWIGStackEventUpcast(long jarg1); - public final static native long SWIGInviteEventUpcast(long jarg1); - public final static native long SWIGMessagingEventUpcast(long jarg1); - public final static native long SWIGInfoEventUpcast(long jarg1); - public final static native long SWIGOptionsEventUpcast(long jarg1); - public final static native long SWIGPublicationEventUpcast(long jarg1); - public final static native long SWIGRegistrationEventUpcast(long jarg1); - public final static native long SWIGSubscriptionEventUpcast(long jarg1); - public final static native long SWIGInviteSessionUpcast(long jarg1); - public final static native long SWIGCallSessionUpcast(long jarg1); - public final static native long SWIGMsrpSessionUpcast(long jarg1); - public final static native long SWIGMessagingSessionUpcast(long jarg1); - public final static native long SWIGInfoSessionUpcast(long jarg1); - public final static native long SWIGOptionsSessionUpcast(long jarg1); - public final static native long SWIGPublicationSessionUpcast(long jarg1); - public final static native long SWIGRegistrationSessionUpcast(long jarg1); - public final static native long SWIGSubscriptionSessionUpcast(long jarg1); - public final static native long SWIGProxyAudioConsumerUpcast(long jarg1); - public final static native long SWIGProxyVideoConsumerUpcast(long jarg1); - public final static native long SWIGProxyAudioProducerUpcast(long jarg1); - public final static native long SWIGProxyVideoProducerUpcast(long jarg1); - public final static native long SWIGSipStackUpcast(long jarg1); + public final static native long MediaContentCPIM_SWIGUpcast(long jarg1); + public final static native long DialogEvent_SWIGUpcast(long jarg1); + public final static native long StackEvent_SWIGUpcast(long jarg1); + public final static native long InviteEvent_SWIGUpcast(long jarg1); + public final static native long MessagingEvent_SWIGUpcast(long jarg1); + public final static native long InfoEvent_SWIGUpcast(long jarg1); + public final static native long OptionsEvent_SWIGUpcast(long jarg1); + public final static native long PublicationEvent_SWIGUpcast(long jarg1); + public final static native long RegistrationEvent_SWIGUpcast(long jarg1); + public final static native long SubscriptionEvent_SWIGUpcast(long jarg1); + public final static native long InviteSession_SWIGUpcast(long jarg1); + public final static native long CallSession_SWIGUpcast(long jarg1); + public final static native long MsrpSession_SWIGUpcast(long jarg1); + public final static native long MessagingSession_SWIGUpcast(long jarg1); + public final static native long InfoSession_SWIGUpcast(long jarg1); + public final static native long OptionsSession_SWIGUpcast(long jarg1); + public final static native long PublicationSession_SWIGUpcast(long jarg1); + public final static native long RegistrationSession_SWIGUpcast(long jarg1); + public final static native long SubscriptionSession_SWIGUpcast(long jarg1); + public final static native long ProxyAudioConsumer_SWIGUpcast(long jarg1); + public final static native long ProxyVideoConsumer_SWIGUpcast(long jarg1); + public final static native long ProxyAudioProducer_SWIGUpcast(long jarg1); + public final static native long ProxyVideoProducer_SWIGUpcast(long jarg1); + public final static native long SipStack_SWIGUpcast(long jarg1); public static int SwigDirector_DDebugCallback_OnDebugInfo(DDebugCallback self, String message) { return self.OnDebugInfo(message); diff --git a/branches/2.0/doubango/bindings/java/android/tinyWRAP_wrap.cxx b/branches/2.0/doubango/bindings/java/android/tinyWRAP_wrap.cxx index 6be82165..a83fe84e 100644 --- a/branches/2.0/doubango/bindings/java/android/tinyWRAP_wrap.cxx +++ b/branches/2.0/doubango/bindings/java/android/tinyWRAP_wrap.cxx @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make @@ -193,7 +193,8 @@ static void SWIGUNUSED SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionC { SWIG_JavaNullPointerException, "java/lang/NullPointerException" }, { SWIG_JavaDirectorPureVirtual, "java/lang/RuntimeException" }, { SWIG_JavaUnknownError, "java/lang/UnknownError" }, - { (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" } }; + { (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" } + }; const SWIG_JavaExceptions_t *except_ptr = java_exceptions; while (except_ptr->code != code && except_ptr->code) @@ -211,9 +212,6 @@ static void SWIGUNUSED SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionC #define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_JavaThrowException(jenv, SWIG_JavaIllegalArgumentException, msg); return nullreturn; } else /* ----------------------------------------------------------------------------- - * See the LICENSE file for information on copyright, usage and redistribution - * of SWIG, and the README file for authors - http://www.swig.org/release.html. - * * director.swg * * This file contains support for director classes that proxy @@ -402,8 +400,10 @@ namespace Swig { namespace Swig { - static jclass jclass_tinyWRAPJNI = NULL; - static jmethodID director_methids[35]; + namespace { + jclass jclass_tinyWRAPJNI = NULL; + jmethodID director_methids[35]; + } } #include // Use the C99 official header @@ -473,7 +473,7 @@ int SwigDirector_DDebugCallback::OnDebugInfo(char const *message) { if (!jmessage) return c_result; } jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[0], swigjobj, jmessage); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -501,7 +501,7 @@ int SwigDirector_DDebugCallback::OnDebugWarn(char const *message) { if (!jmessage) return c_result; } jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[1], swigjobj, jmessage); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -529,7 +529,7 @@ int SwigDirector_DDebugCallback::OnDebugError(char const *message) { if (!jmessage) return c_result; } jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[2], swigjobj, jmessage); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -557,7 +557,7 @@ int SwigDirector_DDebugCallback::OnDebugFatal(char const *message) { if (!jmessage) return c_result; } jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[3], swigjobj, jmessage); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -652,7 +652,7 @@ int SwigDirector_ProxyPluginMgrCallback::OnPluginCreated(uint64_t id, enum twrap } jtype = (jint) type; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[4], swigjobj, jid, jtype); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -694,7 +694,7 @@ int SwigDirector_ProxyPluginMgrCallback::OnPluginDestroyed(uint64_t id, enum twr } jtype = (jint) type; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[5], swigjobj, jid, jtype); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -769,7 +769,7 @@ int SwigDirector_ProxyAudioConsumerCallback::prepare(int ptime, int rate, int ch jrate = (jint) rate; jchannels = (jint) channels; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[6], swigjobj, jptime, jrate, jchannels); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -791,7 +791,7 @@ int SwigDirector_ProxyAudioConsumerCallback::start() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[7], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -813,7 +813,7 @@ int SwigDirector_ProxyAudioConsumerCallback::pause() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[8], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -835,7 +835,7 @@ int SwigDirector_ProxyAudioConsumerCallback::stop() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[9], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -916,7 +916,7 @@ int SwigDirector_ProxyVideoConsumerCallback::prepare(int nWidth, int nHeight, in jnHeight = (jint) nHeight; jnFps = (jint) nFps; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[10], swigjobj, jnWidth, jnHeight, jnFps); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -940,7 +940,7 @@ int SwigDirector_ProxyVideoConsumerCallback::consume(ProxyVideoFrame const *fram if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((ProxyVideoFrame **)&jframe) = (ProxyVideoFrame *) frame; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[11], swigjobj, jframe); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -966,7 +966,7 @@ int SwigDirector_ProxyVideoConsumerCallback::bufferCopied(unsigned int nCopiedSi jnCopiedSize = (jlong) nCopiedSize; jnAvailableSize = (jlong) nAvailableSize; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[12], swigjobj, jnCopiedSize, jnAvailableSize); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -988,7 +988,7 @@ int SwigDirector_ProxyVideoConsumerCallback::start() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[13], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1010,7 +1010,7 @@ int SwigDirector_ProxyVideoConsumerCallback::pause() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[14], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1032,7 +1032,7 @@ int SwigDirector_ProxyVideoConsumerCallback::stop() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[15], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1119,7 +1119,7 @@ int SwigDirector_ProxyAudioProducerCallback::prepare(int ptime, int rate, int ch jrate = (jint) rate; jchannels = (jint) channels; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[16], swigjobj, jptime, jrate, jchannels); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1141,7 +1141,7 @@ int SwigDirector_ProxyAudioProducerCallback::start() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[17], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1163,7 +1163,7 @@ int SwigDirector_ProxyAudioProducerCallback::pause() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[18], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1185,7 +1185,7 @@ int SwigDirector_ProxyAudioProducerCallback::stop() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[19], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1266,7 +1266,7 @@ int SwigDirector_ProxyVideoProducerCallback::prepare(int width, int height, int jheight = (jint) height; jfps = (jint) fps; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[20], swigjobj, jwidth, jheight, jfps); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1288,7 +1288,7 @@ int SwigDirector_ProxyVideoProducerCallback::start() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[21], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1310,7 +1310,7 @@ int SwigDirector_ProxyVideoProducerCallback::pause() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[22], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1332,7 +1332,7 @@ int SwigDirector_ProxyVideoProducerCallback::stop() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[23], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1409,7 +1409,7 @@ int SwigDirector_SipCallback::OnDialogEvent(DialogEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((DialogEvent **)&je) = (DialogEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[24], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1433,7 +1433,7 @@ int SwigDirector_SipCallback::OnStackEvent(StackEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((StackEvent **)&je) = (StackEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[25], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1457,7 +1457,7 @@ int SwigDirector_SipCallback::OnInviteEvent(InviteEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((InviteEvent **)&je) = (InviteEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[26], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1481,7 +1481,7 @@ int SwigDirector_SipCallback::OnMessagingEvent(MessagingEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((MessagingEvent **)&je) = (MessagingEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[27], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1505,7 +1505,7 @@ int SwigDirector_SipCallback::OnInfoEvent(InfoEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((InfoEvent **)&je) = (InfoEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[28], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1529,7 +1529,7 @@ int SwigDirector_SipCallback::OnOptionsEvent(OptionsEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((OptionsEvent **)&je) = (OptionsEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[29], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1553,7 +1553,7 @@ int SwigDirector_SipCallback::OnPublicationEvent(PublicationEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((PublicationEvent **)&je) = (PublicationEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[30], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1577,7 +1577,7 @@ int SwigDirector_SipCallback::OnRegistrationEvent(RegistrationEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((RegistrationEvent **)&je) = (RegistrationEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[31], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1601,7 +1601,7 @@ int SwigDirector_SipCallback::OnSubscriptionEvent(SubscriptionEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((SubscriptionEvent **)&je) = (SubscriptionEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[32], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1693,7 +1693,7 @@ int SwigDirector_XcapCallback::onEvent(XcapEvent const *e) const { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((XcapEvent **)&je) = (XcapEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[33], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1761,7 +1761,7 @@ int SwigDirector_MsrpCallback::OnEvent(MsrpEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((MsrpEvent **)&je) = (MsrpEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[34], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -2517,6 +2517,32 @@ SWIGEXPORT jobject JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMg } +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetProfile(JNIEnv *jenv, jclass jcls, jint jarg1) { + jboolean jresult = 0 ; + tmedia_profile_t arg1 ; + bool result; + + (void)jenv; + (void)jcls; + arg1 = (tmedia_profile_t)jarg1; + result = (bool)MediaSessionMgr::defaultsSetProfile(arg1); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsGetProfile(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + tmedia_profile_t result; + + (void)jenv; + (void)jcls; + result = (tmedia_profile_t)MediaSessionMgr::defaultsGetProfile(); + jresult = (jint)result; + return jresult; +} + + SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetBandwidthLevel(JNIEnv *jenv, jclass jcls, jint jarg1) { jboolean jresult = 0 ; tmedia_bandwidth_level_t arg1 ; @@ -2543,6 +2569,20 @@ SWIGEXPORT jint JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1 } +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetPrefVideoSize(JNIEnv *jenv, jclass jcls, jint jarg1) { + jboolean jresult = 0 ; + tmedia_pref_video_size_t arg1 ; + bool result; + + (void)jenv; + (void)jcls; + arg1 = (tmedia_pref_video_size_t)jarg1; + result = (bool)MediaSessionMgr::defaultsSetPrefVideoSize(arg1); + jresult = (jboolean)result; + return jresult; +} + + SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetJbMargin(JNIEnv *jenv, jclass jcls, jlong jarg1) { jboolean jresult = 0 ; uint32_t arg1 ; @@ -2916,6 +2956,20 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionM } +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetIceEnabled(JNIEnv *jenv, jclass jcls, jboolean jarg1) { + jboolean jresult = 0 ; + bool arg1 ; + bool result; + + (void)jenv; + (void)jcls; + arg1 = jarg1 ? true : false; + result = (bool)MediaSessionMgr::defaultsSetIceEnabled(arg1); + jresult = (jboolean)result; + return jresult; +} + + SWIGEXPORT void JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_delete_1MediaContent(JNIEnv *jenv, jclass jcls, jlong jarg1) { MediaContent *arg1 = (MediaContent *) 0 ; @@ -2936,7 +2990,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaContent_1 (void)jarg1_; arg1 = *(MediaContent **)&jarg1; result = (char *)(arg1)->getType(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -3118,7 +3172,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaContentCP if (!arg2) return 0; } result = (char *)(arg1)->getHeaderValue((char const *)arg2); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); return jresult; } @@ -3223,7 +3277,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getSch (void)jarg1_; arg1 = *(SipUri **)&jarg1; result = (char *)(arg1)->getScheme(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -3238,7 +3292,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getHos (void)jarg1_; arg1 = *(SipUri **)&jarg1; result = (char *)(arg1)->getHost(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -3268,7 +3322,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getUse (void)jarg1_; arg1 = *(SipUri **)&jarg1; result = (char *)(arg1)->getUserName(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -3283,7 +3337,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getPas (void)jarg1_; arg1 = *(SipUri **)&jarg1; result = (char *)(arg1)->getPassword(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -3298,7 +3352,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getDis (void)jarg1_; arg1 = *(SipUri **)&jarg1; result = (char *)(arg1)->getDisplayName(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -3319,7 +3373,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getPar if (!arg2) return 0; } result = (char *)(arg1)->getParamValue((char const *)arg2); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); return jresult; } @@ -3385,7 +3439,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SdpMessage_1ge arg3 = (char)jarg3; arg4 = (unsigned int)jarg4; result = (char *)(arg1)->getSdpHeaderValue((char const *)arg2,arg3,arg4); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); delete [] result; return jresult; @@ -3410,7 +3464,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SdpMessage_1ge } arg3 = (char)jarg3; result = (char *)(arg1)->getSdpHeaderValue((char const *)arg2,arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); delete [] result; return jresult; @@ -3439,7 +3493,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SdpMessage_1ge if (!arg3) return 0; } result = (char *)(arg1)->getSdpHeaderAValue((char const *)arg2,(char const *)arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); delete [] result; @@ -3532,7 +3586,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipMessage_1ge } arg3 = (unsigned int)jarg3; result = (char *)(arg1)->getSipHeaderValue((char const *)arg2,arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); delete [] result; return jresult; @@ -3555,7 +3609,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipMessage_1ge if (!arg2) return 0; } result = (char *)(arg1)->getSipHeaderValue((char const *)arg2); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); delete [] result; return jresult; @@ -3586,7 +3640,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipMessage_1ge } arg4 = (unsigned int)jarg4; result = (char *)(arg1)->getSipHeaderParamValue((char const *)arg2,(char const *)arg3,arg4); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); delete [] result; @@ -3616,7 +3670,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipMessage_1ge if (!arg3) return 0; } result = (char *)(arg1)->getSipHeaderParamValue((char const *)arg2,(char const *)arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); delete [] result; @@ -3710,7 +3764,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipEvent_1getP (void)jarg1_; arg1 = *(SipEvent **)&jarg1; result = (char *)((SipEvent const *)arg1)->getPhrase(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -4988,6 +5042,23 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_CallSession_1 } +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_CallSession_1setICE(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jboolean jarg2) { + jboolean jresult = 0 ; + CallSession *arg1 = (CallSession *) 0 ; + bool arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(CallSession **)&jarg1; + arg2 = jarg2 ? true : false; + result = (bool)(arg1)->setICE(arg2); + jresult = (jboolean)result; + return jresult; +} + + SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_CallSession_1setQoS(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2, jint jarg3) { jboolean jresult = 0 ; CallSession *arg1 = (CallSession *) 0 ; @@ -9336,7 +9407,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsE if (!arg4) return 0; } result = (char *)(arg1)->dnsENUM((char const *)arg2,(char const *)arg3,(char const *)arg4); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); @@ -9380,7 +9451,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsN arg4 = &temp4; } result = (char *)(arg1)->dnsNaptrSrv((char const *)arg2,(char const *)arg3,arg4); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); { jint jvalue = (jint)temp4; jenv->SetIntArrayRegion(jarg4, 0, 1, &jvalue); @@ -9422,7 +9493,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsS arg3 = &temp3; } result = (char *)(arg1)->dnsSrv((char const *)arg2,arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); { jint jvalue = (jint)temp3; jenv->SetIntArrayRegion(jarg3, 0, 1, &jvalue); @@ -9463,7 +9534,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1getL arg3 = &temp3; } result = (char *)(arg1)->getLocalIPnPort((char const *)arg2,arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); { jint jvalue = (jint)temp3; jenv->SetIntArrayRegion(jarg3, 0, 1, &jvalue); @@ -9485,7 +9556,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1getP (void)jarg1_; arg1 = *(SipStack **)&jarg1; result = (char *)(arg1)->getPreferredIdentity(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); delete [] result; return jresult; } @@ -9817,7 +9888,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_XcapSelector_1 (void)jarg1_; arg1 = *(XcapSelector **)&jarg1; result = (char *)(arg1)->getString(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); delete [] result; return jresult; } @@ -9881,7 +9952,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_XcapMessage_1g (void)jarg1_; arg1 = *(XcapMessage **)&jarg1; result = (char *)((XcapMessage const *)arg1)->getPhrase(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -9904,7 +9975,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_XcapMessage_1g } arg3 = (unsigned int)jarg3; result = (char *)(arg1)->getXcapHeaderValue((char const *)arg2,arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); delete [] result; return jresult; @@ -9927,7 +9998,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_XcapMessage_1g if (!arg2) return 0; } result = (char *)(arg1)->getXcapHeaderValue((char const *)arg2); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); delete [] result; return jresult; @@ -9958,7 +10029,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_XcapMessage_1g } arg4 = (unsigned int)jarg4; result = (char *)(arg1)->getXcapHeaderParamValue((char const *)arg2,(char const *)arg3,arg4); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); delete [] result; @@ -9988,7 +10059,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_XcapMessage_1g if (!arg3) return 0; } result = (char *)(arg1)->getXcapHeaderParamValue((char const *)arg2,(char const *)arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); delete [] result; @@ -10823,7 +10894,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SMSData_1getOA (void)jarg1_; arg1 = *(SMSData **)&jarg1; result = (char *)(arg1)->getOA(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -10838,7 +10909,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SMSData_1getDA (void)jarg1_; arg1 = *(SMSData **)&jarg1; result = (char *)(arg1)->getDA(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -11065,7 +11136,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MsrpMessage_1g (void)jarg1_; arg1 = *(MsrpMessage **)&jarg1; result = (char *)(arg1)->getPhrase(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -11211,7 +11282,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MsrpMessage_1g if (!arg2) return 0; } result = (char *)(arg1)->getMsrpHeaderValue((char const *)arg2); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); delete [] result; return jresult; @@ -11240,7 +11311,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MsrpMessage_1g if (!arg3) return 0; } result = (char *)(arg1)->getMsrpHeaderParamValue((char const *)arg2,(char const *)arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); delete [] result; @@ -11417,7 +11488,7 @@ SWIGEXPORT void JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MsrpCallback_1cha } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGMediaContentCPIMUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaContentCPIM_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11425,7 +11496,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGMediaContent return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGDialogEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_DialogEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11433,7 +11504,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGDialogEventU return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGStackEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_StackEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11441,7 +11512,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGStackEventUp return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGInviteEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_InviteEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11449,7 +11520,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGInviteEventU return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGMessagingEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MessagingEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11457,7 +11528,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGMessagingEve return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGInfoEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_InfoEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11465,7 +11536,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGInfoEventUpc return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGOptionsEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_OptionsEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11473,7 +11544,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGOptionsEvent return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGPublicationEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_PublicationEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11481,7 +11552,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGPublicationE return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGRegistrationEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_RegistrationEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11489,7 +11560,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGRegistration return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGSubscriptionEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SubscriptionEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11497,7 +11568,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGSubscription return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGInviteSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_InviteSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11505,7 +11576,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGInviteSessio return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGCallSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_CallSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11513,7 +11584,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGCallSessionU return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGMsrpSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MsrpSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11521,7 +11592,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGMsrpSessionU return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGMessagingSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MessagingSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11529,7 +11600,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGMessagingSes return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGInfoSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_InfoSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11537,7 +11608,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGInfoSessionU return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGOptionsSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_OptionsSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11545,7 +11616,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGOptionsSessi return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGPublicationSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_PublicationSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11553,7 +11624,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGPublicationS return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGRegistrationSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_RegistrationSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11561,7 +11632,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGRegistration return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGSubscriptionSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SubscriptionSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11569,7 +11640,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGSubscription return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGProxyAudioConsumerUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_ProxyAudioConsumer_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11577,7 +11648,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGProxyAudioCo return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGProxyVideoConsumerUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_ProxyVideoConsumer_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11585,7 +11656,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGProxyVideoCo return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGProxyAudioProducerUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_ProxyAudioProducer_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11593,7 +11664,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGProxyAudioPr return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGProxyVideoProducerUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_ProxyVideoProducer_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11601,7 +11672,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGProxyVideoPr return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGSipStackUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; diff --git a/branches/2.0/doubango/bindings/java/android/tinyWRAP_wrap.h b/branches/2.0/doubango/bindings/java/android/tinyWRAP_wrap.h index aacedb23..7cc3a039 100644 --- a/branches/2.0/doubango/bindings/java/android/tinyWRAP_wrap.h +++ b/branches/2.0/doubango/bindings/java/android/tinyWRAP_wrap.h @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make diff --git a/branches/2.0/doubango/bindings/java/android/tmedia_bandwidth_level_t.java b/branches/2.0/doubango/bindings/java/android/tmedia_bandwidth_level_t.java index 46a2fe37..12212ba3 100644 --- a/branches/2.0/doubango/bindings/java/android/tmedia_bandwidth_level_t.java +++ b/branches/2.0/doubango/bindings/java/android/tmedia_bandwidth_level_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tmedia_chroma_t.java b/branches/2.0/doubango/bindings/java/android/tmedia_chroma_t.java index 1ba112a0..69e24abb 100644 --- a/branches/2.0/doubango/bindings/java/android/tmedia_chroma_t.java +++ b/branches/2.0/doubango/bindings/java/android/tmedia_chroma_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tmedia_pref_video_size_t.java b/branches/2.0/doubango/bindings/java/android/tmedia_pref_video_size_t.java new file mode 100644 index 00000000..2fadefca --- /dev/null +++ b/branches/2.0/doubango/bindings/java/android/tmedia_pref_video_size_t.java @@ -0,0 +1,62 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package org.doubango.tinyWRAP; + +public enum tmedia_pref_video_size_t { + tmedia_pref_video_size_sqcif, + tmedia_pref_video_size_qcif, + tmedia_pref_video_size_qvga, + tmedia_pref_video_size_cif, + tmedia_pref_video_size_hvga, + tmedia_pref_video_size_vga, + tmedia_pref_video_size_4cif, + tmedia_pref_video_size_svga, + tmedia_pref_video_size_480p, + tmedia_pref_video_size_720p, + tmedia_pref_video_size_16cif, + tmedia_pref_video_size_1080p; + + public final int swigValue() { + return swigValue; + } + + public static tmedia_pref_video_size_t swigToEnum(int swigValue) { + tmedia_pref_video_size_t[] swigValues = tmedia_pref_video_size_t.class.getEnumConstants(); + if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue) + return swigValues[swigValue]; + for (tmedia_pref_video_size_t swigEnum : swigValues) + if (swigEnum.swigValue == swigValue) + return swigEnum; + throw new IllegalArgumentException("No enum " + tmedia_pref_video_size_t.class + " with value " + swigValue); + } + + @SuppressWarnings("unused") + private tmedia_pref_video_size_t() { + this.swigValue = SwigNext.next++; + } + + @SuppressWarnings("unused") + private tmedia_pref_video_size_t(int swigValue) { + this.swigValue = swigValue; + SwigNext.next = swigValue+1; + } + + @SuppressWarnings("unused") + private tmedia_pref_video_size_t(tmedia_pref_video_size_t swigEnum) { + this.swigValue = swigEnum.swigValue; + SwigNext.next = this.swigValue+1; + } + + private final int swigValue; + + private static class SwigNext { + private static int next = 0; + } +} + diff --git a/branches/2.0/doubango/bindings/java/android/tmedia_profile_t.java b/branches/2.0/doubango/bindings/java/android/tmedia_profile_t.java new file mode 100644 index 00000000..3cfff003 --- /dev/null +++ b/branches/2.0/doubango/bindings/java/android/tmedia_profile_t.java @@ -0,0 +1,52 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package org.doubango.tinyWRAP; + +public enum tmedia_profile_t { + tmedia_profile_default, + tmedia_profile_rtcweb; + + public final int swigValue() { + return swigValue; + } + + public static tmedia_profile_t swigToEnum(int swigValue) { + tmedia_profile_t[] swigValues = tmedia_profile_t.class.getEnumConstants(); + if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue) + return swigValues[swigValue]; + for (tmedia_profile_t swigEnum : swigValues) + if (swigEnum.swigValue == swigValue) + return swigEnum; + throw new IllegalArgumentException("No enum " + tmedia_profile_t.class + " with value " + swigValue); + } + + @SuppressWarnings("unused") + private tmedia_profile_t() { + this.swigValue = SwigNext.next++; + } + + @SuppressWarnings("unused") + private tmedia_profile_t(int swigValue) { + this.swigValue = swigValue; + SwigNext.next = swigValue+1; + } + + @SuppressWarnings("unused") + private tmedia_profile_t(tmedia_profile_t swigEnum) { + this.swigValue = swigEnum.swigValue; + SwigNext.next = this.swigValue+1; + } + + private final int swigValue; + + private static class SwigNext { + private static int next = 0; + } +} + diff --git a/branches/2.0/doubango/bindings/java/android/tmedia_qos_strength_t.java b/branches/2.0/doubango/bindings/java/android/tmedia_qos_strength_t.java index 5bd80172..f12f1a61 100644 --- a/branches/2.0/doubango/bindings/java/android/tmedia_qos_strength_t.java +++ b/branches/2.0/doubango/bindings/java/android/tmedia_qos_strength_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tmedia_qos_stype_t.java b/branches/2.0/doubango/bindings/java/android/tmedia_qos_stype_t.java index e81416e0..1c83e807 100644 --- a/branches/2.0/doubango/bindings/java/android/tmedia_qos_stype_t.java +++ b/branches/2.0/doubango/bindings/java/android/tmedia_qos_stype_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tmedia_srtp_mode_t.java b/branches/2.0/doubango/bindings/java/android/tmedia_srtp_mode_t.java index 63a3c47e..99458aa7 100644 --- a/branches/2.0/doubango/bindings/java/android/tmedia_srtp_mode_t.java +++ b/branches/2.0/doubango/bindings/java/android/tmedia_srtp_mode_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tmsrp_event_type_t.java b/branches/2.0/doubango/bindings/java/android/tmsrp_event_type_t.java index c849e756..b424f350 100644 --- a/branches/2.0/doubango/bindings/java/android/tmsrp_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/android/tmsrp_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tmsrp_request_type_t.java b/branches/2.0/doubango/bindings/java/android/tmsrp_request_type_t.java index 5c0d6914..d71eb63f 100644 --- a/branches/2.0/doubango/bindings/java/android/tmsrp_request_type_t.java +++ b/branches/2.0/doubango/bindings/java/android/tmsrp_request_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tsip_event_type_t.java b/branches/2.0/doubango/bindings/java/android/tsip_event_type_t.java index 0cc74b6e..fc7e6dfb 100644 --- a/branches/2.0/doubango/bindings/java/android/tsip_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/android/tsip_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tsip_info_event_type_t.java b/branches/2.0/doubango/bindings/java/android/tsip_info_event_type_t.java index ab95b0ee..906dff27 100644 --- a/branches/2.0/doubango/bindings/java/android/tsip_info_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/android/tsip_info_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tsip_invite_event_type_t.java b/branches/2.0/doubango/bindings/java/android/tsip_invite_event_type_t.java index 902ef497..4e228e5f 100644 --- a/branches/2.0/doubango/bindings/java/android/tsip_invite_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/android/tsip_invite_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tsip_message_event_type_t.java b/branches/2.0/doubango/bindings/java/android/tsip_message_event_type_t.java index 280845ac..c39be042 100644 --- a/branches/2.0/doubango/bindings/java/android/tsip_message_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/android/tsip_message_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tsip_options_event_type_t.java b/branches/2.0/doubango/bindings/java/android/tsip_options_event_type_t.java index 70166763..9ca97fc5 100644 --- a/branches/2.0/doubango/bindings/java/android/tsip_options_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/android/tsip_options_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tsip_publish_event_type_t.java b/branches/2.0/doubango/bindings/java/android/tsip_publish_event_type_t.java index a9ec14a0..d5b4cae2 100644 --- a/branches/2.0/doubango/bindings/java/android/tsip_publish_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/android/tsip_publish_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tsip_register_event_type_t.java b/branches/2.0/doubango/bindings/java/android/tsip_register_event_type_t.java index 298204e0..d33070fa 100644 --- a/branches/2.0/doubango/bindings/java/android/tsip_register_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/android/tsip_register_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tsip_request_type_t.java b/branches/2.0/doubango/bindings/java/android/tsip_request_type_t.java index 50dd6a09..a365be09 100644 --- a/branches/2.0/doubango/bindings/java/android/tsip_request_type_t.java +++ b/branches/2.0/doubango/bindings/java/android/tsip_request_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/tsip_subscribe_event_type_t.java b/branches/2.0/doubango/bindings/java/android/tsip_subscribe_event_type_t.java index 5091b658..9454f11f 100644 --- a/branches/2.0/doubango/bindings/java/android/tsip_subscribe_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/android/tsip_subscribe_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/twrap_media_type_t.java b/branches/2.0/doubango/bindings/java/android/twrap_media_type_t.java index 8d44a147..2bb2d8a5 100644 --- a/branches/2.0/doubango/bindings/java/android/twrap_media_type_t.java +++ b/branches/2.0/doubango/bindings/java/android/twrap_media_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/twrap_proxy_plugin_type_t.java b/branches/2.0/doubango/bindings/java/android/twrap_proxy_plugin_type_t.java index bc0421bf..c0deb29c 100644 --- a/branches/2.0/doubango/bindings/java/android/twrap_proxy_plugin_type_t.java +++ b/branches/2.0/doubango/bindings/java/android/twrap_proxy_plugin_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/twrap_rpmessage_type_t.java b/branches/2.0/doubango/bindings/java/android/twrap_rpmessage_type_t.java index f8ed86a3..bc227a78 100644 --- a/branches/2.0/doubango/bindings/java/android/twrap_rpmessage_type_t.java +++ b/branches/2.0/doubango/bindings/java/android/twrap_rpmessage_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/android/twrap_sms_type_t.java b/branches/2.0/doubango/bindings/java/android/twrap_sms_type_t.java index dde6e1b6..b97917d3 100644 --- a/branches/2.0/doubango/bindings/java/android/twrap_sms_type_t.java +++ b/branches/2.0/doubango/bindings/java/android/twrap_sms_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tdav_codec_id_t.java b/branches/2.0/doubango/bindings/java/tdav_codec_id_t.java index 3cb12c5b..39db9fe7 100644 --- a/branches/2.0/doubango/bindings/java/tdav_codec_id_t.java +++ b/branches/2.0/doubango/bindings/java/tdav_codec_id_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -30,9 +30,12 @@ public enum tdav_codec_id_t { tdav_codec_id_h263(0x00010000 << 1), tdav_codec_id_h263p(0x00010000 << 2), tdav_codec_id_h263pp(0x00010000 << 3), - tdav_codec_id_h264_bp10(0x00010000 << 4), - tdav_codec_id_h264_bp20(0x00010000 << 5), - tdav_codec_id_h264_bp30(0x00010000 << 6), + tdav_codec_id_h264_bp(0x00010000 << 4), + tdav_codec_id_h264_mp(0x00010000 << 5), + tdav_codec_id_h264_hp(0x00010000 << 6), + tdav_codec_id_h264_bp10(tdav_codec_id_h264_bp), + tdav_codec_id_h264_bp20(tdav_codec_id_h264_bp), + tdav_codec_id_h264_bp30(tdav_codec_id_h264_bp), tdav_codec_id_h264_svc(0x00010000 << 7), tdav_codec_id_theora(0x00010000 << 8), tdav_codec_id_mp4ves_es(0x00010000 << 9), diff --git a/branches/2.0/doubango/bindings/java/thttp_event_type_t.java b/branches/2.0/doubango/bindings/java/thttp_event_type_t.java index de06855b..b7b89ef0 100644 --- a/branches/2.0/doubango/bindings/java/thttp_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/thttp_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tinyWRAP.java b/branches/2.0/doubango/bindings/java/tinyWRAP.java index d10c59ad..e87f5af5 100644 --- a/branches/2.0/doubango/bindings/java/tinyWRAP.java +++ b/branches/2.0/doubango/bindings/java/tinyWRAP.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tinyWRAPConstants.java b/branches/2.0/doubango/bindings/java/tinyWRAPConstants.java index 1c7f7324..79ebc50f 100644 --- a/branches/2.0/doubango/bindings/java/tinyWRAPConstants.java +++ b/branches/2.0/doubango/bindings/java/tinyWRAPConstants.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tinyWRAPJNI.java b/branches/2.0/doubango/bindings/java/tinyWRAPJNI.java index a77d95e6..6c706aca 100644 --- a/branches/2.0/doubango/bindings/java/tinyWRAPJNI.java +++ b/branches/2.0/doubango/bindings/java/tinyWRAPJNI.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. @@ -8,7 +8,7 @@ package org.doubango.tinyWRAP; -class tinyWRAPJNI { +public class tinyWRAPJNI { public final static native long new_DDebugCallback(); public final static native void delete_DDebugCallback(long jarg1); public final static native int DDebugCallback_OnDebugInfo(long jarg1, DDebugCallback jarg1_, String jarg2); @@ -44,8 +44,11 @@ class tinyWRAPJNI { public final static native long MediaSessionMgr_findProxyPluginConsumer(long jarg1, MediaSessionMgr jarg1_, int jarg2); public final static native long MediaSessionMgr_findProxyPluginProducer(long jarg1, MediaSessionMgr jarg1_, int jarg2); public final static native java.math.BigInteger MediaSessionMgr_getSessionId(long jarg1, MediaSessionMgr jarg1_, int jarg2); + public final static native boolean MediaSessionMgr_defaultsSetProfile(int jarg1); + public final static native int MediaSessionMgr_defaultsGetProfile(); public final static native boolean MediaSessionMgr_defaultsSetBandwidthLevel(int jarg1); public final static native int MediaSessionMgr_defaultsGetBandwidthLevel(); + public final static native boolean MediaSessionMgr_defaultsSetPrefVideoSize(int jarg1); public final static native boolean MediaSessionMgr_defaultsSetJbMargin(long jarg1); public final static native boolean MediaSessionMgr_defaultsSetJbMaxLateRate(long jarg1); public final static native boolean MediaSessionMgr_defaultsSetEchoTail(long jarg1); @@ -73,6 +76,7 @@ class tinyWRAPJNI { public final static native int MediaSessionMgr_defaultsGetVolume(); public final static native boolean MediaSessionMgr_defaultsSetInviteSessionTimers(int jarg1, String jarg2); public final static native boolean MediaSessionMgr_defaultsSetSRtpMode(int jarg1); + public final static native boolean MediaSessionMgr_defaultsSetIceEnabled(boolean jarg1); public final static native void delete_MediaContent(long jarg1); public final static native String MediaContent_getType(long jarg1, MediaContent jarg1_); public final static native long MediaContent_getDataLength(long jarg1, MediaContent jarg1_); @@ -194,6 +198,7 @@ class tinyWRAPJNI { public final static native boolean CallSession_callVideo__SWIG_3(long jarg1, CallSession jarg1_, long jarg2, SipUri jarg2_); public final static native boolean CallSession_setSessionTimer(long jarg1, CallSession jarg1_, long jarg2, String jarg3); public final static native boolean CallSession_set100rel(long jarg1, CallSession jarg1_, boolean jarg2); + public final static native boolean CallSession_setICE(long jarg1, CallSession jarg1_, boolean jarg2); public final static native boolean CallSession_setQoS(long jarg1, CallSession jarg1_, int jarg2, int jarg3); public final static native boolean CallSession_hold__SWIG_0(long jarg1, CallSession jarg1_, long jarg2, ActionConfig jarg2_); public final static native boolean CallSession_hold__SWIG_1(long jarg1, CallSession jarg1_); @@ -543,30 +548,30 @@ class tinyWRAPJNI { public final static native int MsrpCallback_OnEventSwigExplicitMsrpCallback(long jarg1, MsrpCallback jarg1_, long jarg2, MsrpEvent jarg2_); public final static native void MsrpCallback_director_connect(MsrpCallback obj, long cptr, boolean mem_own, boolean weak_global); public final static native void MsrpCallback_change_ownership(MsrpCallback obj, long cptr, boolean take_or_release); - public final static native long SWIGMediaContentCPIMUpcast(long jarg1); - public final static native long SWIGDialogEventUpcast(long jarg1); - public final static native long SWIGStackEventUpcast(long jarg1); - public final static native long SWIGInviteEventUpcast(long jarg1); - public final static native long SWIGMessagingEventUpcast(long jarg1); - public final static native long SWIGInfoEventUpcast(long jarg1); - public final static native long SWIGOptionsEventUpcast(long jarg1); - public final static native long SWIGPublicationEventUpcast(long jarg1); - public final static native long SWIGRegistrationEventUpcast(long jarg1); - public final static native long SWIGSubscriptionEventUpcast(long jarg1); - public final static native long SWIGInviteSessionUpcast(long jarg1); - public final static native long SWIGCallSessionUpcast(long jarg1); - public final static native long SWIGMsrpSessionUpcast(long jarg1); - public final static native long SWIGMessagingSessionUpcast(long jarg1); - public final static native long SWIGInfoSessionUpcast(long jarg1); - public final static native long SWIGOptionsSessionUpcast(long jarg1); - public final static native long SWIGPublicationSessionUpcast(long jarg1); - public final static native long SWIGRegistrationSessionUpcast(long jarg1); - public final static native long SWIGSubscriptionSessionUpcast(long jarg1); - public final static native long SWIGProxyAudioConsumerUpcast(long jarg1); - public final static native long SWIGProxyVideoConsumerUpcast(long jarg1); - public final static native long SWIGProxyAudioProducerUpcast(long jarg1); - public final static native long SWIGProxyVideoProducerUpcast(long jarg1); - public final static native long SWIGSipStackUpcast(long jarg1); + public final static native long MediaContentCPIM_SWIGUpcast(long jarg1); + public final static native long DialogEvent_SWIGUpcast(long jarg1); + public final static native long StackEvent_SWIGUpcast(long jarg1); + public final static native long InviteEvent_SWIGUpcast(long jarg1); + public final static native long MessagingEvent_SWIGUpcast(long jarg1); + public final static native long InfoEvent_SWIGUpcast(long jarg1); + public final static native long OptionsEvent_SWIGUpcast(long jarg1); + public final static native long PublicationEvent_SWIGUpcast(long jarg1); + public final static native long RegistrationEvent_SWIGUpcast(long jarg1); + public final static native long SubscriptionEvent_SWIGUpcast(long jarg1); + public final static native long InviteSession_SWIGUpcast(long jarg1); + public final static native long CallSession_SWIGUpcast(long jarg1); + public final static native long MsrpSession_SWIGUpcast(long jarg1); + public final static native long MessagingSession_SWIGUpcast(long jarg1); + public final static native long InfoSession_SWIGUpcast(long jarg1); + public final static native long OptionsSession_SWIGUpcast(long jarg1); + public final static native long PublicationSession_SWIGUpcast(long jarg1); + public final static native long RegistrationSession_SWIGUpcast(long jarg1); + public final static native long SubscriptionSession_SWIGUpcast(long jarg1); + public final static native long ProxyAudioConsumer_SWIGUpcast(long jarg1); + public final static native long ProxyVideoConsumer_SWIGUpcast(long jarg1); + public final static native long ProxyAudioProducer_SWIGUpcast(long jarg1); + public final static native long ProxyVideoProducer_SWIGUpcast(long jarg1); + public final static native long SipStack_SWIGUpcast(long jarg1); public static int SwigDirector_DDebugCallback_OnDebugInfo(DDebugCallback self, String message) { return self.OnDebugInfo(message); diff --git a/branches/2.0/doubango/bindings/java/tinyWRAP_wrap.cxx b/branches/2.0/doubango/bindings/java/tinyWRAP_wrap.cxx index d58a2067..23f7dcbd 100644 --- a/branches/2.0/doubango/bindings/java/tinyWRAP_wrap.cxx +++ b/branches/2.0/doubango/bindings/java/tinyWRAP_wrap.cxx @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make @@ -35,114 +35,114 @@ template T SwigValueInit() { } #endif -/* ----------------------------------------------------------------------------- - * This section contains generic SWIG labels for method/variable - * declarations/attributes, and other compiler dependent labels. - * ----------------------------------------------------------------------------- */ - -/* template workaround for compilers that cannot correctly implement the C++ standard */ -#ifndef SWIGTEMPLATEDISAMBIGUATOR -# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) -# define SWIGTEMPLATEDISAMBIGUATOR template -# elif defined(__HP_aCC) -/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ -/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ -# define SWIGTEMPLATEDISAMBIGUATOR template -# else -# define SWIGTEMPLATEDISAMBIGUATOR -# endif -#endif - -/* inline attribute */ -#ifndef SWIGINLINE -# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) -# define SWIGINLINE inline -# else -# define SWIGINLINE -# endif -#endif - -/* attribute recognised by some compilers to avoid 'unused' warnings */ -#ifndef SWIGUNUSED -# if defined(__GNUC__) -# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -# define SWIGUNUSED __attribute__ ((__unused__)) -# else -# define SWIGUNUSED -# endif -# elif defined(__ICC) -# define SWIGUNUSED __attribute__ ((__unused__)) -# else -# define SWIGUNUSED -# endif -#endif - -#ifndef SWIG_MSC_UNSUPPRESS_4505 -# if defined(_MSC_VER) -# pragma warning(disable : 4505) /* unreferenced local function has been removed */ -# endif -#endif - -#ifndef SWIGUNUSEDPARM -# ifdef __cplusplus -# define SWIGUNUSEDPARM(p) -# else -# define SWIGUNUSEDPARM(p) p SWIGUNUSED -# endif -#endif - -/* internal SWIG method */ -#ifndef SWIGINTERN -# define SWIGINTERN static SWIGUNUSED -#endif - -/* internal inline SWIG method */ -#ifndef SWIGINTERNINLINE -# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE -#endif - -/* exporting methods */ -#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) -# ifndef GCC_HASCLASSVISIBILITY -# define GCC_HASCLASSVISIBILITY -# endif -#endif - -#ifndef SWIGEXPORT -# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) -# if defined(STATIC_LINKED) -# define SWIGEXPORT -# else -# define SWIGEXPORT __declspec(dllexport) -# endif -# else -# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) -# define SWIGEXPORT __attribute__ ((visibility("default"))) -# else -# define SWIGEXPORT -# endif -# endif -#endif - -/* calling conventions for Windows */ -#ifndef SWIGSTDCALL -# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) -# define SWIGSTDCALL __stdcall -# else -# define SWIGSTDCALL -# endif -#endif - -/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ -#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) -# define _CRT_SECURE_NO_DEPRECATE -#endif - -/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ -#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) -# define _SCL_SECURE_NO_DEPRECATE -#endif - +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ + +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif + +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif + +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif + +#ifndef SWIG_MSC_UNSUPPRESS_4505 +# if defined(_MSC_VER) +# pragma warning(disable : 4505) /* unreferenced local function has been removed */ +# endif +#endif + +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif + +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + /* Fix for jlong on some versions of gcc on Windows */ @@ -193,7 +193,8 @@ static void SWIGUNUSED SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionC { SWIG_JavaNullPointerException, "java/lang/NullPointerException" }, { SWIG_JavaDirectorPureVirtual, "java/lang/RuntimeException" }, { SWIG_JavaUnknownError, "java/lang/UnknownError" }, - { (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" } }; + { (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" } + }; const SWIG_JavaExceptions_t *except_ptr = java_exceptions; while (except_ptr->code != code && except_ptr->code) @@ -210,200 +211,199 @@ static void SWIGUNUSED SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionC #define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_JavaThrowException(jenv, SWIG_JavaIllegalArgumentException, msg); return nullreturn; } else -/* ----------------------------------------------------------------------------- - * See the LICENSE file for information on copyright, usage and redistribution - * of SWIG, and the README file for authors - http://www.swig.org/release.html. - * - * director.swg - * - * This file contains support for director classes that proxy - * method calls from C++ to Java extensions. - * ----------------------------------------------------------------------------- */ - -#ifdef __cplusplus - -#if defined(DEBUG_DIRECTOR_OWNED) -#include -#endif - -namespace Swig { - /* Java object wrapper */ - class JObjectWrapper { - public: - JObjectWrapper() : jthis_(NULL), weak_global_(true) { - } - - ~JObjectWrapper() { - jthis_ = NULL; - weak_global_ = true; - } - - bool set(JNIEnv *jenv, jobject jobj, bool mem_own, bool weak_global) { - if (!jthis_) { - weak_global_ = weak_global; - if (jobj) - jthis_ = ((weak_global_ || !mem_own) ? jenv->NewWeakGlobalRef(jobj) : jenv->NewGlobalRef(jobj)); -#if defined(DEBUG_DIRECTOR_OWNED) - std::cout << "JObjectWrapper::set(" << jobj << ", " << (weak_global ? "weak_global" : "global_ref") << ") -> " << jthis_ << std::endl; -#endif - return true; - } else { -#if defined(DEBUG_DIRECTOR_OWNED) - std::cout << "JObjectWrapper::set(" << jobj << ", " << (weak_global ? "weak_global" : "global_ref") << ") -> already set" << std::endl; -#endif - return false; - } - } - - jobject get(JNIEnv *jenv) const { -#if defined(DEBUG_DIRECTOR_OWNED) - std::cout << "JObjectWrapper::get("; - if (jthis_) - std::cout << jthis_; - else - std::cout << "null"; - std::cout << ") -> return new local ref" << std::endl; -#endif - return (jthis_ ? jenv->NewLocalRef(jthis_) : jthis_); - } - - void release(JNIEnv *jenv) { -#if defined(DEBUG_DIRECTOR_OWNED) - std::cout << "JObjectWrapper::release(" << jthis_ << "): " << (weak_global_ ? "weak global ref" : "global ref") << std::endl; -#endif - if (jthis_) { - if (weak_global_) { - if (jenv->IsSameObject(jthis_, NULL) == JNI_FALSE) - jenv->DeleteWeakGlobalRef((jweak)jthis_); - } else - jenv->DeleteGlobalRef(jthis_); - } - - jthis_ = NULL; - weak_global_ = true; - } - - jobject peek() { - return jthis_; - } - - /* Java proxy releases ownership of C++ object, C++ object is now - responsible for destruction (creates NewGlobalRef to pin Java - proxy) */ - void java_change_ownership(JNIEnv *jenv, jobject jself, bool take_or_release) { - if (take_or_release) { /* Java takes ownership of C++ object's lifetime. */ - if (!weak_global_) { - jenv->DeleteGlobalRef(jthis_); - jthis_ = jenv->NewWeakGlobalRef(jself); - weak_global_ = true; - } - } else { /* Java releases ownership of C++ object's lifetime */ - if (weak_global_) { - jenv->DeleteWeakGlobalRef((jweak)jthis_); - jthis_ = jenv->NewGlobalRef(jself); - weak_global_ = false; - } - } - } - - private: - /* pointer to Java object */ - jobject jthis_; - /* Local or global reference flag */ - bool weak_global_; - }; - - /* director base class */ - class Director { - /* pointer to Java virtual machine */ - JavaVM *swig_jvm_; - - protected: -#if defined (_MSC_VER) && (_MSC_VER<1300) - class JNIEnvWrapper; - friend class JNIEnvWrapper; -#endif - /* Utility class for managing the JNI environment */ - class JNIEnvWrapper { - const Director *director_; - JNIEnv *jenv_; - public: - JNIEnvWrapper(const Director *director) : director_(director), jenv_(0) { -#if defined(SWIG_JAVA_ATTACH_CURRENT_THREAD_AS_DAEMON) - // Attach a daemon thread to the JVM. Useful when the JVM should not wait for - // the thread to exit upon shutdown. Only for jdk-1.4 and later. - director_->swig_jvm_->AttachCurrentThreadAsDaemon((void **) &jenv_, NULL); -#else - director_->swig_jvm_->AttachCurrentThread((void **) &jenv_, NULL); -#endif - } - ~JNIEnvWrapper() { -#if !defined(SWIG_JAVA_NO_DETACH_CURRENT_THREAD) - // Some JVMs, eg jdk-1.4.2 and lower on Solaris have a bug and crash with the DetachCurrentThread call. - // However, without this call, the JVM hangs on exit when the thread was not created by the JVM and creates a memory leak. - director_->swig_jvm_->DetachCurrentThread(); -#endif - } - JNIEnv *getJNIEnv() const { - return jenv_; - } - }; - - /* Java object wrapper */ - JObjectWrapper swig_self_; - - /* Disconnect director from Java object */ - void swig_disconnect_director_self(const char *disconn_method) { - JNIEnvWrapper jnienv(this) ; - JNIEnv *jenv = jnienv.getJNIEnv() ; - jobject jobj = swig_self_.peek(); -#if defined(DEBUG_DIRECTOR_OWNED) - std::cout << "Swig::Director::disconnect_director_self(" << jobj << ")" << std::endl; -#endif - if (jobj && jenv->IsSameObject(jobj, NULL) == JNI_FALSE) { - jmethodID disconn_meth = jenv->GetMethodID(jenv->GetObjectClass(jobj), disconn_method, "()V"); - if (disconn_meth) { -#if defined(DEBUG_DIRECTOR_OWNED) - std::cout << "Swig::Director::disconnect_director_self upcall to " << disconn_method << std::endl; -#endif - jenv->CallVoidMethod(jobj, disconn_meth); - } - } - } - - public: - Director(JNIEnv *jenv) : swig_jvm_((JavaVM *) NULL), swig_self_() { - /* Acquire the Java VM pointer */ - jenv->GetJavaVM(&swig_jvm_); - } - - virtual ~Director() { - JNIEnvWrapper jnienv(this) ; - JNIEnv *jenv = jnienv.getJNIEnv() ; - swig_self_.release(jenv); - } - - bool swig_set_self(JNIEnv *jenv, jobject jself, bool mem_own, bool weak_global) { - return swig_self_.set(jenv, jself, mem_own, weak_global); - } - - jobject swig_get_self(JNIEnv *jenv) const { - return swig_self_.get(jenv); - } - - // Change C++ object's ownership, relative to Java - void swig_java_change_ownership(JNIEnv *jenv, jobject jself, bool take_or_release) { - swig_self_.java_change_ownership(jenv, jself, take_or_release); - } - }; -} - -#endif /* __cplusplus */ - - +/* ----------------------------------------------------------------------------- + * director.swg + * + * This file contains support for director classes that proxy + * method calls from C++ to Java extensions. + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus + +#if defined(DEBUG_DIRECTOR_OWNED) +#include +#endif + namespace Swig { - static jclass jclass_tinyWRAPJNI = NULL; - static jmethodID director_methids[35]; + /* Java object wrapper */ + class JObjectWrapper { + public: + JObjectWrapper() : jthis_(NULL), weak_global_(true) { + } + + ~JObjectWrapper() { + jthis_ = NULL; + weak_global_ = true; + } + + bool set(JNIEnv *jenv, jobject jobj, bool mem_own, bool weak_global) { + if (!jthis_) { + weak_global_ = weak_global; + if (jobj) + jthis_ = ((weak_global_ || !mem_own) ? jenv->NewWeakGlobalRef(jobj) : jenv->NewGlobalRef(jobj)); +#if defined(DEBUG_DIRECTOR_OWNED) + std::cout << "JObjectWrapper::set(" << jobj << ", " << (weak_global ? "weak_global" : "global_ref") << ") -> " << jthis_ << std::endl; +#endif + return true; + } else { +#if defined(DEBUG_DIRECTOR_OWNED) + std::cout << "JObjectWrapper::set(" << jobj << ", " << (weak_global ? "weak_global" : "global_ref") << ") -> already set" << std::endl; +#endif + return false; + } + } + + jobject get(JNIEnv *jenv) const { +#if defined(DEBUG_DIRECTOR_OWNED) + std::cout << "JObjectWrapper::get("; + if (jthis_) + std::cout << jthis_; + else + std::cout << "null"; + std::cout << ") -> return new local ref" << std::endl; +#endif + return (jthis_ ? jenv->NewLocalRef(jthis_) : jthis_); + } + + void release(JNIEnv *jenv) { +#if defined(DEBUG_DIRECTOR_OWNED) + std::cout << "JObjectWrapper::release(" << jthis_ << "): " << (weak_global_ ? "weak global ref" : "global ref") << std::endl; +#endif + if (jthis_) { + if (weak_global_) { + if (jenv->IsSameObject(jthis_, NULL) == JNI_FALSE) + jenv->DeleteWeakGlobalRef((jweak)jthis_); + } else + jenv->DeleteGlobalRef(jthis_); + } + + jthis_ = NULL; + weak_global_ = true; + } + + jobject peek() { + return jthis_; + } + + /* Java proxy releases ownership of C++ object, C++ object is now + responsible for destruction (creates NewGlobalRef to pin Java + proxy) */ + void java_change_ownership(JNIEnv *jenv, jobject jself, bool take_or_release) { + if (take_or_release) { /* Java takes ownership of C++ object's lifetime. */ + if (!weak_global_) { + jenv->DeleteGlobalRef(jthis_); + jthis_ = jenv->NewWeakGlobalRef(jself); + weak_global_ = true; + } + } else { /* Java releases ownership of C++ object's lifetime */ + if (weak_global_) { + jenv->DeleteWeakGlobalRef((jweak)jthis_); + jthis_ = jenv->NewGlobalRef(jself); + weak_global_ = false; + } + } + } + + private: + /* pointer to Java object */ + jobject jthis_; + /* Local or global reference flag */ + bool weak_global_; + }; + + /* director base class */ + class Director { + /* pointer to Java virtual machine */ + JavaVM *swig_jvm_; + + protected: +#if defined (_MSC_VER) && (_MSC_VER<1300) + class JNIEnvWrapper; + friend class JNIEnvWrapper; +#endif + /* Utility class for managing the JNI environment */ + class JNIEnvWrapper { + const Director *director_; + JNIEnv *jenv_; + public: + JNIEnvWrapper(const Director *director) : director_(director), jenv_(0) { +#if defined(SWIG_JAVA_ATTACH_CURRENT_THREAD_AS_DAEMON) + // Attach a daemon thread to the JVM. Useful when the JVM should not wait for + // the thread to exit upon shutdown. Only for jdk-1.4 and later. + director_->swig_jvm_->AttachCurrentThreadAsDaemon((void **) &jenv_, NULL); +#else + director_->swig_jvm_->AttachCurrentThread((void **) &jenv_, NULL); +#endif + } + ~JNIEnvWrapper() { +#if !defined(SWIG_JAVA_NO_DETACH_CURRENT_THREAD) + // Some JVMs, eg jdk-1.4.2 and lower on Solaris have a bug and crash with the DetachCurrentThread call. + // However, without this call, the JVM hangs on exit when the thread was not created by the JVM and creates a memory leak. + director_->swig_jvm_->DetachCurrentThread(); +#endif + } + JNIEnv *getJNIEnv() const { + return jenv_; + } + }; + + /* Java object wrapper */ + JObjectWrapper swig_self_; + + /* Disconnect director from Java object */ + void swig_disconnect_director_self(const char *disconn_method) { + JNIEnvWrapper jnienv(this) ; + JNIEnv *jenv = jnienv.getJNIEnv() ; + jobject jobj = swig_self_.peek(); +#if defined(DEBUG_DIRECTOR_OWNED) + std::cout << "Swig::Director::disconnect_director_self(" << jobj << ")" << std::endl; +#endif + if (jobj && jenv->IsSameObject(jobj, NULL) == JNI_FALSE) { + jmethodID disconn_meth = jenv->GetMethodID(jenv->GetObjectClass(jobj), disconn_method, "()V"); + if (disconn_meth) { +#if defined(DEBUG_DIRECTOR_OWNED) + std::cout << "Swig::Director::disconnect_director_self upcall to " << disconn_method << std::endl; +#endif + jenv->CallVoidMethod(jobj, disconn_meth); + } + } + } + + public: + Director(JNIEnv *jenv) : swig_jvm_((JavaVM *) NULL), swig_self_() { + /* Acquire the Java VM pointer */ + jenv->GetJavaVM(&swig_jvm_); + } + + virtual ~Director() { + JNIEnvWrapper jnienv(this) ; + JNIEnv *jenv = jnienv.getJNIEnv() ; + swig_self_.release(jenv); + } + + bool swig_set_self(JNIEnv *jenv, jobject jself, bool mem_own, bool weak_global) { + return swig_self_.set(jenv, jself, mem_own, weak_global); + } + + jobject swig_get_self(JNIEnv *jenv) const { + return swig_self_.get(jenv); + } + + // Change C++ object's ownership, relative to Java + void swig_java_change_ownership(JNIEnv *jenv, jobject jself, bool take_or_release) { + swig_self_.java_change_ownership(jenv, jself, take_or_release); + } + }; +} + +#endif /* __cplusplus */ + + +namespace Swig { + namespace { + jclass jclass_tinyWRAPJNI = NULL; + jmethodID director_methids[35]; + } } #include // Use the C99 official header @@ -473,7 +473,7 @@ int SwigDirector_DDebugCallback::OnDebugInfo(char const *message) { if (!jmessage) return c_result; } jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[0], swigjobj, jmessage); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -501,7 +501,7 @@ int SwigDirector_DDebugCallback::OnDebugWarn(char const *message) { if (!jmessage) return c_result; } jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[1], swigjobj, jmessage); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -529,7 +529,7 @@ int SwigDirector_DDebugCallback::OnDebugError(char const *message) { if (!jmessage) return c_result; } jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[2], swigjobj, jmessage); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -557,7 +557,7 @@ int SwigDirector_DDebugCallback::OnDebugFatal(char const *message) { if (!jmessage) return c_result; } jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[3], swigjobj, jmessage); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -652,7 +652,7 @@ int SwigDirector_ProxyPluginMgrCallback::OnPluginCreated(uint64_t id, enum twrap } jtype = (jint) type; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[4], swigjobj, jid, jtype); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -694,7 +694,7 @@ int SwigDirector_ProxyPluginMgrCallback::OnPluginDestroyed(uint64_t id, enum twr } jtype = (jint) type; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[5], swigjobj, jid, jtype); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -769,7 +769,7 @@ int SwigDirector_ProxyAudioConsumerCallback::prepare(int ptime, int rate, int ch jrate = (jint) rate; jchannels = (jint) channels; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[6], swigjobj, jptime, jrate, jchannels); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -791,7 +791,7 @@ int SwigDirector_ProxyAudioConsumerCallback::start() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[7], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -813,7 +813,7 @@ int SwigDirector_ProxyAudioConsumerCallback::pause() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[8], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -835,7 +835,7 @@ int SwigDirector_ProxyAudioConsumerCallback::stop() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[9], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -916,7 +916,7 @@ int SwigDirector_ProxyVideoConsumerCallback::prepare(int nWidth, int nHeight, in jnHeight = (jint) nHeight; jnFps = (jint) nFps; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[10], swigjobj, jnWidth, jnHeight, jnFps); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -940,7 +940,7 @@ int SwigDirector_ProxyVideoConsumerCallback::consume(ProxyVideoFrame const *fram if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((ProxyVideoFrame **)&jframe) = (ProxyVideoFrame *) frame; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[11], swigjobj, jframe); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -966,7 +966,7 @@ int SwigDirector_ProxyVideoConsumerCallback::bufferCopied(unsigned int nCopiedSi jnCopiedSize = (jlong) nCopiedSize; jnAvailableSize = (jlong) nAvailableSize; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[12], swigjobj, jnCopiedSize, jnAvailableSize); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -988,7 +988,7 @@ int SwigDirector_ProxyVideoConsumerCallback::start() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[13], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1010,7 +1010,7 @@ int SwigDirector_ProxyVideoConsumerCallback::pause() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[14], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1032,7 +1032,7 @@ int SwigDirector_ProxyVideoConsumerCallback::stop() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[15], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1119,7 +1119,7 @@ int SwigDirector_ProxyAudioProducerCallback::prepare(int ptime, int rate, int ch jrate = (jint) rate; jchannels = (jint) channels; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[16], swigjobj, jptime, jrate, jchannels); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1141,7 +1141,7 @@ int SwigDirector_ProxyAudioProducerCallback::start() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[17], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1163,7 +1163,7 @@ int SwigDirector_ProxyAudioProducerCallback::pause() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[18], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1185,7 +1185,7 @@ int SwigDirector_ProxyAudioProducerCallback::stop() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[19], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1266,7 +1266,7 @@ int SwigDirector_ProxyVideoProducerCallback::prepare(int width, int height, int jheight = (jint) height; jfps = (jint) fps; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[20], swigjobj, jwidth, jheight, jfps); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1288,7 +1288,7 @@ int SwigDirector_ProxyVideoProducerCallback::start() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[21], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1310,7 +1310,7 @@ int SwigDirector_ProxyVideoProducerCallback::pause() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[22], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1332,7 +1332,7 @@ int SwigDirector_ProxyVideoProducerCallback::stop() { swigjobj = swig_get_self(jenv); if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[23], swigjobj); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1409,7 +1409,7 @@ int SwigDirector_SipCallback::OnDialogEvent(DialogEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((DialogEvent **)&je) = (DialogEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[24], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1433,7 +1433,7 @@ int SwigDirector_SipCallback::OnStackEvent(StackEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((StackEvent **)&je) = (StackEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[25], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1457,7 +1457,7 @@ int SwigDirector_SipCallback::OnInviteEvent(InviteEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((InviteEvent **)&je) = (InviteEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[26], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1481,7 +1481,7 @@ int SwigDirector_SipCallback::OnMessagingEvent(MessagingEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((MessagingEvent **)&je) = (MessagingEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[27], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1505,7 +1505,7 @@ int SwigDirector_SipCallback::OnInfoEvent(InfoEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((InfoEvent **)&je) = (InfoEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[28], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1529,7 +1529,7 @@ int SwigDirector_SipCallback::OnOptionsEvent(OptionsEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((OptionsEvent **)&je) = (OptionsEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[29], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1553,7 +1553,7 @@ int SwigDirector_SipCallback::OnPublicationEvent(PublicationEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((PublicationEvent **)&je) = (PublicationEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[30], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1577,7 +1577,7 @@ int SwigDirector_SipCallback::OnRegistrationEvent(RegistrationEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((RegistrationEvent **)&je) = (RegistrationEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[31], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1601,7 +1601,7 @@ int SwigDirector_SipCallback::OnSubscriptionEvent(SubscriptionEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((SubscriptionEvent **)&je) = (SubscriptionEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[32], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1693,7 +1693,7 @@ int SwigDirector_XcapCallback::onEvent(XcapEvent const *e) const { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((XcapEvent **)&je) = (XcapEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[33], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -1761,7 +1761,7 @@ int SwigDirector_MsrpCallback::OnEvent(MsrpEvent const *e) { if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { *((MsrpEvent **)&je) = (MsrpEvent *) e; jresult = (jint) jenv->CallStaticIntMethod(Swig::jclass_tinyWRAPJNI, Swig::director_methids[34], swigjobj, je); - if (jenv->ExceptionOccurred()) return c_result; + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; c_result = (int)jresult; } else { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); @@ -2517,6 +2517,32 @@ SWIGEXPORT jobject JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMg } +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetProfile(JNIEnv *jenv, jclass jcls, jint jarg1) { + jboolean jresult = 0 ; + tmedia_profile_t arg1 ; + bool result; + + (void)jenv; + (void)jcls; + arg1 = (tmedia_profile_t)jarg1; + result = (bool)MediaSessionMgr::defaultsSetProfile(arg1); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsGetProfile(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + tmedia_profile_t result; + + (void)jenv; + (void)jcls; + result = (tmedia_profile_t)MediaSessionMgr::defaultsGetProfile(); + jresult = (jint)result; + return jresult; +} + + SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetBandwidthLevel(JNIEnv *jenv, jclass jcls, jint jarg1) { jboolean jresult = 0 ; tmedia_bandwidth_level_t arg1 ; @@ -2543,6 +2569,20 @@ SWIGEXPORT jint JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1 } +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetPrefVideoSize(JNIEnv *jenv, jclass jcls, jint jarg1) { + jboolean jresult = 0 ; + tmedia_pref_video_size_t arg1 ; + bool result; + + (void)jenv; + (void)jcls; + arg1 = (tmedia_pref_video_size_t)jarg1; + result = (bool)MediaSessionMgr::defaultsSetPrefVideoSize(arg1); + jresult = (jboolean)result; + return jresult; +} + + SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetJbMargin(JNIEnv *jenv, jclass jcls, jlong jarg1) { jboolean jresult = 0 ; uint32_t arg1 ; @@ -2916,6 +2956,20 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionM } +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetIceEnabled(JNIEnv *jenv, jclass jcls, jboolean jarg1) { + jboolean jresult = 0 ; + bool arg1 ; + bool result; + + (void)jenv; + (void)jcls; + arg1 = jarg1 ? true : false; + result = (bool)MediaSessionMgr::defaultsSetIceEnabled(arg1); + jresult = (jboolean)result; + return jresult; +} + + SWIGEXPORT void JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_delete_1MediaContent(JNIEnv *jenv, jclass jcls, jlong jarg1) { MediaContent *arg1 = (MediaContent *) 0 ; @@ -2936,7 +2990,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaContent_1 (void)jarg1_; arg1 = *(MediaContent **)&jarg1; result = (char *)(arg1)->getType(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -3118,7 +3172,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaContentCP if (!arg2) return 0; } result = (char *)(arg1)->getHeaderValue((char const *)arg2); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); return jresult; } @@ -3223,7 +3277,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getSch (void)jarg1_; arg1 = *(SipUri **)&jarg1; result = (char *)(arg1)->getScheme(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -3238,7 +3292,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getHos (void)jarg1_; arg1 = *(SipUri **)&jarg1; result = (char *)(arg1)->getHost(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -3268,7 +3322,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getUse (void)jarg1_; arg1 = *(SipUri **)&jarg1; result = (char *)(arg1)->getUserName(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -3283,7 +3337,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getPas (void)jarg1_; arg1 = *(SipUri **)&jarg1; result = (char *)(arg1)->getPassword(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -3298,7 +3352,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getDis (void)jarg1_; arg1 = *(SipUri **)&jarg1; result = (char *)(arg1)->getDisplayName(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -3319,7 +3373,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipUri_1getPar if (!arg2) return 0; } result = (char *)(arg1)->getParamValue((char const *)arg2); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); return jresult; } @@ -3385,7 +3439,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SdpMessage_1ge arg3 = (char)jarg3; arg4 = (unsigned int)jarg4; result = (char *)(arg1)->getSdpHeaderValue((char const *)arg2,arg3,arg4); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); delete [] result; return jresult; @@ -3410,7 +3464,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SdpMessage_1ge } arg3 = (char)jarg3; result = (char *)(arg1)->getSdpHeaderValue((char const *)arg2,arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); delete [] result; return jresult; @@ -3439,7 +3493,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SdpMessage_1ge if (!arg3) return 0; } result = (char *)(arg1)->getSdpHeaderAValue((char const *)arg2,(char const *)arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); delete [] result; @@ -3532,7 +3586,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipMessage_1ge } arg3 = (unsigned int)jarg3; result = (char *)(arg1)->getSipHeaderValue((char const *)arg2,arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); delete [] result; return jresult; @@ -3555,7 +3609,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipMessage_1ge if (!arg2) return 0; } result = (char *)(arg1)->getSipHeaderValue((char const *)arg2); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); delete [] result; return jresult; @@ -3586,7 +3640,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipMessage_1ge } arg4 = (unsigned int)jarg4; result = (char *)(arg1)->getSipHeaderParamValue((char const *)arg2,(char const *)arg3,arg4); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); delete [] result; @@ -3616,7 +3670,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipMessage_1ge if (!arg3) return 0; } result = (char *)(arg1)->getSipHeaderParamValue((char const *)arg2,(char const *)arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); delete [] result; @@ -3710,7 +3764,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipEvent_1getP (void)jarg1_; arg1 = *(SipEvent **)&jarg1; result = (char *)((SipEvent const *)arg1)->getPhrase(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -4988,6 +5042,23 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_CallSession_1 } +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_CallSession_1setICE(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jboolean jarg2) { + jboolean jresult = 0 ; + CallSession *arg1 = (CallSession *) 0 ; + bool arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(CallSession **)&jarg1; + arg2 = jarg2 ? true : false; + result = (bool)(arg1)->setICE(arg2); + jresult = (jboolean)result; + return jresult; +} + + SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_CallSession_1setQoS(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2, jint jarg3) { jboolean jresult = 0 ; CallSession *arg1 = (CallSession *) 0 ; @@ -9336,7 +9407,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsE if (!arg4) return 0; } result = (char *)(arg1)->dnsENUM((char const *)arg2,(char const *)arg3,(char const *)arg4); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); @@ -9380,7 +9451,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsN arg4 = &temp4; } result = (char *)(arg1)->dnsNaptrSrv((char const *)arg2,(char const *)arg3,arg4); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); { jint jvalue = (jint)temp4; jenv->SetIntArrayRegion(jarg4, 0, 1, &jvalue); @@ -9422,7 +9493,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1dnsS arg3 = &temp3; } result = (char *)(arg1)->dnsSrv((char const *)arg2,arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); { jint jvalue = (jint)temp3; jenv->SetIntArrayRegion(jarg3, 0, 1, &jvalue); @@ -9463,7 +9534,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1getL arg3 = &temp3; } result = (char *)(arg1)->getLocalIPnPort((char const *)arg2,arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); { jint jvalue = (jint)temp3; jenv->SetIntArrayRegion(jarg3, 0, 1, &jvalue); @@ -9485,7 +9556,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1getP (void)jarg1_; arg1 = *(SipStack **)&jarg1; result = (char *)(arg1)->getPreferredIdentity(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); delete [] result; return jresult; } @@ -9817,7 +9888,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_XcapSelector_1 (void)jarg1_; arg1 = *(XcapSelector **)&jarg1; result = (char *)(arg1)->getString(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); delete [] result; return jresult; } @@ -9881,7 +9952,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_XcapMessage_1g (void)jarg1_; arg1 = *(XcapMessage **)&jarg1; result = (char *)((XcapMessage const *)arg1)->getPhrase(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -9904,7 +9975,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_XcapMessage_1g } arg3 = (unsigned int)jarg3; result = (char *)(arg1)->getXcapHeaderValue((char const *)arg2,arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); delete [] result; return jresult; @@ -9927,7 +9998,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_XcapMessage_1g if (!arg2) return 0; } result = (char *)(arg1)->getXcapHeaderValue((char const *)arg2); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); delete [] result; return jresult; @@ -9958,7 +10029,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_XcapMessage_1g } arg4 = (unsigned int)jarg4; result = (char *)(arg1)->getXcapHeaderParamValue((char const *)arg2,(char const *)arg3,arg4); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); delete [] result; @@ -9988,7 +10059,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_XcapMessage_1g if (!arg3) return 0; } result = (char *)(arg1)->getXcapHeaderParamValue((char const *)arg2,(char const *)arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); delete [] result; @@ -10823,7 +10894,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SMSData_1getOA (void)jarg1_; arg1 = *(SMSData **)&jarg1; result = (char *)(arg1)->getOA(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -10838,7 +10909,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SMSData_1getDA (void)jarg1_; arg1 = *(SMSData **)&jarg1; result = (char *)(arg1)->getDA(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -11065,7 +11136,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MsrpMessage_1g (void)jarg1_; arg1 = *(MsrpMessage **)&jarg1; result = (char *)(arg1)->getPhrase(); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); return jresult; } @@ -11211,7 +11282,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MsrpMessage_1g if (!arg2) return 0; } result = (char *)(arg1)->getMsrpHeaderValue((char const *)arg2); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); delete [] result; return jresult; @@ -11240,7 +11311,7 @@ SWIGEXPORT jstring JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MsrpMessage_1g if (!arg3) return 0; } result = (char *)(arg1)->getMsrpHeaderParamValue((char const *)arg2,(char const *)arg3); - if(result) jresult = jenv->NewStringUTF((const char *)result); + if (result) jresult = jenv->NewStringUTF((const char *)result); if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); delete [] result; @@ -11417,7 +11488,7 @@ SWIGEXPORT void JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MsrpCallback_1cha } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGMediaContentCPIMUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaContentCPIM_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11425,7 +11496,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGMediaContent return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGDialogEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_DialogEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11433,7 +11504,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGDialogEventU return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGStackEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_StackEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11441,7 +11512,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGStackEventUp return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGInviteEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_InviteEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11449,7 +11520,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGInviteEventU return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGMessagingEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MessagingEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11457,7 +11528,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGMessagingEve return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGInfoEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_InfoEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11465,7 +11536,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGInfoEventUpc return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGOptionsEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_OptionsEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11473,7 +11544,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGOptionsEvent return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGPublicationEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_PublicationEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11481,7 +11552,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGPublicationE return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGRegistrationEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_RegistrationEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11489,7 +11560,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGRegistration return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGSubscriptionEventUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SubscriptionEvent_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11497,7 +11568,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGSubscription return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGInviteSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_InviteSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11505,7 +11576,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGInviteSessio return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGCallSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_CallSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11513,7 +11584,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGCallSessionU return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGMsrpSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MsrpSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11521,7 +11592,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGMsrpSessionU return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGMessagingSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MessagingSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11529,7 +11600,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGMessagingSes return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGInfoSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_InfoSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11537,7 +11608,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGInfoSessionU return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGOptionsSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_OptionsSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11545,7 +11616,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGOptionsSessi return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGPublicationSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_PublicationSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11553,7 +11624,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGPublicationS return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGRegistrationSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_RegistrationSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11561,7 +11632,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGRegistration return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGSubscriptionSessionUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SubscriptionSession_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11569,7 +11640,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGSubscription return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGProxyAudioConsumerUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_ProxyAudioConsumer_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11577,7 +11648,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGProxyAudioCo return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGProxyVideoConsumerUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_ProxyVideoConsumer_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11585,7 +11656,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGProxyVideoCo return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGProxyAudioProducerUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_ProxyAudioProducer_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11593,7 +11664,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGProxyAudioPr return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGProxyVideoProducerUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_ProxyVideoProducer_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; @@ -11601,7 +11672,7 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGProxyVideoPr return baseptr; } -SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SWIGSipStackUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { +SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { jlong baseptr = 0; (void)jenv; (void)jcls; diff --git a/branches/2.0/doubango/bindings/java/tinyWRAP_wrap.h b/branches/2.0/doubango/bindings/java/tinyWRAP_wrap.h index aacedb23..7cc3a039 100644 --- a/branches/2.0/doubango/bindings/java/tinyWRAP_wrap.h +++ b/branches/2.0/doubango/bindings/java/tinyWRAP_wrap.h @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make diff --git a/branches/2.0/doubango/bindings/java/tmedia_bandwidth_level_t.java b/branches/2.0/doubango/bindings/java/tmedia_bandwidth_level_t.java index 46a2fe37..12212ba3 100644 --- a/branches/2.0/doubango/bindings/java/tmedia_bandwidth_level_t.java +++ b/branches/2.0/doubango/bindings/java/tmedia_bandwidth_level_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tmedia_chroma_t.java b/branches/2.0/doubango/bindings/java/tmedia_chroma_t.java index 1ba112a0..69e24abb 100644 --- a/branches/2.0/doubango/bindings/java/tmedia_chroma_t.java +++ b/branches/2.0/doubango/bindings/java/tmedia_chroma_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tmedia_pref_video_size_t.java b/branches/2.0/doubango/bindings/java/tmedia_pref_video_size_t.java new file mode 100644 index 00000000..2fadefca --- /dev/null +++ b/branches/2.0/doubango/bindings/java/tmedia_pref_video_size_t.java @@ -0,0 +1,62 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package org.doubango.tinyWRAP; + +public enum tmedia_pref_video_size_t { + tmedia_pref_video_size_sqcif, + tmedia_pref_video_size_qcif, + tmedia_pref_video_size_qvga, + tmedia_pref_video_size_cif, + tmedia_pref_video_size_hvga, + tmedia_pref_video_size_vga, + tmedia_pref_video_size_4cif, + tmedia_pref_video_size_svga, + tmedia_pref_video_size_480p, + tmedia_pref_video_size_720p, + tmedia_pref_video_size_16cif, + tmedia_pref_video_size_1080p; + + public final int swigValue() { + return swigValue; + } + + public static tmedia_pref_video_size_t swigToEnum(int swigValue) { + tmedia_pref_video_size_t[] swigValues = tmedia_pref_video_size_t.class.getEnumConstants(); + if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue) + return swigValues[swigValue]; + for (tmedia_pref_video_size_t swigEnum : swigValues) + if (swigEnum.swigValue == swigValue) + return swigEnum; + throw new IllegalArgumentException("No enum " + tmedia_pref_video_size_t.class + " with value " + swigValue); + } + + @SuppressWarnings("unused") + private tmedia_pref_video_size_t() { + this.swigValue = SwigNext.next++; + } + + @SuppressWarnings("unused") + private tmedia_pref_video_size_t(int swigValue) { + this.swigValue = swigValue; + SwigNext.next = swigValue+1; + } + + @SuppressWarnings("unused") + private tmedia_pref_video_size_t(tmedia_pref_video_size_t swigEnum) { + this.swigValue = swigEnum.swigValue; + SwigNext.next = this.swigValue+1; + } + + private final int swigValue; + + private static class SwigNext { + private static int next = 0; + } +} + diff --git a/branches/2.0/doubango/bindings/java/tmedia_profile_t.java b/branches/2.0/doubango/bindings/java/tmedia_profile_t.java new file mode 100644 index 00000000..3cfff003 --- /dev/null +++ b/branches/2.0/doubango/bindings/java/tmedia_profile_t.java @@ -0,0 +1,52 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package org.doubango.tinyWRAP; + +public enum tmedia_profile_t { + tmedia_profile_default, + tmedia_profile_rtcweb; + + public final int swigValue() { + return swigValue; + } + + public static tmedia_profile_t swigToEnum(int swigValue) { + tmedia_profile_t[] swigValues = tmedia_profile_t.class.getEnumConstants(); + if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue) + return swigValues[swigValue]; + for (tmedia_profile_t swigEnum : swigValues) + if (swigEnum.swigValue == swigValue) + return swigEnum; + throw new IllegalArgumentException("No enum " + tmedia_profile_t.class + " with value " + swigValue); + } + + @SuppressWarnings("unused") + private tmedia_profile_t() { + this.swigValue = SwigNext.next++; + } + + @SuppressWarnings("unused") + private tmedia_profile_t(int swigValue) { + this.swigValue = swigValue; + SwigNext.next = swigValue+1; + } + + @SuppressWarnings("unused") + private tmedia_profile_t(tmedia_profile_t swigEnum) { + this.swigValue = swigEnum.swigValue; + SwigNext.next = this.swigValue+1; + } + + private final int swigValue; + + private static class SwigNext { + private static int next = 0; + } +} + diff --git a/branches/2.0/doubango/bindings/java/tmedia_qos_strength_t.java b/branches/2.0/doubango/bindings/java/tmedia_qos_strength_t.java index 5bd80172..f12f1a61 100644 --- a/branches/2.0/doubango/bindings/java/tmedia_qos_strength_t.java +++ b/branches/2.0/doubango/bindings/java/tmedia_qos_strength_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tmedia_qos_stype_t.java b/branches/2.0/doubango/bindings/java/tmedia_qos_stype_t.java index e81416e0..1c83e807 100644 --- a/branches/2.0/doubango/bindings/java/tmedia_qos_stype_t.java +++ b/branches/2.0/doubango/bindings/java/tmedia_qos_stype_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tmedia_srtp_mode_t.java b/branches/2.0/doubango/bindings/java/tmedia_srtp_mode_t.java index 63a3c47e..99458aa7 100644 --- a/branches/2.0/doubango/bindings/java/tmedia_srtp_mode_t.java +++ b/branches/2.0/doubango/bindings/java/tmedia_srtp_mode_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tmsrp_event_type_t.java b/branches/2.0/doubango/bindings/java/tmsrp_event_type_t.java index c849e756..b424f350 100644 --- a/branches/2.0/doubango/bindings/java/tmsrp_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/tmsrp_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tmsrp_request_type_t.java b/branches/2.0/doubango/bindings/java/tmsrp_request_type_t.java index 5c0d6914..d71eb63f 100644 --- a/branches/2.0/doubango/bindings/java/tmsrp_request_type_t.java +++ b/branches/2.0/doubango/bindings/java/tmsrp_request_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tsip_event_type_t.java b/branches/2.0/doubango/bindings/java/tsip_event_type_t.java index 0cc74b6e..fc7e6dfb 100644 --- a/branches/2.0/doubango/bindings/java/tsip_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/tsip_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tsip_info_event_type_t.java b/branches/2.0/doubango/bindings/java/tsip_info_event_type_t.java index ab95b0ee..906dff27 100644 --- a/branches/2.0/doubango/bindings/java/tsip_info_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/tsip_info_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tsip_invite_event_type_t.java b/branches/2.0/doubango/bindings/java/tsip_invite_event_type_t.java index 902ef497..4e228e5f 100644 --- a/branches/2.0/doubango/bindings/java/tsip_invite_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/tsip_invite_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tsip_message_event_type_t.java b/branches/2.0/doubango/bindings/java/tsip_message_event_type_t.java index 280845ac..c39be042 100644 --- a/branches/2.0/doubango/bindings/java/tsip_message_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/tsip_message_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tsip_options_event_type_t.java b/branches/2.0/doubango/bindings/java/tsip_options_event_type_t.java index 70166763..9ca97fc5 100644 --- a/branches/2.0/doubango/bindings/java/tsip_options_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/tsip_options_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tsip_publish_event_type_t.java b/branches/2.0/doubango/bindings/java/tsip_publish_event_type_t.java index a9ec14a0..d5b4cae2 100644 --- a/branches/2.0/doubango/bindings/java/tsip_publish_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/tsip_publish_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tsip_register_event_type_t.java b/branches/2.0/doubango/bindings/java/tsip_register_event_type_t.java index 298204e0..d33070fa 100644 --- a/branches/2.0/doubango/bindings/java/tsip_register_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/tsip_register_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tsip_request_type_t.java b/branches/2.0/doubango/bindings/java/tsip_request_type_t.java index 50dd6a09..a365be09 100644 --- a/branches/2.0/doubango/bindings/java/tsip_request_type_t.java +++ b/branches/2.0/doubango/bindings/java/tsip_request_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/tsip_subscribe_event_type_t.java b/branches/2.0/doubango/bindings/java/tsip_subscribe_event_type_t.java index 5091b658..9454f11f 100644 --- a/branches/2.0/doubango/bindings/java/tsip_subscribe_event_type_t.java +++ b/branches/2.0/doubango/bindings/java/tsip_subscribe_event_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/twrap_media_type_t.java b/branches/2.0/doubango/bindings/java/twrap_media_type_t.java index 8d44a147..2bb2d8a5 100644 --- a/branches/2.0/doubango/bindings/java/twrap_media_type_t.java +++ b/branches/2.0/doubango/bindings/java/twrap_media_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/twrap_proxy_plugin_type_t.java b/branches/2.0/doubango/bindings/java/twrap_proxy_plugin_type_t.java index bc0421bf..c0deb29c 100644 --- a/branches/2.0/doubango/bindings/java/twrap_proxy_plugin_type_t.java +++ b/branches/2.0/doubango/bindings/java/twrap_proxy_plugin_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/twrap_rpmessage_type_t.java b/branches/2.0/doubango/bindings/java/twrap_rpmessage_type_t.java index f8ed86a3..bc227a78 100644 --- a/branches/2.0/doubango/bindings/java/twrap_rpmessage_type_t.java +++ b/branches/2.0/doubango/bindings/java/twrap_rpmessage_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/java/twrap_sms_type_t.java b/branches/2.0/doubango/bindings/java/twrap_sms_type_t.java index dde6e1b6..b97917d3 100644 --- a/branches/2.0/doubango/bindings/java/twrap_sms_type_t.java +++ b/branches/2.0/doubango/bindings/java/twrap_sms_type_t.java @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. diff --git a/branches/2.0/doubango/bindings/perl/tinyWRAP.pm b/branches/2.0/doubango/bindings/perl/tinyWRAP.pm index 681f037b..f5d10ee5 100644 --- a/branches/2.0/doubango/bindings/perl/tinyWRAP.pm +++ b/branches/2.0/doubango/bindings/perl/tinyWRAP.pm @@ -1,5 +1,5 @@ # This file was automatically generated by SWIG (http://www.swig.org). -# Version 1.3.39 +# Version 2.0.4 # # Do not make changes to this file unless you know what you are doing--modify # the SWIG interface file instead. @@ -201,8 +201,11 @@ sub DESTROY { *findProxyPluginConsumer = *tinyWRAPc::MediaSessionMgr_findProxyPluginConsumer; *findProxyPluginProducer = *tinyWRAPc::MediaSessionMgr_findProxyPluginProducer; *getSessionId = *tinyWRAPc::MediaSessionMgr_getSessionId; +*defaultsSetProfile = *tinyWRAPc::MediaSessionMgr_defaultsSetProfile; +*defaultsGetProfile = *tinyWRAPc::MediaSessionMgr_defaultsGetProfile; *defaultsSetBandwidthLevel = *tinyWRAPc::MediaSessionMgr_defaultsSetBandwidthLevel; *defaultsGetBandwidthLevel = *tinyWRAPc::MediaSessionMgr_defaultsGetBandwidthLevel; +*defaultsSetPrefVideoSize = *tinyWRAPc::MediaSessionMgr_defaultsSetPrefVideoSize; *defaultsSetJbMargin = *tinyWRAPc::MediaSessionMgr_defaultsSetJbMargin; *defaultsSetJbMaxLateRate = *tinyWRAPc::MediaSessionMgr_defaultsSetJbMaxLateRate; *defaultsSetEchoTail = *tinyWRAPc::MediaSessionMgr_defaultsSetEchoTail; @@ -230,6 +233,7 @@ sub DESTROY { *defaultsGetVolume = *tinyWRAPc::MediaSessionMgr_defaultsGetVolume; *defaultsSetInviteSessionTimers = *tinyWRAPc::MediaSessionMgr_defaultsSetInviteSessionTimers; *defaultsSetSRtpMode = *tinyWRAPc::MediaSessionMgr_defaultsSetSRtpMode; +*defaultsSetIceEnabled = *tinyWRAPc::MediaSessionMgr_defaultsSetIceEnabled; sub DISOWN { my $self = shift; my $ptr = tied(%$self); @@ -899,6 +903,7 @@ sub DESTROY { *callVideo = *tinyWRAPc::CallSession_callVideo; *setSessionTimer = *tinyWRAPc::CallSession_setSessionTimer; *set100rel = *tinyWRAPc::CallSession_set100rel; +*setICE = *tinyWRAPc::CallSession_setICE; *setQoS = *tinyWRAPc::CallSession_setQoS; *hold = *tinyWRAPc::CallSession_hold; *resume = *tinyWRAPc::CallSession_resume; @@ -2382,6 +2387,14 @@ package tinyWRAP; *tsip_m_local_resume_nok = *tinyWRAPc::tsip_m_local_resume_nok; *tsip_m_remote_hold = *tinyWRAPc::tsip_m_remote_hold; *tsip_m_remote_resume = *tinyWRAPc::tsip_m_remote_resume; +*tmedia_qos_stype_none = *tinyWRAPc::tmedia_qos_stype_none; +*tmedia_qos_stype_segmented = *tinyWRAPc::tmedia_qos_stype_segmented; +*tmedia_qos_stype_e2e = *tinyWRAPc::tmedia_qos_stype_e2e; +*tmedia_qos_strength_none = *tinyWRAPc::tmedia_qos_strength_none; +*tmedia_qos_strength_failure = *tinyWRAPc::tmedia_qos_strength_failure; +*tmedia_qos_strength_unknown = *tinyWRAPc::tmedia_qos_strength_unknown; +*tmedia_qos_strength_optional = *tinyWRAPc::tmedia_qos_strength_optional; +*tmedia_qos_strength_mandatory = *tinyWRAPc::tmedia_qos_strength_mandatory; *tmedia_chroma_none = *tinyWRAPc::tmedia_chroma_none; *tmedia_chroma_rgb24 = *tinyWRAPc::tmedia_chroma_rgb24; *tmedia_chroma_bgr24 = *tinyWRAPc::tmedia_chroma_bgr24; @@ -2396,18 +2409,24 @@ package tinyWRAP; *tmedia_srtp_mode_none = *tinyWRAPc::tmedia_srtp_mode_none; *tmedia_srtp_mode_optional = *tinyWRAPc::tmedia_srtp_mode_optional; *tmedia_srtp_mode_mandatory = *tinyWRAPc::tmedia_srtp_mode_mandatory; -*tmedia_qos_stype_none = *tinyWRAPc::tmedia_qos_stype_none; -*tmedia_qos_stype_segmented = *tinyWRAPc::tmedia_qos_stype_segmented; -*tmedia_qos_stype_e2e = *tinyWRAPc::tmedia_qos_stype_e2e; -*tmedia_qos_strength_none = *tinyWRAPc::tmedia_qos_strength_none; -*tmedia_qos_strength_failure = *tinyWRAPc::tmedia_qos_strength_failure; -*tmedia_qos_strength_unknown = *tinyWRAPc::tmedia_qos_strength_unknown; -*tmedia_qos_strength_optional = *tinyWRAPc::tmedia_qos_strength_optional; -*tmedia_qos_strength_mandatory = *tinyWRAPc::tmedia_qos_strength_mandatory; +*tmedia_profile_default = *tinyWRAPc::tmedia_profile_default; +*tmedia_profile_rtcweb = *tinyWRAPc::tmedia_profile_rtcweb; *tmedia_bl_low = *tinyWRAPc::tmedia_bl_low; *tmedia_bl_medium = *tinyWRAPc::tmedia_bl_medium; *tmedia_bl_hight = *tinyWRAPc::tmedia_bl_hight; *tmedia_bl_unrestricted = *tinyWRAPc::tmedia_bl_unrestricted; +*tmedia_pref_video_size_sqcif = *tinyWRAPc::tmedia_pref_video_size_sqcif; +*tmedia_pref_video_size_qcif = *tinyWRAPc::tmedia_pref_video_size_qcif; +*tmedia_pref_video_size_qvga = *tinyWRAPc::tmedia_pref_video_size_qvga; +*tmedia_pref_video_size_cif = *tinyWRAPc::tmedia_pref_video_size_cif; +*tmedia_pref_video_size_hvga = *tinyWRAPc::tmedia_pref_video_size_hvga; +*tmedia_pref_video_size_vga = *tinyWRAPc::tmedia_pref_video_size_vga; +*tmedia_pref_video_size_4cif = *tinyWRAPc::tmedia_pref_video_size_4cif; +*tmedia_pref_video_size_svga = *tinyWRAPc::tmedia_pref_video_size_svga; +*tmedia_pref_video_size_480p = *tinyWRAPc::tmedia_pref_video_size_480p; +*tmedia_pref_video_size_720p = *tinyWRAPc::tmedia_pref_video_size_720p; +*tmedia_pref_video_size_16cif = *tinyWRAPc::tmedia_pref_video_size_16cif; +*tmedia_pref_video_size_1080p = *tinyWRAPc::tmedia_pref_video_size_1080p; *tdav_codec_id_none = *tinyWRAPc::tdav_codec_id_none; *tdav_codec_id_amr_nb_oa = *tinyWRAPc::tdav_codec_id_amr_nb_oa; *tdav_codec_id_amr_nb_be = *tinyWRAPc::tdav_codec_id_amr_nb_be; @@ -2429,6 +2448,9 @@ package tinyWRAP; *tdav_codec_id_h263 = *tinyWRAPc::tdav_codec_id_h263; *tdav_codec_id_h263p = *tinyWRAPc::tdav_codec_id_h263p; *tdav_codec_id_h263pp = *tinyWRAPc::tdav_codec_id_h263pp; +*tdav_codec_id_h264_bp = *tinyWRAPc::tdav_codec_id_h264_bp; +*tdav_codec_id_h264_mp = *tinyWRAPc::tdav_codec_id_h264_mp; +*tdav_codec_id_h264_hp = *tinyWRAPc::tdav_codec_id_h264_hp; *tdav_codec_id_h264_bp10 = *tinyWRAPc::tdav_codec_id_h264_bp10; *tdav_codec_id_h264_bp20 = *tinyWRAPc::tdav_codec_id_h264_bp20; *tdav_codec_id_h264_bp30 = *tinyWRAPc::tdav_codec_id_h264_bp30; diff --git a/branches/2.0/doubango/bindings/perl/tinyWRAP_wrap.cxx b/branches/2.0/doubango/bindings/perl/tinyWRAP_wrap.cxx index 66db6e56..6d6417b4 100644 --- a/branches/2.0/doubango/bindings/perl/tinyWRAP_wrap.cxx +++ b/branches/2.0/doubango/bindings/perl/tinyWRAP_wrap.cxx @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make @@ -35,1455 +35,1484 @@ template T SwigValueInit() { } #endif -/* ----------------------------------------------------------------------------- - * This section contains generic SWIG labels for method/variable - * declarations/attributes, and other compiler dependent labels. - * ----------------------------------------------------------------------------- */ - -/* template workaround for compilers that cannot correctly implement the C++ standard */ -#ifndef SWIGTEMPLATEDISAMBIGUATOR -# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) -# define SWIGTEMPLATEDISAMBIGUATOR template -# elif defined(__HP_aCC) -/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ -/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ -# define SWIGTEMPLATEDISAMBIGUATOR template -# else -# define SWIGTEMPLATEDISAMBIGUATOR -# endif -#endif - -/* inline attribute */ -#ifndef SWIGINLINE -# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) -# define SWIGINLINE inline -# else -# define SWIGINLINE -# endif -#endif - -/* attribute recognised by some compilers to avoid 'unused' warnings */ -#ifndef SWIGUNUSED -# if defined(__GNUC__) -# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -# define SWIGUNUSED __attribute__ ((__unused__)) -# else -# define SWIGUNUSED -# endif -# elif defined(__ICC) -# define SWIGUNUSED __attribute__ ((__unused__)) -# else -# define SWIGUNUSED -# endif -#endif - -#ifndef SWIG_MSC_UNSUPPRESS_4505 -# if defined(_MSC_VER) -# pragma warning(disable : 4505) /* unreferenced local function has been removed */ -# endif -#endif - -#ifndef SWIGUNUSEDPARM -# ifdef __cplusplus -# define SWIGUNUSEDPARM(p) -# else -# define SWIGUNUSEDPARM(p) p SWIGUNUSED -# endif -#endif - -/* internal SWIG method */ -#ifndef SWIGINTERN -# define SWIGINTERN static SWIGUNUSED -#endif - -/* internal inline SWIG method */ -#ifndef SWIGINTERNINLINE -# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE -#endif - -/* exporting methods */ -#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) -# ifndef GCC_HASCLASSVISIBILITY -# define GCC_HASCLASSVISIBILITY -# endif -#endif - -#ifndef SWIGEXPORT -# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) -# if defined(STATIC_LINKED) -# define SWIGEXPORT -# else -# define SWIGEXPORT __declspec(dllexport) -# endif -# else -# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) -# define SWIGEXPORT __attribute__ ((visibility("default"))) -# else -# define SWIGEXPORT -# endif -# endif -#endif - -/* calling conventions for Windows */ -#ifndef SWIGSTDCALL -# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) -# define SWIGSTDCALL __stdcall -# else -# define SWIGSTDCALL -# endif -#endif - -/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ -#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) -# define _CRT_SECURE_NO_DEPRECATE -#endif - -/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ -#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) -# define _SCL_SECURE_NO_DEPRECATE -#endif - +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ -/* ----------------------------------------------------------------------------- - * swigrun.swg - * - * This file contains generic C API SWIG runtime support for pointer - * type checking. - * ----------------------------------------------------------------------------- */ - -/* This should only be incremented when either the layout of swig_type_info changes, - or for whatever reason, the runtime changes incompatibly */ -#define SWIG_RUNTIME_VERSION "4" - -/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ -#ifdef SWIG_TYPE_TABLE -# define SWIG_QUOTE_STRING(x) #x -# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) -# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) -#else -# define SWIG_TYPE_TABLE_NAME -#endif - -/* - You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for - creating a static or dynamic library from the SWIG runtime code. - In 99.9% of the cases, SWIG just needs to declare them as 'static'. - - But only do this if strictly necessary, ie, if you have problems - with your compiler or suchlike. -*/ - -#ifndef SWIGRUNTIME -# define SWIGRUNTIME SWIGINTERN -#endif - -#ifndef SWIGRUNTIMEINLINE -# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE -#endif - -/* Generic buffer size */ -#ifndef SWIG_BUFFER_SIZE -# define SWIG_BUFFER_SIZE 1024 -#endif - -/* Flags for pointer conversions */ -#define SWIG_POINTER_DISOWN 0x1 -#define SWIG_CAST_NEW_MEMORY 0x2 - -/* Flags for new pointer objects */ -#define SWIG_POINTER_OWN 0x1 - - -/* - Flags/methods for returning states. - - The SWIG conversion methods, as ConvertPtr, return and integer - that tells if the conversion was successful or not. And if not, - an error code can be returned (see swigerrors.swg for the codes). - - Use the following macros/flags to set or process the returning - states. - - In old versions of SWIG, code such as the following was usually written: - - if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { - // success code - } else { - //fail code - } - - Now you can be more explicit: - - int res = SWIG_ConvertPtr(obj,vptr,ty.flags); - if (SWIG_IsOK(res)) { - // success code - } else { - // fail code - } - - which is the same really, but now you can also do - - Type *ptr; - int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); - if (SWIG_IsOK(res)) { - // success code - if (SWIG_IsNewObj(res) { - ... - delete *ptr; - } else { - ... - } - } else { - // fail code - } - - I.e., now SWIG_ConvertPtr can return new objects and you can - identify the case and take care of the deallocation. Of course that - also requires SWIG_ConvertPtr to return new result values, such as - - int SWIG_ConvertPtr(obj, ptr,...) { - if () { - if () { - *ptr = ; - return SWIG_NEWOBJ; - } else { - *ptr = ; - return SWIG_OLDOBJ; - } - } else { - return SWIG_BADOBJ; - } - } - - Of course, returning the plain '0(success)/-1(fail)' still works, but you can be - more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the - SWIG errors code. - - Finally, if the SWIG_CASTRANK_MODE is enabled, the result code - allows to return the 'cast rank', for example, if you have this - - int food(double) - int fooi(int); - - and you call - - food(1) // cast rank '1' (1 -> 1.0) - fooi(1) // cast rank '0' - - just use the SWIG_AddCast()/SWIG_CheckState() -*/ - -#define SWIG_OK (0) -#define SWIG_ERROR (-1) -#define SWIG_IsOK(r) (r >= 0) -#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) - -/* The CastRankLimit says how many bits are used for the cast rank */ -#define SWIG_CASTRANKLIMIT (1 << 8) -/* The NewMask denotes the object was created (using new/malloc) */ -#define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) -/* The TmpMask is for in/out typemaps that use temporal objects */ -#define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) -/* Simple returning values */ -#define SWIG_BADOBJ (SWIG_ERROR) -#define SWIG_OLDOBJ (SWIG_OK) -#define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) -#define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) -/* Check, add and del mask methods */ -#define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) -#define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) -#define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) -#define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) -#define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) -#define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) - -/* Cast-Rank Mode */ -#if defined(SWIG_CASTRANK_MODE) -# ifndef SWIG_TypeRank -# define SWIG_TypeRank unsigned long -# endif -# ifndef SWIG_MAXCASTRANK /* Default cast allowed */ -# define SWIG_MAXCASTRANK (2) -# endif -# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) -# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) -SWIGINTERNINLINE int SWIG_AddCast(int r) { - return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; -} -SWIGINTERNINLINE int SWIG_CheckState(int r) { - return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; -} -#else /* no cast-rank mode */ -# define SWIG_AddCast -# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) -#endif - - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void *(*swig_converter_func)(void *, int *); -typedef struct swig_type_info *(*swig_dycast_func)(void **); - -/* Structure to store information on one type */ -typedef struct swig_type_info { - const char *name; /* mangled name of this type */ - const char *str; /* human readable name of this type */ - swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ - struct swig_cast_info *cast; /* linked list of types that can cast into this type */ - void *clientdata; /* language specific type data */ - int owndata; /* flag if the structure owns the clientdata */ -} swig_type_info; - -/* Structure to store a type and conversion function used for casting */ -typedef struct swig_cast_info { - swig_type_info *type; /* pointer to type that is equivalent to this type */ - swig_converter_func converter; /* function to cast the void pointers */ - struct swig_cast_info *next; /* pointer to next cast in linked list */ - struct swig_cast_info *prev; /* pointer to the previous cast */ -} swig_cast_info; - -/* Structure used to store module information - * Each module generates one structure like this, and the runtime collects - * all of these structures and stores them in a circularly linked list.*/ -typedef struct swig_module_info { - swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ - size_t size; /* Number of types in this module */ - struct swig_module_info *next; /* Pointer to next element in circularly linked list */ - swig_type_info **type_initial; /* Array of initially generated type structures */ - swig_cast_info **cast_initial; /* Array of initially generated casting structures */ - void *clientdata; /* Language specific module data */ -} swig_module_info; - -/* - Compare two type names skipping the space characters, therefore - "char*" == "char *" and "Class" == "Class", etc. - - Return 0 when the two name types are equivalent, as in - strncmp, but skipping ' '. -*/ -SWIGRUNTIME int -SWIG_TypeNameComp(const char *f1, const char *l1, - const char *f2, const char *l2) { - for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { - while ((*f1 == ' ') && (f1 != l1)) ++f1; - while ((*f2 == ' ') && (f2 != l2)) ++f2; - if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; - } - return (int)((l1 - f1) - (l2 - f2)); -} - -/* - Check type equivalence in a name list like ||... - Return 0 if not equal, 1 if equal -*/ -SWIGRUNTIME int -SWIG_TypeEquiv(const char *nb, const char *tb) { - int equiv = 0; - const char* te = tb + strlen(tb); - const char* ne = nb; - while (!equiv && *ne) { - for (nb = ne; *ne; ++ne) { - if (*ne == '|') break; - } - equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; - if (*ne) ++ne; - } - return equiv; -} - -/* - Check type equivalence in a name list like ||... - Return 0 if equal, -1 if nb < tb, 1 if nb > tb -*/ -SWIGRUNTIME int -SWIG_TypeCompare(const char *nb, const char *tb) { - int equiv = 0; - const char* te = tb + strlen(tb); - const char* ne = nb; - while (!equiv && *ne) { - for (nb = ne; *ne; ++ne) { - if (*ne == '|') break; - } - equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; - if (*ne) ++ne; - } - return equiv; -} - - -/* - Check the typename -*/ -SWIGRUNTIME swig_cast_info * -SWIG_TypeCheck(const char *c, swig_type_info *ty) { - if (ty) { - swig_cast_info *iter = ty->cast; - while (iter) { - if (strcmp(iter->type->name, c) == 0) { - if (iter == ty->cast) - return iter; - /* Move iter to the top of the linked list */ - iter->prev->next = iter->next; - if (iter->next) - iter->next->prev = iter->prev; - iter->next = ty->cast; - iter->prev = 0; - if (ty->cast) ty->cast->prev = iter; - ty->cast = iter; - return iter; - } - iter = iter->next; - } - } - return 0; -} - -/* - Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison -*/ -SWIGRUNTIME swig_cast_info * -SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { - if (ty) { - swig_cast_info *iter = ty->cast; - while (iter) { - if (iter->type == from) { - if (iter == ty->cast) - return iter; - /* Move iter to the top of the linked list */ - iter->prev->next = iter->next; - if (iter->next) - iter->next->prev = iter->prev; - iter->next = ty->cast; - iter->prev = 0; - if (ty->cast) ty->cast->prev = iter; - ty->cast = iter; - return iter; - } - iter = iter->next; - } - } - return 0; -} - -/* - Cast a pointer up an inheritance hierarchy -*/ -SWIGRUNTIMEINLINE void * -SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { - return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); -} - -/* - Dynamic pointer casting. Down an inheritance hierarchy -*/ -SWIGRUNTIME swig_type_info * -SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { - swig_type_info *lastty = ty; - if (!ty || !ty->dcast) return ty; - while (ty && (ty->dcast)) { - ty = (*ty->dcast)(ptr); - if (ty) lastty = ty; - } - return lastty; -} - -/* - Return the name associated with this type -*/ -SWIGRUNTIMEINLINE const char * -SWIG_TypeName(const swig_type_info *ty) { - return ty->name; -} - -/* - Return the pretty name associated with this type, - that is an unmangled type name in a form presentable to the user. -*/ -SWIGRUNTIME const char * -SWIG_TypePrettyName(const swig_type_info *type) { - /* The "str" field contains the equivalent pretty names of the - type, separated by vertical-bar characters. We choose - to print the last name, as it is often (?) the most - specific. */ - if (!type) return NULL; - if (type->str != NULL) { - const char *last_name = type->str; - const char *s; - for (s = type->str; *s; s++) - if (*s == '|') last_name = s+1; - return last_name; - } - else - return type->name; -} - -/* - Set the clientdata field for a type -*/ -SWIGRUNTIME void -SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { - swig_cast_info *cast = ti->cast; - /* if (ti->clientdata == clientdata) return; */ - ti->clientdata = clientdata; - - while (cast) { - if (!cast->converter) { - swig_type_info *tc = cast->type; - if (!tc->clientdata) { - SWIG_TypeClientData(tc, clientdata); - } - } - cast = cast->next; - } -} -SWIGRUNTIME void -SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { - SWIG_TypeClientData(ti, clientdata); - ti->owndata = 1; -} - -/* - Search for a swig_type_info structure only by mangled name - Search is a O(log #types) - - We start searching at module start, and finish searching when start == end. - Note: if start == end at the beginning of the function, we go all the way around - the circular list. -*/ -SWIGRUNTIME swig_type_info * -SWIG_MangledTypeQueryModule(swig_module_info *start, - swig_module_info *end, - const char *name) { - swig_module_info *iter = start; - do { - if (iter->size) { - register size_t l = 0; - register size_t r = iter->size - 1; - do { - /* since l+r >= 0, we can (>> 1) instead (/ 2) */ - register size_t i = (l + r) >> 1; - const char *iname = iter->types[i]->name; - if (iname) { - register int compare = strcmp(name, iname); - if (compare == 0) { - return iter->types[i]; - } else if (compare < 0) { - if (i) { - r = i - 1; - } else { - break; - } - } else if (compare > 0) { - l = i + 1; - } - } else { - break; /* should never happen */ - } - } while (l <= r); - } - iter = iter->next; - } while (iter != end); - return 0; -} - -/* - Search for a swig_type_info structure for either a mangled name or a human readable name. - It first searches the mangled names of the types, which is a O(log #types) - If a type is not found it then searches the human readable names, which is O(#types). - - We start searching at module start, and finish searching when start == end. - Note: if start == end at the beginning of the function, we go all the way around - the circular list. -*/ -SWIGRUNTIME swig_type_info * -SWIG_TypeQueryModule(swig_module_info *start, - swig_module_info *end, - const char *name) { - /* STEP 1: Search the name field using binary search */ - swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); - if (ret) { - return ret; - } else { - /* STEP 2: If the type hasn't been found, do a complete search - of the str field (the human readable name) */ - swig_module_info *iter = start; - do { - register size_t i = 0; - for (; i < iter->size; ++i) { - if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) - return iter->types[i]; - } - iter = iter->next; - } while (iter != end); - } - - /* neither found a match */ - return 0; -} - -/* - Pack binary data into a string -*/ -SWIGRUNTIME char * -SWIG_PackData(char *c, void *ptr, size_t sz) { - static const char hex[17] = "0123456789abcdef"; - register const unsigned char *u = (unsigned char *) ptr; - register const unsigned char *eu = u + sz; - for (; u != eu; ++u) { - register unsigned char uu = *u; - *(c++) = hex[(uu & 0xf0) >> 4]; - *(c++) = hex[uu & 0xf]; - } - return c; -} - -/* - Unpack binary data from a string -*/ -SWIGRUNTIME const char * -SWIG_UnpackData(const char *c, void *ptr, size_t sz) { - register unsigned char *u = (unsigned char *) ptr; - register const unsigned char *eu = u + sz; - for (; u != eu; ++u) { - register char d = *(c++); - register unsigned char uu; - if ((d >= '0') && (d <= '9')) - uu = ((d - '0') << 4); - else if ((d >= 'a') && (d <= 'f')) - uu = ((d - ('a'-10)) << 4); - else - return (char *) 0; - d = *(c++); - if ((d >= '0') && (d <= '9')) - uu |= (d - '0'); - else if ((d >= 'a') && (d <= 'f')) - uu |= (d - ('a'-10)); - else - return (char *) 0; - *u = uu; - } - return c; -} - -/* - Pack 'void *' into a string buffer. -*/ -SWIGRUNTIME char * -SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { - char *r = buff; - if ((2*sizeof(void *) + 2) > bsz) return 0; - *(r++) = '_'; - r = SWIG_PackData(r,&ptr,sizeof(void *)); - if (strlen(name) + 1 > (bsz - (r - buff))) return 0; - strcpy(r,name); - return buff; -} - -SWIGRUNTIME const char * -SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { - if (*c != '_') { - if (strcmp(c,"NULL") == 0) { - *ptr = (void *) 0; - return name; - } else { - return 0; - } - } - return SWIG_UnpackData(++c,ptr,sizeof(void *)); -} - -SWIGRUNTIME char * -SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { - char *r = buff; - size_t lname = (name ? strlen(name) : 0); - if ((2*sz + 2 + lname) > bsz) return 0; - *(r++) = '_'; - r = SWIG_PackData(r,ptr,sz); - if (lname) { - strncpy(r,name,lname+1); - } else { - *r = 0; - } - return buff; -} - -SWIGRUNTIME const char * -SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { - if (*c != '_') { - if (strcmp(c,"NULL") == 0) { - memset(ptr,0,sz); - return name; - } else { - return 0; - } - } - return SWIG_UnpackData(++c,ptr,sz); -} - -#ifdef __cplusplus -} -#endif +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif -/* Errors in SWIG */ -#define SWIG_UnknownError -1 -#define SWIG_IOError -2 -#define SWIG_RuntimeError -3 -#define SWIG_IndexError -4 -#define SWIG_TypeError -5 -#define SWIG_DivisionByZero -6 -#define SWIG_OverflowError -7 -#define SWIG_SyntaxError -8 -#define SWIG_ValueError -9 -#define SWIG_SystemError -10 -#define SWIG_AttributeError -11 -#define SWIG_MemoryError -12 -#define SWIG_NullReferenceError -13 - - +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif -#ifdef __cplusplus -/* Needed on some windows machines---since MS plays funny games with the header files under C++ */ -#include -#include -extern "C" { -#endif -#include "EXTERN.h" -#include "perl.h" -#include "XSUB.h" - -/* Add in functionality missing in older versions of Perl. Much of this is based on Devel-PPPort on cpan. */ - -/* Add PERL_REVISION, PERL_VERSION, PERL_SUBVERSION if missing */ -#ifndef PERL_REVISION -# if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) -# define PERL_PATCHLEVEL_H_IMPLICIT -# include -# endif -# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) -# include -# endif -# ifndef PERL_REVISION -# define PERL_REVISION (5) -# define PERL_VERSION PATCHLEVEL -# define PERL_SUBVERSION SUBVERSION -# endif -#endif - -#if defined(WIN32) && defined(PERL_OBJECT) && !defined(PerlIO_exportFILE) -#define PerlIO_exportFILE(fh,fl) (FILE*)(fh) -#endif - -#ifndef SvIOK_UV -# define SvIOK_UV(sv) (SvIOK(sv) && (SvUVX(sv) == SvIVX(sv))) -#endif - -#ifndef SvUOK -# define SvUOK(sv) SvIOK_UV(sv) -#endif - -#if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))) -# define PL_sv_undef sv_undef -# define PL_na na -# define PL_errgv errgv -# define PL_sv_no sv_no -# define PL_sv_yes sv_yes -# define PL_markstack_ptr markstack_ptr -#endif - -#ifndef IVSIZE -# ifdef LONGSIZE -# define IVSIZE LONGSIZE -# else -# define IVSIZE 4 /* A bold guess, but the best we can make. */ -# endif -#endif - -#ifndef INT2PTR -# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) -# define PTRV UV -# define INT2PTR(any,d) (any)(d) -# else -# if PTRSIZE == LONGSIZE -# define PTRV unsigned long -# else -# define PTRV unsigned -# endif -# define INT2PTR(any,d) (any)(PTRV)(d) -# endif - -# define NUM2PTR(any,d) (any)(PTRV)(d) -# define PTR2IV(p) INT2PTR(IV,p) -# define PTR2UV(p) INT2PTR(UV,p) -# define PTR2NV(p) NUM2PTR(NV,p) - -# if PTRSIZE == LONGSIZE -# define PTR2ul(p) (unsigned long)(p) -# else -# define PTR2ul(p) INT2PTR(unsigned long,p) -# endif -#endif /* !INT2PTR */ - -#ifndef SvPV_nolen -# define SvPV_nolen(x) SvPV(x,PL_na) -#endif - -#ifndef get_sv -# define get_sv perl_get_sv -#endif - -#ifndef ERRSV -# define ERRSV get_sv("@",FALSE) -#endif - -#ifndef pTHX_ -#define pTHX_ -#endif - -#include -#ifdef __cplusplus -} -#endif +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif -/* ----------------------------------------------------------------------------- - * error manipulation - * ----------------------------------------------------------------------------- */ - -SWIGINTERN const char* -SWIG_Perl_ErrorType(int code) { - const char* type = 0; - switch(code) { - case SWIG_MemoryError: - type = "MemoryError"; - break; - case SWIG_IOError: - type = "IOError"; - break; - case SWIG_RuntimeError: - type = "RuntimeError"; - break; - case SWIG_IndexError: - type = "IndexError"; - break; - case SWIG_TypeError: - type = "TypeError"; - break; - case SWIG_DivisionByZero: - type = "ZeroDivisionError"; - break; - case SWIG_OverflowError: - type = "OverflowError"; - break; - case SWIG_SyntaxError: - type = "SyntaxError"; - break; - case SWIG_ValueError: - type = "ValueError"; - break; - case SWIG_SystemError: - type = "SystemError"; - break; - case SWIG_AttributeError: - type = "AttributeError"; - break; - default: - type = "RuntimeError"; - } - return type; -} - - - +#ifndef SWIG_MSC_UNSUPPRESS_4505 +# if defined(_MSC_VER) +# pragma warning(disable : 4505) /* unreferenced local function has been removed */ +# endif +#endif -/* ----------------------------------------------------------------------------- - * perlrun.swg - * - * This file contains the runtime support for Perl modules - * and includes code for managing global variables and pointer - * type checking. - * ----------------------------------------------------------------------------- */ - -#ifdef PERL_OBJECT -#define SWIG_PERL_OBJECT_DECL CPerlObj *SWIGUNUSEDPARM(pPerl), -#define SWIG_PERL_OBJECT_CALL pPerl, -#else -#define SWIG_PERL_OBJECT_DECL -#define SWIG_PERL_OBJECT_CALL -#endif - -/* Common SWIG API */ - -/* for raw pointers */ -#define SWIG_ConvertPtr(obj, pp, type, flags) SWIG_Perl_ConvertPtr(SWIG_PERL_OBJECT_CALL obj, pp, type, flags) -#define SWIG_NewPointerObj(p, type, flags) SWIG_Perl_NewPointerObj(SWIG_PERL_OBJECT_CALL p, type, flags) - -/* for raw packed data */ -#define SWIG_ConvertPacked(obj, p, s, type) SWIG_Perl_ConvertPacked(SWIG_PERL_OBJECT_CALL obj, p, s, type) -#define SWIG_NewPackedObj(p, s, type) SWIG_Perl_NewPackedObj(SWIG_PERL_OBJECT_CALL p, s, type) - -/* for class or struct pointers */ -#define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) -#define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) - -/* for C or C++ function pointers */ -#define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_ConvertPtr(obj, pptr, type, 0) -#define SWIG_NewFunctionPtrObj(ptr, type) SWIG_NewPointerObj(ptr, type, 0) - -/* for C++ member pointers, ie, member methods */ -#define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_ConvertPacked(obj, ptr, sz, ty) -#define SWIG_NewMemberObj(ptr, sz, type) SWIG_NewPackedObj(ptr, sz, type) - - -/* Runtime API */ - -#define SWIG_GetModule(clientdata) SWIG_Perl_GetModule() -#define SWIG_SetModule(clientdata, pointer) SWIG_Perl_SetModule(pointer) - - -/* Error manipulation */ - -#define SWIG_ErrorType(code) SWIG_Perl_ErrorType(code) -#define SWIG_Error(code, msg) sv_setpvf(GvSV(PL_errgv),"%s %s\n", SWIG_ErrorType(code), msg) -#define SWIG_fail goto fail - -/* Perl-specific SWIG API */ - -#define SWIG_MakePtr(sv, ptr, type, flags) SWIG_Perl_MakePtr(SWIG_PERL_OBJECT_CALL sv, ptr, type, flags) -#define SWIG_MakePackedObj(sv, p, s, type) SWIG_Perl_MakePackedObj(SWIG_PERL_OBJECT_CALL sv, p, s, type) -#define SWIG_SetError(str) SWIG_Error(SWIG_RuntimeError, str) - - -#define SWIG_PERL_DECL_ARGS_1(arg1) (SWIG_PERL_OBJECT_DECL arg1) -#define SWIG_PERL_CALL_ARGS_1(arg1) (SWIG_PERL_OBJECT_CALL arg1) -#define SWIG_PERL_DECL_ARGS_2(arg1, arg2) (SWIG_PERL_OBJECT_DECL arg1, arg2) -#define SWIG_PERL_CALL_ARGS_2(arg1, arg2) (SWIG_PERL_OBJECT_CALL arg1, arg2) - -/* ----------------------------------------------------------------------------- - * pointers/data manipulation - * ----------------------------------------------------------------------------- */ - -/* For backward compatibility only */ -#define SWIG_POINTER_EXCEPTION 0 - -#ifdef __cplusplus -extern "C" { -#endif - -#define SWIG_OWNER SWIG_POINTER_OWN -#define SWIG_SHADOW SWIG_OWNER << 1 - -#define SWIG_MAYBE_PERL_OBJECT SWIG_PERL_OBJECT_DECL - -/* SWIG Perl macros */ - -/* Macro to declare an XS function */ -#ifndef XSPROTO -# define XSPROTO(name) void name(pTHX_ CV* cv) -#endif - -/* Macro to call an XS function */ -#ifdef PERL_OBJECT -# define SWIG_CALLXS(_name) _name(cv,pPerl) -#else -# ifndef MULTIPLICITY -# define SWIG_CALLXS(_name) _name(cv) -# else -# define SWIG_CALLXS(_name) _name(PERL_GET_THX, cv) -# endif -#endif - -#ifdef PERL_OBJECT -#define MAGIC_PPERL CPerlObj *pPerl = (CPerlObj *) this; - -#ifdef __cplusplus -extern "C" { -#endif -typedef int (CPerlObj::*SwigMagicFunc)(SV *, MAGIC *); -#ifdef __cplusplus -} -#endif - -#define SWIG_MAGIC(a,b) (SV *a, MAGIC *b) -#define SWIGCLASS_STATIC - -#else /* PERL_OBJECT */ - -#define MAGIC_PPERL -#define SWIGCLASS_STATIC static SWIGUNUSED - -#ifndef MULTIPLICITY -#define SWIG_MAGIC(a,b) (SV *a, MAGIC *b) - -#ifdef __cplusplus -extern "C" { -#endif -typedef int (*SwigMagicFunc)(SV *, MAGIC *); -#ifdef __cplusplus -} -#endif - -#else /* MULTIPLICITY */ - -#define SWIG_MAGIC(a,b) (struct interpreter *interp, SV *a, MAGIC *b) - -#ifdef __cplusplus -extern "C" { -#endif -typedef int (*SwigMagicFunc)(struct interpreter *, SV *, MAGIC *); -#ifdef __cplusplus -} -#endif - -#endif /* MULTIPLICITY */ -#endif /* PERL_OBJECT */ - -/* Workaround for bug in perl 5.6.x croak and earlier */ -#if (PERL_VERSION < 8) -# ifdef PERL_OBJECT -# define SWIG_croak_null() SWIG_Perl_croak_null(pPerl) -static void SWIG_Perl_croak_null(CPerlObj *pPerl) -# else -static void SWIG_croak_null() -# endif -{ - SV *err=ERRSV; -# if (PERL_VERSION < 6) - croak("%_", err); -# else - if (SvOK(err) && !SvROK(err)) croak("%_", err); - croak(Nullch); -# endif -} -#else -# define SWIG_croak_null() croak(Nullch) -#endif - - -/* - Define how strict is the cast between strings and integers/doubles - when overloading between these types occurs. - - The default is making it as strict as possible by using SWIG_AddCast - when needed. - - You can use -DSWIG_PERL_NO_STRICT_STR2NUM at compilation time to - disable the SWIG_AddCast, making the casting between string and - numbers less strict. - - In the end, we try to solve the overloading between strings and - numerical types in the more natural way, but if you can avoid it, - well, avoid it using %rename, for example. -*/ -#ifndef SWIG_PERL_NO_STRICT_STR2NUM -# ifndef SWIG_PERL_STRICT_STR2NUM -# define SWIG_PERL_STRICT_STR2NUM -# endif -#endif -#ifdef SWIG_PERL_STRICT_STR2NUM -/* string takes precedence */ -#define SWIG_Str2NumCast(x) SWIG_AddCast(x) -#else -/* number takes precedence */ -#define SWIG_Str2NumCast(x) x -#endif - - - -#include - -SWIGRUNTIME const char * -SWIG_Perl_TypeProxyName(const swig_type_info *type) { - if (!type) return NULL; - if (type->clientdata != NULL) { - return (const char*) type->clientdata; - } - else { - return type->name; - } -} - -/* Identical to SWIG_TypeCheck, except for strcmp comparison */ -SWIGRUNTIME swig_cast_info * -SWIG_TypeProxyCheck(const char *c, swig_type_info *ty) { - if (ty) { - swig_cast_info *iter = ty->cast; - while (iter) { - if ( (!iter->type->clientdata && (strcmp(iter->type->name, c) == 0)) || - (iter->type->clientdata && (strcmp((char*)iter->type->clientdata, c) == 0)) ) { - if (iter == ty->cast) - return iter; - /* Move iter to the top of the linked list */ - iter->prev->next = iter->next; - if (iter->next) - iter->next->prev = iter->prev; - iter->next = ty->cast; - iter->prev = 0; - if (ty->cast) ty->cast->prev = iter; - ty->cast = iter; - return iter; - } - iter = iter->next; - } - } - return 0; -} - -/* Function for getting a pointer value */ - -SWIGRUNTIME int -SWIG_Perl_ConvertPtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags) { - swig_cast_info *tc; - void *voidptr = (void *)0; - SV *tsv = 0; - /* If magical, apply more magic */ - if (SvGMAGICAL(sv)) - mg_get(sv); - - /* Check to see if this is an object */ - if (sv_isobject(sv)) { - IV tmp = 0; - tsv = (SV*) SvRV(sv); - if ((SvTYPE(tsv) == SVt_PVHV)) { - MAGIC *mg; - if (SvMAGICAL(tsv)) { - mg = mg_find(tsv,'P'); - if (mg) { - sv = mg->mg_obj; - if (sv_isobject(sv)) { - tsv = (SV*)SvRV(sv); - tmp = SvIV(tsv); - } - } - } else { - return SWIG_ERROR; - } - } else { - tmp = SvIV(tsv); - } - voidptr = INT2PTR(void *,tmp); - } else if (! SvOK(sv)) { /* Check for undef */ - *(ptr) = (void *) 0; - return SWIG_OK; - } else if (SvTYPE(sv) == SVt_RV) { /* Check for NULL pointer */ - if (!SvROK(sv)) { - *(ptr) = (void *) 0; - return SWIG_OK; - } else { - return SWIG_ERROR; - } - } else { /* Don't know what it is */ - return SWIG_ERROR; - } - if (_t) { - /* Now see if the types match */ - char *_c = HvNAME(SvSTASH(SvRV(sv))); - tc = SWIG_TypeProxyCheck(_c,_t); - if (!tc) { - return SWIG_ERROR; - } - { - int newmemory = 0; - *ptr = SWIG_TypeCast(tc,voidptr,&newmemory); - assert(!newmemory); /* newmemory handling not yet implemented */ - } - } else { - *ptr = voidptr; - } - - /* - * DISOWN implementation: we need a perl guru to check this one. - */ - if (tsv && (flags & SWIG_POINTER_DISOWN)) { - /* - * almost copy paste code from below SWIG_POINTER_OWN setting - */ - SV *obj = sv; - HV *stash = SvSTASH(SvRV(obj)); - GV *gv = *(GV**) hv_fetch(stash, "OWNER", 5, TRUE); - if (isGV(gv)) { - HV *hv = GvHVn(gv); - /* - * To set ownership (see below), a newSViv(1) entry is added. - * Hence, to remove ownership, we delete the entry. - */ - if (hv_exists_ent(hv, obj, 0)) { - hv_delete_ent(hv, obj, 0, 0); - } - } - } - return SWIG_OK; -} - -SWIGRUNTIME void -SWIG_Perl_MakePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, swig_type_info *t, int flags) { - if (ptr && (flags & SWIG_SHADOW)) { - SV *self; - SV *obj=newSV(0); - HV *hash=newHV(); - HV *stash; - sv_setref_pv(obj, (char *) SWIG_Perl_TypeProxyName(t), ptr); - stash=SvSTASH(SvRV(obj)); - if (flags & SWIG_POINTER_OWN) { - HV *hv; - GV *gv=*(GV**)hv_fetch(stash, "OWNER", 5, TRUE); - if (!isGV(gv)) - gv_init(gv, stash, "OWNER", 5, FALSE); - hv=GvHVn(gv); - hv_store_ent(hv, obj, newSViv(1), 0); - } - sv_magic((SV *)hash, (SV *)obj, 'P', Nullch, 0); - SvREFCNT_dec(obj); - self=newRV_noinc((SV *)hash); - sv_setsv(sv, self); - SvREFCNT_dec((SV *)self); - sv_bless(sv, stash); - } - else { - sv_setref_pv(sv, (char *) SWIG_Perl_TypeProxyName(t), ptr); - } -} - -SWIGRUNTIMEINLINE SV * -SWIG_Perl_NewPointerObj(SWIG_MAYBE_PERL_OBJECT void *ptr, swig_type_info *t, int flags) { - SV *result = sv_newmortal(); - SWIG_MakePtr(result, ptr, t, flags); - return result; -} - -SWIGRUNTIME void -SWIG_Perl_MakePackedObj(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, int sz, swig_type_info *type) { - char result[1024]; - char *r = result; - if ((2*sz + 1 + strlen(SWIG_Perl_TypeProxyName(type))) > 1000) return; - *(r++) = '_'; - r = SWIG_PackData(r,ptr,sz); - strcpy(r,SWIG_Perl_TypeProxyName(type)); - sv_setpv(sv, result); -} - -SWIGRUNTIME SV * -SWIG_Perl_NewPackedObj(SWIG_MAYBE_PERL_OBJECT void *ptr, int sz, swig_type_info *type) { - SV *result = sv_newmortal(); - SWIG_Perl_MakePackedObj(result, ptr, sz, type); - return result; -} - -/* Convert a packed value value */ -SWIGRUNTIME int -SWIG_Perl_ConvertPacked(SWIG_MAYBE_PERL_OBJECT SV *obj, void *ptr, int sz, swig_type_info *ty) { - swig_cast_info *tc; - const char *c = 0; - - if ((!obj) || (!SvOK(obj))) return SWIG_ERROR; - c = SvPV_nolen(obj); - /* Pointer values must start with leading underscore */ - if (*c != '_') return SWIG_ERROR; - c++; - c = SWIG_UnpackData(c,ptr,sz); - if (ty) { - tc = SWIG_TypeCheck(c,ty); - if (!tc) return SWIG_ERROR; - } - return SWIG_OK; -} - - -/* Macros for low-level exception handling */ -#define SWIG_croak(x) { SWIG_Error(SWIG_RuntimeError, x); SWIG_fail; } - - -typedef XSPROTO(SwigPerlWrapper); -typedef SwigPerlWrapper *SwigPerlWrapperPtr; - -/* Structure for command table */ -typedef struct { - const char *name; - SwigPerlWrapperPtr wrapper; -} swig_command_info; - -/* Information for constant table */ - -#define SWIG_INT 1 -#define SWIG_FLOAT 2 -#define SWIG_STRING 3 -#define SWIG_POINTER 4 -#define SWIG_BINARY 5 - -/* Constant information structure */ -typedef struct swig_constant_info { - int type; - const char *name; - long lvalue; - double dvalue; - void *pvalue; - swig_type_info **ptype; -} swig_constant_info; - - -/* Structure for variable table */ -typedef struct { - const char *name; - SwigMagicFunc set; - SwigMagicFunc get; - swig_type_info **type; -} swig_variable_info; - -/* Magic variable code */ -#ifndef PERL_OBJECT -#define swig_create_magic(s,a,b,c) _swig_create_magic(s,a,b,c) - #ifndef MULTIPLICITY - SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(SV *, MAGIC *), int (*get)(SV *,MAGIC *)) - #else - SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(struct interpreter*, SV *, MAGIC *), int (*get)(struct interpreter*, SV *,MAGIC *)) - #endif -#else -# define swig_create_magic(s,a,b,c) _swig_create_magic(pPerl,s,a,b,c) -SWIGRUNTIME void _swig_create_magic(CPerlObj *pPerl, SV *sv, const char *name, int (CPerlObj::*set)(SV *, MAGIC *), int (CPerlObj::*get)(SV *, MAGIC *)) -#endif -{ - MAGIC *mg; - sv_magic(sv,sv,'U',(char *) name,strlen(name)); - mg = mg_find(sv,'U'); - mg->mg_virtual = (MGVTBL *) malloc(sizeof(MGVTBL)); - mg->mg_virtual->svt_get = (SwigMagicFunc) get; - mg->mg_virtual->svt_set = (SwigMagicFunc) set; - mg->mg_virtual->svt_len = 0; - mg->mg_virtual->svt_clear = 0; - mg->mg_virtual->svt_free = 0; -} - - -SWIGRUNTIME swig_module_info * -SWIG_Perl_GetModule(void) { - static void *type_pointer = (void *)0; - SV *pointer; - - /* first check if pointer already created */ - if (!type_pointer) { - pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, FALSE | GV_ADDMULTI); - if (pointer && SvOK(pointer)) { - type_pointer = INT2PTR(swig_type_info **, SvIV(pointer)); - } - } - - return (swig_module_info *) type_pointer; -} - -SWIGRUNTIME void -SWIG_Perl_SetModule(swig_module_info *module) { - SV *pointer; - - /* create a new pointer */ - pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, TRUE | GV_ADDMULTI); - sv_setiv(pointer, PTR2IV(module)); -} - -#ifdef __cplusplus -} -#endif +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif -/* Workaround perl5 global namespace pollution. Note that undefining library - * functions like fopen will not solve the problem on all platforms as fopen - * might be a macro on Windows but not necessarily on other operating systems. */ -#ifdef do_open - #undef do_open -#endif -#ifdef do_close - #undef do_close -#endif -#ifdef scalar - #undef scalar -#endif -#ifdef list - #undef list -#endif -#ifdef apply - #undef apply -#endif -#ifdef convert - #undef convert -#endif -#ifdef Error - #undef Error -#endif -#ifdef form - #undef form -#endif -#ifdef vform - #undef vform -#endif -#ifdef LABEL - #undef LABEL -#endif -#ifdef METHOD - #undef METHOD -#endif -#ifdef Move - #undef Move -#endif -#ifdef yylex - #undef yylex -#endif -#ifdef yyparse - #undef yyparse -#endif -#ifdef yyerror - #undef yyerror -#endif -#ifdef invert - #undef invert -#endif -#ifdef ref - #undef ref -#endif -#ifdef read - #undef read -#endif -#ifdef write - #undef write -#endif -#ifdef eof - #undef eof -#endif -#ifdef bool - #undef bool -#endif -#ifdef close - #undef close -#endif -#ifdef rewind - #undef rewind -#endif -#ifdef free - #undef free -#endif -#ifdef malloc - #undef malloc -#endif -#ifdef calloc - #undef calloc -#endif -#ifdef Stat - #undef Stat -#endif -#ifdef check - #undef check -#endif -#ifdef seekdir - #undef seekdir -#endif -#ifdef open - #undef open -#endif -#ifdef readdir - #undef readdir -#endif -#ifdef bind - #undef bind -#endif +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + + +/* ----------------------------------------------------------------------------- + * swigrun.swg + * + * This file contains generic C API SWIG runtime support for pointer + * type checking. + * ----------------------------------------------------------------------------- */ + +/* This should only be incremented when either the layout of swig_type_info changes, + or for whatever reason, the runtime changes incompatibly */ +#define SWIG_RUNTIME_VERSION "4" + +/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ +#ifdef SWIG_TYPE_TABLE +# define SWIG_QUOTE_STRING(x) #x +# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) +# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) +#else +# define SWIG_TYPE_TABLE_NAME +#endif + +/* + You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for + creating a static or dynamic library from the SWIG runtime code. + In 99.9% of the cases, SWIG just needs to declare them as 'static'. + + But only do this if strictly necessary, ie, if you have problems + with your compiler or suchlike. +*/ + +#ifndef SWIGRUNTIME +# define SWIGRUNTIME SWIGINTERN +#endif + +#ifndef SWIGRUNTIMEINLINE +# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE +#endif + +/* Generic buffer size */ +#ifndef SWIG_BUFFER_SIZE +# define SWIG_BUFFER_SIZE 1024 +#endif + +/* Flags for pointer conversions */ +#define SWIG_POINTER_DISOWN 0x1 +#define SWIG_CAST_NEW_MEMORY 0x2 + +/* Flags for new pointer objects */ +#define SWIG_POINTER_OWN 0x1 + + +/* + Flags/methods for returning states. + + The SWIG conversion methods, as ConvertPtr, return an integer + that tells if the conversion was successful or not. And if not, + an error code can be returned (see swigerrors.swg for the codes). + + Use the following macros/flags to set or process the returning + states. + + In old versions of SWIG, code such as the following was usually written: + + if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { + // success code + } else { + //fail code + } + + Now you can be more explicit: + + int res = SWIG_ConvertPtr(obj,vptr,ty.flags); + if (SWIG_IsOK(res)) { + // success code + } else { + // fail code + } + + which is the same really, but now you can also do + + Type *ptr; + int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); + if (SWIG_IsOK(res)) { + // success code + if (SWIG_IsNewObj(res) { + ... + delete *ptr; + } else { + ... + } + } else { + // fail code + } + + I.e., now SWIG_ConvertPtr can return new objects and you can + identify the case and take care of the deallocation. Of course that + also requires SWIG_ConvertPtr to return new result values, such as + + int SWIG_ConvertPtr(obj, ptr,...) { + if () { + if () { + *ptr = ; + return SWIG_NEWOBJ; + } else { + *ptr = ; + return SWIG_OLDOBJ; + } + } else { + return SWIG_BADOBJ; + } + } + + Of course, returning the plain '0(success)/-1(fail)' still works, but you can be + more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the + SWIG errors code. + + Finally, if the SWIG_CASTRANK_MODE is enabled, the result code + allows to return the 'cast rank', for example, if you have this + + int food(double) + int fooi(int); + + and you call + + food(1) // cast rank '1' (1 -> 1.0) + fooi(1) // cast rank '0' + + just use the SWIG_AddCast()/SWIG_CheckState() +*/ + +#define SWIG_OK (0) +#define SWIG_ERROR (-1) +#define SWIG_IsOK(r) (r >= 0) +#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) + +/* The CastRankLimit says how many bits are used for the cast rank */ +#define SWIG_CASTRANKLIMIT (1 << 8) +/* The NewMask denotes the object was created (using new/malloc) */ +#define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) +/* The TmpMask is for in/out typemaps that use temporal objects */ +#define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) +/* Simple returning values */ +#define SWIG_BADOBJ (SWIG_ERROR) +#define SWIG_OLDOBJ (SWIG_OK) +#define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) +#define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) +/* Check, add and del mask methods */ +#define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) +#define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) +#define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) +#define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) +#define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) +#define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) + +/* Cast-Rank Mode */ +#if defined(SWIG_CASTRANK_MODE) +# ifndef SWIG_TypeRank +# define SWIG_TypeRank unsigned long +# endif +# ifndef SWIG_MAXCASTRANK /* Default cast allowed */ +# define SWIG_MAXCASTRANK (2) +# endif +# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) +# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) +SWIGINTERNINLINE int SWIG_AddCast(int r) { + return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; +} +SWIGINTERNINLINE int SWIG_CheckState(int r) { + return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; +} +#else /* no cast-rank mode */ +# define SWIG_AddCast +# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) +#endif + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *(*swig_converter_func)(void *, int *); +typedef struct swig_type_info *(*swig_dycast_func)(void **); + +/* Structure to store information on one type */ +typedef struct swig_type_info { + const char *name; /* mangled name of this type */ + const char *str; /* human readable name of this type */ + swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ + struct swig_cast_info *cast; /* linked list of types that can cast into this type */ + void *clientdata; /* language specific type data */ + int owndata; /* flag if the structure owns the clientdata */ +} swig_type_info; + +/* Structure to store a type and conversion function used for casting */ +typedef struct swig_cast_info { + swig_type_info *type; /* pointer to type that is equivalent to this type */ + swig_converter_func converter; /* function to cast the void pointers */ + struct swig_cast_info *next; /* pointer to next cast in linked list */ + struct swig_cast_info *prev; /* pointer to the previous cast */ +} swig_cast_info; + +/* Structure used to store module information + * Each module generates one structure like this, and the runtime collects + * all of these structures and stores them in a circularly linked list.*/ +typedef struct swig_module_info { + swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ + size_t size; /* Number of types in this module */ + struct swig_module_info *next; /* Pointer to next element in circularly linked list */ + swig_type_info **type_initial; /* Array of initially generated type structures */ + swig_cast_info **cast_initial; /* Array of initially generated casting structures */ + void *clientdata; /* Language specific module data */ +} swig_module_info; + +/* + Compare two type names skipping the space characters, therefore + "char*" == "char *" and "Class" == "Class", etc. + + Return 0 when the two name types are equivalent, as in + strncmp, but skipping ' '. +*/ +SWIGRUNTIME int +SWIG_TypeNameComp(const char *f1, const char *l1, + const char *f2, const char *l2) { + for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { + while ((*f1 == ' ') && (f1 != l1)) ++f1; + while ((*f2 == ' ') && (f2 != l2)) ++f2; + if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; + } + return (int)((l1 - f1) - (l2 - f2)); +} + +/* + Check type equivalence in a name list like ||... + Return 0 if not equal, 1 if equal +*/ +SWIGRUNTIME int +SWIG_TypeEquiv(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + +/* + Check type equivalence in a name list like ||... + Return 0 if equal, -1 if nb < tb, 1 if nb > tb +*/ +SWIGRUNTIME int +SWIG_TypeCompare(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + + +/* + Check the typename +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheck(const char *c, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (strcmp(iter->type->name, c) == 0) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (iter->type == from) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Cast a pointer up an inheritance hierarchy +*/ +SWIGRUNTIMEINLINE void * +SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { + return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); +} + +/* + Dynamic pointer casting. Down an inheritance hierarchy +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { + swig_type_info *lastty = ty; + if (!ty || !ty->dcast) return ty; + while (ty && (ty->dcast)) { + ty = (*ty->dcast)(ptr); + if (ty) lastty = ty; + } + return lastty; +} + +/* + Return the name associated with this type +*/ +SWIGRUNTIMEINLINE const char * +SWIG_TypeName(const swig_type_info *ty) { + return ty->name; +} + +/* + Return the pretty name associated with this type, + that is an unmangled type name in a form presentable to the user. +*/ +SWIGRUNTIME const char * +SWIG_TypePrettyName(const swig_type_info *type) { + /* The "str" field contains the equivalent pretty names of the + type, separated by vertical-bar characters. We choose + to print the last name, as it is often (?) the most + specific. */ + if (!type) return NULL; + if (type->str != NULL) { + const char *last_name = type->str; + const char *s; + for (s = type->str; *s; s++) + if (*s == '|') last_name = s+1; + return last_name; + } + else + return type->name; +} + +/* + Set the clientdata field for a type +*/ +SWIGRUNTIME void +SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { + swig_cast_info *cast = ti->cast; + /* if (ti->clientdata == clientdata) return; */ + ti->clientdata = clientdata; + + while (cast) { + if (!cast->converter) { + swig_type_info *tc = cast->type; + if (!tc->clientdata) { + SWIG_TypeClientData(tc, clientdata); + } + } + cast = cast->next; + } +} +SWIGRUNTIME void +SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { + SWIG_TypeClientData(ti, clientdata); + ti->owndata = 1; +} + +/* + Search for a swig_type_info structure only by mangled name + Search is a O(log #types) + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_MangledTypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + swig_module_info *iter = start; + do { + if (iter->size) { + register size_t l = 0; + register size_t r = iter->size - 1; + do { + /* since l+r >= 0, we can (>> 1) instead (/ 2) */ + register size_t i = (l + r) >> 1; + const char *iname = iter->types[i]->name; + if (iname) { + register int compare = strcmp(name, iname); + if (compare == 0) { + return iter->types[i]; + } else if (compare < 0) { + if (i) { + r = i - 1; + } else { + break; + } + } else if (compare > 0) { + l = i + 1; + } + } else { + break; /* should never happen */ + } + } while (l <= r); + } + iter = iter->next; + } while (iter != end); + return 0; +} + +/* + Search for a swig_type_info structure for either a mangled name or a human readable name. + It first searches the mangled names of the types, which is a O(log #types) + If a type is not found it then searches the human readable names, which is O(#types). + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + /* STEP 1: Search the name field using binary search */ + swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); + if (ret) { + return ret; + } else { + /* STEP 2: If the type hasn't been found, do a complete search + of the str field (the human readable name) */ + swig_module_info *iter = start; + do { + register size_t i = 0; + for (; i < iter->size; ++i) { + if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) + return iter->types[i]; + } + iter = iter->next; + } while (iter != end); + } + + /* neither found a match */ + return 0; +} + +/* + Pack binary data into a string +*/ +SWIGRUNTIME char * +SWIG_PackData(char *c, void *ptr, size_t sz) { + static const char hex[17] = "0123456789abcdef"; + register const unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register unsigned char uu = *u; + *(c++) = hex[(uu & 0xf0) >> 4]; + *(c++) = hex[uu & 0xf]; + } + return c; +} + +/* + Unpack binary data from a string +*/ +SWIGRUNTIME const char * +SWIG_UnpackData(const char *c, void *ptr, size_t sz) { + register unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register char d = *(c++); + register unsigned char uu; + if ((d >= '0') && (d <= '9')) + uu = ((d - '0') << 4); + else if ((d >= 'a') && (d <= 'f')) + uu = ((d - ('a'-10)) << 4); + else + return (char *) 0; + d = *(c++); + if ((d >= '0') && (d <= '9')) + uu |= (d - '0'); + else if ((d >= 'a') && (d <= 'f')) + uu |= (d - ('a'-10)); + else + return (char *) 0; + *u = uu; + } + return c; +} + +/* + Pack 'void *' into a string buffer. +*/ +SWIGRUNTIME char * +SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { + char *r = buff; + if ((2*sizeof(void *) + 2) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,&ptr,sizeof(void *)); + if (strlen(name) + 1 > (bsz - (r - buff))) return 0; + strcpy(r,name); + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + *ptr = (void *) 0; + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sizeof(void *)); +} + +SWIGRUNTIME char * +SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { + char *r = buff; + size_t lname = (name ? strlen(name) : 0); + if ((2*sz + 2 + lname) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,ptr,sz); + if (lname) { + strncpy(r,name,lname+1); + } else { + *r = 0; + } + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + memset(ptr,0,sz); + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sz); +} + +#ifdef __cplusplus +} +#endif + +/* Errors in SWIG */ +#define SWIG_UnknownError -1 +#define SWIG_IOError -2 +#define SWIG_RuntimeError -3 +#define SWIG_IndexError -4 +#define SWIG_TypeError -5 +#define SWIG_DivisionByZero -6 +#define SWIG_OverflowError -7 +#define SWIG_SyntaxError -8 +#define SWIG_ValueError -9 +#define SWIG_SystemError -10 +#define SWIG_AttributeError -11 +#define SWIG_MemoryError -12 +#define SWIG_NullReferenceError -13 + + + +#ifdef __cplusplus +/* Needed on some windows machines---since MS plays funny games with the header files under C++ */ +#include +#include +extern "C" { +#endif +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +/* Add in functionality missing in older versions of Perl. Much of this is based on Devel-PPPort on cpan. */ + +/* Add PERL_REVISION, PERL_VERSION, PERL_SUBVERSION if missing */ +#ifndef PERL_REVISION +# if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) +# define PERL_PATCHLEVEL_H_IMPLICIT +# include +# endif +# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) +# include +# endif +# ifndef PERL_REVISION +# define PERL_REVISION (5) +# define PERL_VERSION PATCHLEVEL +# define PERL_SUBVERSION SUBVERSION +# endif +#endif + +#if defined(WIN32) && defined(PERL_OBJECT) && !defined(PerlIO_exportFILE) +#define PerlIO_exportFILE(fh,fl) (FILE*)(fh) +#endif + +#ifndef SvIOK_UV +# define SvIOK_UV(sv) (SvIOK(sv) && (SvUVX(sv) == SvIVX(sv))) +#endif + +#ifndef SvUOK +# define SvUOK(sv) SvIOK_UV(sv) +#endif + +#if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))) +# define PL_sv_undef sv_undef +# define PL_na na +# define PL_errgv errgv +# define PL_sv_no sv_no +# define PL_sv_yes sv_yes +# define PL_markstack_ptr markstack_ptr +#endif + +#ifndef IVSIZE +# ifdef LONGSIZE +# define IVSIZE LONGSIZE +# else +# define IVSIZE 4 /* A bold guess, but the best we can make. */ +# endif +#endif + +#ifndef INT2PTR +# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) +# define PTRV UV +# define INT2PTR(any,d) (any)(d) +# else +# if PTRSIZE == LONGSIZE +# define PTRV unsigned long +# else +# define PTRV unsigned +# endif +# define INT2PTR(any,d) (any)(PTRV)(d) +# endif + +# define NUM2PTR(any,d) (any)(PTRV)(d) +# define PTR2IV(p) INT2PTR(IV,p) +# define PTR2UV(p) INT2PTR(UV,p) +# define PTR2NV(p) NUM2PTR(NV,p) + +# if PTRSIZE == LONGSIZE +# define PTR2ul(p) (unsigned long)(p) +# else +# define PTR2ul(p) INT2PTR(unsigned long,p) +# endif +#endif /* !INT2PTR */ + +#ifndef SvPV_nolen +# define SvPV_nolen(x) SvPV(x,PL_na) +#endif + +#ifndef get_sv +# define get_sv perl_get_sv +#endif + +#ifndef ERRSV +# define ERRSV get_sv("@",FALSE) +#endif + +#ifndef pTHX_ +#define pTHX_ +#endif + +#include +#ifdef __cplusplus +} +#endif + +/* ----------------------------------------------------------------------------- + * error manipulation + * ----------------------------------------------------------------------------- */ + +SWIGINTERN const char* +SWIG_Perl_ErrorType(int code) { + const char* type = 0; + switch(code) { + case SWIG_MemoryError: + type = "MemoryError"; + break; + case SWIG_IOError: + type = "IOError"; + break; + case SWIG_RuntimeError: + type = "RuntimeError"; + break; + case SWIG_IndexError: + type = "IndexError"; + break; + case SWIG_TypeError: + type = "TypeError"; + break; + case SWIG_DivisionByZero: + type = "ZeroDivisionError"; + break; + case SWIG_OverflowError: + type = "OverflowError"; + break; + case SWIG_SyntaxError: + type = "SyntaxError"; + break; + case SWIG_ValueError: + type = "ValueError"; + break; + case SWIG_SystemError: + type = "SystemError"; + break; + case SWIG_AttributeError: + type = "AttributeError"; + break; + default: + type = "RuntimeError"; + } + return type; +} + + + + +/* ----------------------------------------------------------------------------- + * perlrun.swg + * + * This file contains the runtime support for Perl modules + * and includes code for managing global variables and pointer + * type checking. + * ----------------------------------------------------------------------------- */ + +#ifdef PERL_OBJECT +#define SWIG_PERL_OBJECT_DECL CPerlObj *SWIGUNUSEDPARM(pPerl), +#define SWIG_PERL_OBJECT_CALL pPerl, +#else +#define SWIG_PERL_OBJECT_DECL +#define SWIG_PERL_OBJECT_CALL +#endif + +/* Common SWIG API */ + +/* for raw pointers */ +#define SWIG_ConvertPtr(obj, pp, type, flags) SWIG_Perl_ConvertPtr(SWIG_PERL_OBJECT_CALL obj, pp, type, flags) +#define SWIG_ConvertPtrAndOwn(obj, pp, type, flags,own) SWIG_Perl_ConvertPtrAndOwn(SWIG_PERL_OBJECT_CALL obj, pp, type, flags, own) +#define SWIG_NewPointerObj(p, type, flags) SWIG_Perl_NewPointerObj(SWIG_PERL_OBJECT_CALL p, type, flags) + +/* for raw packed data */ +#define SWIG_ConvertPacked(obj, p, s, type) SWIG_Perl_ConvertPacked(SWIG_PERL_OBJECT_CALL obj, p, s, type) +#define SWIG_NewPackedObj(p, s, type) SWIG_Perl_NewPackedObj(SWIG_PERL_OBJECT_CALL p, s, type) + +/* for class or struct pointers */ +#define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) +#define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) + +/* for C or C++ function pointers */ +#define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_ConvertPtr(obj, pptr, type, 0) +#define SWIG_NewFunctionPtrObj(ptr, type) SWIG_NewPointerObj(ptr, type, 0) + +/* for C++ member pointers, ie, member methods */ +#define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_ConvertPacked(obj, ptr, sz, ty) +#define SWIG_NewMemberObj(ptr, sz, type) SWIG_NewPackedObj(ptr, sz, type) + + +/* Runtime API */ + +#define SWIG_GetModule(clientdata) SWIG_Perl_GetModule() +#define SWIG_SetModule(clientdata, pointer) SWIG_Perl_SetModule(pointer) + + +/* Error manipulation */ + +#define SWIG_ErrorType(code) SWIG_Perl_ErrorType(code) +#define SWIG_Error(code, msg) sv_setpvf(GvSV(PL_errgv),"%s %s\n", SWIG_ErrorType(code), msg) +#define SWIG_fail goto fail + +/* Perl-specific SWIG API */ + +#define SWIG_MakePtr(sv, ptr, type, flags) SWIG_Perl_MakePtr(SWIG_PERL_OBJECT_CALL sv, ptr, type, flags) +#define SWIG_MakePackedObj(sv, p, s, type) SWIG_Perl_MakePackedObj(SWIG_PERL_OBJECT_CALL sv, p, s, type) +#define SWIG_SetError(str) SWIG_Error(SWIG_RuntimeError, str) + + +#define SWIG_PERL_DECL_ARGS_1(arg1) (SWIG_PERL_OBJECT_DECL arg1) +#define SWIG_PERL_CALL_ARGS_1(arg1) (SWIG_PERL_OBJECT_CALL arg1) +#define SWIG_PERL_DECL_ARGS_2(arg1, arg2) (SWIG_PERL_OBJECT_DECL arg1, arg2) +#define SWIG_PERL_CALL_ARGS_2(arg1, arg2) (SWIG_PERL_OBJECT_CALL arg1, arg2) + +/* ----------------------------------------------------------------------------- + * pointers/data manipulation + * ----------------------------------------------------------------------------- */ + +/* For backward compatibility only */ +#define SWIG_POINTER_EXCEPTION 0 + +#ifdef __cplusplus +extern "C" { +#endif + +#define SWIG_OWNER SWIG_POINTER_OWN +#define SWIG_SHADOW SWIG_OWNER << 1 + +#define SWIG_MAYBE_PERL_OBJECT SWIG_PERL_OBJECT_DECL + +/* SWIG Perl macros */ + +/* Macro to declare an XS function */ +#ifndef XSPROTO +# define XSPROTO(name) void name(pTHX_ CV* cv) +#endif + +/* Macro to call an XS function */ +#ifdef PERL_OBJECT +# define SWIG_CALLXS(_name) _name(cv,pPerl) +#else +# ifndef MULTIPLICITY +# define SWIG_CALLXS(_name) _name(cv) +# else +# define SWIG_CALLXS(_name) _name(PERL_GET_THX, cv) +# endif +#endif + +#ifdef PERL_OBJECT +#define MAGIC_PPERL CPerlObj *pPerl = (CPerlObj *) this; + +#ifdef __cplusplus +extern "C" { +#endif +typedef int (CPerlObj::*SwigMagicFunc)(SV *, MAGIC *); +#ifdef __cplusplus +} +#endif + +#define SWIG_MAGIC(a,b) (SV *a, MAGIC *b) +#define SWIGCLASS_STATIC + +#else /* PERL_OBJECT */ + +#define MAGIC_PPERL +#define SWIGCLASS_STATIC static SWIGUNUSED + +#ifndef MULTIPLICITY +#define SWIG_MAGIC(a,b) (SV *a, MAGIC *b) + +#ifdef __cplusplus +extern "C" { +#endif +typedef int (*SwigMagicFunc)(SV *, MAGIC *); +#ifdef __cplusplus +} +#endif + +#else /* MULTIPLICITY */ + +#define SWIG_MAGIC(a,b) (struct interpreter *interp, SV *a, MAGIC *b) + +#ifdef __cplusplus +extern "C" { +#endif +typedef int (*SwigMagicFunc)(struct interpreter *, SV *, MAGIC *); +#ifdef __cplusplus +} +#endif + +#endif /* MULTIPLICITY */ +#endif /* PERL_OBJECT */ + +/* Workaround for bug in perl 5.6.x croak and earlier */ +#if (PERL_VERSION < 8) +# ifdef PERL_OBJECT +# define SWIG_croak_null() SWIG_Perl_croak_null(pPerl) +static void SWIG_Perl_croak_null(CPerlObj *pPerl) +# else +static void SWIG_croak_null() +# endif +{ + SV *err=ERRSV; +# if (PERL_VERSION < 6) + croak("%_", err); +# else + if (SvOK(err) && !SvROK(err)) croak("%_", err); + croak(Nullch); +# endif +} +#else +# define SWIG_croak_null() croak(Nullch) +#endif + + +/* + Define how strict is the cast between strings and integers/doubles + when overloading between these types occurs. + + The default is making it as strict as possible by using SWIG_AddCast + when needed. + + You can use -DSWIG_PERL_NO_STRICT_STR2NUM at compilation time to + disable the SWIG_AddCast, making the casting between string and + numbers less strict. + + In the end, we try to solve the overloading between strings and + numerical types in the more natural way, but if you can avoid it, + well, avoid it using %rename, for example. +*/ +#ifndef SWIG_PERL_NO_STRICT_STR2NUM +# ifndef SWIG_PERL_STRICT_STR2NUM +# define SWIG_PERL_STRICT_STR2NUM +# endif +#endif +#ifdef SWIG_PERL_STRICT_STR2NUM +/* string takes precedence */ +#define SWIG_Str2NumCast(x) SWIG_AddCast(x) +#else +/* number takes precedence */ +#define SWIG_Str2NumCast(x) x +#endif + + + +#include + +SWIGRUNTIME const char * +SWIG_Perl_TypeProxyName(const swig_type_info *type) { + if (!type) return NULL; + if (type->clientdata != NULL) { + return (const char*) type->clientdata; + } + else { + return type->name; + } +} + +/* Identical to SWIG_TypeCheck, except for strcmp comparison */ +SWIGRUNTIME swig_cast_info * +SWIG_TypeProxyCheck(const char *c, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if ( (!iter->type->clientdata && (strcmp(iter->type->name, c) == 0)) || + (iter->type->clientdata && (strcmp((char*)iter->type->clientdata, c) == 0)) ) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* Function for getting a pointer value */ + +SWIGRUNTIME int +SWIG_Perl_ConvertPtrAndOwn(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags, int *own) { + swig_cast_info *tc; + void *voidptr = (void *)0; + SV *tsv = 0; + + if (own) + *own = 0; + + /* If magical, apply more magic */ + if (SvGMAGICAL(sv)) + mg_get(sv); + + /* Check to see if this is an object */ + if (sv_isobject(sv)) { + IV tmp = 0; + tsv = (SV*) SvRV(sv); + if ((SvTYPE(tsv) == SVt_PVHV)) { + MAGIC *mg; + if (SvMAGICAL(tsv)) { + mg = mg_find(tsv,'P'); + if (mg) { + sv = mg->mg_obj; + if (sv_isobject(sv)) { + tsv = (SV*)SvRV(sv); + tmp = SvIV(tsv); + } + } + } else { + return SWIG_ERROR; + } + } else { + tmp = SvIV(tsv); + } + voidptr = INT2PTR(void *,tmp); + } else if (! SvOK(sv)) { /* Check for undef */ + *(ptr) = (void *) 0; + return SWIG_OK; + } else if (SvTYPE(sv) == SVt_RV) { /* Check for NULL pointer */ + if (!SvROK(sv)) { + /* In Perl 5.12 and later, SVt_RV == SVt_IV, so sv could be a valid integer value. */ + if (SvIOK(sv)) { + return SWIG_ERROR; + } else { + /* NULL pointer (reference to undef). */ + *(ptr) = (void *) 0; + return SWIG_OK; + } + } else { + return SWIG_ERROR; + } + } else { /* Don't know what it is */ + return SWIG_ERROR; + } + if (_t) { + /* Now see if the types match */ + char *_c = HvNAME(SvSTASH(SvRV(sv))); + tc = SWIG_TypeProxyCheck(_c,_t); + if (!tc) { + return SWIG_ERROR; + } + { + int newmemory = 0; + *ptr = SWIG_TypeCast(tc,voidptr,&newmemory); + if (newmemory == SWIG_CAST_NEW_MEMORY) { + assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ + if (own) + *own = *own | SWIG_CAST_NEW_MEMORY; + } + } + } else { + *ptr = voidptr; + } + + /* + * DISOWN implementation: we need a perl guru to check this one. + */ + if (tsv && (flags & SWIG_POINTER_DISOWN)) { + /* + * almost copy paste code from below SWIG_POINTER_OWN setting + */ + SV *obj = sv; + HV *stash = SvSTASH(SvRV(obj)); + GV *gv = *(GV**)hv_fetch(stash, "OWNER", 5, TRUE); + if (isGV(gv)) { + HV *hv = GvHVn(gv); + /* + * To set ownership (see below), a newSViv(1) entry is added. + * Hence, to remove ownership, we delete the entry. + */ + if (hv_exists_ent(hv, obj, 0)) { + hv_delete_ent(hv, obj, 0, 0); + } + } + } + return SWIG_OK; +} + +SWIGRUNTIME int +SWIG_Perl_ConvertPtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags) { + return SWIG_Perl_ConvertPtrAndOwn(sv, ptr, _t, flags, 0); +} + +SWIGRUNTIME void +SWIG_Perl_MakePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, swig_type_info *t, int flags) { + if (ptr && (flags & (SWIG_SHADOW | SWIG_POINTER_OWN))) { + SV *self; + SV *obj=newSV(0); + HV *hash=newHV(); + HV *stash; + sv_setref_pv(obj, (char *) SWIG_Perl_TypeProxyName(t), ptr); + stash=SvSTASH(SvRV(obj)); + if (flags & SWIG_POINTER_OWN) { + HV *hv; + GV *gv = *(GV**)hv_fetch(stash, "OWNER", 5, TRUE); + if (!isGV(gv)) + gv_init(gv, stash, "OWNER", 5, FALSE); + hv=GvHVn(gv); + hv_store_ent(hv, obj, newSViv(1), 0); + } + sv_magic((SV *)hash, (SV *)obj, 'P', Nullch, 0); + SvREFCNT_dec(obj); + self=newRV_noinc((SV *)hash); + sv_setsv(sv, self); + SvREFCNT_dec((SV *)self); + sv_bless(sv, stash); + } + else { + sv_setref_pv(sv, (char *) SWIG_Perl_TypeProxyName(t), ptr); + } +} + +SWIGRUNTIMEINLINE SV * +SWIG_Perl_NewPointerObj(SWIG_MAYBE_PERL_OBJECT void *ptr, swig_type_info *t, int flags) { + SV *result = sv_newmortal(); + SWIG_MakePtr(result, ptr, t, flags); + return result; +} + +SWIGRUNTIME void +SWIG_Perl_MakePackedObj(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, int sz, swig_type_info *type) { + char result[1024]; + char *r = result; + if ((2*sz + 1 + strlen(SWIG_Perl_TypeProxyName(type))) > 1000) return; + *(r++) = '_'; + r = SWIG_PackData(r,ptr,sz); + strcpy(r,SWIG_Perl_TypeProxyName(type)); + sv_setpv(sv, result); +} + +SWIGRUNTIME SV * +SWIG_Perl_NewPackedObj(SWIG_MAYBE_PERL_OBJECT void *ptr, int sz, swig_type_info *type) { + SV *result = sv_newmortal(); + SWIG_Perl_MakePackedObj(result, ptr, sz, type); + return result; +} + +/* Convert a packed value value */ +SWIGRUNTIME int +SWIG_Perl_ConvertPacked(SWIG_MAYBE_PERL_OBJECT SV *obj, void *ptr, int sz, swig_type_info *ty) { + swig_cast_info *tc; + const char *c = 0; + + if ((!obj) || (!SvOK(obj))) return SWIG_ERROR; + c = SvPV_nolen(obj); + /* Pointer values must start with leading underscore */ + if (*c != '_') return SWIG_ERROR; + c++; + c = SWIG_UnpackData(c,ptr,sz); + if (ty) { + tc = SWIG_TypeCheck(c,ty); + if (!tc) return SWIG_ERROR; + } + return SWIG_OK; +} + + +/* Macros for low-level exception handling */ +#define SWIG_croak(x) { SWIG_Error(SWIG_RuntimeError, x); SWIG_fail; } + + +typedef XSPROTO(SwigPerlWrapper); +typedef SwigPerlWrapper *SwigPerlWrapperPtr; + +/* Structure for command table */ +typedef struct { + const char *name; + SwigPerlWrapperPtr wrapper; +} swig_command_info; + +/* Information for constant table */ + +#define SWIG_INT 1 +#define SWIG_FLOAT 2 +#define SWIG_STRING 3 +#define SWIG_POINTER 4 +#define SWIG_BINARY 5 + +/* Constant information structure */ +typedef struct swig_constant_info { + int type; + const char *name; + long lvalue; + double dvalue; + void *pvalue; + swig_type_info **ptype; +} swig_constant_info; + + +/* Structure for variable table */ +typedef struct { + const char *name; + SwigMagicFunc set; + SwigMagicFunc get; + swig_type_info **type; +} swig_variable_info; + +/* Magic variable code */ +#ifndef PERL_OBJECT +#define swig_create_magic(s,a,b,c) _swig_create_magic(s,a,b,c) + #ifndef MULTIPLICITY + SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(SV *, MAGIC *), int (*get)(SV *,MAGIC *)) + #else + SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(struct interpreter*, SV *, MAGIC *), int (*get)(struct interpreter*, SV *,MAGIC *)) + #endif +#else +# define swig_create_magic(s,a,b,c) _swig_create_magic(pPerl,s,a,b,c) +SWIGRUNTIME void _swig_create_magic(CPerlObj *pPerl, SV *sv, const char *name, int (CPerlObj::*set)(SV *, MAGIC *), int (CPerlObj::*get)(SV *, MAGIC *)) +#endif +{ + MAGIC *mg; + sv_magic(sv,sv,'U',(char *) name,strlen(name)); + mg = mg_find(sv,'U'); + mg->mg_virtual = (MGVTBL *) malloc(sizeof(MGVTBL)); + mg->mg_virtual->svt_get = (SwigMagicFunc) get; + mg->mg_virtual->svt_set = (SwigMagicFunc) set; + mg->mg_virtual->svt_len = 0; + mg->mg_virtual->svt_clear = 0; + mg->mg_virtual->svt_free = 0; +} + + +SWIGRUNTIME swig_module_info * +SWIG_Perl_GetModule(void) { + static void *type_pointer = (void *)0; + SV *pointer; + + /* first check if pointer already created */ + if (!type_pointer) { + pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, FALSE | GV_ADDMULTI); + if (pointer && SvOK(pointer)) { + type_pointer = INT2PTR(swig_type_info **, SvIV(pointer)); + } + } + + return (swig_module_info *) type_pointer; +} + +SWIGRUNTIME void +SWIG_Perl_SetModule(swig_module_info *module) { + SV *pointer; + + /* create a new pointer */ + pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, TRUE | GV_ADDMULTI); + sv_setiv(pointer, PTR2IV(module)); +} + +#ifdef __cplusplus +} +#endif + +/* Workaround perl5 global namespace pollution. Note that undefining library + * functions like fopen will not solve the problem on all platforms as fopen + * might be a macro on Windows but not necessarily on other operating systems. */ +#ifdef do_open + #undef do_open +#endif +#ifdef do_close + #undef do_close +#endif +#ifdef do_exec + #undef do_exec +#endif +#ifdef scalar + #undef scalar +#endif +#ifdef list + #undef list +#endif +#ifdef apply + #undef apply +#endif +#ifdef convert + #undef convert +#endif +#ifdef Error + #undef Error +#endif +#ifdef form + #undef form +#endif +#ifdef vform + #undef vform +#endif +#ifdef LABEL + #undef LABEL +#endif +#ifdef METHOD + #undef METHOD +#endif +#ifdef Move + #undef Move +#endif +#ifdef yylex + #undef yylex +#endif +#ifdef yyparse + #undef yyparse +#endif +#ifdef yyerror + #undef yyerror +#endif +#ifdef invert + #undef invert +#endif +#ifdef ref + #undef ref +#endif +#ifdef read + #undef read +#endif +#ifdef write + #undef write +#endif +#ifdef eof + #undef eof +#endif +#ifdef bool + #undef bool +#endif +#ifdef close + #undef close +#endif +#ifdef rewind + #undef rewind +#endif +#ifdef free + #undef free +#endif +#ifdef malloc + #undef malloc +#endif +#ifdef calloc + #undef calloc +#endif +#ifdef Stat + #undef Stat +#endif +#ifdef check + #undef check +#endif +#ifdef seekdir + #undef seekdir +#endif +#ifdef open + #undef open +#endif +#ifdef readdir + #undef readdir +#endif +#ifdef bind + #undef bind +#endif +#ifdef access + #undef access +#endif +#ifdef stat + #undef stat +#endif @@ -1559,31 +1588,33 @@ SWIG_Perl_SetModule(swig_module_info *module) { #define SWIGTYPE_p_thttp_event_type_e swig_types[61] #define SWIGTYPE_p_tmedia_bandwidth_level_e swig_types[62] #define SWIGTYPE_p_tmedia_chroma_e swig_types[63] -#define SWIGTYPE_p_tmedia_qos_strength_e swig_types[64] -#define SWIGTYPE_p_tmedia_qos_stype_e swig_types[65] -#define SWIGTYPE_p_tmedia_srtp_mode_e swig_types[66] -#define SWIGTYPE_p_tmsrp_event_type_e swig_types[67] -#define SWIGTYPE_p_tmsrp_request_type_e swig_types[68] -#define SWIGTYPE_p_tsip_event_type_e swig_types[69] -#define SWIGTYPE_p_tsip_info_event_type_e swig_types[70] -#define SWIGTYPE_p_tsip_invite_event_type_e swig_types[71] -#define SWIGTYPE_p_tsip_message_event_type_e swig_types[72] -#define SWIGTYPE_p_tsip_options_event_type_e swig_types[73] -#define SWIGTYPE_p_tsip_publish_event_type_e swig_types[74] -#define SWIGTYPE_p_tsip_register_event_type_e swig_types[75] -#define SWIGTYPE_p_tsip_request_type_e swig_types[76] -#define SWIGTYPE_p_tsip_subscribe_event_type_e swig_types[77] -#define SWIGTYPE_p_tsk_list_t swig_types[78] -#define SWIGTYPE_p_twrap_media_type_e swig_types[79] -#define SWIGTYPE_p_twrap_proxy_plugin_type_e swig_types[80] -#define SWIGTYPE_p_twrap_rpmessage_type_e swig_types[81] -#define SWIGTYPE_p_twrap_sms_type_e swig_types[82] -#define SWIGTYPE_p_unsigned_char swig_types[83] -#define SWIGTYPE_p_unsigned_int swig_types[84] -#define SWIGTYPE_p_unsigned_long_long swig_types[85] -#define SWIGTYPE_p_unsigned_short swig_types[86] -static swig_type_info *swig_types[88]; -static swig_module_info swig_module = {swig_types, 87, 0, 0, 0, 0}; +#define SWIGTYPE_p_tmedia_pref_video_size_s swig_types[64] +#define SWIGTYPE_p_tmedia_profile_e swig_types[65] +#define SWIGTYPE_p_tmedia_qos_strength_e swig_types[66] +#define SWIGTYPE_p_tmedia_qos_stype_e swig_types[67] +#define SWIGTYPE_p_tmedia_srtp_mode_e swig_types[68] +#define SWIGTYPE_p_tmsrp_event_type_e swig_types[69] +#define SWIGTYPE_p_tmsrp_request_type_e swig_types[70] +#define SWIGTYPE_p_tsip_event_type_e swig_types[71] +#define SWIGTYPE_p_tsip_info_event_type_e swig_types[72] +#define SWIGTYPE_p_tsip_invite_event_type_e swig_types[73] +#define SWIGTYPE_p_tsip_message_event_type_e swig_types[74] +#define SWIGTYPE_p_tsip_options_event_type_e swig_types[75] +#define SWIGTYPE_p_tsip_publish_event_type_e swig_types[76] +#define SWIGTYPE_p_tsip_register_event_type_e swig_types[77] +#define SWIGTYPE_p_tsip_request_type_e swig_types[78] +#define SWIGTYPE_p_tsip_subscribe_event_type_e swig_types[79] +#define SWIGTYPE_p_tsk_list_t swig_types[80] +#define SWIGTYPE_p_twrap_media_type_e swig_types[81] +#define SWIGTYPE_p_twrap_proxy_plugin_type_e swig_types[82] +#define SWIGTYPE_p_twrap_rpmessage_type_e swig_types[83] +#define SWIGTYPE_p_twrap_sms_type_e swig_types[84] +#define SWIGTYPE_p_unsigned_char swig_types[85] +#define SWIGTYPE_p_unsigned_int swig_types[86] +#define SWIGTYPE_p_unsigned_long_long swig_types[87] +#define SWIGTYPE_p_unsigned_short swig_types[88] +static swig_type_info *swig_types[90]; +static swig_module_info swig_module = {swig_types, 89, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) @@ -1594,7 +1625,7 @@ static swig_module_info swig_module = {swig_types, 87, 0, 0, 0, 0}; #define SWIG_name "tinyWRAPc::boot_tinyWRAP" #define SWIG_prefix "tinyWRAPc::" -#define SWIGVERSION 0x010339 +#define SWIGVERSION 0x020004 #define SWIG_VERSION SWIGVERSION @@ -1721,7 +1752,9 @@ SWIG_AsVal_double SWIG_PERL_DECL_ARGS_2(SV *obj, double *val) const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; - double v = strtod(nptr, &endptr); + double v; + errno = 0; + v = strtod(nptr, &endptr); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; @@ -3501,6 +3534,52 @@ XS(_wrap_MediaSessionMgr_getSessionId) { } +XS(_wrap_MediaSessionMgr_defaultsSetProfile) { + { + tmedia_profile_t arg1 ; + int val1 ; + int ecode1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MediaSessionMgr_defaultsSetProfile(profile);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "MediaSessionMgr_defaultsSetProfile" "', argument " "1"" of type '" "tmedia_profile_t""'"); + } + arg1 = static_cast< tmedia_profile_t >(val1); + result = (bool)MediaSessionMgr::defaultsSetProfile(arg1); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MediaSessionMgr_defaultsGetProfile) { + { + int argvi = 0; + tmedia_profile_t result; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: MediaSessionMgr_defaultsGetProfile();"); + } + result = (tmedia_profile_t)MediaSessionMgr::defaultsGetProfile(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + XS(_wrap_MediaSessionMgr_defaultsSetBandwidthLevel) { { tmedia_bandwidth_level_t arg1 ; @@ -3547,6 +3626,34 @@ XS(_wrap_MediaSessionMgr_defaultsGetBandwidthLevel) { } +XS(_wrap_MediaSessionMgr_defaultsSetPrefVideoSize) { + { + tmedia_pref_video_size_t arg1 ; + int val1 ; + int ecode1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MediaSessionMgr_defaultsSetPrefVideoSize(pref_video_size);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "MediaSessionMgr_defaultsSetPrefVideoSize" "', argument " "1"" of type '" "tmedia_pref_video_size_t""'"); + } + arg1 = static_cast< tmedia_pref_video_size_t >(val1); + result = (bool)MediaSessionMgr::defaultsSetPrefVideoSize(arg1); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + XS(_wrap_MediaSessionMgr_defaultsSetJbMargin) { { uint32_t arg1 ; @@ -4254,6 +4361,34 @@ XS(_wrap_MediaSessionMgr_defaultsSetSRtpMode) { } +XS(_wrap_MediaSessionMgr_defaultsSetIceEnabled) { + { + bool arg1 ; + bool val1 ; + int ecode1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MediaSessionMgr_defaultsSetIceEnabled(ice_enabled);"); + } + ecode1 = SWIG_AsVal_bool SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "MediaSessionMgr_defaultsSetIceEnabled" "', argument " "1"" of type '" "bool""'"); + } + arg1 = static_cast< bool >(val1); + result = (bool)MediaSessionMgr::defaultsSetIceEnabled(arg1); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + XS(_wrap_delete_MediaContent) { { MediaContent *arg1 = (MediaContent *) 0 ; @@ -9924,6 +10059,44 @@ XS(_wrap_CallSession_set100rel) { } +XS(_wrap_CallSession_setICE) { + { + CallSession *arg1 = (CallSession *) 0 ; + bool arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: CallSession_setICE(self,enabled);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_CallSession, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CallSession_setICE" "', argument " "1"" of type '" "CallSession *""'"); + } + arg1 = reinterpret_cast< CallSession * >(argp1); + ecode2 = SWIG_AsVal_bool SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CallSession_setICE" "', argument " "2"" of type '" "bool""'"); + } + arg2 = static_cast< bool >(val2); + result = (bool)(arg1)->setICE(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + XS(_wrap_CallSession_setQoS) { { CallSession *arg1 = (CallSession *) 0 ; @@ -23274,6 +23447,8 @@ static swig_type_info _swigt__p_tdav_codec_id_e = {"_p_tdav_codec_id_e", "enum t static swig_type_info _swigt__p_thttp_event_type_e = {"_p_thttp_event_type_e", "enum thttp_event_type_e *|thttp_event_type_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tmedia_bandwidth_level_e = {"_p_tmedia_bandwidth_level_e", "enum tmedia_bandwidth_level_e *|tmedia_bandwidth_level_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tmedia_chroma_e = {"_p_tmedia_chroma_e", "tmedia_chroma_t *|enum tmedia_chroma_e *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_tmedia_pref_video_size_s = {"_p_tmedia_pref_video_size_s", "tmedia_pref_video_size_t *|enum tmedia_pref_video_size_s *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_tmedia_profile_e = {"_p_tmedia_profile_e", "tmedia_profile_t *|enum tmedia_profile_e *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tmedia_qos_strength_e = {"_p_tmedia_qos_strength_e", "tmedia_qos_strength_t *|enum tmedia_qos_strength_e *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tmedia_qos_stype_e = {"_p_tmedia_qos_stype_e", "enum tmedia_qos_stype_e *|tmedia_qos_stype_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tmedia_srtp_mode_e = {"_p_tmedia_srtp_mode_e", "enum tmedia_srtp_mode_e *|tmedia_srtp_mode_t *", 0, 0, (void*)0, 0}; @@ -23363,6 +23538,8 @@ static swig_type_info *swig_type_initial[] = { &_swigt__p_thttp_event_type_e, &_swigt__p_tmedia_bandwidth_level_e, &_swigt__p_tmedia_chroma_e, + &_swigt__p_tmedia_pref_video_size_s, + &_swigt__p_tmedia_profile_e, &_swigt__p_tmedia_qos_strength_e, &_swigt__p_tmedia_qos_stype_e, &_swigt__p_tmedia_srtp_mode_e, @@ -23452,6 +23629,8 @@ static swig_cast_info _swigc__p_tdav_codec_id_e[] = { {&_swigt__p_tdav_codec_id static swig_cast_info _swigc__p_thttp_event_type_e[] = { {&_swigt__p_thttp_event_type_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tmedia_bandwidth_level_e[] = { {&_swigt__p_tmedia_bandwidth_level_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tmedia_chroma_e[] = { {&_swigt__p_tmedia_chroma_e, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_tmedia_pref_video_size_s[] = { {&_swigt__p_tmedia_pref_video_size_s, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_tmedia_profile_e[] = { {&_swigt__p_tmedia_profile_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tmedia_qos_strength_e[] = { {&_swigt__p_tmedia_qos_strength_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tmedia_qos_stype_e[] = { {&_swigt__p_tmedia_qos_stype_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tmedia_srtp_mode_e[] = { {&_swigt__p_tmedia_srtp_mode_e, 0, 0, 0},{0, 0, 0, 0}}; @@ -23541,6 +23720,8 @@ static swig_cast_info *swig_cast_initial[] = { _swigc__p_thttp_event_type_e, _swigc__p_tmedia_bandwidth_level_e, _swigc__p_tmedia_chroma_e, + _swigc__p_tmedia_pref_video_size_s, + _swigc__p_tmedia_profile_e, _swigc__p_tmedia_qos_strength_e, _swigc__p_tmedia_qos_stype_e, _swigc__p_tmedia_srtp_mode_e, @@ -23608,8 +23789,11 @@ static swig_command_info swig_commands[] = { {"tinyWRAPc::MediaSessionMgr_findProxyPluginConsumer", _wrap_MediaSessionMgr_findProxyPluginConsumer}, {"tinyWRAPc::MediaSessionMgr_findProxyPluginProducer", _wrap_MediaSessionMgr_findProxyPluginProducer}, {"tinyWRAPc::MediaSessionMgr_getSessionId", _wrap_MediaSessionMgr_getSessionId}, +{"tinyWRAPc::MediaSessionMgr_defaultsSetProfile", _wrap_MediaSessionMgr_defaultsSetProfile}, +{"tinyWRAPc::MediaSessionMgr_defaultsGetProfile", _wrap_MediaSessionMgr_defaultsGetProfile}, {"tinyWRAPc::MediaSessionMgr_defaultsSetBandwidthLevel", _wrap_MediaSessionMgr_defaultsSetBandwidthLevel}, {"tinyWRAPc::MediaSessionMgr_defaultsGetBandwidthLevel", _wrap_MediaSessionMgr_defaultsGetBandwidthLevel}, +{"tinyWRAPc::MediaSessionMgr_defaultsSetPrefVideoSize", _wrap_MediaSessionMgr_defaultsSetPrefVideoSize}, {"tinyWRAPc::MediaSessionMgr_defaultsSetJbMargin", _wrap_MediaSessionMgr_defaultsSetJbMargin}, {"tinyWRAPc::MediaSessionMgr_defaultsSetJbMaxLateRate", _wrap_MediaSessionMgr_defaultsSetJbMaxLateRate}, {"tinyWRAPc::MediaSessionMgr_defaultsSetEchoTail", _wrap_MediaSessionMgr_defaultsSetEchoTail}, @@ -23637,6 +23821,7 @@ static swig_command_info swig_commands[] = { {"tinyWRAPc::MediaSessionMgr_defaultsGetVolume", _wrap_MediaSessionMgr_defaultsGetVolume}, {"tinyWRAPc::MediaSessionMgr_defaultsSetInviteSessionTimers", _wrap_MediaSessionMgr_defaultsSetInviteSessionTimers}, {"tinyWRAPc::MediaSessionMgr_defaultsSetSRtpMode", _wrap_MediaSessionMgr_defaultsSetSRtpMode}, +{"tinyWRAPc::MediaSessionMgr_defaultsSetIceEnabled", _wrap_MediaSessionMgr_defaultsSetIceEnabled}, {"tinyWRAPc::delete_MediaContent", _wrap_delete_MediaContent}, {"tinyWRAPc::MediaContent_getType", _wrap_MediaContent_getType}, {"tinyWRAPc::MediaContent_getDataLength", _wrap_MediaContent_getDataLength}, @@ -23736,6 +23921,7 @@ static swig_command_info swig_commands[] = { {"tinyWRAPc::CallSession_callVideo", _wrap_CallSession_callVideo}, {"tinyWRAPc::CallSession_setSessionTimer", _wrap_CallSession_setSessionTimer}, {"tinyWRAPc::CallSession_set100rel", _wrap_CallSession_set100rel}, +{"tinyWRAPc::CallSession_setICE", _wrap_CallSession_setICE}, {"tinyWRAPc::CallSession_setQoS", _wrap_CallSession_setQoS}, {"tinyWRAPc::CallSession_hold", _wrap_CallSession_hold}, {"tinyWRAPc::CallSession_resume", _wrap_CallSession_resume}, @@ -24009,242 +24195,242 @@ static swig_command_info swig_commands[] = { {"tinyWRAPc::MsrpCallback_OnEvent", _wrap_MsrpCallback_OnEvent}, {0,0} }; -/* ----------------------------------------------------------------------------- - * Type initialization: - * This problem is tough by the requirement that no dynamic - * memory is used. Also, since swig_type_info structures store pointers to - * swig_cast_info structures and swig_cast_info structures store pointers back - * to swig_type_info structures, we need some lookup code at initialization. - * The idea is that swig generates all the structures that are needed. - * The runtime then collects these partially filled structures. - * The SWIG_InitializeModule function takes these initial arrays out of - * swig_module, and does all the lookup, filling in the swig_module.types - * array with the correct data and linking the correct swig_cast_info - * structures together. - * - * The generated swig_type_info structures are assigned staticly to an initial - * array. We just loop through that array, and handle each type individually. - * First we lookup if this type has been already loaded, and if so, use the - * loaded structure instead of the generated one. Then we have to fill in the - * cast linked list. The cast data is initially stored in something like a - * two-dimensional array. Each row corresponds to a type (there are the same - * number of rows as there are in the swig_type_initial array). Each entry in - * a column is one of the swig_cast_info structures for that type. - * The cast_initial array is actually an array of arrays, because each row has - * a variable number of columns. So to actually build the cast linked list, - * we find the array of casts associated with the type, and loop through it - * adding the casts to the list. The one last trick we need to do is making - * sure the type pointer in the swig_cast_info struct is correct. - * - * First off, we lookup the cast->type name to see if it is already loaded. - * There are three cases to handle: - * 1) If the cast->type has already been loaded AND the type we are adding - * casting info to has not been loaded (it is in this module), THEN we - * replace the cast->type pointer with the type pointer that has already - * been loaded. - * 2) If BOTH types (the one we are adding casting info to, and the - * cast->type) are loaded, THEN the cast info has already been loaded by - * the previous module so we just ignore it. - * 3) Finally, if cast->type has not already been loaded, then we add that - * swig_cast_info to the linked list (because the cast->type) pointer will - * be correct. - * ----------------------------------------------------------------------------- */ +/* ----------------------------------------------------------------------------- + * Type initialization: + * This problem is tough by the requirement that no dynamic + * memory is used. Also, since swig_type_info structures store pointers to + * swig_cast_info structures and swig_cast_info structures store pointers back + * to swig_type_info structures, we need some lookup code at initialization. + * The idea is that swig generates all the structures that are needed. + * The runtime then collects these partially filled structures. + * The SWIG_InitializeModule function takes these initial arrays out of + * swig_module, and does all the lookup, filling in the swig_module.types + * array with the correct data and linking the correct swig_cast_info + * structures together. + * + * The generated swig_type_info structures are assigned staticly to an initial + * array. We just loop through that array, and handle each type individually. + * First we lookup if this type has been already loaded, and if so, use the + * loaded structure instead of the generated one. Then we have to fill in the + * cast linked list. The cast data is initially stored in something like a + * two-dimensional array. Each row corresponds to a type (there are the same + * number of rows as there are in the swig_type_initial array). Each entry in + * a column is one of the swig_cast_info structures for that type. + * The cast_initial array is actually an array of arrays, because each row has + * a variable number of columns. So to actually build the cast linked list, + * we find the array of casts associated with the type, and loop through it + * adding the casts to the list. The one last trick we need to do is making + * sure the type pointer in the swig_cast_info struct is correct. + * + * First off, we lookup the cast->type name to see if it is already loaded. + * There are three cases to handle: + * 1) If the cast->type has already been loaded AND the type we are adding + * casting info to has not been loaded (it is in this module), THEN we + * replace the cast->type pointer with the type pointer that has already + * been loaded. + * 2) If BOTH types (the one we are adding casting info to, and the + * cast->type) are loaded, THEN the cast info has already been loaded by + * the previous module so we just ignore it. + * 3) Finally, if cast->type has not already been loaded, then we add that + * swig_cast_info to the linked list (because the cast->type) pointer will + * be correct. + * ----------------------------------------------------------------------------- */ -#ifdef __cplusplus +#ifdef __cplusplus extern "C" { -#if 0 -} /* c-mode */ -#endif -#endif +#if 0 +} /* c-mode */ +#endif +#endif -#if 0 -#define SWIGRUNTIME_DEBUG -#endif +#if 0 +#define SWIGRUNTIME_DEBUG +#endif -SWIGRUNTIME void +SWIGRUNTIME void SWIG_InitializeModule(void *clientdata) { - size_t i; - swig_module_info *module_head, *iter; - int found, init; + size_t i; + swig_module_info *module_head, *iter; + int found, init; - clientdata = clientdata; + clientdata = clientdata; - /* check to see if the circular list has been setup, if not, set it up */ + /* check to see if the circular list has been setup, if not, set it up */ if (swig_module.next==0) { - /* Initialize the swig_module */ - swig_module.type_initial = swig_type_initial; - swig_module.cast_initial = swig_cast_initial; - swig_module.next = &swig_module; - init = 1; + /* Initialize the swig_module */ + swig_module.type_initial = swig_type_initial; + swig_module.cast_initial = swig_cast_initial; + swig_module.next = &swig_module; + init = 1; } else { - init = 0; - } + init = 0; + } - /* Try and load any already created modules */ - module_head = SWIG_GetModule(clientdata); + /* Try and load any already created modules */ + module_head = SWIG_GetModule(clientdata); if (!module_head) { - /* This is the first module loaded for this interpreter */ - /* so set the swig module into the interpreter */ - SWIG_SetModule(clientdata, &swig_module); - module_head = &swig_module; + /* This is the first module loaded for this interpreter */ + /* so set the swig module into the interpreter */ + SWIG_SetModule(clientdata, &swig_module); + module_head = &swig_module; } else { - /* the interpreter has loaded a SWIG module, but has it loaded this one? */ - found=0; - iter=module_head; + /* the interpreter has loaded a SWIG module, but has it loaded this one? */ + found=0; + iter=module_head; do { if (iter==&swig_module) { - found=1; - break; - } - iter=iter->next; - } while (iter!= module_head); + found=1; + break; + } + iter=iter->next; + } while (iter!= module_head); - /* if the is found in the list, then all is done and we may leave */ - if (found) return; - /* otherwise we must add out module into the list */ - swig_module.next = module_head->next; - module_head->next = &swig_module; - } + /* if the is found in the list, then all is done and we may leave */ + if (found) return; + /* otherwise we must add out module into the list */ + swig_module.next = module_head->next; + module_head->next = &swig_module; + } - /* When multiple interpeters are used, a module could have already been initialized in - a different interpreter, but not yet have a pointer in this interpreter. - In this case, we do not want to continue adding types... everything should be - set up already */ - if (init == 0) return; + /* When multiple interpeters are used, a module could have already been initialized in + a different interpreter, but not yet have a pointer in this interpreter. + In this case, we do not want to continue adding types... everything should be + set up already */ + if (init == 0) return; - /* Now work on filling in swig_module.types */ -#ifdef SWIGRUNTIME_DEBUG - printf("SWIG_InitializeModule: size %d\n", swig_module.size); -#endif + /* Now work on filling in swig_module.types */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: size %d\n", swig_module.size); +#endif for (i = 0; i < swig_module.size; ++i) { - swig_type_info *type = 0; - swig_type_info *ret; - swig_cast_info *cast; + swig_type_info *type = 0; + swig_type_info *ret; + swig_cast_info *cast; -#ifdef SWIGRUNTIME_DEBUG - printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); -#endif +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); +#endif - /* if there is another module already loaded */ + /* if there is another module already loaded */ if (swig_module.next != &swig_module) { - type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); - } + type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); + } if (type) { - /* Overwrite clientdata field */ -#ifdef SWIGRUNTIME_DEBUG - printf("SWIG_InitializeModule: found type %s\n", type->name); -#endif + /* Overwrite clientdata field */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found type %s\n", type->name); +#endif if (swig_module.type_initial[i]->clientdata) { - type->clientdata = swig_module.type_initial[i]->clientdata; -#ifdef SWIGRUNTIME_DEBUG - printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); -#endif - } + type->clientdata = swig_module.type_initial[i]->clientdata; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); +#endif + } } else { - type = swig_module.type_initial[i]; - } + type = swig_module.type_initial[i]; + } - /* Insert casting types */ - cast = swig_module.cast_initial[i]; + /* Insert casting types */ + cast = swig_module.cast_initial[i]; while (cast->type) { - /* Don't need to add information already in the list */ - ret = 0; -#ifdef SWIGRUNTIME_DEBUG - printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); -#endif + /* Don't need to add information already in the list */ + ret = 0; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); +#endif if (swig_module.next != &swig_module) { - ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); -#ifdef SWIGRUNTIME_DEBUG - if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); -#endif - } + ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); +#ifdef SWIGRUNTIME_DEBUG + if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); +#endif + } if (ret) { if (type == swig_module.type_initial[i]) { -#ifdef SWIGRUNTIME_DEBUG - printf("SWIG_InitializeModule: skip old type %s\n", ret->name); -#endif - cast->type = ret; - ret = 0; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: skip old type %s\n", ret->name); +#endif + cast->type = ret; + ret = 0; } else { - /* Check for casting already in the list */ - swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); -#ifdef SWIGRUNTIME_DEBUG - if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); -#endif - if (!ocast) ret = 0; - } - } + /* Check for casting already in the list */ + swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); +#ifdef SWIGRUNTIME_DEBUG + if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); +#endif + if (!ocast) ret = 0; + } + } if (!ret) { -#ifdef SWIGRUNTIME_DEBUG - printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); -#endif +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); +#endif if (type->cast) { - type->cast->prev = cast; - cast->next = type->cast; - } - type->cast = cast; - } - cast++; - } - /* Set entry in modules->types array equal to the type */ - swig_module.types[i] = type; - } - swig_module.types[i] = 0; + type->cast->prev = cast; + cast->next = type->cast; + } + type->cast = cast; + } + cast++; + } + /* Set entry in modules->types array equal to the type */ + swig_module.types[i] = type; + } + swig_module.types[i] = 0; -#ifdef SWIGRUNTIME_DEBUG - printf("**** SWIG_InitializeModule: Cast List ******\n"); +#ifdef SWIGRUNTIME_DEBUG + printf("**** SWIG_InitializeModule: Cast List ******\n"); for (i = 0; i < swig_module.size; ++i) { - int j = 0; - swig_cast_info *cast = swig_module.cast_initial[i]; - printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); + int j = 0; + swig_cast_info *cast = swig_module.cast_initial[i]; + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); while (cast->type) { - printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); - cast++; - ++j; - } - printf("---- Total casts: %d\n",j); - } - printf("**** SWIG_InitializeModule: Cast List ******\n"); -#endif -} + printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); + cast++; + ++j; + } + printf("---- Total casts: %d\n",j); + } + printf("**** SWIG_InitializeModule: Cast List ******\n"); +#endif +} -/* This function will propagate the clientdata field of type to -* any new swig_type_info structures that have been added into the list -* of equivalent types. It is like calling -* SWIG_TypeClientData(type, clientdata) a second time. -*/ -SWIGRUNTIME void +/* This function will propagate the clientdata field of type to +* any new swig_type_info structures that have been added into the list +* of equivalent types. It is like calling +* SWIG_TypeClientData(type, clientdata) a second time. +*/ +SWIGRUNTIME void SWIG_PropagateClientData(void) { - size_t i; - swig_cast_info *equiv; - static int init_run = 0; + size_t i; + swig_cast_info *equiv; + static int init_run = 0; - if (init_run) return; - init_run = 1; + if (init_run) return; + init_run = 1; for (i = 0; i < swig_module.size; i++) { if (swig_module.types[i]->clientdata) { - equiv = swig_module.types[i]->cast; + equiv = swig_module.types[i]->cast; while (equiv) { if (!equiv->converter) { - if (equiv->type && !equiv->type->clientdata) - SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); - } - equiv = equiv->next; - } - } - } -} + if (equiv->type && !equiv->type->clientdata) + SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); + } + equiv = equiv->next; + } + } + } +} -#ifdef __cplusplus -#if 0 +#ifdef __cplusplus +#if 0 { - /* c-mode */ -#endif -} -#endif + /* c-mode */ +#endif +} +#endif @@ -24303,27 +24489,27 @@ XS(SWIG_init) { SWIG_TypeClientData(SWIGTYPE_p_DDebugCallback, (void*) "tinyWRAP::DDebugCallback"); SWIG_TypeClientData(SWIGTYPE_p_AudioResampler, (void*) "tinyWRAP::AudioResampler"); - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_media_none", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_media_none))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_media_audio", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_media_audio))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_media_video", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_media_video))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_media_audiovideo", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_media_audiovideo))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_media_msrp", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_media_msrp))); SvREADONLY_on(sv); @@ -24355,22 +24541,22 @@ XS(SWIG_init) { SWIG_TypeClientData(SWIGTYPE_p_PublicationSession, (void*) "tinyWRAP::PublicationSession"); SWIG_TypeClientData(SWIGTYPE_p_RegistrationSession, (void*) "tinyWRAP::RegistrationSession"); SWIG_TypeClientData(SWIGTYPE_p_SubscriptionSession, (void*) "tinyWRAP::SubscriptionSession"); - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_proxy_plugin_audio_producer", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_proxy_plugin_audio_producer))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_proxy_plugin_video_producer", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_proxy_plugin_video_producer))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_proxy_plugin_audio_consumer", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_proxy_plugin_audio_consumer))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_proxy_plugin_video_consumer", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_proxy_plugin_video_consumer))); SvREADONLY_on(sv); @@ -24390,677 +24576,762 @@ XS(SWIG_init) { SWIG_TypeClientData(SWIGTYPE_p_SipCallback, (void*) "tinyWRAP::SipCallback"); SWIG_TypeClientData(SWIGTYPE_p_SafeObject, (void*) "tinyWRAP::SafeObject"); SWIG_TypeClientData(SWIGTYPE_p_SipStack, (void*) "tinyWRAP::SipStack"); - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_NONE", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_NONE))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_ACK", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_ACK))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_BYE", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_BYE))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_CANCEL", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_CANCEL))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_INVITE", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_INVITE))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_OPTIONS", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_OPTIONS))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_REGISTER", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_REGISTER))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_SUBSCRIBE", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_SUBSCRIBE))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_NOTIFY", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_NOTIFY))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_REFER", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_REFER))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_INFO", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_INFO))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_UPDATE", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_UPDATE))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_MESSAGE", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_MESSAGE))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_PUBLISH", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_PUBLISH))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_PRACK", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_PRACK))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_invite", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_event_invite))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_message", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_event_message))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_info", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_event_info))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_options", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_event_options))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_publish", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_event_publish))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_register", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_event_register))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_subscribe", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_event_subscribe))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_dialog", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_event_dialog))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_code_dialog_transport_error", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(702))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_code_dialog_global_error", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(703))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_code_dialog_message_error", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(704))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_code_dialog_request_incoming", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(800))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_code_dialog_request_outgoing", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(802))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_code_dialog_request_cancelled", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(803))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_code_dialog_request_sent", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(804))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_code_dialog_connecting", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(900))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_code_dialog_connected", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(901))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_code_dialog_terminating", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(902))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_code_dialog_terminated", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(903))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_code_stack_started", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(950))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_code_stack_stopped", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(951))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_code_stack_failed_to_start", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(952))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_event_code_stack_failed_to_stop", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(953))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_newreg", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_newreg))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_register", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_register))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_ao_register", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_ao_register))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_unregister", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_unregister))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_ao_unregister", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_ao_unregister))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_subscribe", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_subscribe))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_ao_subscribe", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_ao_subscribe))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_unsubscribe", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_unsubscribe))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_ao_unsubscribe", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_ao_unsubscribe))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_notify", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_notify))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_ao_notify", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_ao_notify))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_publish", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_publish))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_ao_publish", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_ao_publish))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_unpublish", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_unpublish))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_ao_unpublish", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_ao_unpublish))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_message", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_message))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_ao_message", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_ao_message))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_info", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_info))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_ao_info", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_ao_info))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_options", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_options))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_ao_options", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_ao_options))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_newcall", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_newcall))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_request", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_request))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_ao_request", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_ao_request))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_o_ect_trying", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_o_ect_trying))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_o_ect_accepted", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_o_ect_accepted))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_o_ect_completed", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_o_ect_completed))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_o_ect_failed", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_o_ect_failed))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_o_ect_notify", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_o_ect_notify))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_ect_requested", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_ect_requested))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_ect_newcall", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_ect_newcall))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_ect_completed", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_ect_completed))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_ect_failed", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_ect_failed))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_i_ect_notify", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_i_ect_notify))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_m_early_media", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_m_early_media))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_m_updating", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_m_updating))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_m_updated", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_m_updated))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_m_local_hold_ok", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_m_local_hold_ok))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_m_local_hold_nok", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_m_local_hold_nok))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_m_local_resume_ok", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_m_local_resume_ok))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_m_local_resume_nok", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_m_local_resume_nok))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_m_remote_hold", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_m_remote_hold))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tsip_m_remote_resume", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tsip_m_remote_resume))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { - SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_none", TRUE | 0x2 | GV_ADDMULTI); - sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_none))); - SvREADONLY_on(sv); - } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { - SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_rgb24", TRUE | 0x2 | GV_ADDMULTI); - sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_rgb24))); - SvREADONLY_on(sv); - } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { - SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_bgr24", TRUE | 0x2 | GV_ADDMULTI); - sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_bgr24))); - SvREADONLY_on(sv); - } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { - SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_rgb32", TRUE | 0x2 | GV_ADDMULTI); - sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_rgb32))); - SvREADONLY_on(sv); - } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { - SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_rgb565le", TRUE | 0x2 | GV_ADDMULTI); - sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_rgb565le))); - SvREADONLY_on(sv); - } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { - SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_rgb565be", TRUE | 0x2 | GV_ADDMULTI); - sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_rgb565be))); - SvREADONLY_on(sv); - } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { - SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_nv12", TRUE | 0x2 | GV_ADDMULTI); - sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_nv12))); - SvREADONLY_on(sv); - } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { - SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_nv21", TRUE | 0x2 | GV_ADDMULTI); - sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_nv21))); - SvREADONLY_on(sv); - } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { - SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_yuv422p", TRUE | 0x2 | GV_ADDMULTI); - sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_yuv422p))); - SvREADONLY_on(sv); - } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { - SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_uyvy422", TRUE | 0x2 | GV_ADDMULTI); - sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_uyvy422))); - SvREADONLY_on(sv); - } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { - SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_yuv420p", TRUE | 0x2 | GV_ADDMULTI); - sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_yuv420p))); - SvREADONLY_on(sv); - } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { - SV *sv = get_sv((char*) SWIG_prefix "tmedia_srtp_mode_none", TRUE | 0x2 | GV_ADDMULTI); - sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_srtp_mode_none))); - SvREADONLY_on(sv); - } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { - SV *sv = get_sv((char*) SWIG_prefix "tmedia_srtp_mode_optional", TRUE | 0x2 | GV_ADDMULTI); - sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_srtp_mode_optional))); - SvREADONLY_on(sv); - } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { - SV *sv = get_sv((char*) SWIG_prefix "tmedia_srtp_mode_mandatory", TRUE | 0x2 | GV_ADDMULTI); - sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_srtp_mode_mandatory))); - SvREADONLY_on(sv); - } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmedia_qos_stype_none", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_qos_stype_none))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmedia_qos_stype_segmented", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_qos_stype_segmented))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmedia_qos_stype_e2e", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_qos_stype_e2e))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmedia_qos_strength_none", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_qos_strength_none))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmedia_qos_strength_failure", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_qos_strength_failure))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmedia_qos_strength_unknown", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_qos_strength_unknown))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmedia_qos_strength_optional", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_qos_strength_optional))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmedia_qos_strength_mandatory", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_qos_strength_mandatory))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_none", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_none))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_rgb24", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_rgb24))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_bgr24", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_bgr24))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_rgb32", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_rgb32))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_rgb565le", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_rgb565le))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_rgb565be", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_rgb565be))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_nv12", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_nv12))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_nv21", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_nv21))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_yuv422p", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_yuv422p))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_uyvy422", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_uyvy422))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_chroma_yuv420p", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_yuv420p))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_srtp_mode_none", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_srtp_mode_none))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_srtp_mode_optional", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_srtp_mode_optional))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_srtp_mode_mandatory", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_srtp_mode_mandatory))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_profile_default", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_profile_default))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_profile_rtcweb", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_profile_rtcweb))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmedia_bl_low", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_bl_low))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmedia_bl_medium", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_bl_medium))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmedia_bl_hight", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_bl_hight))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmedia_bl_unrestricted", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_bl_unrestricted))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_pref_video_size_sqcif", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_pref_video_size_sqcif))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_pref_video_size_qcif", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_pref_video_size_qcif))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_pref_video_size_qvga", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_pref_video_size_qvga))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_pref_video_size_cif", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_pref_video_size_cif))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_pref_video_size_hvga", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_pref_video_size_hvga))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_pref_video_size_vga", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_pref_video_size_vga))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_pref_video_size_4cif", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_pref_video_size_4cif))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_pref_video_size_svga", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_pref_video_size_svga))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_pref_video_size_480p", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_pref_video_size_480p))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_pref_video_size_720p", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_pref_video_size_720p))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_pref_video_size_16cif", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_pref_video_size_16cif))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tmedia_pref_video_size_1080p", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_pref_video_size_1080p))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_none", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_none))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_amr_nb_oa", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_amr_nb_oa))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_amr_nb_be", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_amr_nb_be))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_amr_wb_oa", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_amr_wb_oa))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_amr_wb_be", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_amr_wb_be))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_gsm", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_gsm))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_pcma", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_pcma))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_pcmu", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_pcmu))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_ilbc", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_ilbc))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_speex_nb", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_speex_nb))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_speex_wb", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_speex_wb))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_speex_uwb", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_speex_uwb))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_bv16", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_bv16))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_bv32", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_bv32))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_evrc", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_evrc))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_g729ab", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_g729ab))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_g722", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_g722))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_h261", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_h261))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_h263", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_h263))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_h263p", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_h263p))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_h263pp", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_h263pp))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_h264_bp", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_h264_bp))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_h264_mp", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_h264_mp))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_h264_hp", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_h264_hp))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_h264_bp10", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_h264_bp10))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_h264_bp20", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_h264_bp20))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_h264_bp30", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_h264_bp30))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_h264_svc", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_h264_svc))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_theora", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_theora))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_mp4ves_es", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_mp4ves_es))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tdav_codec_id_vp8", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tdav_codec_id_vp8))); SvREADONLY_on(sv); @@ -25070,82 +25341,82 @@ XS(SWIG_init) { SWIG_TypeClientData(SWIGTYPE_p_XcapEvent, (void*) "tinyWRAP::XcapEvent"); SWIG_TypeClientData(SWIGTYPE_p_XcapCallback, (void*) "tinyWRAP::XcapCallback"); SWIG_TypeClientData(SWIGTYPE_p_XcapStack, (void*) "tinyWRAP::XcapStack"); - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "thttp_event_dialog_started", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(thttp_event_dialog_started))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "thttp_event_message", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(thttp_event_message))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "thttp_event_auth_failed", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(thttp_event_auth_failed))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "thttp_event_closed", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(thttp_event_closed))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "thttp_event_transport_error", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(thttp_event_transport_error))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "thttp_event_dialog_terminated", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(thttp_event_dialog_terminated))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_rpmessage_type_sms_none", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_rpmessage_type_sms_none))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_rpmessage_type_sms_submit", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_rpmessage_type_sms_submit))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_rpmessage_type_sms_deliver", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_rpmessage_type_sms_deliver))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_rpmessage_type_sms_ack", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_rpmessage_type_sms_ack))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_rpmessage_type_sms_error", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_rpmessage_type_sms_error))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_sms_type_none", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_sms_type_none))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_sms_type_rpdata", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_sms_type_rpdata))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_sms_type_smma", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_sms_type_smma))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_sms_type_ack", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_sms_type_ack))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "twrap_sms_type_error", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(twrap_sms_type_error))); SvREADONLY_on(sv); @@ -25156,42 +25427,42 @@ XS(SWIG_init) { SWIG_TypeClientData(SWIGTYPE_p_MsrpMessage, (void*) "tinyWRAP::MsrpMessage"); SWIG_TypeClientData(SWIGTYPE_p_MsrpEvent, (void*) "tinyWRAP::MsrpEvent"); SWIG_TypeClientData(SWIGTYPE_p_MsrpCallback, (void*) "tinyWRAP::MsrpCallback"); - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmsrp_NONE", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmsrp_NONE))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmsrp_SEND", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmsrp_SEND))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmsrp_REPORT", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmsrp_REPORT))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmsrp_AUTH", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmsrp_AUTH))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmsrp_event_type_none", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmsrp_event_type_none))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmsrp_event_type_connected", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmsrp_event_type_connected))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmsrp_event_type_disconnected", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmsrp_event_type_disconnected))); SvREADONLY_on(sv); } while(0) /*@SWIG@*/; - /*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do { + /*@SWIG:/usr/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { SV *sv = get_sv((char*) SWIG_prefix "tmsrp_event_type_message", TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmsrp_event_type_message))); SvREADONLY_on(sv); diff --git a/branches/2.0/doubango/bindings/python/tinyWRAP.py b/branches/2.0/doubango/bindings/python/tinyWRAP.py index e59bbed5..51c5a34c 100644 --- a/branches/2.0/doubango/bindings/python/tinyWRAP.py +++ b/branches/2.0/doubango/bindings/python/tinyWRAP.py @@ -1,21 +1,28 @@ # This file was automatically generated by SWIG (http://www.swig.org). -# Version 1.3.39 +# Version 2.0.4 # # Do not make changes to this file unless you know what you are doing--modify # the SWIG interface file instead. -# This file is compatible with both classic and new-style classes. + + from sys import version_info if version_info >= (2,6,0): def swig_import_helper(): from os.path import dirname import imp + fp = None try: fp, pathname, description = imp.find_module('_tinyWRAP', [dirname(__file__)]) - _mod = imp.load_module('_tinyWRAP', fp, pathname, description) - finally: - if fp is not None: fp.close() - return _mod + except ImportError: + import _tinyWRAP + return _tinyWRAP + if fp is not None: + try: + _mod = imp.load_module('_tinyWRAP', fp, pathname, description) + finally: + fp.close() + return _mod _tinyWRAP = swig_import_helper() del swig_import_helper else: @@ -33,7 +40,7 @@ def _swig_setattr_nondynamic(self,class_type,name,value,static=1): return method = class_type.__swig_setmethods__.get(name,None) if method: return method(self,value) - if (not static) or hasattr(self,name): + if (not static): self.__dict__[name] = value else: raise AttributeError("You cannot add attributes to %s" % self) @@ -156,10 +163,16 @@ class MediaSessionMgr(_object): def findProxyPluginConsumer(self, *args): return _tinyWRAP.MediaSessionMgr_findProxyPluginConsumer(self, *args) def findProxyPluginProducer(self, *args): return _tinyWRAP.MediaSessionMgr_findProxyPluginProducer(self, *args) def getSessionId(self, *args): return _tinyWRAP.MediaSessionMgr_getSessionId(self, *args) + __swig_getmethods__["defaultsSetProfile"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsSetProfile + if _newclass:defaultsSetProfile = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsSetProfile) + __swig_getmethods__["defaultsGetProfile"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsGetProfile + if _newclass:defaultsGetProfile = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsGetProfile) __swig_getmethods__["defaultsSetBandwidthLevel"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsSetBandwidthLevel if _newclass:defaultsSetBandwidthLevel = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsSetBandwidthLevel) __swig_getmethods__["defaultsGetBandwidthLevel"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsGetBandwidthLevel if _newclass:defaultsGetBandwidthLevel = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsGetBandwidthLevel) + __swig_getmethods__["defaultsSetPrefVideoSize"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsSetPrefVideoSize + if _newclass:defaultsSetPrefVideoSize = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsSetPrefVideoSize) __swig_getmethods__["defaultsSetJbMargin"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsSetJbMargin if _newclass:defaultsSetJbMargin = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsSetJbMargin) __swig_getmethods__["defaultsSetJbMaxLateRate"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsSetJbMaxLateRate @@ -214,9 +227,19 @@ class MediaSessionMgr(_object): if _newclass:defaultsSetInviteSessionTimers = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsSetInviteSessionTimers) __swig_getmethods__["defaultsSetSRtpMode"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsSetSRtpMode if _newclass:defaultsSetSRtpMode = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsSetSRtpMode) + __swig_getmethods__["defaultsSetIceEnabled"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsSetIceEnabled + if _newclass:defaultsSetIceEnabled = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsSetIceEnabled) MediaSessionMgr_swigregister = _tinyWRAP.MediaSessionMgr_swigregister MediaSessionMgr_swigregister(MediaSessionMgr) +def MediaSessionMgr_defaultsSetProfile(*args): + return _tinyWRAP.MediaSessionMgr_defaultsSetProfile(*args) +MediaSessionMgr_defaultsSetProfile = _tinyWRAP.MediaSessionMgr_defaultsSetProfile + +def MediaSessionMgr_defaultsGetProfile(): + return _tinyWRAP.MediaSessionMgr_defaultsGetProfile() +MediaSessionMgr_defaultsGetProfile = _tinyWRAP.MediaSessionMgr_defaultsGetProfile + def MediaSessionMgr_defaultsSetBandwidthLevel(*args): return _tinyWRAP.MediaSessionMgr_defaultsSetBandwidthLevel(*args) MediaSessionMgr_defaultsSetBandwidthLevel = _tinyWRAP.MediaSessionMgr_defaultsSetBandwidthLevel @@ -225,6 +248,10 @@ def MediaSessionMgr_defaultsGetBandwidthLevel(): return _tinyWRAP.MediaSessionMgr_defaultsGetBandwidthLevel() MediaSessionMgr_defaultsGetBandwidthLevel = _tinyWRAP.MediaSessionMgr_defaultsGetBandwidthLevel +def MediaSessionMgr_defaultsSetPrefVideoSize(*args): + return _tinyWRAP.MediaSessionMgr_defaultsSetPrefVideoSize(*args) +MediaSessionMgr_defaultsSetPrefVideoSize = _tinyWRAP.MediaSessionMgr_defaultsSetPrefVideoSize + def MediaSessionMgr_defaultsSetJbMargin(*args): return _tinyWRAP.MediaSessionMgr_defaultsSetJbMargin(*args) MediaSessionMgr_defaultsSetJbMargin = _tinyWRAP.MediaSessionMgr_defaultsSetJbMargin @@ -333,12 +360,16 @@ def MediaSessionMgr_defaultsSetSRtpMode(*args): return _tinyWRAP.MediaSessionMgr_defaultsSetSRtpMode(*args) MediaSessionMgr_defaultsSetSRtpMode = _tinyWRAP.MediaSessionMgr_defaultsSetSRtpMode +def MediaSessionMgr_defaultsSetIceEnabled(*args): + return _tinyWRAP.MediaSessionMgr_defaultsSetIceEnabled(*args) +MediaSessionMgr_defaultsSetIceEnabled = _tinyWRAP.MediaSessionMgr_defaultsSetIceEnabled + class MediaContent(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, MediaContent, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, MediaContent, name) - def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined - class is abstract") __repr__ = _swig_repr __swig_destroy__ = _tinyWRAP.delete_MediaContent __del__ = lambda self : None; @@ -668,6 +699,7 @@ class CallSession(InviteSession): def callVideo(self, *args): return _tinyWRAP.CallSession_callVideo(self, *args) def setSessionTimer(self, *args): return _tinyWRAP.CallSession_setSessionTimer(self, *args) def set100rel(self, *args): return _tinyWRAP.CallSession_set100rel(self, *args) + def setICE(self, *args): return _tinyWRAP.CallSession_setICE(self, *args) def setQoS(self, *args): return _tinyWRAP.CallSession_setQoS(self, *args) def hold(self, *args): return _tinyWRAP.CallSession_hold(self, *args) def resume(self, *args): return _tinyWRAP.CallSession_resume(self, *args) @@ -1366,6 +1398,14 @@ tsip_m_local_resume_ok = _tinyWRAP.tsip_m_local_resume_ok tsip_m_local_resume_nok = _tinyWRAP.tsip_m_local_resume_nok tsip_m_remote_hold = _tinyWRAP.tsip_m_remote_hold tsip_m_remote_resume = _tinyWRAP.tsip_m_remote_resume +tmedia_qos_stype_none = _tinyWRAP.tmedia_qos_stype_none +tmedia_qos_stype_segmented = _tinyWRAP.tmedia_qos_stype_segmented +tmedia_qos_stype_e2e = _tinyWRAP.tmedia_qos_stype_e2e +tmedia_qos_strength_none = _tinyWRAP.tmedia_qos_strength_none +tmedia_qos_strength_failure = _tinyWRAP.tmedia_qos_strength_failure +tmedia_qos_strength_unknown = _tinyWRAP.tmedia_qos_strength_unknown +tmedia_qos_strength_optional = _tinyWRAP.tmedia_qos_strength_optional +tmedia_qos_strength_mandatory = _tinyWRAP.tmedia_qos_strength_mandatory tmedia_chroma_none = _tinyWRAP.tmedia_chroma_none tmedia_chroma_rgb24 = _tinyWRAP.tmedia_chroma_rgb24 tmedia_chroma_bgr24 = _tinyWRAP.tmedia_chroma_bgr24 @@ -1380,18 +1420,24 @@ tmedia_chroma_yuv420p = _tinyWRAP.tmedia_chroma_yuv420p tmedia_srtp_mode_none = _tinyWRAP.tmedia_srtp_mode_none tmedia_srtp_mode_optional = _tinyWRAP.tmedia_srtp_mode_optional tmedia_srtp_mode_mandatory = _tinyWRAP.tmedia_srtp_mode_mandatory -tmedia_qos_stype_none = _tinyWRAP.tmedia_qos_stype_none -tmedia_qos_stype_segmented = _tinyWRAP.tmedia_qos_stype_segmented -tmedia_qos_stype_e2e = _tinyWRAP.tmedia_qos_stype_e2e -tmedia_qos_strength_none = _tinyWRAP.tmedia_qos_strength_none -tmedia_qos_strength_failure = _tinyWRAP.tmedia_qos_strength_failure -tmedia_qos_strength_unknown = _tinyWRAP.tmedia_qos_strength_unknown -tmedia_qos_strength_optional = _tinyWRAP.tmedia_qos_strength_optional -tmedia_qos_strength_mandatory = _tinyWRAP.tmedia_qos_strength_mandatory +tmedia_profile_default = _tinyWRAP.tmedia_profile_default +tmedia_profile_rtcweb = _tinyWRAP.tmedia_profile_rtcweb tmedia_bl_low = _tinyWRAP.tmedia_bl_low tmedia_bl_medium = _tinyWRAP.tmedia_bl_medium tmedia_bl_hight = _tinyWRAP.tmedia_bl_hight tmedia_bl_unrestricted = _tinyWRAP.tmedia_bl_unrestricted +tmedia_pref_video_size_sqcif = _tinyWRAP.tmedia_pref_video_size_sqcif +tmedia_pref_video_size_qcif = _tinyWRAP.tmedia_pref_video_size_qcif +tmedia_pref_video_size_qvga = _tinyWRAP.tmedia_pref_video_size_qvga +tmedia_pref_video_size_cif = _tinyWRAP.tmedia_pref_video_size_cif +tmedia_pref_video_size_hvga = _tinyWRAP.tmedia_pref_video_size_hvga +tmedia_pref_video_size_vga = _tinyWRAP.tmedia_pref_video_size_vga +tmedia_pref_video_size_4cif = _tinyWRAP.tmedia_pref_video_size_4cif +tmedia_pref_video_size_svga = _tinyWRAP.tmedia_pref_video_size_svga +tmedia_pref_video_size_480p = _tinyWRAP.tmedia_pref_video_size_480p +tmedia_pref_video_size_720p = _tinyWRAP.tmedia_pref_video_size_720p +tmedia_pref_video_size_16cif = _tinyWRAP.tmedia_pref_video_size_16cif +tmedia_pref_video_size_1080p = _tinyWRAP.tmedia_pref_video_size_1080p tdav_codec_id_none = _tinyWRAP.tdav_codec_id_none tdav_codec_id_amr_nb_oa = _tinyWRAP.tdav_codec_id_amr_nb_oa tdav_codec_id_amr_nb_be = _tinyWRAP.tdav_codec_id_amr_nb_be @@ -1413,6 +1459,9 @@ tdav_codec_id_h261 = _tinyWRAP.tdav_codec_id_h261 tdav_codec_id_h263 = _tinyWRAP.tdav_codec_id_h263 tdav_codec_id_h263p = _tinyWRAP.tdav_codec_id_h263p tdav_codec_id_h263pp = _tinyWRAP.tdav_codec_id_h263pp +tdav_codec_id_h264_bp = _tinyWRAP.tdav_codec_id_h264_bp +tdav_codec_id_h264_mp = _tinyWRAP.tdav_codec_id_h264_mp +tdav_codec_id_h264_hp = _tinyWRAP.tdav_codec_id_h264_hp tdav_codec_id_h264_bp10 = _tinyWRAP.tdav_codec_id_h264_bp10 tdav_codec_id_h264_bp20 = _tinyWRAP.tdav_codec_id_h264_bp20 tdav_codec_id_h264_bp30 = _tinyWRAP.tdav_codec_id_h264_bp30 @@ -1707,5 +1756,6 @@ tmsrp_event_type_none = _tinyWRAP.tmsrp_event_type_none tmsrp_event_type_connected = _tinyWRAP.tmsrp_event_type_connected tmsrp_event_type_disconnected = _tinyWRAP.tmsrp_event_type_disconnected tmsrp_event_type_message = _tinyWRAP.tmsrp_event_type_message +# This file is compatible with both classic and new-style classes. diff --git a/branches/2.0/doubango/bindings/python/tinyWRAP_wrap.cxx b/branches/2.0/doubango/bindings/python/tinyWRAP_wrap.cxx index 1a4d05b3..b9753bc0 100644 --- a/branches/2.0/doubango/bindings/python/tinyWRAP_wrap.cxx +++ b/branches/2.0/doubango/bindings/python/tinyWRAP_wrap.cxx @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make @@ -36,2605 +36,2899 @@ template T SwigValueInit() { } #endif -/* ----------------------------------------------------------------------------- - * This section contains generic SWIG labels for method/variable - * declarations/attributes, and other compiler dependent labels. - * ----------------------------------------------------------------------------- */ - -/* template workaround for compilers that cannot correctly implement the C++ standard */ -#ifndef SWIGTEMPLATEDISAMBIGUATOR -# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) -# define SWIGTEMPLATEDISAMBIGUATOR template -# elif defined(__HP_aCC) -/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ -/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ -# define SWIGTEMPLATEDISAMBIGUATOR template -# else -# define SWIGTEMPLATEDISAMBIGUATOR -# endif -#endif - -/* inline attribute */ -#ifndef SWIGINLINE -# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) -# define SWIGINLINE inline -# else -# define SWIGINLINE -# endif -#endif - -/* attribute recognised by some compilers to avoid 'unused' warnings */ -#ifndef SWIGUNUSED -# if defined(__GNUC__) -# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -# define SWIGUNUSED __attribute__ ((__unused__)) -# else -# define SWIGUNUSED -# endif -# elif defined(__ICC) -# define SWIGUNUSED __attribute__ ((__unused__)) -# else -# define SWIGUNUSED -# endif -#endif - -#ifndef SWIG_MSC_UNSUPPRESS_4505 -# if defined(_MSC_VER) -# pragma warning(disable : 4505) /* unreferenced local function has been removed */ -# endif -#endif - -#ifndef SWIGUNUSEDPARM -# ifdef __cplusplus -# define SWIGUNUSEDPARM(p) -# else -# define SWIGUNUSEDPARM(p) p SWIGUNUSED -# endif -#endif - -/* internal SWIG method */ -#ifndef SWIGINTERN -# define SWIGINTERN static SWIGUNUSED -#endif - -/* internal inline SWIG method */ -#ifndef SWIGINTERNINLINE -# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE -#endif - -/* exporting methods */ -#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) -# ifndef GCC_HASCLASSVISIBILITY -# define GCC_HASCLASSVISIBILITY -# endif -#endif - -#ifndef SWIGEXPORT -# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) -# if defined(STATIC_LINKED) -# define SWIGEXPORT -# else -# define SWIGEXPORT __declspec(dllexport) -# endif -# else -# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) -# define SWIGEXPORT __attribute__ ((visibility("default"))) -# else -# define SWIGEXPORT -# endif -# endif -#endif - -/* calling conventions for Windows */ -#ifndef SWIGSTDCALL -# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) -# define SWIGSTDCALL __stdcall -# else -# define SWIGSTDCALL -# endif -#endif - -/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ -#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) -# define _CRT_SECURE_NO_DEPRECATE -#endif - -/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ -#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) -# define _SCL_SECURE_NO_DEPRECATE -#endif - +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ + +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif + +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif + +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif + +#ifndef SWIG_MSC_UNSUPPRESS_4505 +# if defined(_MSC_VER) +# pragma warning(disable : 4505) /* unreferenced local function has been removed */ +# endif +#endif + +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif + +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + /* Python.h has to appear first */ #include -/* ----------------------------------------------------------------------------- - * swigrun.swg - * - * This file contains generic C API SWIG runtime support for pointer - * type checking. - * ----------------------------------------------------------------------------- */ - -/* This should only be incremented when either the layout of swig_type_info changes, - or for whatever reason, the runtime changes incompatibly */ -#define SWIG_RUNTIME_VERSION "4" - -/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ -#ifdef SWIG_TYPE_TABLE -# define SWIG_QUOTE_STRING(x) #x -# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) -# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) -#else -# define SWIG_TYPE_TABLE_NAME -#endif - -/* - You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for - creating a static or dynamic library from the SWIG runtime code. - In 99.9% of the cases, SWIG just needs to declare them as 'static'. - - But only do this if strictly necessary, ie, if you have problems - with your compiler or suchlike. -*/ - -#ifndef SWIGRUNTIME -# define SWIGRUNTIME SWIGINTERN -#endif - -#ifndef SWIGRUNTIMEINLINE -# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE -#endif - -/* Generic buffer size */ -#ifndef SWIG_BUFFER_SIZE -# define SWIG_BUFFER_SIZE 1024 -#endif - -/* Flags for pointer conversions */ -#define SWIG_POINTER_DISOWN 0x1 -#define SWIG_CAST_NEW_MEMORY 0x2 - -/* Flags for new pointer objects */ -#define SWIG_POINTER_OWN 0x1 - - -/* - Flags/methods for returning states. - - The SWIG conversion methods, as ConvertPtr, return and integer - that tells if the conversion was successful or not. And if not, - an error code can be returned (see swigerrors.swg for the codes). - - Use the following macros/flags to set or process the returning - states. - - In old versions of SWIG, code such as the following was usually written: - - if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { - // success code - } else { - //fail code - } - - Now you can be more explicit: - - int res = SWIG_ConvertPtr(obj,vptr,ty.flags); - if (SWIG_IsOK(res)) { - // success code - } else { - // fail code - } - - which is the same really, but now you can also do - - Type *ptr; - int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); - if (SWIG_IsOK(res)) { - // success code - if (SWIG_IsNewObj(res) { - ... - delete *ptr; - } else { - ... - } - } else { - // fail code - } - - I.e., now SWIG_ConvertPtr can return new objects and you can - identify the case and take care of the deallocation. Of course that - also requires SWIG_ConvertPtr to return new result values, such as - - int SWIG_ConvertPtr(obj, ptr,...) { - if () { - if () { - *ptr = ; - return SWIG_NEWOBJ; - } else { - *ptr = ; - return SWIG_OLDOBJ; - } - } else { - return SWIG_BADOBJ; - } - } - - Of course, returning the plain '0(success)/-1(fail)' still works, but you can be - more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the - SWIG errors code. - - Finally, if the SWIG_CASTRANK_MODE is enabled, the result code - allows to return the 'cast rank', for example, if you have this - - int food(double) - int fooi(int); - - and you call - - food(1) // cast rank '1' (1 -> 1.0) - fooi(1) // cast rank '0' - - just use the SWIG_AddCast()/SWIG_CheckState() -*/ - -#define SWIG_OK (0) -#define SWIG_ERROR (-1) -#define SWIG_IsOK(r) (r >= 0) -#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) - -/* The CastRankLimit says how many bits are used for the cast rank */ -#define SWIG_CASTRANKLIMIT (1 << 8) -/* The NewMask denotes the object was created (using new/malloc) */ -#define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) -/* The TmpMask is for in/out typemaps that use temporal objects */ -#define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) -/* Simple returning values */ -#define SWIG_BADOBJ (SWIG_ERROR) -#define SWIG_OLDOBJ (SWIG_OK) -#define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) -#define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) -/* Check, add and del mask methods */ -#define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) -#define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) -#define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) -#define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) -#define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) -#define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) - -/* Cast-Rank Mode */ -#if defined(SWIG_CASTRANK_MODE) -# ifndef SWIG_TypeRank -# define SWIG_TypeRank unsigned long -# endif -# ifndef SWIG_MAXCASTRANK /* Default cast allowed */ -# define SWIG_MAXCASTRANK (2) -# endif -# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) -# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) -SWIGINTERNINLINE int SWIG_AddCast(int r) { - return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; -} -SWIGINTERNINLINE int SWIG_CheckState(int r) { - return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; -} -#else /* no cast-rank mode */ -# define SWIG_AddCast -# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) -#endif - - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void *(*swig_converter_func)(void *, int *); -typedef struct swig_type_info *(*swig_dycast_func)(void **); - -/* Structure to store information on one type */ -typedef struct swig_type_info { - const char *name; /* mangled name of this type */ - const char *str; /* human readable name of this type */ - swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ - struct swig_cast_info *cast; /* linked list of types that can cast into this type */ - void *clientdata; /* language specific type data */ - int owndata; /* flag if the structure owns the clientdata */ -} swig_type_info; - -/* Structure to store a type and conversion function used for casting */ -typedef struct swig_cast_info { - swig_type_info *type; /* pointer to type that is equivalent to this type */ - swig_converter_func converter; /* function to cast the void pointers */ - struct swig_cast_info *next; /* pointer to next cast in linked list */ - struct swig_cast_info *prev; /* pointer to the previous cast */ -} swig_cast_info; - -/* Structure used to store module information - * Each module generates one structure like this, and the runtime collects - * all of these structures and stores them in a circularly linked list.*/ -typedef struct swig_module_info { - swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ - size_t size; /* Number of types in this module */ - struct swig_module_info *next; /* Pointer to next element in circularly linked list */ - swig_type_info **type_initial; /* Array of initially generated type structures */ - swig_cast_info **cast_initial; /* Array of initially generated casting structures */ - void *clientdata; /* Language specific module data */ -} swig_module_info; - -/* - Compare two type names skipping the space characters, therefore - "char*" == "char *" and "Class" == "Class", etc. - - Return 0 when the two name types are equivalent, as in - strncmp, but skipping ' '. -*/ -SWIGRUNTIME int -SWIG_TypeNameComp(const char *f1, const char *l1, - const char *f2, const char *l2) { - for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { - while ((*f1 == ' ') && (f1 != l1)) ++f1; - while ((*f2 == ' ') && (f2 != l2)) ++f2; - if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; - } - return (int)((l1 - f1) - (l2 - f2)); -} - -/* - Check type equivalence in a name list like ||... - Return 0 if not equal, 1 if equal -*/ -SWIGRUNTIME int -SWIG_TypeEquiv(const char *nb, const char *tb) { - int equiv = 0; - const char* te = tb + strlen(tb); - const char* ne = nb; - while (!equiv && *ne) { - for (nb = ne; *ne; ++ne) { - if (*ne == '|') break; - } - equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; - if (*ne) ++ne; - } - return equiv; -} - -/* - Check type equivalence in a name list like ||... - Return 0 if equal, -1 if nb < tb, 1 if nb > tb -*/ -SWIGRUNTIME int -SWIG_TypeCompare(const char *nb, const char *tb) { - int equiv = 0; - const char* te = tb + strlen(tb); - const char* ne = nb; - while (!equiv && *ne) { - for (nb = ne; *ne; ++ne) { - if (*ne == '|') break; - } - equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; - if (*ne) ++ne; - } - return equiv; -} - - -/* - Check the typename -*/ -SWIGRUNTIME swig_cast_info * -SWIG_TypeCheck(const char *c, swig_type_info *ty) { - if (ty) { - swig_cast_info *iter = ty->cast; - while (iter) { - if (strcmp(iter->type->name, c) == 0) { - if (iter == ty->cast) - return iter; - /* Move iter to the top of the linked list */ - iter->prev->next = iter->next; - if (iter->next) - iter->next->prev = iter->prev; - iter->next = ty->cast; - iter->prev = 0; - if (ty->cast) ty->cast->prev = iter; - ty->cast = iter; - return iter; - } - iter = iter->next; - } - } - return 0; -} - -/* - Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison -*/ -SWIGRUNTIME swig_cast_info * -SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { - if (ty) { - swig_cast_info *iter = ty->cast; - while (iter) { - if (iter->type == from) { - if (iter == ty->cast) - return iter; - /* Move iter to the top of the linked list */ - iter->prev->next = iter->next; - if (iter->next) - iter->next->prev = iter->prev; - iter->next = ty->cast; - iter->prev = 0; - if (ty->cast) ty->cast->prev = iter; - ty->cast = iter; - return iter; - } - iter = iter->next; - } - } - return 0; -} - -/* - Cast a pointer up an inheritance hierarchy -*/ -SWIGRUNTIMEINLINE void * -SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { - return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); -} - -/* - Dynamic pointer casting. Down an inheritance hierarchy -*/ -SWIGRUNTIME swig_type_info * -SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { - swig_type_info *lastty = ty; - if (!ty || !ty->dcast) return ty; - while (ty && (ty->dcast)) { - ty = (*ty->dcast)(ptr); - if (ty) lastty = ty; - } - return lastty; -} - -/* - Return the name associated with this type -*/ -SWIGRUNTIMEINLINE const char * -SWIG_TypeName(const swig_type_info *ty) { - return ty->name; -} - -/* - Return the pretty name associated with this type, - that is an unmangled type name in a form presentable to the user. -*/ -SWIGRUNTIME const char * -SWIG_TypePrettyName(const swig_type_info *type) { - /* The "str" field contains the equivalent pretty names of the - type, separated by vertical-bar characters. We choose - to print the last name, as it is often (?) the most - specific. */ - if (!type) return NULL; - if (type->str != NULL) { - const char *last_name = type->str; - const char *s; - for (s = type->str; *s; s++) - if (*s == '|') last_name = s+1; - return last_name; - } - else - return type->name; -} - -/* - Set the clientdata field for a type -*/ -SWIGRUNTIME void -SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { - swig_cast_info *cast = ti->cast; - /* if (ti->clientdata == clientdata) return; */ - ti->clientdata = clientdata; - - while (cast) { - if (!cast->converter) { - swig_type_info *tc = cast->type; - if (!tc->clientdata) { - SWIG_TypeClientData(tc, clientdata); - } - } - cast = cast->next; - } -} -SWIGRUNTIME void -SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { - SWIG_TypeClientData(ti, clientdata); - ti->owndata = 1; -} - -/* - Search for a swig_type_info structure only by mangled name - Search is a O(log #types) - - We start searching at module start, and finish searching when start == end. - Note: if start == end at the beginning of the function, we go all the way around - the circular list. -*/ -SWIGRUNTIME swig_type_info * -SWIG_MangledTypeQueryModule(swig_module_info *start, - swig_module_info *end, - const char *name) { - swig_module_info *iter = start; - do { - if (iter->size) { - register size_t l = 0; - register size_t r = iter->size - 1; - do { - /* since l+r >= 0, we can (>> 1) instead (/ 2) */ - register size_t i = (l + r) >> 1; - const char *iname = iter->types[i]->name; - if (iname) { - register int compare = strcmp(name, iname); - if (compare == 0) { - return iter->types[i]; - } else if (compare < 0) { - if (i) { - r = i - 1; - } else { - break; - } - } else if (compare > 0) { - l = i + 1; - } - } else { - break; /* should never happen */ - } - } while (l <= r); - } - iter = iter->next; - } while (iter != end); - return 0; -} - -/* - Search for a swig_type_info structure for either a mangled name or a human readable name. - It first searches the mangled names of the types, which is a O(log #types) - If a type is not found it then searches the human readable names, which is O(#types). - - We start searching at module start, and finish searching when start == end. - Note: if start == end at the beginning of the function, we go all the way around - the circular list. -*/ -SWIGRUNTIME swig_type_info * -SWIG_TypeQueryModule(swig_module_info *start, - swig_module_info *end, - const char *name) { - /* STEP 1: Search the name field using binary search */ - swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); - if (ret) { - return ret; - } else { - /* STEP 2: If the type hasn't been found, do a complete search - of the str field (the human readable name) */ - swig_module_info *iter = start; - do { - register size_t i = 0; - for (; i < iter->size; ++i) { - if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) - return iter->types[i]; - } - iter = iter->next; - } while (iter != end); - } - - /* neither found a match */ - return 0; -} - -/* - Pack binary data into a string -*/ -SWIGRUNTIME char * -SWIG_PackData(char *c, void *ptr, size_t sz) { - static const char hex[17] = "0123456789abcdef"; - register const unsigned char *u = (unsigned char *) ptr; - register const unsigned char *eu = u + sz; - for (; u != eu; ++u) { - register unsigned char uu = *u; - *(c++) = hex[(uu & 0xf0) >> 4]; - *(c++) = hex[uu & 0xf]; - } - return c; -} - -/* - Unpack binary data from a string -*/ -SWIGRUNTIME const char * -SWIG_UnpackData(const char *c, void *ptr, size_t sz) { - register unsigned char *u = (unsigned char *) ptr; - register const unsigned char *eu = u + sz; - for (; u != eu; ++u) { - register char d = *(c++); - register unsigned char uu; - if ((d >= '0') && (d <= '9')) - uu = ((d - '0') << 4); - else if ((d >= 'a') && (d <= 'f')) - uu = ((d - ('a'-10)) << 4); - else - return (char *) 0; - d = *(c++); - if ((d >= '0') && (d <= '9')) - uu |= (d - '0'); - else if ((d >= 'a') && (d <= 'f')) - uu |= (d - ('a'-10)); - else - return (char *) 0; - *u = uu; - } - return c; -} - -/* - Pack 'void *' into a string buffer. -*/ -SWIGRUNTIME char * -SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { - char *r = buff; - if ((2*sizeof(void *) + 2) > bsz) return 0; - *(r++) = '_'; - r = SWIG_PackData(r,&ptr,sizeof(void *)); - if (strlen(name) + 1 > (bsz - (r - buff))) return 0; - strcpy(r,name); - return buff; -} - -SWIGRUNTIME const char * -SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { - if (*c != '_') { - if (strcmp(c,"NULL") == 0) { - *ptr = (void *) 0; - return name; - } else { - return 0; - } - } - return SWIG_UnpackData(++c,ptr,sizeof(void *)); -} - -SWIGRUNTIME char * -SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { - char *r = buff; - size_t lname = (name ? strlen(name) : 0); - if ((2*sz + 2 + lname) > bsz) return 0; - *(r++) = '_'; - r = SWIG_PackData(r,ptr,sz); - if (lname) { - strncpy(r,name,lname+1); - } else { - *r = 0; - } - return buff; -} - -SWIGRUNTIME const char * -SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { - if (*c != '_') { - if (strcmp(c,"NULL") == 0) { - memset(ptr,0,sz); - return name; - } else { - return 0; - } - } - return SWIG_UnpackData(++c,ptr,sz); -} - -#ifdef __cplusplus -} -#endif +/* ----------------------------------------------------------------------------- + * swigrun.swg + * + * This file contains generic C API SWIG runtime support for pointer + * type checking. + * ----------------------------------------------------------------------------- */ -/* Errors in SWIG */ -#define SWIG_UnknownError -1 -#define SWIG_IOError -2 -#define SWIG_RuntimeError -3 -#define SWIG_IndexError -4 -#define SWIG_TypeError -5 -#define SWIG_DivisionByZero -6 -#define SWIG_OverflowError -7 -#define SWIG_SyntaxError -8 -#define SWIG_ValueError -9 -#define SWIG_SystemError -10 -#define SWIG_AttributeError -11 -#define SWIG_MemoryError -12 -#define SWIG_NullReferenceError -13 - - +/* This should only be incremented when either the layout of swig_type_info changes, + or for whatever reason, the runtime changes incompatibly */ +#define SWIG_RUNTIME_VERSION "4" -/* Compatibility marcos for Python 3 */ -#if PY_VERSION_HEX >= 0x03000000 - -#define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type) -#define PyInt_Check(x) PyLong_Check(x) -#define PyInt_AsLong(x) PyLong_AsLong(x) -#define PyInt_FromLong(x) PyLong_FromLong(x) -#define PyString_Format(fmt, args) PyUnicode_Format(fmt, args) - -#endif - -#ifndef Py_TYPE -# define Py_TYPE(op) ((op)->ob_type) -#endif - -/* SWIG APIs for compatibility of both Python 2 & 3 */ - -#if PY_VERSION_HEX >= 0x03000000 -# define SWIG_Python_str_FromFormat PyUnicode_FromFormat -#else -# define SWIG_Python_str_FromFormat PyString_FromFormat -#endif - -SWIGINTERN char* -SWIG_Python_str_AsChar(PyObject *str) -{ -#if PY_VERSION_HEX >= 0x03000000 - str = PyUnicode_AsUTF8String(str); - return PyBytes_AsString(str); -#else - return PyString_AsString(str); -#endif -} - -SWIGINTERN PyObject* -SWIG_Python_str_FromChar(const char *c) -{ -#if PY_VERSION_HEX >= 0x03000000 - return PyUnicode_FromString(c); -#else - return PyString_FromString(c); -#endif -} - -/* Add PyOS_snprintf for old Pythons */ -#if PY_VERSION_HEX < 0x02020000 -# if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) -# define PyOS_snprintf _snprintf -# else -# define PyOS_snprintf snprintf -# endif -#endif - -/* A crude PyString_FromFormat implementation for old Pythons */ -#if PY_VERSION_HEX < 0x02020000 - -#ifndef SWIG_PYBUFFER_SIZE -# define SWIG_PYBUFFER_SIZE 1024 -#endif - -static PyObject * -PyString_FromFormat(const char *fmt, ...) { - va_list ap; - char buf[SWIG_PYBUFFER_SIZE * 2]; - int res; - va_start(ap, fmt); - res = vsnprintf(buf, sizeof(buf), fmt, ap); - va_end(ap); - return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf); -} -#endif - -/* Add PyObject_Del for old Pythons */ -#if PY_VERSION_HEX < 0x01060000 -# define PyObject_Del(op) PyMem_DEL((op)) -#endif -#ifndef PyObject_DEL -# define PyObject_DEL PyObject_Del -#endif - -/* A crude PyExc_StopIteration exception for old Pythons */ -#if PY_VERSION_HEX < 0x02020000 -# ifndef PyExc_StopIteration -# define PyExc_StopIteration PyExc_RuntimeError -# endif -# ifndef PyObject_GenericGetAttr -# define PyObject_GenericGetAttr 0 -# endif -#endif - -/* Py_NotImplemented is defined in 2.1 and up. */ -#if PY_VERSION_HEX < 0x02010000 -# ifndef Py_NotImplemented -# define Py_NotImplemented PyExc_RuntimeError -# endif -#endif - -/* A crude PyString_AsStringAndSize implementation for old Pythons */ -#if PY_VERSION_HEX < 0x02010000 -# ifndef PyString_AsStringAndSize -# define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;} -# endif -#endif - -/* PySequence_Size for old Pythons */ -#if PY_VERSION_HEX < 0x02000000 -# ifndef PySequence_Size -# define PySequence_Size PySequence_Length -# endif -#endif - -/* PyBool_FromLong for old Pythons */ -#if PY_VERSION_HEX < 0x02030000 -static -PyObject *PyBool_FromLong(long ok) -{ - PyObject *result = ok ? Py_True : Py_False; - Py_INCREF(result); - return result; -} -#endif - -/* Py_ssize_t for old Pythons */ -/* This code is as recommended by: */ -/* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */ -#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) -typedef int Py_ssize_t; -# define PY_SSIZE_T_MAX INT_MAX -# define PY_SSIZE_T_MIN INT_MIN -#endif +/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ +#ifdef SWIG_TYPE_TABLE +# define SWIG_QUOTE_STRING(x) #x +# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) +# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) +#else +# define SWIG_TYPE_TABLE_NAME +#endif -/* ----------------------------------------------------------------------------- - * error manipulation - * ----------------------------------------------------------------------------- */ - -SWIGRUNTIME PyObject* -SWIG_Python_ErrorType(int code) { - PyObject* type = 0; - switch(code) { - case SWIG_MemoryError: - type = PyExc_MemoryError; - break; - case SWIG_IOError: - type = PyExc_IOError; - break; - case SWIG_RuntimeError: - type = PyExc_RuntimeError; - break; - case SWIG_IndexError: - type = PyExc_IndexError; - break; - case SWIG_TypeError: - type = PyExc_TypeError; - break; - case SWIG_DivisionByZero: - type = PyExc_ZeroDivisionError; - break; - case SWIG_OverflowError: - type = PyExc_OverflowError; - break; - case SWIG_SyntaxError: - type = PyExc_SyntaxError; - break; - case SWIG_ValueError: - type = PyExc_ValueError; - break; - case SWIG_SystemError: - type = PyExc_SystemError; - break; - case SWIG_AttributeError: - type = PyExc_AttributeError; - break; - default: - type = PyExc_RuntimeError; - } - return type; -} - - -SWIGRUNTIME void -SWIG_Python_AddErrorMsg(const char* mesg) -{ - PyObject *type = 0; - PyObject *value = 0; - PyObject *traceback = 0; - - if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback); - if (value) { - PyObject *old_str = PyObject_Str(value); - PyErr_Clear(); - Py_XINCREF(type); - - PyErr_Format(type, "%s %s", SWIG_Python_str_AsChar(old_str), mesg); - Py_DECREF(old_str); - Py_DECREF(value); - } else { - PyErr_SetString(PyExc_RuntimeError, mesg); - } -} +/* + You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for + creating a static or dynamic library from the SWIG runtime code. + In 99.9% of the cases, SWIG just needs to declare them as 'static'. + + But only do this if strictly necessary, ie, if you have problems + with your compiler or suchlike. +*/ -#if defined(SWIG_PYTHON_NO_THREADS) -# if defined(SWIG_PYTHON_THREADS) -# undef SWIG_PYTHON_THREADS -# endif -#endif -#if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */ -# if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL) -# if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */ -# define SWIG_PYTHON_USE_GIL -# endif -# endif -# if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ -# ifndef SWIG_PYTHON_INITIALIZE_THREADS -# define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() -# endif -# ifdef __cplusplus /* C++ code */ - class SWIG_Python_Thread_Block { - bool status; - PyGILState_STATE state; - public: - void end() { if (status) { PyGILState_Release(state); status = false;} } - SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {} - ~SWIG_Python_Thread_Block() { end(); } - }; - class SWIG_Python_Thread_Allow { - bool status; - PyThreadState *save; - public: - void end() { if (status) { PyEval_RestoreThread(save); status = false; }} - SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} - ~SWIG_Python_Thread_Allow() { end(); } - }; -# define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block -# define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end() -# define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow -# define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end() -# else /* C code */ -# define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure() -# define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block) -# define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread() -# define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow) -# endif -# else /* Old thread way, not implemented, user must provide it */ -# if !defined(SWIG_PYTHON_INITIALIZE_THREADS) -# define SWIG_PYTHON_INITIALIZE_THREADS -# endif -# if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK) -# define SWIG_PYTHON_THREAD_BEGIN_BLOCK -# endif -# if !defined(SWIG_PYTHON_THREAD_END_BLOCK) -# define SWIG_PYTHON_THREAD_END_BLOCK -# endif -# if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW) -# define SWIG_PYTHON_THREAD_BEGIN_ALLOW -# endif -# if !defined(SWIG_PYTHON_THREAD_END_ALLOW) -# define SWIG_PYTHON_THREAD_END_ALLOW -# endif -# endif -#else /* No thread support */ -# define SWIG_PYTHON_INITIALIZE_THREADS -# define SWIG_PYTHON_THREAD_BEGIN_BLOCK -# define SWIG_PYTHON_THREAD_END_BLOCK -# define SWIG_PYTHON_THREAD_BEGIN_ALLOW -# define SWIG_PYTHON_THREAD_END_ALLOW -#endif +#ifndef SWIGRUNTIME +# define SWIGRUNTIME SWIGINTERN +#endif -/* ----------------------------------------------------------------------------- - * Python API portion that goes into the runtime - * ----------------------------------------------------------------------------- */ - -#ifdef __cplusplus -extern "C" { -#if 0 -} /* cc-mode */ -#endif -#endif - -/* ----------------------------------------------------------------------------- - * Constant declarations - * ----------------------------------------------------------------------------- */ - -/* Constant Types */ -#define SWIG_PY_POINTER 4 -#define SWIG_PY_BINARY 5 - -/* Constant information structure */ -typedef struct swig_const_info { - int type; - char *name; - long lvalue; - double dvalue; - void *pvalue; - swig_type_info **ptype; -} swig_const_info; - - -/* ----------------------------------------------------------------------------- - * Wrapper of PyInstanceMethod_New() used in Python 3 - * It is exported to the generated module, used for -fastproxy - * ----------------------------------------------------------------------------- */ -SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *self, PyObject *func) -{ -#if PY_VERSION_HEX >= 0x03000000 - return PyInstanceMethod_New(func); -#else - return NULL; -#endif -} - -#ifdef __cplusplus -#if 0 -{ /* cc-mode */ -#endif -} -#endif - +#ifndef SWIGRUNTIMEINLINE +# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE +#endif -/* ----------------------------------------------------------------------------- - * See the LICENSE file for information on copyright, usage and redistribution - * of SWIG, and the README file for authors - http://www.swig.org/release.html. - * - * pyrun.swg - * - * This file contains the runtime support for Python modules - * and includes code for managing global variables and pointer - * type checking. - * - * ----------------------------------------------------------------------------- */ - -/* Common SWIG API */ - -/* for raw pointers */ -#define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0) -#define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags) -#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own) -#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(ptr, type, flags) -#define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty) -#define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src) -#define swig_owntype int - -/* for raw packed data */ -#define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) -#define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) - -/* for class or struct pointers */ -#define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) -#define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) - -/* for C or C++ function pointers */ -#define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type) -#define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(ptr, type, 0) - -/* for C++ member pointers, ie, member methods */ -#define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) -#define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) - - -/* Runtime API */ - -#define SWIG_GetModule(clientdata) SWIG_Python_GetModule() -#define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer) -#define SWIG_NewClientData(obj) SwigPyClientData_New(obj) - -#define SWIG_SetErrorObj SWIG_Python_SetErrorObj -#define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg -#define SWIG_ErrorType(code) SWIG_Python_ErrorType(code) -#define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) -#define SWIG_fail goto fail - - -/* Runtime API implementation */ - -/* Error manipulation */ - -SWIGINTERN void -SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) { - SWIG_PYTHON_THREAD_BEGIN_BLOCK; - PyErr_SetObject(errtype, obj); - Py_DECREF(obj); - SWIG_PYTHON_THREAD_END_BLOCK; -} - -SWIGINTERN void -SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) { - SWIG_PYTHON_THREAD_BEGIN_BLOCK; - PyErr_SetString(errtype, (char *) msg); - SWIG_PYTHON_THREAD_END_BLOCK; -} - -#define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj) - -/* Set a constant value */ - -SWIGINTERN void -SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) { - PyDict_SetItemString(d, (char*) name, obj); - Py_DECREF(obj); -} - -/* Append a value to the result obj */ - -SWIGINTERN PyObject* -SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { -#if !defined(SWIG_PYTHON_OUTPUT_TUPLE) - if (!result) { - result = obj; - } else if (result == Py_None) { - Py_DECREF(result); - result = obj; - } else { - if (!PyList_Check(result)) { - PyObject *o2 = result; - result = PyList_New(1); - PyList_SetItem(result, 0, o2); - } - PyList_Append(result,obj); - Py_DECREF(obj); - } - return result; -#else - PyObject* o2; - PyObject* o3; - if (!result) { - result = obj; - } else if (result == Py_None) { - Py_DECREF(result); - result = obj; - } else { - if (!PyTuple_Check(result)) { - o2 = result; - result = PyTuple_New(1); - PyTuple_SET_ITEM(result, 0, o2); - } - o3 = PyTuple_New(1); - PyTuple_SET_ITEM(o3, 0, obj); - o2 = result; - result = PySequence_Concat(o2, o3); - Py_DECREF(o2); - Py_DECREF(o3); - } - return result; -#endif -} - -/* Unpack the argument tuple */ - -SWIGINTERN int -SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs) -{ - if (!args) { - if (!min && !max) { - return 1; - } else { - PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", - name, (min == max ? "" : "at least "), (int)min); - return 0; - } - } - if (!PyTuple_Check(args)) { - PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple"); - return 0; - } else { - register Py_ssize_t l = PyTuple_GET_SIZE(args); - if (l < min) { - PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", - name, (min == max ? "" : "at least "), (int)min, (int)l); - return 0; - } else if (l > max) { - PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", - name, (min == max ? "" : "at most "), (int)max, (int)l); - return 0; - } else { - register int i; - for (i = 0; i < l; ++i) { - objs[i] = PyTuple_GET_ITEM(args, i); - } - for (; l < max; ++l) { - objs[l] = 0; - } - return i + 1; - } - } -} - -/* A functor is a function object with one single object argument */ -#if PY_VERSION_HEX >= 0x02020000 -#define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); -#else -#define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunction(functor, "O", obj); -#endif - -/* - Helper for static pointer initialization for both C and C++ code, for example - static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...); -*/ -#ifdef __cplusplus -#define SWIG_STATIC_POINTER(var) var -#else -#define SWIG_STATIC_POINTER(var) var = 0; if (!var) var -#endif - -/* ----------------------------------------------------------------------------- - * Pointer declarations - * ----------------------------------------------------------------------------- */ - -/* Flags for new pointer objects */ -#define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1) -#define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN) - -#define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1) - -#ifdef __cplusplus -extern "C" { -#if 0 -} /* cc-mode */ -#endif -#endif - -/* How to access Py_None */ -#if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) -# ifndef SWIG_PYTHON_NO_BUILD_NONE -# ifndef SWIG_PYTHON_BUILD_NONE -# define SWIG_PYTHON_BUILD_NONE -# endif -# endif -#endif - -#ifdef SWIG_PYTHON_BUILD_NONE -# ifdef Py_None -# undef Py_None -# define Py_None SWIG_Py_None() -# endif -SWIGRUNTIMEINLINE PyObject * -_SWIG_Py_None(void) -{ - PyObject *none = Py_BuildValue((char*)""); - Py_DECREF(none); - return none; -} -SWIGRUNTIME PyObject * -SWIG_Py_None(void) -{ - static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None(); - return none; -} -#endif - -/* The python void return value */ - -SWIGRUNTIMEINLINE PyObject * -SWIG_Py_Void(void) -{ - PyObject *none = Py_None; - Py_INCREF(none); - return none; -} - -/* SwigPyClientData */ - -typedef struct { - PyObject *klass; - PyObject *newraw; - PyObject *newargs; - PyObject *destroy; - int delargs; - int implicitconv; -} SwigPyClientData; - -SWIGRUNTIMEINLINE int -SWIG_Python_CheckImplicit(swig_type_info *ty) -{ - SwigPyClientData *data = (SwigPyClientData *)ty->clientdata; - return data ? data->implicitconv : 0; -} - -SWIGRUNTIMEINLINE PyObject * -SWIG_Python_ExceptionType(swig_type_info *desc) { - SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0; - PyObject *klass = data ? data->klass : 0; - return (klass ? klass : PyExc_RuntimeError); -} - - -SWIGRUNTIME SwigPyClientData * -SwigPyClientData_New(PyObject* obj) -{ - if (!obj) { - return 0; - } else { - SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData)); - /* the klass element */ - data->klass = obj; - Py_INCREF(data->klass); - /* the newraw method and newargs arguments used to create a new raw instance */ - if (PyClass_Check(obj)) { - data->newraw = 0; - data->newargs = obj; - Py_INCREF(obj); - } else { -#if (PY_VERSION_HEX < 0x02020000) - data->newraw = 0; -#else - data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__"); -#endif - if (data->newraw) { - Py_INCREF(data->newraw); - data->newargs = PyTuple_New(1); - PyTuple_SetItem(data->newargs, 0, obj); - } else { - data->newargs = obj; - } - Py_INCREF(data->newargs); - } - /* the destroy method, aka as the C++ delete method */ - data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__"); - if (PyErr_Occurred()) { - PyErr_Clear(); - data->destroy = 0; - } - if (data->destroy) { - int flags; - Py_INCREF(data->destroy); - flags = PyCFunction_GET_FLAGS(data->destroy); -#ifdef METH_O - data->delargs = !(flags & (METH_O)); -#else - data->delargs = 0; -#endif - } else { - data->delargs = 0; - } - data->implicitconv = 0; - return data; - } -} - -SWIGRUNTIME void -SwigPyClientData_Del(SwigPyClientData* data) -{ - Py_XDECREF(data->newraw); - Py_XDECREF(data->newargs); - Py_XDECREF(data->destroy); -} - -/* =============== SwigPyObject =====================*/ - -typedef struct { - PyObject_HEAD - void *ptr; - swig_type_info *ty; - int own; - PyObject *next; -} SwigPyObject; - -SWIGRUNTIME PyObject * -SwigPyObject_long(SwigPyObject *v) -{ - return PyLong_FromVoidPtr(v->ptr); -} - -SWIGRUNTIME PyObject * -SwigPyObject_format(const char* fmt, SwigPyObject *v) -{ - PyObject *res = NULL; - PyObject *args = PyTuple_New(1); - if (args) { - if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) { - PyObject *ofmt = SWIG_Python_str_FromChar(fmt); - if (ofmt) { -#if PY_VERSION_HEX >= 0x03000000 - res = PyUnicode_Format(ofmt,args); -#else - res = PyString_Format(ofmt,args); -#endif - Py_DECREF(ofmt); - } - Py_DECREF(args); - } - } - return res; -} - -SWIGRUNTIME PyObject * -SwigPyObject_oct(SwigPyObject *v) -{ - return SwigPyObject_format("%o",v); -} - -SWIGRUNTIME PyObject * -SwigPyObject_hex(SwigPyObject *v) -{ - return SwigPyObject_format("%x",v); -} - -SWIGRUNTIME PyObject * -#ifdef METH_NOARGS -SwigPyObject_repr(SwigPyObject *v) -#else -SwigPyObject_repr(SwigPyObject *v, PyObject *args) -#endif -{ - const char *name = SWIG_TypePrettyName(v->ty); - PyObject *hex = SwigPyObject_hex(v); - PyObject *repr = SWIG_Python_str_FromFormat("", name, hex); - Py_DECREF(hex); - if (v->next) { -#ifdef METH_NOARGS - PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); -#else - PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next, args); -#endif -#if PY_VERSION_HEX >= 0x03000000 - PyObject *joined = PyUnicode_Concat(repr, nrep); - Py_DecRef(repr); - Py_DecRef(nrep); - repr = joined; -#else - PyString_ConcatAndDel(&repr,nrep); -#endif - } - return repr; -} - -SWIGRUNTIME int -SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) -{ -#ifdef METH_NOARGS - PyObject *repr = SwigPyObject_repr(v); -#else - PyObject *repr = SwigPyObject_repr(v, NULL); -#endif - if (repr) { - fputs(SWIG_Python_str_AsChar(repr), fp); - Py_DECREF(repr); - return 0; - } else { - return 1; - } -} - -SWIGRUNTIME PyObject * -SwigPyObject_str(SwigPyObject *v) -{ - char result[SWIG_BUFFER_SIZE]; - return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ? - SWIG_Python_str_FromChar(result) : 0; -} - -SWIGRUNTIME int -SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w) -{ - void *i = v->ptr; - void *j = w->ptr; - return (i < j) ? -1 : ((i > j) ? 1 : 0); -} - -/* Added for Python 3.x, whould it also useful for Python 2.x? */ -SWIGRUNTIME PyObject* -SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op) -{ - PyObject* res; - if( op != Py_EQ && op != Py_NE ) { - Py_INCREF(Py_NotImplemented); - return Py_NotImplemented; - } - if( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ) - res = Py_True; - else - res = Py_False; - Py_INCREF(res); - return res; -} - - -SWIGRUNTIME PyTypeObject* _PySwigObject_type(void); - -SWIGRUNTIME PyTypeObject* -SwigPyObject_type(void) { - static PyTypeObject *SWIG_STATIC_POINTER(type) = _PySwigObject_type(); - return type; -} - -SWIGRUNTIMEINLINE int -SwigPyObject_Check(PyObject *op) { - return (Py_TYPE(op) == SwigPyObject_type()) - || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0); -} - -SWIGRUNTIME PyObject * -SwigPyObject_New(void *ptr, swig_type_info *ty, int own); - -SWIGRUNTIME void -SwigPyObject_dealloc(PyObject *v) -{ - SwigPyObject *sobj = (SwigPyObject *) v; - PyObject *next = sobj->next; - if (sobj->own == SWIG_POINTER_OWN) { - swig_type_info *ty = sobj->ty; - SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; - PyObject *destroy = data ? data->destroy : 0; - if (destroy) { - /* destroy is always a VARARGS method */ - PyObject *res; - if (data->delargs) { - /* we need to create a temporal object to carry the destroy operation */ - PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); - res = SWIG_Python_CallFunctor(destroy, tmp); - Py_DECREF(tmp); - } else { - PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); - PyObject *mself = PyCFunction_GET_SELF(destroy); - res = ((*meth)(mself, v)); - } - Py_XDECREF(res); - } -#if !defined(SWIG_PYTHON_SILENT_MEMLEAK) - else { - const char *name = SWIG_TypePrettyName(ty); - printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown")); - } -#endif - } - Py_XDECREF(next); - PyObject_DEL(v); -} - -SWIGRUNTIME PyObject* -SwigPyObject_append(PyObject* v, PyObject* next) -{ - SwigPyObject *sobj = (SwigPyObject *) v; -#ifndef METH_O - PyObject *tmp = 0; - if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL; - next = tmp; -#endif - if (!SwigPyObject_Check(next)) { - return NULL; - } - sobj->next = next; - Py_INCREF(next); - return SWIG_Py_Void(); -} - -SWIGRUNTIME PyObject* -#ifdef METH_NOARGS -SwigPyObject_next(PyObject* v) -#else -SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) -#endif -{ - SwigPyObject *sobj = (SwigPyObject *) v; - if (sobj->next) { - Py_INCREF(sobj->next); - return sobj->next; - } else { - return SWIG_Py_Void(); - } -} - -SWIGINTERN PyObject* -#ifdef METH_NOARGS -SwigPyObject_disown(PyObject *v) -#else -SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) -#endif -{ - SwigPyObject *sobj = (SwigPyObject *)v; - sobj->own = 0; - return SWIG_Py_Void(); -} - -SWIGINTERN PyObject* -#ifdef METH_NOARGS -SwigPyObject_acquire(PyObject *v) -#else -SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) -#endif -{ - SwigPyObject *sobj = (SwigPyObject *)v; - sobj->own = SWIG_POINTER_OWN; - return SWIG_Py_Void(); -} - -SWIGINTERN PyObject* -SwigPyObject_own(PyObject *v, PyObject *args) -{ - PyObject *val = 0; -#if (PY_VERSION_HEX < 0x02020000) - if (!PyArg_ParseTuple(args,(char *)"|O:own",&val)) -#else - if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) -#endif - { - return NULL; - } - else - { - SwigPyObject *sobj = (SwigPyObject *)v; - PyObject *obj = PyBool_FromLong(sobj->own); - if (val) { -#ifdef METH_NOARGS - if (PyObject_IsTrue(val)) { - SwigPyObject_acquire(v); - } else { - SwigPyObject_disown(v); - } -#else - if (PyObject_IsTrue(val)) { - SwigPyObject_acquire(v,args); - } else { - SwigPyObject_disown(v,args); - } -#endif - } - return obj; - } -} - -#ifdef METH_O -static PyMethodDef -swigobject_methods[] = { - {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"}, - {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"}, - {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, - {(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"}, - {(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"}, - {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_NOARGS, (char *)"returns object representation"}, - {0, 0, 0, 0} -}; -#else -static PyMethodDef -swigobject_methods[] = { - {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_VARARGS, (char *)"releases ownership of the pointer"}, - {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS, (char *)"aquires ownership of the pointer"}, - {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, - {(char *)"append", (PyCFunction)SwigPyObject_append, METH_VARARGS, (char *)"appends another 'this' object"}, - {(char *)"next", (PyCFunction)SwigPyObject_next, METH_VARARGS, (char *)"returns the next 'this' object"}, - {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_VARARGS, (char *)"returns object representation"}, - {0, 0, 0, 0} -}; -#endif - -#if PY_VERSION_HEX < 0x02020000 -SWIGINTERN PyObject * -SwigPyObject_getattr(SwigPyObject *sobj,char *name) -{ - return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name); -} -#endif - -SWIGRUNTIME PyTypeObject* -_PySwigObject_type(void) { - static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; - - static PyNumberMethods SwigPyObject_as_number = { - (binaryfunc)0, /*nb_add*/ - (binaryfunc)0, /*nb_subtract*/ - (binaryfunc)0, /*nb_multiply*/ - /* nb_divide removed in Python 3 */ -#if PY_VERSION_HEX < 0x03000000 - (binaryfunc)0, /*nb_divide*/ -#endif - (binaryfunc)0, /*nb_remainder*/ - (binaryfunc)0, /*nb_divmod*/ - (ternaryfunc)0,/*nb_power*/ - (unaryfunc)0, /*nb_negative*/ - (unaryfunc)0, /*nb_positive*/ - (unaryfunc)0, /*nb_absolute*/ - (inquiry)0, /*nb_nonzero*/ - 0, /*nb_invert*/ - 0, /*nb_lshift*/ - 0, /*nb_rshift*/ - 0, /*nb_and*/ - 0, /*nb_xor*/ - 0, /*nb_or*/ -#if PY_VERSION_HEX < 0x03000000 - 0, /*nb_coerce*/ -#endif - (unaryfunc)SwigPyObject_long, /*nb_int*/ - (unaryfunc)SwigPyObject_long, /*nb_long*/ - (unaryfunc)0, /*nb_float*/ -#if PY_VERSION_HEX < 0x03000000 - (unaryfunc)SwigPyObject_oct, /*nb_oct*/ - (unaryfunc)SwigPyObject_hex, /*nb_hex*/ -#endif -#if PY_VERSION_HEX >= 0x03000000 /* 3.0 */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */ -#elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */ -#elif PY_VERSION_HEX >= 0x02020000 /* 2.2.0 */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ -#elif PY_VERSION_HEX >= 0x02000000 /* 2.0.0 */ - 0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */ -#endif - }; - - static PyTypeObject swigpyobject_type; - static int type_init = 0; - if (!type_init) { - const PyTypeObject tmp - = { - /* PyOjbect header changed in Python 3 */ -#if PY_VERSION_HEX >= 0x03000000 - PyVarObject_HEAD_INIT(&PyType_Type, 0) -#else - PyObject_HEAD_INIT(NULL) - 0, /* ob_size */ -#endif - (char *)"SwigPyObject", /* tp_name */ - sizeof(SwigPyObject), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)SwigPyObject_dealloc, /* tp_dealloc */ - (printfunc)SwigPyObject_print, /* tp_print */ -#if PY_VERSION_HEX < 0x02020000 - (getattrfunc)SwigPyObject_getattr, /* tp_getattr */ -#else - (getattrfunc)0, /* tp_getattr */ -#endif - (setattrfunc)0, /* tp_setattr */ - (cmpfunc)SwigPyObject_compare, /* tp_compare */ - (reprfunc)SwigPyObject_repr, /* tp_repr */ - &SwigPyObject_as_number, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - (hashfunc)0, /* tp_hash */ - (ternaryfunc)0, /* tp_call */ - (reprfunc)SwigPyObject_str, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - swigobject_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - (richcmpfunc)SwigPyObject_richcompare, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ -#if PY_VERSION_HEX >= 0x02020000 - 0, /* tp_iter */ - 0, /* tp_iternext */ - swigobject_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0, /* tp_free */ - 0, /* tp_is_gc */ - 0, /* tp_bases */ - 0, /* tp_mro */ - 0, /* tp_cache */ - 0, /* tp_subclasses */ - 0, /* tp_weaklist */ -#endif -#if PY_VERSION_HEX >= 0x02030000 - 0, /* tp_del */ -#endif -#ifdef COUNT_ALLOCS - 0,0,0,0 /* tp_alloc -> tp_next */ -#endif - }; - swigpyobject_type = tmp; - /* for Python 3 we already assigned the ob_type in PyVarObject_HEAD_INIT() */ -#if PY_VERSION_HEX < 0x03000000 - swigpyobject_type.ob_type = &PyType_Type; -#endif - type_init = 1; - } - return &swigpyobject_type; -} - -SWIGRUNTIME PyObject * -SwigPyObject_New(void *ptr, swig_type_info *ty, int own) -{ - SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type()); - if (sobj) { - sobj->ptr = ptr; - sobj->ty = ty; - sobj->own = own; - sobj->next = 0; - } - return (PyObject *)sobj; -} - -/* ----------------------------------------------------------------------------- - * Implements a simple Swig Packed type, and use it instead of string - * ----------------------------------------------------------------------------- */ - -typedef struct { - PyObject_HEAD - void *pack; - swig_type_info *ty; - size_t size; -} SwigPyPacked; - -SWIGRUNTIME int -SwigPyPacked_print(SwigPyPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags)) -{ - char result[SWIG_BUFFER_SIZE]; - fputs("pack, v->size, 0, sizeof(result))) { - fputs("at ", fp); - fputs(result, fp); - } - fputs(v->ty->name,fp); - fputs(">", fp); - return 0; -} - -SWIGRUNTIME PyObject * -SwigPyPacked_repr(SwigPyPacked *v) -{ - char result[SWIG_BUFFER_SIZE]; - if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { - return SWIG_Python_str_FromFormat("", result, v->ty->name); - } else { - return SWIG_Python_str_FromFormat("", v->ty->name); - } -} - -SWIGRUNTIME PyObject * -SwigPyPacked_str(SwigPyPacked *v) -{ - char result[SWIG_BUFFER_SIZE]; - if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ - return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name); - } else { - return SWIG_Python_str_FromChar(v->ty->name); - } -} - -SWIGRUNTIME int -SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w) -{ - size_t i = v->size; - size_t j = w->size; - int s = (i < j) ? -1 : ((i > j) ? 1 : 0); - return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); -} - -SWIGRUNTIME PyTypeObject* _PySwigPacked_type(void); - -SWIGRUNTIME PyTypeObject* -SwigPyPacked_type(void) { - static PyTypeObject *SWIG_STATIC_POINTER(type) = _PySwigPacked_type(); - return type; -} - -SWIGRUNTIMEINLINE int -SwigPyPacked_Check(PyObject *op) { - return ((op)->ob_type == _PySwigPacked_type()) - || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0); -} - -SWIGRUNTIME void -SwigPyPacked_dealloc(PyObject *v) -{ - if (SwigPyPacked_Check(v)) { - SwigPyPacked *sobj = (SwigPyPacked *) v; - free(sobj->pack); - } - PyObject_DEL(v); -} - -SWIGRUNTIME PyTypeObject* -_PySwigPacked_type(void) { - static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; - static PyTypeObject swigpypacked_type; - static int type_init = 0; - if (!type_init) { - const PyTypeObject tmp - = { - /* PyObject header changed in Python 3 */ -#if PY_VERSION_HEX>=0x03000000 - PyVarObject_HEAD_INIT(&PyType_Type, 0) -#else - PyObject_HEAD_INIT(NULL) - 0, /* ob_size */ -#endif - (char *)"SwigPyPacked", /* tp_name */ - sizeof(SwigPyPacked), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)SwigPyPacked_dealloc, /* tp_dealloc */ - (printfunc)SwigPyPacked_print, /* tp_print */ - (getattrfunc)0, /* tp_getattr */ - (setattrfunc)0, /* tp_setattr */ - (cmpfunc)SwigPyPacked_compare, /* tp_compare */ - (reprfunc)SwigPyPacked_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - (hashfunc)0, /* tp_hash */ - (ternaryfunc)0, /* tp_call */ - (reprfunc)SwigPyPacked_str, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - swigpacked_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ -#if PY_VERSION_HEX >= 0x02020000 - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0, /* tp_free */ - 0, /* tp_is_gc */ - 0, /* tp_bases */ - 0, /* tp_mro */ - 0, /* tp_cache */ - 0, /* tp_subclasses */ - 0, /* tp_weaklist */ -#endif -#if PY_VERSION_HEX >= 0x02030000 - 0, /* tp_del */ -#endif -#ifdef COUNT_ALLOCS - 0,0,0,0 /* tp_alloc -> tp_next */ -#endif - }; - swigpypacked_type = tmp; - /* for Python 3 the ob_type already assigned in PyVarObject_HEAD_INIT() */ -#if PY_VERSION_HEX < 0x03000000 - swigpypacked_type.ob_type = &PyType_Type; -#endif - type_init = 1; - } - return &swigpypacked_type; -} - -SWIGRUNTIME PyObject * -SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty) -{ - SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type()); - if (sobj) { - void *pack = malloc(size); - if (pack) { - memcpy(pack, ptr, size); - sobj->pack = pack; - sobj->ty = ty; - sobj->size = size; - } else { - PyObject_DEL((PyObject *) sobj); - sobj = 0; - } - } - return (PyObject *) sobj; -} - -SWIGRUNTIME swig_type_info * -SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size) -{ - if (SwigPyPacked_Check(obj)) { - SwigPyPacked *sobj = (SwigPyPacked *)obj; - if (sobj->size != size) return 0; - memcpy(ptr, sobj->pack, size); - return sobj->ty; - } else { - return 0; - } -} - -/* ----------------------------------------------------------------------------- - * pointers/data manipulation - * ----------------------------------------------------------------------------- */ - -SWIGRUNTIMEINLINE PyObject * -_SWIG_This(void) -{ - return SWIG_Python_str_FromChar("this"); -} - -SWIGRUNTIME PyObject * -SWIG_This(void) -{ - static PyObject *SWIG_STATIC_POINTER(swig_this) = _SWIG_This(); - return swig_this; -} - -/* #define SWIG_PYTHON_SLOW_GETSET_THIS */ - -/* TODO: I don't know how to implement the fast getset in Python 3 right now */ -#if PY_VERSION_HEX>=0x03000000 -#define SWIG_PYTHON_SLOW_GETSET_THIS -#endif - -SWIGRUNTIME SwigPyObject * -SWIG_Python_GetSwigThis(PyObject *pyobj) -{ - if (SwigPyObject_Check(pyobj)) { - return (SwigPyObject *) pyobj; - } else { - PyObject *obj = 0; -#if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000)) - if (PyInstance_Check(pyobj)) { - obj = _PyInstance_Lookup(pyobj, SWIG_This()); - } else { - PyObject **dictptr = _PyObject_GetDictPtr(pyobj); - if (dictptr != NULL) { - PyObject *dict = *dictptr; - obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0; - } else { -#ifdef PyWeakref_CheckProxy - if (PyWeakref_CheckProxy(pyobj)) { - PyObject *wobj = PyWeakref_GET_OBJECT(pyobj); - return wobj ? SWIG_Python_GetSwigThis(wobj) : 0; - } -#endif - obj = PyObject_GetAttr(pyobj,SWIG_This()); - if (obj) { - Py_DECREF(obj); - } else { - if (PyErr_Occurred()) PyErr_Clear(); - return 0; - } - } - } -#else - obj = PyObject_GetAttr(pyobj,SWIG_This()); - if (obj) { - Py_DECREF(obj); - } else { - if (PyErr_Occurred()) PyErr_Clear(); - return 0; - } -#endif - if (obj && !SwigPyObject_Check(obj)) { - /* a PyObject is called 'this', try to get the 'real this' - SwigPyObject from it */ - return SWIG_Python_GetSwigThis(obj); - } - return (SwigPyObject *)obj; - } -} - -/* Acquire a pointer value */ - -SWIGRUNTIME int -SWIG_Python_AcquirePtr(PyObject *obj, int own) { - if (own == SWIG_POINTER_OWN) { - SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj); - if (sobj) { - int oldown = sobj->own; - sobj->own = own; - return oldown; - } - } - return 0; -} - -/* Convert a pointer value */ - -SWIGRUNTIME int -SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) { - if (!obj) return SWIG_ERROR; - if (obj == Py_None) { - if (ptr) *ptr = 0; - return SWIG_OK; - } else { - SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj); - if (own) - *own = 0; - while (sobj) { - void *vptr = sobj->ptr; - if (ty) { - swig_type_info *to = sobj->ty; - if (to == ty) { - /* no type cast needed */ - if (ptr) *ptr = vptr; - break; - } else { - swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); - if (!tc) { - sobj = (SwigPyObject *)sobj->next; - } else { - if (ptr) { - int newmemory = 0; - *ptr = SWIG_TypeCast(tc,vptr,&newmemory); - if (newmemory == SWIG_CAST_NEW_MEMORY) { - assert(own); - if (own) - *own = *own | SWIG_CAST_NEW_MEMORY; - } - } - break; - } - } - } else { - if (ptr) *ptr = vptr; - break; - } - } - if (sobj) { - if (own) - *own = *own | sobj->own; - if (flags & SWIG_POINTER_DISOWN) { - sobj->own = 0; - } - return SWIG_OK; - } else { - int res = SWIG_ERROR; - if (flags & SWIG_POINTER_IMPLICIT_CONV) { - SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; - if (data && !data->implicitconv) { - PyObject *klass = data->klass; - if (klass) { - PyObject *impconv; - data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/ - impconv = SWIG_Python_CallFunctor(klass, obj); - data->implicitconv = 0; - if (PyErr_Occurred()) { - PyErr_Clear(); - impconv = 0; - } - if (impconv) { - SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv); - if (iobj) { - void *vptr; - res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0); - if (SWIG_IsOK(res)) { - if (ptr) { - *ptr = vptr; - /* transfer the ownership to 'ptr' */ - iobj->own = 0; - res = SWIG_AddCast(res); - res = SWIG_AddNewMask(res); - } else { - res = SWIG_AddCast(res); - } - } - } - Py_DECREF(impconv); - } - } - } - } - return res; - } - } -} - -/* Convert a function ptr value */ - -SWIGRUNTIME int -SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { - if (!PyCFunction_Check(obj)) { - return SWIG_ConvertPtr(obj, ptr, ty, 0); - } else { - void *vptr = 0; - - /* here we get the method pointer for callbacks */ - const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); - const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; - if (desc) { - desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; - if (!desc) return SWIG_ERROR; - } - if (ty) { - swig_cast_info *tc = SWIG_TypeCheck(desc,ty); - if (tc) { - int newmemory = 0; - *ptr = SWIG_TypeCast(tc,vptr,&newmemory); - assert(!newmemory); /* newmemory handling not yet implemented */ - } else { - return SWIG_ERROR; - } - } else { - *ptr = vptr; - } - return SWIG_OK; - } -} - -/* Convert a packed value value */ - -SWIGRUNTIME int -SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) { - swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz); - if (!to) return SWIG_ERROR; - if (ty) { - if (to != ty) { - /* check type cast? */ - swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); - if (!tc) return SWIG_ERROR; - } - } - return SWIG_OK; -} - -/* ----------------------------------------------------------------------------- - * Create a new pointer object - * ----------------------------------------------------------------------------- */ - -/* - Create a new instance object, whitout calling __init__, and set the - 'this' attribute. -*/ - -SWIGRUNTIME PyObject* -SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) -{ -#if (PY_VERSION_HEX >= 0x02020000) - PyObject *inst = 0; - PyObject *newraw = data->newraw; - if (newraw) { - inst = PyObject_Call(newraw, data->newargs, NULL); - if (inst) { -#if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) - PyObject **dictptr = _PyObject_GetDictPtr(inst); - if (dictptr != NULL) { - PyObject *dict = *dictptr; - if (dict == NULL) { - dict = PyDict_New(); - *dictptr = dict; - PyDict_SetItem(dict, SWIG_This(), swig_this); - } - } -#else - PyObject *key = SWIG_This(); - PyObject_SetAttr(inst, key, swig_this); -#endif - } - } else { -#if PY_VERSION_HEX >= 0x03000000 - inst = PyBaseObject_Type.tp_new((PyTypeObject*) data->newargs, Py_None, Py_None); - Py_INCREF(data->newargs); - PyObject_SetAttr(inst, SWIG_This(), swig_this); - Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; -#else - PyObject *dict = PyDict_New(); - PyDict_SetItem(dict, SWIG_This(), swig_this); - inst = PyInstance_NewRaw(data->newargs, dict); - Py_DECREF(dict); -#endif - } - return inst; -#else -#if (PY_VERSION_HEX >= 0x02010000) - PyObject *inst; - PyObject *dict = PyDict_New(); - PyDict_SetItem(dict, SWIG_This(), swig_this); - inst = PyInstance_NewRaw(data->newargs, dict); - Py_DECREF(dict); - return (PyObject *) inst; -#else - PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type); - if (inst == NULL) { - return NULL; - } - inst->in_class = (PyClassObject *)data->newargs; - Py_INCREF(inst->in_class); - inst->in_dict = PyDict_New(); - if (inst->in_dict == NULL) { - Py_DECREF(inst); - return NULL; - } -#ifdef Py_TPFLAGS_HAVE_WEAKREFS - inst->in_weakreflist = NULL; -#endif -#ifdef Py_TPFLAGS_GC - PyObject_GC_Init(inst); -#endif - PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this); - return (PyObject *) inst; -#endif -#endif -} - -SWIGRUNTIME void -SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) -{ - PyObject *dict; -#if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS) - PyObject **dictptr = _PyObject_GetDictPtr(inst); - if (dictptr != NULL) { - dict = *dictptr; - if (dict == NULL) { - dict = PyDict_New(); - *dictptr = dict; - } - PyDict_SetItem(dict, SWIG_This(), swig_this); - return; - } -#endif - dict = PyObject_GetAttrString(inst, (char*)"__dict__"); - PyDict_SetItem(dict, SWIG_This(), swig_this); - Py_DECREF(dict); -} - - -SWIGINTERN PyObject * -SWIG_Python_InitShadowInstance(PyObject *args) { - PyObject *obj[2]; - if (!SWIG_Python_UnpackTuple(args,(char*)"swiginit", 2, 2, obj)) { - return NULL; - } else { - SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]); - if (sthis) { - SwigPyObject_append((PyObject*) sthis, obj[1]); - } else { - SWIG_Python_SetSwigThis(obj[0], obj[1]); - } - return SWIG_Py_Void(); - } -} - -/* Create a new pointer object */ - -SWIGRUNTIME PyObject * -SWIG_Python_NewPointerObj(void *ptr, swig_type_info *type, int flags) { - if (!ptr) { - return SWIG_Py_Void(); - } else { - int own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; - PyObject *robj = SwigPyObject_New(ptr, type, own); - SwigPyClientData *clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0; - if (clientdata && !(flags & SWIG_POINTER_NOSHADOW)) { - PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj); - if (inst) { - Py_DECREF(robj); - robj = inst; - } - } - return robj; - } -} - -/* Create a new packed object */ - -SWIGRUNTIMEINLINE PyObject * -SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { - return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void(); -} - -/* -----------------------------------------------------------------------------* - * Get type list - * -----------------------------------------------------------------------------*/ - -#ifdef SWIG_LINK_RUNTIME -void *SWIG_ReturnGlobalTypeList(void *); -#endif - -SWIGRUNTIME swig_module_info * -SWIG_Python_GetModule(void) { - static void *type_pointer = (void *)0; - /* first check if module already created */ - if (!type_pointer) { -#ifdef SWIG_LINK_RUNTIME - type_pointer = SWIG_ReturnGlobalTypeList((void *)0); -#else - type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, - (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); - if (PyErr_Occurred()) { - PyErr_Clear(); - type_pointer = (void *)0; - } -#endif - } - return (swig_module_info *) type_pointer; -} - -#if PY_MAJOR_VERSION < 2 -/* PyModule_AddObject function was introduced in Python 2.0. The following function - is copied out of Python/modsupport.c in python version 2.3.4 */ -SWIGINTERN int -PyModule_AddObject(PyObject *m, char *name, PyObject *o) -{ - PyObject *dict; - if (!PyModule_Check(m)) { - PyErr_SetString(PyExc_TypeError, - "PyModule_AddObject() needs module as first arg"); - return SWIG_ERROR; - } - if (!o) { - PyErr_SetString(PyExc_TypeError, - "PyModule_AddObject() needs non-NULL value"); - return SWIG_ERROR; - } - - dict = PyModule_GetDict(m); - if (dict == NULL) { - /* Internal error -- modules must have a dict! */ - PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", - PyModule_GetName(m)); - return SWIG_ERROR; - } - if (PyDict_SetItemString(dict, name, o)) - return SWIG_ERROR; - Py_DECREF(o); - return SWIG_OK; -} -#endif - -SWIGRUNTIME void -SWIG_Python_DestroyModule(void *vptr) -{ - swig_module_info *swig_module = (swig_module_info *) vptr; - swig_type_info **types = swig_module->types; - size_t i; - for (i =0; i < swig_module->size; ++i) { - swig_type_info *ty = types[i]; - if (ty->owndata) { - SwigPyClientData *data = (SwigPyClientData *) ty->clientdata; - if (data) SwigPyClientData_Del(data); - } - } - Py_DECREF(SWIG_This()); -} - -SWIGRUNTIME void -SWIG_Python_SetModule(swig_module_info *swig_module) { - static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} };/* Sentinel */ - -#if PY_VERSION_HEX >= 0x03000000 - /* Add a dummy module object into sys.modules */ - PyObject *module = PyImport_AddModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION); -#else - PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, - swig_empty_runtime_method_table); -#endif - PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule); - if (pointer && module) { - PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); - } else { - Py_XDECREF(pointer); - } -} - -/* The python cached type query */ -SWIGRUNTIME PyObject * -SWIG_Python_TypeCache(void) { - static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); - return cache; -} - -SWIGRUNTIME swig_type_info * -SWIG_Python_TypeQuery(const char *type) -{ - PyObject *cache = SWIG_Python_TypeCache(); - PyObject *key = SWIG_Python_str_FromChar(type); - PyObject *obj = PyDict_GetItem(cache, key); - swig_type_info *descriptor; - if (obj) { - descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj); - } else { - swig_module_info *swig_module = SWIG_Python_GetModule(); - descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); - if (descriptor) { - obj = PyCObject_FromVoidPtr(descriptor, NULL); - PyDict_SetItem(cache, key, obj); - Py_DECREF(obj); - } - } - Py_DECREF(key); - return descriptor; -} - -/* - For backward compatibility only -*/ -#define SWIG_POINTER_EXCEPTION 0 -#define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) -#define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) - -SWIGRUNTIME int -SWIG_Python_AddErrMesg(const char* mesg, int infront) -{ - if (PyErr_Occurred()) { - PyObject *type = 0; - PyObject *value = 0; - PyObject *traceback = 0; - PyErr_Fetch(&type, &value, &traceback); - if (value) { - PyObject *old_str = PyObject_Str(value); - Py_XINCREF(type); - PyErr_Clear(); - if (infront) { - PyErr_Format(type, "%s %s", mesg, SWIG_Python_str_AsChar(old_str)); - } else { - PyErr_Format(type, "%s %s", SWIG_Python_str_AsChar(old_str), mesg); - } - Py_DECREF(old_str); - } - return 1; - } else { - return 0; - } -} - -SWIGRUNTIME int -SWIG_Python_ArgFail(int argnum) -{ - if (PyErr_Occurred()) { - /* add information about failing argument */ - char mesg[256]; - PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum); - return SWIG_Python_AddErrMesg(mesg, 1); - } else { - return 0; - } -} - -SWIGRUNTIMEINLINE const char * -SwigPyObject_GetDesc(PyObject *self) -{ - SwigPyObject *v = (SwigPyObject *)self; - swig_type_info *ty = v ? v->ty : 0; - return ty ? ty->str : (char*)""; -} - -SWIGRUNTIME void -SWIG_Python_TypeError(const char *type, PyObject *obj) -{ - if (type) { -#if defined(SWIG_COBJECT_TYPES) - if (obj && SwigPyObject_Check(obj)) { - const char *otype = (const char *) SwigPyObject_GetDesc(obj); - if (otype) { - PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received", - type, otype); - return; - } - } else -#endif - { - const char *otype = (obj ? obj->ob_type->tp_name : 0); - if (otype) { - PyObject *str = PyObject_Str(obj); - const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0; - if (cstr) { - PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", - type, otype, cstr); - } else { - PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", - type, otype); - } - Py_XDECREF(str); - return; - } - } - PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); - } else { - PyErr_Format(PyExc_TypeError, "unexpected type is received"); - } -} - - -/* Convert a pointer value, signal an exception on a type mismatch */ -SWIGRUNTIME void * -SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int argnum, int flags) { - void *result; - if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { - PyErr_Clear(); - if (flags & SWIG_POINTER_EXCEPTION) { - SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); - SWIG_Python_ArgFail(argnum); - } - } - return result; -} - - -#ifdef __cplusplus -#if 0 -{ /* cc-mode */ -#endif -} -#endif +/* Generic buffer size */ +#ifndef SWIG_BUFFER_SIZE +# define SWIG_BUFFER_SIZE 1024 +#endif + +/* Flags for pointer conversions */ +#define SWIG_POINTER_DISOWN 0x1 +#define SWIG_CAST_NEW_MEMORY 0x2 + +/* Flags for new pointer objects */ +#define SWIG_POINTER_OWN 0x1 + + +/* + Flags/methods for returning states. + + The SWIG conversion methods, as ConvertPtr, return an integer + that tells if the conversion was successful or not. And if not, + an error code can be returned (see swigerrors.swg for the codes). + + Use the following macros/flags to set or process the returning + states. + + In old versions of SWIG, code such as the following was usually written: + + if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { + // success code + } else { + //fail code + } + + Now you can be more explicit: + + int res = SWIG_ConvertPtr(obj,vptr,ty.flags); + if (SWIG_IsOK(res)) { + // success code + } else { + // fail code + } + + which is the same really, but now you can also do + + Type *ptr; + int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); + if (SWIG_IsOK(res)) { + // success code + if (SWIG_IsNewObj(res) { + ... + delete *ptr; + } else { + ... + } + } else { + // fail code + } + + I.e., now SWIG_ConvertPtr can return new objects and you can + identify the case and take care of the deallocation. Of course that + also requires SWIG_ConvertPtr to return new result values, such as + + int SWIG_ConvertPtr(obj, ptr,...) { + if () { + if () { + *ptr = ; + return SWIG_NEWOBJ; + } else { + *ptr = ; + return SWIG_OLDOBJ; + } + } else { + return SWIG_BADOBJ; + } + } + + Of course, returning the plain '0(success)/-1(fail)' still works, but you can be + more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the + SWIG errors code. + + Finally, if the SWIG_CASTRANK_MODE is enabled, the result code + allows to return the 'cast rank', for example, if you have this + + int food(double) + int fooi(int); + + and you call + + food(1) // cast rank '1' (1 -> 1.0) + fooi(1) // cast rank '0' + + just use the SWIG_AddCast()/SWIG_CheckState() +*/ + +#define SWIG_OK (0) +#define SWIG_ERROR (-1) +#define SWIG_IsOK(r) (r >= 0) +#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) + +/* The CastRankLimit says how many bits are used for the cast rank */ +#define SWIG_CASTRANKLIMIT (1 << 8) +/* The NewMask denotes the object was created (using new/malloc) */ +#define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) +/* The TmpMask is for in/out typemaps that use temporal objects */ +#define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) +/* Simple returning values */ +#define SWIG_BADOBJ (SWIG_ERROR) +#define SWIG_OLDOBJ (SWIG_OK) +#define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) +#define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) +/* Check, add and del mask methods */ +#define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) +#define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) +#define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) +#define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) +#define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) +#define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) + +/* Cast-Rank Mode */ +#if defined(SWIG_CASTRANK_MODE) +# ifndef SWIG_TypeRank +# define SWIG_TypeRank unsigned long +# endif +# ifndef SWIG_MAXCASTRANK /* Default cast allowed */ +# define SWIG_MAXCASTRANK (2) +# endif +# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) +# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) +SWIGINTERNINLINE int SWIG_AddCast(int r) { + return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; +} +SWIGINTERNINLINE int SWIG_CheckState(int r) { + return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; +} +#else /* no cast-rank mode */ +# define SWIG_AddCast +# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) +#endif + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *(*swig_converter_func)(void *, int *); +typedef struct swig_type_info *(*swig_dycast_func)(void **); + +/* Structure to store information on one type */ +typedef struct swig_type_info { + const char *name; /* mangled name of this type */ + const char *str; /* human readable name of this type */ + swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ + struct swig_cast_info *cast; /* linked list of types that can cast into this type */ + void *clientdata; /* language specific type data */ + int owndata; /* flag if the structure owns the clientdata */ +} swig_type_info; + +/* Structure to store a type and conversion function used for casting */ +typedef struct swig_cast_info { + swig_type_info *type; /* pointer to type that is equivalent to this type */ + swig_converter_func converter; /* function to cast the void pointers */ + struct swig_cast_info *next; /* pointer to next cast in linked list */ + struct swig_cast_info *prev; /* pointer to the previous cast */ +} swig_cast_info; + +/* Structure used to store module information + * Each module generates one structure like this, and the runtime collects + * all of these structures and stores them in a circularly linked list.*/ +typedef struct swig_module_info { + swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ + size_t size; /* Number of types in this module */ + struct swig_module_info *next; /* Pointer to next element in circularly linked list */ + swig_type_info **type_initial; /* Array of initially generated type structures */ + swig_cast_info **cast_initial; /* Array of initially generated casting structures */ + void *clientdata; /* Language specific module data */ +} swig_module_info; + +/* + Compare two type names skipping the space characters, therefore + "char*" == "char *" and "Class" == "Class", etc. + + Return 0 when the two name types are equivalent, as in + strncmp, but skipping ' '. +*/ +SWIGRUNTIME int +SWIG_TypeNameComp(const char *f1, const char *l1, + const char *f2, const char *l2) { + for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { + while ((*f1 == ' ') && (f1 != l1)) ++f1; + while ((*f2 == ' ') && (f2 != l2)) ++f2; + if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; + } + return (int)((l1 - f1) - (l2 - f2)); +} + +/* + Check type equivalence in a name list like ||... + Return 0 if not equal, 1 if equal +*/ +SWIGRUNTIME int +SWIG_TypeEquiv(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + +/* + Check type equivalence in a name list like ||... + Return 0 if equal, -1 if nb < tb, 1 if nb > tb +*/ +SWIGRUNTIME int +SWIG_TypeCompare(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + + +/* + Check the typename +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheck(const char *c, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (strcmp(iter->type->name, c) == 0) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (iter->type == from) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Cast a pointer up an inheritance hierarchy +*/ +SWIGRUNTIMEINLINE void * +SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { + return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); +} + +/* + Dynamic pointer casting. Down an inheritance hierarchy +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { + swig_type_info *lastty = ty; + if (!ty || !ty->dcast) return ty; + while (ty && (ty->dcast)) { + ty = (*ty->dcast)(ptr); + if (ty) lastty = ty; + } + return lastty; +} + +/* + Return the name associated with this type +*/ +SWIGRUNTIMEINLINE const char * +SWIG_TypeName(const swig_type_info *ty) { + return ty->name; +} + +/* + Return the pretty name associated with this type, + that is an unmangled type name in a form presentable to the user. +*/ +SWIGRUNTIME const char * +SWIG_TypePrettyName(const swig_type_info *type) { + /* The "str" field contains the equivalent pretty names of the + type, separated by vertical-bar characters. We choose + to print the last name, as it is often (?) the most + specific. */ + if (!type) return NULL; + if (type->str != NULL) { + const char *last_name = type->str; + const char *s; + for (s = type->str; *s; s++) + if (*s == '|') last_name = s+1; + return last_name; + } + else + return type->name; +} + +/* + Set the clientdata field for a type +*/ +SWIGRUNTIME void +SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { + swig_cast_info *cast = ti->cast; + /* if (ti->clientdata == clientdata) return; */ + ti->clientdata = clientdata; + + while (cast) { + if (!cast->converter) { + swig_type_info *tc = cast->type; + if (!tc->clientdata) { + SWIG_TypeClientData(tc, clientdata); + } + } + cast = cast->next; + } +} +SWIGRUNTIME void +SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { + SWIG_TypeClientData(ti, clientdata); + ti->owndata = 1; +} + +/* + Search for a swig_type_info structure only by mangled name + Search is a O(log #types) + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_MangledTypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + swig_module_info *iter = start; + do { + if (iter->size) { + register size_t l = 0; + register size_t r = iter->size - 1; + do { + /* since l+r >= 0, we can (>> 1) instead (/ 2) */ + register size_t i = (l + r) >> 1; + const char *iname = iter->types[i]->name; + if (iname) { + register int compare = strcmp(name, iname); + if (compare == 0) { + return iter->types[i]; + } else if (compare < 0) { + if (i) { + r = i - 1; + } else { + break; + } + } else if (compare > 0) { + l = i + 1; + } + } else { + break; /* should never happen */ + } + } while (l <= r); + } + iter = iter->next; + } while (iter != end); + return 0; +} + +/* + Search for a swig_type_info structure for either a mangled name or a human readable name. + It first searches the mangled names of the types, which is a O(log #types) + If a type is not found it then searches the human readable names, which is O(#types). + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + /* STEP 1: Search the name field using binary search */ + swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); + if (ret) { + return ret; + } else { + /* STEP 2: If the type hasn't been found, do a complete search + of the str field (the human readable name) */ + swig_module_info *iter = start; + do { + register size_t i = 0; + for (; i < iter->size; ++i) { + if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) + return iter->types[i]; + } + iter = iter->next; + } while (iter != end); + } + + /* neither found a match */ + return 0; +} + +/* + Pack binary data into a string +*/ +SWIGRUNTIME char * +SWIG_PackData(char *c, void *ptr, size_t sz) { + static const char hex[17] = "0123456789abcdef"; + register const unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register unsigned char uu = *u; + *(c++) = hex[(uu & 0xf0) >> 4]; + *(c++) = hex[uu & 0xf]; + } + return c; +} + +/* + Unpack binary data from a string +*/ +SWIGRUNTIME const char * +SWIG_UnpackData(const char *c, void *ptr, size_t sz) { + register unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register char d = *(c++); + register unsigned char uu; + if ((d >= '0') && (d <= '9')) + uu = ((d - '0') << 4); + else if ((d >= 'a') && (d <= 'f')) + uu = ((d - ('a'-10)) << 4); + else + return (char *) 0; + d = *(c++); + if ((d >= '0') && (d <= '9')) + uu |= (d - '0'); + else if ((d >= 'a') && (d <= 'f')) + uu |= (d - ('a'-10)); + else + return (char *) 0; + *u = uu; + } + return c; +} + +/* + Pack 'void *' into a string buffer. +*/ +SWIGRUNTIME char * +SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { + char *r = buff; + if ((2*sizeof(void *) + 2) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,&ptr,sizeof(void *)); + if (strlen(name) + 1 > (bsz - (r - buff))) return 0; + strcpy(r,name); + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + *ptr = (void *) 0; + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sizeof(void *)); +} + +SWIGRUNTIME char * +SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { + char *r = buff; + size_t lname = (name ? strlen(name) : 0); + if ((2*sz + 2 + lname) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,ptr,sz); + if (lname) { + strncpy(r,name,lname+1); + } else { + *r = 0; + } + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + memset(ptr,0,sz); + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sz); +} + +#ifdef __cplusplus +} +#endif + +/* Errors in SWIG */ +#define SWIG_UnknownError -1 +#define SWIG_IOError -2 +#define SWIG_RuntimeError -3 +#define SWIG_IndexError -4 +#define SWIG_TypeError -5 +#define SWIG_DivisionByZero -6 +#define SWIG_OverflowError -7 +#define SWIG_SyntaxError -8 +#define SWIG_ValueError -9 +#define SWIG_SystemError -10 +#define SWIG_AttributeError -11 +#define SWIG_MemoryError -12 +#define SWIG_NullReferenceError -13 + + + +/* Compatibility macros for Python 3 */ +#if PY_VERSION_HEX >= 0x03000000 + +#define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type) +#define PyInt_Check(x) PyLong_Check(x) +#define PyInt_AsLong(x) PyLong_AsLong(x) +#define PyInt_FromLong(x) PyLong_FromLong(x) +#define PyString_Check(name) PyBytes_Check(name) +#define PyString_FromString(x) PyUnicode_FromString(x) +#define PyString_Format(fmt, args) PyUnicode_Format(fmt, args) +#define PyString_AsString(str) PyBytes_AsString(str) +#define PyString_Size(str) PyBytes_Size(str) +#define PyString_InternFromString(key) PyUnicode_InternFromString(key) +#define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE +#define PyString_AS_STRING(x) PyUnicode_AS_STRING(x) +#define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x) + +#endif + +#ifndef Py_TYPE +# define Py_TYPE(op) ((op)->ob_type) +#endif + +/* SWIG APIs for compatibility of both Python 2 & 3 */ + +#if PY_VERSION_HEX >= 0x03000000 +# define SWIG_Python_str_FromFormat PyUnicode_FromFormat +#else +# define SWIG_Python_str_FromFormat PyString_FromFormat +#endif + + +/* Warning: This function will allocate a new string in Python 3, + * so please call SWIG_Python_str_DelForPy3(x) to free the space. + */ +SWIGINTERN char* +SWIG_Python_str_AsChar(PyObject *str) +{ +#if PY_VERSION_HEX >= 0x03000000 + char *cstr; + char *newstr; + Py_ssize_t len; + str = PyUnicode_AsUTF8String(str); + PyBytes_AsStringAndSize(str, &cstr, &len); + newstr = (char *) malloc(len+1); + memcpy(newstr, cstr, len+1); + Py_XDECREF(str); + return newstr; +#else + return PyString_AsString(str); +#endif +} + +#if PY_VERSION_HEX >= 0x03000000 +# define SWIG_Python_str_DelForPy3(x) free( (void*) (x) ) +#else +# define SWIG_Python_str_DelForPy3(x) +#endif + + +SWIGINTERN PyObject* +SWIG_Python_str_FromChar(const char *c) +{ +#if PY_VERSION_HEX >= 0x03000000 + return PyUnicode_FromString(c); +#else + return PyString_FromString(c); +#endif +} + +/* Add PyOS_snprintf for old Pythons */ +#if PY_VERSION_HEX < 0x02020000 +# if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) +# define PyOS_snprintf _snprintf +# else +# define PyOS_snprintf snprintf +# endif +#endif + +/* A crude PyString_FromFormat implementation for old Pythons */ +#if PY_VERSION_HEX < 0x02020000 + +#ifndef SWIG_PYBUFFER_SIZE +# define SWIG_PYBUFFER_SIZE 1024 +#endif + +static PyObject * +PyString_FromFormat(const char *fmt, ...) { + va_list ap; + char buf[SWIG_PYBUFFER_SIZE * 2]; + int res; + va_start(ap, fmt); + res = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf); +} +#endif + +/* Add PyObject_Del for old Pythons */ +#if PY_VERSION_HEX < 0x01060000 +# define PyObject_Del(op) PyMem_DEL((op)) +#endif +#ifndef PyObject_DEL +# define PyObject_DEL PyObject_Del +#endif + +/* A crude PyExc_StopIteration exception for old Pythons */ +#if PY_VERSION_HEX < 0x02020000 +# ifndef PyExc_StopIteration +# define PyExc_StopIteration PyExc_RuntimeError +# endif +# ifndef PyObject_GenericGetAttr +# define PyObject_GenericGetAttr 0 +# endif +#endif + +/* Py_NotImplemented is defined in 2.1 and up. */ +#if PY_VERSION_HEX < 0x02010000 +# ifndef Py_NotImplemented +# define Py_NotImplemented PyExc_RuntimeError +# endif +#endif + +/* A crude PyString_AsStringAndSize implementation for old Pythons */ +#if PY_VERSION_HEX < 0x02010000 +# ifndef PyString_AsStringAndSize +# define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;} +# endif +#endif + +/* PySequence_Size for old Pythons */ +#if PY_VERSION_HEX < 0x02000000 +# ifndef PySequence_Size +# define PySequence_Size PySequence_Length +# endif +#endif + +/* PyBool_FromLong for old Pythons */ +#if PY_VERSION_HEX < 0x02030000 +static +PyObject *PyBool_FromLong(long ok) +{ + PyObject *result = ok ? Py_True : Py_False; + Py_INCREF(result); + return result; +} +#endif + +/* Py_ssize_t for old Pythons */ +/* This code is as recommended by: */ +/* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */ +#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) +typedef int Py_ssize_t; +# define PY_SSIZE_T_MAX INT_MAX +# define PY_SSIZE_T_MIN INT_MIN +typedef inquiry lenfunc; +typedef intargfunc ssizeargfunc; +typedef intintargfunc ssizessizeargfunc; +typedef intobjargproc ssizeobjargproc; +typedef intintobjargproc ssizessizeobjargproc; +typedef getreadbufferproc readbufferproc; +typedef getwritebufferproc writebufferproc; +typedef getsegcountproc segcountproc; +typedef getcharbufferproc charbufferproc; +static long PyNumber_AsSsize_t (PyObject *x, void *SWIGUNUSEDPARM(exc)) +{ + long result = 0; + PyObject *i = PyNumber_Int(x); + if (i) { + result = PyInt_AsLong(i); + Py_DECREF(i); + } + return result; +} +#endif + +#if PY_VERSION_HEX < 0x02040000 +#define Py_VISIT(op) \ + do { \ + if (op) { \ + int vret = visit((op), arg); \ + if (vret) \ + return vret; \ + } \ + } while (0) +#endif + +#if PY_VERSION_HEX < 0x02030000 +typedef struct { + PyTypeObject type; + PyNumberMethods as_number; + PyMappingMethods as_mapping; + PySequenceMethods as_sequence; + PyBufferProcs as_buffer; + PyObject *name, *slots; +} PyHeapTypeObject; +#endif + +#if PY_VERSION_HEX < 0x02030000 +typedef destructor freefunc; +#endif + +#if ((PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 6) || \ + (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION > 0) || \ + (PY_MAJOR_VERSION > 3)) +# define SWIGPY_USE_CAPSULE +# define SWIGPY_CAPSULE_NAME ((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME) +#endif + +#if PY_VERSION_HEX < 0x03020000 +#define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type) +#define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name) +#endif + +/* ----------------------------------------------------------------------------- + * error manipulation + * ----------------------------------------------------------------------------- */ + +SWIGRUNTIME PyObject* +SWIG_Python_ErrorType(int code) { + PyObject* type = 0; + switch(code) { + case SWIG_MemoryError: + type = PyExc_MemoryError; + break; + case SWIG_IOError: + type = PyExc_IOError; + break; + case SWIG_RuntimeError: + type = PyExc_RuntimeError; + break; + case SWIG_IndexError: + type = PyExc_IndexError; + break; + case SWIG_TypeError: + type = PyExc_TypeError; + break; + case SWIG_DivisionByZero: + type = PyExc_ZeroDivisionError; + break; + case SWIG_OverflowError: + type = PyExc_OverflowError; + break; + case SWIG_SyntaxError: + type = PyExc_SyntaxError; + break; + case SWIG_ValueError: + type = PyExc_ValueError; + break; + case SWIG_SystemError: + type = PyExc_SystemError; + break; + case SWIG_AttributeError: + type = PyExc_AttributeError; + break; + default: + type = PyExc_RuntimeError; + } + return type; +} + + +SWIGRUNTIME void +SWIG_Python_AddErrorMsg(const char* mesg) +{ + PyObject *type = 0; + PyObject *value = 0; + PyObject *traceback = 0; + + if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback); + if (value) { + char *tmp; + PyObject *old_str = PyObject_Str(value); + PyErr_Clear(); + Py_XINCREF(type); + + PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); + SWIG_Python_str_DelForPy3(tmp); + Py_DECREF(old_str); + Py_DECREF(value); + } else { + PyErr_SetString(PyExc_RuntimeError, mesg); + } +} + +#if defined(SWIG_PYTHON_NO_THREADS) +# if defined(SWIG_PYTHON_THREADS) +# undef SWIG_PYTHON_THREADS +# endif +#endif +#if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */ +# if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL) +# if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */ +# define SWIG_PYTHON_USE_GIL +# endif +# endif +# if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ +# ifndef SWIG_PYTHON_INITIALIZE_THREADS +# define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() +# endif +# ifdef __cplusplus /* C++ code */ + class SWIG_Python_Thread_Block { + bool status; + PyGILState_STATE state; + public: + void end() { if (status) { PyGILState_Release(state); status = false;} } + SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {} + ~SWIG_Python_Thread_Block() { end(); } + }; + class SWIG_Python_Thread_Allow { + bool status; + PyThreadState *save; + public: + void end() { if (status) { PyEval_RestoreThread(save); status = false; }} + SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} + ~SWIG_Python_Thread_Allow() { end(); } + }; +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block +# define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end() +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow +# define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end() +# else /* C code */ +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure() +# define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block) +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread() +# define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow) +# endif +# else /* Old thread way, not implemented, user must provide it */ +# if !defined(SWIG_PYTHON_INITIALIZE_THREADS) +# define SWIG_PYTHON_INITIALIZE_THREADS +# endif +# if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK) +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK +# endif +# if !defined(SWIG_PYTHON_THREAD_END_BLOCK) +# define SWIG_PYTHON_THREAD_END_BLOCK +# endif +# if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW) +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW +# endif +# if !defined(SWIG_PYTHON_THREAD_END_ALLOW) +# define SWIG_PYTHON_THREAD_END_ALLOW +# endif +# endif +#else /* No thread support */ +# define SWIG_PYTHON_INITIALIZE_THREADS +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK +# define SWIG_PYTHON_THREAD_END_BLOCK +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW +# define SWIG_PYTHON_THREAD_END_ALLOW +#endif + +/* ----------------------------------------------------------------------------- + * Python API portion that goes into the runtime + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* ----------------------------------------------------------------------------- + * Constant declarations + * ----------------------------------------------------------------------------- */ + +/* Constant Types */ +#define SWIG_PY_POINTER 4 +#define SWIG_PY_BINARY 5 + +/* Constant information structure */ +typedef struct swig_const_info { + int type; + char *name; + long lvalue; + double dvalue; + void *pvalue; + swig_type_info **ptype; +} swig_const_info; + + +/* ----------------------------------------------------------------------------- + * Wrapper of PyInstanceMethod_New() used in Python 3 + * It is exported to the generated module, used for -fastproxy + * ----------------------------------------------------------------------------- */ +#if PY_VERSION_HEX >= 0x03000000 +SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) +{ + return PyInstanceMethod_New(func); +} +#else +SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *SWIGUNUSEDPARM(func)) +{ + return NULL; +} +#endif + +#ifdef __cplusplus +} +#endif + + +/* ----------------------------------------------------------------------------- + * pyrun.swg + * + * This file contains the runtime support for Python modules + * and includes code for managing global variables and pointer + * type checking. + * + * ----------------------------------------------------------------------------- */ + +/* Common SWIG API */ + +/* for raw pointers */ +#define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0) +#define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags) +#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own) + +#ifdef SWIGPYTHON_BUILTIN +#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(self, ptr, type, flags) +#else +#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) +#endif + +#define SWIG_InternalNewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) + +#define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty) +#define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src) +#define swig_owntype int + +/* for raw packed data */ +#define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) +#define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) + +/* for class or struct pointers */ +#define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) +#define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) + +/* for C or C++ function pointers */ +#define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type) +#define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(NULL, ptr, type, 0) + +/* for C++ member pointers, ie, member methods */ +#define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) +#define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) + + +/* Runtime API */ + +#define SWIG_GetModule(clientdata) SWIG_Python_GetModule() +#define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer) +#define SWIG_NewClientData(obj) SwigPyClientData_New(obj) + +#define SWIG_SetErrorObj SWIG_Python_SetErrorObj +#define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg +#define SWIG_ErrorType(code) SWIG_Python_ErrorType(code) +#define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) +#define SWIG_fail goto fail + + +/* Runtime API implementation */ + +/* Error manipulation */ + +SWIGINTERN void +SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + PyErr_SetObject(errtype, obj); + Py_DECREF(obj); + SWIG_PYTHON_THREAD_END_BLOCK; +} + +SWIGINTERN void +SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + PyErr_SetString(errtype, (char *) msg); + SWIG_PYTHON_THREAD_END_BLOCK; +} + +#define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj) + +/* Set a constant value */ + +#if defined(SWIGPYTHON_BUILTIN) + +SWIGINTERN void +SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) { + PyObject *s = PyString_InternFromString(key); + PyList_Append(seq, s); + Py_DECREF(s); +} + +SWIGINTERN void +SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) { + PyDict_SetItemString(d, (char *)name, obj); + Py_DECREF(obj); + if (public_interface) + SwigPyBuiltin_AddPublicSymbol(public_interface, name); +} + +#else + +SWIGINTERN void +SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) { + PyDict_SetItemString(d, (char *)name, obj); + Py_DECREF(obj); +} + +#endif + +/* Append a value to the result obj */ + +SWIGINTERN PyObject* +SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { +#if !defined(SWIG_PYTHON_OUTPUT_TUPLE) + if (!result) { + result = obj; + } else if (result == Py_None) { + Py_DECREF(result); + result = obj; + } else { + if (!PyList_Check(result)) { + PyObject *o2 = result; + result = PyList_New(1); + PyList_SetItem(result, 0, o2); + } + PyList_Append(result,obj); + Py_DECREF(obj); + } + return result; +#else + PyObject* o2; + PyObject* o3; + if (!result) { + result = obj; + } else if (result == Py_None) { + Py_DECREF(result); + result = obj; + } else { + if (!PyTuple_Check(result)) { + o2 = result; + result = PyTuple_New(1); + PyTuple_SET_ITEM(result, 0, o2); + } + o3 = PyTuple_New(1); + PyTuple_SET_ITEM(o3, 0, obj); + o2 = result; + result = PySequence_Concat(o2, o3); + Py_DECREF(o2); + Py_DECREF(o3); + } + return result; +#endif +} + +/* Unpack the argument tuple */ + +SWIGINTERN int +SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs) +{ + if (!args) { + if (!min && !max) { + return 1; + } else { + PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", + name, (min == max ? "" : "at least "), (int)min); + return 0; + } + } + if (!PyTuple_Check(args)) { + if (min <= 1 && max >= 1) { + register int i; + objs[0] = args; + for (i = 1; i < max; ++i) { + objs[i] = 0; + } + return 2; + } + PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple"); + return 0; + } else { + register Py_ssize_t l = PyTuple_GET_SIZE(args); + if (l < min) { + PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", + name, (min == max ? "" : "at least "), (int)min, (int)l); + return 0; + } else if (l > max) { + PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", + name, (min == max ? "" : "at most "), (int)max, (int)l); + return 0; + } else { + register int i; + for (i = 0; i < l; ++i) { + objs[i] = PyTuple_GET_ITEM(args, i); + } + for (; l < max; ++l) { + objs[l] = 0; + } + return i + 1; + } + } +} + +/* A functor is a function object with one single object argument */ +#if PY_VERSION_HEX >= 0x02020000 +#define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); +#else +#define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunction(functor, "O", obj); +#endif + +/* + Helper for static pointer initialization for both C and C++ code, for example + static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...); +*/ +#ifdef __cplusplus +#define SWIG_STATIC_POINTER(var) var +#else +#define SWIG_STATIC_POINTER(var) var = 0; if (!var) var +#endif + +/* ----------------------------------------------------------------------------- + * Pointer declarations + * ----------------------------------------------------------------------------- */ + +/* Flags for new pointer objects */ +#define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1) +#define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN) + +#define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1) + +#define SWIG_BUILTIN_TP_INIT (SWIG_POINTER_OWN << 2) +#define SWIG_BUILTIN_INIT (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN) + +#ifdef __cplusplus +extern "C" { +#endif + +/* How to access Py_None */ +#if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# ifndef SWIG_PYTHON_NO_BUILD_NONE +# ifndef SWIG_PYTHON_BUILD_NONE +# define SWIG_PYTHON_BUILD_NONE +# endif +# endif +#endif + +#ifdef SWIG_PYTHON_BUILD_NONE +# ifdef Py_None +# undef Py_None +# define Py_None SWIG_Py_None() +# endif +SWIGRUNTIMEINLINE PyObject * +_SWIG_Py_None(void) +{ + PyObject *none = Py_BuildValue((char*)""); + Py_DECREF(none); + return none; +} +SWIGRUNTIME PyObject * +SWIG_Py_None(void) +{ + static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None(); + return none; +} +#endif + +/* The python void return value */ + +SWIGRUNTIMEINLINE PyObject * +SWIG_Py_Void(void) +{ + PyObject *none = Py_None; + Py_INCREF(none); + return none; +} + +/* SwigPyClientData */ + +typedef struct { + PyObject *klass; + PyObject *newraw; + PyObject *newargs; + PyObject *destroy; + int delargs; + int implicitconv; + PyTypeObject *pytype; +} SwigPyClientData; + +SWIGRUNTIMEINLINE int +SWIG_Python_CheckImplicit(swig_type_info *ty) +{ + SwigPyClientData *data = (SwigPyClientData *)ty->clientdata; + return data ? data->implicitconv : 0; +} + +SWIGRUNTIMEINLINE PyObject * +SWIG_Python_ExceptionType(swig_type_info *desc) { + SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0; + PyObject *klass = data ? data->klass : 0; + return (klass ? klass : PyExc_RuntimeError); +} + + +SWIGRUNTIME SwigPyClientData * +SwigPyClientData_New(PyObject* obj) +{ + if (!obj) { + return 0; + } else { + SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData)); + /* the klass element */ + data->klass = obj; + Py_INCREF(data->klass); + /* the newraw method and newargs arguments used to create a new raw instance */ + if (PyClass_Check(obj)) { + data->newraw = 0; + data->newargs = obj; + Py_INCREF(obj); + } else { +#if (PY_VERSION_HEX < 0x02020000) + data->newraw = 0; +#else + data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__"); +#endif + if (data->newraw) { + Py_INCREF(data->newraw); + data->newargs = PyTuple_New(1); + PyTuple_SetItem(data->newargs, 0, obj); + } else { + data->newargs = obj; + } + Py_INCREF(data->newargs); + } + /* the destroy method, aka as the C++ delete method */ + data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__"); + if (PyErr_Occurred()) { + PyErr_Clear(); + data->destroy = 0; + } + if (data->destroy) { + int flags; + Py_INCREF(data->destroy); + flags = PyCFunction_GET_FLAGS(data->destroy); +#ifdef METH_O + data->delargs = !(flags & (METH_O)); +#else + data->delargs = 0; +#endif + } else { + data->delargs = 0; + } + data->implicitconv = 0; + data->pytype = 0; + return data; + } +} + +SWIGRUNTIME void +SwigPyClientData_Del(SwigPyClientData *data) { + Py_XDECREF(data->newraw); + Py_XDECREF(data->newargs); + Py_XDECREF(data->destroy); +} + +/* =============== SwigPyObject =====================*/ + +typedef struct { + PyObject_HEAD + void *ptr; + swig_type_info *ty; + int own; + PyObject *next; +#ifdef SWIGPYTHON_BUILTIN + PyObject *dict; +#endif +} SwigPyObject; + +SWIGRUNTIME PyObject * +SwigPyObject_long(SwigPyObject *v) +{ + return PyLong_FromVoidPtr(v->ptr); +} + +SWIGRUNTIME PyObject * +SwigPyObject_format(const char* fmt, SwigPyObject *v) +{ + PyObject *res = NULL; + PyObject *args = PyTuple_New(1); + if (args) { + if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) { + PyObject *ofmt = SWIG_Python_str_FromChar(fmt); + if (ofmt) { +#if PY_VERSION_HEX >= 0x03000000 + res = PyUnicode_Format(ofmt,args); +#else + res = PyString_Format(ofmt,args); +#endif + Py_DECREF(ofmt); + } + Py_DECREF(args); + } + } + return res; +} + +SWIGRUNTIME PyObject * +SwigPyObject_oct(SwigPyObject *v) +{ + return SwigPyObject_format("%o",v); +} + +SWIGRUNTIME PyObject * +SwigPyObject_hex(SwigPyObject *v) +{ + return SwigPyObject_format("%x",v); +} + +SWIGRUNTIME PyObject * +#ifdef METH_NOARGS +SwigPyObject_repr(SwigPyObject *v) +#else +SwigPyObject_repr(SwigPyObject *v, PyObject *args) +#endif +{ + const char *name = SWIG_TypePrettyName(v->ty); + PyObject *repr = SWIG_Python_str_FromFormat("", name, (void *)v); + if (v->next) { +# ifdef METH_NOARGS + PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); +# else + PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next, args); +# endif +# if PY_VERSION_HEX >= 0x03000000 + PyObject *joined = PyUnicode_Concat(repr, nrep); + Py_DecRef(repr); + Py_DecRef(nrep); + repr = joined; +# else + PyString_ConcatAndDel(&repr,nrep); +# endif + } + return repr; +} + +SWIGRUNTIME int +SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) +{ + char *str; +#ifdef METH_NOARGS + PyObject *repr = SwigPyObject_repr(v); +#else + PyObject *repr = SwigPyObject_repr(v, NULL); +#endif + if (repr) { + str = SWIG_Python_str_AsChar(repr); + fputs(str, fp); + SWIG_Python_str_DelForPy3(str); + Py_DECREF(repr); + return 0; + } else { + return 1; + } +} + +SWIGRUNTIME PyObject * +SwigPyObject_str(SwigPyObject *v) +{ + char result[SWIG_BUFFER_SIZE]; + return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ? + SWIG_Python_str_FromChar(result) : 0; +} + +SWIGRUNTIME int +SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w) +{ + void *i = v->ptr; + void *j = w->ptr; + return (i < j) ? -1 : ((i > j) ? 1 : 0); +} + +/* Added for Python 3.x, would it also be useful for Python 2.x? */ +SWIGRUNTIME PyObject* +SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op) +{ + PyObject* res; + if( op != Py_EQ && op != Py_NE ) { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } + res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0); + return res; +} + + +SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void); + +#ifdef SWIGPYTHON_BUILTIN +static swig_type_info *SwigPyObject_stype = 0; +SWIGRUNTIME PyTypeObject* +SwigPyObject_type(void) { + SwigPyClientData *cd; + assert(SwigPyObject_stype); + cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; + assert(cd); + assert(cd->pytype); + return cd->pytype; +} +#else +SWIGRUNTIME PyTypeObject* +SwigPyObject_type(void) { + static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce(); + return type; +} +#endif + +SWIGRUNTIMEINLINE int +SwigPyObject_Check(PyObject *op) { +#ifdef SWIGPYTHON_BUILTIN + PyTypeObject *target_tp = SwigPyObject_type(); + if (PyType_IsSubtype(op->ob_type, target_tp)) + return 1; + return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0); +#else + return (Py_TYPE(op) == SwigPyObject_type()) + || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0); +#endif +} + +SWIGRUNTIME PyObject * +SwigPyObject_New(void *ptr, swig_type_info *ty, int own); + +SWIGRUNTIME void +SwigPyObject_dealloc(PyObject *v) +{ + SwigPyObject *sobj = (SwigPyObject *) v; + PyObject *next = sobj->next; + if (sobj->own == SWIG_POINTER_OWN) { + swig_type_info *ty = sobj->ty; + SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; + PyObject *destroy = data ? data->destroy : 0; + if (destroy) { + /* destroy is always a VARARGS method */ + PyObject *res; + if (data->delargs) { + /* we need to create a temporary object to carry the destroy operation */ + PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); + res = SWIG_Python_CallFunctor(destroy, tmp); + Py_DECREF(tmp); + } else { + PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); + PyObject *mself = PyCFunction_GET_SELF(destroy); + res = ((*meth)(mself, v)); + } + Py_XDECREF(res); + } +#if !defined(SWIG_PYTHON_SILENT_MEMLEAK) + else { + const char *name = SWIG_TypePrettyName(ty); + printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown")); + } +#endif + } + Py_XDECREF(next); + PyObject_DEL(v); +} + +SWIGRUNTIME PyObject* +SwigPyObject_append(PyObject* v, PyObject* next) +{ + SwigPyObject *sobj = (SwigPyObject *) v; +#ifndef METH_O + PyObject *tmp = 0; + if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL; + next = tmp; +#endif + if (!SwigPyObject_Check(next)) { + return NULL; + } + sobj->next = next; + Py_INCREF(next); + return SWIG_Py_Void(); +} + +SWIGRUNTIME PyObject* +#ifdef METH_NOARGS +SwigPyObject_next(PyObject* v) +#else +SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +#endif +{ + SwigPyObject *sobj = (SwigPyObject *) v; + if (sobj->next) { + Py_INCREF(sobj->next); + return sobj->next; + } else { + return SWIG_Py_Void(); + } +} + +SWIGINTERN PyObject* +#ifdef METH_NOARGS +SwigPyObject_disown(PyObject *v) +#else +SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +#endif +{ + SwigPyObject *sobj = (SwigPyObject *)v; + sobj->own = 0; + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject* +#ifdef METH_NOARGS +SwigPyObject_acquire(PyObject *v) +#else +SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +#endif +{ + SwigPyObject *sobj = (SwigPyObject *)v; + sobj->own = SWIG_POINTER_OWN; + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject* +SwigPyObject_own(PyObject *v, PyObject *args) +{ + PyObject *val = 0; +#if (PY_VERSION_HEX < 0x02020000) + if (!PyArg_ParseTuple(args,(char *)"|O:own",&val)) +#else + if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) +#endif + { + return NULL; + } + else + { + SwigPyObject *sobj = (SwigPyObject *)v; + PyObject *obj = PyBool_FromLong(sobj->own); + if (val) { +#ifdef METH_NOARGS + if (PyObject_IsTrue(val)) { + SwigPyObject_acquire(v); + } else { + SwigPyObject_disown(v); + } +#else + if (PyObject_IsTrue(val)) { + SwigPyObject_acquire(v,args); + } else { + SwigPyObject_disown(v,args); + } +#endif + } + return obj; + } +} + +#ifdef METH_O +static PyMethodDef +swigobject_methods[] = { + {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"}, + {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"}, + {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, + {(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"}, + {(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"}, + {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_NOARGS, (char *)"returns object representation"}, + {0, 0, 0, 0} +}; +#else +static PyMethodDef +swigobject_methods[] = { + {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_VARARGS, (char *)"releases ownership of the pointer"}, + {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS, (char *)"aquires ownership of the pointer"}, + {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, + {(char *)"append", (PyCFunction)SwigPyObject_append, METH_VARARGS, (char *)"appends another 'this' object"}, + {(char *)"next", (PyCFunction)SwigPyObject_next, METH_VARARGS, (char *)"returns the next 'this' object"}, + {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_VARARGS, (char *)"returns object representation"}, + {0, 0, 0, 0} +}; +#endif + +#if PY_VERSION_HEX < 0x02020000 +SWIGINTERN PyObject * +SwigPyObject_getattr(SwigPyObject *sobj,char *name) +{ + return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name); +} +#endif + +SWIGRUNTIME PyTypeObject* +SwigPyObject_TypeOnce(void) { + static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; + + static PyNumberMethods SwigPyObject_as_number = { + (binaryfunc)0, /*nb_add*/ + (binaryfunc)0, /*nb_subtract*/ + (binaryfunc)0, /*nb_multiply*/ + /* nb_divide removed in Python 3 */ +#if PY_VERSION_HEX < 0x03000000 + (binaryfunc)0, /*nb_divide*/ +#endif + (binaryfunc)0, /*nb_remainder*/ + (binaryfunc)0, /*nb_divmod*/ + (ternaryfunc)0,/*nb_power*/ + (unaryfunc)0, /*nb_negative*/ + (unaryfunc)0, /*nb_positive*/ + (unaryfunc)0, /*nb_absolute*/ + (inquiry)0, /*nb_nonzero*/ + 0, /*nb_invert*/ + 0, /*nb_lshift*/ + 0, /*nb_rshift*/ + 0, /*nb_and*/ + 0, /*nb_xor*/ + 0, /*nb_or*/ +#if PY_VERSION_HEX < 0x03000000 + 0, /*nb_coerce*/ +#endif + (unaryfunc)SwigPyObject_long, /*nb_int*/ +#if PY_VERSION_HEX < 0x03000000 + (unaryfunc)SwigPyObject_long, /*nb_long*/ +#else + 0, /*nb_reserved*/ +#endif + (unaryfunc)0, /*nb_float*/ +#if PY_VERSION_HEX < 0x03000000 + (unaryfunc)SwigPyObject_oct, /*nb_oct*/ + (unaryfunc)SwigPyObject_hex, /*nb_hex*/ +#endif +#if PY_VERSION_HEX >= 0x03000000 /* 3.0 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */ +#elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */ +#elif PY_VERSION_HEX >= 0x02020000 /* 2.2.0 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ +#elif PY_VERSION_HEX >= 0x02000000 /* 2.0.0 */ + 0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */ +#endif + }; + + static PyTypeObject swigpyobject_type; + static int type_init = 0; + if (!type_init) { + const PyTypeObject tmp = { + /* PyObject header changed in Python 3 */ +#if PY_VERSION_HEX >= 0x03000000 + PyVarObject_HEAD_INIT(NULL, 0) +#else + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ +#endif + (char *)"SwigPyObject", /* tp_name */ + sizeof(SwigPyObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)SwigPyObject_dealloc, /* tp_dealloc */ + (printfunc)SwigPyObject_print, /* tp_print */ +#if PY_VERSION_HEX < 0x02020000 + (getattrfunc)SwigPyObject_getattr, /* tp_getattr */ +#else + (getattrfunc)0, /* tp_getattr */ +#endif + (setattrfunc)0, /* tp_setattr */ +#if PY_VERSION_HEX >= 0x03000000 + 0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */ +#else + (cmpfunc)SwigPyObject_compare, /* tp_compare */ +#endif + (reprfunc)SwigPyObject_repr, /* tp_repr */ + &SwigPyObject_as_number, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc)0, /* tp_hash */ + (ternaryfunc)0, /* tp_call */ + (reprfunc)SwigPyObject_str, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + swigobject_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */ + 0, /* tp_weaklistoffset */ +#if PY_VERSION_HEX >= 0x02020000 + 0, /* tp_iter */ + 0, /* tp_iternext */ + swigobject_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ + 0, /* tp_bases */ + 0, /* tp_mro */ + 0, /* tp_cache */ + 0, /* tp_subclasses */ + 0, /* tp_weaklist */ +#endif +#if PY_VERSION_HEX >= 0x02030000 + 0, /* tp_del */ +#endif +#if PY_VERSION_HEX >= 0x02060000 + 0, /* tp_version */ +#endif +#ifdef COUNT_ALLOCS + 0,0,0,0 /* tp_alloc -> tp_next */ +#endif + }; + swigpyobject_type = tmp; + type_init = 1; +#if PY_VERSION_HEX < 0x02020000 + swigpyobject_type.ob_type = &PyType_Type; +#else + if (PyType_Ready(&swigpyobject_type) < 0) + return NULL; +#endif + } + return &swigpyobject_type; +} + +SWIGRUNTIME PyObject * +SwigPyObject_New(void *ptr, swig_type_info *ty, int own) +{ + SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type()); + if (sobj) { + sobj->ptr = ptr; + sobj->ty = ty; + sobj->own = own; + sobj->next = 0; + } + return (PyObject *)sobj; +} + +/* ----------------------------------------------------------------------------- + * Implements a simple Swig Packed type, and use it instead of string + * ----------------------------------------------------------------------------- */ + +typedef struct { + PyObject_HEAD + void *pack; + swig_type_info *ty; + size_t size; +} SwigPyPacked; + +SWIGRUNTIME int +SwigPyPacked_print(SwigPyPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags)) +{ + char result[SWIG_BUFFER_SIZE]; + fputs("pack, v->size, 0, sizeof(result))) { + fputs("at ", fp); + fputs(result, fp); + } + fputs(v->ty->name,fp); + fputs(">", fp); + return 0; +} + +SWIGRUNTIME PyObject * +SwigPyPacked_repr(SwigPyPacked *v) +{ + char result[SWIG_BUFFER_SIZE]; + if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { + return SWIG_Python_str_FromFormat("", result, v->ty->name); + } else { + return SWIG_Python_str_FromFormat("", v->ty->name); + } +} + +SWIGRUNTIME PyObject * +SwigPyPacked_str(SwigPyPacked *v) +{ + char result[SWIG_BUFFER_SIZE]; + if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ + return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name); + } else { + return SWIG_Python_str_FromChar(v->ty->name); + } +} + +SWIGRUNTIME int +SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w) +{ + size_t i = v->size; + size_t j = w->size; + int s = (i < j) ? -1 : ((i > j) ? 1 : 0); + return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); +} + +SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void); + +SWIGRUNTIME PyTypeObject* +SwigPyPacked_type(void) { + static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce(); + return type; +} + +SWIGRUNTIMEINLINE int +SwigPyPacked_Check(PyObject *op) { + return ((op)->ob_type == SwigPyPacked_TypeOnce()) + || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0); +} + +SWIGRUNTIME void +SwigPyPacked_dealloc(PyObject *v) +{ + if (SwigPyPacked_Check(v)) { + SwigPyPacked *sobj = (SwigPyPacked *) v; + free(sobj->pack); + } + PyObject_DEL(v); +} + +SWIGRUNTIME PyTypeObject* +SwigPyPacked_TypeOnce(void) { + static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; + static PyTypeObject swigpypacked_type; + static int type_init = 0; + if (!type_init) { + const PyTypeObject tmp = { + /* PyObject header changed in Python 3 */ +#if PY_VERSION_HEX>=0x03000000 + PyVarObject_HEAD_INIT(NULL, 0) +#else + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ +#endif + (char *)"SwigPyPacked", /* tp_name */ + sizeof(SwigPyPacked), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)SwigPyPacked_dealloc, /* tp_dealloc */ + (printfunc)SwigPyPacked_print, /* tp_print */ + (getattrfunc)0, /* tp_getattr */ + (setattrfunc)0, /* tp_setattr */ +#if PY_VERSION_HEX>=0x03000000 + 0, /* tp_reserved in 3.0.1 */ +#else + (cmpfunc)SwigPyPacked_compare, /* tp_compare */ +#endif + (reprfunc)SwigPyPacked_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc)0, /* tp_hash */ + (ternaryfunc)0, /* tp_call */ + (reprfunc)SwigPyPacked_str, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + swigpacked_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ +#if PY_VERSION_HEX >= 0x02020000 + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ + 0, /* tp_bases */ + 0, /* tp_mro */ + 0, /* tp_cache */ + 0, /* tp_subclasses */ + 0, /* tp_weaklist */ +#endif +#if PY_VERSION_HEX >= 0x02030000 + 0, /* tp_del */ +#endif +#if PY_VERSION_HEX >= 0x02060000 + 0, /* tp_version */ +#endif +#ifdef COUNT_ALLOCS + 0,0,0,0 /* tp_alloc -> tp_next */ +#endif + }; + swigpypacked_type = tmp; + type_init = 1; +#if PY_VERSION_HEX < 0x02020000 + swigpypacked_type.ob_type = &PyType_Type; +#else + if (PyType_Ready(&swigpypacked_type) < 0) + return NULL; +#endif + } + return &swigpypacked_type; +} + +SWIGRUNTIME PyObject * +SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty) +{ + SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type()); + if (sobj) { + void *pack = malloc(size); + if (pack) { + memcpy(pack, ptr, size); + sobj->pack = pack; + sobj->ty = ty; + sobj->size = size; + } else { + PyObject_DEL((PyObject *) sobj); + sobj = 0; + } + } + return (PyObject *) sobj; +} + +SWIGRUNTIME swig_type_info * +SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size) +{ + if (SwigPyPacked_Check(obj)) { + SwigPyPacked *sobj = (SwigPyPacked *)obj; + if (sobj->size != size) return 0; + memcpy(ptr, sobj->pack, size); + return sobj->ty; + } else { + return 0; + } +} + +/* ----------------------------------------------------------------------------- + * pointers/data manipulation + * ----------------------------------------------------------------------------- */ + +SWIGRUNTIMEINLINE PyObject * +_SWIG_This(void) +{ + return SWIG_Python_str_FromChar("this"); +} + +static PyObject *swig_this = NULL; + +SWIGRUNTIME PyObject * +SWIG_This(void) +{ + if (swig_this == NULL) + swig_this = _SWIG_This(); + return swig_this; +} + +/* #define SWIG_PYTHON_SLOW_GETSET_THIS */ + +/* TODO: I don't know how to implement the fast getset in Python 3 right now */ +#if PY_VERSION_HEX>=0x03000000 +#define SWIG_PYTHON_SLOW_GETSET_THIS +#endif + +SWIGRUNTIME SwigPyObject * +SWIG_Python_GetSwigThis(PyObject *pyobj) +{ + PyObject *obj; + + if (SwigPyObject_Check(pyobj)) + return (SwigPyObject *) pyobj; + +#ifdef SWIGPYTHON_BUILTIN + (void)obj; +# ifdef PyWeakref_CheckProxy + if (PyWeakref_CheckProxy(pyobj)) { + pyobj = PyWeakref_GET_OBJECT(pyobj); + if (pyobj && SwigPyObject_Check(pyobj)) + return (SwigPyObject*) pyobj; + } +# endif + return NULL; +#else + + obj = 0; + +#if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000)) + if (PyInstance_Check(pyobj)) { + obj = _PyInstance_Lookup(pyobj, SWIG_This()); + } else { + PyObject **dictptr = _PyObject_GetDictPtr(pyobj); + if (dictptr != NULL) { + PyObject *dict = *dictptr; + obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0; + } else { +#ifdef PyWeakref_CheckProxy + if (PyWeakref_CheckProxy(pyobj)) { + PyObject *wobj = PyWeakref_GET_OBJECT(pyobj); + return wobj ? SWIG_Python_GetSwigThis(wobj) : 0; + } +#endif + obj = PyObject_GetAttr(pyobj,SWIG_This()); + if (obj) { + Py_DECREF(obj); + } else { + if (PyErr_Occurred()) PyErr_Clear(); + return 0; + } + } + } +#else + obj = PyObject_GetAttr(pyobj,SWIG_This()); + if (obj) { + Py_DECREF(obj); + } else { + if (PyErr_Occurred()) PyErr_Clear(); + return 0; + } +#endif + if (obj && !SwigPyObject_Check(obj)) { + /* a PyObject is called 'this', try to get the 'real this' + SwigPyObject from it */ + return SWIG_Python_GetSwigThis(obj); + } + return (SwigPyObject *)obj; +#endif +} + +/* Acquire a pointer value */ + +SWIGRUNTIME int +SWIG_Python_AcquirePtr(PyObject *obj, int own) { + if (own == SWIG_POINTER_OWN) { + SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj); + if (sobj) { + int oldown = sobj->own; + sobj->own = own; + return oldown; + } + } + return 0; +} + +/* Convert a pointer value */ + +SWIGRUNTIME int +SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) { + int res; + SwigPyObject *sobj; + + if (!obj) + return SWIG_ERROR; + if (obj == Py_None) { + if (ptr) + *ptr = 0; + return SWIG_OK; + } + + res = SWIG_ERROR; + + sobj = SWIG_Python_GetSwigThis(obj); + if (own) + *own = 0; + while (sobj) { + void *vptr = sobj->ptr; + if (ty) { + swig_type_info *to = sobj->ty; + if (to == ty) { + /* no type cast needed */ + if (ptr) *ptr = vptr; + break; + } else { + swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); + if (!tc) { + sobj = (SwigPyObject *)sobj->next; + } else { + if (ptr) { + int newmemory = 0; + *ptr = SWIG_TypeCast(tc,vptr,&newmemory); + if (newmemory == SWIG_CAST_NEW_MEMORY) { + assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ + if (own) + *own = *own | SWIG_CAST_NEW_MEMORY; + } + } + break; + } + } + } else { + if (ptr) *ptr = vptr; + break; + } + } + if (sobj) { + if (own) + *own = *own | sobj->own; + if (flags & SWIG_POINTER_DISOWN) { + sobj->own = 0; + } + res = SWIG_OK; + } else { + if (flags & SWIG_POINTER_IMPLICIT_CONV) { + SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; + if (data && !data->implicitconv) { + PyObject *klass = data->klass; + if (klass) { + PyObject *impconv; + data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/ + impconv = SWIG_Python_CallFunctor(klass, obj); + data->implicitconv = 0; + if (PyErr_Occurred()) { + PyErr_Clear(); + impconv = 0; + } + if (impconv) { + SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv); + if (iobj) { + void *vptr; + res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0); + if (SWIG_IsOK(res)) { + if (ptr) { + *ptr = vptr; + /* transfer the ownership to 'ptr' */ + iobj->own = 0; + res = SWIG_AddCast(res); + res = SWIG_AddNewMask(res); + } else { + res = SWIG_AddCast(res); + } + } + } + Py_DECREF(impconv); + } + } + } + } + } + return res; +} + +/* Convert a function ptr value */ + +SWIGRUNTIME int +SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { + if (!PyCFunction_Check(obj)) { + return SWIG_ConvertPtr(obj, ptr, ty, 0); + } else { + void *vptr = 0; + + /* here we get the method pointer for callbacks */ + const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); + const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; + if (desc) + desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; + if (!desc) + return SWIG_ERROR; + if (ty) { + swig_cast_info *tc = SWIG_TypeCheck(desc,ty); + if (tc) { + int newmemory = 0; + *ptr = SWIG_TypeCast(tc,vptr,&newmemory); + assert(!newmemory); /* newmemory handling not yet implemented */ + } else { + return SWIG_ERROR; + } + } else { + *ptr = vptr; + } + return SWIG_OK; + } +} + +/* Convert a packed value value */ + +SWIGRUNTIME int +SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) { + swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz); + if (!to) return SWIG_ERROR; + if (ty) { + if (to != ty) { + /* check type cast? */ + swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); + if (!tc) return SWIG_ERROR; + } + } + return SWIG_OK; +} + +/* ----------------------------------------------------------------------------- + * Create a new pointer object + * ----------------------------------------------------------------------------- */ + +/* + Create a new instance object, without calling __init__, and set the + 'this' attribute. +*/ + +SWIGRUNTIME PyObject* +SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) +{ +#if (PY_VERSION_HEX >= 0x02020000) + PyObject *inst = 0; + PyObject *newraw = data->newraw; + if (newraw) { + inst = PyObject_Call(newraw, data->newargs, NULL); + if (inst) { +#if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) + PyObject **dictptr = _PyObject_GetDictPtr(inst); + if (dictptr != NULL) { + PyObject *dict = *dictptr; + if (dict == NULL) { + dict = PyDict_New(); + *dictptr = dict; + PyDict_SetItem(dict, SWIG_This(), swig_this); + } + } +#else + PyObject *key = SWIG_This(); + PyObject_SetAttr(inst, key, swig_this); +#endif + } + } else { +#if PY_VERSION_HEX >= 0x03000000 + inst = PyBaseObject_Type.tp_new((PyTypeObject*) data->newargs, Py_None, Py_None); + PyObject_SetAttr(inst, SWIG_This(), swig_this); + Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; +#else + PyObject *dict = PyDict_New(); + PyDict_SetItem(dict, SWIG_This(), swig_this); + inst = PyInstance_NewRaw(data->newargs, dict); + Py_DECREF(dict); +#endif + } + return inst; +#else +#if (PY_VERSION_HEX >= 0x02010000) + PyObject *inst; + PyObject *dict = PyDict_New(); + PyDict_SetItem(dict, SWIG_This(), swig_this); + inst = PyInstance_NewRaw(data->newargs, dict); + Py_DECREF(dict); + return (PyObject *) inst; +#else + PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type); + if (inst == NULL) { + return NULL; + } + inst->in_class = (PyClassObject *)data->newargs; + Py_INCREF(inst->in_class); + inst->in_dict = PyDict_New(); + if (inst->in_dict == NULL) { + Py_DECREF(inst); + return NULL; + } +#ifdef Py_TPFLAGS_HAVE_WEAKREFS + inst->in_weakreflist = NULL; +#endif +#ifdef Py_TPFLAGS_GC + PyObject_GC_Init(inst); +#endif + PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this); + return (PyObject *) inst; +#endif +#endif +} + +SWIGRUNTIME void +SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) +{ + PyObject *dict; +#if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS) + PyObject **dictptr = _PyObject_GetDictPtr(inst); + if (dictptr != NULL) { + dict = *dictptr; + if (dict == NULL) { + dict = PyDict_New(); + *dictptr = dict; + } + PyDict_SetItem(dict, SWIG_This(), swig_this); + return; + } +#endif + dict = PyObject_GetAttrString(inst, (char*)"__dict__"); + PyDict_SetItem(dict, SWIG_This(), swig_this); + Py_DECREF(dict); +} + + +SWIGINTERN PyObject * +SWIG_Python_InitShadowInstance(PyObject *args) { + PyObject *obj[2]; + if (!SWIG_Python_UnpackTuple(args,(char*)"swiginit", 2, 2, obj)) { + return NULL; + } else { + SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]); + if (sthis) { + SwigPyObject_append((PyObject*) sthis, obj[1]); + } else { + SWIG_Python_SetSwigThis(obj[0], obj[1]); + } + return SWIG_Py_Void(); + } +} + +/* Create a new pointer object */ + +SWIGRUNTIME PyObject * +SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) { + SwigPyClientData *clientdata; + PyObject * robj; + int own; + + if (!ptr) + return SWIG_Py_Void(); + + clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0; + own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; + if (clientdata && clientdata->pytype) { + SwigPyObject *newobj; + if (flags & SWIG_BUILTIN_TP_INIT) { + newobj = (SwigPyObject*) self; + if (newobj->ptr) { + PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0); + while (newobj->next) + newobj = (SwigPyObject *) newobj->next; + newobj->next = next_self; + newobj = (SwigPyObject *)next_self; + } + } else { + newobj = PyObject_New(SwigPyObject, clientdata->pytype); + } + if (newobj) { + newobj->ptr = ptr; + newobj->ty = type; + newobj->own = own; + newobj->next = 0; +#ifdef SWIGPYTHON_BUILTIN + newobj->dict = 0; +#endif + return (PyObject*) newobj; + } + return SWIG_Py_Void(); + } + + assert(!(flags & SWIG_BUILTIN_TP_INIT)); + + robj = SwigPyObject_New(ptr, type, own); + if (clientdata && !(flags & SWIG_POINTER_NOSHADOW)) { + PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj); + if (inst) { + Py_DECREF(robj); + robj = inst; + } + } + return robj; +} + +/* Create a new packed object */ + +SWIGRUNTIMEINLINE PyObject * +SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { + return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void(); +} + +/* -----------------------------------------------------------------------------* + * Get type list + * -----------------------------------------------------------------------------*/ + +#ifdef SWIG_LINK_RUNTIME +void *SWIG_ReturnGlobalTypeList(void *); +#endif + +SWIGRUNTIME swig_module_info * +SWIG_Python_GetModule(void) { + static void *type_pointer = (void *)0; + /* first check if module already created */ + if (!type_pointer) { +#ifdef SWIG_LINK_RUNTIME + type_pointer = SWIG_ReturnGlobalTypeList((void *)0); +#else +# ifdef SWIGPY_USE_CAPSULE + type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0); +# else + type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, + (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); +# endif + if (PyErr_Occurred()) { + PyErr_Clear(); + type_pointer = (void *)0; + } +#endif + } + return (swig_module_info *) type_pointer; +} + +#if PY_MAJOR_VERSION < 2 +/* PyModule_AddObject function was introduced in Python 2.0. The following function + is copied out of Python/modsupport.c in python version 2.3.4 */ +SWIGINTERN int +PyModule_AddObject(PyObject *m, char *name, PyObject *o) +{ + PyObject *dict; + if (!PyModule_Check(m)) { + PyErr_SetString(PyExc_TypeError, + "PyModule_AddObject() needs module as first arg"); + return SWIG_ERROR; + } + if (!o) { + PyErr_SetString(PyExc_TypeError, + "PyModule_AddObject() needs non-NULL value"); + return SWIG_ERROR; + } + + dict = PyModule_GetDict(m); + if (dict == NULL) { + /* Internal error -- modules must have a dict! */ + PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", + PyModule_GetName(m)); + return SWIG_ERROR; + } + if (PyDict_SetItemString(dict, name, o)) + return SWIG_ERROR; + Py_DECREF(o); + return SWIG_OK; +} +#endif + +SWIGRUNTIME void +#ifdef SWIGPY_USE_CAPSULE +SWIG_Python_DestroyModule(PyObject *obj) +#else +SWIG_Python_DestroyModule(void *vptr) +#endif +{ +#ifdef SWIGPY_USE_CAPSULE + swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME); +#else + swig_module_info *swig_module = (swig_module_info *) vptr; +#endif + swig_type_info **types = swig_module->types; + size_t i; + for (i =0; i < swig_module->size; ++i) { + swig_type_info *ty = types[i]; + if (ty->owndata) { + SwigPyClientData *data = (SwigPyClientData *) ty->clientdata; + if (data) SwigPyClientData_Del(data); + } + } + Py_DECREF(SWIG_This()); + swig_this = NULL; +} + +SWIGRUNTIME void +SWIG_Python_SetModule(swig_module_info *swig_module) { +#if PY_VERSION_HEX >= 0x03000000 + /* Add a dummy module object into sys.modules */ + PyObject *module = PyImport_AddModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION); +#else + static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */ + PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); +#endif +#ifdef SWIGPY_USE_CAPSULE + PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule); + if (pointer && module) { + PyModule_AddObject(module, (char*)"type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer); + } else { + Py_XDECREF(pointer); + } +#else + PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule); + if (pointer && module) { + PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); + } else { + Py_XDECREF(pointer); + } +#endif +} + +/* The python cached type query */ +SWIGRUNTIME PyObject * +SWIG_Python_TypeCache(void) { + static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); + return cache; +} + +SWIGRUNTIME swig_type_info * +SWIG_Python_TypeQuery(const char *type) +{ + PyObject *cache = SWIG_Python_TypeCache(); + PyObject *key = SWIG_Python_str_FromChar(type); + PyObject *obj = PyDict_GetItem(cache, key); + swig_type_info *descriptor; + if (obj) { +#ifdef SWIGPY_USE_CAPSULE + descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL); +#else + descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj); +#endif + } else { + swig_module_info *swig_module = SWIG_Python_GetModule(); + descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); + if (descriptor) { +#ifdef SWIGPY_USE_CAPSULE + obj = PyCapsule_New((void*) descriptor, NULL, NULL); +#else + obj = PyCObject_FromVoidPtr(descriptor, NULL); +#endif + PyDict_SetItem(cache, key, obj); + Py_DECREF(obj); + } + } + Py_DECREF(key); + return descriptor; +} + +/* + For backward compatibility only +*/ +#define SWIG_POINTER_EXCEPTION 0 +#define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) +#define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) + +SWIGRUNTIME int +SWIG_Python_AddErrMesg(const char* mesg, int infront) +{ + if (PyErr_Occurred()) { + PyObject *type = 0; + PyObject *value = 0; + PyObject *traceback = 0; + PyErr_Fetch(&type, &value, &traceback); + if (value) { + char *tmp; + PyObject *old_str = PyObject_Str(value); + Py_XINCREF(type); + PyErr_Clear(); + if (infront) { + PyErr_Format(type, "%s %s", mesg, tmp = SWIG_Python_str_AsChar(old_str)); + } else { + PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); + } + SWIG_Python_str_DelForPy3(tmp); + Py_DECREF(old_str); + } + return 1; + } else { + return 0; + } +} + +SWIGRUNTIME int +SWIG_Python_ArgFail(int argnum) +{ + if (PyErr_Occurred()) { + /* add information about failing argument */ + char mesg[256]; + PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum); + return SWIG_Python_AddErrMesg(mesg, 1); + } else { + return 0; + } +} + +SWIGRUNTIMEINLINE const char * +SwigPyObject_GetDesc(PyObject *self) +{ + SwigPyObject *v = (SwigPyObject *)self; + swig_type_info *ty = v ? v->ty : 0; + return ty ? ty->str : (char*)""; +} + +SWIGRUNTIME void +SWIG_Python_TypeError(const char *type, PyObject *obj) +{ + if (type) { +#if defined(SWIG_COBJECT_TYPES) + if (obj && SwigPyObject_Check(obj)) { + const char *otype = (const char *) SwigPyObject_GetDesc(obj); + if (otype) { + PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received", + type, otype); + return; + } + } else +#endif + { + const char *otype = (obj ? obj->ob_type->tp_name : 0); + if (otype) { + PyObject *str = PyObject_Str(obj); + const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0; + if (cstr) { + PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", + type, otype, cstr); + SWIG_Python_str_DelForPy3(cstr); + } else { + PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", + type, otype); + } + Py_XDECREF(str); + return; + } + } + PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); + } else { + PyErr_Format(PyExc_TypeError, "unexpected type is received"); + } +} + + +/* Convert a pointer value, signal an exception on a type mismatch */ +SWIGRUNTIME void * +SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) { + void *result; + if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { + PyErr_Clear(); +#if SWIG_POINTER_EXCEPTION + if (flags) { + SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); + SWIG_Python_ArgFail(argnum); + } +#endif + } + return result; +} + +SWIGRUNTIME int +SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { + PyTypeObject *tp = obj->ob_type; + PyObject *descr; + PyObject *encoded_name; + descrsetfunc f; + int res; + +#ifdef Py_USING_UNICODE + if (PyString_Check(name)) { + name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL); + if (!name) + return -1; + } else if (!PyUnicode_Check(name)) +#else + if (!PyString_Check(name)) +#endif + { + PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name); + return -1; + } else { + Py_INCREF(name); + } + + if (!tp->tp_dict) { + if (PyType_Ready(tp) < 0) + goto done; + } + + res = -1; + descr = _PyType_Lookup(tp, name); + f = NULL; + if (descr != NULL) + f = descr->ob_type->tp_descr_set; + if (!f) { + if (PyString_Check(name)) { + encoded_name = name; + Py_INCREF(name); + } else { + encoded_name = PyUnicode_AsUTF8String(name); + } + PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name)); + Py_DECREF(encoded_name); + } else { + res = f(descr, obj, value); + } + + done: + Py_DECREF(name); + return res; +} + + +#ifdef __cplusplus +} +#endif @@ -2643,481 +2937,490 @@ SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int argnum, int flags) #define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else -/* ----------------------------------------------------------------------------- - * See the LICENSE file for information on copyright, usage and redistribution - * of SWIG, and the README file for authors - http://www.swig.org/release.html. - * - * director.swg - * - * This file contains support for director classes that proxy - * method calls from C++ to Python extensions. - * ----------------------------------------------------------------------------- */ - -#ifndef SWIG_DIRECTOR_PYTHON_HEADER_ -#define SWIG_DIRECTOR_PYTHON_HEADER_ - -#ifdef __cplusplus - -#include -#include -#include -#include -#include - - -/* - Use -DSWIG_PYTHON_DIRECTOR_NO_VTABLE if you don't want to generate a 'virtual - table', and avoid multiple GetAttr calls to retrieve the python - methods. -*/ - -#ifndef SWIG_PYTHON_DIRECTOR_NO_VTABLE -#ifndef SWIG_PYTHON_DIRECTOR_VTABLE -#define SWIG_PYTHON_DIRECTOR_VTABLE -#endif -#endif - - - -/* - Use -DSWIG_DIRECTOR_NO_UEH if you prefer to avoid the use of the - Undefined Exception Handler provided by swift -*/ -#ifndef SWIG_DIRECTOR_NO_UEH -#ifndef SWIG_DIRECTOR_UEH -#define SWIG_DIRECTOR_UEH -#endif -#endif - - -/* - Use -DSWIG_DIRECTOR_STATIC if you prefer to avoid the use of the - 'Swig' namespace. This could be usefull for multi-modules projects. -*/ -#ifdef SWIG_DIRECTOR_STATIC -/* Force anonymous (static) namespace */ -#define Swig -#endif - - -/* - Use -DSWIG_DIRECTOR_NORTTI if you prefer to avoid the use of the - native C++ RTTI and dynamic_cast<>. But be aware that directors - could stop working when using this option. -*/ -#ifdef SWIG_DIRECTOR_NORTTI -/* - When we don't use the native C++ RTTI, we implement a minimal one - only for Directors. -*/ -# ifndef SWIG_DIRECTOR_RTDIR -# define SWIG_DIRECTOR_RTDIR -#include - -namespace Swig { - class Director; - SWIGINTERN std::map& get_rtdir_map() { - static std::map rtdir_map; - return rtdir_map; - } - - SWIGINTERNINLINE void set_rtdir(void *vptr, Director *rtdir) { - get_rtdir_map()[vptr] = rtdir; - } - - SWIGINTERNINLINE Director *get_rtdir(void *vptr) { - std::map::const_iterator pos = get_rtdir_map().find(vptr); - Director *rtdir = (pos != get_rtdir_map().end()) ? pos->second : 0; - return rtdir; - } -} -# endif /* SWIG_DIRECTOR_RTDIR */ - -# define SWIG_DIRECTOR_CAST(Arg) Swig::get_rtdir(static_cast(Arg)) -# define SWIG_DIRECTOR_RGTR(Arg1, Arg2) Swig::set_rtdir(static_cast(Arg1), Arg2) - -#else - -# define SWIG_DIRECTOR_CAST(Arg) dynamic_cast(Arg) -# define SWIG_DIRECTOR_RGTR(Arg1, Arg2) - -#endif /* SWIG_DIRECTOR_NORTTI */ - -extern "C" { - struct swig_type_info; -} - -namespace Swig { - - /* memory handler */ - struct GCItem - { - virtual ~GCItem() {} - - virtual int get_own() const - { - return 0; - } - }; - - struct GCItem_var - { - GCItem_var(GCItem *item = 0) : _item(item) - { - } - - GCItem_var& operator=(GCItem *item) - { - GCItem *tmp = _item; - _item = item; - delete tmp; - return *this; - } - - ~GCItem_var() - { - delete _item; - } - - GCItem * operator->() const - { - return _item; - } - - private: - GCItem *_item; - }; - - struct GCItem_Object : GCItem - { - GCItem_Object(int own) : _own(own) - { - } - - virtual ~GCItem_Object() - { - } - - int get_own() const - { - return _own; - } - - private: - int _own; - }; - - template - struct GCItem_T : GCItem - { - GCItem_T(Type *ptr) : _ptr(ptr) - { - } - - virtual ~GCItem_T() - { - delete _ptr; - } - - private: - Type *_ptr; - }; - - template - struct GCArray_T : GCItem - { - GCArray_T(Type *ptr) : _ptr(ptr) - { - } - - virtual ~GCArray_T() - { - delete[] _ptr; - } - - private: - Type *_ptr; - }; - - /* base class for director exceptions */ - class DirectorException { - protected: - std::string swig_msg; - public: - DirectorException(PyObject *error, const char* hdr ="", const char* msg ="") - : swig_msg(hdr) - { - SWIG_PYTHON_THREAD_BEGIN_BLOCK; - if (strlen(msg)) { - swig_msg += " "; - swig_msg += msg; - } - if (!PyErr_Occurred()) { - PyErr_SetString(error, getMessage()); - } - SWIG_PYTHON_THREAD_END_BLOCK; - } - - const char *getMessage() const - { - return swig_msg.c_str(); - } - - static void raise(PyObject *error, const char *msg) - { - throw DirectorException(error, msg); - } - - static void raise(const char *msg) - { - raise(PyExc_RuntimeError, msg); - } - }; - - /* unknown exception handler */ - class UnknownExceptionHandler - { -#ifdef SWIG_DIRECTOR_UEH - static void handler() { - try { - throw; - } catch (DirectorException& e) { - std::cerr << "Swig Director exception caught:" << std::endl - << e.getMessage() << std::endl; - } catch (std::exception& e) { - std::cerr << "std::exception caught: "<< e.what() << std::endl; - } catch (...) { - std::cerr << "Unknown exception caught." << std::endl; - } - - std::cerr << std::endl - << "Python interpreter traceback:" << std::endl; - PyErr_Print(); - std::cerr << std::endl; - - std::cerr << "This exception was caught by the SWIG unexpected exception handler." << std::endl - << "Try using %feature(\"director:except\") to avoid reaching this point." << std::endl - << std::endl - << "Exception is being re-thrown, program will like abort/terminate." << std::endl; - throw; - } - - public: - - std::unexpected_handler old; - UnknownExceptionHandler(std::unexpected_handler nh = handler) - { - old = std::set_unexpected(nh); - } - - ~UnknownExceptionHandler() - { - std::set_unexpected(old); - } -#endif - }; - - /* type mismatch in the return value from a python method call */ - class DirectorTypeMismatchException : public Swig::DirectorException { - public: - DirectorTypeMismatchException(PyObject *error, const char* msg="") - : Swig::DirectorException(error, "Swig director type mismatch", msg) - { - } - - DirectorTypeMismatchException(const char* msg="") - : Swig::DirectorException(PyExc_TypeError, "Swig director type mismatch", msg) - { - } - - static void raise(PyObject *error, const char *msg) - { - throw DirectorTypeMismatchException(error, msg); - } - - static void raise(const char *msg) - { - throw DirectorTypeMismatchException(msg); - } - }; - - /* any python exception that occurs during a director method call */ - class DirectorMethodException : public Swig::DirectorException { - public: - DirectorMethodException(const char* msg = "") - : DirectorException(PyExc_RuntimeError, "Swig director method error.", msg) - { - } - - static void raise(const char *msg) - { - throw DirectorMethodException(msg); - } - }; - - /* attempt to call a pure virtual method via a director method */ - class DirectorPureVirtualException : public Swig::DirectorException - { - public: - DirectorPureVirtualException(const char* msg = "") - : DirectorException(PyExc_RuntimeError, "Swig director pure virtual method called", msg) - { - } - - static void raise(const char *msg) - { - throw DirectorPureVirtualException(msg); - } - }; - - -#if defined(SWIG_PYTHON_THREADS) -/* __THREAD__ is the old macro to activate some thread support */ -# if !defined(__THREAD__) -# define __THREAD__ 1 -# endif -#endif - -#ifdef __THREAD__ -# include "pythread.h" - class Guard - { - PyThread_type_lock & mutex_; - - public: - Guard(PyThread_type_lock & mutex) : mutex_(mutex) - { - PyThread_acquire_lock(mutex_, WAIT_LOCK); - } - - ~Guard() - { - PyThread_release_lock(mutex_); - } - }; -# define SWIG_GUARD(mutex) Guard _guard(mutex) -#else -# define SWIG_GUARD(mutex) -#endif - - /* director base class */ - class Director { - private: - /* pointer to the wrapped python object */ - PyObject* swig_self; - /* flag indicating whether the object is owned by python or c++ */ - mutable bool swig_disown_flag; - - /* decrement the reference count of the wrapped python object */ - void swig_decref() const { - if (swig_disown_flag) { - SWIG_PYTHON_THREAD_BEGIN_BLOCK; - Py_DECREF(swig_self); - SWIG_PYTHON_THREAD_END_BLOCK; - } - } - - public: - /* wrap a python object, optionally taking ownership */ - Director(PyObject* self) : swig_self(self), swig_disown_flag(false) { - swig_incref(); - } - - - /* discard our reference at destruction */ - virtual ~Director() { - swig_decref(); - } - - - /* return a pointer to the wrapped python object */ - PyObject *swig_get_self() const { - return swig_self; - } - - /* acquire ownership of the wrapped python object (the sense of "disown" - * is from python) */ - void swig_disown() const { - if (!swig_disown_flag) { - swig_disown_flag=true; - swig_incref(); - } - } - - /* increase the reference count of the wrapped python object */ - void swig_incref() const { - if (swig_disown_flag) { - Py_INCREF(swig_self); - } - } - - /* methods to implement pseudo protected director members */ - virtual bool swig_get_inner(const char* /* name */) const { - return true; - } - - virtual void swig_set_inner(const char* /* name */, bool /* val */) const { - } - - /* ownership management */ - private: - typedef std::map ownership_map; - mutable ownership_map owner; -#ifdef __THREAD__ - static PyThread_type_lock swig_mutex_own; -#endif - - public: - template - void swig_acquire_ownership_array(Type *vptr) const - { - if (vptr) { - SWIG_GUARD(swig_mutex_own); - owner[vptr] = new GCArray_T(vptr); - } - } - - template - void swig_acquire_ownership(Type *vptr) const - { - if (vptr) { - SWIG_GUARD(swig_mutex_own); - owner[vptr] = new GCItem_T(vptr); - } - } - - void swig_acquire_ownership_obj(void *vptr, int own) const - { - if (vptr && own) { - SWIG_GUARD(swig_mutex_own); - owner[vptr] = new GCItem_Object(own); - } - } - - int swig_release_ownership(void *vptr) const - { - int own = 0; - if (vptr) { - SWIG_GUARD(swig_mutex_own); - ownership_map::iterator iter = owner.find(vptr); - if (iter != owner.end()) { - own = iter->second->get_own(); - owner.erase(iter); - } - } - return own; - } - }; - -#ifdef __THREAD__ - PyThread_type_lock Director::swig_mutex_own = PyThread_allocate_lock(); -#endif -} - -#endif /* __cplusplus */ - - -#endif +/* ----------------------------------------------------------------------------- + * director.swg + * + * This file contains support for director classes that proxy + * method calls from C++ to Python extensions. + * ----------------------------------------------------------------------------- */ + +#ifndef SWIG_DIRECTOR_PYTHON_HEADER_ +#define SWIG_DIRECTOR_PYTHON_HEADER_ + +#ifdef __cplusplus + +#include +#include +#include +#include +#include + + +/* + Use -DSWIG_PYTHON_DIRECTOR_NO_VTABLE if you don't want to generate a 'virtual + table', and avoid multiple GetAttr calls to retrieve the python + methods. +*/ + +#ifndef SWIG_PYTHON_DIRECTOR_NO_VTABLE +#ifndef SWIG_PYTHON_DIRECTOR_VTABLE +#define SWIG_PYTHON_DIRECTOR_VTABLE +#endif +#endif + + + +/* + Use -DSWIG_DIRECTOR_NO_UEH if you prefer to avoid the use of the + Undefined Exception Handler provided by swift +*/ +#ifndef SWIG_DIRECTOR_NO_UEH +#ifndef SWIG_DIRECTOR_UEH +#define SWIG_DIRECTOR_UEH +#endif +#endif + + +/* + Use -DSWIG_DIRECTOR_STATIC if you prefer to avoid the use of the + 'Swig' namespace. This could be useful for multi-modules projects. +*/ +#ifdef SWIG_DIRECTOR_STATIC +/* Force anonymous (static) namespace */ +#define Swig +#endif + + +/* + Use -DSWIG_DIRECTOR_NORTTI if you prefer to avoid the use of the + native C++ RTTI and dynamic_cast<>. But be aware that directors + could stop working when using this option. +*/ +#ifdef SWIG_DIRECTOR_NORTTI +/* + When we don't use the native C++ RTTI, we implement a minimal one + only for Directors. +*/ +# ifndef SWIG_DIRECTOR_RTDIR +# define SWIG_DIRECTOR_RTDIR +#include + +namespace Swig { + class Director; + SWIGINTERN std::map& get_rtdir_map() { + static std::map rtdir_map; + return rtdir_map; + } + + SWIGINTERNINLINE void set_rtdir(void *vptr, Director *rtdir) { + get_rtdir_map()[vptr] = rtdir; + } + + SWIGINTERNINLINE Director *get_rtdir(void *vptr) { + std::map::const_iterator pos = get_rtdir_map().find(vptr); + Director *rtdir = (pos != get_rtdir_map().end()) ? pos->second : 0; + return rtdir; + } +} +# endif /* SWIG_DIRECTOR_RTDIR */ + +# define SWIG_DIRECTOR_CAST(ARG) Swig::get_rtdir(static_cast(ARG)) +# define SWIG_DIRECTOR_RGTR(ARG1, ARG2) Swig::set_rtdir(static_cast(ARG1), ARG2) + +#else + +# define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) +# define SWIG_DIRECTOR_RGTR(ARG1, ARG2) + +#endif /* SWIG_DIRECTOR_NORTTI */ + +extern "C" { + struct swig_type_info; +} + +namespace Swig { + + /* memory handler */ + struct GCItem + { + virtual ~GCItem() {} + + virtual int get_own() const + { + return 0; + } + }; + + struct GCItem_var + { + GCItem_var(GCItem *item = 0) : _item(item) + { + } + + GCItem_var& operator=(GCItem *item) + { + GCItem *tmp = _item; + _item = item; + delete tmp; + return *this; + } + + ~GCItem_var() + { + delete _item; + } + + GCItem * operator->() const + { + return _item; + } + + private: + GCItem *_item; + }; + + struct GCItem_Object : GCItem + { + GCItem_Object(int own) : _own(own) + { + } + + virtual ~GCItem_Object() + { + } + + int get_own() const + { + return _own; + } + + private: + int _own; + }; + + template + struct GCItem_T : GCItem + { + GCItem_T(Type *ptr) : _ptr(ptr) + { + } + + virtual ~GCItem_T() + { + delete _ptr; + } + + private: + Type *_ptr; + }; + + template + struct GCArray_T : GCItem + { + GCArray_T(Type *ptr) : _ptr(ptr) + { + } + + virtual ~GCArray_T() + { + delete[] _ptr; + } + + private: + Type *_ptr; + }; + + /* base class for director exceptions */ + class DirectorException { + protected: + std::string swig_msg; + public: + DirectorException(PyObject *error, const char* hdr ="", const char* msg ="") + : swig_msg(hdr) + { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + if (strlen(msg)) { + swig_msg += " "; + swig_msg += msg; + } + if (!PyErr_Occurred()) { + PyErr_SetString(error, getMessage()); + } + SWIG_PYTHON_THREAD_END_BLOCK; + } + + const char *getMessage() const + { + return swig_msg.c_str(); + } + + static void raise(PyObject *error, const char *msg) + { + throw DirectorException(error, msg); + } + + static void raise(const char *msg) + { + raise(PyExc_RuntimeError, msg); + } + }; + + /* unknown exception handler */ + class UnknownExceptionHandler + { +#ifdef SWIG_DIRECTOR_UEH + static void handler() { + try { + throw; + } catch (DirectorException& e) { + std::cerr << "SWIG Director exception caught:" << std::endl + << e.getMessage() << std::endl; + } catch (std::exception& e) { + std::cerr << "std::exception caught: "<< e.what() << std::endl; + } catch (...) { + std::cerr << "Unknown exception caught." << std::endl; + } + + std::cerr << std::endl + << "Python interpreter traceback:" << std::endl; + PyErr_Print(); + std::cerr << std::endl; + + std::cerr << "This exception was caught by the SWIG unexpected exception handler." << std::endl + << "Try using %feature(\"director:except\") to avoid reaching this point." << std::endl + << std::endl + << "Exception is being re-thrown, program will like abort/terminate." << std::endl; + throw; + } + + public: + + std::unexpected_handler old; + UnknownExceptionHandler(std::unexpected_handler nh = handler) + { + old = std::set_unexpected(nh); + } + + ~UnknownExceptionHandler() + { + std::set_unexpected(old); + } +#endif + }; + + /* type mismatch in the return value from a python method call */ + class DirectorTypeMismatchException : public Swig::DirectorException { + public: + DirectorTypeMismatchException(PyObject *error, const char* msg="") + : Swig::DirectorException(error, "SWIG director type mismatch", msg) + { + } + + DirectorTypeMismatchException(const char* msg="") + : Swig::DirectorException(PyExc_TypeError, "SWIG director type mismatch", msg) + { + } + + static void raise(PyObject *error, const char *msg) + { + throw DirectorTypeMismatchException(error, msg); + } + + static void raise(const char *msg) + { + throw DirectorTypeMismatchException(msg); + } + }; + + /* any python exception that occurs during a director method call */ + class DirectorMethodException : public Swig::DirectorException { + public: + DirectorMethodException(const char* msg = "") + : DirectorException(PyExc_RuntimeError, "SWIG director method error.", msg) + { + } + + static void raise(const char *msg) + { + throw DirectorMethodException(msg); + } + }; + + /* attempt to call a pure virtual method via a director method */ + class DirectorPureVirtualException : public Swig::DirectorException + { + public: + DirectorPureVirtualException(const char* msg = "") + : DirectorException(PyExc_RuntimeError, "SWIG director pure virtual method called", msg) + { + } + + static void raise(const char *msg) + { + throw DirectorPureVirtualException(msg); + } + }; + + +#if defined(SWIG_PYTHON_THREADS) +/* __THREAD__ is the old macro to activate some thread support */ +# if !defined(__THREAD__) +# define __THREAD__ 1 +# endif +#endif + +#ifdef __THREAD__ +# include "pythread.h" + class Guard + { + PyThread_type_lock & mutex_; + + public: + Guard(PyThread_type_lock & mutex) : mutex_(mutex) + { + PyThread_acquire_lock(mutex_, WAIT_LOCK); + } + + ~Guard() + { + PyThread_release_lock(mutex_); + } + }; +# define SWIG_GUARD(mutex) Guard _guard(mutex) +#else +# define SWIG_GUARD(mutex) +#endif + + /* director base class */ + class Director { + private: + /* pointer to the wrapped python object */ + PyObject* swig_self; + /* flag indicating whether the object is owned by python or c++ */ + mutable bool swig_disown_flag; + + /* decrement the reference count of the wrapped python object */ + void swig_decref() const { + if (swig_disown_flag) { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + Py_DECREF(swig_self); + SWIG_PYTHON_THREAD_END_BLOCK; + } + } + + public: + /* wrap a python object, optionally taking ownership */ + Director(PyObject* self) : swig_self(self), swig_disown_flag(false) { + swig_incref(); + } + + + /* discard our reference at destruction */ + virtual ~Director() { + swig_decref(); + } + + + /* return a pointer to the wrapped python object */ + PyObject *swig_get_self() const { + return swig_self; + } + + /* acquire ownership of the wrapped python object (the sense of "disown" + * is from python) */ + void swig_disown() const { + if (!swig_disown_flag) { + swig_disown_flag=true; + swig_incref(); + } + } + + /* increase the reference count of the wrapped python object */ + void swig_incref() const { + if (swig_disown_flag) { + Py_INCREF(swig_self); + } + } + + /* methods to implement pseudo protected director members */ + virtual bool swig_get_inner(const char* /* swig_protected_method_name */) const { + return true; + } + + virtual void swig_set_inner(const char* /* swig_protected_method_name */, bool /* swig_val */) const { + } + + /* ownership management */ + private: + typedef std::map swig_ownership_map; + mutable swig_ownership_map swig_owner; +#ifdef __THREAD__ + static PyThread_type_lock swig_mutex_own; +#endif + + public: + template + void swig_acquire_ownership_array(Type *vptr) const + { + if (vptr) { + SWIG_GUARD(swig_mutex_own); + swig_owner[vptr] = new GCArray_T(vptr); + } + } + + template + void swig_acquire_ownership(Type *vptr) const + { + if (vptr) { + SWIG_GUARD(swig_mutex_own); + swig_owner[vptr] = new GCItem_T(vptr); + } + } + + void swig_acquire_ownership_obj(void *vptr, int own) const + { + if (vptr && own) { + SWIG_GUARD(swig_mutex_own); + swig_owner[vptr] = new GCItem_Object(own); + } + } + + int swig_release_ownership(void *vptr) const + { + int own = 0; + if (vptr) { + SWIG_GUARD(swig_mutex_own); + swig_ownership_map::iterator iter = swig_owner.find(vptr); + if (iter != swig_owner.end()) { + own = iter->second->get_own(); + swig_owner.erase(iter); + } + } + return own; + } + + template + static PyObject* swig_pyobj_disown(PyObject *pyobj, PyObject *SWIGUNUSEDPARM(args)) + { + SwigPyObject *sobj = (SwigPyObject *)pyobj; + sobj->own = 0; + Director *d = SWIG_DIRECTOR_CAST(reinterpret_cast(sobj->ptr)); + if (d) + d->swig_disown(); + return PyWeakref_NewProxy(pyobj, NULL); + } + + }; + +#ifdef __THREAD__ + PyThread_type_lock Director::swig_mutex_own = PyThread_allocate_lock(); +#endif +} + +#endif /* __cplusplus */ + + +#endif /* -------- TYPES TABLE (BEGIN) -------- */ @@ -3185,31 +3488,33 @@ namespace Swig { #define SWIGTYPE_p_thttp_event_type_e swig_types[61] #define SWIGTYPE_p_tmedia_bandwidth_level_e swig_types[62] #define SWIGTYPE_p_tmedia_chroma_e swig_types[63] -#define SWIGTYPE_p_tmedia_qos_strength_e swig_types[64] -#define SWIGTYPE_p_tmedia_qos_stype_e swig_types[65] -#define SWIGTYPE_p_tmedia_srtp_mode_e swig_types[66] -#define SWIGTYPE_p_tmsrp_event_type_e swig_types[67] -#define SWIGTYPE_p_tmsrp_request_type_e swig_types[68] -#define SWIGTYPE_p_tsip_event_type_e swig_types[69] -#define SWIGTYPE_p_tsip_info_event_type_e swig_types[70] -#define SWIGTYPE_p_tsip_invite_event_type_e swig_types[71] -#define SWIGTYPE_p_tsip_message_event_type_e swig_types[72] -#define SWIGTYPE_p_tsip_options_event_type_e swig_types[73] -#define SWIGTYPE_p_tsip_publish_event_type_e swig_types[74] -#define SWIGTYPE_p_tsip_register_event_type_e swig_types[75] -#define SWIGTYPE_p_tsip_request_type_e swig_types[76] -#define SWIGTYPE_p_tsip_subscribe_event_type_e swig_types[77] -#define SWIGTYPE_p_tsk_list_t swig_types[78] -#define SWIGTYPE_p_twrap_media_type_e swig_types[79] -#define SWIGTYPE_p_twrap_proxy_plugin_type_e swig_types[80] -#define SWIGTYPE_p_twrap_rpmessage_type_e swig_types[81] -#define SWIGTYPE_p_twrap_sms_type_e swig_types[82] -#define SWIGTYPE_p_unsigned_char swig_types[83] -#define SWIGTYPE_p_unsigned_int swig_types[84] -#define SWIGTYPE_p_unsigned_long_long swig_types[85] -#define SWIGTYPE_p_unsigned_short swig_types[86] -static swig_type_info *swig_types[88]; -static swig_module_info swig_module = {swig_types, 87, 0, 0, 0, 0}; +#define SWIGTYPE_p_tmedia_pref_video_size_s swig_types[64] +#define SWIGTYPE_p_tmedia_profile_e swig_types[65] +#define SWIGTYPE_p_tmedia_qos_strength_e swig_types[66] +#define SWIGTYPE_p_tmedia_qos_stype_e swig_types[67] +#define SWIGTYPE_p_tmedia_srtp_mode_e swig_types[68] +#define SWIGTYPE_p_tmsrp_event_type_e swig_types[69] +#define SWIGTYPE_p_tmsrp_request_type_e swig_types[70] +#define SWIGTYPE_p_tsip_event_type_e swig_types[71] +#define SWIGTYPE_p_tsip_info_event_type_e swig_types[72] +#define SWIGTYPE_p_tsip_invite_event_type_e swig_types[73] +#define SWIGTYPE_p_tsip_message_event_type_e swig_types[74] +#define SWIGTYPE_p_tsip_options_event_type_e swig_types[75] +#define SWIGTYPE_p_tsip_publish_event_type_e swig_types[76] +#define SWIGTYPE_p_tsip_register_event_type_e swig_types[77] +#define SWIGTYPE_p_tsip_request_type_e swig_types[78] +#define SWIGTYPE_p_tsip_subscribe_event_type_e swig_types[79] +#define SWIGTYPE_p_tsk_list_t swig_types[80] +#define SWIGTYPE_p_twrap_media_type_e swig_types[81] +#define SWIGTYPE_p_twrap_proxy_plugin_type_e swig_types[82] +#define SWIGTYPE_p_twrap_rpmessage_type_e swig_types[83] +#define SWIGTYPE_p_twrap_sms_type_e swig_types[84] +#define SWIGTYPE_p_unsigned_char swig_types[85] +#define SWIGTYPE_p_unsigned_int swig_types[86] +#define SWIGTYPE_p_unsigned_long_long swig_types[87] +#define SWIGTYPE_p_unsigned_short swig_types[88] +static swig_type_info *swig_types[90]; +static swig_module_info swig_module = {swig_types, 89, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) @@ -3233,7 +3538,7 @@ static swig_module_info swig_module = {swig_types, 87, 0, 0, 0, 0}; #endif #define SWIG_name "_tinyWRAP" -#define SWIGVERSION 0x010339 +#define SWIGVERSION 0x020004 #define SWIG_VERSION SWIGVERSION @@ -3330,19 +3635,27 @@ SWIGINTERN int SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) { #if PY_VERSION_HEX>=0x03000000 - if (PyUnicode_Check(obj)) + if (PyUnicode_Check(obj)) #else - if (PyString_Check(obj)) + if (PyString_Check(obj)) #endif { char *cstr; Py_ssize_t len; #if PY_VERSION_HEX>=0x03000000 + if (!alloc && cptr) { + /* We can't allow converting without allocation, since the internal + representation of string in Python 3 is UCS-2/UCS-4 but we require + a UTF-8 representation. + TODO(bhy) More detailed explanation */ + return SWIG_RuntimeError; + } obj = PyUnicode_AsUTF8String(obj); PyBytes_AsStringAndSize(obj, &cstr, &len); + if(alloc) *alloc = SWIG_NEWOBJ; #else PyString_AsStringAndSize(obj, &cstr, &len); #endif - if (cptr) { + if (cptr) { if (alloc) { /* In python the user should not be able to modify the inner @@ -3367,10 +3680,16 @@ SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) *alloc = SWIG_OLDOBJ; } } else { + #if PY_VERSION_HEX>=0x03000000 + assert(0); /* Should never reach here in Python 3 */ + #endif *cptr = SWIG_Python_str_AsChar(obj); } } if (psize) *psize = len + 1; +#if PY_VERSION_HEX>=0x03000000 + Py_XDECREF(obj); +#endif return SWIG_OK; } else { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); @@ -3398,7 +3717,7 @@ SWIG_FromCharPtrAndSize(const char* carray, size_t size) if (size > INT_MAX) { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); return pchar_descriptor ? - SWIG_NewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void(); + SWIG_InternalNewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void(); } else { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_FromStringAndSize(carray, static_cast< int >(size)); @@ -3929,9 +4248,9 @@ int SwigDirector_DDebugCallback::OnDebugInfo(char const *message) { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"OnDebugInfo", (char *)"(O)" ,(PyObject *)obj0); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'DDebugCallback.OnDebugInfo'"); } } @@ -3960,9 +4279,9 @@ int SwigDirector_DDebugCallback::OnDebugWarn(char const *message) { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"OnDebugWarn", (char *)"(O)" ,(PyObject *)obj0); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'DDebugCallback.OnDebugWarn'"); } } @@ -3991,9 +4310,9 @@ int SwigDirector_DDebugCallback::OnDebugError(char const *message) { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"OnDebugError", (char *)"(O)" ,(PyObject *)obj0); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'DDebugCallback.OnDebugError'"); } } @@ -4022,9 +4341,9 @@ int SwigDirector_DDebugCallback::OnDebugFatal(char const *message) { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"OnDebugFatal", (char *)"(O)" ,(PyObject *)obj0); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'DDebugCallback.OnDebugFatal'"); } } @@ -4065,9 +4384,9 @@ int SwigDirector_ProxyPluginMgrCallback::OnPluginCreated(uint64_t id, enum twrap #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"OnPluginCreated", (char *)"(OO)" ,(PyObject *)obj0,(PyObject *)obj1); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyPluginMgrCallback.OnPluginCreated'"); } } @@ -4098,9 +4417,9 @@ int SwigDirector_ProxyPluginMgrCallback::OnPluginDestroyed(uint64_t id, enum twr #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"OnPluginDestroyed", (char *)"(OO)" ,(PyObject *)obj0,(PyObject *)obj1); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyPluginMgrCallback.OnPluginDestroyed'"); } } @@ -4143,9 +4462,9 @@ int SwigDirector_ProxyAudioConsumerCallback::prepare(int ptime, int rate, int ch #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"prepare", (char *)"(OOO)" ,(PyObject *)obj0,(PyObject *)obj1,(PyObject *)obj2); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyAudioConsumerCallback.prepare'"); } } @@ -4172,9 +4491,9 @@ int SwigDirector_ProxyAudioConsumerCallback::start() { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "start", NULL); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyAudioConsumerCallback.start'"); } } @@ -4201,9 +4520,9 @@ int SwigDirector_ProxyAudioConsumerCallback::pause() { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "pause", NULL); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyAudioConsumerCallback.pause'"); } } @@ -4230,9 +4549,9 @@ int SwigDirector_ProxyAudioConsumerCallback::stop() { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "stop", NULL); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyAudioConsumerCallback.stop'"); } } @@ -4275,9 +4594,9 @@ int SwigDirector_ProxyVideoConsumerCallback::prepare(int nWidth, int nHeight, in #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"prepare", (char *)"(OOO)" ,(PyObject *)obj0,(PyObject *)obj1,(PyObject *)obj2); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyVideoConsumerCallback.prepare'"); } } @@ -4306,9 +4625,9 @@ int SwigDirector_ProxyVideoConsumerCallback::consume(ProxyVideoFrame const *fram #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"consume", (char *)"(O)" ,(PyObject *)obj0); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyVideoConsumerCallback.consume'"); } } @@ -4339,9 +4658,9 @@ int SwigDirector_ProxyVideoConsumerCallback::bufferCopied(unsigned int nCopiedSi #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"bufferCopied", (char *)"(OO)" ,(PyObject *)obj0,(PyObject *)obj1); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyVideoConsumerCallback.bufferCopied'"); } } @@ -4368,9 +4687,9 @@ int SwigDirector_ProxyVideoConsumerCallback::start() { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "start", NULL); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyVideoConsumerCallback.start'"); } } @@ -4397,9 +4716,9 @@ int SwigDirector_ProxyVideoConsumerCallback::pause() { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "pause", NULL); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyVideoConsumerCallback.pause'"); } } @@ -4426,9 +4745,9 @@ int SwigDirector_ProxyVideoConsumerCallback::stop() { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "stop", NULL); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyVideoConsumerCallback.stop'"); } } @@ -4471,9 +4790,9 @@ int SwigDirector_ProxyAudioProducerCallback::prepare(int ptime, int rate, int ch #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"prepare", (char *)"(OOO)" ,(PyObject *)obj0,(PyObject *)obj1,(PyObject *)obj2); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyAudioProducerCallback.prepare'"); } } @@ -4500,9 +4819,9 @@ int SwigDirector_ProxyAudioProducerCallback::start() { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "start", NULL); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyAudioProducerCallback.start'"); } } @@ -4529,9 +4848,9 @@ int SwigDirector_ProxyAudioProducerCallback::pause() { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "pause", NULL); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyAudioProducerCallback.pause'"); } } @@ -4558,9 +4877,9 @@ int SwigDirector_ProxyAudioProducerCallback::stop() { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "stop", NULL); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyAudioProducerCallback.stop'"); } } @@ -4603,9 +4922,9 @@ int SwigDirector_ProxyVideoProducerCallback::prepare(int width, int height, int #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"prepare", (char *)"(OOO)" ,(PyObject *)obj0,(PyObject *)obj1,(PyObject *)obj2); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyVideoProducerCallback.prepare'"); } } @@ -4632,9 +4951,9 @@ int SwigDirector_ProxyVideoProducerCallback::start() { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "start", NULL); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyVideoProducerCallback.start'"); } } @@ -4661,9 +4980,9 @@ int SwigDirector_ProxyVideoProducerCallback::pause() { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "pause", NULL); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyVideoProducerCallback.pause'"); } } @@ -4690,9 +5009,9 @@ int SwigDirector_ProxyVideoProducerCallback::stop() { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "stop", NULL); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'ProxyVideoProducerCallback.stop'"); } } @@ -4731,9 +5050,9 @@ int SwigDirector_SipCallback::OnDialogEvent(DialogEvent const *e) { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"OnDialogEvent", (char *)"(O)" ,(PyObject *)obj0); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'SipCallback.OnDialogEvent'"); } } @@ -4762,9 +5081,9 @@ int SwigDirector_SipCallback::OnStackEvent(StackEvent const *e) { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"OnStackEvent", (char *)"(O)" ,(PyObject *)obj0); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'SipCallback.OnStackEvent'"); } } @@ -4793,9 +5112,9 @@ int SwigDirector_SipCallback::OnInviteEvent(InviteEvent const *e) { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"OnInviteEvent", (char *)"(O)" ,(PyObject *)obj0); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'SipCallback.OnInviteEvent'"); } } @@ -4824,9 +5143,9 @@ int SwigDirector_SipCallback::OnMessagingEvent(MessagingEvent const *e) { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"OnMessagingEvent", (char *)"(O)" ,(PyObject *)obj0); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'SipCallback.OnMessagingEvent'"); } } @@ -4855,9 +5174,9 @@ int SwigDirector_SipCallback::OnInfoEvent(InfoEvent const *e) { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"OnInfoEvent", (char *)"(O)" ,(PyObject *)obj0); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'SipCallback.OnInfoEvent'"); } } @@ -4886,9 +5205,9 @@ int SwigDirector_SipCallback::OnOptionsEvent(OptionsEvent const *e) { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"OnOptionsEvent", (char *)"(O)" ,(PyObject *)obj0); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'SipCallback.OnOptionsEvent'"); } } @@ -4917,9 +5236,9 @@ int SwigDirector_SipCallback::OnPublicationEvent(PublicationEvent const *e) { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"OnPublicationEvent", (char *)"(O)" ,(PyObject *)obj0); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'SipCallback.OnPublicationEvent'"); } } @@ -4948,9 +5267,9 @@ int SwigDirector_SipCallback::OnRegistrationEvent(RegistrationEvent const *e) { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"OnRegistrationEvent", (char *)"(O)" ,(PyObject *)obj0); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'SipCallback.OnRegistrationEvent'"); } } @@ -4979,9 +5298,9 @@ int SwigDirector_SipCallback::OnSubscriptionEvent(SubscriptionEvent const *e) { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"OnSubscriptionEvent", (char *)"(O)" ,(PyObject *)obj0); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'SipCallback.OnSubscriptionEvent'"); } } @@ -5020,9 +5339,9 @@ int SwigDirector_XcapCallback::onEvent(XcapEvent const *e) const { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"onEvent", (char *)"(O)" ,(PyObject *)obj0); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'XcapCallback.onEvent'"); } } @@ -5061,9 +5380,9 @@ int SwigDirector_MsrpCallback::OnEvent(MsrpEvent const *e) { #else swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"OnEvent", (char *)"(O)" ,(PyObject *)obj0); #endif - if (result == NULL) { + if (!result) { PyObject *error = PyErr_Occurred(); - if (error != NULL) { + if (error) { Swig::DirectorMethodException::raise("Error detected when calling 'MsrpCallback.OnEvent'"); } } @@ -6237,6 +6556,41 @@ fail: } +SWIGINTERN PyObject *_wrap_MediaSessionMgr_defaultsSetProfile(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + tmedia_profile_t arg1 ; + int val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"O:MediaSessionMgr_defaultsSetProfile",&obj0)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "MediaSessionMgr_defaultsSetProfile" "', argument " "1"" of type '" "tmedia_profile_t""'"); + } + arg1 = static_cast< tmedia_profile_t >(val1); + result = (bool)MediaSessionMgr::defaultsSetProfile(arg1); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MediaSessionMgr_defaultsGetProfile(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + tmedia_profile_t result; + + if (!PyArg_ParseTuple(args,(char *)":MediaSessionMgr_defaultsGetProfile")) SWIG_fail; + result = (tmedia_profile_t)MediaSessionMgr::defaultsGetProfile(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + SWIGINTERN PyObject *_wrap_MediaSessionMgr_defaultsSetBandwidthLevel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tmedia_bandwidth_level_t arg1 ; @@ -6272,6 +6626,28 @@ fail: } +SWIGINTERN PyObject *_wrap_MediaSessionMgr_defaultsSetPrefVideoSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + tmedia_pref_video_size_t arg1 ; + int val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"O:MediaSessionMgr_defaultsSetPrefVideoSize",&obj0)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "MediaSessionMgr_defaultsSetPrefVideoSize" "', argument " "1"" of type '" "tmedia_pref_video_size_t""'"); + } + arg1 = static_cast< tmedia_pref_video_size_t >(val1); + result = (bool)MediaSessionMgr::defaultsSetPrefVideoSize(arg1); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + SWIGINTERN PyObject *_wrap_MediaSessionMgr_defaultsSetJbMargin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint32_t arg1 ; @@ -6824,6 +7200,28 @@ fail: } +SWIGINTERN PyObject *_wrap_MediaSessionMgr_defaultsSetIceEnabled(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + bool arg1 ; + bool val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"O:MediaSessionMgr_defaultsSetIceEnabled",&obj0)) SWIG_fail; + ecode1 = SWIG_AsVal_bool(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "MediaSessionMgr_defaultsSetIceEnabled" "', argument " "1"" of type '" "bool""'"); + } + arg1 = static_cast< bool >(val1); + result = (bool)MediaSessionMgr::defaultsSetIceEnabled(arg1); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + SWIGINTERN PyObject *MediaSessionMgr_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; @@ -7010,8 +7408,8 @@ SWIGINTERN PyObject *_wrap_MediaContent_parse(PyObject *self, PyObject *args) { int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 3); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 3) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 2) { @@ -7050,11 +7448,11 @@ SWIGINTERN PyObject *_wrap_MediaContent_parse(PyObject *self, PyObject *args) { } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'MediaContent_parse'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'MediaContent_parse'.\n" " Possible C/C++ prototypes are:\n" - " parse(void const *,unsigned int,char const *)\n" + " MediaContent::parse(void const *,unsigned int,char const *)\n" " MediaContent::parse(void const *,unsigned int)\n"); - return NULL; + return 0; } @@ -7315,8 +7713,8 @@ SWIGINTERN PyObject *_wrap_new_SipUri(PyObject *self, PyObject *args) { int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -7341,11 +7739,11 @@ SWIGINTERN PyObject *_wrap_new_SipUri(PyObject *self, PyObject *args) { } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SipUri'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_SipUri'.\n" " Possible C/C++ prototypes are:\n" - " SipUri(char const *,char const *)\n" - " SipUri(char const *)\n"); - return NULL; + " SipUri::SipUri(char const *,char const *)\n" + " SipUri::SipUri(char const *)\n"); + return 0; } @@ -7423,8 +7821,8 @@ SWIGINTERN PyObject *_wrap_SipUri_isValid(PyObject *self, PyObject *args) { int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 1); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 1) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -7446,11 +7844,11 @@ SWIGINTERN PyObject *_wrap_SipUri_isValid(PyObject *self, PyObject *args) { } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SipUri_isValid'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SipUri_isValid'.\n" " Possible C/C++ prototypes are:\n" - " isValid(char const *)\n" - " isValid(SipUri *)\n"); - return NULL; + " SipUri::isValid(char const *)\n" + " SipUri::isValid()\n"); + return 0; } @@ -7797,8 +8195,8 @@ SWIGINTERN PyObject *_wrap_SdpMessage_getSdpHeaderValue(PyObject *self, PyObject int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 4); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 4) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 3) { @@ -7847,11 +8245,11 @@ SWIGINTERN PyObject *_wrap_SdpMessage_getSdpHeaderValue(PyObject *self, PyObject } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SdpMessage_getSdpHeaderValue'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SdpMessage_getSdpHeaderValue'.\n" " Possible C/C++ prototypes are:\n" - " getSdpHeaderValue(SdpMessage *,char const *,char,unsigned int)\n" - " getSdpHeaderValue(SdpMessage *,char const *,char)\n"); - return NULL; + " SdpMessage::getSdpHeaderValue(char const *,char,unsigned int)\n" + " SdpMessage::getSdpHeaderValue(char const *,char)\n"); + return 0; } @@ -8094,8 +8492,8 @@ SWIGINTERN PyObject *_wrap_SipMessage_getSipHeaderValue(PyObject *self, PyObject int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 3); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 3) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 2) { @@ -8132,11 +8530,11 @@ SWIGINTERN PyObject *_wrap_SipMessage_getSipHeaderValue(PyObject *self, PyObject } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SipMessage_getSipHeaderValue'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SipMessage_getSipHeaderValue'.\n" " Possible C/C++ prototypes are:\n" - " getSipHeaderValue(SipMessage *,char const *,unsigned int)\n" - " getSipHeaderValue(SipMessage *,char const *)\n"); - return NULL; + " SipMessage::getSipHeaderValue(char const *,unsigned int)\n" + " SipMessage::getSipHeaderValue(char const *)\n"); + return 0; } @@ -8249,8 +8647,8 @@ SWIGINTERN PyObject *_wrap_SipMessage_getSipHeaderParamValue(PyObject *self, PyO int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 4); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 4) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 3) { @@ -8295,11 +8693,11 @@ SWIGINTERN PyObject *_wrap_SipMessage_getSipHeaderParamValue(PyObject *self, PyO } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SipMessage_getSipHeaderParamValue'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SipMessage_getSipHeaderParamValue'.\n" " Possible C/C++ prototypes are:\n" - " getSipHeaderParamValue(SipMessage *,char const *,char const *,unsigned int)\n" - " getSipHeaderParamValue(SipMessage *,char const *,char const *)\n"); - return NULL; + " SipMessage::getSipHeaderParamValue(char const *,char const *,unsigned int)\n" + " SipMessage::getSipHeaderParamValue(char const *,char const *)\n"); + return 0; } @@ -9453,8 +9851,8 @@ SWIGINTERN PyObject *_wrap_SipSession_addCaps(PyObject *self, PyObject *args) { int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 3); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 3) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 2) { @@ -9489,11 +9887,11 @@ SWIGINTERN PyObject *_wrap_SipSession_addCaps(PyObject *self, PyObject *args) { } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SipSession_addCaps'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SipSession_addCaps'.\n" " Possible C/C++ prototypes are:\n" - " addCaps(SipSession *,char const *,char const *)\n" - " addCaps(SipSession *,char const *)\n"); - return NULL; + " SipSession::addCaps(char const *,char const *)\n" + " SipSession::addCaps(char const *)\n"); + return 0; } @@ -9633,8 +10031,8 @@ SWIGINTERN PyObject *_wrap_SipSession_setFromUri(PyObject *self, PyObject *args) int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 2) { @@ -9666,11 +10064,11 @@ SWIGINTERN PyObject *_wrap_SipSession_setFromUri(PyObject *self, PyObject *args) } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SipSession_setFromUri'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SipSession_setFromUri'.\n" " Possible C/C++ prototypes are:\n" - " setFromUri(SipSession *,char const *)\n" - " setFromUri(SipSession *,SipUri const *)\n"); - return NULL; + " SipSession::setFromUri(char const *)\n" + " SipSession::setFromUri(SipUri const *)\n"); + return 0; } @@ -9745,8 +10143,8 @@ SWIGINTERN PyObject *_wrap_SipSession_setToUri(PyObject *self, PyObject *args) { int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 2) { @@ -9778,11 +10176,11 @@ SWIGINTERN PyObject *_wrap_SipSession_setToUri(PyObject *self, PyObject *args) { } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SipSession_setToUri'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SipSession_setToUri'.\n" " Possible C/C++ prototypes are:\n" - " setToUri(SipSession *,char const *)\n" - " setToUri(SipSession *,SipUri const *)\n"); - return NULL; + " SipSession::setToUri(char const *)\n" + " SipSession::setToUri(SipUri const *)\n"); + return 0; } @@ -10004,8 +10402,8 @@ SWIGINTERN PyObject *_wrap_InviteSession_accept(PyObject *self, PyObject *args) int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -10033,11 +10431,11 @@ SWIGINTERN PyObject *_wrap_InviteSession_accept(PyObject *self, PyObject *args) } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'InviteSession_accept'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'InviteSession_accept'.\n" " Possible C/C++ prototypes are:\n" - " accept(InviteSession *,ActionConfig *)\n" - " accept(InviteSession *)\n"); - return NULL; + " InviteSession::accept(ActionConfig *)\n" + " InviteSession::accept()\n"); + return 0; } @@ -10100,8 +10498,8 @@ SWIGINTERN PyObject *_wrap_InviteSession_hangup(PyObject *self, PyObject *args) int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -10129,11 +10527,11 @@ SWIGINTERN PyObject *_wrap_InviteSession_hangup(PyObject *self, PyObject *args) } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'InviteSession_hangup'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'InviteSession_hangup'.\n" " Possible C/C++ prototypes are:\n" - " hangup(InviteSession *,ActionConfig *)\n" - " hangup(InviteSession *)\n"); - return NULL; + " InviteSession::hangup(ActionConfig *)\n" + " InviteSession::hangup()\n"); + return 0; } @@ -10196,8 +10594,8 @@ SWIGINTERN PyObject *_wrap_InviteSession_reject(PyObject *self, PyObject *args) int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -10225,11 +10623,11 @@ SWIGINTERN PyObject *_wrap_InviteSession_reject(PyObject *self, PyObject *args) } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'InviteSession_reject'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'InviteSession_reject'.\n" " Possible C/C++ prototypes are:\n" - " reject(InviteSession *,ActionConfig *)\n" - " reject(InviteSession *)\n"); - return NULL; + " InviteSession::reject(ActionConfig *)\n" + " InviteSession::reject()\n"); + return 0; } @@ -10324,8 +10722,8 @@ SWIGINTERN PyObject *_wrap_InviteSession_sendInfo(PyObject *self, PyObject *args int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 4); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 4) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 3) { @@ -10375,11 +10773,11 @@ SWIGINTERN PyObject *_wrap_InviteSession_sendInfo(PyObject *self, PyObject *args } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'InviteSession_sendInfo'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'InviteSession_sendInfo'.\n" " Possible C/C++ prototypes are:\n" - " sendInfo(InviteSession *,void const *,unsigned int,ActionConfig *)\n" - " sendInfo(InviteSession *,void const *,unsigned int)\n"); - return NULL; + " InviteSession::sendInfo(void const *,unsigned int,ActionConfig *)\n" + " InviteSession::sendInfo(void const *,unsigned int)\n"); + return 0; } @@ -10609,8 +11007,8 @@ SWIGINTERN PyObject *_wrap_CallSession_callAudio(PyObject *self, PyObject *args) int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 3); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 3) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 2) { @@ -10679,13 +11077,13 @@ SWIGINTERN PyObject *_wrap_CallSession_callAudio(PyObject *self, PyObject *args) } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'CallSession_callAudio'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'CallSession_callAudio'.\n" " Possible C/C++ prototypes are:\n" - " callAudio(CallSession *,char const *,ActionConfig *)\n" - " callAudio(CallSession *,char const *)\n" - " callAudio(CallSession *,SipUri const *,ActionConfig *)\n" - " callAudio(CallSession *,SipUri const *)\n"); - return NULL; + " CallSession::callAudio(char const *,ActionConfig *)\n" + " CallSession::callAudio(char const *)\n" + " CallSession::callAudio(SipUri const *,ActionConfig *)\n" + " CallSession::callAudio(SipUri const *)\n"); + return 0; } @@ -10843,8 +11241,8 @@ SWIGINTERN PyObject *_wrap_CallSession_callAudioVideo(PyObject *self, PyObject * int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 3); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 3) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 2) { @@ -10913,13 +11311,13 @@ SWIGINTERN PyObject *_wrap_CallSession_callAudioVideo(PyObject *self, PyObject * } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'CallSession_callAudioVideo'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'CallSession_callAudioVideo'.\n" " Possible C/C++ prototypes are:\n" - " callAudioVideo(CallSession *,char const *,ActionConfig *)\n" - " callAudioVideo(CallSession *,char const *)\n" - " callAudioVideo(CallSession *,SipUri const *,ActionConfig *)\n" - " callAudioVideo(CallSession *,SipUri const *)\n"); - return NULL; + " CallSession::callAudioVideo(char const *,ActionConfig *)\n" + " CallSession::callAudioVideo(char const *)\n" + " CallSession::callAudioVideo(SipUri const *,ActionConfig *)\n" + " CallSession::callAudioVideo(SipUri const *)\n"); + return 0; } @@ -11077,8 +11475,8 @@ SWIGINTERN PyObject *_wrap_CallSession_callVideo(PyObject *self, PyObject *args) int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 3); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 3) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 2) { @@ -11147,13 +11545,13 @@ SWIGINTERN PyObject *_wrap_CallSession_callVideo(PyObject *self, PyObject *args) } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'CallSession_callVideo'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'CallSession_callVideo'.\n" " Possible C/C++ prototypes are:\n" - " callVideo(CallSession *,char const *,ActionConfig *)\n" - " callVideo(CallSession *,char const *)\n" - " callVideo(CallSession *,SipUri const *,ActionConfig *)\n" - " callVideo(CallSession *,SipUri const *)\n"); - return NULL; + " CallSession::callVideo(char const *,ActionConfig *)\n" + " CallSession::callVideo(char const *)\n" + " CallSession::callVideo(SipUri const *,ActionConfig *)\n" + " CallSession::callVideo(SipUri const *)\n"); + return 0; } @@ -11231,6 +11629,37 @@ fail: } +SWIGINTERN PyObject *_wrap_CallSession_setICE(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + CallSession *arg1 = (CallSession *) 0 ; + bool arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:CallSession_setICE",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_CallSession, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CallSession_setICE" "', argument " "1"" of type '" "CallSession *""'"); + } + arg1 = reinterpret_cast< CallSession * >(argp1); + ecode2 = SWIG_AsVal_bool(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CallSession_setICE" "', argument " "2"" of type '" "bool""'"); + } + arg2 = static_cast< bool >(val2); + result = (bool)(arg1)->setICE(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + SWIGINTERN PyObject *_wrap_CallSession_setQoS(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; CallSession *arg1 = (CallSession *) 0 ; @@ -11330,8 +11759,8 @@ SWIGINTERN PyObject *_wrap_CallSession_hold(PyObject *self, PyObject *args) { int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -11359,11 +11788,11 @@ SWIGINTERN PyObject *_wrap_CallSession_hold(PyObject *self, PyObject *args) { } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'CallSession_hold'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'CallSession_hold'.\n" " Possible C/C++ prototypes are:\n" - " hold(CallSession *,ActionConfig *)\n" - " hold(CallSession *)\n"); - return NULL; + " CallSession::hold(ActionConfig *)\n" + " CallSession::hold()\n"); + return 0; } @@ -11426,8 +11855,8 @@ SWIGINTERN PyObject *_wrap_CallSession_resume(PyObject *self, PyObject *args) { int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -11455,11 +11884,11 @@ SWIGINTERN PyObject *_wrap_CallSession_resume(PyObject *self, PyObject *args) { } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'CallSession_resume'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'CallSession_resume'.\n" " Possible C/C++ prototypes are:\n" - " resume(CallSession *,ActionConfig *)\n" - " resume(CallSession *)\n"); - return NULL; + " CallSession::resume(ActionConfig *)\n" + " CallSession::resume()\n"); + return 0; } @@ -11546,8 +11975,8 @@ SWIGINTERN PyObject *_wrap_CallSession_transfer(PyObject *self, PyObject *args) int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 3); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 3) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 2) { @@ -11583,11 +12012,11 @@ SWIGINTERN PyObject *_wrap_CallSession_transfer(PyObject *self, PyObject *args) } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'CallSession_transfer'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'CallSession_transfer'.\n" " Possible C/C++ prototypes are:\n" - " transfer(CallSession *,char const *,ActionConfig *)\n" - " transfer(CallSession *,char const *)\n"); - return NULL; + " CallSession::transfer(char const *,ActionConfig *)\n" + " CallSession::transfer(char const *)\n"); + return 0; } @@ -11650,8 +12079,8 @@ SWIGINTERN PyObject *_wrap_CallSession_acceptTransfer(PyObject *self, PyObject * int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -11679,11 +12108,11 @@ SWIGINTERN PyObject *_wrap_CallSession_acceptTransfer(PyObject *self, PyObject * } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'CallSession_acceptTransfer'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'CallSession_acceptTransfer'.\n" " Possible C/C++ prototypes are:\n" - " acceptTransfer(CallSession *,ActionConfig *)\n" - " acceptTransfer(CallSession *)\n"); - return NULL; + " CallSession::acceptTransfer(ActionConfig *)\n" + " CallSession::acceptTransfer()\n"); + return 0; } @@ -11746,8 +12175,8 @@ SWIGINTERN PyObject *_wrap_CallSession_rejectTransfer(PyObject *self, PyObject * int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -11775,11 +12204,11 @@ SWIGINTERN PyObject *_wrap_CallSession_rejectTransfer(PyObject *self, PyObject * } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'CallSession_rejectTransfer'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'CallSession_rejectTransfer'.\n" " Possible C/C++ prototypes are:\n" - " rejectTransfer(CallSession *,ActionConfig *)\n" - " rejectTransfer(CallSession *)\n"); - return NULL; + " CallSession::rejectTransfer(ActionConfig *)\n" + " CallSession::rejectTransfer()\n"); + return 0; } @@ -12080,8 +12509,8 @@ SWIGINTERN PyObject *_wrap_MsrpSession_callMsrp(PyObject *self, PyObject *args) int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 3); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 3) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 2) { @@ -12150,13 +12579,13 @@ SWIGINTERN PyObject *_wrap_MsrpSession_callMsrp(PyObject *self, PyObject *args) } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'MsrpSession_callMsrp'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'MsrpSession_callMsrp'.\n" " Possible C/C++ prototypes are:\n" - " callMsrp(MsrpSession *,char const *,ActionConfig *)\n" - " callMsrp(MsrpSession *,char const *)\n" - " callMsrp(MsrpSession *,SipUri const *,ActionConfig *)\n" - " callMsrp(MsrpSession *,SipUri const *)\n"); - return NULL; + " MsrpSession::callMsrp(char const *,ActionConfig *)\n" + " MsrpSession::callMsrp(char const *)\n" + " MsrpSession::callMsrp(SipUri const *,ActionConfig *)\n" + " MsrpSession::callMsrp(SipUri const *)\n"); + return 0; } @@ -12251,8 +12680,8 @@ SWIGINTERN PyObject *_wrap_MsrpSession_sendMessage(PyObject *self, PyObject *arg int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 4); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 4) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 3) { @@ -12302,11 +12731,11 @@ SWIGINTERN PyObject *_wrap_MsrpSession_sendMessage(PyObject *self, PyObject *arg } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'MsrpSession_sendMessage'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'MsrpSession_sendMessage'.\n" " Possible C/C++ prototypes are:\n" - " sendMessage(MsrpSession *,void const *,unsigned int,ActionConfig *)\n" - " sendMessage(MsrpSession *,void const *,unsigned int)\n"); - return NULL; + " MsrpSession::sendMessage(void const *,unsigned int,ActionConfig *)\n" + " MsrpSession::sendMessage(void const *,unsigned int)\n"); + return 0; } @@ -12369,8 +12798,8 @@ SWIGINTERN PyObject *_wrap_MsrpSession_sendFile(PyObject *self, PyObject *args) int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -12398,11 +12827,11 @@ SWIGINTERN PyObject *_wrap_MsrpSession_sendFile(PyObject *self, PyObject *args) } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'MsrpSession_sendFile'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'MsrpSession_sendFile'.\n" " Possible C/C++ prototypes are:\n" - " sendFile(MsrpSession *,ActionConfig *)\n" - " sendFile(MsrpSession *)\n"); - return NULL; + " MsrpSession::sendFile(ActionConfig *)\n" + " MsrpSession::sendFile()\n"); + return 0; } @@ -12547,8 +12976,8 @@ SWIGINTERN PyObject *_wrap_MessagingSession_send(PyObject *self, PyObject *args) int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 4); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 4) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 3) { @@ -12598,11 +13027,11 @@ SWIGINTERN PyObject *_wrap_MessagingSession_send(PyObject *self, PyObject *args) } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'MessagingSession_send'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'MessagingSession_send'.\n" " Possible C/C++ prototypes are:\n" - " send(MessagingSession *,void const *,unsigned int,ActionConfig *)\n" - " send(MessagingSession *,void const *,unsigned int)\n"); - return NULL; + " MessagingSession::send(void const *,unsigned int,ActionConfig *)\n" + " MessagingSession::send(void const *,unsigned int)\n"); + return 0; } @@ -12665,8 +13094,8 @@ SWIGINTERN PyObject *_wrap_MessagingSession_accept(PyObject *self, PyObject *arg int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -12694,11 +13123,11 @@ SWIGINTERN PyObject *_wrap_MessagingSession_accept(PyObject *self, PyObject *arg } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'MessagingSession_accept'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'MessagingSession_accept'.\n" " Possible C/C++ prototypes are:\n" - " accept(MessagingSession *,ActionConfig *)\n" - " accept(MessagingSession *)\n"); - return NULL; + " MessagingSession::accept(ActionConfig *)\n" + " MessagingSession::accept()\n"); + return 0; } @@ -12761,8 +13190,8 @@ SWIGINTERN PyObject *_wrap_MessagingSession_reject(PyObject *self, PyObject *arg int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -12790,11 +13219,11 @@ SWIGINTERN PyObject *_wrap_MessagingSession_reject(PyObject *self, PyObject *arg } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'MessagingSession_reject'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'MessagingSession_reject'.\n" " Possible C/C++ prototypes are:\n" - " reject(MessagingSession *,ActionConfig *)\n" - " reject(MessagingSession *)\n"); - return NULL; + " MessagingSession::reject(ActionConfig *)\n" + " MessagingSession::reject()\n"); + return 0; } @@ -12939,8 +13368,8 @@ SWIGINTERN PyObject *_wrap_InfoSession_send(PyObject *self, PyObject *args) { int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 4); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 4) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 3) { @@ -12990,11 +13419,11 @@ SWIGINTERN PyObject *_wrap_InfoSession_send(PyObject *self, PyObject *args) { } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'InfoSession_send'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'InfoSession_send'.\n" " Possible C/C++ prototypes are:\n" - " send(InfoSession *,void const *,unsigned int,ActionConfig *)\n" - " send(InfoSession *,void const *,unsigned int)\n"); - return NULL; + " InfoSession::send(void const *,unsigned int,ActionConfig *)\n" + " InfoSession::send(void const *,unsigned int)\n"); + return 0; } @@ -13057,8 +13486,8 @@ SWIGINTERN PyObject *_wrap_InfoSession_accept(PyObject *self, PyObject *args) { int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -13086,11 +13515,11 @@ SWIGINTERN PyObject *_wrap_InfoSession_accept(PyObject *self, PyObject *args) { } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'InfoSession_accept'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'InfoSession_accept'.\n" " Possible C/C++ prototypes are:\n" - " accept(InfoSession *,ActionConfig *)\n" - " accept(InfoSession *)\n"); - return NULL; + " InfoSession::accept(ActionConfig *)\n" + " InfoSession::accept()\n"); + return 0; } @@ -13153,8 +13582,8 @@ SWIGINTERN PyObject *_wrap_InfoSession_reject(PyObject *self, PyObject *args) { int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -13182,11 +13611,11 @@ SWIGINTERN PyObject *_wrap_InfoSession_reject(PyObject *self, PyObject *args) { } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'InfoSession_reject'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'InfoSession_reject'.\n" " Possible C/C++ prototypes are:\n" - " reject(InfoSession *,ActionConfig *)\n" - " reject(InfoSession *)\n"); - return NULL; + " InfoSession::reject(ActionConfig *)\n" + " InfoSession::reject()\n"); + return 0; } @@ -13299,8 +13728,8 @@ SWIGINTERN PyObject *_wrap_OptionsSession_send(PyObject *self, PyObject *args) { int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -13328,11 +13757,11 @@ SWIGINTERN PyObject *_wrap_OptionsSession_send(PyObject *self, PyObject *args) { } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'OptionsSession_send'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'OptionsSession_send'.\n" " Possible C/C++ prototypes are:\n" - " send(OptionsSession *,ActionConfig *)\n" - " send(OptionsSession *)\n"); - return NULL; + " OptionsSession::send(ActionConfig *)\n" + " OptionsSession::send()\n"); + return 0; } @@ -13395,8 +13824,8 @@ SWIGINTERN PyObject *_wrap_OptionsSession_accept(PyObject *self, PyObject *args) int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -13424,11 +13853,11 @@ SWIGINTERN PyObject *_wrap_OptionsSession_accept(PyObject *self, PyObject *args) } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'OptionsSession_accept'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'OptionsSession_accept'.\n" " Possible C/C++ prototypes are:\n" - " accept(OptionsSession *,ActionConfig *)\n" - " accept(OptionsSession *)\n"); - return NULL; + " OptionsSession::accept(ActionConfig *)\n" + " OptionsSession::accept()\n"); + return 0; } @@ -13491,8 +13920,8 @@ SWIGINTERN PyObject *_wrap_OptionsSession_reject(PyObject *self, PyObject *args) int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -13520,11 +13949,11 @@ SWIGINTERN PyObject *_wrap_OptionsSession_reject(PyObject *self, PyObject *args) } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'OptionsSession_reject'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'OptionsSession_reject'.\n" " Possible C/C++ prototypes are:\n" - " reject(OptionsSession *,ActionConfig *)\n" - " reject(OptionsSession *)\n"); - return NULL; + " OptionsSession::reject(ActionConfig *)\n" + " OptionsSession::reject()\n"); + return 0; } @@ -13669,8 +14098,8 @@ SWIGINTERN PyObject *_wrap_PublicationSession_publish(PyObject *self, PyObject * int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 4); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 4) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 3) { @@ -13720,11 +14149,11 @@ SWIGINTERN PyObject *_wrap_PublicationSession_publish(PyObject *self, PyObject * } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'PublicationSession_publish'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'PublicationSession_publish'.\n" " Possible C/C++ prototypes are:\n" - " publish(PublicationSession *,void const *,unsigned int,ActionConfig *)\n" - " publish(PublicationSession *,void const *,unsigned int)\n"); - return NULL; + " PublicationSession::publish(void const *,unsigned int,ActionConfig *)\n" + " PublicationSession::publish(void const *,unsigned int)\n"); + return 0; } @@ -13787,8 +14216,8 @@ SWIGINTERN PyObject *_wrap_PublicationSession_unPublish(PyObject *self, PyObject int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -13816,11 +14245,11 @@ SWIGINTERN PyObject *_wrap_PublicationSession_unPublish(PyObject *self, PyObject } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'PublicationSession_unPublish'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'PublicationSession_unPublish'.\n" " Possible C/C++ prototypes are:\n" - " unPublish(PublicationSession *,ActionConfig *)\n" - " unPublish(PublicationSession *)\n"); - return NULL; + " PublicationSession::unPublish(ActionConfig *)\n" + " PublicationSession::unPublish()\n"); + return 0; } @@ -13933,8 +14362,8 @@ SWIGINTERN PyObject *_wrap_RegistrationSession_register_(PyObject *self, PyObjec int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -13962,11 +14391,11 @@ SWIGINTERN PyObject *_wrap_RegistrationSession_register_(PyObject *self, PyObjec } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'RegistrationSession_register_'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'RegistrationSession_register_'.\n" " Possible C/C++ prototypes are:\n" - " register_(RegistrationSession *,ActionConfig *)\n" - " register_(RegistrationSession *)\n"); - return NULL; + " RegistrationSession::register_(ActionConfig *)\n" + " RegistrationSession::register_()\n"); + return 0; } @@ -14029,8 +14458,8 @@ SWIGINTERN PyObject *_wrap_RegistrationSession_unRegister(PyObject *self, PyObje int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -14058,11 +14487,11 @@ SWIGINTERN PyObject *_wrap_RegistrationSession_unRegister(PyObject *self, PyObje } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'RegistrationSession_unRegister'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'RegistrationSession_unRegister'.\n" " Possible C/C++ prototypes are:\n" - " unRegister(RegistrationSession *,ActionConfig *)\n" - " unRegister(RegistrationSession *)\n"); - return NULL; + " RegistrationSession::unRegister(ActionConfig *)\n" + " RegistrationSession::unRegister()\n"); + return 0; } @@ -14125,8 +14554,8 @@ SWIGINTERN PyObject *_wrap_RegistrationSession_accept(PyObject *self, PyObject * int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -14154,11 +14583,11 @@ SWIGINTERN PyObject *_wrap_RegistrationSession_accept(PyObject *self, PyObject * } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'RegistrationSession_accept'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'RegistrationSession_accept'.\n" " Possible C/C++ prototypes are:\n" - " accept(RegistrationSession *,ActionConfig *)\n" - " accept(RegistrationSession *)\n"); - return NULL; + " RegistrationSession::accept(ActionConfig *)\n" + " RegistrationSession::accept()\n"); + return 0; } @@ -14221,8 +14650,8 @@ SWIGINTERN PyObject *_wrap_RegistrationSession_reject(PyObject *self, PyObject * int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 2); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -14250,11 +14679,11 @@ SWIGINTERN PyObject *_wrap_RegistrationSession_reject(PyObject *self, PyObject * } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'RegistrationSession_reject'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'RegistrationSession_reject'.\n" " Possible C/C++ prototypes are:\n" - " reject(RegistrationSession *,ActionConfig *)\n" - " reject(RegistrationSession *)\n"); - return NULL; + " RegistrationSession::reject(ActionConfig *)\n" + " RegistrationSession::reject()\n"); + return 0; } @@ -15287,8 +15716,8 @@ SWIGINTERN PyObject *_wrap_ProxyAudioConsumer_pull(PyObject *self, PyObject *arg int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 3); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 3) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -15336,12 +15765,12 @@ SWIGINTERN PyObject *_wrap_ProxyAudioConsumer_pull(PyObject *self, PyObject *arg } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'ProxyAudioConsumer_pull'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'ProxyAudioConsumer_pull'.\n" " Possible C/C++ prototypes are:\n" - " pull(ProxyAudioConsumer *,void *,unsigned int)\n" - " pull(ProxyAudioConsumer *,void *)\n" - " pull(ProxyAudioConsumer *)\n"); - return NULL; + " ProxyAudioConsumer::pull(void *,unsigned int)\n" + " ProxyAudioConsumer::pull(void *)\n" + " ProxyAudioConsumer::pull()\n"); + return 0; } @@ -16675,8 +17104,8 @@ SWIGINTERN PyObject *_wrap_ProxyAudioProducer_push(PyObject *self, PyObject *arg int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 3); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 3) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 1) { @@ -16724,12 +17153,12 @@ SWIGINTERN PyObject *_wrap_ProxyAudioProducer_push(PyObject *self, PyObject *arg } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'ProxyAudioProducer_push'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'ProxyAudioProducer_push'.\n" " Possible C/C++ prototypes are:\n" - " push(ProxyAudioProducer *,void const *,unsigned int)\n" - " push(ProxyAudioProducer *,void const *)\n" - " push(ProxyAudioProducer *)\n"); - return NULL; + " ProxyAudioProducer::push(void const *,unsigned int)\n" + " ProxyAudioProducer::push(void const *)\n" + " ProxyAudioProducer::push()\n"); + return 0; } @@ -20007,8 +20436,8 @@ SWIGINTERN PyObject *_wrap_XcapMessage_getXcapHeaderValue(PyObject *self, PyObje int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 3); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 3) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 2) { @@ -20045,11 +20474,11 @@ SWIGINTERN PyObject *_wrap_XcapMessage_getXcapHeaderValue(PyObject *self, PyObje } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'XcapMessage_getXcapHeaderValue'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'XcapMessage_getXcapHeaderValue'.\n" " Possible C/C++ prototypes are:\n" - " getXcapHeaderValue(XcapMessage *,char const *,unsigned int)\n" - " getXcapHeaderValue(XcapMessage *,char const *)\n"); - return NULL; + " XcapMessage::getXcapHeaderValue(char const *,unsigned int)\n" + " XcapMessage::getXcapHeaderValue(char const *)\n"); + return 0; } @@ -20162,8 +20591,8 @@ SWIGINTERN PyObject *_wrap_XcapMessage_getXcapHeaderParamValue(PyObject *self, P int ii; if (!PyTuple_Check(args)) SWIG_fail; - argc = (int)PyObject_Length(args); - for (ii = 0; (ii < argc) && (ii < 4); ii++) { + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 4) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if (argc == 3) { @@ -20208,11 +20637,11 @@ SWIGINTERN PyObject *_wrap_XcapMessage_getXcapHeaderParamValue(PyObject *self, P } fail: - SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'XcapMessage_getXcapHeaderParamValue'.\n" + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'XcapMessage_getXcapHeaderParamValue'.\n" " Possible C/C++ prototypes are:\n" - " getXcapHeaderParamValue(XcapMessage *,char const *,char const *,unsigned int)\n" - " getXcapHeaderParamValue(XcapMessage *,char const *,char const *)\n"); - return NULL; + " XcapMessage::getXcapHeaderParamValue(char const *,char const *,unsigned int)\n" + " XcapMessage::getXcapHeaderParamValue(char const *,char const *)\n"); + return 0; } @@ -22543,8 +22972,11 @@ static PyMethodDef SwigMethods[] = { { (char *)"MediaSessionMgr_findProxyPluginConsumer", _wrap_MediaSessionMgr_findProxyPluginConsumer, METH_VARARGS, NULL}, { (char *)"MediaSessionMgr_findProxyPluginProducer", _wrap_MediaSessionMgr_findProxyPluginProducer, METH_VARARGS, NULL}, { (char *)"MediaSessionMgr_getSessionId", _wrap_MediaSessionMgr_getSessionId, METH_VARARGS, NULL}, + { (char *)"MediaSessionMgr_defaultsSetProfile", _wrap_MediaSessionMgr_defaultsSetProfile, METH_VARARGS, NULL}, + { (char *)"MediaSessionMgr_defaultsGetProfile", _wrap_MediaSessionMgr_defaultsGetProfile, METH_VARARGS, NULL}, { (char *)"MediaSessionMgr_defaultsSetBandwidthLevel", _wrap_MediaSessionMgr_defaultsSetBandwidthLevel, METH_VARARGS, NULL}, { (char *)"MediaSessionMgr_defaultsGetBandwidthLevel", _wrap_MediaSessionMgr_defaultsGetBandwidthLevel, METH_VARARGS, NULL}, + { (char *)"MediaSessionMgr_defaultsSetPrefVideoSize", _wrap_MediaSessionMgr_defaultsSetPrefVideoSize, METH_VARARGS, NULL}, { (char *)"MediaSessionMgr_defaultsSetJbMargin", _wrap_MediaSessionMgr_defaultsSetJbMargin, METH_VARARGS, NULL}, { (char *)"MediaSessionMgr_defaultsSetJbMaxLateRate", _wrap_MediaSessionMgr_defaultsSetJbMaxLateRate, METH_VARARGS, NULL}, { (char *)"MediaSessionMgr_defaultsSetEchoTail", _wrap_MediaSessionMgr_defaultsSetEchoTail, METH_VARARGS, NULL}, @@ -22572,6 +23004,7 @@ static PyMethodDef SwigMethods[] = { { (char *)"MediaSessionMgr_defaultsGetVolume", _wrap_MediaSessionMgr_defaultsGetVolume, METH_VARARGS, NULL}, { (char *)"MediaSessionMgr_defaultsSetInviteSessionTimers", _wrap_MediaSessionMgr_defaultsSetInviteSessionTimers, METH_VARARGS, NULL}, { (char *)"MediaSessionMgr_defaultsSetSRtpMode", _wrap_MediaSessionMgr_defaultsSetSRtpMode, METH_VARARGS, NULL}, + { (char *)"MediaSessionMgr_defaultsSetIceEnabled", _wrap_MediaSessionMgr_defaultsSetIceEnabled, METH_VARARGS, NULL}, { (char *)"MediaSessionMgr_swigregister", MediaSessionMgr_swigregister, METH_VARARGS, NULL}, { (char *)"delete_MediaContent", _wrap_delete_MediaContent, METH_VARARGS, NULL}, { (char *)"MediaContent_getType", _wrap_MediaContent_getType, METH_VARARGS, NULL}, @@ -22689,6 +23122,7 @@ static PyMethodDef SwigMethods[] = { { (char *)"CallSession_callVideo", _wrap_CallSession_callVideo, METH_VARARGS, NULL}, { (char *)"CallSession_setSessionTimer", _wrap_CallSession_setSessionTimer, METH_VARARGS, NULL}, { (char *)"CallSession_set100rel", _wrap_CallSession_set100rel, METH_VARARGS, NULL}, + { (char *)"CallSession_setICE", _wrap_CallSession_setICE, METH_VARARGS, NULL}, { (char *)"CallSession_setQoS", _wrap_CallSession_setQoS, METH_VARARGS, NULL}, { (char *)"CallSession_hold", _wrap_CallSession_hold, METH_VARARGS, NULL}, { (char *)"CallSession_resume", _wrap_CallSession_resume, METH_VARARGS, NULL}, @@ -23150,6 +23584,8 @@ static swig_type_info _swigt__p_tdav_codec_id_e = {"_p_tdav_codec_id_e", "enum t static swig_type_info _swigt__p_thttp_event_type_e = {"_p_thttp_event_type_e", "enum thttp_event_type_e *|thttp_event_type_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tmedia_bandwidth_level_e = {"_p_tmedia_bandwidth_level_e", "enum tmedia_bandwidth_level_e *|tmedia_bandwidth_level_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tmedia_chroma_e = {"_p_tmedia_chroma_e", "tmedia_chroma_t *|enum tmedia_chroma_e *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_tmedia_pref_video_size_s = {"_p_tmedia_pref_video_size_s", "tmedia_pref_video_size_t *|enum tmedia_pref_video_size_s *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_tmedia_profile_e = {"_p_tmedia_profile_e", "tmedia_profile_t *|enum tmedia_profile_e *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tmedia_qos_strength_e = {"_p_tmedia_qos_strength_e", "tmedia_qos_strength_t *|enum tmedia_qos_strength_e *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tmedia_qos_stype_e = {"_p_tmedia_qos_stype_e", "enum tmedia_qos_stype_e *|tmedia_qos_stype_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tmedia_srtp_mode_e = {"_p_tmedia_srtp_mode_e", "enum tmedia_srtp_mode_e *|tmedia_srtp_mode_t *", 0, 0, (void*)0, 0}; @@ -23239,6 +23675,8 @@ static swig_type_info *swig_type_initial[] = { &_swigt__p_thttp_event_type_e, &_swigt__p_tmedia_bandwidth_level_e, &_swigt__p_tmedia_chroma_e, + &_swigt__p_tmedia_pref_video_size_s, + &_swigt__p_tmedia_profile_e, &_swigt__p_tmedia_qos_strength_e, &_swigt__p_tmedia_qos_stype_e, &_swigt__p_tmedia_srtp_mode_e, @@ -23328,6 +23766,8 @@ static swig_cast_info _swigc__p_tdav_codec_id_e[] = { {&_swigt__p_tdav_codec_id static swig_cast_info _swigc__p_thttp_event_type_e[] = { {&_swigt__p_thttp_event_type_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tmedia_bandwidth_level_e[] = { {&_swigt__p_tmedia_bandwidth_level_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tmedia_chroma_e[] = { {&_swigt__p_tmedia_chroma_e, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_tmedia_pref_video_size_s[] = { {&_swigt__p_tmedia_pref_video_size_s, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_tmedia_profile_e[] = { {&_swigt__p_tmedia_profile_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tmedia_qos_strength_e[] = { {&_swigt__p_tmedia_qos_strength_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tmedia_qos_stype_e[] = { {&_swigt__p_tmedia_qos_stype_e, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tmedia_srtp_mode_e[] = { {&_swigt__p_tmedia_srtp_mode_e, 0, 0, 0},{0, 0, 0, 0}}; @@ -23417,6 +23857,8 @@ static swig_cast_info *swig_cast_initial[] = { _swigc__p_thttp_event_type_e, _swigc__p_tmedia_bandwidth_level_e, _swigc__p_tmedia_chroma_e, + _swigc__p_tmedia_pref_video_size_s, + _swigc__p_tmedia_profile_e, _swigc__p_tmedia_qos_strength_e, _swigc__p_tmedia_qos_stype_e, _swigc__p_tmedia_srtp_mode_e, @@ -23451,242 +23893,242 @@ static swig_const_info swig_const_table[] = { #ifdef __cplusplus } #endif -/* ----------------------------------------------------------------------------- - * Type initialization: - * This problem is tough by the requirement that no dynamic - * memory is used. Also, since swig_type_info structures store pointers to - * swig_cast_info structures and swig_cast_info structures store pointers back - * to swig_type_info structures, we need some lookup code at initialization. - * The idea is that swig generates all the structures that are needed. - * The runtime then collects these partially filled structures. - * The SWIG_InitializeModule function takes these initial arrays out of - * swig_module, and does all the lookup, filling in the swig_module.types - * array with the correct data and linking the correct swig_cast_info - * structures together. - * - * The generated swig_type_info structures are assigned staticly to an initial - * array. We just loop through that array, and handle each type individually. - * First we lookup if this type has been already loaded, and if so, use the - * loaded structure instead of the generated one. Then we have to fill in the - * cast linked list. The cast data is initially stored in something like a - * two-dimensional array. Each row corresponds to a type (there are the same - * number of rows as there are in the swig_type_initial array). Each entry in - * a column is one of the swig_cast_info structures for that type. - * The cast_initial array is actually an array of arrays, because each row has - * a variable number of columns. So to actually build the cast linked list, - * we find the array of casts associated with the type, and loop through it - * adding the casts to the list. The one last trick we need to do is making - * sure the type pointer in the swig_cast_info struct is correct. - * - * First off, we lookup the cast->type name to see if it is already loaded. - * There are three cases to handle: - * 1) If the cast->type has already been loaded AND the type we are adding - * casting info to has not been loaded (it is in this module), THEN we - * replace the cast->type pointer with the type pointer that has already - * been loaded. - * 2) If BOTH types (the one we are adding casting info to, and the - * cast->type) are loaded, THEN the cast info has already been loaded by - * the previous module so we just ignore it. - * 3) Finally, if cast->type has not already been loaded, then we add that - * swig_cast_info to the linked list (because the cast->type) pointer will - * be correct. - * ----------------------------------------------------------------------------- */ +/* ----------------------------------------------------------------------------- + * Type initialization: + * This problem is tough by the requirement that no dynamic + * memory is used. Also, since swig_type_info structures store pointers to + * swig_cast_info structures and swig_cast_info structures store pointers back + * to swig_type_info structures, we need some lookup code at initialization. + * The idea is that swig generates all the structures that are needed. + * The runtime then collects these partially filled structures. + * The SWIG_InitializeModule function takes these initial arrays out of + * swig_module, and does all the lookup, filling in the swig_module.types + * array with the correct data and linking the correct swig_cast_info + * structures together. + * + * The generated swig_type_info structures are assigned staticly to an initial + * array. We just loop through that array, and handle each type individually. + * First we lookup if this type has been already loaded, and if so, use the + * loaded structure instead of the generated one. Then we have to fill in the + * cast linked list. The cast data is initially stored in something like a + * two-dimensional array. Each row corresponds to a type (there are the same + * number of rows as there are in the swig_type_initial array). Each entry in + * a column is one of the swig_cast_info structures for that type. + * The cast_initial array is actually an array of arrays, because each row has + * a variable number of columns. So to actually build the cast linked list, + * we find the array of casts associated with the type, and loop through it + * adding the casts to the list. The one last trick we need to do is making + * sure the type pointer in the swig_cast_info struct is correct. + * + * First off, we lookup the cast->type name to see if it is already loaded. + * There are three cases to handle: + * 1) If the cast->type has already been loaded AND the type we are adding + * casting info to has not been loaded (it is in this module), THEN we + * replace the cast->type pointer with the type pointer that has already + * been loaded. + * 2) If BOTH types (the one we are adding casting info to, and the + * cast->type) are loaded, THEN the cast info has already been loaded by + * the previous module so we just ignore it. + * 3) Finally, if cast->type has not already been loaded, then we add that + * swig_cast_info to the linked list (because the cast->type) pointer will + * be correct. + * ----------------------------------------------------------------------------- */ -#ifdef __cplusplus +#ifdef __cplusplus extern "C" { -#if 0 -} /* c-mode */ -#endif -#endif +#if 0 +} /* c-mode */ +#endif +#endif -#if 0 -#define SWIGRUNTIME_DEBUG -#endif +#if 0 +#define SWIGRUNTIME_DEBUG +#endif -SWIGRUNTIME void +SWIGRUNTIME void SWIG_InitializeModule(void *clientdata) { - size_t i; - swig_module_info *module_head, *iter; - int found, init; + size_t i; + swig_module_info *module_head, *iter; + int found, init; - clientdata = clientdata; + clientdata = clientdata; - /* check to see if the circular list has been setup, if not, set it up */ + /* check to see if the circular list has been setup, if not, set it up */ if (swig_module.next==0) { - /* Initialize the swig_module */ - swig_module.type_initial = swig_type_initial; - swig_module.cast_initial = swig_cast_initial; - swig_module.next = &swig_module; - init = 1; + /* Initialize the swig_module */ + swig_module.type_initial = swig_type_initial; + swig_module.cast_initial = swig_cast_initial; + swig_module.next = &swig_module; + init = 1; } else { - init = 0; - } + init = 0; + } - /* Try and load any already created modules */ - module_head = SWIG_GetModule(clientdata); + /* Try and load any already created modules */ + module_head = SWIG_GetModule(clientdata); if (!module_head) { - /* This is the first module loaded for this interpreter */ - /* so set the swig module into the interpreter */ - SWIG_SetModule(clientdata, &swig_module); - module_head = &swig_module; + /* This is the first module loaded for this interpreter */ + /* so set the swig module into the interpreter */ + SWIG_SetModule(clientdata, &swig_module); + module_head = &swig_module; } else { - /* the interpreter has loaded a SWIG module, but has it loaded this one? */ - found=0; - iter=module_head; + /* the interpreter has loaded a SWIG module, but has it loaded this one? */ + found=0; + iter=module_head; do { if (iter==&swig_module) { - found=1; - break; - } - iter=iter->next; - } while (iter!= module_head); + found=1; + break; + } + iter=iter->next; + } while (iter!= module_head); - /* if the is found in the list, then all is done and we may leave */ - if (found) return; - /* otherwise we must add out module into the list */ - swig_module.next = module_head->next; - module_head->next = &swig_module; - } + /* if the is found in the list, then all is done and we may leave */ + if (found) return; + /* otherwise we must add out module into the list */ + swig_module.next = module_head->next; + module_head->next = &swig_module; + } - /* When multiple interpeters are used, a module could have already been initialized in - a different interpreter, but not yet have a pointer in this interpreter. - In this case, we do not want to continue adding types... everything should be - set up already */ - if (init == 0) return; + /* When multiple interpeters are used, a module could have already been initialized in + a different interpreter, but not yet have a pointer in this interpreter. + In this case, we do not want to continue adding types... everything should be + set up already */ + if (init == 0) return; - /* Now work on filling in swig_module.types */ -#ifdef SWIGRUNTIME_DEBUG - printf("SWIG_InitializeModule: size %d\n", swig_module.size); -#endif + /* Now work on filling in swig_module.types */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: size %d\n", swig_module.size); +#endif for (i = 0; i < swig_module.size; ++i) { - swig_type_info *type = 0; - swig_type_info *ret; - swig_cast_info *cast; + swig_type_info *type = 0; + swig_type_info *ret; + swig_cast_info *cast; -#ifdef SWIGRUNTIME_DEBUG - printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); -#endif +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); +#endif - /* if there is another module already loaded */ + /* if there is another module already loaded */ if (swig_module.next != &swig_module) { - type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); - } + type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); + } if (type) { - /* Overwrite clientdata field */ -#ifdef SWIGRUNTIME_DEBUG - printf("SWIG_InitializeModule: found type %s\n", type->name); -#endif + /* Overwrite clientdata field */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found type %s\n", type->name); +#endif if (swig_module.type_initial[i]->clientdata) { - type->clientdata = swig_module.type_initial[i]->clientdata; -#ifdef SWIGRUNTIME_DEBUG - printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); -#endif - } + type->clientdata = swig_module.type_initial[i]->clientdata; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); +#endif + } } else { - type = swig_module.type_initial[i]; - } + type = swig_module.type_initial[i]; + } - /* Insert casting types */ - cast = swig_module.cast_initial[i]; + /* Insert casting types */ + cast = swig_module.cast_initial[i]; while (cast->type) { - /* Don't need to add information already in the list */ - ret = 0; -#ifdef SWIGRUNTIME_DEBUG - printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); -#endif + /* Don't need to add information already in the list */ + ret = 0; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); +#endif if (swig_module.next != &swig_module) { - ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); -#ifdef SWIGRUNTIME_DEBUG - if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); -#endif - } + ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); +#ifdef SWIGRUNTIME_DEBUG + if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); +#endif + } if (ret) { if (type == swig_module.type_initial[i]) { -#ifdef SWIGRUNTIME_DEBUG - printf("SWIG_InitializeModule: skip old type %s\n", ret->name); -#endif - cast->type = ret; - ret = 0; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: skip old type %s\n", ret->name); +#endif + cast->type = ret; + ret = 0; } else { - /* Check for casting already in the list */ - swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); -#ifdef SWIGRUNTIME_DEBUG - if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); -#endif - if (!ocast) ret = 0; - } - } + /* Check for casting already in the list */ + swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); +#ifdef SWIGRUNTIME_DEBUG + if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); +#endif + if (!ocast) ret = 0; + } + } if (!ret) { -#ifdef SWIGRUNTIME_DEBUG - printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); -#endif +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); +#endif if (type->cast) { - type->cast->prev = cast; - cast->next = type->cast; - } - type->cast = cast; - } - cast++; - } - /* Set entry in modules->types array equal to the type */ - swig_module.types[i] = type; - } - swig_module.types[i] = 0; + type->cast->prev = cast; + cast->next = type->cast; + } + type->cast = cast; + } + cast++; + } + /* Set entry in modules->types array equal to the type */ + swig_module.types[i] = type; + } + swig_module.types[i] = 0; -#ifdef SWIGRUNTIME_DEBUG - printf("**** SWIG_InitializeModule: Cast List ******\n"); +#ifdef SWIGRUNTIME_DEBUG + printf("**** SWIG_InitializeModule: Cast List ******\n"); for (i = 0; i < swig_module.size; ++i) { - int j = 0; - swig_cast_info *cast = swig_module.cast_initial[i]; - printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); + int j = 0; + swig_cast_info *cast = swig_module.cast_initial[i]; + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); while (cast->type) { - printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); - cast++; - ++j; - } - printf("---- Total casts: %d\n",j); - } - printf("**** SWIG_InitializeModule: Cast List ******\n"); -#endif -} + printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); + cast++; + ++j; + } + printf("---- Total casts: %d\n",j); + } + printf("**** SWIG_InitializeModule: Cast List ******\n"); +#endif +} -/* This function will propagate the clientdata field of type to -* any new swig_type_info structures that have been added into the list -* of equivalent types. It is like calling -* SWIG_TypeClientData(type, clientdata) a second time. -*/ -SWIGRUNTIME void +/* This function will propagate the clientdata field of type to +* any new swig_type_info structures that have been added into the list +* of equivalent types. It is like calling +* SWIG_TypeClientData(type, clientdata) a second time. +*/ +SWIGRUNTIME void SWIG_PropagateClientData(void) { - size_t i; - swig_cast_info *equiv; - static int init_run = 0; + size_t i; + swig_cast_info *equiv; + static int init_run = 0; - if (init_run) return; - init_run = 1; + if (init_run) return; + init_run = 1; for (i = 0; i < swig_module.size; i++) { if (swig_module.types[i]->clientdata) { - equiv = swig_module.types[i]->cast; + equiv = swig_module.types[i]->cast; while (equiv) { if (!equiv->converter) { - if (equiv->type && !equiv->type->clientdata) - SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); - } - equiv = equiv->next; - } - } - } -} + if (equiv->type && !equiv->type->clientdata) + SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); + } + equiv = equiv->next; + } + } + } +} -#ifdef __cplusplus -#if 0 +#ifdef __cplusplus +#if 0 { - /* c-mode */ -#endif -} -#endif + /* c-mode */ +#endif +} +#endif @@ -23764,9 +24206,11 @@ extern "C" { SWIGINTERN int swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { + char *tmp; PyObject *str = swig_varlink_str(v); fprintf(fp,"Swig global variables "); - fprintf(fp,"%s\n", SWIG_Python_str_AsChar(str)); + fprintf(fp,"%s\n", tmp = SWIG_Python_str_AsChar(str)); + SWIG_Python_str_DelForPy3(tmp); Py_DECREF(str); return 0; } @@ -23820,24 +24264,23 @@ extern "C" { swig_varlink_type(void) { static char varlink__doc__[] = "Swig var link object"; static PyTypeObject varlink_type; - static int type_init = 0; + static int type_init = 0; if (!type_init) { - const PyTypeObject tmp - = { + const PyTypeObject tmp = { /* PyObject header changed in Python 3 */ #if PY_VERSION_HEX >= 0x03000000 - PyVarObject_HEAD_INIT(&PyType_Type, 0) + PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) - 0, /* Number of items in variable part (ob_size) */ + 0, /* ob_size */ #endif - (char *)"swigvarlink", /* Type name (tp_name) */ - sizeof(swig_varlinkobject), /* Basic size (tp_basicsize) */ - 0, /* Itemsize (tp_itemsize) */ - (destructor) swig_varlink_dealloc, /* Deallocator (tp_dealloc) */ - (printfunc) swig_varlink_print, /* Print (tp_print) */ - (getattrfunc) swig_varlink_getattr, /* get attr (tp_getattr) */ - (setattrfunc) swig_varlink_setattr, /* Set attr (tp_setattr) */ + (char *)"swigvarlink", /* tp_name */ + sizeof(swig_varlinkobject), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor) swig_varlink_dealloc, /* tp_dealloc */ + (printfunc) swig_varlink_print, /* tp_print */ + (getattrfunc) swig_varlink_getattr, /* tp_getattr */ + (setattrfunc) swig_varlink_setattr, /* tp_setattr */ 0, /* tp_compare */ (reprfunc) swig_varlink_repr, /* tp_repr */ 0, /* tp_as_number */ @@ -23845,7 +24288,7 @@ extern "C" { 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ - (reprfunc)swig_varlink_str, /* tp_str */ + (reprfunc) swig_varlink_str, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ @@ -23861,16 +24304,21 @@ extern "C" { #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif +#if PY_VERSION_HEX >= 0x02060000 + 0, /* tp_version */ +#endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; varlink_type = tmp; - /* for Python 3 we already assigned the ob_type in PyVarObject_HEAD_INIT() */ -#if PY_VERSION_HEX < 0x03000000 - varlink_type.ob_type = &PyType_Type; -#endif type_init = 1; +#if PY_VERSION_HEX < 0x02020000 + varlink_type.ob_type = &PyType_Type; +#else + if (PyType_Ready(&varlink_type) < 0) + return NULL; +#endif } return &varlink_type; } @@ -23921,7 +24369,7 @@ extern "C" { for (i = 0; constants[i].type; ++i) { switch(constants[i].type) { case SWIG_PY_POINTER: - obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); + obj = SWIG_InternalNewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_PY_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); @@ -23961,15 +24409,15 @@ extern "C" { } } if (ci) { - size_t shift = (ci->ptype) - types; - swig_type_info *ty = types_initial[shift]; - size_t ldoc = (c - methods[i].ml_doc); - size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; - char *ndoc = (char*)malloc(ldoc + lptr + 10); - if (ndoc) { - char *buff = ndoc; - void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0; - if (ptr) { + void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0; + if (ptr) { + size_t shift = (ci->ptype) - types; + swig_type_info *ty = types_initial[shift]; + size_t ldoc = (c - methods[i].ml_doc); + size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; + char *ndoc = (char*)malloc(ldoc + lptr + 10); + if (ndoc) { + char *buff = ndoc; strncpy(buff, methods[i].ml_doc, ldoc); buff += ldoc; strncpy(buff, "swig_ptr: ", 10); @@ -24002,13 +24450,19 @@ PyObject* void #endif SWIG_init(void) { - PyObject *m, *d; - - /* Fix SwigMethods to carry the callback ptrs when needed */ - SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial); + PyObject *m, *d, *md; #if PY_VERSION_HEX >= 0x03000000 static struct PyModuleDef SWIG_module = { +# if PY_VERSION_HEX >= 0x03020000 PyModuleDef_HEAD_INIT, +# else + { + PyObject_HEAD_INIT(NULL) + NULL, /* m_init */ + 0, /* m_index */ + NULL, /* m_copy */ + }, +# endif (char *) SWIG_name, NULL, -1, @@ -24018,16 +24472,100 @@ SWIG_init(void) { NULL, NULL }; +#endif +#if defined(SWIGPYTHON_BUILTIN) + static SwigPyClientData SwigPyObject_clientdata = { + 0, 0, 0, 0, 0, 0, 0 + }; + static PyGetSetDef this_getset_def = { + (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL + }; + static SwigPyGetSet thisown_getset_closure = { + (PyCFunction) SwigPyObject_own, + (PyCFunction) SwigPyObject_own + }; + static PyGetSetDef thisown_getset_def = { + (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure + }; + PyObject *metatype_args; + PyTypeObject *builtin_pytype; + int builtin_base_count; + swig_type_info *builtin_basetype; + PyObject *tuple; + PyGetSetDescrObject *static_getset; + PyTypeObject *metatype; + SwigPyClientData *cd; + PyObject *public_interface, *public_symbol; + PyObject *this_descr; + PyObject *thisown_descr; + int i; + + (void)builtin_pytype; + (void)builtin_base_count; + (void)builtin_basetype; + (void)tuple; + (void)static_getset; + + /* metatype is used to implement static member variables. */ + metatype_args = Py_BuildValue("(s(O){})", "SwigPyObjectType", &PyType_Type); + assert(metatype_args); + metatype = (PyTypeObject *) PyType_Type.tp_call((PyObject *) &PyType_Type, metatype_args, NULL); + assert(metatype); + Py_DECREF(metatype_args); + metatype->tp_setattro = (setattrofunc) &SwigPyObjectType_setattro; + assert(PyType_Ready(metatype) >= 0); +#endif + + /* Fix SwigMethods to carry the callback ptrs when needed */ + SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial); + +#if PY_VERSION_HEX >= 0x03000000 m = PyModule_Create(&SWIG_module); #else m = Py_InitModule((char *) SWIG_name, SwigMethods); #endif - d = PyModule_GetDict(m); + md = d = PyModule_GetDict(m); SWIG_InitializeModule(0); - SWIG_InstallConstants(d,swig_const_table); +#ifdef SWIGPYTHON_BUILTIN + SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject"); + assert(SwigPyObject_stype); + cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; + if (!cd) { + SwigPyObject_stype->clientdata = &SwigPyObject_clientdata; + SwigPyObject_clientdata.pytype = SwigPyObject_TypeOnce(); + } else if (SwigPyObject_TypeOnce()->tp_basicsize != cd->pytype->tp_basicsize) { + PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules."); +# if PY_VERSION_HEX >= 0x03000000 + return NULL; +# else + return; +# endif + } + + /* All objects have a 'this' attribute */ + this_descr = PyDescr_NewGetSet(SwigPyObject_type(), &this_getset_def); + (void)this_descr; + + /* All objects have a 'thisown' attribute */ + thisown_descr = PyDescr_NewGetSet(SwigPyObject_type(), &thisown_getset_def); + (void)thisown_descr; + + public_interface = PyList_New(0); + public_symbol = 0; + (void)public_symbol; + + PyDict_SetItemString(md, "__all__", public_interface); + Py_DECREF(public_interface); + for (i = 0; SwigMethods[i].ml_name != NULL; ++i) + SwigPyBuiltin_AddPublicSymbol(public_interface, SwigMethods[i].ml_name); + for (i = 0; swig_const_table[i].name != 0; ++i) + SwigPyBuiltin_AddPublicSymbol(public_interface, swig_const_table[i].name); +#endif + + SWIG_InstallConstants(d,swig_const_table); SWIG_Python_SetConstant(d, "twrap_media_none",SWIG_From_int(static_cast< int >(twrap_media_none))); SWIG_Python_SetConstant(d, "twrap_media_audio",SWIG_From_int(static_cast< int >(twrap_media_audio))); @@ -24119,6 +24657,14 @@ SWIG_init(void) { SWIG_Python_SetConstant(d, "tsip_m_local_resume_nok",SWIG_From_int(static_cast< int >(tsip_m_local_resume_nok))); SWIG_Python_SetConstant(d, "tsip_m_remote_hold",SWIG_From_int(static_cast< int >(tsip_m_remote_hold))); SWIG_Python_SetConstant(d, "tsip_m_remote_resume",SWIG_From_int(static_cast< int >(tsip_m_remote_resume))); + SWIG_Python_SetConstant(d, "tmedia_qos_stype_none",SWIG_From_int(static_cast< int >(tmedia_qos_stype_none))); + SWIG_Python_SetConstant(d, "tmedia_qos_stype_segmented",SWIG_From_int(static_cast< int >(tmedia_qos_stype_segmented))); + SWIG_Python_SetConstant(d, "tmedia_qos_stype_e2e",SWIG_From_int(static_cast< int >(tmedia_qos_stype_e2e))); + SWIG_Python_SetConstant(d, "tmedia_qos_strength_none",SWIG_From_int(static_cast< int >(tmedia_qos_strength_none))); + SWIG_Python_SetConstant(d, "tmedia_qos_strength_failure",SWIG_From_int(static_cast< int >(tmedia_qos_strength_failure))); + SWIG_Python_SetConstant(d, "tmedia_qos_strength_unknown",SWIG_From_int(static_cast< int >(tmedia_qos_strength_unknown))); + SWIG_Python_SetConstant(d, "tmedia_qos_strength_optional",SWIG_From_int(static_cast< int >(tmedia_qos_strength_optional))); + SWIG_Python_SetConstant(d, "tmedia_qos_strength_mandatory",SWIG_From_int(static_cast< int >(tmedia_qos_strength_mandatory))); SWIG_Python_SetConstant(d, "tmedia_chroma_none",SWIG_From_int(static_cast< int >(tmedia_chroma_none))); SWIG_Python_SetConstant(d, "tmedia_chroma_rgb24",SWIG_From_int(static_cast< int >(tmedia_chroma_rgb24))); SWIG_Python_SetConstant(d, "tmedia_chroma_bgr24",SWIG_From_int(static_cast< int >(tmedia_chroma_bgr24))); @@ -24133,18 +24679,24 @@ SWIG_init(void) { SWIG_Python_SetConstant(d, "tmedia_srtp_mode_none",SWIG_From_int(static_cast< int >(tmedia_srtp_mode_none))); SWIG_Python_SetConstant(d, "tmedia_srtp_mode_optional",SWIG_From_int(static_cast< int >(tmedia_srtp_mode_optional))); SWIG_Python_SetConstant(d, "tmedia_srtp_mode_mandatory",SWIG_From_int(static_cast< int >(tmedia_srtp_mode_mandatory))); - SWIG_Python_SetConstant(d, "tmedia_qos_stype_none",SWIG_From_int(static_cast< int >(tmedia_qos_stype_none))); - SWIG_Python_SetConstant(d, "tmedia_qos_stype_segmented",SWIG_From_int(static_cast< int >(tmedia_qos_stype_segmented))); - SWIG_Python_SetConstant(d, "tmedia_qos_stype_e2e",SWIG_From_int(static_cast< int >(tmedia_qos_stype_e2e))); - SWIG_Python_SetConstant(d, "tmedia_qos_strength_none",SWIG_From_int(static_cast< int >(tmedia_qos_strength_none))); - SWIG_Python_SetConstant(d, "tmedia_qos_strength_failure",SWIG_From_int(static_cast< int >(tmedia_qos_strength_failure))); - SWIG_Python_SetConstant(d, "tmedia_qos_strength_unknown",SWIG_From_int(static_cast< int >(tmedia_qos_strength_unknown))); - SWIG_Python_SetConstant(d, "tmedia_qos_strength_optional",SWIG_From_int(static_cast< int >(tmedia_qos_strength_optional))); - SWIG_Python_SetConstant(d, "tmedia_qos_strength_mandatory",SWIG_From_int(static_cast< int >(tmedia_qos_strength_mandatory))); + SWIG_Python_SetConstant(d, "tmedia_profile_default",SWIG_From_int(static_cast< int >(tmedia_profile_default))); + SWIG_Python_SetConstant(d, "tmedia_profile_rtcweb",SWIG_From_int(static_cast< int >(tmedia_profile_rtcweb))); SWIG_Python_SetConstant(d, "tmedia_bl_low",SWIG_From_int(static_cast< int >(tmedia_bl_low))); SWIG_Python_SetConstant(d, "tmedia_bl_medium",SWIG_From_int(static_cast< int >(tmedia_bl_medium))); SWIG_Python_SetConstant(d, "tmedia_bl_hight",SWIG_From_int(static_cast< int >(tmedia_bl_hight))); SWIG_Python_SetConstant(d, "tmedia_bl_unrestricted",SWIG_From_int(static_cast< int >(tmedia_bl_unrestricted))); + SWIG_Python_SetConstant(d, "tmedia_pref_video_size_sqcif",SWIG_From_int(static_cast< int >(tmedia_pref_video_size_sqcif))); + SWIG_Python_SetConstant(d, "tmedia_pref_video_size_qcif",SWIG_From_int(static_cast< int >(tmedia_pref_video_size_qcif))); + SWIG_Python_SetConstant(d, "tmedia_pref_video_size_qvga",SWIG_From_int(static_cast< int >(tmedia_pref_video_size_qvga))); + SWIG_Python_SetConstant(d, "tmedia_pref_video_size_cif",SWIG_From_int(static_cast< int >(tmedia_pref_video_size_cif))); + SWIG_Python_SetConstant(d, "tmedia_pref_video_size_hvga",SWIG_From_int(static_cast< int >(tmedia_pref_video_size_hvga))); + SWIG_Python_SetConstant(d, "tmedia_pref_video_size_vga",SWIG_From_int(static_cast< int >(tmedia_pref_video_size_vga))); + SWIG_Python_SetConstant(d, "tmedia_pref_video_size_4cif",SWIG_From_int(static_cast< int >(tmedia_pref_video_size_4cif))); + SWIG_Python_SetConstant(d, "tmedia_pref_video_size_svga",SWIG_From_int(static_cast< int >(tmedia_pref_video_size_svga))); + SWIG_Python_SetConstant(d, "tmedia_pref_video_size_480p",SWIG_From_int(static_cast< int >(tmedia_pref_video_size_480p))); + SWIG_Python_SetConstant(d, "tmedia_pref_video_size_720p",SWIG_From_int(static_cast< int >(tmedia_pref_video_size_720p))); + SWIG_Python_SetConstant(d, "tmedia_pref_video_size_16cif",SWIG_From_int(static_cast< int >(tmedia_pref_video_size_16cif))); + SWIG_Python_SetConstant(d, "tmedia_pref_video_size_1080p",SWIG_From_int(static_cast< int >(tmedia_pref_video_size_1080p))); SWIG_Python_SetConstant(d, "tdav_codec_id_none",SWIG_From_int(static_cast< int >(tdav_codec_id_none))); SWIG_Python_SetConstant(d, "tdav_codec_id_amr_nb_oa",SWIG_From_int(static_cast< int >(tdav_codec_id_amr_nb_oa))); SWIG_Python_SetConstant(d, "tdav_codec_id_amr_nb_be",SWIG_From_int(static_cast< int >(tdav_codec_id_amr_nb_be))); @@ -24166,6 +24718,9 @@ SWIG_init(void) { SWIG_Python_SetConstant(d, "tdav_codec_id_h263",SWIG_From_int(static_cast< int >(tdav_codec_id_h263))); SWIG_Python_SetConstant(d, "tdav_codec_id_h263p",SWIG_From_int(static_cast< int >(tdav_codec_id_h263p))); SWIG_Python_SetConstant(d, "tdav_codec_id_h263pp",SWIG_From_int(static_cast< int >(tdav_codec_id_h263pp))); + SWIG_Python_SetConstant(d, "tdav_codec_id_h264_bp",SWIG_From_int(static_cast< int >(tdav_codec_id_h264_bp))); + SWIG_Python_SetConstant(d, "tdav_codec_id_h264_mp",SWIG_From_int(static_cast< int >(tdav_codec_id_h264_mp))); + SWIG_Python_SetConstant(d, "tdav_codec_id_h264_hp",SWIG_From_int(static_cast< int >(tdav_codec_id_h264_hp))); SWIG_Python_SetConstant(d, "tdav_codec_id_h264_bp10",SWIG_From_int(static_cast< int >(tdav_codec_id_h264_bp10))); SWIG_Python_SetConstant(d, "tdav_codec_id_h264_bp20",SWIG_From_int(static_cast< int >(tdav_codec_id_h264_bp20))); SWIG_Python_SetConstant(d, "tdav_codec_id_h264_bp30",SWIG_From_int(static_cast< int >(tdav_codec_id_h264_bp30))); diff --git a/branches/2.0/doubango/bindings/python/tinyWRAP_wrap.h b/branches/2.0/doubango/bindings/python/tinyWRAP_wrap.h index c976ea15..cac679ff 100644 --- a/branches/2.0/doubango/bindings/python/tinyWRAP_wrap.h +++ b/branches/2.0/doubango/bindings/python/tinyWRAP_wrap.h @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). - * Version 1.3.39 + * Version 2.0.4 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make @@ -28,16 +28,16 @@ public: /* Internal Director utilities */ public: - bool swig_get_inner(const char* name) const { - std::map::const_iterator iv = inner.find(name); - return (iv != inner.end() ? iv->second : false); + bool swig_get_inner(const char* swig_protected_method_name) const { + std::map::const_iterator iv = swig_inner.find(swig_protected_method_name); + return (iv != swig_inner.end() ? iv->second : false); } - void swig_set_inner(const char* name, bool val) const - { inner[name] = val;} + void swig_set_inner(const char* swig_protected_method_name, bool val) const + { swig_inner[swig_protected_method_name] = val;} private: - mutable std::map inner; + mutable std::map swig_inner; #if defined(SWIG_PYTHON_DIRECTOR_VTABLE) @@ -47,7 +47,7 @@ private: if (!method) { swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name); method = PyObject_GetAttr(swig_get_self(), name); - if (method == NULL) { + if (!method) { std::string msg = "Method in class DDebugCallback doesn't exist, undefined "; msg += method_name; Swig::DirectorMethodException::raise(msg.c_str()); @@ -74,16 +74,16 @@ public: /* Internal Director utilities */ public: - bool swig_get_inner(const char* name) const { - std::map::const_iterator iv = inner.find(name); - return (iv != inner.end() ? iv->second : false); + bool swig_get_inner(const char* swig_protected_method_name) const { + std::map::const_iterator iv = swig_inner.find(swig_protected_method_name); + return (iv != swig_inner.end() ? iv->second : false); } - void swig_set_inner(const char* name, bool val) const - { inner[name] = val;} + void swig_set_inner(const char* swig_protected_method_name, bool val) const + { swig_inner[swig_protected_method_name] = val;} private: - mutable std::map inner; + mutable std::map swig_inner; #if defined(SWIG_PYTHON_DIRECTOR_VTABLE) @@ -93,7 +93,7 @@ private: if (!method) { swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name); method = PyObject_GetAttr(swig_get_self(), name); - if (method == NULL) { + if (!method) { std::string msg = "Method in class ProxyPluginMgrCallback doesn't exist, undefined "; msg += method_name; Swig::DirectorMethodException::raise(msg.c_str()); @@ -122,16 +122,16 @@ public: /* Internal Director utilities */ public: - bool swig_get_inner(const char* name) const { - std::map::const_iterator iv = inner.find(name); - return (iv != inner.end() ? iv->second : false); + bool swig_get_inner(const char* swig_protected_method_name) const { + std::map::const_iterator iv = swig_inner.find(swig_protected_method_name); + return (iv != swig_inner.end() ? iv->second : false); } - void swig_set_inner(const char* name, bool val) const - { inner[name] = val;} + void swig_set_inner(const char* swig_protected_method_name, bool val) const + { swig_inner[swig_protected_method_name] = val;} private: - mutable std::map inner; + mutable std::map swig_inner; #if defined(SWIG_PYTHON_DIRECTOR_VTABLE) @@ -141,7 +141,7 @@ private: if (!method) { swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name); method = PyObject_GetAttr(swig_get_self(), name); - if (method == NULL) { + if (!method) { std::string msg = "Method in class ProxyAudioConsumerCallback doesn't exist, undefined "; msg += method_name; Swig::DirectorMethodException::raise(msg.c_str()); @@ -172,16 +172,16 @@ public: /* Internal Director utilities */ public: - bool swig_get_inner(const char* name) const { - std::map::const_iterator iv = inner.find(name); - return (iv != inner.end() ? iv->second : false); + bool swig_get_inner(const char* swig_protected_method_name) const { + std::map::const_iterator iv = swig_inner.find(swig_protected_method_name); + return (iv != swig_inner.end() ? iv->second : false); } - void swig_set_inner(const char* name, bool val) const - { inner[name] = val;} + void swig_set_inner(const char* swig_protected_method_name, bool val) const + { swig_inner[swig_protected_method_name] = val;} private: - mutable std::map inner; + mutable std::map swig_inner; #if defined(SWIG_PYTHON_DIRECTOR_VTABLE) @@ -191,7 +191,7 @@ private: if (!method) { swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name); method = PyObject_GetAttr(swig_get_self(), name); - if (method == NULL) { + if (!method) { std::string msg = "Method in class ProxyVideoConsumerCallback doesn't exist, undefined "; msg += method_name; Swig::DirectorMethodException::raise(msg.c_str()); @@ -220,16 +220,16 @@ public: /* Internal Director utilities */ public: - bool swig_get_inner(const char* name) const { - std::map::const_iterator iv = inner.find(name); - return (iv != inner.end() ? iv->second : false); + bool swig_get_inner(const char* swig_protected_method_name) const { + std::map::const_iterator iv = swig_inner.find(swig_protected_method_name); + return (iv != swig_inner.end() ? iv->second : false); } - void swig_set_inner(const char* name, bool val) const - { inner[name] = val;} + void swig_set_inner(const char* swig_protected_method_name, bool val) const + { swig_inner[swig_protected_method_name] = val;} private: - mutable std::map inner; + mutable std::map swig_inner; #if defined(SWIG_PYTHON_DIRECTOR_VTABLE) @@ -239,7 +239,7 @@ private: if (!method) { swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name); method = PyObject_GetAttr(swig_get_self(), name); - if (method == NULL) { + if (!method) { std::string msg = "Method in class ProxyAudioProducerCallback doesn't exist, undefined "; msg += method_name; Swig::DirectorMethodException::raise(msg.c_str()); @@ -268,16 +268,16 @@ public: /* Internal Director utilities */ public: - bool swig_get_inner(const char* name) const { - std::map::const_iterator iv = inner.find(name); - return (iv != inner.end() ? iv->second : false); + bool swig_get_inner(const char* swig_protected_method_name) const { + std::map::const_iterator iv = swig_inner.find(swig_protected_method_name); + return (iv != swig_inner.end() ? iv->second : false); } - void swig_set_inner(const char* name, bool val) const - { inner[name] = val;} + void swig_set_inner(const char* swig_protected_method_name, bool val) const + { swig_inner[swig_protected_method_name] = val;} private: - mutable std::map inner; + mutable std::map swig_inner; #if defined(SWIG_PYTHON_DIRECTOR_VTABLE) @@ -287,7 +287,7 @@ private: if (!method) { swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name); method = PyObject_GetAttr(swig_get_self(), name); - if (method == NULL) { + if (!method) { std::string msg = "Method in class ProxyVideoProducerCallback doesn't exist, undefined "; msg += method_name; Swig::DirectorMethodException::raise(msg.c_str()); @@ -321,16 +321,16 @@ public: /* Internal Director utilities */ public: - bool swig_get_inner(const char* name) const { - std::map::const_iterator iv = inner.find(name); - return (iv != inner.end() ? iv->second : false); + bool swig_get_inner(const char* swig_protected_method_name) const { + std::map::const_iterator iv = swig_inner.find(swig_protected_method_name); + return (iv != swig_inner.end() ? iv->second : false); } - void swig_set_inner(const char* name, bool val) const - { inner[name] = val;} + void swig_set_inner(const char* swig_protected_method_name, bool val) const + { swig_inner[swig_protected_method_name] = val;} private: - mutable std::map inner; + mutable std::map swig_inner; #if defined(SWIG_PYTHON_DIRECTOR_VTABLE) @@ -340,7 +340,7 @@ private: if (!method) { swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name); method = PyObject_GetAttr(swig_get_self(), name); - if (method == NULL) { + if (!method) { std::string msg = "Method in class SipCallback doesn't exist, undefined "; msg += method_name; Swig::DirectorMethodException::raise(msg.c_str()); @@ -366,16 +366,16 @@ public: /* Internal Director utilities */ public: - bool swig_get_inner(const char* name) const { - std::map::const_iterator iv = inner.find(name); - return (iv != inner.end() ? iv->second : false); + bool swig_get_inner(const char* swig_protected_method_name) const { + std::map::const_iterator iv = swig_inner.find(swig_protected_method_name); + return (iv != swig_inner.end() ? iv->second : false); } - void swig_set_inner(const char* name, bool val) const - { inner[name] = val;} + void swig_set_inner(const char* swig_protected_method_name, bool val) const + { swig_inner[swig_protected_method_name] = val;} private: - mutable std::map inner; + mutable std::map swig_inner; #if defined(SWIG_PYTHON_DIRECTOR_VTABLE) @@ -385,7 +385,7 @@ private: if (!method) { swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name); method = PyObject_GetAttr(swig_get_self(), name); - if (method == NULL) { + if (!method) { std::string msg = "Method in class XcapCallback doesn't exist, undefined "; msg += method_name; Swig::DirectorMethodException::raise(msg.c_str()); @@ -411,16 +411,16 @@ public: /* Internal Director utilities */ public: - bool swig_get_inner(const char* name) const { - std::map::const_iterator iv = inner.find(name); - return (iv != inner.end() ? iv->second : false); + bool swig_get_inner(const char* swig_protected_method_name) const { + std::map::const_iterator iv = swig_inner.find(swig_protected_method_name); + return (iv != swig_inner.end() ? iv->second : false); } - void swig_set_inner(const char* name, bool val) const - { inner[name] = val;} + void swig_set_inner(const char* swig_protected_method_name, bool val) const + { swig_inner[swig_protected_method_name] = val;} private: - mutable std::map inner; + mutable std::map swig_inner; #if defined(SWIG_PYTHON_DIRECTOR_VTABLE) @@ -430,7 +430,7 @@ private: if (!method) { swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name); method = PyObject_GetAttr(swig_get_self(), name); - if (method == NULL) { + if (!method) { std::string msg = "Method in class MsrpCallback doesn't exist, undefined "; msg += method_name; Swig::DirectorMethodException::raise(msg.c_str()); diff --git a/branches/2.0/doubango/documentation/Doubango_Layers.png b/branches/2.0/doubango/documentation/Doubango_Layers.png new file mode 100644 index 0000000000000000000000000000000000000000..7d972d196fbdfc3553da283106e73588e9aa85fa GIT binary patch literal 83207 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 literal 0 HcmV?d00001 diff --git a/branches/2.0/doubango/thirdparties/android/include/vpx/vp8.h b/branches/2.0/doubango/thirdparties/android/include/vpx/vp8.h index 27eefa30..b9824afc 100644 --- a/branches/2.0/doubango/thirdparties/android/include/vpx/vp8.h +++ b/branches/2.0/doubango/thirdparties/android/include/vpx/vp8.h @@ -30,7 +30,7 @@ */ #ifndef VP8_H #define VP8_H -#include "vpx_codec_impl_top.h" +#include "vpx/vpx_codec_impl_top.h" /*!\brief Control functions * @@ -126,5 +126,5 @@ VPX_CTRL_USE_TYPE(VP8_SET_DBG_DISPLAY_MV, int) DECLSPEC_DEPRECATED extern vpx_codec_iface_t vpx_codec_vp8_algo DEPRECATED; #endif -#include "vpx_codec_impl_bottom.h" +#include "vpx/vpx_codec_impl_bottom.h" #endif diff --git a/branches/2.0/doubango/thirdparties/android/include/vpx/vp8cx.h b/branches/2.0/doubango/thirdparties/android/include/vpx/vp8cx.h index 482409e1..0fc5ab3c 100644 --- a/branches/2.0/doubango/thirdparties/android/include/vpx/vp8cx.h +++ b/branches/2.0/doubango/thirdparties/android/include/vpx/vp8cx.h @@ -22,7 +22,7 @@ */ #ifndef VP8CX_H #define VP8CX_H -#include "vpx_codec_impl_top.h" +#include "vpx/vpx_codec_impl_top.h" /*!\name Algorithm interface for VP8 * @@ -138,7 +138,7 @@ enum vp8e_enc_control_id * onyx_if.c:vp8_set_speed_features(). * \todo List highlights of the changes at various levels. * - * \note Valid range: -16..16 + * \note Valid range: -16..16 or {-16..-4, 4..16} w/CONFIG_REALTIME_ONLY */ VP8E_SET_CPUUSED = 13, VP8E_SET_ENABLEAUTOALTREF, /**< control function to enable vp8 to automatic set and use altref frame */ @@ -164,20 +164,6 @@ enum vp8e_enc_control_id * \note Valid range: 0..63 */ VP8E_SET_CQ_LEVEL, - - /*!\brief Max data rate for Intra frames - * - * This value controls additional clamping on the maximum size of a - * keyframe. It is expressed as a percentage of the average - * per-frame bitrate, with the special (and default) value 0 meaning - * unlimited, or no additional clamping beyond the codec's built-in - * algorithm. - * - * For example, to allocate no more than 4.5 frames worth of bitrate - * to a keyframe, set this to 450. - * - */ - VP8E_SET_MAX_INTRA_BITRATE_PCT, }; /*!\brief vpx 1-D scaling mode @@ -309,9 +295,6 @@ VPX_CTRL_USE_TYPE(VP8E_SET_CQ_LEVEL , unsigned int) VPX_CTRL_USE_TYPE(VP8E_GET_LAST_QUANTIZER, int *) VPX_CTRL_USE_TYPE(VP8E_GET_LAST_QUANTIZER_64, int *) -VPX_CTRL_USE_TYPE(VP8E_SET_MAX_INTRA_BITRATE_PCT, unsigned int) - - /*! @} - end defgroup vp8_encoder */ -#include "vpx_codec_impl_bottom.h" +#include "vpx/vpx_codec_impl_bottom.h" #endif diff --git a/branches/2.0/doubango/thirdparties/android/include/vpx/vp8dx.h b/branches/2.0/doubango/thirdparties/android/include/vpx/vp8dx.h index 47760695..dd2250a5 100644 --- a/branches/2.0/doubango/thirdparties/android/include/vpx/vp8dx.h +++ b/branches/2.0/doubango/thirdparties/android/include/vpx/vp8dx.h @@ -22,7 +22,7 @@ */ #ifndef VP8DX_H #define VP8DX_H -#include "vpx_codec_impl_top.h" +#include "vpx/vpx_codec_impl_top.h" /*!\name Algorithm interface for VP8 * @@ -74,5 +74,5 @@ VPX_CTRL_USE_TYPE(VP8D_GET_FRAME_CORRUPTED, int *) /*! @} - end defgroup vp8_decoder */ -#include "vpx_codec_impl_bottom.h" +#include "vpx/vpx_codec_impl_bottom.h" #endif diff --git a/branches/2.0/doubango/thirdparties/android/include/vpx/vp8e.h b/branches/2.0/doubango/thirdparties/android/include/vpx/vp8e.h index 4273a682..d8121998 100644 --- a/branches/2.0/doubango/thirdparties/android/include/vpx/vp8e.h +++ b/branches/2.0/doubango/thirdparties/android/include/vpx/vp8e.h @@ -14,7 +14,7 @@ */ #ifndef VP8E_H #define VP8E_H -#include "vpx_codec_impl_top.h" +#include "vpx/vpx_codec_impl_top.h" #if defined(VPX_CODEC_DISABLE_COMPAT) && VPX_CODEC_DISABLE_COMPAT #error "Backwards compatibility disabled: don't include vp8e.h" @@ -59,5 +59,5 @@ VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_SET_FRAMETYPE, int) * #VPX_DL_BEST_QUALITY constants to that parameter instead. */ VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_SET_ENCODING_MODE, vp8e_encoding_mode) -#include "vpx_codec_impl_bottom.h" +#include "vpx/vpx_codec_impl_bottom.h" #endif diff --git a/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_codec.h b/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_codec.h index a9e2e761..edee5cee 100644 --- a/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_codec.h +++ b/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_codec.h @@ -498,7 +498,7 @@ extern "C" { * Iterates over a list of the segments to allocate. The iterator storage * should be initialized to NULL to start the iteration. Iteration is complete * when this function returns VPX_CODEC_LIST_END. The amount of memory needed to - * allocate is dependent upon the size of the encoded stream. In cases where the + * allocate is dependant upon the size of the encoded stream. In cases where the * stream is not available at allocation time, a fixed size must be requested. * The codec will not be able to operate on streams larger than the size used at * allocation time. diff --git a/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_decoder.h b/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_decoder.h index 18bac4e0..33d4ecb9 100644 --- a/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_decoder.h +++ b/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_decoder.h @@ -53,10 +53,6 @@ extern "C" { #define VPX_CODEC_CAP_PUT_SLICE 0x10000 /**< Will issue put_slice callbacks */ #define VPX_CODEC_CAP_PUT_FRAME 0x20000 /**< Will issue put_frame callbacks */ #define VPX_CODEC_CAP_POSTPROC 0x40000 /**< Can postprocess decoded frame */ -#define VPX_CODEC_CAP_ERROR_CONCEALMENT 0x80000 /**< Can conceal errors due to - packet loss */ -#define VPX_CODEC_CAP_INPUT_PARTITION 0x100000 /**< Can receive encoded frames - one partition at a time */ /*! \brief Initialization-time Feature Enabling * @@ -66,11 +62,6 @@ extern "C" { * The available flags are specified by VPX_CODEC_USE_* defines. */ #define VPX_CODEC_USE_POSTPROC 0x10000 /**< Postprocess decoded frame */ -#define VPX_CODEC_USE_ERROR_CONCEALMENT 0x20000 /**< Conceal errors in decoded - frames */ -#define VPX_CODEC_USE_INPUT_PARTITION 0x40000 /**< The input frame should be - passed to the decoder one - partition at a time */ /*!\brief Stream properties * @@ -189,11 +180,6 @@ extern "C" { * generated, as appropriate. Encoded data \ref MUST be passed in DTS (decode * time stamp) order. Frames produced will always be in PTS (presentation * time stamp) order. - * If the decoder is configured with VPX_CODEC_USE_INPUT_PARTITION enabled, - * data and data_sz must contain at most one encoded partition. When no more - * data is available, this function should be called with NULL as data and 0 - * as data_sz. The memory passed to this function must be available until - * the frame has been decoded. * * \param[in] ctx Pointer to this instance's context * \param[in] data Pointer to this block of new coded data. If diff --git a/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_decoder_compat.h b/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_decoder_compat.h index f5c501ac..8ec154ff 100644 --- a/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_decoder_compat.h +++ b/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_decoder_compat.h @@ -527,7 +527,7 @@ extern "C" { * Iterates over a list of the segments to allocate. The iterator storage * should be initialized to NULL to start the iteration. Iteration is complete * when this function returns VPX_DEC_LIST_END. The amount of memory needed to - * allocate is dependent upon the size of the encoded stream. This means that + * allocate is dependant upon the size of the encoded stream. This means that * the stream info structure must be known at allocation time. It can be * populated with the vpx_dec_peek_stream_info() function. In cases where the * stream to be decoded is not available at allocation time, a fixed size must diff --git a/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_encoder.h b/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_encoder.h index 90f271f8..5762b76b 100644 --- a/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_encoder.h +++ b/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_encoder.h @@ -55,13 +55,6 @@ extern "C" { */ #define VPX_CODEC_CAP_PSNR 0x10000 /**< Can issue PSNR packets */ - /*! Can output one partition at a time. Each partition is returned in its - * own VPX_CODEC_CX_FRAME_PKT, with the FRAME_IS_FRAGMENT flag set for - * every partition but the last. In this mode all frames are always - * returned partition by partition. - */ -#define VPX_CODEC_CAP_OUTPUT_PARTITION 0x20000 - /*! \brief Initialization-time Feature Enabling * @@ -71,8 +64,6 @@ extern "C" { * The available flags are specified by VPX_CODEC_USE_* defines. */ #define VPX_CODEC_USE_PSNR 0x10000 /**< Calculate PSNR on each frame */ -#define VPX_CODEC_USE_OUTPUT_PARTITION 0x20000 /**< Make the encoder output one - partition at a time. */ /*!\brief Generic fixed size buffer structure @@ -108,26 +99,7 @@ extern "C" { this one) */ #define VPX_FRAME_IS_INVISIBLE 0x4 /**< frame should be decoded but will not be shown */ -#define VPX_FRAME_IS_FRAGMENT 0x8 /**< this is a fragment of the encoded - frame */ - /*!\brief Error Resilient flags - * - * These flags define which error resilient features to enable in the - * encoder. The flags are specified through the - * vpx_codec_enc_cfg::g_error_resilient variable. - */ - typedef uint32_t vpx_codec_er_flags_t; -#define VPX_ERROR_RESILIENT_DEFAULT 0x1 /**< Improve resiliency against - losses of whole frames */ -#define VPX_ERROR_RESILIENT_PARTITIONS 0x2 /**< The frame partitions are - independently decodable by the - bool decoder, meaning that - partitions can be decoded even - though earlier partitions have - been lost. Note that intra - predicition is still done over - the partition boundary. */ /*!\brief Encoder output packet variants * @@ -163,13 +135,6 @@ extern "C" { unsigned long duration; /**< duration to show frame (in timebase units) */ vpx_codec_frame_flags_t flags; /**< flags for this frame */ - int partition_id; /**< the partition id - defines the decoding order - of the partitions. Only - applicable when "output partition" - mode is enabled. First partition - has id 0.*/ - } frame; /**< data for compressed frame packet */ struct vpx_fixed_buf twopass_stats; /**< data for two-pass packet */ struct vpx_psnr_pkt @@ -324,13 +289,13 @@ extern "C" { struct vpx_rational g_timebase; - /*!\brief Enable error resilient modes. + /*!\brief Enable error resilient mode. * - * The error resilient bitfield indicates to the encoder which features - * it should enable to take measures for streaming over lossy or noisy - * links. + * Error resilient mode indicates to the encoder that it should take + * measures appropriate for streaming over lossy or noisy links, if + * possible. Set to 1 to enable this feature, 0 to disable it. */ - vpx_codec_er_flags_t g_error_resilient; + unsigned int g_error_resilient; /*!\brief Multi-pass Encoding Mode @@ -465,28 +430,20 @@ extern "C" { */ - /*!\brief Rate control adaptation undershoot control + /*!\brief Rate control undershoot tolerance * - * This value, expressed as a percentage of the target bitrate, - * controls the maximum allowed adaptation speed of the codec. - * This factor controls the maximum amount of bits that can - * be subtracted from the target bitrate in order to compensate - * for prior overshoot. - * - * Valid values in the range 0-1000. + * This value, expressed as a percentage of the target bitrate, describes + * the target bitrate for easier frames, allowing bits to be saved for + * harder frames. Set to zero to use the codec default. */ unsigned int rc_undershoot_pct; - /*!\brief Rate control adaptation overshoot control + /*!\brief Rate control overshoot tolerance * - * This value, expressed as a percentage of the target bitrate, - * controls the maximum allowed adaptation speed of the codec. - * This factor controls the maximum amount of bits that can - * be added to the target bitrate in order to compensate for - * prior undershoot. - * - * Valid values in the range 0-1000. + * This value, expressed as a percentage of the target bitrate, describes + * the maximum allowed bitrate for a given frame. Set to zero to use the + * codec default. */ unsigned int rc_overshoot_pct; diff --git a/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_integer.h b/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_integer.h index a760fa6f..71df0453 100644 --- a/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_integer.h +++ b/branches/2.0/doubango/thirdparties/android/include/vpx/vpx_integer.h @@ -15,7 +15,7 @@ /* get ptrdiff_t, size_t, wchar_t, NULL */ #include -#if (defined(_MSC_VER) && (_MSC_VER < 1600)) || defined(VPX_EMULATE_INTTYPES) +#if defined(_MSC_VER) || defined(VPX_EMULATE_INTTYPES) typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; @@ -24,9 +24,10 @@ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; -#if (defined(_MSC_VER) && (_MSC_VER < 1600)) +#if defined(_MSC_VER) typedef signed __int64 int64_t; typedef unsigned __int64 uint64_t; +#define PRId64 "I64d" #endif #ifdef HAVE_ARMV6 @@ -49,14 +50,8 @@ typedef unsigned int uintptr_t; #define __STDC_FORMAT_MACROS #endif #include - -#endif - -/* VS2010 defines stdint.h, but not inttypes.h */ -#if defined(_MSC_VER) -#define PRId64 "I64d" -#else #include + #endif #endif diff --git a/branches/2.0/doubango/thirdparties/android/lib/libvpx_armv5te.a b/branches/2.0/doubango/thirdparties/android/lib/libvpx_armv5te.a index 6b29573f8aca5fb32f05d1de55dc7f208eb152e0..5cd5bf76710a80e05291df5c6942623b21c8d641 100644 GIT binary patch literal 387086 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 z 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 z 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≶uQ4Nu>3A#~yUAA!GZA&+PR9S!I~GNX8* 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 E3u1U`#Q*>R literal 431044 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

Xt)B%AXO;R|borNV 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%0DJf|X48oUBNkaq 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

F5djXF zfAk}A++}8!@|;GV?Wi~T^_CT(!p$qLDeR>V8QGUV?Ei{&>ax|=p?W{|XP&f9^7$=DLMb|wV zfxgrNJtzzMeRRQsv3;=<#nH@(B4tfWbpIDlf^GrdPAel657l5!@9^X3xjqs(%D^{S0t5`1ZN-`~+#tbB)gPZG=w(HXGqQxCy%9`oIaqHLZN8_!-1g zXF>VJM^HYjYDnKC(_dRb-Q<8pU52vh2w-{EI*Yv5`@|Kb)g#22TbE}&IF}yxD;Yxh z#WEpd3r)yNeMQbGn5*jmhy4y&AI>k_ZwSUAKQhpJFb^C7PRbUaxJr)a0P>PQX`|Wz zyr}yb@*DMB?tcWc_gXW-Ka`7&h(B`ZLMt-1zxdIH2Dwh44ik?c4Y2C~!+M7zJFHEJ zI|7)EIv?i%tgFtfN&`3Q&3S2YW`7aOs(8*Q%tyQ? zZxFbd|0l1%{xIvn?}RZ=pNXNJtn1qB{^Fi7^hX*zk;R;p1Pya&C-#X#;$Fzt{V(y{ zJ#{;-E9%nwi}fh8CJJ2@aI7o#SjMpjGbaW-Yk`BZa|YTN52G%T9r@M>@*)rGw;_sj z<^v3QVjaSyJ#{Ord5R5V_gTxqCwq{-5owIygZPseH=lvdTaEA9Q2rS5PWO*L~9A!5Co#Fl%Y0#8G{W6&M(>wAlqo@zs$UfYYM*b}LFLt8HF&0Fds9%yE z)MF?IxnDFBI!Z7J-4}Ewo!FP`hs!~mde8>6x95;C#It;?8|tlP(Eq_3{z$gaihR`H zeQD}*N3j+=EOq${z(X9btj}YBH{+Ht9Pa{pAL+_5e;&#?0+;}B5N}B1B`k3poSa|l zutuPcaRl`VU_JVWs1N&vybN2<9MY~9?emFs`C2`vavX83@OPLKf{}YMzQHTRi?XO2 z9I36f=H)Pc0s*TrgE4~fw00D_3ur|hCI(pQ`lNYt60&RbL~&6D<%nCy!7uYME|%6r zP$uZx6jn5x37RTh@aFNLnxE#7w&X?5A>j5~@_@5CMilVJ3FADuxfWAS{n*8nT zvp)u0qpe?~FVROI|1a$EdE$;Ej^nfi<+Hu4TOg8M$~{-=mVWf_4A6t^e-JpSt5Kd} z&7401c+&o`mYa=Ye{l@>PC|z_JpT~FKGc_T3_LNu4{3h(RnA>sxvs#txf%T$Nn(y3 zg?^h>{p8PJtfL;asE6s78K~b(^o89o=p*V{*PxD1z~~V}pc!rtKIqs4C#pOz{8*(K z8-XuIejY7uLEA82jkDf8Y_C|Ir(XPEAR=|UbPoL=zrQ$yG$~WjHuC9FozDB8>hN6) zCX24hTMe*cV@$4?%v-L>d0<+C0BmF?dI>m~WB4M^`BN zNF5UR36FjAXBu-yil6>%jF0gC;%5%*kv5wKe8)pwX&z`&8{cU)f?nb1{l&kHBhJFN zK4>H9#Jj8N;=ekbo`fz%U6E%Spu2twbI-%(E+ojdGraS`H+oH8WI?a7l%yBqm>kgMUNCDuENK8beG+S_C$Sa)-5&OjuFcN_ ztieBe`Fv~i3J1+lhJgp&pljosD$pqc8j(Jc9KN|qLLOM?PtYfvRJ^kVapWcPPZQ$E zJ88s`Zsef|;>bVS5Jx^EA1y-M-5%P!%|RQ^(W{Whm%S!0@5M-R&9Kk<8hJgf_{y~7 ze$a{ftUn@kcu6PnR3$o5pD3dfcuTeWW<{sW+I+-Gr&iF(!&?TPbTT%o-{kWN$7h#> zSWv&th0lF4^K|}}koOia4&z=Bt`2UY4#PYlpVJOpj36wZcft|g3Ad36`Z4835jJ_4 zM0}7v_G8j6M~r!AV!leb*C7pMrU}D`aL~c*$KZh3->w@IXM;(hE7*^LqYoRh{Vak( zKE};l#MHvE9T=mMcBZWeiY-veUUOtL_?TAhc_a7ASSITU-P?W`=DwJD7+$6WY}ff{ z-TUG5-Guw`&VDuF`|#f22y>5xcue}!c*mS#hhN4!NN9&cAPnnZ;4ebB#Sy*=;Z{c& zYe5llgtsHy>)#`PL8?L?frfW7NHmtsC-8H<50XI&k@DmW&U&C)Z;+KnB5-a!% zkv-}+sC#gw>!bkg%*ztXC(rB#aA#gVRmpAuZ|0WCOJ0tamD=Ubyfm@QkyfG2Zh+D~ z&554wz7&3W$(h}o>aMjn)lCp@s=LzO)KXX3TdDfT#$-bi{MB)MeS=S1kj_2W^4?yC z%9p6(Ex?`Xrr8QtS9{Z(wDw|M;p&Oh-urMU;Fs$$>feos%OGuDmH3Dw9#kd1mnxOTbvEsD0fF^B&L9(xcjxik zth!gk3V@~O@E#D}Yv;@E$oodO=XXLc=G}0{4(^ZdwtVT`(*90ccp!7H6-e&2j@E|c z9^SE<8q3@vR~Nw=4|U>RR}gE;AkOygiriy~@JMkt_BI!x9*cS2H@w|y7)713IQyKz z+32*oKY)2iBiIARn+4!NJJ{sqeGTV{+4x@Io>`%I5}cJS99%x%qVC)RxF@5~<$=Em z<DkZ?cY^MaP^To@DVtkLt^?CPr954<*%Z&_wYBt)OBC#$8VhTz67yHa*zI(xb3j9E3eyoPnJT=ayja3&UmxnQrzAX-}ct=lLq` zp*r>?pP~Gpm*zZiQ(<26D8G%8c!-0zT>FlIrL5zAA#qVg`;}ey8Rm~+a=b0YHv#c6j7Hx$*v&`>o%KA5h{zZG6 z;<|s+yyIK#;mZEixK01^&Y!yIu_F6~-<*-AEce`M^?j91!}w^C-&EN&jHL2)g8MwM zTRZ3onW^ZAz9b!MK*t);u?BPup&h1eq$9&FIx4<^8hYYo(vkbhyw}#IA#ffA4T;mx zkaKzv^LdS?A@SE_a2^P_Ni#1EL!=?fAr1Lm&!^(#`&6FaCxu6GFZY}b9dUH>>`yJqO}$RE@@8c^oE>>y1_?K)a@HGH;#L6(rAje~L z0%Wn@(rYM;x(>#U{eh86rRQ!qbwEXm4YfBX&apxhf$+b)~(Nde+@|r=QdQtMHRx z_;qLozpuji7wJDvA8=1=zY%R^n6^lHKPY{`pVU6>&`fWD(oVmJKGN^j{;N73A0Nx~ z4fK)Tsr{#P{Bzphoa$2+r2+Lbi&L%RS45-Jz6bO*C`)+UdS3X(JkQBvE$v%KR*zy{ z%Vi7S!2JJUCR^x&+--=Ro(Se}wkrGWBF^`WkBp93B6g~HfBj5r#-V$y2Ohk{%8cEY z&tPBdl9QOLv!{xI*td)R__vGq2kWh4p^(M25a#6&&czdE;Reh{fb+*sVUPA-i#$gk zT7QrAz=mckgEPI&Yap{x2G+ItAKppSk!c)FFpDAdf%#?IOOvv4Vhq5by_a<{%T!~G5@O|aKZTLS0!C7{iA%xk`baLL`4Z|q*HHl4A2;fz(2%vdurR^#hlU=j#)kM|p19 z4?XSs&>^H9M1MDL+E$0QQ5R@t+mdV>+5>w6+rT!3;;Mb$K>Z&aQ*9C%l%IRS(Uw}- zmIv7u=uo9Pur1#~9iNwN`KYTcyB%#oJLLBcU!P!osgtqJMe04&Rdt>HV0(Vm8{mECrqc@F{=NfL`XVtW!J>Z4ff!$V3`!49w@WE@c zuHco6htTfysUrE2yohrhc^taGLPVb{`oh5L+X;G{Dt;Da`NOA*q%~-sKkS7|K>TS*C(;PNbuhZ->$Pb`9WrQ#H9L`Og zp1>Lad-6ArA8V+Q^m?%4B5PlCpA|T?)5=75f5b`O&A_bK5P-gV7u3OWqwNe$bgTrW`P3NqJDKzrCT1ggoGw z5g0R>F{lwP9d+%Fn1ZZp;c zPc63mSM8AXX8Qv}f&hB@~ zg1?&(4p{)YxyF@O7Oz1 zGlKJYT*t|Ak2%PXxL^$TrvNqpSbX=De+hi%!#pAc<{j{jKbFB6N6dfXRB^EnIN@`S z;e6r)4+X%V9}fd3_~@J-M@B9{@2=mD@_e_0mZ%%$7iDZsQqeXL15ZGXjbuhFKiW|T zxxe@;niq24nP@Z{kL*DGPGcTB1$)P- zqLE9aC%>hG8U=cmWF6&PfOG;ae5n5;IYm1o+kOVzQAeNfdvx+NX~1@K%o$jGcQ;3U z(|%*&TeRFXT?L839Pxi=IpVVg&@<2%td zAM7WA*gnhmd3?KwJpk$;Tn|(3n09f#Zh#C4#&%fpY;Fu^`eH9k_>$jxF(AH+HlLXY zr2kRY9XvnL0D9J;EI;PB8uS7Ci0vakM8NL>@zezDEJcnR@<$+^n;?$_ktdLQO45&K zC3%JxXN_HY2fw)|Ejd4e=HmjgoAV*ZZVK(U6pb!tLos(?6p1{<97>a zdj|ZF1}^AAJIDCVnxbtz?0y36Zis$&q9J((V*&iKly`%_0Gj>7gztRllejC~Hw$|| z@lzAH-^mIB{>WSA%ejm53+F)2F%99|L__rNCdi{a8_T=6CqOHwzC&7(KMikkYy{AL z=(R6`H}}f#TQLU0$WMDH)@!gawOOPo>)a4OJ<*W<7G%cr6H>p3?Z&sNu#uuaDfcMn z)?9_UpwC$k_7`niW(;HhZrm?GpNKru`WwBUv`DRs1fQV%k2M;6ED!Bx4-8yb-c4yE z+2p{*%s!3bo$#4Ipu^SRqDVJ+2uir=*hu=SlzSa;pv*LJ@gdxFY$P8C+;nUtk72Lh zLWQTYksJYo{;OZrf&ZOtEXBIt-bfn>@1dg&19Cv#N%uYY3||fZ6{J0;!&~5g2K7Fv z!+YWLOa$!-gnt-5&kt?T;r|EzJTQ^jZ~7O67lqXC9ufY0HoQjJ+ZbMn@EF3Typ0HV z)(SDA@ohsGKMpE-bod0q8^B0O9sV1HA47PJ4*wIvuOhrihl8kl1dN=~;foN?BK)il zUyE=LI?uFc3&JlUJf_q4AbboHZL0BJdWB;}BH4pd%@J{MHA z7;k#TV!S}!V(jx+Rf;K3uTV@mkhd8798;BI%G1j+=(A2$F?iFx7)mFiDzjlJy}L>o zC5R4lBZp|lc;IjUT((Rfv5BZ>DqG&tWtUI;&WjkvIUbiSZ!PvT*GANL9c#i56{#cp zbB8BZA&&QtuZrWlj@aReR)l@w!xKUrp72KwPlTd)kL`mVvArlFJCRT6o-tWOm4Cm% z_Z?BznkT4Vy!rs`wLCjZ9f4gzIEY=bP=_%k$S13P?IhgTmU+;sE-Fvqm?fmb2_&jA)wh`_WZ>B4z{bTTx-tH2Kz$=_?>J0DX&6{`II zjnoI&=bVohIErSyFNb5_(w#4U`ugvA!gnHU9>O0t0r(96HJmg5w>{}{4@Dis>}~7V z!t=2DVtMmJ6(Ujf=&?L(QfcQS;o4yF?wYt$E9UP@_4moD$s)=SR86i{uFMce+uw#k zLS2cM_iv;RMxidjv!qG-ke!|M-=yws=2_CqR_LFVn5G=Pe5HY(`fTHCC<~8Ej`F;r zFQ(1`@SI2x>mcVj5uP>VSpQAlH>Un*9`Y|AuM8Z+7$%QTB?H;N&c}@PvNe$t2=4|i z>Ubvz@l8ht_7T|e7<^tCNVw_9z>foNT5BT6z${>=l7SmQzYhY=Jf?moT*-eUWgz>U zG7z>d`(gibo-+@_6$L|8k-#g?67JNBB8Q?w&7s^!ZN_^Nj3tlK@oL%rK6&tMDjjOs z%GPQB2F+87v0Y<-T{ML6szO~RF~(7D zIsNxFjO70sc0CDyfvSg3aQ|dvV&4V9!qtmMaOd#IL<7>Y(H%vf7@26q`w_k)z6tNg z^!q%#AJ^~ka7f}vpU?V^Obls%4{$O}d3g+Wsnb`USKyh#*WZ0Z;kdsBdt?RFAaJ~ ze1H!Ivg0GZm?iUwd#t~GQzpMkw>=0uDs92fyy>3&$*Y5f7R0aV2*|rbzmB*P+|dcv zrA8>9{ZkXYXCerfMw^g!_Enq}^d(^{V_P)c&x_*j_vEfws7s+H*%3Z3`qq3ny?fTC zPXzF7W=A-bfxQ>?tIv!~$U9dexH}AWjQ~GZ{?g{^tgpbC@i^{v2;$5azR8@^vkY_w zZa?U-$0G>4Bo_W(qp7;Xsk%>(Rvt4{2!h0YxGOF*iHj$hjjdnxw#Ub`?*xWBf+TK)*=e>hO6`}08I zf#nfvW^`ntK0PvVEQ~tmMkZz?RT*nI7I+>$N?YT|#03zUGjm5K*uOKxk%_hFlMvc- z{K5;Zj8FaMU=47w{FBRrGH(F+LdaJG_!+qGtUi21rq>DF)5>#>@ChICgvs|z|4p95 zdC!%3s?Fh#L&oL+G}Rp5Y!GOKX0Gzi;nm>0b2#CqGly6EEgA0|PPpmJ;ruO`>CEAG z!zPzSBd40f=V7k;s38Vu<9OASD)-*VIs6e6$2lBhN$|Z2Qto%80tm*pj2_b%e3%_nYc$>n5i&lqRn5(V% zc&@E8)zvoKgP$H`>FI&~_Q4YN-ga4JDb@gcAuwX2k=U{`;lUDnBYvaaG+4XP}; z`m30Zs_1)XS=9mj(%Dv5!^%H_a9}J?l<4r;EH6lxwr76(K$|$v+&w`b>%*t%V_kTf zKGuaV(8qxn@)qx?9YG)Sj@r*?-=dEJ@S67Pz#j~U>0=|jN&Dm@-d!8h{wVz>@D}7J z{bucNq5n4Q1!(^%`uKkDIr_-|qW0U-irYHPO}A6u#eR8o`s-EhE8ubItc>vC@#6{L z2?j%;K6$u1iT4h-~?^Xy15>WJ1hG1mDq3@~H*~y~edyR}F44;D`_GA|JxF>UVmSO?(({ z>cDUhT&211cRg^pYsvK(9M>ZjZAhC$!Ywrc_y!KFX}6Whe+Kvae9@1Aqi@>4q^A(b z!spya9%4H%yvl5Nov1_v@#Zo3Ot_L?KKD6GW_?ZXsN4aYiY5$g&+!E8UN`BrcKb0@ ze zfA^H%%J3T*o;x@hguN+@Z#Lr4dmGj7pz{dhaZrD`Fa9m@ZH!;xhGm1$QIMcwG-u2Z(T29qJ+v z6rJ@jbvTA|q+HWYRgafF^~hY{uE)?c>k&kG&U*Z^^k6;e(l`U-pb2UA>MVDC0!y>F z+eqETs(xo_ePIP?^4uZp$3$@t({|iFiFA?87M{ZWY%@j=SjRv^-qR)TO=cSIkBT4< z?;3k=8|{+y@*6SY=GmV^H8mDS&{>|_Aw7BLUL%I`HDB3f@vc1|)?k51w!pg!gHfFS zuyA%M_rOFDXJUB%!yn~$&-k_(u>8(h-rEdZ0h~YCIsapNZFTcFdBDjdJcpw0NB!XV zcaSzO4jc}8yn4Qy7OWd-B){cDd%pMa%6yBld*)aae4EY|4&Qr`^;+b4oSVXTZqet* zZT^R7;QFMTSK9e)z-QoQtmasF0(86R={fS>)EpLtHn+kbJ?m;B5!%-A!1wg`1< zIjH)K{S(6ZE%sGy7B&FTwn6NF*?fN{$7T}Ww4tqmj6Z+X?dT`;^WoZB>)NHetw5v( zcRS*o5!&$4PcA@sha8vuW@*R#oz~Bye?R_8%m^3x2?|fIMSKljBnDG_dp-P#4rjs0+)n)1&l`>Xb6sT z1J43H0rxoEk1#nr3%3TY87>KVyauj!>mXEzA<>5S>)RvOQ|d;#`UfJ{@^@t;3p*jW z7B1_IAergCTk&JKT^@j&Z>gN``t~wZV%xTexc-*%_=PJvuUL5LicXfZa5>+Xt3u0l zq-6lnIuba+t0UFH1`zjV|1He_%t=4+r@>S}$5pZZj z+TbJHbnFVVF|ThinH*)Yj$nWLNrG5hi()R6Yjn1Q`U#dhEZ2U{A;PKu5l^MZ9Y4L_ zsBN|pg#?yC@=hle6_U39HI8)HyXAh1NoQW0I3gt8f$)$@#Q%_3g8zFQVbbo1BW%Co zrCb+uQh@2CPU#5%zw@c2`?=HWj2uB&rbjoA;^7}W$AJOTL z==jsxKd0k2f|=*y1Dr?b13pI|`7Q0gqT{)@#dP^S9MZXwLb#JUp7uYcuc424&L8yC z^s(l?TZcKn5bn4RkLmE^@B^sR6ZBDLjy`ZdMIY{I`e2u5b@()Wj8UH3VEPO6Yw>$) z^f4wa9seSIj6E2RwGn5p z72XV~!E-&ZmltC449@|J=X!#%ON;)1Uw7AWyciGpF+MTdKQrKlvfQr^7cnFLHgr-*4TCeHzw7 zM03zxb49s_h5eUgjAx5bhu8s-G&_zn*w}}{S$M?Zn=a_1Blz|%Tgc-*jCbf6g@3|( z6W(F#FMJR0&3MQC1%>b8y%GEG0rAiT_u&I!_3{0qzB)y{{pY=Q=7d_Rz$$ z2#;Vr_00(OKXMOEnh$#y{EdMb@$5M7 z+!df_Lwc9x%kW-JoTJa}hT|Qcy!$#k9*yDK3xV|(=u7>G_kGTUzFe18_l;9m8pVDS z_iaX@fqx;JCtI=^@Y!tSbt zLi`xxJPUwkIOkmN%JVxy{InDHi;oG>1^hQ5k#jCYMb+mnAbc+;JOEt>58^@2$(8cF z{ZE8=EAajViAMp)Y%on$t$#o2+|-5n<|6gYHDRZEz6zvYh3xwq0K(ikY2AN#FKj!g z%ctOm01FXTk&cL#PY2-M3VLqF#4#6gl(wR&p6@_F9DuCM0Fd~BqH3LPy;z7{NdI4O z5jc=aKFm|;p`Q1ztPje-^fGDPP5xU^mjVzQ`yZN7^_c@y+nKP$u! zZbKdb&O>;rXB-v({YGd(fX7rOd8b;Q7VyF!05&Sffzrl zE#8cB4gwOa?$Jyk2NytAp%SmZONhTjeIEx5UZspcup)o|JDBWGLAU_`yaJf_z>$uu zllOTIa)fs;Mv!;_75*0h+zPh@4nwG{4S$Nd{sMiq5B&Lcq+`2c%I7<1!{@-5-vK1~ z87L~&n}{}{K7WMz`~r1v1R(W(_CMQN>G?G3ych=zKKl;nhw;BVje(!evC2(@y@vdStosVKmoZP zW8m|E0!x?C+?n~`Af)a9!d?{qB_xnOETbAPd=+VD&I!?f7<>ny4B;l==-+if!rvah8fok+)?>1EJPdfQ z^Sc1Yb`!oDT_=7Z#K!<|CGbBFq&onMp(FVYUfJ^y=Ar?>Ed%kNMk?vWHcnQjg@C7S zwG(gjkn_b$Pic}&2MqP!*yuqF`h&j1)P!0pP!;;w}wk3f7??Dq{z zh4?>LK!-*>&PN@{e;f-artGPE4mcrje)zkPhZqRE&~cZdoGZ}o{{VEeC&wxzA{}y1bLn6l}`v_I5_#8x|o&nwW0w4(pRL|ZI z_h$IiEkgV|WY8|)|9{zg7dWYkGw=WOWoDXTqK#sLhK&aqb&^c9K{RATVxt(*kfc>K z-Vz!F1qE#`A|`I=fk9A)q!ElH>fd8@v%Xn&Z7;hqu1T6fjkj!2j2gmjPIue1A$iwH zVzR~yyx-qBr+RvZ85nc@fA+IyKF?HF)l*MZJ@wR6_o@_x)%WNGDGewNtbM-Uke&x9 zoU@4I!=zpLBzc3jUkW@HLd)n>{fP8Dj-BS-8+Q_XpYK`QvQ`ntEkK#b#e0gv!nn17~iu~9%D!GmBP{$OFwK{k&B={Vq<;HrEGI%pgRlgD>c zk>0bwvL2&+FM{xC;Hy78*!LP`b>Xq-bqJpe{zV|F%#^nNU-!B26TC0N4E5zT4|*L) zlL3lxpKp7>k*ybZknFV8OL;QQIH-ZDRb|2A)* z2H$Hn*WG)Vs`9^H@4b6}S95*!?b^>hduu=UzFzzJW}T}ch1nbI&E6>LDeQUM1bl-Z z0l6C0I!c56WS-D`#kYP%>b=0b-}u!VZwImWQu|qN8vg6;-rv2s_F`x=9LYryY%f4;S+ zS3vjF3i0*cVnI#~vAu8Be*L!hCyX=^?|rit*;{q4z5aV^G3@<)J*(<4Y7}b4TBF|Y zM_r&gAMN{VWV>JRu`xnf84_to!^G7=-$Ry%bw=9-#RG%<{O8M{Qc|y{X2gT z@!zj!&SPVjmA|!X^@F#syM6`ud-nWh*Q57+t!vea4s1jF`s+>QqyFpPMw&LEK%1ek z%Ddbi#jdb4IUY}*z^<^$x7vkgunSN9B(*Kuuq*6XpcQxtyKqkh_WAybdkNTm$wmWh z#`J!$Lv`l-KmATjzkeZqs@(OdPg&o=GJIE`uD+l740GM;pGe*mUU-tpqXWAszX|;c z)|C4P1N?eC^^eSF;!WV7FosN$A3cT=72}qGA6w6PB4}_8gv(Hd64&s;9adB z!Dr~nG(3^l&e8rp1@$wOKjlNb(Qm^Oep>Sx=%fu1>~%loJ>YlXb^X3n_T3X|q{}BC z@g$`;sz{#_QF@ze>5`0TA3!}@m9GSlL=KXeBdF1zz?8e~*?+y4X(n&&U>T;u%QTK;S6*_}?0HvS=AR9y9kb{YPru_2-Z2dC+=EYW z_B{5R&zp6%c24vX4vszao{#XT=!Gsns?4G}OJ{iLnsEuYm-vn*XY;OHIwQ!lM{&Wd z8JBW!DNLPZpDvTaic$_btDt=s8qaE+m8S8G z%cOAgm^!oYTHyYA;I1>~{zD zVE=-4I}ho6?Fk?L@R08)(HSbf+WrOYb8_?=zU-r8navOOJKRQwyMQd9`)oXUaoOX-{tw+{b1`Y3Sb&ej9VV?U1@@W{H*fTo zwErUX3~7>CVDAPdz2je83~h@uyK2|l0}wynLMGlK?~|bUIevRQXTZ>(B5 z&g!PV;y#+Vu@ts9a@Lfy-x>HepS>bky^&0Q$>-^h+)z>)V(H#}A9?7Vm{?mxF&u_*@5j{66G{~L8ZM;~qp9p~ft{VJ98*R)5c^Lqoo+kp=PpJDFsqF3nGok-sy z$$S|)@CPI5$Pn%y!2Jfw;K6SkZf#g|$mQ!p4_q7iS?H*3Ar#;NK4I(+OmKtqr?!)9 zOF$Mq=x?VC0XVf`c&m%kojUOiW!`mextNRR%vv4En8RI3qp^P66hmkW)AWTC~rexH7 z7sIR!4w7Z@&B$&4@xwDP`0wfh8hVD#K<2*tfcu8pcf4S@=u;cYzF|Yr^!GIm(r@+4 z)qfxBlk)znKB|1oC;N0`!Ib@SK&eOp8XtTKa}$xM4AoyZc1pT|^q zDxL!a$B-gylZzs3{w z;jhB}JYd4F4E&P;{jXu)2}pk_{%`Sn3GfJZZ~Vh=^NByZ`q{(CL;|=NKj9z2Z>?dr zfhW8C%%|`l#=Zno^HPd$8um^hfG_(6vh!QGvR{FHBX(6^+5L|GQVv_Ael%7Z_-OZl zLz(`LGp@SyQoR>D_{hpXrQLV*}$Pnb#Wr$)|?7`080R77U7A=i3`% z0cXGo(>Do=1J@cFSu}&S{s-QL;7V zVFIS^PSbpV?oOK|lS+}4iSSR6$)wO!nJAxWGU>;qWR65{$)t~VzD)XW7t3T3D=l*r z=elGvcQscglPL3L(s-(^)VsGmnD1pysFnJaCLL`uNk_X(^$#)SpAGyw1ApB!tMTzG zf&VBfrtngMxhyc($UF*uVJg3yFqOaCWRgDzQ*?CBK>55!Ci&bflYHi7l20@4T^j7% zKhVDYkDL%3@g2f@xvj*{R~z>ZM~nYo78+Pm3BEVpcx%s|>TiBq=kz9v4}0kUW{Wp% z-tfY)w`DszKe_(?e}8q)p1ZTpeCwKDbnSXMyJE$e8y|f7m%#!VPE z<9c5s#(S3|^)_gMbHUt;rMvc5r9RB@Gpk+bF z-dPFR(6L{@d=!(nGi>Pa_CS>LJ)&do_t)Hql{&km_f12jP4Ai}vbR?z8Q$ zy)^f5<#_+V;eC*d-e~0=N#5kt`Rn1q+=F=+lQ}oe4lz%ZKCPrP>Kl(a#)Zy~jYl6% zo|#8t{wS1KQ5v4--D-=oMbKzu-ons{>Ag$xqq#ftMydDyY+)wn+h>&yF0_;mPBoPD zhC@r@=3*$_d*>Q5};eC9Nc+UW@ zUKa~*C}ZG-;9Z~u1fNNh%=)N0VMHD`>Eb3pe2D}7$G{WdpV|-e8G6P(kh!leHeB|x z{}|o784?;}(Os&2N_YP?voW}-->5#T@IBq^E8Q8anJl{M8gtE5U2i$?Uvkxq1zc`5 zFEf7*!=-U2DWV=gcYmtys{5ZVoi~5UoJF;xl?S|s1@)biTHjJuC-* z=;tZ)OCr9ml8K`W6X*)`<`VScMHJ%%=l04nc;6b(MB>%rt09FHVBavI6=r;gpv_ZxXa#OYSWGF29p|CbI4u zg`LHbgk6@ry)rFzd!;A0qxgFAdD@Pw`)g-MF=5|cX@iyxZRWcxO3M`RCPGu;g*OWS zmI80UKu7n6w1O9PIPVBe8{AP2cSNM0uSPOIu8t;rB(_A)`b(Yd=*nx78d z|I<5VDw`N#mq1HAR@sQ=eDM@IE4YWl%FHPx$a5q<+g*`Z;Vy%2cns~$2<}Q5hktff zX#!yK(9VcrYcy96W0t6SI_Q zp0$z!{DqDUJ)PNXOH$4$$}U6sa(^j$sCi1(FYAeU@<;nIfp}uMteYgR;k2vDzsgEw zHxhc$B;^LpIJB;VP9*uY>L_UR#9u5%(qFIk6kaNB424`9w~^2sP530~>`A>;jO1^v zeswhEgkLN4qj}^2oF3NGBJoYtHqpsEUyLMg9 z-8lakcl{N8%T(nVjz3Xd2E7pc7|uG|3zY4&g8B=7`7W{dEnmGQH7P-PrFzRZM&ACV zfBABD_-@KKo?2I0VI|#%pv#&Qd8XeK_s=9plm5ESFzQ+q8d~eo`o|;S+7@qZf!7F+ zqtsCgf35upPw@%wZpjmCK;D~%S#TWsB&0o7AWUXW$x0GWYG=jD0qL8#e`k*S-qNMpZR>7{zt~Ga@$|rQT&x(()o%hv;J`}|4-g5MNX9expjGu z4V6CAv5=9cDg<39mV@o&$&IxpA>ItY;@HQ+&udj z_wh?qAGcK19!SUQtx(Uk9e;&WR zvf-DluFlop^vmPi2J$35AlbKEUk{9gcM0@BJLPHUh=#(84*H-Rnfzr}w8F(Nd$bH4 z(GV@Avz|_}Ks_W)daF<4sTS2`mo;-}#0V29cDZ5d^Jvl)B~6S&Uh(9ew27AZrF*gy zgQO|`2c!v7wJ*!B486~^Wi!u_u#)^G_+{e~52ho8<9~1L{UR%nds#0GTff~q-)gm9 z-y6c~zxRHQ)5>q)9;cYf<0=AQq>5COODr^pQW{W-=|^$}^GqDjYX{Lq-`ND%bf z4eTGsuDLn-w4T5CsWstjV80A=E<%$G?AKx1KpN0GRu1zX{N*nC_h7a*^x6y99qgTf z{|@=n5#Jct-@<$dyA#-tBwgn-cvagkdU~&JGxn*0UE@D}HlXwI^2>3Mo z6<+ItYp|Q}-k8xJ=*{r&;G8|<(s_#(FPV`s+w%JPE}p~u-t57=J$fFY8B1p_nm5zC zP|17TYsTVv%a+W{u;eml_Pk5DR@p<<;!S4GeB#tt(_gOXi#T!FM1$Lhz{F(}26P{H z(z0_1S)(kqheBiZoieGr4l<{8sJk(>?xTB?3*27`+~dfe zhmR@zPGm`UEITq$OfSo1Vxk8#&E#-9v}B)%Df_a(-Wk{nf&H1le(Ag`XNzkKf`y+0 zt^15moH*n;;V60F>oX_3W?ZNo;clj1C$<%{+{>hQ+sV$uU1LJ*U0YwxGM17XYVD~U zZav`n?mjMTe0XC&T<%(WHg6Y-x^wA%Ozsxi?ak-X@0b<}m2Yv~ay$KyF#Q>7b~TcA ziqmbcuUEF|Z*0m`4L9$@7?sXs+GT` zGAj3@>Tv6VVl?*;hefUIAyzI|33JDimCG{D{<@d0zfl?;{l2jLg&>Ve+pzVUs!Hn@ zL_4>x@_|jv`(nm(O4kL&25>dTR=TX*6(yzN+T7k*6wfp62T)H_3wJp#2G_D1J9B+*H+^m3Tg! z{5Ofe8NWQO!e#8EoLjoC0Dr-`CPSHIkj?x}nrA6RGrXytU0aGn=X>}4u&8o*1XDb| z2>F*>dh(fN44FahaX%M#@t-@3DZdq!+XA~UA1f+Lv5WtV(^((!{dKPz_o!98eWl$u zai>~=ImIW|1LE3t0LA2?ojRsZ{lY8 zFmp5=p{%PqJ7!$IcuT^K#PQQx=Ql-c%lQ3u`pJKpeRm0znfc7m{{3U=cN-*h0=i70vOISKcyk|g&`d#by3U4U=-v0yMP}UM2 zp^|SS4viaNkvDFLV~S72Tl>23)I5dx3}1|WAoI`B?^V2WfvF@;{XUxL+NX4DEkS!R zOuta&W)I?M`0@bnV2Kt74sRMJ?J;m5%l^%TqA6rU)AQVVAE0W@egk^Rj@AX zck*=e`;1u&=6Qs?d*3~q?xRxwWOHEZ{$kl*CoO51fBc7oB?fPu;lOV@j2l00$aljJ zv~Oerb6gY9NxHYtyXTR2TidX=C3(xWu%X)O>8lR()duEtH&pe0tIkBAyLY$4t9`z| z%KqNJjDAVgW!6;F{`w_{M*_S9>6gwrTKZ|~QGfk17@p!VVH93?L(wmT?HlQ@UxYUl z{qiJuL(wnVH{ybOApP;S!b-u&4h=>SmfF#Y3PmW3jhqS-Nc!**lyHk;K${tW#t%!7^1Q0~7I1 zdkW{xzGTV#`3q_bvIiPFjr;J#iN2aV@Oo^}H>i!BnrY=U*WPW@uVXBu`RNror})J$ zMa!JFtb{|1Rb*N>xY~Epb$P5jjQurPtHWiU868O9F|L04y2|UJ=Zde#pQBHBd*!Rv zFt=yRbH%TQn%&31%S@7*SN9FWu$9e#rM0ta%*_FduH1#H|A&@wXSmJL-dFF zJ@uirZX~hRZOmWdHnNB4%(he9CTEu0WUp|yvNrnkeNOQ^iB)bl>!shxceqdC_8q&+ z{Z69OeUWsJQa|6U$1+Y0+1-={YjNal`?y!DN^?HJx-V(IAM-)rUjh2Q-o767eYHm_ z3SK-z+R{$B5F%{_`s~SPt9w&g*UPz9(m56JJ995*{1D3>EvfF>UMQ`LXn#-CIMqtKcAGs;IyV+Vepr7l^@Kk3^Vd7J7kd^0sqMwr)7!l=X-Lj> z8&YfB#=>Q8V|ul#an;qSy}OpC_wG`;FG=p*)sVf^jb`S%`Ht@5LkqjTb-tEDr<+e< zFLX0rUs0+mUBqW=Eta#0uMx-ZlAKAjh^H{y4YRIo*>j-3%8jJE^e$tGu{L?_bQ|qi zZiAI}Bdh^MSbG*vR0a=PTZ@lQc8bqzaf zZ<2}E%#&*zpx+u-tGyqG`8@Xdfn9A?l4yS!*k@wu%%S8#_+FE_c|WA-I8uDWvmwO)uBGiT54i+|ER z5XKBAPM9#%c2oQ5`D*Q^_L@r%B{V0&d=cI|TH?&(SsS#@xV!%MROTi#+Dnk&-gw$0 z^f70%+1J4OcGNoOP`3Rafi5mb+1t}-p<8TzkC^O+&{LuKD)-*^b(C7rH<~AkqpPKx z4X)mn9SnC=fU7rjokXa7Pm(!OYkf5uU+=vy6t!=zs=bd8$NkoG?j-b?_1^WBgWq*d zId5(8^w&$|MQK->m3FQFztgxCUhylu(jZz&LnL_bcPQz2r~FZ#|Ll5qz&B<7^txAT zSJbRNy4R6I@EP6Pe+>2nx+n>bbdk`7C!KqAU^m)A^}GHv*8XF#!SE6RJwroy1L^4g zb3D6DL_t7fJp(&wtLbRr4Mj&EP9+@57_1#exWsXwF<1-y`%aKH876&oPW$}aS4SHz z`=~?F$@N6*_v*LdAsu^o9fHP8^}Lb&Gk|alfbi#Hnos_nz$-u!kpCT+I`6kEuzNZj zWy(6;91fYGQF$n8!Hii0>-O4{^8={&n%}d3C$@k{5G}db6 zx7N2LMDK0#@05}Gi0pKFN0DFIr^v*vwQkwxUv*W+U(WM~Uk4g{opjx5i;<-MPU18Hrpq9A|$S^Z1tIY!5lk)~MDlvi#0E zTZiQ@D=|KMrAKdz=Wy?V+Tz^}GvdcL;m#`RH=mtKqy^ z$N1>Z#uMazZuy5FqraPSw%fD=SEpWmd@1jdShO#Z1p6lG(^{#mjQ7qiC*qietra`D z)!Vb`-2=i{L3>V<#J4d1>aLw?qY_$wIj77VWV1JRWR5M8ys5fIX8fkAcgIKJrmABZVyUY^RnY@xZjR)mYuQNcoG9rziLBed*lKV{zc+9SKDM3Zmzb1yrgG~P0qNSQp#n{^uZwRk+vRhlRt zw!SnE!|WUrimV(HI`p~3hN8x9+FN=u`8b)q!y)<^-q^(EoC~-e;DQ$d&!T^^dj;t* z;k52Kn?8(puSw$Bs_yVWp4eOE6!pH#RAg3bVv<$yY1xQKIh4;;r;eb_=N)-ZHsiVK zH{hT41h)b0Kmte+R^=hNk0frUPjGheUeez{`qbY!VG?`0vbR=7JGVmr=Bk~$)srdY za_iKEp{=|(^Vp5Za`aH*#9#8(l-T&%% z&tmL-jj`s|1dkix8-4H{Ht|o?Iv#WbUc6^yV*6o{ab4_7J=EI+r!~@%q~jrEQh8xa zy}O<_bN>k5aK@)bOT1IrhPLXQ5BdLLm(OR$-ZAoQ!Go5Uf976xPwh@_89rO0gW2(;ib?ug*uHE9* zwL8gY6XjH^Yw$XfxTQME(OUXB<*e!vyoqjzl&8*Q{E&5uqZ5=BIP!0#uAMHNlv5t( z)wOfW97Ap%McE8T?j`fh(D!9t^?d#q!gy?zU#F-`4aiUVCpe}Xv z)}?%^w1sk2ng^qYet$~xE83D@X5Ut^;Llj%50AgZjUcagBNN)& z+Mk!Iqp^h6&wXC%Zm5Cse6I=r0A=yrwSHOfCTmPQC;aeyZ+Mk~>YwH~>&xN^XiNz9 z9_&+RIN!n<8S2A%`>8Xl`qY_=y*hJVU7cA~S7&Ys>WnX+pRLsycmtK@FR+&+_sZ5&oZ>l?oMJLe z9kZCn2CpX^DNDAk)Yq$2bEVTI+tSKG$mG zY2dc)>p^|{x>w(*m(8jVs&8sHMkRdN9%XAjV8hQBQ}zYY5;=rC&?lgcE9b`8oH3#f z71(Q{G!jnrp~?R0i|2zsI*Xn9$K1_sm2uPtmonBF1MTl0p1;wJ5vR&kdr4G3{PO*J z6&lpF=e)YkS`JqaFt48AY%Otkbpu`NwKwz?o9yeW)EkCP7nCPj>q^6HCq(%7jI^IS zEIcOb#`A|j=OU%6iT)0F=az>*;Dl6fF_|BhKJe4!=>yUhwr_NmCdsbaWToAt&7{Rk zqpdWaU4C5U4-L`s+UtM@W%qNR4(Ao>@@Ht!)_L_v^c7ZeF8NoOc+5WsVd7PMkAOcK zSqOErm%M-;g)f`b?uakwYt`Qn`+dX{+oCO_?ncR{_8diyn&pPAtgEux0G(QU6QaHO zo9j!*Q|F~qt>g>UHrnbCeL%0hv2-7w+M87QWXrj$aB!g*vAX=aLm0I;^Srt<-LE^~ z%fGk1`Fc=yd|8`at2Hc)qFd36UpN1jca^EuMjbJ~Y~uJg%}G%}ZQitS0&70QHs zh8?FIXAV7@;Cv9gv$LHgtHD1%5VQQV#d4Rwac}A8-j=1m=g`(mhnyC?iwyr1M_6qO zbu?jjao!mE)Xm`RinrHJ=LOW}C|#3CS19ikCkA2TY0^a+6?Zu2pJA{`tJ18q2zInL zozjnuK{}1Q(m9a3WSHsM=BTxnc{k3d1>r)}NA_%aXD3t#7+yBZEo$A+2XA7Eb8p12 za|=DeJJ8;5_HNa9og`0bc%Ab35Mj?!SiH{gJ~{bmB2GKIs>bWi(DhzDk-Pj2uQ#4) z_i;D8w!r^``Ayo$S8)<)Q<|)-`pMK2(&nWz@25d&@%WrxRZ7C^iMiXo{$*!qO`kN$ zPx`KZTIFtmD?goY)VM}`9~SCzb=RKBt9YEO@%^G2--m_P_Q9K&J}}=y(2gwBmxcFxRj(}k|0zxX zljlrxn*0hrbhY>OpEJFfMpSq99B9t;(K=cpL=f-$ApegNSb`WU0u(x!Na;c$U|1fRi^88(iXqv;eUaiCGRngH=nNfDnSfcY+F zZ}^_NfQFv&AISW3&Y3zSKy#e$u8Uad*1DqkWdDS*V9L&(;o2v==0?pY`%T7zDf>V6 zvv2KZ|7kz_YuJ^x45rd|Fu&vQZBt-B2KznO=fYh1Pm({%aYA6%+|?AApA76vv3D{F zv?K`Mh24Bg-viiR$G?@|qW2W`(d;#OKCu6+AHI&E_29333;(dXG8H}D;V_quouPLw z_Acx@1N_VT;dcq2i7EQO9=&h$^M4fkTXp_B`uPX5zTBFo8QS0&$$oBrtHWZm&(g(g zUkvW8uJ;+-W9}d!7R(ylXX#*(4B|d_V0WVE^|*A=%ms7&3&raa?r~%0?8~p_{0=uj z%)gXFIPn`vP|p?Jp?l<$07}+a8eLS3oC5w3k^}bUk%6N@T1`n$5+C!#w4DBJ?D3kiQ zNhbA5Yx=skZ8Z8q>l_&rxX$^+&?!3ivqmQFj{tI?L>zK|T_$eVL0k5RWU^qrEihjT z%u&QCcbz4AFBAUD0y7tw4+iGTf!Rvh-aDFj0&{j?t_jR-GFkY1B`~ApLH72*yf`p# zlR3t+3W3=Zm53EknauF^ptQTx_f=r6Bi?^jEPv+ekYI;MK}5e#!?x|$mg*;&_O|5#IImaF?t z!uAdBF!nELkK82uHHJ)P)>W3gF>3erwow|3I_F6SsbKEd%OZ18Fqn}@1&Rpj5jB{6(@#{5~vn$LPH*7ig zEoV&1W%}Ee$3xu<%Opc zUNM{&t+UF@S%X;4oKa)?sBO#BM|DTiPgS2Cad&l8UT4)iNRuCidq7;_hvMMHkLqs8 z&V}aF)iCFo!dd6OIOB%poU@N*@y{OB9k!+ySqCDH>E&n=wTvS#UBxtwsvm%fddn?bas7HBSUpdzO!B?ib6En~#{InW_Z;|wlD*g{dQa`Cq0zcxsSdDVmMMLIN z_sOqt-v#(TxPx$aoZ%)2*P7FM1L5*Nt+wPY73~K`=XEw`zPmkhORZpJFRm%Ac{H>THX{ z-TcT*IR0bg@x^L;UNSbu4QF1eMpCv{-@<9+DSND|`WDJlA9BaA=k;FF$$dE4*FP9lO!L>fH$X3DT~y4Z?tOe=^4`Z8+B`K9da7d)>Q99Fqq?)4GF+DZ z$6a!ZInJFCNA4Gvmpjf~UvTc-6)D_UiZVYQ;q0CKB6=I5(2KL2ar^RubJvbL@2>9L za(A`Gq7J7ncO%RhMpDjw+QYe=xxj|h*lo*GW4lfGaH>#M*p>qBg|Xf7xb6hnQq}s- z=p^&B%*THNxk~ga$F`sxrzJRxXZz)+Idqkw=6h9MR$*JkO0rfIPgTO%R3(ybcO$7W zZYZ;jdf4U~9T>?S>ne{iXI-Vynd642Ynmt3USE~Tjm*Kf!ZVf0NN~I|ao`_%wYN+z zEL+ay_lt(^g3=ks=bTNfY53*xgYQ$vDVH@FmCI`P252@@E}=}abX}UVp?p*}%Ku2w zM)xt_Qqz+QLi*Oc+)Q_(t#)lCcLmLN6VQlx z?cEx83Vc;tr@Go&@XJ{9u5CHySK{j`=V|RJ?v(dtDD$lLH!#mj9*5I zO|H%}MraFF{?}yGM$L4ih1I19_Zb?wjL;rNXb+8Cn>JCh{o=yAtIeb>npur}`}Lqd zzS;;A=IYd)UYpxYyVX)iyVqnK%5vXurVfM)PctX%hi}Tj_l)X`UsogO;z&;EQhSGA zR^`JyWRBmtvEAX!GpsTAW!P?shT2!Z>`Yy(uZQ7mq3YeelG{?%{aE4jqgCmjaOwwM z9aMW5qrC5>oz$IWYAfvm_e=?wyUfDYPpfURtt1W3ba%0 zgwvgq3BoqO>u}*GRmy0qm2tK|eh2!BHY{xIU@eCB99 zKhqv+AOEoYrLOvBH=y4wOr=eDrp=XJXo1et)MNDn)*@r7S0+xKQJzkHj%020{TMfr zZ*?P1yQlZ1N4}W9cbCp-OYaOrE|h*##?ARF=9j1Po`g5Upy4F85 zdZeW=+v|HRr>~~7;9Z3-cVS_3O@2Myou&QG#=4ubPk8O_8f%TarelqJa(qoG%bfNa z>f*`F(Vxto1>Id&h&aV3Rx+PVpCMvNXPI^=RaPI;#BK6#bePiFOq*WMPw|($mBml5 zP0euT9sY`+;;neBv&~xj>E9Qah>o&o$E9N~PN0k8=n>m*Lrj~mKD2a&$E$3c8_D?X zxcbqGPx_+)d5y&{Ll^jMqm@@5+HX5M=*NB`erF%u9kRpQmfPX(MKvcv5-DRbos$7pw zn1Fn7SC*R~omQGMb!cnj$x<|#V(gMEXXJ2?( zXCy+IRHd1AcQ5;S(CynB@|RKP{d%wa2%7TT|A@(%{9=rFzks7PWa)_5sjU>uNBqbR{z-0Qk{<1*+run z8c|H?1EoQ_L*Y#r(O0_E$BsIzIl-?R>1*o_$7bPU`uM$lgweREudT4HguTJxELA{X zeSq`%tuP9&wj^xR_l7^>;UfFh7rZ>=NkiVbOE|2FKm1PRR5IG^pgWx5-G7XnhMbPl z4(FTIFF3F68lHcusJi$W>f6MAeFEJnIW@tZk_pCJ$b{PQX>q^4C2?1u?R?XQXKBOH zy`h5NPf)#UN%?JfG#hiJ-&OaPrtkFXVN-@SJh_H-LZH?cGJ3`Ih5UZ5`a&;t++A%* z&US~>KRyt??(rO!W8aWh=Qr<)Cg-~o3aXc;&*jIXw$UGRQkT4bQ*Rq>B?}cR`%I+) z8A-$y*4Gt&8G!GojW=z3Z+mX^yya|xw#G`}(jSko!5PlR_@VC8|k(( zk5wjRRX3lg{5$n^T23;Yb*JJMp`J$4)Yl~SwLpDLB}O`;rr$gv<@aNs z`3mD-#;PIeZ6myHMrT{pLB@Yutt?~TU<|AAi0Yi`jdWKiPk)+zxZ1-o{cepHO&hAV zsU191H&usQ^R(@>{WhlBdbRN_&{MnKhMUG$!=WWQrd_v*NA0(%kMdVKn&=zU<7wmqaKgE4 zsf}>6)b{7vy*^6Bp`Fbi?P~0xwoCd{bz~Iy-k1Wqv8-EEdu4+oJtAC#7tN~Au00%= zyW)@fuhJ<-ziVtF9lji0pmeGpwh~_Bh&A~&?iU!>X&%6|4_@Cf=ragELwNC3;}zx0 z>obTCS@jt%EFK}W5G0dOkLOVAn#9sHAoa^2Ltd5H&pOh97D)QXIner1 zUmE=}nitH<%v*BF+@YVkKWXTtBp(iBcRM;VPp;!bfxd%GJAC0(7G z)~SVi56YIBY*r?;yDE()1UJ}~<()v(&C9LC`No%4m0C1&LXTIcE8Tx!VJJpSFn&nZe?(h^_EjZ*+KYB~w2Q!TudQOdIGKF;i=ZVqNA?-3vU7`x&|XW7ZlF7Wo%rRGoZ zyTFb#PCx+fJXw?OmEPiIR<{*b&T$QP$%B337@beF5sI~KQWjpx-@ zMwpdJ;3_ZXw0@k^n4viQfj8QD6@|~5IWsTe{@Gi%zv8LMO?3*^=+gc>fZEZ9ZB$li zd}(pvsbxDlu=`b+SNrN{;pO4V{2)-@5)Ou!s0*WT!W*b1WXEldw($OQka*9)kF?cV zLg5XiB^*JZq3i%^rPat2$ANYLJrCYMEvwQ#*tc&>Xt?Z$7)r}mPkW$Klj;GeT-$?| z@ECqi=XYyhpM-rGJhL%tEgjDbUY+qTO!Znm-_HFsJU}=9Dqc)g!&8SeV|HdqaJ#90 zt&D#~>TLg|LN&J5gMe1lM-i_~?d*}+N!&WQxG^wwm6mSOG7Zv!R;oWT&a7-7_!gK6 z#L3sEJt7I7oXP7e01NM)Jj%QRSPdir$>S72{F(@4fyuxf0JB1#{V2@cz$1a3h5mtV zrdAdB-R0WFM{*A0r2YcAn#w2p&X|4iuj;>!~yBwdM$7rmP2tfpGlvw z4`lAER}A-j>_4Q3T^~=qo=M}Om()C!(Dxp^W>c4Wl*g;i2dc{xCXPSR_Pztx!+0pc}uLm@0Et zKCP>R-zpt86nS!RI%XC;$=crll7IPq15mq0Gh=-g_yF)Kcp5R@4yZks&XS&b5RhC7 zl-6$(K@wB9e@niED>{<14S>?a<|S(va1x;Oi&x6)-vLU8((qp5I~p^JsWco0ECXyn zxMS+fr}_PPMo{m9_$A=qfISN++$unM7cHfw1@XB7Mf`5?q;KUWzXb4M;Qhcwz|R0x z-nTIzZLz7!%a6(+2`E1TrKtl@{v`*(9S$h(MCI}9OibbYEkH4Q{>Na#D(`CuexHgd z9wRayj`FGcDt?LIicfMN{(KaW`^Nyqr??d7SU_o2IKdoX0?-!NON zsCrI414K@!RlAdHw>>1>6aq@+v&>Lo}5SxhXG-OJ$+-iGPYi=@QT6uJlQkB;U#( zqTuOhKxtLlgr5YIj#B`+ z3CE;;a`0PtN{`|aC?86XDQD4B+U2hNDt|Vhcum|UywWCKPlD(_VG92mK>1Nwi{K8LK+^gJARMJp^b}6@ zNxW0NSDJ+<9EH^74dqGxqOH6OUwIWh(NG%Ib|`JaQQ8E`hd!lOG!;fT;)~)Dj_~C#kQ_^| zNj8Ni|8oGPU!Muz7W|gG!84}l=#!t~F}ze6%5K2KFPaMTw}5c ztDdz29|la^%9Fww{>xo)3&bz+LvBj1;h%8D8-e0Cv}D(BeKG|mZiN+pOui)(k{_i{ zZu%tW;?)U&p`-LI2Nd4miWiDkAUBf+{WfK!-zI$qSEl^sCr}>cCVGn3lrulQbl1nJ zaLY*4YRqc@`PqQnrFUGw(EA*}Rad0LglFgr_hLYCOHR)OR36g-eM*Z-*Qvp8@j>z| zJ_Re|D1OCf;#AtjE76l% z2cR@aCgmoXH}QU#-}>Y){+KYzgK!kDKE*4$K(e7c$W3La--<`L(kH@Ee&^vh1@kCC zbwFuS8YEZB?2J|i7=;zcUwHbhPq_LmJ}9m7Q+@?j#E%8M8G2s=~q*d-F z9=QvIXWSI8=!%|niQJWU6Ygq$%TGKpZpydl$Zqm1e}PVtoq?(T$uYnO0EHKy3=P%s zg+K;Sc?j2}S7}lDL|b9o0m*{tC!2gLUV+k~G`9gtzj$#vAUwI(^GNZW3n(3O7pNSC zr_ba?bi{l4%TH-hJff}7{Fb|sC8gVhmnpmOOnRjUtc!6jsZIZzO=GYUs{_k8EOfY38HcimKx=%dRC;8KFBO}6d#O&Zx zIq8$T2_yUS;7E6x&-i@|2lHEgyXt7kZu~yQZ^}|t#QTId&R8%Fp5#|$Zoc=R#MJhf z&)~^4d5~W_iOXS1*2D+pgP@*F)zfU|Qk$FGufB50VypT1apQtnF5CMKG%Gg#gcFDS#=|dF1*wR>1ht_(sh4&Kd(H2t zbRXZ%{#t)8rQUl8hc;BT(&|YKIHLx^$+A)=Je7=SjUEKAle1Et>}3_Mw041eJQT0a zPako-NYNqE8G=F z&2l#!veoTA-YISkbN@JWxu4(x(P|6QHeeq5#i{&?P0~uze9D*6bdo@6K&4+APZ~~@ zLeePd7N{mk%Z&^`t%hkiq}8Rd1!^VK@(ZMy)oQA>kpyeRs9u^4i~)`U#saOt(E%KT zc`Ts3y&q5u^g%#c;6uQ10UVE+08}H#11A6~{}Tae`VRvWfsX*v!XE`D0jm8U2h=N1 z0+WGLfK!1fz-hoIfYX7gz!|`qz$bxe0Z21^8u$#50?q=?2F?Md18U*U13n9!4_p9T z1V}5)0MfuLU^XxZxD=QRTn@|!t^_i`B47!y6!-#g9q=U}3#Po`@D*S^ zuo1Wg_&RVq5CsM+|NWJHeYuQ!A0aS)6Kb4)zP35Js zQaP!NR6Z)33xSJ)&jV?|l*@t20Efgb}u0saFh0u^94@G9_I;P=2DAQGZ(1MdP3 z0p0_Q1_tPbjK}qV)LXG}4ki!sy8*nJ1_{&P$uxP8_cJseE~a#b_@I2m0r9w=-ex>i$INHw8T&xyzI)vI zhC1*HUSl7!TCuDD>fefO#X~Fq2Vv@WTVR*GNME!Ec9r)sz~Fy`-?st6QF!T@R{#^< zTM^`r`-NA}ymCok8DDRiarM$V&zYCZxVG1K<|TEgc-2rX%O(!h?WuvOc0qRO7MU*x zW(&V%U!?s6W;+2rt^@VA#!Z|MJi>M0Rmf-jg0A(qbU%Ji1NX)|PPsYD{lOXSAmiL@ z>ZR)5v{U|d@mF@`hobcL|U7yAFjHvwVNOr6~U|9@$y?_Gk8w(+Z7)to5&0go#-jq0fE8@r}go-{oe~ z;=L1~w0wTwwEX5XtGqi---@p~Kzde{zCC0AIIYm=P0!6idT#de(`s+5v?Vrr>9lw! zQt6c3wBx4yE;|4}dhoyS59CKC;KyI5UH!|vJMem);-^k}U;p-W8!9)AkMuukXVCUk z?}pTW!qwNmJsk|sw5NV3^fUAZYA2l*^;>P9?0KcPMUENRfa|4v{&8kjE!rtadBej>y1#J}_Sk zOfPPpotv}BZ*ULP)}A=wq#?JpkEkH}&u!4Q`ghgmymOms=d9!k&R%lAJ7x?shS`D{ zva)Uqzoi#{t@bUrmtO62Jq@)(hK9n3j>2%?=%8WLZXYO2&*TsN{Gr9Xzg^(I2AezU z6YnYM&4W;q9pb56#Y*!QF;fK(uiRE_vPYE|TOKi*J856)*j%;2e{tdFs_yjGJ(xGG zKGtn2T<_}6)~LO5m;A%*f)3laVPECphYQ>%!yDk8#*Sa7y^?z>tlfSbvC?SQr)yh& zJXVS`W!iO~Tvy3eZI`#rTt;*5B+dWmY-7iFU(vfhJxzMohkNh6`+LtW#~mkPWt|9h zqxr4E_TsDTY~N#VFY2CB-EV2JTRT*kc0YZbZ|FYTkbTPioZ@MqVv_&@W;(5Ee&no8&1@A5Le5x?w{$yc9j5}c`L0e_g)8zMsVw{(1 zX4kt#KP$Fnn%m5-_ZBkH7yRTjITya=xmHP(vrqs=DGD#Km&8cL+9|e8+REz zbk3u=Z!c@;*B4-;rxHrUJ?eccD8;ajjZHTYj73KYk2JV3F zjgE$d)fptNX}P4?FW8KIhru zL#IAl3={WgdwqpES+vvZD?bixu0D_4hmpfkxa+;VuQu77zuU__POFN#zqiSHPg!}2 zDV(+1rTyjI4em9O949yvX*ZDnXz3pA#nxTN(Vp9?-d&{G@4g}&?|0CLk!-h(LB2VC zBKZzya^P}iK1n_TS!Z0?EZH74B2<1WvAq~d<*MBybWU$YaVsZAnyh%a#|o8i9zDiw z-x4Y_166IwZmcHwEq&7BY^>5|9MNQRN`v@SpVdcu?c-MYv6NH%O@3qXcl`cMZe#H^ z-j8~EjA(DH4v*hZe3Cmvnt1p7^*Hp$k99-ojhui$#?#lk%qKRtE+jrqiZtbhmAE6J z)Ku6=dHL@+3@4s@IznZ=IUqj7dNz7*Iy743&EX7dfG3^_*Wh^k;SOIbBVL9}D#xZo zq$K>!xF^8wbnkzk-pc4Gjr!9QF#rgyoPb-fh#?dLFPW+S&9d|Zw=BnApbK1^Z%9s_%D9c^Z$JT|CNS;_&*B% zbDvfp{(JXSi~pIy`M+h)-d{Aqf8mP%O$(E5Qyu@mgTMGM8Bm%epTh&${F&SXx8}f2 z_htxJ^i)R;uHMktOh4%_rLXRuJT!e}bd}LlG4zz$So;6yLEW!^cKIZJ?}=|Oj^`wm zbk-?XW=o?l%2ht`<<8QUkWR666t@=1uQj^dQ$V+%uUjN9R+qa9U8VXPrw#vu^;9O% zQ^@QWNsG}>Y8$wFi<4ZvI!gCR+%wb9dn0nHJHK@*t{z7+EI*^0j2<}?J@UYno!&{f zDD~Ru2$kus?v5cBVd}WjFIkCm@=I=#m1W@7%ZqSy@{KmKS*Pe!hbGxyttgC6(uHWV zBfMD~<}Md=qAo)EG(Qp{A5nhmeL@qTXekbzqI;FJ#Z&Y*`=!mK3z@5>tACnAPjp5> zkN08vq)p+5nl|L$D@V;Ib*1j8czTGt%#9v0>5p&*Ju+^x8;PUK>fT~(L~m%G=4ryK zomE@VWQR&>3&bP6i>$IT?ZP7P8g0M)VhKNPQ=Y1ea;t9>*3ilK`k3@()CQ~nqW0Iw z_2G4L{cg!M{Y@j+qu-mWJR^BdbrrYHlsq3+?&0L%`bOJrNJ*Yoxk)d)Nq0*rULehd zb(Q+I%=C4QT#en2T$!?~m#M+ZPO`weLw(BboywKsQ`t@ZBg&5VBzCJld-skJ=PIY5Q=~_Jlg|bHmYm;j@%lu$>hOZ;w~Q{oF5NP2 ztlN_A?YGeO_v!=WX+V9j(ANh|fj%&Oiebo)>8r@k=z~91J%i7E%IXiTXQ~fI_D$Lc zl6{K6n>&eNYQE&JGpDxbs@XG_%(RaC%gn9m&Rg?EgCG6p)-E2&oxJ#oCp5u>&aFlL zIf8&n@BA12ZEuYx68H>;m%v~2!*zJx9F4ID=0r^4nQtWV4m1Zh8H9SgV+KiI|FtUN z4P_4Q0`O*)-xC7+v6z~VGj`2=ZU&wJgs=6tC1mC{K=wRVo{&iaIt{-4k-(fp+3B9|luYpE2KEf5))3z^cFI)Y6DT6hlTHszM<#XW ziNO9!U`_-_?irbs_k%K_zb!DI#}xfeCgnu$?!ff!7bjdhVH9qvOyZq}Df|R9gr5pb zM<)1rnZPrFxkziDNXDX>Lz|C1;iMCWyw_|RdF1P}_SrU$xfAuK$8Q2JA) zgH!9cYcy94*;9BAjy`hXGRD*wGroR~I~dCqz0;((L)Gu|<`wB@M3@(d{OT(?qS>7Q z7(ebNzTISdcPRclZkzD?*-gn#?=2nmOJ9dZJea4H9h%MZ4_UusJkRY9)?Ak&XMOZ+ z_KsOQBJoG7nq$-(Q_Kmo*1A)7S94cj&b4gkRQkCWF5+H7%-zux?>Ab^8^(F7Nwj$T z%7nG-&WdHfwj4Ih+kOJS}X%3REiB7WI69-wTGr#$+W?Qd&k8$LkU#+eHZS-%a+_Od@o z*@oH~Kk^=-m7q+S1B!YkW$KxfDW>Apo$DG0{lt_j^36`STDj6?Iie5G;~n89c#aBz z$G@%dTyh`b){}k8mbdV{a&70963KMXPd|{XFwSh=MVi`?AKg}?`2pm)I)%EZvPw`^ zlHVwO?F2Yha&BpKW?e}*dY_aVdVU^F`7#zwcDW&ybKzXxKIWdf!t{#XzKRu|-4!W3 zUX2x=!{pvv>X7E-RsT#Kj@H%T_fy6+g}bi=SpV96Ea26Jf_TPV*tQd59wtOP?DH%s z_vz&&*yT^V+8j-g7RG8JiyLf+Z!|J*Q5P)ske{yjR(P5X2{>(Tk9=)kLp`vP;< zFV^yZ5ap=ylnklNS75>?<`~e&(9+sK#DPC9{0Zc(nJ@y#)nQ(J=q;1M>H~7Idm2DfzWbwqm(MIbcX)%@;!be# zEcx{K#yXGqDcvr2xg}ZiQJZ4kC$(}8Z?WyDDxJd$FIA(SOkUx>GkJUz*?X+UTVEbu z#O;M4$m64dJobk7jPF3-_-&Wb^9^1;U-I0w9><(l zAUo%IveQl2`Zn|+^u|F2CnTNf$w?uQlN{+r#*Lf|V;w;4rpm*UleF~9dF3XBlPto! zNc^Q5zEy{>wwk)z+?e<>{Rqi{uYcmqZ}@F-mwWal=pW|GqNG0=l#!no-|m%Du;!t7 zv$VgIXXxjo=U3!Odx-vvy-b=LwAjm|xxOfScSc(y=~u8W93SbeLC1pqJemVs20tYO z8P>7>I`ag7nfZZb6t4N`zI$K)`GL(S-8J|Kl{z)({J`cqS|TJ|eIEqq57x%QgW=H+ zt%c#IB|N&_wa?Jg_|yEB=l2GQ_YC|Zb$f4wHzG<&>?(_4{x%cKJGNN(vQFSpY-R}qF_h8^Z6?+#M83hRc z@_zUWvESXu3M@>K|9b2b;aw6__HSaEPxSi^B^S-CA5SyVWW>w(oQtmxfVY2d_Og0( zF3I#8y7rHcp{p+1TBJc7kD)P&W4K%IXtwoub04}zYYlvnIi38f&14;fSA zUhLZf(}G7DPmT)A6v86=?7;NK$KX!~6fOo2W!ix`TPBUz@#9W7fi1SR??C&1#=nCb ze;y=0zS?-xyff9xo`yE|$&8{MZ!fUFfxVic)TxX&=ev<))@^XItN~};uC)3#(<=?R z>)lZHoJtG*k_KR8@`v21~bq_NYF3o!=$5N))^DW3qS zce|NW*!@-D1)wox?fw|B7TAj}4`(`A8;5pgwcD7b-9b+`SY2)x_UjYuA*H{`{tEj0 z+0v@i8drT;y@$Tds#ecEt6F_FUag)pu3CMRw(O{Mcf~4nS5DtTyJmG)BB}1mA@T0Y zp^0w#9^I8VZXOU$;?%!|Xt)~Xk@owus zyf;WfsqGaDd!(TC`0bSj*0&nd^gkIBMiRWiOB%P6CQI=GVITs;8MEp>d$p@CllPG+ z`b=6&O3qc^mA?A+>fQovnzhkI3QxT@q&?56@--oA2kEC@!CNlySmP*-LATRS2qk~( z(WRfeTj@+D6$j~x18Me1XSP?m3fy7N-U0duZWH~pFnetxDc%yM@2R#^?f1&WYBy_L z?{>sjxfgG#R#TyB^{f#-Z^hG)MLy!a`Ov#N%E$f0+sIz3M%Ict6O@n2Pi010*@xnd zJ+4o)j|1MUN_Dthg-$Q8QEOf4RQ6{~qpVIl%PD?>^`{tp!xr{S#M6wc5*k}|lols= z*MdBYfA#znFE=RviCh(a>~4y0tA;5LKkpsPJ9M~NU^4vdniS9}Y9)$2$J#DhKRXg)tZX_oepkGKB%jtB7<={z% zGNPa9l?`RJk~apt@?tEsDs{c9JyMd32s)sHGK+Dyc^BomCVQhBim!Ih@2FNUy3d!5 z>63l=Q2Cv)o^)hMXP$aQTE`{*dY4GSuN=I?9>;GCV1YLRI0_K&#V6H~BZEAI^PMFx z4;k{1hIgdF%LD0XbjU+)4fSoM8%`l#l3~)^1x|$i?@GpT(iJiEhh$NCRo^%QudG6c zy9OE|^4tNg-`~x;%7^sH&O)_%!Fpe>Y)@3HpS;g0p1#m2o_VKJd>nnKJdLqPcY%E7 z&>t!CO1cwy@|PjM4tY(J&m?)Y$YV}&NB&ZN{@CE-$*E*fby+gHg>j1HbAR$H*)(-J z6z7}-VWsyZkK*6{WLxqod6e8s{_Dd_MkUw#lY7ah%13oVb)!Cf1b4~q{_4Yc{3Yju z)dST}$%`ld#332C64Xz0sN~Pc_oje%EqP=#gG?ajp#<{nbd)-*HExs2owfH)WX6;2 z9A%G8OCB01?^TiyWLoWuH&&9|s0@&UDB(5F(FLC5W)0<{cIU?_Uml)MR;!;~SoLH? z`a-fG*-+Xf8+Ho0$iWNBeQXAPQTEES+LUp5zw9FpGLu4Pa=v_w$oMj%@|#KCGKE)n zt-`$jec9T%1?jl3eTl36w&CRZYS`*ud(D|SYn~Nq<7dOEpE-N_Y3F}v@7c7}M3vtBCiACwSyyi<`cbv#w#a+P>=V4LE=3Py#Ghu+rURzoq7NF%;b#_VUTE3 zpmk8RQ4uE)HMXdOg2k5V@KQ@FZ6=T)sR70i6s^y80^voQXpn%Ef=ny>JZv96+q9*- zZr8S>ubYq#Xd>XosyPiC8DNaPy!Z)9ZN-rkFNki-rUnG~y?Byn`NX-9>VE_*vn9Vfdvdk}U%#o| zvb4o{$Eg+hzIpxK>$oF;IRQ5WTrs;KLi1-dDY~w1?7KFnZB`YeXq{NAKzio2D^?zQ z>FGJW7C}QDE#5%bOqbGP14hDHh0%%xXS=gZ41QD*w59Z%5ogop|V<_s*dQ?Ia~?{;Ms-N{u=T~*ltw{;X zcJRlom&KCBNOZ-Lh3JNBuf>wZ!-G*;|J-|z1S&$?)+}#v!yyvdE*^MhVu3p{JZm5E-Y-=6!ZTWRqUgby@ zqqn}}c2y~~KHVjBdI9H)qRDhBcrbUvKeKO!q~K@n;0r!vYW-v0<@WxR5k6^23Y;OR z)Vp0}%tb<>8#2Ym22Gx8rGqv-0;t=d2Rj9sV2qA zKIwbeKfV6)o`)+F$<9FC=H8OclXvri${YP~*E-9_zO643GoNqd&9}w{=J6l!X5$YQ znV}f_yR1vGfBGW%KBo7Xb#AMaeECSTkz!Ah`L5p}-C@1lLYmPF$Nfis*WI#n+@TF5 zh$|j5pZ!5Cu*j5zO z5zd~aOOq$_l}V(uAbj6}rufd^n9j1|h;YOW# zMRc>=ggPGGpciAtDei_Ry0MHpP0%&Dp1^K+!fqbqe29)feGD@ui*L$@_*p!kT?U_L zVDElzc&>RkJaj&KrmxZGvqb9o-sz5*lhA1tLMNc`DIXds<>sDkx1>l7NR5{0!)94w zlS`Iut?OE>d`^V{C-4^_$sO%2Y;ZNZN5)5=?be4K5pwh~OgDh?6~-{@eirl-t#jAv zpJT~%D8bw85&H0Gr|Dx~=5JGf&wdB`7KSqxg;wxBqx$+b&I@llQ5D(tQb}UV-;?wo z>8vH2K0mS6;Ed|5bROKZBPHf#IRjk)oulv*p3cf}-s~qjqhPRSZ@Dwh$$hggVg?u| z4E6|q=%JDBmR>+(d`LH>H1_lW=!rmAMVj@BnqC|;k{W~OWpwt2PC8SP+yWhM2Pe0@ zhA!cAbJ6{&>}7n4@U|~|8kOvD_H ze_@OWEKcN4MjlQ}p9Ye{GwgSFJdU^LY zi9NIX5@zwf;4ZT?_H20-UCOR;0h3$Dvgo$>zHB6UkjY+U(EiYXk=#PjJ-|FL>obyp zxbd@dOAYjD7~`c!Qp#K4iqm}o?f27P|M%!Wob)tnw;wF-r#t9p)Gw=F5xMAw>!&Nc zos&Zg8lwL&5?$EiNB%@NT>o1}|(@4_bG16L3HDdrd!ziPq5 z^aEjR-?bZt|EqfdwQJQqcVw>TzxR`yzUhGeyERU9sw3_vUg;~I%`eB!b(6dMe|LvON{8znq z%{}~A`*+P><-gj4Ykr#lY8$RO!+*u;nt#jxkjHFz78TfpShu?M_Qrb}?{01GSTnrS znwHkv*K`c;rtYG-WjHr9pGFK5w~+&t%G8LV-s7%@43mkC@8EXVJGiY}-;P9TTt2(b zU9Jr28+|9{$_9%tG`ehByt*mbbSC#D&*VO2-OpT`I+*hZcjaeb_8Ysn)8}B$FgkPo z(5`${cvs%wg;d>rJcDu^^1a)8ro+x(|EqgL`;KI_9dCcQ(34r!XMM%;&>9>x9;kni zf6=KuUFewIe)B%e-p_5P#q-vY=rp*veiV-AhU+(r<)H^f?D^a4j=OUJi%t)*$%+F>+)c+oA_&s)@Z%Z)cKU9hZi*}Ur) zEoii-w;NmAnjLja&v8qshw=*QXe1lPLR2_JSvV3|tQv|cs(q@`KJ)rsDt7~Un?i-3 zD@*}Lgjsl)FU;U^`RqAY+kKP$J8EBcW!;$NwPn;Rz9IAMvtRv~eaBfGT{ufOkUNOF z4&-!JRe4?u5~~hC`T3nTzV|Ls}_$887mX5T-uuG{&YQ(<$_p6uq%d(IOP7Wbo_Dj^<)sjze|i{0W=s)xg+ zsp3D8CN~_#qx>mvT60&vcD*^n%Gbkh&NAJ+DPPK8ao&cJg*AQnuhX0PJ&pkhPlq(p z81Ng!uqYWGZ45Z-2@CQ{euHeluR9gXp(4IAE>Zi96D zn~Mnvo|V$3cK7&!eYAcs!h*Y6qVi%vy_(dp%h0amRe0V|G|cDu!-3qz44X!5DY})($<`T8 z@Rs-%(>gbH=Y!@4aQ7LLvlX$P4C~@kb{O3I#u%Yz2#qQux{-I=Fx zMDDszPknaXKiOlN&Zf)1Ke#R9`ky=o|Jt+Dcq+g0$9Q0krKgJQdkxz@gZ(L(G!kDX zjl`G5@MYfr9ba?@j`(uc2>Ft`%a=*R@Wu5%ehmJ-e38H5_#*qU@+Hn#JY0R*5j~LW zX6^g`roJHOSbP~bLcZkg@+FSUAsNV9UtIs?WAN|gi~J487ugr{Fm*j>ob zIi)6$hiNx-f!260I;@7yDLrA~T#yZl<%#=7pbLBa$iL{uB2PRxLU=b322OE>rB8HY zktd#nZY=V|N#rbLax{73B$N0{pmRUZU)O2~emCU_tqW@W*E>w^C;8z9*8rAzO_A9< zcbB{O+@#FuBKluqR$Oj;llUKIzT}!M5n@B@rVey_oWZ$xyf2bI#v)t{FId#fndsGr@J(UY5*WY1Y+ z&jS0tz><_52YcIDoox$;xEqHsLY&2OWS%$N{p&!&PS;%09yEX)_ozwLwqI1{h9IjFG+P-@iatx za&wVEti5CBOuoC1T;OAb^v2*LW4qEB@Nu?Ke2j0k?zkz3U!es0W)2^_e4LSlPWHM3 z$F=YK2=`ul>|H(@(Eq1-N!pZ_xunfVuwUP6r%!29TE$zX!Ac`%F(V#ccKLRkksi5; zm&NIny#cM<#80YtrFc2@Il?#YH^tAYRF~=Iw;?tL;S9PlwO#TeeO7l|vD$9(o!ahlD@_#!_a~92vXI?&m8QYE@QFg2%8Tf%Hcnmi z_K`!{`2UO2^oKk*N|amjhV?Vj+-NU?Zwy(Awr$OKMw%NP^@ODW@nU_K@++|h@yYr| zq6_2d`Vpb%#xgg0dW3jyA`Ie;D=dAY8_V42*U*h+Zd8RJ5=UkP8A^iqqB(;2#~u0x{=1*(8;i`_G4F@pZMZ4?WRd$bMdqJjuAm@X zdavG_!mlGN_mlZH%pK6X{MlIKp2U0#cQ^fiiCOFIC-JNFoGhY$8?%YK%a5}?l|u1d zhj}^kYd5@4VZINu<~s^+LlONKMb9AI=eU2f$o(HMzv*%RMUlHT7j0X=KJHA^8du)s z>@(^j8n45K*0u4rmd3kU+B;fTHMKRiG~eDbc+absa_xv=th{S@A7=)7&sd015Gib$ zdLv)C=AF~OW_^3>z3bO?jFN+qLRqcSYMrKx4(=6ZkUt?@&0WmG=QwLF9AjNWA2zjy zwOL^lL{biZ&A}D)ud>&D-cxy?Ou9kB2?rl?@JR<()4xt-QE;Y%mpOQogHyuilV1nF z<=|=btFm9@;BMg=jExR99UMXsn0k?Qgv!Dlj`{N04ZqWxQC;1YV?GDb0gw64SToW) zSGucJ`VU5mxeE6VEuY7o!$xm@S(-PPaG(ADZuAfKTW@e!Z_B0j=k*4J^bNF+W6cvC z9f<$x@cxix>ZDa1_7Bz0`igbf?!!Scz-Th{Nyop7?4lm3(?1ej7>}+Wg(14J$keZk z*z>tz6wB128;eZ+UIG}4Osx~T{e(H1O#KRU2Zu?Y$7;ymcT=X05}RbU4|rl#`7QzE z=DHWl(3VU#x+0hav{9)VS8rTrKMVQ}qy<506dF4)OTSG0e;;|!nz(&kp#mA({{Gdj zn%Nk1W~=Q=c1Ay@{!90hhv~a!(r*QL^Rfo>1aqg=Z^(VkB)w4?PiE8yS7!=%q+HRSKR+0R6XP5sPdPpm=xAG}MHw>t`r+-k1YhNEi> zX+5Aeefga5?&r#is|V3?2uA);h}AeKs?|7?KvK`F{@1#^v7G)S?8G1 z4M%~z^71*eum0Wit=+~mdfS<1GoUaIj&we*jQpyuiMOgh;;qaAnVFUu@v{O()btsl zYy1U!tB{ADAqhkN|BJJ9Q8Ma&;+4MQHrRz-wdG>}xOByBP;_HygL^z->91SIi`$^+ z#&VYK8R*8+29Ky&0Hd|RBV_O;H&LGS@pr`U-EMb-0J1pnQ3A^)wIRj#i4z5Hi+p{9|=5c?5{~?e0IsVV^m^1tz zOi#f0Ip$iAy9$0VeE}(%8md!ndg?K&A-d*|Vb*xux{8VhF{m z^&8jOSE@T+;_Gb!KB;fww86n`zoBf z9ul5TRuAuI#K2ZIZD6Insm=1nA*Fa@N4$+w*@I^LGekyCn%X zSzmP1(q(SWozqW9f$i(>-k|a83P&etZ0Ci3mwBAd?(!AJFP(kVJg&mzX15@3ElJmw z8{KAdGo`_8Z?)K!ut%&rG9Fgd8~%~9XhsoC06CjEiK#Y(EEBMoeh4vf5+vE%3SiLJGO}`s2|PY(50jgq-*lb z;)?8?r5S6Su;+2^x#Y36<+{4?nAet<+lel;W!)1Or!D&;v{zGlV!gTQXkSie?5cy0 z=BAmC=4QkW(w=GC+`w8EJDAtavav|dDfe7m*x-#d+IF0?bsBrUpN}!R3|@(!6~A1m@}Ext|Cw4V7DGNLj6@g4v;5H1tgn~fkp0*CRT}h3CUL`-xgQv=@0eFa_mqe|pBu(v?7V%4 z=*H4_{1UpRVZu|mZXV>^K;TLvTUrHqO?fGvo1TJBGNk*t>2uA);di6&@WvA$#cn#H zIH)gS3#{-dA1V)hAz%`1$?98HHz6= z-L$c-qw!uYkhr($_PSsb z^hJ^@N{}H+xWzhbAYVj#b4$-prjO00Z{j>y4YI|Sa5BAhp6%(k`D6{UMkthg zaaT#e(+O)%;G})%aH6=-C@j{x8!59 znmX)TdRjKX=dpe|`yiINBa!A2%RHXdXXq>LTMkj@)t9I($iL`@>sxkU@BQrJ87gm# zL>I=h>qp^;Zn!?9Sl-wtV$bJ>Q7mtWZY+Jq3($>4-Z1GvdZAUH`%ddwarigf93F2Y ze(y$~;qpagu0CSACwBD_^a-1+TUD&roa0O*TG5nQ-QKj;qwHhf@@KCo<0T5%GDm}R zZgY$>$JO;?mN^o3M}0;+KV5p+k9oru6 z?b4Gil|3}l-;O$GI#2zTeQ$!!8kiRz$h~$2dcpYB{(L)k;kx%Gtf6dl@1X7#sFCh) zh<*H!eSX7FczUl$esmtfy`#`eYdEyTogIzV4Oe&h7SsMA_n$}HMkQVY`ilF{2%W=n z>__WAO;1<~$2AtqW+TysJ$~e0bYtm1f9^&kPkgSixc?O0So+TkX|H4HKXqGvgfK_z zKc$QFS8k#_>9Z0$!q2IM|vOGWMjMP^6d zv1}Eec;|jHe;l)Dw0@}Yv=+F`V@~ov;W4}O%f@)?CQj?!)zseFv~E?4eIBu}WoRAd z8-ZX@CUiYFu4!spO?a5?aMpN~8Am1>+@Tzi#uLs+NgC9#D>|#F8yq|b8{d)6d#-Vi z&`nnHVa;JLXK;y!W5&=RhfsNy{YDPT(deVBR{$D=#F!loQuc9;Gg-x*{20R5x|2&k>V z0PX$=&znObQpLHI0)Zdh-P@B@8TpytRT=&iN0AB#^2et!Sfh|BM@OeP{ zws&3xxfd32H+~-3SbT}8wdllfXjeOfs27!;3D8c-~wPe5CU{B z&-(z$I`0K)fOCO!fXRU54!RcW4)L?VbSKt0KMqVYx8|TUSt9`W92iDURFdAcJ?M99 z6;C`-p6J4?uin8flAFHifc}dI`bMJr0B#k)Xmm57QFwGE)@Ow$COe<|SN3iipRzzq zMDan%P~B2p@`g8!ip8*2_}uUc7Q_4*DkpklR`}i+WImG#zsowmyiU@O*7dbB$Q^|2 z>s4M}KYMn_^NqGfRyTWgeS<|m`Zzl`WM#TA&Q7#iBJGj2uz~9WS-s8Z<9(HYu_6td z_q{fU`6}~1-AP)->q&m*pzhm@LHxM1DW@MPe(1g$FQWS==qjKKSo3>h-?Aci?$3W?5$@MH?hQrm-^YC+ zX{zGhdcwbCT9NzHxR>BR;`ld;+`o(a3@4rVuY7Ixnf&=P+#7KBJN}<7a{p7@qqsLa z?njE;|0nLv9{1iN_eXJ$VfvH4gTEu!m&t`@px&JU|R z>WkdFa1VRjYl__O!@b_){+qfp`OtxTNa?V{uQZF?+i+J|(}pWILDxZ^R3_9pth9Dx zRQ4D7X~a)e_~D!po;~8R(2QBeH^+H=$taBj2F3o4EGA$gTXDCD&8Zao7h*v z`Y-WYyqI4^KM(q#;&swhTjYKu|5ez1(p>tu-J|o4OeH5bhHl z_mf5L({Z1Hdzs_@c#->iaj(T)Z$S7Rn!QCdL1@CEhiMl}(2-8=yf1ukD{0t5yH3!q zw^raTo%y3cH?Rg+1V|>X26R^O6(9v10(Jmxz(QaqAi4D|8m{D0$(&ul8elFE0wmL& zqU(7c=m*q)cL3TK)cKRs6EFL5jQ?Gcp3F(k#7{7~PMruJ$Sv#b$(fj!hkJ6bU|xjz z6y_-A*D%k=d>ZpY%x_|zi#dfkg86OCy$1Jl1rOxgB80iFr20oQ`7z%#%>a0pxto(7%< zt^ph1YH$b~1kV6hfos7P;F;hO@DAeX>+Q~c;NAoOa?!o7{>w8{-~Oo)?9TCC{Ewdq z9>^UD9mpMq=8$n9mmmN3Pm|-H{OP)>|NJlM@o)XKWc>6068!gn{pp19zxY1?U-0o( zMl#u*i_vcAqvzBb-B;X9|JFeGM(-yxzTV{Idi^(+WPFD1v|F5whq`mDHwM}a{3W_` zYvSFx=2&-bZm7GolyH2|u;v$#nc^ed#o4*R?$YI?&Br@cVbZsZ^erRJD+tR7nb|0A zQT|7WYZ2}XabJY{eC!rt7r|~mG;^`vWcf)>u8DN#miKq(I-t7`8f47M65I_VnVkvk zOz57FJ$^&jhr``D-S0XB`u(^~gQfK&tCIipYmV&8Hct)7G z&A_b!`Y`4&VTG`(#w_;|&T{#~tIWqpOKlh$_P3O8bZxR0rVj}i2lJL*Hp#Zmibd29 zF5?ZFWI%oNWa`9taJA}6Sbegl&ZL38`v!lnwVtdsW!$p#3WRs2Te1D=4`24<#a~Ng zDoywk;ogZDIt0;q+_CuGQzrex5!TDgQ_1v1rQ1J9n1eX#3ZPdXfF! zxDvP;_z-~n`Udl!H|7C10QCEBFy2`I7l1zu+yo4$oWgtPZ+ddi>h2`NUUx4KCDTX$ z4|z#MGw)-cV50Horz%O`;-7V8;;Ej@XAX9e&i_f8{u~&@M)(olz}ZIn2Gd)d?vp{n z2*D#O{mHa=Ho@3^Y8-KY>$d|xY4G>ubiaq}b+3l0y1Jcv07H9n4OjT-)4TF7I_W-2 zx=%R&ALsuI&i^O)|D5wb#s6oV|Ht`%-1+}3|DSaJKhOW~I{#1b|1X{YC;9)l^Z#Z3 ze~bSo*=MZ^?aWzw9lU9GSp9m0ebqSke^4i$)p!(j<;X7jIPQX09=OXeh`*Qdueb1c zhi=LY%x^ko$tJyL_)X+^XX%Z_4<#~;U+JjIBO1+6Xj7i$E+Ork+y@`a2;btBnM_+{ z^Ldrc==?tme<}l;|9ehp&*kF|{}s0Ee?a^x+QSaO2qQ3rTt$3;{7hlqq+l1Z1v%7MOa9@sHl>f{4-+}!K z_!NduU!9o9kQVEnH6yw>v($Z)Gr@V@-ekI?=|JvgAN3-N{B>a_KQI;tyU7DT1{|hS4 zweI`!fyHO;(Va|t3-~engVWFUmz~R7Wz)}Am>bH^%`zxY@nKg3Zm3hbmS$N~q#1l7 z`)`y<18q%Z@D^#(YvI0FS;kj!c6LR`H`zznfly?!Ke**Ri7UrtUrF}m_J$)_6T10L zJ-L04{f+52c<1yy>Lqp57e+n}ypY~IzRKM9*E7w%mAn<_=%B`*q-;ZbO(Xm#nYYh> zAzd3gkUMd~3+X)%+;8rIekSI9PtW9?&2F>7$31D2kS7V-?aSGv$%e77$DTEp%C}=Z z8TF02NBEcYZR#`TPqOdRx_SJo|AH=xb;qB0WQ>2|Ulw8K2fKChHS(@8Reen4D}A{o z-|NZDUD=llbyhOhN~Y)U@~K?2<%tOQ_FbCu_eQd@L{ILkKj_MozON^9^W{C6$=9kK z_GFrSdva^o6Asf(BJ34Y_j7H~R>$o9@ucyobTxHW_rXaPWG(cAN|!IS(YkYazKNWL z|40g1&gp-AMm+l<`HYY!$)FK`U+J3z1C^8is3&tG_DtGL_2phM`f_itdV#y_lIf?e z<4&zRp-m*y&mK&s#pAcTUP#X*>{u^y9(DZT@+$K_(zxgQGtHYnZ-?_mmV{s4@7JHdLAX`VCez*U)tBnd zR=#(8hX3dM*?FBAg}=j~e#O6-S36MO)NL?lN$DQMM7A3@!`#XLojKLZ{YHiPXjP~A zc7Swk3sI*NruszjP5gMLbRqLvY1{#?7{5$k_%ZWz?F;EO#Mc(I?=*|lX&%H}j5<-7 zTxAA&;V-<4(`WfEu=^mUjg z|NK7YtP`?6`k6rdVXJ(qsrSoVyRht*X5at8&1WwUZ#lav+?A^$AHAjA4+Ol;p#3sX zA~`#S49(c4ai4W|^i~#US^u==YsjUQUB*G$)C|gXW?dc~n8oR8 zFlC(K?cgasWD)xBH)<{VWY&+IQp>!^edB^Sv-E{lnKRaoQ~O zsbF|3^66IQh<&-5sK)Qb7SEnFwq_(xD&87sE0{Aq%e&Ooluz}O2Xl+pZ_S)EcjvzP z(AG><>LK&x`0iW~nQNl)#HmLnl$&Ly<|=>6eBg;w+vD3!U;LSDq#)w5&qPYIgQkVx%r)23$ou_|JK|GNVmpk-or-T-|c=1k#7b0@iX{@K_zYYt+`z?8khpJ3QBaNmD8 z`8RguK4Z%rmRw6b=fIP58vI+%Vct8%Px)$|tMwk^bO z0e#39A?(xGDhls=5MDykzuK44 z=k5V%|4twMh4pDqPoMVp^ua>wqc5^P?f>a>`SuzKRhs<;u3F9`{>&f2rG!q*4rh=c z>N020s_<{5a9jd6eYZE>9a_J!BeZ^X$U3eTx~*>3thy`bG}M3ExV>@BJGgbUu5Hoz ztXa)1>xLl&fzC=macEY$*R;1ZHE$RiFx*l4+L~_X%(JZ)I+Q955uvv5%*nHC7Qq%LUAr#6(8#cz{>)VyR)^(w#jUDSlV%f~l z#tki@aAyR7 zT(W@Y)|TD$u?39_Zoc7``8VDCVWoOF`%fFI;v1<SUjfgqP?z>#5tJ9Br`JX&o7j&ReqVre!zX zaK^jZfG_}XqwG1hqS+lOP+?(3hwOdTJYEW^Mq^$0WK{^hk zwye9oV`vRiE>Vh5SRMDoi)%SOnbiTTy0fvZ<*t^tq1m@Ph#Q*LsT!zz*V z(SDRO)U=xOz0?eN)6~{_Zd6^B0cpBv9miH%sZndy@K>*IU)$6% zD|8F52!uX)EBF31t!ob5R6jdx6Kn`IwYLn`L;1J-sS$?OZls>#ebt(fbI*d6nvnfk z>Be>|MIn*m?*^VQZEIcCL3InQCQ%!xsGn$A`LR&6ef?)?!yzhGXn}oQL+GyXtgB~T zIkJ20{1)D2Ska;j1h; zyQJE8j_*Bz8sB?;Q~Xl{@An(CHr%teqiH3$qus`9+<(KKJazR{eu z9m)qHNg*G%@L%3tIkFx>s6hnIr+DSAdviU}7;Wbb%330I-EQ~%m;E0>=lxu|yRjq> zao0_B(&KVJm#$df=9|!McZt9*ov_P0Irp89jEoF7f&bS5$_Mk!A^JA;wYIJ$PS)p! z=bBx7rhSFQ!)dM~B`kSWJhwm2hV!S{HR3M$bHB&T#+>nl$1FCz<}uIUzjJ2_|0*m! zHtkE>UxlUP7W0_r;Lz5qo=P+w8-~K9$PX3gr(5#OaHNeX~<{r$O zJmy`PlO8i`X~uDn`5@-kJmx>fTt&lF+mwv|ICutzX2<*#cn9Xk;hEf}0}x?i_qOBy z3b=&&Wq%b$hCdA+^C_9B6!XFI{~zG{Fsrkbne}6%AM+x|d>-cCV6Jh@voTjQ`Ekt) zG0*gvS74rxd7(qU9&@+HyczRJ%%N z=D);z!ef3C^I;}g;+y!OanrPH+b?(4VT~6_TAux&7UQ?*sHq9kPX59hnehTA; zBJ;1k@?Sy%+D2>rT5}~O3zP=%oQG%$^E<{^W{b61x4mh7nwVX z%+ghNKZXBLk$F#%`9P6bdhhNh|4(7App4w|FlH^fA*`P|{mjLpR4s#XM3^y)LEYDEMIk&w>ryTo#nC4@>yqjt+V{jw*1bv&MzZCkE>pvM?9i0ZBF{>3 zk(HGlJ9C5HR&A0nXPa%wS6P~4ac+)XRCA1`cxxTHql&W4HaMgfH=0`z1=l-Cv2G{h zTqoqsEvp)(dAe#7!JlctRPOfminLLQa!-WY&s&p1rspl(t<$t_gJB>4v`Fo_gVM3O z^>)ifnQY}Ip7wQ|8?}UU1u0vb-7b4AE7**6*+Es4Idt-19sDvgyhW&|zNmoq%u%tG8InD$s@_fwlp97!n7(_4FkOAEFkSpiVa8OQ ztqCv|N=H1vn5Q#)0R+Rj!Yn98gz04F3nOqY6lNiDkuYOiRG6`AnJ|K!gd#4Cu-GB|KGI8CV-dmuPn}0N!q?;On0v{?)EgLIh37Ml zlNXtTfo=!)IrjSnd^#;m{@xOv<;bv?+2@q})5$k&&Og&0Uloqd)+rqH6byxqS4XVr>X`&PEy$$UIwpRpI6&qMdwcc2?CJlpT+;T6*1%k;*rQv7tKJGfO_b+ctb57*BY3MX*FJEE0 zJhkkcHyWR%f=1@}vfsTlkr5C5?4!5A$2X@=%myO8`Tw|lb7ndG@&_Z?93>1K|B@VEoKAs73f0Li>f24|SW>{pgJqKBmQW& zsXFzoJGN%NaNAbi;q1)xHvKU7{`lYL26|U#{Lz2RmwkCxejs*xro0mzZ^?|?xhwDE z9-gwMUHN@gm1g;!yYgR5USgIm-j&}=T`P~bn0u&eALvM?FF8b=iEq!$JpNg;Dt@~u zU6%4lS86=EXRm5+n{+B&HIhJ_vH3Nt9H49c&`6JcP2($*H2iHoqkp# zbN2f>GmBD`HQ~nypK~%()Xv+S`dc2^Y7X>L?;~AiMX<~KVuj(nqZ!Q_$>bzoGD#P? zESrdQ`4KColm_>h33Mb`Q<@Umc`$eMZzg7EkT!oRl6{=IJz#z|qdKi~4dcRJ%0F@G z#O!jpqa#!akE?pWl=r2+lphE-bH7?oZXnp2nUIF({cV|&dGLJFu6zx78t9K@s-E1H zFNr*8PQ$#fV!SyH|DgzVD%EK&kJ!38`zk7^Ykhemaz|#|*LUR~>Au*kfo}uJm6`G8 zgQkD_u6zaI=q{Bi?nQcJVY4}n{}q&HW#_JZdHg}ssDmcaY3})Ovl+n8p1rlEKip~V zzPZ`lz2yQk0B;7uU9_cTwB6*_=g&{3--ph?0QDDr7mHugH7=n)`(nAnzeqCuP3(@t zz2Z;(!CUkN^RvEeafN zEH$R=CI2gfX7+L3OzCILQrRfJK=9dIGj-Azd?t4>*bgp`q5op49nnXp9?d_2pFr@@ zy!;%+Z`FG`)3)Dda!KNxSIxMCKY!>^(hS{IThjEOxf|-y5d>GpcVv_fS2tO8JViKG z_@qJOQ6RY28h4K?ZP>}pYp?XY)fUM5VuNmF!GFpd!Nt}&EAj}%U##&ao=o5JzjtKJ9_SO1?Dgv($lP%7 zfs8NpE2~W0@$6*y*7SYRuf1N1o-9?)%5Mey*En{M!cN`j=;nMpdtI>9IwPR`ttmBr zq<9p!JC4abjxjT*J_tUV@Tok?JwJc?K<1V&@J2KITJX>g((vy^Y4}w7zWCQ(FZZOO z%t^zitu%bZNy8^dLwO+$*Nl*c3iLItG{g?%lC%$(|9*@Ad#rMaJ7rpqo$?R}+V-0~ zWi7j}qnmnPk=+sO5=D0Z3%jl&yRTrkqsZ<6b{gNUG7Rsr`23?1_)c0)PhGL=t(~S~ z`cmq~^Pc+VrIkMB=VusM)q^j5ZhIz5n;DFmTEndJ%kjg&nus(!zp zH>OpF%V_U^_Mrze(v6(Tn7=68lM8<6V6HmCI1uG6>+tTp&Yv0B1>(E&I`?FR?Khg2 zMHtIt^e6Or4I$oUj%_n%LL0&F{21eR!XAI;rjY+k&Py5etBlzVL5;r;nt^b_tcQMn zSm&J>w>AC~j>h~@48IZ15G5GbQjGT|eh7a?l=E|`ZgU#p*QAh%kimVCuFQD)Tc#A1 z8aqou|42LQwEFgMjZb6-QY$n5^dtG+rW42@yK@7f)#%CZ&Xs-nk-YAu^6z{kU-jf8 z`I6Af`F*}hb0D!Y^To$5F)Oft)aNt(osZ=APrkq$msn$J{FWS7+r>D}SbIVJXUzci z%r>(|BKab+$T7Vwtac&0m(YVOiTzDpI?wVac~R+=yVA_rswt9X#xqXOAdlnGuM3f{ z>6|THZa#>ebv9+nO#F&((~%2i8a<5f(d_l;#WujVLxeFmgiHk=uSZto8~|hblI-+r z?DE{Hwi##4U**eIM;JF~lOLRQeP%_}?yJk3{%Nqzsh?SzJsbV=y%+ehW#LDxK3sPG z&?EV1xTka)aUA0c?%{|&~DU<7%2hv^IM zVBCykkE}VEJF@9uE<~P;zdo2dRB_O%3(1;;x#cD@KDwhHxpZ^pYRRSWV;S)p@X)GX zab%hlvW$P}-pDC)ZMx1^<;Aa zreFKiHu~p8h1G986M7}@)(Po$m&bQdUvAA#plt=>FXc~DJ|(08WBWSbIXf5j&m_nqP!hd(zy#r3bmrLs^TApVO-8hgbX@kG4& zi-Cb}M=5uUCd8bBI5bA1lbuHxEk4chi zWH*8OzYM$celzfs!`LlX8iIBj6i!Jm?IWiChBuA~&yxG0H)6@G&NhlhZASl%cyGb1 zvylyv1G!J7m|K{fGl5^U?R&>5d055nm_wy&NeA6!Od3u%dVk6kEv`V3)o`@do@!|m7))R zULgBgj``o^#1V&w!ASOb&bs(1D&iOFE<;)*c-phzjaZASe?j4=h99QYzi)?#3uqP*Z z_N@(ja#7M2F!$zFPmK6>tFL$)cOPl>k-n94wJa24bn6(tF|Y+ZXJ~y)}ol z1b3MUGa2YMdrH@0KU{y%Mql_5+>|GU|7MnQAaAEOP)_ty;-z?g3Vr1+vnSU~nkrj& zWbUJXQaK#u4hFev9wz$3_}k>9SN7eGy=dpie1;ysy;1aolA+{KtH;lI{Zr0={*;ov_(IEqJSFgTx(&k%-amf;?aGu9Gr z4RZvYb%`rn!YBc6Aq>@TrOO%v2uJx=U!wkV?!ds0PI0foM=pIZbN-YEt^PZ}TE)xQ z{hDzrNIMFo9x^3M^o2P`PT!KkP3>KMxbEcG5k!VC?7mbVn3=_E^wc1o&ttZ}T)XDB+v{CbB(!M=E!CYfbBQDj+9jlV*2eaIv`99i{ zxji2`E09&W80LP~k*Ko{Ty2!RiOxx~sBM zKNSesa-!-)HEHPR*Z8$N-_^^V0Moaa-JUVR9UtUZW70FoM;ebbE~xx8MkwDJAFRI4 zRGs)t_IA#kO(SlNb(@GMP8=n{Jytvk;wkj8&RF!j#zVPfHU5gf0oGw^s0TW4xJ+YD zTzwIIW4%K%Vm)-CSAQn@X{4tn1`T7;Uh4d`1nU*(`3HjA^II6dR5#snUTE5W`$QjN zPK+F(FuF8vH9nILGL9~!Jo;kPyI>;U^V@;1>Kx8q>b>qtZK7YFInfyPdl_N$dEh88 z+GqYBTkpQ>Hv_{ERy%OxnEK6{&YJZQlt|S>seTB}7EjR47D2=g_Ee-fn8vC%-Kd3KJ zSX#qf7PP}Hp$<`RA1J9i&#E&OUp_A<8EG3b(l*v+T^ULB}$;LE1>S(m2x@mo*n!F1ue3{A9Xl$>U+tdU(=#+)3~f zea`NDKWX0V+hY29cjq^=MpT0A;7csDek9{y$`f_&>w3Z;(CwH6qBgq&*n>+g#bI&1Ok> z&uf}TNM2(vqH-d0iC@#_hAF4tPByY3@dkID*|X{a^rF=nbgezP@|6D1hh|4zGChO1 z=zl$K31pIO)?B3~!W=DztOd`?!d+%bWLK^dIf^@vvI!$$8ok@i8I*k_rFz2pJ>}j- zxpzr6hSn={sm|Ck*O@%5Ht|b%mRt-UC9BpLnj5N|6Q<6dpT#;U+ktlZhwSo~?5cT! z_^CI1mCvu!2aJy-(>nLo7C0|A1)jv`oX0x0;&=$T;UTN<)7=)|HeXCDO^=6POh5kp zSJU6V`PK9y;tYh_%r($Iam@?q3E^h*yI}G1pH+8oSN&Ce`}Vq5(@%u|HvL`m?=1h4 z6Xj3-`>&PX)#f+A@@v(Lm|Ji6SZRKeG**+tE#8IkVeiX7t*PFbQGWF z>}uZ%OK0e`7Ty4TL*IEht%a&C?Z-~CwCa)gr~W&n^d=aeLcO`ob)DwsFYi2~J$~v& z=Cg$FiS(g^=V1$s#3dc*_wPQj~{?m^2yM=*)nx;-nio$ zIV1TZ@`;tVsHwbthIR4eV^NcR6ZrH_d1Eg1#>|W8yFSLa7=eee-T4O0B|+w@G3IHc z58h?Zz95-ibS3trGhpt{zZvey^hPPW;8xS!D-r+R46*L1^fTW`#x*ZtFRlIi|;m+}eXJY#(mJC(~2`|wM7$#3hCaU`1!$^y*8vETpi z1C_UYt~;atX3nP4H{F_5AM(Jz+vz>A zignqTcOBSXmpwUT4bEAwW!*#RC?$O_d)D6k#Nn>#%CE}YmVIq`RP?V5p|{tmmB%-S z#JAt7s~X==d;BS%nj0!VzaS4r@OEpCcwNw!DRc6ve2W*N72OjSUCXF+JE04}FSlIe zw|f}7!`OLg{-f#MLa)E|}g?l8;4 z_gj0o1%Ke#088gKIK(2EX>YH!Lq7e*&HLNL%CDyQHionJmte6t>Qn zb$G=um)%WRsxNH zbZR~c+zKoOq5!H(#z%k;1FT~i^MGrC4*{sP7*_zOr5Kk3GXYe3jEjH^fDnMHk1-99 zZhj4LE>I0nXDz*8)Y>k$l@!}A_vp45H!qmCWWmy9AG0N@AlCf<2-WU1Ihq>7V_TICv^}obzAkB!zSW$MO7^f6-L{7dmF-2J2f9a{f3-wE8XuL_Zpx%13_ufIfvc zcoxErSN5tyqEq4M(;1WH_FwB)>65$apPL3bya}D^ko&oAsFu?wC&bfWi*!1<2A&?FI5VMg`O;&TwJvT%9FUtgavi~P|KlR_<3;ADi_EWJ zK0>zcd#@ed&x+g&6#{#OU+!U<%;yxD&o46T?1}q{{v$kZ!I!^smQE5 z-rZ0Bb+*L)Wd1>s`Nu`(Ul*AtdMdO0PcJghE;2`p%*{n+-GlFb3U6DHd0&zFPm0Ws z7n%RI$jqdu@G1Pkb5nMC{kF)R%Lxmg=r1TTUteVYEM}|y5svjvnhq351>ZWsU>|s} zG{Wt{tWk%)n^-F*F8>m+r1>&lJRSz2j%58eRnYMi&Cac&2;f!hP5 z^X(|QH*RRUi_@(ejK&Wyy5)LKPTz9ljY}7B2w6wj8!a!Z*0-#dPPldI+I~>ivO6>@12bHD0m9=Nnr%y zL&6M_hlLT6k20iAtwB~3CO$3$varrq${ca9b@NqgJ&Rch<>gx?u#6= zbq)gilw*Iwv46`kSFunk`lK*)&pY@x!i2U5x#`_AdC>55Jnd70tcu&J7m6$@^j3+!qlZc$GlgV z`1cDV^CZDjX2B2P%c(cQ@ZgAW*f9Eq;lWYiI_eQvd^zRd-#B>Td$6BPK7|p0_X|V! zrh}uDiOi>knPgN@_A0*_!jxxN_zKb~3|$3wqMIvxCHZ!6zhi$~7`mB+AsiPb>_fto z^C@A<`EAEMjXEIvWx`j%H^+Qj7`h;JWoiR_7bd(e2cK}TDGXf|bwutn9K28%`%Mn+ zbL{&a{H$aDvSU8&m^JZIIMoiWb#Q}&7dd#7gAY6SxG?dZbj)u%I7r=-eMp#an^$#M z@1cgAZ`AW0S6o?dlaBu8gL9s=aK1zDqJHJ_&1TJqCS-N*`oML!Wc4PYum7oRs26?J zP%`}|%Z==*L+FtPdvd=@ok;&Yb|QT`cq08)`~>>|3DXy8W4)@|EKA*Pmc_T5UA&>% zIf=b^_L8^XnN061DKqa34!pjLvjlg?2VURZHq-RQZZ~&#%`lI~o=Rt4=+3YfWol2m zKmJsDqW&~H8NSx-E{AH#Q<=%7dhTG?>K-auG z)3^D2(}1S0X}Vc%#LQ=AZqAgGmImUBp!55e=y~`1j-^BFe=d3|nZ6!4Ng7XX99j?2wt@9)?)*PekD@N>f`U>`lLfq3<0&m^3 zASwf2IGH|O&U@J*c%SIZoQ~SOehZ%eDsm$2hu5X?ZnHGiW|l>}%(6%`y7SzL4WCOF zvo;Ce?~V<;eqUzsy%Z-*S7&U-O!MB!s>o9RzAoBl|bS!$4$P&46d zB|TkcAi*9RJPpLqSBP%T9J*zPdE^J%&E&*w=2tG?Y91$z&y(K%$gy#J~bUP z{1rdNN4@2sG@LHCc{t47D)d(G_BzhHe^&}!q>-fGcR#vx>!aJV)(9M$@6o|I7UP2=U&88*#=( zqfc}UFNMzygRWh4h3~x>K3Omg#wB`hR5KY1lh`4S7>Gs|UtB(U!+RdOYjJl!H(u8~ z9RA(!LLd^)7ceL^&leztZoHc3YrTS@+0cJP1j~$wV02-g=D1s8HJ6{YcQmeMOsL;f z-?*yCuA#{8ZUo~sHX-97;Y@`w2?yH}x^=7p4QeV?Cx5HXCqNjV=#-^V$zUA~IsF6#0=of-QIb~+2Dd!9p<$mp$QF`#E0wx8^b)Fs22m?2r15PIE5f)~7h1H1RCnHID|kcQ=sZ`s`d)B7iPhAQ$RSa2InRcXZV; zQ~FEnAPhx2LMi zEPXDKDX+w=^f~;ky{(fy;BJ#Q@P!)qyyn?=EDKM`F9tP}c;RIB=aEO!rJ-$RpTERB zdBe|W6NE=Q*oR*ElnG0-{m5eq&mcUj3>03W9MC<9pf{#+FnaU92<=Z_2EX)%$?-_S ze7MAKKE)pUH_?SX%{{-?`y%95IuAhS9O^kbHHpkA@Wa?m`(Pqh zi8%`X3g#~Gc+8K3zk&HpaA0mC6Z%jBJsI|IKZzMRH$dZOE=59IrM(%?S)Fp!G_MB6DE&h4yV_cZM-Vpo5=quC{m-H6q zf~AA1{<8Awt(;dOJoxxN>cjgf!xPBezT_VB$?yFy^F-`e`gHQCw1GK=xzb3cb&vaL z<5*gKXn^y(>N}A;D(fBn6H7-LyF*MZD^yo0H`h*dR$b@ppx)M!-(Kk4w(1XW&A)t~ z<`a}9aVd@EoWrY#?aY05?l$`ATeJTTj{|kIMRb^?GgA`Uk_!=r^h)H<^2513=`ZOG z_XEV~b+g-AU%txNb*l1`&6!sSqw<4WG8w}4Pv2?=eCU0n`>wGh;M+=F?bKTkxf$ZA z!X?aw#HaLWFT5K5D$d*J@1^&{S=&r4dLidOw>9%?&V^RQY+d0nd{;Se*2XFa`DtTp zkspgk!QGaALOF5h{%DOs?WA3Ilpmk%3p_j9H(6y4Ocp-_v=g17?yB--x71y4YOD%` zx0-(VHT@FG^4iUrdpW~Wk%A8)>GJQ&jkD%EJ9FcDH=E_jE#?mVwA22^S@(r=A9-(A zK9KCnHxh3Jc00h{d{cf?UT)JlmcINshV%=f*}I^T{($o1rR6MbrS!b5yrEB{vbzjg z@!uCj-x@y_KPgA%Zq%VAlWEVBeW7IF?9j2C@*|xloimkQ)1=^2)Klr5Gm~Sk=A%xlKKrQ8zk){oeZe-1=2B>0E25F!M|FQs?(?L>w)%4FVcs2d6!M?PQ_o9x4i64EGoZ9OoouTLiZ_Ph_ zr7!!7a35vA(xSN(n%6`#-6~t~)_fCT8kC93b02AW6CF79pXwXbht8z`EJw%9P+uRT z9T><~l*>;()5Uu>ojL#4&Fo)X+m+EdpZ|xwcY%|us`C9$J^GRECKM2*Nm@ODR$FPX z0;{^K~G&z(D`Kh^u}vtMhiz4qE`zt*lt zu3AGOR|j13ZO+anhn>Y+L!}wq8Bm*K?;Y(kQn;%;fwrl(r~OX#@Rjz08_9m>bc;S_ zbc-`<(umXBIO4=8vk6`Z7p;=c28b8xN!LKT8z)|!($AUTL2E1e;oF4Ql#%kfWk?+mP;qQj>x%*6G_`BNkD;-yJ82e|1O3fDK8#zxF7Dmdg$QAY> z+J=AcP$PE-Fdlp`h$A>uSMt03Njr0GI{;ffGG6;D4aoxJK*M80_VdhR1ahzG;fxiz z3>{T_?CBpPmt~N9Ymj@MeRt*A?zgiV@(ao|QvELejLBb^##q9&vrqkeZ#?~R%7bIp z<0H-k zYnX@*hCIE^ieX#hclhVOf5iFgH|y>#^jyjd75eS%?;LO<%z4Bbxf_A`gy#2iPtF&y z!~ghzV_h}i+;h%=v;BPo&b0~Z@p^4$Ls|Rwb;n8c;bm5M z@_@CaeyQ~}c$72h)|PW7TSn||cb_r$6}Wo^C#c@~zkg`Rpnjx-0H2XzekmL&^#F6% zn+(PWoNbCFO7NHyNuft3HkErXiZD)LFLRPT>%{5eTu~H`FihspkYhT-`r`{S_K(rsH8-cd$k;I9rst7#s?W9Sga$xkiycy1MOTXUQ>x`=wdGFM#2+*TK|=#EIlia#7J-PzD+wTGgmJ3=8V z3H@Y`q6Qfmi7&TiTtQpTL(}i~qbIJmn>pj!M7a&**~a(!95Cf`CGAso$CUQ-n6e^i;CMw0wi~+fe*6J7P>KGN7H9FvT0|sLO6kHf@+|c}_Hu{!mZ-hPdNZ z_sXyo)ez0*iaOI8N~quGo|N5+w}~@i$Ky$-mAp0Lo5-^VxqhY220S>9G)HyL2A&dZ z>g)eIab+_p(3>~nk3qW_bP?~>(0@qBmRwYtaq(x$vYA9Z_D_gE;>z05b0ej8(kOlm zT7_e@UFZ=Ae7_ukWX#v5uA$OSiF zb_!%&(nu(EDz9k8HL-*@PwTOkI>r9wm< zoM1jJSfTmuvce{CHdysNo&2Wz@x%v4+~WMeBjpvq>BfU^Zsa`}QygwLA`w&Lh&$>y z6BZ7~SJgd7c)%yF?lABKZGV&H-dBdqxI*C>WDWJ$mFEl?ct_B8+VM9s&mRGvIPdBg zV$$=#{YS|DY4C;Qzi6j?Rp&RK#(r{mcmF+46lXjPFJw2BleFU}%>s9L!v7}sMCCS? z8@Vfr+1}D7`utHhY@j?4#|8)TrUslZo|Y@g299L1+N|nLI&n`h9-xh56Qjgzt4klX z6_qO*v4&A7udTl_lM8BsvCdQStsZz79DD@5COd>mcs##ufI}{=GH_@Jo&x zIpi#|cbPBGkARotx6W&C(fE!t#*zWy7;`oBzXoz4QplEvq%T0HH#4`ixAiXSa#rc% zlLqW0G?V@?4VnEu+R~W~+>-~N4#0al!+Afp1ab%Na^g=!N*$byoXR=Lkv?oxA#28` z)|Er_$14a&W|wqca(r@Kc?tgU*1B??NjR`Hr3T7fq>s=h6kl?96R>7EFPO6Y`A(B~ z1=^nl&46?0Ea@TK`KLTB>i!2!B_ladK0J%_)dl*ZpAOhMYaU4^O4y`w>Y*j$nc{>b zZQ{=i^jWnv@*;dX@n&*n^i7v8vs(#Qzm-m+ACV>$^V)nE_%$a|A0M<^a6@^4!dYjxLfJ$q0ll8z9x08>50tGY^?Tr(+{&{ZL&-dHmqeUBp;*Xwm7*U6~|3MEFUMkQ?~-w^QHXr!&$WKWp;Z zFnEavCS-=4^KJ!CbEJH!&Pt@#IHT~PfqR&9CnIwQ=_`Fci_wnK1LaRQ4%j*i`X2bL z7TLIL@-oY4Ec~{QxDkVViKBX6jDHEg48H+>EBFoZ%kq11?rLY0-(h}7_zB)wz^!z8 zmwffwnE2zf#Y>PCI#cfHARf!?j zdED$Oy9J&I87pm#4MMSut+BS|#AL5Q<1Oa8ST{h&EFc5Wkr-yU&qF9iul2a+6bsC^ zASX2TH3~m-?NJzo0%O1&I{u^d_m43ipp6uM>cnU}?Qy+7?zrP);;YTe9|tF;m(8}; z0=91C2QE|L$>D!!;{6BM%;-8RRGNQ2=a;A#)o+q%%`j{-&JoK185&Xqm8Z_%UHD*vZ%m3T5O>FV{8`IBL@az=uXP( zgMMFNlBYSxdW1ehI`=H#rLCbm54k*i; zrQYLj;F2vd#o-S4(%Xr56uHu4dh_ps^|);t%>!Inx{x@XG;*3eVlor7lCiI5qlKG6Q3WRbb9Fs_U}}`MnQcEv;!`;Zh@;Q*3TGusTGc`wcZ2l z!I?G16F!fl2R!MYD+|6+j}sH{lgd&Vqi1b%4qv&=Ida}M2fk$-K^eG4j2}ALgPb2W zqAB+bWN^-0;}PM``1l!c|K(6cyHvSL+A@=+(fSOq7B%nKi&LOqk@+F?j9>`bLDZR8Q%Q?lr{*LUOCK zB*j=Yxx$hi7ug?ND4jGq&&BBoXVla_WaBhq?2$h9Tzzyt@x1!}|NL-;Y2H`iby4;J z`Qd-42oLg#nBraLF5NlMJ#}MwRDB;yTlM|p;FLoC&D42VV2e=ak|FKzxW*gO`N9_U zkE{vi?ULvq;v2)Sd)AwuV@{$ZINdz>u6v&~CuqPswTuh@K%1WV70O6^`hz>RAl>}y zjFOSel_DwH0Q^uBV!aWWCc3J>mW?>(XdkPT$8NooR&$MAbAg4l$^&^~*Z&?GBM)SI zMRGT6Ngge=HI@%?H+7qZo9?#fr7NrA6Eaq()OK9Fy zW2~sP&8dM$$FmP??-@(2|IIu^(C0{|9}e1`ziy|osOaqSI{8V4T>bK~=hTj5Cq&=H zkFnH{ExRphM>T22{^pQX9|x9qEVDZ)Tk8-}YX^L~#!`EcZmP9U(L3__L7P2h#k9t8 ze5*r8s4nwTzf2bn%80yg2!7`7W^gi)O~OxQARmg6_px??z0fpaw5JC@eg1$w^G&qb z3znhR0xvX7{h3h;<)C3ESA5cVq!>whG^34>hw(y<%78DG@6GHnRG!N3$<*FrE%T^# z+~FL?4&tcssB3rljr23q3{O8)yHT62*0<05*JBfV;FCbtQriyu_Ma7h5@*`e^h=sY z3!Cbz2Fh>bTk6si)13eEv4$m-mxytOIkMJ~Obukc`UT}*E$eS4zWRa6KI0s|Eyk9W z=%;b#cE+2s)iD1J*n^7?bN_6=Ju^vrOyr8QXdm;9VO!(YkNj@X*0`x2oly7Drl6Vn zzIk65v}a|R6QLfPd(jD!!;bEumEA+d8<)k-(3PRmtSn=f^`0!#*rF-L+#}z@)IsQr z1NIEkb?_~83wMd%F<{5jjB6Fn_-P#BZG^WH&OCZa`8OxL{5y#!dn(>NxLeTg*BsK= zrW2S%6Rp{dOR|QL$(1y|IfM0At#^y|r+<^ZL%ZO^6tsk%!JeQFXxvoT>fFrU({b!$ zs3$Mc`^)hk9vruh^?BgR8;=#kq;E1t%1`}oZdNxRl~1&D8b$i4xN-CxgDZyhR|_@L*972I1aeK4&2fs zWe1_|g+V(-o|?l6#nzSI^3FlKi*(w{Gif}wzGBR0XSw&gHe{L5Z+&fpCEJ{W^|Z&Z z@dzFX`k`9z&!-E;M}XIb5!fH|VHezab8j)9`q@e0*4h0|;1TRm$_lf0LiNxJ9APtn z{im!Kp^F2%XzS8&s>g%cqm!*|VjXC!BU&2S%}y5h8h~kh1N5X_H(n+9b{D5nhmTwg zJn@H%dvRUZ;ss#)QBi%`RLYcHp86}+GWU)B7L)l?WP6ml6YsqF&Ov)Hmn*K!!aG&` zBlsmJ8<_hPy&ItY_lyB|o?CSP2(ZhJ%LMX0{SxK@%&pFT_P}`VpRS@!Vnu>Mj>Dw*0S*d|!8LJ!Z{%I*2#*-Q zar`RtOMuuf0wf6w%H{Qx&wqq%nMybWw{+?y{C0w*&Q`sR_c(|g!Igg+ZX0+s`~J`2 zCh+Hde=qJR{selw;;+IVJj#Dt;K7xDSC#*%Du1!c|BqGvNCg7QPqqhwNB(zI`QKCJ z|74YaF8(-;;T~MUzpN^}+E&b8SA{=a<^L!A`(TbyU{QXjRWOg>ds~(NJ^1%9xXJtR zKT#F_XI1_MRsM99e_54(HU0w=3?oBD3!W`i;a{)v=d1ibt@0nJ^8caAAFF5t!uL&8 z{)?;ppQ!R*Q{`V;<=ARsK&_`RC&AIS)DI^ZVke z@WCqohARKptNi&Yf1%1hc5`ZA#|C>ISOn2+rd4;!`etZuowMNj*{;zN9eE_Sdv5V$ z3Aobrru6JN+>`pH+3CK8uF(?W`}RoOJ7>9Eb}q(36h*nsPA?#?AL3vATM>U@_muZ6 zp7NgS=G^34+;NT9DE?T8XA{P?VYA@Yd0^sZ`%2p>b8cGD+cW#7n*&=ai~4T5<{GbL zw+ug-u7%}p+{L~P7B7~c>2W+3c5|}xx;b9i$3M?oIF{83XfN#c(Dq1k0^SM&JJ)KC z8^GPRZYEq;+cSIK!i6_1#0Ja_*Hs}AMpzjut!S>7b-fhAGyf4O zo=T%c&~qNfY&^p=+zWl(?DP$bPB2#E@|2PQmJ4mqT#p-F&+)5vXD{qg4K4CuhsqT} z*Xj1%AV{|t!;Bt97S1EU&8d<_dt4p`0n9kfyWyH1>1+Lv6zan*tc#H?C19k5BRRSx(sZM!fsXi&GqlJC*xzg0X zC|Py&d#9OL+=3eA}2x=I{ zKko0IJNuSOUqw`cPKeqw@0#wLdi!SIy5QQ`w{~AUr3bm2B`Skl zl}(RUHYQG@U!EzK&BlFl5!id>N_k_UY!bVeC&=Y+vTN&yel9^?li0L;uUztbNG=;6 zUzCeomhF6#&6G5GyEb*?q9jkF&z8-cq+H6GC6{vVl}mY#$|e1ixGC(S9FQL+{0M#b zq;rXn{gFu~`Ql1P*-IXi=qEZzD>xR*#m*A>9&+DFe7WZv#sD}?YR3kSTsC%($h`oYG;)D)I%O-rq}&UE z1NR(k-yFb|&6`7Vr$8sU7Xgpli?Jaj7oGQrTomb}a@iOnqofnxi~a@el%H#R2K)~| zL)GVW*^a^O^WCgm%HQSt_xtV<-^~ECY|$K&3;y-cWYYW4OQG$gOTbeu_{(+a`Ut?#;E7V*}uZFr<sc7!!()@9EOPg#1l&i}@_cQ=&aOwkvX+D)us*08>yb%XhwD@t=F>o=V9>N|hL z-!JB^*#v8}f$OfJ8r~k4;Jt}C`nZ3m@SgZxj_eTxkVRufAY_ee$e5lTReUew0Fv{R!N=%buZ7#l6Th zC(aHUFUU2FW$gFp=Pt5ktXEv=?x&Y+10%7_Vg36Bqp-|jo&NtJb@#=v_FU@7 zmbxKH)mN1pbaB?P`EWIj4w+I2}u)bc%<#AA5rQ5N{{MTX%~5K1MvsOa~b#9-?{d3G$)Z1k~YHQN`Ap3{}%%fuKZuA@_)6;|II4@5AhH1dy=2Z-(MB}yDEQe1))^l z*;W22RsPGW{5|-)_zn5xeWfaVU6ubERsJ7T`DM@6;@9ivcd#nl)%X12q-!A4A7r`T zkB^_m26g^$@05cYKO7633u;X75Yv?> ziR_LR{E@?J4?Qb@xaGJeemq-m1QHAuD**9Ek0*n}3-Q3v2+p%LbV_O*AL3P#l2Jp& zFxwjvdPouC5@ihXImh9CB{<%I+5@H{VpUNAekY7TWq!2hhA&^wuq=IxSXg?9bl0R@ zgu_g^=wK985O=u{hxd@UZcbq2@3rjvU3^hT+;pGU*1Z=7TrHqci%H`v>6 zzkM6$#OU|kG7?XfBZXhMWngm--LTi%Q7E`&jAMUgEVJTF&VZlU5L+74oh0wV?vU=B z@!)%U3_hi;gs+i3h_UqYGr6bs%m#Crn>Mh;HyYwx7J5j1dYPsDa7KZBn5n1AP03%D zwHG(Wo_g8D+mYPk!T}6+sA*=&G%{yKfWyTz88@#KAEw1Tu&NwC+TBRbf@{~I?}i5MmMnMxT~nM@6vB7(+SSg zuFKeo+7U;(*z`A^JYAqKn~fVBo!4xgw85D%rq69CSLdrdmG^7q>)Fx376kSLuy0s` zl^cSx-uB5sd&gf4+S5~<5jzQ9wcu6f<5isx@YKIvSYIy#LO&^Tz~%?kb)0 z^^QBFlg4}<_&;I{Q#pPKaMM_&a_l1bgYin>24fY41@D3GUYVz8@SE$G+Ckn*ul#FG z_Kz|)s-#VAJXid;jLAf^plsQYAkP>6GwbyCL|tL*{tI5Kb$ZRmNdI~*onAU_&0;=LZ7{)JPNTdmV8UZvg|lvSU|48>DWxy81(?x>HFV@E1kI2_kRL+G5)E({|mTz{L)#J z{$|{I@Z9eEm*Z;9GbnE}ev`q@3_tvS+~7f_F`fxLxbnYH34j#pS zSCxM{{=LNSB24kGt_r`k%Ac+B-(BVZn=1d~_)U0fiJyP5D*RZLzxvLKwhEpQ{FmV0 zLVgUPU3foT6<)2P`UW>oQ2Af+?L=Le0*b@j}Ha*{P{jJ!*6PCo9bj2nst6=}DLOPKopEMa;*-zZ#Qt z!H04+Q6X1*7c>Uxl#B4}l1m@aBNw5v#1G%(hv)q8d;Rd8av7sMDwi?J^Ku!ZjLKz< zazrj;9fP)@u}YI%#wsmx>71s@Wlp z#<}@*k8!5PU-$fSL7imP7^iLWUF>U5mNeEuFE7fr0_Z$8p_{WY3FcsPPaTL9yz_9i zoGmr@t}{*zccXh})}jA*+I{B#Jb2|S=24Sx(0lD8iKouySEu>NV~HN9KC2Y%zP((Z zcp7~@V`*H{fE$c`?oDBj0iD`NKgD@bZ+uZ}tScW&Uuzo~^!!k^eB~1IXRHx2&c+`1 zv&0*;2|qJJ-gP%_LSN2UvQbf+URNFmye>SzhPB|*naO?RKixi-oae@`x#D)_ZoT-U zKj+L5XWE(y5le9XE$29!VoxzwdseA74h*sGGec9>Gj7UQy2G_{zsV8K4Mp-ATXFUZ zxTBYGCwmS*`hGO=Rg3Dy-uj)6{71g}eaymOH^9i1G+vBmH#m2pQ|`;$<;ZSVG|f4# zRIX$gE1g;c`V!}M!b7p=7?*HT% zV=vZjGW*NFg%*@~Nacme%b+~&tNu-o$~#F}OJ1Wal@ppwS=o#gt}H9-l~sx79_VyL zoW|qY)KcBb##N$cht?<<+rU@Qfb#&N8_nghaF#f+T1J`&5il5 zS|RSv)_u-hx5>5+yx`t1{`!Pu{L|k2 zdpON^%GLP3-u&eOmDlw~zYJ&|;ttG^`OmKYu6sT;);ue{${t7j0^eP>wk9xwol%K9a=a^az_h~%zKs4a}fo^sE9Xno@0SgyF8xG%-_ z6~!B8nS-{zX)N#!(u>9s(io|yohbC(&U($UOb_kj8rxw0LhCiMH`NyVwL8C1x0d^+ zZ(Lul=kE5}?)Bx{YwE3I>2CXup*HN|uP<+`sjK>MmMAS0nL=qwk`vTZh1X4=~r6o<9_a=J8d)OI?7w^gQ8l z+24QC-dDhmUy}KjZstQW*x!Ornn*7`K8y72oaL20!d7e8*_jx2?VqR&jn9&V%SPIg zIQb@ronzm*&6fR?CfeR%{0-S$@euCO9~z|>ag|QzdFssp`{-LXIyDw+G4UaLlsuxz zWd}k9WM7gq&hWfkeS0n*8(4Zk9f$^0yU< z|J-3yXYFJ+VwrW=9Cl`Lh9}g*`DZh1_w!BmfI`NiQh4%GYhUb4&h*I*Ykh2@%2(MX z-Vd`Lrt|dF@z{C#myH-{bCG?<6HaaHb~mgxdX0PTJqUZ2usr<=b5@)M;%q*35suwe z&hagp;4GtgS6ORRp}n*@xzHFpfL>iBIjaN>r=~fplz^||tSg!$PQBK*V(YC)bgo4g z?AjCy$_pDmhAv&KBo^59Qa`Z-IYWpp)Xt=0*tHbI+2dF$c{H z^k?Q8TWJoFhti!ze4W)(exbC^M`1rKwag9`o;x7^Roq&WwDEs-^Aw$!le421d_&rC zw7CFJ+2E>6W2=t*;%m1$XXd!)BSoIv9}z12@_^PNL-Bud^Amj0EWAd3FTIRyW6n;C zrpik;$S(VPuN~<2Xh|ny=>hT-lPotGo;Ud3R*&uYL>r&&Zfa>aKEV`zpI(WyZcV zztTR4-5A+ErhOM{0dIlRJ-QT{aM2i1P-;r|dgofW^$R@^IM zEA6vP?q8-{`tA7J*Y;? zuc3Uk>y{@yoOU5w?&bHNd9FnJTY`u7>OR$TB}dRdQ3zghuEg~8L_e3~^B&c6C8vrP zCnYR2_9))#nJc;I6y<)5oM`juAVbA_J#!`Vi1&KtN)|IdNCB{h5y)Xf^wXGE;85<^ zv%iV8=L*CsUdQ58zx*lZN>rBMWOy?6$p6+cpBJv}IChhFEvxE;6? zq3cw+Fz-x+rM}OS(Byj#S7YHvefOyE#;ALJZ}Z)x@491Uz7OF~kzW@L!yQZeZl7Fa z$_m^R`9CWE>C{&ZE)~~~fYw-fhVKr^Wh}hQ_aF7$7->@ohzW8jXFsmS@(1K+EPhBX zWAS<3R!1o2jgDVy{qMaOz5AlqyZ(2Sas+vY>$Gv+SgjwNefuAym!o5w?wt`u+2I*o z{{8xy-!@$PACVk7elk;T;7$qIu>qCm=6}T~%^Eha$3j>JTR5B@uj!_5M7LAlB%9b8 z@6?3Wm&fej5GM$4AY6H|c6Nd-l=(h9vZxuRnd?wvn{kL=!?ge4&^cidz7!BCkL4QJ5qkoMOzn(MRpT-~9k@#G454JN# z+vPXP*YA-K2TuEoN?aB$Rs!8&W^PhR83M7`fe* zbYk@x+6*9VPm%4bNHS59?Q-R>__7_vd~(A~ z!qX=433uz5xVm3N@nrY3Ki+QvqpPC?^%InbY;G8{fkYh|e!QUGf_T%3r@Un+Cxp&( zwQqMbz^MzGdNjK9iDqr(Ck&MTa_2{E@<_fE^AUi|ogsBx}*%zxR za3>7=@|32YeR)bFTk+CCMH|;P74r@(jIl+Dd>Zgx72qRN;&qYrbn^5G_n!|2?f$xkX1DO@vE5bTS zL!+^wEc=?{efc9k(s-{r?#GCmJP$jz)L~d{5E~8?$X_sGW3Twav18xV9TzvVS92(j zjcj0%jm!Eh;ox%kJZwXePWHJ}{z~p)3g3PJ2BFi z+f9WHW!Y$6SzKdH$Rf84Xazj=?7Liv?W>v4DGZE;iEJ}hIdyAST0N8_dv04S#zlNH z%%3<1xVJ)Zhx4*Ox}iKFuW`p!rPam$@@3d5UwQ^(nlSS>*zFj47~3SFkTu@yweB#(B7bzS0Gb7HJsP>8Cme??NEn9iQ@lTI|8 zZfz9T{EJqEapYOZf_iW@%+2hf_3V1nT{pyu(+A#k z=h#I)F`RF{J@3ur^Cb%#!bRp?A5`sPa z*c&fk>nnDx)k4?=W2@76E_YwT7qY`Op13jD>&E7K5?I{$rsAipR^lJMAW||4)IIj? zl}7xgbj{dNuQxVecR5-L!B4WQF1|I4Ypr%*6Mwq(N&V?Q6WLBbM189~*>DQGFn!5t z!QS`O0_9RCZIrJ*N49XH#ujHh`9-nWzKcD}l3(=&?t~y8*{cda-~LWa)mAWt_!gJ6dx#m13FgT5p+9#*|Uz5hxk@=gc`pqk4E~7y1>?XA=h7P zj@-^2Gt04gzF|UP_n>5_>{ZI{xl0Su%id=gymTi_VEeo-haEQNf9M;_pMf7z>~jgq znPpOL4x8F>fA4Tyw!4w(2DavX`{#m7_MO5p36VqZBFt3wyfzelz08{%^)GPPSZPNOHHBx?2ZJ0ZY8le3I(hL;V*zDhCtzw`o zdo_`}>6h}%sRKjg?twD*c$LRltL^qQ^Ef%$zBRyl!c|3N`EzX+b2Z=`qfFTpl+Ght zHg84lt1aGxZln22&HbdfgG_W3O=X)$_18o>n)5J7D|~e~kZf%ScF%PWY!ftQ&E*w$ zMCF(-uH=y|_^JCbyXO(=cS8JWry>6En7#8`$!9uzpt@4s%iehdw!CH2QfXx;e-ZDm zw0FLt&a-zuSjRl|3&KJ03+DabkiGLeEF=Cc`^ej{-%WTE_3O&gc&;Qln28~i2$Q_a zfcp|?8KK?nnuZ+5hPULR>~=kb-$2ewHp)KmBJNjOguDyvqF35OmoD=>d?8!}yLdwF zVN)J^e&7}|`t4cY8gaHnB9`_YEkn+Skt2cK!Xae!rULWGIm!1q_LlqGE$*LkvTNUA zt;l0PDTdvsi)dTqRSRzWRGQmKGaj(s}FCTkwC=Y*O!%lZK z$c{Tht`q7#M7^lqPj~Cuv*FG;2-k*tz#Gr`_S+k<-(Ew!0m@W;iyqvwNpjE7?V_WPM%3}?}+a{TiA&=;h4 zY=Vv*Md?lOTiYFPIN@tumy*Oxp_h*B40bAnJh&PpZ+>7YKrg#ay zE&9Nq-HJO+oV^6KI@liw_UH+^N$o(i30D_y#h8CwCb=#Hg3 z%d*csi!j}#vfhZWMssJmCAP}B@%z|`=UW@|)AI?hkKIv@=7*h!cF4x*9mqq^mU5hL zz2qClzJLGM`mGtcVQ1mD2W=BsY4Y9#p6U~IUs79ajT6tUp)IT{Z!&YGX?$N7F|96e z>EQbe{IWILPP~TuR%1VOIl2mbpIgJ8QQ0cob!cjSjWeBZDu*=oblhotn@U>s)$RFJ z*hyVuOUIc8KggE3a8uf87IVuM?T>i+-fXRMze~@(Sum5&)`te&G_r55IeXm)BRl9V z1+9^6aqo%ifA~XIQvutYgiq$~r$yXLC!39)EyWYvh_U5R1lx+5^H-ZTNn^yh`xKqW z%V()ookzP1-$RGyucm*ylk-E^Z4C0)-oW1THvkj)Uc|n@$2T~4o_DUbVhVjfn(!(=;J;8{z12`es8>ILs#+Cc4tBR#gw-VJL=+zaN`Rvb^>eY9l26V ze7TeI`OM_K$A53-eZK$R#(S^--p+g4e~zs2KYbU?4&gr^soip=h?sPi1&guQ}IwxJb&e7eM zGal%7IyVCAH~NXwPn>?@^b@C_IQ@?9^kS?vQF6#_AK9(WKktS9&{p!MiM{5FPJ=dS zXpG;mRyywoCh2gJB}RHRYntGe8NseC@&|mRY_fx(n|r&X{QoZZeiKWA1sniRv5g&7m9Rr6+zK`?ag>`>^dd;Oj#g z{_6Q?_k!MeJ!anxCR4LF%^>uTlb1-Xq z>b$*!>$B%Ac$GZoUGJAWyQjOa`&IH{()gx@3spSX&b@*8os+F2X~_Q{WJ~D6MSTmW zT-ae;`0swOj{Pdk#-C_YD8V2xc$foppXzm`qbRR4NvQP`rDu$2DDGQ*e*{<0;)=ZF zS6n^k^HcoSiWeu2(p`qPZ6cwZo1H#$cM=TmN)p)wtzk+;{z}ao3P$Rrr}|ckO6;pU^BTo#Eubznt z?>T^@^`ZAxM9_LrqRRitDu3mgpW@G{3U}ME|4re2{KUTpr~{R^wkp2%rUZ}T|Bt|f zD}TPq|Gg^zqgDQ=s{FsM^8Ztnzj`n6q>2hw`R}Xpf2zu#!hf`hGx;!r@T=ZiTz!7< z-m3J*g`FRc>mNd=^TQYG-$nX2Maxl`j#xPFx*Kku=P!~i^yTWJbpTZig}%f zXTi1C2a9mBf+6DOS-ztp1?B}IE9*b?n zRVH&zYKG-R3oBkGzPXMQ?0FF4Z@PV@A(&U%Mp5j_udcxq_@j%T*5M?JTw5A)VVoh~ z6@P18ZoBV3C>n+B2(lM}-gg?smCM zM8*-O?%r6r$h0;DcZ59JL?v%icsAUbRTciHB+M{X;4%cZk&ZFG=+7qn15hkdsmoaJxv z-4}iLT^+&sLeqU-YdvyG{Nnd`F<<*U;$gt&8C#E(Er=L=6aXx#-iK+2t34^exld=yttwH|V+cyZzeX_QX!V2QCO z2zwu2f_DX8GZw>p3Bo>x7tqr|u;N`DcyNPwu;U5(#b*4UKS?~rrx}esYIg;E($DJn ziGHxWODD=5dwTJ#81o%3x8l<)UjG#OK!C4FY3i?NdSj2^o;v39@DTlllYVCyFCFWv z@~bnMJr}t=A45$tdNg;zH4EmV%wK=a0?#Z~_rkgJXLoZ1-IL@Cz3xNFZn=5NMZ`>V zYMa5wg6>|=o|>EGDZ<7~cwN)I=(v%#*>haG<+3Rw9@RbvM3<4GQm)emm0-g^0^&90 z$h+VBo(@-#ytW+a^OUDCIih_HqlKr6(ZmJLOYAWoO*~nA$#@cfuVob0ISgZ1=UwOQ zVO(2aTpymig*E84sjL}L~`6G?w?uy|C`SlUtC*TXBo*}dop{yTT=bb zP03>ijTC!;k&Tal!;VLG7avURE>6hwI}cv5ySSr!H@5uyon5&3IlGIylDH4=E}D#U z%Z#@*C&HM%6frYpcdjInDUbSRmvu&4aO$k5;0t9hv!nT?R+PCc!5%T#A5sABICJNP zjKjI?VxFIo1ZG1pH(1(pxwfXsGBPQ9bGXjB47l$M*IJ7+#|}=&^)nu4o`(Iv;pC7d z96ES!O3tzJ(cMMi^I$*txs3{t)q&5-*Iq3_SVm zh=42Ucj4|JzXUk5|9oPUc>v+<&KHvm@ka|AzPZuiL~Ym#4RDD5qb~xQ> z?`7VgCb_<>we1GhA`R~5Y2#kxNUrmdV?SSQ*IdCq?2OjThU^;lB=0o2cf;Ub;=<65 zhfMAo%MRN)@@*#HovE$Pla`m?ONpnMr`YI>nok#%N3JmZ-D5xhlpVG@Z8Q-}c{Qgt zIxXOlC;i&6X^rPz5+l8lygMIxGRfR$caC}+{!xTEINjO0KQrv?0@q_dAG99=PwK|r zlVL7}J+y*n7iGK@|D}6pb$elx6TOV|=1+=IaPKFN{lL2;{*$73`S~m~<7eK-oTUYy zjNa)qpTS(%Wad<-xO2_LhYW8XJ_0Y@n;LfRfo^r_jP+=mx##?J?sC1VNT2`B9Pz@L z>2^M*{l`i6Ip^+Y-v8^htkd(p+utwSu#56_H`m`qjBiFWtjke9;gD6@Zm^yJKSsU$ z9?OwWh_eNG;ppYT-kRL*TGdZwep%)B`Qppu7hY?Xl&;2$@0MRfenEWtn}$5)hvFZ# zb#L@fL&k&QGptepy!OSQMc8;@JLPF#vyshR9Lna-3#W6XI_(?aE{Xlz(;2~?5iuHA zTPdLzvX|kiVt3ehus*^1S}Iq(x1hDz&$8Y)EA(~3?}09&y=WIQlJ-5|nHQh)tycJ_ znXiPlqN`waX$cOY!bfbu+Ejr{JunBj(2X|iii_4)7Oxa7E9mIbF2O!+;hxX!4&`&t zxHQ2vjH_9fCM|jAQ%djV>C&p6J?BCGY@M5^d_>bz(Q~>_Pvx3l)Qk$6z?6!7hnQtwEJLjpU!CTURs~dEj<-YxKD86cH)Z;N;Aessa&bn=cBdIO?-3+SA6t+T-80@@Hca5>OMi; zL!YR}>wevQUUlI+XVH%yJM7Q1svZ9eV}M;LwXqrYz0j9)O2x(O$!O&)!IQwZmoOu? zjWI)tzKT20%xm2Gy_fG1`s5bs_oK)>D}_Ah&X&`b>bS<c&lzj~UZ4sSkkjyx*3qUCNBn~oXvgAR{IdSS^Q>Nzdw%eXXT%3C zkMK=v``NQum*mC7dGrN z2uthUAL__&XUMZ>d|64mCs)h|dMeF8Z0hGbE)I0IaExvA0P0sVf0(#;nm{d3VA2~e>CsQJb0LTaryV)%g0u6XzqnwY01%#+LGYs(SwP^`vQeSCyE z2&b1@>UY(COzasoo74$s93|f^zN zc#ZAysnKLxagRsM`0Y+}4E>aN2f%H*k9T|eb{9|8)h6 zm)YvuqTuYxF1`tG^>G0mEYh1dfjlwD(TOSC9#-C)s1cjYBZ)E=)c zrd03XfBAj6;$8z9q$nG_wSHNLEZ>7)II50?b36L2+F~>NPu1tEp5x${N_q9Gx{Q;i z#q#?8?Rmb#%O0*99mx;1SILc(<>8r0EwjZ7!do~BSM}eQ)A!^kBkan-&lflUD{@e< zyZYYM#SQ<8Y%vJu{BA9EzLxOTGm!n@BG~rE!6&VDv(||kb1l}=o!Z#7=p36JBeahF zYf(FN#`^LIWwt;A$$C!)Zl+E)JKKzL)(CJ3hv_#i_vB!{77?<|+0OSYc)L9P7w1`7 z%DEfaBKk>Q)cJB&`cf2GVIVhZXiqKB@A9JRjkG=w%};rK<9y<(PZSIvnY_kwX>QfI zeWl=&yc3^oLw1Pns{0-v2Fbsm59~3I_kr4zBKfR#qdqX`57lP|GGrg``+(tOec?V} zQC}GJVL_iLzM>x-4En^A^=&g=K6c4Y?%9-1{Z8u29aH#y+S^o@ zR=o~@v*@XM4eC?-%!2yNq_;ZkXMaID_rDxH_L$or$5|7H&;I%7vFF_W*yY13ivM^N zJ_L4;4?k1<{ZaUE3VcXCyK*Hf9^{@@<62-}59|x9J$$Q#dpmFn?wv8<%EEuZ+zfo` z4_9Q7dB7&Phk&~!eW%;+MSNZq4&uiE_7!Q$OEYhfUg@?g)w%i)^%1J$Wwb4|Ggq#V zcV)j3^ci)eX_Oo_hTr}DqsK0J@aQp@7Q3owvD2qTP>*@StLyPw#Q9_Eamgv_amh*Q zaWS+CXt5Yt{0(xXwHtW=4WtuA(RZ5S3mCg_ZWo&AO>_{kE?wsO{U3QXhZHoFZ zpm!d6(;sMjqjuIZnLV3%_KF$9j`}w3JJPsDV;9{c*=}OP&$yE~s(0!E9@jow_1*hb z7PJl8n%babok4ydrO!TDT?mftDfW1yGd`LcemCQlDU4etFQ!iJ&1`kLaa-vRT>OA1 zN*`2T06+SzS~KPLXCDoDGBG@PTRCFY+9rKe6X)?~fNwMW7Ae#-ce30ar>%{jXLZ6C z8l#C%CDWUMvz_+WiQnt1H#^O|yZF&Zj|=eQoA6VgB>ob9>aV4(-M~o;q zZ6?n(mfDVV_O%x=)`T9-z#Ylb?$I&!Sl~k)&T#SB=IR$S_@@1jf>-q-c`$)*!fkwj z7k=SYh)niQhUhrG`IC#+qI~rH*OP_2^z&u4dckwU&<=7?r zh^zC_oy?29RCuNsO67_gCq)v}7k!Dwec>c?Vdh5XrSy}We_HDd-N>Hz%m(Ktr@!6$ z$>|BJEzi6YZFtn!$6iwKO0R>DH#nKexrgi6fBaH>UopJYD&@^RMa?Dci0>)Z8@Xbq zKmJRb%)4cuE)u^O&MvTi`aj>n@8jqOR~51S{Fu_SpVDfCZ=@ToEtr<_X}2~y3(aE( z7sZbqG~?7exU$F2o&fFGgU39`9{7Q~W(&s-j)#6b(tC7N4ojwota(g!H@U z={tBM&3PH{xnfk@kAELxYg@G4A2+gaWM@Ji(YhWr+^$&_Oh4hX#U2a0E0E?y=W^XTod16X3qH3U{|0A9vM>SJtc3`PFEw zw%KNA%=U$1Ym9nL=e|z6xt}?bA~qJj7BW6p`YrP(VO;KLVin|brSlkvt3JdB?Z6N+ zEXH9QY3nO3@q+k3G}*c530D>i#tG1ae3?V0?NLs^f8qtnu2+Lmb(5!k?6CF~m&AT} zaFO}LgFB&t=02O@O_TDPDNishG=6ySF9;u(?Jj&dee9t2VT;zG?8hFdE1d1tC;K=W z+70R6m)k9t$Jc6OYF}C-sEbGJ2jFM5A>mPnJr2nz)p>p1Ye)63fzRva?N*PsqwF=* z`AqG1RhS*BL07vunEvpbd+oj$331CuLg9LEUPoAV|c7C-sI9&xCVH!zUH;`d$1}w(_Y(9*PfIz&9GBFZAFk?OsK!5RXIDVO}b~eTbh2w3@NP9S*(6*Af;#a^kpqD4VIHLfL z%Ey&o0Z&1@Kz_OHRqcg5gZ5IL@3rLX;tc$f2jRk+G5%#QLxXVgcsDTybERAu<6pN7 zpMMJh{~{NF{Zp!=pw1~rc#EIhdZxZr_d#6;Z9w&3-43QHAD@QeAMs9gUgKCB7vADS z$yD)6bw2N`!db8ceC^^)eJQ<1=i_xHI;)TH=qo)My83dtnyzP1hF}vOf?0j7`byQ8 z`bw24_*jD}3P#}{hR>8|bzU#SU(#XQwWgiYTJAH&Brr;c4fI#(s4u0Ta&=niuhM4& z{Z+cG^jGP&(qW~)HpPZr{Z%l&nhx9U>##}l_3N-Pa5$L`J0Z>*Gx(d?VY?~L{7#_5 z=KC$_u4?09E3m7XB{ssMKNAKE!90`s)K1d31I4 zRr1++?i1V@qjW1Q@sRSA{&+&3=@WI;SL;7iw}SP7i@d&Ec}q_f4k}wRR`CC^Ll$}^w5{jNbG?zUg^P6YsF5iJbln+#qB!1IZ3*9i#_GHN&E-Q| zl_?n1uc^#N`Zd+3@(;=laGmf+;QGM1@JnF>eXz#CAEN(TRuUf3Sik)Mb*TE?Nxe4t zaEMp`J#c*BkzW_ZucEcfL!5OJo)0`iKM9Vf#4TCTCa_~C-Q$0sLiZR&Ud4ZMmm`_g zRQRg(5OT{%(YE1_NQQHSCheO289HCJh4E}-7TpFLfyo5lztd2P{Y68mr%(~bYZ zIj${-4i_|Muo7EiO7q=Aeek?d$d#t!YMy}Op2XeGd94lnh7P?H-(PG{ja8wyYHp=GmI@}6~l$x z-G>vB*;f@qx!m0aXqGmHo!#+Vu{X|K%aoMWYj94|7&+81Ic0?}vr0RGKRkIuxho00 zQ`VLbk-h~wN6cl+Gj9Or4NfSw%4%g^WF#E6rY2c`CC>Vm$yQr(8@d|vD4AvSi_Cjr zPjAM6&girM0bMVVV;n<1DT}!jc%p~2;VZ0CGvTA;f!#W%2YA#5jnNVM`;BGEjOm0; z%X&5yYjf!88RjER@IQlhaJnzOqxe#ieK^UL%tw4y`z#)uaD7AR%jt&>)^ffu?5?95 zk2U|Up)}t0f36rIPRpAcN+I9R-uLHpx0R96dGfB(LDpXrl-rO3erPc+r+y6`Dhq!@ zPiP(bFuFzTt=JkQETp;=KIT`gY2Y)J@z6|@`MktRYo?_=Lo3mXSK86b)>w4~<0%sW0b+T(S?63?iIxz z<{)I>M|;&8!M9Pcfv?I?c`9c-^bE>6z*=l&e4UL?80_1Kc{UxIz_Wq=ma;drJiTWXANJX`hG1uR{_F)a=c7qU(ld77;Muy4(pp49k}d(vnNR*LhaKRVZ% zmIn61Hr8i{?G)+4=8%<7{+KzbA46ZlEci4V^x>PGqr^F4VskO>;#{6=+Y5Ug!+=FGt55cz2=xS6&&pLgwdlRh?!JSLdf?w}0maqHKe zi@nt~_AKJe=X=;(X{jAvK7viybkGJ_zbwFe%x~-@56#WOlkbGTN=?aO=L68blknL1 zhEkLD5j&9~jy3G4y<-crd=>lB3((WsYUAhNwAB z?GYJ=ED|ijv4#91MfP(}87Zs&G;WDlYb@d1j18!;x!h7aGm$ltRT`VAPDjR%w@mz< zq&KMNnYkh*Aqrw-z;(7RP1>eAHM)@NH|!_R)4{CRiS zj|cqp1?I4Af)8QtdVSW;mAu<+19>C9d~@wp=8{-$iwgvc8^<&u%l$+nE@M1J`6LCJ;& z@|DbwWa+OspYPgRqaFM`^Y_gLZAb9K>q%sLO9Gyue^qGX9vQxS?O=%UAO7w=>}!&(uU68zJVCxo%&j%p(5R8^6C=K? z<^jT+FO~fT)lsr|HTINSD*T@VhVT@tBzx4FlM?JxDO+$?!YsH1lZ!v~8YRB^AlXmX zo(Z+VEm}89(FQZL{oFIfpbh?_`}bwFzvu4$eR*#ZTL$SL9_$4F8I;F-6E>r`dn`Wa z+?u2<63;BKFFL;5Qu}K**Ew6>eV)s=8k08_HkA#&8OBoV%zO?WqRpAhtU_M0-fw>{ zew)CTaP7}k`(r=2*5M-Nrn2_DN61I};ls2+Y$=r2ji(JhJml(B!b|%hcBCFJ=CPlm zGXyEhk*yH=*Jr23ho3zF@AoF4QGD1oO!m$fa-~_6kKSw3CY=~#6ZID(w9hzrPEEj* z1@$%9<%qG4OPF*s^&Qe(re*1Ku5T!5Zghb5Fc4a4iKkK6akTL@FX-;$IJU2b*oZe&GE_WUJ@pR9RA>j>kpPmTZU_;*O}G3cj4v3?hpme{bv z8P&3sQ9YuUo0m5Uj&XK1k1O zf*!){?~qMe*U?@a>+#MYISkNv8+BR5ji{tC$^>@K-_g6u`j zG-yA`tZd8pDp}I)$ss60YKX@z1TaCGo2GRCDCN zqP=!x;JpNAK=R@l`riz?RGvD@@dFRFed?~%Z?3YUv<>Z*ikK_PS{u+E!n&_74ovkX zYt6vdN&Fi4N#me~B;$@aYu*Jm?*l4hLZJzS7=@NSFXI@`FT&)Kbc?; z0kU3gNccbSK2O$5)(L;fdeKI*{&~Xp^ZikMhfX6EvVM!NZ?_WmlJ#t{m3SHlw~>C7 zb0h6>Tw~ZZCP3JZR>&4zhMWIAyF4QCsX!WY(jp z*WYb+%M%wZ_BbmVt2+Gw%yfBkMs;}tKa z8V~<2_J{xVyAW+h^oloL_M-LY|N6U7Lsuz#$=Sb)#{av6ec6e+FFS#1c!6VTAiEm>{suL41X)z7<)=r;G|L#b{~*WRr}`Z0i|@x?gDQQC-QKJFKga`}a|{OsoW)tjZa0SaFNh~Mz(FBh z9K22OkvR*O4#Gp{Mwu@;A-|oMP;QV3VHL0VPX4fm>4boYQB&nVF_*{*C93>@8@yx@ z_eAdTEM)&8$YBPbb^cX!(0ixvpNu=g?;hWuz?IGKqrU$OxE&Cr`7AH}a{Qfd;7$h^ zO8F^W@Q5zo;ukZqV*zRk|0(`Lt6?Ni5ai#FKX?=$f$JIw8K4psu5t(7g^hVolm89C zQlLU-@?HLTfDnGAcMs2E#eB{J&mw!^pSN(KYoXosyXFvj7WuZ=bwYOD^^3auxTJV2 z_~KKBUbEo(p4oG-GBKN*(PpO?ES}ek^`Lp_*$evSEhLkh=k+7Grcl2Z)WpFuZFQUMYJPbYFJ^ka*#<7j=7=&b{)pcf~XICOjh$ zE@>7izH8ck(TxlHM7DdNx9(%^eWT~@_uZp%8Hi5D=7PfK%f-LX_aE{7iDoZ6C7196 zzCU`7=ie!p^!t5($3)LRQ!erM`2It_e>#Fo@q6SF-ok-q`KQUnABR!pAMo9KfL*jWVii>_h;+{-&_vGR$GEaX_`qhd3-;%$gq2n*j$cM zuEJK5M)6gqzA24t&IfmU9d>DSl7Ih)y?23=s=D%jPt~b@(B0C-BZ`1hC`nKe3nd9j zh!%>5D2XLtLJUb))7=QMfePIk%-~o+i!BdrwM8@#kB>~8#F?~-H(?wyDQr|iFd@-Q z7~_BDbRBz&AP_P!2{9zx?{A-Tnxcec=Kk;8|NQ@V>hsyP&wj7H_S$Q&z4q(va>m8P z3girk#j3dC+F5h1oO|K4DOP1o)wJr!(Ae$Udh$5OO<+U-~`jyKUQyH=r;tvU% z^om!FDVHyrm3hf8bkcoHd^-p`RXnxGT)>cc&kMtHA2C%mIVz1ez%?&<)#GOV$j=xWy{J!AgpFhvv$KMTbCH(y~LygcPXNl?(UH#Rp$JmKk?1$^>|Im4>E{|AE zZt7z0JGWAo54v#G<@L#wC%sz~-K}joL-g*(6!@lv&dp9TS7grvG{0YW*rw2zK*}|- z_&58}IraSx{V3`Bl;$$xhu=v6`uM1SIhefQiUWsFyYT0I!MySs7P$x4{_4<>tmDn) zPWI&2K6N0<-M3qL+e3G)rx#=MW=hxj{@m2gbrttqUhPFQ+{c?rdB1UTeQ#pMyrbHC zW5|_W{v5(czwlyg($}&d(y85kXzQ$M&*qNqZO`GKCT%|DX&&2k^%;jY#VXwj?&zq) z-1}GC-4~WRecOjFaHH{DF@Kir)g_#l{V^r?)8QA{UaRt^j7Yqzs4@hf^lgtZe%Rdk zQ4cE#stwXCHk0h>mjBxDSS3>x0 zm7z7^MDE4Ir}=lLSfhS(=+RM`Lw$muIe0X?y6|=M1rI-@-``!v`CG4UYW>Sr!tDh< zZ0BV=p8ILo779mq)u;PgEX(ahwA;1kim3NWZ`9j;F5@A1RsDn`W)7ZZIbKxnf@110 z5z85d`-~`Id(MpxGwwvn_{FRtg;($+%`oy97KvlWSDz8y_Y$G(IJyUT0sFSE^Wfzp zckuRu@F-l_y&Auzcb(~u<^FXW{Y(nl)BWDMugceNXpO@0;^-XoZbX=tvkLoTs+;8w zBW%RZlCXV*O@RhgzUuxq7=}u3>bGe`FhIjAhXBJ!?wLo&*fu7R9Zm*AN!qu;Fc5Zs zF@(Xr1RSfr(3k3=zH)S`<61#J`>0Hnr~6;Ecizf5 zeTd~F*IyFiw7aN#!Fi`>)5aP zF*WtpGyCemK}Fu_>v@!LC*?i!IqYmI*uV1(`**aD$G5r1nEgNN_nCD+)>5>mB^KC^ zU$)xq6`kR(wpg2~2>Nc$_1=OO?SKv$4j!gy3=M3Jpo7*PZHxAduP&nRUAt{a#P5H! zafCN{MGslp*t9EcY}{dc1#YbiS=2SgJ{`TY7@z;&!Nre2YOQj z9Wwe|hwtR3{^4C(Tj5>d@2cEcqN`qb{VsUge#KRsSYnMEv+gu&ZK4OQ2TEtCbhYp` z+gaNcgQxKZ=B|M>>|LwN6OTPoTHmZgUm96{6)mbR;?8U(g?S^h&`x4OK_mEd^OaBMRBc5>#9Z2V{H3(SQ zew#X1C;4W7hu+P!9MW5>*$)_;QKH;9=ikkoDAny+=`R=b)(ZOChjky%aPqCrlfKLG z>f-DvcGkO<`IX28^d;+6_|I$f)zyVc)_|>eqkC^8;zr14d&8GqtzGkG%i2iSU4>fK zV&dF~qBCOfzmeLnr+nkdRpwn$?S<9)vG#{nQ^zPUh!*50T0nkSEBt8PZ3lVMzTQ95 zN2+^R-^eK+)`p00)|uI(5+|Po?r|CXE#U&*m2`$7j@8)C&x&?puYtQJG2gu}8g-+< z{2VZ=?s~sK_iIaEU)QrPSDEX~9imL}#u#loIiNxD6SaxjBc5RI1MsAIFF<3WbmxSz z7mYi{(i$tE5z1CSmL6REIts6g!V5LFYu!fjfn)%^uOgm%pA~iCABGPn1HXvMw7@+) zO!>$^0!)TS!#Cv@!eIJH0E5|go%7*HXIV!AFLTpcO9Q5)OIxxpBdAw7Y{G|NyOOwi zJ0{VyfpIqF^?tF#oaGN;{Pk4Z`^^N~d$Z2=B7{e%Uj#lCi34wZM{zW1Eo`NYVkdZi zg}n~Ikn*fN=Wu&yXZCVE=H!ulz3i=&}#?+nJ7{Xdu?5 z^BlAb{bAf$z~;Qvud!}y?j>lJx0UFl=VV`Ey$l+Gj()q__Ozd4JnurCi@(Mjy{i++ zr##V&_I8hpzl1JeOaD6we;41{@BVJS>#*z6+K2w&zPikgVl=I{q}J_|T=gdPX3XkS zomIE5;-~Qp-nURE)x*mkwdD>}yKEm@5WMhN#EPGpDvb_meaL4y#Y}GI7+~JOQ;Hy3O zIrOcr6z>2LHg!!Q*~6MO?~QA1O#L~UTUUtotSyYk9pz1iI?~yHL;g<6i}76(e8>5& z4Zepf@8Ej`-$R4%(R>dJz7u>855Czu&)WC%;NGDhVbeE$pL(HxQ2zO1w2OLD_EFq_ z!2A(&3}a1up}&Uk7-^CjV8zeWCDr@7mFmU43$yd}Na{u0JK>oxnmrQ{6ZU=lzTZDS zNT>GnytOKs;PJ!v8$pajxObfhx+g zYM(o3)1M`)gyo9Y3KsF&)9}~#dyn$o!=*ld7EIAZ&K2y6qqO49Y0<>W@9dMm@8^2V zdG}Ah(Dr69=hM6*nn=-J)Zf6V_XWF)=M855LY{Hxpq}xkKEB=bbID{C)O*}X-Uj5o zB?B*Y^yNL^U|zFNZQL_9;yoi7maK7=;lnSSg=K$=uyhp&fg%J&e<(1FJBG82?k9NK{di*U#fYv{OAmCY{7qdnLi!kjV}C~%lv_cBY% z{T}{b!+$sQpTi(qoAtrz*wQaCC$N@}s`s)N)SIz)#MFAv^uqw}>Lz-Qa z6uOHm8XjS9JmV?&nv&3YhI`zZ$qoG%^OmCczU0MN@-g;$@*WGk-NDf3M|QNc}HO{5WBXukdk%*9GCa(;`Xuh?4LLgvW#M(S)xjT=SDK{ctDd zjl;ilTfH}&cwH;%z3%n(-gwe&CT`TBE|jhK<9&s`iJr{o zthu=))1q`9T`mWAV zgm6)|nPX{=rmLxHzzpZuQj^d6%mf@*3-!W)Qb4c;xI=;m# z-XZg!5)~b>M+?;-7j)cHup& z8{BSFzwTl)^2>}k_0CZT!Xj3DfWLJ1B8TM3x2FUBdfd}EU7cXuz*NQspU<;I2Zpau z$2s7wbpkwvyqANk0sLghpZXg-{g81-`C{~j>1}6&Bl1g3jCrE%7-juEcc-X5)b~b{ zpVFDWOPgqHRG(Iw8@X#mysh~cz6`&xp1O^(z2@~kUz@k0-pjPsd%4{{{s(v`xG=D( z-g)o>PrHqG(8BuFXMqt|sxpozymorvI7|Duz>LjYt7c(cz>kBx#B-kEVA%-r*aPmbv>VW zgWdV83z7HO4!4ps>oLxKbPcw+<8-yV5*;S{$5$QmtkvLoEx1Ha@eS#V2Ethfco>~+ zVKC>8*w^!L9r%cFH%b&-ufBx&MnW*p_HMgWcQg(4SPrjQ2;QdFAxD9CgD;D^1CMB~ zH}CWrTFa~N4rSbsEC7y4qdaGjPQ1;h-{XB|wTtf6Jx&)f(taO#OMCJ)_RS-m#*Qb| zR%#=aNq)k6wPcSWF8XfL=b?3M@msasB-RwPH$9Xi1|csh>;mA@oWjV8K|WDr8O`Ub zxho|mS%7mKszbzb>`45IXncqhxfhrO+g}Pc`q5ly^NEsnK280|a=?dVUo-c6bufNr z?w3HmomxK(n1>N|23rR9<2H4WoF@5WK5*?j=k4;%3*5!2a(p^Td7`uFdFY0|5INuB z&i?ggkJe?xd+H?VzlFbKq%ghaDw>Z7kIE~Q7uAmHe@1S^mMoS1!?BTClO0;a{0Dq1 z%syA^xtF^(=Qy;cd)B4UEa%K5$1R|&|495Bh@Uf2kib z=GViUpn*unISwZ{72K8C)vox+>GUJf=IKTHMiRPoJBmw@11H~ZdsE0~I{C~aACpIx zv|)Y8N3>R%TkS%Bh0}+yKHG`zM|m|leTGM6p!r-!@l)J&{ZHhXrCrnDa4t9u`Ke%8 z9rjC=j~P$g^lorYe8tTQ-^3f}Tf#N+gy~b1SIP(f0lfSAQ!9VTmj_e#bhWAya(V>w}w5PN+_*LRJVR7I`9@2@` z;CIj0{5^?PxT|qj-{b4%!+a#aDW9{Ub>)#pPbT+;gZ+2u@2vOj^8$CMd(32!@hE%l zVq^i*MS?PwHZ0406Bg>6l)u)s{k13VUr0kAtXs1tR2|NVLVF%MIp!~(mvC%-o4g#qd!#G)?n@Z@Rh91CwMzR`eNG8tlMU^u4dJ23*y*%7n$;EbI!0qImb5Z zu@?xfJmh=}J|9(X8@|#>umcCoQ`Sp2XQQ?X_VKTg^S6 zqD?KQ?@sopN>8bJ_OKTJjPi>6d0FVArBCwnhR@MP6{Ioi*jM^G`AF9BqK-pb%=T>H zwt=%2b2;Wx3~Rgllkkm9oOR*IBmEO5F$d(H3F-JF6WB+AeqUur7^~`B@IE9L;86SIyb@cl*Rf3 zus_LqLpeNEj*pMy`0g&gKw8CDnC^;*@m)c^^L*REH)n(Qs~%C;@pj9f?+U)Zr})9Q z@)3;H+6?iO2j;X#YFh{k{U zXkkjlBmL4t38y-fDLqyyxuJg=GWx#whQh}#+Q53S(9!MTHNZw_q`^4aNatY>_N z`Je;+WSI+fVW(Nw_+Uq&W)SAlweBit@>$k3xF51m^B8)_u8v|&rUU-&c=xPZQxI>j z$a0Sg`Bb~mfYM*kQF!bZcNfM^Tve#q(8-#}-h)N1>V4kdt}WC!9o#Q=N5AI6 zn%~yB-Nm1wTmC71C)|4z;^ZRaAJObS_RXz=W`(bs^E#mI?&7l-tt#xvJm06cp+8kk zzXSf7_p?_U_$MMK?6IEf+mq<+i&|;dj&G-5T<3kPhWRz;)6xO%Idkb+qh3DftQ&hs zZMTPa%O`P8?a|u&A@Q@sx+#Y&_8TTfEj%>og4qWYM|c)~_wcTlV9^?qWa@7L&sf%u zRJK+7ql1St&#`{gdvJM)-i-YV-ZWrsMQ)#}c|5d{l3YiA{pd4+ElWz*8gJQusy*TL3+`D1f1LPjx&G-y4uOV^v&W?Joc~Q^mW&b1ij@i{-^|^$l$=i~dZT3fMd^CK` z#m-|Az@DUkCV>e<|DaEzKfp+Kk6Il?vw!l2GY*M|e7?e}$y|D3UpRb8blBl@qc(78 zFQ84`k!L%qsQ(%3lPAVioo56%6r9oxJVKtrYbb{bZ*u>7o}czN>uoOvo+H#n{7djg zsE2ft?62ypNbZ0)??6W1!Psoo`~$RgAZW+SzO<@vWcGdifB5>U!kfeH>;L0Ds|ttD z})ta5;b?U>OwGK%BdT$5xpf^~=i^KR^PZ|GV zWbsY?>>qWXR=ObnZKsHj&UL@|$iY7z+r@ys-=eP$h9<@_2dg=geif~z&h&pPE|o^&wy`AMEn~f_3`Wy^$yhfGQ8SId8mCfwyJ%O^!n|izAydRVcP3W z+Um+$YvePe+e*LKHY$)|X?xM}G2k+DOVKK(oF@&5p&JI@Ta}J_Y$K0wT(>D>C+Vdp zi^LuLk%1FhzwIbyE}`!bKjdwTp{tEmmF}4Lu>W|{mEP!Kgj2p?zyFqAvzNH{oCVCg zXZ3w2WOwECD4uJqe+2%!<)z@wZAzO^3D*aT{V@57H|&P`HQiKUcBk(p|0~! zKU7U!7KU{Jx1t65VAaYYjqyl47k_k!GsK2Rs-I+dzpb?_u8Ege6@P3j@xbFJY-@jr z|FB&4B)_V9y${-uy!IY!&1pFgZun3sZl6RR$v`s(zrq)7B0j9V*QdcDc&ngI)sE}H z!Cb}wS7Sn4@lxKAN%UFj5vF@|%u3OSw;ldLJ&F_IJLO}}c_-nAE6U`Lf1&O(LK>xQ z2G)CkElU34vqwT20=|vFcP{lVZ-al1StAwyra|oOA3ml(EGG?}MB?|jszb#P?mQrm zx?%VBtBp=b$$Ogp! zCi#6cn(X+t;?GoigLBcT@a~V3AEoaoz3?kuW!j8zjro(qc@KFC*0Z1Oh^BkiMcF4+ zF&>%l3zgQ$24um{jDZi5)=E2Oey4Axj|Jl!`*+w2M1N(!NM|r+Eoa=%!N)p~&jjwZ8#q>9s?22I zfiDm)9WDK`j9#PA%Zfl=W}L8BOxjRUp2usHDVo+gi)l~tw$WD}z~9PnA6?{@39cet^<-qKp_R&8IynoxH!OfP+M-HYy<@th?p_d+{H7zV=Q#<{l^Yk8)bseM!`2?6OH`!xyXEvbJ9cuX>Gr z`la$6X->fL=PGEkbC@ehA5enhDDAasEbVnZa3yFj2+QrbMr#U=*wb$oaxyFyVk}Fq!jx#8qT~iqQg*ywCnGUxq+u=q@ z+qRTFqY3QW?=1X?aY1+t(?)Io?26!9bzREP^w=BjD2V4pa=c%g24DAd7TTDL+0c>3 zIJZjYab|nhVec(#gKOafnv+dtJ~)Ya(b2K+USQqB+{xlhKqR-(ogtaB>nnwo>_^fX zZj}CVn0JK7YRsAqjZ=3s=b-;o0Jm^m^8w^j`biF&vxjsPYl(Z5u_-%@xWp6Q)W1}g z`cx#ZHt8fToTdLxOepCf)RbopYr z+^F+U+ro6zN%cT4^y*Q@t*{KyP*&p{Ft!HcVN`HZ4)bBjd@q*sq%G`uNDz11&|rK7 zhhcjOe}Y{&v=ZyVVWX=)GtR5_CfLMxQ(kfyw&mk~d~daPq!D*M$Hoqh|wWDb^Iy4*QrMulDBR zjyjap13q(W3ffN`bygQ@$t#{+T^LO|)miUU49c!`=Ysc|Pj(b$bZzPX0W_;Sn^Nai zdxLs9-Ff(#eays96K_x#x?0X7XfL$RN!YnNxd)Ro7R2LRN+CtwYR4quW1Mvb?Q0&B z>ntd)(#{~9_Vbd&nM=CS_cLGS4qlxx7=c@LND;S+J9o8TSoZ|hW}Qc81bL=_dA#xe zgva|$Pw&Y+-)B3U+!vRjzsa)Z_1(XA4?EBIjTRo#)L*y+7pjMJ&YUv#(&S&;wZ;{G z26Z*L+RJeDN_6`DByZJBG5* zpNO{dmDaQ6{F%3$NA4LG^|I3hH?UP&5% z{VmabMo^bCl=q*D6OI$&zshGZeX<<)H{e%_JH^|L{8`SwzJ*_T+G|KVgEl*=ISx3T z3hjk>jnFPuqO)IP!*@UEm^PYD++QOnDz45Z#Lfag7HyFi9{}IrL~^3;m9`Sdgcuv6 z_1pCc=7f@g!nU(~-mN{sQ46|Az$bwxdRv8U`jxN4-G2Dk z8}kBP+LT~#xA>ng6KWqC`;>{Vx|YhFqGide<@}X%`y-_{5pT9E$9tOhyGqYXs$S2M zPU)|t&y?%L4*mXEO{nJ)48yrw-7kNZR}<)y`pGlwM|Orjm^r<``TQD(`J-iMH#MMd z4Cz?<1@0%P3Fm2|Jz(f#on&O^ORPJeMjM(oPZ=G>n0HotmP_9P$94Jc;u~YHG_uK; z>LTua_x`}$KE~<$!O%wLr0KrpmDX3aX0uIeAK+NDpmD^k<0QyKenuze^gyoTuW6sq{|4qujUZnc|W1urLeUh>!sr=e{qxTXGTC|C9 z6-i$49J=Kfr4y4rOnR_T2X^W2kI{{0c~utjz2!Wbk6hOmWp8}cx`MTuw6_c0r^0Q* z;bBi-9)xp-p72>-Qw4if;AeOI{@APPi)(&=Z0!ZW@eHs^FKhILYM;2@MmhSj_F7#A z>_)z#{eMZ_%IB+}dFxnB{36>MeiEMO^MvcX>)$#yGEG{^8KL}|r_A2bon{VoAM#~X zG(DsP`8Dn7-CFU0OEf0H3k8#KtZ{n|{6=GRso$;em7SxGw}s+eOT4I|@$0;uF>9B~ zV_X|(?}cUK7UAq`l|G*RC5(MB-jE*T)2JhH)17TH!)o3p4`@LF@n`X+@nA*-64_jr^t}jq8(cl*d(;SO; zQb$fm=&Tuc&VJyL{z~bSlJ^bFGam<+<@st2tz2F>AHNwRANkX|xl!omC{uIU(|^ys z`62It{-7Jx`K#k;_q^sJaUZ{;J)du?&vkrd^M`EoZmDnL_ig(8w@dYl!>OC}pr&oW zqw4z)(7yCzwb!(2YyM4bqWW>Q|p(tN=&x^CM-PYFEIo!nE=H~k#t_@>C|*iCl=p`r@XB(W4}}Mo9&5 z4YV%)$vs%FidRo4$1SuWKJ{htDVOCOc-PS(CHSOHyTPaGVswh+t@c4Cg3rSP!Jpd1 z;8*odgKy#t;1;~5!LRVDun@PE(7A9cy-6u?ZZz9n zeC<>9p8NfJ@AXmj-acr@;G4V+&Ry(0CXOM!=D6B}8%e4?sdpNg8+&kCesV(-*yvWD z%?D+we!>qtv!-;;CO>5Aky+Lz)#fU1yl^v67I+~q(HXkT{qw@{Daa38+t9uZZC4G@ zaS#?sT>c#XFY-n;_h`)OV@~FeW32zI4*Zxa;^z#ZJnpAqZWs77*F3?$`6Rp+zVtR; z+X%fKp{*x}eTRAs=v6H7kf5#O@TG)5-U$bc1>XeLZ=UYR*<$a}s@us}2TH+mpcWV!@?nQ8Zdu*ikM2t0i zE_&IIk#?)tZz0G*Tk;5GVXgB`VZJpB`@PuTDhc}~@?(A$a|n2% z;T_aLyijXo(pTDs7p8bu*w^Wft>K(H{Lr#|o~ZkO1dH^*>IcHXZSefC>~O8^5VBXf zuI)X@5a+6{z=@1x)^z@fv~%D`=3FLt6~3ov9!a=xZ41ZrA3NP$e9)>wJ?hK*Rwi9I zdsoNMbbkHNWPZat*w9ro-bKy})|RxNLp-aK3pCU=6XO0@le6wFsJ_m{kMyrP7oMtp zXxr~EvS*1proGFwm)mllPJs*EjS?NZI?sD^+im2In^~)j#V=;gd|e;wHD8S+XBV{3 zTkGa2){R6b_5f{&UtOm=Zfd3mF!^KoC;Fa`TCYwgegrfSU*#$OFo${@ zyb6c-#ZR+5U&c`$^6M_X$sP{jIg;isj9{$z^#Sfq(0Z0D{+aSpXOSm$6TH9Gx>kNi zu>xbkpDgSMd5@p;QvcPzVE-2I^?tvjFrG2?O7=dSkN*XjNW8_JfPLPOm-;Wno`|^! zqkSQ^^`(8fzeoG#L|ey>aMuI--F99_yCJ)aP6c;`=pnNykk2;u%Z(1nyd!NL-q`;> zXzA*u8_a&e<-a)gMnbwK>K@7rGdTxf!QZrQX#7d9@>FhqcGO!;8hvj(aO@40IW^Ez zR0!t@e|(AtdJ5)ZuZA>#HL_09+S31i_A9ARC{OMC-l_Ql<%=#H#x$Gqb|9}C-T}@` zSinF2o_=ZZ(>@Q`Q)<{H0OQuLd~SR0@0i;Xe?T`unNi+_gTEDzf&%6Rq2*jFrN?chJ4spMO|&)gKxGRkACLQap@~vHC2b` zr!RA6_a_!{#wWM*7r9%mSbOAHISei3c(V{S$8=d050dLOSImosEe{ zx`^UIE0H)leZ~ZfZ_$naCP7CLp15CfsKq`VQyytTokt|6cs@;7+3sS7{g8T7C+a|V zJq~M;gwx-u^P9{aOFADh!g`Q91TpDVg-lZCo4KDUv8mtOKUA~f=UWdRd*k6jwyV2= zB8jzyDbAMuzwY7=nlAQUx?B1mOK{Ilf^*jRwUYk6!FBFr{1@`A_hk-Oztnf6N^f;@ z9~Jjaji$Wex--W0(^vO!mki%uqMW_&eyLCIzhp_r8zt@$(ngYxyGQU}2wl`ASG&qr z`6QGd`6S3s{d;njw?qbQ*ted1l!xB!L-s)j>h$fU{KMzz9q%r5Bae~??}6cGb7#>) z;&ts}kIK5OX1}4u*;UebOOw+*?SnaNz0@~?yYtl_byn(#y{oUnAzkQXb9WoQ*aWJ+J)jv6_X<+2ZISOncIP6)x>h z9??9u%UF{U{pozr`a%WtA>D@Py_@`>`?c=;NqhNUAFFxl*T?pUdld~0(I3|wJ@zVB z*;4ODH{De2>F$JR#$W3<`z|O?vZt8`0+Zl3GEW-0--^1oCs!3rze6wc+^}h`&MmGL zFF5;-H?G@y=rZw^a-C5=PQN7HYt&u!e&RRqrIYZ?r`i9OW!#p2Lw!bN@1Wo8p-)-V zJqm2%cfw0AXP@qaA81YyrT+FL*1fIO{ZBKW*iC%J5l_^3`E_Ij$y0xeoN%f+)&XQi zGY<{Y>Hfkw$X1&*Hx2y6x1gb?KStaMJ)9M#9gif(^lQAZlV2Q|<9`{x!@XnPPtdW% zOU4VO-vj?~Bh|cF1x~1=_V}Hx`%GBlv2xwTvnH~CuIt`@`R{R_>tlTE+thTY`vvB` zqMaj8ywq1iU)V<;w=fnek3D_tnVB8&?!Wcj?BVD9J$+=4v%N3sraUXh-i)r52G+x0 z=DlxV-Af)Ci}qx8_YH;z9Cmh_F|vX-7QUYU{jpuhA|rJt-*f2J_Qqc7tC-`DqwyQ6 z5ACFH=&gv%x@XM$5r6mlV>jsCjELi~eu(+v|8=N3mvMKF8IPIf#z$5k+EW4C^tW32 zo9JG7Xdmy`+MS2K7u*+$zLvYxA&rRF_*jX^Q%o?JXxBDr2_;n57D;2 zLYCED$PY4(y+u8squ#gBQ$t6+(A|rZiBm2=b9cqtJPl{aY9@5~X-1I7r=y1k(hMU_IG-2YFM#g0 zh5KG8cVqo*@4L)xUCw!F-<06de*TKFtK7P=_o0vAoPM~+C4h4wWgca&X5!PI{4|o? z(31_B@2dT)@+%9x{rdEF&KaSPg-=?$E)TxvBBQQgeyIMW{um|S&(ohX>a(poD!)55(TC()6-k9K^Up2a<`XL()cDF*Z`UplFt zWh{9}Ru&Jp)n35%QQA+iouI$T9M5 z`JExVYX}XW~o|kE-m!X57u1D_L zs`Vh%4Z1LELwsvou`TCEs;}0EB34R!An-SH;g`+a-Rdab3eL5sVmkF#_;_esd5Oj( z59tl^Q17HYrQse6%eupL>T_~8Ic(CcKT-z zvD*4l_C$wz;6~v56>sf?ZoR35&Zw{bEuV*Uf_JkQBj?-UXoqc(`V2AKu6&j!N_=}IjZ_7c%6Vlo7snNvHqYoFggt8m^S@i zXTpS=@LZVg+se~Fw7Fw~9G)@t9sBEM2yn|R(gR0h0Y&iizZDCN!JzQ4IH z_v~@5NwP}!X`BtuKG44j+N*55-^js(`>^B4xXh2u-HsXL7Z+ZV?{!uaU9$71x{eew+kxwh?D{ zS)8ttI9%5M>}KNZDT|{rcHp;H`Y>>)I%W&ip4%HWd|%_M=vjLpgb#&FrmteJBl8mf zj63Hlkr_O#^O&<0$&R9vwC^Xs`-KOM-&J|XWAEmJ(v4b{L%-5~N~f>y4enf`?AHXB z@&<;{2Q5=(;w8(#Fpl~6c+I6<+L*F!^0UeJ_ON`)V;!z2ecbIyjfEXAmhu+q>X*`v zb1CDk2FH}qaU11jQ(os{_&n_|`LK$<`#`jUa})H^D~?$QO*>CNe;x72uY>Z<{(9<|=%wFL2jNolD4hio zK2-mwfbEsUYING@VaVIi4zNn55S^(krLD?#7Z)NEnR#)V@-ys%e2KNaEb|}o)jl?h zyJjO9r&o8IjEie;&?h|IW7>V8?Tzo*(yu*Sl8H7mFN^dz5v`$VZl?Tor{(l-O25wj zBm5_%$+yQZJ4Tr9b4txdE+dZCV8Srnl_{PwnsBvgs6!GRj3X|3CzDUjqK*P@Qua^4 zPcnvhuIS##B$T6fC4ay^LGJYIKYCxar}y5{kE4HHO&)F4UIrW1;`ia_T7C zB0tMwFB54;;Adg$%`@GpQcGIx^Fb~frngC1533LjJ}Eq6Zw}_!+CLpn0}pwtuZ8#Q z2`_4E1GCdzocn3$koFYbRR5WBoidtQ|1A8twWW7BYE30x&ubu07ai?TM!5jDMA-ak<%u#Zjr9!R__eR)hwJCbG zj5Dm#afU1+Y+!FghCQUnDD})ag^T*k3x*Etb5A^PfBbCg$GHoTJrKZBdcLxrF|JfvTYX07&UQlQANO-e|>L@`NTyAKv5HOu0SKmvE(f;?!PBXXhys+KMI|#_AQ6!CgZM*XZpj z_t`k-W`g_hUfhHX3k-f;iT7dVqiQSK$M{)U$D^I#f0CE4_bNE^tMgmeV6MWTWZQop zhPN}lD#AX?H@blRjo9qp*?%2I{PXMR&ntm{JNetRgZ#c4_A`ei;>bHPb(n4%P^Jqb{@Hn&?X8D*2?wVB;4XJ&jhERq*t5ZfmG^OGW3Qqdqc6+B z8@imn>7NSUggUm|NMtzUzNNO${?j-E@6^8T_*B);Utt;mC+oG7^}4je{K zj4(bj78+h_!LxIm#Y84F@*rhabRioe3)ZEncbfVOzU*;15joJvh>{7Tz$-Y+{*2uJ zTKSNMGVzMz) z$%nB(ma7hAxw`*=EO$>JCq_;pUv>szCzCH%o+K=kFC`zIN(L;RLXPWU(aY5(H}rQC z-VJZk+_O5(y{+jD6&u*=5=%IJ)$nR79?066E&XTLtSLMd?6uU~&0$|$b#_btlfj+7 zk}J_Wd(%i`C+;-z;ymDv7@j75@twuz$h$hnJL!xU?ls7$j1Omjfc?_IDxGL&jyt58 z2Xz3OWJ|#i+POG7RLF-C^IDvXOTl#xz?<(BS-l1*l>b+ zebDRQ=k81VwO${_8-aT{^VRXhYbU+lwJ|a`)JIRXGf_9m%dMLMJBg(di8ZH}b$fvmQnKN=y}I6Yq2h_X~qP z&;A;~y5gm3Q-}9x*n?uuK~qQ7P5DI=4;O9gVa7G-*K>t%e@E*Hd8{qIOL>5=ljre8 z^7!K0^2nZ$2QVs+{M+-07&tbQ$7b_Rfa;((aH?JPgB0VfX!GvkAK4crdMk&)Pv2FX z@KK9++&Py@d3tZa&|zGChrRvQO7^#rK0|tRjp-|(vov@huF_ZN&9KDA0ee`f@EQ{U){SjZh4i+UGmGCJNV7h2xbmn?sulnY(wF~HrO-Qn7#vE!=4 z^iAD!NN+M}=i)c-W8BR}9&z}|2+B;HLw`>Bd5lgGpR|u% zOCFRvRc_^#QYm3ZqZKYa)+nj zD?OyoVUn0U?FB5AE=Q?wInik0X8?U7=Xk$I|67+^!~Hq(A7YK@2k@07>j{J51EfoyO}I;V9%EsEQRxz&vAi6-$4=u;fEU_w3hDN;Ca&;~ zErfN^AG_Em#rI6Yy*c>S9<%P?yP0pTy=yOx z_H}gx->rPF2)?s?w+G+te76SQ%lU2&zE|))FZk~K4)FG*y!H64hX>k8aK!f}zDIWf zJMPWYL*wrg3a2je(|$I|1(U(Ec+>D6;QWrCSAy@FuGK{cxAwm&fALny0Ne1Zc2*bV zH#5hY3~A>Qrz&?BW9nT+>Ry-;xqsha=PvGAyQ^qr;Kh0N&JcchgXPW1l3$MVkECgh z)7}>SBzsqJW*cLRv%YxXZ!G#QbnT?PEO|>N7@pYDzk;}vnL~tY*2K+#mv=>%m1uW_|IgPg~w{m$+$-SL=(CYhr0+I&{sNmk)B+7kjo?&;oI~ z)JGpEjwbH}Y4#GwPOUF){gCBVV&@lI-e7FeMKu3FQGMzNai(_hrXhKlH&B#^`#^Cg z@Wh#W2%hQ54Xi0!p6;+QX?Yi8GHLXVU6MF;lsCoFxbT4KH?I*_@zg&O#Mw=KRo9t( z&r^J0jdndyZ01{OUimcPX~xL(hJKgt3B;2-M|cLmeL?s_zN7G^y+M8&yBy*e-i3Uk z@$D&-=f+|y-_Hc!uTyW;wK>C>%y*VBx%Uum;U^v#P269s&{zWBXjeGpA28|fFD}RZ zX7Ig&?^uHP@V^+mNqtIrjn0E}{A*p_ABIoO=)vDjF~;JTUtL`B5`9d5d9@>P&VuI< zU;L_;KB#t06CUMzE;6;@=gE|p!N1m8ReXv&jm0;k3C3~a4eH4ik8H8LX1+r{)~dK& zx#H39Sl&Xu)pyn3vq5}IJX7(ll-Ex92n(5?JZrj;tF3j#sksdWt7_A}>J+j!Mt546 zJ0JKC{f?}n{YX29be028$vsrG2w#C)cVY}*J*L0LTF043hqo&UcOEK^!>=maRjhP! z@CnBGu7`?~@f%M13gE5IeX$rP&uBJR9GuG)HNFqxo$ETjBYBNAxnd1&t2~wS2CzGjCo{!WARDefzjS_jc-x#tvC_lTB$X~2y#ml+onA` z$#3%>_Q(hK3rhA?{*pOG&%UhPS#0F~@WbbhVNTg;?j#QP!d(6Ou{U)0cRS;$?tyD% z{4`~fR^@6uwi1+yk(@J$wX5#DKL_oO!#h<5ak{Jxg|0j_m{?itgx&_>z>NtoalF11#5CjQUjzs;msc|w|@ zgo!R=)_uia5$81%=gt%23?j~Z2op0F??(4z*_arn0#k+Io;+(1My#8?lGbS$&iz?K zFuX}*adyk%Y@qcH3cVk$)v@XD0 zh`9(e33CbNJ(%}l-jDep=0lhi<_Zk!p4LY&Gcl}%TAYov&}*5uyFP`@ealuOrWtc1 z=Chc^m@K9Za|`BH%nHoynAuH@tt}VNYHVM$6xaV*Keg+hGHUZuqxL_U5lw_fv{7zY zCbmkAXeXo}(NJhaOCddprb5HHVXM@L)7~!DyWM0H*wRvi2|SgQx0iVf)H1ZR4L!Kx*6oi9GcZ?UW@0{uNn^@?Cu@KC zg*5P=-TtLCAX*6NAhg4AQFhqJWtWeO|2y^be@`F(pY7)%T}ZAJZAeLx!i2xD-PO)v z8<+C%uuqrvTOp4v=dB6ijt$H?*yX%b ze6$q5e~NcbByKtXJQWWu=c6Hh)%VJAJPp6gF;@ge{qahS`s9Z(>X#qEsBc~q81>PQ zVm^ks7Nfp;9cC70Hf9dydd$ZI^9k&^m``GEzCMZU z!g5cRUsHC`g_pK3z3G%;H!f&sY-(S0OH0E7>ezP5c*^`Eu z@)ysa*e0Z$q`oG+b;06WPEpSwykS|(f(C<@hPFjFE@_y*sF4g$o!{~Je=1)9U)-{! zU30-Dehp5YXMm(XSQ}lliS9a-(Q9wzO69*G$ts1X*}f-{=#p`gGwXbZhqufCng>I z!gzvP@x=4=t6K+;7)a#9r*QGC5C+A|Zt&-u`qnQD6VD32<-dw}rN1yNgC}*M_xL}> zle`-K!gv}#2I|W9w~0592zMAyb_v*AmkIx5kkZ(sHc)-z7_~)dez}J&>m@Zt@C)+` z-6ykcayv0zrJ;l21Cc9D`)WM%f0d?e-Z>g@YtHdx=p?nqyj+P}^rg1(f0bsgAl@Fj zHKy$eout<|cA&(43Ez`T%9HFrWdK2yMi$7IgllZtSK__~H*4p?uhNV|*%G(Lp5Z0= zY0OENgoi0*+eVXe+{Z4%o_#`#D1O+h{4}E%z4eYT#cHxW9qjfjbwtcVLG<(amd^7=+V-t@MYmJ8`Sc<&Kc|X56C# z_nElEpVGez_g2EyCW`+->;o~&atM?Adfe+P{5r^e6Yib3l~(Rsaqlg0ufx3$cRmQ` z{p5k4(maj(Nzf=7Q~K?=QxJa$|0`wje}W;Q6ee-WLfy7W$sLwoBMzVe#-wY+`E|oi~y&~@A0zmzb|v|D0Ba?%>63v z*N1{r@>G7mEDNusobade$CbISD06?Z%$+TB-&y8QFiSvdC!4*V4V2e@~fYgvd!CjRSX;Sp#v{3-r0 z+*8K+JWctZQx-nG%zZh4@N3@ zYfD&?^1ramJ+;hzLz#P7nR|7a+bMHDTjqYL%>DB+ca0`#!B6m=UFN=|%$+WCx0SiO z%G_TmbAPAI{Zg6x)iU=l%iO1xuyDcqPTWVB$h-~@629M87XA_3uQk!%8PgU1N!+ZR zTCW8Cb!l1r6=m+#W$p*c+}|j3f2+*>a+zC?D}_J7Un=CueFpUie{xSLbBFguDUQN( zW#L~gbAPMM{bHH>pUT|(%iKocro#BCytBY#_>=p>GWUnd+`Jz+@KgMTGWX48?)%Ez zkCnN9WncUzfzZJGO_GWU~Z?yY5R zYvRl+lKPvZzl-(ve*L{yfA7)XCHiBkGV_Y}>2HeuCizK>$0QRr$;6#xB2O~eOfp$a znq)DlXAX8t%d)nXhW2HROWKUjl9ta0GstC3=#AISL}+Z&e63|!%aW$RGt0!OrOflj zmi98ATW^_kaYNJ6?5#nj+4f~7&$hS4yxGr?S=Tb6n@Ee=8klzn0ZUq1np>K!h6Xby zY*^I1=oS;HX<#%d#bntxS@?;MYd+ z+p?5k;>bmAOWFzc!9|VG)X=*0^9^ln4K2%jzr}4Wlis_0(t8`0v@BiXgQ8d^F;vNt z3Gw2V#Z5uYO!b#8(lnXE+7~TuS-POP@m7l{1gVm3Z7s{%FSc%JTasM{ybG+>rAu!7 z?Bc8`Xjw~Bi*ykuRxNuov*`g~j$^)USyO=h1vf8gIvyjtG<)1(q8mL<5I0cch)R5K z=ER`1t!?SD1~X?q9^z{p`~;$+1c%Uhtc_7=b4+HP8u6@F1AEfoPSzU6q>0(4p>nKcM&QyPr#+dv)g zJprQQMK5e@T~J>3@z4_iYgj~Y0He3GwECT=x#iRi-V7^Hi=IFvKIbqLbkcBBk!3B5 zmqN0~sYt#wdEgIYS=!vPtf773vX;hXKgZ)q&^($OB-lO$!$-X%R&= zEn0wPscGqw1&eMhOQ4d&Y|!+zEFlv^KF9M536NHqzo@;fp{=pGX(`&gkmt0*a~3c4 zc?62278<&JX~W{1TiX|9TU#2IE`YbH&3v#-uQ;Ce;^VyQW-%{i6lQ#LE1^m$&J$v& zrTKV2Gq??k40_wrWuU9AA!MjNHNufUXEIVIXsCi_5}#|Bzx3uM0b<)4O-nQ{T5_Y1 zWwc@{-fsjyk;w)!hDni6z?MPDEhO@rCt%EC(QPe_H?~NV=Z9p`l^GPa)0m5WfW#XY z`LMS)E;9@_Y(~Rf8*c`er-%T*xH;Q!Q%f+4m<-!K-# zAcf!NLZu;~ESW6!*#dn1;%wUz4IOYrNWG~cdlNaKEpBLR_FLcJA$w9BoeVNldeg$j zC7`~9b3=TquZh&I!p=aH=#3F-mpgA5h>^e=S>TRt{O^*Z6 zAkj&BG=cLQktTdL2uE#UlwRs1h|X3voZiy7Y*8cfMw$0& zc*;1p93Kx(8E0Whq!8@omjn!Zz++0e$K>V{e5Sm;B)}~3J!wTx%ymjxu~SIzj~hN1 zjBh1{PB}qZ39EOa@7oJC;RBh#rQ>Cmc%H1t(%{Bss&!(SC)87+ zr6ry)CWa--GpNMCu>AJ0=0%MVdNUopaaq$s4FIMCVUxZT1UXA;E$09Trn{AJ1x6WazxO$tY`pgBVJRCI;1KZJf#Hu1Iv_A5cSHl8Vbx@_Vv4BR^c_g>j7 zI`2fMW}{2lEgKx{kxkuSkuWWGenrv|3%BIdcSr{Ib0$<=(_3x5B4SlEV%h9!> zt2*-v;KSx|DeDQ@SEBEfeU)WBCHuqN?;?AKWj!PNBj{jdUrl{vUqgPfS$N$c`=gXA z`(x-LuvM?RbA3Az*pmZ$dSK59>}J_%%W9Q<9eT0AUJ=-iZ1Q_5u(t;GYqDq4p0ck+ zrxEza#`*Dw2X;dC9QFhS?zC(cg6GIa89!I{T-skYdX!dd8y#&_ya5HsJ>X zI|I#)`V91TIre91pXt~Wf$J(iURE|RZi3d7ZntdQlc6!;W2S8IF;6zQUM~A4=uUPk z_?5jFyj_F61U$$F*3C1qDQ7e^DY{uNdnx(L&eBh0f6lTJ(CSF~#5io>aeQD;kpD8u z!4_O|uETDi{bje&Z)CUAFJ!Y=lA480yiRQ8mzVn%{O4dpKh3hK&r^Zz2KF=1oYJ}2 zO7}Xp;Mf<~2Lk(WV81E54!R563!zn|pF$a-!A<+@g*KG$Yk}s{Er0wM+5(P(3r~Y2<+EoUkv>~bF$|)V*^jCY~V>iTY_iK zXR(3j2yG~Mjs~_xTgn{^?CQX-lMOs^*}yYA@E;NQj}H7-U<;ln0z0-CH*ib|Y|foo zqy7Rql|2dim%W1ak`2A=lzkigRrX)f9}t zZ#(ww@JVQ66n)`<>>T|KoT%SU#vZv6_++o5KgeDUy~yrhT#$VS`&?wNppkLWtmenr%Uiy>l`xuX9-w(f&-A%j7 zegOQ)-bnwE{UGCr>`mNaBKslwt?Y;CZ?eBgzmUC|c96Y=@kI8QpnKVmz)xg5^c&fa z!bfF42A*U;PQSsnPlM0M9!$H)uBYG1j?+G}hrnND4+YP%htY3oOYyg)>?eRzHtjl` zHXSvKdNYkNYOaY*6PI3;NKCq9(k01D-Z%NZ7xSG=CQJU`J9%;dR#qGqZ_%HF>SXt>FORg#CUM@T1JbhK{!|vh8clHgGVfkg4{IkdNkCA^B z`9IL|F84@~cdR7uf5WemGe3tdKd-~}7ydlMT@KqO@NVJMh^O;m=^pOw&u~^O#aWYh zSF!Cvhx0jI#krh!dE%2g7wdTDe#lg7A(ma~PA5$)waT^95A-KeoWqV!D?Is;js4uu zTWGJ@NZ1|j2>g{FE!e;Ovm5)L`bc;Gxa@}h%1q8parQ~)m1|Sn|D66r|L_dw(I|f= z=g6j~Id7Bsc)!lH)mcCKSKE5NSZDnhdq+{{RjWCxs(Mbza$f@Q+ldE@y32JXWVcUl z-rUxmP`Mt*wo}e9&P-Ntj%En=EL6}fMyf4!r;x?@ZOd``l6+TVrYAUW%vqlleXU%N3)02#f!OvqnGF`7IY3y!sezb}aAEbLM!o@i*~%_88yCQqJRg z`^%I^x@fA|jbvNgXl|h!N#Eo~;;pXEOA9v-R8+Xpo>sRGxA62}Rh1h}w7R0L`(~Zv zcE@7w7yse{H|nf)H!U3R>der+)5f~BI;+gRM7sC4IO9(Pk1kxJv({DI z1#mj|bn6_q-as1;ELG6-2Hsv)2DkpCL}o*47@S=y68nTF+Bsm^8ZK~ zKD`M4rDaeT`up_4Fkm@Vo}VC3-MJD;JALlxh&P>nD*p1R+wS0Aga?Wh@R+HT|D_3c z6a>THOvQi5N_Prpx%blkQwS4{t{i)Z`{aiPd7|yV8+=DWc(xPwaSj;zB#zFl?Ir)$ z=r7TgE_X>h04+XHR6FRNkLq}EKMJ;$>N0*xBmc?N!=-)hkJ!-G1I0)${fPc|=0wLn z^FzGFp1i{y4-EIkVixaxR7AGVbSL+0c}HFT4)=za))(r;`+!65_}Y_JTdSXDkOYsl zJ*%u3{gL}U%$)=i5@+;_f5y7LsOyE^Xnxnm|C_z@fs?AZ@_pUzW@eaap<#$15N(hc zBB(t`T#^uN6caQgX_XjMHZ(XWBt%+3L!!GjFe35{6ve8Z4tQ+3}R-HO^>eQ*KQ>Tg% z%AWq*>f+3k;Ynr%c3=C#Be>7K(UaBcax|u4UK|_$fBZbC&j>z zU)FHa=zOovn92^e?hDb`Z{bO{$bvE1xrYY1OH^m5qe@3U3wtdn4dFYb*ST=$Y?r%OC(Bu@}8qrqlX;$x7+`et%my6wW6ZqZJEZKkcM`>%~?xGy|^qu@frHd`i z%ce$MH0{0**|+B>>AhK)PvXDZiJcAHSYSPcJW}{SI<+M~55HSvO=n;rsr|>2_Q3F9){d z$3X+z8y4lqgZn`}xZ^w8UJB8thVrdwc+XoKijxN{B3)at`wY^Nek%8l%r$MrozQ*4 ztS>GmeLRaj2F_(?pwqQ{n;<@zjTe4>pe5gdOrrDa!GxU~ZvzATtDW+?ci6cJe3vG@ zY(dQAn>xmYk6^RlA?svlAW;~?ouR_L@Qy41|8ixA+^NPac`$ZzaYFQD=xt&C!B|Z( z5XRp6XnXrM>>(3=c11Aggm|y}1o|)*GA*bN#a8bVKcNpkJd}PXyaYG3O`o0Ebh7)K^TYk)+4A^3v8kr`s$`hAIPV>$&&RL_ zjg6v%v_XhIZ8FQTslphVSqQywpIg(N&S=wE6rVqXvFh+Wy=9tf0LFdT%F?-NUoO&^ zR%@;*?513|EXt5QXN~pG^X{Rp`((;_h?Za7WEJXZOT&GC8rQbFHjS<-bjJqqN5St` z0_M#LxGQj%;|Aj{#*M{&4;8wHNi)-KEZ!PzEH2A77S}nA#qp-G`2PLa9k3gVvp;JW z>H=-WZ_@W=JGBKISiRFuL^y!f7ZZM*xG?F1PT6MccE-vW^dsIPI~qgISN|y61HA@& zL?_ywmESGmu9k@oXWT!1Xa3YE_JMk--;BwhAGom)hDPe)Ie|fIN+X~VL!4-%6T9H2 zIm_}rXpboOiXo3>O|M0z6_(`$@kbAqY+(u$q3s~;pnH2{v+VhRxo7z4>x+lZH3bt{ zQJjvAFVSTu_l<}ygKA&y0z$^w_{?a^2KpMhkwCum}wN^{3fr$tGkgacqg76aIo!?)m>ol$;)3TehJsj`I=)n zcH6|KEOSg^i237hD^Ab38oJhd2_U0hBRb=oex#Xr zW4D*~<=cwea(1pBS{qGT)u%3UX})u#zFGgQiL^W)h``It*Kz@;`WZush4z;1co zt*0Bl0vWsINgrq8HL7#_=$?Cxqk6~pHkwb&6Z@OTaGmiQ^eNJ0`uEUrTqh0Ca&9U{xt?+>iIC|!X@B{o1?-Nnxj>Ii9k_+sd z?o1d(9c9xiMLvByk(>tNSyA9n?Rj=I@JH*n$mM;ScM&LScUiQUteq?jqY@- zhqr6o8f|FDa9jRqr#<&*q&@c@{bzG7n|q>HHaD8~4IN85uQgQuz^b3s*;3iN0ANehGIu{sJp9Fae zAI(v0r2(7d=RQtbaXj&(h*N#*qPk0udJ;E~IN736-TgXGAg$^ermmy;rU&z<3oY~T zj+3pzbLTM+7_K`gug*O}{RGovF?`@t-8c8zmV2UUTkdDTv?&RG64=J5Xg9&FvF0HI zZ1CX+Dc6pwpSP6y5ME~sH`wPDkA}Ywly75OKg+z>y0yS^P`&Cg9X>OcZ|5@hx9j_C zykJxpaG*Xanb>c0zi#7VhwJs+bJSxKax3qi%C_gC@N4x8<&~x#pXl6`+d&$|ZRWRl zSd4Oe*lCBQuQvm`+wvMyI+|Y3iPrZvZF2j(?(i{xIJDL8*9yP?Ux#)D>7(77<~xy7 z>kAj1a}jcTd+9gPmvh@#AL9PT+&lkuXlozh^j_hA<(tQmtC`#8B=@U)%>yJi{QXbc z@}p@x!58k;Sk%2&;mAUFtly;eA&+acF5|#&6wYwB0la4izr&H`E`HUHnqRB!o}wMq zPaZnMD(vmtRMMPWyy_)>*G8;-3vsp4U|#e57fYs8|ES}nu6h-+ED$ehj_E0 zUlON2t8#sMycK>cyM!7a1!EANs5#4u`hcT$m!12A$Omb7-G$78nbWB!{ldM2Db~3D z@#(R)$4zYh<18t=a!U|?(tS|cx#*k=^Bu95nL}Sum_q*&{b;Ojri{Nt##svtvIP{V zxc^V^2~NRW4Ws7f8rP;f^dG^NZ7&JG8aIX0a3}YC3dh7PV+}-WHtRn+KYs@EE#cVO z*j}o)mpQ_HCBAz=zruMeNL`}TC7OOb25fb_-++DDq1(%Jd=Ne+d>eaNQDvLhoyFlc zZEc=ne18~uVqJwiv1I>DBi>M!Cql@j-OW{v{g6?=2!A(e4KL%j;8!_Mo%4&_d#C;)H`_e(#%<@P^BTV; z12W!kV~pRn zk#Q<8x~(if(2usBy*+o5aKIff;y;=r2;Kl~Q5RjD4<^I=mH?7Enl5eor>kRs|Y#t)dM(y0G+zi>ed78(li$O!RV3L^^C0nm-O(*sQuxyE5Z}c~cNTTX_NESD@krUTW&Aho zrNO(Ht0&i#{)0O#4SiqrNCK~L{x{S?b-B^2i&asV8r8)v+n~IidT0&7uSazq>REeQ z?A1YQIrF?a==XGf|BgHS-1&EQW$}G$Wl?kQ_ZykNjiCP71rED0j@Dd*@XbBsvvV-> zZN3{!-PKkalb`q@tH3kZsTuzcnMbErLv9HzQ@D~JVtAtncj!nHSOU< z?V95EGvGvWsrtn@=tZ!Kj-FAOHntau)7bMgVU7K2ukoZyWZ}`o%O0XX_V*#KA891d zi7qt$NrqEDmfWIoP%_&SO}lfObGvi0Z|(LyXhi)}{cd(PxQ2#FNBQ zGyPDH4!btORA1FkkM`YWvP0uPs=pp>%XN2umH%Z1;qzgA*>mw!$M27MVc|}XU6Gf< zDof8WoYH?#x)^EnjoL$x@{78^%Kv=$MiKP$R!o+3Y-x5qe%u(|_`enT@^Rq1j5uIR zDUBYbJGcDP{qN_&_Gwog6wwVtO>t9{|M}_U`*l#vI2LVm?hu*X#e?dB4DRCC#|c3* z?=;SnRD9^?r?}%ifBG3$AB*K2Pvp$24@Z@8JT?T9PgE@$BYKR>?vp<-*oe2)XmFBT@FX^ z$v3Bd+l?u!ZI_cP_Zel?=;m49x&hT<@6gJWsZ!vd`pp?GpfjgkH@7R`eS6&FJmuh0hvu)+MEd}Qi6 z2D<^s*DdlPoK5m!a{cH#17N7_FsuQ62=k5n#h#B%TsQnWX$P?2KZ&#h*sONwZv$Ak ztt0J#zU1fm(@CT6ZO@O8HV94k!9Rt`M?d`jr=W8tUp!wvymg5DfyN~92f%cq(yMIHm-ogwm2{6q4i=z_@~M84!XU@$xgU6z@t>pV@C57uQFd9E~C^n9=` z%W&$=)1}MO0H;5^CzWAN&Hf=n=;8ay%kMxr`XZOHE^1!W{-b5=y`7fbDLs@|y6z+| zr`4PbEEW{kk2RZ9K57d6&oTw{b;|ONI|o4SVQz6y`YY(ISjj!5L%Uh)PV6a}k7B1k z&bzY+>rM}3B#UpXD2{K!sVwQUr9dKE3dXY~Ux#I9lU2BD81q&3Ej4e^KKWT^GtWpM zUm^De&GOQzpPru&AomZAvOdUMN_zy7*W%}v=Q`bx#k40XJS5KwHtsw<5X4q(Bl$H3 zqOJ?Fzuh+wYprG9wQtJ%F34W_Ch{2{wF+7A5d>DjpuO;5d=>V3FE3mWwO5`KwHIoy zJ;XdM3QQ($cQX9!8e%k0oFF}+&KC*yWbZkYw)g&o--1c&6oT{8&$Q-0#e7No`R<-G zbA8z?4n^%;{93E<;2do0diRh7Y|2mKQt`r$M(pWEu(gYPS)W~18vU5XoM=_a2L4)u z{pjUZLF<1m%o)DvkX+hY3fXq9J9X=kZ7q$@T7`yaYe{mf)@uf4%j>6tOKH%ZVf_T$ z5+@m4?*{_g3*m5KcX)iEPgXLscNYS1(3Rf|#lGsWZcdN9igh9MI)rym{gT4DG^LxqQ;X^TR}|JZG&n088ZyIU>sPJ(%+k!TNA2b4Smg{lR-xFHE=-pBYR*d8 z8$H-4?~209>;fqWSj$`8(dMP~U(Z}dUg;$l_`7f~S43_O1 zYu!@#)Y?}##`n&ul5lIqT3vg{A>Qd5h1G_lafQ`Rmeb0b*eZ9=WoM4}PQ1`V?GP)s zf!4Ow2GT`vaUcDL6J}jzBm0tJ<|Q>Yw4POck8Xqeyn5DF)w8y$o;$A%6ymbqEIKpP zmwMMwhtbfYp`PyhXxycj8r6aH?mOTV?WyiH)We0JI;jr9NNY*;5bQg-|4ew4opjp9 zr7gWzeZn2zKu77yTn%-oW&h&lLx;Aen4gWEZ|9ouQ`_l_!gDrWcx#|39Av-k-9frb zc@=mo!y8nY0PB^^f7vHIg1a+_9hd8pHh_p1z3I9hKgPQ)LJ?!B`33&#C__ zBR3RJ-Bsq*;?p~appOwRuYbEV?zYQa;IFMHo-W-y@pAF-1Ue8=-m7m%qO2=swZ^=n z6oi&^?{iNFTpnZ{$m@HWn`J5}&>>0i~s z(}w~l`y0=jH2P@ZTYDK{GcmV>-)?b?6$L3!8-Dq_F8KHlo#tBjd@Q9s@#Uhe9tQnxtX!(1Ht>os-MPdZPvQP!+u+Am>miM)gdi}e?+wR9&9 z?OhrOPPC_|u;_=r-lH}VynzI;f-BLN_WQt3eIN2yI_Y03 zoz{B9ceU@pnDKbn*pDa;bi!SKm*q(N80j8kFYHO5=Uh6Bdt_+8PeJoqUsqkj)Y+{s zv?7{O+jr3n?a*acKSKL^^nj%rmu9r)?$V6I-cTjIC~X2qS(brjoR*U4L%159USE6# z`WMZJUiAKWGy@(AbLiLF;|V8P9V{{Co?@I4eTZIE_Ja$n=%fP9FFgJQCrsOlruvCK z(&f9$L@%Nh1APSHk$5B6w)^KE|D1CNby0h(Eq(gz z#@b~cXwqUVMPFyDe%}TTfYoe9i2mPMm;0YtkDI7PBJWXE^;ECNB@pl);=R`BES%CE zYdvmRMP4Lv)5;%)t6YyeUb~I{AzRUC%z|r7>Q@^W61Y;RRG3wa%tJrBC^p5MS|=(6OHnwjJlU zR{8s**X5X0S3I&Ur*bFZX5zFi#x&OK#7!hCg@u3rQ9Z8r1NaIrtO~Cr9PNhGj<4^3 zSQY<7Raj-s1+0BudBv*uU5!O-;7vWlfWg(<|n!a)!sM_SpvEc1Gu#dr( z!zc5P%u|a<$0^TU&N=qNk?;&I2hf2Zl3&Z(jC=?;4nb>eW1@WGN7G>xpO8;{RzC5s z%O`#aZKwEA@`+z7pZE^>#HXMKt@(s#XRY}xBdykYcEbSVXGtS}2j9xqIpF?uzzO)L z(Ai~bpliW|m5>iQ|I>6{(+GFTp44fo&ad%I!kfhi5| zy5CM|IQXLfoyx%4aokm>mWJh8EvyEYtlGP}y(aKO5tx!kPS*n(Nw=GI;Fv10^K%hXfufcFk;61{*reVdO{Qu{O$C8srAy zQTd%lzU#V`;dEgH*5koxoOb4az#v?MV;|r5(GJV9%bZO=UFPi0+Bv^XbZ+LL*`4$2 zsj~oP>B6_e%+~_mok`|kv{0rq{vW-MIFh%n{V8Le$7jxKWa8 z9NXdfGs#2YO`h+YQS-;54;qI?j5zVN`+l?o&k^HLM{EOn3Qj@iHy?^`DAqA1xc6;m zShHe21s^Sh;w#aMk!}(1;$!mz8AtjgRubc8rnN`f4FXO)A0PmOP zSRd-Ia?5A`76Mya*I7J&FI75e2gjWCt041jcMU9V7sjW;g^}=GlU`Zu&Nvq`6B`*H zf>zpYTpcn_sF8JC>3p$PWkp(@Q_$nS8l5j=TA4%6&ubl{_TZ|L&e-altH#QM^M71d zJD@fHXb;ZFk!E}>Tu{0o>4@8ZOgPfOkphmS;J6Yvu54sH2wF+Iu`fJ*%?ZL%M;SG& zsR7GtDogcMT_Y8B{Zs1I&#RZ47i)-GGh}Sf?N4oR*GE`;Ec9U>uC|ZZ=oO_Mcg?~i zGw3hU-n4zzhE`(e%y(pp_4Zw~F>8hKb?6RyYk_>LI{}rK#_`(JJ?`3QD9QJ!&*ww2 zC(AUGU6p&swC8q1FVbBKWQRLh#-cFmMfAH}k>vW~JDJtFF#g@)?#?^*>f9wempPLj zhL+HU=4OUM$YxF*9q!P+y&j7$$@%mnni4$~XhW^JNXIXhURLzi8|e#XGfwi+aNz)1 zNbnBv=w54E12b!ib=fu0c!uAs8D_u>b=DeXpUmAw)iDxV{@FDUnBGaf1k42W|9y9BxbK6HUoGTG*k44fs`rJqQ#aDhrXF(#YQN9NLwAK+N zPb+o@Ymdu{!@V`z4#RWwxIcoo-nc)MpGS@RAATzG`PGsC)a-4Fj$9<(ck#&k6lkP;u{XLB5 zhDv_WxW9+-?_n1c<$pe2DqbD+^S^W4&r+Jkb!7OiN8|okU7_;2#6^U&xWzc7pMXCO z;Qe)uX2P2ZkN4tl#@9klh<8fAOkwX){#w@vAydV@cvpxx+REjz=h_lDnx|bi1>=g7 zzcb_d$={iBeN$Pr!WSu|d*NnT@uE6>Q`tr=*Lt9@QDI!uH?*o!j$y|WI~~A&3jN?I z{Qh)=36f`E;LV=@KEB>d&{VqV_==zB`Eh6}NxX~=UORX8%oCM=n$8_LqO82|!MY2{ z;gnw?|Hux9o(wty!v}L#HWn|W*rN+#qe6G1YCiY=h`RFHdN%W9#yh(uS%Wp(LNj(C zJ_dPraPRAmPkU#t$iu?cMUXpdS(`6RIv?vJ5!>DW4@S~`RhG(egdu=F= zKbL(Eeam@z#f1m0CC~O;IcdiTs_u#UpeXOqV>p>S6wvV)5Y7d5-_nPY5Z&vKs z=Ir>go!fR{v!ilTo=uL(1;N53^7hNKA}cr#$39@M<)zPZW_9eC4aL(wNuEs?Bjc?o zjgGe$+ZhK|Ube&OWW3pN;S^_xdms6VQds9rkwJp!7i>FpXxBVshut4Zl60y(HDmF!vW6X245t?}%_$dLmQu;kS}2O2VPi`gIIXSzXF}ojLlj z_YMf37P#ElaNz;>Zu?z*53CAXPG=uGw;bCOEBYK+|EGa(?CEudap!^`ZyzHNrA?yg z(v!eD9y#~4uTbyH%JmM8X)meXtC|kiJ4?E!2Glj8Il^5> ziVP*S|9DG19*8x@2|3U3r3Ye ze{j#tL|aOJ{rr9AC8X^q`X!D3?j&GcOkW!aZI{0-$LU-+d(*j#SaZ6y0)Ew#p@jL% z6}d|TW>>T-zviU|?jraSn>QWq||y zE@Yi65S`+%riZ@8!o0piTaR@|`;l?i))i`5%L^pqg^S1oc{VS4cIO(%z%}eeGG4zK z6|RJ9VA1)yC*TbO>5KLMfSyA1TBqqn?1n(g&Bk`?9*V6iDj$pV3!CiR{pT-qW$y)? zy;I&k&+_?{bojG9v$M zlgq!nHc3zqo%d5+g5ZENLG&|dE;9dq_I>|0S=F`-r}fqJb2a51=GEo)`YrS^w5!jQ z-~Ai!nyd1Ai+38k9PB`-Jzp0uqm5j6lI^AaqMt1AK|iuJWip(lVeD)+?zr|?SayJj zPq2?0OtwF{&&P$IM@M^Uf;R@5RC}p`^Z{FY?{_=Wm9R3l^)28}``^XNu+F3(SNEN1 zq*Hs|QwI;MEz`vN72owJ^M&ou(Ox9k9OouCvO@Jph&E(Rd%NiDO7fKsqs9EprC-{l zg*t2QraDjbaOU=3x9?w`y9JyJM_!$2r+C3x+OzQbPkI)lYoR@9(Y8y&=!PX4t%7hQ zoKePO`+nWiZR7ov1C2b{Y*Us)Tom35?$Ggi+{aNJIJw6dN3_J8@w?&lVy8!@y|g@N zVXLWp?yWoT8gN>_(3n(bYzrR5TKrPZ(9>s_t11uCwTW>)Rpm18Chf)`eN5$ww*!4X^{KhpUt^ez6+loz{&hDSWN4L#%)-Y~qywX_ZjZ^*SQLf5#>7VrXpR>Sh zi`rJ2GDB(Rq!IKZ83&~c!H^7pp&f~b_toD354<62KbCnRSlH2DG)kSwOFTuo9G3Z3 zVHjcW*E1&AohI8-s$uMlRh7fqF;_rck?TqOOrSis43$S2;=?MZ1{_qD6QGX- zR37Chf0d>DUEI-z8k<(r);%~sHMBP{>m7NBrn>WPxc`p2l5ZizyJpTfo;Hnfe9Faz zWpmK)3m~rm2X?@4_5*=*85WHJt23QWwx`DTq*DiN(PuX9mQH7Od;l3B_+DpSBe)E% z8#Ks3SI9L}BIpYBMHZ-ii!))>W8;QDV3Wn;asC)^&mRue53J&~bD0x#@n70Ow?f!khZREvx$I9(5 z*-0|$_7UKQHVeQDen5SWmeE8TEu}|@8wEUD)aJnA%2TGCm)jnsQM$h+o%+y2z<*dj z99VfbfigI&hv@4ZHEU*-VP#Xtk}NY+1`5!cJaz*gZ(kzB(Zye z9Q8M|Zg-wbGWI90%RkKb>Z_(=>^PZn)uxr>NgMC#Pie_VfT!uy`N*1%3vVXK8g*LV4Epuyzz0MbyeYksrPHY z?4f|;rD_;BOXODbG`fa3tKFqw*weQxn+{GLGhk3HS5q#sfJULx( z2*1=pc!jr?=h4xYC%;GgRP)ur@Fw+Z@v$dfDJ*IqLCnrR=uKFm4*?7C189%5>)Q zR=xkePd}PpSJDW0dXTv0usQCd{+&X`@%vJWJ^lcD@0#ywo?<~G+W!bJm%9d;Dnj2= zTI@qPX6eeeZ|%*RF!SctVA>f^KAPhR1_SLFYk4WcoKCpVUc0^%-9FF!O)|^khB4(m z?E%RHx3Dj4H%xKobmG0GFT8hP-mqW3{cYZV=QF>2`xbNu?jP2CAkTb}Wx6*t&$fq6 zJ@5eg;nF40d(9QmC-{N-r*xCGPoAmoOIfb0yO-}?dmkLRvNNz``u9B`c+@7swe9_F3{#hO zyeOQpPFi0*r(&P7e|d7vyX=NOM-VV_)_~;!tpwJSHt@Y(h1%p=zw&BtMc0yc$Z|) z;Pxr3LB#HIg6LSA0Y88HZ+U-sA3k}(4?ds!PM;tA>jl^8!M~-C-h?g~w&>)4dhvJv zdVx#4(W~NRBEH1)uZow`wOpV*$%#ZtmL0df43~jNY2Qh-EIJNCzpgAL+Kk!om;~zs z^wU^NiDOJ#tH(LI%u#K}dgxJYx979LM)1%`Kko||Z|?TzkMw(2=YajMuDp{P8?P*k zKSn?L!v#GH7pQ+QZeI!AX${IUjAwcmDa*&{key4YUkzZLiudE@P*?1}Ngj|5lr5}% z-QKvs3C1>*tX>P95cZKmu}6xTPnUI8rVKlHVDYfH+gCE5hW6pD7sG36vl?sAHBTqq z^AgzMeeJKIhbV9eUieXc^?C&J-}*=rJc92_p{FmT$Yfqv@Z8T}7zn&y$8UUSRW zx|q%`Fg7!f*%$`z$X_|X53B#G9}6zO9}7O#Q?_;k58sDos`~;w^r-d_U#{*SmAHL~ zJ|f)C2bYz&<^7vGE86ZZ(I|4HjGf7Y+=zhGfrw5#zY%{a3sy&artY(f6(p3Ymz zwX8Rw^UZ#6=WX9}SeGaqOm5FjRok$Zx@mrSEmd>C`m4~zPtymT_R^U@Xw84(uUqpE z%);&x`cBNn@|I%oh{6VvRjI>^%crI>Dn|1MISD%3q+kz=5LB8 zQBH`sci;!&tKG7;%M)y1UDqS(Xia9b_yq6@*WHjsq<8JxuB#qX2a(_VtT%0`_(t{f zWt~%?r9k3ZC+YE?80EC~!Uiz;*JiaJei=4^uoag?e$KWM{tA7Zc_DS~?1cBw=fOoU z>6t%kVKXpd2Lp_s=%>4DCCy&G8dKE<^`BzR1>D!mp4(5Ek5Qh+cE-fQ9EVEu;eBmnqZ3XdKPFmA2T5~q(U13QFIIg1Zt%3nE5jW>8}`2Kt`9@=3xQ!Pw6P8v z5FZo1Lh-YT{<=GTaI4F=V)I>Fe+HY55pPYhi@zWTtDGapo$|Xgj_51pci_AKVVS@D zjy0(Mi@z8wEMxu|h|_LaWOaB>86MX8v#e86PB`1*>_*mR?0R?yK6&lxl1WGt#=g$7 zEP4rX?2c$IleHh&-H9xLZBc#yzy%AP?a-N_KD()R<+scD_ITedY+}9>rC(4_$@$w^ z^HLsvPacxhSv;(-%qu)*nbU%de!TpGO$(hjtIOAZKCm9|n}x_e+UwTXc&xHiUwvC$ z=U@fgtns>VOQs&x87jnkg$iQ_g$kpau*(U~eVI~t*BWv-&7MLkQ;N)@UBGX)pfi`5 zl4Ry(@H3ZBIOTrk&QYP;?pLMrr`M`K6@0 zgLJ3BSNybnVz(o6w`iW-m43zrt&B-+#eaFGm9gQ;{VnrX74tuA%{L_2zv+a|sC!TI z-Tk2s&Q)aEOYgH5Wm0R3<@fjQ4`*6RCe>OTy3@{Wng3j_fA%?SDlOUXuN$bJW*a$+ zLSGeLj)hC%O86W#MYztC;<->kxE1~-C%A1;iOZ;P*^)oKKl}hZ3ZKH|`S3IG3gJ+= zys~Gji?c5eXvt5-o@>oXWqb-hE-o!_*%w@bN8v~~^zo_qKC#tB;e9FT?x;xjFSn5o zcuY67!bi&ZRC?i0_)#5Cxexo+$<@Uv;4%+xWkaUB4UM4>5>9gl2Hd(fh)LVi+`Hdo zmhir%G=sclqx}r<+0!iA-;vyryS?*S_A1KjFbA0r2w$gqbd-Q@PQSWbpF5x#i}3l$ za=i~C>$$iv$Xm<5328}uSouN@Ul!=G6;ec-Ka4eRx3m1{!2r~V#Jlp>@wO_sU+e#`u1EvjM!IjWU;_J8*|Ff3b)>Ta7t; zp)v9Kz;~N5cm5T&5WZu~r@w8?vrHaluuwK+wlTk*g^izI)|(8MOwYTZ)?9a9jk#x5 zH}m^fLT21mA=CTapm}OT(0pxT(40FUXku>!%nO{H`{kVh^H*Olx7&lm17>h<+VA(4 z>Auf0zxb(T5^FK-a z@Nyf>{V0;-$(C7+L6%>jDk~FLn8PIDWQL`3z zHx87WdvTDjS&zF9M^hLZw-E<<8=A*Fi2E+?Z*YH$quI>&a1Z0YkE2VNzr+0i_d{F< z?h)LhIGWnkOMD#v3EY#oEw~@yw&MOC_Z05OxTkTDh{@tQaocd)aXWC&;-14jkK5_F zf54a9h5Jc`+s$ve7d-bOzT8hew+CPDCC|N#FSploui(r5%yU1-m-|Q0y^1gQPo8@X zU+$kh_d5Rni%anR<+usBD{&KXSK}t(zJ^QUrr@UHuEjOurs1x`U5}fNn}Pc}?i;w7 zxNqWaz|F#?a5v&+s-jQbXD9`4(?@8E91-HQ7w++X8v!=-WmztiUy>L?oZ z>2xc030u8h08I1cl4wi44 zaOdITxJz*pa9_hs$IZswin|?`!QF#<5cdPz7Th-6Zrsmt4(?6dySP8#>H_Eq;-qJE z1}=vCG;S>JOE{gK`?D+K;8fabC~gGqFL0xAV{o6teE}!_@D-eR!epHKf3;J;UVzg$ zVB+BsdM=>Efmar)Lyy?ML08?my9io&h+uq5r%G(az&TwS&G7;gt4cUO0%a zXHP|53M;LiVK}A#pmZ_P=o^L)_fdYj=h%OI_yo6~x8k-?KyN=$MckN*--_NPKq?+T zkIQ%mY$-oV=|1TP@cneX%IUgd4v}t3SLkp$rT6Qg==j;?F|vW*s)O(s!3oDcPWWk3 zAfUD4L%&?b9q&2X&cTsi1&=5}<*D?;&!1v{6g^h=d_ZM0s~+d#hAT_5?#1fIMGC7J z(knbkVTdP=uW(vnA;ODa%TMJ!5zux1Kys1)DF5gD0KUSK-yZ~V4~5I=f1`MQC-9Vi zFY*~KBKPt?lkiN+Z^u_W(_)h#y&slbG@guilV0V2i*Ub2<|en%T?hU zs=|j4dCqVxFHD|0Wi~cEC(oJjooVLyr!=O{m^){3N>)3kx;cE~y2(>#$w23gQ<}ei z)10}kHDn#M=!%##jpS42&X{$>+{s6$xxVZBnKQmg-iN`Oa?{*dlaB@4WS6&2p3ywx zW;59f%p`!d&BI@(j;@rTqPVi%)0;5EdHu9%fDS`b1t}5bH=t?i%(89Oa$eJB-;D8! z!*6d&!I!5^)=>~lj?SLVfe@;WnF`m0s0(2E3<~i#cENv>TN^>>74wa0zVVG~K^%5B z%2k{7&D2eNSgxF!3hdu>LvtBzv!~6$OsR@(o^iwVc;yc(Olr)Tf=$<|XcdZekegDI zyUKLS^3UU3J8Rl?m^z&`wOk18>c^Drn;woTTTNv^O3k_fqu3M#T^z=Y{~4B3ebAuW zQPAZnFuBqA{nh{F!vr-?=uiI}Cm;TvrZ4LZvW=f4es?#*J&~K~!?KCtARH%Kj$#q~FIoHyyv-cznSz62CtK#VGmo@6q!60GE978Y>?-$H}LEPk`a; z`v_^1yzhe_q>sLfulEVk$bS`I@jFf?+>h_z1$zHFzS1Z96Q+Mp_x#14zs2*{!3z|> z+4EoV{1ET-zC}KRcf0&3Yc$^b*X0jFUWFki2NRF4@@6;BO3n2TDn&ooX2_`XVkdlO zuwduuI;(w>D;3ZN>1hNuPjq_h!B^u6}(SeHr#7*gKWZ-%L+WTIWF`-0`Qg7XF!=b%B7R{rH~Q z1>BKjKXT#VvhF@)^xAZ9-y|H*ltKxeFS(qv+-6sb{Ip+QUi&9bdJ&wT(Yew{)ZWhT z=T+u(bdQy$ydMDU!0(?C(LOXNub2MUa$uM&KV&(qvgT--tt#Uo_C)l(^rf^P8blws z-3mFfMTpMB!zuEgIe>D2)3vh*j@*4UaHex2!j<+x!uS?0gl;(R{_$VfPgMTeqbt`T zU3yjT$cud(H;*7^uEIEras%w~>-z|KMzYv;%ch^_zRynWZTdPo>6Wv{*tCbrGwj_2 z+22unz7t=OdndabJ&J|-DBp*&Go5wesC$>J-;O$`Z_<3%Vdso(=jLZzy>9lJI0r*{ z!g*bGsWbNGdy2XjRb_NfEpjZ%i6qw*gIVmcCU1A%Nvz3Pw8cB|)wC05eJHbAyxD2r zG2FdNdbDc~CGGS)X<}g{_cp!3Ub}w}u6zERx}WivY4^-@C<*-B=@g1Baz>g}`)07e zKRVu$k3?3w=blgPF`*!PkiR958e`|&^YXi`!Zn{wvsZRjQG4Kz#$V3CnV^+r#i!%D za~*`A!q z^?&foEzXWOu(GEGULHd);{oo?)9>xt|NbO27RaHKy}Z>4b#l)ux*X^kJ{r8SwF9>E zaL8G+FGxPFeakf8r|k#IHgLX{qfH(_vMNYNE|mFv-rTsVWaeW}0DWOt@M~5qo(~cZ zrTXntd&9lde%mdZyZz9uQ#!(XS)nNB0saM>^c+p<4s_|`dE+cDQoaSP9*%IyV2f^ztIwXS_0pKFu!aQ@Hkl&^hR%Gw|TeNFK`ay@v>v$ajftN{sPOvwS~@qjCzxoc9n!rld>NR=2|-#3LXw+ z?>i<=l{Un^wLV^D6S|f&AtC2W`H+LnJle^6#LhLOS{+u~q*o4($0&V)_99*1eS()$ zxkunxX+!C8c^}uxw~l+JRhDbxLO2JP##vaj9P-O90{08@-D9h{+r+jS%<58ib9<>F zc6;e*w+*lf)UJr|bu4lRo}lF?tHX zg5LRxBJEOmkoF1EHnJ5oz6txDS=z*DFYTs%Sck4(lX42{5^cq`xcff-ai<+WgIk7M zjMF`Fb?G(5Tk*SL>nM#s4>uQ=!p+1@$2H@UIOw)Mto`ndD@%2ctSlwdva@+j?%VdE zH$Jge{O9YvO=d>#@7RY)x&U6q?2 zg|1T9_crP2y}y+@bn?9Pp_8}Fdm*=V@e8@p(!&*>XIxW0!IT{wkI30IK(qXXTtEYU9b{SSQg?I8UU8rh}vaqfr}O>q}&KALXJ_lQDY?7Qnc#5>tX zbHQxdy{9c0UCj95@}^yu4KIkGFGkwuQ+DoW*p1{IPEKLHe~GZ2Y0K|PW4qzTI~kin7u5QtE zo4doHt)Lw*%*>E~2K_KQQ|i;9yLTB+H{MfPX15i;lR5N8;E{VvXFfz<%gFWywm6~1 zZlY0iTcE|f$$TRZExrLAzM(W>(mV}K&4lKjf-VE;8yt(iA0}M4Q7~NX$`v!y+-s(? z)5rppFL>(GnNs&mrqmBOWQ#UT`_wJJyY%gjLvMuijxsZpp?**||6bCqFE-Gp1dq-n z(J%6*V|re&+~R%n=-n^mbZ#m|eLDDU*%#(zPo@4tfTjIUgyjhjmbsL_*@Xp}?n8oQ z?VkwCRu7hWl)r`Fx-VL?Ng$^-`dXome%lLPJDqmYz0zu@nI0|HA#;fi15GPS>tb!i zIR-izw5D|WDB2}u7jAXL#~9;HvbTv{+dE|rojfOY=;WumzmR+SQ!nKH6McT^xkVEL z(W8^hXK&xrvHoX!qTEv&TlzEf0-rq%`qvmKUYzM=6-H{DOd?OE+UWaelSCHfgEn$O zLbQ)gBz-s(o4-%CaO77z>DSRu`!9xvOBYkJ$BzjIxN}(F$nLuA$c&c06*6s*vB#57 zxMSJQO^iTa@B&~h^n`!h!?sanUaa%f_j|-D3|(#&W;U!SM(#9)?hbmc+&S1l9~J&4 z4OoS|47^$F%?$pMqx-OAMo<6M^e3V*$-*qyXW*8q$W_>0m;Ok1%BF!*T|r}W*? zEel4SoW67O9tsF~hQ2R%Yt3x%>O#8&vvJxLzA^Yx?C+K99|l*tgJH-Cd>4scny>tB2;W7%R8huq zr=a*?oN_YoglM^p5M>M{|L*YifqYX7Y=SEiU6L1`^^MZ2J>0aU;ZA}h>Y;S{CXg%F zqi(S74d*+j{GIACobRgJkfH=+`5?v7sM0bmw`wC{mB(JyvYe&6%*LY%tE zPD%GumgZ%vBxZ#Q&-`R5G95NI^3QR{>azR}XMTPzGUzt!P*^E&m0DVQZtzqX;!PXnOCdB4YN00 zGnex(r)KWRUwGgScg_{GH<`-_bBj1~K0+pkAR}fjgM4WIfJy7?o&zH-0UBtjuGq`id z2Fodk##BF*)BRIR^TNrF1a~5UkGaU*;y~KTdAq&%gPGihx z*>lM__=-!XE{)#hm|ooB+-G@FXY$94z?KE{avk|~wLP>lm9W1q#O`+dp1bv2bwRUL z-p@v!G{lkaY;;#5t9|Xc9m_HQ)0WXO9evjv%Yk3l z=4PeO{N5bPvEJqGRaN`iLp+{?X`5=tQnNXhW7*oZ_bH#{=OY};(8hNxLA&ZB_ZZ zx?L*6$7`PtYKO`;@$p~nSGGs>Z@*0{eZPIG{bRL}-&TGb$&XgJ!Tk2!>HL=anCH&G z_uWu_`|cC`mK)}|;rMdeTB^Lgk2$-$vmC?^;9wK~qYsA*Tz#n3l)3;X|F3Y8U*?>E zn?V}Ut{%~`c$mUIP5bZkUUgF)Ro6W-pv2h~x%NA06W{7voSKL?{_-DdF);aTmawCWEE`|UDRox0*t zoF4TDrT?IGG1B<$$WNpE=8BlSN9F1f+)6h>0iJa*0X3BW`1JI7UidI5PI?9!GyKPo zOYp+~t+>3HO2y;HC3#03Qht=uvER`3`02zG{kkf$FAS;cBf@?<`J!?E$-t;mywF%H zT&o@toZ6x?KQ*NEC;X@4r~k_Jk9=R__S3^nq~3Y>`Jd2@Ib53R)7`D3-i^jd7eqW& zzcT=?u=^V%jOCqlQ7*@qo~_zi@y+-`V2c+P|7szu^on1MzmxC;FT4T&E$C?(PVwI- z>_5Wuqqun>-UiuYU1eRCu6@C%lf0X{0egI$LUsZ*J6%C+x>Du^@!h;CEMg9)I zmH)7+_|H^@vHjKc==sU{Z%#edyPIyVybbs`H_iIj(^e>dTQ?{A>wl|n2o~QBLTfvrgCqiD2Yt)En-}Ij zfN^9rw5+>zcgsg$dj&t)51kMB@XFWa!wVgJ(&1>AkASw>^D{8i z0a0{D>DdDeXhc~-;uVdPm2=Z8^utru3-J@iNFe(+-2 zN9%BDcdaEi)W+_7lC=ohEHK6?n0VRFdoAk|R`m9Kx0u>e``$~6b+n7tD->3Iz>5!6 z#MSZJJpzFX#~2g;3=4W=f5wX|Tm3P5 zImVjY2n6o`FYcw$y_NpMG~0cu*WPwA2h#aqtpPDrI_}!r;)=YKk<#iJhO1nAJ6^gN z>HKf>ozgMA>U#XRPw~e8t;ln97sgsh#dEB4Vt$VPT9jbb zZ$GU4h=(e|!}$GvMOb)GkcprEbA%rxJQH7QM_ zGeMdkzlQLug#GxxA-sob`SDK>9?g=WAO9TTks#iW{~2MMuphsV@LC9O8NT5AE&dRQ z*bmnNdq+jMFX7QNrXN3)@Xm^`yQ0B_zUjPqP3KL%)(>jMq$@yNMQGF!2}jNwc|=0e zo?HE*;$vl1mEee?2vkNZSn;)rJ~H}9&;X_~TEU91Nz30z)-L>7>gyw3sJzMqZh@6A zl%*TiT8-`|+~@h~L<*1e{DkMv^!&x1|Dfk*Js*=v?sxBb{%~kXclM6+{ASNz>-n2K zACpXOy0<*P4jSva3z+ZYUU-t{XXHaSn>>G~=fCgy{h&$3kM#V6=g;)~#h(A5=Vv|t zUHQ;c1R9pFGmr9VfYR8=nv-J9c#L&0RWf21zEsxR;RTG{cv>$0tVUHh?|dy)S6T6BAK7D8|_roL83 zK7s6b^iC%ges$>35q#3JaOlO~AXQ7t-tSVk(X2nJmJwb}@F`+3(4ZiQE! z&k9CcOXRix|7ZD2=k)yt_ToO(^4At3=q?{9e{HJBOBwmWVf@zjus`=XUb<@eOX*HT z{(9Ok$jjdkUP72MyW}sWI}!Oy=dDjf{tAJY3}wJ3{;2%bPP)M!Z1Q~gDqbD+^S@L6 zQkzR2Q9JvOWHEQB^$sm_qS-qa{mm(N-VwAP(_p#ewlf26@Lwgq9MZZrv#fQ%Ma-mOzGgavGne6J4 z#Tlp9Nhdw@5OeZ6(nN@t?pr9@){XhMgjX9l}QNO|e5i#|Gxl z<|YpP{4e2I()&aQw-AzkVodqZ&nMtT;rL4Ki$#yye1$o`+1h{}9XgD;%gI-9CIU|- zt)B*+y@&fmbcSkmsTO^@F!#@Pq;}`JVZ&H(v?dnjZb}?_P z#=U{*xE&0j9~kIAKOeeGHh^0>`!m0&a}ObScA(+%!u{kk5gp=*=nnVGau+Rm1js|W z@nP}_MOT*s*b&9DSTS(sg1m_?q>bCU?nv&4?as-LZ-hELhF`hw?@~&|KhepA5oH=l zT!;=d`pM%j=RRO)U=q66eUj^oOK(Z%2ZFbL&_pP^x|AGa6}lzR(@$z#T+SJo*NdU_ z^3v#W;X*(AXT?A~UNDIj#fHq@QaIICY@q$?v#*wFGFLfP#%`=hJzK0xwdQM+&lYPK zle%ZQvnP8;Z=KsQsRgd?sm}2%%Pez3_~GTt9Nnd>Gc?_2r}@3Uc!z8Y<6rpGW%+RS z4##9$(NA8(xW{?a?4r`RPR;}*ca|EG+qp|>c}e4Ncg9Zkc^Z2sJ3nG&?O^Y0XSY5n zwU1rsM?IxGt~+&WI@WLoXiX{90sX67dwns|LAv;gVtw+ZQbX#cQk~tBZ|Gng)p(oT zTdK{xN*R-|4@~_!c0glS6&Qni*CzOFFW~&dWrbxnFjJTM`_qo#f8_g1@~Xpl#^OP= zeYqYjMU%a!sPWrmmlSIgJ4-c*?Iq45yLTBQw-g2fPrtbIsyQ#vv91(~uPa4p8{L`Q zkWpV=QLKprV`^Ex0eA&t$m}iE*uZEK$PmDo*$s?WYY!0^cf04R`T?WxpH8J6voY<| z&c4HW?3P9OCD8m+oRbVw?jZEg*>iE2b@BZgSMI>lVzCA|Lmr%!v?v<{{xc4Ga%C?1 zFXtL)iz^yU%nn*HyRjc~)+C(+iC~{ON}r2u+owKZ#X9Nt{H}5)wyl`_6VvP7L6t$7 zCtQxo{h+e)>SM^7W8t%b4m-DC+X82LRQ&1|>F%F9dxp6Y>_kA(iH?b^7AcVVtdt{H%B?_3sl!=RS5f?RHs#J>lLuH#&rGg0Tfol3|#i3rhO_yybZtC1n97X&?iZ^Y= zrIuvkyPV+(&V=wjMp~WQ(fL)Kk-X2l+w>v6yCz|$o+?Jf3;yj0YApP0kBC*g=Rqn)xmFe=hkOhl2lV*gy~ z5#K`}xB~uWH}2yOV$pUm&Nvuf*n1swD&;Yrw87Y_((WjD%dBPox2hB;zdFulY=%#S zY1fY48;T9ta=(3ud?paz4IX3@Z|6CGM47|MXDsi>0n@;U?uwt78%iDM%Xd!AB6TLPNSjR@!7vsbSV)vD5{k|N_bnC;(~aN5DNFE&#&C9vd>$R%lJCKo;o28r%nLM0cH=Ba)9s}%!3!GbBb-sr zg~5sVfPw#x2Il(ISId1fv$$xbwv|Rvmtg8AC6yyNa3tj=&kbR}p!&&P5P-7&xmJUxp@(D9H*BP0*B(hBQPDg!x zHs?2`E5n@${naLJS(H7JyiJBX4ejM6l~qqU%HJ=mJ7uV>%5qeO%2GK2=v-x}ER{2n za{5uuuPJ8)^j~9u16YvD-9Gj)-c98EN)WtEK;|4t9b-|(4Bm^+iPj?YlN8@q;<7Gt zN&aEdj0fgh;bRHlo&XLx|K;+rK3QxN5U({l|A_=yABL}Kov`}x=SNN0J(@MU87o;+ zyXH(IZfNd$hss%(j<)~J+1FxYdhA6LCVz3v#K~8V8UK}wrJ{Yal(lb;j*bpJA_~U# zzq3B!TOIuG*4QqeAJMSEdXxK%*6K4NrZ271AU+EP8dCzxW@-IQU zW37WEs?tp*UFGA~BgsohHRZ=C-HEJ&tRh|4M||w(C*QBD@{B}`$?{TYWNFl`FRzZ; zhuXseBIf?Po{FDc@ATuy_hp@Jg6 zA^3LJqj=U5j)+fn#g@PSYcF1T==)Vw;U5rI+1jsA`F~H?f0X}E`~befui>-?^*X-N z{~F(a6#wsj0AJxyMFS{&N>!L^8eAJ|d&pDy9jOC7*=J)F3cG*AieNM9(3s7;XdTM>Zzx0aBI=jvI;o23~kGruV2;P^tqMGn?BdPe1>b7u!JLQCt9_% z;~8`w?On>QT%Fue=-ta@?{=bG8p4)KADSYU0bwinSG+D<*`?FIk?hdztwKhJ?r|@! zzH1+*o({AhH$rp0ApaT6UGg(99F(6`$050-``+m4S3URxI2@5+J3Rvfm}*9quBSzN+(F?gQJZboKQTPJKif>FXD6H ze|ld&EZ)C5i47I_4y}tu!gt)#`>oeUz=K4R8CvIBY_Fj^blrW$+Gee1mgQ!_J5;5* zoXXVJS18V_R*HL$SPzKD3B~JjN8m+#TS@H{HtL+qdKX!Yqcg;;!O25unsdOE6elqfuZJPjs1Swg5~O(0gvx3->1w5iD`HM+Z$jrF zb?(!D{PcYPQ0^acZ$kNL&SBWIGW@3TGjoj2W(*wkU7Mor*$#7$Ns@8PKStsodKhjj zX=ph4eTgF?vcOnUE2={#5utznyWO3Y?ZI&E;`|+_PI9=jw?4!eAsL-y(o=enDKQRM z-I@Hf1g`ZLc{?M22fwZY!zKs^E5ovs}<=3#fsF6#Spd!tmKYDjrJB&%blv^ zX2(hrC%vn1_m=lMR;sHYn+GA*H6yV-fc!J2GZb1M`F0ND+|{M=t(q~#CU42xw3d=x z8`*2q9)i*7kME>hI|_G3BF?->!qJ!%XN>XVV+Zo&<461BYdn+P55>oJO3rHB_VZe2 zo1^@3P2Mq!wHD*4)}r087rMtV5uImjY-pVG(@-50Pid(Rtk0;I{MbLkRXv7Et2Z(@ zEu~>_@Owy0u-)c#G6%75R_ppXzE_VGx?Fpv=iw) zP>dvgY~&WQQL(GK)=41$-|^fu=Y^*;*++Vxa%5k!0y(_$lkBn9x+cp|USsy*2#fFy z*_?BjHMg-tGupNPstmAVdF9sq+3))qeV`FrTS;UVltnTN znuSa^3MIpqUR#?POT7H5$VcT-p318_NmWQ78RSb@Pd2XUSs@J=zv&y1!nYvS!J6fkX zD$hOOR%KG1RDVCc;mTrx8^0`XQH5e;HLZO z{_<>{yt~kKem`#BA1IH;Fpb071GQ{$Yt!bUNzs6ZOO3hyco&4VJXqRhSXe(@WT2+K z)qZ}uG3ZeJM`h4lAe?ItLGysdQ^9Hu5beeS^pysO?-dTgpW0Gwiv1*KDEjhg`5oyC zJR2G#PoKuR1MRx?Oz=3fACK?#@R$nFnA%k|rgEJOjj3%!)|vHuDHZ zu!^I&3RGH3Q)w#?<)u9J@OoTjQJMVo)4anvS#tFV$Kt_~{A_-W{Nnr)-cRoev-u_Y z#rUQ8{b|-Bz8vz8vnGjZap678SLP{SlgtMpF&aU7L23)Z4Yekj6-Y}730BWJ{Pf9h z;}gNffl(a4Z3S2DCqlSiK40!gka-fYtwXI{=I}KT-MZ4{cfDBs->x8pvY95=N5P%U z+NBe?=2B|?=_yaY4*I+w2G}M5$KXNr0HuTEiMs3Mnn1*0*#RH&`9rK-f*D09v0siU ze9+nje#7+hwCCrTw)GIdgy)}*dpO`%_!JVEkE{67cVB^jk>_8IyEowf9DX6thws8W zKj6O~zjT^qOG4>=19u<(J)ZvnZi)td-1EPMJ2eWYw zk5%;RtzU(I7k(eU9lvyqr+M*r;=elJ{|^3+fd3Hw9{h0+Uix?r{vDow6lHH`!1B{S z2fv6!jgpCnrWMVrmSOdQdb^)j zlp$~s0M~?=ynRd!0$AZg^p{{D4u>c~@wYW)SvqtwH_>{tdmt7a#C327V-H~5|J^e@DC(5m*f8#3tBKeWc-sHIt zd9Kmnl@?^EH#CAA&%#4Qf zPx@{VjY~Ww*=`M73}`ZQ230h3MjbBIFt$i-+$sE~@|(r49F`^+iigoKl2Q#I$*XkBPr==8|=&>5ln@Px>_!`AfmH?QWd8{GDFuDim2GuQV_ zcdu(($_~Nr{mwS=B0>wzXr2bo^&J;w*xeyO?>>(qxCB4{5pMLnmmf`8f@|kpxb+_& zPGh^Dw!R5YWamHrw+jgH-}P;?58%1}w~O%yc?`kL2*CPqnp^!k=<{RzKCTz<@!{l} z_VvPd;mHt47c{)D>Jj57e=xn-d|2uy!neRHzM-GNJVr2Qr60^eejkf&dV}{gD@*wb zatty2HgNr6V>e3gzW;-~tKEFR)(wi|`>*9)_4WPhd9MrjwLVb4@xO24ePY0WAMbX+ z|F^tP3HZOuyZV_Q|5@+d^+&8ce$kBo{TT1+Xuh8-$1TyM?>`g2-)G0rk{96buV2L6 zoi;lFZ?(3u$JVsIrFo6_%HE$hfof~d-R^UN%r>4jq0IiE8`j>ov}tMc`e4wSwd+;~ zAe3JJ24K@oUN&<)cai5_CzxeT>$y{n>6-mVFVE|_4~&bkmbUl-{da4*5N&IhTHL3$ ziaWNrriSG-8#H z(0>Wc$&AqAjMBgkH$oo zi}`cEs9SKFTh8Ja?14-02OqyDl*?;Q1gH7UkE3)1H&hQS-$Py|;K1XjaVcRGJ>`EA z+{yI7dx1NdJ>)&~tR7$`$AYalc=7S%k4gkv*Wzi?i}(2D^Zi4)gL_~w#gpTSg6T#m zp`WkHs2(^j0H83*S>*cP=a+pqOU%}`>#lEJ({Aq5Y`WpX!C|Y`u1yX3!B{QS3VA>h z2Hboy{FlzoiI38`|16sH73>XKb_o98+NQ!-@ z#!PlTdsor)#@s^o0iu~LIqAb#N%p$9k1X2DU0ybOm==4i3HF_k(_6g<3zh5vX`e{? zE;_qg6(=1`Tg=xUf`feB>EA~P0dHH_j{{yhx`M9({?7&P055rb`7F#0ef zQ(MfwTP^pU+3acC*xMhOxz+hs?YU82^w;y%#7zL-+r0^WUUb1zx8-z?QaZ6Imq^~0 zi>AAB(cYgFqFz}my}T2|zr@Sin(yXY0i11hm@-y*aMhIYJg-hxoeRg_UcqKRP-%oI zmnk3m#3SRIoCM{T9{Wh{scm*Uf$l zVOD&z!Ig04<4d>_&N%aSYtK_ZX3sE_S6b4YR$9`*9x5%Hw4}@2^VGpo9PP82{7)FC zqwtL4^!CTmzN6wKY;ZednL7&KBuUEz-ZM-9=b9q+$U?GHF6&%TZm2u5Yq(k1qnc3&hi1ysQsgMWzAz-8N%{klZ z%o$yBdyCO8hz4N89xP|z@2dtj;lb+6QF*!%4|Wc)Ne@mmK9cg3!%7!CAw6BvoVa6Nj^8C~J1v620BXhCgu zwD;w#=s~)6IxlPJfiXsVrDmL=4(dNXj#%^F_bcMKbg`9uw1*B|3=zl2&xOQ!i#RTQ zxN)ja5XZ+2%+Y=SK^)PBXe4R5@%(&58^QAFTuB5v87~()VIJzI55~7@>G)80(TVD= zHalv)Y-l7%AHllr1LjvAOpq1?3#J>`7k ziQwYE`f(Iba3{kz-gSa}%lSsZoebaj1K>`EZrsWgCs;>6tla%W z@{L!AUB2Lp1&x1%3dq0H2gVhAkcZ^1dYHcE*4C!$ zZ*av?WxQlRfX{rkG_75;>gK`WE~DBXe)G`jwYL0DAmqA=B8yMG$8)upE&nXf-65B@ zb39l2>hdr2++MlBzv;Q-VeRFg@3{}lReaAK5ANh|^xT7T5mr`LxbAGvZTH+>xxgRx z+-m4jeq+xF_q+=ley8>I%o+Xydw9NDI`%w+_-g5C|Ms6oa~3m`oz*D4l|){8Ug0$S zbWbK5XYM=dyqs-dF0Abx0wg zk6`{#Jk34QlM;_6-nu-Uw*u)XzS2>A>94d$Q&$vF3rIzgK&H__LEXN*hK16xWfGP z%PYcd8DF-rhq&ORF~PbDoGgNFt23K(Bf-nWm~hewkIR{PgB$2l^bKybu2S8^o2YJ; z)KT?#A9WkSH*+SJF!64|_Wu?1-=79}C%)D&x=&H@>m2dZ%Gd25V@XfEb;9~$PH764 z!nZZvU6YBQN{bH%rds?qI?|%`TKI0=<8JT;?*2Kzvxv^npX!tQD()X#qP(tc)$~7t zRQb;slo*Z&NR=hm@*j8DVw@y^A+q$yCR-Yx!W3U{4Ap~VUq=IJ@!7!2E$3lQ1Q!p) zQ9Qw&3=b3b3$92!Dx;oD`H@7*c=#u{li^`50PbXXn1#$K4(SfZ!%PK#FZqSQ^~)Cs z8ua>y2v&TJY>>*`BNtr>VJ3C?t>|i7rUmG(232R>%0dMCZ8Dy&l+rVQv2s`TuByZ1s>%E$0$AVtAhwKfrmrvAH_W3#2Jv62!E+iTel$_IwO;v#4idgHjD}t*srK<*p!WYAd{WUubQ+& zu{(7pXN=;i-XY?KNKfZw!n~i&do7v)y2F!SUus5oK|Bvl%qEi?2OAS6Y{BR>ExVxt zUE6wt!v*L5d{+kB7uZ#j+(R-C$ysYM+?CsGm1m%g}SCDO=t+f02cy~d%`l_47H2_BdDM>^V|p-NUa7 zxSa*gP4&*lX#qyPS>o21mBjVqUsRNBEvKIXYHpRFCN%NBps2 zd;94P_8sGZ9VfbtqDLRG9w_QvW5Usox@St>hDO3k@MUN6-SE`hFAuG{w33>XE__yP zI|CZKPV{Noc&s&}gFHTwKbLRSA%!>QKh1kAwgWjmXH(*=AxJM&Jtn_l8k7j=8 z-c3WE)iZWfAWyErEi5>f^Gnv9MU{n4Q?pNYwru&Y%rE%xrc=Y%0IZI0Iu&_zp#dAG zhoDK7S9Q7y__y)5TibGP(I0Oi-CayP>1-6Y|n{^N;G6-lKC;;~N=s6O;>@(>XKIti~qU zVbhr>#+UpTD3{XLycA19FY#@KPhW&=7+32~o%K?FR=g3q%|w359q91DvrUH99ed4FaV{eQ!`;N+{Z7;ZEPkpqR z@2ETVu;N_>^&y?HQTeMw2L6rLTsqMlQnTOc$enNc8Re!fs;}k?D~a5|)R%j+)mMQ% zh4zU8|0Bv&9lEPvK~tyLuAQ4x8r^YhmWPv*N$2|~k&c=n!jH24j~<)YzmIhMf`AYI z)d~$!I6sI9**wZy4`YXUDm<6|W}Yg~^%M2e)cF{F`b68(kJ^pv)_#WT`fN0R?fI@2 zmVHBf`Uj?8c;fF<=eJ=8qNTaLt<|2>c&>5Ul_P9?3M9+ElP- zd49jG7y1bhuE(c|@-^y-;M5q36HHHQ0srx7DNX?Map^fs`7-!aKGB(9zKeMergw<) z-9(uG`033dAedeUTv8)pN>6m^r*}2)N^d4VJ&iyg46fqo@)a6_YiPHt+i8S zaNh|QBJeHEJ2(-zc?5?Hvh*lVJ>{BSZvfZrelq`kIJtg5)rVuOg~Umtwr=hiS3P3< zR2;u8c(rZ;;J1Dv_ye!{TzdR)kwX|Lt#oeT_mJm51J?#F=~CAZ0z62-z$dy}pwbuD)H ze=xbBn!Ik^^(kf{6T#IXHm|w@wUmfg$ksLn{k85@t|}hMwxOQf;ucy(3WmrY5(zdL zam`JnH87y5dDZf@%AxfpqP4WGyg~Qiu4Y!mbW&@RIsD*$?Z46018-T!1+HyIS<;1H zYYaJ&kSSI3jU`la(eCQyO*gJHXmmYpFrN+3H&|QpDz7i6 zgxawd7SKw!H{ zuFY5>cM|&VbY0!)nv^@)J6kh_@lpP>AUGcQaid2TrrU`&!whb9a^K_X>q`zwmR6X& zY`Kg%Bw>XaV@1PZx~~~m{PBwPG>0fX%`ZytTDhc`luLT8a!GH6T+&-5m-JF{Nv~Zl z>6!9?3zI%$b%Vm0#AeH-j`QVGmqngy^2KlR!!`L-d+9T5wMzYc1q$z;k@?}|VKdJ6 z&l(NCkGGY2@RauPWXq*C)?J7r7l_5L!$wJWAsXxcImNgv%)SEPw^G$UZs5*R#F|jz z#lzTo$kjdF#X4be4jIrjwXrmD(m#)T>+jH*O#VMvFSzT0D|4X)wrG(rg|$xCyPYn8 z{k+!0l~(%aRko9_CG0r<7%pqHv8)lsYaOFCi`EOK)cRLdSy{mo^`1!C6CUOX{STi~ zIsQ~HgL!GOMSozOvgZou5QsCPayi*4aHRcfxi&wR zy>5-Q)$ug@&Kh&AC;YKCIPPi=Yn>6wOU@FBzgP?--;vDR$UTwWAeX9ca%cm!!SfIgs2zS+2@64?S;L%Zv>i#WQ8ZhBx)kqN{7lF;&9_^1AA@?yQiE ziL_&H7rw^#*mCRzNnZpRuJ$#?0y6?w7v`qI?h?#`63o$yTz!>DywXwK=|lChBd_v6 z!S$-IWcx~^mU{rYymCn1=%)K}VT%`ry~I;}_&Vg$`X08?g`f?w;rs@5&r0sEzN)qe zC9cRRj6JJ)gE{#{w@uT-P6kXJhFH@wjiugc3GvG$p^K%d}^&a$wV3ENDV z%HzW=B24rEGf?BFhYa+Mjt^H1NDp1%H#*D0o>Y2eVZzH6!u<4=*ZG7g57@6#9*+>V zwJh#82>W7L*u#X~>ZP}bHfY|{k^3e#x~w#H=zgHMRdy{C&`)x+vpKodsZ8DKjNqMd zwNL$UEIbWkXiYTsV}qBNR~GEkXwOb|sPeZH7K&>h=9jOloH1;Jr{cdnEgFBW=%?{- z&T3aRMG}&pSytB1#Rr7-K6iL_PqtU>ejD4P*`(II;Vah zyYJofw{X(!!;zlu;tu>N=w5quisR~~XYymQ%fFAbGHG;oySs~SA3snGVK00{_X=n0 zCU*?jN_;E5BKO5R>D%dau?v5sJ6)Ut4T;`-8X6OSwu1gwFWRZ1E*b~+BbOBps;$lJ zS!P1#@;yZV7hf17{2wMgo&7F9_9(<>*7siUK;cv0?Z_#9hmGyA*nP!clSUL+#)85p zzkj|Bb5})zIyEA5Z|~if8y`bnPu>%exqtkHj@%MYZ+<-c1}XM1R>ilu zXGWZDh2}+!>%grbp1+4M9$lbx&!6XH+diFMm~-X)j8U9>P~HzWJYe*KbjQKe1a}UA zpKnl>sl=-z?3?iIQ+l=)((GaAK7olgvi~%D0NvO|izgVjHdDUE`N;pey_-JMw->r* zQ13g!j|%sV=eLkNKA--Q=!tf|uc&;bA0{0o(eHNhlRf~AopZ*o-c8sVFG5f9(&xAlFL-#mWIxqXP^`_yiVa~bf9c-MF@|0SyDdw!aI z;=-S1H`^PXb@uVs_rB+c*>(2!Ur%!`XMOzm>)*NXhuQV<@4v3I0AqV!VW0B~=E=;1 zAuIE!=tzG0+S5AMgWbOD6v`Ur4kv}lE}C%1o-zA}*JkODUk=&nN5|UFv7ZZE?~jVQ zPeFGa?3(Z%r!u+GiP)~)!(@UsAr7`UnJ4c(vT;(U6R|cP5gq7$6xj?M$$Y~(o#%J3 zH(f=YYU5i9r%_+>$y>eT8P8N{^%Cad#1YKIej z=S)Z6e}JpEgfre#lv{mn9r&3-J?2iO46JW!?aa4z#znjoWAwMBdncR?CS?kdl1_uN}Nx5IP0 zJa-2!V_4rR>H|+@@Mp?J*$&|s{iq*3@f*efa6dM-DVN6oUF%sh2JR*N@zZ`vJ${^h z0^CI68w~BJUZMfvMs+v5rFHF>p@#>-%cIP*+3RA*U)OqGw5L1`KEajfO}L^@KN^O{ zB8GN0K|9ZyzMX_w`CXst3*0$vw)P1d=`)G$qWV`a^Go+S_3xdddurze?*<+?B@n2Euf2+|`6>T)vJm@;})t)&A(O z8JDK=U3#FRP3$$A`_!fowr@%_ul%(~9FFZQcC)vxa!Af0yy@P#t`KF7H^U!v7B@}K zWHs07ZcWbKysGqSNynYb6>o8#eqX^{nTPik+&TAU^X$P zRz-ZH#`j3I$1DqBU!b#8_b}e8&bpV3eRwmbK!;Dr zHmL4U(!F)@__l)Zr2BY;H^ECs1{vAc6@L$ODqUCg-6(VwwYgu5`2L)i=ez2sZxwv| zmt+2%-H!+Qx0$mA7m2-Gd<2*=*1p1H#MK>G(F{7%jnHM<@KD(iq!R^JGz3qT4M{(| z2f3FQc8%IvWuo2|V~x_?#C=$Id}uP`T$gi*^keX6lK8@@FsT_o9#)touo<1;)t zTZz;cYVj@RJ@_ar_=Kw^&gg$a;YhTivZ{JS&B)qQMvbnnj)ttVFe?@-&BkUzmS6de;{AlkF3{!B=^u$E?=64HcvGO8BV@*jI=u3 zB+P$5y>sxXxrJ9fX%-~G$KaZPI6uAnq#!sOzyJ8@%_6{$qi-4DPDZ};$O-Z-moEwK zWaLXy*lYF+7bsJ(4*EP5!IVvwNkL-^OUel^=;O{;H^ z!6U_%6~xu-=Mm(ZCoy3+c-xA`=DxePC@G*1ydG#1dD%)V3>pK0t8Z|@NJhJoveoYf z$lOxX($(&EsIj|L@&T)>Ro>xxn43+}N@eBH+`s@Yw-Uh8fuCjAuN-9c()FoTE8Ck& zar}V(BKsk(r6d;wO2l`brYPbS<=yWI&z@ktA!O75b8F@{N~^+;m43F2wn;T*jZhav3CRi7Wp! zxqN?tG|ph$Ie@EsTn@@*ygwxOH1;LsqKxgxWzl35SMDTiAmT=#dxI>q zyM2=P#LVyo&cp8q?xEZ~1NH+Y?_CH#D_z`3oV)mJ?%jna1jRMW#lsTD2$z2^{yOf3 zbl_RFb_m>t^{e=S>^;46bG5Ab()Qd(9^$9$v$}+lyMi-ji6A z+i3XFE3@hNqDQ)(4CP;n|MIa%;=Pm*e-(8GeF0oUitDQsK+$b#60G*>%r?(E&%#^jc4L^QYc(8BWHJoN`DRzuEf$ zH>}a~;Uu!DR3dqjt6O8l!S5uPgGbS!=4f z7ghC|!TWgn*HrS3P1sSmY!vr)_UaMmA2I&k$F3GrsjP&W0vfulBk++~%xnr#V+_@TRuxVXf=0Q`y7lYn&9ypPG8I z5LVeK7j#_{#6^1m7rJA*yxs-U5MH2>`fvOdQD@@~C*uKq? zoWQpo)1dNXHWhwGo#vi`ofR+rw?F9Ggn2LLt1`?J5o<^BVY#%c^4C4R7HfXtZ6fC` z%-IXvYJS{pU5N3k<2PPE@EvUPa3g7Pudm7-5NoB@vY+)S8Gp2JNvF>ZzFy>=U$mw*Reb;Td5dA`WK2hiXLUn9=p(p)x;o-E- zq--nf!Cj(0m+B~*`6t;?JfHIj5o>4hq4SyFliXd+_mHJMg{4k}?~;9`p@WFkQH-7+ z0bksO%RIFeS=gu?WjH^R?Rqkk-7qGTy<^l!XW@0E-@VG*tv;f=(-AJ8UH!$}v%9~T zyCYQNRMB=Z&OndXerpo>9Ot(DyQRfGiH_lG`UEHX8&6#}kKtZ$+F3Lx8WkOCZc>|w zR&~G4)-j>{*2&PTy_9s3nUS$ZRyLNgn7+Mf#vJzNz=L&1;n{PMPsTFr-*043X#@3O53To(!dn(R z8*NnsFJ+PU+wwDBDSzd2G#1K_qzuXnmbvCxc(uKgpl5ilFnChAkpX7I@s8p|+9+zd zvav{Pr|BnAi}{v(g|8mkQ*nh~^(VErX#XC{Q$=32PB-$v9mPq`$8yhw{wi-dnN8sC z&JpxU?lsPaDWC8vdI;O1g)6hL=dZ@tACOG#R%l!_EF3To_0@t0(TC)Wq6Ntx)em*2 zeMmG$IW)$K-+1PfbS_3YG`GYFn@yf(Oax!rOH}#&@%|pdBH+WfE1>>!jPo*v&!8WP zj*jk)=HK2C&5xa(&e_5hvSACkX4KwRI08SbzFqkh$sXPD#6o`gCOoll+G9PP)pzA- zsjMH|n0sr8Z?)F$BUXxYa(thi-jeg5j&b=S$G(6s;R!1q_OFrDm znWas+5x^|_l>0r#_}fYU55iSjpUD2d#6ypu-q1hgOhfmolj@^6z}T{2pH%XLY1D1c zyDLlk$szdmp6Qi&@dpizD-qfxobE0zSe?!t9rZv#G#W-ODmvXeCX}Byn{?@KD@Z?t z+*|k5SEoB1jUgIa+l(Cippk(`Q_z|nrY$;)wKK`XK3I6s&K2d~OF87f@=VA0!@P$w z2bptTIUHv1rskoI*+}Nr?DMoiO?(Ud|JB)roK5rb9+a^&hu6yn)NcBjt+6Vxvp7X= z_s*i`_i5AFTco|7XovRJUJB!iSD}|{FvzBBh2_Lae z_6J`nR1haLWn*^ASm@w=ne3VTgo8@!mBKW_s+ePK#wG5&FUHANyo}`Jk)EAJ&KTgo zGLPK;Rh3cY@%y0qI`dflzK>LzzM*(5P3!%-NUsuEA*)m;-{8rjLzG?P4?KE(nD?`J zN7tr)Km96ku3KN}CaAuXsV_W6-?XyucM*Ok;r6^JV~D%g7WKyka3~#xF!%7iK)RZr zj!tvaWt=kUohW-ZwmSB4ZsN|+TB_FFJ$jg zU>+9?X=!{A4xWO~FzrlPgoD2fTQ!G-Pw)F@!tlP%?!w1+b>@k?GoDu^)t9c$BIB4$z0QB=qC2znrJ5@0r~4eW##KN0 zF!e^ys?QG>ex&E|e!|t?>;!vmjqJH4cNY$T&uYt!7f)?tOx;;L(h<$S`A{@}bcg7) zG5gkD?a3uxWPE)^dxx6O4ep`qCeo~ib|rU-#@}0z%%%z)_%zeT_Zq${tlFcaBw-`G zuo^GyF9;jyg^lpSt|IJhKRv#U^uiknpT>Oj_P!`{_+t2@&SD69*IHG0mn*q~-h=dB z0sW}lqO&oi(FonCZB*7zz1evxHg>QzVAX$$J>ko8+{h-fm<2&UWqdb9!$2C z)DBikd&lfQ+PwGN>Wu8!;M8<)bgV|!-N`RGBht_|^rkycN3uR1sd}SBrh2{hU+@jo zM>=HkO9$+K6INmEFZ%G}Td^OTo5Xrqdy$jipXQFf#@Gg^2B&i`VqX`Uo{P*3y}bH~ z&`F#&m_@nl1ISvpAc*P_^rLaCG;ENsjO>K445OI+KJ8CKmV>oQJ9? zx9N*P-&YZ6CFq6Lwd6UA`&cef8 z;K1yM)6PDPNMEg$HWIuULl}?Q>&@R037dLIruiuRllVVImNvyq|3#I4_@ZDDCPU-xL9}_QDZEa$V+F2Bj7K*v>rEl14 zK(7ORF6JKcOlWL3X)h*ktA74Ke~ppnf)jsERR0rCWzKhSj^n4l!Dbh9f7*o3+%fvx z=dF#Uey4VP`8Se3xczsMXq|KGe+I3;i!n|8sLtXH|0v6}pX%@T?fMY17;AUI;DmMw zQD5;+vZHlh>TG8ddNDq&j3nJeXN8#u7hX>vhGvv!1>wTC#v6@wRrG07KfbH3g3&lT z0k|r{^vwe2i%3H_sj}f+XsaM>%!Bpwe)Invf8$!>$?uP!MZ%JV$^Xxk)31M)aLvKh z%)y!)XZ`kg&Bfa~b045j`sp14Mt2?y4_`KA{A6DG3(~K;1X#_@^84^FyaT))z|m8{ zN#DdR=Q9RB-y>`pVL`rtea-ryUdpe3Lm3%6j#Iy>^x+8jQ9rfP*n1{Sb^BY=QF)>L z(irwEVc2+aDg@z)%-NpTcN03YJlZ*Y2Ub*%i z#aj52h|^izE_&+SU1(;!dYEtTp*-KDT;lsK{+`CTU8bK^QZAL#cdx_Nn*34vt7HV{ zSYI-J?RO|FN?0WEOz{I=_$Aa?VIk7icg0;un1)={K)RY#mG;Pm6-O8#QwV2N*u*K$NGWcy%P9M-1tw% zS@D)r&x!wFobD-(GN$Qn-zfY~l(wqo9&h$h>SLMRh0oDf#T%-v8@=?{xi#rc^U|~8 zhfI1_eE+yB0`T+8;O!H@SCFkTB){RFYXMlY?)o(?#-Ku~x#hF$z77#)uU%(*M_%m|SM99S zVOcwFdzaN%m#*O^o0YBhG9AUW*WbLR1@P9kvhW*MwsN!0K-d*+E0?b@d0x`Ia#dTa z-M-c~2TUoEmz;Yk&w7<>2pH|n+wMm1I-51_P%x>bE6@GN>ZL7%>N<42&T925He7yZ zwUXhVP?t$}pv{=x@cX~$jB2s9Y{45_@U`YaZeeYe0+aW!PBf2#SPzz-!)IGoZ?IQh;FfoWoD>!@;So6=x<6-xhWW#6AF^XJO^XkV5d<^SF?|Lih8Z{xSU0g^_NV@Ld<^B>Fz7%s;)%|B*8PqB8#{%ls?L{9nLd%{-ij2~z&7 zH%pK5|4Nzvi8B97WqyQXrN`8-%+Dry>CyLd%KS6S{FjvZFE8_7Q|3>V`L~q$zf$IZ ztjzzzGCvGj=}~!uU0(hPfgwQtS!Mo@mH9tg=HFW8|7w|kUzz`3%KUGY`K{@T=FQZ< z8TuF3zYFy5eEnmpT{Q1P{hOtKAJD(|Tj==7*hb)LqIFiws^--xwByh^TfYYLC2QK3 zS*zBrS^k;T#x#kJ{sylf44e`kLaWeMWNU6g6%OkgpEcTWnEb$Y2$^#iW7`_8T1MHA z`vuLnrPr@q)k>+_*EORo*w(tTrG4!>^a__=?`jtMhGRuN=YPVu9%@S8%bV?H zbGxNV_YNTIOF%xsENxo1_C{-U+v=79g}?p=U!N3u;kHXPp#Vw01#>ShEjRgBbr~x$ zG6-w}yf&E`^ys>Uet&aI)6GF&0F+MyKwI0EHDAA~z3Fo+mp6T`dHIZ>J)M#@8nkNL z+OOwYu(oyUX%15Wvqo?syjwdBZLQ|^2brg7YHy?W`6~yiCBrl3l28{jZc~|5-PT^G z+q?szrk6Ffa;2zCvo6-XP*?MGz3}R*tNI9cRecrbCQ8>P9pIZVZevX5xU|JMvD($6 z?bnF)(O_;o?GHv*)&Ei!gL?WonwDGt4obe0p%F{F;J57k7Z@?G3RMP`vW7Cz6>)+*RR815mx(T zfWd9yn{Svgv&riYW*y4_y$-_+Zl^+j7d~Tx7-#0=2{6U&a?#^W<0jFky_$J$0-L1! z<-#N{VqTG*q7J#NIlASt26#yBSkjY=9`9^;_@KR_z4A|jzn6O^ytLfOqz8{QVG6vs zToy1Z#9-y$!ijUA^Qa%=hE?ldQ>(RueuAePMW|3FlgtEf>9GNA7gW z!9rj{9C?6T6wgv}SzL9?g=yX+mqp+~xojRs;dzoAGJ64c0-M42AeWf%0rvBeQ%v|E z@!*FhdxgVo_X#j74~AxVHKM&R@{%5-_QGn6t}1uEa4(_GpjRe3oHvj; zu0yuY_dauv7kZVlgJEp#Ca90<(Tz+nO+8efR3`tJy(9Zre0z3dqy@Jl8tQ|I^60Fl)D(TfD95 zYu2{6O<(Y_kDtpF4(~gC&XpgX-rU~4ZspSJ+uPO~(mT0-h*nsk4U}oUpaAco+nR?i zGeD+w3rMoPFo6q>E^3{{Pky?+`?&qU_nB|sd}ooNkrm+T{eb6Z8Z14k$HgU|D}!SgHs>|>;VQmi z82bm-rln1;Rmq{28J@jKcX86%(he82YSn5Y4B#RS-`sya2T1ECFLTd@ToAp4Y~|P4 zH~Gzd_HAppQupM>_4l9OFv~X2@Z-AXMxN5RE<1ilN1yxitI^AoZsTn99A?|Q3$qiu z3y=Sq_Bie+Ud#S>D0aJZ*_saaz@_VcXQ3{+t)O%9Nxu2|v+lP{gmHZAG`{ulO<}S> ze__dMW^xVFS?V5XpJpuH*S7JQ2R{oB|hn~RO|hRYu) z+*vuw(l-{i!nWxzPqr5Z`QZa$&BA! zIEJ3#v5&DAliXf>`>(L!K|b@92I);ra-Ki6jj-JXjo~)=)Fif}bGN-1>ba3K-kI~Y zUlr$Djdh?{lQ>wMhJPaQCjvX3G@{mzi&cqNi*NzC5c}7(YTim@LZL+ZRCIyz9n53V z1oMN{;Y=m&=abk+=w6u99&#n|qM5W4O&uuSTUF(}x82?MuiBN#uHj4(XB)B+=7eAC zYP~qNJ<`jaaQ8|_b4^5LjDIO7dkaRN%s#*#;!D`5q zi7ifh;y8Q7+l%e#@4r5Zz0*qS6p1ID)6$vjsdgp{i9TOTS*w%MtI`>+%}!MY8$QxS zu)qOj4Oy=iLP@v$cUhIrds-v!R=~S=EWKRiM zmsOI#Y%hfEWwzR;D!sxEr84Iq|HA0WqtJET3hYKZlYKI3J>LKhWRE18p*<7Z(M7s7 zS2<^gDPvu7ccCMZ$?i>U&UU~vl;dH8hljsB0Um^djl`2HJ|;9HlfO;=o=mo#a)~xS z-}B4YXOnlxf;PF=Bt{rgZQ3L=wkmO}GfUrSs~9xxJh2abjBBz}61xl2fD=zMkupw! zW-G1dilXW9e5=bq_w3i!Wkk!*7C$6C65!8(Z}|pg)q9NhPoNLE2-xw^G`t)-Iok@8 zzIkg-x^cQo_*}~Bx1W_-?nJ?T#Izgu2Zw&Uoo)?oH*9d2cAM+9TaoVz%S0!5QFzp<+SJ=O$t=0Bw?+(hU z_7+XdSDRC3wYkOxwfkwb`3CA*3(pv{TQ*j4MkJJQ>AEhQhR3@y_o?H@FH`#)-nG|l z%c}!zE1D0@;hsEftyvar$o_hj^%DIz>6}jf>WiXhr_`QXO<(+45}l_#^hM&fU%S_tx z?DDpx-3GPgV$wHp5?&n3ZT}eh+tt|6`}uDN$2m+setTA=UoEJASc&D1Y0s43KNjTB zU&`L2aV^j$yS+B~vf6XVHW^6cs{=G1@o4-v(D=mxnyNmTGWcUFbaB)x!<`;YjrbjC z>MB#7#w`0;CnQ{NbZrmh--rbcEm=a0?=XevmXXEH`u=w?JM#}1VL{iI|1eR7$t zxk3FtoVoSPDrcL6_eehW_6iA`S{seO87trCJ^OxKjfyS20GMUTTMd^vIs9 zskfP585hudG~@0uX!6TmzW^5wb^*=2Q6t)7oIBlb4|_q5d58Ia;CS=z9!*{~3|;LV zg08r8?y~Z+YBF?n{yWgs?jh)*)Yk%Z#d)N6q^oU1r1LS4HiC2&JrP}b^tpM6bk0+~ z5*mY<<0z9)=i;RX(WjTr#v#&)dF4?W>Mx>kr8Q)KDWh|D4srRaAg!zYJzBp|Wzksf z(|RiGj^*O3=4+gKNBUyCpr3!$lzSjeu%`0b)tlp0X4-Xx+7%o`;UnvOy7KD3eTe#x z_GtFMQ-98*Tx0qneDHud#p8RiGj*B12l)fpg3_8`e8_rYA^m%b#k`fqzGClYbon;3 zmf2jmS~8r`?p`Q z5N&tO5N$V>wwv${ZTHthwB3iw+DC;$**!+V!uM>(%A9965 zzjDUx>vC>Mu_k4`(wOF3Vm@o=cFqkQBAsUEwCmu7Cz-WuO{n)~;w~`j=3SwXGbu2) zzi!r@joDbt>u1t|6}g`o95t3?$y!_e1U!Ynwbe`c>1*nHnx}P!r;@ok zl{xu9J79jwQQta?hE<+tB=J;`}vnBonDiNG7_yIGeq|G~;|vsw4Yx#yqW6^i6YZ z>072F`!T+mGxX@rOOEWzj@hp>a%05P^^!M-W8KA&E&0n+hh+ma6n~PlN4%H)EbNU- z2K~Fh%Vv-AAkUMIr+kOY3%O^XHEC|kvmIZ3)_aPU<=&6z&%Gi4#dE`D{z#dh?U(^i z1-=IYAyrn$+Wyu4fRR?%>e_+C&U?nPYqO>6uX}v|WGiZI+`Mh~UN2xCJ3SjVc6QzS z?R~HR`)_|s=)m&+Y4!>Kxc9~^Lf6B8e0&euFGSx%`$}xjfbkRW7p6%|`%M1hznAY9 zb_enltWOtl@7<>h!SxEjd;IiN7C(+YHPUg0+E<)Y2DcQr;Nz!(nt}HBQvNr=oy@-C zPT-pTNVtA_a{W5!^C2mj6UhF%**6uQRhRO8#X}(eLBjpVPtW%c<^D14dZy4p(LNzg z=}|pULotuuWrq?qm(rs!)I3U${OnDX9{H~;`CPng!LPht!wu|9mT6};Em(B<+&PPy zF2CfG#TPGWS~6$uqKli%7N*hLTH3s(b$yd=oI}Y_N~SZ7Imv)uwkGA3^6J2QYZS*< zxEiR-cOoTK>k#XVGicD)a8ahP99-$sU>Mq}r{TH$*Q&2YPe|@5==g9~U6zu$St#cOH5Q+h1uSoHmA#VN8E zf*VTzVHV-R$M28j_BKHBOc5KU^l@z~iTJDPh5JN^mDLPO;y1Qu+_w z3|ig5YMf`iX7Hl^Sw2qL6yp7a`;T8f-#?W5htz*i`)Qm&{jl_?+@`O$u5NBwv2smY z)B03f%gSXdTclXNY~^zEv3Xs~il*jut9|uTbKj*&LpD^`uDSUpw9fr21?}PbW<$dT zGu_TPeBV4Gqy}^m)Hn4Qn~K<>ksHD$M-2Oo3>7up3y`Ny^$j|o3I7;*nms|*>6>OO zaw1k58=wyq=Ak#>+HLB$(PtrxiD3^?whI*RDE&W5T8vQUzQ9>tcpu?$@>iblhUQ-K z0r}Q(US52u@`cykFlLbxifwZ9owy-4TehPDwgF4|dhrJ3Yr^j=`uWNhS>#FhV$R%S zAMB~flj-LydqW{SgFM+U56?&!g_ADqu*lA1q!HKzdq$q^hY;=(gQt%hTVR%r9zvtT zFB6H_-Bmxpw%si58JUP)1@`gZ*eZK2ar8Nmc|h-M7cS1vG4U7Yu_G4o<6{rY#BK26 z9wcr$5cgc#q$A*G+N!@L;9o^ruus@e!WI>Hi%eFV&2?^?6e0f(=NasY$$qQshXHHK z^n;IV%2g5;nS&l7&U#)pl2Wf$y2z{*CL?4tPJ z{krM>5dL=d@gDn3&*w;9|vCFg%h<^IKHKLY)0kS zh<*3ztiw-@*jr9tJG(1)XvGh+vi~;qJo-TLY4l({e3AF~nb^N-+)_+KTa8KgZmLS^ zEqn=2!h!TU0z9Cxzf*XTv6*JC3qfuXEDO$%Kz(o(-rT1rQDQ3lin{HZRcY<6c+ZRYmz&f=-Su7VHJ zylX+<%$?P)ts8f)KvrC@J}sOqU`{c(!5_mWGVguH9vwCX75QGJe z)M#C3T^*66>Z(fSqzRq=5_;2glR!ui24X5h}jWvDg`t`qm z69nbD+FA?5Tpo}&cl{x^e64aVlY{P55h%_H*D4DGX(=7S>M38V2+m&@>AU~#@_q_& zAHki>TIHG(UCzQqJYcnZeys`p2NJL( zqe}C;iJ#!xa37*x2R;AI`Ub*dB&zRszC1rk3kfbBb{MuKpF$+vYOUs80;ntJ3b!}@}+*?)5 zVLhG5^^SmYPBW0+09Y@@bSA1Eb^1D|axZ)js}yP9K(>({rnn)85Wk(;`H{R;QQ zBPG*;ZHm;sa&_CKcKO?znEj~_kw{t?cALN}67`kG$b#1HH zQYav~bEmV+A<+|`ht<-3C1!g*=c2UV zE1bA#aq_mMc@-zTPb?7tl`RyeeNdq}_S(k5*OklH1W!14uz?)jQQY9-d7Ym{px!Mf zI;U(-F9%ux(sb{3Vc>g<_arU?0CT5HD}7&gx@?sT5kD-K0d@+*ll+g%Wl%rl`H#qD zAbQL5?_k){_a4ukNdJ>R>A4-a$vW?@7#6zbZ06~%y$hYa+%LE@kafysB70LVOwBRe z2>q{){;4yfak)&03AvOvDHj>}3b{6uhTKVvZ*tFMtdcvKvyyVBP-*4}b7s}h4PDK< zRD3x3%#4Ov7rKWD-!W>D+m} z-06}$P&~xGpastqLVt{Tqvk;4YuSp%4bDZ#K`v^{Jorr0Gn_Nrh(1Y2E~Ge|$%qo? zHTZhP`4wmW6h|=J8Pccqg7S~RgF`ko7b8oGus*R_H~Qs}D;bRVVXc?V`ZXaL%$0f8 zx77!4V@=Tr9|teao$JUu7Go0=o3dYkcU)VUud|F@qN`s zMzS~y-^}#0I8QUbs`M29;F|vUvf(LsrJ+2~A$wlwudVIK)!kmn9fPi2%xdCQlBd!z z@QoeVOy5zg1y+8Qr(*1N(=D-@Q?AY* z`AFrXtaBg5UjJi1#;&r~r~5Oqi3n|l+&FKl9iTJaEATUD&8%Sq-wj=Q-`SI^>21fh zvDa2iAFm$Nz0lYKFx724tUn*A2aQnUb(=O69 zV*~w$ap`%#T!wzVeD^8ej%cY(m2Z-K?bNNMeBUa|w`!PtH<6}jq@pZeL+4(;@W}(} z%XIkan|F{e=YX4IhRO4@C#b9G3tpZ(%kpFjfAyA)4-^)B!_Ds) zc~z%xca&euVm#;$;`WOJaJ%FL`I)}r<@bdl@{0xXTf2%j^zx%E-!VU?=ONqD^d&F9 zi~Rhc1-1W2xi|Nr4gK|tGCnImSnNLCA)+xJedt#`T6)L)HLs}+=nr|$nrFw*C$J0L z7YwTARp72v|xH~6ZTcYDr!xCdx?Bs zqQAW|nKIM=@->9V2(#_X)4Df9@~FqLjVbw&(v@vYCZ0F`j_`-d!s*m+)Dzxa7XB}U zPbB=7vT*d^-e@3Pwl{<6V>9=SMT9RY3;zM(Erch^!k;GmX2N?T*m&Ug8jT^jm=qg! zFz{&ocn`l0ekp#}@>|HSfuCeW`=&ELYTSai(cF1(6g&X($yhA&pcNP2az);ZXY6}u z@8cS199bs1PT&K-?6HR!pCU1LevWA@_UMPTaE-nP$FRDvdnla>#=1Wj+@~w^2c!>0J5&JU+r8HNCgi6PZ;Y%Br2l@!yA2uzM)Z3oW!JbD zoAf||vtC*4QPe%a_wU0K(zd$uWCY_(<(J_f$cOPbTf?56#_QUDuH?j)%tj_xFpJi03RAhxg5j%-YeZ-^$iXNhx;mc7f!@Klyc`pIF9pQI&TNcs4@ zkii%E92DN5L4V#zmbLrEwEN%C?u*L8FCzR&!e^C*e}M1`%Bg)JyX@OczOkRwcMO_f z9I_JprtxD5;oiBF&Sa$z7tVk$WS*gf_Ep#~0EfZ*(5?jEAq(8W`v_;6%b|gjybtZF z{H4Sf@9y7+_9$^1jo)oQ@w={GUjKb)dx5ErBdaH0oky*)-MP|-^Y2D`h`2!*#Zegz zoZ2;hM@i4`I^_#Z`gfzvBCdZo8nUrJ&fRF-Q{&?hd}hDFdO-44g?*j2GIygTPkcAp z=c&U`^(_xGcLQDSu3uzhME9tC<9_BZ+Hf?sxXoQ@J()aw^1yr2dIR^Q^ET-$&f}&%`1pS!GcUU*jeF2y+=tfF%ROn< zkBEDR$w&59YJ1&#(rW30x?gUE!cJ1uW+<5lTI(XmrP3B0?ru@gbgGOU{nlVpy`?>GV z9ka1<5AWsiraO!7{!JpMab5Q0Veo6hb|R;DbPDRtc*kB>h<#?^MDq<}V|@qv4f1nu zW8XgJBFvpAn{@gie5-_cIJ z{)Mv_3pa3Q&3To1?S-{wL-{G>qdU*0k*2vJPlibhJQPesh)O}gb%4lzG zXK`OE`=;C3L*x#)(2Oo;MKAlU@ht_-FRLi873(V8q%iK>(cN}d<^}TUaPPNce$_fc zcu?ND%Z~lHT-Z)J8`(D(TqSwXH?wOosIUm!SPt_+hP_SJ@2yHV#as!FwH~;2Mkd>6 zZ7bX#u5om)*&@>I8Z*baKT-=H-0A3S^Sn1{GvX_cg`}4RFOBwX&`7gW^X*LbYH)S6 zb6ajcW#``0Ladkc(XEiZj@iz(LW1v82~RlOMPi+v9miN_#qTZ5CokEE&>a(q(Y~&7 zTlT$1FGKPYwjy8$nI{;_%D-uD5xps$Nc=M<4dg9PRL3+ol-<7v-kBQv^sR<=(mi#z zdiU?ugc6Qy%FBjE|NVQ{7~4%j+wKSoYL-xU^;zu)hu8~-H#og6{?fQL=$c#zJw?X2 z_hHC>f$r|xLSC}zAvy@rZkGKCLl>3M&ur?h`})F(`+i>AyWELpx(i*QP`>MFjVsil zm;3tg+r7l6O{Y!@#YCB{V(=kqxrGuU43+&+vQ3+i+h>2{RQdhrZF3+i?TXHN2)IQ7eSK%3n6p6@0P zGCPOQLw*!`bpBxO(}SpEik3;Upc&|W(Sb-mgE3QtGW@6?bo^%WtRm1l&$Z*XdY&U_ zgMFyZ;A5QAmdfx0FmQSP9`{5cem?MK^BLgU@Eq&Lxo9c!7x+AzZ#JGMz6<#Iz#~3! zwef_ykxsp+8+9B9bP)1L>Zw+wg`tn|cM;_{Xm(m)XRJHwLY5&+10%b zytOf&hyJrk4QMy^mcg^2-+s@3u7e4DqZ%oNodh*lEg# zdGNd=?>6q6({cVd-?I6AwR++D^Ry)!sV5q)%p_kU}B zL%$gE5tfVc-o8}j6`IRKy{^DH+k6+aA8!XOJ3yoF4a;rjxsap@${W6Cp6yr^-V*B? zsETuMlU$^C0dL^kC=dJxru4T-=L66mZrFM~Xqy9kZUEZ*ORPT{BkAWpN`t_6*oUKMB&iAl-&^7t+je((`|T);vD_ z{I6*}^zjn0>+PbR&i7)8tZSkSmGJyFn@!#h`RDR)kPH3XN2WBoZO|a_I?Pl5``qzU zSnG5t`n$-~-*=&ZDGvo-;rnxeXY+mW-PJ)h@a#^W3B|EK0k(Sw>P=rz?lnZ-@GA0< zq;T^N`l4YDKpl?nsu+5l6of6&2i}K1tp+XK^mkQFQV8=|(Aql-rRJNyS=ltHTV>O- z0kutI@g69jt5M!H$a{bXdr(Q(PsEM!gy)ZfChB{_PWLbHHG-aR^K6fQhBS+NdmKAL zHFvGw9$zg_h7OY#^MxnleQ%H7^xetuZK;XvLH|G8#R@tg9oEEdqCK}B@456Q9S>*G z*inuI8j>P-H)zi^;E@hPR}7T*A%EugH1dI!0=gP_aHNL5TrnH^i|3%OD`8(zp4ZBD z2{Prxx+WKB{sxSj*{H)zsU|iDc{)(P?$S%}E&LfmTWFJZv}!&~(nIhu+#c8TxrXtw zD^e>@I8oQcy!2<2=uX=jm|H+B0$_*2jB9 z(_49#&H&)q!E^aM&(!H_#Q9#Bwi5i1=lGGQTd@yh1>!jWGw!dii4Afei4}T|Kz>wX zyyFZpyhC^YZJ=Z5HvOw&T#rwkZSvpMU=O7l(9|8#jYx|era#$sZG1!5ew%!X`Ad?F zytl{gQWe&xp)cL&59rIE!VXbv&>DGzW()Gb9|&iH)p4$0&u3@geZf9ds?%S8@Nmut zXftE_Nc`64?Y{!g-V%EV`!6+uXE>navfn7LsasO+vE7>P1)664s5|mokON~j&k~f$ zHw6ymBflAGc5Z`bt*}aOla7ip_6K|o_N!{}0Ob80%u_h-1KksdVCsn=7sr1W~U zMe8^84d)irp|o?WHQl}(dW(K;wb1d!*=(Dj<5Q2GQf6tUpW_b6BD3#&{B5<#b5Mrm z3Y-Op_Dys{w+BySx#VdUPhHc56TzlZsjjIA{os)x8`0<7TaS7o^O%h>Cqc*O*_4(m z%4D90UR5wpz99lV5qWZLKKYxT=Nx<^l-?eRd@NqfA))I-&TG0p^?V!7{Dq$Xwsy{0 zCwhMRz0UOfT=1aI^nBj?WAuE^nd}$`LeIzd(2ROMb$os|HS76B=m$rHIuP_|cSzIs z9dal}eP7f6F{Y^R+YQ}c===jBct6ltsEhSQ9@P2G`o5;)%euZ#T|XD+&vmBj^V_Qz z?}>h`oX-{GT}`;5vdIy_nb;o8{XqL%8_*YJI;2N5-JiMv?E}dObbX8)msA~RJtXL> zJja`L8{h%0KerCPsu%Q=e;|Y9+^9Y`IItb~UM@&K6ih5Z1 ztpNNF_mRI#dL&+mbj}MnhY<4u&LfCl41D5JZU}tNJNOK7h5dx{2;%eH^lb1+->jc` zE|H72UT7}Cy^KHaTw-Pb^KLxJO`XM1u>W4_!4u8e*s?+JV%>L{E_8x4$-bW z)G2)~kqcTDa|zNyYAyjjSqPpe<`O)c(>#~(fbVhsPMv~hmU5p@2gXTX_m&v<$zoqo zzhz%h9~EHWodL`U`KIoD!7fjuGG%qM;z#*K%1n@*Rs^9@0I zG1_KvS2cO@j``i0^MME9zkz#PvntDEFtedgg0H>evTxU1(SdOzS`R%KYI;im-!n**p3*Cr*J8RLuxzI6_pcM!7(z8FwZGOx)NS36B zV_(B_q?bI%4X!1~K_3a-(dqg7IG=qC=fx7Ydm8SHYhX(<;di+Re4$ry-iq%cZ`&Yy ze(04^Kg?wd9*%zv`#rFH{_c+7%$vWtA0Fct#_=qDC?XZ`(a`8ZvoE|Y`NPfh*;)QH z)&RjSL;hZgc2L&j!Uv1(qYa*ElqDjqOIjMgzYv#sbI$M{%A$;;J}zWtFVIE@XASD- z7FNuif8PqYzG_GP%wJwEUEqwvin$MHi?+4XT(ZQwYsq(!W#{K6R?NLG%RJBHWzO^d zEb}~%mpRV|xIi7=tL&l+wI_wgEHBXS_hp%13NJ%`_h*@33hzSsE!LOd!kKff?iPE2 zHZPvL@O~1I=?EP9TX)`e?NFJy3zl3UPaOQDm#h0t|BpHcvlxO@T$smb7kp49_#39K z8%Duz*rq8?65Kx|;$faG4Mt!bx3tS|%8LoS$Lksd;%CBx-CBEQ1RyWw7qRNU`IqG~ zPxug}^2SfeGnDHD&R?S3DM%8(d3OZx%$K+~8;Ph}K-?qVbs_>N@ZgJ;Y6EXC1m0r) zFfM^dXsWhU566c_R36`oB)CXx?Z6yU>toR;h)Tf{_*09QfVjwy_skd5XQmSLb1?Ur z;w*=L7y6YWv8>WmX8JjpVN;y%8~fWDSB_MGUq?;xwy!lu^W&f|hkoTqsJ0X|VsM+5 zKrY(a6g??N`UZX!ney`?e*SF79O)*+`=&Z9NBS1x+fDJ?5U()BXCXe(6h}05WnQmi z>R>$8eh(GQ5=|G^@0c$eC|MISNaWfqu20dJw1LFFt~5Qs_znc(wgM9Wg|z#TwD@aj z@!zJ!n-J&w!XBkse%!rCTr7`eiHmVJ;uUE2a|kRyeSOZzH2fP8F9HK7H1fy3l&OpP zElP_oON*~ci*G>O0Y~P;$dl#oLVOyC^d%6#)*os3|2r-IVOqR*>fP(>i^inI?@Ehf zZ`IVr`u`v;{*$zLLt6Yl(&CA1}V^V9CHN{eq#i$9+he={wfOpDu1 zB+mMDON(Eb7WbsZN2kRnr^W9;`~-|>^au(bR4o z4fpuDhX;J?2Lzgz*y!8;bht!m<-+gJ4J=<-Aq5O=Vd?TE%Os{QScvtc%ekH^n`kMyNeplSTCl2li=)yO<8;%le>B zJk#lcj`~rZ7s3#W(b7(hxg=+Knhr1xa4FdZs;M7dc_Ew!G9CSihrj&8KXEpoM)l`U z^wCz|p>AK&k)U(uYRk599?+8ezrTEeHf&avfht$dUyKEd4=h<&zQBCCXW4?K_pQ|C ziRJgqy}zvdK7DDQ{^~Ap=%;bOrZzs#PbkhWh{Q5ToWGgXnV4V&=r4Vw8OMsQ)Yj;7 zy&Cl^u5+6LcE+<1=MZ9j8`r9GecRIpe2LHlerdo{25d3l0Ps-W_Ze`G0l6O&)1Nk= zY{1V9=mpQ`{b>da8gPdJ8x8oL0Vje7b3I*va1g!*6Ba;EBZMNKG@vgB@vFew36ZX? z8$`Uth!;aW;{Dl#xWB`QA2s4Gs7t&*h7k9)vm6mmI-qNz&1VVGhR+C5H!8t4lx-(O z84g0^ZcjplzJyMk!%hf!;vsZFS0TiD@6~`Tce??pbM!BQ?nQVt$~V$W zkw<^%@7oElK|783806`Pa?3L$Z7{_62%)=7B!n=XLWqe#H6YKLlu$O$f-EBRBAt+W zJRv4BM+q^Rc!zK#>W@0|%*m02P?Up&a4N4Sgj4WY!m(&C%I4XVBMG5EKT3E5)s41?67=0Xq)BN65{>=1GXBlwh-xP$DYA}sK-l$Xzyo)SHssFG)Fkc zfbSUai~$`(^!tT`S7M(4oMQ&I@I7NWX~zA&MtH?$e3{pi?f`w`YO@y~zlrl~NX^eN z4F3e!q;2)OZ(~o`V0#8>FZMOLLV)<*=|&p;I_PsjpRg{a`1a?+`a?f_-aNl)vCErf zJA4pmi^Eq8-nU^`RcDF>qjgC~ej}uh9p; z4Lf|TJXq5;4c{+HJ-|o3dU|)pSe`vt)#O5&TiO}(h1N9%1BfF}hadj(sFMXg5DwTy z`F(`G7h2sS8)fo^GYW4)xlTQvW4bG_)J!~KVRsGAjavf}$JUaOP& zc~DokschDdK7RCzm0<_2mwpYu5A-Q;@=+Fip_^Z{yavDTx1;Qf7aQJ<23`KB@bkv# zXvR0^*nv)-eMvh1>`Rf3pFN3Z2cT}Y`pxpA_^q9tY53d>;QJ2YTU{96t?Th#1F)M0 z^>^PDcKe>F_eAys+fj;lY`j}Xq*~6CtJ}O=7y6BD0xNo)zO43o_#dRbS2x}(`_GPk z;yZFncQgm_4afyNJm=&)Wxv{jwX)V4a-KfceQtzCmvGSAwwL{7Ej zN#ST0l%IpTSn$m*7i|R_c{~|;JnEKFt_(|&f? z$K6`_cQw^LB_HSu&ls?kx!}k#OeSV})?i<+>dkbyi_tG5HAt^l`%|$)f z2cm!3X7OG-*rNtqU+hr>!P9<^n#*v98c71%<;+aVMc@TdB^|YCKeazP3j?o2tjqai zZJ!RGk;dnV=Rg1(*76fsd?tP%ofmO=U4uY;al11-h}P6I_$d(&A}e)?{2)5p;N^>o z8<+y`X2g+2Kx9C?Y;1nxfOm&@2vFol2(>14%|u5wA_lcWvmmh=5WQO8iMApt73RUI zoIi|9odkXzIR^Jb&);W#tc;&l1(A>77g#+h(?4{`m*Rbh2}d`KW3T zfqQ`BEE)}l2to9k4i7jR?d1KJ2ocwGaOigj@M0MsKFVvHH|^1`OnXy|x<31JOt)iU z0Wv?khO6c{OCYYXW4=xQVjeS1EfQd^A>c z*Q2q*&5wc)KNfQY7s`$x`~sx`e72wY+3%X4gzj#fsohXbD%#l>zYY(A)8xa1DHVYGm$DF*x)ZeB$4XU*&!cy!Fla5I{TX>X7Dq z1?s8Oh2KzraZcv!7|sZ6wtlcR1l9NS`xfbRDc}NxN`#*x#1Q@l>31OPML@To_V&tY z=02tLiGn`k{Oqe-mmP}d_ShD8MX-*=J%@Wqp1#WcZmiJvZfuC>-PmC1U9AB6*g3#IU-W`>7 zc&D}68J&*GYPp7Tt8`0~&A-0M0>4^|??d=YL3i+#p-rda=b%SmrXfQQnt=H$&I>PX zehR*O*2tka{i^MFC)l5(ANRJv8fvFo_jNcem7a?EeDINsoQfeI=r!x%TXib7z7%Ws z{HJ14phoN4T=c6II*nEIryKq2sg>&@HF8keAhR#$H0XUfqaYra&`*{K`cgt)qF-1Z z))Q*y*!&CHGC1pIgT5S;YUFY78=2M+j!qmGj`}R{BZLk>9})Vd)3=#>r`+p)UvblC6?M|; z1!zTJogPMCSlxdgN8g;5&~EmD#SMt(=#N&3Funjf5!ztEJ@$=NyN~_=4)3$Q7Pb+A z&)b1x>j1}!`yPZI2sYs50MFh59{Y>*RDf^=f*rWIz|H9Z_ba$h`Xk-u051=CID-iF zZ(BdoCTTTwAH2W{|DY;QrPe;u@~!NH$f+2|)sPV0hp(>5g8Xa&&_QUU>_VSfp^tL> zeH(;r(rpUC^VocNeK`vWMVj2-;pxdcu3G_H6`T zsm0jE81+@lL98pPbZ-Vtt=DL2<~W_6?%W-ZvwtU*g`<=24M(rTdmG`ySc{lD{!%Z?D*P>=SZ z4|2ocEfVerp_if$s(m=49_`5WqkqvCY|DD2vkem3!*-CrND`id{!0D>KM(NK8rc=Z zdM3=T*hczX&bl`q|CKu)zw6m}{8UhHXQLF4-@Hwy=c&8H(O1EjO3=0fv|~g)+7s0I z&L9cx4x!CH^g$Ty_oMB=)7lL@OHijBt8^&#Tli&>wn^9I1qkv%=*6Vz3(-93Ssx3e zC-7iA`-UeTCk>O{FEk!VZFzo+n-NU0i6akfurd97h~a=JGi{2J#->OJ`$< zv`*USZ0vAMb4+wLW_X`tViWt$hkgT%5B8AWtDCAr@RJLpPEu79X}|$~gEbR!q4aLd z8LpA9io6T{xk(=42R?k%T%acjJk5bIUs5hY}2Ll%_ zs5knEalY#z5%6&Q*4AQ!*2sh3z!=tesK+Q1ko=eHNV#^wi*f>y_mvrdUig=Bzb;pV z`oNrKuIKc81A5CZw`n?x1V3V~mvUi!s15r!Oa4b*d#>Jjkl)0X}^t^49QINgN8*2x&vaAL0ogGmn$G|tZcNTT4 zz71ICbsKz_1Hgsu=JIo|c5 zPa5NQ2gV0s2sS3dZ7~-h&&*cQuWsri*aOKPyhr9-*pB&lH;Hp|oNbOh8(i4a_~Frm zWQ+IPu{juydRzGZD=rb#5h_pg_wg#{c0CmYl z8qWrQq*$jdm-m%8d6ygQ7PN)EB~DBJY-sB(jka>Lr7g%@H}=YVgL*FXe$tjbLidC&y74(5JbUL~nXFXIm zu}#kduMK^;b^7359i7n!_wS}Xxp*7)9sq54E3wAbw=GVZDcp_qf}j}(^ezX|NHf&I zwDa5nC*s}GS9eGF#{oSs7Cn%8?w~wlWjK1?_dq_{K}U`-pdU7IX_HK! zRtLr{`AP!mh`Cp=e{}I>El!%Uvp+r`x^jv9G(Y3V9;` z0Oq)*(9t3&AMNTA*%s%SprJ#>GW*(!avq*A5OtpuvqfIT_?ZDc=9e1J<638ym*)#d ze@5B>Z=^r84fW*S-L$dW!g@KjV3o}Km>X-n^Bk1ap5UJvkBfwV4%znNIrJ6gZ--zL zd)wwY8n;D`r^2W;dx(?kniuX zw*~WB1DR^hk9Jk=k>QedwmLA^ws}xL&z4vt(zUjLU-G+!Jq#Nv+DBd2?*2_YCjfn2 zg6@lcXP?{M{{dfmyi3qN)106!{awt|`sN>uF(ckUbRLa+hp_s%B9@lJIJU0f%;Q_VB4`D7LR6vu8Z-2{H$K^q`A`NlJ5nw^0$N*Pak3;B9pFl?EPwCPCG_&3HV#}U5+jK5pw-;=<{A+Pl@ zSZ<6#=me=T7&OMQFqdNxI-Ip^d)!)yF}NFXv{fI2vtpL|+uM!7L1+)h;NKy9 zA7LDVCMRX`gS(sY9l??>g)I+>G3aOd?agboF?hFT4`Mv%58HCx*i!=a&GlkWhe#)5 zaz4f+)*|}QhdJm&?Og-nSuKrm@y(zRJd5jVitpwA46yr47&l?`JL=%ZSj&r`E*^gq zYzCM!;ampJ>%q4uAGqekiu+wW`j{h6YdhvJ*0eEqH1+O2!27lP@Vxa&&XjThg~O)`-}OGav027Tz2C}`gfF` z_y!%sJ=ifN(6&T8j5BGl5r<7yyUv>OVghk_U4uaUOn6@4h-dIqVt(0tM{(+QXFj4` zB9EI9Lzw|1St8zbA_6Gz@VzlrH{Sjx@Ur=iQrZXK8Gw)Zf|Q5AesLqPpF~^nQ}V$d z;aB`&T%ueN?+AX8-%;qV!tWxemgc*%9guN;pL!bi=(EcB98<;EuK5Tpm<)N0`_+is zA&|moEb;fH;Xi};9(1n9xX=2yd&4g1aGx?t=o~W>0zUd^dCd=K zPJb6F6@G)bD$pPOK>#}pxDVf27=H;05n&O1TL66qd=4GS_z45zU`nY!aQhlC41(wV zdINq2CeCK)QA62gm8&A(_7Clz2yZJ=&GoH)M@Ys5v9G_gW-zuW`Gy zD<(->W&J!jNxJshin0~hxc{3tt?vHO*Oo6?cHio27tNpVx%S$H%gW}JFT6Ie#1vVH zz3R))-@}&n<=pcBT7E-A@`5ERwPzNtF8h9?ZQ;JkRxlGWcFHXMg&u2{Zg z!Emiqt$JSykJit`<=HJI!{9K?{r0f{NE)_mdBwtEkQditDbW1yNyEm?xMf&bMa7CG z^X{uyxKgWcmVY|>_RX;~yw~3bxZ|{K&7K?`fMSg@} zYpH7vG7lq$VXg6VwuAki&fEE||8I~kE|H&z3)nV2M7|UM?OTIF#Y~C&JDbBv$h@{c)lJwuElNO`%5{`w!rty zSyZ_TwudcEg}Z@+xuItp;=!%*fO~hr*1c8c9@;(d?I$mQ{c@p;p6eks=X!Mgl(xAc z$b;#e!;85i)4|TQ^SJ2irqvN?AQfkhw=w2{Ztj%6{T0mjZG4vgM4jQlUr58DPTT`J ztiZ$GjyS$oe@@gX2W2on=-!6}-dn(lvg4K`MTPF-GVK$Td3*E`-}lXV3li&9_XPJ7HYuxA8KE(@lT){J?!nmff=)@f8S@ zaB#_eIQ<1bCC|bID>-OA%NF7s6-k;<`W;UhPCH#vv2Z?-zK*mudCt9M+_%4l#Q#D3 zy&nB4F7h2->HPf^2J}9pXX5WIro5Psh^F)R&hWg(GlIVp&&)qNHM8|+3@#mz%$oRO>K#;^zBA=M?Wt`y0}DsA}(Ot zbba09OmS1nNtL4~N`6ng>?euUj9bum6671R6q=CpWeS{yd})WzpJnu`bo-q+B%Z1a_JjpXft3;z*M-aOm+n~}Sh!5O2Qgjw$5~WR>F{4Ft6087x@Ug* z@|6pjRG}?;XL&ro$ZJ49A(R=8N1j_0A%uSZCLvzzSp#~|S4{U3_J+ScA@FAtVlG)h z*cX2K1|)sj5FRB2@op!C5ZOTpf(;WwmDoc_en5zcDEwozbqT{qjTDEnYr;FD?7n`K z;Tx8DZm>@uO!kpz8)iAsFmklL)7_h|{eS#sI3O5`4G3+Ed9XK=r+!-u-yI=e@eRU{ z5ZD&$>j}Z<7Jgbm_^{ynu_KJVIqSE?_Q;T5LD)4zu*rq1xFvs!k*Cm5N~pC{pb(2XCF_}!94SjXP=Jqd<}Vy zBa<>t#3VoK;6zNQ5EnQBv)$>JpMM@j`H5kX(t}C2Zj(UZJzfO}{EcCzT@y_>Ob~dW zlQuT3&hUzXhr9xOmKX5`>p!)>B0sQ`RGGZNvmv3MrY?a;Xs!}AZPY4-VK2eN(5W12 z1-}?2GSMHw-}aXY1vfu92YS@<)G+r$W|~I~CH4WiFI-Tj@AC-(M-O z^G}j3o=HuG4dLi8*Y4!7X-_1F)d8LWbVU(wLLBf!Q?j(clbBgnn3%o0C^08moH$e9 zPbAA0B+l+$ocJtSo}h%ux8@}C$LA*Vs{juIT5m#p65@adCnfR4uV3FlDE3IcL;e}0 zl+BNNcqYj<_hi|DI(4%aKw{2=v;-UvSOr)Gco6X5yrd0M58l&|tU17&1ROx*-wow; zs{%X-h;s7rwI>L#-F*KBIq09%#4lOQKi^-)FU(Dpw8P-7k{9UHgaO!3NV0BDlrwc; z@=16ET0(a;x0ladxEeN!1;(B*dVVVnEo}6Ni(1Q7GP)#d+x$rV ztzMKCCg$rKFkh~L=8ywzCnqpjo1f-zK588ZtzjrM2*87Y)I2zcr{;kSEK_T1hh^-9P{|`fSAW)-aM54Q26xh?3RbT`V7Tya|oLBK71x+|E>;Szp!_^=wl| z){k{Vz2HZwmFG0-WUdeVd9{1!(l&MZJ<4)JQ-mLNtfwCVc98)d*iB#;>8vlUA>9U% zs+*}ledq&U2mL4N_C@p;&TZEE3v;|S{ne%}=qK?$F1CND6?#0OULNnZUOmI1UOnr# z^>T)*++FL}xpB@~N|U_YrR5IO)Ko}`0!R)17SgiOghPQM@X~D!o#CZROX6iCEk6Wa zHqx?!5+9YyBrPj2=)Nv0Z)ykIWWG!&NdC*0mK{yg|7vSUw>7L>G2ak&CVRu^(T3#8 z?kn_&Q6om{n3?Sj+#Lv4TS+%rpL=vPpMM3M?(@ti|5E4kw_rX$05*@G$>Hde-f)yw z^CGO!vWDTEnP&H}Kr7fIY#+t2c}#=tquj88JPmjP@%I2}3n^~GeZX=++C-iPJOTJ# zlVK>rO|F4-*) zc9t5Goh2_PnO}oG`kb&MJIky8!|W`dhwk%X^UDX_=Y#I^LHGG}fS~()(0xAWJ|A?S z54z6>-RFbu^FjCdp!5IwS#RkUnUeJ|5f`mz6qWG2-f*WDL7nr`c3N3_e)pjh8E}WF(nuE zy{n{TwBdP?S^s=gpY^rXKVkbWs>f+bSPf)@<;3n8FH2_{Ka@)UA+`=W7FQZt>ci0> zRt8=LeN^%{#w>xxm^IiKD~!^6q7f_H8e@GHZ&3QKu2Fh_m>a*cwpQu$VP3r7_Kiy4 z4;}FMEI~Whr6x)X8sxFt(9k#pZhCiA6DP|JOGH*_@~yLQGWXf(u0*U z%Ifv=5OzxlH1**5+2U8R@|WMe>JwSwjs9^6!QGdtf!9R!^<}jQ0Mg zQBRg__lH_o9`IY3?^Ubu&X8}>c0lCEyfkkRwAGvkPncy}$9ce#49^KT3bpr~_!7M) z%SLaof7&v>P(R_0IpvA`MU!RxwAN9#MNnz#g&6(E7Xh33aEVCG9i z(?@G(c(`a?0LFavq&TFuysgF#G zJTMol(8jDDITr(Q_?S@_r7`@e#+SC&?iW11SVp$vi@1LsUpiU-b$pR0*)`rI25L(B zogZIg^zk*u@F>epevKU^#9e0j<eGwshR&qPL;7U9;3dYorjJ{PzY6!-%17Y$ z0)8* zm949VU_%wf&jRDOkgfE^H(w%}E?YapOP8(0V;SNS`K8O&*Ki{n*~u_f2(<3795Kl(a>o_X{a>P>4q`hC~_j`OrNkzFyH zZ<}KCZ&M-`m)ujvPT`JVw4yYkR7{L0_XiLbM3n32wkjiUZB<6EZB<4sZ&mCw*GF?J zYNC8r@^6dfmsTnHfhr~2=ZG(16rREEROik~(l`(L`!XFBArmPGDk(r3e~VFZ*o4EM z0xx}3bcUBcDu~B2#3k}e9~ChmWHTxjWT|l;1|BxYNL`}bR6++oF4?HS=Fx4po`%}# z96t8q=5;0B?7x%_=twTYQf2pqTI^l~A3`YttRL7ru!YtSDFlz`X9g<0UoKScKUt`( zet)3SfA~=4tG5;_4=x|7tl2tDx$>DoN}rbpE2~ZpRvvhNkkbD~+@Fj4YjJ<_=a4HeheR zV|9wH6&9DGaP)OpW#0JRL(1WTaP-$#S1CDTV5ON7jvm5ZVsDOJr`RKvEp{2fgW#=f znKk?>W%P|#DRPlINB_PcJ8N-JZUh0D_zg^X-E zh`d3+eb#SMIf))H@REaKA^}iX{4356uz|SmMN7}Wfx0S5I(j9=M+cRFK zb=w`mKBZVgDEVOJg{9Zw|A(05-V)1OP3vhX_VO!@S;LJjgYK-CZzSCvw-S}@bVliF8+G#V&0XrQnY8o+#{Ee$y1 z;@w;1h8FfE-@hf?(871mRU{HLJ$nT29;-^Y$5_6*Ql{@C*JX;V4*Ro8^2uzE zx!#h5_JAJn)kMKQc~NVqQ9=F+=u#0h%(RYZn0TaN2{dd4omeeCIlT?%LV}JPdkfld z8MJ|Xd%Hjv$ftJ`+aqz`L!Fi}Pitb`NF%Ht_N+~{Yn%sT_A-?#VIe$FMZw<-jNjrG zE&b+8;HArz&hXOZ3h`KmxI}*Ga^*wdWg}PUD;Y*+ndV#Rq}yAWwa_#CBNXUj9UD+H|-BMaL@354%mHIUZVb2(T{?^iYC3kik^{v75!<~ ztD}1yL!-6;_DlyabcSoOm(Ei8r;eiNo~}cqUA#frj<49x@Mf7h_8;Vz zQ4c%5Nb}y2d&AM^0}a@J(yYS^&SKPISTql-6?v{!i*s1C8R^Z=qG${1ofmjW?h>3LYhTZg z)+s+&e!J5Dc{@{ZhkLAkgJ;V$Jb^l1GYbeIo(~#1H0~0?p|D{uzt;2TdqNy(D%8+qJ37^Dg6&Tr1V}s z3-iL+N{{8JQ`>z1@;jBjsDIzJ$nTjulr>+wL+Ok9_x;*!%JGe$mtZ8? z0Qel>tANh~9?{Z+@(;ocu|&dzo9Wk;f&vgxNM4R-~Ei46prY`^s2o4`*XE< zlxdE2{*Li|zTFe|kD9x3{_+ZK_ewD{Ge0$V!F^@r((tikF3JafNcnX6 z66KS%OO@YmU8;Qg%=Z*<+Nd*F8%?}_kCNEBSov)E_Y{ZxQ1tg}%b{t96y`^q#M*ll zb?ZG!9`1b#oZlmlPhKupK0CQYyFdHycEwzg&6xFtlpQC_m4Ec-$)B!WqWlQIKUuz1 zNdkVl>wAg|&$AxCe`cwY>#vDA!yC1{6NszJ_57VI{~6>Be5qb;?h@V<<$WoF-M;xe z+Wv?4=O{0|zggi<)Yu)>SxK!vya8+C(Z*-yDF3<~+$|VV>QC&#tWo!xr1k{igAx8wKf9lK(L6;JChAL&2dIz)LKX%bd@ z{dnsb<;QDBD=GNC9+!g9;6poOK0Nm^tWZCJ6-tuB&5y6`qx=N;+?ib4kvwojYs+IV zU!#2d%uu9XBU|c&3hQSH0iv#!ARy{$2?rInQIoQ0KRGwr)f?}pH~PFcPU+H5+<=b~ zHIK`UKE^!wr=t%uZL9@turE5JkI-?QKBz&Y)5qD9S1T@qF1QQQ4(+|`kaWZN%%^t6 zW^Ta`6?wkjKb=!pK~4|AiNewY`1Dt~G8)VjUOZ|3h+ZiHpwt(ALWS=g&I{%%*S z_hMLC_SGo&`%fxA2%l6e)av$Zh<*xMe*Bqhlzh;U6b#}^q)*N#-G_s*D>^N!OZ2H9 zI#Xr+_7T0D#i?>ODm+byG@M@E<7fxV%s1$mFv zJ@y0n9(gnQGTTF*%w4$>&www#e2=2>MbuY98hId3YbO75$bhKpA6rL1L{ zzo&e967_g_smAxa2I`^-@a@FfMbL6V7wEfO)Rl7L6Ro~WKofY*!1u1&73&Il^CLX7 zFPJBPg7hCPUyMALC`qKbLYt$BtxFX3nI#JIp)8^dAn)h6=C~1jzuXwx&d|o_{y=H; z*-+_&aNSFNJ{pg#%i))mAts9jGgC~_W0lY8cT{^1q z4)7iyd`^FdYYyx0vFqWwXg=QK?CqPBeyeMhIr}y!y=&`~DX)Sy{TS2er*uA&NzS-` zq{|oAKYl(rbLyw(<&2PTW_d$d!||F6c|$ovc|)0^$s5qt18Dbye((+%bQ%GjR)9`h z>Y@)kinKkrhdvg7U0CDDMyWqC;S1 zdls|H{SjZZ_$Yoy@LTpphqdCjjM*i|nI^ydkX-?UAc7p~UHsSam^IJ1RO2zc^3sjR zqnFWmJaDk{@tBQVU-QJS*qVpGJh^^0+JRiB97vPvlyR1@54=924BdnEoz<{tWEsC$ z9pJn?KCc6mqMkw?TOpS^s$UMi1lhGZp`Ng!i+bkxP3eL2>AB!Dd5>Z!nvf$r}_)J)2c+m>7 z60pVC0+Mmf3R1p&c|a^sz(?mLKUlu3qO5%G!Uc;KnpP%!A8Qw~!82pszi>sxlKGkP z>Ilm@yu|AjeqSD38SVBZqq5#LV7uN!Z7n7fuxkK(VCdmx$6hXdYBwmiZ?91*f=88# zM~^9Ewzeu`ceN@W*oeD8!@=2U%H@DB>T+fsX7y-;9URS`MLYPM6vX-o;5yJ|*9F>4 zT)Tnm1}^uy>8yW<>o9Qp0(U?LT%0=`qi-qum8-5!(w_S#Xba198)foa2+JJj!SJ|D zZOC?GRHKF|u1L;C&LX%c&;BuAyvHk@dv=DG&OM38GQ=hFOXr?<052Qvc?uN`BC||3 z$2u$Uj5~_~+U2K6hLy4aF?{9u#;uRz7f7tOzsY$M9`tBm6yfoSdau z9zR+;U$fqR_{;(&`SL;~4>Rztu&O=|>%vdAu2#0wx*C+5X*vD(XKG4lFJ7xKLT{D*cBuEtWt+guT6doet6rr4$`cgKY`_o)=o40 z82*3T;RndPq|#uF`C5EZoO?;Zs&NI{)CXvD}YuXcqF#p zi`l&|B=0ymN7-MB-~N#N7=HI$y-pGL==0ILc75vp=K657=k|381n&`~gnB|YDR%R{Us9ZUvMoIPOF7)R! z3l+^`11p3SgjIOg5@q|^Rj>>%f(1}+{utl<4!plfvs7P|p-<~WdS5;r&|yCM^vAmf zDUYF_x9=LOY`^ikc92^6kI|<3x$*Z_EE09~Ak$HK(Y;W>GD zwA1TSXsE-Gd(tQ&#Z%2XpW4<}nc_w4KPJBM18=Nev@bL+!B@ExLu!yoR^B@pi642FAj z4TXES!rE!!{VYW@ntmcr$6n7tnI{n86oZyi($3gBZmgHUp4fkjc8zJkT8gGR**XOF zdhburrk|iqKZ$)MQmyo?UypSXuyY1>#;j<^S3b&*AIe>-oz~kk4$sKFPIyMX8|~E! z&&YkwI6WGF`cKZNR&RPoqTa#-<%N??}$0^H5(0>PzoP*3pIM$k|ZOCVItbCxGMI z7W#K1n<&igmX8cWQatgF9QeM}WnTx&C%QtRvCt76i8pAsBV!sm$7m_o$;6 zqnTGw`z!u@dhS8&$Imq)ysXlP=gOr*>Fhb7cYS>ByEv=uQ{%o(I&eWg00;a+ zwJh=^-v}O1-wYp6e-t^OuJgR8uJ^sDZVbMtZVtbwO7B&vlIyT46~C%lT5DB{%x>s*_ubg30bvZiE2BxI+9f z_&~=ez1UnAJn7|6zzZho?;aIBKi1ND!BLPk$4@3+U|#uY&M%!8bcV-%L{aQI?IIre zjkrWr(|N&8-0%q`K!HbS<^|L({7B2h3-$pIdlRNEkzXpIgCCcS7hnUECCe6;tq|OR z%TtU~0ogE}7nGEUb=%|!nRo#Vep#P0VsuzLUeFVIiJ2FS!uZtq08UcU_`pWz$0qa%EkCyyGb?kh}&=8sLs9vykdww*?qK>>^|9&>^{q?^NL0Oq-7OC z4Z>pxd;Ljx)Sk{?G%=aK3ZVw!v56XPA>K>Spa~MM8^Mp@K`2G=BKVBJ-%Rr$_z~O) z0favXUa}ntKcXmhopuo~8(#5m!1Ec;5QuUK z&AehUGWR1b6R$W5yvv4HP;)SNg$E5Xc*RKbmMa-~MTzjI%&a#&t#?>EUJ*&-6?bIG zE6jW%okz6e4?{gk@(0UQPm(;svec6#pRjE5B*`l@z61Va&hw&p4|vVpzX0z!2Hx{q z@Sfl4ya#lbHSY;Ny-5w8*sKQMgWlqLtsO6_+_zb+JX)t#wr)`?9j~iGcM*K)&Ltbw zIS*`9@7}mk4gB~#pUMZH%AbX>2w@dM4Z>rVPWhJQ1@NyU2yY?8{mBy@@Ui^8;Abx& z96@+X=WC6ip&-TpFAg*}f*-+yP>O)Q_>16cZqvXgAK;bF*B-TJ$JZvB@?t(BzjVIV z86Nu-EG58ac@ZxgzQ&XBeA*NGA5ku$xk^3J4nNW|@wE!zT}FIujNof0&>(}aiNn*h zNl`|=Hfl`Pdr$5`+i|twYg~17;1K+1F&}c5>hqz9!Phunp$@be@gDyPfAFh3$!;?2 z6}NkmHrh%y7`oB(x^86N@lBr(9fEH33UnjrNafIx>cDHB{-r9NIHB4K_9t?0`QjsQ97UUoHzS`qp)gPc8YtW7v zXva*n<94)THrmnciF~c@-G)w2a?aS}zos`)FYLB-S!(WRkA$1MZCaKL7H?3yJp~9I zvDSWr>_k_9R!x_V~{&Ou@f&S|?wCppfE$(*4GQzs_h zKs(q5_Bs2PeQsImPxZNFlV9s^%Ts{pZ_9B&^ta_S;OFS?Z2Fq-g#E4cHTqoiH|t4V zEy$6LiwxF{;79Nvlp=T$d`94Jrg;$j2yTP`!k>el?$G%cYI|P(q|3897zDG?({C{4 zWzH{Mo^^)Denhvk>$Hn_*~qgp;Q5Sa2q?#R5t`+h3+?bDEt5Pe2c8Fb;u86Zct`LH zo73w%HffsrVRViz&qlP_yeX4B8t}|~mn2}nq7ucDp z^&PYxSJu=@3p6Q~7HHdKKv2|7XG5t3gHL5>%c(8V(2q0}8zK(a;%Q`e-0tHlyKP;AJx! z$g};x%`_Tb0$yL>iA%IY#5;oRbrWP_x;i@L-JEag+oRY))})hQJdC{<|Bg|q(ewGZ zJG{@dohzis&X~7r_`hsLyOZk>Y*Th8w<1^zf~tL7P#r&TzdCXJe$`b}m8?T>O{v2D zsw8)NyWDk^|7qNv`kJ`RbSKi%;U%NzcKbhSYBoGYue&Hu(J@}bQPh)}rf<+2*oMbD zx`y7fO>rlzvwI}0i+iZH)owM%(KC_Pw|63^sHd7crjJ@By{N8pzo=G9&*MA!^J*si zZ%+v(COX`SiA7f=N~N8N8J?Yq^gQfccfV)9X7_s>6Sq1&Nni1PReNsn6^YyZI}`Tr z;XXokW5#~r@6%tfe!s^=B!Y$tkjCFaZ$D+i;ZK2=E(1ElOP2w}%SHzLH}JBN0n~Ij z`OPE)-UHq@fF~}|4iWDNUWzgEH^^AX+LTP_U>`(n6q)w#Fz=pNq8n#9#@cMNnrT*0 zGDav;na5bQUF(6=7^9Dh1e@$|*AvO%#ZM+J1=ybf^24%pAoL)Frx1=KoJMfYgU&QB z*?sD~a2ne%jbkY5S>;1&(ScVL9Q2uBd&2zm1{ zZ=R2D#`BZ#5A{J`%$k>c-T$I0!!M@^emO0X7uDnb=hYLz=hY_pd9_9QNImM` zubv3+S7mv>+Tuy5rKo$?$bPk(lu%tr>kepnGMFqt7>7`XP>HY`p#dR^U}?sEgmDOE z2$cxC5gHKQM-Y8(kNBFzyVUx95&EtMVK2fFgg8Q8IogN5oLr7RAKzqIh4=6n!V3s* zA$*L`XFl48_c9Cb1^slfZ6tkQp8bE>&sO+*cGO-=bCuTS0>E)kvTapb+sgne5w8T? z4Y(Vy0k8q^eZcnt+1?iTRZUqmNu63VMV+>Hs`~m7pDHi1s!cU^b^4HLYU@3d)b}<_ zRj1sOtF|hW)Wc6sRSzGUroO67SA7mCF&^QE&Er-7WT%?&j8|v+wyJLet{CJ~yE%)K zrO|w~w85p8?slq;7NkurPrAlGl;}3^WMbr|S~W1xnfR<>X=3)xJrk#v+@4rdU`-^V z(-YQl)roawuO_+;El*Yt+^_!Qi2dphaj(K>O|0-(6El5VAak}PX8NZkW{jVnm@#lG zp1mS5BRnHrLMZym%7Tq1e$b;$HCAIt6UZ$Bk7TDSNR2Bhmrjavc8u*sfVv65~-$#wcrDUGj z`90l5{sCRUQT$y94Tt=t#H1OotrLAGnYBd{SxI})eBC~LomhsM)%VV^DG#yCvNfdl zMH|^l8TB0a6m1d1iy>p5ZicMHw?Xh1+9SwQx;y>J>G5f*|HxGJ5At+%P2{Bd8DKj9 z8DC^gEJYyC()rNVM4-xLR^XluGJ#CQH2_>5TL zL2?%3Go8=Wf@ZSeGesf;W`;{d)A>wic|atY0R<}4z9q-EkW zv(esb^{lkNB0p17yPubW&$L_P-N_0YjVYi85d?iKk4%lu?EE)J8RnSGW4TE0z&2x< zx{PIhI5mz7@cRb%XpI9bL#Ra9jnIG)MX)>>*2Z}O;nH&GIDnhVq2mA-VK+hpLKMLn z*spehPH3_Ea-)1+VX-*ho*;=mgQs!PKLt9;)P$yYK>x6KtK|Gf zJQG zlR%V9s1FhSW(d5)kDr-%%o*UZ&f*gJiFilwi{vqF)diiy%toaQ{&M}r_ec?&W!2zc|jd{37(;KKW@cRY7UGTfb3C@G{^;p*H?D zL4NZ)$8noB1}V!e&S}Z+L#L(Yi7bctJ22}7zg|qFwckl zCSXnqIC?^=j&}0fMILSb$vSzsN9bOUULV$l^<^d5 zPrJtf*%x?^-PsqD$LstQUtYETL%!YFe{UK19|QI=@JGYeF>8FAzB9jHJ5EpgW8d$^ z+5q^z*pKEu^qA{AX z+a1~t^6V+QfzPlTOs|>N#&$4#+7p^wpE$*y7>}UY5QaF_v%x9q49`~e4ZzjwCbrYx zOCiG>3&yLo8EE?Z6DJe2A!sst@tujYupLltE0EjN6Er&lWH)sOA-^fNyPYmiuGu|4 z(QQ?6@*|%!aW*_P(QQ$2l6Hk3gkMYiVcfFBA1aq6W;W#~y3Hz1{vhJg>>)96gxGX+4w}dGoQvs5_1&#%w&6`1+5JC2lx&Eb+I$ zJ(ft$8;|+Jl*HL5e2LY;sfjgB(-UhV(-MsZlhnpa+9{^0jl0o4*i0H>Gof666SD1M z<@$|M+kah*>k8xQZ(QRF!96eYHDSd%k4Ht%%guE8zW@R=8~N`yzT0kN9T!?}be!gtScZKLWfbJIK$J)b8h{kpDP6Q(A1~Oj`x* z8u%!qU5r17UsH?*rED1&-cibAfVeQCFhbDo(H66<_R(pEZP7$_QX|Hfp{I4l(ItAa=rsBKWH1M(M zutWH)`_=JR;CnOXACoZuut}I7lM4aw3fvc$XorY*1lx~O zGlyW?MeFsaX@fN9n;LgwzamW?A6{~O>U8*QX8EJ9%bvQ6_2S!5ceg4~x3w(U{UG4@ zvg8<0`B+f+*FoXm0EOSMsaE~wQ?=^f9tZVTl_hUHU8~-Duq^2Z<yPGMpG0LyeI!6>#aF$H;ipL=NJO z79fqk#XCQ0!r@PWmp(E&!%H6-#LH%6{6FAjGcwAv92qCR^pSymyTr&yc`s)(GDeNf z-h0%czn(TDgQqXMj_9Mpg*9-u%qvT};(!dy`wN|}xX{}m_ zQE?SUMG;2D(2nGR8}h(Wm9+J(ggmH}yB7gspMmWBDl)A5|APH00wiPO64YFPIDZSO z-y;yx@Y1QiGrV-FCtfyGe++opP(5`XKX5b2gMD8*)ni9HLG>erPf<2hKe|NNa57tc zThSA^+ED$iu5i+dbD*r4eY>qY6INJ0Z_TqLZ_TqIxDX_bTD@I^|CJ5iA3byVf~mSx z?*r{`XH;En!r@PWmrm84;iXeG@v@=ne*#`MR88wWM`tFg-VVI$fF~}|4iWDNUJ5OT z-ao002n=zxs93k^KSfh7DY8=o@=mfrE-a60& zdM}38$bQvd{;2A!dsO{Os-k?|9uEgx%E_^}gotPQyo4E3c-if~TeG>gW0}}nb zf0O7p{%;cfXADSGd$5y@7an`?)LZX+Uj1Y8x?}ZVH$r!V<^f5~>wFjp^IK6ID-KIZ!T>c5XBV>bS2n4OBTNL~dJr3L_?Gwk2 zz&OVj<3cj^6d53mmx!iY6gtE6;u++X5`x6bW(T0*XgsaUMpoGJJ^6{sFPiiM;L3?2 z?mmUD4Mp623SS$pE=K$~;0?b}hfaG|9XjV1s(B@C-r$cCU9LZy=z7zqiEiKdEaAWx zOjrGW^-0gC>Q8;2s_U^s)q3nub$jJii8~vHCTjfp&Q+&8XVrInXH}_ngDPRyDuI8> zA6DN9ht$>uj>beni@(QD^9|dP8p04MyYV$ADX|_+)|5c5hzaIVX#4~&TkjTe-&&NCOj`!Ui@7jZR?ZLYa zmSe|_x;l0J(;L-PmULu-n7^ z60;)%5_gWl&Kp?y-F*yp5gQXscAtV>#IVwUJA;{NFkAY|^uENq`m$)wyn~u}7lPip zA2^)cdLWYQezYOE_2@yZ4>hy2!cDAng`F2L5i#&Gl#aEc0Mq0I7>*u}qfDIoeIw+N4G!&F_$NNpFC>0r~6|qxUG%bGxD~+W> zNBzb$ZRrn1ikGE~OBS)BR)#xv7=IW)M@vO1i2n$T!__2h(#pqF*e5eO_w&m4yyu)< zPEH$hDyT5SS!-wSea@TxclLhYXTN9fcOS&_E<6u^#j5eV8qcfoyqcc38<< z6=Wvllj&{2lm3q2$;R_H@cbh@590aXzG5|aUW4Z~cwR%#U&r$g@w^kyg|ApuNuyBJ z2>G_-A))HP24OyA>k;6HkFB}vsAC=@nYFMOvbAELP*w+vFq?rXQ0L@ju=;{JC$E8z zIw#k{KL-ENIbo&sK3&NHSZ{epNc=tW-Hm+TN51~A*zl8Iv&y8mQ11h%H|oCv^#?9U zd>(XrKz9&yU7!np&8k6H4Z3R3RfCT3L*h=*wS(>h&;>xpzGfcNTWE&^Xa}@MG1>z- zBJl;#y#cz9KoS3`7v0Nv}L`w(=UpcB4E+pI&|pnZ0reGZ^~ zj&BeSp>2+!Z9YcZ9CglTp8$inTF^GT&^8^gmU9Fcq-URqQ>?I7O!AH_%WzCWR%N1N z5m+N^gf+q)uts(Yv5|(9yMYm ziez<0ITo~Hn17}*pziKG5Jj-pi?;2Yu*^uGDK)-Q8n1qWQMQ^Gfo z!UzA*KjW0}%}el!hwODq_~tNt;vwB+`R3f}3slD$3Yq90KyL6`7jV$ktA2HNd0~<6 z>Q&`sl3&b2--G^Sh9vvM*TLnz8VBtGaL|H-Dimo^f;>Gn4vI#n#z91<1qW>bokOgF z^uzNdUx|aVQ3)sR#lk@?AQ&qpCI0gC6u0^Xzat#fXBWkR@g(D*sgti%a z>rZk>L8j34la7;c&^8qgvZ`>u(8zoOz876#`JZq(>10bBF#6^Ue2ph%O zy`9nVkq7vw3izlR_^1Z>s0#R~8u$p|{cC}b;2LUykLrMrfQyQ&fsbl{kJbVo)dC;E z)ztwXLD$pK0DM#feDo&p(O%#qSV*+r*6)3*G1A{{OBvy$FQ*qX!b<;LxPlR0`l_;o z5oUT7D-X#MqC<_H&2);oB3k84eT1-;s54q4W2#yiQ#~qUs%KhaD}rt4EO*32>gC8h1sbQ{yh8(}KH_ffpQoDzFlFB}Tzr5%Oaxsc9kZ(H3H{EPl)GdJysuB8_9dCJEp?!O1N6|v3=94b6Lm1f(808T9(t{$4?quHjtBIj4u|O5 zK@T0zu)zN?QMUtn579%9mGmL#p{p?oFR`HlXcqm6DfKm?9*gue(9sy6+ampq0rP5- zM@ON<`2_l#L*9Jmf*zy{dXRGHK~_T#QUQE$->!Ngc_}OfKQb)*3}h4GnUQ2E81s9Q zKYWgF!MlluSK`J4&rF4z33taz?C=48UWV`*xLUYJ;hrI@!r!qxf|Xk}j#c9t!Zaeb z0j3eL4KU5igl&Ln$Z{`XBdWg%CxgXj&G4BV)qyv0f23@gn9mXDR4$q$M8!FBKjrvF zcL4g)gC;{7JiFA2IllM(9Xh}Y=t;juAELgr0R3kn`i~3! zrwsjvtT&S-;n!tMLw$$qhLn9LTEEec2Tqv^Hxup-r`T_lx+MLhxc|)efMd>5ztP9x z+q<}X4=2K5XD;tQd*t>Rdja2^7x-qZ0+VoDpvE^|-~ui9CP$GLK@Fas8s9{tQ{x+= z(}HjA1)YO3lrNqy`AU3a)rfE0p!>m2K8QRCPGOS~79vk$oXLD;s1}SfZ8FzH#s0>2 zTxz^Nj6=I-M9cZ|-h$*o>@D~O_7;##(4BbyZw|O`yU&0uq|#mkvXCn7H<*Q8rQl<6 zZC(TIGoX_+pR{}ZI#}!Cdmsi|&TlFk?F6EI5LwFIK-dXH`yj|_HtmHljF-!Z9YJCl zXG&!xJH*@uvC+C^31Y1j;Xyc?fr^7dV!j<9ntX5%9(euKao?U|F zmegL$U6=GGv{n0by4yRgpwk0O#@XKs#W~<|;GFM;3~h9RM58YrE&=XrKG!+l3#!vM zxM~A>$4s1F>+Kx5r_p!)9bUiXPG4_wk{&yxzr8zA`KKPS9g?m*qjabYl-59PW%-$} z*K$js*K%hU+BPJWc>>Bj3vPuTbD7At{h{f_HnF2`BrSqffExlj*M~v-{lDwgW6nio zb2qx7|E(0})TIh@TE+-eXK`Mos)zk&-d_7H&As+JxAofZdb&3cm_6T`!}1)tEZ>=n zHQe)9zIPth@6BiVzWK}vzFh>Ky*O>Bury<*Pz-*(0=&AU2>iSZRt(X`$%=L(nc@e3 zrt*qo!UCCcVO)sgA`WeJCQdmn&LkcBuhwxP=7aYeHw$h>>~ZmZ)1Ry3LfsC^adF0L z2EXGyKoceTCJJ3H$8CsFm`h}*f`$k=of@}9qf_G+qSJy~YCxw2w-^DQ2o%M_E#;uQ zohl$-ydFG0kbgFC3t1#cksGsb4^Yv)%S#p)EMHk(R>%*oEiGFGs{xX2fP$s>u3RK; zJopB}RpN3&i4-U((>|D$gx5{he%^Jf)HD$&=xvWK{C2yvyXI|=6=Canv6nMd@tS!L zu;Ctsd5@p1prIhAQ}_62bm|^YbXt1+J)qOl<4>SKT6(+_Ap6X}JPaPG4@W)BaCG(c zc-OtFilz0hw9m~|>f*aRGcyKrmPiJcz|t(~Dru0H1`Yj>xQ$SLqt-elOn>%Q< zyMre9W~)1BfuCY=2WiH6;)b7o7U!T@a#PTl(-bt@n}T}RjRBqR*3M0dMxWm0?Ho6w z)@QVOEJnwTmXy*`f2#AQK!W{0d@1w2e(e04WpLi)(>rbojF{2tAEwjgTO3HkF(ZH$ zJ*I2&b{d=Zc2k^Y1Szhjr;L`v-KTW7K8cmA5724hpA}GT zSV2pOfi#!VG##6PKrT_#h3Cu5!TrelCr^!()0Cc{Jar`kq~VdSlc%O4!1<$2ck)y= z;-qPju9K(kKp=%j@q9VLD2jZYJar#JRA%Wqd1@UGivGz{Pr|3VN!Q6!uOOhze?Q{N z`~os1r)LN#)9-tMBEd;~3X6O`1#xBiWUp3Pzq=53CG*~K^3?r^=lJj=r?(D4>%a4c zK6#4HCO>_hJk^4@vOF&#uFP)_(f4idJ{hs==i4B-!;1V#enG7ev5Wgl#J`jaNY70u zx>yF>>yvkD%9fWeDTDp%HLD9t?p-2+Ir&~$;mTzZH~LX5D!q4Qx$-Zr(pAc6(Y;HT zE-BNMm)^Bx<&p{lkz!DJL%glLv8Z$<@rHu(vL#ED_gCGu+*Poo6za6n#Y=Sa=H7DS zoE!7zxyi-n$6ied2vF$AZ&Em*OQ$Ru23xF3opxjlme3jH>VjMqrmr6wu<3)=yq)HPRYEoEM9uY5fNmZYH z^KJ8Z&80K|$_vU$*GTOz{;^=m%0<*xVr|4=K~ZU`RG3xeKsNoKOU*C;))10k#rDp9~TAdv*;`#}@*l{%ldbM5qMpRQ?R zFwymXQ0LqfG`cqhb-Ft`<9yzW_3rEuR!4DQig!zJ)E=+@9mk)$N!m8HwfaRwjbw>GB!OPe8&aE;e9-4^sWz5 zJB&sfP@A2P?O;^3gVDDU$h0P)*Im}R4XBr++Bp4)&gvX5q1PlrojSZ0daWX77(6X!TWQlc8PlX%(iOJObp%{(AI7N1d2 zJ;RJfr$$IbM|tpz=c`6YKLwo@gtPQ|9 zioy$s2RKZDlm00X&!UO~SK*?&Bz(E5ps?)j)z|6>#|+9QQAWm8*(6+>-)1qZRjD51Dzs;vOoy8uyqk;GQw(GVU=ux1g`$|7t5tDk7 zm7vptjc9R<7Ho6^*y!&(Gi0s^@}h`-x(XEgG9a4Ij0Tc*ho?kMM9)& zCQa+JN2*EFbKSL?ziZjSfpGOhNE3mO9+OYypc(NI>7Lp#dKLtf`A%A&HXQP#W*DC?X?St)pDCX2W8F}>c$5m%CP zKECflBM8KG^Qlw&t!-!FTj_VG)fD?2R^!pPQWNT9(i0(RomfzVtTm2RxrqjTw_;Ur_Jf7o3sp^~WJ>z_;hrruD(Gty?g@ zkw)vf0PzDW`ZTo}wGr`)p-A&@U!U4PaR4+*-*u*2!L80wMEdyY4@-Rr&4%IepX*4=DA|*P?gI_#7H6lF;IxUFQ1*EA3kvj3wOlfkD=gZ5%{mA9sDW>p{<=UEgL+2d@vM*|$bxRpDZ3%OI(>uhU`9mdVc)(lRbGGvz6phP8;V zNCoIOF6gWkog1zd4wy}s^RTFq{#)t1(5nxw4TZPf9(uL3J~aC4>h4ir*K{X3*ZPg_ z&Axbdo^N%|yP?(F-VKd>VQ9Az|25*jV_qKG{muWa!+*0Q{%gX2P2cjrX8hNz_%DrH zUTzw{{mb4ze=0MrnkNf5>CP>|%_bdi>)N2hc#H2`AFDFI6T2$!V>ZMn%=8 zR6SOs(W%EO(b*IU^7PbW^?&1m7X0{?#<98p6*_ZEy2wm%Y2Nv_y0C0{;mSozlmj;D znhg7-!JH8@EmQldcUmEcD{{or%F{Oa+manU-_hDFt`2s>hjcQ#;Wsq}Z+k8+H2Jl( z(CzPz3tjv9xX{n8nGpK7pZ_HEzvfO1U0-l@=#J;E3{8FQ%Fr+0O%F}`JU#TYQapbU z&o|)t)~iF8Jon?!=+~|Yt$Fu~(62uKap=;YPY7LBFfnxhgA+mz;CU+2ANAU}&}yV# z@p)S4Qlx(w(!L+*Jh0*F&hqUfjUi)eW!H`AxM%g`&d7vsuga~O>h*tMtqK{fm0d=9mhQ=or)QZ}xvygn z@dxSBvzhY$ZW`c!3G)9E2l(I3^8d02_@7Ds-w@URbk@q?xxNOZkq=39ARe^IVa^rW z_yg)?xOh~}6{69pxdPEq9{l3zskwq5543OvCkpCBVzDH68|cRHOyTo<6}S2Y&z=M? zE-foBSW{TCs(4Dp6!G&kE&YCHm zoRf8jHLO0FCcbzCGge&8jCB_a@ta2o^OtO7c{LkZV#_F&xNDS4eEUJzz@UJ!0dA0cFCr{IiZ zobuz?%I2o&#l1bp@gA#=$G`Apq3*n}))7|pJKihR);e71y-I5-h}PDj2{l75MZ6Zfd>--NgG zP>3_%z0X?(nc>oWiq6tPti4^jcu_fxRp|ts9{fKJmBE<3ZW4iR`HE$UY?6JNJSmMm zCtaYDl}U=6q6Z1AjE7_+cENvB<9HCV%IacWg9POYkQye!n`yo_;%)2r++3U$sG zg?iVEf~jQ$OW2jd5;{@@(~%LvkmB1|V#Vz&vF>(Z$mZLG{HHdu1#fI*tFPF|DsJ4! zhW3nML%$p&80vDFVRNpKZT>{)*l|Q~%swhOjvo}96ORhc0|x~f>-Tv-#o61RvS0f? zWo6b+aqjk~IAwGJP8FTUtm&7r?U|{}R(v`8ZN(+*sq7K#xxBG#8+gg@HvdQ%bh*&2?5RwYvjXMJ zlggRZ3?9=C9us&$$d3D)fHQ;zoFOdW3}L~E9qpXw@KeTq0p2sWNa8=c&`-`M{?o<> zEBZJOs`=0LU^rU%Pnah_0}dCDs`*beIyL_xIxYN%_P;p99Hk$gFZt52lJ4&TOK>6> zi~o#6eSdiV(`SHM_dF^h^B=y{UgSWr_)liv*WK9s$0apdA7&scL3884bFvD&lRYQ3H3gQXri36NjXYmrbhg}GES^9M2^kE)S*G&(ghCps-- zZ4&6TAoErXJSWN)3z=I`q08kukjLwxxYaLs){wa<>+iX@aAo=O`xZvsZrEwPX2rJyuk-LIw_4`ydFG0kbgFK1I=&B<-|!3pN4R@oVijjpIITBDy9!_ z(9>sDOuFv0`2gJLn?hWZF=_H(wDyzi+RxC+9*CPHfm<|yn@oVeUE(G~p4lzvXCb~{ z;wVF(dR;u1(r`@TD#=g1A?W4*(a0G7)LxQH8QhT>5BSQpgW)UF26688 z4yi1CD1|fv^2L z+x$4|ZhxG89(bJP#kI2hv{tqttCcM*YGt~(7lpVHINv+%MIj;MMPY87G+Woh*8A6| zPW@lK<4-+g^Vo`goroV3t*hXDc=EGWd-A`sll%2kuhx6=jqm>YDY_?x&v@K^59dr- z6djlc)ieC((dWtP5RDC@!320f4dV=+0G`vuqv{!cG&=PRpXjuV@#Ua%h&f6>JYVu9 z@h9CU8&)*NW6kiZL3fSx7x9;;r?}NG*nf;85yhoN!$@uXp8TKFV_f_`5TSAu2YTP_ z)0%*T_%GSv?t=d#_@wQYGy{|P<~2>4fk~Loh=dwe1uPx_U(hVwkZ22=N2i4imi?}q=ykHdPgT&Sa1t~Z4tV!8GU$zr+QiCHdlVw#*k{HaKHCj2|# zFN41Zel7e*;XecaCHQ;cABNuz|BExv|9sGf98e5S9<-s~Q@C#gDw%-%3|_yz>JiLB zL8rzZM5l!>T>&~R*kcPCLCum@=#XM&DjyuLg>kl&v#MK*?()eAJ!oh>I$e2Mt< zD~h;gqtU5(CDCc&mCu4s3$IKE4{Sm?V)4pdp!+50_{HnN;{*9; zgI5xU+bkzeyz**QC9jAiWaK}M;UL~_$!H&b#hEgbdfo=4a-CW)JJPP)D4G4@;2Ul`}0f5k|2_FT=n z(u)|Ov!d*kjJT-5l);9Z8vDNE3^wmG<>qQmuIA!{S9K(6okqK7U~3^yLMq32VWa}Y0ofO~ZDsG8G6qf>JlqSL}@-T<8zPBTLzDx>el zH%e8AsE6WKzu?*6G^7!7%PA9Qp&2Wm%~M?DEO)Pxmz(x6m1RrHMV*nWY{}w+C1qu$ zWv7+Wcm}2PDp;mlB$;N0ofKHB9ULapey*|H75cacKi4>=eJj?b!gfRscJ2AF8&H?q zITv4$J+?+4>1H>4Q4}U!^)=?-i#qCS=sflYoSApPgLBBLaSj=sm)9W}ChcVLw?5Aj z?|G38*|>}8JE{bIPYv)Fbk{f+jM7@L96r)o_$&A;tYKF@e56(O8~EG%r>VnPV(N5< z{{H3uX=lGBEO>UGu<(yKGj-oSq3qB5g!0dDJ{ry!xDs`#n$+mq@Wmpr4pe^kM4S~r zyH;?Q)Zu*GdcnP;0q5hc6Wqre1-BXJ_odegmDzPdCC(|UtZNV|Th!X1X| zc7}0Y%`qh>CA<}%I8K}+$B!NtjvqfR?Dnh`;-`)aS2ouQp7uH+8+g|Q96SU#xGGRD z%tAZ~Sa>L~FrBSC8*wx6a5C^Pov}Ly@nPwou;JOCvTg;=QghVdsSg1gpT<~pj_No_ z9^UIomt%o*!dc;R;OuY?*-@D8S>c>;7C0B&8RN9?K`*yhlCUW4Y0jwD%k==`Xjyr) zS&^19J+)pg8XdJGm>e~ocoCfzPWva&IpqJ42c9He=n+(JjsfA)LNN`z6c*Y zh@a~_rz?hNT>r}?KmKa=ShEt^A`Vs z^A?AIH(s(&Sbfz#p<>!T;l7(egR(yGOZX^ja$s1P%9@;pGucsAI-6S`0&kw!jQJ5zI zUx)ubBvARSCtqXw>_+@&gHZM?&Kdn9&KccTFI4;)=ZvBr51<~osK-3iV?OGUhk7J8 z)(OeS z;14JhAP=%34~iiV>L3qVAP+hq4|*PgOn6ry9YyX{^}@Vq^}_s{>xH~u)(iQ|>xBis z!daK~X#3ybeAEdBoFfFc!Vvzta3xD_FochyePKiNm=S%%hJM4#NM)w?Lhpp$2fd4P zsm~-IGl+dAIq3$pIozxp#B)!<=Z;Z5=p9fyi|=5CGfeg2b<;QCEKan&emi`$y?#HP z%~>btkHP;IZLg)>>HSdKi|vl~=WTyVC4=?X-w>eLRC3af!|}7mp>FV3j5{lO4yAso zzx-X>r<=0jj98j|xFCZc03UYCJd}ij1@N!6 zWHSo0rkjL0g=XPOk6ReuTq&ftdxWb3Rl(bwYJbNFjWWz#S`UlLA{UMuyurd80i_iXu-Gp!gblr*2b-x`Gqo3Aa>%bp) zTaezmUwh0#{U@Y_X^v%pj$OZ>+51;o6~8NYn}s;&;0>Y<9^dxb z@og`zP8gb2FAU3S6owbA|3+PNG@ZPb`hTszI-(8U`xb3L?_R9`@7fr>>zsG+t)aJ# zQ9q$~O?`s;1N8-coHMNK3jx~+rtAlSO0*5yN$MkM;Tg6#v8`@GTN#py!r6rhLQ-0r zFf?noV8(aVWY6ouF!Yt-=quLdwSuj^Rw#NpEHq>N#FITAvc(8*>o~}s>iLK*Mfm9s zeAnnX%!(0i>A*LQo#Sa z>-jI%fwt=HDPb${&7-&9_YRuVMfMj9#tzwUr`6#Wj31is{~VZ=@GJOj615{?CTc^H z*@R2JP5aS*sNJZ|sJ#e-CdV1VRQ}{FL--iV{qMjEaY&zIG%;_*d!jP%ccssAhH32T zJ%SdzY@o^`aOo8FbcO>e!ZMbpGK8`XelTzELjSL0OAq|QJf7Hl}7&3 zt^BytKOF@TzMZR-4q{%ia`u{x$x{b)VqTwiBDTIkZmbB5lZNvmlH+WmE-*O@Yh2=V z;92mq;J3raiF(O#g$TpP&YsSowZ< zEqmb;)3FCWdz3H)dt6O``?W-ka2; zA{w1~R1lq(QSlk*w2X>kjiaIibU&CKnN^V%Bg8Lz7#&kGcz>rs5_3md-{OGSqeDK! zC1P~Yc?J`m!0Mvarj1=jSnk!?*9W`em-!`2P8+*+I@^3ZU2VSV_@(}V?i(-<0yEw!x)bBLy3XTnwfClki| zyAme&wvb((+TA5&Ks8eKX+)MXy;f6{!Ff17!NpRB80y15?qW16}~w={$< zd2m5!&4YQNF`&EbxjRF@-f(AV)Ykma>gV$D-#qb|$yrHxjJXjJK~ zq0v3{QhuM`8Tw^iZHUU%X|nmBG@%}*pZK?#uJT`$S{q8;aBJw&UG<@g%NK-3p=`dU ztwFMenp&D4s(3IT<-a3z3Ce!aa|=WFT)q&tcyRCXTSMm7heLZSVMpgTb)ntx57pO& z?(cdxblKLcLihXNZ-6bItv#X44LzYDo9g^Tufu$7BGOK*fbKWd>rZO&`V)%1{=N4g zonO_4c3*^aE~yONU;S<<^}+F>``z#_w}qxY*b|y`c~2-YrP6P1dMISJJcP8?2Y1Qu z&In7ZI=p}J1XG-wB%WXjUp&DSek$BpII@#-{~VpJv4QZTQ8(R+p?r>7VyysI;1}m? zY7V$VK|{2hPR#+M(WyBg(NP}!;_0a|``e(?!U1O+wc!FfUui7Q6h6;aajReOtl@&i zOT=xt1&bFIEQc+Qg2Kg%3&{Fi#uRRXT*L`6dElg}npZp>mEK!F9;oJjq}$=VD;giX zz|$`9wDX0hWh?jR+L z`mXhZp*qgflnjkfUFKkB_){ly>e#5xDm7~)N5h%nI#>nNIW~%Ch8vw5gR}yu%DBwm zX)N~FBrNv_6IS|7pfQ2QoCAx2pxNna_Yuubce{`1b~d&9h<2y1-ADAq@hsRuXQ7i3 z?M)+z9(jx;dRQMEN%Y8TB++*QA<%i>)2(>_=cuG_i_@t`g&zc3Muiij#|hd*xOg~p{sFafZJ_(XtmDa}LNdTnQi_vl zMLB=1T^8Kh~_($OP!0$O89{yz@Y_x0%Zus(eIMcQ@xU=njU#sPPf6mP*EO+@RmQ$a~ za-SW;>~9%+?U$N*=O$tge$GxI$+Z)fv^K+fo@7POG4W$zzGEJnUo=m&q(>IDT<%m> z<{iWGv&OQ8&Qx~Dox%=!N3nzLqu8N93OnF_S$N0$vasL%qVP`Ji-ObqF)Uww0xMV_ z3yzXcgawXNwxB3gw9>WON!GgZ*=pxP_V>6P#;o&L8PanhJr~j|Lwb3hEiAuz3tP~> zg)Izh>6iY*$~xhvPc#Tu?`{;X@joQwbhNRr{3Wo;;|S9njr{Dmox-dUJB8V4JB2wJ zI|Uuu#%Qey=uK7ON|Pt7PlcZfKOKI$CpvSuKf1rGI^foODglmXnxC3a=}48~H2gZ~LWuLt?k@Q@xhB5@~zvDOS6 z2OXVK&o7=Hj}PScpDQ2{#ieQ8o+wMXV8vu%>AfW-1sN5x;Xd61C`cUKH5u1V8O$2z zsZ%)jiOo+YN|o*7C*oQG9ds0ss^;`3!i{j|>?gt-;3it82h4T22WM`OTE1=6XM`OZFkYu+gsb)J9$ zW2y?yknKS}@ax>+DmX)n8+o|JaW;J%8dsLK=b~ksO^SEV`;QIxD9n3Chk}NJoK7uq zqtU4)F41YxF8&pCS|n}>29Fc8u_W#R&=Jqz7q17859IeBFUpZhZNyti`u9NJ!*uHL zV(%L)K%&=9<(8*O=*F5`PwU%z6nl)cN)_xIBcjYLg6)WATbN{pzNZ;-wK=T+vN^l~ zj%2G3wkGng8pRgeoXW`ZrO^)AS+YrRG;R_uZX3Za{$K>-78vI_N3nU3o0l|?VyUg8 z*`?O8Y>fR!Y)saV*rmB+nc5O9$*_UaBe|wEO_F;f(zdXRGq$jltSxM0?v{S}46}KJ z;nS;ytT>EW$VW*YR*CX(17sq73#0Fo_s_Y1PGdu3!x@j!?_u3~ilVdfpj!TILRTc2 zLF0gE2zgSR#u~+WPtE2D;2vE(s+NDz=+yF$=(LRIyFup=bCiB~zT_)MRVoVV#62o| zJX|ycT>-i?AJ4p1kP$9T@{hhVbMeGafm zBO0BWZxEdpzVSBb9CDuI@nVp#5GoY#T} zre4RXWAlw{sp0zg24QBJZyVB^fn%G2V}S$U40StzV|M_@?f{P65pHdJ&)=H%o?mD8 zcDCBv{H+;n{s-D#3q7va`A%bIZ*Q6Pwa~*6_xj^#ofTuvz9sn2ilgDlw ztL~%G=+u3b=(P0FdqAh9kDfq*oS==>N69wFSkUo{*Mr9g^3O^iRbWJgmQ@6a{~x!x B1~LEu literal 558922 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 z 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 c -#if (defined(_MSC_VER) && (_MSC_VER < 1600)) || defined(VPX_EMULATE_INTTYPES) +#if defined(_MSC_VER) || defined(VPX_EMULATE_INTTYPES) typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; @@ -24,9 +24,10 @@ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; -#if (defined(_MSC_VER) && (_MSC_VER < 1600)) +#if defined(_MSC_VER) typedef signed __int64 int64_t; typedef unsigned __int64 uint64_t; +#define PRId64 "I64d" #endif #ifdef HAVE_ARMV6 @@ -49,14 +50,8 @@ typedef unsigned int uintptr_t; #define __STDC_FORMAT_MACROS #endif #include - -#endif - -/* VS2010 defines stdint.h, but not inttypes.h */ -#if defined(_MSC_VER) -#define PRId64 "I64d" -#else #include + #endif #endif diff --git a/branches/2.0/doubango/thirdparties/win32/include/webrtc/echo_cancellation.h b/branches/2.0/doubango/thirdparties/win32/include/webrtc/echo_cancellation.h index 883357da..a266e84f 100644 --- a/branches/2.0/doubango/thirdparties/win32/include/webrtc/echo_cancellation.h +++ b/branches/2.0/doubango/thirdparties/win32/include/webrtc/echo_cancellation.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source @@ -8,8 +8,8 @@ * be found in the AUTHORS file in the root of the source tree. */ -#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_INTERFACE_ECHO_CANCELLATION_H_ -#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_INTERFACE_ECHO_CANCELLATION_H_ +#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AEC_INCLUDE_ECHO_CANCELLATION_H_ +#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_INCLUDE_ECHO_CANCELLATION_H_ #include "typedefs.h" @@ -38,6 +38,7 @@ typedef struct { WebRtc_Word16 nlpMode; // default kAecNlpModerate WebRtc_Word16 skewMode; // default kAecFalse WebRtc_Word16 metricsMode; // default kAecFalse + int delay_logging; // default kAecFalse //float realSkew; } AecConfig; @@ -66,7 +67,7 @@ extern "C" { * Inputs Description * ------------------------------------------------------------------- * void **aecInst Pointer to the AEC instance to be created - * and initilized + * and initialized * * Outputs Description * ------------------------------------------------------------------- @@ -225,6 +226,23 @@ WebRtc_Word32 WebRtcAec_get_echo_status(void *aecInst, WebRtc_Word16 *status); */ WebRtc_Word32 WebRtcAec_GetMetrics(void *aecInst, AecMetrics *metrics); +/* + * Gets the current delay metrics for the session. + * + * Inputs Description + * ------------------------------------------------------------------- + * void* handle Pointer to the AEC instance + * + * Outputs Description + * ------------------------------------------------------------------- + * int* median Delay median value. + * int* std Delay standard deviation. + * + * int return 0: OK + * -1: error + */ +int WebRtcAec_GetDelayMetrics(void* handle, int* median, int* std); + /* * Gets the last error code. * @@ -238,23 +256,7 @@ WebRtc_Word32 WebRtcAec_GetMetrics(void *aecInst, AecMetrics *metrics); */ WebRtc_Word32 WebRtcAec_get_error_code(void *aecInst); -/* - * Gets a version string. - * - * Inputs Description - * ------------------------------------------------------------------- - * char *versionStr Pointer to a string array - * WebRtc_Word16 len The maximum length of the string - * - * Outputs Description - * ------------------------------------------------------------------- - * WebRtc_Word8 *versionStr Pointer to a string array - * WebRtc_Word32 return 0: OK - * -1: error - */ -WebRtc_Word32 WebRtcAec_get_version(WebRtc_Word8 *versionStr, WebRtc_Word16 len); - #ifdef __cplusplus } #endif -#endif /* WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_INTERFACE_ECHO_CANCELLATION_H_ */ +#endif // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_INCLUDE_ECHO_CANCELLATION_H_ diff --git a/branches/2.0/doubango/thirdparties/win32/include/webrtc/noise_suppression.h b/branches/2.0/doubango/thirdparties/win32/include/webrtc/noise_suppression.h index b8983b07..1f498c1c 100644 --- a/branches/2.0/doubango/thirdparties/win32/include/webrtc/noise_suppression.h +++ b/branches/2.0/doubango/thirdparties/win32/include/webrtc/noise_suppression.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source @@ -8,8 +8,8 @@ * be found in the AUTHORS file in the root of the source tree. */ -#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_INTERFACE_NOISE_SUPPRESSION_H_ -#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_INTERFACE_NOISE_SUPPRESSION_H_ +#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_NS_INCLUDE_NOISE_SUPPRESSION_H_ +#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_INCLUDE_NOISE_SUPPRESSION_H_ #include "typedefs.h" @@ -19,20 +19,6 @@ typedef struct NsHandleT NsHandle; extern "C" { #endif -/* - * This function returns the version number of the code. - * - * Input: - * - version : Pointer to a character array where the version - * info is stored. - * - length : Length of version. - * - * Return value : 0 - Ok - * -1 - Error (probably length is not sufficient) - */ -int WebRtcNs_get_version(char *version, short length); - - /* * This function creates an instance to the noise reduction structure * @@ -46,7 +32,7 @@ int WebRtcNs_get_version(char *version, short length); * Return value : 0 - Ok * -1 - Error */ -int WebRtcNs_Create(NsHandle **NS_inst); +int WebRtcNs_Create(NsHandle** NS_inst); /* @@ -59,7 +45,7 @@ int WebRtcNs_Create(NsHandle **NS_inst); * Return value : 0 - Ok * -1 - Error */ -int WebRtcNs_Free(NsHandle *NS_inst); +int WebRtcNs_Free(NsHandle* NS_inst); /* @@ -75,7 +61,7 @@ int WebRtcNs_Free(NsHandle *NS_inst); * Return value : 0 - Ok * -1 - Error */ -int WebRtcNs_Init(NsHandle *NS_inst, WebRtc_UWord32 fs); +int WebRtcNs_Init(NsHandle* NS_inst, WebRtc_UWord32 fs); /* * This changes the aggressiveness of the noise suppression method. @@ -90,7 +76,7 @@ int WebRtcNs_Init(NsHandle *NS_inst, WebRtc_UWord32 fs); * Return value : 0 - Ok * -1 - Error */ -int WebRtcNs_set_policy(NsHandle *NS_inst, int mode); +int WebRtcNs_set_policy(NsHandle* NS_inst, int mode); /* @@ -98,7 +84,7 @@ int WebRtcNs_set_policy(NsHandle *NS_inst, int mode); * input and output signals should always be 10ms (80 or 160 samples). * * Input - * - NS_inst : VAD Instance. Needs to be initiated before call. + * - NS_inst : NS Instance. Needs to be initiated before call. * - spframe : Pointer to speech frame buffer for L band * - spframe_H : Pointer to speech frame buffer for H band * - fs : sampling frequency @@ -111,14 +97,14 @@ int WebRtcNs_set_policy(NsHandle *NS_inst, int mode); * Return value : 0 - OK * -1 - Error */ -int WebRtcNs_Process(NsHandle *NS_inst, - short *spframe, - short *spframe_H, - short *outframe, - short *outframe_H); +int WebRtcNs_Process(NsHandle* NS_inst, + short* spframe, + short* spframe_H, + short* outframe, + short* outframe_H); #ifdef __cplusplus } #endif -#endif // WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_INTERFACE_NOISE_SUPPRESSION_H_ +#endif // WEBRTC_MODULES_AUDIO_PROCESSING_NS_INCLUDE_NOISE_SUPPRESSION_H_ diff --git a/branches/2.0/doubango/thirdparties/win32/include/webrtc/noise_suppression_x.h b/branches/2.0/doubango/thirdparties/win32/include/webrtc/noise_suppression_x.h index 35fea2f0..b6eef904 100644 --- a/branches/2.0/doubango/thirdparties/win32/include/webrtc/noise_suppression_x.h +++ b/branches/2.0/doubango/thirdparties/win32/include/webrtc/noise_suppression_x.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source @@ -8,10 +8,10 @@ * be found in the AUTHORS file in the root of the source tree. */ -#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_INTERFACE_NOISE_SUPPRESSION_X_H_ -#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_INTERFACE_NOISE_SUPPRESSION_X_H_ +#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_NS_INCLUDE_NOISE_SUPPRESSION_X_H_ +#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_INCLUDE_NOISE_SUPPRESSION_X_H_ -#include "signal_processing_library.h" +#include "typedefs.h" typedef struct NsxHandleT NsxHandle; @@ -19,20 +19,6 @@ typedef struct NsxHandleT NsxHandle; extern "C" { #endif -/* - * This function returns the version number of the code. - * - * Input: - * - version : Pointer to a character array where the version - * info is stored. - * - length : Length of version. - * - * Return value : 0 - Ok - * -1 - Error (probably length is not sufficient) - */ -int WebRtcNsx_get_version(char *version, short length); - - /* * This function creates an instance to the noise reduction structure * @@ -46,7 +32,7 @@ int WebRtcNsx_get_version(char *version, short length); * Return value : 0 - Ok * -1 - Error */ -int WebRtcNsx_Create(NsxHandle **nsxInst); +int WebRtcNsx_Create(NsxHandle** nsxInst); /* @@ -59,7 +45,7 @@ int WebRtcNsx_Create(NsxHandle **nsxInst); * Return value : 0 - Ok * -1 - Error */ -int WebRtcNsx_Free(NsxHandle *nsxInst); +int WebRtcNsx_Free(NsxHandle* nsxInst); /* @@ -75,7 +61,7 @@ int WebRtcNsx_Free(NsxHandle *nsxInst); * Return value : 0 - Ok * -1 - Error */ -int WebRtcNsx_Init(NsxHandle *nsxInst, WebRtc_UWord32 fs); +int WebRtcNsx_Init(NsxHandle* nsxInst, WebRtc_UWord32 fs); /* * This changes the aggressiveness of the noise suppression method. @@ -90,7 +76,7 @@ int WebRtcNsx_Init(NsxHandle *nsxInst, WebRtc_UWord32 fs); * Return value : 0 - Ok * -1 - Error */ -int WebRtcNsx_set_policy(NsxHandle *nsxInst, int mode); +int WebRtcNsx_set_policy(NsxHandle* nsxInst, int mode); /* * This functions does noise suppression for the inserted speech frame. The @@ -110,14 +96,14 @@ int WebRtcNsx_set_policy(NsxHandle *nsxInst, int mode); * Return value : 0 - OK * -1 - Error */ -int WebRtcNsx_Process(NsxHandle *nsxInst, - short *speechFrame, - short *speechFrameHB, - short *outFrame, - short *outFrameHB); +int WebRtcNsx_Process(NsxHandle* nsxInst, + short* speechFrame, + short* speechFrameHB, + short* outFrame, + short* outFrameHB); #ifdef __cplusplus } #endif -#endif // WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_INTERFACE_NOISE_SUPPRESSION_X_H_ +#endif // WEBRTC_MODULES_AUDIO_PROCESSING_NS_INCLUDE_NOISE_SUPPRESSION_X_H_ diff --git a/branches/2.0/doubango/thirdparties/win32/include/webrtc/typedefs.h b/branches/2.0/doubango/thirdparties/win32/include/webrtc/typedefs.h index ae71690f..53db408c 100644 --- a/branches/2.0/doubango/thirdparties/win32/include/webrtc/typedefs.h +++ b/branches/2.0/doubango/thirdparties/win32/include/webrtc/typedefs.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source @@ -8,100 +8,77 @@ * be found in the AUTHORS file in the root of the source tree. */ -/* - * - * This file contains type definitions used in all WebRtc APIs. - * - */ +// This file contains platform-specific typedefs and defines. -/* Reserved words definitions */ +#ifndef WEBRTC_TYPEDEFS_H_ +#define WEBRTC_TYPEDEFS_H_ + +// Reserved words definitions +// TODO(andrew): Look at removing these. #define WEBRTC_EXTERN extern #define G_CONST const #define WEBRTC_INLINE extern __inline -#ifndef WEBRTC_TYPEDEFS_H -#define WEBRTC_TYPEDEFS_H - -/* Define WebRtc preprocessor identifiers based on the current build platform */ -#if defined(WIN32) - // Windows & Windows Mobile - #if !defined(WEBRTC_TARGET_PC) - #define WEBRTC_TARGET_PC - #endif -#elif defined(__APPLE__) - // Mac OS X - #if defined(__LITTLE_ENDIAN__ ) //TODO: is this used? - #if !defined(WEBRTC_TARGET_MAC_INTEL) - #define WEBRTC_TARGET_MAC_INTEL - #endif - #else - #if !defined(WEBRTC_TARGET_MAC) - #define WEBRTC_TARGET_MAC - #endif - #endif +// Derived from Chromium's build/build_config.h +// Processor architecture detection. For more info on what's defined, see: +// http://msdn.microsoft.com/en-us/library/b0084kay.aspx +// http://www.agner.org/optimize/calling_conventions.pdf +// or with gcc, run: "echo | gcc -E -dM -" +// TODO(andrew): replace WEBRTC_LITTLE_ENDIAN with WEBRTC_ARCH_LITTLE_ENDIAN. +#if defined(_M_X64) || defined(__x86_64__) +#define WEBRTC_ARCH_X86_FAMILY +#define WEBRTC_ARCH_X86_64 +#define WEBRTC_ARCH_64_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN +#define WEBRTC_LITTLE_ENDIAN +#elif defined(_M_IX86) || defined(__i386__) +#define WEBRTC_ARCH_X86_FAMILY +#define WEBRTC_ARCH_X86 +#define WEBRTC_ARCH_32_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN +#define WEBRTC_LITTLE_ENDIAN +#elif defined(__ARMEL__) +// TODO(andrew): We'd prefer to control platform defines here, but this is +// currently provided by the Android makefiles. Commented to avoid duplicate +// definition warnings. +//#define WEBRTC_ARCH_ARM +// TODO(andrew): Chromium uses the following two defines. Should we switch? +//#define WEBRTC_ARCH_ARM_FAMILY +//#define WEBRTC_ARCH_ARMEL +#define WEBRTC_ARCH_32_BITS +#define WEBRTC_ARCH_LITTLE_ENDIAN +#define WEBRTC_LITTLE_ENDIAN #else - // Linux etc. - #if !defined(WEBRTC_TARGET_PC) - #define WEBRTC_TARGET_PC - #endif +#error Please add support for your architecture in typedefs.h #endif -#if defined(WEBRTC_TARGET_PC) +#if defined(__SSE2__) || defined(_MSC_VER) +#define WEBRTC_USE_SSE2 +#endif #if !defined(_MSC_VER) - #include +#include #else - // Define C99 equivalent types. - // Since MSVC doesn't include these headers, we have to write our own - // version to provide a compatibility layer between MSVC and the WebRTC - // headers. - typedef signed char int8_t; - typedef signed short int16_t; - typedef signed int int32_t; - typedef signed long long int64_t; - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; - typedef unsigned int uint32_t; - typedef unsigned long long uint64_t; +// Define C99 equivalent types, since MSVC doesn't provide stdint.h. +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; +typedef __int64 int64_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned __int64 uint64_t; #endif -#if defined(WIN32) - typedef __int64 WebRtc_Word64; - typedef unsigned __int64 WebRtc_UWord64; -#else - typedef int64_t WebRtc_Word64; - typedef uint64_t WebRtc_UWord64; -#endif - typedef int32_t WebRtc_Word32; - typedef uint32_t WebRtc_UWord32; - typedef int16_t WebRtc_Word16; - typedef uint16_t WebRtc_UWord16; - typedef char WebRtc_Word8; - typedef uint8_t WebRtc_UWord8; +// TODO(andrew): remove WebRtc_ types: +// http://code.google.com/p/webrtc/issues/detail?id=314 +typedef int8_t WebRtc_Word8; +typedef int16_t WebRtc_Word16; +typedef int32_t WebRtc_Word32; +typedef int64_t WebRtc_Word64; +typedef uint8_t WebRtc_UWord8; +typedef uint16_t WebRtc_UWord16; +typedef uint32_t WebRtc_UWord32; +typedef uint64_t WebRtc_UWord64; - /* Define endian for the platform */ - #define WEBRTC_LITTLE_ENDIAN - -#elif defined(WEBRTC_TARGET_MAC_INTEL) - #include - - typedef int64_t WebRtc_Word64; - typedef uint64_t WebRtc_UWord64; - typedef int32_t WebRtc_Word32; - typedef uint32_t WebRtc_UWord32; - typedef int16_t WebRtc_Word16; - typedef char WebRtc_Word8; - typedef uint16_t WebRtc_UWord16; - typedef uint8_t WebRtc_UWord8; - - /* Define endian for the platform */ - #define WEBRTC_LITTLE_ENDIAN - -#else - - #error "No platform defined for WebRtc type definitions (webrtc_typedefs.h)" - -#endif - - -#endif // WEBRTC_TYPEDEFS_H +#endif // WEBRTC_TYPEDEFS_H_ diff --git a/branches/2.0/doubango/thirdparties/win32/lib/speex/libspeex.a b/branches/2.0/doubango/thirdparties/win32/lib/speex/libspeex.a index c69992b2dc1263803751778cb12f6521f1d70c08..eca72a5d2e40d0c0a7b7797c082be02d581d4ca8 100644 GIT binary patch literal 298668 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 literal 356620 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л%S(=vbEPjaD|l*PpYr5I$eK- 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ⅆJrx~ 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 mXXmXG*&i@C@4Az7I diff --git a/branches/2.0/doubango/thirdparties/win32/lib/speex/libspeexdsp.a b/branches/2.0/doubango/thirdparties/win32/lib/speex/libspeexdsp.a index d3f41270ee35e37262606880a72776f4ef42e3cf..ffd03b89aa238c32c7ef0b8e14116f4caadf999d 100644 GIT binary patch literal 184784 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 NmRH`BCtt?Fg4P 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

Q_~xPv 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

v^ZIA}3@A4>@U0@mD5=Y)LNAJAVI9@CWx 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℘27vyhboW=OL-lm>FP( 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 BMAZNQ literal 768632 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�y+e{Imsw=A8sYn%C$XQyXaAnA)OV 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


3$_o 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

+W-valI9eh+}|F`d>;zFWZO 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%0Axg+Mv6CPm^{lZsM2{RN^3 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 NL@ccqhEg>9{{i@bW=a46 diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/ns.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/ns.lib index e13d08188fdcacecf2f66d10c95c2e50061c54b7..2d5f1c6b5ac40b284b6a118adae0d4e547639042 100644 GIT binary patch delta 251 zcmca{kom?z<_R*amWGCg78@1g*&wWmiV~aWvR!9|^CnN^X@+nnOY*97`sO?OB}y?c z7*3AXk=~rbtH`V2Bfq%qWEZo!FB_ zW}DYa?cretN=iR5fU`c&|+Zt%)r3F$N{#GC delta 251 zcmca{kom?z<_R*ahGwRwh8q>**&wWmiV~aWvR!9|^CnN^X@+nnOY*97w)2_!B}y?c z7*3AXk=~rbtH`Ti?4mbm`P7J~8%1_~lkS?Gu$EoWVa|dIPu5{kWA@5-+#JeMC#1oU zdu*GDw4OWHhbVa|dIPu5{kV{YU#+Z@VLC#1pR zSorC2XRDp~I(PkB+wC+M80r}r7z7y2|9*emv#e|3v>hCsy%Qz`ZT>Ab-IEz8HF=_h K=;l=kVmtsxttiL< diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/rtp_rtcp.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/rtp_rtcp.lib index aaee9ce355c11ad490cd0b91fb8bd334a174491d..12c0e36a36db7ffecdba8e2b21612c66db4dac31 100644 GIT binary patch delta 14625 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 YgD3@yM^A=qUe)@~3f*cu-@o#I0mj{{_W%F@ diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/spl.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/spl.lib index 4b8c4d858b22c7483043c9f702583f60117dd03d..bb44f838efc7b2eceaac2f763acefdebd87442c0 100644 GIT binary patch delta 9332 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 delta 8930 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 dF-j2mOibHf}4Qu;_ryi)s5 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 T^OGOlWA9hcTVX5J+NS>ttIcR4 delta 2243 zcmc&$YfKbZ6h1SvJG1xh!Y+?4h_E0aSQQ0?Rn+44VM8dwib#B*P}?8WLP4w5RvR_8 z8eFyOqnxCoh16%&$QI0KHHc_y@exeYurwx|mkm>R|Gm@SAl>4RXWI#Cc?hS)~--2Hv^_EinF2TV0< zyxu}JHbo4ZDG1oO+q6yn#UpNs(~oCr$0H)0siT~6+9>0BLO)m#?95+R0+5HLw5zu5 z5w9iLCivTvBG)XtA(*~7_HxqXDeA!=MZXgMe^&rUBhfmF+0~{FF*SvJx@38qTEiqO z(|tO7ed7L5$;ua!r&E86V3e_p@=&jaN*lKH!I@yd*azIcvcV_OG^hpSV`Qf zOI9rWsdVgEZc}U$C7~{|DK~S&O&5pBH!`wLr!B6q4&5sk0aO{VRN{7Z!*r!q>cidg zU>tXs+)XM~)JdhLk~~3BsdOK`_f!T+5(TeLjbd|SY#;U;;QcdEENW^is5*K(zf)IP@Bw3W@TD!_PYT#YF+5BmRGVMM<1~|WweeV z$}c^PrwgLq;(`{oAoQtV?NQE*%=C;WJ+20gz40VKnV?lZO0}P3CCt140CGG4M?8R4 zBcvE!CjeX{#qu@i6-5VD$0`P~-&(BynZ<{AMF7`Y0Kb=x(FjK0XeH8Q04P}pP>=mP zSc0$u$91q|v9Y%I4F8qvuGIpxBDxeJj7wAu#=j82frrT4*!%@RBF>3XVwsnGkJ<$A z1DZQog5ul^aC);I7kXpp*e%ku;&j@Si|Ya68hRP6^ErXqATqMM30q2e7t@_GkoSLmJge z0*Gn`$j6RLEJ3`d)?Q{w;-~|-^gL0gjwR|EEV#^)l|u)p7zYE{cSS0Opt6GihC@1A z5c)!u2<{+h1*x_kLbohBYDX&u`2flFhcQ1wa+uFi5G{uRK5GFS{tmTw52gL)5rCjJ z%sa~+asd%6YSX<}zeHJ{Y{Rlk6jD!{p4rD_Fc>d)QD!@iVe45QZ_XxF{&9fS#{pxD zB?luX%_Lv{4sAy5ks%%-3cJIl1l~!u6TSy{@kDRg(Ke7G+(D3afBDbII+$!KVn}i=yYJzcuu=n-{XXnpe5rEdv-} z#O@k;K`KSwK6Od4r`xmEPhofjkK6L-yk|u{3Cr(2vVMN_llJ*x|8CkIolkF_*=7Jw zUZSadDOpW)KYD=xK5d;Bt*<=A7I(R(Dx7VcZMd$jmLCuQ4@aY*akyyb6wL@3atWeo z$}ow3=@q2a4BS`5V}u3RUBbh#XEnD7@9XQ$72JaE89bb6?!Gmz)WNu3vLN?k+522?FvO=`}Xrnz$mveLxT0?cY3LP`K9Un%REK4*W zUDQ8DNcUv#$Q59z<~N@(h0slyN;sWx1Ysee##v1GHsMslIfT;)=Midl7DDPWD6lZF zGQ;A)ioIm^ za8YdtHtgb&LY?~UE?$)oH9R9DtM}#${G^RYOYi;T5%_pcJHz#lXXP1QJ2>pwFWPhr U7I}o4a*waCrY}Kjx!F79AMOvkasU7T diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/vad.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/vad.lib index 6d74a74bb23c19b82f9eb9e6e85a29c124f5fe63..879435f67f92aa32bc1aeeb390f2a69f592c25cd 100644 GIT binary patch delta 513 zcmbQVg?Z8z<_R)vmWGCgW+sy-aENWRuwp^tZti3G!wltbp1|S42$Q?Tsm5%R@3@(n ztB+g2-SM4RuE)%0HJU7^bodFS@Pb6>zz??)rz)r6)tSO?p`ObpPea-60lOtb4^U`M;*vgvGJ&)8o!oJMney`nR^*X)rLzGfg%;CAQgB>y0=g6WHX#PWRy^ zuW*Bye9>(cufT>W3%)Jdu*`8H?~w;FOCuIc?hdiQV%;l-$^SLQCch2w!(v@1#Jbeb zC@n^&%?Ik4*kL|D(FU>VV_O@S2Bs$-GcYg+FrvGE^Zbb}Y*2TX&d`Jh8Tc^ySM18JWSJU9fWsE6fE}`yrZ=_wV8oK(}eK?x`7AJe$G<^6cjKr~G-L5p&^& G6C(gO5Xu(- diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/video_capture_module.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/video_capture_module.lib index 682f2be196b16c210ad6c62634963eac2ef5626c..2632aa9c19bdef991f6bb931c33d522bc43083a2 100644 GIT binary patch delta 938 zcmZp8Y18o1W`YcxrJZ)cKW?-6FYp*j8G z3$Etr!UpW~1cZOa^&V!)@I1rsBz%7A@`ck68nFKmaCdwsmg_O|S&b&kDfzE=%(kC2 zWPiZP$TEE)3&+Oo(KhVNOi0#>O|PNjBpg{0~9g$_L8(|s&C1enc%?uobLurP%Ac)LtChdC1# z`$AZ!8y2vOZLiJcC}YC(JaYlZWm}l%JJxa32|*&o5ESNOlIG@?MwakE4`Z+d2Ksy! zMh5xme_Obuw}&0%m|PAElI_4Cxx*`r>E-Lw54iA(Zx40nZv!3fb3&egSP9-oo`F8EEx(U`mU?=Amg! z(**;##HJ^I=K6-kJsY4g()@)hZU)4@@a>kp+{v2}(X0-R;nNO0x4*(X2@2j=j_sND sydta^Nqc**3vUJ|7SDyKO*ahZ5^IMI6_by$2m-u@aHj}z zFS5`}VSJ9?8ide`-yKi|G4KRm-kuZH$uQPjV%_0#DfPIerc&M4>J=qR?(W5(zU%=n4K`a zDs2;nSsU}KQZk@&9;41fM8q1-J4inApr4E*4b?7tUbU&4;A)lX?S|M?)AvVNAsgGS%XpQ{TV0~I>>FRgVGn{2PN|ktV zD5=7z$q~G2E}8$Kiu*C9Cz}jram(S;xYuw((je)q2Dyt^`t9uoYHv3>N^{mJ3p_dd E2U}ox`Tzg` diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/video_engine_core.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/video_engine_core.lib index 2ced6b5159d118623f21c58aa8e735ed570d9276..c034a26352281b2d7d51984d2c37103a5e7e8356 100644 GIT binary patch delta 39665 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 delta 39720 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 diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/video_processing.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/video_processing.lib index 3d4ee0fd8ab36d5a72219472e5ee8d72ec745776..3994d14425c7de612e6bd3e33a74c9c454b58e59 100644 GIT binary patch delta 2792 zcmcK6dr(wW90%}o&IOX?wJXc=ke8Z(g1`cW1|j}gXSX=0|^I9tMA!e4P|L;Tpe-H2v_h$`dWSKbqr=v56 zuzzt#zRmIRk;X$hKkl}dIhbZjP2;S2H{P3|Q+2dcGQFFUvIa(SIvHs;#RkoO*4o2V zIM2W=~fO7bxU+V zQ*oeASfvfDD+>D^nNjAm*(>_wGN4`u8!4XS&#-CE-7kv{N2kiIYB{#sQT$x3Hi{T zcV$wIT<%1#4U1a#(@~XbXxJXnk<+4ef#S15F`uRqBs^6wFHfS;PKpRhNZJxYHZA2d z?^1t7F(c&0QbKamjq6hV6|5%mvrI?=;Vavih6iNQY~@eSotf}UuCeR%oi*jL z(O>!SicETH#B-K&v*^?i{dPhOb{M__dc#T>4|l>GxC`dN-7p_kL$r~rum;|O`>gE; zAl@!RJKPU%SnKFR4x;`CY=jdKy{HFMq9>oB5RZmtm;q&IfTFz+w!tcR6t=?S@RGIt z3Os@OLwE{mko9liRCpF9!S7%iyaF@fHMj;|hj}cNkRMQZ9}PEQ5fl-XKyl;k@I0&( z?eggo+Qjrds3Q>43q|Jopd;*uQ{Vuc1@FVTkWgYs0SqpH5?llaaeW>96|RTB!2&4y z8KCI589qWgo)SU!3_A!JZN8yMz35mkI?B%FG?*nngE|sHMnNa&1jC>U)InF62;E>Z z91UND?r;_KfUBWK-e9EXXsj>ls1kqZ4})L`428%W34`I*_IWS_brEQoyrqIxGQAdc zd(>l~n2!zy!#F6$p8;QhGokoiBFu)f;To6(H^TYQ08?QhOoPSnC0GSthP7}p+y|FH zXS_&zDyb(`rK5&M@(Pq-hJ11-^`okl*7jA__Ds3Iie8pnen+3Jvz<2&Qn$i;{Bkv& zuaOpZs*5tO;s;kz$e$xuM>*U?EnrnX~21gxzvcWn6R2$#2LRBlzMQsTy?;+ zIb&`cgHoNb_M$h9;0tSM01f4D2zq$ApqU>M9Omb0X|$tQS;V}Km+ z-fOZ6Dlh@0-JpV7;CLv$hu1+tu*4bg9*|P`cs)HSS=VhD`^H9BXEAjJ?y|nvp+^pB zp?eiR5mCA*^Ac)3X`{7K=D!=3jf_8Rr{=X?b~{EdsUB}-JmoyCwz0Ukm=|~Mae+43 zSlb^;mbJa-0xeQehrf0-+5aYuva_u1I`am~U+>1aF>4cKeK)NghjC?WDv8v_QX9<7 zORZeu%BtzeRW(k@ys~*A|Em1nfEK^yT-va`giKf>Pg8Zw233+&3MVbNA~GE20Lo$S=((Xx2y zWJ%3`?qwY|!d_?zn_ur^*=mye<>xVD!jlxe&C?9bw=jr9^@$Y(poGyp5`R@_(^WcCl4Rf`hH{*3c@8@NeH%V=tVUVl3WvE Qx7Ts#UkUk6tX&}c6Pc9n^fF z6LOVcX`E3lbMrH+Fo~(V%k5JIkp4AHJ<|jGp&5?|BFKm;3YmMJz=g{@1rT zlkxxXRs4=mo*bbbHT$dKrLN+B5qDKhqXX5}vT?RzWnPf;8K~_e%!ae|#Nt|s747FN zvzfEww%CzVhdZyZ<$e_>!$EMVn`-q-Un-Ja=J??fy&*+=l9MQ|#l6LdMREJMzpU6yq1!&rHLa4;C?2D<;gP zVIHk0K2AX!K8jdU#fNZHsyd}IRl7BpN<6!d^~O@t8=uWI?#o1K9rqD|X_TSY4u@o| zpRwU?;n?h->x*VB5j)f9RIewky_ZfgA$dC)v$!B`F&qqc!O5@`E{D5e7A%K3&)~hchO>SPevbNI@CY1%l*xK9u{?GZg~@0*4i~{XXo0dlAASi- zVFRp%-@wbx_9l1|^(XKQ^x=#(!Weh~PKTFaGHixv@H$)p(K$;NAI;cJ6xO5RHrxp1 zh_*p_;~nsOSR&iC#%)y1^X{XLfv|QcGuHtzuh}1P9DE3;z)m;=a$=U*&;=$zS2!0w z#`#t7349+ug}G2(XMys%br4yz?0|$ip3)%u4Q1-(g_ZI`ZNPR4<_S8~kqG7n-Ju5z zg#)1(>ftNU0281Qz5%`AQs@hpL6f#drSlXUfI6ydC=7rhFa(Z)$QuiTVb1oMa1`ot zpkdm_JE?@{MWgPDx*5v;jEBK+B9!qb!C7z$l)rlwX25B11x$czVIs7^B$yB1gqz?z zh-u2^Ln~YW55TwJ0LHZP67nSj=9C4EECnhsRXe$h{K=5!Y)^N#FVi|o>5AeZCuzad z0qZ(xV19?VvWKP(e7FCEEPYN~!E45XM19g65xSR7$IBkb32$UFW}LlLjic=jQetmB=1>|vu^9D7*q3BKCY6}R#tZ|dJ8Zb>tDjP6h~Kh-T-y7=t@ zKhwvaGKV|%l$JK0VRVVlZojs9!zAD8>ETVE{i!i z+$16f@gT9vKrafbFHh7OI{3Lja&hD*)~I~q>}Q003L|yPks2#r5MO(0O#aG1y(2Xm l{?>%`{+l6IhbeufCD^gGZ!8a2wDNG5eL5ly|7uS2zX8y}H@E-* diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/video_render_module.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/video_render_module.lib index ba218c1c64427d5f33dea691e56a0f3cb2eb6efa..8a54c0856893d7a84db71c2de9627365ff0d5a01 100644 GIT binary patch delta 217577 zcmeFacR*A}yFWhXEPKvMbCI@72SMzD6)RwgiVeHQ2KKHfCf0y4#)63$jbkr~8oQ#= zwZ;;SJ@($CiN@YrEZ@&F=j^(Q@4b2N@8);^c~62*n|WsDnLg+2Jgdg^xIU{}c7Ul= znX+YL%9k!b`J`;kh>I;7h9||9F_+`a_-(EKfB!Q6W`c@qb@osEW&9IL{|%iP|46C+ zeg-oBo>|q7x7a`Om+?<2{+oI;{*hAs&BT#*#y?}$zny`Mf2dynZU+8S|NplQ@IUqc zcU$T|6YlT#fA<3-8>Uxe4?ae9-B`IT|K~OtZ8+z;NO&qwIa*& z9}2ouNR2XOc* z!(7VRo^O)eEZ#Pg=R6z6}O zkn=g8Us{UAmMT|TJHS*KW3|3Dvg)o1yVX%;RcpAjJCFUD`K*PxH?*?jE{x|~l)ZV_ z8QI0w`lM_&cpI3E|5Rqge=f|x6lUOAXXHSC7m)Oy0)Zx0iRRnR$lhgK5XT_IDliH} zK}iEi=ud^5Fw&_>4BY#yT#vUuE9WbuafCt<+91MHX#0Pv#^KA(%F#v&uJX%gWos{mKnh!(XkE^6&+ZELHeHgUjmD|5oEhBSyFB$Paf?tMb#U z0^)3FiDsD(Lw0SwRhLW?@48DaYinb6X&`(5s~*5J*T~guLEbI~nJ+)>SDKIWby>>G zte1N6Y3l+?issDGoXhid&)rIKo5iIXzp!2^Z|iAwQC;}bV3#-^9OBZSpV^4emqJ}s zTZK@U#xk}0vbLAuE{!GL`X?!E;`yx7yjY}5Mce5}m%k)i;8v-<#1|Gs%;;ynVn`exa?W{8Vo>lP+ zC|N!(E{?hpUIf&YlGua^Ga4kdVQdfMbMjdN_~ZqMbJd@3T3{@!9>~wwvHXmC9dHlH zgHCq=^pQxu(qf5FU7{Fsk77KrvwOG_1|mLcvK9Qsgce|Y0{Cj10*rM8A-Q@81-(Hx zismtaN`&%7G?YhkbFdQP8Vcnz3Np5_AkQS(LEx(k@#LP?2>Ea!erdTe!mYZ**tJ58 z6)A#5`?`nAX+?yg5yvPP(R6!Fv#P6ZDGWBD2A6#lbj$fBphP%Igv03cdMDFxET<31+wlyP6PSW(;HVW4QZb zV}!CEc%E2M0>uE?;aHI&9`n@Vq8y85Y)46+60AhXPXKd_`6*}5OEPx5l*SG%t(EL0 z_z|TU3n|0+<;ou6a&j51WXZ@u_cF+SS&9&%7!mMRSuIi|WcSN5<{QU&!|t$k%{ayy zfJl9;m8~Uc-||}76boXODz9mcL(Dqm85>c7?B!MgqCNP>P?7Qb8&J%?kQb@Q*z`&w zRkx}LaG(-nc`GA(8xepZKw@S5RnfAAie&w(2<80V3zU6Y6~^)<@a#zBIS9g@30lfc z5OH(@W9Jez8JZI-TUC>tf~+Nyimm=OURHHY))BHFsx#*HktTx**6AZH!DJ+;&i{z9 zF}0ArzV5+_3#3S=t`G^<{pA0mEweKf8H8lOtnESZO`1ixQ0V|yFE`Bq|5VcE}jN#!P zrl5+!h#LY4;?_$Y*tlD-0X;jU_D^q|-mgS}#DcIwbnTP*PvjXgf& zzicv=;>8k`Z$dqo$qTt)-Fm0TwM%DtK@I>p0CcI6?b7)KH*0vLC%E2Ppt7YA%3F`r zyi@x|=^ffN@6)ei9RF;yG1HyeFvX={{QfHuiRoR93BSzb*&ryn*Qeuvo}E}IV#~4oO}0{=-`Q#mlrgMb-edhDF&F|etUaG^txF3}_6UXF zjn0YxnOO=7i!A1~G~i)ayAH;#=H6eRyJ6(qZuFCfGoIbS&`qAmHYUWJnK9--F`+WY)gNz*# z{9!dRrA2)oF4(f>Rt49guIN=I3|#uz=odQ(qqte}HbzZbp1r!tIIq?TecR2(fW1TT z|ElnGQE}tdtTI(Y4>mTf#;E<2&u(Y(m*ZS`8kKUe3*U-T%IjSCT+pV6DD7a3**tu= zF&1NiQiNw-w}$brcN%N)Yg?5P-0bC9c5;ws2ycDG8pUINF$VJ$R;xRI5$fs7`;IaN z@RVJ~BE0bq;~L&~jpEKf-JrMqA9b;;9Nb#j6JB4p<$KdQlDA*2Bgz1}WQ?bllie z2DF_t7L=rHe(98Psf^`j>@8zqzV5WK1!P`lj9HM`W}Y>6Cullv>?G$(3lo?~3p1C< z8z!hsf238#Hu<9Q4aJ*$+1QrSe0T;=I4dU>XV$p5vTtdeL1FNP}i}^Y5)YITy zTKskec7wt!(Nb-`s_G`6u)12Dh+}%7!odI3aq2|gyG3NRJMjFw^$6i0zS0Frz?VAl zx?@u;c49v_ z({gIk0mh~r=7+*8A((L(TW~~+9|C;8j?*gnh7AOPBDJCuo7ZIyx&2W;qj45etF0lk(5}M8oxWkSO6a%iN->d%^ zE-;=}#3NWqh47CHS{}n-f|?f@>vEYVW4Wx5d5&M!WHj}8{l?hoE1IkyWHqnSDlWe( zqOHG*db);e?bBDKqpoSIQjDW4>zbxx9&~KIhQ$BWbdc=GpKoRA4aSz-)MOZkne~>C zxlz1&w-~#B8=a?+M+of=+TGDssN?T2=6~<)N-^!8wnF{t9&B@8Nv!y zY$vG51MCE)Gu=*5FdGPAjJrBl83C?$AU_tX6fjH&Ri4XjC>+V!iq zt6jfIjYc0OR;$5#xR@&PlG#=(-{fLy$=i4E@Z*O&cr51i>MQH`V8s-~TPUUop4vbu z#T#|<2;m;8sTjYem zo{+5IWNM=I1aHz%Y07_UsO0AdyLc4i&l@U(__;hLe{Py=ZN&REQi^)My9eYyd76s5 z4?weUYyzuv_xQwCsj*U8%KP3{(AKAk^1UpXdFy%BaNga^bj)UIq0}rSqrMsrS2BVt zhhgDcs(Q7=HSO%+xmg z?`;x!^K7N&|8!&6M2^KW{ge{Mx9qWo**Ay*|9XSSQ}$Y$anF{fMBB1&ln@u*v9l?k zoW%G+uK3BLup^|c-X0joEWNt4Heq?w_E#=#+;J|kKu>JdTqV90a=DJg+fBi_Wfmp| zv!o^@&M$Lv>>opFwk=cP)S%B8+b8klF3{tLDa9;JO!__f@t=)4RVXw#bKUMzSl>32 z`CY`9zm<6=!j(KG!hNA$Qrb$TYmWc&_bSyEv2Iu$VrgfVhIAP!F>}`w?opHGcX@Fn zow3FSeh+)P09yKeXoq{upzUydT*MAnZsNkdu=fk#*cX|lgRf@B&M5P+ao2W3##E6f zV;OPEg`2w~AO4uH&C-B}&FWC9ZyvS)%;L+V<8H-l<9LVLq3V$;VUw`Nxm_JFIuj%h-4xnriYdc}R$NRPapBvv0zMhH)2L?z_HW z3}b`Fr!rAYYWDY zd(x=ccfT?ADi2R?3;mT{NuGP7-%;@QS37f{BdcHNaMO<}janOe2`96z{NfD7FXIm( zU)=Z8HHqJTe)UDCbC&1reNn~&ZlrJR(I;7ty-y6En>s4rZ^@mJhxUR$?wPCMq}%Dp zS}h8%^cy|62BtW{@4D~PoAI5GbclFxblJ3!U9WJ4EciFg=PXexk66!tZs~p0{j20-yRBLN*;KC;nSJhD-+pz;i^+@?LlZDd`AddOn={_4^sq|@ zR+nxu6sy)=d3i!RDb(}+#5C@8-HwM%u>REj0@x(xdh2Qh;GCgO%I>Bb?y#Qhmhx|~h_3ELSnKScWO3;FA`VGmj!T`=T} z5`Ct%EpmJX4u8E!-_f*Mmhjnsh4=~`N2xlq0 zyvq5sm8(m*j2|1A#IPVO>CKZoU3$t|3ZA3Yo&sNz}wn*rV9+!tRw%MCEn2p}0 z_=tn1fSNuO&M&|9*&mbpPT4Ug<@56&n-kEjeE21dHqx*BU?-D*l7}w^yPdeMd+PAv zJ<}g}t!V5QhplE^!T0Df)MM|J!c)iHoV@?xu{qtaITrl+H$y$=E`PY-dF3{x>wf>T z502V=`6XmecJbpW)Qzh7@lZ7PlEbltGfT#~nX#5qrkU3D^>J`k z-zhX7>tw2}B~~5-So@j?cHd+30N(NF4{e{6`+3OHDh(Mchy|`$S`vSLL8qF3jvP^^ zdBmEdZjZ2j7yJX;-L4Ipeeu-8(T9?g3hjT1?FXMVNAZvSQ;0`(ikoklFrwP1v>RU~ z%DZwfgkl?SmI@Vr)wFD)S)|vl`XsHW?`1fs7J%%={Jm%TV#wS|+ zXeosanBe;y=>7PTsZYDBFXwEix-ldTZ5gXtvvhUqh22}nr5t~Gs@Ig}oYo(-kB2 zx51?Kb+k*1c}SdnZj7L_&wi$A ze9L^Lq#TpV)0W{3RGdGJFSPI~E z#ae9ge8o)ovSo^hl)40`sJ923YVqkKO-s1BfM+Ow^`*(gla^~4TDnrH%NwMb-1(SB zma;s4o?_y^E>_~Syl1DGMAn3wqD!=Vf~Y0Zn-AS#pP59#&WtvdpyK4`-OgD{<%>ye zjn6Q84(Qmab;nX2%i{wK9^1hZ#lwQF1^JxD7EfL~$SNYvJZG)t(z$1!RG!etlAo{i z_RMcDM5QK{y1aRJEeki7DaGxAspqW~C!uCix zx2<*f>p*LMzBLf%(64UWvCM&{MBX#fGr}HnZiHtYI-QQxjL`R?)s0WdK>2Wp{Sl>c z_`0>IJ#fxir4DcPr!|3(it;Q-79LAM4hBHS%eBfvs_laOV13IOdyIo4u;Le0oVi{} zv2z>d^(;mPOtLfXt;4aoXdoT?VaI@~4#i7z&j^iotDi|!y2lqLhY7}B)LP2z{6@uM54tr}Q#>ogQz)D; z!sN@#cd!IgedeQ+dzD|jWcA_ogRzYRZ!*W(d^jE77tpeMeydWQA8KL|Ri1VWjkrO$ zRz(AwSsYb#_pa5S_po}3P|1OwCF~j4G{6*3IeR(4B${=x?-h}e3ZH0na)4)XN~kdZ z>pMl*CH4-=FvJHh7cTsyRHL}5Ta^C1;zO&WR5>XYe?HLD)43FA|8e$2L;7PUm9kOm zCusCO{Jg~)LWbm8p%RuWM(#b#G}|5{_O4abVKl!uPs@gs0UhsI%HGF3cxHc-tJIY@ z9A_%ZKOSQ$Ya8;jvRNwUk2M{ZUHA*sF<0h|QECcCIXC97W3H?Nu&ILAg)rWCr_w^6 z6~=F`M|){d$J3pk+Gk9c*O_d+e^E9{Buc5_86wT%NxPM&M5cB33?Vq7yJzwDUyUSS z{f(`_zkW5s+wN6{Q|xVrj6%!hL&mj*C>nMI|NWa1ercbQDb2E_?pFdO>^32OLIaANRpZGmAD zV$TE?hksuQtP=i}VKs#%0Hb3#gf}JgUR@Z1Q` zg>p=J0o!^V7bcDsz}E1%QcX%F?bO&h;*Xw1vi7!VDInJ9Y&l>g;0i#}mIH|08(Rff z5^ysh8Fvj}6Tl6CT>v)$b|<;*@d?F%3bs8zsT7fNrMDB|$QZi;DZRabl-@o-O78$5 zrS~f!rH5^;NDpr~Gpm6<4A=o)?rQQU(>e z2m;gR7WAA%WU9L>fK>sn1GWde0f<#9yA3!9@Fidt;A_CI03QNQ0ek{D4e$lvGC&Hq z5s<=d29yje^C+MScoVO)m^%=h_cBkwe1Kkn!GPGDXNCg$0~Q7h04xd^0vHb%23QX; z02rWZfHMJ?0Y*Tfi^5M(*+$Kd5I`0L%l3fm3_$%xm9Oenba*eV2w4TgW}dO_JvD!uOTa9#r2H ziE32hUbcMR2od=}nJq=UBhvKY-?tA&Ow1q=Tz#ZWg1Q-xl&eT&_+v3<&DFrR$I3;> z<~~urE8&%;WF?!jetmPK-H6?9+HQAYSq&^%QdW~l_pF4{jouu}^2>UbRh2><%G%YA zhfL06sZ8TLJz9%HEre;f$S?TSNr=Z;PT#xIBlB2M9`5~2$)ATb5x)kHf2NEN52g@! z&SNO{WaYhR>Y=9_cDO{x^PC4pZ$4yj9(NCl>KN5|;BzI^+Lvj=-Y0<35T^sy0Q`iv zdajI&Zrm*Ee)Fu)Oj&AHvP;&%H%CgHE#KCX9(THWWF!jglU1Kep1}LOP(lM5ffGsP zKb7TA9pNS7YjE#LwA4@;^>D)6*d`rwWs{Lx zjW+p8z|O-M;}OyH5o40h|O#tCFdJH04eQ#K^*C;9F`X zyg>r2at@>$tFB|NEZM=M&nQXi%2FIWnzJ?DKnD+J*&6TL7ixT|^subfkp;=Tv5g69 z+*I_4Ol zdhGJkkQ?->ph2;#kiILI^~pgW5CEqSf_oqT#vvD7-s?D&Y04x{&6pc?oML>v ztp4iN8Zs>MjaO9mf@Nd${?i7-WJi0L%xt5HJXE5nveLV!#rBSl?t~ zN?^+Y699h%OaWXANO`aU(tLawe=0krV{W2;i08_-HbOB7braLM#-xs-@u;I{yh{$= zRR`~xgZI+GgDTOf0@B^JPL=HQ<_JbV43;$d9l_|whu=5)^Mn1pOl1&SJns+vrR)M7 zzSGh8;Trk8>%HH%s6jhFBzNvxunlYYUVTye)MQF?^CP7=x7{%Y@xI<_Fwf4T`glb^ zLQiYG){4FDb{Q1&{o!r{tWC9#)u!lnn*gcXVbv+R-F84)M(+SD4Y(7KYUfYz5SMvFXZ-49ejTKNDUzI9VR_YYRVZkUv+U=JXTd{`ZdD%b}|Bi|uFs)8ecR0Y@w zh$^@PT&n`Yv??IXl?B3f8jtn@8m|apS{0OVFe^F&(&j)5NL8RkrYaCTe&1EK_&PdA z(3>M;?VW=Uy^r?iJKEDsJJ#sYo*}s=nBvHj^Ygx`3p)#ezuyToQ}Z#SaUc=yu72tj zu184K+jvp_*1%+-_uKd-7>o>j8ITP88z4>TR{*Vm*8!sdZvav!z6nTe{2~4{0~4kh zm@v)28jlRD@yNgrD~f<*V2w!z)&i1&H69sQY}T>z;N&+w*J*d{>akJ-y6nLz$fdp;bGqDIle`K;X3fmc~lEu`G-;Al_z1i zpg`}pW^b5_TC)!zRXmi7;R2gQF3Da6LVXkZ#{?&MN z1fcQ0BCI6-abpu4%$Yjo#^{Vd3%Jg~+e8@O=A{PbORwNV1m>!D;w7mu2wmPqOhMh&@gY$NR3Q3Q%+<5`pQWL);cdng+$oKoTL)oC(X^%f| zKcRp>eXKr`K8j!i#7uEbkawnR!*}msd&Hckd&x9bS_bMIHD1Chp|J{ zT`XV|#48O*NtXenW~3sETHO(*)g583ESn^PH%Z4_*&M>Ox|`=my)I&bJv1s~!y_81A=^;DPLvrVO`R_Is#}KD2&lzj>&O<6_(eJ}21gph) zn*g<&V}sFIx4qK_BZCIZ_ibMuwxoVj0g(C)hGt=VEJK9t69H*GRt=ES!dNG4PX|7l z?FrLtPnavC1&qd{5mMvTB}}t@vV+;$5irHUOLy=F5+-bKNw0~16NBxyHdKwcWj@`S zP9ylxAk|WcdQZ&z|9oJZ9;t29X<<)Kqy};3_`bNzMxfE*lb>@{`8Ff|=Rb$bnmjvE6ObrdCdMc>>^MNV~(yGY5p$kHu>3M%k(NSZIlTSk5 zucDL>$epXG^#|lmRTRO>qHGP`o0%w6)Zu6V^P>(|jIYeEs^4ZRW^JQ!FIYA4pqxBI z`B(nfax~Tx>8e*M`s^d4?>h%Ar1Jf`?Tosj{@4YO>b5H&O`zQXsc!oKHU~@tq^$G< zq`JjCr`IiETHO-n%4XqTjrScLv}nxb4(2Kyb7em{c-tMkQx4uaJI}T@zj{k)I1{wO zK0?wn1V)2CPJNgUOU1wR0!^Xs;>7DUMQo$F;L-RsSzx~dTY*0xhDn)y%O4h2V=I3n zM3m?HLX-n+yx`G+yT&^RY@FbobntEi8^cqJsNR*o6e16_MJ+!8z(xpOl!I3iSf=1r zcJPvb4dXdbkug|^@KT2D61l+Z6Sh)d(KvDVR7gtz)ACat7!6zstLxz5B%kUCyv`2Z zKw!NEFVn&M23QZl!%4QTZ)pZlR6HW%m|AE40<4qZ{p#Rd0M=gc{s7iYWbg^Fc7pfX z!Sh7J)x!A!)4~-1MkBDoiaU5!fVBiK0~PCFwjfLdOaZ2qxF0Z#Hi$gf!OH|jgS*1A zfN7?m0E|xM6*j}c`wm!=;4O3T)&r|4csqzkZOMln1xib6gXpC}TUT;vy`Kf#C)*h5F47rM` zNk2#b+I)rp&DGoo~9!d6h(`pX8;BzQizTs_A=;BVi7SE zunhPafE57I12Yo=vjAHGW&`#I#2}EF0f=EBa{}Oezzu*n9?skZxDXKM0c;T<_Wv1d zF_5!hU^LCV2Z-SJF|&}2teydq2*!Cp`sK<+z>a{I0DA(y1RMv5S4WxO z02%@317hyXTmqOE5bt;yX3)&-fOw;niFdQi2k<7KFCbo*GQ1qj#OqNO2IvlJhXaPu za8V3MDZmnd$$&9{-2pMsWqtuz8gLe1S-^FGaezkvD*)aA#M{M88BGPlVP*heJYY#c z6e=?buo_@Tz#4#`0oDc_4_Fs4V-Ao8Kym;Z0qz5A3iumf3&7`qtpLqvKy3jF0;U2s z0ECq?KLP9tI1R7|U=Cn!z{yv)Wab3|^Je-3egzl` zm<<>WI03K(;6%W3fRg~@0Vf021mu7X0H*=A0Gt8X4sa%5H$ZArp8@6v90eE&I1vz& zN#<<80;vDYB|xIVSO$n6y=ATd#MG6!5pWgY7QoejI{`@{P1%8HNZL^@VcJnHVXiDc zDn#SabffX8ay1^_KI^<{8kT{`H66^xj)2V_ybcat7YDDugZHU}H^RXi<={YwqB6aPYb~c>Q&(gd6+R!5rZTILg7J$xq8Q z^^`!{kT|uf^3G3uKjC%a)kyjJL|a z@?qC~yy~ZFA(&gICcw~cSn-aX+7IXwDOR2}K^r6t6KEUS^ASU@5zj$SJ12}G0G^_G zdFC4*+@N4q6nEMt(zBpNWEnpEw8dh?aEX^7nf2AM;Pg%d(={9&^3U-Q9%1Mrt2j$h`CNWC6c)yOR>3T8h^4ac6V8(tuKwX4G0H@UI3AHqP&~t9% z)~|CHnieMpiFWt)Lf3O7eNNY0PfOZKa|01eXr{@t+?P+<@X)gsi^W+{1Bar#W`41X zTS%qS2un{9@7hp}G~cm*Bhc?=rJ+MZqM4VEcMIWf8mb}u(v$!tb~K{rA!T?PJHn-# z?Hpk(rz|(+O&Y2AeNw!eVrk(Nx2YrUYBTS1&Jxl&MN`4HPQG(HcP?8%YLMtl6uZHi zJ2c$XQ*WNjV03h3kUHs_Z@xBG;diD6STg9Ro_0Mg9eN7UHU>}2TzY8AH%Rv8w(RlD za=CLzdo_c!17);pZspM2RoC1~)68o%QoTAm+GCfJSP3BBJJmw(rVSF!&~|lg9O@S9 z>e}SWXgd+hzAYW}JY@#o(nz(07If0n&Y|b3uBRREeF5J>j%cceM70+hj-h>(0!B}& zBYa3cox^`=s^-UW=Z&UnU|<`a+X2FNyGlnM)=UlbS*Qo-C<2g*v-x<#K5mwBR5J!C znpk-D_xg1VsnDJWdMpa_uG-Fg7Sy^`@zw%%#>|*~(c){d>*>^}6YOBuGuoSPzGw;I zd7G<#fm`)BWTAJJcH;@n)j;{VH(y`PEyQAP<3&pk8~;{UH6MN#Ql0}{a(f@X{H{-k z#iV6}#oRhN?`_a&KDHoxi8<)LJgEY=Snj*ls|^5JX`g^X}lSD=I(2+6?&^l_2VO(sRekq zma3e*vKztEXM(ecp!rmfwTW5~&Nr z)e1pRSosAgu@u&W-YnP1DXYZ;_}msyR9u&~EL#tCY*(~AfS-hvuO>z11Gz^_H6#`v z?~A9+Mq||5prZmcE-mNZwR0v9XpN?EBajb5bl$Wzbkz#tD?m7^*H+YsS;n61uR(m; zBUJA;3hEoo4}ow5Jts8@dK%J)q#|>w+f48^?$L z5a4ep5Y8qZjxK1c(oQWdX}9|I;D7E;#EKu_9_)vvuxA6-JLh}26y~$7 zNZGf?Jp)R_mMIhF^u(6Z-PFWsH`JAiEngVA+X;S!Y6 z%M9$P!ovcPvGfsYL9dtdvEA*CwYiyQ2yCHwAKZ{)IAfOhR{=_t`X~6eL8SJuh8vy& zY2$5)lAiGiU#QXQUl1Pj!qo$P+`}b_$BqQgh;8QSd^!&wjEq$CyPbmKym&En&0FIe ztUkDaXgNON&%_OHYOs&Q?t?>W4Eb@-z*|wYuf+Z$jxTO2D25}u(zqUgZqajv$||5s z;&=Ty7E8F&(O+Uc{dq!X_Xsr;_-qIyD+H^Fu;53s5Nx(cYzKa>pB4mThdsj$YrlfC z!OAa@^p;h^PoX3}p{hr)xJmD)0EwLs;4xhwybt^|elI_~mPd$!#GeAEe7YS1@dAt5 zy+O!HZ`@V#5(gIe>OYfWS%M{I34tKmBV0+s@m{kKeuxC=z=uE}a$2h$s#y8)P8n%W>d|7|@DCJ0)#GZxmtrP_{z-mPx^N~t0z42k+fe?n= zigK#o53TTC>54>ps=WMnECq9}dcSnxWq9ryc8nu8s3#qzBfbLT8Z5F2DAYxrXEerdB zFD=CHA)aAxAwA>b`oDuXLE2JSn8k3vux@i&&b%%xvDZb=GJ{cIT4}@-)#HhZO~h$b zG5lPj2XfM`7R9)72cVBA}WUJT1sLsz!ABn>M2^Re+fapY8YtzJi?{wJZA#NmPz1$QcYs6HS{s35|_Tg zIFwKW?erskP-zc@a;)7b+4&>%!gbvhn@|%5#AT0^+v%X2*Alr^D}o+S3k`Oq zF-l!o3nzq0dN~h6Qa?#zq4-rj^(8@;U<7Sw=L&DA^n({2WcBBM=d+KFrp?xx}`$fH`pskt_0h5v_lAD_9Dbf*PI! zq5F?iT7OEdC0_3{_i#5lJ3knFm>gr2@_QeN)kxEn zf6CLQA@>wE120p~_S19k!M72gMlG-Y66=<(=~uA;WYa;2UP@)QrAsXE6FqfWiPqz( z({+1v{X}B>KSf~7v4+<`M0+<5lvo>FRzh59JeOwZ=}aCZu{(qHbQ(cZ*bqIPAT*(V zLoiJZ6Vh;LE1yfTFx;@8hoO!?(_>+I&5C8{u}qLAW=O1dreauBK0(K*+FsLnNwZrG{ebAR-3 zFv6chx(GztRDFc}9*EG0X3Bn;DlzZr`aDnrh>%b{wwf-ni8Guu?wo<<07mRcXnY1@ z;C!n3mTpkl4&0w4A9_`v*aYeA8@r><27&7V0*V z@w&vk2-%!VH`ReCyjW`lt-05Hq(j}T<6?}VTrv_zOff;b6p7@t5B{m5}cs}i7?0dS9=i;(u8>W@E4t@ron%G$aFS8HqUX@N&TBH! ziB^FS1;FbqW;-u2!zCwa84yBBLw|)!SXKR|N!|J*ucLp%m=6Z7y2jq^ip0LXs&7xI z=iCJ$;?_dkM^~}Py{5oCHC_(q&FDLtl;Nb zJXac}BA-hv4A=hAwxrPu+}HO4z3^uYQo}&p{!0^tzC@dNsR`615F1|U`5>#@0wKyx zJ@VBniM@KGOKGW90$*SXDUIbd5hO#BwUv7nNOwx`dLYZ%iZ%=(Jn)vb7;ftq>nvJj zwlm21p&@>#woKcBuLHf*MGvq50WP@6>M)P zKHmINU-uB9bdR?dTBX_Z9te@`z6fc>8|g8=vbNt2hx7^vAx(zV1wUqO;;&1|a?3#o z=@*dx=`XWhR#{xxs1AhmEC|u!8si(CnnAiTR0KVbu5~q->IByzm|x?ZpjL>?W`qfA zs5FXv6t0(>mL4rZQ0dfjAksmIG>^fE$q_P(jM6oK1L+35x2;=1E4y2Dgh(kMvv~z^ z^YcKfwmWHGNK@w80b~Ccc$<5zD4(@XjZjbGCHoI05i$%b#x!XF05Hmw)f*Cp=z{n2*619VPw(l`Z#kkT6Mk3^Z>sitcTgG~!p*ULB*aZ7`- zvWBkpHy|QjPe^{p#{>;)YFfp7KBA_~R)Hbf zF4Sv??9+m*2aq(H)Y2Qu%%?H9o!x`gP#Cc!2oZ+{k%o=Y4Vvf%p>cg92q7&9>DDGP zyWUinQnd!)8aW|d2x+xuGP~JaH%M>`T|#CKYaz2aE%hor0z|~A1<9F~GK*-X$7upY zNT@?L$A=ZWT5D;E#qRUg2--%g0M|9jp?dMU8$^PyUOgdZd!g0M_a z=8aEe_T@k==DLA0+dELJEOE!MdJLSpgPr1j2I4Rl#>#}jsF0yrygEZ=)@CTO8?L3; z1$2*LNTdhsG;^5Degffj6U1&1kr}$AS%%C$1tBEEL7dOji%6|B?{JyL4c9W`MjtCy z1!Kb(dI)L)x4yt|F;eTGZlh6_5+h}1`%>@ve|{;mhag0Mdj(?nXs!Ra(E-Tp(K1^E zh8X-(5O*~g-edI;NeB^(Z+V7*k#i6E9uK0`I6ZBufUod@&vr0k7eaah#Nw}=@_z1X znHk4pR=nxMC!KoCp5(W0qz=5`*0XqH`(q1)fctmz~trK2Wc z=mJBG#v4F%pR7yC7&9izY#$iIF;*)VK{TGCB{_16%qC3HOG-oFbTIsggxFcN z#8*c-({-gIp!CXgw8I&Q`v^)0&yZQaS(?&$vyhirno?I%x&e%`b2MRBtQXSfpeRpa zo6kTj|4!Gr7&e2#`y4z${(x&IE5{RYiG^to!TmT^|=>9rnaf2?QmF5r- zLNaaxmM9yY;`nXS+Y$|8g*M47ZL?Fn??H%`Mr*wvH_PnVPfpUpTb$xn+=5bVb<(^B zgd^_mtr*U?Yf?9=z$*A)up1cEv9vLyKR7pk))i1Q58k0GpwYM34$NIU!JuJu<4&0! z2O%PhD!2$v)-I>Wn?Z=w>mu@jT^NM+=&6fYVGm{nFsK)(UxSeM>8eZb!{iNO!WBqb zfOxcDA1DeOK#Mw{B`R)DuK>nxzd8*T?4ZnC59)2s2gH;^x-=ZcS$jxkC&3W?@-m1C zN6@-U;`IJ!AR@1mkk{u&WcJlDFlbQRa!h8IK!_>f28gjIw7#?Hgv@rIfHJHr)FU7| zpK>bv6c9pT7{S86y+JEiodU#N#fO4m*k_fop!5Bq2cXtp{SQ<;7?=dY z)&3wpz3wDkbX{h@f+5CRS_hm0W8Dos1a*)bH!uL-MERa#cXkttpxa0c?-fG7pR{-&!k=QVB z7(YDLvwQln%-o(hNeexJqNiF(y>Ohw+C7z-`8k${cziTp3??g09|1u(5MmWS7DU!7nfbnk+3%vkgua$pG&5)~xTveO1fi9WUX69b zZ}OVT;80&1B^%gW5Te;G0ny4ui|Cesh+nxF*a0xaD18$|plZ+->Gf0tYYsxxod@1I_1M4b0|dz`hHac<6?7J@s@?P`bD+sY6}_ z4}~-G2p&ZgVqYCf|%*2NnPpe?4X~4 z83K6m^J;|0vH$}c9s(wwB0TY_#ox6D&=Tlc)57?@4R{Z`AEnz4`s)bT49>Vz`i%TK zh+#{XjRXOol+n(YW;LR}iAtJ^^u} zie5}Q0C-fzz)HmHDKy8uSbY-o6y_!v*fJ0zg?%87g0QD>9`v?EJ%xvf23EeRo z152z133h90yK2Z72r?qirW4M7;B>F9TY+8|&cLs8j)OttzIqWv#z#oA7>JyY5Vf4pjqCijmod5H#~YE7>>l;|jWL?o9d~hFwi@t@TFQ8~u zV*@MO92ur$vYQ*&8W5tAwt)D#rJlVo1by5Rn%h8g3^K7F=b+cx7})CedM4=P#-oFQ zZ;nAG3gJAWc4s~4Is^^u0;BbS(J=F=#d>0J>50}x@0TrT%4@(l&>NW`>6_jL*1r$5 zUdNai6 zvJ|2PVSn&qAPDM;?vR$n)m~MH=+boD@6~9iE`5o{{q;}-8~YjZ?vHn_pf`PHU{5m0 zpq5~_6h!|x)4(=-4hFqNE{I}R8ew1^M^FfqhgMX*!C3o+fp4pT?P+Ce_wUwZ<9P)~_&(R6(&Hd}Uz# zYpvMl5O>Sh1~xq#*R;n$^MPywbDIFu(M0qN(n1pqEPSFSRT@t;un7}+-_;l_RsbLI ztsZU7w+8kQgou`nXkL?1TO94D5|nP?2KEZX{X`IfXo(Z2!gLr$TsI?V&Qt^IJ)K6- zP*)VxGQ+@b&4MbtOn0jUL%o=dYMO%x^!d*3VC~zgvkUSK^8d+^;ZH`>wEsPC83p+t zF_w~CHJQ%1#l_NXNj(x9)vU?~b@8~*ALcQA$>S?2<%H7_*vJ&ed%2mKkb@N5ZNAB9 zpY^)I}0ROAi1dvxNx^O~0C^2cE{n@UK!KMouG zada)CyW*H>Cf|0 z?yKwT3x4j4^2g`lv**B!zY2No8}U6{HTNAUI2SZaXO6A&{w=JqHS$(#)2b5(u_u}7 z$`2xb$@4;<+kJ-%nxa|CePw=iH*qjLiOmBMF1Hh#l6f^JHpB9gp4`rGe#)ykv3Z4`dBLqjMkQ=i z%~Ec6Eu#eg3-!`_&TV!Her`7|UN{glOSxSUG!*>Y?lH0je@KyBUUCi!L2iF5dEsvZ z4knV4^HD;%{jQ7?{M`Ok_6vS)|0=kVQTR`(k9VCgg#48^KSX|L_T!Kq-UxCz(s0Et zz%1oSH``U^if@;ZOv_a@-E2$$P=LvTbo>7ZKALm{g7Xf zzJj0IEzC;6&+RYdN`P=T6HpNEf0o@0-~|MGE2GL0Cf!# zPA>u$2zhR|HCKa#GmL=B!4yBYo0<&#HU<7m+HV)~+-_=Q{8q*+<@O+wAo#i6*JKKQ zZud1?Lp1j_a;R`$6IK=PDL>?P<{_rze1-6XuGnbL%6w%(&vLv@OG_>8nP!T#-?A_K zC*ZRGn{=x`Trt!p_X`fE5peV1@Dl+?2*q+cKFHgidCXZv^tI2=8|i$_J_ z5rJHDzym{D4v!eZH*qjeS*cWXcsU+M{y54~P`i%=_)O5#&h6(|b@UB&R!7yrQZZN@o>0Gu=`N3yz39)eGdwS?^{16M;wLuiXV-NZ_jS+2Mzed z;j=>{xir*NoXQ0E3VwXgeRyq%A8b@7zqfg6)Zo-o3cOql?umVjIEdz*tpO%CS}aK|A$P1wD!IJ+N#Cl-gf?XF1P zcR!-LsD{50;Zoy6ZaUs^&mkOrd;A$nt zUU<9H4&hb1fYvSiyPMKUC0t>YaJWSg8HQ^WU%u#)^{q=7&0Pf_G9L$6!h=e$NY6a{ z!UJm+KFz~3MpFo1DWyD}oWJzyFp#Hh!7eFz8yv$UCHO_bu4p&z9fTJf3qQ9_sl-P| zd6pyDT=Ki}o>Ol$nM(E&2!AlyQAjXjtr9LWF?kU7SHc!=)+%dA30#A~*~$ApSKv&= zhc_B$Dq@45jgEP6tT_TJBrLM>5~-XPKpidyL`Hv$O^O$?}e;&eDDWS~pSq?LX)ze!4ph6y{pEEa|_s`O2^K z2rSM^&(?~=Oz+v+W*Z)c&;jVY@~_$=(xbCKh!#E+7{a61U>#du&3hQ%Fh`4l%GWvC z8e0wBz4kY4fQL1Eat-h0{I7XhC1lD!U*opfDnB$|8%ufi)$~rbMdJte-=my73$>q- zCt)RKdW%}#aRi*I1z^A;tt)_Ai?rDuF8;hW4lbI%Sep+~`6XH|kRO(4yMZLs^{&91 zF4ca7XkoIE8+R7ECm#~y-GfZ^S*9&Xs~0kCID`zM71v_DQuF#K z*0wUOJ_{i#yhS5xoBkWFa@S@{jxaAb?yDB6^;QER{>leC$DOSizOPk$%Ot_ioXCbdJG@wDF{te!1vK5eN6mt7|-^ zwRgNnG;iAm$2u9?v<4`?)i!MdDfzgyAuy8I&U-bnCAMq*$YyYR@14-N(H<54d56{t z8c%n?vB)xgr#1&{fnC}zyd-G4z%I zH>NC9&Xr>L5F2+`3=jL`u|sDicyh8fimZsUW2gi=JBHM7znUI#v@)`jnJS=|q^v3^ zeWX&2NAJ_(J;u2A@6)o2!Rpt;CleJQ{>Jbx`!W6}+T5EDXgGRgjN5%s%kKdJzjsJG z0Di?`$zS+gn~OI0IfCv6ob{+SjB4e3*%`vmdir?sg-5h}JoPA^?f{NHrcH+S$zxgo ztn%B(MNfO2&@NM9*G_07N!?3)UNn!YFM^BV-@n_NTTEHNlctVO;O`oS|Yl5jP z>sUM}wGM%j{4n2nTN{UNjlQF0^Y~98r)2iipj0(FPJ^m;mXEzlYTUS|o%oN|1*wI{ zGeYZ<)Vj>S+!KY3y^q=YAGJGD?XFb2C)MsJKGc?@tQ8NnyUnOUc-)X4xP7?8bRL2o z#nZ)UEGQNWHV!lrbUbJjD5AWG@W>br@fE<20{sqjH0bw)^Sh6P+baE~ov``3xc6gi zD$Rzkx4kcU-~hKSJ~%XT5GKXUCt4fSW>SP+h_~6|Uyti~^t^ojQ(T{**6fjY3I6%1 zSdWul;bM^eg*J<4d#=UU;tlSX%O{-Ac>XW+9sxJY0LYW7H9=Rzr)n8INSOKz>+i0Y zl-r%@Z!NPB#)TqhqgO(R0?eFIo)A8Htu;o)N_@oN6VtcP8!d(Gw5|kn$Xl%!&|lvJ zO?`tkbRqqd;hpw~vb1@FGsN=0*LtETWHGJQdk5i-4_Y$_Vbw>JANc{5>iLO;JXcv< zhQwK0Z$FtuefVlD*pPb_8u3jO0|7*a+inRiEJFH?UQUfYVZkl(1vCSw7G;rW(cdM|29Oo(5I#r1E!%z6sf zfArRSrsv7^7Qw=~k7+`50{7L)-zeZKnH7By=&v^;m4zkz<$-5Ge)?E`^gB2z`ibtt zD^@fzD0s5SpdtF@*9^L)U)-$%baP0-|Lb{JCcP1g_%V}yFRc$oWESrJE3;np-|lXh zMIT2+&tljKKUWXd#RwO+>xSqps8;`|ev$60A$k)ViZ2`{C{5Qh zG(Vf?(I-=;{o{O=+w#c4wk|I+L6|b$XD12cXJZ7W{{o#>Uhja) zzb>!8vf;Y@!x5icT&*NVw|o0ZpJWfSPjm4`Rm2>^d^G2f@Xz(C`Uli}UaU^rUMiob z#A1&dTHUO`=Sx20`P}bxEK_b*4gGGqHSh2BX;kyVAI#xaPtragd~Q;o*8AvFf&WuW zZ!GqSc()OWS59JlWc=h4M;%(euAY_q)S=q*{&hr$LNo&0?z;Lu50`s*3@RlnM@6CC zIBPOi7mK5)SZsZru9KJQ>-~g7e7t;f@~#bq@I^zt{WoFX#(GDXy3$yGXp3|5{Y~@< zU~4u-3CX-`Q+)-z^f7~PMIPHs$EMZ2w3!}CW8r0KSbW%A$jY|RvCEROUM+>}KubMO zx=e4SH=qux7wYTpK}{6e39ZFwd(>L@v_ZRKJy^`pPRP2q({GTrkag;S`G@UtN6{4{ zI_hVE#B|axqB>!nbuC@Fc31r|`D0^qUz*`fy5Z;5$hyD1Z*~5$yG|Rz@jajoS(|FU z;e2>6QP{;^`jzy;PR9Mq#^pYG?Q|R6`Ux9v`{`@bZ5$gwHdX`=)YDBw4>D)MtscIA zQ)5LV)(l4Xpl-X0`-)ZQQ!n331fp_fxL2I7CqF+_ABAQ%`cdC(+wSDXFntMF+@pMp zg+Io9dYGjf#_(vkWkv^z3hcY9zK92@Q%!M#T7-KZ|& zOfecibf(z<-O=Ma7qRIo14{dKd=?z1Ss>o}^!=%&jJi%p*)PUl4aP5z2LI3M!w!HjZEV zE?{z#zmNLMsy;XJIn^5b#sCqv zy)04+Lqru;82_8`fwK#=1o-Uum>`QDSdTuWr9CqJPk(eTM|()x0@MG9>hK@jPasUh z-XdH7(&sOy>A7)9GR;)rITG~M^ltZ9g5Jf3-zOHGt_Ldw!;{UY>x=XLjZ#j**9v53 zL9>9K1C0Q^3|bHrue0JSxWi`X8F1C$rDwuVV|X)@44J7PB&SuFrE4ByjdAeU>)zRr zqjRFjI3ZD|yCB|%>*r_~EZQ6>hU9)w=(p+d#>&ho%ej6K7ndEaG_96G|4t1HTfkX6WwnY>P1E7 z{EPMalzGHbk$JvJl8Id7H$iN8Ao6vo{*hexX_-EPD*EGcJ>26DzIeG_s2RRvj;H5B z_*hvS19=GaNASOc4hKC7IvVsi=r~Y(K^(sZ^fc&JP<#~}e*hF;`NkgwJqHSJvp?MV zR$$pg)uygQWs>=NlbjaB{d}dK&Ag$b8;_;vpI6rViCw+77t+6golXfHagEeMG|5ab4> zR)>O)0j0Air-O#OSFhHaJJAYf5?axPhY?xMtC^&uAntKVdZY(Acz68Z93HAyU59`=#Q2N&DEoe08JJ2eiLvZg>6Z8xCW1u*}EdD;I zC+I8C44@xDGlJ6BTnM{KVRlEdEJ)BK$Of7NG&?BW?goKIg9d}P0SyHm1{ww$51I#b z9B4JrUqBIkIvzjbXZb zkBC`0(AS{lLFsd?ilF#WDT@ZBuc@e|zMz#sGl7!fyr5(_KPW=q#+L`J4O$Vj9%vm< zgb0oA1=t+Gz`(Q;x_EmpU~!L z?k;^WSaILy`vT8BtL`@UtQ$_@dL6q*UkLQ&9t_$sZrrKiNfGYID(uDfgBCL10=T*8 z9ht$?J$fJQNTT_ZW4PQU@28sucfbKXny%5&$Ml@M-$9Ehj+=|ze8DYTgxeo7cTupp zo_{*5cYkTP~+WSJ^c_AB>19E52r_7#I+gzY;#Gc2ffcPVRr}i@@4&3==8aw zM~GV9$mZ9IzrQM4RQH<2J?pOP;%Or80>4m+!u^H*)EiMrCv*E@eZbyDc=Ezcv)A`W z_=(|h8x&>CxuwU5GNu>vi{x2ur!@_=fhVpf{)v|5%48r0?HEhTJYMOM{LP*JX>r$G zz3exO;rFe#5$+rJb@MR*?jEM1jQEG<9aOzXv~hNyeI#L@SoDkQvEGzi>=R?QP6#JI zu~bp)_uJg?^W?KL7|TUvy`Sk}leWv+YH=@@Hjio0iGa;JIQXmu+ekuMT)VDS}11^yl&2(`I<2Wwa>2`TXD&C-!_cv zVuIgZXO1zC^(GA_`Zk1DTJQHajqlxa8*eO5Ez9@P%S&NDVe}Q$|sN(CkJ#vi;?t zUnWv_qXxKFfKsmC&4E)<($ph-4=jw8Q0`V**!`(AxgIY4rHnzhop=ajwlS)lLAPT&%SrxL zv=Po18| zQL(ISXZ@zH4tf! ziat>n8nbH(jZZb@;1n9+wZ4s9YJnJ@;%SbnwsC`WF_pvdFyotHa_!mg{6o?#)2cUZ zl2ORbV~o{excZ&*jdahh?_bP=FRO2K1@6;;yvhp+;*Mz`r&yn+usy$_F_DTM)t;7O zdVZV1-Mod5eZ&Vfvg?{nRDeu*$=P`2eTOEw2O}1{%4j9{V=>&$lJvar`EXof~n6cmsi#>mfX9v;Sa1R&R#; zBl{Zk3SwGcL%gc^vcDDiI%Jkr z-R(c0R~|?`CCUeRInY=_*-Py}@mmI^SIvY9@fth*`xBnL(?6%X%n+0gL>VSVQaF*P zy!tTXSGv);Jdv9Okfbq^_6GG><~|i~n9q)X$d8BmL8Fa< znA3c;v4)0%?_~^=Mj^gg`LMA@OR^?+2_MEn3mLv#!D7>8{I_u=J#jX~$mMQ10l()* zrpS93fO#evv;oERxN4ahlQH1Yl;EjoLo%;KID z*`#Br#UFm#Djq$UQ^V%lqA&7g*DlFLlsml=9pt|7aQ=%@z zL8&eyL8&gIK&dWcLHmJ@104j4pErp|CX{a!_=%ufNbU|=W7ML$^jItEGKI)zzSbls z1#v%Ji@JzDrN?1C@IU<};LeijG6R(SG82^Qk_bw5nGH&H`3;onf`AR%eNU5#Vm;0Zfr=$w(X#G7z;S0k^JCJ zW0{!acD}EJA3aH%w9D8`Yg2{Y#&udD=-DaJULG!Swaj zG?Yr&4jb+)G?wvS`bl`#FfG8c>pbpvtW9IM*AY>8K|$Pgju@HAsqRikjg2(5Q!WCo zop=fV{=|b!5-o^(_DQ2Rxy8NbvVrK4)6U?>X#aNS+_Tc1>*r>ObT|CNnEd}^vdtxP zb4Ml%(Mo4_j##0}T|*!$>IGr!>~*6mtxz@pLd~x6t{}F+2>#PwMoyxuP3lfep=&bg zcubfrI0xnryQ`5{5bzy6n@b}Ke|Rb% zPj7wkoL(G77!68K5i5bxqt7a!v>4R@jR&m>N(&;%e*&!rIvcb$=w8q|p!B>p2J{ms zenlHkk#*{U;vr&I))0wY5KxBPpbbEafi~p(9IoqV&s?YLE8bta=P9nEVlNO?7ruhS zV?oia%XQax!m+6_0T1{^muoJ8b5#O4?q%>T%_+sfQ@&)-_e13d?~>?YHvP4P z^NGj9M)54UEodnC4xqh3JAw`c?E<<1v?u5p(B7c8K;wAsaMuo${%5#wz(3)x*1|cd z$8e&;uskm8%LJy2Z}OM}pR13`w+is*;}Zcn-2?Nv+L9-( zSMgpQB+x7! zm@g%yU{+#Nx+JYR`_d(8c`p4&^7KCv1P`HuY`7~9PRPOY#JRfLsx{!Jb7aJsBXO=W z9xwRwI5epTuh9oCUe=J`$O))&EBte-4|LA(&jfsK%oB1!HlQzby78pG(Amt5et^a| z~t_G60WLJg`6T=`Hx$VBl{HGcko9bwui0xuuwqb^WvY8gMb&~a|Z!%wBu1> zkYyYUo9}q+VCWR#t3hnnI`9hNfQm)opGrfZvx~PH0=zQc4q{8_#A`Qn~*#0&+V zkM|e~0B;cUKy-g7OqS+BKSJdW9|~e?)s=fw4PN~S=qisK1{v$dCk=BowdL>5vs3N2 z4##;sxrU1-lpBr=r+V_U5-8)bho?e@ntVS3&_BKT&HT_gI0E)6^DmHjOyEsN0?OK# zKP^DDm;!SzM#9`p?imlDT|d6CAb@f4(AmNFkxcE+vyDO>uJq^YBY_PVOJ@R&f|3_M zJqkuQ@I0fDuihZOyAW{UlD(sW7vMJtST~r*k((Ngfzc42Fa|S>4>8B{F^{w%`PUG0 zreqxJineJ(`3UM^lvT!KI8PdjV(N2a9IP$)kxwZCXv{c3__UT}?S}K{qL7sw?%pW(smm;ytDy*Vjq>xd5i1Qi(k1XUN!O z{^QT+hdq<|XBt(neg@W^M@|LyX$ns&3)zaPusZ2yZj=KvAdv>kG+1rM%T0sR%T6<$ z?y{vh{ikWB)Avt<(^pO7f#sq1$8!8rF#&qfyk!EcuTJ163AmVm68m%C=~Uu$9$x{n zNz);F&ks#^6%Whsi)lX#mK}5DDIg_`rIlEV=bVAdXgB`T4D`VievimiUf~yz4}3O} zK>jz8V!ZZDkXXKaCRWQ){05Qj+$&E9PNPMI_FLd*c_H?roXw-Z@h8 z&AmH$^Z8hnuPx+xYEdob!`MGOXaOpagAZK*D+3pqRuCvsc2a_re6y0oFDyVOo#oLB zq45nm#jfl&V>y4e7#WuH z>Pz6WR(#kJX#d795y200mO{(EicemOJoETHun6y8VHwCvKAXsD{x^{ly!LXCZhSeB z5{WDDZy;|@WCPzqBn$Um39^QFAyR=KAhMKaUj>ql4+IJCzR7I+ob(AWLrO?)4%tw`0B+cZ>|46cP-?gy*1MjxhRoFgpt2ic#e5u6nRB2r4d4d)jIS6u$!X9oKM# z3Id9YxhGWL#mt-amGzs=MYe4Sz4g+>@ad!1{&vd7Lxi3k;c#8ge8i@ z;zSUHT(@B4PxJJTyx=RzFyyW-(CwFkBQYRA;3W}L$9~&`-KD_e6rL(00*`0Ei&F>W zp;6)Bv))7e3_3Kb_B}-Azh@pA)dlGZ0K}nDzY%kvP9O+Tm)*zNMEA{uUd%(Iwn4J^ zfq7`ug$FoH0Flbm4~<%m(B+38ibJE6t4QyEBn~n#{87_ek8sk}BlBpePe^}4Kyz_4 zR6)cqFa6j&RjCQmtq|OtqS6R=C|w|_@x(kDYUmTx?1>ef4oRP<=Fw0~5cXUg4YlX0qoKwl7B(%X9?k6{(^D;%KPD zsUGZd>NjuR27eLZ(nTZGzj18D-)18UBVFomYc(rF67otM51=+g`1F>q;A?p_R44G? zzy4N*Vfa+#x7TJBHXuFijd?WGy0j?kbX<|L2~pM;zcr7Bx`1fw)Fc$eeY zT^zPVk7qNymkkz2LxsLamwhm!saO8s!P+ARJ2_h%4b>BZ!!ic@JA5G%_{jvZTH8PD zPF#BS1t*N9MQEq_>%**30exw~@{qBbiy$F-O_(g}VPm;$W@tZ^s!|UO!G;5NTH0)^ z4PtpvSm+sc34BJb`F2EbcZk@z_LB}15P<|Ka{C>p47nVj$fAUwvnvR+sp9Sj#ww^1 zp&(;QWffr`H52Kfp)&G}pEwO69d!gEq=Tdqkq{NDii)k(5fI+s(Q&X4&VKim z#;BF|@F`P@ACK>YQvChR_=O57Wb)@H`*?n_qVaq8F)}%6x=<7js2Pd zQ5|z)9Q&0{|Fnql!r$TfXS-(@~ci>bf-KNs|olF`FH|hh4Uf2WwAG2vi-PGdsAY))fn zkX=k;=#up+jmZzjr?f1T9t4(2W5_`3G=_9Wr7?xU%#(~#9n9&{eC`kojDRxIP!R|# zr!n+ysJ~!M{yxdS^KLR1038VZ~#>T?R@r0pp;mC4k$GS9h?05uxoLb)OAiqE- zWBc$O-<8T~T`;o0XP~YiTUBKHo=5!%{VBE0Iw_?QO)se#QsbY2bNfJ(x zLNy4&!)Z(oF!$4#++b{VWuwSdVUkg5gNd!ncMtOnx6Q39X0=iavL|)9=WrM=5hKqZ z=#FOeim|b)vAoT2jKSXZ5MR3inlw_LR6r5v#qnvSpuR>jN=-0#8}iR&t3V?g-*dz> z%of*(*B$}EP6%kZqDOhjjSz0XvAK-hYbZ76-v7 zyTD9q&Z9@dWfz;vx>8@hYi?uZTkr$`Y72y=zuppoU2!g>F&bVk{sSU~x8^ATz3Q|< zsOFAlSLEfvUjj3$^oHqHC)phOCROh&nY>^Mr!myf=3rx*+T_=eG*xs@?Uj_k+VjK2sY~& zj4RSmX_L?jLv5_{P@W2-Y9FNg46~>%8D?WAA@HDBy_dkO9$`Umj6lG2gn}1=wSDmE z>h*Ye;qn?KYa|YV%Z(WDWk*}e?1|n?9BszjUWjzlu@lNzz9q9W$-?H zWZUv*sWTM`p_BMCVxv!!(k@7lREe90D8SQAw^yESF;X32;qT0lMbLT`@QXy3qKK$p zZ0y2JiPEa6%(9@tvux~eA_UlV+uu=wwqsPaFNxT5%$CSWN)R#|$obib);~vDtPhLx zzzDP@CdG?6Hdbq%K!feWkq}4^=*1(x+0*$_k5=5A3nWTTt+D`C7s^ZLyoHE#4~8~) zF5D=vtq{ywEM0O031M|6kTZ*Ito>4n%t9g^nYR=}cDXDMODJm(CLQgv+{Qkykb03T zB|_~hu@a%DS4o5+I6Ud#H7?EsTa8m()|g#zdW}?}fS7-*v9WgRWKq-wGr@?W$dyU! za45nCiBcDg0F#dXx&hmQjSx^5bfyG~bCT6w+~YJhO7zw$YO~ZJdCAR)alb{{qYn50 zhP1?4Git4^n1yZuV@r#KD5?V#FCb8SsU1==0~EV~5sKm{#o;>;i+rcq1ek;!eh)IQwK-Or!=4Ti;KiXk*=|UL=4S32xGMfB zk^M-J4&MLb9Nj-Li*A|DZI5v9!Wa#v&iHKRM2akmocj+LfyM#NavSU39f^{2cY#Sq zFWs@R>h~ZZ=MJU>xsa@myoVk1eTigzU_r7!z~=!ErA2b?CNM%T51i|Ggu@lg@bJO* zR!9h>DlE3e=Q_)tNWB2)T?Qji4d|06*p)n$?hkv0knqpUWyd_xp*$piJvaS=$735W zBPe`rsO5fvOKGZ*hnS(_NxBMO{=9i9iz4qw{4I+jw7}msHu#nF@oFSQB?#H{3Mb0E zmPpha6T#yne2()5M{~V3y}#|PRH*@A=Ubdr@Lm>0-Y*757>orP`yRpkKS-3k{|A_K z^w|gObUr~q-tSEb@;+G|_zCA@e3nQmCDM?0pKYw-7ip2a-v^99HF*CZ;>e$1BG7KI z{U0O*5(3DOWc(bA!jbnv`lB6jed+x00uEEfbb6G-&Tcr(u)X5M zLT^P{>;a4U@MEV$#FH0_N0Fei%t**5@%yK$I-(2H9qd3PL^Ws-Ou;Xr&LXP3I24Wc z9ya_mD!&W$8iT;m#laN!g2{lu5F4maTMD)A_~DcfqRR_|m5>k!O^YTz2vhHCG5FFK z(b*Au9!Ky5tD*RTRZs?5$NET!>w07S-0Cf2%?oRJGD>S5V68$%#Ck{IdC{f|NQg5! zu4F01_2!XDxFBp~Ir+rSVWO0?mWEP0Vd)NujcD?;t^l`S9d^D1vl{$&RA& z{uPW+{0znsj@$1D+4V&t>?|5*j4wjhe~)zYJZLSQ{WS#%;hmXz5ZD^g?1c|HAt4OW zLfs8v?QJrwz1Tw)10&EWKuZ^}v%>`~m3Rk6pz%OIkHZ0ZZK)bc>WIl z4r1JkiUbsvYIGIKj_>A@5Z_)@<_;3VAYFwXAkh6l#I+ZXsi@5>!3cCL&~^CEuCNSp zFRI!e%qTh-v`Yy)yH`?{m8q1)VorREw;qx1(=DceNpHaY(stIdtOey@2sMZNTzuCO zK=JFzm(`IFiZnv&mPe5B3bF~0kPrxswx<>BEH>I=ax@q*;wIp$m|F;3pI#L|1g;lI zrpk!pUB!Yd1S8HhU4}1YZdbJ+8LCMn5Z}x+tZpJkA-HOMbp(^I&ZAdg5FA5#Sq%xc z2Y4A@-ju1y69}w}uWuUHvS?1Mg+m}}@e~42Ali~I zKFp~XYl0n-E?wWE*}XoZ|JUbdN%IcUcN$tW0~*;`l}0>h6~HD)M>Mf$Hfw^R)P%TD?2j~V_zWUkPt|JJdvr}&dv^WlE`Z$aPn4&0YK@DLn*q; zO3>9}9~hy=F#m6K$9mgSjudYM-4}=_Mv8wgJImQyu0XL!2n3e`)(l_9G(zBgv1Vwn z*bj_A>9X}>UpqU}Pr7Ro&=37^I6;4&vKAg$*dM{}2U@_70}*U~5RY01aM2(;n>EA& z9>G_ou|s)0fxU*J8N)2#zF|02U^qWZVCUhmf}s4um0OXZ+L({!_TbCXt?_aZc!=*p z-+&SK7UfXcuMm_SZCX`BP}!bfL{oy`x@n_vrpR~;dK-*DeSz91;9!i&5+%o010zt} zM6kA#vE)v*pk=`bbSBUyQ|;^tLi3BsM!Go=nqQz(fR>()W$hOW`VI^xoH&I!!%Uoq zktq9R6cR#>_FX?E;$uJwcIraLH;2TwZWq$ z7WSJ|EC9v)zu^#P@pg7!AA=$Xf-f|nuqPxT7VN= z7Fyt0U<524(Eqj&-MYvEZv`W4Yp}g*k)0h}Y@!AYv^R_GY{U}t5QDi(>@04XRILbb zF)_61zP${7SRoO5?yIhpWk%7H|1vA>EPS;EZVE<}`3PlBMp&$VI0`^`ijn+G}FhXxB^!{0oQxlRTN_Su9!3dOm_#ny7yf;CB1BJ=`(UgXhTm&}Rgp)ru zOI7e}BN&0M1h;83uBTfq=oBylrMu6cw_*WuThJC@1WMP|mTo(Hz1@O_?~o{sridMO z#&=rKV_<}CL!ifZVs+SUL1V$B*Q(xbJNvN5g62<_SNa0USTFZlkS}1;>-%*tPOR8( zK~I4ZXn&M>dOr?qIA}rpgGsN^fP;2+?2tt1;`|AWKyiD3XPtKT=!gZ)dQ_rkf#y1j zJ=Jjw8hk>cM}dZ)u(Ri}=+BX_y@K9E?!K{TF+6-OeuGl&Wz+^;>o} zX-Q|>!b70-oOu{-G7d$LYs_zM_e_#{yKeLFkz&|=u*k)8E<#N+nB z@UKX3eQYu8^F&_3pc(W8hXp;e*u4fu*u_%;cI%m)ElIW5y_jle)n4*8$*|k=B~CJW zWwCn;j8Kh-YU(R25^pVr7lRRK2cRq7;>45>7Q^K~;M|`NJa#V(Uqt%wCyU`+pQS3j zD~bASXKlV%49@@~3MGdI)|XU&rqF*6%C8h?Q%* z-NDu(LYY{6$iFwih#lHpyj&}*T9BS#M0qq<`>GE1JA&?|>%9k)j{c*eaD1qmj*bB% z(5ld#h%LlPmj(R-hEVg|Y&!xgl*DNmq%1~oS1$*qQcuwwx{=^%z(S;b17%4xlPZG|_GkyxAke`YWVN8jx?46eHQFs)A4oRVN~{1h=bh@ML{?< zNW2bhA0}0)$3}%Y*u`*%IEKkyC_*B%W;cv*u%~&XPs_n*^}G_D33PN`2g{V-ME%ZU zj}nJC6wy&g;4c?1R0MDDaDf?E*ulI@@is?sXg0mRcwgFKzKx-q`;amY{zE_bwl0|d zWq6Mxc=>W5P1pd!EM@s_680!-=2Xi`2~QJ5tE~JGk%t|PBoK0rdnigE?YqLs}AN_ZoKd5 zjf5C4ag4 z$*g*Gb}(0GS)qN<%?QE8E2*3=sFOYOW~`mVXLLm`YFDz<5oys8yVb{+P<6FF4=QJoZa5cXlWxh!BO$y& z*N@rw`QYsN5;=~9>3twK<~vxIMG~2Vgh1%_Z|x#1%S$mP=;>ZxBn0vqzWs42*2v{( zIz8Q+g#=y{h%3?j<#5AF31nYos+c1_Y?XrzStFnj8>o1swr~xKSO+0J*vo|(*$Rv( zhOSM+*E!hM^`?8olZl651WLCYPuDwGK$1jhajy=>L{a%sNe;GZlR$&**O3tSKQ}iy z*!(S0hnAJIV1!NzEPmMHU{|+E9hcigxR`q0Zg_dSMe#itp?Cv|!8;u6pPf>%&@MTR zitKW*2fHmgfqNuUX%8l3vdkZ`S6ZUEkZ&*gd7qqmkB|^$)BuvY&%sI^kUHIv5D47^ z^*rEUe;x!vgW2bhgJnAekJ4Zc1M|;evj$?FE%dvCHT~V3KU~~Nwu7YZQK=k%)WN2J z5koo=Oo`*BvRHz<9LLV!IFJ1kBkeb&H=jf$=u^u3Cmrl77@C!)Rs9qic-pk8M4Z9! zKVy#g@<{9FEJn+obFdEQc=Sye?S=H{^U~;+^A2_zjF{?=(9A0k?7Jvy`u9Z)G%#X5 zXqO!9>}88l+ZD{{D`ttsk@mPILApd2y@rM98jrt)5(gq}yCH{oF(iaj`(yl+zu{mT zZ_1HLx4UP+5NbXXxOfu_$Su>VN^q_esZ1A|uoMT|f7^n-0wYY*rQySETvqSO8qp^> zd+$2f>$}|dHfp5ZbFe%QEUL}H2vu6=+dOcv)Q1+;kVg*Iqv3X|ET@6N{H1?97IoSK>Kxu^Kdx3HB0u!ox7V%wd zG?(RDS7TEnk|K=}t&De`RVZQ(j>Kdc_m&qN0nDuJFdxP~+Y>*iT?YKhu?V zCIk)NNp$=>2U`e6jL6kszW*Q%4*P&b@PoPT%|JTSCrj;XfT7x(PuJ>xa0WqkGqi& z1&T*PhYSZPn1!mTrczb^03)hOtI&O{k^6P2_eys%r{VnORv*L3&bTbP z9-dN{c5?xqPWH&l)K#*2J6Qp5#Fj>7N+A8Wk3}uiSGIH?9VlNCTV~bY(vZ^rPS(qx zr#yo0Xru=QNTVwQoNQ+RkNOM1A*7pTvKajdjA+M7)MZ{KC#x1{qAqgIAbel87J|Yn z>EZ`wW>(qC-?KW|6)`JJp{e!h^@ zYa;CtWl=90p`5Cp!kgqVsV3pJ0}imAZspF6(4UIUKZi0ch58PPV?h1x+dM zWIh$(HbQe(z-X^%K{H09+-N5sbrEP&Faeb@S+MU`s#kWh*vdTU1zOx3>2_7+ETUNx zU)9NefK1f)btg-LK#T=(ZQBXS@*0*bhiW+4X%gH;xmUpS|K5Vm_}S!<{8e4Rez=*xn zzQ#`0rm015MpGx-1%YS}-BcZhU{7<4?h7!YT)Jp|ZSG{hwKP#N`cAcUvbQaH)GM@> z{Q&2-k|1^eomNif*P6!@7}na!er*GgT6&_5lU)WQN*xBfw;}kUou$-iV8jEV1?`;d zU3+PC42g;5#vW7jRanc{(!^t-GFjuu*NDt~|QC$TF_da41TdX(M!afqD?#bHMv}?Zn&)3(9 zuMkaGY^t>WPFA?TtXL3=E(<}6fyhBi!_NcZoPp-jumtJugC#I;FviPZu{3N(a?nsy zuC5yDWLv?cJ8&-qWrxWEi=sX~hv6~+fyhD6zg9!=e7Lk5Gy?N@1W$PfCze3EQ@k`h zJKo8bf)N80)m#sL#25)Cjd8NwV6bn@X#o5k{QU8<(A6mP?06>|I>E_b=23#x*%O>N z4%$Qwa_+}TP8Nn37qkEt`U%}SS%M`2=AD9(IYqRz8peTlhyl0E(a~Z#LSW?6*_7b#t#JIKKB5aq1>Xo zmSgpXU{Ox&U*CYa|EnyPT9bK>lU1H$UaM*&o${Lm$*})iC#yM^FZ_h2HbDCBJPA^r zGS0`Sn{WD|71H4gWuauY=|Zds5KzCFFUNm|#JN~zA>$<%V}*fW<3UWN!C)ROktkWu zy41;==$3p5})NV3#~$xmOEKD2u9t5f&O6LuaIaM(0nW5rIqMJ`lzHCm}aXj z=;YOyt z{h*18eOFyDV&SAsdE0|d_VSQK>B(*G!xpsIVJAEEy9Ip(4}?kqx{fRV4G8FdmHmlTh zL&4m*Y0>k(CH3fDE$1!FfD{XQ4~(!%J^wnz$;RHXpxeL*v^LP+?>L$NJrfmApsL<; zvVQl>Yvu%`KiwA<3Q-<7*>?}*=Aa&!XAi;9W5`^Ou&;b1XCyshD+)o2$3W@Mg7!p1 z9%D^`06$|4R(}Sw?5PDk_|(ZxLC`h_ntd6}!{-*%`2thvg|tpr)GQEOO||5Bmx@j2 zOSzi3UOL&dza<)sve*3$r$Qjsi$~DE0>Qr5(jW9&g1^BCf1CuG?+x}7Z?PN4$8Tz$ zcTQH}9r}Q_fHlAbd_Y#(eOLd0-O-0c1GBOZl8ruD>`ee8>>Y)@y`P+H!at@xWye3b zy}>V}=>l{W=|x|qx$|G0?Dbdk67mJb@YYOWGrtn{2;=nizQ%!8|N`Miy z4#FnCx`C`-(r7e{&h}E+6)&870i$n`uHY+;#`!927#QJRy1^R{K|6no;hA8>qc?2- zm-?gB%oe*PGAnFgX1>o0c4s0z3^f;(U7uB9JHZIMDX@D8f~DClb}xYu748qi53(z) zd9cOslwgIO4CYDRF#H(lYoQX{jn;UEDeP!iq7SfCBt!F3Z!G)*1*Q&EL&hCsN4){8w5gcX+-=*rooI6PRKEQF}zk@hYn z)d`F)rLc|=;0JzU^VA#s-7=O88OtiHOj&8a2j+2A2$ITM?B6M`Ftq{?@`ruD3JNP2 zZBcI>t+25Wr1#iV2zphPIj8{(D=X|61h?N|0GP1x#oS3);Ab z!bUw#ml2?jVSfzSADFW$!^-x+pz7TSC9@5L|p=A7ESBI$$;D4#lQ-RqJ*Eh$Y z5sL0OUteMG8kj)dh9+SC3b15Dg+(;t2^nF!StErlXvAalAbkYs6^(fcwvk8O%#@;si>z~tEs|0(!|2Rt|$;Jp_;AEIG3G!64|P z@JcsPnItfW`pL5CV*3^hm2E!$Rr)LJ?*Wj|)i!h>*0h0`wy&UA1I+tD(rh#o^9@#5 zx4~GF>9%4bnC(L?W*>tQO&W|UeH^N=zQd)}rNb4L3`R@|+N&OgVBbhn*C5M(k5pKZ zcpje(-4q+Iu%Iy(!}Y-k!|^cOZVY@iPT`|61%^1sD=cz656TX$Qb-q@XffGoB788B z#}Rl4>A90JDd;+VdNS5g{2Gk6OjK}oC6CPs z<9#{S>tE4!y3%^i!8$XCFC?HO(h+mbwz}vBzu8SM^=(f3F66Q<)(H8drG4k`F z^YayUWPx-OMV$MvKw)PVA~qE4zFVlUY)hnFS}W@;K`%leTC)H*3j2VNEp&Mg-lVYNTTo4W`rsM>(7i=r1-2?YcoqB+y;WhpZuppf zen~sQZf;z>wsYSQuMn?cJ8<>cO)mxTNP<^-7ns?=4|3RBhz{;WbStb*3-&3j;vrfk za;n9UE$pyd6sY~pz^p6a6{e0jtgt0u+Wv+j*MTX0MAnu9fObEEIef(2Hz-GOX*`bl z&|r)|uCSlLqz}fK5bQo_886pPD(oHvVlX}jqnwfBg$85j8BBpQ=3p#^bd7Ts)lTOW z76(E4U>piTne&z$P0wSO0)ZHeJ;0=1kSI0I`=Y{%UX=QDr7aJ^vP)*WT$JPTC53&4 zAbo%+mld}Ds%$ysNV%#o=QVSH_*}y}f5W1F^@hT}K#(>-v_BO#`<5lc@mmUe0f87G zAHbBpW3k=+4o3PNbAZf2dj35L(u3%;_fYVC?u+Y~n)|-ONtQZGVX?n0gcG z6u6#|q2*#57*OG|I8L9CXJyUoFW+|2+YRJJbQkxaP?efm6gb% zqT>T|81GS!IayRTBRh}F4{rwKP!X*X0m$&Yz6Y+e^@CKFjIfcw>~xyHQyMy!c?{ref1NDjQx$6(d=h0Om-Hsr4a7Wl8m=)>vp2X`r%g_$fM7(zl7qiZ@Z| z)km;W5loe4JiZXMteMItG>5Z7;D7Upu!<+b{47BGo0g`J{pdzS`9Z}4U~^Ce@LWZ` z0)0`)>eedj*4~t6HrGA6;fd{_vbfIFb0KQwE-I_rQ@Wf!t6JHU?~cO6In+~S_u|a% zbvW^%Rv(q^9LRkOQ`ZktS+Sue#(*h5s!WMDu{QA-7C2Och6P^qvif6HmT!`Yjh%$P zo?>F#ferjwWsx%yi=ZA8XQ=G+3{^yvFlNK&zQ3q!!tgB2=kzEW0_ zzUJ(;Qf2d3o8Z~iDyzB%^}w}TX}U&bwb${p#ZbW!>s0pFIt+|cxT3rQ^KgSXIb2QA z8CjB4)+b5j`*Dd=#(^oliN_U(TK7#VYq421H_*FL*pST_L)%P`bl#@2YHnG7`rHVy zO4zv_h`a|)`%aa;+^O=HJ86FmFv~7He%WJ!KFOFa$r9WLFl?{N?(a9j%m-BFJSaix zqJjricKEPa=DWixyZF1xH;&8_toR*KS>9tN(Bc?secY^!>obPxfa7S>N!iHu5G*-~ z(Q{g^GF@P|+i8{kah9i+M0LBIL+*2!8+cDkHzYrTAM^*0E(L7WA8^+n(g~#KJg>5z z7kN}^fD10FOur<-HUJ|oVKQAYHFsQ5*}E$iFymE~4Y+PDS^;S~tPa#RCNcmYAl6n>Tp?wX>qktq_)18@=q8*lTVGMG7cZ>!99kJq5| zwtFi3{h>Lk-ao`lc!U)PZ}ybRk5pzn=KGLIE%zAdr*h#qiporRs3*`pG@H6Cl#L|o1<7f z5m%~yR`E98^xN})u+)CR`WArM4U^x0QQ7xQUWdkTPZwPt;AVVISx+@V7v1aptZM8SPF<)}3M=9#U1OzjhI1va zT(lTBF*J4tCybDyhnL2(d1>M%TL}Zx$cIN&05HKvV+DLQ-iMadhQ1o>f;Zr#F~?tH zTl@jgl_U?$B}4E4Z^20`Fr&uyWYo;L;S2CS1aC5%U__wCP6nEw>k*pw8iE^H%}T1? z*)&!=o7s35sdj^4Xby?4&7rZ!U?`l3s^x@Ut~9+M=mlxqF9PG6)WDAj;ccQ(ow*?z zTajDiZHHzt>zXlCW97qn5`lZeHFhK%R&YO~XGL|cL-2-wjm832Esw^o=7T?JGn@rj z(flZ-0FSK%#Tf-OmbH)s>F~V%g*3LQ5MM~(S)>OSHaparSXg5h_=`%g_&1W>ib4sc z8R1yECl=M%`jR}lGIk{IOCeu54W{s`AMt^%L7y0puAs5x3OM}*b{kei_KKRhywjEJ z00gZn@f6ZesH8Do)zr@{;w|a4p%`9GV}J2NRlIWByVumr`}Uf!`*Te`tO_;-muhOv zRSPbUhXclBy%>`#7%6l&Gg%-AQZp)jtl#tOwCL?tTHHU@*Fp2iC!YLQCscP4-l z`=cl@$zbSfWF6-+u;=yAPke7xH2+c~jSXyuqE6texL{rB@f1><6{oRf zeKFza*Cq7ndPF~s7wqF1rdI5yu^+&QuzG!n>CfY9K;_5&7|{dFZgSDgKQusNuLr?K zCw!(8K3LLIvXGxy3h!V+H*Ys-Ytcoi@W1d_@ zslj8u_p0S?P*ho=+M+7)>5+k@B+bLuzg4sHXKNLeAFA&)cH~RcvIL&hWMZmcc6$F5 z|FwJF-mzWV_aD%=W6cgi9+EC^*dq#1%?^WEAo7QPlXvVH*Sl}q9)x575|obA>Ntdi zSs>hw2QLoRT||Mb-nVVfj#WGMu=Q`tgI!s&+lnI8yemr<_ufiM5hw4lAWI}4{Y4FM z&smVAl?M;;(z4A8(emcZ0XsQi9Cqro9o(R6&jCH!x9!)zLI1uT+xG0|4qB9@zDM?K z$i&P{qOdBxJ9KQ{s8{!1y$AJj|1%{^Sr7Lmn^pv79a`Zm{|{x~0Ukxwy+0dBvb#xU zXF~`HEdfFxp(DNbCPG3-dhbm@P=PFhQUX#$E-1aI2vRI80tzTnMX&=(QBY7iSWprE z?|aYekPrO6=l9=-@V;~Iy=Trnx6aJHGt9|Y6c)DDKH9uhqaMv$wQJm_N&SY6)sWoo znyTX5#6-0-x4X0I-6tkK_*tKrhA#DVgu9^X6yYwadbN(g>%RNN6jm{j?lS5^ggaH$ zh;$cH2IT+Q+m|vuZ`){kkf#Y+FCnRAcEFLu`*2 z)J&1f7{d2&f@O!Lm|JK$w}5}wN#(xz#Hij|xQSR7Cv61A~cOhQ(y9Vgb;H`%xRYuyfP#v@>y2H%*hc+D(}^p$*N~lcW!SnL>;T+s)*f*<<&=5V+Ly- z$#wv=2TNaz>FNpd<8wrZ!{gP8+cDu`bt|aPwwg(5-|d)2{E))Dt593&&zPjJDizcR z^%D{*Ccuym=+znxdZJ&SF^!(+HLmU0C;G!FXk2dHTI3C?HEQVAf)}T%8|~e_!hR{Q zTz|#%ERu{^cgthBnSRe|jT&v*W$5bOtY5Fb{hsKMfxRey#gq=KRzbb+S4_9C$O`Jp zUoriXlaTDsoXPt2Z#ZJ?@G<@RJ~pE7*rEMY=HD@;!on)3dvhZSsKtNBR1RxYLG?Nk zS3q6*J7#29g$k;|@rY!#>tJGXm%_0;hvZ!l^H{~qQRPx&u-?iSz9?L5lMp-1aTz}X2V_n(s^VyXfBpq$*e)|rdYHRsV9mk!%wdmCRp{J)T z7+mnVhS=ev<^P=BT5n_f-sjHl*!x}m)S*YQ!_B2u^l-&Yv7O^f{@ zqd%HF)=k!38WEqr87?p_*TBQ$F4gV-d7q*;zj*WI!u$WhuoSM&B7H?Xkw^F?>$`;F zn?FxH^=!iMFQO+M!Ua8UnOLr8228+9KnH#uU3|gX0e^iy2Ad@#)UG^<@nJJC`GkAI zK8;YXsiBdzGKz$1tD9aSMMGm9DuG3qShh4qV3EBXP~#Hj22Q3yZAFx}zx&; z{Pu`BU%C6Ad}`Tc?5Rcbv0Srmdvkpgbt0u%r}WM7)1O8=>u0L(_k_o1ZPVf3+}_)v zVEV{!7mx1LcE;^H%h49JymzlR55#=`POe^mKCyqw)#Y>X-DV&4)mu|B=IKs1Uo5=y z@tacyO#B&NG1l@P6Mtzs;r+w6cFZeLGUcBNxZ(J^miM(TH{Ic0(Bhd^`Dd+sB4H?A zAgJY^WHmf_q_5E`?X&hxYE9dkbQYI6=%FpwkUZ~P>;2-7>6c>KwskFkqBrLGT7LLI zk@!+KryLkRFShg9+ixY|rG{F5J!(o-e9EED!78PamJIoRGWJ$z`L%j4`UmA5zkhh+ zUIni=8jm5jl%M)5VRSu3%|T#j=$2xvq#>p)M>(b zEN0a5g!GMdPL109cDdYhW)^5++(izw+;cH}@!!S2o%YPTD_e$b{q}R5AXfEY$qoUo z1RlVJ)Bu!JWFB=4C6?6$BaP*{Qh(dvUXv#e9dpyascn3<_c7_#^0bvz&9YYh*N#p- zy*RDylZ#NjwS483lXU}m8s8~lpxb7uYCro*Zq z@NzFLj~Ox{=FqwH#j`Fg{N&b`D+b}wyOyslbt%bQx$)Mkf7b3+spaZBBQU+x0fXM% zIBBteQ((l^iyxj}|JOoHsPLg;bh}{<^QxpJ=vO9VMXu$lbEI*2opt}b{@jofcY`n1 zMEl#FSB+#<#MeXu=wI-v{yF{K`NE!!SG!R&!#;{vJr*H(E;!$EeOS5Lx{s5Z-~RDl zkL&Zc?|l}VMDwZ7(8BUh(czKx>aVT*&CH*kY1+MVjpI*E!h4VMscT3d7M6h5L!+kG z$Bf5vO^rMo(cM+4>73_(tkZCvf&5L@^7VC3z1pwo&(BSHv}4hCzli!37fuNa*^u#4 z_VU1rwehA!%XK5>{jsX=7q4~yz3NBLY^alo_r+=Xkq@ITJhS}F@mtf6Wwc291cS(~ zM74ZHM0~}&I(%BcYHJhbO=&o7)GxE^hwa~jTV1&Buv}?n|7l;P-`RFU_RshIe!bgf z+;_>Zjv`&w4jq2{lkSB-yjAVhQcvyc7x(>;$M_NypXzF)J$HuHo{``Ir+_UB3DbE_Lk?grSqNZrJM!FlQxhaYDRIT?S>ZxNXiS^aQ_af@5>v_yn)pH%^ zPwz!|)VS&H-v08v9KBgkaC{le?5ZZjnz|G=Y>sHDT90z~lXPc(NUT6p{pS)} zsI#V-6w0=LZA4y`JPA3~dEb|-Bit6i3y>2F;m@TLVV_#M6K+~ z#)vZN?0XT#)S&OAU^f><+EY6soMcPCODq*ic4(?w*RHIc5gNB_yy4-l3GclR{PGyK{*#s_Cl{aOwzL&@C-s_6bFrHw71bD9R*NCI!`?P(ib| z3S3MqqRtjHhcjat1x&{uqb?`rRjrFi4IJMg!SVUEYl->PkVI2g&7EW2+LL$2iucN_ z7RzfqDaRQspo2FO3#sHniLt8Z{%}08S`*<`pS}?hqXMJdn6-_=M_I2a zC0BT~JD=*gBSN3Zm4$=qeG;Uk7iJ{nQE&2S!$&{ar|dwL zIm=yI_!dsUve*dDEJRG zzLo^HUg&=K1b?e%Yllwo%0r3osabW*vDAH~Y$Co#bP&EhTPiV1%^j5BQNy1#qmz*{ ze$Ecp;P=0=m>y;X(EA#tf$I7vxX%8zuGy7pu0N4bm}reoSXPnAFcmi{;g7#^hz^l~ zTR!?bYIyZ`fIF`q0b=kmDu=0!pQ4v&Uf(Q}r)kHw7a=pUZ)ZnL*_->h-D8TWdSen2 z^7WX}J$Ls_gTtv)0EflfJe*6n+!ok#=lcIT&64B|J=Pz^qaEgRyyBH&yEfX0aHaiJJT2 z@1!bHEfI~Vfmuc+#YRP{jS~~1)OQWcqFJxo3JFX?f6*UHD8R2K{6fQU|2u%$s!<2X z@HRk9Rg8K-7DGc|F(4jw1u(7|O@UQ`&43Mnt$>&j8?AxOfp~{@pe1fhYDKLfXbC|V zJ7PCGVsASl^Uy|RH8ktF8mrw6%`_J8$VKkA!s>;q<&Dh3jd_YlqZ9roi_(4~^BSKx zvST*GbLkwvCg4~RiT|6a3Wvf=;tX}$n~$J5^k{4*@kAB&CKOfm*1MzC#>VCZ)#Y4x zeic~Zu8gpSueje(#haSRD)K~lS=C{M8=ndID!hCaEfKAvpCutI+F_VG+cLI93B~lv zW+-@@B|9v|VI>_#XG_}h4y(kH5@9tmoiTNGt=p@bwKvo4yaC>CX1=DreAS(-rZzV% z_0CH4LMwLpEClUpZte=}nM(y)ppRa*%AMbL9IE=@FUt6iOl7Wc=Pk-QBN-j788iB< zX8T!f47>n$%SzmqJ8O9?I&N#eNgZhVcIc zHE$Dc;gw!3O6#n4>mH>0YWH?3pWDi;)8-k(i!{dLf3hfJg3Y`JF6(XCr;hBTBRlQL zesyHGHBuWSRx=F(&O^R06k}b=Tvj zQRQDlOM@wow?S1H_Xes08`UhGl#ObZRE2q<4_1XGTJ~S7!ZNC@u+Ck$rb0x?A(`Zm zOlpD1SPMj!c@fm;{81SGpP=fG^6DM|&MT`rw-di*zTr+ywzln@~!#17& z>9+}L^%b=Guh+ZviCi1puZCg&ds0VKx>ucZkjXj7yvA<)FS5O4YIsMpiuUK5?yX_l z+^TygBwvppF_BD?lX(rgR%Bn2sW&^BHPA3Gb~0Bp_3X|_&3Y}V$s{$I*Vu{wMYfwv z&Fg}Ozm@eo4N59JZYBXTA2%;hSB)-aS(R}uBEK>@d3ch%&gI_FYM~^WkJ|Rp+ke z0;avz)hwH~14*Ptkx7jr^BPnrGAi7mj=klsgflPK9(oH1otel`mwc0YkJi=+ z|C33s$h^h@N5(3+M-Az2mWH-P-OX2UN&LY(?hdjq~smts@ zzloFg=#P`1N06MHOp=qy$wkJKpI00En{>q4{^n~;J!1e;JebK7&Kr;|_+@pd6&D0849X({ChfK;tWGoMn&8(kKjXK~i4tevvoHp^wtv2Z=EeSa)`YZgzP8%avzkG}>u6-{YqpRy4!4~{Ww(0W z6WIwIi|o41qKsc1*_6vEZQFO~n0@13UUcMrhnZK>xXS`-{t<o0*3(y0!IRe06EMv`~^FFJ`iDnrPz64j0O1)f^op}z^8zhfJ|@`NQKNt z7+i{_f;N+>9A#c(E&eBqGS=D5YrN~o-g9Kf92s8-A!$|TQD!UDbk}IJnA-I`mbiQ| z%ADJrUf~d35P$qlhY^Krv8ucHDDR z3Q^xSvsb@fxvi?(UCya^iU-P3ekpppPTzYHp zgxOP50-zl;y@XEaHe(JC(2E!A+GSuxL&l)Z?ue`?ABKt24;SfZwnGfOO;j8`;XPk{yvfJ%Eso9qxSwN0!H#J>o0zIBr=? z-m7LlWkzMyLzW}h*&B5=!`*VDj%Mh)jM|zl2djaQEp4uc8@iaV;Hs9PAM-JC_BJ#Q3P89gHu78Rc~_?i$#k?Z7Z7LiHf9 zGCCCBVzNW=i5??e%U*Y6?|?}Pu6!zi&^V(KSZ%EZZ~NA!suI&; zj*GxS{8h7$tJud??Bn?lg!h2~{N05gqGR+4vtO@YWpAQQL)*a`Rnuq$vEurKf<;IqJwfvbVI$_^lok%c)z;6o79zra^O zJkJUI3`C9ALmg%g0nUmL7BFGVabO-GCMSWsKwOXqiUWTDrUB0ZS+Sraz}k5OxCscq z27b$c0r90$PFDi=fRVsra3Ur$fwDkMast(WQ9!OE zg;4?A2Q$z_0zH5{};2A%=t11BycAL!%XI<~l-_ zRcf$ez+B+MEMos;Gnn|`%qIgLMDsB+m3r13g;<^`W-yJh@Xwiow?ix(8ts7*z>Yvp zHae@Hr{Eg3HrCuGBxd$z6#SC)|I%rpkhCWF&**N;lWkuZPiz}cy{Cy))fH;{AOzCiS2Mn7OF;9wxGQw)43G0+Iet9Ul-VL&$M;lLii z5o-1GW&^o{i|53jhvPP5(3)oErPorYWA1fRH4*4P-TWex_OKJ>c*NgE=z+-C477k- zfN{XLfSiiG155yJ1r`Nv1ENdAPJXm&;7&DjhB*lzZr69Xcz(|PjvREqtUjG-F5Cqc+Yp>-*(^P8*0n<5IM$ zzs<_8^3O9%B-Mf-&M1lhh1Cb!f%3toKQJs3n}@62YHB{>0=CaH3jvM;vSeJGgSg9e z{Dt^`iDql?zl0)F#$qjFdt;0U<173xp=?_(YS|6^KUcGR_+LUxqQ1`7GBy;E4F}7F zEYA2ujhTS_MbGXlBdBPg~?^4RrAL26pUoM8zJ; z0P3Ex30Mw@t&)LyKx~Q(uu!)G+4Ex!ldd4x52-JDb^vkRV(bAf1%3>C54aDw8+Zta zQNcJ2#Hf&Ed=Byh1lU9v_z8%efq{EKDvm&=u+=XR13U}ly!r=VX&`pa1<(f?*!&jY zoCf>Z0%)lQcC7_a`;ACoFQ6AV0vHV(1@r-@0%L(MxX>ZRgV5gzz?XmpfUg6SfE+@S zfgD1L0eLeN+sy(8fhB<_fTe*KfMtL`1Iq)i0xJTq11ke_!MoLgvA`O@IABd+A$&B_ zs0~sASP#fPuK|!lOe0_yAhw4EIBjYMoDOUboC$0JTmfteWbr))+zT86#CPM2VZdX+ z;lR&<*dG?aH`|PMz!SjUz^v0CeL>Cwso(-|B=9ou2_T22vB2BFCxL$f2LSH@2LWB^ zWtc7=I2l+5_$;s-a6FK+x2J*lLXa^LSPwV}*Z|l$(nt+71$i8T=0I#Y3k(K62jui^ zI*>2Tn-N^1%#yj$sy}|kOp3HSMU}O{Q%Jd&m@6uJqkVJ2K9ve$}#rj_fiR zdkwq`!I2fiG3z5X{NjJn*BuPseur$d%cx@u=Rt5$3)x{w#1FuJ)G}6ik#W-hgO+ii zucn%=F$>j}puP~u`A0Aak>U(|7g5hEBMeqXk+D`uJbbeaDpsyB^F&J!zDEN`sNHMK z^61BIARw;<;61l?8oXZ?X%g3(RrObi=OU}2-#*oAEqb@vYO=sefjxvz)c0%6Vy=W> z_^Vihk(Gc7!;=LKp5Uj^0&Vr6BZ8E_qr z*^6Quo_-Lz0Z6@@fCGSU0mlQer7kc5h~0BpfjJ-_K=2L_o8kgHf%||*fY`4V_#24r zXMsX+W9JX9H>Zd|(6ME?`3-pB1$LehF*? z3_~4h2ju*i>Dl=(eSRR*7XfwwmH=YMOrRC82e1vWH?TJ_3tLwL>?E-NB*1GRY!nI1 z2TlOu6FSBu-~r$Q;Ax-&{s?>-cpJD8cn`P<=t4bO4|D@J0Qs)YrNC6+tH3hA*MQ}K ztASN=W8_-{!V0(o$WIi!1#A!83G4#=0N4$<8`uYU5SR@-1bhL=oW2B{3|tGG4#ZoM zjhVo+z--_p;4C0s?yEh8xAJOF{gE4%9}d=EZ+4A9Gh4RBEYwfBpRFkSDEK+T*aId_ z?+ojMmi^+$Vo~_vTE_Y*@ydaPX&LLL$eM$3`VwJup-g2yl|NBcf6L@^>K1S5dC6cv zSm7j<{gzo67+n9B87ngrwn6r3{C$dSume2`+}-+^qa{{T6K$&C~8 zrnLvi8-iY-1@r@XnGp+22huQhz4?I6fJs2i!;NI%06Ux+x&w~=lr{_Qc*i`&i7Xys ztS|cD5cNIMBBJpF5G84x^QfhTJ<00%pjiuPJ__P-MePb|<%?!XRdAcx{h=}LCtJY< zTfs&3$~JRnUa13gOOh@}c3#!gmL=Xq{}j-^_+$Ub-#)eQJzacT1-^dIyrplwnh2br zqu^!5tt3^0(=2D0yqbV!qMrU z2F}MZ2S@6Ie${M;c?J2evQt~uVW)ZFp-YkZ(Nd2V0BMo}762{+mIb~HFumO*QFT8J_3k$;_HF~$1+Ruw(!#h^+zp(ybRkib0fpL}|ffq%Gnga*ZN3`sg zBV#{_HBE@eI}FlndV-bFvLTe|M<^=a9^Gt8?m_Olsb&HL3AjzFA^7?pb6l7%hMf0v zK8=xa?HI5i^6(vyc{>AS+vs4*eVy-d+yci~EYB4_#swfR2Y&`~w*L$8ao`nTPvA`; zi{)3~IN%>Z6n&QQ56B7#a1$%A4v-u8CNLbh8;CD_295#Uz_UOPkbO%O@K<0oFc%yY z1LW-A1SSCU080VmfmMO|ft`T`fNWERfI~T}PX>7cf}+5Qz+%A3KrHtUaC%b`xB^%X zxCK}qxC>Yj$f*vN;RHSdRtA0ptP1=VNKc&y)&z1Q)E;P{ged23+uA^@D@a|C0>Jvf z;=qPL7HA_N3%e<-KTjs<1{p8|FW-u~EJkSj_m+gkX_ ztJFcWkUdMv1Don18eRheCiO<&FGk02-$#(U4xwYjZ#nIQfC_t8A)v zN01+^@B`tclNrv&g_7aJwSo^t2#z^qJ};d-JMR=k;IA8UNh`Voy}({T_9vTwvB17S z-Y@76WTPDdq%lK*ypJ&g*bq1p$O+jfU|-;9;Bep=Ap484z-g?gPlC*b;2Gd*;3VKC zU>5LQ;IqKJz~_Nq0H*;@0%rh!0L}uQ2QCI)1HKHr1zZVa5v>B6K%D{Lt2kx_-Uuw~ zLe?2j5rTC<-0L&e19@G`2(^Hlf(4G4gTtEEg3>s>q)IxM=W(2&3wj=ybQ-I`9@DbT zj*J%vtY3K19%Z^OS3e%r9m(%UbvGG*j1a7H%*-Ptl7N_>;E%tzU{mwtncQt10yo0R;ux$7YfD{KubZ4Ik{toW;y`y0I;xBoZh;jn~U%KQau zggYNMpTn@X<&-YZ&ol&+PT*oSY(*HpUf?UM_MQCqCUk22>>t01m6FN% zV{eh3kU( zJZ}%qEa54udcG5zsXQe;X=>SJcPic2`Jy=&W>gsC%cHtqHwy+6e>O|%)A^HpscO(K z=Hoeo6@tH3vupTDs}(bSsXW2y8i?2Mve^+$=#|T6Tb=m&6*GY2QCA^mq>(9zbp4v6 zEQoV8(jn!e5pw8;*#Xgu+_aPTs1Mr}>RKbK88329*8N%tGvqf10iJY481I9zyIh&3tJ3 z>c+v!E7Rrp=AJyLbKYnF0_mCvQ>w?rwudJpw#-%EvkN5hVV zy>!jD0x{;gd`idI-6~IhHFqAC@U+h5gX@BC5JL3a3y(c*pi)gs+(6#Y+)B zda+@oon)@tM=$z4J~3K*ak@980&fEK_>QQI8zxG_)&qA=V1`nBd4jv6eU_KL?w{`}*kQ+Pj?-eDv<71YfcH-o2UV z>xTrL^7{_My{dQtAL?gtYXRS!2mCv%koE%%EEoKvkZl&643E+3atgwO;^aav=Ww#C zh<0-4BEF_#$`zP-pr|gaV#RFdz|-_R^hhLKOM9mJP)pUM3dk;3X$5~u^~Gr&cS>ll zzgaF6@_I=-M7#cc8eOmUya-=DS{lB*U!5nV+y2(Yaj29o4n_m}O=h{oSgZ4^>?GO53FoL_9H1mqhgnIZNVh1z(T*B@t6emqedR zXbnz1Usc&R7(R%p;>&)(^}DNT*S}xgcT8QX=4;Kf>+0RRx^^Q1pa(+q4HKcFYfbwY z-9oBbT}wy0TZ_exNV--xuM<*PPL-+cTd967&OWBD6r6VdrMkWj;hdTosz(!Vk}Q-P zRnK>sO5o=O$o!UusK}0YRZ;`ruME}BZP<{`4I+vdhYq9c!p6SNIdy9P&S)$;bsb;Y zMAz}wkA&(tLRYblr>d(>eJRwg-CLtsPWRqx=Bs+&y+5_k?ydExFIULDQ(^4BmcCuA zKM~ zkudmrq$f=5pyw;L(}{v*J+@T4ep~w-s=9hSQ&hhwQKj8pr=za*nO)&o)_T=9+H;I2 z(p7tBCtbB$6~)TM`+omDMoiUyfBbP>sdW_gF-rMF0SiF=(M9_g>hDph_WAg3TDH7O z$mhv^&s24wDSTe{;XQT@Buyy0vM`${fa>#W1x=o+CX19eI`Uo zRd)yZFs26w3}!ip2KAXkd=Jk}GKTs_=yaHyuqx~ckIfV8JlxmpzOsWOw6cmLeH{Mn z8NySe{zX~cCwxOf%F3#fqqSui(e0s^mTexZl_fr@+niQ5hCWHIiN*E0RGSp>oMi#% zjQld**994A@|5q5FyM`6e6hKJxwCu`#HeRcyOYJYq{F}obNTq z&C{M|XRFRU@7qCHU=dumeVTT?YFWy&??0=1+zj0b+@Fjro8gnmNS80!-e&5Wc<6f! z*0eb|CL3$MX*BxZRJC)K?%3mI`x?5!riZB=3O3cBiaQJNQNIP;|;N7U+|ee@W||{*tfe{gYivW~g?Wp)!GTa%V(;kYFfBKhW}J|;(RT26IZ=DW_E>eM5bYm4?T_Z7IG zeeX)0y7x+-@4m{#tF-XODqp^kMTJ$#H597A8s9DF+^?+F9fn$1+4C3Aef?G6+lceo zEsK{%dtbBL!i}F$&^^}q4k9dLhfnV@>X{H#6mOpKLiU1>Q{P9_{?<|7WF)L~%vU5A zyD|(Cx~~tSj$njC^IVqU(QBr43GF(L7IWw;DWTwS)bQ{YNzVRHDs0ElyQBTJ5vCeJ?ue+r$hs|DNNXI{7`^ zgDQ7_*!%4V-x%a<@HyX^T+IEZOYqyE3tD*kg70WZI17<#UG@zKb6oV%RqeNm*L-d7 z3)kMz!nm8hM?*rUy!xx}@B7a6{J}0y72XEZuN`zp2N(R|dxh1Y{GY4_Dnnr8pT0Bf z@iPDNEwCpJ*UKi_laaiC`$jS+wOe`eE8k;q=9_=}Iw5hy9p5=SAXWMQ(Xzq+K$ApH zRio}|*`d3>Zyni@d%jNeJv!N%okwJs}k_Ec3nOoHEU z<@vx#GclKyvouk&bunFJ)6fN!9%0RcXLd$dZ|f>Q%5AO2abAzLULX5ntitN7*TR4n z>>p*l77{Yj+c6eu6g25bZG6^qFg|#_ou~JGX&1l6$^9O`b-}el?e6GFQU_wKLCj@~ zPN=Il3#!4LJg*|m-`P`FRgbgULi6l6Yk=;(ZdAwVF|8vb#maMEIHfpj-xvJ0xb<2X zt*x7h%&sb_g@2W_=G+&qE2V|5($=*5!q>}ExV4;B;=ZhD1*;F-y}p9Ao*H{Lwo=uk zik6-k4(;tZsZXxY^I0WpMFHLz#GQQnKS#4R_XBr@9 zdaR#px$MzTda$g1m}uZ!t^0dAs8+R5)Aj{Ft!1sgpVxVHtyOvdH3zC*bBlXoH$Se& zvL*Gb<=Q&f-9$}kpiTBQv|4LjFqu~@ryE<@_jS)`_J7p9pt<$pecdA-)w=(F)T$fO zovM1b(uKFZl{F=Fg5Ccoy9c(h=G@m^x1H8~xSdt?zV7snTKBUZtzseFh1JKM|BuEW zd)%)4d+3;~uKEN~-OyB>%9Fo`RGzPgd%o6EU3mue`oElkjqdm;Pm53A2jvt-4bj3rLoB(<(lMVON})PE z)Y4;&mfaZk|6kev8g6|eh4Tbv#td-N|U@4?tGnx)ehMaGc zzylQn%eM8}Ry<`3@PY0l!Gqb>PM6CYe10}DTs547iW{z0&#|5W#Lu<9*TJwR z6Kn$*R%wFav+2fK&G0dFW4mVCz$)Pb7YN=7x=pj)U|8r085du@uh{{x4>bD(Y-fa; z^ITj))-mv@@E0o@f1C?=fDoh7VG+&0gooBO^EuxO{}L{xkH?t^@AN?U_GAd{vrXpa zzPt}a_)~o}-zw%h7Q8Uun(X4sBnL0BKGAlvUh!EVSI6_mw^z^xJUI*SX(rZQ29kk% z%?0bvlm zKt4o23G5Bb`WA$X6wd;O0>1~20sa7-06Yhr3Oo;-1^f{>7x)v9tI{q5Uj|+R!mY+H zz&C)u0k;GH1j1+o%VYyElIuzX&}Cr7THprC--rPD6@o~hi3*5)PJu+A7nlr80Tu_A z1l9qj0b2mEo;J`8SOLf-vXz0{fK&xI8dw|1RcnYF*aB<``~a8%+yl%6ew!-`tAIg% zf}kDnGOz>i7O)fWH{j#Izkxk~CR$2QU@UL|kjvSI0J&OiD6keVGz{xWKkHrWeOmLOJUM#naGKH@ITRSTD+*Bzv`FSiF@M}vhBjGa$y zE#sC(Io(1hlsy3UF(BS)Fnlx#3_XFZB@e0vKD7i{H89b_9a~~nSFleJ8o`!k*!xJh z7iEc_1eYGk{frvw)13o*SbO z5T&P=z$hSR?u&uwfepAVFc}C715<#jfiD2p0OxZW_!VgS;)u5mcpk@`7+eAV0=x>m47>q!!FxA> zxq-g|ivTg;=yClIU^N`y2G+zR!T1vd^D$2A^s2ZLK+Ly{lEA*eG~j3;4dl3uh1h|m zKukCT%YnIon0*+zfm}Tv3B*`#xPch6jVRztc~4^j(=p)XJu zmUV{b5jv>n6I78+&xI&R;MHy+_q$(Cxc7)Y!<~15SvgVGgy(8=F$oe@lc9f!T ztRs8Mkv-?gW`tx}#!HTHaY$&ab!6)t*}IPHJxBJjBRlBGzH($I9NCYK>}N-2px_Qg zpnHija%-wxGg{4DXXQ^WK00~a6C;KXNXGk2M+_S_2<*v0efy0_9`n@5el?2sRimDd zE2z5~7aoMHvXX+oue1JiW#x`!mtPJwfZNdG^k9$+GTBRbNXt4Rl-EfSMo*ACTE>gf ze^4a&!Y`PNVynUa(y}d%>~}CXQs9evV1MXP7mlN~mbO&@ziMGGFj2#6)f-wi&XLUk z!w2J_W&vfg;Q0Lw`fkRj8*p)cRb2&yl}=W^H?6|Na)QCuZ(0#@U!w#pXoTea)rydX zgLQ%ICF=o81DgUX1DgSP2lP=O*C4k9)&sTzHV0+^IY?vzI{@1Oy8zn*y8$}_`vW@x z2ea4g0x}VTuD~h4XMxjz-GTFfy?{%BeSq75{ehnV2LQhW4g#_l#Wt-#I5IH;SOho< zm;!tP$lh}_FdaAsSO)kc5U-KJ;&u==+oynRsuO_&fdSxT;AG%bAPt)iYzSNmYy@0s z%h_jKLNQ36K_-0$nU|Z3b!e2qMb9GZC#(@7vRp;TDUc+7%8@-WsxC z{ATMV{aCC=wui4(`D6=k%LFfPvGPd?bH8j~{PBnBPXI%sF&)S;c_uIgI2V`>oCjpd z&IdjUd=bcT5qF~Wi*sfJd*k>8;7B{1`S+kDMCzMrWb)n>uvTzDWmqXfu8}1}m*mKr zJ2E;-;?YqOj{}*=IFxzRvA3;W$YP;xu}MXEzalhqVV26`k3YA7u`l?12&evPS0BS3)9V8xT9QhxGF{olVbs8q(gg{?^&dd0Vvuc7!mS9f8bdXJ9>>r0d`7q21nfHk$3tqKLS~-fyL=l;nZ;miTHjs=i z83#qSHx_=1=Pj%{+8b@P7J7qByg}yGuR;(RN1nEkA#YfpS)*N!H#+I`^ahz&LFP4P zA(hDHl7+nC`hw03c>~+X?Q$iP2+B4b$%aGbOFgoVX& zp{g=er>Aqs#2zxQF&(KyMmG%&Ip_Ir>D!QVMmfpJBsrP*R%G<;sE~8?l2ZCbtv+R4 zXBlg^;AH@|lgUI6nOww(jFX`!A8-p+h87FLEwVCKd*m6diXI^okC1tF>k}D=>}MR0 zU|codh{X^ot>FlAG1Ry*&*}lyO<(l_de6f&W#IrK<{K{j!w_)kcmBHaz9jL z8Av}zXNS)|;|_Szo&2OPaMF`WdNLV@Mb-@I7vRII5#I9Z-pl@)Y{^*a#$4S^#d5ZL zKVmuC=a=kyyLpd4HGQ#G%WRQJw#cO3ij4IZAI{y=$s4BzUa``lcHUG!XOM4S;lp)Q zo|s!!+4NRWQGHqg2wYhO@CEG--@wjf4(yFvss~uHjqKZsPPh>1T ze0^7&b$5$Dhgsj<;M$mwS+6^~$V3;JR3wqHBH^37@Z1At1#jHKqju`jcD?E7A`@L? z(g}%-oe;j%tL@tOTTXZFDDThXTG$Tvu6C94N1-qACpcE(Wdf+LEC@2uOy<>BZX#p1 z|JJ`+S>raAqc~RLMFh4kGSNjQy@ANs8{pf&+R7)N&*{B7f7vIXw;m3NpQ1Zi0axzIyhI)qk z2O=A&nLaF0i||6}k2&edBt01>8%QOxk(${r6%L*V_kZh(|H?^6Ch5Myw}ADF zhl6(_{dL3QPdahPB+f}E&J?fzk+AqPP8>3cbH<5tH`<@&ia+nfA(J@gBURO}JWbg% z1itc|<}|G5*PbfrKRa>BBrcg(zr9vuydm-P{b}5_uRT98{WsrW%5v37PbTTfaAOsP zAhO(K>S@2fFB<r$Cap(gY&~JBbbfyuI6^O(pP%0^OXg`pdZeR+ zOmvWWjWI|mG8%&qBU^F)Qpm#Gg8ut+gY;-8J(;8@liomN>IY`@&w;1 z?3e2iZG_)ZLMBScq@jw84b|@$F+JITe>hH$chZwddNS$IMaB+29$%OJ1OwDQg`E}m zSPYz(q~jyWwjaqPIhmKQB&xdGD%P7H8^I9tfgksBX%mD zqZbRVE^b##*DX)kbi543?p?{G&mxmyPGlVBisRF@mbZesz95!klYg_W=@m3=E$Nqa z-}5T@%ciAkjjZEjQpd^gf^_H+*)}q@yPcmm1Z4PC80Ri5JcZ#Txs<;ceWmTgrw11jz1vD_dl2%Cr$;3c1uW=TNM0Q>?wYw?yUeqe9-M6VJ zRubXmZDmm%)yB~YmKxE{UoySA);1p6$izT0uYPtXvdz#|-7SSNvV6|Mz#uBF)0wT~ z=pqwcWHM}uY!P(T`Cplhe#AfJer6kLmCP)eWR}dUUw9-kX1k$VG8j)_UBug~a~n{uhho48sAl?>x6V<(oVbLja(NzWjR(&z92huGB0{kAL-@9C6l;hUgILt zi|n$^@X-o9w)UwC4gJN@ehysmW1|BWpDS#(`AS`G=`W>5&hjNk@Gc+Qz4~X4*(5Hj>Hm3XvU$ z=BFJSxBP=bsn^nfC*;9&yiLlsj!dj0ldDmY)q;*JbQBZy<<6nU{9KQ{@UAB{eX5h1 zOj47f9m6V-oz=`PKV`O-Ax9Vg3@166Bqx(0M`RpwX4t({jv<3pRqsym-NXggl?=b! zC`f99t`u*yLY~+%$fRYE$%I5?OQ7}zyLVaKCTH(*zK#Ex9KB20i;gxj(MBdChsZc` zy!f9ZM-Y3HqOtg_n4HX${=qjv)&oMRzapjRmw?z&UX|Fk2 z$V3a7^hY9NfApG~&=vCr{m}}&o2Oeh^aLApYW7NGQWePLQxzinM2D)3yVxYNznjj{ z&2E0Z7iQE%=-A@uAQK&AGP4#LXVzPsy4<6O|5~UnZ*@|WNoq2$en=>?XxP6sH2qSa z^z`dZH@uUWzQajQCdtXXe3h~xvfG-4zI{@xw|{@$-A*zxNw!+NsM8ovA%mVje| z#q6bh>_jD#sATfFFOeO?89r9c`=YZu^uIcig8l62mhMOnY0d0N$fP47leve;IQKZ@ z7UxF}p!0(j2XIWc%}YP3m9PZK#5^*&cPX+JP;xZn{b0jE{uh~EcO_ps$;l)+nao&3 z#u>|(whax2Xd8wNv9ASm4LIQ_ArmEJGH8p8gZ2rr!NaFl{N+}sZg>l*!sGqX!Ii`O zT^*}VI||7}A(`Bs78xfQr){eSjnGyt7-3%>XsgaSO2|YBnOq%+Y%Y|Xb3F6XC{7K< zGieu{s}H{B^ls(VAKAWK!;A;&YMF=U439{V`VO zuIQ8YWrxn)O|69GPA2A&NzW!S_G~wu-2FX{BdwjgKb+)blAKJg{zNtb$^Vet-T7a+ zoAk8ZA?e)R(VCe%GRYm8xLss)`yD%Xc_--H)tg{n)#yg&!ip%lx+D|x$mFUej<~ZI~l40*1L$TCE35KLtlAemcLx?khU~O8<}V$ z!;=U+c@^0#vj3(n_k4dtM_XA(8<}V$L&pmpB3nVG7A?e04}1b_q5o)SuFbjFoyU}S~O&wiiqKix#oygeen*N(ErMGRAoHz-u`wzR~ zyEt*kBu*D6PL($>(U0%x#37S7JwtI6o|lyiT2WrhmA9W0kxU}?Q=Q&Kud`KccvG$` z-{cLbg&X<5N+w)Y^)~u%@#byiP5usPgS8S?PBN*SWOBhPvXSt}VCDJ%(~t*lX$3Pk z`|)@dDKRpsQzB!X8lzf$;jfN?ADAzQEoUv4XFTc+sbw1rG;A(M%P$k?c-{JSlEwsT?` za`kkrjJA-8EoAs$B~*y)OR|tH-FDhn>e`msIyr426I;mS{<6r%Bl+xqw`JJ}oRZkK zq|evNXbYLxLMG3#MK%k{=0Dt4IX@|z==Ex4eA@; z^rYVd(DOV03SE(|7xC&lq`D$4arBajUNX@uGU{Cta@ao~`SWSBw8K{F7z zzm+7iN=Uv^b^F*qE9x}_#pxH4V}{ZuF;T_r)5A{TeR|lbBhX!765&y`Y#*-u&@Sif z_xDeKRiE!T&POII2g$^zBBM`VMbA*u`v~qN?QzBG&!P@5slT4F^Z>5VSwzdyyj9XR zXm#`|ndF{KuFplr>+=oj)KULCXy$(%f=w^0{D(Ev5O|#MP4MZ%cC{YyxqoZ=7Ok3= zl8L2cxX6V?5Q%i-D_9RtnIqGO36D?#iK8lRv<56jRgU;{*CG=z>)c7v4)@gNL zI_k(o9htN_k+IEvsaBry^PNTR)BbaOpURcf{yJ$VbZUB;OuS6y)ytzrW+3&6hm2vb za-^vD0~hAEvr@d}(oSnt^bVOALMC-oWUQm7AMj4;AN)Ny<0c-kwn zC1ej2RHGmL0~{q69VKL4TL>gY)_v7b!(C6TdTx~aNd@ejs$jN9&V6?F8Lzg5~FIyuXfOv;o@rW+#T zbmI@T;F^CDlIOYZU$5KB?i;v~ddEplCdtWU#i7U!Ao(4Sx|`;$tJdezkKu5SzL?5R zM-Q{*reD^`X=_|~L~UP7gNZuIWO6|kr57H#)Y;qqCt%Hczxr2)tSP#%qBlA{!cjpc zD#-9zUf3bB-J1P}Mf%>nwy5!exE36BT4qk446MoMdO~&I8#}QDL$A z*|N@6iq^(lkx8z|#2}H;pcHS;T=8LnR3!CrS?@7D0b;FA)7qFlGO>+J9vg_PAhe~0 zvWF-B@;uYYURg&4nW!L>37N>oLq%Ede}BNNV%@Q~*nLKNV#}sIqBSmpQDic%kjd0n zWSsgwqIN~a^3_iI9T5A1-*{qis}GA^dPc=oNvo!{&{1UKC^A`!A+o*DQtbgP)uLmw z?rW*-Xdx3VWKt(Z#yVO10WI^)Sj@jewlr|Gkck#DdGH}J*6{`pX!*&C#WXymrKzKZ zOtg^6rLV}AKugmHv?S$;t$SZfOGgWtXd#oyye)&4mTFgAEU%lkD zJ*s+pa){bp4L5W$wL%sbnG_cp{$V%}S#Gj_RT#XHFZK}*GFn#$M;DpsBEv8a4I<-S z_zwT7OO<#dwyA<~$*TOAm<JY;x$4DBN0 z*w{raD-_H3#>N!Ziv!9Ojzu?$0_j{76}6|%LG#5LxIHr1(L*MB z$h`arqam_JnyCVHyjXJ?#G8Xa7 zd}ydg2JNXSPI@v)PbPaFMAj4Or--NE>CJ`|^03 zs{j3c?u2uV=j_WhkKw9t5jRmtl6+)Jk|ZH%K&gn_D-ALwVj&qyNHXWhoP=bm6iGso zBqS9Pzvp?s_gS`feLns3`|j84-sd^*y`DAgwbx$LUOR@}hc$f3h>=!Lrg}2ftBv}R zUPi>QXR^vA`D3h{Oyy)MR~zMHZ1S=Fu0CBQ`NrzWR8OXF5veT;dSjFSTP;s7$)9ZX zWU41qz1pas91q`MD_VIBO7PRIoJ{3p`ruLvDw8oK2D+g47daxx8FZ4CYGcp<$0It^U1et}h!shUg!R~rLg5H`1cRw#=N z=Mrh*s^*t^kuyxeCk-Q|GTybGkf|qRdZVkYF+6$K+~&B4wK*rA?XjxK{@^is*Vi@ol~JjZA$b(?w!xdkDU*w>cI&e~ULZ zBOZKYJs?vL$n=xxYO4$nJ_-kx3!w^;{-KN-r#27oR=c&(;dY(i@+o=-bw9g?ZTW9C4cNL!Zif^Fo1W~u{Go}OsSwh!{U zPkTH?eirEjq?Jq`*ksxcQ`<`9(a&MCvSXw(GMn#I!kgLcBKK*Zpc5+n-^3eUGBV9- zGM!mh+cbFdTi6`$6e*RkFpoK~H96hf(=$KTDm+mjH$1L$Po%WB?daTgD6jGzjzRZC za>ssck5n?sS9ZXY>YNRWOv576u++w|&izvk6u8T4YcmHj-~+mR%mFgZ0Wxhvs%;s( zbIgj4k@!oc$bkBHd-*s88IX}IzAyvGG*V>RhE&^R_>ydX>J%xRu;Ra`zajEi(jP|y{xR)jnszcB-BBAycM6y? z_aU{|SNT4<_|xu-)R9>P5tMdPi)=&ks%UA&O=lwWxXU*FUhn;skZ&_vQ(;B*a0h3bO;Oi7b|;b zxLk-W(>{+ys#Ym4{xGRznp85aQq;yOrF?4q5fj_hA-pev9`t_(kC)2gL3?;Wrnf2? z#+}eCR@-?pv-X+DEoRo25k_X-0hAd;W>%;0Hi^uE=OVSMTrGYvGGrPVGAsvz4{FOR zEU>7QCF4RGUIvo2X*C~3i_WI8hV_k zkqkX)JR8+kk4%%;>wrxnyo&UX^h%&tlEQl86;nv2Q6aci_4Xy8F>N}ZEPN{7!657xvwDF*bZfq^rvWe)KP%=#@8T!*mp4zyV zUlS&j9~|LjL>hYxi9Bi3m~pH4!Zea;EXcy#y3MmKAu|o0k9?Tc3a4DBESz(s&UNkv zTWX5EfZH0Yo|4g00^JQQnT`RH>5Z>8-uNx? zZEke9H<+qpy~;VsEc~%hY4c52JkM?)<~1g6dnMAO3f{{0)-#Z4LdbL=P;DFtY?o@v zb`7^QU%e>ZHlNSaH^qHkIKt~vh|hSh+w+-BeJ0bn3bj28pYQrdpV#Day*MYo6ww(4 z@wv10nM{2q(-{S|<-q68|LF6!b6%Xy?Jq};@gXH1ce5UosmEkGNT#;-@VHyhV_wIx z+9(#UdRni@)GIO_nNnLlc-8a2REOrSagpzvv5=u8Io^^o?kSN|9>046xh|oXgfzip zT1(QVZC|ofdEdWRs+o3UlzY!&gs6xqI68{wcPz<7iX?E;{gM+=Q}z|V7$TX*nhbAB zA_{72E9~$5`e|Y$@seNttzTs77g<<7s;IUG@T>pd#%tZ=$T|6HfW&K%^@~jXB18WO zKBx@~OThjvUN23JVDLGf#v#@(GWClr>>R@NP}>nNCU^T?bCRvCo~4P9C^g2fZ@0LIt=$TR>l9aT~rN0r9>mjGfITe>bG?q!CtUXrPo zWIBMPHVz;eb9`Q;dO~Lmetw%f-TXNh-K-6<{O?3CkA~DIW7aA=B$lh5;&T<4Se4fn0XH4VNjhNNR;J zu2Nbktkn@ZyptPbIRj0@K4I?6yuUs^AXa^Gq#uKyvlwNBj&;I=Ow&b%*01MPs=Q*b zFcq&~t z8+nLPsk#)+8Kyv^LZ*I^;Xw!=)W%4yNHqm-i?&F63+Gbs1jNP=_;a01{O@jlUW#E) zv~EVPXK%;c6pKtvnq4I4s-1*Al+cvGp8x=Yv8TkZ$1~cOXOG{$+WdV zraOD8joX{3?N*Pa7ISX1MvnNY!yaU@2UbN!BxZ-fQ=BW|v2M0K$g&Y&M-fDd!)?S1I}r&UXRskneqdr=C#MuJ1y})?8^~S9UIfzp za9|@~K42SQL11TK1o$AZ2=GZ@QQ$McGQhdOD}bwjR{=laK3i2meuRM@{|cnX7l74) zc@U{Oz%sxrU-vgfl{s|la26*c&J*1=3^QLpxDU^o<`fy}`+J@=a~oEs_nnAW~4e~R;q2F zwXvD1wh`7g+S)iOpxSBH#%G_}7AUKW*sQe1wbtPlYujOMhpde)oSm_C8zNzRPs`vd zl;vY5H$|?J&bN#ypOB=tM<$SI#ZIQ9jA~=rPNd4*2cF}zH%D$0JqMLDPFp>h>d92E zHtJ8CmY-tWdcBa+F&h*)T9mt3s5nUm4DUb^`5Hbyf4Er0wYqhcOeu05->-_(gh*6(;^A6Vk zDySz=$e0K+^`A_KIn=fvIhBY{cosEoW4Po^cFOowsQ#$lX%dCmLJM4I}? zI=qI$j&kABv5qfvq(39-c-tg(yqy_eSa@*aV^`^b$y> z2_(~QiQ3pLDdHvY+&-H?_|@baJbUBmDLuQj{RLFGbRBgPQN_gqJe4u07fyg}) zElE~c>lc~&MW!o>)W(%WWo@$79*W@0EAi`AQS`jU$TV4Gc!>il&n8T-+k@ZxleP4F zjFrWcb)|U4WRYo9$h2xu8>@yZC0Wn&mdCJ$cg321hu$!*Sl(Elqme9$AJdnC=ZAOM z$kbCZUF4*;8HitXlfP=TKK#T;e6?7wpCY?MY1fFBX(Q9LT@!aFqwyb|z-WA0UF(ia z-PIL$e>)f-J%z#ev>U95Ohq@uJ(scg+fQRGKCQ8JN2cx?$KB~r{O~Y_;%~9;$kg2} zX7uloZ)@rb(3(gG7i+q*OSH0A21cFuWndm7)blN$+9D8ENsI1hA!7 z=&ZK*G8JR3&PH^;dd^GX)fp`$9=qWQnbrhk`bL)8X5cEeFb&TA?KHvX=OXt@6)6M7 zZN$3?@QzHoWn{YOLv8EfT^lp<&q!7-Zph&}Wz53e`AeE%k-x)`aLiKje@34K_^A=;4dn zx|02!e_zjle^;hPPhRq`kM)mC{Ug)rM{OP9U!TA6FZNTu==MuqJz>2fQ?JPMIjlB5 zho1;|#a>_Ny>Qjos)Et3mpnuR&PywqdPs(MQjz&;W3y&}c`6cJ8A>#DqS2dCK(nLK z(xJmjUorb_L!GdMo@>tt?eaiW7kK; zQ>|@@wJjqvKc+gg+<=q65d}7;aqV~uk!e1V zg`F0NtlC<8EbMeDXN_H~v7faKB#TW+k4_AQMwzT)(d+7ugkLGnVfa5nSPGmB7gic9 zFaBKF)l*qhYimoUyOw@b47t?wxa>1+NFh!rc2(NW2bvhdr5YaU7Y(3b%w16ew9 z0n>qXfn|Vsfb89+0=aEzKH$~B0zf`CqQD!0E|7cC7Y6b*vtmH@`bq$qn{|Nqvo}Y> zC>Tls*8occS@o3xZUI&Reg(V&cobL(coLWa{2h2D@GOw}KY>>R*=4T|yPdt3V8hJ;kL-sgT%sWDD3#^TI#IRVEQqeCG66!f7p=`88wiW>H zH>~V2%Xr7BZ8BIs)J!SzX#=&Tb!maDD zy*FOYE@bb(+a>o{St)OSmX-2WvK-(07C z)=JHQt$@ve1A#4o3xT%*mjhb@R|D?^vY6Zr{2tf^$l}oh$WfO^fLDc3-g<*v2g9Sl zR=~bMe$(X%ATLfoAg{+$K<-n`0Qm$Q1e^vO4160n1jyRxS>T7j7l5pyUj*(34hQZ5 zjszYAz63nX^7b;w&oGPyo&}Bro&y?SBJyw|Fc)w-urly#S{? zwS8)B`>gGtwVkoH^C1k9jLmCa-k86%>0dE=f2f5yP%+9uXKxkpm6f7c=7z>miv{7T z8B--A*rFlRr!tw&kEyLae4lEjR*pU&`o&bth}O^MW(eE}I?4Nc49F55Z(X)WG0!7s ziTXXBzn)L>Tyq?*``_pj9Yg~MYvLmK^XU_u@v%c0QGMwSz3!?RGb9;&K#}PKiY)9D z#8p?DOBU}cNWZ4+RZ;Y7-V$wlXvwsp`j+P|hJMZOp|p9{37I;XCrp%D7rL@ zt%yuTi{t*HOEWc;w#+&qQzy&fQIy`yu|??36kcWBk*T{?c}?vl;j2SkOrP3OdB5zX zCAz?9zK7eFV8sJ2^!#@*c(YEtn1EE0X^AJ(*-N$6!-ZZKXwRYOpcPy#wm2)ATbjbv zm!aTn6#rOo$h6>)X;WBjYzlAu8~TdY@P>J^!`g4M=W@Rq;v%1A5t z-Rr$pu=w|h^^Z*bBhyx}+Sm&I-z2)2Ga1*f#0$3jZAfGq5?Rj^!6ar$uqSrLwLXB{kJn#3}V50tVtbyYqWRTG4Y>e zolKKObsgFzvftOvHfF? zRW)@#2+KqtzJp#dgRV8($TZu?G~3k1Y|Cv5+!np?^(i0 zwT*vsKEXk@;^4FB1N`~)3C@GD8m*&4wAsdP!L#_|k%HYKC_qC+KHh*^Tqb$&M9H}w z_Ci2D`0!kjZ=sX~zKGw2fm4A+fSfABbV<%UU{T-_Aii`alRYJXpWrujyVy;jknxO2 z?(O!NKFny-BfPNTL^8(RTtV>?xC9K}`}g7a);tZneIxd=tSc^6yUHd;Af zwqBp%F!QPDI@7^)vW-0!?myu=C&18{Me#cWhEJ5hRs(@+3;QO^T3dFPW%q)8fxi^_ zQlKhW;VJv}QZxRfHL?Y%r;`zL6<-CWHf;LgvF4Vst*B=?j-rZzVA}8>XW2r_u1r)# zw(D@_P{o`%RMytAL6*I2*%Zt0RWVPo7)%4+V{Q0kmv{CL%MwtsH4J_U@(ZRPU)%$| zPBQo!FpYH!%eq=N(6aMj>P-RMB+5!yR>89BU>dE)VAn_(-R;@_$!NT)_<3u5$+B0$ zR6GYvqxFeBd&sh%E&IbVZsw@kbTHN8vqfHLt>Y})xhGDY9+u%VK%N-i!STfN?b&sf z@zZ}AeSX$U*u_%|>OxMZ&Q+3J?n7l!n^P7`Zv4W?p#G(g3p?Ahs-&9jXAd27HQ zfT@-{Myoc2noiHUmX)=vN^aBwdb&1@DsBd*;y%_Pw@XxaFIzUrvYBA2T?MAvL-s89 z$x>|+Zf0fqEXytms^S`8D!#*>?rGVRma&plZ=MHJ?Yq{t$+FKa!@34fk%5+gY9Ca_ zk3zm@jelB}hL%q~R5sYU0j!FYTYN6Y>#RQurqvKv0Act9_t1QMb`uzeSYZ3i+Kz#h z72EIDRt^cOvN1MRP;D0q?%z>)HD&zlE z!ubEneDb|&b7c={o7U@r2IC6TQDLCMWWpb@l|7IEDq*4T(;8&gp0gx2Oa>n2mS)Q3wRMoVFHQ;g{i=MVCSe}XJBDqH{ip- z2Z0>YdKkz7mA=5az<$6yc;*ZOvPUx*h%Zn(Lx4H_DByD-!(n&RbAW4rh@|r&5P>-xfK!1RfjH-E0)7PC2CRk3 zA0I8xX$ss8oC@3noCo|0xEOd47)HJPEik(T$RUujz@xx^z#oD5n3;17h>x8)r-4U+ zzXJK0zTbcsffs@8P|u=`nDZbo0oWTD25tnV0`~#)0>1@DfOSz7Mu9DWZZf_c-Ug&N z40C{Zdgi zT_CPsPC9S_uq1E@kW=GmGUU_(jsV^Sd=Tm)PUw4^%CJfWuSP*x}e6>)=#prpLn0VldXXsZPveIzP&qH&wpiMHY5G z$640Fsm_-k3pT|q*5vr!x5u!`35<0*zW41heD50!wR<*<_bNpokAShF#|OVXh8Tje z%Et%4J%&vlz*z0$gWn#*_rAd}X#v}t9>ex|s1@{bvVPIad7ri250kt*B zCq~WaiBb1?He+q5_dMGyYeSXh*<#lAfwiIH^8EWO+ZuOSS+#h!BG!gl#IsehwwfNp&05DAZ?q0kadE0^4WIt>{JYuO+F08i)^=aqmd($UdI3KcH}Z?4o^6P= zu~DZH9BXaH+TO6XS=P4L+G5tW#oG9R;PiYPw2#J4J{cX7fa&kPPem(*B4+Ya(aeNx zVUxKP%j>^?N}5z>oWRJo{B=i-mY zD9q{Napt@PYd=1E1scFCuyz?J<=eGjig#9EC zOKIeT*t3BZI2$z&q$cXK`M~->o@fYs8`uJfjmUED0Wv_={x_i*YVA*^wLe+dVg0B! z){koAG?Lm&yxe57{) zur%xofn|Y9fR%ul0?6UC;c{SY;7Z^vz}3K8fop;MNH50fbM67+ktx&68-Net_a-1( z!P(BoAVXl-2IQ674ty1ePDsu);Ag;@z|Vn;fEdBf;dWNLfGdC)h0fUlM7Km*zuy2e zkeL0zEh*UYSc zF8Y+t;S@FJH|X-F{2O&5r>bJC#l~=9nX>D?2{SouZ0gB0^<=u9Q*C__UYl5?EzjsM?t6bZpNv}|!5hY9 z^~Byz17KXw^Ju;EpA*5~oXgKAI?0t{$s?lkWU6J=u5gvuHzT7RL#^9OZtaGGOluRe zuu~d7sI9!m!VXKP+G<)`Q)^=xZJ*B^*dA_Z<|jqD!=CTOJDnwKikI+YYHQwP%u9Bb z&{>U==|DJ{&XTFEFMRE6aIMl}tH)sd-2d+jR?-|87nQBU4}6Yyb2g6uB3wElxsoaS z1xg*Tp<-<0_~=aLW(>Lce5h47NeVNPOf!-!%yDbahM{d?VW*|3+0wf@)pWTKK7KrnU7?ek7PPUs5W+}d;TBhqkOOJzh~hO)1t5Y zvapw=f>}tWSx6R^$BWvSnQANNu~f-SwbipWW@fK{%EB0CMN3~Qg;@WA`jWXvrnyI^ z6QXMC2><&2U*%r!InjTSd)K~=s_{|*>@TTc?vZKkk%grTr8Yiw)b@wRQk@Id<|2*i zj<2v_XW@S+fHDVMYrZ!JECmotW4tUR(<~&@4w~B7K^ydcm4&EzOPX#={>_bi?-$_? zzI?>09wdeNNT&Hnrc=;rDP6o;{(0Y5qx(rk@ za;SvPvPh;GNv5HzjiC>Xy|o+*Rl1GFxfF*lSLxI1KVbUI;vAel$9jV4)2kPlKE0j< z)2G*DFnxN>1yjW`Fnx|OAG({2m1xdwFn6y+J8pw{nsB>$ZDmyUJbh+Wv|X!_h=;a0 z$n>d87Iq3DwrWfBSlB6RZC6+uS68UJ24p5Fr zn^CY``NSgYAJ-XW6&xT@#bi~K#Ob#{S?jwF+fn*%;aaersnUzdW|3l#Bz|x;5jsG& z>9F%}&dUxGaKnpv?O)CxE>EA>Xuvup{9W^x^A#%aj5ZynVZ_g2Z^Rz~EGJ(5ezaVe z5o1Jlhs?bXg6SR+5q@c6or3bG(yejxW&yJU$a~R?@U`gQXKsIz{0O@WPusU!KFbg;jSQoemSRaV-yPPJ# zcY$qzF<>VkUdGC~mwka>LAt?!*LLL%#8tp2@Ov$=9}us~=5WY;BXA@Tb0s-11M#M7 z4x4@3fD3@zfu8|C0UifpCMBmd67e~(GVlu^^PT5;eR#e;`vMqQ%()qcFM(}=Ujgp| z?gg?lfmc9t9sqs=>KnT669I>u%ovG#WLX zKZ=&hxB<<7*J+DbY{Z`{uSBSgFYKyq8`uqI)<@C$d^|M!0WHqkE190ev6aj)59a_w zV`JSmV_62D|9cLE4=1#mgqY}sBhw2<7Iv7EYU2oj+L)7S%jL1KQ^MNHkj2VwkKXkE zJ$EuQ+SrWY)Qo0~+L$qFW5%>G#XtL38S~|5QEa{%&zRe>de+MrGR+t=Z5XMI4I{O& zVWc)TjMT=4k=ocW5?d_uyYLnNe>11h-e_h9=hd~;w6~d~HfE06m^t^G2lxJ~%*ps# z7lvx7xqX(+95T%uG97|f8;9W4_M6929cGi-xPnyOF`LBpe~>wHU-kYD_tgNKLlbQd zsf{_LHs;U(6Z`I8<lJ@=BSOCGt7K-{C{T-DxuisAHr2H-CV5}+T0=2+#w4)eEO(u zhR3i&hP5rRwoTTyg^aD`g=l0J3cGyq?z7X;YSL3{p6FK0zyfyM%6u@BY3rB_uUI1y zYI}%m+`aB4Pq+xSe5~o2=y^umh)*l5Ph{#7nfCeA#y;N)v%iRY4qvHw`CPPQ!t43; zTTI)MT)u1cO%mdG++0*Boy=dcYtKjJed=)yQ`=QpE5Y!gK&D@*A=9;LYGd(Oo6i&+ z>sG<1%c5>*tyy@B%l7uG*bWMSFJhE8YqzE(#r9u_%C?x}^SHG$J`}&Dl_Gw#5l@>= z+mY#~D?hwEGqC?rd2{Axy!+ZE9Bx>d)x#5Ia z{~}v%NOt8#P05z+5*D+COtXbdKa;4oL&%ox{%qNPdA7vx`HdSHeaVcS;v+MIOk+=` zJ7lRX2R`n+EHh%6VRz%DEcnuTLZ+UOVU`&QR~rW?zr5U&;`v-`!4of8`>ZEq>Is=n zeyWXSexLb0zuPxqh~!;S)8KTt03Z6TPUGSJt?7L_TpBQ1AhzIixV(f=ypY=><68-V zxkskCN2WVVs*QKww`NQs_rZjb`E+)qNJI*4<%nB4p=@PyOT;Y|>STK0Ct#?;?1=jr zH)4M}>Rz95M8esPaLDxDCeuw^)y6jIk=UWAn;60_21i^ew4 za+;S}8AaSt89&(|$TSEtY|M&$R$FB9p3X<59gda`8 zD+H+H(7)^q>GwRSUHY;!*?K`NLO35?g8Os_SWZhGL^5Lk*A*m(&o z?{?|&uZ3*k{|YhTc^L6T{ZWO`Ssjdx{gtVC7!l~5|5jjp`xooH56 zb1N~CGK+b>nv|=2)lrfLnyU#9n*S&~tT3{=yMQy8H)Og`%M2#^-OelcGSV#rBl}+Jrx^%#WvM) zFUq~~Nj)sproQ`F8oy1Y6IGq@XmTA!V=Xo?aQPnF z<~mYtjuIX;;VgkF0NG%T*j?BC{Zbk# zh;K{-nWljZ9~y%nYO6)2Y2df2G!6W^fu>>mzez*u>s{&H8K$91hJ?yAkZBsou$el- zQX4C`jQplya%%O2Z@p_iJULZ9N%UHB>IH6;_*zP8#b#B-Gv+3lUQ{yO*IjKTP?pp- zyrDb1P`lxME97q1vh@*&oKEYKF#N^GrQJ4~&BUu3;Tmi(%^SIE_-xI0Bd&N&35vNz zrnyCi4PvbAJej%J(ybL6eWQCil*Xwy*SQg99j@e1ZhJHFCbuM>y|J6zN~!9iDdO1P z{BV<-Sy&BhVk!$EFMjeWnx;*pqPeq)M6bWXM8b9EJwpH3mrdLk!iOX!KN{Kmco?jknf@O)+FDQTg+U+O4rFR8Vp(&rwNm4E0OOkm zuJgP-%PDYGECTyIpIKNmPr519Lh`Iy3(2$F1Y*5fc()aD>2O9PNyP*NO{PQPWcn=+ zwQ;bsk(Ua6#9y9@UXqH^dWxygr$1AnHm0JNDcQy?Sy&B>t};gV{C|t?du_ZsNTPeQ zjV_r+mrOqnsWuJ}-prDCS8Q54cVH+@TLzcMxxePTo?@J}(ZD#Xjd51SoY&EH=KPZ= zEt>OsmPt{@q@X?U&pCgwy{lgxkfb!XNg>mukm*;r)y6Jpb19m+*bH!;awhX8Z2vMW zmt0t{%Y{!#`AVs&*wN*lxzf{UC4sPzl4&6&(^rDk#;0K`4TKN=e+UF0cJc>OyOYZ= zGf5!rY#?MB2${Z)sTQ}$C9G%I9SomT-C#!Ra&LjW(Z`V4M9kXC z1|+ByQhlS-$ zAS~*TJOk< z$o#`5_b{#XGKOibcZ*`|fnn~W`W`W)vgQEbVC+066}S;t8u$^gArK?!@*Xj!4s-hB z_a{I;89oJaS>{gQ67TnV@An2E-muF#1jNe(Ic$}G1LVs`v?D>SommK7C(6h)_sMij zR&8uBtBpevYCB_Xtm@PzlOM6UBiwQ!@73+w5#$W>R35?~kM9xtC=hEVbFK#d1iT6OGw@E} zDImK8h;GhY;IBaD#_zyQz_Y-^z;nQ(z>B~%B#3r~GuLJcS!yGP4LDN$ny(n;ailip zh1$-0Ot%tI8@pa}|EXRY`!WWC(-um2tdGd_&R_VCbx+S?skK9CORa`XHA`cmac;FF zbg(lgqH>sP?wsge7kb@{17vVA%5_o_(M*6K#VHE5Qdkws?gmRWXD8x%rI;d<+>-UT zi)st(I+4p4l$HGo#xZ->xnOPilHzBJgS9h#CZTfbYhIm%TcNL6ArSj&l3P4M>Z2-1 zaYtksk6-aVPXXX>K$d(g_LqU0GeBNryd5knozDSp#P9P!)nzTwc+96`IkM#8s}K!JZoESZL6(qv$bur zwmsIi&)SY!+i`3A!`dz=%SJYYk(rvh{2mK)!v)XA9ji5UT%V-ws#;rJYvUeN>aLl! zwXn7h*4D||`hw+E5BrJHTr8W~IAfjMjJR){A5(aP<_4>dTLQ1%f^o<$MOHZ9WFDC2 zR;s^S46IA{3#$y4j^0Fya~0T+Vq=5+H(|BFxI8|^$pXt`woY^J%gcrnwhV*;BSF%y zY&%^#e%+?yhQ)sM0a{t3JS$Q3TMbA3x$U>Yl+iXfRVR0duHyc*aGSRMExFcUZiSOfSPkP)5< zq`TR`TEI_$wShka>i{nR>5f-^E3Su5P?PB+iY)A`2ss_)bgHukF;wHn9!qu5%JFPp zSsPj|o()fZPkX}J*n81Ha+8f;>=uh%nB%?_!kamx=DL;A_$+pv+z@;Pmf}RgvP|`@ zxr=6B1L`8W>G}OL62mSyKM{X^|I1wogWS{D3ZF|1 zO~66y@ps(ZQdG0&xh>^cSrCp!P>ADtWH3X%0m#>~8URZI@$qDN7UILjIYaULKfoEl z+kkAFwgj#NwgDao-T`FMY!6IEDyYu|ya~whDZGNr5}GXzs=`2zcx74lXseM-Ta9F4 z=RLSm+bWNR*@*RQTdnO&Yx~;TSZGzt7M1$f_<={enLLZ#LT2>5{7L5Ee0O^WFEmz0 zAs&apQXFDGY&8dzM+pVFzHlQ;NYUVT*h}HzKc6gTxjqv!BXZVv zKGt|4hJNI#gmJE;cm7^v4(WZsdO!^2ON-Dfo@S>F1`MKO&wlNobMa&?2u%k_xKgQ9;7HS42hB4L4f zPvJ{}*x8udP|9$<_uP(w_8vY8EE99j1B)ZIc&%NwnH>RSH9HD89yl7v{TIdpS%${} zKL@@JJPUja$g;Ws$U8X(ydAh2$mZHwAi99r;$eRn=pox}Jn;+=UrfzmS^W^mH`6u( zStjuz)SMrHn}IBkp8(l-*aA#IhTxl~IqdQ50CKS<&tCy#MEGjZVqhcS5@2gqw{*}R z2F93;0j8ic@J%3Jo1O{eLL|E5z77+Bvw#zUY$v`7TnohafOEbCP64t#NcSu+eB|p* zNv1a?8Omsa(^O8U$~Ozt$hfOR_E6MT#@Z@a8zjNQG${UkAT)>K>LUROUs z+9zD>t0n3OFzp_&9#K{bjLQUFStoZ-}IA ztupIDLASar!)46=Dh5p>Y z@=T9z#)-2)E{et#mp3i3{e$#J@&iABJq^ejxCrnpuo#f#n7>($`I}{-IFQ$$0r8D2 zp05t1z80`FkgeXbz{gphuLKzjLvU;!)A!u*bE`Vqm}ItHL@L|4l$zO z*)CdJD$=Cx3V2Kx^r)>eZD!$m_q&9pe>;?W;6wKtJCs``7j8IhQ;}(#icF`e)yCdu zt^zus{pH{K`Q#=p1@eZ6tK_wQlBu6$xWZM>~mw=t;31 zo85E?>gdN9J1=B|BGaJAbY+^_SUDFmnOoe6g{LB?Q*aWc5sqA$I6*E++y2ZJxn=Wg z#XY*gWNdY-B{a-5YljxBUgzhxggVZ=7Dh`qAR-; zekp7>Y+O|5I$wiTlsr3P*-v0sz?LF)AD3mIfq>YSGbca6fc^%P^(pf5lxYv(*DCsd ziorPGM8(*9pSo4G*#n*Iumx~_!oW*9d^rx}1NQ`w-ItTVo7!&Zn07or z0UHXX>zoEd7qsl6{OP9ME-9w>?~-Er0^zWkB@o-V%dHk11I|DPlNnqE$PBw0cs&ps z3CU|Y{QWR~R|n<*Gl4^Z4S{T5(jA{P7|oU)tg!Krw3u!Hvc=Q@_^0O{{$DAB47ucs zfgEno*%dPV=Azo>A_J=zFd=lT%>GFQlg*kh-TsN_|C_R#lG9AfJ?^CBfhSSdnrR=W zFNjV3%H5ujm+d&*ZO$v3-wvBzHB-|=`_0&W?zN`n$YS};hz>r}ODWzho zzi|^np*v#l??)De?vEWf;2uZ_jW*N2aZASbA9CGr-sf=N7K48k^3Ui${siikezBq_ zus%dI^todoTQA*x)#E~7Y*ZX%mADi@t+w_i9>@($* zhADMiWApOYY0>em)2bAz(7Z(^Y|b#89D)ioC6>`TZDS}@!~EPPZFt5`1bqcgPi@-< zJuYO1Q?+ZiE|1?|p$$bNAxI20Ku}kkH`}I_{ttZP_6!amHzVkqQ}xlV_x8P)HneTU zdAz@IZc@9a*hJG~_V^8^+ggq?aE9RO@W%(2xvBqGH*Bvs zQ>`1QuBBz5-;!AqmSafZrLZ2PKX=fj;{}#k3!GyO>IfcPL!ah)sZG2rwJ*W@#86qv zanx9OFX|?kY{hl^z;verlIizU?a_K8gRRH{}?M?ZEU{=84B9 zl=(}L<3z;*!Q;Ujx}i0x-s8^y!A!aXv3}-`w8EhhX8Rp!rCE2&(QIuFI_`0oElqO! zw9@7{9S$(pkymJ+Ryb?yQFYB$)#XWLGdVGo;rUjj_Qh{5`L^|_ncW`Yj)oV-lYdk< zuLiuBjL&YT6?f}<4kn8OI_~?UX3T3Q&z))IOR*`J7}}4EoazPln$4KuKbjSDQcIa0 zcczu9Gff;~TF=SjIh<-8Zt_BzsyW!VTfe@Zo9Sj1LwQ}qBYfiNR-AIo^m-eil<0s^ zW{AU`zUaJR9X2|qp1u*dPH&n%9ny-o8sa&46P{e2p&ZXj3{~+Wm9OibK9@3dg{PvM z%T=??*YLLZDbE3WX>j06-E0%RE3JGMo4<)6rY>HjX4^<-@NtY|b|7o!B$)ZVQ_E$s z)0Y@J<5SPE>Rq0CPCz|Z)pgzxHOExqVb8VdSC4Dha|7ym=95N<_=cxgb4ExP;MfuOldNn+>~ zU(m~}`W`k3a4ZX`mz(+wnjf4<47J7oc&e9M@hWyzaV!srS9+=D1}cf6mA;@?T6L-4 zRlPExUahHKBjRN~@oFoc=!sVc#B04&zb|SIL&YP$)~XA$xq)MCK)p^=&F58Os3rc# z#p|s2p+8i-E+Ag-rJ9|}#E?JY>#h33bE;k+P;bywZxrzoU%WS1@%86bydfao)fi|A5b6EpuZKdzdAZ- z#cm!I9}I{OY0z2UiQ0d;4q5eCPkkt$KI}#Odr?2@i}+!yj)gVs!vXaX^G^4)@^yX? zF`nhNq#Uv08XT3waU>usp^Qh8N;G$1~vV$NFP;o%b>v*OWQ%ZcMy zKz!WXdq1LmLd56cDp4GwGj7G<0xCWp5T8^rXYLY1o%!DrpS0r6p7>-yd`iU}uhYj? zTztxkS9#)70r6=S|0-e@@3{E16{i=}XrB&QTrdZNmiXdUDZheb&8qzAcD>n5T{u23q@6& z5)kLsptJIb+W*AMZPiC%+Z{>WT9Q#05>mVGtJ*@iAY>1+92FCuDFG42UBd za#Y0r$4#){ zYqYtbEivSOWTjj2FP=C(ATFlSE-qr%7wuwJ{BC&-xmZA4LZi)9Sc#z{a1~E;2`esf zg^EiA#HBRarA6$2+?BH8uRL+7fVhlAJF9FU&1I~3BInLL)7q$Q1 zC}-7ARZ?}ifVx7WY4|wmlPg5sHvwsva4;@s)gjicI4T6x70tDMa8p+jF>n2NmQ}Rk zdpvQ)fVgs^nRhKZm>Hs;>{C~^>UTVK<$$`1nf@pW87B!Z@26F<;;tDQ?Kab3MFIX9RXI_(qJwc-KQG}?6o;(8h~S5hX1 z{6(yu6*sJ|;(7t`^%^o~BQJl-UvI@HJn{7baRU`M6tTbhZD7SSI2DYeK|tI{qkW@@ z{mtJ-R$QiriW>#QjZO9wDBL%R_ze7y-;|B5_*GBbI3R9f8ur5-eY1#p^TowYtazIz zZW0hT)gqR4i>Uq0xu#a#yr#yxX+Yh~d&u+SONk*qkK-Qo+^fhqSB&Z# z$p(?5xmDj;OT%s+P`8j|*SSr^959Fn-NK5W^299y;+E!BF|^m0Wo@l`SRGZj4XE2`(07PZ-bZK;1!uzDvX_ec}#QT(O>tI|RfXy`b+FwZA^; zXw{SJtGZ)A-AQZUdqjNN7j!2pE^~v5I|am@HQx7%_!XbHvlZXhK*gN{;x1mi?-TWG zpSp`xf7npfT>|Q^8t-l*_UCt3E57DN6?YAYyKB7f7jZvd$la|trLl^;2gE(RcypOW zVrZyO-NUMX^VB^8>YfsGod-pn@HTbMmzuQXH&j!@bo54enXD^62cLMHBDNy(vj}=d9t>Whc;-M;jQN*X= zDlQ&s#n-h_@z8*Hn2Lvs_?S;T%!kYo2rGW9t%f`zARZ;+td~UG z*(V-l#fe-niepqjJUY<~&OrJ@J@; z_!X@X#@R&2Lw?1Ie{HAnekC9tZ(2Q%3vEQ)*B9;aR{X{tDjpvYPta&j6!CeVc!CwT zYOmr60r4aa`Bf25^NA-}@p3K`!Z9fzo~$9iCgL+b@nkE0f~&7^Ob&>rXvkAV%u*81 zuqjr&>n;^f35cg@e|oxz7x=`}toWslDxMY)zwX_XZ;0BT-LG49&%0IqdO$rxFZ7!t z9_R~th86$liDv}FGbPbkvqa2`5>NC@EAGryYB**F#IqC4+e1>zWxge9e}2!l>d!s( zY*EvnO810Jt9@>f&>VB%B^0u^MeVQ1=2&%;do=7hfw1SAkuO60j)<2fT#EQyEB@UR z&kcy@X~^?MywaEIc~<-o-_gS{FCbo^Aukm15?{y*thi_w6)y;g7il3|EaJJokQZ6; z^Y^KEQ9!&zi}$-CF5?S%i51_}RmDpJ;-y+lVj}iGvX)x$@@^_#8W1m2@p~fnw=R}h z@e|!uyeuGIuHqFU_7~9QR$TRd6)z8nSDLqm<2tVrabviO7tobf{Dvo984$15kk^Q~ zdcq~~YAepyLqlF25U*A7`y$@q6R)-6gPwS8K)g=HABcFjPrS~Gi*t1&j&%X?dQ)g5 z()?i{+Uu>j!-Fbb9}sWQvb|Bn{_DKKif4J^4FT~c^C3h2NW}i@yvd61dPqaw6cBGV zrAMJr^s$J~!&UrJZMNd~A6D_^fOt!y$$kza=37PWzbCg?b&p=E-V#u6OEe>&hkCoH z*|>;@z0ImO^;Y$^fO>})_9voV=2P#m>K>1(dPhM0sfJzWGf|)PsXw*qwU4R#(|~%X zT&}FoMf{3Sywi%?J+9)N0r3}J#CM5$v`_toRiE|LUj)>gsm zPrWao-mkUj0TDmz3wpm5fA^FIy+0s6Xcmsa4f3ssorFvAK4`@q2B`R8KzvBW--+1& zxIARVrC2}WI1~^cR`K^D_LuO(R=nR69}b9*sQ3pF@Ajqnh!szHT0=e(5Fb_Xk0M^? z6CbtW)`L`hG$1}^w!VT4`$@$9D)^WcZ}Y^*0^;K;J|W_j372yFxD|h#tsx%|h)=5c zXA!UWiBDQ_i@_>B84#Z`gU2D-zlhlNiBDPam(Qs9R6u-M#lMQUpig|-iXUdd!*Mzw z{>^-akh6XlvH#Ba&5F-Hr{doN;xmcnwxQ^6oE5ddLO5g94W3u^nSlBa^U`<(eJ&vW z!-_9@;y(i7^NHq>NthJ+GoU_i)hl1npw9=?7ZOdOVW_|_2GkdT0daZp|D>a}FTlHHn zsX81`=k>zomK}+qroOQAT6KFCKpc4kYP^aoSzbWYjeY9;R=vYh=MSh0YL*uY1YOXI zo4l++7Yv9an&ow(fuJK+U2Tl2BLTH*%D#$vAx*?={Uv)j?pkr-u_|^0;=-oYVu*`~ z*k6$rw&K;ExNtz6t|1o{vA>~^Zp9DNj3YfDE~aAcs*)J;R}00gxcoR37Ym3>h&ZdH zh@1P;T*8V!_rxUv;!;U6S6rvGsQdcVrL4N~cn!K#KwU<2tgMJ9`^06e_(M-zCLk_n zetr$vU0%eM6D|!nm9ygOjD}n;Ag-X|D@2^`6IZa}6P~z2KwMG9l|;-30BSWkDq8Wh z2^w<6fVi@XGepd8aa>&4ivKfF#gzl%Dk9FhQp9}5#Kl#t_@pPU5)faNWKN94)8lGU zAAvgAi}zJl-C>djeN{kR)x19q*Q;Q#6ITz2 zYk2XlDe6PMpleulpVu_#8Ub}JjrTPo_P2s-S#jejDy|g}*VcH~35aW3aqg)qt{o6( zdGWqh)c!tCmR0xT7#NPMfV!^PJ{?(horwJ-Wp%B%;dB+(4T$S$&{_2Z>Uvgv&QsS5 zsINyI+7Hj$8$_Li0-o#@l^#OH*BwZQXP}KgatbtYk@rJ4!1k{bRD!Wm{ zWl+51K{vAEp)*w6C?LiQTW=uGZW3`*U%VSzar-w_+&Ca^;>G)BQSXJbc+gF(y6#L> zHwmblYP@d|acBIGiMRvE4Tzg*yl)lp5nsHUS@8|CRopBfZtlhVKce36i+6LY zp81xln+Mb_G~Ty~xUVnXEv$IJ92K_+h+9g$>$DQ_NngBMTJgJYtGH!A+}h-tnN~it zjfiXc#I3Ek!aFK%En=3z$KLTq7u%Z0pssVfsQq1@wpKmHQ@0HS-Odc21@Rps-hnWZ zz4G18ikr;SpxXt+?NxlIi2W5|dn^9k6SohDJE-_B5wje}L+)V3Gv;f^9RlKxBF?&7 z#6x}Jj#hm00u^@*h&y>V^*y5Q;Zt|A>V=-VQ$XE0$$T;zRl>a*w(n|nw(2qqHSEp- zbr(;4pQ!u#)LpE)@FG=r38=ez>TaTb$fxdV)wvd{x@$n)-BaH$>JmP6cdI_-sk;Z% zJyc!i0a5#Jt{zssZHb26BcSeSTFpT@dr-vHeL?rM;@jU88iXRj4PPj_; z?yX0y`19o|el#HNYZ}f&$d8NI@rnCdaU(uRar9NO@4eY4Ora0bir2c^bMOQ_L6+lq z!m~II`-VKm`795F=A@dz*QAz6crwX^rlFAcli&}*T|Dkj+TfRX$|nPH@1JDex&`W| zL|wrb`Tkb@g{STxP!C8l7ssG+Hc-@jku4tf0IM#)N|Qbypnlr4`VjdxNW}Xgj<*Y+ zw&EK-@zViuwq|;ch?9Kr&bHz%o;W)o9<1VL0^-3|JjfFd4v2@CUwOHo6*2Fk_$#7A ztay?q9ug2gXKtIHR=(2nB3_RK7eTstJZHsQJ@Io%Wz6>ZX=!HOe7sAW-<+F|cWDoi zH#M0H(n_aSSEcjIPF^4_BaZXTYSUu@UYTvVAgyr1iq&Qce>{&Lt$tgrS7JB_L z5fYs{J^vOguZ5S~;{H`%qbj<&Ts6}Cv>>f`T2IfxNO3?v-dqzhgD<*85=MC)@|VPa z_AZjWFh<$rzVFFL1@daN*CBs7pdM}2L)L2SMhDbm%nu83nZ}B^0a6nWdW;p{_`ZtA z1jMhXc$|pq`NXeSand>!zY-9SH?J*1$VSBeak}wV{Jtk19}rK_rp-hVAM@qd1S{_Q zfrdOGAjU*BJM*uKn2*I|FS{pM@t>Y}Qb0Ue+eNR5*kA8Yw&D@%HRQ{ zW!Mxee&j3>w)2z7e1{F^Wh+o%ezaioszK~zH;=CJG{CYq=#YH!(cy>TM zN4w*1i`YMkFvp6Aeyrj-0r6ZFzawJ*D8gJTuE!Q4j=2HxJQdFuaX~~oUT4p<;-5V6 zynuLtiWiEQH*Q?Kz=|hr)sPni#EV3nwOGW@`oxQ@xc)X3FA9j4B$;f3$K1Q3?%~Vs zC00GlQ!fdqmwJ8Tn5a)8kYvdoe&Zs}WP?Xomj=|!j9G?a@}7uK`^3wvc+Yl?__Ba_ zx%rvm6)J}R@$i;g@ys16ULFvyG`GHop5-bLSMVizr4|3+iB|^1tGy=Z8d1;osaIR| z^`B_as{`t_p89=JPw=VNTJJLTjulmV*T+_EMy#9dc-jOlfw8;=9_RokV> zq?^kd9iNEm3Kcn}8%4)E=AKn)dC~@W5<1YNEZOBn^HVc!74r2nk&b}R$)5aE8_kbA z^`{z5-?kS!%?XM>7jaYg92f7j;==51;Mf@uf1x$rE)n}H>MyMLD^L7IK)hSUUy9gY zQSY|mm%h}HcL&6KRQ#2Q{T1~dD{iny#d`wcy(<1%#QutUuND8~iT4J?`&9gmi2W7y zJ}Vymm4>`8Al`3M*P_ZgAYy-if4>#~;fePL#0R|_|65V}tE_`o-D0l>eK4RtGM2h>MA^$()Z1Ymu_TlE8ai=5iQ0v;WbgJkX4S_$^)XfZ?&9NS@H%W8)A)dTe;l4% zzHQ72ler%E&q?t;-RJuW>w6bZd?Mic&)Pd);W_wOd}r)F_biT6#=F~p^;sSW9m}h| z<5Su@uJeloe+bHW;!fG%(++CfPigSJd;hfdP=6Kieu(1@meW?8<%v%R#J_36e;2Vo z;lEjNdr$mZAmL{;;R`(nXW)reY9D)+O9}tcXL%qL%BKlG>m~dT3I32T;b(2|so!eC z&j#XtP7{7!#Qubzv*N0r_*_8zr+FLw`brl>JQvZ9uVVkxid%T%Khei+{&{-Y&_z>Z z14;?6PGV>$c1Of!oN`>Wni-zvVj#0Zrq717;&rMX(&U8T$>k4?1o4*JtnpaBZ$RgG zb~;XXb9O^oC3AE`TK5j9e#YSvKRpvVlEIANZ zipk!XRy@0d=O9HKU^_9{U~EHfeAWROlfwPYGP#*-8^5Inw=-+tw`6h;uy3)!)+JRP zSbAS(q3R;`*SqBATIS!&ep3w&7vO^pmmJmL=5UJ>y!M)BdxEOmJO?zqgv&D5^P#;8(1x>rXlYy zSs3Zm%PiRMt%~yt%+^sR^LmH%+P|+=F4OQM6usO?Hg={$Sn(!XE?!$XCV1B}S8^Ga zEME=B z=I706#Y;SNL?c&FBInPKLdi1ZUMC{n`yauDtoPGBb)i7qqGs^Nc>22{-r7P_xG@vf7L6;Em3}4X2FNu$43Pb7j!vM`~}G%m2sRn}A1AbZx^uL#8vCNx}q@&^>`{1PFV=z6l`<`;rjZ zmn7^vA%uNN5RfIvB1-{+1QAeBRy81?K~PXsa2Iij;)05bE2v<;`_$=ah78a1zR&yq z-}U`{P0xM$RGq5os#B+`tE;MO%V4Rmho=f9|GC6C-yJUNNI#{xYtJBTZ8Pd&M#!~& z(j70Qq9GL~(k_JQt?EifApSjf5N`&v)d(iu=ML)GM9xm9J7Ox02;is(`MYnSz9_he z3~C^Qr&iDte0?+c{f2OTpHwzv;YL!JRKg?N&=fBGonvn3BixvU6QuBmes_c$o5H>R zVBy9-!ig;0L<-Z=J5S7srf`)TES%^g+*CAu3kIN>6!xydO-e`aVu~dnxQ)|L-$}8_?h+j{AIsJ8-&_ zr0@x^baya?|2Bj>_y~98bhk>D(g|Ma?r2Isahs#==p&tC+;ysyCPfAzj}%i{{KL{I zKGJDo=({MbPCmkErf_083#a)AcNQfiOdXv{mS?INdA9x|_n)tsHZAAK{)N>V3rAOA4Ry67FdV|6&OD^bzhY zgWS$(9mcfHIor5mX%o#7*$$v1t!6xO_=&NPMh z`?GMSk8ocW?k9yw6+y_OuPHpu&cc0tg!_x7RHp|>;j!@L*|WC4DO_#{_xBMVC_X3Q zK^!yU^u#>S6mAy4F%R?+9xO7-AUwp3*&{sI6rO1a5B3orD!N{R@GvQyjVL_ALrvj0 z2gf|rM>vaP&h`<`GKD`hgtL5vb7ah|hD+fgUNPsG!V78de;heJ!Xs>A%x-AONGaXL ztE@(t(usjAJ;FzNl(M_eqkM$Ni2ffzc&rq5p=|~sk1?ijvmlOn zjF0d*X#`u2m%`_~VjgD-cMN9XaX!Kmg!3|Dp2))R<%xNMDg3)3Ji$kJk`!(=SqgjC z=t-vVKb1M=Nj}0;Y~mDUcdnG)>J{}AQ`!>3(o=k-r}9nbN#XTgH$Bx9{@oCs>LWaj zh4ZEGEHB|{rtqdJ9P>0E;pwcPGo&zCN)(qorkldnsw_O+M|dU+&yvE_mV1O}n!@W0 z;h8?dv&F(sP*!uKFtt~nuE}guIGV=nam@A+o+~bs@H{E({YrSQDLm5=9|LJ!Z_ynKEefJ^`{UnG?VQSE-;0^G=vL$gcpi!pF#KmDeV0+dZ8&i zJ)C1+=p(#{V_qzUm;Uzx8OKsx99w_%R zDNPTIAmp*sl%7m&367;c(#tu!SNKG|+!U^&v+!~s;UX4ZDTUwlin+)XK4b_N`3OJ6 z!mFe(Ww%E^A2NljxjE*Ce1unvtk2PlTqA`kyFDWjt4-m3hVW_@_Ie~*YZDnCYVKwi z3?FL|3P<#_!MQVJs7J61amHDSgXNH+r0iwLVi=Y)DYexg~|DHYkxS+`CKwKF((N@1)QXPo7fQ3~6{%rB7_kIEEn^-{lWW{TDug4=vUtxMt!dDp1>>SCd+#%EJ{b7g4M9x zx$L>)y=Iy|FogH|r0FRs6+^m%BfW>- zN$&5_Vk2C|f~(M=MlqcB!<-PWv>y=%5LUz(!vl>t-<{HDxS4rYrZfq`fRM*CW=gjk z!q0F@z0~hH7A}#(A9~f7=S<xzQ}{VU_^6NY^WxWUF&F%} zDU30Bc|30lt2H_1=cO|bYq2d)N^$R<+D@3_dkpatK5@Swj(vx? zUzEbsxOyu33#RY|L-++V?#gji(J@D_mRKsqG)}EDJ?=VQ3vfaeB`c08^25|>h|%U4 z)>B53Uy|bVp$KS|JWiRhmKfrve3E=xoc$j9ct#3S?+b)HPMgA44B^u(?4?65ic<)EdL%Q0Y8L|wp-FgVimP} z$?@OA4qGa9>C&Yn_eR)TA2&_znbfIQx8#)Gy^=b_rF5Fsq51U56DCiYIk`jg;S8VD{ z@X}O7pRl-v<^AxYDn1EFS~qpAE|Nz3g@~=W{!X#U;n!-Z^Mmjb=Lgk>wzW5H-l9c9 z>t?M*ZWT?d*1UDAXgabTJuLH-4Qsdd{`wf64aN2t3GIBs8-W5$cvpb2p@ACEYgWT_zvGT zVKAnjh}B_QP3zPl%)dx!nmYuaK^-dAglVzX4MW)>`X(H-v+$K@u8@4~dPMtcZ@IAv7Bon?aIjG#4rYM8+MUq>KRrlp9O3fMKufMcBb=M3Z^UmFK5a2elugoO{l5n7HyhbB1|GH9h+~eC`njMZ=Wyyv zZzHQW;~Q7w=5Ya&F@0nnr?VB(d1M|wEIMDNa|tdJ7a-XMNDtEKF2sjU7m5Vry~zGY z^Rr%DDBAx62YMg-Ez=IX16JG*;6ru~2v-dhWs3(m?0f_^6#TaqAztw7FJ}G_@VhR? z-0LOcAo%{}OQ3K|QHY&`YB;W26=m2md~UL6VAIlntrWLn)mR6; zP|aM4x4bJwG5o8mL04KO*2Jli&USDcx(Z)#U4<+P36ko%6W8_ENOwnfxG!0Qcdctg zQWVnhBj_y;BOSRYe|kCk+ru1TW6%NXWQ1ya(5=>S&K^YVP-m>e$H+Eth_D69vJFu9 z4I&{LA>IOgLKq=ZmW6K;^P;ud{+%}|O83o*n7S~qhT|FB@~+K_GH|Q72r28BZ5%Dl zid$*WbpPA7$s{=GmH&&|pitYObS~6M^-)FHyB(p`52~TYz_mfKh(2hmt@bQN$U9`( zB)@#eof3$C44)p`$?4vJ5_x|ozNEEFWXB@iS9YOdJ_!xX3#`HAK58$gsSQG3V9>2V zAKi;IX|>hsd+|}XeNu@X^AK9yeTexfkzSL^_bD{b`%xETQNA?ecJY3EM)aU4hNJcE zgB&mwd|TifH_ae+|cCWa^A(QFls2862%;M>!t({_Ggj!3e9GLDP(jS_Vz;;W`*}P0*Rg z#Ot+S_-7p3c-WR@!tihoG;L|hb>Pv|uzecXur>3O5Nj+FdZlYjrj1UPja zISXG$_YaA?!yh#%cS>H)L~^MLmuS5H()WJOJqR;+UtNt>T5n8XYp)ZUAjAba(;H6R-a7s&R^nUy(i()5WVa;D{H=I4#dnKVs_fV0BR zGU${kBS($s%l!^iZu`fGmF-|n-WGZz z@qz;%|NYLP2a6+#S_6BKVh=&06)~lWRt+D>w1=QYR>n=vZ_z9(A2$kDG30SQrsSz6 z+7zc1!DlQ~qeQ#*TI0&(I~u;H!+Wc&eDQOsUb|#Xd+i;oH9S$Q{Sp2acSO0gNE9!0 z)NsH*ftDaj~+l$3%ni zPr@DHKKG}~yy!A2XXL27e(9}5_FqBqqW>DTjz~?>YFUF5Me!On!s?$WPOedtYX0dh zJZf~xlQ_VD2y zQB7QyM88Wz{72W`{#&K(&u-o~eh20>Nq)^Hkz0yahcugC_QsKB1Ll1RyCeD4qvINe zJmvm1I%|Y&tZOoCdAa1D-`Cjv{k0=gR=;N-{n6}4(d|ycCeJU~!mZe}bIl0ETZ)ZJ zaP6+-NAa$_>8SL9^HN-w0rd`sFPoEwy5T3TkG6*wERycSbDlmI^!YQDa{kOayXeR5 zYY@NWCq3RIXwHCN)PDIdKtQt4Iqt-hVwEqyMk4Ds72p4o5s z|8i~VOHcRut7Yw<-lKi09+v#}Z=~7UKY9C!B@^oWQ?jltZ0cK*|E`!m${y0B3Z6Aw zmg~+%=<%&-|7wf+QClZ`z7Y06@_$NN7cwqv*4fEvIn}SH&O)VrSQTrKc=x-~edpE8 z6OPGa{+SvTJMFP<;UA)(=r2A$WeabTgQqW-<%64N`cauZ>1b$OmK{HQ)S<9y+O0;vj$75O?>FC}Ewzj6 zamd?cb`iBz4R_PTEhIax_sM6@b#0i@qSA`kpLRcqiCh69Hw(#2hW&C`Mz>$xxlNOu z{$ob=4{lkm?1Cu@5EtQYJsltlhryo}eIS?RpQ-bI8Tiibxr-Z5*)pvDdk0WP4iU9k z4Yw|Gh-m1L8=r88zksW@&41UrymaofJ9=23yZko3=IRus$PQ~4r^wobbS-m|KmVkT zyPAKn;_JDchc$2W;p_$I&N#(SaJTvgio!AW@FtxC$=|*XpX?sh`P(Iny7!NL_8sSM z7(A8y#r|dLFiW$}s~`NTJ=&;o_+)&bXdJFXK4@b$qU#hS5`f(vz;mX{(td00o{P4B zzOQA*$?qQNzXHw0ImyqO|6S*KC(r+Sd~KchxZ5=4ioVF}vV8RJ(W+lW*VE&!4Y417 z|HAu<(kECPM0N~cC*4EenEZR0eM;7sw~C)nJ{~z$QQndKDXW|8y04_=prGqJ|M;xq zh>4igjyHHN%h>ZXzwa>m?GdrRyz}&y$g{Wcy=%$;-u1Co>)_k^Cl6?o-w9ms8alj{ z#apNvP2QF6|J3p8JEcbcml=*0fBmxehd87U*2-lGs&(YnhB=>p`Nv98qkP+sXb$_i z#EVt+@Pdufy*&22l5XE!4Da}Q!5?ET=f8ljV@dw4w!ua7&b(7&MYCH2E=Mdrg_bXb z!h5RIrH48nT04G)_;AOcyS80Wls1z8>&`u|PKx;<=ef9-{+{*6V=yNRB>&QHUrq>H zAJnr+#?;2eU!26fzasg!3(B5L+TVBhm9pb!KJHk1A_DTSLJ^#46PzA!e(k3jtv(xg z{_69~k)e{m@r12;EW%6Q@0UY0lVpu6#ba@}ocX!6%L- zzpAa)mi=pvv|kxABq=v*dlPiS&^ov*?b^KfdA)=4>$Q7w`qfPj?>Kr+QD#YpzuVk+ zvXSk}qUOm_7c%WfZYjz>$-i)WTjJK{zh;ijn!CKcb>nCFvQt%2Op4zyRJg_hCx(it zFWIVDLPaUrtZSj7!#3z={V=hEY}ev2inrF}rCY9Ue?{}uTF1JDsda)oS;W#~YDe)+soHpBx>kSVF4bjC$PppC z)G!gfz^;jeS8O#zS#WTa$LX!BdRH;{Tiq!J&^Lb*;`9`c)1hpwu_(N%M~hW2+vbbw zRfAhlV7a^1ZsLHhH=~P#)%AKF{}5zIKIq1Q`b@vp0qgy;7mqzIg=|+-7_LJ%`v1Y10kg_O2bRVd75nCgIuaIku zD61YE>5)l~2=1}*nqE_sMg&KSy;)il3VP}_JxuhD(c|f2R*YUptO*Tvi{PPJC*cZ# z$EQbVVWPtvdr;WKal>a%pJ8SMUy4&d=u=2G@kb{CO#YM|Kjt)3yYDR#4z;1n%pzNj`9>8I3G z8On=lQ;~g8b%~EpsqMrkUmz7ywTe&M0>!pTcVt7Z=-q^?mR^h8hlojW!R(&~(xIDb-NS++X#k6#Sa%!PUh65B0|4kr7%IF>IjLTr8~>93=XzwAUBz+WPU5 zgwfhuOOWyui~op^qnHWaSf_hN(p-EtP3u*)bN|e%xKfI47O9KQ_$?{TuPKu9HLXk5@?n0%nwAcJ$xq1~uk@Fm z7M%%P-X8oc!=VNQd*BRJn&Q8gq}t-Ylces)e@{I5;oI#)$AYEu>d>VaQa&SWt zRmJHq_RrUx;$wI#c)|#gK#Cw4ls{Vyep}=dr3~-f3(+7b?SbUp2Z%;PNdi)7qyXu` zG8NbW*csRo*aesj>;+5%_6BwZW&n|A^<+T3!RP_TV8i23!{cznBi%zE(P9Q39H1?i zo9c&?shnxVKNTk({UJ^`07&IL2p9+)21M^e83Lqq4+YZ0@Gz^eT(U)1ejRisPN#B_ zDDh7-eFSu=@hmM$X5}m`(vl*k;1aN!;lM2IasefPD!-@5W+Px+DszCOu5*Eu|MP&9 zkoiE0cma?U29G0!b%5|(SQq#Jkd$^2kTMQW`%-QIXnzG=ZG|YO@-b6Y6o*2iQOu+l zuLDHH94$>O?(TMrf3|7%0E(TCk3`WNSwZ$OoS&nem&vDmBJHGOIijOvuK=PqN#9{F zMBjowL@&#EH4w_EJPeEnt^?Kw;!Sm7W8elL-6j>Czp}}ooKla7=TPF1MxvZbyhX7p zLq)ZDTArnsSlb8B)9wc~R{_-qDl0#n@T`zJ&_UO9P;ChIsttXZZMvtxJ;109bZ=A> z>F~&tyQ)wsDLq_gi8kD=N{VPUUn}t`+AX*@O3x$4J#Pml;<^~v61W3+AMi0Csq#)B zrR{NGUm(d*Ic)<{4JJONg4COfmMAV-P&JXbbi~KZ`whyW@H+a_R`?w+N>hUCQf0{9 zWIt>v7LTR|M~R05-0u3X!+DGhjue_Gy45?!1dyt{`i zqF}Srf+JB463%F_gZt2B*`F3X4^v7oHWac@YXqmHh1wqLhpNavTqUyZEQH}Nb&)8i zv{OVmlv4aN?+j5QVLV!VL@;%Ha3tZ{@xhI(RTIUj@xjw9m&G?1Y%NB`!+?{`j>Aa@ zs)el6c%msp&tGW)r2LzY(_e;8lv9~!@EppY2IW+4o4inDB>U5d5*H@~-$yApb721~PS@Np%6WMpz!y z>Y}9TKPYQ|_Xo9a3TQ?T*@YfB=~#yQKyE0TfmCH40aAKk{$=y{7%(2!j{}kI${ye_ z;445Xf~7e5{)yuIC(5B5$3G?Csk~@V4&_oekd#)Z@`*t?ls`bR@LvYyP*kLedGx}C z1B^C#WJ#8azn5a=+ENiyKR_2Pmf`cRABoP(v^~PTT5}C~73rgLd(BAaTfk6Ue`s89 z0L=PFoK-clvw2oA#GMsK%r=~jHulUrd)+hr? zUmGCl9MT}0mi9o3Z!b>PDWW(xh;k@j8?H{}JA-n_mV*8HAqniSC^gP6vtQBA{fp+s zg_dkyjb7s56Od39H~x>|3{_%Hs-8(vRXQqNyWyYeNT@VwC6Y=+_|Jh-F>4F2m?Sj= z)IpKER#vnvYq`^Ke61EqorlW?{=HWFDB~u4(p|^lq=W9ZF?dP91;CER-5-FPzf1*D zPKDAI+GM z`vS>~_6Jr24ggZB1_CMn&*0=HoG5O>iE_wwe$1kTj)eSjh;Xy=f`<2w|x-Agz2LDHM}(5ND{;8~^Nz zj8xvmsnVNc!&QLljx$s$2Fwkp%lM~?5~|$5|3yhrCNZxOD6(v!N**Zk8>&1?I(&h< zL~m@CHto~R$gU{y4@2Y@dDWg^s2H|IJ45dR;vUf!7LbBPAruONj*-YWf8c1K1{?=W z15N-^N+$zH0jB_G0=EL^1M`3@fcZc)2MSC<;p4#Bz!Kmb;LE_dK+?W>zz=B2FoX*~ z1ET1l9pQ1Z)CCt5MhwxE4tDYaQ?*pa5XfXk#^mO0}_EA|i8Z-2MRJ$Te zl{_?%UNA2X_ej^pK&r$$fQ^CFP}9Aa;pECo6xR}>913MU^TG|vp~RZJ+9t1^$xEVs zdYL$~T}$J%>Y~RAmpzC&5Oh#e<|lGixT@CmW>r%7j;!#~LVDyrhZGSbinSY}u*l^% z%KNr0PkG6)qa?((IOxN?PpFDqCcl{SikhPCA}PS}3oN11Yah z07HQ%fn+FN05$@a0^0&l0V(ajodnatb6WwLD#m&r*3KiQ-GDDRK-uLn*#&LF*1CNBf2Oknb5 znVbibPQ4DK@_PfA3`F%V%miKl(tZAglgo%GE+e8G3Y84=k`2nC^rAY%%swWQ?vr_R zpMRB1d{S#~=|jupRV5NZ*(FsU)Ipq~Qk~efBd*`Ysmj)bT~R=?=~byH6q}UA&6tWC zx=&_Ot$nZ_Pm45$Q4&g)?9(z?1>BJM7$+V7;8sZm%7K(c77I)-uoAEp5dClYB` zkQx&T@F=i45c#i=`#Xj^)nIb}8W;n-Zn*zuxFfOBoyyD#n#+tRE;FLo>=iJR>>e{? z4a%vI-D4g#J?yWA$xAkQolG8;GW+Xi@`jtd(Izj? zr_DsiUEW_4AQ?QwUKkBTH&xzGID%%wMid)1qWIaAc~qO3r^1DK^lZw!Xp;xUwkqMG z?~#h>M5@b)NqX2{ak<+>g z?lc1E-Mv_S4|mUaco5_l-NPL_s=!6|Ta}PulDzZxUCEUaZ6+JcI$)<70VErx1RX6T zLz)JR1$F^a6+wqlK3jJOCg3_9*anyZq&B7xum>;`H~`oWNQQL)kg|FZ5FK#^`c4M5 zKp6&N78p4|vZNz`>w&N@g&Tn|DTU7i#{;P?m;n3;m<#+22%{nm=X&6`xTXYB_hLGb z4C!2872MoBU`-$%K?`AQX*8&?K6R!SgXjsy5+D+ztN#n!G1W-cu&;sL4A4Y7|Fu&SbuBdi>DjeQffsn!IZ!@21JSW%6jL0EO&S zLWvT`k87trJ?r9@x?L2X(ClQ;vY&I&@awB5q?!Bng!a9U-4MuUswTKWX*ckoB4500 z0aCuh=oxl{D7G6!ITRiL%&TEg4l?})55`_n4ypU>uM63Y#FD-*Xn~fd?chO`?}%Wk zKt&@m>Y=C#RfK~$Llt@=vBEV}=>V!&tbY-Y5aY#^G+i&K1itq{b>0Ssr_Ph5@jj@| z`$<=X2?z99?mE~ePzR6)SZ>_qigZEVYSj6kVR!OMwXbAu2EgO}hUZj;`;47{4Zwq0 zENlww4y1aEQ@)+*2^^2>UO+q$)1W}%GGGRfa=ir-&rKsy+%yu!k6O&DZBhD2j}D~? zoR~@f>=CBM;B_*2eN0|IlQ+@iq0TEUMEpy5X&f!euGr<^q}}Ve^59F_adD|>sH@F= z&<-S%da^RT9U;mCmqhWvB~cF931!}g@ZZrQ2Qw`##K)(#rcg~9%LL#B!M?DQ@W2Ch zMDc*#$&%}5w6>N4G9CZA&&#eIAvIX~Lv|Y)M8F=voWN+z@SLA(#pOw&pAgZL_SuKUz z1n8<%c7XCW%A6Dz{Z-j*dJjmQ==XuGfR}*K4;nNo%mQL8MB4gKfRk~31^6KFOW+FN zH^5E6tH3S5?}3j2uK{rn1#*}zkpOLC;|&^2_59ZFd$mm!UQ1k zNjcFt8Oli%D<@IhM`Iqf@yw$>8uO@~?@n!kLqYpzFsYBm9?_;5y#6K+&6U9$WAdh% zyqP9%k;z+X^46I=*f=AOofak92yl=&y+B1HEW047dIM=_n&mle^;jAihFKRYRnV4}=Yc0|ratDi*gYcrfLz=%@a^a#@ z-D;UAc6=6Eqa@%RZN1HMQeKEgS3}j3Qy*%rDtneOrCrsI`C$#x#vd^M1B;pBf6)8` z^u|qFwv6^V5}O*!cf?P+TFu=wA+cFg=}hZ)+R61h=X0>{Gx|nVv@a1FN|3thMSy2up^Kz78@^BoC zpHk#{8#N{swIh|+uv`S)r4z4Vc@0g$7oF~`VNtJv@nvUDY6LIj(o~!bnse zLVE|zi={WM4~q2k(JDKb#7tr)V;}?mAU|1m)vK&cB?+2UJAHHx@7aa=p2=(Uy z=;{uZi)BxZSbms_lLm?7{Y5>Zi3fv2p-pmiqhGr zV6vEA9tySQ6MkLX>9(0xu%K{0e)>bYwOyDrnjSs|waS^_YLNFhO8pLP*KCPQAOuvpS(Hk#nf}3Inc8t-**o5G0FFx<4n&LF3Yd= zeI_$wh87%rCo?a$iVIcr@Zs-D_uD>mn!_rQobR0GY{~bXyS!KOJ#&=rOi})>lAN>N ztsYufm&JGT_*lvJojm@8drk7bAo;#?s@*F2 z_nkW3Q}TVMPOnmV>huMbr%q#u1Ex-gThsk{?(`~uIcM7XjlW!XQc&AY;rp%=86)|= z>p^x)zVAAaFC^c09Y`!J*S*$(jF9~61wLyz9+wWjYdNk+zVE`A7zah*yD%n4@_iS^ z?2!D^8SW!X-~Zy2==qY(Vg1~}i(z7%yclMrQ)Y_Kx{qC0IPnN3o`2<(i(=fh(J#H% z0+7*xyZ~fZATI#9BK`SJP;U|>C#1Wl1yMM@D+w=?QnZ}w4!JJIO27 zZoEF!niotn!i{;_75)4wKCP>dAU~ZaYx}EIbjBp>O7->OzTx5xi1kyp*bUX_8e>bz5+&v@7#?0zRga21Et0}9f!?9JyuPFaNnpr)rsh$fB z_^7FVB$<-w{kHgjFtPf~BX*uxO%G^1vAVsSSWRk^fEm?R%1Xk^!6MhdH3lA>rF~RD zi9icNb6Di@e`|7e3PR_>X`*;=8kA>pH8ZJ)mLht!)Q2OF4z<*y0BWCIM!@HQG#t|fC%@StibrUPa>%YI^XS2;i}<0HKDKjTkUT4t z^j=ly;T*$`peS%W0)nD?!4w|V4eCCVq9FUpS)o)A4Ibor+~YwFADwKY&nqazjoRU- z2TnSc;mMe+*=8X64*&7wP(0G&24~@)C>|FiiYJHCUGU^kqKwI*lz5&TN)*3Wyy`}DfdkGA(oH5q)Le!y~FINR${ zb+h5lxj_`?22le5403a039l)s*INu#${*@7kE^TtPPY&tPOZ} zH?(02DAs`)CNL+S1O{oQW3@TS(r!Tugt@nFG)G&=q&T-{Sy15x;I+H zC+iI?Q@J#+=LOrvwJSC|QdE$vzlc~nr06Z{=E_(H;GZZiGol=F?F92aCRee8Cc2+U z(R(2TXR0ix`l12AfmW{W{4}P`lK)}0a6hzfjCe-#i%sBDZ<#ChA>LRF@{SF zf2Qf@k+hdP=~;E>%7BmJpC}%8C5m6MFb}U-l)0j3XT3Q>T+~@V4dKpR^u~1y;gNNb zD84VE9C9)T^U82tDCY~4p1W6~VwY4FZ3us_ECv}k$G|NswKt`ObwCV*GV=KUdeZO` zgvv@l6e|Hy{5Ee1Ma{4CmXuWQu0L$SSQx2d68;~>snQI4GB}{p@xKXYs4^4(>^cvW zz^RgvqA87VU59@zsA5oDP$BdmIRUlP~{{nj?RKIVG%Mk zOjQBJBGo{xkrMRYbd#9WQ?JpKow|YXkaQXess*S}IYF8-AXF~fnJOu~gjLpa9ecm0 ztYhEwl)B{K3-G(B!_b*wOfUU7w4!Ej{YKptkmu|rinEs}o+Zq@0SJ9XNlLn2VhQ6M zA_X3gGgOJe|2R>(k6x!PXHOm&?5WVCia@b<%8zj(3*MdV{af-xDJNrhybn_QsJKjU zS^Uiqktwg*W}?4*U3`LW*9oi5zbYklw{31hrJt?{qnq+wTUCMH#6V$gRS28^5IBJ6&V zJ`sC*HN9Vs@yd;yy50{(?2A2hXd|b0`br16k<&M5KPva94U$yqllJ9pz8ry2nKAvb z1Ym%;PGKDzU=IGD9Dp7TcJ{(XTk4g8n0Ppl#>QjS-#|YxNUXu`P3kLyFpF*wZ<#~I za0%B7vAq|$Z6AyohJ$%b`z_GV4ly=%LLn*d4B@2RA|aTh_lDB2bgb3i*wKsLa;T1B zm`XQ{2eV120q^MLpjTW?Fm^mV`;OcCYz~n61zWN)=P`%fG{{}cVYgOr^Ba!2oFn8$ zQ2}szUuaQS35%Z5$ErhJj7_hDw>?n~Hp+>0sXgr6E=3DClI$?}4 zTu;`Z7b?s(Fyy{SWr(uVSZoC}9$WZe*qs7=0#z)IsvZs*U^SI2#vp9_g%>Oi%(GC| zOjMNU$s(PKD+X?>Ci7-U2PUIJ);N1M zm^iA57ia2PKqcJW9Ax%<;hGNZS-F5EDf+zz-4OJ7gLZ?yY0#wORSMXDOVF_e;^TRG zZU2DkA*|Bq0NpryhomtYd$IUe@>zN8{9F1B&Q8ZX5PQDc-<$QxEhr8(6d-=ubD` zX&j$rq}M}oYpNj|QTUr!5!%DU1Dm8`IkzJEQW*9jSg1tXY&iyz^cLLVBk~=LgI=%p zLlazOn{d@Z0@oXxbwR_G(rrlKqYylTJWGY1YsE6p)TVIUQY@3>$N~LEG3E{K-~gXN zfIW7Axs(0McXK=0FA7dMv=d2xoc-Q{-#(9{`s`-EiEzKT`%bu)J*e<|?j*Dj*X^DZ zg|(2-7oOzopjPV-v?iiS&Qh)0h;9?YyK0WbDUM zsDm79T{!-FkYhaqy80nSDLaG$)*>BPu&ksWM&*1)WEUX7+Rw5-D3CJfS-d=amQzQQ zerVm0>*$?3dH5*%eHl)tkK#$|m<-cNVO~3iA~=CJgN1sG_01FP@iln-`vl(Qp5(~0 z;j!)ucx_lpkw>bOl~JeI@0*}|okC(?;y|$iSt)!8cYX#9!9oQ3@XOMp6Dp;gK@$4E zVrUw@sq|m>3f@ef!~Sv)=-8?79IV|rxtHJ#B41_8CbivyM74U2%wD9Ukct-9ub=1F zb^n}~`-&yNsHW4tVqHXb8NSmLx>!$o_LTl#y}X+tU)j}1Gxz`cmEHfPO~vGkyjM=x znpW6Dta&K*80!vOh@Hyr&&wGxDlIQ>N*=bCwzV2?b2I@iq7q{+2ZYX7#Q6jsNW|7 z3$Yc*6}-E2*FeGs+;{HYd!L~@YY*8Of+n?Vk2I`%w}*7bMb^ZT<7VKs zZOj{bRq;!jrm4Rne{cGUkWN~m+$hbu*djMVbC;q{x-7o$Z!k?&dZV)`mtZ0LR1%ic*eqzPbobq8>~bZMOB=CO_v1ao zhWSxAzHdl3`SG4%-%EGjcQI9LBvfyl>`Sk#lDqFFU%f@- zX0@7ijmmp`y(PW*?%5QJ_k6U+*9dG;Mtgki^rzr__xQTv&wG5u+If$!96R}2>|a)4 zFRvYv@B3=%8@t?u%Nidb-*Xm>gROK~d^fw=C;3nLY-;tU zd+#QudOIkbFH1i?SGqF$y;~nndUe|Bf6#gBF8RLiM>k6T-&K9~mU`8}FG3woegWD8 zo1f7pP%E6gIoWGY-b5-OkT;PUju9}IWqw+r<;mP%cfa`TwKk4Z zX;gHlAoAzCTiLHr;0?qeWZu2Ei z5H&kaG4PD7G4nnv(;Em^ZETj5KHol^W$)VYX_RPvrooHAuWyE4b#rN}x^Ty{Njyr!Qc4M9)q~ z)kUuw`dH!F(x|!DHb!k?^$ubpz0bR|mr>(0wm9*`Wxb8SHb!zgq)4%>R&ZtU?G0B*0G^#B&-O!s`*9D2P z9rjq!yL)h;xP3z(Tje@T0IUlh*!hT2#HDrEElAwdJjI+s)&s7j;ht~NA$$U19%}UgItA8Aq~W}xc<5tSrgqnIf2@#lo}Mz#-%=< zQ;udf79DQu4e8D&-`4kLM58FYGirztMK+N5!+~_?$Uuz0philHhZ2eBkW0CVaw_QL zDb2*VfAlsK{H}lWhc~#ep-e`(-jWy%9)%wK^eQ$4Ia;m{5U)LAcZ;zwyQao!Wfn}RU!H}c1OC?I&bhXPRUp-=|>!_QP|Jj2T1@c?|!Jrst* zFXuN=oZm$89tzC+4%f`1J7gZ+A@lCq^Fpleik;@l=2i~Dj<)gzv7d-}zDfkEf-A^9 zQq;0TP5Kq1J6ZOgErtFXN=qOI3{{1m@2i!x4R!}uM2pvKHSe+v94PKj#Jq}LpWJZf z_sZ^k(JcefE^@hN71SsSDN2qjzqq7ydX=JH+VV~sYONhiD=O{9vuMllrApp-{6|Y_6aK?-s$%+<(6A;np5uM2 zLuODRQ^_FX%vZY}KPbKPA=n86_Sdfwh1rJh|@s8n6Yfe*~rhe*)5jJZx3rR3LOpE>!pfScvNz zKnnXd5aS+lCFlxZIUf4t!lEQp4^r4Xocwl@D1JLh6u*CC9u12#FWjJM4@xQ& z{}_=0k8*0Kq^je;R8rCSC+miff8+mMNyXzI<0arV!2idRO2Gf;l4^#3s`#qX3Zqa; z2c%P#OLb8gppx*9>;{#J|Gy>G1^=|tK$S01{UwzS9_^Q*%2##t+CY`&fVP5A?F^48P*#dJ4M-NID=-p>RRMB29$qub zWjwusq%jL|vQiVpN==kQ2|~!sqeUUiqvcV|i(#rZJkt6oX42XyqIe}6^Lh|ZB>b+1 zi$VAt7}fk8N4P;eWgr%-z9Q})?{K-X97U!+3rMNY21WyOEF$e&TeLW{RBNaAE1GIA zQmHK8L|KBc6S3%Axp2AswH&f@ba>}J(jc!1b#lbv?e4jPjZjK(W+*OX_??5oBw07k z7rC_VtKkk3+auhr4QtdYB7LgcDds!eRYlR)wpya>OPil?erpS~)R27~_ek6b1uz;& z{ilsU3T%@_M160IZb`L8LAAFdS1eD#-EP=I|WG`H*m zRm|UQ54vJS!eK2?+^@RpiJV9`K0-k%Hbi%~kr`j`2+~6tf+0|u@!NpWxPBB!YO)3= zs|iu8CPX=uUkq2L+_s8&RNvX3YETZDUgnX?vcJrJ{fquAnrSa`nZ=nJ=PK%5JzX4# za!*gD9HJ&5R3WoOZG@^c#Qzpa(fG2!8H&YYo@Oiy6gOitL1ECBHkm9~1)2`;BF7`M zsS;%F>F~I}h$8Y{V7H8&?{cpsO)s}zWNhj1miJy@7ZKwQ3!p?$q($OnUw1?CLUU+L zZcVpC%#Cq(606Epm-y+J%O$e=x$Q!x{+fo*~NfIWaEz}~?9z<$63z(K$xz!5+UNy}!E{N+;tKL>)8uSC31 z%^j1~8u3#D;Z(44PEroJ#F=@tK9(qlLPnT*LrvZ|lQ+raEjD?}h!T2DXy+H>-Lc~J zmdFUop+OmaX+xsP_M$X}s{I?wC&t-P;}>Yk^ae$p{Kg_e*)AyQ<3q>$U8T#Sz6#9w zqBEgIZ?7m8k2!~agyW@!D#-bAuw+ITxvblUtfGm6e}a&ImvpWdjbpVz(g zxpOac+s3_Ae>=+z5{;OaUUY%OyjeayMcz#THDrFc^YIomb{FXm&`}J{EWh|rk2sg~ z>=gt{BV+n!7G0H&-oA=nmiZQqls}J?7qpUrROR#7o!ZB>bQt-gj)AI3Rg%;s{IkcG z$yxGV!~Y>kQLlqte+RW6XQk^qV&sFU!d^hawT+20^q#`T2s z2%Bqod=S)7=}~~%B`MSwT6B--o+4K{=b(Vz;!!20-VzAs^9z7w^`x}0aY|NR0^uD2dvHk))HtCwqknXF<3x$3M53Z9 zrQA4msN=3Ks#XmR7YR+=@%T`MZD5n?iZg_QK7f`jH$Sh>sLA+@MM}=ZiNmoYI0n?6 zA-BrQ%fl0~vVNNEYlMo7$6Zkc9z*j9k3imv@>FCKVmG)XNjF4hj`}UPNS){?g&Cr|JOxBZ%4uMA;447tM4bhu0&fDl z0AB+R0=@~H3cLVZWVll||6N?41ilA61-u0O5cm-gj}kH*YLyE<10xuzDFf16mn*=! zz%POAfD~a8@G6kj*nSTj3%mxL0sH~D5cnf-4Uqh=2mS&?v#b0L+ylG;q#`7D(ukcn zF*k(npGcn3LX<=K0^XSSwLzgBHhF)TJS%jT{iz0p-Cs-|eP)-#i#2(*O&+#|maZvI zrG?2%Ha&JSdD!>Zh@_v%!$yh*FPA7WzMeZptgPp5B0j6<4i~{S+!(N_0|c zr6lD>KApy?$_?O1WmWmu%Z7uhB3mrd5cWqshb_|IIQ+9eYS+;Q!bXspnZ`EaMUZq* zU81An)4_3O-{tQ8bnxsw+&xbRX>gxBM?egNL@33Aaykyz)3)SvAwVm zNd6W9D+8$uhWEmSn}JZ#0=YL*RWP0g17DLaJOLyDsv4y@dD;|FTr-GrD0py?u1?w> zL{biAipit(*6fdr5K&IKAqw+Wo4j?FB#+1KCX*Tr_J}T%A&gFw!8>R2UYC^kyd4HW z=QngmM0q;7UVYp^>f=g%UQ#Nev)uKacE#uk7!2%HU4-Tu{R8pIcCA`pdTL>ntp(}= zPM+n=DofAhtg_U#W0f6j`pX9OI!;y2U1NWg->=ecdwM}JNIL8cQlY7s>BPO5V>sUK zo<*V-K*^v41MWy(oOz5Bxv&=Cr`I*^n!5?BKm1&jg0*2%pHY658pr4f+q zK^DPx)$XdwWzF?NWeKToJw1Rawwfm9<9bFSBKKy zPd0-xy2j-D^co*y7$vog0Ft(wOdFWmJDiR?-ykLxN6rIf) zb~+Ti8M55^#*@3(K~0c%xz+Y^Ba)ja^1 zws!Xvj~>QmATdUP(7;B#9M~x6j65a(^i=~YgKj{Q?GB_o{un3cF;SeyMDf>U&CX`S7 zqHJVHbwBv5v~d&@R*~HnnbHzINV*x$S2$CiZR;K;AKEPq#i3tpRYijhFi7N)v{VJQ z!$}8y-+_eFfz+C20;vG{0;!;AIS~a+-)W#6`y3~4m_roLjVH>XP;ZlYNe1PR8$~e> z7t$-hn>9IJRMmyguzbJc8FQK2+BQ7ul&63nTJQ{!M zc{1e()I~ST^Ut%vNv@8k%5X4b2>B-v#+^4ymaQAM8J`{)6RIVC8(NGi%MS4RF!+hHTPfDIa*E*u6 z2ngk#Q}Ix@J>V(B63vxmT(HTAf`G!Iq9&zZNemprQG^us2q5uC0m&d?mZsbTjrJWU zgM_zj(jZL&_QEyoH=YheXIXZb@__?!Jsmg#I1@Muk0SCD8dJcaPiK%tq)%on1X6&c zJ744E+C~)DHliGuUcj!{Xv?4+GWqN;&g3PS{;1xuENL52)p<8lW)3ht4v`dFG-PLB zWJQa%r~m^s2{hzh)Y~sz?5OV!Em(9$`%hKSOXtp;Iv0g>{ehF;Vf-qoM)(&vd53CN zxk0#QmCFHjoqIlWK+-{FMn^@Jo5Ae6+`UyU?;h^nDt8v{y({#5C{BtGZL8?h&|P07 zr@134XkduPc6fR|Q`zv!P7eh@is#+wS%mVZKoWD3;8Y-euLB7t`3X|d=*gHBjVM+$q8#$Q4)dxa zk<24w&b*o?ud&H%YVx|6ydIJgjXJxN3o`pkh03xQRie?q^BDB+UA^fK+(=$u@<)DL z(VKi>nyTqm=T&&>XZo4`F$vpAIBOV2wFaN2J`eR@LgglHtQrk)eOvOV0B%XjPl!Hx z)q;Mw@IFXYR4^#lkydltG>;!@P;7?cP$!w5gS?OM$|P%-tV;MNGvIxYdnJYHw2VVc zJ67XySP&mcFD!^U9NZ@W@ERdFN)&=ebk|sR`Yzf>CBuzR9Bn_gaos`w7VZSqE%{;2i(Tee=cqzwr+-}X?8bDEkXOj3!5 zLf|7+C|-I4QlmdvSns1^t@czdj~{aPuGMWk4hE7t^=ikLYBho>a4PfraMr~~S~_5O z?LtrF_TV0vAW6NX7<$^E!&7-ltLUhl$dB1A#i8FY`?2|MeBg(Q!yj&`(g&}IrQn}M zc2Y$y0a8Ui2CNA@35)}t08$d@nzG$0!=d(xD6Wr0Ipj6-R9rKUhOs0sMef$h%vcZe zzt{nos-_f{Z(OYwk@&kB8Y;^tzNoX;0Cu{F?&WUbb|X;^$oTdO_~pzXxO*QJi)(W@E%Y38Ado<^$!c8L{Pp{tNSYV@N#>*+ly=+^@>JPLMSLY zUNpJ{eYo4_egxefD1o;V4DPP>831l!VhjD#=%X4S{EYRD!PoNvU21QtWh1 zCF+mxxEn|mcLRyyH)+h1+GBz3aL~@gQpBlH3(g*?zsMewOdgdU^Uz;3{85Et9#uGe za;}{_PT=-~;_lg!*Q-#<+4o^cFM5F6PYlU$$IE9YdRwl^8w7aGOXJ*FmBjw5_sqbt?1-10I!Fs>!5g zk3HUR@~C^oJSrWcoO0J!=FKyCg+y_QE$HJ8{SQkl82x@Zh(LX_KCQ&u8>$}WMv(U| zys#YHCLNSbbjZ3Y8b7E-Bv!1JgW1PjUOm+k)lT_Xy!E?UHGo2-(1y`l(Vi9hL0t2C z8X>)G)Vu*+HIKwAmg6TV4+`>AAeCbokjn82kjn8(AeG}cz$D<;z+uKUm18yBKbIp> zT#iIJWY?K_8m>W6ImR&wkMRb@1+} z$bjFw-1;uUZP5|R;M38i0WLbc-MuT_e0ILe-710y;@Oyjrra*Xd7dq2^i;P^{CxwT zw)H$%P4%jb?H|FH_|6(-ImfFkDWr;J`4h^9Lcb2Avit=|W%)ah%JL5&mF1tnB;ZY8 zp>a)RNj*<4OQN_eiE_xzl$l3a4~oiiB9ri#Yfui_4_XG}lruP3c%{i(WBPmC$Wcg0NQidhfg-n)SRO~tJ9->jJ8;t+R@pd92GE(K@Qweh!soq7D|a?xecUJEeBGmS}`@0O0^P@N)?k% zWvSYLlp?yOQmuoG;8G=uOO+^x+|`|VR8XL(RO>SdkBtoqy-}0b!Q|0cEerQHd1QT= zH7>%GgSzh~4S4k@QY8ciVO0Hn;D;8Q@&Q!Mm`gbr_a?_ycT&Ud+6 zMWd0hi4-*DCQX~Uz_n=AXt!fSq3TnKsvioNC%(99<58!OIYyvw8s)Zx=lkUrxdP=Z zri$fOALT$XH2_k%H3Cw(B?773ngFTXS^zr&n*%9TbWP>f68XdBMiiGDQ4VE3{+UNF zuR&3{J!CT18k9rXX7YBJyr)gxA(MB`XZpw54<1v7?3>f0`>#aEzvcp8`)ZZ zs3D3UYKY>20Os|^HS_2_8S}DC9=#`H-V{p*kH@(tv%vINWb#&Y*Ph1Gl$+})&op(eveJNZG!V;?l!Hystt{$ghT%a>~p+{4`}3MRt7P|#GaOK`r< z+Hzqs=5ro66dFrYQRVBkp?8!ggw&sobB0+d@OraGfmJjs*(fiHAO}c_GXhA8Ga5*W zGX_Wv^aNlMa6FI_L)TQ!U63toR)}J=LKMG@XWleigCes+rN+!f2E}jNn77X4Z8!bx zGOK1(^mU1(^XP1(^vX%kmJgBXACoEX!OV zS(XAIS(ZZJ0wDQY2wVh&LKY~CL97I08IU>}%Yi!$kGp|IxTgCfLDD!mnjt?DN)%fb zqIhyD^LpZ%c{Dkdc{Dkdc{Dkdd6USpFmtxar1p?`%S|3Nhs-0(!op7w#af6=5BBPm z9G>Pbl3GY{{&%#H{rz{f@Cb5Y5NqLUAnBltp`)S}zQXLg+`YB%%st$_wUF8ZIy~W5 z)WSZ~G2fXIK`L@qHzm6qu){iA>?>fbsPI|aTTNcy)CNcy)K zNcy)0NcwjG*b%r5Nc#6Eko4~{;6&g~An70ZTL|0@l=`;^#7Z#s0ZIR!0+RlbN7BFj z!2i?O)c{vfUE#NHlb4wH}Sho8Vx2p9;^n4lm- z9->o&lpiS^q!1Y`Bb8PQ6+(rAAQlzn&(hkF(#D^*q7<-<(~hY9&b@bU_T}MB&&=+< zd+xdCoO|xMf4g^gkE?4o1ACMl**GTsk7II6lEgiLYl&N^VtxU7C zI9|I+A@6fcIwISBAfErqUr@_e6Y=)dKcTK?)wt|iuqWT*A5+&xnn$KKR|lGxQ$v$| z>n+$5-?!EhWOC1ZX6JoXLF}8KH2H_r)@1i9SON|{?1{uPbchRjh9JhnanQr}>+1xL zR|gVTkJxfl3MHbzf`1gMJD55dowuc{4me)Pap8jA~inU@z0x(#?6DFJwKg~ z;cdqaz_FZlI9jDk7Ot?j8qIWO1r|P+GP(!KnTDN=>Biw;sPo8u0gDh;;ra~1#R$(L z_nEabjeaDxUyR5Wd zq?6^H>`_%uHDm`@ev{JZE%>rF;;t0lsQ6SRZy&)Pl1Ww0I}O#Z^Fum3vQ*aR<}lBo zws(`QC_h4Ea4f_<1k~_w4RBb5gTb9HQ`IYUNE_GT$vX4oytm_s$+ytQK4JI9`&rlr z`-EMqcjvfG3pa^zCTs;1yL84NOv5!yFPhT?gty_k0$~9{zGeY@&CTr*WR|ZLb4`D6>Bfu*;0fPr+)9_Wc zWd!I*GIsJTScMsW;VL`agGo%|8qVyt3|)2XRm%6_Gc|wzI2fkLg`m%R1<9r$;$6f} zhKmNR_Tm2`UncWUMxL^L`8!>7Ax+2M4r2&;A}GnAhS`raNCe-uZnOI2@jAyeKIXHN zpfmSUnKMLYPAo_}lW$GB-I{z@mS7u#trDo~WEnX@~ zh3eUB>~LyWu*owhmg)<7-}KTZC#gq7Bt=jaj)a~%){8Eu!c<3Z@`b~_1>GH>OF@jG zm!_L;(iqSPTQy}P$u!(X?V|~wP$uXjja5G@+7K1I#AXB2ScZ$95`nWa4o^k|+^TUH zEflcP8QL6-53CAmLuBqL{mFgG$%h zp_zX}6m3vIj?Qr_w?{w@gh~116~?16k0xNYC1Bo8qT$g@Yj7@jeOKu(s$5JXWp$yw zYwZyMZf*>}z4BHb{VUC9Wvqj;eu?z-*UHYN9)8r~mG#&!yJ(&5Gw!3P-xu<>B-4>Q z{Nc_$RE~YS27bil9{h1Il);mBHU`6B&FWn`16F}v67LCq(uz;f`5~DXh7NhYCO4^n z0OV^x&QA07@%mc2zTUR(3ZNj4RSPuv03JgC1s=z$a}}oDs?X4{Xl5pLiDvq&OiAvU zJL77zV;ek{^ikcIlyGjLN=;urWqo^UC*{3tJZa5QDWb*Ia5rfhJa%Uw)}yAv4G=*5YEPiW`;4h8OWbkoQng`;!MLCxW50N;xb1qJW5o#m`17^Nu$`e zL2D`|P{?%{XC_JC{lUYD)*dcsut`w7ZGj8?Bhu-la(OTkm`DeGO6gOSsBXR@CTg(K{69GHvZ|sq}I%lVTffAFU%Be}M5*%SJog z#1+eMySMd{V*yN)R2#hqDeEwX{1fT|rI3}{y<$RjoYG!z@^50&KLg5~b9e(-ss24j$78vIO9RWD`i{ztvJ}= z5ueZ8Y+JdfA>HX*E41|4icf`>PEvaDB*7<$GsE$V@1XHX{jkbWxtJ!tHBBb}Ry)i8 zl_Ef|LzgcGLo=&D$pgX0Zx&8Vv=6VCOoN{vI5kqKH7x9eL_nq1uts4#8nd~R=mWd4 z6w~0=%J9W|8+KClGpM_*;H)(ARB6sfJJFWUg5i=Wpk;sk)z&0T1wk5Dcf8Cn4PJgb z9PZN`ZthIGCZ>cf_@aO-_il#cI94j{Ol?SQs$mW|PQSH#VIqH+1N?b?l+VHuD+B@jjoPR;Fum4X|?sQ3bd;l{rT%G*Pjhlc3OpB3ECW87lue z>|DD-t5hzgiC3r=7}HpTo2o*i{O(_&6Ec8w_dN3iQN*QCtybuD#kw{@q4^?LKb#pV zet)p2U7_nL7t;uZrt1|$9Z;rm3}+r4l^TcnmobwVK! zdRBB3T_H_qvwU>uISfs2ccZ#CD;#)|`QWH2p7jqJel=+2cX1VRk>+W3XFmL|gb1ta z8d2)$-skPC1*M9h9z^j5eh3)TK*JKnxl&MpNmIw-@M6g{+{JlFi(aZYKctIuxVxOz zG}31f?Kf2K+K9$7@rz(6@V1hb-Y@(xtsUvNa%Z{>wODh$Q)OJNIX@PZhRWNHG5qPD z!%)YARKDE~m!DKT3wvF=f&M&BVCL?UvP4U9CW%Y5l)FPx%4;m8aEG1lUksiM81rey zzfpt@xZr`OcgvcIv~85%D*qfdb7qpuH1n5L#$}rMRfX|rOi?>VX6&PGSA2G zuQWTu^k;ZBoaviGch5+fK;3rQN7O%YDOR3TNJX=g@@T>@?8er~yX;{moqEZhO*7AW z`_b1gI3t{dtdFPh0k2XX=t;-aD!7 zsCQuNe}6m|HfQF0&di*dIdi7myLYe7@BR6^ zeW&_6M@B`~j;>XwCJ&ln^eu?2Q#&HEP7tmxE{r)nV#dW$|BIi3|9WAH`55~j{}lWa znf@Dj7W|Lb=-((DWf%OraH>R2E4_n(4)CGZdP3;v~s|EvN9f8RX+Y~d)o;9vC5 zKdr!j`v3pd0RPkf|Fnhweg6OW_;>5-%l_t5@ORAr1zy45YWL48Q1JK7^N%Y~@Hc() zj~9-z|I`2fw+8s1{{P>w^1m+QKjZ)Z)&c#;|Nq}kK>zXo|D69fm2AcS)u-TJ3H-zS zf`6&ue@TJgBbe#G^(lBcp}Eg!_P_Qi_}?t-6=fCtuhsMwg`@1Cf7R4HIL{C+#qprV zYT(*)r6xF+j6YY#q_o7e#;JC`AMq_LHnwwurE^3=hNW?nxVVIb z6rPuD_M;3;FA8KO#bu|(r)1f)ctN6xrEykfQc`@zUrJby~MlS^b| zq-UpQCB{3-47yyp&bZV~k~MXcT-gv4m6)E8o|>AOsGCJtT%5g2YbT_}H%@8X#KuZU zCDR#-KWW@E-oJj?_;^c`td!KO%#^rds~S9HP;O5DR95zs`x@AZWPqkzwWThk} zB*a@<}Uq{JpkmV{n8c|CJm z=Jg&pG&i+7^iR#p9S-^KFi_NpkhJGjft_V%CTC=(#_=g9Oy#(A)8HEkwHhbGJkt|i ztS$11rksY-u^B{ojXNXw+`0(i5dCbMgNmL;um za%M(yRw|*s#zDD*bBFM(qo%T5lquJ zn>S!+&tA{zo)BkAPe@J5PD!%$DU?eXFtlIy*ytX;^YC{Nbpp>k3PpBpl^ekt(^HeO zvJB{WWmOSPE?YTnP* z4%EFps4a%PgbaEP;fuG)2`(9y?6kDZxF#4Yq<~MeVg;I560=j&)0-sl!fkRm-{|S& zV!gUe=8|(_a#BK4N_u0FM9#MGgH8M!@YUbQUnr@W>FJ3HJaUH|E~W6hC86=$9r9Aw z#0*PDMqE}_LR_Xu#TR-xx$xnM{xx}o*{MWUZ@hnirJRr#FV6D4EJJwZeC8;ez~@mfc;_A@lo~s!+2U< z|8mxK-^#t5Ro%dOWU_yVTS|6ZVq9Emq@^8;YgN+3B7Qfq(S6M9krU&0_sgYt{(jksKRhbCS%3IJb~4mg znaT`I#y^!A@z=yDx zBmviI)$xGrXFYIK9yVK_sjWTo3>8M#|8KfvG9v!g4a2s-nd^DIqoznc?4}{A%)fHo zGy09K68JCNH~;pgA+OxuyX^%(nPRQoZy8>bL;ee%JL^p8c&q1K!~1fzf6IGY=iWC= zlEj3`XZ>av?)*RJzDxXWSo?3f?-}*WHRArOqfaG?EDvNzR`zF4Xi1ulZ&jrxaiZC zDO0|bZnplP@c(u%`ikYFR#g5vX(T3ymzIti_rEcHa7-WdTwbx%6gkd_9hb<{U7Z>@ zzqHU4eCzA3P8m+mPd-vM|H{)T(fOr?r>0~5wQ>^wsR z){NHfrJbHi=!BOhPgl`1uUh6>+xR)1kzTdXZSY)W8z)-+omtmf&FoZDG5zg~>;Km? zF7NWd;A`y^=rl0lx#`u}HocD9+ttasx2v&9gneqY;)#oTvL218!#lYszP?d)qifZo zi53rFWJqbOhez$qd+qsqvyAcbBwv1Lma(!jG=#BHAw1|$zYygegkKAt6=4c+amK{F zJe097LU}&1b|ZWxw8+^MqCBQx7~lG*UjW})WOP!D;f%S3bIT(DT{r+=0FS~cAMQo* zs^w8ec|O`*3E=sZBC!Hv-74_H$F>y10kp3u@>G3M^vH^g$7Q+&^VO7oN=3#FSK?is z_=OnEl^LJb+$~(GR++JuRR|1lDS;&KS7GeqDw-DAvyo~gfUZ?Vo+U`2uqtEk^2pi7 zK)#UpGZ1fGP4Hc+gFmzyV;@!HQ>hwvAfWCA@T@xH3kIp>ys1GN*I=v(K6J^v=>?OY zR=*rzYifx4sRr;yMhNZ0l~ECl^^4?Q&`~hvM`AhC49YKxWNcPcF=JO0<7=9N@m&;S zJ8KFCzcbJ1WO!JU@q=sKLP|)Cm8^vtMQf>yC}(E0-bx4NqCRt?8QWZ2a7FjsuFcqk z+FFAIy$=B?1_Ci!Bb$)?=NM@76$-r%MwPl+Q`Q4xU|q(R)zw;JE2TUPAfdj<+BF^m zL+dkUtq6Z4hKy}&#Jk9_h=>KKl}{|=O~2A= z6%otWTNaHubv~G#PLE)+P#$YC)0ijTsNl*79u9 zn6b#@B7-SFbpmT*GUEf2U{0b*ryxeg*yA4?3l{f93DI$ z_9E1}pQa}pg=D_zj7`tblAR@`Z)8BNeNd}x6WC#O{u;GA!UG+%)8v>9Wcw|UGVB!-N(jGx=&7Vh4wEfTdyd*CX;r(HCak>703S6(!AHl|{PwB>h7nCkPw+V1Xr z^bBK3-q-~*?1o_FQ&o!O2cz99^6W~Amllr4#9e!-aSGDiMRv!Hj7R31NAr6z%50;?Dx1Bj#J*yul3FV&f|X;ccSK1HN!B-EKwgjDJ+pHL<@C?R{+OS* zWeVciRh)geWrfj=4_sj^a2tx$L$Q6X8P$0R_YO7n<9mlFA$-D0V=MW%H=kC;!HL|x!#>l&teoI!Cw^mWionlDpM6}Av8B!Bp$j(!{9dsvW49SUo9OK8 zACEk|r0??=hj;jJK!*=z-`leClH7^0-V*PU0RD2p|M8c#B~HJeyev(*vM=W1+@p-$ zkaz^~tICxAjp%n9uK#1g(Ize>@{axX4xDm7ncse7@|9Q0d?ECcZ^--r(Z&W|@VU`f ze#cOhis&u__griA?NJ^h!%NCYIo_)OptXlSZg;TJ*<8yG#_|Q;EbU<_o_xp5Xh76c4UijpcaYd~{VKXY+2pY`%F6 zU$(#;%2R)HH}UKkQylmD1iiX7-sD2UwJB{Fm#xNqe8e)PG_N|(?8-}SFjnDiYn9r( z(9P`3vo;uikyFr9qnrb*?KT>_$WkxsSDTDs2I&Uhw$@yU*H~;$moD;s8^QO_olHo#Xq`j zj0WW=?i%Mw65rauyv8_*CUD;L)6!;Z(tTqaPi^1Wx2UP=HpAV=-x^_1%B!}ON?oy1 zG1rZ%6&Yh+smx(Lu~Na=Fx$l^yI_3&>Bm>jGKRQ}pU&6<^g)GX{FsXpB6nNHAGs*y zl|eAWVaxb|-~B@5!euJVe#)3X~Sd~-;aQbs?)qx3` z{fT(gT2ZJ=8w~uUwT#XGf@UslZSn96#!|i{Ekh(Pe%DUMwdW*@tXgy=fMxml>KDZeh8QZiGlld^UTnRV$mY)Dz z=9`h7(qc1XD>rM}eF5#ZBR*^k_wZCg+%IlnEOa|Ez!k#B6dCqii@@CuV6R7j79mD*BG>t}Qc49yKEhbNqnf$Y1Y8I=zxJrs-u=+t zyAZGWqv%N&s(S8^jIH{S|IpPONDIP!h@LvGb!7(Fp(hv{a6;=!UPz`e8OW)hgoH}# zve2J(QxNO2w4c$XC&g01wJW$~PobWtwDc~kQNRZPGS2Y4w&noQGe4ZcI<*xla~c7v zjO!#Mb3Kaze^yVHg7*3nz?1V@vN{kbxS&h-M8tZ5v4D%Z^c@t^;36FAWlb86l&!q1 zOV3B-+GWPZUD2h-BkxbHz%5_bq~js5>bmIDaKl{$gi4r7*>BewYyOL#?0Xb4@E3UH zn_9A}5ZH3lLHd`QjHTXkknVX4?S6-k?r07%e0fKg?1*G%?;xAI4wCJ$`l)bVlU#CN zljLGWcmy%AB6PySVbX673$n|>bXatvK=2XHu;gJ zbrb|VAM3hIMI`Pqd<_5^xGok*-v&_QX|eR0r@AyX`-P{Br9IQ6xz{<9liKSUV=dsd z2edVpQ?SBk$0VMg!DGtePTZCixq@s73#<<`R%p>aCd79q|o$H*qf$OS!OBrzAh zsE_J1Yl_KJL?fS%ws}5UP#h(1vDhBfJkR&`xUo9eckEG>tTZ54Z;mtyP;-z_S44u_ zp^>KAP=BDS5fQ%hI~z)}zuF=+D~E(gnyadVz#4MQtq>6TQfY&15vt^T$H=#iksFSY zQlWYVG|uZG(zKF$xM2_iBLCTr>@W0)sJY>W9#h65rB@iQ7o?Oo%m|bCs*9#z{(g|+ z#}8D+7Gh-ylP}*Lq_mcjcu=r1$9k)p`=@`gBRNw^nWXPXR<~pPWHJ_za-7nP53a2A z@Hb=Ik&X!_i1lqTD5qO)lL6g__RCGcoiKj9vXaSnr@H&_Eu~R<`zp#>Z3APes`OK6 zzjDCD8^*Ysl~M>}-|%@=Wpj(^wH23^8T%inRvl%c%q{g5f9zhANRuDLheF(mwZL7V z#LkJS&9mcL;6`}X1+{)@JW4FMiq4J8NR4aGm)BR?@sbzSrF>@tWj#Nb=pMpHH&n{< z+YPZn+SE{~$p@FCVQ`qRrm3Q|=Xt>NrZfNgtb35-e$TpO zjI!E^zm@1*GA)BlRQe#|{Erupk9*_ld{4LX=CAtTJW1fM_r#HaSFdAk;WIz!`RLFP z%-aGVJASBfS9q(AtEcrTcRK0EVK~8&_`=56gEf_SVH&n_pJHb6l8y{sH0ZXxXjQHL z$4hnkb)ki^s}eszauG7`LVLD6nP)>@-Ypj;A(^*xcf9fp0&K7sFlGB5Ij==;rkb$^#yr6D zl7iZF%Femsx8?q|D%Qz~_p!Ih68Q2=FCTU3n6}Ngg?{?}&Fk>QC?vv;rCtQ9#xl?q#<0D67U2f!CsUC*~ zzvw-Wyz>icwLK$!=wS|AgVjJuh2H@`ttqApFR4?Rrf|(q2i2VWW{Wag7cFIMs=(RD zgZySWrCfjQ!HoRmQKdh|Y$))z)U!$_saEoocP=$bSi*WU=B*ZC<6O{8rR?SePFwoM zk%LXfSD2Tb|8Pw>PI&}Apgqy9} zRqux_7bXrbDP_pfwqE7-`S#j1FSX=5gT`U?Ch&7k%?&#`-G6evXX2xYd0jR$wnyNp zrBdqej+xwN#)|h&*6LR~W)ov-32`Ej)($@FRVM;t1YT)Tj7N1Z|4;Y7b$U*v=EG*g zyae8{S>Fl0yB8J4)R@&>iP$s>TUZyqFa`ae;zIe2OszO~^1{g1XQYqHulUtxL(%R6 zU-EQArLK#=-T86YT&c|A-4hu5Uf{8N)~#K~23L#ecc<*PvHe0Y(YaDSX~%tfzBPKD z|G^Ulk3+`q#kMEal^;Mk@^n{zHW}sZ6LMWnJlT?wn>6>G)<3-8DkKkm>*hx3J#H*5 zdVjEK>#>}TYrX2xF>9K@-#oIr@2SPUC7X>1fAmhZioPEO=W9z37& z`Obqs`_tqbrFv3&pVpffgl*V=YU|1y_f~!p^(kYC0)P308iYufb#zH#3d{ND5DAzw4r)Tbx|wVf&0PY1qnukGQ*ufJ7ez}!w%j>3A5`0yY) z2P=skpqF%bV2UYt!Q(XrL7xW)ohgI0XS340;2~Oha%tWL`9$p#a(kBcj+^V%^I>|M zTe*eZuAD{jP{B*`|1s0Ga@et_{#m;&4T=2;!!XO2Per=4DT3c^(Y!C(kJ`peY|hBQ z+<-BR?H72T`Afd~t#`j$UA_P=TxzZDlJ8eD=zt(5jkwe?E9x?VA<~xik|I31Z@XqLo zn|oBQactR!a&e^Dyn$*7Xw!~2*q;=Cl|qQXd1P3L*$4Vk;H zJo^0{&VdC!!1y2&?74ZSjVTgr|BXPgFM`&@>5VK(bJQ}Ej+6gI0nv#bBON3PRmef~}( z7=*yPHf%8JTG=yI4tb87+<#Tjbhz!Zl%Jve+g?MD?5{riQlp>O^|%K&A1Cmfp4;!G zzBlio$L|ZPjlNf=2K;YXzTgj&Z^0J9calzj;8w|})+dV3v4&^EMqqnej`Dl?#IuLM zdEV5eeM~17%%0zUPt(gc)3H_;c+X8;om(ylo~wSG_Vu4VdnDsy>bZ5~!U7 zhXsj~YvX;!*qhukT}k3qRw}imNZxjZ(g0-O19#j3`$Vb0Guk+Z@r89v6?n=c_i}t; zE{<&5^>A*&Gut|kg5)-%xisJPr+ZU=gjga?P&?-+ur^Lt-T;YH%+=`NHi!p2br0qX zAG+i2Uwh|JzIC3siO}?^dm3Nu02C_bdPo=S?%~HX5=_zjPJ8Fk0K69}>3mZM=Nw+x z6f3)|Sy)JJU4X^r>88$Zyp3$G2qDW{90cEP=UjqsN;DBL^;dUaK75Wc%vK&GQh^`% z)xC~@ydpdF&g<51X!qO>!+Ylq%I(S5%rmER&vnKoRGm=%#L1&35=4BURMF~}o#TvK zo|^Vql1B|f!}-qXbT+M_BU?B(M3PqXl4%A+8#hw)%q=cvQfsN=f%~Cac{$OhR9^7dJ&u>na)yf3o@bgl*M``x zuFf@VV!OIINANCvQ19X0od<*IW$-A?+jerMCLXwimi=)!pGWdoUbs-H$onren{0^- zyP$rs0C995LZJZu=L7c&)Cgfb+<+F`m+g$>{D_oGMMgcr19!W!g!+} zy4$*-NI~sTrwTl8nUbj8@W2fee_m)cmbJ;lwtaYBqDkSOtev}Sa>wm3yO9dx^;>kt) z#WaWzW^RVFM1(K}G0d3=1>r9?=?H}(5Q~q(D&lXV2$53Gf*XNQs=#XDub05;AXHj} z8X)8^LKcKVL?{sr&MJ#w3PMpLlz~t^5n3;C?}sH!{H(>>iz?!}0|R|a1#dSVzf~C( zd;kY^)C{B*UFXp(L@$6EK`-(%Ta^yzqXyfQ8j?Fdcm;#6Xq(dZrIc6nlvhEKDZ9qK zwkvN+xz-um6;+C-g3tw`!XWIaF8&OZaGWd_V!_LBh**dv2E*ZDVJN5yS{@V!i6_5N z9zl~IcL<|-Ac)oPTO~otq1?$%yW>OGc3JD)Z$Yv2X1hSCin~E6x9>o!f$jy30zC#w z&HMvs3(&)$JwcCx_94FYtDTAgCTrcYOR4g5d8Z*q&3F!!%DVtc>#M;G*S#M!kZs zLV_;Jr}B$@>ydrRGO2*tuL}6xVKa2yfgY6KpP=!el7SU=1vP;7230^uf|drI2_^fge)lg|Mxd0ICdSDMSBKZ4LcZYYti*O3c3lX0L~pp!w# zE~kM`1;stL!g-)Ypr3%w16>dLG3a-C{2=IJ#Ls|!3VI223FvR2t3Z8G*5{z*CG^La z2&4j72TJX`0kjwB7SKtc+d!v-?f{(!x(jqY=zh>+pa(#YgB}6>3G_JVJgeDBnV$B!GL?(kGQ`G+8`5CB}W=X=PXC7rl8Tya3(_kW3LxYKon+%>V+kncoUOc0?O40#-=d5x9C4P5~O0-@-r!0_+ zl-j@}uba!r+ME)?_gzqCLb~fkR_@c~E8 zemG{Em}Q#iJuxxNZDO-pJm;R-T>3|-p)m5~M??tAbvBuI>Fp7mO4`yzJXK<*=hFS)7&1`lMK9~%VP2=EBdIM89Bohi=GT~*#Th7Yb9l*jL0Hkac5qZL=a zdb8rrA74@2n>TMY@owvhqn#(J6SJKr?tgZu=FfFInTA%GnB>$8>6!SG-N&a-&{c|( znDf{jJ|x+>)5LGuZ#S_MiD6-AJfDe~)QZiV`Icu&K&@;*VcE|PO*}5rI3}QhLq@N# zVEok@nEHM)A5+QOTrdeix=b2*siDW~xQ*Wpxi~iTTd&~Dy3ZvuD|`iC^Tv#xnhIf! z(48Hbm$xn_2q{I~^e#Tm+N`_yy0R;{uHfQ!E~KfehU@W;de^OZX9?A9;_`jAp@f>MEFK}&(Y4N4V6Wec&1W^gKn7SL&+G(o|+7rw6Jq|-Fs>Xs7R ztq7{0MAVhd)k7|9u^n4#$JW`gjdpCO9sACXowZ{ZZ5a0+jb*K{AhdvqH~STTzC2(q z)$*@Q1OrT%Mq-%P#Aa@hptl%zh<0=_b&T z-<@D8#jD*_+zKekizYCOX(mtvN+!TTeL!b}(#q?7&`8ilpz)v|f;I+S0NP5&Nd>}b zO>qeym95u9u56PYa$%OPXe(m7vP3nAR*^q z9%zg*eAg|dQNhrv6I(g>lV*S6PdaK2Wnzc0iexd7%_-EpWwVK`yvUtY?89C(9z8`O zG`xe4BG&4f^)yGEmOwttiTmyIE>$oe5xQ)CBR5E!cAS7gdq(Rcx@>&1A^KhpT{1rC zA930E3&A(&e#HRJ%vbPbvC1RGSUinkaXDsSo9*s`lL9SzzF=ddv=JW|0dv)Ctj-r2V0+$oAYphv@h+*bH=I%Rx(mt^_6byb3f3bTufs zpS7U%K)(RBfLcLYgMJN4>(4Eq{Xk)Bh2-W4hsp(lK}LBKAC(=~L$1O}5#}PcsT6W$ zJ5YZOJD`VL*%3QNu1J%+Xvgl@v0v>NEe16?HyNu7k)dXkXSXX}y#5^}ka~+Z{Z%n{ z9$M+ICOW@~@%lt}KumPsXg)07=h=aYewftaoiU~9tN`Tq7@xmzUY)>lyvXp#tZatY z!I6pZi_WXfEBKDitHmq$4$g~5-ZYmkK}t}8@J9EP*Wsh)JyrZlbkNPEm4lBW$rpXp zcJwEi;WwbCV+kq+C;}Y>NuIhLwqzJMIp^cQOJdr zB_E}ML3+rA(GEkyBJ5ZLJ7%$C8Fnn&j*$n`($aca6yo5c0`DtsVha0jn1bmqOu>M1 z{{J+E0O~-N{eq8q&NL!;uiuokSJ=nGl0N2MNNu~GGZQ=#Zt^QQg5D;pI0{NuaU7Ja z;xs5(1r~k6Do%ouRS-^AK{#0jxna#JD5O~hg$~J61yrHG*J$J4m}x zO)%Y#(T-HZ$SSl9$tna^Y!wB~hYZNqzHiQ6S|CULJa)8+{TCg_gm2p097kEQmI=j< zgIMKIH0`n#tU7J0o~kt4=*u2z9LFm+=y}i4-jRv$i=KmAwBtp5N6$fXq~k?=2hZ_p zb0MY3lXT#tA1JQ{)3iXBZ6-?7qAW*uEiL(7m`;JC=}-7gyd14tvLCu&1$jF#9jEqUc z$e1*YY)Qk&mNblPNyEsNG>mLX!+P1UVq4Tl|3|IB}>z zlWzlj=yI1>Au?bdpzffapyX`5K!ZWOL92n{JVsOzII1{8lfZBprH61N3=VN|B&>&A zShyXlq=ibMDJ*s{QH1!-NBG7D6m9wwDaxBYR;~y=sl#EJ;=;j%(9;i;^fZA|7ojYn z7nQE*MIlWu3c0Y~Af;jGCJ}O>14bRgBZxW{WXHlJtg%Yt0k#`>z=?JlmHuj%;X@nI zAcvg>zxt;VT;s(RBP}s~#CC&@v;M+OPlR@Kku#&~#c?-IgYEnm$KBXh@Eylp!7KRB zjXUbB)-SkeQi{4^JU{S6ISCJa&dcAgL^pkyjp1ju8GZRLkG70Up{Y(k0EsiN( z-dAWFkpR?_dg9eq67}MG{zWU9gyeLYGy?C;&pb2xwk?i7?~UKmA5(l^2bI zbReUcj87@rA5@w3le!hgQEs(|Ux{4ZINots-cgDdjRQFg=qC0iz(G$5Re14gDB2Zc1_ppXljO2(mqGxd-QTWH5VwqvX9*cWze zs~y{6$LLT~%kQKOD>jZJ%(+jcTDeK8!~PTH8rTEO4!dNcz=WXKI}joMfA|^;9ng@V0IIB zfOWL6gC?M42brL>plb?BPNFp^*+CmnvV)eObQD2&cO54?pgRPblc11h2NZH)4ag2O z(4vQ27%ks5EZdHCuwz~9SU)?KZ^z!UW8-aDu^sUD4XU}=5F-9+4hf?bSlgPjH)Std_}~Ie_nCI878KeXsGcQ#xf60LsytaUNV+BI&R~?Xe_f{!FM#4 zX|Lcr7)t;f3Ei5!FujmcWLbvgFwla27{6ADp^bsLh1@3?}9+uTH7v>V&9 z#+IJ=j&@^P);RJV?1tPt%VJ*s)SdQg2129&%`3iqph2xRtDV0e4|| zM(as?>4x-f@ez3eW%i;W;W2JuNN<2r$)iEZkP1M_klq9(LwXl99&`dI8PYh=H+7tp zBb*Eglbdcx6w(ZdLN07R8IlHmsE1tGN;~$s9sAmjZMS1T*s())?5Z8RVZ(|IsYLVK zA@RM3^v}t+R&Z5sC{1ZnQ&Vb5u#buhvnceO@0bJH!U9aP}l&3NDoDvmTwlJ zOTbp)g9R?)n|Sw`dEN1?N}i~wE9!n8iaNU1;0aRwFu$v zGb6x9s3f#J5WE;j<9S-=VuaVt_wJRRV4Avo7AxE!G=0{g;_ z?L=sjz<#h}rxAjUL7B@4(RAm-en;pXfjzZj^xVEC=ZjD)S|9na@(7Lj=U=en93_>)a zE36?xZAFN_j-X}J+Ai10F4rBQRzhxoU2e2p?rpo=M1-0PxgxvVhX`d$sK3Hi*uf15 zVOaxghaLL~p)`SALnu{*?%TPK5F*cqtvdc=$&2o!??42JPRv0_8+?Ni(gt6lox4qe zgWb%%eASu-xk%uLG-yf&*T*(O>Y<8&e%%TtZ%kY`Qhe6Gz^@)cUfx;oDW7$(;M=@) zNod&udOPGV{9+dXr&2f#aWqHaMo@UC!cCy?T;idJZJ>wfrU0B~;m=@fz|$;u zKzAbk1aucDX?_s2BIqH|2B2p_vp_MY7m}Tw2OSD}0dykhWzY{nuYgit!0i_P40;{( z571kn-f${+Kr6{Gh;U=zv^(fS(0-t$q1YtQGN98z13*6kg@Y?x23iqx zBPhOxT(}*y3Md{`V%0!@0j&;-M~YZ&(EFfuLGdUKs|OlXfIt!gcyxxPfZ`DtmI~Sj zG#&IU&?cbsL9;;DgEj>{1lk-Fk7TeGpfXIQ6{tUG8_+1wcA#mXs8nHh&`zMELA!!Z z0nG(1ScpI`1lEA|1>Fmp2YMcKAm|^ULqNS?K*K>Rg1!ct1^Nc)Fwileb3xw%T?0A} zbT24ct?)GH9MDUkAAmjpod>GIU_X*sL7^uCXwE`E(8ZvEpi4k2fG!2C0lFMC26P2z zEa)oGWYE>1S)gk{+kk!v+8J~mXm3!msnMVfK*xbL1f2oe2y_8xEc(B283GmnD?sBx zSAp(9-+u-A9q1O&y`bNMQiil_h=(C*cd#g=-NB-e3kyYuXc)~`8b+O~VR$l1#}c$q z0TL(MK|JuJ3%0gn-RxLTJBH_$bU8fPq-QwRj*YWpGwc|*V;|YEPZ286G+b*3t#-k0 z?AR_lcG!;nXvZ$tu`71$z8!mD#|*F}trh5vKU%q^3hbbt9SpT&73^3|I~HTd66{#A z9cymKTHCR1cC4oz8?1+FxU%7PaI9T$oE@XtQ`4G8O1$+(pc=18;zb&h`KIz}n2}z2 zq3{8#P1~%CE2tgZ-MYd+P;2J7JZLWWh*nL~YF;5)4eK$ed(My?FmNT|W01T=7z6Le zKUR{z*RK5@8YLMxYKK(GKnzkfjm_Rp>ZgCyc^GRnxFVvw4_y)7M}w}l`!?8U{<}Ldv4dEJ;R!lToyhCX*^YwqPQ~c3N_QS&U{IsY{(g; zcp;DZ@AVJy2#u{dKG9Q=%=2B*RHSlZ+~l6#pP_r^-g>!uZH0_u zxozy_eyiu)MynoAj_~(3*_2rQ?a1@RN<8%D`4Rs3dPj^J5Ys{AIUY?`0wKEE+w+Vp zX+wfu(6%ElT}KV&3+t+isf|P0j`pdEA%|`eR}E|Dz~bs$)>Dzp^KIG{h(Vf4fAJZ!yW5(VHRvW} zEa)J2EMdge)n17}vIksUUs9+$P=jPs$iLhn^o^~PJL#!N=6Qv3MJn6S54+?)%~7E$ z+TiOUgl48s;5 z89&ztwD~niSaR40doO!=CFw{2S1%UC&y{yAT~JYrGvfzk#}t>Cp^Nna_xT$41!9n9 z&|iE^CuV;0vI6~tOtympeeDXot>@fV>j7>!;^Q4z842jhxV2|wu@YN!(f;5(uS6b? ztfz*C4*gebn8Kd+uzMvCF@HdF(}`>9Agr^@a3ipzVG zwi~zx;-hu_mweF~A2UDRQ1##y>#H8}_oeyo4e@S(PKe<9_Ej3GfqoT4A}ku4<#x6u zgoW`OF!}cSs;@lPm(Omb2AFJ;w+4)uRV;bfm;V4RuigNn<^1^WU3h;|cZxLdZ zPTS1jY4RI~KQ2x;#E<8L%MXy~bU!|7H_|B$5jo<=Pl6L^E6*?_e`j$zvwq`bl&GfT zB>D#L-%u?hcQEl3i-Wr7bBDus*#^U06CVvOKaG;goYV87k%lgE7~qB6vk~$NGxO_| zS9!gW;&z=v$Jp{3VCF$_$g8jsw7zWSbC3H3@O2bv)#FjbdnB4tmVZX+c2Hz>S$>+**^KX(m}U;D z;j3x~C|!gFqT|c)w4ac!2SrLjUqnm+dU+kcqL+x;RLemHNc0ei?g-#F5Q((aBJV@j zZ;M4k;PdE$3BJ&HQ+VAtG~Q={yv@(ZYe*dOx*f>hL&V;xC#4o;i}Q*OqMXEouP@{^ zo&QXEjS1q9C@iCb~mPGZ86lcY+c?@$etNq+Y z{9pc{hsibJ6~B^U6mQ*~(b+eg?~8J(=dI*>ZzrqxR$mMCOt*01=j5MAXdF%4{u@QUAGvDIrT z-u2m14d;#S`l&9j_#GBq&ZBmmHLR7o+oOz2jmYTeAcrfmrvCHM5#pVI{xu`(M#j`4 z0eXA!r*bd66Y%CT1ACzG_waUOo{_6obXgB)z78{No+lrjtA-egJSG0vMG03w@s!vS zL=OJ$7i?IIK)S0EtQugpUmy~<7q7WO*b1qMUihBe6Tfn*6M)T#*qGbABsR-iV=Bbl z<;^XbZXvG65#H-9v5)XN7kkR1h}cq|z|qo*QVz^Bh}f7HN=eM>qcOz`l+|lK61xK= z_)ouJ^${YsN=vgMP32r^(h9;eFcp0zK9HCV5NVHy?%ZORPR#T}35nb?+Y{u}MHg-9=Fg zffVAsRMe!Rdh0GkVjC;#OxgwA-~+)FM)9Pw#I9A*6$=KhOjU_BsH!REN;{V%0Q0LkNF1mp zvAY1MQ-s800L^P?5~?fmcpH(NJ#OLZ)EW{S5uuk%=ChQq$%9&=!Yd*qHZ9VD`3;u_ zfH`#zblw>$v2{@zQ*__eD6OW~q9k^rro`05s{4SWT zPN+k4w8ZMx)_G)yeR*6y64Dzo)#0@zHaJFSl1+WWr-3OFT4N;kRUMs2{dSX|ql7}o z-|9&0QeD9emi&0+KrrZSplUVT%o|uAZSVv-TKO0-io{FA>r3o@1A&)wrQKxRh7yZ! zs9OQOh+NG8;?+nuI$Cd5ZzQpn0LTbj&=ssVfLXD8{vZsYpJOHVODu+PGjln$2Bb^j zk&y-Hkd4Wv}Erm{+>Es==OD-G3t$r9U_Jut&3C*^@u_W4r?LaK7L5B?NDz3q7Y$p zw}Jf9UNm;FS`Ig-YIbmBCj&|7sP%=Ii-saXZ;Mw)c9dBEPI$ZDGfV*sI$`=igz|Om z2mST}i0Ptpdv}r87(_&=XHTPQvw*D0(b*Sr;FAy$iRlKZXIF`>?WPyn1ZrPGgkG<% zMs=51QLe@jHnTgIOe2J6pGU6W3O?jHgF_ z9HJ*GgG42U>YOm#C>lRZPei|rVAzP5$Zy*)iJ3<@veFR~tY#x5wsfS%Qko&ZlOr|t z%VKC$e+^ULD7`RprlSy{clN6VqhJPa=p5|1*fm6?by{OSc|&5x0*&cPeGpS1vBm&| z|6Yi8$pUb@P)|;c7Cc7c=dK~+N@FB8^i2oOr-%s7syAUgV|5PoLbbPaPSjfx8~wIJ zn$?JiH0$5SlswLXQyUS%X*5n^6UOTtYWz(U*#Zr=j>o;n2^xnVSYR~Dh|q5!ke#%e zAhE?0^<>oi#}TnH?@z=KnyjZ3JusAFl<6qkdff4zBkOmH5$nl&Xq>4UOQjwdjtH7E zT-`HOVh5*d9I+HK%+M^IesDomW=O2^OpPmAxx-9}^#LGSc@mTz0)Q3i5|xm1R1y3K z03op(%v=D~X6q$TD|DW%^*)X4ZnGt}e~w@V8>G2<&-=}lSl0UvnT~lM76d?Kx*qAi z0MKuqCLuh@d_;t?eK=2IkLGJ`U9P%7A15%h=mnTz7U>S1rm3}vtXYjV2XoURiCz6j zXOcN7AL~Qf2R@|1CwfU_pLvLgWx&8sB-VDZ&LLx&hzR|}g*tUHR$ZU!`crOSe=4!> z0g(P&xZ`6$E`O#cChIgUDIT>!OC&aGsm`P(TZxFM-RDas=Ca(O%m#=EV~blZvB@hO zI9m`AoEjx>WbA^Nv(06B5rE&j_T9?*BUleSFYu~IfH6L~fv27cmxAZl<;#Q3%rm>och~}ujRbu0| zX&je#q1A?MSgvg6D<@#~>#|*9DLWi;lwaGSl@|spDcXT0=T1G-hDdq?k>F?Au&uNU z+p*m`lRE8ZM1-N7K~;C{(Kw0%&L4Y3o|+{*+aod0y?Q$0#vx*JbIE%#628}%LfJ9j z!vOa2_a;Hviu)w?=MQ>HI@_$iA7+Bz)KGKwORV%ky+q<9AJl3AV`i`6iGYB^da_br zW+Nh|uWpC2S3II~=ply9hzQP+BPi;q&Osim`Z0YZLj;{ChU(yx65DcGV=BbFds?d- z%_hH}#-i?=#&j7BX5u-CS(_or2AiN-38i0{dO=1rKP_4xBA@Fy+5#xbYu-IZ7P9P@S*x3gXJNZyg9E`*s zc>bftA2v5etK_;smOOG0`S}qH1%T%1NJM!I-}0v>qEgL1Lqv?x4Sz~(!&B&jMW5jp z1jMv&c!m*=A0NUtqnv9a$dAD>-4+1C`3IrKdjMRMWU=jZp_OkLJW1CIZ}OgrP9B1A zFN4N(T@2=2gUl>WvgVfXXa{TIB(vp;%nQ1jgAMVj%+Jy5`G+BZpUe@zFLO$3tq~b@XL)JN;zc&xHC=sPBXXA65zR+QOPo*0bEqXi}38uyt3S5jvAs!co9s? zK&pEH-V}}Bj|${o?cK^7N(Si~o&;D85jqVjfqY5?%j{IB)|%778w^)!4A*Mwod^Ll zo&@Sx0Rdd4cw~{$PYpq^Ohqk2?{0AQ4J*oQA)XAP%cT7j!vQ$isa0jxC6dpdi;l>P zLVGPoSI$5{ye51*0(S|yfq-~%KDFLsJWm-`6Z+8*z+}Lxfwh^l7B0r=`aSh}fo^1$YK0(BhDJQ$)m)Zh=K+ zpT;|6d;(A9TmZ05!I9ccM0zJWWcofL!YF7xHXr@rlBB1lNxcCcuIdXwOzK#*vH}2V ziY`Hi4t4QhL}LI#?U|6s0&pQ!FQFtPN~fW0nv^S~$*e+#L)x|(GRp-Z(vndQ0C2yF zEY3j;;hCCd^eb6v^-P&5*~kdzR%!|48iok{w3J#6w-EO=)i~nROZo*bRK%%8K8+5S zW*8mKwK9$5^oQ^qFvZEmNIU_ysD;j>jz7%Tfam%dH2D)xg?$XCLT6h>YW!ndS_EDp zcqj0rSlc!_k2-xKZ%Vur@Mgfp{M=UKiNjd;c3LgC7_46OP+5D8?Mg*{-X8J*s0sK~ z+Fo7)@@+?5gj)DPM_6Acy_Kki-SH&aqRtMP9PSKD10dQFD+H!=k=dafU4r`2sjJLt zcGdflj4K(y;cl7)Jxj)n-E}?19+!?SLUT2?k=QNyn2&V3ZjT4wtUVlf*Z4u=QT1>4 zkXcMGykKY zCIJwJeii8#0vJEoA^pa|GW#BYC}BJ#jsfU2RFhE26;4HD+cz-DkA})DcDO^@fq3+9 zEC5Q&>4!2;a;zOEPSgo1+rgpJZAf>Cg*Q8F72 zK&VEpXAFQ-Z#YPJj+R-(Xa|XU0E!B92{Odpc((j50Fehh@BJ9S;IX;{+0Z9r;h+H6 zeZf@#`ETnIm z>p4F}&NbhcS(SMXId{a9p}hf!oChOvd%goVc!A8SEzot3z!Ve%pywi8Vkt_Pvq)wM zAIjqQR$NIU=R=uI`&gH#0*P-v##{+N)Sm{yLjZ+~b%_{Ae7+c~GXO$@Y~VhC;h*Ue zv5;8unar*N5E7dpaSy=Cr4D(VT`DubWtxQMH-nc!k>w7Ve6t)sJ-tE`DWdZ_H$2?B zex)uEj$*E_go{|E7emHm#$&ISRy#=et&v%SHJXHxjun!4Rz4o%qTvv+7CwHho|>AX z8-N*K>Z!{^;@dA}_6q>2hNk3iKys~`h;RrT5z&`RtGXw^8F5 z$%*XecUSAq^!!GdRofGsVl>F{AF#n3@A0vO{L?0il)< zeK8wA;!cP3!w?a>?{{{>x$V*m7ZcNNOia5ShD$Plul6`*e{&C(9N+0(@d3KY`#YJf z*sEtke&@_y*c3(O!KAC-kh~Sb%?gP+tzwUQ}k$%8_nN0;CBxqF6 z1(0@7uK=yyM%?Zop+G9dtPRBFX$39suM2AZ0|)~ zf(Fx*i?ESPx`Y!-sd@<$$`uERu2*C>4gl3sTgXfUGVq!%LSyQqYw-5~L_^S+ItDc+j&#wQ@&Ay)r*MSKtz-&?w9=z6wuRRp^DeZr3i%Vhf_{l?0>H#SW%dIA(T2`w!{Y$X zKGmy4##HhdxKB`}kY|{@umz>bQyZuj$-vqH5sAspy94ksXdJymSdN#<^YwwgrGFq#`8t0JvMy zK_ax2fu)qvCCFTx0ccfPm!Px5@px#86 zXzF+!uenMNHfZ~CIvHDp2=$4}Bt+H+8(3lpRVhR*3_;0Z2C`SNaepmL7o;!oEDAHQ z_TgIH8$c_(A)FnqplRi@4g$uC2KH4&O&}2h4-l_k#i3&Ts~FgH0HW%&j{g8a#cH|) z^-sHM2G$*bkf8p_1K?Xj@1I)u?q4HB?ERAh;QI)ze_X}18DU_ak-9`Lq&G(z*qA5> z9o9w}*l_^%=06X>CE7uvL9~J801y(?{Cxooh|wiz9k(dPz>WbB16|y2`xS_DU9I70 zPgSq3fv<6K$4y_n2KNm_#6g_coO}Xgb3Gv{p1-(V&%hqn{W4^YI$qBspYGRI0TP;^=Rx;+TP7IT zdjLe6(mXR8Kpp(@tymjleZl%PMkXl$=q~eYnDj>}u$~OvYUvKzEQ)xcO_$*7ovPvhD8z4wfqgVglW;i=iKD{|Z0&G9dJlBGJscJ{(t%m+H3M^f zo&P}0WW3Ng;SHTx4}}eV!@yRJ<^kVVEC1`cBc04)@fPH871i;%993-q04D2QVlF&Aw z(nJFrIY}4!1eq+GWMJ8o^%gjZaz{)yuohD^2^TtveP@b+?U=%!?nOP$BmC1eJvlMm zrW;t=bOWC<2@`WKL>kO=NSZg(z?RSC^S?*Z?+|WRq*=encSMnatt;ZUh+J>)f~0!5!C)5zHR);JcD?4!leP#9$)UeJ)gg~56RzNU|@X~YL#&Lf2{ol zcvi;~HV*IO7NSV7kN`>W;1VRkizj$+cL`Elf;&O8xV!sPJXk5k-L=Jv1u4b(-!o?u zPJik9{=e({zFejA%ssQSd)9Z)o*n8zXDmTSvrOJ0VWs6J(PFvE>O|P?1R&Q+Et%Q~ z*<__j^aa8VV+B-(0m!~uQ}H>7*y^t~3BNU{-T1TfPNa+GRBZu$UW-~w+tvY)m0xEP zE!Uy4;~<;04>9Xyz*+254qa~|2Y@BW_g|P?d)8Lg5{W*bfzCJinf7+4EPKutX;|;} zS!P-FfA$3!B3bw1HCv4BHDZ07_&C8}DaQhK+%N8UbY_Q~U54vUhe{siG z$@2dPM||$y71LD2yYBz5obbsCY5j}KrjKnmf<|K;Gl;J2h@IU2jiqr79azu4t^2mG z-Lpq~cjOaWe*?P&9FUHV0c+k8*?qfgwZVepfHmM-C0}}fhwSzeE3T~NttI5kJl2w$ z2gT)o+3IIV56dV05jqa{wbXA}w{pG8bsJW$B(s%(2f%OD(iD|vp5bhN;p%CM>D?wa3YyH)_h)M>S>j3>FL!JK`z(j?Uk>CWOWMuhk8Iem`?d`auivS6 z`_}Cm^==&-+rGC5gg1H0yJRWn59ea%o;~1NQcl}!36Tp*+DrehW5T?~(ZODbFqCaPwjl{i%ATf5vNvHaHsei*?Slqt(;5{`KoOtgI~Tj4TsXlZvFr^lrYDbO1+i%UFOOwC;BXKg z%Z6`cd1{YkFBor~$^%(GoWu1tr1oUineo()3fD58+F{pI#*fHi741Hma$}|LZAk5n zu(Kz7K{T%SWUpYxr=INPt9k`5(ogNqY$W5U-IkqXJhk^nhc|mstX>W4W^cp1qQ4E^ zap%DE32lO8?waMZVsC}<)ZWX^FrM1YW;!1khfE*d3Y&HRux{IGpivjduA;h zftAC5xyT&Gcxso7`_i(@%SF106EBbMpj|KahqB77Z^quF5@G|!m_Gq9)E!rxgxwWro{7~;JR zsXe?7gX=3w&k4LX2W?}=x!eEpuUC zq%7>uH`7Cwr*@p0Gb{TCu09CO41?sy`U&0h)cdfukiEez`Co5v@cWjFT*);}@e6k&IUM{D{v>-8_4klTvogY);M|P0lD!48$G3ku zic9g*2M=+|ci-aL_CiP^e8pwZJRP3BX0ypLCH+fE1wrA1P&t-UuJ!(Z^BkwV#jyi9IClFFM}X|zE!q9wP`Q3l#t|ug-pDZ>`;|*} zCg+rO>e~rbUJKzxFoSFq?w>_QcFLH^)U02uToP>$O3uz?A9Do|;$Pkt{mDID9$8?M zm9pz!4g$%YWU>!JcE1R3cH}cJ#R(&R!}(o$nW=@H&HQjY8K*hDi`>Rm;ciknRwVa* za4bk194aO|jGUdtlb+;<7e#+81>os!ZBc*ayb;bRv+Gu}a)Qsv^~qTXf05}@8~{ejYwhjf^4T1#liXaEBk!F4GVo2B zVVX+5g&9+v{we>D!<`v1|0?AlEEl%n2T$?znC^!!%yvcEmFhb%wtb%houtohOFjvI zfW_sPZuSWG({A=x_P}pS7M^ti<=d-k*U_5FaEIhG8#+DiM|XOMT6XAG1LYx$>>dHUN!jnUcU-e~_?a!G%C zEua5YKPJERw>Kx9h(})8<(75udU-d>Kbu@Pz#g4S`-JousA+GF@}HMVd|IX-q=^w> zYVmm)IN08W;wpOxrC;zJ;@UIVKH88dBZk-$4bigD1ba4+z@hd}AaRG_-jubf53>(} z<3smv!|XpBe(1G`vp-R}a%ZmZk6f|Kek1Iij8RT`Z-jj`MYy%F~5BL*$+@_CaU@3ZW)NO-2aX90O+w!Jy51tr)w z8)NPALV~?3*mBZ7pV*tyKA7xHujIK2y8@AwJ+sM>x%PTc88lZ5k$0YbAgSD~;<=83 z)Sb_{p74|B9)#HYlV_-0yTIOpRHp4jo!EERX_wuqc@7}ujSKDbVC$zv_PtOpTLa2@ z7u%bVa$*h7RiqNO#6FdiKn^c~|DPOQCSm!D|3psJO7aQKy;*)x%&$cOd1I-4gtDX@ zUcwwZyri&bWGT0(ha(Kx!tOoaFNJMEzVN=RY_{AUXNY#+UT)7~AX}|}_x$1OGFoO@ zY2R)fU~->bX*Z!3yDzS?=QRLGSYtm7_Q)EIl}T$+3!>$ebtvlrCRuzvDnG0ZJ8t0y zT3mW;u-7I@vkmr1B>CLKbDkWv(LNBNzHa2|nRS!>D#i7FlYKa~n0{LrPSD6MB17dB zBKzF$x7c$~I^3DJ*}s{foM{(uPZ_R}CQRIecG*X<)_1qPCu#NEYd=V#3huLirYQ0q zK&V=>rbfCkaZf&AKW-RKM|`jbOYvSa+a%&BOR@jTStvoN7~G(kVzbvhOc}*S@LuTM zwtxnKZUqenCB1y0+d=U~px6Og8FUvYZEKSpYf8TJ4_D913yJoPNFh3u^|>i6`r_OJ zU8st^pmZhzJ0)>g9pLi6`iJeKxO)-uTMyLjExSEEisYP9KMzW&y#Pw7 zy(pLbO2K5var?*HkES9!Q~X$V|U+WJ`WSvrQH3p$hg$1$(T5J&{>{x35BE zM}D{e5kpUep)18R8cH?}tQY}GqZ01tilcia#)B3Bod8-8bRuXG&{3e}Ku3dC1swxg zo#gWSNo_O<+voYa5r@M+??Z1Eb=uwuQSUyD3jV|{ml_-aa?2TeD_}ln?Pp0Z=(J~X z>3`1N1lU$DN0=;m!9H8|cnW{b`>xt^7)u)D!6)_*x#|4BRQ@DEbP2BzS?Qv^5sF~J zMZ2GYz^#|KVHdt^&%k``7YNC{i|^29qn#$&F;mDJ+IqmArU)oVkAqd z;blh0h5v=!usG=U&V7WWm z6GY@iLMPl|y>bE0AA0x5bo_gyFw;Hz3RpRK4-GR~7F_DcA^*zn>n@=73%60AVdGOcK|f?PqgnigRJw=J`D-H_t4(h0F~E|Q3x#`^Rq`j zwQrN%p4g))N@OYZe!xup?3|Nb|FSni7v(-z!poSPl_B!wGYamm_FSnVKM_lO((7mNPQf~kLNu^{h$N2FS|xd;8D6*}iu`H!4i@}vFF@|*mRNY?wzh;PE`n%_Ea>)_TU^(@qXKvYjFV=bI{C&)1g-zcwIVjt>TJV%^T{ADP z78Hl{VQDa5);N`PGQymK<_(7q2*D zE>%lTcsS5T;9uTB^PqcuQE|Scaq#r+WjC*1Nsp^aLoWxFHQJ$8zt4v{LgaIAN}#)< zk3(xGEqWncgM7)N`+~0n6(|tRxDUXuehfB9>+qoL<#^)KIgsV@Svtq12{u2%FX}5Zc>IgM%*{rcX(9sUh;~j)FVFL4d zi&r+8Bd3EZuRCt5*8zj!iHz6|uvZ9Wkyia{{leAQjcm$Bqw4EipwVt5A{*C|=?A>V z%3tz0dH@W~>-ZzZNS^$TcFHL?K||J?Vvarx z#+E{-Jf?($8i9N1JA4*R*#>kJ8K3yx>k%Hk*FSjl&*6^Fgnjn)rvbba1DG zRY7{WskOt7`_M5-#y0iNPpXM+91{?-_o5NC%~3k;-m%=+}UxE+RMW(c*@Dr(iP-{4Aw|xChqoK9q4~CWnI+Gag&q> z^FzjqfAJ*j5Sz`9Yk={MAIk!;r(=BQ8Qx@0({lVzet?lIXF=Wubc zrWt`ufYR(yY+|QIE)&Th|0dGVoo=+F2rE|~|COE=kaDX|E_IHkg4g|%SWcL628|YB*I9?n#67&@47*HG+ zj$03U4s<6djsV9U2E}QVxZgl=;5QE0EH1gLO?0%Shut^{iJ2@=I&n~j#M=t=upo2j}Ku3Xwf=&m`td|H% zdiWq+lmtCRckhSe2YvKX8Wi7MiwICY?gmO9gj4{<2e_gls1w;qPwEX?85Ey;vfKqEzq){bwDFP>x0$;Z3v3br$l4WSkNY*gNEZrQ~bb3KcYG4B+wS13qV_ft^jQd ziq9@YJJ92x9YE1~L}ySOdKW!FaU5FU`sg^Ed=`U13!q+5LW_b@kyHXTgHnC7fHqfh z_gU$9le~wco5D*>;cv>M1&&}@{F^;gp2_U=rm0QTLQHB~&*urxzh?b3YGb+{!V@59 z4Ml@Jv(WL3=GY@vV^VW{5zqa2g&0`C&qKCd?BJ#3h&>o;doICr4Xd-I)cd%xg2RRp zq6<3dy-B*3J37!Pnq`T1cKLm_)5E=Vxg#x&wFNg}ti8R$frXvB$Vx{fO%KXDd;;W* zRXTGLE1Mkh+cr!AO8oB4(^j^dX{`gxKlg~W=mL|C-CE~pK#%g|w09n!fUvot8}zej zcae=qB_%KZI+8wU6D?)r(xa4gdFZI)ro8LtgDdSmI{akhRd3F>))&1C$c9^Zp1gMp zMsV8H8?ue3sw$-Gvg3pn^3-vMOGd2qamu)GpC7?H?BM0h;T?`|=nmb7b~$cw$pyXj zzC+n;c;{VQ?%b_SjHbQwenjAazmfN8_d2j|>z=mP5lZQv9puwOX4uc!)_uP&+fE&D z@UA1TIJuA-9(0_eC*?w_ov3AwkKG472xf|$Id2cC+Az>pt3aTLZ1-VD9nPf9dwmMX zl1Fu!PXjl8b(H>Lpz?43DuU0ysZ|y)WUBn`XpFpH{JVpVpmA)7p$b%M+jM@?a>|LfcMj&&J|)XLJeFmO=$CV=3f*?^q=xy-=R{ z&pCoAD-P~Qnn#{<^rJdiyDY7*+!@cSw3binQ(R8I@Iy$IsYh8KtzEEmk}fy2 z^5n4RZ#vooD{+fv3;6o3Ir3rKZC+9Z-EkBojP(ZGWxYFhwXm#L`93e;WX5(rd#J3T zm^@v^6U&!>Vjf(o73RTSe>yVKJa}pcSdaQMWy-9y-jb|pC&(O+Xz?WDA8|w3%*1{6 zk>iz-8bjh!$6k6)wPK~kD6d#g{-v!&4I^OUk7wLut3SsC*$}5e#|B-*?iyGi{%A#axF=sy0LXN z>c-W79Bq*6;U84VjF^iaX~f6>v|RO*BP`i+fK2%OuS#C?3(e$Umiw9EUsLK0Jr6I# zIr0+U9K6NDkyrfAk+1sh(01@B^4YhYPm%G*4Ol=-mX9@JGcp%S#3-v8ov$djN}8N! zph{g*sz_#O?I7u!L)%%TcF@M+{L%TjpIMw(o5afVzxjl@Z`hofxPK~hTC2Iuh@J?P zLlj-0=)TiF?-94Vhtrvr=6Q*sw9t`TUtzEBtjqbFa^QY0XL0$~!#NWIv}^2ZT|f)o zmBz_K$fjF9wdG%)&iTmpv0l!uoM~UvIt$1kALmSZ5VU&UA7f3kA8Ri0b2d%Z+zh(~ zXHdNE)9IY`=pnwo_9-D7XK;@AA^McT8IdCDmC?z2U-_qM{a!6lsIH50R&@`{MbRn8@ zTp-Ms40VnJrgHvXsFQagk?C`gl0mthnK_@Hg!%@^oq3%4p08$JCl(NhbVNQ@&XnJ& z)mc`qT)>&K4V7G3p;6(c2hTJn0r@Y=Qnk?xpHaa#s^c3bXOwle!Na)!s^fcy_Ph3Xz$@8zkd)p@DA+_o<4`;)d=t_s4ljp50?UDSp8}`Xh|~CI^!L7H#fNQ}8VW;!iJ6c7_)L zydq2gEl*xtV>vm)2Lp>7RoO}1pnE_SX9dc#y;Ysr)S`5Y3oqEeRn;0;tG>QfWsz#m zneyiH2o+Co}PPS(fO%R0PY+kA2@zD6c2JQ{~Nm`eGm2-|6O# zpw~-0XuE+rnas8Ti7Ph9*)B!FePXb)pc(1@G#shJo7gyzIx;-YxfB`fz8&X`<86tS zBb}Q~kb8|~wJ?p;8SA{rD_2_E&r;0*-{10n8a}&?!?_aiCn#+T;e**Y95)metWWaO zKo?Mpd;2(4PhR8W>@BxsYP-YmkEqtNu|txbHp?`QHvR_vkNkJ6vn{IC)BDB&{~O=4;Vq6Sp5zywK#X-qt z3DAC^;h;l6NpBQrDbTTmyLU`<_M^&|cQQ)nsH{QcciB}VlbE>IPsRX|DlJ1`1IZJ^ zKq)O?I4vVVDJ`QxDJ|nbDJ}T)Dy}~$zMkUUB+?rJ9^YHV?I7G8G1Xav(lRNY)3Tn( z@A9NZo-uK|rXej{acCQ{8~)MXOst0~Ewe!>EfSRSWiBYCWj-jSWf3T)WicqFWhLlP zP|~BcECbyLx&oB?Zjw_xUo6Rfx#*Wm?w{`LjfAS{M$`-%UD2kx&veo&R37LG&EkPh zYt`j4`W3|sJn7^&efKl@@iNPhS))Oj{j}9z7QYbrZjQd$p-G0hkIlt6NCWhgP`?6l z=zN`m8|@O^c(UxlLgz{z8t^GqZXepOT(iizoqEgWi=8*YYCF&}W{J~HXjFdqV<@yWG8@iHv ze6|&{O0$JmYnkv}6+*vQ*g2YUccTsiMpHbzaZ(EWUoPf*$jA|en_)DhD0AF#Hr=mv zoNk!wZKj84;>JU)!PW!OMzHJbjq~=j0miRk`#7Ej?~1SD}nw{Sc`(%HtY& ztP$HIfRQrv5$1TX$=XgyH6OAgz@v}u}2G{TQ; z07wDX%!`JgML`?MyN|ie?tOwuT%f_d@2T@QBV~2L!pK_CC{UE?vFFaJoV7_s(ms;! zUOMSS*7R3+UcAbFr7b}cUicN4AChz;i6sIqQ$LW=Ebl$=v&-TY($Z>#6y49?ATW%0 zyyKkAr;(aW+}++eF)O8sSkSYey+QAS_K_7FuHA?ot9{D#EKXNT&Z4A^@B}m8eqlWsp zZX1-lz!|=-oEGwjfpfN7{7=ZKrCjM{?XCW0+*kZuktIFo)fmk(D(o#XL1wS%+F%$c z&(?GmGwhI-S|BfEX(Bi#M5MJ`UCR|?kkU{a++kUwwkyW?wYHp58~6W*%4c8=ZDr*; zAXDXHkhEuMZiT;^hCuGR@oJ$CJDia@qg+|=Rb%-mSFw=FQLH5DAT`v%W7eb)`mG^T zqGYRFHh;Mz$`y%H{5uMfIAon@BqUspi3Zn8-UXL-Z8QZ!BS|rKA6w7A`TNVrx~?pK z9(6Tw;}mga*|V;zSocOs5R)R9t`G{KC1Pa?lKeQ^Q;=kx6RD89sgQRRWk#8&9`e9j zR;}miYAjh#o-w3@f1`S?aKi(craqpirR+##jyy!5`TeS)oMwVzNE26p+|~dV zn#;2g7*@&L4Iv*GBNv&I<%ta;KQC`Xfb+>E8i9KY|#uwvat+5dB&S5lxGMp-ysR4CEW6tqI5t*_ueG+zVp-r?o8TfOd!W(5~AQ z+JDKOO(74KCqRs++sSfH$P?N?-l`eoo8-`DkQb9ziHwqknuBDOlR%6UJ0^HQ+1vuD z$|oaQKyq2m1u;fvaj6a3t7WPNYc4>uq5P*b_lynR&5VbNiHRV;~^l%B?Dw^ zT4?v}088oQ<_>5k69;OQ@`NF|Ug5%buI@!Ux+0CA2g+gTk|WsG5fQ}7vmIfwvdrBH zCT9$mlhc#DGZK*43G&?XHVGOGm5~`VK{%T9^v(z~Rz3qU{v0Q3`$N>O3zCslF75)+ zT=@~im@rZ{%Lq|OH<+8&73OZsja?xaIZAqG(gfis*Vf$-W}(~*V)Pp$12RKYw7Vw0Ulzzvnkf1nu=i9B?E%5$@$w!C-uFPD&*NoyRxnXLk)R=R zQcoznnIK;hW{w3mK}N&^dpl9ii$$()nIyjiK<3*EvKF#dFUVd_mRqs``<1XE($E_T ztSOs*4Afd7=k&5zIe{^kqOUM6mW3>ymW zv}`{VoJ}4iQcY$Y2Fv3X$ZvUJ8AXB73gL)sISK(E$=yV((r+|KW!arbygWV{ zNqo0lejAM>=9Z1d0JY1lAjYpNrN>yHb7lLn$ew69e=LMk<=;dy$~xnq^L~w7Hx4?} zq-i|Rk+M0FKc$<DW$fyGH`V_=BTo##1Pqtl7o$6{_tqQHk@wfa(yb2*yGbvM$WRnL|Azm^p9@eAe zgm_mWuL{ zN_nx{Fe@fV!u(innr+GMEb|H%Za>Bj(-qBomlm}FtqYX*_|x+Y{7Dz&a_HXC z>4GA5($Ex4a>$mr*1E%8xLyCX0xep9t=>uG?PZyl+1ak=t`zL!s3@(wUONli@Z*YzLM<8^647;K- z{RuZDe`?0cAT2=;4Wc>jng8LR>@5&qTr|&D^RR!i5L`6x`B*c{KDzQfhU*vrWL3Ks z?M7W#}&Z=h}twR`BA&bFFCD1=+>t2C-S)bg#J} zyN|2x1+Kd1$K$Bd;;#F5Kq%Mv@qAwyM9x<#_X~i@p7i6%>L(dQt0e8ohT-=ZT#WxC z+3`SnzE)30JC{pe<3@S_tio3UZU-XO?fF`gPT`%gs8}*-mR?%XGCj!36 zz$io;^aW0FzUl-ezG_bqjvGw!;DUX!#bws)noziVd3;|Bh2_^Oe$ zDdt5&wu*-RwdfExVui{A+Ah3nkXuOb%wWXcwGvS6$!O9-zZLhL+E@@|`U5}sR!8!bVg z^1^+jdD8?N{k*j2E98ZnbG?n!Bj7|5*3sHs{`9l$kGuTkv_0K_`=TwNxD9sE9kyj%2~r?^Zbd zqwW8P=mZ*~yM{Aw_BcTON-a!A37dd*1bHDS1nd;%G{8(>18{9+4Ub@Bo@|`QQQ3^* zr$Ci7S}+d^#3h>mIB9kyZ3cjOK}w?ynF@mA*6ivYQo44sW_F{fpHsW3-8MF-QN)9x z@RB{g%>~jtSi3FLRul#X6GJ}SHU}F;=}^t@0K1D@8)_8W0B~UTy|xd?0G#9C4x$PI zC*YFDTL8GhviH9vAW6AZ0&_tndmh}_nn$UyBfAzrYUkCg_zXw(cEgdkX9cwE%`5LO zw)i`cyK@WT;_zbH4V?7u<)32mTnsW2A003a#e3Z*;3E{@Qqlg3#w)s7(SyY`e+XBL z@6v4Oo6pX6Wz>+eFu+=3sQ&c&wm*i+no~3XQ1~*h%vIEQ~qsc1)_20Ei8O6kK z)H>Ybr#bxi6I`;xnP=g+Z??3SuRa;@4j{M;t`aVvoM|KAoWW_w8{fYw7{!~PWV03? z*^NonWn2rSB4-UPW#NdhTMc=RuvH2x1uUtCmXo<_YN^c%tXfTWlws_kFv^SxHDw~4 zXBc!DOD*Z$3Rs<58def|^J>Xfz^oT=WU*`=Ik}ZbcH6}|M$xD)JNL+Hr6+$; zSBs1Sc-2d24I5SKX*MbWnpRIn0W)2yhZ}g|*p8cb0J{N@f#f|jdwpEK-ayL`p2YkF zCV2p;*}y1jDklN1Q7|_Qo&gMva62tsf|sok^0Ki}F79p9(o!l$PHTg%sc8)E?~hT9 zDGp_F5I_W+08p7YMoqbS}{et{|LkdC;3w+p$;2;gdWqpN0vIuJ`Y8QTttE8h)o zPrIWznsM7;B}6;CJG!5qc&64FgN&79IRv{YG3;Av^{mvI4gQFR<%KP2>2Mt zAHBHaw0a?ubiFmroV{@`d~dyGZ6MYAs0N)8szdr1#cTlF=GkY~S|Gdo>WbnS7#;=q z0?}7};U=M9$DDGSbz&1`nqYr=xT%-?;AX6{=;3V?JrQ>jhc5$38@Og|w zp8#-RnwpwN7{$JkI*pg84jFLiK5J}&Mi9>5o*%7gSgG?ijnM`?pE0<^d8{Vjv9>E1 z_K?wMtWo%l*GVdaVM(p=M)6{TlAyJVY!gwt$%R4AiAIq)Nf+h~7!LCZ2Y=^H(Me8$ zVacT_IJ6zFBs4g#0>jqU#pBlO>6%3I)HMJcWsGYDo@v%}qbNC31PD!W;3WM2t6e%da4i{&y*CbjId;rI}n05pF4{cO|DEl9PVaeBxxZHfR z3dC7|5**vRuo>PQw(3Q*z_DolR`?~@uIy3PHwOdfUKsqhqmAxT63Y5wVA$zo$z4XV zz^x>HkemU-Er%QTeYa8k{fj1MCw8H`jiT6YsL(=-mVgleGVE0bDDSI*;p9Z`HH!Pm z*XWbPPrE698cI9!exq1_K!u{*zYT^%Jvd+#y%RMFd-ho&3vI&~It!sTBpOBJVO?Ck z!EmTShv7iys0u~-Uq+s%P?HfV@+f-WV=5HMzJcL6k?~htpnqJGaM@rxtk-q~n}cAt zj-yqbP{F8lR)OJaaOec)&?i+eE}co>*y44= z_}}BIPErmGOR8Lj?}uxeg#Gi}ljV2e$veT`!)utD;qrTKsAO+An3RS(j;_YPsgnlZ zQa1DBUHa_XNo~hOO3p1T(nvjcQ!ZV|g0JuevM~tNaYQ0dwIs3q{7lv^!Fi^kL zNi46FB+V;SDcp(ASx)U?5*Q9MEeUh**Savc5MPs|$MK^!Z*`JcU^vWzxA63#uEpoc zQ>MS6MjlB6{)XSI_gWaOAm)He_FT5(y-}DyD2r4K#la*Cqd#Ew^ic)nLbymAS-tVm zD6)Uni|P|cqNbnW6#@6=^Mg?#Tn5AbvO>S2PJCAqDumWxxDeQ7K)df)8wqvMF?IWU zgh~7cfU7;V>k9x{7&Q%k%4uMtuOre~MiYF`sr!X#AIsDmTuKd|isM+HEV_XCteRB2 zp}8O~)?b6W^pWK3M$jJ>BMHM+QHK_gCm|j1^;kRrP7_UJ<^q`O(wRO9h9jo&_N)t+ zP^V#OkZC1;a8uliPtJ09>8v)uw`aouz+)0$nmr!;Xdj)?U0`_R-{XTTopIkjk{V>1 zj2~R_m*HDAtGaZbGo~aM_IgqVU$4zdk9gtl-1IAcaMDI2;b-wZTRm(a(AtmveDwlz zACCE)5Dv-7oIPVF2XrrxYJ&k$0Ty+(@C0wN%jTTDxXQ* z%dZJJHNNaWGsKLm)kcuep9Iu8VIF7`8eRXZCzc>cUk5ll&yrN}9xp zQaa&hFl1C~5p=$90513E0->i^2ZrnJHhk8L3wJdMJw;70TnVFa&}BzCoykXFxDr0Y z(U*#mI?2yqSc1#@#f9=ZiMayGj{M;|a7?ChMV+KS7?upd!I@twX%bf$Qt($LlgLQ!$rOOHX)ubWAX z?5?`79r%IdaVNFEyGiVZs{!tYDD79l@Njq+=V|gLI~|w+Npl>mc?5vHt>i++oBP0# z!OvQBF4Ac6vq?M#@O_qzyI@N{lla(Qr;rzCe0B^l$%tkdgKQVTycwjE<{WGi8waZh zvLJ$!03Huj&qImJI1E?RH^TD-;e2bx;VLY3kTtMp76X9C6xumz3t(}a3Y#4o=fS{j z5oh7sI9!WAMklNchPwlAWLw8ECeeR_Ce?=fwcyU5(sJzB1a#b!_0q-Q&^vK{?wxEB zb>j8X5yb65nis~SSA@?2s)U-^rr^*VIbi=8aM%DR1U$$*#1HOBc%Jui7KZEuRYqm; zC_}&`cS5@pOrq2r%_cnT0y>S}-i;9fQpaP2%_>o%kadPRsX2D9Ob-Nya58$z6DK z6jin*aGJ1G6LLL@S!xmw0Px0?SO%Xy%T-YNJj1%el;Ui-@(MitDkUreVOKEhPiWC9 zlbEIbx0??1|~Tj*AJOQ{v%3A zBXvtKTrz0#?T)~s#;-czFfjChu5*x%`W5r76FTV_FiT%(EokBilc;-2Cman1<1II@ z38&z6>5LN6+pipFxfTW6ik^jAjdQwSO~7!B)CILXXA*-iXi`@Xgxh!lE#xAyhhC1+ z)S}`=RQgMJ0&-kTmV+)MTequ>xQsl%qKs4N?*P*}n)3V#I^L_wa34sXT}3OuhTbn8 zyRp-*nZ$?d$|&Vg-5bc=DD7Dq-GHZ@+bU=*gxznO#BBhaChD0jcaX*RbZHs~1{H|2 zV$MC3=^rXhWV;O*e&ACG+VKyQDDp^Wy!|7SxD0@eQ{*7oK zY0u>P8(wGr(HUO)k4gA^P=@i^Rh0UG-uIKv@F*~xu!4wo)+acN`Jyxa9t=w^FrV5`CWqY}7`=9Eqndc`Z)-Oppw$(q?xWUbND@3iYIJ_bX{mAn*xj!Pm6I(6bUU|0+{>tzb?Jcq(+q$1HC6sz`$n(8JFx^7|n$FG9%saS0%+)9O^Nr!|XD0Dh>L z)0suz^qLC4#9ozNCho>=z8m*oxcxN&x5B4j(1mf0|Afmi=4I9iPl3UjmxZ@8o5h3x zD8sS4ac_W3+6!|RachPv5E(!d#uZ3ybf8)M4dCoSypK(bI#DRdEGp+Pvuh+PF2E7T zbEFi{!yIN&Dp+M-Fk~~qaR2>FuvtWfvLwj3E>uQtLu8La&0NpMmqWh;EJR=b-H_NR`HB8Ij(a)kbgoc7UM_w^5OpVzjiH^5X|(u+;&yVT@+IWsF%o zYob*|-U`WzJ4&iF)oQrw1FS~@_^G*0V-RjHSq>mb`2yPrerZchfxC>0E#;OiNclBf zYhrG#1eATnTg${F5R_|;me)oJYD3`BRz_`wph;V^*wtRe<%Hl#d$V{0fG5$3NX-`j z`#P$iwA=8qqrA5dL0@+?i>;k?k^RwGtIN-DdCKsvy2!S6rDlP%DP7H?UJqSlV{pAn zJOGYtA0nFzph2uIvT?YGWIKXRj5Ui2y>*fG#f!P45De*!&-ME1A}iNdo}&!_A@^0Dd&u6|V>2S)4LT`IvPCYR4nY8%LPMhLJj(cSa`cg2{ZN z%%bQRoyiVk%X&Rni>h>Rvl^iC-6IJ1!BRamOqC&rt_2LQa3{S6u( z6U^e$M5RGTW2}?R!grFEV17T51;D$>IvXKVP&iYRjajhK8Nk=6IvZi}7)0XLLob0w zWdIMS>15agM6CS{pyM)hxzrSGMRCwHwTj z4))%5vq;>j3-@NH)?EMIi7a;O!rcYKk9!OGZU4nA{@kq#mVS@c@G|Z(i_?3RfTH`p zmjt2KeQ3-3bpbpNXq~Cg0TlK@C7=%P>_O>$5cz%epjl))qzU+yX*3v4I4`H`A2N%h zhc&T_YXAGgW??)6mE^Z`9!HSIqe_F4lKz-kL>$vJr1yR7C{+Ve?6}TI$Kz(v2LM+r zs{TU(WIdrXQs;zO3;+O)0IDk^!OuIXDQN!uPMtK1M?lDi7EKb6Tc>r=c%DJCIisSX zR+1Ay(pgM zJur)#0Jzr(M1H&i;Pp@!wERPDIH~&3EUrG%1$8_&<0PvJN=u)*0D3&tG;EZdC17}P zSoPE_JfA6}v@;O-OfETw2dwuDebjSZY}21>wNySgi@PsWY*Y<>UZTRh)Us6awq+=g ze_m-SS`EpaWEK^Ze#{1HfiM3?XQa;?^jZM8;Cjbb3r?=7Qomun(!YVY%4+c>B zyWt94+x?s3=@Oy#=-(cvwR-;VI z@q_o8HheeZ?g9&Uw|ruE8@~EK3IK10f^28N{BE#tTrR2~Uknye$Y{~(2Q8i}8!e){ zS!qyu7n?0&D*%30YIA!5jI(MQHcIbqFeyFUDNM`O*mdD=*e&8Y01i(X{vN4Qr z`@|_DPolDXc3Q+)4_#108jJ8tqk__qmleQuPhHe5FD+`V#sqj-#7l2wfSxYU$08c| zsHb}e1Dydh_tQlY?`IK90dVSQWM2;;0^cm8lt!;~^4uw;Zge_}$d^H9yamqO%>=+r zi{{3w0SwNlGrlpSMH~b`#ti!pglAS=*vPCFQ5OIw%na+z z0JI8F8bNrt837it9RO=IgT{UU83T11H3BW78-NszegG~6DGh3M=Ij>Xon2{ASCUL6b18G z#FGL#jZ9${Q87$ukpJOY05TR;8tD*AjiPvb0Q@Y0NJkd{6N@R0p3vA=%p&p@*Of;^ zaa5m@7G4DLYn~A$En*9Rl&RoR0F%R&4eGWJgj>W50IWgP!BE;FW|z@v94})L?*Z^M z&RG`Cshm#wr5w@_p~6#*jfk*_&yh-lRvG!rTSSTS>N)5|Qh5N?DsqDjvURLz5xu}9 zuXhH6?^#(1r&P8G35K#j8z7egnNn4W*H^WOonSbJsPj7rplLNF9azmGMuA~zD@dmR zcu}3DSzXnUGFJ^WmKrMU)X+NvC{|0Qol3f6EsK~2fD^!d^gJM4>L?YePz&my`2$Ev z#5Mr6qcshiH#FkFB=3|?i?#@JJzWgN>shce<<5%Vp>zh{zJaD-rO>j0oOT)QWpx9K zsM<&ua$qBiSO$P2rnTe-04rj25nlnro41c*EMjC+UDzE>E#fu+4oe639s`igl?E>& znp?yN09-HnLc^nl1^2Zm4SMixEiK{zfJ0Vvv%i6<)LN5rvir4`u~(^?x3-8oZB(#P z2dE0l<+`w=xkx-Tpd_(fv`C0I&viEAs%f7^u^j zHqas#0N@N=1t$AoB`ty&>JP>s1c1V8+kVr5Tppq`U>l0&KU76Q+niYe)EchS7(U!0 zCIR3?&<^`-0PRQWG~`H&SPp#-K?y&%Ohe5^%m9sF+>TEaLcdr9m%_K2EoYk~4mEEfr>1MDbZV6P;$E<^kYmrCoxx09q&L zOw3Hc@Bx4|Xj}OffKzjn20iPyITn$7uF|0Xv&dW|W1cRSkMk^|;C!V)$NIwOqYqu6 zi{;A#RN;k6gYv8LLW@YVSQksgV)QxyC>`3k+84<4CAw$=mZCFTs#JL4(-O$pWx99_ z%Pk^uxu%jp@5!qJc)vnvP({zR(juZ)s+5dIN}2+=yGm)$HlELFWa4V2AyE2}03z4w zGEjhHPK zF$_RT(TxWXxlL)%qx9Zp5%U4C236CQ050#)Y1nq6V0J2veb5L8@ZPP{$n^`d;}@kt zFEpA0$hKE$(1#Dvd(pE3;BJyuUkL!#?bm7C+K;k4pftRp5p)0(&_tyX0vl};En)%y zE?h3TnLtd3H5Hz476ZcvRDL>a5!a3=3B7%C9#xXeM=fIgF`eW#7!LFD81m}4&e|3* zEID%Ag7<4W$rvzvq-V|vi^zFWXRRR^mUKL65pPfFB*CYZr1)uzIDAHD?Hw2nV>^pJ z|C}b_3GlIVG7;Nhwrl4sqRa&)pvUQPK@$wWU=e>@)Y(dR2@IW;%XP^jVlOKR1z84$ z*9iPBWcy`{_~(jFocpQ@7=9H+bxlcV7QX|`kATOoS%m9`Cgu^W>q<3Cn+6#uI)StWo(C;-%v$}$yJ?k}c7XWKKfyO}qtKVu#=Z*a9 zV0f`bGc=!fn7I7S(jc4Hdy5Euufmcv48Z4q)MJzN{2wqE`=DvaCDfBN22$peredY{ z1U){7jx~BIs}rt2hXN5BB^7d+Cff z^0JDy0ND5~81D|CnvbTzbK1dRxKLVQ=`zU&QK!?zkTtzkG*54pn? z@PKb~SjFa?$bDFM6@|vtoL1oqRT@7*qim>Ei~&IL^9Fc4fR4F!8gp}7#eD#rLZ10Q z1F|=-PUS^jt0Rmd_rjT2?8;w1o%g*L}N07x65)2I?*6k@c-&EC5vJ0P4#(fuGvIs%>~tS~oO+Eday!ASGYGh(@|6 zDcr~^+5uqcNHAj?D``!H{iQLk(2P+zu>(2b8DkZPn^?8a{YGJPBTG}OSlmL^{Dg1x zPPVj)__p$vB~5^>AVUA#&Z@oCtqNvkJDK31OMB`48DR1DR_!%)48YOt zWh(-21Edcdc}`HVgWLkp*02LAT1PF3{LVkHlO`zC$tq5CR%xFIGoL%7d38}~k3>y~ z?_w2ayXiCx-O;ObR~luYF&n`7o;nRvEb2zZ8 zR}*N%uIp#?n?I|tw2BS`aJQeb9*M9%{jDOpzv`=~zV`&Mc%Y`i9qD;6+>s7|^!`Ar zh#8`fV$u++SP6tHDov(016Vyw7sd5qRve8~QJjO362q;+Hd52zp0w0R8TcI!P;Dgg zZ?xX}=h0S?Zj3c$k(F(XRb(EgGhS;Pat8qSwX_;s4`9?pr9qW(=R^!9062j(u{Z(X z^<=J{7@?;iaZ^~z13?b(rQ?+_CLaA37!K-zYTVl@cm zMErLaTZM6%(x863=rWWx0Dguw&}a+5wNj^1cBNIc0l*q_pwSJ0d5un^_!_Hd3V=1H zL8Co@zt`zBLf513U#~Q%ku(I5uu-S++eWK+0f24LWaA$IpEoOw?MP|r8@&r7svA~q_>Pz=YTI8h z819vmEori+xxLpa)*YZ%EZ8lO)9LefbUkAaT1Cha>Ta@|JdRqWp_xapDUyD8rwO*T zKWY^d!Em}KBZgT30)JKMrWkJyt85NYOZ#Dp7=ajV8Ijd*{h7D8oZ4Dskf|5pDz9Jp*1e*j<`RDE6mn0-yBar~N9 zJO{uURDIq9n0iyEk$BT89s*zusy?p(48Nn(*m}n*t^i;Ssy_Ds1m4$a)V+^30f05A z`iuZD<`1PoFD2Z6ARPdx7$ko&>HO0w0v_^M%9mS2;gy^-O^B`WL#vqiP^)N?-w5sn za`DlRQP=X=DtsQRQ8x@s2{073HtLoK68uEPO@n8nCswf#K=R;u4E)NcDx>MW_>rep z@eKe?7PTlt{<4a4&wfN1`^+kaJX2B51G5awk0>_)nf6>4<>BX6VSn)>%7QPf!uzF) z@+P7z@X{(AuaF;f*#|yv6{TNU#pBmjZQs5iZgOex23h#sDx0TC6O`td#U|!@({-qr zyYp!<=`HcOR(v{}Hl)%xdlxTl(xeG7e$=R`czT=GT>9WgP!pV{nv-6}dLoa1NpBNb z{cX}~E@J;c<>hY^12e-GHD;Roea>tX9RqCg)p2OxO9D|Un@z0Djv!5Nn2Q!o{d3s( zw3CYth;7bc6Hfqe1)$~38vrwcZQ46Gd>|^02HV7>TmaDYT{!A0(&V;@hxw2~6K)Nm zj|U_2CwL=m_43=qfc(l7)#;G{@)T62@R_Y>R?sH=iYQY!tSe?0v5EF2Y&>7#mUFO# zP5cRflS8%sC4jNvIvc-)+eFW@Y$L!46R*qK#QyR+6B#PlM41Z81T~8)0IpQhnXp&3 z;cbIT1`ef*@;~8;YUpf4)U=6qHI)r&I6VMts;#qeueMFdXk}wGY-Fr!6AK&YZ2Z%} zCbBeCHmGTZG(>hZ)@(T8_DeKtY!f|V(vY}n=3GL;9XTVVLmA8yzYFPhrK zU(K~zl%5a$IVt;oZDA7$ZR7$!7#PylCKhy1-3qimw# zc%8 zF%>}iIZERWG=7?66CrbL+9aV8G}_FyiB} zD)4HhQ4luf0r-8bPUFj3n}}VfG-#qSdL0_l2Bpyz&#`WUO{Ck1u0WkD%(fBjXtPpi z428;@QTYJyT!$6{TLHA+sx*?IfoY-`w++2O%Zxl4uH0r5t#>K~%FUTOZKBsM^{i1y z=f+(&@%0y_@e&$gyV3XTv1u#wqtK|l$0i*6bsDAj+eGdIN+S^((Fbh8=a5dL;vt(T zbXaNpKa70`SQSUq_Fl?m?*(@E3L-@j6j4wSD|R7PR1n0573^I!wnQTrH8!lVj9u)B z8oOR=)WjM!YK+F%HOAgc?DD^7W?3-$egAi#2i|wj%$%J$GjnEkcV?IBJ^5!h>B;^) z`6zn8O)?$S^WlpaH4eH-%@5~^G4?RZb_6kw;EHMS5tRI>9@+^dKXDXI^|nga4t&=!qCd z|8SEkp3!5ZAV$&|H)+$Kd35~qr<+vtT%H&)=iH>l=kw?|ecnx~aY2vK7CPEoaKn4% z^cW>@mOGbVy34xzXn=wRTy~Q>UEwi;-DX~KlUCz^{3KtNu?2!lS4Db!_yez`x#lKC z{LSVUf^WF~x103zrmmbiM#wGn$6I=PISl1}A*ggmkMSD>-S0qf4+8S~hoNuVJvYhz zFi(t)4iJPZ|+`Vv4vy+V1ipj!{P!DbHEKA?I%3@Sni1b(Rnuc%8dJMV}-HwUR z3t1L}B%PtSMV7i)WcKKoxM?;D$8X(51aZAt+C!G=d&pvBqq8JJkfG>0mP5xTMV4Br zvgltlQMaqIG{crx$w8YeU4?`Xk0lW0E(H0!^C+p~ElYPG;J42-#IWU;rQia2Vk8xi zrB@K}7`IXWAYWOM{q-1Bn5zD=G!%jp9kKIo77kVv%oBR9pe*?mlEsFv3WboiaGubr zg^?BlK5M5!%z|K5urN2iiX=&ggJtP-5q7aC8fHvUS?Wl-9nN5;uM4n7xCt@8PM7vBG+)eiu@3-LpaV`QfBWvc@%OVhZsMVl%;wRdJHO6 zR)j2FhJfendn9=W!LmrbAyAB;BXORxyb^=m0?W$Mta2jM7K#yWb2(W$UrFR7nCHZD z5o2XYWr*0$VxC3a*4B`vyER~$ z5FF5i!F?4DHpIzNn|KtKW~nr$Oo~TqOOWXXn3*2pZc4z1t~^7X?D~@!toh)5X zg;DU5C+E%`Wp>KbvzT)x5!(1b6Vk&SSwa}{B6Sk#M289OBumkd@U~8aZ$k(sbP>iA zQFe8arL&N5FGvpvu0pV_Tiz&lyUCJEcU=qJ#Z|h?(#9Toi=B$I-{>Jr1AFT2f?|Bv zQ5v zD%0!>B}oIAy(DH|y#~nA_yI7WjFlG)=-^Aeb2vlK$}iDd2C{c0QNxc1%2Ln}nO7OT zN2}=&)}WMUsORJ%va|z#^uzm+ZukZ`|29Ns>u%sZa3@Q7j&c10qg)I2*y3A_*(-T^ zvfsMMW)@w^)0M3)?HO%apx2DeXQq??0TBt z4A!}nxq-P5;-BOI_oNH#~=%ec6SpZqY2dk*AL% z;F_DsJdMb_}TP zSsO3Dtpg*Cs9`S19@Q`hvRyUIfpJ5DHA2oc^fz2(FT4P_Tm>V7i`0u=35?G*2?cn1NyioNlQdn1+y4+%tW;6NiomJeM6|LMD^@gA z$x^T6=E>!ZV+)R3lr6_hG3J8Bax!Q|o|9W7;~VI1wlSg%P5TW@9oQwlU*9gQV2ru4 zKedNQEZDS5y=wRC+qFlxgwz44eYyS$3&*vnc#( zmyQDlcB)#nS$DLe&MgO|rloZmAO#^Y6)h*UMUT#1`td^c=+`%{U*|5Y$0g4I_T4(y z5H`QET+PW(W7(HHQ&`4j&yr4~i?OwrJ=-~*(b(ekuGLxW70)m;>?Re) z!ETN1x#F4NbS#wFu6kygLfM89X20oW%FFDhtDZslEJW}%&-`e!a++h*HP1q>-pc(| zv*vy2yZ3DBj!jzCL8WnRF0q6qBa^=o|H2fPLYW)!1TXV$qb|>VzIA`}jA4uhUEo zX1u@Ral3xLaf9AhncT%=5tcGLv8lCXpK^2uK{I)`+`TAd`-w|?*WQ1+c5}Iv=vx>X zG}BkHCFV}bDm!d?qv2^Kc7BhWk$BIAihOmXOKQzDx5D9Jn=k)#e|*Pa7S=ch?{&nc zV#u{=0dZb;w?_{Cc}7{En)%_MusIX*ws&7vb&cJA-1k(I)Zl4Nx$M@Oz#~Nv1^uI^xMOmoIQBv-HrUf2&>gs%$$NpSTTgw=}b>&|7XO zZi{NBQ;$bv?(Q01=IrY2g{mxTaR;~6xcpe!iehb-^lLkR_R~FU|8Z)M8_i~x0=sn# z#>Kv7sC`1>aSxZvA64j4x?lZ)x{ ze2*~i3d_yjXKP#y8H$MsmxnEmQX(|}l_y4Do)eZdcsBe!h6K&jtnBO$M@~JMn7UR&+o&o#04iE%$|AF4~Blp1N_>r8FKUC#KW7t0^bkMcMK1PE8>o?X8QBqCd=h{ z^;b7E-#Q+3W9}I|#j>(U7|eeQ5C5j(_!`?@PdF22we&svVhpWE##}Zafc9u5E8xWkyH;v2Wa`&D=N!v(F=3p4#o_r?Hb4yi)$nDm~(9 z0G?yW3X7~K`;={n$B>#SI%H$5u)h``ywdV@uT-bIVOXokweaw*o@`f-u#aHLGfJPVBnc#t+c_^cwBw zVm_9>(bdPPkQYlqeK>XSVpr><{mjK`B+WGPkHft#t?{zhy-~h)w-{2IyOu?I_#6s^9Z&n8F zwcK?c&qPSCqJIQ+NjlHvH(L(5{A~86?|NSzHKS+2Z);=YF8Z8il9ml9 zFw>>M-LGFxPpdyX|1wExt|@hXv7i;#Xi6 za^0~t-lL(JBHU_}uI4%P`R_*yXUtD|un+r0xx7X5O3tRNHb*bk-SM=O;`0lv!{sO5 zFDN^|;t#`@HO$8 zx7(_W5*14q;l`Wxt&gAmg2GtHnP3k%Q$H^Bf^sW>IZ*!W zSj(TKAf3N2UOA_kj;!htGgs^Os!^+lUF@B1UBz;Q05%ojUFY)fPKy_8ZZmwJOw z*E+Iw(^l!r(owx17d%j_cM(33m)ewKG2db4xpx7d_fKsim(JmZ=a>tyA#=<%S?jKH zWR5i2>Q@672@CZ!A|3}gkH$W}IVwK+dad5tTS>K?w{&TR*$v8+TnI48C}Mb6LM9Ip9U z;W*i!9Z!(!L0=6wzgmEVCUQ-{#nt>IZ9e!GXM2<6>U5bSv!M5$B@sB)q)^mTCZzxy z8tt2(V)#=Le3-h`Rbf4{eJP`5e=z&7mQ{Ug@iMV1P320E_LLRFE~#tHB`Fj2aO^EHkgO zlg~XX=jd*+z)babYAtL(*W_1`ElNVoPpRPB9MV|}%vAxlg$Vq9t7|2;-jmxhaiKXH z@_nv;rCHV+TtcZSawG)7o=Sn41r@SDjF~r9yV;Lx$TBx#r=KFGJyGt-S~>Y~D?Rs& zU@0-aF-%*I>Hgj?d{N{@=3302WiG+`WcgKM1wVMYvqSGZTd>e18QWKuqs_j1=^2GH zB!0l0`|Ap5PNf$3VQ{X4Po`;0%o7ka!VMWi+#pu7r@Wk9eeKzuJ(%wIGqc8_JB@gU z>q3Mk<}2H_N8e7p2X*e!cF=&{efsr{=+120T}v^KP3B6>?%@~3B7GIJW1*syRDE&=QO<_+nMMa$FhdVai7FFz&;dK+TlZIHE*g#+4@zo2fLDhPQPlX zocKxPBg`XMDBO_XJNJ{|yV)_WORhk8bjgkFDyGDH zMYK%1O(`;8WtvCrclmbjKp$2pRPkl;p^Bedb%c0J)!5b2wnFWiP(1uF!tx)Pm~Oq$ zFcPZW@{qX01>lyD1*7d!}vfnUl8Bs1m* z76tkMO9B0WbUV-=_yw>aunw>gFcyd>3HHW7(u0Ywgo!2VUP7sakF})^lf$UmYV0%P z>yyvXM0O05M>|F1!f?18ST_c-abF()iMdN{b!L^08M2dx48-`=1rwi!uFtNe!&B8^ zfmN0Abgm~3b0A^xH}a~`dWeSyW%y6bop%yqR_PF#Li&Z;QF9}o8T;Vbcs?7BkcTsu zQc6%5W(ayFiHS@Svtkb_Zn$yTVPY(1i{`}=4!V|0Z;4}(J&{qWGQr3|f?;;6GwO9h zh8c>^&_r|=WUvr}l`vQ-gGCyw0@bciSeclxQ1eeL)WI&V$ln4ngoTI+3$F{_k#8z3d~-Z+fy%Wv^xS*k^zRYj4>Ql};gOZAx~ zhqCZ#s6(nbI=wq@4)gxMM(I9TPRl<92}DyTCYt&b_F%FcK_@9RMPA|by~I9LQ$oX* z^Qf)xpO~-@F{`xKkWu$v&f=;ol_+`Rsq$7Q?ANMM1Icj}tk)(nk(`)SBBKh~AH>+i z8cJ14K4qG`gp&8Jsf32FLy%|;#6)spR&FvO+l%9M65Ds(5@y;WnrwDWMMG22YVpA@ zvX*j-?N3xR_Heo!6iyZsg(oHoPs}O>nec3a%R)F4I(PmLI+O4=Pd@)AB{OX$7 zUnLzo3>`bz{h4wFWTo{N$~t@y{M0PD0E?ZAX=VW?hf;BCF?lWm&NI0<>poBR*C+!A zxB_Y)2PBs5tCoa@sdbcfPOY#FqplJd_A7#fU5E+05VPWy*tj3TWi)d9YV@&TbL6!+ zPxxHi@cnxM&O;GT7!glMY;jk$EY5Sep0XMd6XzkPB^RNEQSJW0BT|w-*tB`PMA`L~ zos^$l4d70iXCWd*`injJEI0#~1<{XWYBf)yZTc+EJ5I4X-Im#`I3={~14I@lCnio#Oqg8A$mBvc zA*R4bN>k@4$*gz0(v2fSgAYlP`O z+qcOtjFnm8*9c#NJigsrsSC|%oRNY?NBUtz z|3da&XI9A@T7}G)7<;_ewT7M>AGUjknfs+C`&_p&m!f`JJIs0Pl!+m6FP@9r5iCPsUmg54z+YqhC1lezkCdro z-kww^#5bX*Z=x>oY1&+{oG6V$f-;+h6x@bWNnOX+32ECkvrb4jvG$q!)OA0PZx+&Q zQuS|1UBV>q=tFfv5=wxNZyeGJCrUwZ=TX_F0e;oq4$j|_yswnmI3xrYmCz75et1ZQ z%;6!CNytUBgqDe!N>ZYJeoSd2S=oKES4y?F11%yYQgvwGZq(uIHW~X#)z7k|$EHlR z-yH;5*HN#02YPg^c3_}ecN|LhHufAoX-0@0G^wdLf1Qw0$U}+o^?b+2dpo~iT3e-@ z*P4+1h;nFj$YDS<{>HCi&D$!)%g+zFN=E}jysP~((3&Y{CdvufzmE^h933LTD4B9n z3+Nw>I875WV|=quR{MpmYpaBKCW(n1T|s*!v8!zre^U~B+g9o5oz&BmlOzdgI`cIB z+bKQLlM)hKjX!VcF8-I}vKQ$9kr)^4dTb2(Ga2nUGN7N zFX6T7AB9gq2ggbpgis$vXZ%n25rn(y+T0QT&1b@0^dSU3!AHXD;y*e8DR5?iTutdT3#8wr5ZvjIs@PmnMEYIVkHzH**1*FHQ8+%L%YWTM z#c_EUh<=sz;|BV1CH;8Wf5P$3eE$0YeNK|OC=O^4d916YFv=_WcWNv*fGp*K?47;| zo{wz36<8m*9heB*1#AV}3rqp-1NH>|3>*mD5Bvsr5QsDq<^guPsz4*O{{h78)_w~J znf)y=26xA3c7QNDt*tu?gzrqJNvpjW1h{6k7YE|eik+I(-#}{3H-OX+?gHxqQ7rpD z;B(*+;0xeU;AkaTW5F?`U5dEAqzER;fAb|A*+h-AL)tf8A7TGp|FJ^Yi-E78nT{-Y_K8w+K^2(WV8menB#S4 zWrhheg~?qNhu?o^If*bJ%?6sX_T7~Jh;_1?;s~QyE|8YOAN`sm7GVpZ8Q2O)bBoq& zeRo`6R%aOMEfE$6{z)e6OAm)~KU!Vh61c(`?9qvfl z2`mrX%@X@6BTW20rpSb8y5mh>JZZxDGs<}3UbrJZO^Kt!CT{r(SmFIt>Di7TO&8O2HtQJNsxupvrucM*g3CN*M@x5$3% z;1GUu%5F?j_-G}xvzCzF2(Qw^IPQbvUxCAb*w;rF4ifg~afgdtc=o+G{tI{jcpivRCtbp}IQw-7 zt^;oZv9ryd4J5^If)e(T**$^S3}&Z!>k}Z2*{^_bJ_YwC zx=-o^{0rD0n0^`LOOUHTQg92H4!jS{0OE6S(rDl-;J3gxz`;O#Voe$fG@-FkIv?Ov zU}@kqU>V?8AbsLzJg^!NdzJWzF$wquj=N) z>fFC>mt$?#W6KMGmYT7tUcI0F8dPy zYlw)`KxyV-mgeKXko^Sq50~*44(2Vr#ebUbnX#V(@t8W^@I{>=5a;j5gJQ-jUKNBU zYBwV20|jwSNw7Ed7_-zKOvomKMVr{T@k(Tvkj#Rg{f)<33?^jz!GyLGBxBdcD^dJg z*HcmMoF6K70$N9F7Av5Kfbj%#*bftwqNW0l;}euxPU!_uGt>auBkeonkAB!2#yual zfN{^a78nBg24EO)Gq45_+qvv9!1FTZJ-}@^CJ%}|TlO}x>X~#Yh_yIT-Xp++<`%)0>wc(x)8$`H=!@e2&Zpg7a#(om$ z4Lk$HHWoWgwfuljf!MfWr^ywzsMzUJs|b)hTLoYc5F0n_Wr0G1|OK-m8PrUISNV6b1oo)1Xr$?;Hne;}m~ z24bIqy*Lni2kiKAn$#EA6xbiw5t#lJ2>A-i2wjkk1%3z21g-&20v-k~1>!3*(hA@| zz#oA4go?Bqh>x8}KLJf>kvo7ga3_$yPPPUZ3fuxL4crPW1KbF#gm)85n?NcB0@w+74v4qWOMd|;1F58V@4GY=xE#oUXMuBoSAlbZc;~V- z5BLB`mU;#xOTDBe!si{9sY+XOy69h((cGve@s=4d56*gn2^WQnEyPl0WL&ww3)FM(;mx4zb|@&jtXAYdpk7#I$ujL`@X3Tyz30ConJ z0d}KsN8dThQ<~i3dBf^YhQr5*hOTW^hn5EMAZ(+TcD~0sonucY%&0?0Gfr*YpPBxOu zXz!$urGS;@vR)+P&o$VU<=nuJm!lZrOk2SrlAs4m;NVDGp$u{2_O6OdUBo%)ciB@6 zidTUJaeN<0g?I#{=G|2h_hFvkxFL>T02>2e0_n={HIOb7-T+$z-vd*CPDn@gcL5Fo z;$2WQIHpUUAXyM-z#o9#z#oD6fqQ`kfG2^zz^gz%AbFqw;B#O>pffUG2uPO=fk0ni zQ6O$@NTEP7R5&mhSQ1FxqBO8KT@FNo41k~<@Ec%xUzzx7?;2z)? zK$*OWgoA0@9SK3s6E0k=z1|18QwSnt%iV6M@BmNkFR5W71Ogq^*C}I!&m>ZIQS$5Nvi z12PGMOyE-BWZ*jB6yO%%cfkF?S-{gk20Ra(1H2BL54-{V0r&{G3iu4T0cb^`HUbqO zF92{Wj;S&I1dK4D=oC;6g6+Txz@5Mjz&F5)z_-Awz--6)txB-T31yBsk3r#NYi!v*@w3by z8oTeu8ngA=mC7t*o09O!&8}stWQPiAInWEZ0!W2j$=+;Jx_@3JmaRpwUE7u6pJ-d9 zYg?^rTcd0Hk)`fX+8Wy0@8oL$Ztqa`e4=8#u403(Vk3~6{3dpCCm%*5cH!aQPw`l2 zV%e=Mzz~!2E3aES2gj}5$`F%NiiM@@Q8s-pw4jNl?Ni!Nl!OJAQ1)z}^6e+_w*Rcu z&e0OVO6~tN3PY4z?D2d{G4|nr5@o1scMxX7I)WX?<+G-7Y}#*F3bOmqXVPc=svKci zzbM7n$4LJ*H8M|T=cw0u=7VgP31tU;yhzK?~jfuDad=mG3A8QISUIuu1v+f zw}~e(A7g#*D5co$lS(Kl+;baCnaZ9}T8rS8Tt#A(8p_;HDJ>!FbV^C$!VP~Q=H=gc z%qpi5M#5;ABn!@8eV&a&zuYVH}X{fQ{womE;O%HoT7*i1`w9ln1mAzVYh zzYyH{oYEJ;Z&qqW+2cm43)_o-jt}Rs!i>(6^<0TyEzT=_a^iG&p?El+o!3=Ni&i68 z{fkO6vWqi_?A9uYG8DY5B=e`m5}OyAudrBBdGez2C!3NV!M|NnR5s#USz|#REZn|R z{zYycTv3)$P3^rZ2jYyCRv}k+ORFA^Yge(f8yT8aMqSH}Ussx2Xhsd!BDt_WRcryq zN@kfg{abnG^w`46_EG~`-y3Lp)7i}%sEzL}%<+$sg{-!^sW218d2&m!BRKl5@{TH} z39pwsBy&L4h?{^{$)j7?B8dZ|;h*t@cmvNkbq!i>Kye0yl z@S3o_%&CcGPZVDs%xmJGRu+Hu;VFM~U;PE*Rrauu>P@EOMn2-IQoBc^bH{Bz zB%exc|5QF*7q@+NZxS+F1Jw&lur!S~{#jn?uhjM%QgL}jn0(Z{jlKKMoW}mbM~yV9 zCnMD|Y;&NxSh$-jh18;SN?sG;fgeSA zY?%I7VQ%`6AUX?TbJO<<=B7UwtfDnQ$W3o6nyX@7QI)IUw%!!N&1x;C2JqP2tZ|`a zR>!VTT`xDJdkHcmgRm$gf5N^mA@p#Q9u8A;JjaMI>`{oMMdJ@ks!N#iN-54RIosUX z)NkRbK5`#0d^%3Fr=)&%Zegd=A6a=aw~BC(E*S)zxg0al?+TL55{hYvpaQEU>1^ zlW{W_sm0BVC_EXAJC<^-JeNO^8s1c+zfhBTd0z-2H`~72xn@J4W7tdChjPzdL|i?! zIi;BWTE1?WZAE?F9?{}!=bCAFEN>8}W65?nVOBgkU;9S9K^$*{wVh%t_G0O$RS)JH z$7A=4Q_JMUo(#*CX+qVc586!=)KBLHjhATHrp`z0gr+JV^)b(gV2-9-p^~Jw$x#@} zrZrQ$L+hJnYH>qrOpDKG{b8A=>RK-?*NU@tA7qUR!BsD5#Z|vv1$ccG2^2RGOOCESB)ea+aYh$9ZGw3l@oA#iki`j$} zr;zF)l3~mXWf%MKUQ81QN7ufp80=3K$J}dcKapkALrW1yWSUxvmk^ECA!h*l#jeF6TYAs&tINLZX?fv|g-;FbM9?Z|g$HRw%b$`mwRBk9)k)oRJT$n>okF4vYivux5mlOW~wtGv!~nW>FmUbdN+A8NzI1%$zKXP z3R^rJf6UgK1vI?P&8Po7l!O%X#6Qf>n>b($RuJ>VKQBPT4X z$x5}ni+&u)>a0;aL-@lQwSKNp+rXVq`UZ8+$IhqyCf*dcY*K%rQ+&Ny%|POJo7G_I zhveuZSll+@TX`Fa-LAeyo@{%mk{BwfD2w|A^VIKlh@qQJ`$-+c8t%#)3soXwvFW?j zcPP9Ak?{O1M~wrv7pCQjwV(4QCeu1_3O+Fq+FcLuo|SSyT}PR=9aN|CSurNXm=$-p zk6E$S2cGrRL3O{;9d{p62cl@@4y#w3bNui4lZaLJ7!O!+Og)h|;A=#7Ii+@U%83kT zO|mzq)ug;K57y@_H}1u=YNL+>>i@+9w*G}?lt&9Pc7eOU(ihcVO=RYsr7e7&_XQo_ zmbP3bXLljOQj@j3BK%VSGM0r@8e1fs)u5|tE7Bg;~#aH^PNQ|5a(~KK@_z7A$|Us--ZS`cmxy z(VLfOxqF!ZD<~evN>{hkVy4$>63*59wc3q)vq)DhkX?Mkg^_Q`Wxym{xcVIzX1}BM znj;+ifeU~AKu$>)&h*oua!VhK&^aQOWg?m5xk<}&nqkgdc*0qOw-br67|5~2Rm*eQ zLT)@#e>bgsPNYD#U)GYy9ef>Q$(Ji_WYy?WVyRVI=|uW$bz#h&o?Q5|r#2;5*k9wq zBbqigSD5C-g@?Vg;#~M7zXpdu4;Q@H7$0pmsSGNh(bR5X0qp`mFF(Z`KP@Xi?)~DH z7u~6!%vn?XAI9SSHNHD>Lt6`7+b;3f_)zeqj8>KX6`(Qb>R(WEP}b(#}BhtYB?vZt;>sv?c#T zF12D@ixx#%9G#14i+F~R%X+L)aV-(nyeWQBXxc`&otJl{Wk?UQNs68`e+nfHM+BJFcQ*AA0DP2y(_F&hVY3Zq7vbz=_?v8sx72V0EADx1p z4@LoL@dloC@yD{&fgNxh4eSA|4Wu-6f%JT;K9GD=0&px4&$jI3sp5e%bvfMxCpq19 zpNL!VZqhc^v!}NG3%c*-0wMjO2ogQ>$or#kXC5l<&lSiU2#yx=@)vAeAKOdI`s7aY z4<_-jWfhR_^REWdE$}rgp|`dI)+swCUje4{(PWHW1^U1?dsvi!mVLBapXdw5hICh? zF9Ngyivo)PLs+-I+HQR}%Z~fz0I06pj~l*AKke^WdT>q)2OHy$epu0FrvhWWBF|SC zke*YN1O@@|NQ*x}F9W2tqj;9dAD32eOiR;tnM@W(`~X51<~|Uez=ic1s0{#I9;jVR z?}Y?oVPbE-zeqe<_D2S=IuXN22{7?Ar4ATYE<)DSko5qgZz`B2S`>#bG=NaC43WJG=b-`9~S%M*>^&Bg?th*sw28K^U zAno^HJ2+bdwvDs(U|5ie(9K}@QUn-%H#a}M??wUY|ap^sOgwv_YjQP^tQg}ue4+7q=IUd9=Q!i zY3YZ@Rs4}2R-W7aahw1Q0yfoaZ=|z$?Ll)Kw}l)JB<-Dmt$@^@D4ZVMVTrVz*0$k+ zr+q509gqP#0G9z%ov=u14M;}_wgR!#%>EOwJMcGPU*J{X0N~$1tShqL0b)(HJwGyy z1(JN3D3%rRMN`v(v^WautL=S&bAf|^^MSNTYB6vma4B#s@O!Maw@(3C1;Gs9Iv_p& z-2hw++zdpYlePdi0=ELU0v$kFMz;-k5V##k%h`4Se+TXY{t4U*yaL<@q~)VO10Mmg z-pT$FxIY~v8{`1c8LjdVkXGCr1!}-!Kzfb$abOVeHy}EjbOK1viBAG60MW|rv{d*k zuqF^oK>73Ib3ocafTf`J7QpjBdTx9H2&+r!7eQ!+-!))w;C0|Y;NQUEz#G8Pz<+=f zfj5CufwzF)0nwH0FtcR19=XC z3{=nn@y=YkAJ82b1S|%`pA-hH2@D4|1V#ee0kKPgFDI=8?1SSdAniOsT)xT+J>0$l z$8o@)fQi6;Kr9urUvS1+fMy^!A!rV~4{Qm1282VfzW}xYz6GWL74()=U_M}XAT9sG zN^HKm3n#bN#_>R4OW;>PTIGekJoete5x@)}^^OU^4B$K$60q^#XvNaWUAapY&=`nW z`L-!6(1xrQWW=meW3XLZmY_4MM5_St2^qvo)tQyn;&VUaE)CF`RZ0gVKjSWq(wSA7 z3PxVYU7FEMr&fs?KKUMZzMGSnmDb&J*W@ly^Cu@|m3{#u&*aYE7(xu2BOxPK=PsQi z=ExYK)pNGe^1LeTL)6iA*{KZej0zO22aseLFM0#H5%H zqh87C*b|7B9YW8cC2UJ8kr}ULw(v;6*1GwSBsOiCvq#PQ&LWC}U3-}=w9I-QiJ235 zl&07;c$-qwR=IR+l`D~1Ps@z=Xqq{LhbJVq6r27iyhCQSdLHV!dfFtH=t+GmCuAPy zNySMs`$#zLY<}A2Ij7aCwAV%y#rcqeEgGf8dDQdJGqLZr6RSB|^KrVjk(C>*6>+*Z znXss-8*4FIt5dpQc6K%rI`7TQPH3)ge5~hD5*r?!_twV#Jm=fh+H1pa+XJ6jmX z>CQEFWwch+X;LhUIp|s}y*M(1FTP-C+5{%X$@^epTqEyz6QO3QD3} z8iZ0)5TWGuu5#H*Lv{e{5|>>C!}oD;Hu6$f-%q1sQP4lRum%`rS&)&F!8QOe@+Q@} z3~pCHG2E4eulpdBy8J25e9<^ga7N3>g%)&H={T36H|biYgB^p+EG-1u17q7A?{>Fg(FW>Bj~^sGsc+79B}6gycQJ zK^}o7f_zmY4X9EafB7R9@qd(Q%H%mH-^|L!c@<;p#%i(bX1rGjdoxzsMpJ;zgnAZtSIi{{mxx7;fzCFg2itX~$$p`T$G=VmUHjT#cq@{}#uXi}E$qSZ-{e zg5xM4COZ;V9ots}DdU@gW+0{nk{ghAg<$!z9V4>j4tx*9xMnYmhN1#PfEeHG>6JkW zfMCRwe1WMzKVTX#05}v_5I7822sjZ)8JY$x0YtS);PySh89NE_!Y9Yj zg~;y{6Z->+S*6l6UXk;0r`?I1S^4r`>ZtB~qcJh76pK)7G=eNnXI7~-76n**rtG(vVTT3llmF z*-k@t$dDa1WPcj63x@2LQ(R82?-|0EM#Q&<4D&a=beOT}C#HFuumUwEo*5P}Sqqj2 ziFdIFv7#AT5mtJ#rm8~*^y}L#2ygW3*QZa9zTH@4hL+!f5I3iES2$O1sSFwi)tEOQ z8(bh0TkC%1vX%%naaju3J1(OO#}BZcnOf*9gbA)p$70CC&OwxT`*9l%m&&Bz+RWF=Lu$7I#aELqi=zpkE`i zSW6fWBsbm!2n|vTU`1d{Al*}K4W!k;ZGh3hcEDI*2Oy1NDZm!MPQW(6&cJrSuE4Iq zZor=8)_a0{13@p~C?Gy=$#1vx0Zzkl8gKz{0B{>{5bzjqFz^rHP$0SaVL(?DVgxW4 zXa|M>Gl1mYM*_ovqkyG>-vaTL6|5%*sSd$7Ao&d3$FX+@P61{BrvgUKtuy}UHw)ROhQ)w1XP5&F0WJcD1G9is zv5SF?fcO+AAGhZLlW{yB*b%q@n5KtQ@vZ1~;>9Gy#EVJ5;!*yJ$fOX`0$E~KsjeZ5 zHDqKb5s&O7;?Y1WWHi)TS^n8tDoT31YCaT^vDv(&j@h^~%NMf4-h6@xkX9gvRMM3| zD(MeE^gFsqV=n<*4WuT$21q4PjS>(OB_L+ymtjIy8JQ3=>M%mqK(Ks>*wzrH5W`27 zG`y8}u2vg2KiOA{eFKC4d*iP-PE0?_DE+3h8*{aLpOj@C@<>tE1F0+#oH(gF;Ny`R*CMJ30a`dtP=GLA*1ahU{n?=pb%04@kZ_W+OY5<&|#Ls za0Yx=0gPsN!WT9HE68Q7xlC;HD71jzu8mm08)m$Kz6-Rsyo7mg({{nAOC{_Iq!M-q z`T%`17cO&SsGKQ?0A**G`ni;ZIoG}yg_G2lFv>j-sw8qVWHE!aubjo5a zGz?phk&RZ!1u^kPA!4Ep2^qDa;%wbwtu1tXyjU2^dHR{?sV1$a4J*Z!(FG|nQ6yq` z`506P*)d|DSB6zQy$ogHWesJ-gfe1y^B7bJ8L2IcZz_JNmZp|{Vu9r@J%Y|ysRf2r z;_0bm#6-!6StS>w5;B<>JG@dW3qOTbwMqQ+89QJY?5)-fLrf$mW~EmQ(9Ubf$SG7~ zCwFK*Z1WG?A1wZbI|3|)6(tEis;v!+=BkDwC&a|d#E4m?Wl$hw-xFh}4rn!C;|=dL zFUQd}T4(-vqwHEOG`ud?L8T!kvO`SVEfF#r=p&w*?ihG}o4CnnMp6NVKsGHiP{-7tLBDYr|v?V4CO%k6@_ z?RrLt2}Q)L^bQN!`3@ObsME)GabP7W9<-qgag$(UI<$~UhzXMr6ZIryR8QS?lQ=H# zrXGlATfCX{;mN6)5EGdoW|hVvk&w})L?6Q%NB3x7=2~Nbk)D`HPfS=-$jF)la;zcN zg_1eg?S0x~DhId55JM3$p@^8cS`spv?F{*kHL&V4D%TprxfZepF<}j2R^Ii5jK<^P z+#2Kpun;c7QS+dN71%j8$>2)JCd5Qmh*>3Srb0%2I>WHZ#Y6hzT6lPHSR@Es{k}#Ogh< z@Qn&p$m(8%?YWC3X9Z5`1Id)X;4kNLwNxr%qEy60!xb`WxO3UQGnkD0cuEV0R?}JT zFJGOa2lOyd>S-+^e37Awm{3K`$}e+;j6CNep2J>x=HT+`{y_zW8lIzNh8ki*4KYz~ zLPqtrjB->fH#5O!HLQur$;=Oi7GgpRG0}R2j9SkRA7w`0@PLT~GbO75vqsuH99_<7 zV&x{!9rpO^9i5oaOHBA3AtS%DR@iHGcU!K#w&u5C5$zQ()Q-Qa)z`@DCPODNp_7=E zUjqsmx%*8Y1A=us@$_4bXLho@rNT=4E=WRSLgr#3UwS60=ILU|%7ldmDGf%niw> zJlAef@}VyR`Erk@BGM+I;k zL_++Ga7X8Vh4+~mY%9VZz0|6QKj&GPjabCQ+>@A9+KUql*?!J)W?LDr^31lvUi0+S znuv)a5EIT&$jBMKX0dOyrf5v_--t;7vd}*KgOQq;NKMQt4MiFu8_rqI*)d_vozjFk zFbkk3s&qz&7q$Vc1v5-+W&X;p?$8i^1 zBV%w2D`2E2CejlVK3~Yl=NDk9W*a8`VoL^}zO>k5IZ5t>rZ3?I4L!t!9%5E{shuQb z1v$&90!_AI)X=BfVZlavVj?{;t3*SqkToX8vb=5i*#e87H7MmCi6WwhQVWC{r zP_!jt!m|+*qoI(|Xc)?_sW!SovlXBv>Z~jWM_msauUocmCzO@s%BW!z6AhafURw_p zLbi>V$d{tz$rr=Gc#B1=wgzM-p0`M@j`BuKp;ZG>hU%ST$Cw~AaD z<&Bug8!@YN6)J@61~Hah9V^$L{iXS{gjU`zEV_ox0|kz&!I$PA%SX)-IgIhPRSK)h zl~N9gi5wCWH_C-3Ak$Yw)HtR1p(CL&(Ty#DAuUG?-pEXsK$HF+7QDqcRc`Wh5pH zCS+u=B$?)zIWsuY^X@P$3`XtIhK2A}Tn`nHn8+0|;SPk1+yTC1tdD0`gKbGpKJ9qA zR!B!obiZ~oOZ(NrKOKHgToPb2*r6BI^>*bPz+AgRghLs7Q85YF8m54LA@+w!+CT`*F*$tmQg)1G3^Ai)D zgqWCY2-$onogy5{^Jd5O0nR3|GY|PeqmhrAA-P;fo=OHHAxsXvipChvDQ7vzlTUN8x&&~2eLlrTh zikOu@JQcFhP_>X$#pMnYeQKbdjbUP`p@o>xLQFJiA)_X}R1|#eFNP;2r-iE%;k39b z{oc?;Oz0veoR*N0)B2w6i^iORf69UH30e|^Ch{XsP3@JKXd=YK2ONa#7=^MYF}Au$ z9rcBcZ=LCX-4YtU(MU~9q$Vb&-a5zd`HHuLE}F_-xj_p6yWneMT~3BH2DFV*u+= z-^M?{^V3<&Mmi0ZH0+=epO}bGOnebX$WG#f2ifEXwwk7+|Emv5jn!vdiQCyiM)Qv=B5P}tsINHwO46?qcsspe=pZI^5EEAk zLN*mTZhV}P^UZ0(nA1@27)po5ZQvo-O>Kaf zXamHA{e_I||BwZ@=53%`YyCQem+u)*PHljg$Qm)>;Dn4E+_R6%7u}Xd?40twGL#S# zN{ET;Kp`6rC9m}Iz5k!fhY!*@MnBcP6ffX=uAB-;Ocaoqr~x6P8h}#jgRN6|EqgfGDu8Z

#FM3x*1xC2`$8|^x|kqmvP3T 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 aFJdLujI3SH=HvdkYS22X=CH^zh5iT5-7^aS delta 47388 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 x^)XBbBt5~-k*RT^KTJnEMk_OT5>( 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 diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/webrtc_i420.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/webrtc_i420.lib index 82d8ce7c3379f3792a869c28d6a87571dc6e9921..c833f420ecfe1e6debba07bcfab28a54a2fee9fe 100644 GIT binary patch delta 5766 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 delta 7357 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 diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/webrtc_jpeg.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/webrtc_jpeg.lib index 7599a4eb685f3dbe71c95edad79000f3e076f055..cbce5053608dc8a887716d6d962e6a5204f95bff 100644 GIT binary patch delta 3662 zcmZXX30RcX8pq#n28UH~J z9xNBSaJy7kmg!`V-i#5)qRDSLG7b5r#fQQt@p`)AM0$!_=gZ3 z6=gP?jmBtmTs(k~=aDA)lBqoD(I4W7raN|Mx+MJ`6_GK7=)?#T!Ixce9pq7`CVDfJ zC?oxmw*8{L z!1U6{w4^|yWYp40DM^?8%2GF-s~YKYFzEUztky!IH~8k|HUGFP(r59oOQx?U77(=x zefZliYLe(hbz8&Zh2QxX949&}^ezL6+Y;_Y91CT*uG#$elS z%2?XuT^y56R3tL~mcC|}*N}gk3~ldDO&jstOGNELuW{|s%#&hMo?mlzQu0<#9U-o*lgI*xVIoh-^YHoOJ7a{`rRw zoxZW@rITB1GDf;rWKe6xpbajmy-(d>OH!(QF|FT)e!N{Br9JBT`pM<}yW`J<6%b9r z0_&s+4}SRFsCQP6+Pdt*#`XW${VCCEp;vuSw({+k+~1CEXfb?#a9%eiAoRS^-|WmS zt-Ny5Yt8KwUG{@SY8NcFPV!cNJ>`><7ef7JJoH)3{7cJlFkN^D`{uhpeQe)P2i(Fx zzqB{)secm5LXSw%?znv9v7ljZ^o&_`;lIb($iO_d!pnyZH%7A81B011N6%gj8pb{} z7}#24BJ(iyXRjN~Z1CK9tkp1%9Wo}cg+cLb@lT$HyJjtL8f^2c+Oi6 z7VIOb;^Q4#hh3MXC`a?~PLATxUdIN8g?Oz~+%hk4L9sNkm6}*> znAujR0~9}dj#1HcCWc`BNby!OC-26Nko_Syk+47HrD&9l$$M}P$o|M&k+46K z=j7UVcqN{1U;D1p%&xK52{p^BK3QAc^Kts>+U+}c>Nm`| zgKuptzV>=6|87{xzqM8Pc3N6^zqKc|Yc_*QdaKg;QICt=W|8gbjY@W7%t?E8gJNm0 z*SySI``Pgx(b^8H``xL##B}^{;&(P=bci&LC5+C_UWM)9p3H}y zg%vNXEwJDhq3wh@s;Ch4S|J&6bN#5a ztT@A3VIzN3+;~qduP7~^QkGv_ggntE-|X3LVBQ%H(0*R`f%wJ zMWiAP=5rNsH|Bpg@b!s8A{KF5pFW4kLmmtv2WuC}o{vnHK4C{A3vCf7P!G)vJ_ja& z&x2`T1NbP&z=a^ZxLgKq0G|YLf8v0ycxV`tn;~Gsv$Be5?E+_$qh+ zd=0-Y@;5Nvfba{r4OC(DZ-ZVSZmp~b9pHFy7nlR?2G@Y^gU^9`!56`Huo>(Cw}Kyo zJHZ3&{V0>?5%ho`T=Jx^9Ot8aq)fg@+{c6<^6(joqYS}E%LBkepcgm^(Un&AS)NqY zXL-=6ds+{-9BE_pQa*3CA0l6W9=<>`yqhl29qjIF{!7pw>90WEO){dh8*Vwf;g+)- zr`CgXvZFobU+RhDVETxk=L}&j$2UM&P54d|)=qpM6;=nn__0Ne&+$!TyW&E9r;7B; zSfEFQbpuu$yAn6hbBah?)kGN%ZG5xJ#^+=~j71S1PGHQw;AxOA&-dUQ@C>*BJO`G6 z@D{Qa>;+eY7r|QaCvYu@vn#iN*TMI|o8W%%7ZBS)zk*mV8{LM%SDPe~(Kx9KV<{H~IWGBg0}5Bh=7Xec-yG=Q@}BbW!8Kz`Okz@?InXatNZ z2zbZH+@pnqjUXx#c|9-149rbm!FSxW%*+10@y94;;k03fDTmm>8iN!JQdDXa{C}P{%hP3%;PJ zU|Dgq7)aGhUPRJOFp>PSg?Uvl^)-%t;UjEy(mAEINT$B5Uw znT<#pp*EH$Ii{st)!F{~?&3F0C;j=|g$WA%uMfKqgud_K`iUpQZf5S;`KEWrhndLbob4E&{~sxdXY&zH<{APTl=;~S0zJWDAnzm;G=dRe2p9=w SfzfPcVZQSyI=Tvvs{apMroR6G delta 3206 zcmZYB3se->83*uhb`cg>VON(`RGy+J4|%N%21OQFK?Mbr2#5*@DoL%6;2XmnLCrD{ ziPr}hsMvB0o>~>wCZsijkBSkk(t5P@iH{hyiI21mG+OEZ&SH*9?>RHSZ@xQo@66ph zcjtVU@av00^$7bg<9LHHoZT9r|0v2hC{a!H)2&(DqrXT+ zfbDVcWS3NSisS%x+`-pLkF#b55ETZn$Efjkw6kA^!wrEfz|nWW?*fTBnBeHemZPEz zN8bjq^^U#+y@H8aLTz2>co(c4C#(-6iZQZtj=qZJM(Y#D4cgKXedq5RR!27HZyj2B zC1=fjA``CC2n%EW^L5_WQ#x<=)b76iv3Ql}eK}8!D~If~OM1M%hb>Pmacd-Mlk-=P zD??rX>io&|)dRbt?g!>0De!hmzF4~UP{X{JS9UgdUN|?u3+>DK+~Aun^NQB_J-@Er z^6KvwE$4`~$Q9#08XKIv$9c_B!K<_4O#O4BPIfD6NU0h_q!H@=IrPBXA3m>lT%ekK zvrSh?G)>M=e5>tFz>$ps2Ub0-*}kv!ERjXd?=hU+aP-#kZ!GyfyT>M*JkXk)kNj`X zy~_O+`*yXeELGLj=|oTD{HQ~_>`k;w*;M`R!aMHycnUYP;)`vIC^`{m%zJKM^(?6+#E_{0|dHrvQ9?AKCZAxxYM0g(dNqw)*WpP9b zk-r@)&C)9t*|BBWdPSQZJDjCw@g7syhslH4HLttOd#)#Q_u0uRa>lb-uPD~*5x|al z`?Ci=TBga-vVkc&R__tQ{Je}T)-#s1<)ol4oOS!y^PD2@7YNNvHFx}WFF(`-v2}Cf ztjt#@C?bv410(+}2<_IrqdGW?{a15tjad%Z%zzT1n4J$89#m6YRJK+}#S10XAMvYD zbmz)UDb_Cf)XFrAxv9#0Ftx+nfIL}Js@dQ`KXr|yN_)r?lDUD!2L=i?Y+0b2(7-ka z8cVAsbCYG=2uW{=^OjsXOnw*|lJwHFgjNhXSxhSVz+zIvxCBdPj^rYxC0Md^C3`6; z!BTs~c0Q_Vj`Gmub!t|++-cQj>g(&Xn8k?pveVvGRk=8-+8N7pDdm>Zj1Mg4#tG&o z*DcMwJ9C}XaiZJKVy=|TB~q+9;=0mYXEE=nno5@Pdfw9ar-W4*Qc9z=s!8f_J={|p zcv8wJ>FQN>c0F=Ed{&B6E6*rTNH4mcD*KdumhwrwL+MOy*(YN}MuY9Sab86GqqknM4Z(gwBx?xH2%e3f3+n^vNRP1{D@PL$jgcc0q6j(S zuT406=I@@tSEOQGWrsX3IRl7%NF^WReWB=|)pw%aj<8aq;O(RsTx%kYR!;QqGFj_5 zBj(c6acL=yc!E{P>**cRl2$9?I16X%sUWX7j|L%Cja0mxT2oX|yo3fL*Ysm5gMST@=VemsZ5pIKtuo}*U+aYg%H_U_ea2wnU8{j_p3B*z$ z9)$bh4cG+vTJ~Ew9v*^|;9+Qn%|!NM8Uic39OmQ9o5CLhIa6axxK7AuN6cRz{DsKn zGhBvKs1*)^pF{rJOvL6uYx^T-D(R1$=*Ew^?$+(RUCz`W`-qJ@5yJP3(g&p`AeV3aTLfUd4eB zIZ*>0VKh|3InV{>LRYvH4ubCqr5IWSB}llzt#BCJ0Y|_+&;#y=zOV(3gvVh3yaR*a z0~idS!4TL3@v?|7p#cuV=te@mcHpMObT|nvFGY}mU>%$SOCa7VaWk9>tKf843n#-y z7z+>f=Rbvbd&QG51zv(PU^h&Kk6}7|0cS&Z{PJ(Z@h}?}PDGG{APFvj(;%5p&g_^HDSexkM zF)NChk7=l)S7D7dg$mYfaYqF9ZrmVNv{-GOp70OlaHkMMl=qt@EFvsi{z?sFsY#<9 zGw?b28RoYyYqlS5-ILU%(e-~yz40YAh1l&ZefU;%sS(7LE1sGz54^m-V%Lg&cSh^w zxsLq*f3ge^X<8wqKG;a};_WGzgZyVhPB W9Y!;;AkQ`@*u0nuYgyq`<^KT9A0e;+ diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/webrtc_utility.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/webrtc_utility.lib index 482766a6be79c46a3d48bed728b2370e94c59cea..35ac5c13a696da3f107d2ca41d31dae6dfe23984 100644 GIT binary patch delta 2178 zcmZ`)dr(wm6hHTVyQ{lFy9>C>Lw6BqNm6p-txzFOU>Wn2y2n5D-{P z@){o^h^B(_P;kwg3dv^3NQ$WCBf=+HR4C{;rlUjW-UWt{asN5r`OZ1NbI$La`)y;F zx}{59Fj^L3G#dQ^xrxg(b;0xehNzZmKa;Uvw@h3nV{K=Ddh1hG<6;c*4-9b^ev1{; z886T!g~wC}0j#3Rc-GC5v%FZtc4%mNDjUz`n7mbvPZxf9TC!r=Ipq|`3*S`iu{4uvOMqAlcdklB^hx2Cn^m8@-JdkWQr|v{8J<<&u~@2lIjd#sol#L3$d~&th7bGG z@N3sGOWzriN9!EuZwwl2IS4RiOz3QYJwnUx@lgjDt$r9bpVZ8x1`J?sd%@JIhhox2 zN>(Wp&#zIkb2P6Yq*m-)OMBiTLEP$pwfs~AJHp2Xn!%rsW$hh@fEq+Rc|5z$MQ92~ zuz(%L1no{^Zw;@uBb|*1Wh6WjUEweUQ$ss1uqwIGvbzyrwm4mHzVIeLgbbuzvXne=vZb{xxoe<*u)lFIajv-J zzAXSH3{}OmuKa=Z5q#xr(`_YRT#GBom zLUmP)hcp7O%yeuf@s_rx02pX=Ch?TbO9j|&qO~ekC&MoR&Y0+pL+I^^=jYUl-ZFg} zz@~J%TZ6dHc>Nt!Z^G;I=>Wz|s=`Rc61-lY32-g5a5<{E48R>!6SBl8g$~UnS;%`< zp_=uOwc_zeHtkWPt6*x&2DqP1-JQ_J<^cSiBif{{XdB5{k9#V5@Z_->z#-QLScv-6 zT!7zlxrGfn#R|-4mj{rXZ>w@Fn#*Z#7FOAu5Adg1tWt`7zyunejSN(80jQ>l*~mb` zR;;~%uF5AmMGpeC7XbXc%|_!)jCh0I#t3FTHRcc}TIRqirBb~9O3=Nf90#zGF33Tk zW7`3yP|nn-Q|Qs5mI7R$V#9aw*jywwB@-I{qlmk;(u2C!FcKNr0iY}v>y`=Zh8K&r zwraG^F9!H}r;XxiXuG--z`djp2cd|=N~1~u_LbTgiA3|2Qh+hLxI+ydviZ9Zsmw<4 zHZ(0N1L!TIvBGqcaaWYPai-sLI;&3l5t@5xUM`Xqx)*@oYx5e9UcaKwl+zoz#Dhtq zOdh(_mjh%~U{^Xt33?P&0QgsOt=MxI;vB2Q$F$N05Q-J5s{o>_xf`c&Mrf|6#>_S1 ziU>@*)Bwm2bG{gygKF7fB)g8TPC)De#O|&GNIfd>DUU_`fYc)hOyU@^5fW3-|XU{WJBrQyKk=ye43 zlZ`@ERCNehZ$f>)RiITr5+ko#g-@wQi0n8Gkl1AVSYF4-vL-RFxWqM0xHe7VxNqX| z^cfrZ>(K4?8Gt#>+`FfA@*)JRZN|~j(k;Z3Y2mF~$WhmUcZ6@RAYQ|tOGkh&V45Y0rzJf88gO29;r?BoPKi@jt`hv04BC delta 2263 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 XI-#VSSQ73vh6}Ms>b2&&aC*uQ-resz delta 79822 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 UNX@mxnl@R}hOYnr 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 XsO>?Ys`rS|#p|osNHO6YJ<9(-sG6Q; literal 55678 zcmeJG34B!5`3H>OApt@XOaf6+Q3nW$vX~7Bi)JQ!Aj^}=|4_BNMxG`4yjYrHFZ{7nwWB4?pv@lp-ZRc=>NPh)F`x6|L~_jPra zcpIC&JywK`Ya;Qeb>$RznTu6AM9LyqM*5n)T~X39I%4XK{VjWjMFDGc2{1A=3sa<3 z0YjoAruNLX$aq$s19BHpp$UyBt4xPPMo5|O@TBLJIu=$|EG%&5S32svE6Q_O!Q7dv zy*<5X-rSiPx!LLbKPxxQ=@dmNwkRd4=yEPDbx=n%)9wT4?|nm$>k-bopJ~>l~3PP%Dz_`jshEUM7fG-r9^ovMO(jx5wMr z;y-O7D4@4p&}{kW+QH zx5?MyYbxz*>2hQ`>as;e(UCj6?seT>pvbwj)8}_~HdlN7p!YUgWx-m|5Rf!_9gwxi zMC6YQg!Gv#dileW37snUwYU3vVKX|L-M$WQufMUQ+u`;#tzyV9KGjao0v4{KYmHT8 zu2XNUDsQW=7y2S=kl)qO-46B1Z)|U0(b%*qQmeR}wK9Qh6@y#~PvhLZzda0Z#=L9cii>{ocro1?O6@ZCQs7;cRd3 zY6890z_;%)WpOdH1T)%G%c`KxE@y%0Ad0M-gKLu&akbN+ZEx)LQ~!&-0yuIra-*nz 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 DjsL)S diff --git a/branches/2.0/doubango/tinyDAV/droid-makefile b/branches/2.0/doubango/tinyDAV/droid-makefile index 36d141a1..4c07a808 100644 --- a/branches/2.0/doubango/tinyDAV/droid-makefile +++ b/branches/2.0/doubango/tinyDAV/droid-makefile @@ -163,7 +163,8 @@ LDFLAGS := $(LDFLAGS_LIB) -L$(THIRDPARTIES_LIB) -L$(THIRDPARTIES_MARCH_LIB) \ all: $(APP) OBJS = \ - src/tdav.o + src/tdav.o \ + src/tdav_session_av.o ### audio OBJS += src/audio/tdav_consumer_audio.o \ @@ -181,7 +182,8 @@ OBJS += src/video/tdav_consumer_video.o \ src/video/tdav_converter_video.o \ src/video/tdav_runnable_video.o \ src/video/tdav_session_video.o \ - src/video/tdav_video_jitterbuffer.o + src/video/jb/tdav_video_frame.o \ + src/video/jb/tdav_video_jb.o ### msrp OBJS += src/msrp/tdav_consumer_msrp.o \ @@ -220,6 +222,10 @@ OBJS += src/codecs/speex/tdav_codec_speex.o ### codecs (DTMF) OBJS += src/codecs/dtmf/tdav_codec_dtmf.o + ### codecs (FEC) +OBJS += src/codecs/fec/tdav_codec_red.o \ + src/codecs/fec/tdav_codec_ulpfec.o + ### codecs (H.261) OBJS += src/codecs/h261/tdav_codec_h261.o diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/audio/tdav_session_audio.h b/branches/2.0/doubango/tinyDAV/include/tinydav/audio/tdav_session_audio.h index 0b94d82e..bdf42cac 100644 --- a/branches/2.0/doubango/tinyDAV/include/tinydav/audio/tdav_session_audio.h +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/audio/tdav_session_audio.h @@ -25,19 +25,13 @@ * * @author Mamadou Diop * - */ #ifndef TINYDAV_SESSION_AUDIO_H #define TINYDAV_SESSION_AUDIO_H #include "tinydav_config.h" -#include "tinymedia/tmedia_session.h" -#if HAVE_SRTP -# include "tinyrtp/trtp_srtp.h" -#endif - -#include "tsk_safeobj.h" +#include "tinydav/tdav_session_av.h" TDAV_BEGIN_DECLS @@ -45,9 +39,7 @@ typedef tsk_list_t tdav_session_audio_dtmfe_L_t; typedef struct tdav_session_audio_s { - TMEDIA_DECLARE_SESSION_AUDIO; - - tsk_bool_t useIPv6; + TDAV_DECLARE_SESSION_AV; struct { unsigned created; @@ -55,12 +47,17 @@ typedef struct tdav_session_audio_s } timer; struct { - tmedia_codec_t* codec; + uint32_t payload_type; + struct tmedia_codec_s* codec; + void* buffer; tsk_size_t buffer_size; } encoder; struct { + uint32_t payload_type; + struct tmedia_codec_s* codec; + void* buffer; tsk_size_t buffer_size; struct { @@ -70,35 +67,9 @@ typedef struct tdav_session_audio_s } resampler; } decoder; - char* local_ip; - - /* NAT Traversal context */ - tnet_nat_context_handle_t* natt_ctx; - - char* remote_ip; - uint16_t remote_port; - - struct trtp_manager_s* rtp_manager; - - struct tmedia_consumer_s* consumer; - struct tmedia_producer_s* producer; struct tmedia_denoise_s* denoise; - - tsk_bool_t rtcp_enabled; tdav_session_audio_dtmfe_L_t* dtmf_events; - - TSK_DECLARE_SAFEOBJ; - -#if HAVE_SRTP - struct { - int32_t tag; - trtp_srtp_crypto_type_t crypto_type; - char key[64]; - tsk_bool_t pending; - }remote_srtp_neg; - tmedia_srtp_mode_t srtp_mode; -#endif } tdav_session_audio_t; diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/fec/tdav_codec_red.h b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/fec/tdav_codec_red.h new file mode 100644 index 00000000..4e73e314 --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/fec/tdav_codec_red.h @@ -0,0 +1,47 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tdav_codec_red.h + * @brief RTP Payload for Redundant Audio Data as per RFC 2198 + */ +#ifndef TINYDAV_CODEC_RED_H +#define TINYDAV_CODEC_RED_H + +#include "tinydav_config.h" + +#include "tinymedia/tmedia_codec.h" + +TDAV_BEGIN_DECLS + +struct trtp_rtp_packet_s; +struct tdav_codec_red_s; + +/** callback for redundant data */ +typedef int (*tdav_codec_red_rtppacket_cb_f)(const void* callback_data, const struct trtp_rtp_packet_s* packet); + +int tdav_codec_red_set_callback(struct tdav_codec_red_s *self, tdav_codec_red_rtppacket_cb_f callback, const void* callback_data); + +TINYDAV_GEXTERN const tmedia_codec_plugin_def_t *tdav_codec_red_plugin_def_t; + +TDAV_END_DECLS + +#endif /* TINYDAV_CODEC_RED_H */ diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/fec/tdav_codec_ulpfec.h b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/fec/tdav_codec_ulpfec.h new file mode 100644 index 00000000..3f6cc24c --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/fec/tdav_codec_ulpfec.h @@ -0,0 +1,46 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tdav_codec_ulpfec.h + * @brief Forward Error Correction (FEC) implementation as per RFC 5109 + */ +#ifndef TINYDAV_CODEC_ULPFEC_H +#define TINYDAV_CODEC_ULPFEC_H + +#include "tinydav_config.h" + +#include "tinymedia/tmedia_codec.h" + +TDAV_BEGIN_DECLS + +struct tdav_codec_ulpfec_s; +struct trtp_rtp_packet_s; + +int tdav_codec_ulpfec_enc_reset(struct tdav_codec_ulpfec_s* self); +int tdav_codec_ulpfec_enc_protect(struct tdav_codec_ulpfec_s* self, const struct trtp_rtp_packet_s* rtp_packet); +tsk_size_t tdav_codec_ulpfec_enc_serialize(const struct tdav_codec_ulpfec_s* self, void** out_data, tsk_size_t* out_max_size); + +TINYDAV_GEXTERN const tmedia_codec_plugin_def_t *tdav_codec_ulpfec_plugin_def_t; + +TDAV_END_DECLS + +#endif /* TINYDAV_CODEC_ULPFEC_H */ \ No newline at end of file diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/g711/tdav_codec_g711.h b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/g711/tdav_codec_g711.h index 96ac6e9a..fcf9995d 100644 --- a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/g711/tdav_codec_g711.h +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/g711/tdav_codec_g711.h @@ -25,7 +25,6 @@ * * @author Mamadou Diop * - */ #ifndef TINYDAV_CODEC_G711_H #define TINYDAV_CODEC_G711_H diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h263/tdav_codec_h263.h b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h263/tdav_codec_h263.h index f2349753..6b69bf23 100644 --- a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h263/tdav_codec_h263.h +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h263/tdav_codec_h263.h @@ -37,72 +37,8 @@ #include "tinymedia/tmedia_codec.h" -#include - TDAV_BEGIN_DECLS -#define TDAV_CODEC_H263(self) ((tdav_codec_h263_t*)(self)) - -typedef enum tdav_codec_h263_type_e -{ - tdav_codec_h263_1996, - tdav_codec_h263_1998, - tdav_codec_h263_2000, -} -tdav_codec_h263_type_t; - -/** H.263-1996 codec */ -typedef struct tdav_codec_h263_s -{ - TMEDIA_DECLARE_CODEC_VIDEO; - - tdav_codec_h263_type_t type; - - struct{ - uint8_t* ptr; - tsk_size_t size; - } rtp; - - // Encoder - struct{ - AVCodec* codec; - AVCodecContext* context; - AVFrame* picture; - void* buffer; - } encoder; - - // decoder - struct{ - AVCodec* codec; - AVCodecContext* context; - AVFrame* picture; - - void* accumulator; - uint8_t ebit; - tsk_size_t accumulator_pos; - uint16_t last_seq; - } decoder; -} -tdav_codec_h263_t; - -#define TDAV_DECLARE_CODEC_H263 tdav_codec_h263_t __codec_h263__ - -int tdav_codec_h263_init(tdav_codec_h263_t* self, tdav_codec_h263_type_t type, enum CodecID encoder, enum CodecID decoder); -int tdav_codec_h263_deinit(tdav_codec_h263_t* self); - -/** H.263-1998 codec */ -typedef struct tdav_codec_h263p_s -{ - TDAV_DECLARE_CODEC_H263; -} -tdav_codec_h263p_t; - -/** H.263-2000 codec */ -typedef struct tdav_codec_h263pp_s -{ - TDAV_DECLARE_CODEC_H263; -} -tdav_codec_h263pp_t; TINYDAV_GEXTERN const tmedia_codec_plugin_def_t *tdav_codec_h263_plugin_def_t; TINYDAV_GEXTERN const tmedia_codec_plugin_def_t *tdav_codec_h263p_plugin_def_t; diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h264/tdav_codec_h264.h b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h264/tdav_codec_h264.h index c76f5b10..9b75b028 100644 --- a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h264/tdav_codec_h264.h +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h264/tdav_codec_h264.h @@ -36,47 +36,14 @@ #include "tinydav/codecs/h264/tdav_codec_h264_common.h" -#include - TDAV_BEGIN_DECLS -typedef struct tdav_codec_h264_s -{ - TDAV_DECLARE_CODEC_H264_COMMON; - - // Encoder - struct{ - AVCodec* codec; - AVCodecContext* context; - AVFrame* picture; - void* buffer; - int64_t frame_count; - } encoder; - - // decoder - struct{ - AVCodec* codec; - AVCodecContext* context; - AVFrame* picture; - - void* accumulator; - tsk_size_t accumulator_pos; - tsk_size_t accumulator_size; - uint16_t last_seq; - } decoder; -} -tdav_codec_h264_t; - -TINYDAV_GEXTERN const tmedia_codec_plugin_def_t *tdav_codec_h264_bp10_plugin_def_t; -TINYDAV_GEXTERN const tmedia_codec_plugin_def_t *tdav_codec_h264_bp20_plugin_def_t; -TINYDAV_GEXTERN const tmedia_codec_plugin_def_t *tdav_codec_h264_bp30_plugin_def_t; +TINYDAV_GEXTERN const tmedia_codec_plugin_def_t *tdav_codec_h264_base_plugin_def_t; +TINYDAV_GEXTERN const tmedia_codec_plugin_def_t *tdav_codec_h264_main_plugin_def_t; static inline tsk_bool_t tdav_codec_h264_is_ffmpeg_plugin(const tmedia_codec_plugin_def_t *plugin) { - if(plugin && (plugin == tdav_codec_h264_bp10_plugin_def_t || plugin == tdav_codec_h264_bp20_plugin_def_t || plugin == tdav_codec_h264_bp30_plugin_def_t)){ - return tsk_true; - } - return tsk_false; + return(plugin && ((plugin == tdav_codec_h264_base_plugin_def_t) || (plugin == tdav_codec_h264_main_plugin_def_t))); } TDAV_END_DECLS diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h264/tdav_codec_h264_common.h b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h264/tdav_codec_h264_common.h index 907c9fe5..b544b4ab 100644 --- a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h264/tdav_codec_h264_common.h +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h264/tdav_codec_h264_common.h @@ -26,6 +26,7 @@ #include "tinydav/codecs/h264/tdav_codec_h264_rtp.h" #include "tinymedia/tmedia_codec.h" +#include "tinymedia/tmedia_defaults.h" #include "tsk_memory.h" #include "tsk_string.h" @@ -55,21 +56,12 @@ typedef enum packetization_mode_e{ } packetization_mode_t; -typedef enum tdav_codec_h264_profile_e -{ - tdav_codec_h264_bp99, - - tdav_codec_h264_bp10, - tdav_codec_h264_bp20, - tdav_codec_h264_bp30, -} -tdav_codec_h264_profile_t; - typedef struct tdav_codec_h264_common_s { TMEDIA_DECLARE_CODEC_VIDEO; - tdav_codec_h264_profile_t profile; + profile_idc_t profile; + level_idc_t level; packetization_mode_t pack_mode; @@ -82,10 +74,73 @@ tdav_codec_h264_common_t; #define TDAV_CODEC_H264_COMMON(self) ((tdav_codec_h264_common_t*)(self)) #define TDAV_DECLARE_CODEC_H264_COMMON tdav_codec_h264_common_t __video__ +typedef struct tdav_codec_h264_common_level_size_xs +{ + level_idc_t level; + unsigned width; + unsigned height; +} +tdav_codec_h264_common_level_size_xt; + +static const tdav_codec_h264_common_level_size_xt tdav_codec_h264_common_level_sizes [] = +{ + {level_idc_1_0, 128, 96}, + {level_idc_1_b, 128, 96}, + {level_idc_1_1, 176, 144}, + {level_idc_1_2, 320, 240}, + {level_idc_1_3, 352, 288}, + {level_idc_2_0, 352, 288}, + {level_idc_2_1, 352, 480}, + {level_idc_2_2, 352, 480}, + {level_idc_3_0, 720, 480}, + {level_idc_3_1, 1280, 720}, + {level_idc_3_2, 1280, 720}, + {level_idc_4_0, 2048, 1024}, + {level_idc_4_1, 2048, 1024}, + {level_idc_4_2, 2048, 1080}, + {level_idc_5_0, 20560, 1920}, + {level_idc_5_1, 4096, 2048}, + {level_idc_5_2, 4096, 2048} +}; + +static int tdav_codec_h264_common_size_from_level(level_idc_t level, unsigned *width, unsigned *height) +{ + tsk_size_t i; + for(i = 0; i < sizeof(tdav_codec_h264_common_level_sizes)/sizeof(tdav_codec_h264_common_level_sizes[0]); ++i){ + if(tdav_codec_h264_common_level_sizes[i].level == level){ + *width = tdav_codec_h264_common_level_sizes[i].width; + *height = tdav_codec_h264_common_level_sizes[i].height; + return 0; + } + } + return -1; +} + +static int tdav_codec_h264_common_level_from_size(unsigned width, unsigned height, level_idc_t *level) +{ + tsk_size_t i; + for(i = 0; i < sizeof(tdav_codec_h264_common_level_sizes)/sizeof(tdav_codec_h264_common_level_sizes[0]); ++i){ + if(tdav_codec_h264_common_level_sizes[i].width >= width && tdav_codec_h264_common_level_sizes[i].height >= height){ + *level = tdav_codec_h264_common_level_sizes[i].level; + return 0; + } + } + return -1; +} + + static int tdav_codec_h264_common_init(tdav_codec_h264_common_t * h264) { if(h264){ - + // because at this step 'tmedia_codec_init()' is not called yet and we need default size to compute the H.264 level + if(TMEDIA_CODEC_VIDEO(h264)->out.width == 0 || TMEDIA_CODEC_VIDEO(h264)->in.width == 0){ + unsigned width, height; + tmedia_pref_video_size_t pref_size = tmedia_defaults_get_pref_video_size(); + if(tmedia_video_get_size(pref_size, &width, &height) == 0){ + TMEDIA_CODEC_VIDEO(h264)->out.width = TMEDIA_CODEC_VIDEO(h264)->in.width = width; + TMEDIA_CODEC_VIDEO(h264)->out.height = TMEDIA_CODEC_VIDEO(h264)->in.height = height; + } + } } return 0; } @@ -100,11 +155,14 @@ static int tdav_codec_h264_common_deinit(tdav_codec_h264_common_t * h264) return 0; } -static tdav_codec_h264_profile_t tdav_codec_h264_common_get_profile(const char* fmtp) +static int tdav_codec_h264_get_profile_and_level(const char* fmtp, profile_idc_t *profile, level_idc_t *level) { - tdav_codec_h264_profile_t profile = tdav_codec_h264_bp99; tsk_size_t size = tsk_strlen(fmtp); int start, end; + int ret = -1; + + *profile = profile_idc_none; + *level = level_idc_none; if((start = tsk_strindexOf(fmtp, size, "profile-level-id")) !=-1){ tsk_param_t* param; @@ -123,26 +181,12 @@ static tdav_codec_h264_profile_t tdav_codec_h264_common_get_profile(const char* switch(p_idc){ case profile_idc_baseline: - switch(l_idc){ - case level_idc_1_0: - case level_idc_1_b: - case level_idc_1_1: - case level_idc_1_2: - case level_idc_1_3: - profile = tdav_codec_h264_bp10; - break; - case level_idc_2_0: - case level_idc_2_1: - case level_idc_2_2: - profile = tdav_codec_h264_bp20; - break; - case level_idc_3_0: - profile = tdav_codec_h264_bp30; - break; - } + case profile_idc_main: + *profile = p_idc; + *level = l_idc; + ret = 0; break; case profile_idc_extended: - case profile_idc_main: case profile_idc_high: default: /* Not supported */ @@ -152,7 +196,7 @@ static tdav_codec_h264_profile_t tdav_codec_h264_common_get_profile(const char* TSK_OBJECT_SAFE_FREE(param); } } - return profile; + return ret; } TDAV_END_DECLS diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h264/tdav_codec_h264_rtp.h b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h264/tdav_codec_h264_rtp.h index 9257a891..c3595a19 100644 --- a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h264/tdav_codec_h264_rtp.h +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h264/tdav_codec_h264_rtp.h @@ -77,7 +77,15 @@ typedef enum level_idc_e { level_idc_2_0 = 20, level_idc_2_1 = 21, level_idc_2_2 = 22, - level_idc_3_0 = 30 + level_idc_3_0 = 30, + level_idc_3_1 = 31, + level_idc_3_2 = 32, + level_idc_4_0 = 40, + level_idc_4_1 = 41, + level_idc_4_2 = 42, + level_idc_5_0 = 50, + level_idc_5_1 = 51, + level_idc_5_2 = 52, } level_idc_t; diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/mp4ves/tdav_codec_mp4ves.h b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/mp4ves/tdav_codec_mp4ves.h index 9af90785..73bd11d7 100644 --- a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/mp4ves/tdav_codec_mp4ves.h +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/mp4ves/tdav_codec_mp4ves.h @@ -38,43 +38,8 @@ #include "tinymedia/tmedia_codec.h" -#include - TDAV_BEGIN_DECLS -typedef struct tdav_codec_mp4ves_s -{ - TMEDIA_DECLARE_CODEC_VIDEO; - - int profile; - - struct{ - uint8_t* ptr; - tsk_size_t size; - } rtp; - - // Encoder - struct{ - AVCodec* codec; - AVCodecContext* context; - AVFrame* picture; - void* buffer; - } encoder; - - // decoder - struct{ - AVCodec* codec; - AVCodecContext* context; - AVFrame* picture; - - void* accumulator; - uint8_t ebit; - tsk_size_t accumulator_pos; - uint16_t last_seq; - } decoder; -} -tdav_codec_mp4ves_t; - TINYDAV_GEXTERN const tmedia_codec_plugin_def_t *tdav_codec_mp4ves_plugin_def_t; TDAV_END_DECLS diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/theora/tdav_codec_theora.h b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/theora/tdav_codec_theora.h index 1a896c58..5912b17a 100644 --- a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/theora/tdav_codec_theora.h +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/theora/tdav_codec_theora.h @@ -37,50 +37,8 @@ #include "tinymedia/tmedia_codec.h" -#include "tsk_buffer.h" - -#include - TDAV_BEGIN_DECLS -typedef struct tdav_codec_theora_s -{ - TMEDIA_DECLARE_CODEC_VIDEO; - - struct{ - uint8_t* ptr; - tsk_size_t size; - } rtp; - - // Encoder - struct{ - AVCodec* codec; - AVCodecContext* context; - AVFrame* picture; - void* buffer; - - uint64_t conf_last; - int conf_count; - } encoder; - - // decoder - struct{ - AVCodec* codec; - AVCodecContext* context; - AVFrame* picture; - - tsk_bool_t opened; - uint8_t conf_ident[3]; - tsk_buffer_t* conf_pkt; - - void* accumulator; - uint8_t ebit; - tsk_size_t accumulator_pos; - uint16_t last_seq; - } decoder; -} -tdav_codec_theora_t; - TINYDAV_GEXTERN const tmedia_codec_plugin_def_t *tdav_codec_theora_plugin_def_t; TDAV_END_DECLS diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/vpx/tdav_codec_vp8.h b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/vpx/tdav_codec_vp8.h index 95b2dda0..830c36ea 100644 --- a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/vpx/tdav_codec_vp8.h +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/vpx/tdav_codec_vp8.h @@ -43,42 +43,6 @@ TDAV_BEGIN_DECLS -/* VP8 codec */ -typedef struct tdav_codec_vp8_s -{ - TMEDIA_DECLARE_CODEC_VIDEO; - - // Encoder - struct{ - unsigned initialized:1; - vpx_codec_pts_t pts; - vpx_codec_ctx_t context; - uint16_t pic_id; - uint16_t gop_size; - uint64_t frame_count; - - struct{ - uint8_t* ptr; - tsk_size_t size; - } rtp; - } encoder; - - // decoder - struct{ - unsigned initialized:1; - vpx_codec_ctx_t context; - void* accumulator; - tsk_size_t accumulator_pos; - tsk_size_t accumulator_size; - uint16_t last_seq; - unsigned last_PartID:4; - unsigned last_S:1; - unsigned last_N:1; - unsigned frame_corrupted; - } decoder; -} -tdav_codec_vp8_t; - TINYDAV_GEXTERN const tmedia_codec_plugin_def_t *tdav_codec_vp8_plugin_def_t; TDAV_END_DECLS diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/tdav.h b/branches/2.0/doubango/tinyDAV/include/tinydav/tdav.h index a0085475..6ec9c8ca 100644 --- a/branches/2.0/doubango/tinyDAV/include/tinydav/tdav.h +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/tdav.h @@ -35,6 +35,7 @@ TDAV_BEGIN_DECLS +// @tinyWRAP typedef enum tdav_codec_id_e { tdav_codec_id_none = 0x00000000, @@ -62,9 +63,12 @@ typedef enum tdav_codec_id_e tdav_codec_id_h263 = 0x00010000<<1, tdav_codec_id_h263p = 0x00010000<<2, tdav_codec_id_h263pp = 0x00010000<<3, - tdav_codec_id_h264_bp10 = 0x00010000<<4, - tdav_codec_id_h264_bp20 = 0x00010000<<5, - tdav_codec_id_h264_bp30 = 0x00010000<<6, + tdav_codec_id_h264_bp = 0x00010000<<4, + tdav_codec_id_h264_mp = 0x00010000<<5, + tdav_codec_id_h264_hp = 0x00010000<<6, + tdav_codec_id_h264_bp10 = tdav_codec_id_h264_bp, // @deprecated + tdav_codec_id_h264_bp20 = tdav_codec_id_h264_bp, // @deprecated + tdav_codec_id_h264_bp30 = tdav_codec_id_h264_bp, // @deprecated tdav_codec_id_h264_svc = 0x00010000<<7, tdav_codec_id_theora = 0x00010000<<8, tdav_codec_id_mp4ves_es = 0x00010000<<9, diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/tdav_session_av.h b/branches/2.0/doubango/tinyDAV/include/tinydav/tdav_session_av.h new file mode 100644 index 00000000..d9c181b6 --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/tdav_session_av.h @@ -0,0 +1,109 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tdav_session_av.h + * @brief Audio/Video base Session plugin + * + * @author Mamadou Diop + */ + +#ifndef TINYDAV_SESSION_AV_H +#define TINYDAV_SESSION_AV_H + +#include "tinydav_config.h" + +#include "tinymedia/tmedia_session.h" +#if HAVE_SRTP +# include "tinyrtp/trtp_srtp.h" +#endif + +#include "tsk_safeobj.h" + +TDAV_BEGIN_DECLS + +#define TDAV_SESSION_AV(self) ((tdav_session_av_t*)(self)) + +typedef struct tdav_session_av_s +{ + TMEDIA_DECLARE_SESSION; + + tsk_bool_t use_ipv6; + tsk_bool_t use_rtcp; + tsk_bool_t use_rtcp_mux; + tmedia_type_t media_type; + tsk_bool_t use_avpf; + tsk_bool_t use_srtp; + + /* NAT Traversal context */ + tnet_nat_context_handle_t* natt_ctx; + struct tnet_ice_ctx_s* ice_ctx; + + char* local_ip; + char* remote_ip; + uint16_t remote_port; + + struct trtp_manager_s* rtp_manager; + + struct tmedia_consumer_s* consumer; + struct tmedia_producer_s* producer; + + struct{ + struct{ + char* t_proto; + int t_tag; + int tag; + } remote_best_pcfg; + }sdp_neg; + + TSK_DECLARE_SAFEOBJ; + +#if HAVE_SRTP + struct { + int32_t tag; + trtp_srtp_crypto_type_t crypto_type; + char key[64]; + tsk_bool_t pending; + }remote_srtp_neg; + tmedia_srtp_mode_t srtp_mode; +#endif +} +tdav_session_av_t; + +#define TDAV_DECLARE_SESSION_AV tdav_session_av_t __session_av__ + +int tdav_session_av_init(tdav_session_av_t* self, tsk_bool_t is_audio); +tsk_bool_t tdav_session_av_set(tdav_session_av_t* self, const struct tmedia_param_s* param); +tsk_bool_t tdav_session_av_get(tdav_session_av_t* self, struct tmedia_param_s* param); +int tdav_session_av_prepare(tdav_session_av_t* self); +int tdav_session_av_start(tdav_session_av_t* self, const struct tmedia_codec_s* best_codec); +int tdav_session_av_stop(tdav_session_av_t* self); +int tdav_session_av_pause(tdav_session_av_t* self); +const tsdp_header_M_t* tdav_session_av_get_lo(tdav_session_av_t* self, tsk_bool_t *updated); +int tdav_session_av_set_ro(tdav_session_av_t* self, const struct tsdp_header_M_s* m, tsk_bool_t *updated); +const tmedia_codec_t* tdav_session_av_get_best_neg_codec(const tdav_session_av_t* self); +const tmedia_codec_t* tdav_session_av_get_red_codec(const tdav_session_av_t* self); +const tmedia_codec_t* tdav_session_av_get_ulpfec_codec(const tdav_session_av_t* self); +int tdav_session_av_deinit(tdav_session_av_t* self); + +TDAV_END_DECLS + +#endif \ No newline at end of file diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/video/jb/tdav_video_frame.h b/branches/2.0/doubango/tinyDAV/include/tinydav/video/jb/tdav_video_frame.h new file mode 100644 index 00000000..c49ca977 --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/video/jb/tdav_video_frame.h @@ -0,0 +1,65 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tdav_video_frame.h + * @brief Video Frame + * + * @author Mamadou Diop + */ +#ifndef TINYDAV_VIDEO_JB_FRAME_H +#define TINYDAV_VIDEO_JB_FRAME_H + +#include "tinydav_config.h" + +#include "tinyrtp/rtp/trtp_rtp_packet.h" + +#include "tsk_safeobj.h" +#include "tsk_list.h" + +TDAV_BEGIN_DECLS + +#define TDAV_VIDEO_FRAME(self) ((tdav_video_frame_t*)(self)) + +typedef uint16_t tdav_video_frame_seq_nums[16]; +typedef tsk_list_t tdav_video_frames_L_t; + +typedef struct tdav_video_frame_s +{ + TSK_DECLARE_OBJECT; + + uint8_t payload_type; + uint32_t timestamp; + uint16_t highest_seq_num; + trtp_rtp_packets_L_t* pkts; + + TSK_DECLARE_SAFEOBJ; +} +tdav_video_frame_t; + +struct tdav_video_frame_s* tdav_video_frame_create(struct trtp_rtp_packet_s* rtp_pkt); +int tdav_video_frame_put(struct tdav_video_frame_s* self, struct trtp_rtp_packet_s* rtp_pkt); +const struct trtp_rtp_packet_s* tdav_video_frame_find_by_seq_num(const struct tdav_video_frame_s* self, uint16_t seq_num); +tsk_size_t tdav_video_frame_write(struct tdav_video_frame_s* self, void** buffer_ptr, tsk_size_t* buffer_size); + +TDAV_END_DECLS + +#endif /* TINYDAV_VIDEO_JB_FRAME_H */ diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/video/jb/tdav_video_jb.h b/branches/2.0/doubango/tinyDAV/include/tinydav/video/jb/tdav_video_jb.h new file mode 100644 index 00000000..a5180f8c --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/video/jb/tdav_video_jb.h @@ -0,0 +1,83 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tdav_video_jb.h + * @brief Video Jitter Buffer + * + * @author Mamadou Diop + */ +#ifndef TINYDAV_VIDEO_JB_H +#define TINYDAV_VIDEO_JB_H + +#include "tinydav_config.h" + +#include "tinymedia/tmedia_jitterbuffer.h" + +#include "tsk_buffer.h" +#include "tsk_timer.h" +#include "tsk_list.h" +#include "tsk_safeobj.h" + +TDAV_BEGIN_DECLS + +typedef enum tdav_video_jb_cb_data_type_e +{ + tdav_video_jb_cb_data_type_rtp, + tdav_video_jb_cb_data_type_fl, // frame lost + tdav_video_jb_cb_data_type_tmfr, // too many frames removed + tdav_video_jb_cb_data_type_fdd, // average frame decoding duration +} +tdav_video_jb_cb_data_type_t; + +typedef struct tdav_video_jb_cb_data_xs +{ + tdav_video_jb_cb_data_type_t type; + uint32_t ssrc; + const void* usr_data; + union{ + struct{ + const struct trtp_rtp_packet_s* pkt; + }rtp; + struct{ + uint16_t seq_num; + tsk_size_t count; + }fl; + struct{ + uint32_t x_dur; // expected duration in milliseconds + uint32_t a_dur; // actual duration in milliseconds + }fdd; + }; +} +tdav_video_jb_cb_data_xt; + +typedef int (*tdav_video_jb_cb_f)(const tdav_video_jb_cb_data_xt* data); +#define TDAV_VIDEO_JB_CB_F(self) ((tdav_video_jb_cb_f)(self)) + +struct tdav_video_jb_s* tdav_video_jb_create(); +int tdav_video_jb_set_callback(struct tdav_video_jb_s* self, tdav_video_jb_cb_f callback, const void* usr_data); +int tdav_video_jb_start(struct tdav_video_jb_s* self); +int tdav_video_jb_put(struct tdav_video_jb_s* self, struct trtp_rtp_packet_s* rtp_pkt); +int tdav_video_jb_stop(struct tdav_video_jb_s* self); + +TDAV_END_DECLS + +#endif /* TINYDAV_VIDEO_JB_H */ diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/video/tdav_session_video.h b/branches/2.0/doubango/tinyDAV/include/tinydav/video/tdav_session_video.h index 420dc2ec..b3935f68 100644 --- a/branches/2.0/doubango/tinyDAV/include/tinydav/video/tdav_session_video.h +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/video/tdav_session_video.h @@ -33,33 +33,23 @@ #include "tinydav_config.h" #include "tinydav/video/tdav_converter_video.h" - -#include "tinymedia/tmedia_session.h" -#if HAVE_SRTP -# include "tinyrtp/trtp_srtp.h" -#endif - -#include "tsk_safeobj.h" +#include "tinydav/tdav_session_av.h" TDAV_BEGIN_DECLS +typedef enum tdav_session_video_pkt_loss_level_e +{ + tdav_session_video_pkt_loss_level_low, + tdav_session_video_pkt_loss_level_medium, + tdav_session_video_pkt_loss_level_high, +} +tdav_session_video_pkt_loss_level_t; + typedef struct tdav_session_video_s { - TMEDIA_DECLARE_SESSION_VIDEO; + TDAV_DECLARE_SESSION_AV; - tsk_bool_t useIPv6; - - char* local_ip; - - char* remote_ip; - uint16_t remote_port; - - /* NAT Traversal context */ - tnet_nat_context_handle_t* natt_ctx; - - tsk_bool_t rtcp_enabled; - - struct trtp_manager_s* rtp_manager; + struct tdav_video_jb_s* jb; struct{ void* buffer; @@ -67,6 +57,15 @@ typedef struct tdav_session_video_s void* conv_buffer; tsk_size_t conv_buffer_size; + + tdav_session_video_pkt_loss_level_t pkt_loss_level; + int32_t pkt_loss_fact; + int32_t pkt_loss_prob_good; + int32_t pkt_loss_prob_bad; + + uint8_t payload_type; + struct tmedia_codec_s* codec; + tsk_mutex_handle_t* h_mutex; } encoder; struct{ @@ -75,10 +74,11 @@ typedef struct tdav_session_video_s void* conv_buffer; tsk_size_t conv_buffer_size; - } decoder; - struct tmedia_consumer_s* consumer; - struct tmedia_producer_s* producer; + uint8_t payload_type; + struct tmedia_codec_s* codec; + } decoder; + struct { tsk_size_t consumerLastWidth; tsk_size_t consumerLastHeight; @@ -90,17 +90,25 @@ typedef struct tdav_session_video_s struct tdav_converter_video_s* toYUV420; } conv; - TSK_DECLARE_SAFEOBJ; + struct{ + uint8_t payload_type; + struct tmedia_codec_s* codec; + uint16_t seq_num; + uint32_t timestamp; + } ulpfec; -#if HAVE_SRTP - struct { - int32_t tag; - trtp_srtp_crypto_type_t crypto_type; - char key[64]; - tsk_bool_t pending; - }remote_srtp_neg; - tmedia_srtp_mode_t srtp_mode; -#endif + struct{ + uint8_t payload_type; + struct tmedia_codec_s* codec; + } red; + + struct{ + tsk_list_t* packets; + int32_t count; + int32_t max; + uint64_t last_fir_time; + uint64_t last_pli_time; + } avpf; } tdav_session_video_t; diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/video/tdav_video_jitterbuffer.h b/branches/2.0/doubango/tinyDAV/include/tinydav/video/tdav_video_jitterbuffer.h deleted file mode 100644 index af722b67..00000000 --- a/branches/2.0/doubango/tinyDAV/include/tinydav/video/tdav_video_jitterbuffer.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -* Copyright (C) 2011 Doubango Telecom -* -* Contact: Mamadou Diop -* -* This file is part of Open Source Doubango Framework. -* -* DOUBANGO is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* DOUBANGO is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with DOUBANGO. -* -*/ - -/**@file tdav_video_jitterbuffer.h - * @brief Video Jitter Buffer - * - * @author Mamadou Diop - */ -#ifndef TINYDAV_VIDEO_JITTERBUFFER_H -#define TINYDAV_VIDEO_JITTERBUFFER_H - -#include "tinydav_config.h" - -#include "tinymedia/tmedia_jitterbuffer.h" - -#include "tsk_buffer.h" -#include "tsk_timer.h" -#include "tsk_list.h" -#include "tsk_safeobj.h" - -TDAV_BEGIN_DECLS - -/** Video JitterBuffer packet */ -typedef struct tdav_video_jitterbuffer_packet_s -{ - TSK_DECLARE_OBJECT; - TSK_DECLARE_SAFEOBJ; - - tsk_bool_t taken; - tsk_buffer_t *data; - int64_t seq_num; -} -tdav_video_jitterbuffer_packet_t; -TINYDAV_GEXTERN const tsk_object_def_t *tdav_video_jitterbuffer_packet_def_t; -typedef tsk_list_t tdav_video_jitterbuffer_packets_L_t; - -/** Video JitterBuffer */ -typedef struct tdav_video_jitterbuffer_s -{ - TMEDIA_DECLARE_JITTER_BUFFER; - TSK_DECLARE_SAFEOBJ; - - uint32_t fps; - uint32_t frame_duration; - uint32_t frame_max_count; - uint32_t frame_curr_index; - uint32_t tail; // in milliseconds - - tdav_video_jitterbuffer_packets_L_t * packets; - tsk_timer_manager_handle_t *timer; -} -tdav_video_jitterbuffer_t; - -const tmedia_jitterbuffer_plugin_def_t *tdav_video_jitterbuffer_plugin_def_t; - -TDAV_END_DECLS - -#endif /* TINYDAV_VIDEO_JITTERBUFFER_H */ diff --git a/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_consumer_dsound.c b/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_consumer_dsound.c index 507755cb..66cd9d0c 100644 --- a/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_consumer_dsound.c +++ b/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_consumer_dsound.c @@ -48,7 +48,7 @@ static _inline int32_t __convert_volume(int32_t volume) return (volume * __step) + DSBVOLUME_MIN; } -static void *__playback_thread(void *param) +static void *_tdav_consumer_dsound_playback_thread(void *param) { tdav_consumer_dsound_t* dsound = (tdav_consumer_dsound_t*)param; @@ -58,7 +58,7 @@ static void *__playback_thread(void *param) int index; - TSK_DEBUG_INFO("__playback_thread -- START"); + TSK_DEBUG_INFO("_tdav_consumer_dsound_playback_thread -- START"); SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); @@ -101,12 +101,37 @@ next: tdav_consumer_audio_tick(TDAV_CONSUMER_AUDIO(dsound)); } - TSK_DEBUG_INFO("__playback_thread -- STOP"); + TSK_DEBUG_INFO("_tdav_consumer_dsound_playback_thread -- STOP"); return tsk_null; } +static int _tdav_consumer_dsound_unprepare(tdav_consumer_dsound_t *dsound) +{ + if(dsound){ + tsk_size_t i; + if(dsound->primaryBuffer){ + IDirectSoundBuffer_Release(dsound->primaryBuffer); + dsound->primaryBuffer = NULL; + } + if(dsound->secondaryBuffer){ + IDirectSoundBuffer_Release(dsound->secondaryBuffer); + dsound->secondaryBuffer = NULL; + } + if(dsound->device){ + IDirectSound_Release(dsound->device); + dsound->device = NULL; + } + for(i = 0; inotifEvents)/sizeof(dsound->notifEvents[0]); i++){ + if(dsound->notifEvents[i]){ + CloseHandle(dsound->notifEvents[i]); + dsound->notifEvents[i] = NULL; + } + } + } + return 0; +} @@ -240,7 +265,6 @@ static int tdav_consumer_dsound_start(tmedia_consumer_t* self) } if(dsound->started){ - TSK_DEBUG_WARN("Consumer already started"); return 0; } @@ -274,7 +298,7 @@ static int tdav_consumer_dsound_start(tmedia_consumer_t* self) /* start the reader thread */ dsound->started = tsk_true; - tsk_thread_create(&dsound->tid[0], __playback_thread, dsound); + tsk_thread_create(&dsound->tid[0], _tdav_consumer_dsound_playback_thread, dsound); return 0; } @@ -308,7 +332,6 @@ static int tdav_consumer_dsound_stop(tmedia_consumer_t* self) } if(!dsound->started){ - TSK_DEBUG_WARN("Consumer not started"); return 0; } @@ -327,6 +350,10 @@ static int tdav_consumer_dsound_stop(tmedia_consumer_t* self) tdav_win32_print_error("IDirectSoundBuffer_SetCurrentPosition", hr); } + // unprepare + // will be prepared again before calling next start() + _tdav_consumer_dsound_unprepare(dsound); + return 0; } @@ -351,8 +378,6 @@ static tsk_object_t* tdav_consumer_dsound_dtor(tsk_object_t * self) { tdav_consumer_dsound_t *dsound = self; if(dsound){ - tsk_size_t i; - /* stop */ if(dsound->started){ tdav_consumer_dsound_stop(self); @@ -361,21 +386,7 @@ static tsk_object_t* tdav_consumer_dsound_dtor(tsk_object_t * self) /* deinit base */ tdav_consumer_audio_deinit(TDAV_CONSUMER_AUDIO(dsound)); /* deinit self */ - // Delete secondary buffer - if(dsound->primaryBuffer){ - IDirectSoundBuffer_Release(dsound->primaryBuffer); - } - if(dsound->secondaryBuffer){ - IDirectSoundBuffer_Release(dsound->secondaryBuffer); - } - if(dsound->device){ - IDirectSound_Release(dsound->device); - } - for(i = 0; inotifEvents)/sizeof(HANDLE); i++){ - if(dsound->notifEvents[i]){ - CloseHandle(dsound->notifEvents[i]); - } - } + _tdav_consumer_dsound_unprepare(dsound); } return self; diff --git a/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_producer_dsound.c b/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_producer_dsound.c index d91a9064..7b955a5c 100644 --- a/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_producer_dsound.c +++ b/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_producer_dsound.c @@ -44,7 +44,7 @@ extern void tdav_win32_print_error(const char* func, HRESULT hr); -static void *__playback_thread(void *param) +static void *_tdav_producer_dsound_record_thread(void *param) { tdav_producer_dsound_t* dsound = (tdav_producer_dsound_t*)param; @@ -91,6 +91,28 @@ static void *__playback_thread(void *param) return tsk_null; } +static int _tdav_producer_dsound_unprepare(tdav_producer_dsound_t* dsound) +{ + if(dsound){ + tsk_size_t i; + if(dsound->captureBuffer){ + IDirectSoundCaptureBuffer_Release(dsound->captureBuffer); + dsound->captureBuffer = NULL; + } + if(dsound->device){ + IDirectSoundCapture_Release(dsound->device); + dsound->device = NULL; + } + for(i = 0; inotifEvents)/sizeof(dsound->notifEvents[0]); i++){ + if(dsound->notifEvents[i]){ + CloseHandle(dsound->notifEvents[i]); + dsound->notifEvents[i] = NULL; + } + } + } + return 0; +} + @@ -188,7 +210,6 @@ static int tdav_producer_dsound_start(tmedia_producer_t* self) } if(dsound->started){ - TSK_DEBUG_WARN("Producer already started"); return 0; } @@ -221,7 +242,7 @@ static int tdav_producer_dsound_start(tmedia_producer_t* self) /* start the reader thread */ dsound->started = tsk_true; - tsk_thread_create(&dsound->tid[0], __playback_thread, dsound); + tsk_thread_create(&dsound->tid[0], _tdav_producer_dsound_record_thread, dsound); return 0; } @@ -243,14 +264,13 @@ static int tdav_producer_dsound_stop(tmedia_producer_t* self) } if(!dsound->started){ - TSK_DEBUG_WARN("Producer not started"); return 0; } - /* should be done here */ + // should be done here dsound->started = tsk_false; - /* stop thread */ + // stop thread if(dsound->tid[0]){ tsk_thread_join(&(dsound->tid[0])); } @@ -259,6 +279,10 @@ static int tdav_producer_dsound_stop(tmedia_producer_t* self) tdav_win32_print_error("IDirectSoundCaptureBuffer_Stop", hr); } + // unprepare + // will be prepared again before next start() + _tdav_producer_dsound_unprepare(dsound); + return 0; } @@ -283,8 +307,6 @@ static tsk_object_t* tdav_producer_dsound_dtor(tsk_object_t * self) { tdav_producer_dsound_t *dsound = self; if(dsound){ - tsk_size_t i; - /* stop */ if(dsound->started){ tdav_producer_dsound_stop(self); @@ -293,17 +315,7 @@ static tsk_object_t* tdav_producer_dsound_dtor(tsk_object_t * self) /* deinit base */ tdav_producer_audio_deinit(TDAV_PRODUCER_AUDIO(dsound)); /* deinit self */ - if(dsound->captureBuffer){ - IDirectSoundCaptureBuffer_Release(dsound->captureBuffer); - } - if(dsound->device){ - IDirectSoundCapture_Release(dsound->device); - } - for(i = 0; inotifEvents)/sizeof(HANDLE); i++){ - if(dsound->notifEvents[i]){ - CloseHandle(dsound->notifEvents[i]); - } - } + _tdav_producer_dsound_unprepare(dsound); } return self; diff --git a/branches/2.0/doubango/tinyDAV/src/audio/tdav_session_audio.c b/branches/2.0/doubango/tinyDAV/src/audio/tdav_session_audio.c index e8ac4a64..ddd75f7d 100644 --- a/branches/2.0/doubango/tinyDAV/src/audio/tdav_session_audio.c +++ b/branches/2.0/doubango/tinyDAV/src/audio/tdav_session_audio.c @@ -28,7 +28,7 @@ */ #include "tinydav/audio/tdav_session_audio.h" -#include "tinydav/codecs/dtmf/tdav_codec_dtmf.h" +//#include "tinydav/codecs/dtmf/tdav_codec_dtmf.h" #include "tinydav/audio/tdav_consumer_audio.h" #include "tinymedia/tmedia_resampler.h" @@ -44,11 +44,8 @@ #include "tsk_memory.h" #include "tsk_debug.h" -#define IS_DTMF_CODEC(codec) (TMEDIA_CODEC((codec))->plugin == tdav_codec_dtmf_plugin_def_t) - static int _tdav_session_audio_dtmfe_timercb(const void* arg, tsk_timer_id_t timer_id); static struct tdav_session_audio_dtmfe_s* _tdav_session_audio_dtmfe_create(const tdav_session_audio_t* session, uint8_t event, uint16_t duration, uint32_t seq, uint32_t timestamp, uint8_t format, tsk_bool_t M, tsk_bool_t E); -static const tmedia_codec_t* _tdav_session_audio_first_best_neg_codec(const tdav_session_audio_t* session); static void _tdav_session_audio_apply_gain(void* buffer, int len, int bps, int gain); /* DTMF event object */ @@ -68,38 +65,42 @@ extern const tsk_object_def_t *tdav_session_audio_dtmfe_def_t; static int tdav_session_audio_rtp_cb(const void* callback_data, const struct trtp_rtp_packet_s* packet) { tdav_session_audio_t* audio = (tdav_session_audio_t*)callback_data; + tdav_session_av_t* base = (tdav_session_av_t*)callback_data; - if(!audio || !packet){ + if(!audio || !packet || !packet->header){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } - if(audio->consumer){ + if(base->consumer){ tsk_size_t out_size = 0; - tmedia_codec_t* codec; - tsk_istr_t format; // Find the codec to use to decode the RTP payload - tsk_itoa(packet->header->payload_type, &format); - if(!(codec = tmedia_codec_find_by_format(TMEDIA_SESSION(audio)->neg_codecs, format)) || !codec->plugin || !codec->plugin->decode){ - TSK_DEBUG_ERROR("%s is not a valid payload for this session", format); - TSK_OBJECT_SAFE_FREE(codec); - return -2; + if(!audio->decoder.codec || audio->decoder.payload_type != packet->header->payload_type){ + tsk_istr_t format; + TSK_OBJECT_SAFE_FREE(audio->decoder.codec); + tsk_itoa(packet->header->payload_type, &format); + if(!(audio->decoder.codec = tmedia_codec_find_by_format(TMEDIA_SESSION(audio)->neg_codecs, format)) || !audio->decoder.codec->plugin || !audio->decoder.codec->plugin->decode){ + TSK_DEBUG_ERROR("%s is not a valid payload for this session", format); + return -2; + } + audio->decoder.payload_type = packet->header->payload_type; } + // Open codec if not already done - if(!TMEDIA_CODEC(codec)->opened){ + if(!TMEDIA_CODEC(audio->decoder.codec)->opened){ int ret; - tsk_safeobj_lock(audio); - if((ret = tmedia_codec_open(codec))){ - tsk_safeobj_unlock(audio); - TSK_OBJECT_SAFE_FREE(codec); - TSK_DEBUG_ERROR("Failed to open [%s] codec", codec->plugin->desc); + tsk_safeobj_lock(base); + if((ret = tmedia_codec_open(audio->decoder.codec))){ + tsk_safeobj_unlock(base); + TSK_OBJECT_SAFE_FREE(audio->decoder.codec); + TSK_DEBUG_ERROR("Failed to open [%s] codec", audio->decoder.codec->plugin->desc); return ret; } - tsk_safeobj_unlock(audio); + tsk_safeobj_unlock(base); } // Decode data - out_size = codec->plugin->decode(codec, packet->payload.data, packet->payload.size, &audio->decoder.buffer, &audio->decoder.buffer_size, packet->header); + out_size = audio->decoder.codec->plugin->decode(audio->decoder.codec, packet->payload.data, packet->payload.size, &audio->decoder.buffer, &audio->decoder.buffer_size, packet->header); if(out_size){ // Denoise (VAD, AGC, Noise suppression, ...) // See tdav_consumer_audio.c::tdav_consumer_audio_get() @@ -108,13 +109,12 @@ static int tdav_session_audio_rtp_cb(const void* callback_data, const struct trt //} // adjust the gain - if(audio->consumer->audio.gain){ - _tdav_session_audio_apply_gain(audio->decoder.buffer, out_size, audio->consumer->audio.bits_per_sample, audio->consumer->audio.gain); + if(base->consumer->audio.gain){ + _tdav_session_audio_apply_gain(audio->decoder.buffer, out_size, base->consumer->audio.bits_per_sample, base->consumer->audio.gain); } // consume the frame - tmedia_consumer_consume(audio->consumer, audio->decoder.buffer, out_size, packet->header); + tmedia_consumer_consume(base->consumer, audio->decoder.buffer, out_size, packet->header); } - TSK_OBJECT_SAFE_FREE(codec); } return 0; } @@ -122,9 +122,10 @@ static int tdav_session_audio_rtp_cb(const void* callback_data, const struct trt // Producer callback (From the producer to the network). Will encode() data before sending static int tdav_session_audio_producer_enc_cb(const void* callback_data, const void* buffer, tsk_size_t size) { - int ret; + int ret = 0; tdav_session_audio_t* audio = (tdav_session_audio_t*)callback_data; + tdav_session_av_t* base = (tdav_session_av_t*)callback_data; if(!audio){ TSK_DEBUG_ERROR("Null session"); @@ -137,53 +138,31 @@ static int tdav_session_audio_producer_enc_cb(const void* callback_data, const v return 0; } - if(audio->rtp_manager){ + if(base->rtp_manager && base->rtp_manager->is_started && audio->encoder.codec){ /* encode */ tsk_size_t out_size = 0; - ret = 0; - - // - // Find Encoder (call one time) - // - if(!audio->encoder.codec){ - tsk_list_item_t* item; - tsk_list_foreach(item, TMEDIA_SESSION(audio)->neg_codecs){ - if(!tsk_striequals(TMEDIA_CODEC(item->data)->neg_format, TMEDIA_CODEC_FORMAT_DTMF) && - !tsk_striequals(TMEDIA_CODEC(item->data)->format, TMEDIA_CODEC_FORMAT_DTMF)){ - audio->encoder.codec = tsk_object_ref(item->data); - trtp_manager_set_payload_type(audio->rtp_manager, audio->encoder.codec->neg_format ? atoi(audio->encoder.codec->neg_format) : atoi(audio->encoder.codec->format)); - /* Denoise */ - if(audio->denoise && !audio->denoise->opened){ - ret = tmedia_denoise_open(audio->denoise, - TMEDIA_CODEC_PCM_FRAME_SIZE(audio->encoder.codec), //160 (shorts) if 20ms at 8khz - TMEDIA_CODEC_RATE(audio->encoder.codec)); - } - break; - } - } - } - if(!audio->encoder.codec){ - TSK_DEBUG_ERROR("Failed to find a valid codec"); - return -3; + if(!base->rtp_manager->is_started){ + TSK_DEBUG_ERROR("Not started"); + return 0; } // Open codec if not already done if(!audio->encoder.codec->opened){ - tsk_safeobj_lock(audio); + tsk_safeobj_lock(base); if((ret = tmedia_codec_open(audio->encoder.codec))){ - tsk_safeobj_unlock(audio); + tsk_safeobj_unlock(base); TSK_DEBUG_ERROR("Failed to open [%s] codec", audio->encoder.codec->plugin->desc); return -4; } - tsk_safeobj_unlock(audio); + tsk_safeobj_unlock(base); } // resample if needed - if(audio->producer->audio.rate != audio->encoder.codec->plugin->rate){ + if(base->producer->audio.rate != audio->encoder.codec->plugin->rate){ tsk_size_t resampler_result_size = 0; if(!audio->decoder.resampler.instance){ - uint32_t resampler_buff_size = ((audio->encoder.codec->plugin->rate * audio->producer->audio.ptime)/1000) * sizeof(int16_t); + uint32_t resampler_buff_size = ((audio->encoder.codec->plugin->rate * base->producer->audio.ptime)/1000) * sizeof(int16_t); if(!(audio->decoder.resampler.instance = tmedia_resampler_create())){ TSK_DEBUG_ERROR("Failed to create audio resampler"); ret = -1; @@ -191,7 +170,7 @@ static int tdav_session_audio_producer_enc_cb(const void* callback_data, const v } else { #define TDAV_AUDIO_RESAMPLER_DEFAULT_QUALITY 5 - if((ret = tmedia_resampler_open(audio->decoder.resampler.instance, audio->producer->audio.rate, audio->encoder.codec->plugin->rate, audio->producer->audio.ptime, audio->producer->audio.channels, TDAV_AUDIO_RESAMPLER_DEFAULT_QUALITY))){ + if((ret = tmedia_resampler_open(audio->decoder.resampler.instance, base->producer->audio.rate, audio->encoder.codec->plugin->rate, base->producer->audio.ptime, base->producer->audio.channels, TDAV_AUDIO_RESAMPLER_DEFAULT_QUALITY))){ TSK_DEBUG_ERROR("Failed to open audio resampler (%d)", ret); TSK_OBJECT_SAFE_FREE(audio->decoder.resampler.instance); goto done; @@ -229,15 +208,15 @@ static int tdav_session_audio_producer_enc_cb(const void* callback_data, const v } // adjust the gain // Must be done after resampling - if(audio->producer->audio.gain){ - _tdav_session_audio_apply_gain((void*)buffer, size, audio->producer->audio.bits_per_sample, audio->producer->audio.gain); + if(base->producer->audio.gain){ + _tdav_session_audio_apply_gain((void*)buffer, size, base->producer->audio.bits_per_sample, base->producer->audio.gain); } // Encode data if((audio->encoder.codec = tsk_object_ref(audio->encoder.codec))){ /* Thread safeness (SIP reINVITE or UPDATE could update the encoder) */ out_size = audio->encoder.codec->plugin->encode(audio->encoder.codec, buffer, size, &audio->encoder.buffer, &audio->encoder.buffer_size); if(out_size){ - ret = trtp_manager_send_rtp(audio->rtp_manager, audio->encoder.buffer, out_size, TMEDIA_CODEC_PCM_FRAME_SIZE(audio->encoder.codec), tsk_false/*Marker*/, tsk_true/*lastPacket*/); + trtp_manager_send_rtp(base->rtp_manager, audio->encoder.buffer, out_size, TMEDIA_CODEC_PCM_FRAME_SIZE(audio->encoder.codec), tsk_false/*Marker*/, tsk_true/*lastPacket*/); } tsk_object_unref(audio->encoder.codec); } @@ -263,50 +242,25 @@ static int tdav_session_audio_set(tmedia_session_t* self, const tmedia_param_t* return -1; } + if(tdav_session_av_set(TDAV_SESSION_AV(self), param) == tsk_true){ + return 0; + } + audio = (tdav_session_audio_t*)self; if(param->plugin_type == tmedia_ppt_consumer){ - return tmedia_consumer_set(audio->consumer, param); + TSK_DEBUG_ERROR("Not expected"); } else if(param->plugin_type == tmedia_ppt_producer){ - return tmedia_producer_set(audio->producer, param); + TSK_DEBUG_ERROR("Not expected"); } else{ - if(param->value_type == tmedia_pvt_pchar){ - if(tsk_striequals(param->key, "remote-ip")){ - if(param->value){ - tsk_strupdate(&audio->remote_ip, param->value); - } - } - else if(tsk_striequals(param->key, "local-ip")){ - tsk_strupdate(&audio->local_ip, param->value); - } - else if(tsk_striequals(param->key, "local-ipver")){ - audio->useIPv6 = tsk_striequals(param->value, "ipv6"); - } - } - else if(param->value_type == tmedia_pvt_int32){ + if(param->value_type == tmedia_pvt_int32){ if(tsk_striequals(param->key, "echo-supp")){ if(audio->denoise){ audio->denoise->echo_supp_enabled = (TSK_TO_INT32((uint8_t*)param->value) != 0); } } - else if(tsk_striequals(param->key, "srtp-optional")){ -#if HAVE_SRTP - audio->srtp_mode = (TSK_TO_INT32((uint8_t*)param->value) != 0); -#endif - } - else if(tsk_striequals(param->key, "srtp-mandatory")){ -#if HAVE_SRTP - audio->srtp_mode = (TSK_TO_INT32((uint8_t*)param->value) != 0); -#endif - } - } - else if(param->value_type == tmedia_pvt_pobject){ - if(tsk_striequals(param->key, "natt-ctx")){ - TSK_OBJECT_SAFE_FREE(audio->natt_ctx); - audio->natt_ctx = tsk_object_ref(param->value); - } } } @@ -316,73 +270,43 @@ static int tdav_session_audio_set(tmedia_session_t* self, const tmedia_param_t* static int tdav_session_audio_get(tmedia_session_t* self, tmedia_param_t* param) { int ret = 0; - tdav_session_audio_t* audio; if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } - - audio = (tdav_session_audio_t*)self; - - if(param->plugin_type == tmedia_ppt_session){ - if(param->value_type == tmedia_pvt_int32){ - if(tsk_striequals(param->key, "srtp-enabled")){ -#if HAVE_SRTP - if(audio->rtp_manager){ - ((int8_t*)param->value)[0] = trtp_srtp_is_active(audio->rtp_manager); - } -#endif - } - } + + if(tdav_session_av_get(TDAV_SESSION_AV(self), param) == tsk_true){ + return 0; } - return 0; + TSK_DEBUG_ERROR("Not expected"); + return -2; } static int tdav_session_audio_prepare(tmedia_session_t* self) { - tdav_session_audio_t* audio; - int ret = 0; + tdav_session_av_t* base = (tdav_session_av_t*)(self); + int ret; - audio = (tdav_session_audio_t*)self; - - /* set local port */ - if(!audio->rtp_manager){ - if((audio->rtp_manager = trtp_manager_create(audio->rtcp_enabled, audio->local_ip, audio->useIPv6))){ - - ret = trtp_manager_set_rtp_callback(audio->rtp_manager, tdav_session_audio_rtp_cb, audio); - ret = trtp_manager_set_port_range(audio->rtp_manager, tmedia_defaults_get_rtp_port_range_start(), tmedia_defaults_get_rtp_port_range_stop()); - ret = trtp_manager_prepare(audio->rtp_manager); - if(audio->natt_ctx){ - ret = trtp_manager_set_natt_ctx(audio->rtp_manager, audio->natt_ctx); - } - } + if((ret = tdav_session_av_prepare(base))){ + TSK_DEBUG_ERROR("tdav_session_av_prepare(audio) failed"); + return ret; } - /* SRTP */ -#if HAVE_SRTP - { - if(audio->remote_srtp_neg.pending){ - char* str = tsk_null; - audio->remote_srtp_neg.pending = tsk_false; - tsk_sprintf(&str, "%d %s inline:%s", audio->remote_srtp_neg.tag, trtp_srtp_crypto_type_strings[audio->remote_srtp_neg.crypto_type], audio->remote_srtp_neg.key); - trtp_srtp_set_remote(audio->rtp_manager, str); - TSK_FREE(str); - } + if(base->rtp_manager){ + ret = trtp_manager_set_rtp_callback(base->rtp_manager, tdav_session_audio_rtp_cb, base); } -#endif - - /* Consumer will be prepared in tdav_session_audio_start() */ - /* Producer will be prepared in tdav_session_audio_start() */ return ret; } static int tdav_session_audio_start(tmedia_session_t* self) { + int ret; tdav_session_audio_t* audio; const tmedia_codec_t* codec; + tdav_session_av_t* base; if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); @@ -390,83 +314,45 @@ static int tdav_session_audio_start(tmedia_session_t* self) } audio = (tdav_session_audio_t*)self; + base = (tdav_session_av_t*)self; - if(!(codec = _tdav_session_audio_first_best_neg_codec(audio))){ + if(!(codec = tdav_session_av_get_best_neg_codec(base))){ TSK_DEBUG_ERROR("No codec matched"); return -2; } + + TSK_OBJECT_SAFE_FREE(audio->encoder.codec); + audio->encoder.codec = tsk_object_ref((tsk_object_t*)codec); - if(audio->rtp_manager){ - int ret; - /* RTP/RTCP manager: use latest information. */ - ret = trtp_manager_set_rtp_remote(audio->rtp_manager, audio->remote_ip, audio->remote_port); - //trtp_manager_set_payload_type(audio->rtp_manager, codec->neg_format ? atoi(codec->neg_format) : atoi(codec->format)); - ret = trtp_manager_start(audio->rtp_manager); - - // because of AudioUnit under iOS => prepare both consumer and producer then start() at the same time - /* prepare consumer and producer */ - if(audio->producer) tmedia_producer_prepare(audio->producer, codec); - if(audio->consumer) tmedia_consumer_prepare(audio->consumer, codec); - - /* start consumer and producer */ - if(audio->consumer) tmedia_consumer_start(audio->consumer); - if(audio->producer) tmedia_producer_start(audio->producer); - - /* Denoise (AEC, Noise Suppression, AGC) */ - if(audio->denoise && audio->encoder.codec){ - tmedia_denoise_open(audio->denoise, TMEDIA_CODEC_PCM_FRAME_SIZE(audio->encoder.codec), TMEDIA_CODEC_RATE(audio->encoder.codec)); - } - - /* for test */ - //trtp_manager_send_rtp(audio->rtp_manager, "test", 4, tsk_true); + if((ret = tdav_session_av_start(base, codec))){ + TSK_DEBUG_ERROR("tdav_session_av_start(audio) failed"); return ret; } - else{ - TSK_DEBUG_ERROR("Invalid RTP/RTCP manager"); - return -3; + + if(base->rtp_manager){ + trtp_manager_set_payload_type(base->rtp_manager, audio->encoder.codec->neg_format ? atoi(audio->encoder.codec->neg_format) : atoi(audio->encoder.codec->format)); + /* Denoise (AEC, Noise Suppression, AGC) */ + if(audio->denoise){ + tmedia_denoise_close(audio->denoise); + tmedia_denoise_open(audio->denoise, TMEDIA_CODEC_PCM_FRAME_SIZE(audio->encoder.codec), TMEDIA_CODEC_RATE(audio->encoder.codec)); + } } - return 0; + return ret; } static int tdav_session_audio_stop(tmedia_session_t* self) { - tdav_session_audio_t* audio; - tmedia_codec_t* codec = tsk_null; - - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - - audio = (tdav_session_audio_t*)self; - - /* RTP/RTCP manager */ - if(audio->rtp_manager){ - trtp_manager_stop(audio->rtp_manager); - } - - /* Consumer */ - if(audio->consumer){ - tmedia_consumer_stop(audio->consumer); - } - /* Producer */ - if(audio->producer){ - tmedia_producer_stop(audio->producer); - } - - /* close codec to force open() for next start (e.g SIP UPDATE with SDP) */ - if((codec = tsk_object_ref(TSK_LIST_FIRST_DATA(self->neg_codecs)))){ - tmedia_codec_close(codec); - tsk_object_unref(codec); - } - - return 0; + int ret = tdav_session_av_stop(TDAV_SESSION_AV(self)); + TSK_OBJECT_SAFE_FREE(TDAV_SESSION_AUDIO(self)->encoder.codec); + TSK_OBJECT_SAFE_FREE(TDAV_SESSION_AUDIO(self)->decoder.codec); + return ret; } static int tdav_session_audio_send_dtmf(tmedia_session_t* self, uint8_t event) { tdav_session_audio_t* audio; + tdav_session_av_t* base; tmedia_codec_t* codec; int ret, rate = 8000, ptime = 20; uint16_t duration; @@ -481,6 +367,7 @@ static int tdav_session_audio_send_dtmf(tmedia_session_t* self, uint8_t event) } audio = (tdav_session_audio_t*)self; + base = (tdav_session_av_t*)self; // Find the DTMF codec to use to use the RTP payload if((codec = tmedia_codec_find_by_format(TMEDIA_SESSION(audio)->codecs, TMEDIA_CODEC_FORMAT_DTMF))){ @@ -490,7 +377,7 @@ static int tdav_session_audio_send_dtmf(tmedia_session_t* self, uint8_t event) } /* do we have an RTP manager? */ - if(!audio->rtp_manager){ + if(!base->rtp_manager){ TSK_DEBUG_ERROR("No RTP manager associated to this session"); return -2; } @@ -593,271 +480,48 @@ static int tdav_session_audio_send_dtmf(tmedia_session_t* self, uint8_t event) static int tdav_session_audio_pause(tmedia_session_t* self) { - tdav_session_audio_t* audio; - - audio = (tdav_session_audio_t*)self; - - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - - /* Consumer */ - if(audio->consumer){ - tmedia_consumer_pause(audio->consumer); - } - /* Producer */ - if(audio->producer){ - tmedia_producer_pause(audio->producer); - } - - return 0; + return tdav_session_av_pause(TDAV_SESSION_AV(self)); } static const tsdp_header_M_t* tdav_session_audio_get_lo(tmedia_session_t* self) { - tdav_session_audio_t* audio; - tsk_bool_t changed = tsk_false; + tsk_bool_t updated = tsk_false; + const tsdp_header_M_t* ret; + tdav_session_av_t* base = TDAV_SESSION_AV(self); - if(!self || !self->plugin){ - TSK_DEBUG_ERROR("Invalid parameter"); + + if(!(ret = tdav_session_av_get_lo(base, &updated))){ + TSK_DEBUG_ERROR("tdav_session_av_get_lo(audio) failed"); return tsk_null; } - audio = (tdav_session_audio_t*)self; - - if(!audio->rtp_manager || !audio->rtp_manager->transport){ - TSK_DEBUG_ERROR("RTP/RTCP manager in invalid"); - return tsk_null; - } - - if(self->ro_changed && self->M.lo){ - /* Codecs */ - tsdp_header_A_removeAll_by_field(self->M.lo->Attributes, "fmtp"); - tsdp_header_A_removeAll_by_field(self->M.lo->Attributes, "rtpmap"); - tsk_list_clear_items(self->M.lo->FMTs); - - /* QoS */ - tsdp_header_A_removeAll_by_field(self->M.lo->Attributes, "curr"); - tsdp_header_A_removeAll_by_field(self->M.lo->Attributes, "des"); - tsdp_header_A_removeAll_by_field(self->M.lo->Attributes, "conf"); - - /* SRTP */ - tsdp_header_A_removeAll_by_field(self->M.lo->Attributes, "crypto"); - } - - changed = (self->ro_changed || !self->M.lo); - - if(!self->M.lo){ - if((self->M.lo = tsdp_header_M_create(self->plugin->media, audio->rtp_manager->rtp.public_port, "RTP/AVP"))){ - /* If NATT is active, do not rely on the global IP address Connection line */ - if(audio->natt_ctx){ - tsdp_header_M_add_headers(self->M.lo, - TSDP_HEADER_C_VA_ARGS("IN", audio->useIPv6 ? "IP6" : "IP4", audio->rtp_manager->rtp.public_ip), - tsk_null); - } - /* 3GPP TS 24.229 - 6.1.1 General - In order to support accurate bandwidth calculations, the UE may include the "a=ptime" attribute for all "audio" media - lines as described in RFC 4566 [39]. If a UE receives an "audio" media line with "a=ptime" specified, the UE should - transmit at the specified packetization rate. If a UE receives an "audio" media line which does not have "a=ptime" - specified or the UE does not support the "a=ptime" attribute, the UE should transmit at the default codec packetization - rate as defined in RFC 3551 [55A]. The UE will transmit consistent with the resources available from the network. - - For "video" and "audio" media types that utilize the RTP/RTCP, the UE shall specify the proposed bandwidth for each - media stream utilizing the "b=" media descriptor and the "AS" bandwidth modifier in the SDP. - - The UE shall include the MIME subtype "telephone-event" in the "m=" media descriptor in the SDP for audio media - flows that support both audio codec and DTMF payloads in RTP packets as described in RFC 4733 [23]. - */ - tsdp_header_M_add_headers(self->M.lo, - TSDP_HEADER_A_VA_ARGS("ptime", "20"), - tsk_null); - // the "telephone-event" fmt/rtpmap is added below - } - else{ - TSK_DEBUG_ERROR("Failed to create lo"); - return tsk_null; - } + if(updated){ + tsk_safeobj_lock(base); + TSK_OBJECT_SAFE_FREE(TDAV_SESSION_AUDIO(self)->encoder.codec); + tsk_safeobj_unlock(base); } - if(changed){ - tmedia_codecs_L_t* neg_codecs = tsk_null; - - if(self->M.ro){ - TSK_OBJECT_SAFE_FREE(self->neg_codecs); - /* update negociated codecs */ - if((neg_codecs = tmedia_session_match_codec(self, self->M.ro))){ - self->neg_codecs = neg_codecs; - tsk_safeobj_lock(audio); - TSK_OBJECT_SAFE_FREE(audio->encoder.codec); - tsk_safeobj_unlock(audio); - } - /* from codecs to sdp */ - if(TSK_LIST_IS_EMPTY(self->neg_codecs) || ((self->neg_codecs->tail == self->neg_codecs->head) && IS_DTMF_CODEC(TSK_LIST_FIRST_DATA(self->neg_codecs)))){ - self->M.lo->port = 0; /* Keep the RTP transport and reuse it when we receive a reINVITE or UPDATE request */ - goto DONE; - } - else{ - tmedia_codec_to_sdp(self->neg_codecs, self->M.lo); - } - } - else{ - /* from codecs to sdp */ - tmedia_codec_to_sdp(self->codecs, self->M.lo); - } - - /* Hold/Resume */ - tsdp_header_M_set_holdresume_att(self->M.lo, self->lo_held, self->ro_held); - - /* SRTP */ -#if HAVE_SRTP - { - tsk_bool_t is_srtp_remote_mandatory = (self->M.ro && (tsk_striequals(self->M.ro->proto, "RTP/SAVP") || tsk_striequals(self->M.ro->proto, "RTP/SAVPF"))); - tsk_bool_t is_srtp_remote_optional = (self->M.ro && (tsdp_header_M_findA(self->M.ro, "crypto") != tsk_null)); - if((audio->srtp_mode == tmedia_srtp_mode_optional && (is_srtp_remote_optional || is_srtp_remote_mandatory || !self->M.ro)) || audio->srtp_mode == tmedia_srtp_mode_mandatory){ - const trtp_srtp_ctx_xt *ctx = tsk_null; - tsk_size_t ctx_count = 0, ctx_idx; - char* str = tsk_null; - // local - trtp_srtp_get_ctx_local(audio->rtp_manager, &ctx, &ctx_count); - for(ctx_idx = 0; ctx_idx < ctx_count; ++ctx_idx){ - tsk_sprintf(&str, "%d %s inline:%s", ctx[ctx_idx].tag, trtp_srtp_crypto_type_strings[ctx[ctx_idx].crypto_type], ctx[ctx_idx].key_str); - tsdp_header_M_add_headers(self->M.lo, - TSDP_HEADER_A_VA_ARGS("crypto", str), - tsk_null); - TSK_FREE(str); - } - } - - if(is_srtp_remote_mandatory || (audio->srtp_mode == tmedia_srtp_mode_mandatory) || trtp_srtp_is_initialized(audio->rtp_manager)){ - tsk_strupdate(&self->M.lo->proto, "RTP/SAVP"); - } - } -#endif - - ///* 3GPP TS 24.229 - 6.1.1 General - // The UE shall include the MIME subtype "telephone-event" in the "m=" media descriptor in the SDP for audio media - // flows that support both audio codec and DTMF payloads in RTP packets as described in RFC 4733 [23]. - //*/ - //tsdp_header_M_add_fmt(self->M.lo, TMEDIA_CODEC_FORMAT_DTMF); - //tsdp_header_M_add_headers(self->M.lo, - // TSDP_HEADER_A_VA_ARGS("fmtp", TMEDIA_CODEC_FORMAT_DTMF" 0-15"), - // tsk_null); - //tsdp_header_M_add_headers(self->M.lo, - // TSDP_HEADER_A_VA_ARGS("rtpmap", TMEDIA_CODEC_FORMAT_DTMF" telephone-event/8000"), - // tsk_null); - /* QoS */ - if(self->qos){ - tmedia_qos_tline_t* ro_tline; - if(self->M.ro && (ro_tline = tmedia_qos_tline_from_sdp(self->M.ro))){ - tmedia_qos_tline_set_ro(self->qos, ro_tline); - TSK_OBJECT_SAFE_FREE(ro_tline); - } - tmedia_qos_tline_to_sdp(self->qos, self->M.lo); - } -DONE:; - } - - return self->M.lo; + return ret; } static int tdav_session_audio_set_ro(tmedia_session_t* self, const tsdp_header_M_t* m) { - tdav_session_audio_t* audio; - tmedia_codecs_L_t* neg_codecs; - tsk_bool_t is_srtp_remote_mandatory; - tsk_bool_t crypto_matched = tsk_false; + int ret; + tsk_bool_t updated = tsk_false; + tdav_session_av_t* base = TDAV_SESSION_AV(self); - if(!self || !m){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; + if((ret = tdav_session_av_set_ro(base, m, &updated))){ + TSK_DEBUG_ERROR("tdav_session_av_set_ro(audio) failed"); + return ret; } - audio = (tdav_session_audio_t*)self; + if(updated){ + tsk_safeobj_lock(base); + TSK_OBJECT_SAFE_FREE(TDAV_SESSION_AUDIO(self)->encoder.codec); + tsk_safeobj_unlock(base); + } - /* update remote offer */ - TSK_OBJECT_SAFE_FREE(self->M.ro); - self->M.ro = tsk_object_ref((void*)m); - - is_srtp_remote_mandatory = (tsk_striequals(m->proto, "RTP/SAVP") || tsk_striequals(m->proto, "RTP/SAVPF")); - - if(self->M.lo){ - if((neg_codecs = tmedia_session_match_codec(self, m))){ - /* update negociated codecs */ - TSK_OBJECT_SAFE_FREE(self->neg_codecs); - self->neg_codecs = neg_codecs; - TSK_OBJECT_SAFE_FREE(audio->encoder.codec); - } - else{ - TSK_DEBUG_ERROR("None Match"); - return -1; - } - /* QoS */ - if(self->qos){ - tmedia_qos_tline_t* ro_tline; - if(self->M.ro && (ro_tline = tmedia_qos_tline_from_sdp(self->M.ro))){ - tmedia_qos_tline_set_ro(self->qos, ro_tline); - TSK_OBJECT_SAFE_FREE(ro_tline); - } - } - } - - /* get connection associated to this media line - * If the connnection is global, then the manager will call tdav_session_audio_set() */ - if(m->C && m->C->addr){ - tsk_strupdate(&audio->remote_ip, m->C->addr); - audio->useIPv6 = tsk_striequals(m->C->addrtype, "IP6"); - } - /* set remote port */ - audio->remote_port = m->port; - - /* SRTP */ -#if HAVE_SRTP - if(audio->srtp_mode == tmedia_srtp_mode_optional || audio->srtp_mode == tmedia_srtp_mode_mandatory){ - tsk_size_t i = 0; - const tsdp_header_A_t* A; - int ret; - while((A = tsdp_header_M_findA_at(m, "crypto", i++))){ - if(audio->rtp_manager){ - if((ret = trtp_srtp_set_remote(audio->rtp_manager, A->value)) == 0){ - crypto_matched = tsk_true; - break; - } - } - else{ - if((ret = trtp_srtp_match_line(A->value, &audio->remote_srtp_neg.tag, (int32_t*)&audio->remote_srtp_neg.crypto_type, audio->remote_srtp_neg.key, (sizeof(audio->remote_srtp_neg.key) - 1))) == 0){ - crypto_matched = tsk_true; - audio->remote_srtp_neg.pending = tsk_true; - break; - } - } - } - if((audio->srtp_mode == tmedia_srtp_mode_mandatory) && !crypto_matched){// local require but none match - TSK_DEBUG_ERROR("SRTP negotiation failed"); - return -3; - } - } -#endif - - if(is_srtp_remote_mandatory && !crypto_matched){// remote require but none match - TSK_DEBUG_ERROR("SRTP negotiation failed"); - return -4; - } - - - return 0; -} - -/* first best negotiated codec (ignore dtmf) */ -const tmedia_codec_t* _tdav_session_audio_first_best_neg_codec(const tdav_session_audio_t* session) -{ - const tsk_list_item_t* item; - tsk_list_foreach(item, TMEDIA_SESSION(session)->neg_codecs){ - if(!IS_DTMF_CODEC(item->data)){ - return TMEDIA_CODEC(item->data); - } - } - return tsk_null; + return ret; } /* apply gain */ @@ -889,6 +553,7 @@ void _tdav_session_audio_apply_gain(void* buffer, int len, int bps, int gain) tdav_session_audio_dtmfe_t* _tdav_session_audio_dtmfe_create(const tdav_session_audio_t* session, uint8_t event, uint16_t duration, uint32_t seq, uint32_t timestamp, uint8_t format, tsk_bool_t M, tsk_bool_t E) { tdav_session_audio_dtmfe_t* dtmfe; + const tdav_session_av_t* base = (const tdav_session_av_t*)session; static uint8_t volume = 10; static uint32_t ssrc = 0x5234A8; @@ -908,7 +573,7 @@ tdav_session_audio_dtmfe_t* _tdav_session_audio_dtmfe_create(const tdav_session_ } dtmfe->session = session; - if(!(dtmfe->packet = trtp_rtp_packet_create((session && session->rtp_manager) ? session->rtp_manager->rtp.ssrc : ssrc, seq, timestamp, format, M))){ + if(!(dtmfe->packet = trtp_rtp_packet_create((session && base->rtp_manager) ? base->rtp_manager->rtp.ssrc : ssrc, seq, timestamp, format, M))){ TSK_DEBUG_ERROR("Failed to create DTMF RTP packet"); TSK_OBJECT_SAFE_FREE(dtmfe); return tsk_null; @@ -931,7 +596,6 @@ tdav_session_audio_dtmfe_t* _tdav_session_audio_dtmfe_create(const tdav_session_ int _tdav_session_audio_dtmfe_timercb(const void* arg, tsk_timer_id_t timer_id) { tdav_session_audio_dtmfe_t* dtmfe = (tdav_session_audio_dtmfe_t*)arg; - int ret; if(!dtmfe || !dtmfe->session){ TSK_DEBUG_ERROR("Invalid parameter"); @@ -940,12 +604,12 @@ int _tdav_session_audio_dtmfe_timercb(const void* arg, tsk_timer_id_t timer_id) /* Send the data */ TSK_DEBUG_INFO("Sending DTMF event"); - ret = trtp_manager_send_rtp_2(dtmfe->session->rtp_manager, dtmfe->packet); + trtp_manager_send_rtp_packet(TDAV_SESSION_AV(dtmfe->session)->rtp_manager, dtmfe->packet, tsk_false); /* Remove and delete the event from the queue */ tsk_list_remove_item_by_data(dtmfe->session->dtmf_events, dtmfe); - return ret; + return 0; } //================================================================================================= @@ -954,84 +618,72 @@ int _tdav_session_audio_dtmfe_timercb(const void* arg, tsk_timer_id_t timer_id) /* constructor */ static tsk_object_t* tdav_session_audio_ctor(tsk_object_t * self, va_list * app) { - tdav_session_audio_t *session = self; - if(session){ - /* init base: called by tmedia_session_create() */ - /* init self */ - uint64_t session_id = TMEDIA_SESSION(session)->id; - tsk_safeobj_init(session); - if(!session_id){ // set the session id if not already done - TMEDIA_SESSION(session)->id = session_id = tmedia_session_get_unique_id(); + tdav_session_audio_t *audio = self; + if(audio){ + int ret; + tdav_session_av_t *base = TDAV_SESSION_AV(self); + static const tsk_bool_t is_audio = tsk_true; + + /* init() base */ + if((ret = tdav_session_av_init(base, is_audio)) != 0){ + TSK_DEBUG_ERROR("tdav_session_av_init(audio) failed"); + return tsk_null; } - if(!(session->consumer = tmedia_consumer_create(tdav_session_audio_plugin_def_t->type, session_id))){ - TSK_DEBUG_ERROR("Failed to create Audio consumer"); + + /* init() self */ + if(base->producer){ + tmedia_producer_set_enc_callback(base->producer, tdav_session_audio_producer_enc_cb, audio); } - if((session->producer = tmedia_producer_create(tdav_session_audio_plugin_def_t->type, session_id))){ - tmedia_producer_set_enc_callback(session->producer, tdav_session_audio_producer_enc_cb, self); + if(base->consumer){ + if(!(audio->denoise = tmedia_denoise_create())){ + TSK_DEBUG_WARN("No Audio denoiser found"); + } + else{ + // IMPORTANT: This means that the consumer must be child of "tdav_consumer_audio_t" object + tdav_consumer_audio_set_denoise(TDAV_CONSUMER_AUDIO(base->consumer), audio->denoise); + } } - else{ - TSK_DEBUG_ERROR("Failed to create Audio producer"); - } - if(!(session->denoise = tmedia_denoise_create())){ - TSK_DEBUG_WARN("No Audio denoiser found"); - } - else if(session->consumer){// IMPORTANT: This means that the consumer must be child of "tdav_consumer_audio_t" object. - tdav_consumer_audio_set_denoise(TDAV_CONSUMER_AUDIO(session->consumer), session->denoise); - } -#if HAVE_SRTP - session->srtp_mode = tmedia_defaults_get_srtp_mode(); -#endif } return self; } /* destructor */ static tsk_object_t* tdav_session_audio_dtor(tsk_object_t * self) { - tdav_session_audio_t *session = self; - if(session){ - + tdav_session_audio_t *audio = self; + if(audio){ + tdav_session_audio_stop((tmedia_session_t*)audio); // Do it in this order (deinit self first) /* Timer manager */ - if(session->timer.started){ - if(session->dtmf_events){ + if(audio->timer.started){ + if(audio->dtmf_events){ /* Cancel all events */ tsk_list_item_t* item; - tsk_list_foreach(item, session->dtmf_events){ + tsk_list_foreach(item, audio->dtmf_events){ tsk_timer_mgr_global_cancel(((tdav_session_audio_dtmfe_t*)item->data)->timer_id); } } tsk_timer_mgr_global_stop(); } - if(session->timer.created){ + if(audio->timer.created){ tsk_timer_mgr_global_unref(); } /* CleanUp the DTMF events */ - TSK_OBJECT_SAFE_FREE(session->dtmf_events); + TSK_OBJECT_SAFE_FREE(audio->dtmf_events); + + TSK_OBJECT_SAFE_FREE(audio->denoise); - /* deinit self (rtp manager should be destroyed after the producer) */ - TSK_OBJECT_SAFE_FREE(session->consumer); - TSK_OBJECT_SAFE_FREE(session->producer); - TSK_OBJECT_SAFE_FREE(session->rtp_manager); - TSK_FREE(session->remote_ip); - TSK_FREE(session->local_ip); - TSK_OBJECT_SAFE_FREE(session->denoise); - - TSK_OBJECT_SAFE_FREE(session->encoder.codec); - TSK_FREE(session->encoder.buffer); - TSK_FREE(session->decoder.buffer); + TSK_OBJECT_SAFE_FREE(audio->encoder.codec); + TSK_FREE(audio->encoder.buffer); + TSK_OBJECT_SAFE_FREE(audio->decoder.codec); + TSK_FREE(audio->decoder.buffer); // free resampler - TSK_FREE(session->decoder.resampler.buffer); - TSK_OBJECT_SAFE_FREE(session->decoder.resampler.instance); - - /* NAT Traversal context */ - TSK_OBJECT_SAFE_FREE(session->natt_ctx); - - tsk_safeobj_deinit(session); + TSK_FREE(audio->decoder.resampler.buffer); + TSK_OBJECT_SAFE_FREE(audio->decoder.resampler.instance); /* deinit base */ - tmedia_session_deinit(self); + tdav_session_av_deinit(TDAV_SESSION_AV(self)); } return self; diff --git a/branches/2.0/doubango/tinyDAV/src/audio/tdav_speex_jitterbuffer.c b/branches/2.0/doubango/tinyDAV/src/audio/tdav_speex_jitterbuffer.c index 736358cd..1a56b191 100644 --- a/branches/2.0/doubango/tinyDAV/src/audio/tdav_speex_jitterbuffer.c +++ b/branches/2.0/doubango/tinyDAV/src/audio/tdav_speex_jitterbuffer.c @@ -135,10 +135,10 @@ static tsk_size_t tdav_speex_jitterbuffer_get(tmedia_jitterbuffer_t* self, void* case JITTER_BUFFER_INSERTION: /*TSK_DEBUG_INFO("JITTER_BUFFER_INSERTION - %d", ret);*/ break; default: TSK_DEBUG_INFO("jitter_buffer_get() failed - %d", ret); } - // jitter_buffer_update_delay(jitterbuffer->state, &jb_packet, NULL); + jitter_buffer_update_delay(jitterbuffer->state, &jb_packet, NULL); return 0; } - jitter_buffer_update_delay(jitterbuffer->state, &jb_packet, NULL); + // jitter_buffer_update_delay(jitterbuffer->state, &jb_packet, NULL); return out_size; } diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/amr/tdav_codec_amr.c b/branches/2.0/doubango/tinyDAV/src/codecs/amr/tdav_codec_amr.c index 84847513..ed734b6b 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/amr/tdav_codec_amr.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/amr/tdav_codec_amr.c @@ -79,8 +79,6 @@ static uint8_t tdav_codec_amr_bitbuffer_read(const void* bits, tsk_size_t size, [17], and the 12.2 kbps mode as GSM-EFR [16]. */ -#define tdav_codec_amrnb_fmtp_set tsk_null - int tdav_codec_amrnb_open(tmedia_codec_t* self) { tdav_codec_amr_t* amrnb = (tdav_codec_amr_t*)self; @@ -145,7 +143,7 @@ tsk_size_t tdav_codec_amrnb_decode(tmedia_codec_t* self, const void* in_data, ts } } -char* tdav_codec_amrnb_fmtp_get(const tmedia_codec_t* codec) +char* tdav_codec_amrnb_sdp_att_get(const tmedia_codec_t* codec, const char* att_name) { const tdav_codec_amr_t* amr = (const tdav_codec_amr_t*)codec; @@ -161,19 +159,23 @@ char* tdav_codec_amrnb_fmtp_get(const tmedia_codec_t* codec) return tsk_null; } -tsk_bool_t tdav_codec_amrnb_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +tsk_bool_t tdav_codec_amrnb_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { - tdav_codec_amr_t* amr = (tdav_codec_amr_t*)codec; + tdav_codec_amr_t* amr; + if(!(amr = (tdav_codec_amr_t*)codec) || !att_name){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_false; + } - if(amr){ + if(amr && tsk_striequals(att_name, "fmtp")){ /* Match mode */ - if(tdav_codec_amr_get_mode(fmtp) != amr->mode){ - TSK_DEBUG_INFO("Failed to match [%s]", fmtp); + if(tdav_codec_amr_get_mode(att_value) != amr->mode){ + TSK_DEBUG_INFO("Failed to match [%s]", att_value); return tsk_false; } /* check parameters validity */ - if(tdav_codec_amr_parse_fmtp(amr, fmtp)){ - TSK_DEBUG_INFO("Failed to match [%s]", fmtp); + if(tdav_codec_amr_parse_fmtp(amr, att_value)){ + TSK_DEBUG_INFO("Failed to match [%s]", att_value); return tsk_false; } @@ -239,13 +241,13 @@ static const tmedia_codec_plugin_def_t tdav_codec_amrnb_oa_plugin_def_s = /* video */ {0}, + tsk_null, // set() tdav_codec_amrnb_open, tdav_codec_amrnb_close, tdav_codec_amrnb_encode, tdav_codec_amrnb_decode, - tdav_codec_amrnb_fmtp_match, - tdav_codec_amrnb_fmtp_get, - tdav_codec_amrnb_fmtp_set + tdav_codec_amrnb_sdp_att_match, + tdav_codec_amrnb_sdp_att_get }; const tmedia_codec_plugin_def_t *tdav_codec_amrnb_oa_plugin_def_t = &tdav_codec_amrnb_oa_plugin_def_s; @@ -305,13 +307,13 @@ static const tmedia_codec_plugin_def_t tdav_codec_amrnb_be_plugin_def_s = /* video */ {0}, + tsk_null, // set() tdav_codec_amrnb_open, tdav_codec_amrnb_close, tdav_codec_amrnb_encode, tdav_codec_amrnb_decode, - tdav_codec_amrnb_fmtp_match, - tdav_codec_amrnb_fmtp_get, - tdav_codec_amrnb_fmtp_set + tdav_codec_amrnb_sdp_att_match, + tdav_codec_amrnb_sdp_att_get }; const tmedia_codec_plugin_def_t *tdav_codec_amrnb_be_plugin_def_t = &tdav_codec_amrnb_be_plugin_def_s; diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/bv/tdav_codec_bv16.c b/branches/2.0/doubango/tinyDAV/src/codecs/bv/tdav_codec_bv16.c index 8ec5ec23..8325a275 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/bv/tdav_codec_bv16.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/bv/tdav_codec_bv16.c @@ -57,7 +57,7 @@ /* ============ BV16 Plugin interface ================= */ -#define tdav_codec_bv16_fmtp_get tsk_null +#define tdav_codec_bv16_sdp_att_get tsk_null #define tdav_codec_bv16_fmtp_set tsk_null static int sizestate = sizeof(struct BV16_Encoder_State); @@ -174,7 +174,7 @@ tsk_size_t tdav_codec_bv16_decode(tmedia_codec_t* self, const void* in_data, tsk return out_size; } -tsk_bool_t tdav_codec_bv16_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +tsk_bool_t tdav_codec_bv16_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { /* always match */ return tsk_true; } @@ -239,8 +239,8 @@ static const tmedia_codec_plugin_def_t tdav_codec_bv16_plugin_def_s = tdav_codec_bv16_close, tdav_codec_bv16_encode, tdav_codec_bv16_decode, - tdav_codec_bv16_fmtp_match, - tdav_codec_bv16_fmtp_get, + tdav_codec_bv16_sdp_att_match, + tdav_codec_bv16_sdp_att_get, tdav_codec_bv16_fmtp_set }; const tmedia_codec_plugin_def_t *tdav_codec_bv16_plugin_def_t = &tdav_codec_bv16_plugin_def_s; diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/dtmf/tdav_codec_dtmf.c b/branches/2.0/doubango/tinyDAV/src/codecs/dtmf/tdav_codec_dtmf.c index 19f38992..43a0d5ce 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/dtmf/tdav_codec_dtmf.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/dtmf/tdav_codec_dtmf.c @@ -35,8 +35,6 @@ /* ============ DTMF Plugin interface ================= */ -#define tdav_codec_dtmf_fmtp_set tsk_null - tsk_size_t tdav_codec_dtmf_fmtp_encode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size) { return 0; @@ -47,12 +45,15 @@ tsk_size_t tdav_codec_dtmf_fmtp_decode(tmedia_codec_t* self, const void* in_data return 0; } -char* tdav_codec_dtmf_fmtp_get(const tmedia_codec_t* self) +char* tdav_codec_dtmf_sdp_att_get(const tmedia_codec_t* self, const char* att_name) { - return tsk_strdup("0-15"); + if(tsk_striequals(att_name, "fmtp")){ + return tsk_strdup("0-15"); + } + return tsk_null; } -tsk_bool_t tdav_codec_dtmf_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +tsk_bool_t tdav_codec_dtmf_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { /* always match */ return tsk_true; } @@ -112,12 +113,12 @@ static const tmedia_codec_plugin_def_t tdav_codec_dtmf_plugin_def_s = /* video */ {0}, + tsk_null, // set() tsk_null, // open tsk_null, // close tdav_codec_dtmf_fmtp_encode, tdav_codec_dtmf_fmtp_decode, - tdav_codec_dtmf_fmtp_match, - tdav_codec_dtmf_fmtp_get, - tdav_codec_dtmf_fmtp_set + tdav_codec_dtmf_sdp_att_match, + tdav_codec_dtmf_sdp_att_get }; const tmedia_codec_plugin_def_t *tdav_codec_dtmf_plugin_def_t = &tdav_codec_dtmf_plugin_def_s; diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/fec/tdav_codec_red.c b/branches/2.0/doubango/tinyDAV/src/codecs/fec/tdav_codec_red.c new file mode 100644 index 00000000..9cbbd185 --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/src/codecs/fec/tdav_codec_red.c @@ -0,0 +1,264 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tdav_codec_red.c + * @brief RTP Payload for Redundant Audio Data as per RFC 2198 + */ +#include "tinydav/codecs/fec/tdav_codec_red.h" + +#include "tinyrtp/rtp/trtp_rtp_packet.h" + +#include "tsk_memory.h" +#include "tsk_time.h" +#include "tsk_debug.h" + +#define TDAV_CODEC_RED_MIN_PKT_SIZE 4 + +typedef struct tdav_codec_red_s +{ + TMEDIA_DECLARE_CODEC_VIDEO; + + tdav_codec_red_rtppacket_cb_f callback; + const void* callback_data; +} +tdav_codec_red_t; + +int tdav_codec_red_set_callback(tdav_codec_red_t *self, tdav_codec_red_rtppacket_cb_f callback, const void* callback_data) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + self->callback = callback; + self->callback_data = callback_data; + + return 0; +} + +static int tdav_codec_red_open(tmedia_codec_t* self) +{ + return 0; +} + +static int tdav_codec_red_close(tmedia_codec_t* self) +{ + return 0; +} + +static tsk_size_t tdav_codec_red_encode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size) +{ + tdav_codec_red_t *red = (tdav_codec_red_t *)self; + tsk_size_t xsize = (in_size + 1); + static const uint8_t __first_octet = 0x00; // F=1, PT=0. Up to the caller to update this first octet with the right PT. + + if(!red || !in_data || !in_size || !out_data || !out_max_size){ + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + + if(*out_max_size < xsize){ + if(!(*out_data = tsk_realloc(*out_data, xsize))){ + TSK_DEBUG_ERROR("Failed to realloc data"); + *out_max_size = 0; + } + *out_max_size = xsize; + } + + ((uint8_t*)*out_data)[0] = __first_octet; + memcpy(&((uint8_t*)*out_data)[1], in_data, in_size); + + return xsize; +} + +static tsk_size_t tdav_codec_red_decode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size, const tsk_object_t* proto_hdr) +{ + tdav_codec_red_t* red = (tdav_codec_red_t*)self; + const trtp_rtp_header_t* rtp_hdr = proto_hdr; + trtp_rtp_packet_t* red_rtp_pkt = tsk_null; + const uint8_t* pdata = in_data; + const uint8_t* red_hdr = in_data; + tsk_size_t red_hdrs_count, i; + tsk_bool_t last; + uint8_t F; + uint16_t timestamp_offset, block_length; + + if(!red || !in_data || (in_size < TDAV_CODEC_RED_MIN_PKT_SIZE)|| !out_data){ + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + + if(!red->callback){ + TSK_DEBUG_WARN("Not callback installed for RED data"); + return 0; + } + + if((F = (pdata[0] >> 7)) == 0){ + i = 1; + red_hdrs_count = 1; + } + else{ + for(i = 0, red_hdrs_count = 0; i < in_size; i+= 4, ++red_hdrs_count){ + if((F = (pdata[i] >> 7)) == 0){ ++i; ++red_hdrs_count; break; } + } + } + + if(i >= in_size){ + TSK_DEBUG_ERROR("Invalid data"); + return 0; + } + + pdata += i; + in_size -= i; + + for(i = 0; i < red_hdrs_count && in_size > 0; ++i){ + TSK_OBJECT_SAFE_FREE(red_rtp_pkt); + if(!(red_rtp_pkt = trtp_rtp_packet_create_null())){ + TSK_DEBUG_ERROR("Failed to create RTP packet"); + continue; + } + if(!(red_rtp_pkt->header = trtp_rtp_header_create(rtp_hdr->ssrc, rtp_hdr->seq_num, rtp_hdr->timestamp, rtp_hdr->payload_type, rtp_hdr->marker))){ + TSK_DEBUG_ERROR("Failed to create RTP header"); + continue; + } + + // Must create an RTP packet for each RED chunck as they will be saved in the JB + last = (i == (red_hdrs_count - 1)); + F = (red_hdr[0] >> 7); + red_rtp_pkt->header->payload_type = (red_hdr[0] & 0x7F); + + if(last){ + /* + 0 1 2 3 4 5 6 7 + +-+-+-+-+-+-+-+-+ + |0| Block PT | + +-+-+-+-+-+-+-+-+ + */ + block_length = in_size; + } + else{ + /* + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |1| block PT=7 | timestamp offset | block length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + timestamp_offset = ((red_hdr[1] << 8) | red_hdr[2]) >> 2; + block_length = ((red_hdr[2] & 0x03) << 8) | red_hdr[3]; + if(block_length > in_size){ + TSK_DEBUG_ERROR("Invalid 'block length'"); + break; + } + red_rtp_pkt->header->timestamp += timestamp_offset; + red_hdr += 4; + } + + // decode + if(red->callback){ + // do not use "data_const" as payload will be saved in the jitter buffer and decoded later (async) + if((red_rtp_pkt->payload.data = tsk_malloc(block_length))){ + memcpy(red_rtp_pkt->payload.data, pdata, block_length); + red_rtp_pkt->payload.size = block_length; + red->callback(red->callback_data, red_rtp_pkt); + } + } + + pdata += block_length; + in_size -= block_length; + } + + TSK_OBJECT_SAFE_FREE(red_rtp_pkt); + + return 0; // must be always zero +} + +static tsk_bool_t tdav_codec_red_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) +{ + return tsk_true; +} + +static char* tdav_codec_red_sdp_att_get(const tmedia_codec_t* self, const char* att_name) +{ + return tsk_null; +} + + +/* ============ red object definition ================= */ + +/* constructor */ +static tsk_object_t* tdav_codec_red_ctor(tsk_object_t * self, va_list * app) +{ + tdav_codec_red_t *red = self; + if(red){ + /* init base: called by tmedia_codec_create() */ + /* init self */ + + } + return self; +} +/* destructor */ +static tsk_object_t* tdav_codec_red_dtor(tsk_object_t * self) +{ + tdav_codec_red_t *red = self; + if(red){ + /* deinit base */ + tmedia_codec_video_deinit(red); + /* deinit self */ + + } + + return self; +} +/* object definition */ +static const tsk_object_def_t tdav_codec_red_def_s = +{ + sizeof(tdav_codec_red_t), + tdav_codec_red_ctor, + tdav_codec_red_dtor, + tmedia_codec_cmp, +}; +/* plugin definition*/ +static const tmedia_codec_plugin_def_t tdav_codec_red_plugin_def_s = +{ + &tdav_codec_red_def_s, + + tmedia_video, + "red", + "red codec", + TMEDIA_CODEC_FORMAT_RED, + tsk_true, + 90000, // rate + + /* audio */ + { 0 }, + + /* video (defaul width,height,fps) */ + {176, 144, 15}, + + tsk_null, // set() + tdav_codec_red_open, + tdav_codec_red_close, + tdav_codec_red_encode, + tdav_codec_red_decode, + tdav_codec_red_sdp_att_match, + tdav_codec_red_sdp_att_get +}; +const tmedia_codec_plugin_def_t *tdav_codec_red_plugin_def_t = &tdav_codec_red_plugin_def_s; diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/fec/tdav_codec_ulpfec.c b/branches/2.0/doubango/tinyDAV/src/codecs/fec/tdav_codec_ulpfec.c new file mode 100644 index 00000000..0722600a --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/src/codecs/fec/tdav_codec_ulpfec.c @@ -0,0 +1,424 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tdav_codec_ulpfec.c + * @brief Forward Error Correction (FEC) implementation as per RFC 5109 + */ +#include "tinydav/codecs/fec/tdav_codec_ulpfec.h" + +#include "tinyrtp/rtp/trtp_rtp_packet.h" + +#include "tsk_memory.h" +#include "tsk_debug.h" + +#define TDAV_FEC_PKT_HDR_SIZE 10 + +typedef struct tdav_codec_ulpfec_s +{ + TMEDIA_DECLARE_CODEC_VIDEO; + + struct{ + struct tdav_fec_pkt_s* pkt; + } encoder; +} +tdav_codec_ulpfec_t; + +// +// FEC LEVEL +// +typedef struct tdav_fec_level_s +{ + TSK_DECLARE_OBJECT; + + struct{ // 7.4. FEC Level Header for FEC Packets + uint16_t length; + uint64_t mask; + tsk_size_t mask_size; // in bits + } hdr; + struct{ + uint8_t* ptr; + tsk_size_t size; + }payload; +}tdav_fec_level_t; +typedef tsk_list_t tdav_fec_levels_L_t; +static tsk_object_t* tdav_fec_level_ctor(tsk_object_t * self, va_list * app) +{ + tdav_fec_level_t *level = self; + if(level){ + level->hdr.mask_size = 16; // L=0 + } + return self; +} +static tsk_object_t* tdav_fec_level_dtor(tsk_object_t * self) +{ + tdav_fec_level_t *level = self; + if(level){ + TSK_FREE(level->payload.ptr); + } + + return self; +} +static const tsk_object_def_t tdav_fec_level_def_s = +{ + sizeof(tdav_fec_level_t), + tdav_fec_level_ctor, + tdav_fec_level_dtor, + tsk_null, +}; +const tsk_object_def_t *tdav_fec_level_def_t = &tdav_fec_level_def_s; + + +// +// FEC PACKET +// +typedef struct tdav_fec_pkt_s +{ + TSK_DECLARE_OBJECT; + + struct{ // RFC 5109 - 7.3. FEC Header for FEC Packets + unsigned E:1; + unsigned L:1; + unsigned P:1; + unsigned X:1; + unsigned CC:4; + unsigned M:1; + unsigned PT:7; + struct{ + uint16_t value; + unsigned set:1; + }SN_base; + uint32_t TS; + uint16_t length; + }hdr; + + tdav_fec_levels_L_t* levels; +} +tdav_fec_pkt_t; +static tsk_object_t* tdav_fec_pkt_ctor(tsk_object_t * self, va_list * app) +{ + tdav_fec_pkt_t *pkt = self; + if(pkt){ + if(!(pkt->levels = tsk_list_create())){ + TSK_DEBUG_ERROR("Failed to create levels"); + return tsk_null; + } + } + return self; +} +static tsk_object_t* tdav_fec_pkt_dtor(tsk_object_t * self) +{ + tdav_fec_pkt_t *pkt = self; + if(pkt){ + TSK_OBJECT_SAFE_FREE(pkt->levels); + } + + return self; +} +static int tdav_fec_pkt_cmp(const tsk_object_t *_p1, const tsk_object_t *_p2) +{ + const tdav_fec_pkt_t *p1 = _p1; + const tdav_fec_pkt_t *p2 = _p2; + + if(p1 && p2){ + return (int)(p1->hdr.SN_base.value - p2->hdr.SN_base.value); + } + else if(!p1 && !p2) return 0; + else return -1; +} +static const tsk_object_def_t tdav_fec_pkt_def_s = +{ + sizeof(tdav_fec_pkt_t), + tdav_fec_pkt_ctor, + tdav_fec_pkt_dtor, + tdav_fec_pkt_cmp, +}; +const tsk_object_def_t *tdav_fec_pkt_def_t = &tdav_fec_pkt_def_s; + + +tsk_size_t tdav_codec_ulpfec_guess_serialbuff_size(const tdav_codec_ulpfec_t* self) +{ + tsk_size_t size = TDAV_FEC_PKT_HDR_SIZE; + tsk_list_item_t *item; + tdav_fec_level_t* level; + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + + tsk_list_foreach(item, self->encoder.pkt->levels){ + if(!(level = item->data)){ + continue; + } + size += 2 /* Protection length */ + (level->hdr.mask_size >> 3) + level->hdr.length; + } + + return size; +} + +int tdav_codec_ulpfec_enc_reset(tdav_codec_ulpfec_t* self) +{ + tsk_list_item_t *item; + tdav_fec_level_t* level; + + if(!self || !self->encoder.pkt){ + TSK_DEBUG_ERROR("invalid parameter"); + return -1; + } + + // reset packet + memset(&self->encoder.pkt->hdr, 0, sizeof(self->encoder.pkt->hdr)); + + // reset levels + tsk_list_foreach(item, self->encoder.pkt->levels){ + if((level = item->data)){ + memset(&level->hdr, 0, sizeof(level->hdr)); + if(level->payload.ptr){ + memset(level->payload.ptr, 0, level->payload.size); + } + } + } + return 0; +} + +int tdav_codec_ulpfec_enc_protect(tdav_codec_ulpfec_t* self, const trtp_rtp_packet_t* rtp_packet) +{ + if(!self || !self->encoder.pkt || !rtp_packet || !rtp_packet->header){ + TSK_DEBUG_ERROR("invalid parameter"); + return -1; + } + + // Packet + self->encoder.pkt->hdr.P ^= rtp_packet->header->padding; + self->encoder.pkt->hdr.X ^= rtp_packet->header->extension; + self->encoder.pkt->hdr.CC ^= rtp_packet->header->csrc_count; + self->encoder.pkt->hdr.M ^= rtp_packet->header->marker; + self->encoder.pkt->hdr.PT ^= rtp_packet->header->payload_type; + if(!self->encoder.pkt->hdr.SN_base.set){ + self->encoder.pkt->hdr.SN_base.value = rtp_packet->header->seq_num; + self->encoder.pkt->hdr.SN_base.set = 1; + } + else{ + self->encoder.pkt->hdr.SN_base.value = TSK_MIN(self->encoder.pkt->hdr.SN_base.value, rtp_packet->header->seq_num); + } + self->encoder.pkt->hdr.TS ^= rtp_packet->header->timestamp; + self->encoder.pkt->hdr.length ^= (trtp_rtp_packet_guess_serialbuff_size(rtp_packet) - TRTP_RTP_HEADER_MIN_SIZE); + + // Level + // For now, always single-level protection + { + tdav_fec_level_t* level0 = TSK_LIST_FIRST_DATA(self->encoder.pkt->levels); + const uint8_t* rtp_payload = (const uint8_t*)(rtp_packet->payload.data_const ? rtp_packet->payload.data_const : rtp_packet->payload.data); + tsk_size_t i; + if(!level0){ + tdav_fec_level_t* _level0; + if(!(_level0 = tsk_object_new(tdav_fec_level_def_t))){ + TSK_DEBUG_ERROR("Failed to create level"); + return -2; + } + level0 = _level0; + tsk_list_push_back_data(self->encoder.pkt->levels, (void**)&_level0); + } + if(level0->payload.size < rtp_packet->payload.size){ + if(!(level0->payload.ptr = tsk_realloc(level0->payload.ptr, rtp_packet->payload.size))){ + TSK_DEBUG_ERROR("Failed to realloc size %d", rtp_packet->payload.size); + level0->payload.size = 0; + return -3; + } + level0->payload.size = rtp_packet->payload.size; + } + for(i = 0; i < rtp_packet->payload.size; ++i){ + level0->payload.ptr[i] ^= rtp_payload[i]; + } + level0->hdr.mask_size = self->encoder.pkt->hdr.L ? 48 : 16; + level0->hdr.mask |= ((uint64_t)1 << (level0->hdr.mask_size - (rtp_packet->header->seq_num - self->encoder.pkt->hdr.SN_base.value))); + level0->hdr.length = TSK_MAX(level0->hdr.length, rtp_packet->payload.size); + } + + return 0; +} + +tsk_size_t tdav_codec_ulpfec_enc_serialize(const tdav_codec_ulpfec_t* self, void** out_data, tsk_size_t* out_max_size) +{ + uint8_t* pdata; + tsk_size_t xsize; + int32_t i; + tsk_list_item_t* item; + tdav_fec_level_t* level; + + if(!self || !self->encoder.pkt || !out_data){ + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + xsize = tdav_codec_ulpfec_guess_serialbuff_size(self); + + if(*out_max_size < xsize){ + if(!(*out_data = tsk_realloc(*out_data, xsize))){ + TSK_DEBUG_ERROR("Failed to reallocate buffer with size =%d", xsize); + *out_max_size = 0; + return 0; + } + *out_max_size = xsize; + } + pdata = (uint8_t*)*out_data; + + // E(1), L(1), P(1), X(1), CC(4) + pdata[0] = + (self->encoder.pkt->hdr.E << 7) | + (self->encoder.pkt->hdr.L << 6) | + (self->encoder.pkt->hdr.P << 5) | + (self->encoder.pkt->hdr.X << 4) | + (self->encoder.pkt->hdr.CC & 0x0F); + // M(1), PT(7) + pdata[1] = (self->encoder.pkt->hdr.M << 7) | (self->encoder.pkt->hdr.PT & 0x7F); + // SN base (16) + pdata[2] = (self->encoder.pkt->hdr.SN_base.value >> 8); + pdata[3] = (self->encoder.pkt->hdr.SN_base.value & 0xFF); + // TS (32) + pdata[4] = self->encoder.pkt->hdr.TS >> 24; + pdata[5] = (self->encoder.pkt->hdr.TS >> 16) & 0xFF; + pdata[6] = (self->encoder.pkt->hdr.TS >> 8) & 0xFF; + pdata[7] = (self->encoder.pkt->hdr.TS & 0xFF); + // Length (16) + pdata[8] = (self->encoder.pkt->hdr.length >> 8); + pdata[9] = (self->encoder.pkt->hdr.length & 0xFF); + + pdata+= 10; + + tsk_list_foreach(item, self->encoder.pkt->levels){ + if(!(level = item->data)){ + continue; + } + // Protection length (16) + pdata[0] = (level->hdr.length >> 8); + pdata[1] = (level->hdr.length & 0xFF); + pdata+=2; + // mask (16 or 48) + for(i = (level->hdr.mask_size - 8); i >= 0; i-=8){ + *pdata = ((level->hdr.mask >> i) & 0xFF); ++pdata; + } + // payload + memcpy(pdata, level->payload.ptr, level->hdr.length); + } + + return xsize; +} + + + +static int tdav_codec_ulpfec_open(tmedia_codec_t* self) +{ + return 0; +} + +static int tdav_codec_ulpfec_close(tmedia_codec_t* self) +{ + return 0; +} + +static tsk_size_t tdav_codec_ulpfec_encode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size) +{ + TSK_DEBUG_ERROR("Not expected to be called"); + return 0; +} + +static tsk_size_t tdav_codec_ulpfec_decode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size, const tsk_object_t* proto_hdr) +{ + TSK_DEBUG_ERROR("Not expected to be called"); + return 0; +} + +static tsk_bool_t tdav_codec_ulpfec_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) +{ + return tsk_true; +} + +static char* tdav_codec_ulpfec_sdp_att_get(const tmedia_codec_t* self, const char* att_name) +{ + return tsk_null; +} + + +/* ============ ULPFEC object definition ================= */ + +/* constructor */ +static tsk_object_t* tdav_codec_ulpfec_ctor(tsk_object_t * self, va_list * app) +{ + tdav_codec_ulpfec_t *ulpfec = self; + if(ulpfec){ + /* init base: called by tmedia_codec_create() */ + /* init self */ + if(!(ulpfec->encoder.pkt = tsk_object_new(tdav_fec_pkt_def_t))){ + TSK_DEBUG_ERROR("Failed to create FEC packet"); + return tsk_null; + } + } + return self; +} +/* destructor */ +static tsk_object_t* tdav_codec_ulpfec_dtor(tsk_object_t * self) +{ + tdav_codec_ulpfec_t *ulpfec = self; + if(ulpfec){ + /* deinit base */ + tmedia_codec_video_deinit(ulpfec); + /* deinit self */ + TSK_OBJECT_SAFE_FREE(ulpfec->encoder.pkt); + } + + return self; +} +/* object definition */ +static const tsk_object_def_t tdav_codec_ulpfec_def_s = +{ + sizeof(tdav_codec_ulpfec_t), + tdav_codec_ulpfec_ctor, + tdav_codec_ulpfec_dtor, + tmedia_codec_cmp, +}; +/* plugin definition*/ +static const tmedia_codec_plugin_def_t tdav_codec_ulpfec_plugin_def_s = +{ + &tdav_codec_ulpfec_def_s, + + tmedia_video, + "ulpfec", + "ulpfec codec", + TMEDIA_CODEC_FORMAT_ULPFEC, + tsk_true, + 90000, // rate + + /* audio */ + { 0 }, + + /* video (defaul width,height,fps) */ + {176, 144, 15}, + + tsk_null, // set() + tdav_codec_ulpfec_open, + tdav_codec_ulpfec_close, + tdav_codec_ulpfec_encode, + tdav_codec_ulpfec_decode, + tdav_codec_ulpfec_sdp_att_match, + tdav_codec_ulpfec_sdp_att_get +}; +const tmedia_codec_plugin_def_t *tdav_codec_ulpfec_plugin_def_t = &tdav_codec_ulpfec_plugin_def_s; \ No newline at end of file diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/g711/tdav_codec_g711.c b/branches/2.0/doubango/tinyDAV/src/codecs/g711/tdav_codec_g711.c index 449331db..0f5f2544 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/g711/tdav_codec_g711.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/g711/tdav_codec_g711.c @@ -38,8 +38,7 @@ #define tdav_codec_g711u_open tsk_null #define tdav_codec_g711u_close tsk_null -#define tdav_codec_g711u_fmtp_get tsk_null -#define tdav_codec_g711u_fmtp_set tsk_null +#define tdav_codec_g711u_sdp_att_get tsk_null static tsk_size_t tdav_codec_g711u_encode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size) { @@ -96,7 +95,7 @@ static tsk_size_t tdav_codec_g711u_decode(tmedia_codec_t* self, const void* in_d return (in_size<<1); } -static tsk_bool_t tdav_codec_g711u_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +static tsk_bool_t tdav_codec_g711u_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { /* always match */ return tsk_true; } @@ -156,13 +155,13 @@ static const tmedia_codec_plugin_def_t tdav_codec_g711u_plugin_def_s = /* video */ {0}, + tsk_null, // set() tdav_codec_g711u_open, tdav_codec_g711u_close, tdav_codec_g711u_encode, tdav_codec_g711u_decode, - tdav_codec_g711u_fmtp_match, - tdav_codec_g711u_fmtp_get, - tdav_codec_g711u_fmtp_set + tdav_codec_g711u_sdp_att_match, + tdav_codec_g711u_sdp_att_get }; const tmedia_codec_plugin_def_t *tdav_codec_g711u_plugin_def_t = &tdav_codec_g711u_plugin_def_s; @@ -171,8 +170,7 @@ const tmedia_codec_plugin_def_t *tdav_codec_g711u_plugin_def_t = &tdav_codec_g71 #define tdav_codec_g711a_open tsk_null #define tdav_codec_g711a_close tsk_null -#define tdav_codec_g711a_fmtp_get tsk_null -#define tdav_codec_g711a_fmtp_set tsk_null +#define tdav_codec_g711a_sdp_att_get tsk_null static tsk_size_t tdav_codec_g711a_encode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size) { @@ -245,7 +243,7 @@ static tsk_size_t tdav_codec_g711a_decode(tmedia_codec_t* self, const void* in_d return (in_size<<1); } -static tsk_bool_t tdav_codec_g711a_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +static tsk_bool_t tdav_codec_g711a_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { /* always match */ return tsk_true; } @@ -305,12 +303,12 @@ static const tmedia_codec_plugin_def_t tdav_codec_g711a_plugin_def_s = /* video */ {0}, + tsk_null, // set() tdav_codec_g711a_open, tdav_codec_g711a_close, tdav_codec_g711a_encode, tdav_codec_g711a_decode, - tdav_codec_g711a_fmtp_match, - tdav_codec_g711a_fmtp_get, - tdav_codec_g711a_fmtp_set + tdav_codec_g711a_sdp_att_match, + tdav_codec_g711a_sdp_att_get }; const tmedia_codec_plugin_def_t *tdav_codec_g711a_plugin_def_t = &tdav_codec_g711a_plugin_def_s; diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/g722/tdav_codec_g722.c b/branches/2.0/doubango/tinyDAV/src/codecs/g722/tdav_codec_g722.c index 20dace29..3276bfba 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/g722/tdav_codec_g722.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/g722/tdav_codec_g722.c @@ -31,7 +31,6 @@ #include "tsk_memory.h" #include "tsk_debug.h" -#define tdav_codec_g722_fmtp_set tsk_null static int tdav_codec_g722_open(tmedia_codec_t* self) { @@ -134,12 +133,12 @@ static tsk_size_t tdav_codec_g722_decode(tmedia_codec_t* self, const void* in_da return (in_size<<2); } -static tsk_bool_t tdav_codec_g722_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +static tsk_bool_t tdav_codec_g722_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { return tsk_true; } -static char* tdav_codec_g722_fmtp_get(const tmedia_codec_t* codec) +static char* tdav_codec_g722_sdp_att_get(const tmedia_codec_t* codec, const char* att_name) { return tsk_null; } @@ -205,12 +204,12 @@ static const tmedia_codec_plugin_def_t tdav_codec_g722_plugin_def_s = /* video */ {0}, + tsk_null, // set() tdav_codec_g722_open, tdav_codec_g722_close, tdav_codec_g722_encode, tdav_codec_g722_decode, - tdav_codec_g722_fmtp_match, - tdav_codec_g722_fmtp_get, - tdav_codec_g722_fmtp_set + tdav_codec_g722_sdp_att_match, + tdav_codec_g722_sdp_att_get }; const tmedia_codec_plugin_def_t *tdav_codec_g722_plugin_def_t = &tdav_codec_g722_plugin_def_s; diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/g729/tdav_codec_g729.c b/branches/2.0/doubango/tinyDAV/src/codecs/g729/tdav_codec_g729.c index cb329102..f1717cce 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/g729/tdav_codec_g729.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/g729/tdav_codec_g729.c @@ -60,7 +60,7 @@ static void pack_SID(const Word16 ituBits[], uint8_t bitstream[]); /* ============ G.729ab Plugin interface ================= */ -#define tdav_codec_g729ab_fmtp_set tsk_null +#define tdav_codec_g729ab_set tsk_null static int tdav_codec_g729ab_open(tmedia_codec_t* self) { @@ -234,34 +234,36 @@ static tsk_size_t tdav_codec_g729ab_decode(tmedia_codec_t* self, const void* in_ return out_size; } -static tsk_bool_t tdav_codec_g729ab_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) -{ - tsk_params_L_t* params = tsk_null; - const char* val_str; - +static tsk_bool_t tdav_codec_g729ab_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) +{ tdav_codec_g729ab_t* g729a = (tdav_codec_g729ab_t*)codec; - if((params = tsk_params_fromstring(fmtp, ";", tsk_true))){ - if((val_str = tsk_params_get_param_value(params, "annexb"))){ - g729a->encoder.vad_enable = tsk_strequals(val_str, "yes"); + if(tsk_striequals(att_name, "fmtp")){ + tsk_params_L_t* params = tsk_null; + const char* val_str; + if((params = tsk_params_fromstring(att_value, ";", tsk_true))){ + if((val_str = tsk_params_get_param_value(params, "annexb"))){ + g729a->encoder.vad_enable = tsk_strequals(val_str, "yes"); + } + TSK_OBJECT_SAFE_FREE(params); } - - TSK_OBJECT_SAFE_FREE(params); } - return tsk_true; } -static char* tdav_codec_g729ab_fmtp_get(const tmedia_codec_t* codec) +static char* tdav_codec_g729ab_sdp_att_get(const tmedia_codec_t* codec, const char* att_name) { tdav_codec_g729ab_t* g729a = (tdav_codec_g729ab_t*)codec; - if(g729a->encoder.vad_enable){ - return tsk_strdup("annexb=yes"); - } - else{ - return tsk_strdup("annexb=no"); + if(tsk_striequals(att_name, "fmtp")){ + if(g729a->encoder.vad_enable){ + return tsk_strdup("annexb=yes"); + } + else{ + return tsk_strdup("annexb=no"); + } } + return tsk_null; } @@ -445,13 +447,13 @@ static const tmedia_codec_plugin_def_t tdav_codec_g729ab_plugin_def_s = /* video */ {0}, + tdav_codec_g729ab_set, tdav_codec_g729ab_open, tdav_codec_g729ab_close, tdav_codec_g729ab_encode, tdav_codec_g729ab_decode, - tdav_codec_g729ab_fmtp_match, - tdav_codec_g729ab_fmtp_get, - tdav_codec_g729ab_fmtp_set + tdav_codec_g729ab_sdp_att_match, + tdav_codec_g729ab_sdp_att_get }; const tmedia_codec_plugin_def_t *tdav_codec_g729ab_plugin_def_t = &tdav_codec_g729ab_plugin_def_s; diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/gsm/tdav_codec_gsm.c b/branches/2.0/doubango/tinyDAV/src/codecs/gsm/tdav_codec_gsm.c index 311e14f0..ebc805d1 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/gsm/tdav_codec_gsm.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/gsm/tdav_codec_gsm.c @@ -38,8 +38,7 @@ /* ============ GSM Plugin interface ================= */ -#define tdav_codec_gsm_fmtp_get tsk_null -#define tdav_codec_gsm_fmtp_set tsk_null +#define tdav_codec_gsm_sdp_att_get tsk_null int tdav_codec_gsm_open(tmedia_codec_t* self) { @@ -128,7 +127,7 @@ tsk_size_t tdav_codec_gsm_decode(tmedia_codec_t* self, const void* in_data, tsk_ return out_size; } -tsk_bool_t tdav_codec_gsm_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +tsk_bool_t tdav_codec_gsm_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { /* always match */ return tsk_true; } @@ -194,13 +193,13 @@ static const tmedia_codec_plugin_def_t tdav_codec_gsm_plugin_def_s = /* video */ {0}, + tsk_null, // set() tdav_codec_gsm_open, tdav_codec_gsm_close, tdav_codec_gsm_encode, tdav_codec_gsm_decode, - tdav_codec_gsm_fmtp_match, - tdav_codec_gsm_fmtp_get, - tdav_codec_gsm_fmtp_set + tdav_codec_gsm_sdp_att_match, + tdav_codec_gsm_sdp_att_get }; const tmedia_codec_plugin_def_t *tdav_codec_gsm_plugin_def_t = &tdav_codec_gsm_plugin_def_s; diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/h261/tdav_codec_h261.c b/branches/2.0/doubango/tinyDAV/src/codecs/h261/tdav_codec_h261.c index 8cea9159..480077a7 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/h261/tdav_codec_h261.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/h261/tdav_codec_h261.c @@ -337,26 +337,28 @@ tsk_size_t tdav_codec_h261_decode(tmedia_codec_t* self, const void* in_data, tsk return retsize; } -tsk_bool_t tdav_codec_h261_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +tsk_bool_t tdav_codec_h261_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { int ret; unsigned maxbr, fps, width, height; tmedia_codec_video_t* h261 = (tmedia_codec_video_t*)codec; - if(!(ret = tmedia_codec_parse_fmtp(fmtp, &maxbr, &fps, &width, &height))){ - h261->in.max_br = h261->out.max_br = maxbr * 1000; - h261->in.fps = h261->out.fps = fps; - h261->in.width = h261->out.width = width; - h261->in.height = h261->out.height = height; - return tsk_true; - } - else{ - TSK_DEBUG_WARN("Failed to match fmtp [%s]", fmtp); - return tsk_false; + if(tsk_striequals(att_value, "fmtp")){ + if(!(ret = tmedia_codec_parse_fmtp(att_value, &maxbr, &fps, &width, &height))){ + h261->in.max_br = h261->out.max_br = maxbr * 1000; + h261->in.fps = h261->out.fps = fps; + h261->in.width = h261->out.width = width; + h261->in.height = h261->out.height = height; + return tsk_true; + } + else{ + TSK_DEBUG_WARN("Failed to match fmtp [%s]", att_value); + } } + return tsk_false; } -char* tdav_codec_h261_fmtp_get(const tmedia_codec_t* self) +char* tdav_codec_h261_sdp_att_get(const tmedia_codec_t* self, const char* att_name) { #if 0 return tsk_strdup("CIF=2/MaxBR=3840;QCIF=2/MaxBR=1920"); @@ -365,12 +367,6 @@ char* tdav_codec_h261_fmtp_get(const tmedia_codec_t* self) #endif } -int tdav_codec_h261_fmtp_set(tmedia_codec_t* self, const char* fmtp) -{ - TSK_DEBUG_INFO("remote fmtp=%s", fmtp); - return 0; -} - /* constructor */ static tsk_object_t* tdav_codec_h261_ctor(tsk_object_t * self, va_list * app) { @@ -421,13 +417,13 @@ static const tmedia_codec_plugin_def_t tdav_codec_h261_plugin_def_s = /* video */ {176, 144, 15}, + tsk_null, // set() tdav_codec_h261_open, tdav_codec_h261_close, tdav_codec_h261_encode, tdav_codec_h261_decode, - tdav_codec_h261_fmtp_match, - tdav_codec_h261_fmtp_get, - tdav_codec_h261_fmtp_set + tdav_codec_h261_sdp_att_match, + tdav_codec_h261_sdp_att_get }; const tmedia_codec_plugin_def_t *tdav_codec_h261_plugin_def_t = &tdav_codec_h261_plugin_def_s; diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/h263/tdav_codec_h263.c b/branches/2.0/doubango/tinyDAV/src/codecs/h263/tdav_codec_h263.c index b240306a..357cf175 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/h263/tdav_codec_h263.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/h263/tdav_codec_h263.c @@ -38,10 +38,15 @@ #include "tnet_endianness.h" +#include "tinymedia/tmedia_params.h" + #include "tsk_time.h" #include "tsk_memory.h" #include "tsk_debug.h" +#include + +#define TDAV_H263_GOP_SIZE_IN_SECONDS 25 #define RTP_PAYLOAD_SIZE 750 #define H263P_HEADER_SIZE 2 @@ -49,13 +54,130 @@ #define H263_HEADER_MODE_B_SIZE 8 #define H263_HEADER_MODE_C_SIZE 12 +#define tdav_codec_h263p_set tdav_codec_h263_set +#define tdav_codec_h263p_open tdav_codec_h263_open +#define tdav_codec_h263p_close tdav_codec_h263_close +#define tdav_codec_h263p_encode tdav_codec_h263_encode +#define tdav_codec_h263p_sdp_att_match tdav_codec_h263_sdp_att_match +#define tdav_codec_h263p_sdp_att_get tdav_codec_h263_sdp_att_get + +#define tdav_codec_h263pp_set tdav_codec_h263_set +#define tdav_codec_h263pp_open tdav_codec_h263_open +#define tdav_codec_h263pp_close tdav_codec_h263_close +#define tdav_codec_h263pp_encode tdav_codec_h263_encode +#define tdav_codec_h263pp_decode tdav_codec_h263_decode +#define tdav_codec_h263pp_sdp_att_match tdav_codec_h263_sdp_att_match +#define tdav_codec_h263pp_sdp_att_get tdav_codec_h263_sdp_att_get + + +#define TDAV_CODEC_H263(self) ((tdav_codec_h263_t*)(self)) + +typedef enum tdav_codec_h263_type_e +{ + tdav_codec_h263_1996, + tdav_codec_h263_1998, + tdav_codec_h263_2000, +} +tdav_codec_h263_type_t; + +/** H.263-1996 codec */ +typedef struct tdav_codec_h263_s +{ + TMEDIA_DECLARE_CODEC_VIDEO; + + tdav_codec_h263_type_t type; + + struct{ + uint8_t* ptr; + tsk_size_t size; + } rtp; + + // Encoder + struct{ + AVCodec* codec; + AVCodecContext* context; + AVFrame* picture; + void* buffer; + tsk_bool_t force_idr; + int32_t quality; // [1-31] + } encoder; + + // decoder + struct{ + AVCodec* codec; + AVCodecContext* context; + AVFrame* picture; + + void* accumulator; + uint8_t ebit; + tsk_size_t accumulator_pos; + uint16_t last_seq; + } decoder; +} +tdav_codec_h263_t; + +#define TDAV_DECLARE_CODEC_H263 tdav_codec_h263_t __codec_h263__ + +int tdav_codec_h263_init(tdav_codec_h263_t* self, tdav_codec_h263_type_t type, enum CodecID encoder, enum CodecID decoder); +int tdav_codec_h263_deinit(tdav_codec_h263_t* self); + +/** H.263-1998 codec */ +typedef struct tdav_codec_h263p_s +{ + TDAV_DECLARE_CODEC_H263; +} +tdav_codec_h263p_t; + +/** H.263-2000 codec */ +typedef struct tdav_codec_h263pp_s +{ + TDAV_DECLARE_CODEC_H263; +} +tdav_codec_h263pp_t; + + static void tdav_codec_h263_rtp_callback(tdav_codec_h263_t *self, const void *data, tsk_size_t size, tsk_bool_t marker); static void tdav_codec_h263p_rtp_callback(tdav_codec_h263_t *self, const void *data, tsk_size_t size, tsk_bool_t frag, tsk_bool_t marker); static void tdav_codec_h263_encap(const tdav_codec_h263_t* h263, const uint8_t* pdata, tsk_size_t size); + /* ============ Common To all H263 codecs ================= */ +static int tdav_codec_h263_set(tmedia_codec_t* self, const tmedia_param_t* param) +{ + tdav_codec_h263_t* h263 = (tdav_codec_h263_t*)self; + if(!self->opened){ + TSK_DEBUG_ERROR("Codec not opened"); + return -1; + } + if(param->value_type == tmedia_pvt_int32){ + if(tsk_striequals(param->key, "action")){ + tmedia_codec_action_t action = (tmedia_codec_action_t)TSK_TO_INT32((uint8_t*)param->value); + switch(action){ + case tmedia_codec_action_encode_idr: + { + h263->encoder.force_idr = tsk_true; + break; + } + case tmedia_codec_action_bw_down: + { + h263->encoder.quality = TSK_CLAMP(1, (h263->encoder.quality + 1), 31); + h263->encoder.context->global_quality = FF_QP2LAMBDA * h263->encoder.quality; + break; + } + case tmedia_codec_action_bw_up: + { + h263->encoder.quality = TSK_CLAMP(1, (h263->encoder.quality - 1), 31); + h263->encoder.context->global_quality = FF_QP2LAMBDA * h263->encoder.quality; + break; + } + } + } + } + return 0; +} + int tdav_codec_h263_init(tdav_codec_h263_t* self, tdav_codec_h263_type_t type, enum CodecID encoder, enum CodecID decoder) { int ret = 0; @@ -66,6 +188,7 @@ int tdav_codec_h263_init(tdav_codec_h263_t* self, tdav_codec_h263_type_t type, e } self->type = type; + self->encoder.quality = 1; if(!(self->encoder.codec = avcodec_find_encoder(encoder))){ TSK_DEBUG_ERROR("Failed to find [%d]encoder", encoder); @@ -134,16 +257,17 @@ static int tdav_codec_h263_open(tmedia_codec_t* self) h263->encoder.context->width = TMEDIA_CODEC_VIDEO(h263)->out.width; h263->encoder.context->height = TMEDIA_CODEC_VIDEO(h263)->out.height; - /*h263->encoder.context->mb_qmin =*/ h263->encoder.context->qmin = 4; - /*h263->encoder.context->mb_qmax =*/ h263->encoder.context->qmax = 31; + h263->encoder.context->mb_qmin = h263->encoder.context->qmin = 10; + h263->encoder.context->mb_qmax = h263->encoder.context->qmax = 51; h263->encoder.context->mb_decision = FF_MB_DECISION_RD; - - h263->encoder.context->thread_count = 1; + + h263->encoder.context->bit_rate = ((TMEDIA_CODEC_VIDEO(h263)->out.width * TMEDIA_CODEC_VIDEO(h263)->out.height * 128 / 320 / 240) * 1000); + h263->encoder.context->rc_lookahead = 0; h263->encoder.context->rtp_payload_size = RTP_PAYLOAD_SIZE; h263->encoder.context->opaque = tsk_null; - h263->encoder.context->gop_size = TMEDIA_CODEC_VIDEO(h263)->out.fps*2; /* each 2 seconds */ + h263->encoder.context->gop_size = (TMEDIA_CODEC_VIDEO(h263)->out.fps * TDAV_H263_GOP_SIZE_IN_SECONDS); h263->encoder.context->flags |= CODEC_FLAG_QSCALE; - h263->encoder.context->global_quality = FF_QP2LAMBDA * tmedia_get_video_qscale(self->bl); + h263->encoder.context->global_quality = FF_QP2LAMBDA * h263->encoder.quality; h263->encoder.context->max_b_frames = 0; // Picture (YUV 420) @@ -294,6 +418,13 @@ static tsk_size_t tdav_codec_h263_encode(tmedia_codec_t* self, const void* in_da return 0; } + if(h263->encoder.force_idr){ + h263->encoder.picture->pict_type = FF_I_TYPE; + h263->encoder.force_idr = tsk_false; + } + else{ + h263->encoder.picture->pict_type = 0;// reset + } h263->encoder.picture->pts = AV_NOPTS_VALUE; h263->encoder.picture->quality = h263->encoder.context->global_quality; ret = avcodec_encode_video(h263->encoder.context, h263->encoder.buffer, size, h263->encoder.picture); @@ -435,10 +566,15 @@ static tsk_size_t tdav_codec_h263_decode(tmedia_codec_t* self, const void* in_da packet.data = h263->decoder.accumulator; ret = avcodec_decode_video2(h263->decoder.context, h263->decoder.picture, &got_picture_ptr, &packet); - if(ret <0 || !got_picture_ptr){ - TSK_DEBUG_WARN("Failed to decode the buffer"); + if(ret < 0){ + TSK_DEBUG_WARN("Failed to decode the buffer with error code = %d", ret); + if(TMEDIA_CODEC_VIDEO(self)->in.callback){ + TMEDIA_CODEC_VIDEO(self)->in.result.type = tmedia_video_decode_result_type_error; + TMEDIA_CODEC_VIDEO(self)->in.result.proto_hdr = proto_hdr; + TMEDIA_CODEC_VIDEO(self)->in.callback(&TMEDIA_CODEC_VIDEO(self)->in.result); + } } - else{ + else if(got_picture_ptr){ retsize = xsize; TMEDIA_CODEC_VIDEO(h263)->in.width = h263->decoder.context->width; TMEDIA_CODEC_VIDEO(h263)->in.height = h263->decoder.context->height; @@ -453,73 +589,51 @@ static tsk_size_t tdav_codec_h263_decode(tmedia_codec_t* self, const void* in_da return retsize; } -static tsk_bool_t tdav_codec_h263_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +static tsk_bool_t tdav_codec_h263_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { - tsk_bool_t ret = tsk_false; - tmedia_codec_video_t* h263 = (tmedia_codec_video_t*)codec; - tsk_params_L_t* params = tsk_null; - - if((params = tsk_params_fromstring(fmtp, ";", tsk_true))){ - switch(codec->bl){ - case tmedia_bl_low: - default: - if(tsk_params_have_param(params, "QCIF")){ - h263->in.width = h263->out.width = 176; h263->in.height = h263->out.height = 144; - ret = tsk_true; - } - else if(tsk_params_have_param(params, "SQCIF")){ - h263->in.width = h263->out.width = 128; h263->in.height = h263->out.height = 96; - ret = tsk_true; - } - break; - - case tmedia_bl_medium: - case tmedia_bl_hight: - case tmedia_bl_unrestricted: - if(tsk_params_have_param(params, "CIF")){ - h263->in.width = h263->out.width = 352; h263->in.height = h263->out.height = 288; - ret = tsk_true; - } - else if(tsk_params_have_param(params, "QCIF")){ - h263->in.width = h263->out.width = 176; h263->in.height = h263->out.height = 144; - ret = tsk_true; - } - else if(tsk_params_have_param(params, "SQCIF")){ - h263->in.width = h263->out.width = 128; h263->in.height = h263->out.height = 96; - ret = tsk_true; - } - else { // Default: to be fixed - h263->in.width = h263->out.width = 352; h263->in.height = h263->out.height = 288; - ret = tsk_true; - } - - break; + if(tsk_striequals(att_name, "fmtp")){ + unsigned width, height, fps; + if(tmedia_parse_video_fmtp(att_value, TMEDIA_CODEC_VIDEO(codec)->pref_size, &width, &height, &fps)){ + TSK_DEBUG_ERROR("Failed to match fmtp=%s", att_value); + return tsk_false; } + TMEDIA_CODEC_VIDEO(codec)->in.width = TMEDIA_CODEC_VIDEO(codec)->out.width = width; + TMEDIA_CODEC_VIDEO(codec)->in.height = TMEDIA_CODEC_VIDEO(codec)->out.height = height; + TMEDIA_CODEC_VIDEO(codec)->in.fps = TMEDIA_CODEC_VIDEO(codec)->out.fps = fps; } - TSK_OBJECT_SAFE_FREE(params); - - return ret; +#if 0 + else if(tsk_striequals(att_name, "imageattr")){ + unsigned in_width, in_height, out_width, out_height; + if(tmedia_parse_video_imageattr(att_value, TMEDIA_CODEC_VIDEO(codec)->pref_size, &in_width, &in_height, &out_width, &out_height) != 0){ + return tsk_false; + } + TMEDIA_CODEC_VIDEO(codec)->in.width = in_width; + TMEDIA_CODEC_VIDEO(codec)->in.height = in_height; + TMEDIA_CODEC_VIDEO(codec)->out.width = out_width; + TMEDIA_CODEC_VIDEO(codec)->out.height = out_height; + } +#endif + + return tsk_true; } -static char* tdav_codec_h263_fmtp_get(const tmedia_codec_t* self) +static char* tdav_codec_h263_sdp_att_get(const tmedia_codec_t* codec, const char* att_name) { - switch(self->bl){ - case tmedia_bl_low: - default: - return tsk_strdup("QCIF=2;SQCIF=2"); - break; - case tmedia_bl_medium: - case tmedia_bl_hight: - case tmedia_bl_unrestricted: - return tsk_strdup("CIF=2;QCIF=2;SQCIF=2"); - break; + if(tsk_striequals(att_name, "fmtp")){ + tmedia_pref_video_size_t cif_vs; + if(tmedia_video_get_closest_cif_size(TMEDIA_CODEC_VIDEO(codec)->pref_size, &cif_vs)){ + TSK_DEBUG_ERROR("Failed to get closest CIF family size"); + return tsk_null; + } + return tmedia_get_video_fmtp(cif_vs); } -} - -static int tdav_codec_h263_fmtp_set(tmedia_codec_t* self, const char* fmtp) -{ - TSK_DEBUG_INFO("remote fmtp=%s", fmtp); - return 0; +#if 0 + else if(tsk_striequals(att_name, "imageattr")){ + return tmedia_get_video_imageattr(TMEDIA_CODEC_VIDEO(codec)->pref_size, + TMEDIA_CODEC_VIDEO(codec)->in.width, TMEDIA_CODEC_VIDEO(codec)->in.height, TMEDIA_CODEC_VIDEO(codec)->out.width, TMEDIA_CODEC_VIDEO(codec)->out.height); + } +#endif + return tsk_null; } /* constructor */ @@ -573,13 +687,13 @@ static const tmedia_codec_plugin_def_t tdav_codec_h263_plugin_def_s = /* video */ {176, 144, 15}, + tdav_codec_h263_set, tdav_codec_h263_open, tdav_codec_h263_close, tdav_codec_h263_encode, tdav_codec_h263_decode, - tdav_codec_h263_fmtp_match, - tdav_codec_h263_fmtp_get, - tdav_codec_h263_fmtp_set + tdav_codec_h263_sdp_att_match, + tdav_codec_h263_sdp_att_get }; const tmedia_codec_plugin_def_t *tdav_codec_h263_plugin_def_t = &tdav_codec_h263_plugin_def_s; @@ -611,21 +725,6 @@ const tmedia_codec_plugin_def_t *tdav_codec_h263_plugin_def_t = &tdav_codec_h263 // H.263-1998 object definition // -static int tdav_codec_h263p_open(tmedia_codec_t* self) -{ - return tdav_codec_h263_open(self); -} - -static int tdav_codec_h263p_close(tmedia_codec_t* self) -{ - return tdav_codec_h263_close(self); -} - -static tsk_size_t tdav_codec_h263p_encode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size) -{ - return tdav_codec_h263_encode(self, in_data, in_size, out_data, out_max_size); -} - static tsk_size_t tdav_codec_h263p_decode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size, const tsk_object_t* proto_hdr) { uint8_t P, V, PLEN, PEBIT; @@ -762,22 +861,6 @@ static tsk_size_t tdav_codec_h263p_decode(tmedia_codec_t* self, const void* in_d return retsize; } -tsk_bool_t tdav_codec_h263p_fmtp_match(const tmedia_codec_t* self, const char* fmtp) -{ - return tdav_codec_h263_fmtp_match(self, fmtp); -} - -char* tdav_codec_h263p_fmtp_get(const tmedia_codec_t* self) -{ - return tdav_codec_h263_fmtp_get(self); -} - -int tdav_codec_h263p_fmtp_set(tmedia_codec_t* self, const char* fmtp) -{ - TSK_DEBUG_INFO("remote fmtp=%s", fmtp); - return 0; -} - /* constructor */ static tsk_object_t* tdav_codec_h263p_ctor(tsk_object_t * self, va_list * app) { @@ -828,13 +911,13 @@ static const tmedia_codec_plugin_def_t tdav_codec_h263p_plugin_def_s = /* video */ {176, 144, 15}, + tdav_codec_h263p_set, tdav_codec_h263p_open, tdav_codec_h263p_close, tdav_codec_h263p_encode, tdav_codec_h263p_decode, - tdav_codec_h263p_fmtp_match, - tdav_codec_h263p_fmtp_get, - tdav_codec_h263p_fmtp_set + tdav_codec_h263p_sdp_att_match, + tdav_codec_h263p_sdp_att_get }; const tmedia_codec_plugin_def_t *tdav_codec_h263p_plugin_def_t = &tdav_codec_h263p_plugin_def_s; @@ -857,42 +940,6 @@ const tmedia_codec_plugin_def_t *tdav_codec_h263p_plugin_def_t = &tdav_codec_h26 // H.263-2000 object definition // -int tdav_codec_h263pp_open(tmedia_codec_t* self) -{ - return tdav_codec_h263_open(self); -} - -int tdav_codec_h263pp_close(tmedia_codec_t* self) -{ - return tdav_codec_h263_close(self); -} - -tsk_size_t tdav_codec_h263pp_encode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size) -{ - return tdav_codec_h263_encode(self, in_data, in_size, out_data, out_max_size); -} - -tsk_size_t tdav_codec_h263pp_decode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size, const tsk_object_t* proto_hdr) -{ - return tdav_codec_h263p_decode(self, in_data, in_size, out_data, out_max_size, proto_hdr); -} - -tsk_bool_t tdav_codec_h263pp_fmtp_match(const tmedia_codec_t* self, const char* fmtp) -{ - return tdav_codec_h263_fmtp_match(self, fmtp); -} - -char* tdav_codec_h263pp_fmtp_get(const tmedia_codec_t* self) -{ - return tdav_codec_h263_fmtp_get(self); -} - -int tdav_codec_h263pp_fmtp_set(tmedia_codec_t* self, const char* fmtp) -{ - TSK_DEBUG_INFO("remote fmtp=%s", fmtp); - return 0; -} - /* constructor */ static tsk_object_t* tdav_codec_h263pp_ctor(tsk_object_t * self, va_list * app) { @@ -943,13 +990,13 @@ static const tmedia_codec_plugin_def_t tdav_codec_h263pp_plugin_def_s = /* video */ {176, 144, 15}, + tdav_codec_h263pp_set, tdav_codec_h263pp_open, tdav_codec_h263pp_close, tdav_codec_h263pp_encode, tdav_codec_h263pp_decode, - tdav_codec_h263pp_fmtp_match, - tdav_codec_h263pp_fmtp_get, - tdav_codec_h263pp_fmtp_set + tdav_codec_h263pp_sdp_att_match, + tdav_codec_h263pp_sdp_att_get }; const tmedia_codec_plugin_def_t *tdav_codec_h263pp_plugin_def_t = &tdav_codec_h263pp_plugin_def_s; @@ -1068,8 +1115,12 @@ static void tdav_codec_h263_rtp_callback(tdav_codec_h263_t *self, const void *da } // Send data over the network - if(TMEDIA_CODEC_VIDEO(self)->callback){ - TMEDIA_CODEC_VIDEO(self)->callback(TMEDIA_CODEC_VIDEO(self)->callback_data, self->rtp.ptr, (size + H263_HEADER_MODE_A_SIZE), (3003* (30/TMEDIA_CODEC_VIDEO(self)->out.fps)), marker); + if(TMEDIA_CODEC_VIDEO(self)->out.callback){ + TMEDIA_CODEC_VIDEO(self)->out.result.buffer.ptr = self->rtp.ptr; + TMEDIA_CODEC_VIDEO(self)->out.result.buffer.size = (size + H263_HEADER_MODE_A_SIZE); + TMEDIA_CODEC_VIDEO(self)->out.result.duration = (3003* (30/TMEDIA_CODEC_VIDEO(self)->out.fps)); + TMEDIA_CODEC_VIDEO(self)->out.result.last_chunck = marker; + TMEDIA_CODEC_VIDEO(self)->out.callback(&TMEDIA_CODEC_VIDEO(self)->out.result); } } @@ -1209,8 +1260,12 @@ static void tdav_codec_h263p_rtp_callback(tdav_codec_h263_t *self, const void *d // Send data over the network - if(TMEDIA_CODEC_VIDEO(self)->callback){ - TMEDIA_CODEC_VIDEO(self)->callback(TMEDIA_CODEC_VIDEO(self)->callback_data, _ptr, _size, (3003* (30/TMEDIA_CODEC_VIDEO(self)->out.fps)), marker); + if(TMEDIA_CODEC_VIDEO(self)->out.callback){ + TMEDIA_CODEC_VIDEO(self)->out.result.buffer.ptr = _ptr; + TMEDIA_CODEC_VIDEO(self)->out.result.buffer.size = _size; + TMEDIA_CODEC_VIDEO(self)->out.result.duration = (3003* (30/TMEDIA_CODEC_VIDEO(self)->out.fps)); + TMEDIA_CODEC_VIDEO(self)->out.result.last_chunck = marker; + TMEDIA_CODEC_VIDEO(self)->out.callback(&TMEDIA_CODEC_VIDEO(self)->out.result); } } diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/h264/tdav_codec_h264.c b/branches/2.0/doubango/tinyDAV/src/codecs/h264/tdav_codec_h264.c index ef596bb7..3996886b 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/h264/tdav_codec_h264.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/h264/tdav_codec_h264.c @@ -37,18 +37,86 @@ #include "tinyrtp/rtp/trtp_rtp_packet.h" +#include "tinymedia/tmedia_params.h" + #include "tsk_params.h" #include "tsk_memory.h" #include "tsk_debug.h" -static int tdav_codec_h264_init(tdav_codec_h264_t* self, tdav_codec_h264_profile_t profile); +#include + +typedef struct tdav_codec_h264_s +{ + TDAV_DECLARE_CODEC_H264_COMMON; + + // Encoder + struct{ + AVCodec* codec; + AVCodecContext* context; + AVFrame* picture; + void* buffer; + int64_t frame_count; + tsk_bool_t force_idr; + int32_t quality; // [1-31] + } encoder; + + // decoder + struct{ + AVCodec* codec; + AVCodecContext* context; + AVFrame* picture; + + void* accumulator; + tsk_size_t accumulator_pos; + tsk_size_t accumulator_size; + uint16_t last_seq; + } decoder; +} +tdav_codec_h264_t; + +#define TDAV_H264_GOP_SIZE_IN_SECONDS 25 + +static int tdav_codec_h264_init(tdav_codec_h264_t* self, profile_idc_t profile); static int tdav_codec_h264_deinit(tdav_codec_h264_t* self); static void tdav_codec_h264_encap(const tdav_codec_h264_t* h264, const uint8_t* pdata, tsk_size_t size); -/* ============ H.264 Base Profile X.X Plugin interface functions ================= */ +/* ============ H.264 Base/Main Profile X.X Plugin interface functions ================= */ + +static int tdav_codec_h264_set(tmedia_codec_t* self, const tmedia_param_t* param) +{ + tdav_codec_h264_t* h264 = (tdav_codec_h264_t*)self; + if(!self->opened){ + TSK_DEBUG_ERROR("Codec not opened"); + return -1; + } + if(param->value_type == tmedia_pvt_int32){ + if(tsk_striequals(param->key, "action")){ + tmedia_codec_action_t action = (tmedia_codec_action_t)TSK_TO_INT32((uint8_t*)param->value); + switch(action){ + case tmedia_codec_action_encode_idr: + { + h264->encoder.force_idr = tsk_true; + break; + } + case tmedia_codec_action_bw_down: + { + h264->encoder.quality = TSK_CLAMP(1, (h264->encoder.quality + 1), 31); + h264->encoder.context->global_quality = FF_QP2LAMBDA * h264->encoder.quality; + break; + } + case tmedia_codec_action_bw_up: + { + h264->encoder.quality = TSK_CLAMP(1, (h264->encoder.quality - 1), 31); + h264->encoder.context->global_quality = FF_QP2LAMBDA * h264->encoder.quality; + break; + } + } + } + } + return 0; +} -#define tdav_codec_h264_fmtp_set tsk_null /* FIXME: should be removed from all plugins (useless) */ static int tdav_codec_h264_open(tmedia_codec_t* self) { @@ -82,17 +150,17 @@ static int tdav_codec_h264_open(tmedia_codec_t* self) h264->encoder.context->width = TMEDIA_CODEC_VIDEO(h264)->out.width; h264->encoder.context->height = TMEDIA_CODEC_VIDEO(h264)->out.height; + h264->encoder.context->bit_rate = ((TMEDIA_CODEC_VIDEO(h264)->out.width * TMEDIA_CODEC_VIDEO(h264)->out.height * 128 / 320 / 240) * 1000); h264->encoder.context->rc_lookahead = 0; - - //h264->encoder.context->refs = 1; - h264->encoder.context->scenechange_threshold = 0; + h264->encoder.context->global_quality = FF_QP2LAMBDA * h264->encoder.quality; + + h264->encoder.context->scenechange_threshold = 0; h264->encoder.context->me_subpel_quality = 0; h264->encoder.context->partitions = X264_PART_I4X4 | X264_PART_I8X8 | X264_PART_P8X8 | X264_PART_B8X8; h264->encoder.context->me_method = ME_EPZS; h264->encoder.context->trellis = 0; h264->encoder.context->me_range = 16; - h264->encoder.context->max_qdiff = 4; h264->encoder.context->mb_qmin = h264->encoder.context->qmin = 10; h264->encoder.context->mb_qmax = h264->encoder.context->qmax = 51; h264->encoder.context->qcompress = 0.6f; @@ -109,28 +177,21 @@ static int tdav_codec_h264_open(tmedia_codec_t* self) h264->encoder.context->chromaoffset = 0; switch(TDAV_CODEC_H264_COMMON(h264)->profile){ - case tdav_codec_h264_bp10: + case profile_idc_baseline: default: h264->encoder.context->profile = FF_PROFILE_H264_BASELINE; - h264->encoder.context->level = 10; + h264->encoder.context->level = TDAV_CODEC_H264_COMMON(h264)->level; break; - case tdav_codec_h264_bp20: - h264->encoder.context->profile = FF_PROFILE_H264_BASELINE; - h264->encoder.context->level = 20; - break; - case tdav_codec_h264_bp30: - h264->encoder.context->profile = FF_PROFILE_H264_BASELINE; - h264->encoder.context->level = 30; + case profile_idc_main: + h264->encoder.context->profile = FF_PROFILE_H264_MAIN; + h264->encoder.context->level = TDAV_CODEC_H264_COMMON(h264)->level; break; } - - h264->encoder.context->crf = 22; - //h264->encoder.context->cqp = 22; - h264->encoder.context->thread_count = 0; + h264->encoder.context->rtp_payload_size = H264_RTP_PAYLOAD_SIZE; h264->encoder.context->opaque = tsk_null; - h264->encoder.context->gop_size = TMEDIA_CODEC_VIDEO(h264)->out.fps * 2; // Each 2 second(s) - + h264->encoder.context->gop_size = (TMEDIA_CODEC_VIDEO(h264)->out.fps * TDAV_H264_GOP_SIZE_IN_SECONDS); + // Picture (YUV 420) if(!(h264->encoder.picture = avcodec_alloc_frame())){ @@ -255,24 +316,26 @@ static tsk_size_t tdav_codec_h264_encode(tmedia_codec_t* self, const void* in_da // send keyframe for: // - the first frame + // - remote peer requested an IDR // - every second within the first 4seconds // - every 5 seconds after the first 4seconds - if(h264->encoder.frame_count++ == 0 - || - ( (h264->encoder.frame_count < (int)TMEDIA_CODEC_VIDEO(h264)->out.fps * 4) && ((h264->encoder.frame_count % TMEDIA_CODEC_VIDEO(h264)->out.fps)==0) ) - || - ( (h264->encoder.frame_count % (TMEDIA_CODEC_VIDEO(h264)->out.fps * 5))==0 ) + if(h264->encoder.frame_count++ == 0 + || h264 ->encoder.force_idr + || ( (h264->encoder.frame_count < (int)TMEDIA_CODEC_VIDEO(h264)->out.fps * 4) && ((h264->encoder.frame_count % TMEDIA_CODEC_VIDEO(h264)->out.fps)==0) ) + || ( (h264->encoder.frame_count % (TMEDIA_CODEC_VIDEO(h264)->out.fps * 5))==0 ) ) { // You must patch FFmpeg to switch from X264_TYPE_AUTO to X264_TYPE_IDR or use r26402+ h264->encoder.picture->pict_type = FF_I_TYPE; tdav_codec_h264_encap(h264, h264->encoder.context->extradata, (tsk_size_t)h264->encoder.context->extradata_size); + h264 ->encoder.force_idr = tsk_false; } else{ // Encode data - //h264->encoder.picture->pts = AV_NOPTS_VALUE; - h264->encoder.picture->pts = h264->encoder.frame_count; + h264->encoder.picture->pts = AV_NOPTS_VALUE; + h264->encoder.picture->quality = h264->encoder.context->global_quality; + // h264->encoder.picture->pts = h264->encoder.frame_count; MUST NOT ret = avcodec_encode_video(h264->encoder.context, h264->encoder.buffer, size, h264->encoder.picture); if(ret >0){ tdav_codec_h264_encap(h264, h264->encoder.buffer, (tsk_size_t)ret); @@ -305,13 +368,8 @@ static tsk_size_t tdav_codec_h264_decode(tmedia_codec_t* self, const void* in_da //TSK_DEBUG_INFO("SeqNo=%hu", rtp_hdr->seq_num); /* Packet lost? */ - if(h264->decoder.last_seq != (rtp_hdr->seq_num - 1) && h264->decoder.last_seq){ - if(h264->decoder.last_seq == rtp_hdr->seq_num){ - // Could happen on some stupid emulators - TSK_DEBUG_INFO("Packet duplicated, seq_num=%d", rtp_hdr->seq_num); - return 0; - } - TSK_DEBUG_INFO("Packet lost, seq_num=%d", rtp_hdr->seq_num); + if((h264->decoder.last_seq + 1) != rtp_hdr->seq_num && h264->decoder.last_seq){ + TSK_DEBUG_INFO("Packet lost, seq_num=%d", (h264->decoder.last_seq + 1)); } h264->decoder.last_seq = rtp_hdr->seq_num; @@ -384,7 +442,12 @@ static tsk_size_t tdav_codec_h264_decode(tmedia_codec_t* self, const void* in_da ret = avcodec_decode_video2(h264->decoder.context, h264->decoder.picture, &got_picture_ptr, &packet); if(ret <0){ - TSK_DEBUG_ERROR("=============Failed to decode the buffer"); + TSK_DEBUG_ERROR("Failed to decode the buffer with error code =%d", ret); + if(TMEDIA_CODEC_VIDEO(self)->in.callback){ + TMEDIA_CODEC_VIDEO(self)->in.result.type = tmedia_video_decode_result_type_error; + TMEDIA_CODEC_VIDEO(self)->in.result.proto_hdr = proto_hdr; + TMEDIA_CODEC_VIDEO(self)->in.callback(&TMEDIA_CODEC_VIDEO(self)->in.result); + } } else if(got_picture_ptr){ tsk_size_t xsize; @@ -412,145 +475,144 @@ static tsk_size_t tdav_codec_h264_decode(tmedia_codec_t* self, const void* in_da return retsize; } -static tsk_bool_t tdav_codec_h264_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +static tsk_bool_t tdav_codec_h264_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { tdav_codec_h264_t* h264 = (tdav_codec_h264_t*)codec; - tsk_params_L_t* params = tsk_null; - int val_int, sx = -1, sy = -1; - const char* val_str; tsk_bool_t ret = tsk_true; - tdav_codec_h264_profile_t profile; if(!h264){ TSK_DEBUG_ERROR("Invalid parameter"); return tsk_false; } - TSK_DEBUG_INFO("Trying to match [%s]", fmtp); + TSK_DEBUG_INFO("Trying to match [%s:%s]", att_name, att_value); - /* Check whether the profile match (If the profile is missing, then we consider that it's ok) */ - if(((profile = tdav_codec_h264_common_get_profile(fmtp)) != tdav_codec_h264_bp99) && (profile != TDAV_CODEC_H264_COMMON(h264)->profile)){ - TSK_DEBUG_INFO("Profile not matching"); - return tsk_false; - } + if(tsk_striequals(att_name, "fmtp")){ + int val_int; + profile_idc_t profile; + level_idc_t level; + tsk_params_L_t* params; - /* e.g. profile-level-id=42e00a; packetization-mode=1; max-br=452; max-mbps=11880 */ - if((params = tsk_params_fromstring(fmtp, ";", tsk_true))){ - - /* === max-br ===*/ - if((val_int = tsk_params_get_param_value_as_int(params, "max-br")) != -1){ - // should compare "max-br"? - TMEDIA_CODEC_VIDEO(h264)->out.max_br = val_int*1000; + /* Check whether the profile match (If the profile is missing, then we consider that it's ok) */ + if(tdav_codec_h264_get_profile_and_level(att_value, &profile, &level) != 0){ + TSK_DEBUG_ERROR("Not valid profile-level: %s", att_value); + return tsk_false; } - - /* === max-mbps ===*/ - if((val_int = tsk_params_get_param_value_as_int(params, "max-mbps")) != -1){ - // should compare "max-mbps"? - TMEDIA_CODEC_VIDEO(h264)->out.max_mbps = val_int*1000; + if(TDAV_CODEC_H264_COMMON(codec)->profile != profile){ + return tsk_false; } - - /* === packetization-mode ===*/ - if((val_int = tsk_params_get_param_value_as_int(params, "packetization-mode")) != -1){ - if((packetization_mode_t)val_int == Single_NAL_Unit_Mode || (packetization_mode_t)val_int == Non_Interleaved_Mode){ - TDAV_CODEC_H264_COMMON(h264)->pack_mode = (packetization_mode_t)val_int; - } - else{ - TSK_DEBUG_INFO("packetization-mode not matching"); - ret = tsk_false; - goto bail; + else{ + if(TDAV_CODEC_H264_COMMON(codec)->level != level){ + unsigned width, height; + TDAV_CODEC_H264_COMMON(codec)->level = TSK_MIN(TDAV_CODEC_H264_COMMON(codec)->level, level); + if(tdav_codec_h264_common_size_from_level(TDAV_CODEC_H264_COMMON(codec)->level, &width, &height) != 0){ + return tsk_false; + } + TMEDIA_CODEC_VIDEO(codec)->in.width = TMEDIA_CODEC_VIDEO(codec)->out.width = width; + TMEDIA_CODEC_VIDEO(codec)->in.height = TMEDIA_CODEC_VIDEO(codec)->out.height = height; } } - /* === sx and sy used by doubango clients ===*/ - sx = tsk_params_get_param_value_as_int(params, "sx"); - sy = tsk_params_get_param_value_as_int(params, "sy"); - - /* === profile-level-id ===*/ - if((val_str = tsk_params_get_param_value(params, "profile-level-id"))){ - level_idc_t l_idc; - int std_w, std_h; - /* profile-idc and level-idc already tested by tdav_codec_h264_get_profile() */ - tdav_codec_h264_parse_profile(val_str, tsk_null, tsk_null, &l_idc); - switch(l_idc){ - case level_idc_1_0: - case level_idc_1_b: - case level_idc_1_1: - std_w = 176, std_h = 144; - break; - default: - std_w = 352, std_h = 288; - break; - } + /* e.g. profile-level-id=42e00a; packetization-mode=1; max-br=452; max-mbps=11880 */ + if((params = tsk_params_fromstring(att_value, ";", tsk_true))){ - //set it high to avoid overflow on the accumulator (codec::open) - // will be update with codec::context after first successful decode - TMEDIA_CODEC_VIDEO(h264)->in.width = std_w, TMEDIA_CODEC_VIDEO(h264)->in.height = std_h; - if(sx > 0 && sy > 0){ - //while((sx > std_w && sy > std_h) || (sx > std_h && sy > std_w)){ - // sx >>= 1; - // sy >>= 1; - //} - TMEDIA_CODEC_VIDEO(h264)->out.width = sx&(~1), TMEDIA_CODEC_VIDEO(h264)->out.height = sy&(~1); + /* === max-br ===*/ + if((val_int = tsk_params_get_param_value_as_int(params, "max-br")) != -1){ + // should compare "max-br"? + TMEDIA_CODEC_VIDEO(h264)->out.max_br = val_int*1000; } - else{ - TMEDIA_CODEC_VIDEO(h264)->out.width = std_w, TMEDIA_CODEC_VIDEO(h264)->out.height = std_h; + + /* === max-mbps ===*/ + if((val_int = tsk_params_get_param_value_as_int(params, "max-mbps")) != -1){ + // should compare "max-mbps"? + TMEDIA_CODEC_VIDEO(h264)->out.max_mbps = val_int*1000; + } + + /* === packetization-mode ===*/ + if((val_int = tsk_params_get_param_value_as_int(params, "packetization-mode")) != -1){ + if((packetization_mode_t)val_int == Single_NAL_Unit_Mode || (packetization_mode_t)val_int == Non_Interleaved_Mode){ + TDAV_CODEC_H264_COMMON(h264)->pack_mode = (packetization_mode_t)val_int; + } + else{ + TSK_DEBUG_INFO("packetization-mode not matching"); + ret = tsk_false; + goto bail; + } } } +bail: + TSK_OBJECT_SAFE_FREE(params); + } + else if(tsk_striequals(att_name, "imageattr")){ + unsigned in_width, in_height, out_width, out_height; + unsigned width, height; + tsk_size_t s; + if(tmedia_parse_video_imageattr(att_value, TMEDIA_CODEC_VIDEO(codec)->pref_size, &in_width, &in_height, &out_width, &out_height) != 0){ + return tsk_false; + } + // check that 'imageattr' is comform to H.264 'profile-level' + if(tdav_codec_h264_common_size_from_level(TDAV_CODEC_H264_COMMON(codec)->level, &width, &height) != 0){ + return tsk_false; + } + if((s = ((width * height * 3) >> 1)) < ((in_width * in_height * 3) >> 1) || s < ((out_width * out_height * 3) >> 1)){ + return tsk_false; + } + + TMEDIA_CODEC_VIDEO(codec)->in.width = in_width; + TMEDIA_CODEC_VIDEO(codec)->in.height = in_height; + TMEDIA_CODEC_VIDEO(codec)->out.width = out_width; + TMEDIA_CODEC_VIDEO(codec)->out.height = out_height; } -bail: - TSK_OBJECT_SAFE_FREE(params); return ret; } -static char* tdav_codec_h264_fmtp_get(const tmedia_codec_t* self) +static char* tdav_codec_h264_sdp_att_get(const tmedia_codec_t* self, const char* att_name) { tdav_codec_h264_t* h264 = (tdav_codec_h264_t*)self; - char* fmtp = tsk_null; - - if(!h264){ + + if(!h264 || !att_name){ TSK_DEBUG_ERROR("Invalid parameter"); return tsk_null; } - switch(TDAV_CODEC_H264_COMMON(h264)->profile){ - case tdav_codec_h264_bp10: - fmtp = tsk_strdup("profile-level-id=42e00a"); - break; - case tdav_codec_h264_bp20: - fmtp = tsk_strdup("profile-level-id=42e014"); - break; - case tdav_codec_h264_bp30: - fmtp = tsk_strdup("profile-level-id=42e01e"); - break; + if(tsk_striequals(att_name, "fmtp")){ + char* fmtp = tsk_null; +#if 1 + tsk_sprintf(&fmtp, "profile-level-id=%x; packetization-mode=%d", ((TDAV_CODEC_H264_COMMON(h264)->profile << 16) | TDAV_CODEC_H264_COMMON(h264)->level), TDAV_CODEC_H264_COMMON(h264)->pack_mode); +#else + tsk_strcat_2(&fmtp, "profile-level-id=%s; packetization-mode=%d; max-br=%d; max-mbps=%d", + profile_level, TDAV_CODEC_H264_COMMON(h264)->pack_mode, TMEDIA_CODEC_VIDEO(h264)->in.max_br/1000, TMEDIA_CODEC_VIDEO(h264)->in.max_mbps/1000); +#endif + return fmtp; } - - if(fmtp){ - tsk_strcat_2(&fmtp, "; packetization-mode=%d; max-br=%d; max-mbps=%d", - TDAV_CODEC_H264_COMMON(h264)->pack_mode, TMEDIA_CODEC_VIDEO(h264)->in.max_br/1000, TMEDIA_CODEC_VIDEO(h264)->in.max_mbps/1000); + else if(tsk_striequals(att_name, "imageattr")){ + return tmedia_get_video_imageattr(TMEDIA_CODEC_VIDEO(self)->pref_size, + TMEDIA_CODEC_VIDEO(self)->in.width, TMEDIA_CODEC_VIDEO(self)->in.height, TMEDIA_CODEC_VIDEO(self)->out.width, TMEDIA_CODEC_VIDEO(self)->out.height); } - - return fmtp; + return tsk_null; } -/* ============ H.264 Base Profile 1.0 Plugin interface ================= */ +/* ============ H.264 Base Profile Plugin interface ================= */ /* constructor */ -static tsk_object_t* tdav_codec_h264_bp10_ctor(tsk_object_t * self, va_list * app) +static tsk_object_t* tdav_codec_h264_base_ctor(tsk_object_t * self, va_list * app) { tdav_codec_h264_t *h264 = self; if(h264){ /* init base: called by tmedia_codec_create() */ /* init self */ - tdav_codec_h264_init(h264, tdav_codec_h264_bp10); + if(tdav_codec_h264_init(h264, profile_idc_baseline) != 0){ + return tsk_null; + } } return self; } /* destructor */ -static tsk_object_t* tdav_codec_h264_bp10_dtor(tsk_object_t * self) +static tsk_object_t* tdav_codec_h264_base_dtor(tsk_object_t * self) { tdav_codec_h264_t *h264 = self; if(h264){ @@ -564,22 +626,22 @@ static tsk_object_t* tdav_codec_h264_bp10_dtor(tsk_object_t * self) return self; } /* object definition */ -static const tsk_object_def_t tdav_codec_h264_bp10_def_s = +static const tsk_object_def_t tdav_codec_h264_base_def_s = { sizeof(tdav_codec_h264_t), - tdav_codec_h264_bp10_ctor, - tdav_codec_h264_bp10_dtor, + tdav_codec_h264_base_ctor, + tdav_codec_h264_base_dtor, tmedia_codec_cmp, }; /* plugin definition*/ -static const tmedia_codec_plugin_def_t tdav_codec_h264_bp10_plugin_def_s = +static const tmedia_codec_plugin_def_t tdav_codec_h264_base_plugin_def_s = { - &tdav_codec_h264_bp10_def_s, + &tdav_codec_h264_base_def_s, tmedia_video, "H264", - "H264 Base Profile 1.0", - TMEDIA_CODEC_FORMAT_H264_BP10, + "H264 Base Profile", + TMEDIA_CODEC_FORMAT_H264_BP, tsk_true, 90000, // rate @@ -589,32 +651,33 @@ static const tmedia_codec_plugin_def_t tdav_codec_h264_bp10_plugin_def_s = /* video */ {176, 144, 15}, + tdav_codec_h264_set, tdav_codec_h264_open, tdav_codec_h264_close, tdav_codec_h264_encode, tdav_codec_h264_decode, - tdav_codec_h264_fmtp_match, - tdav_codec_h264_fmtp_get, - tdav_codec_h264_fmtp_set + tdav_codec_h264_sdp_att_match, + tdav_codec_h264_sdp_att_get }; -const tmedia_codec_plugin_def_t *tdav_codec_h264_bp10_plugin_def_t = &tdav_codec_h264_bp10_plugin_def_s; +const tmedia_codec_plugin_def_t *tdav_codec_h264_base_plugin_def_t = &tdav_codec_h264_base_plugin_def_s; - -/* ============ H.264 Base Profile 2.0 Plugin interface ================= */ +/* ============ H.264 Main Profile Plugin interface ================= */ /* constructor */ -static tsk_object_t* tdav_codec_h264_bp20_ctor(tsk_object_t * self, va_list * app) +static tsk_object_t* tdav_codec_h264_main_ctor(tsk_object_t * self, va_list * app) { tdav_codec_h264_t *h264 = self; if(h264){ /* init base: called by tmedia_codec_create() */ /* init self */ - tdav_codec_h264_init(h264, tdav_codec_h264_bp20); + if(tdav_codec_h264_init(h264, profile_idc_main) != 0){ + return tsk_null; + } } return self; } /* destructor */ -static tsk_object_t* tdav_codec_h264_bp20_dtor(tsk_object_t * self) +static tsk_object_t* tdav_codec_h264_main_dtor(tsk_object_t * self) { tdav_codec_h264_t *h264 = self; if(h264){ @@ -628,22 +691,22 @@ static tsk_object_t* tdav_codec_h264_bp20_dtor(tsk_object_t * self) return self; } /* object definition */ -static const tsk_object_def_t tdav_codec_h264_bp20_def_s = +static const tsk_object_def_t tdav_codec_h264_main_def_s = { sizeof(tdav_codec_h264_t), - tdav_codec_h264_bp20_ctor, - tdav_codec_h264_bp20_dtor, + tdav_codec_h264_main_ctor, + tdav_codec_h264_main_dtor, tmedia_codec_cmp, }; /* plugin definition*/ -static const tmedia_codec_plugin_def_t tdav_codec_h264_bp20_plugin_def_s = +static const tmedia_codec_plugin_def_t tdav_codec_h264_main_plugin_def_s = { - &tdav_codec_h264_bp20_def_s, + &tdav_codec_h264_main_def_s, tmedia_video, "H264", - "H264 Base Profile 2.0", - TMEDIA_CODEC_FORMAT_H264_BP20, + "H264 Main Profile", + TMEDIA_CODEC_FORMAT_H264_MP, tsk_true, 90000, // rate @@ -651,82 +714,19 @@ static const tmedia_codec_plugin_def_t tdav_codec_h264_bp20_plugin_def_s = { 0 }, /* video */ - {352, 288, 15}, + {176, 144, 15}, + tdav_codec_h264_set, tdav_codec_h264_open, tdav_codec_h264_close, tdav_codec_h264_encode, tdav_codec_h264_decode, - tdav_codec_h264_fmtp_match, - tdav_codec_h264_fmtp_get, - tdav_codec_h264_fmtp_set + tdav_codec_h264_sdp_att_match, + tdav_codec_h264_sdp_att_get }; -const tmedia_codec_plugin_def_t *tdav_codec_h264_bp20_plugin_def_t = &tdav_codec_h264_bp20_plugin_def_s; +const tmedia_codec_plugin_def_t *tdav_codec_h264_main_plugin_def_t = &tdav_codec_h264_main_plugin_def_s; -/* ============ H.264 Base Profile 3.0 Plugin interface ================= */ - -/* constructor */ -static tsk_object_t* tdav_codec_h264_bp30_ctor(tsk_object_t * self, va_list * app) -{ - tdav_codec_h264_t *h264 = self; - if(h264){ - /* init base: called by tmedia_codec_create() */ - /* init self */ - tdav_codec_h264_init(h264, tdav_codec_h264_bp30); - } - return self; -} -/* destructor */ -static tsk_object_t* tdav_codec_h264_bp30_dtor(tsk_object_t * self) -{ - tdav_codec_h264_t *h264 = self; - if(h264){ - /* deinit base */ - tdav_codec_h264_common_deinit(self); - /* deinit self */ - tdav_codec_h264_deinit(h264); - - } - - return self; -} -/* object definition */ -static const tsk_object_def_t tdav_codec_h264_bp30_def_s = -{ - sizeof(tdav_codec_h264_t), - tdav_codec_h264_bp30_ctor, - tdav_codec_h264_bp30_dtor, - tmedia_codec_cmp, -}; -/* plugin definition*/ -static const tmedia_codec_plugin_def_t tdav_codec_h264_bp30_plugin_def_s = -{ - &tdav_codec_h264_bp30_def_s, - - tmedia_video, - "H264", - "H264 Base Profile 3.0", - TMEDIA_CODEC_FORMAT_H264_BP30, - tsk_true, - 90000, // rate - - /* audio */ - { 0 }, - - /* video */ - {352, 288, 15}, - - tdav_codec_h264_open, - tdav_codec_h264_close, - tdav_codec_h264_encode, - tdav_codec_h264_decode, - tdav_codec_h264_fmtp_match, - tdav_codec_h264_fmtp_get, - tdav_codec_h264_fmtp_set -}; -const tmedia_codec_plugin_def_t *tdav_codec_h264_bp30_plugin_def_t = &tdav_codec_h264_bp30_plugin_def_s; - @@ -764,9 +764,10 @@ const tmedia_codec_plugin_def_t *tdav_codec_h264_bp30_plugin_def_t = &tdav_codec /* ============ Common To all H264 codecs ================= */ -int tdav_codec_h264_init(tdav_codec_h264_t* self, tdav_codec_h264_profile_t profile) +int tdav_codec_h264_init(tdav_codec_h264_t* self, profile_idc_t profile) { int ret = 0; + level_idc_t level; if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); @@ -777,17 +778,18 @@ int tdav_codec_h264_init(tdav_codec_h264_t* self, tdav_codec_h264_profile_t prof TSK_DEBUG_ERROR("tdav_codec_h264_common_init() faile with error code=%d", ret); return ret; } + + if((ret = tdav_codec_h264_common_level_from_size(TMEDIA_CODEC_VIDEO(self)->out.width, TMEDIA_CODEC_VIDEO(self)->out.height, &level))){ + TSK_DEBUG_ERROR("Failed to find level for size=[%u, %u]", TMEDIA_CODEC_VIDEO(self)->out.width, TMEDIA_CODEC_VIDEO(self)->out.height); + return ret; + } TDAV_CODEC_H264_COMMON(self)->pack_mode = H264_PACKETIZATION_MODE; TDAV_CODEC_H264_COMMON(self)->profile = profile; + TDAV_CODEC_H264_COMMON(self)->level = level; TMEDIA_CODEC_VIDEO(self)->in.max_mbps = TMEDIA_CODEC_VIDEO(self)->out.max_mbps = H264_MAX_MBPS*1000; TMEDIA_CODEC_VIDEO(self)->in.max_br = TMEDIA_CODEC_VIDEO(self)->out.max_br = H264_MAX_BR*1000; - // At this time self->plugin is Null - TMEDIA_CODEC_VIDEO(self)->in.width = TMEDIA_CODEC_VIDEO(self)->out.width = 176; - TMEDIA_CODEC_VIDEO(self)->in.height = TMEDIA_CODEC_VIDEO(self)->out.height = 144; - TMEDIA_CODEC_VIDEO(self)->in.fps = TMEDIA_CODEC_VIDEO(self)->out.fps = 15; - if(!(self->encoder.codec = avcodec_find_encoder(CODEC_ID_H264))){ TSK_DEBUG_ERROR("Failed to find H.264 encoder"); ret = -2; @@ -798,6 +800,8 @@ int tdav_codec_h264_init(tdav_codec_h264_t* self, tdav_codec_h264_profile_t prof ret = -3; } + self->encoder.quality = 1; + /* allocations MUST be done by open() */ return ret; } diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/h264/tdav_codec_h264_cuda.cxx b/branches/2.0/doubango/tinyDAV/src/codecs/h264/tdav_codec_h264_cuda.cxx index f35db610..43a23686 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/h264/tdav_codec_h264_cuda.cxx +++ b/branches/2.0/doubango/tinyDAV/src/codecs/h264/tdav_codec_h264_cuda.cxx @@ -52,16 +52,16 @@ #include #include -#define tdav_codec_h264_cuda_fmtp_set tsk_null - -#if !defined(CUDA_MAX_FRM_CNT) -# define CUDA_MAX_FRM_CNT 10 -#endif - -#include "tsk_semaphore.h" -tsk_semaphore_handle_t *sem = tsk_null; - -#define InitH264DecoderInfo(_self) \ +#define tdav_codec_h264_cuda_fmtp_set tsk_null + +#if !defined(CUDA_MAX_FRM_CNT) +# define CUDA_MAX_FRM_CNT 10 +#endif + +#include "tsk_semaphore.h" +tsk_semaphore_handle_t *sem = tsk_null; + +#define InitH264DecoderInfo(_self) \ memset(&_self->decoder.info, 0, sizeof(_self->decoder.info)); \ _self->decoder.info.ulCreationFlags = cudaVideoCreate_PreferCUDA; \ _self->decoder.info.CodecType = cudaVideoCodec_H264; \ @@ -73,19 +73,19 @@ tsk_semaphore_handle_t *sem = tsk_null; _self->decoder.info.ulNumOutputSurfaces = 1; \ _self->decoder.info.ChromaFormat = cudaVideoChromaFormat_420; \ _self->decoder.info.OutputFormat = cudaVideoSurfaceFormat_NV12; \ - _self->decoder.info.DeinterlaceMode = cudaVideoDeinterlaceMode_Adaptive; - + _self->decoder.info.DeinterlaceMode = cudaVideoDeinterlaceMode_Adaptive; + static int CUDAAPI _NVCallback_HandleVideoSequence(void *pvUserData, CUVIDEOFORMAT *pFormat); static int CUDAAPI _NVCallback_HandlePictureDecode(void *pvUserData, CUVIDPICPARAMS *pPicParams); -static int CUDAAPI _NVCallback_HandlePictureDisplay(void *pvUserData, CUVIDPARSERDISPINFO *pPicParams); +static int CUDAAPI _NVCallback_HandlePictureDisplay(void *pvUserData, CUVIDPARSERDISPINFO *pPicParams); static unsigned char* CUDAAPI _NVCallback_HandleAcquireBitStream(int *pBufferSize, void *pUserdata); static void CUDAAPI _NVCallback_HandleReleaseBitStream(int nBytesInBuffer, unsigned char *cb,void *pUserdata); static void CUDAAPI _NVCallback_HandleOnBeginFrame(const NVVE_BeginFrameInfo *pbfi, void *pUserdata); -static void CUDAAPI _NVCallback_HandleOnEndFrame(const NVVE_EndFrameInfo *pefi, void *pUserdata); - -static inline void _tdav_codec_h264_cuda_encap(const tdav_codec_h264_cuda_t* h264, const uint8_t* pdata, tsk_size_t size); -static inline tsk_size_t _tdav_codec_h264_cuda_pict_layout(tdav_codec_h264_cuda_t* self, void**output, tsk_size_t *output_size); - +static void CUDAAPI _NVCallback_HandleOnEndFrame(const NVVE_EndFrameInfo *pefi, void *pUserdata); + +static inline void _tdav_codec_h264_cuda_encap(const tdav_codec_h264_cuda_t* h264, const uint8_t* pdata, tsk_size_t size); +static inline tsk_size_t _tdav_codec_h264_cuda_pict_layout(tdav_codec_h264_cuda_t* self, void**output, tsk_size_t *output_size); + static int tdav_codec_h264_cuda_open(tmedia_codec_t* self) { int ret = 0, i; @@ -94,11 +94,11 @@ static int tdav_codec_h264_cuda_open(tmedia_codec_t* self) HRESULT hr; CUresult cuResult; D3DPRESENT_PARAMETERS d3dpp; - tdav_codec_h264_cuda_t* h264 = (tdav_codec_h264_cuda_t*)self; - - if(!h264){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; + tdav_codec_h264_cuda_t* h264 = (tdav_codec_h264_cuda_t*)self; + + if(!h264){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; } // @@ -349,11 +349,11 @@ static int tdav_codec_h264_cuda_open(tmedia_codec_t* self) static int tdav_codec_h264_cuda_close(tmedia_codec_t* self) { - tdav_codec_h264_cuda_t* h264 = (tdav_codec_h264_cuda_t*)self; - - if(!h264){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; + tdav_codec_h264_cuda_t* h264 = (tdav_codec_h264_cuda_t*)self; + + if(!h264){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; } if(h264->encoder.context){ @@ -366,26 +366,26 @@ static int tdav_codec_h264_cuda_close(tmedia_codec_t* self) static tsk_size_t tdav_codec_h264_cuda_encode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size) { NVVE_EncodeFrameParams efparams; - int ret = 0; - unsigned long flags = 0; - HRESULT hr; - - tdav_codec_h264_cuda_t* h264 = (tdav_codec_h264_cuda_t*)self; - - if(!self || !in_data || !in_size || !out_data){ - TSK_DEBUG_ERROR("Invalid parameter"); - return 0; - } - - if(!self->opened){ - TSK_DEBUG_ERROR("Codec not opened"); - return 0; + int ret = 0; + unsigned long flags = 0; + HRESULT hr; + + tdav_codec_h264_cuda_t* h264 = (tdav_codec_h264_cuda_t*)self; + + if(!self || !in_data || !in_size || !out_data){ + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; } - if((h264->encoder.ctx_params.iOutputSize[1] * h264->encoder.ctx_params.iOutputSize[0] * 3)>>1 != in_size){ - /* guard */ - TSK_DEBUG_ERROR("Invalid size"); - return 0; + if(!self->opened){ + TSK_DEBUG_ERROR("Codec not opened"); + return 0; + } + + if((h264->encoder.ctx_params.iOutputSize[1] * h264->encoder.ctx_params.iOutputSize[0] * 3)>>1 != in_size){ + /* guard */ + TSK_DEBUG_ERROR("Invalid size"); + return 0; } //return 0; @@ -401,17 +401,17 @@ static tsk_size_t tdav_codec_h264_cuda_encode(tmedia_codec_t* self, const void* efparams.picBuf = (unsigned char *)in_data; efparams.bLast = 0; - // send keyframe for: - // - the first frame - // - every second within the first 4seconds - // - every 7 seconds after the first 4seconds - if(h264->encoder.frame_count++ == 0 - || - ( (h264->encoder.frame_count < (int)TMEDIA_CODEC_VIDEO(h264)->out.fps * 4) && ((h264->encoder.frame_count % TMEDIA_CODEC_VIDEO(h264)->out.fps)==0) ) - || - ( (h264->encoder.frame_count % (TMEDIA_CODEC_VIDEO(h264)->out.fps * 5))==0 ) - ) - { + // send keyframe for: + // - the first frame + // - every second within the first 4seconds + // - every 7 seconds after the first 4seconds + if(h264->encoder.frame_count++ == 0 + || + ( (h264->encoder.frame_count < (int)TMEDIA_CODEC_VIDEO(h264)->out.fps * 4) && ((h264->encoder.frame_count % TMEDIA_CODEC_VIDEO(h264)->out.fps)==0) ) + || + ( (h264->encoder.frame_count % (TMEDIA_CODEC_VIDEO(h264)->out.fps * 5))==0 ) + ) + { flags |= 0x04; // FORCE IDR if(h264->encoder.ctx_params.iDisableSPSPPS){ unsigned char SPSPPSBuff[1024]; @@ -424,11 +424,11 @@ static tsk_size_t tdav_codec_h264_cuda_encode(tmedia_codec_t* self, const void* _tdav_codec_h264_cuda_encap(h264, &SPSPPSBuff[size + 2], next_size); size+=next_size + 2; } - } - else{ - TSK_DEBUG_ERROR("NVGetSPSPPS failed with error code = %08x", hr) - } - } + } + else{ + TSK_DEBUG_ERROR("NVGetSPSPPS failed with error code = %08x", hr) + } + } } hr = NVEncodeFrame(h264->encoder.context, &efparams, flags, NULL); @@ -440,10 +440,10 @@ static tsk_size_t tdav_codec_h264_cuda_decode(tmedia_codec_t* self, const void* { tdav_codec_h264_cuda_t* h264 = (tdav_codec_h264_cuda_t*)self; const trtp_rtp_header_t* rtp_hdr = (const trtp_rtp_header_t*)proto_hdr; - const uint8_t* pay_ptr = tsk_null; - tsk_size_t pay_size = 0, retsize = 0, size_to_copy = 0; - int ret = 0; - tsk_bool_t append_scp = tsk_false; + const uint8_t* pay_ptr = tsk_null; + tsk_size_t pay_size = 0, retsize = 0, size_to_copy = 0; + int ret = 0; + tsk_bool_t append_scp = tsk_false; static tsk_size_t xmax_size = (1920 * 1080 * 3) >> 3; static tsk_size_t start_code_prefix_size = sizeof(H264_START_CODE_PREFIX); @@ -458,24 +458,24 @@ static tsk_size_t tdav_codec_h264_cuda_decode(tmedia_codec_t* self, const void* } h264->decoder.last_seq = rtp_hdr->seq_num; - /* 5.3. NAL Unit Octet Usage - +---------------+ - |0|1|2|3|4|5|6|7| - +-+-+-+-+-+-+-+-+ - |F|NRI| Type | - +---------------+ - */ - if(*((uint8_t*)in_data) >> 7){ - TSK_DEBUG_WARN("F=1"); - /* reset accumulator */ - h264->decoder.accumulator = 0; - goto bail; - } - - // get payload - if((ret = tdav_codec_h264_get_pay(in_data, in_size, (const void**)&pay_ptr, &pay_size, &append_scp)) || !pay_ptr || !pay_size){ - TSK_DEBUG_ERROR("Depayloader failed to get H.264 content"); - goto bail; + /* 5.3. NAL Unit Octet Usage + +---------------+ + |0|1|2|3|4|5|6|7| + +-+-+-+-+-+-+-+-+ + |F|NRI| Type | + +---------------+ + */ + if(*((uint8_t*)in_data) >> 7){ + TSK_DEBUG_WARN("F=1"); + /* reset accumulator */ + h264->decoder.accumulator = 0; + goto bail; + } + + // get payload + if((ret = tdav_codec_h264_get_pay(in_data, in_size, (const void**)&pay_ptr, &pay_size, &append_scp)) || !pay_ptr || !pay_size){ + TSK_DEBUG_ERROR("Depayloader failed to get H.264 content"); + goto bail; } //append_scp = tsk_true; size_to_copy = pay_size + (append_scp ? start_code_prefix_size : 0); @@ -507,9 +507,9 @@ static tsk_size_t tdav_codec_h264_cuda_decode(tmedia_codec_t* self, const void* h264->decoder.accumulator_size = (h264->decoder.accumulator_pos + size_to_copy); } - if(append_scp){ - memcpy(&((uint8_t*)h264->decoder.accumulator)[h264->decoder.accumulator_pos], H264_START_CODE_PREFIX, start_code_prefix_size); - h264->decoder.accumulator_pos += start_code_prefix_size; + if(append_scp){ + memcpy(&((uint8_t*)h264->decoder.accumulator)[h264->decoder.accumulator_pos], H264_START_CODE_PREFIX, start_code_prefix_size); + h264->decoder.accumulator_pos += start_code_prefix_size; } memcpy(&((uint8_t*)h264->decoder.accumulator)[h264->decoder.accumulator_pos], pay_ptr, pay_size); h264->decoder.accumulator_pos += pay_size; @@ -544,20 +544,20 @@ bail: return retsize; } -static tsk_bool_t tdav_codec_h264_cuda_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +static tsk_bool_t tdav_codec_h264_cuda_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { - tdav_codec_h264_cuda_t* h264 = (tdav_codec_h264_cuda_t*)codec; - tdav_codec_h264_profile_t profile; - - if(!h264){ - TSK_DEBUG_ERROR("Invalid parameter"); - return tsk_false; + tdav_codec_h264_cuda_t* h264 = (tdav_codec_h264_cuda_t*)codec; + profile_idc_t profile; + + if(!h264){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_false; } - /* Check whether the profile match (If the profile is missing, then we consider that it's ok) */ - if(((profile = tdav_codec_h264_common_get_profile(fmtp)) != tdav_codec_h264_bp99) && (profile != TDAV_CODEC_H264_COMMON(h264)->profile)){ - TSK_DEBUG_INFO("Profile not matching"); - return tsk_false; + /* Check whether the profile match (If the profile is missing, then we consider that it's ok) */ + if(((profile = tdav_codec_h264_common_get_profile(fmtp)) != tdav_codec_h264_bp99) && (profile != TDAV_CODEC_H264_COMMON(h264)->profile)){ + TSK_DEBUG_INFO("Profile not matching"); + return tsk_false; } TMEDIA_CODEC_VIDEO(h264)->in.width = 800, TMEDIA_CODEC_VIDEO(h264)->in.height = 640; @@ -568,21 +568,21 @@ static tsk_bool_t tdav_codec_h264_cuda_fmtp_match(const tmedia_codec_t* codec, c return tsk_true; } -static char* tdav_codec_h264_cuda_fmtp_get(const tmedia_codec_t* self) +static char* tdav_codec_h264_cuda_sdp_att_get(const tmedia_codec_t* self, const char* att_name) { char* fmtp = tsk_null; tdav_codec_h264_cuda_t* h264 = (tdav_codec_h264_cuda_t*)self; - switch(TDAV_CODEC_H264_COMMON(h264)->profile){ - case tdav_codec_h264_bp10: - fmtp = tsk_strdup("profile-level-id=42e00a"); - break; - case tdav_codec_h264_bp20: - fmtp = tsk_strdup("profile-level-id=42e014"); - break; - case tdav_codec_h264_bp30: - fmtp = tsk_strdup("profile-level-id=42e01e"); - break; + switch(TDAV_CODEC_H264_COMMON(h264)->profile){ + case tdav_codec_h264_bp10: + fmtp = tsk_strdup("profile-level-id=42e00a"); + break; + case tdav_codec_h264_bp20: + fmtp = tsk_strdup("profile-level-id=42e014"); + break; + case tdav_codec_h264_bp30: + fmtp = tsk_strdup("profile-level-id=42e01e"); + break; } //1080p(1920 x 1080), 720p(1280 x 720), SVGA(800 x 600), VGA(640 x 480), 4CIF(704 x 576), CIF(352 x 288), QCIF(176 x 144), SQCIF(128 x 96) @@ -616,35 +616,35 @@ tsk_bool_t tdav_codec_h264_cuda_is_supported() return __is_supported; } -static int tdav_codec_h264_cuda_init(tdav_codec_h264_cuda_t* self, tdav_codec_h264_profile_t profile) +static int tdav_codec_h264_cuda_init(tdav_codec_h264_cuda_t* self, profile_idc_t profile) { - int ret = 0; - - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - - if((ret = tdav_codec_h264_common_init(TDAV_CODEC_H264_COMMON(self)))){ - TSK_DEBUG_ERROR("tdav_codec_h264_common_init() faile with error code=%d", ret); - return ret; - } - - if(!self->decoder.mutex && !(self->decoder.mutex = tsk_mutex_create_2(tsk_false))){ - TSK_DEBUG_ERROR("Failed to create mutex"); - return -2; - } - - sem = tsk_semaphore_create_2(1); - - TDAV_CODEC_H264_COMMON(self)->pack_mode = H264_PACKETIZATION_MODE; - TDAV_CODEC_H264_COMMON(self)->profile = profile; - TMEDIA_CODEC_VIDEO(self)->in.max_mbps = TMEDIA_CODEC_VIDEO(self)->out.max_mbps = H264_MAX_MBPS*1000; - TMEDIA_CODEC_VIDEO(self)->in.max_br = TMEDIA_CODEC_VIDEO(self)->out.max_br = H264_MAX_BR*1000; - - // At this time self->plugin is Null - TMEDIA_CODEC_VIDEO(self)->in.width = TMEDIA_CODEC_VIDEO(self)->out.width = 176; - TMEDIA_CODEC_VIDEO(self)->in.height = TMEDIA_CODEC_VIDEO(self)->out.height = 144; + int ret = 0; + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if((ret = tdav_codec_h264_common_init(TDAV_CODEC_H264_COMMON(self)))){ + TSK_DEBUG_ERROR("tdav_codec_h264_common_init() faile with error code=%d", ret); + return ret; + } + + if(!self->decoder.mutex && !(self->decoder.mutex = tsk_mutex_create_2(tsk_false))){ + TSK_DEBUG_ERROR("Failed to create mutex"); + return -2; + } + + sem = tsk_semaphore_create_2(1); + + TDAV_CODEC_H264_COMMON(self)->pack_mode = H264_PACKETIZATION_MODE; + TDAV_CODEC_H264_COMMON(self)->profile = profile; + TMEDIA_CODEC_VIDEO(self)->in.max_mbps = TMEDIA_CODEC_VIDEO(self)->out.max_mbps = H264_MAX_MBPS*1000; + TMEDIA_CODEC_VIDEO(self)->in.max_br = TMEDIA_CODEC_VIDEO(self)->out.max_br = H264_MAX_BR*1000; + + // At this time self->plugin is Null + TMEDIA_CODEC_VIDEO(self)->in.width = TMEDIA_CODEC_VIDEO(self)->out.width = 176; + TMEDIA_CODEC_VIDEO(self)->in.height = TMEDIA_CODEC_VIDEO(self)->out.height = 144; TMEDIA_CODEC_VIDEO(self)->in.fps = TMEDIA_CODEC_VIDEO(self)->out.fps = 15; TMEDIA_CODEC_VIDEO(self)->in.chroma = tmedia_chroma_yuv420p;// no choice @@ -653,11 +653,11 @@ static int tdav_codec_h264_cuda_init(tdav_codec_h264_cuda_t* self, tdav_codec_h2 static int tdav_codec_h264_cuda_deinit(tdav_codec_h264_cuda_t* self) { - tdav_codec_h264_cuda_t* h264 = (tdav_codec_h264_cuda_t*)self; - - if(!h264){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; + tdav_codec_h264_cuda_t* h264 = (tdav_codec_h264_cuda_t*)self; + + if(!h264){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; } if(h264->encoder.context){ @@ -703,32 +703,32 @@ static int tdav_codec_h264_cuda_deinit(tdav_codec_h264_cuda_t* self) return 0; } -static inline void _tdav_codec_h264_cuda_encap(const tdav_codec_h264_cuda_t* h264, const uint8_t* pdata, tsk_size_t size) -{ - register int32_t i; - int32_t last_scp, prev_scp; - static int32_t size_of_scp = sizeof(H264_START_CODE_PREFIX); /* we know it's equal to 4 ..but */ - - if(!pdata || !size){ - return; - } - - last_scp = 0, prev_scp = 0; - - for(i = size_of_scp; i<(int32_t)(size - size_of_scp); i++){ - if(pdata[i] == H264_START_CODE_PREFIX[0] && pdata[i+1] == H264_START_CODE_PREFIX[1] && pdata[i+2] == H264_START_CODE_PREFIX[2] && pdata[i+3] == H264_START_CODE_PREFIX[3]){ /* Found Start Code Prefix */ - prev_scp = last_scp; - if((i - last_scp) >= H264_RTP_PAYLOAD_SIZE || 1){ - tdav_codec_h264_rtp_callback(TDAV_CODEC_H264_COMMON(h264), pdata + prev_scp, - (i - prev_scp), (prev_scp == size)); - } - last_scp = i; - } - } - if(last_scp < (int32_t)size){ - tdav_codec_h264_rtp_callback(TDAV_CODEC_H264_COMMON(h264), pdata + last_scp, - (size - last_scp), tsk_true); - } +static inline void _tdav_codec_h264_cuda_encap(const tdav_codec_h264_cuda_t* h264, const uint8_t* pdata, tsk_size_t size) +{ + register int32_t i; + int32_t last_scp, prev_scp; + static int32_t size_of_scp = sizeof(H264_START_CODE_PREFIX); /* we know it's equal to 4 ..but */ + + if(!pdata || !size){ + return; + } + + last_scp = 0, prev_scp = 0; + + for(i = size_of_scp; i<(int32_t)(size - size_of_scp); i++){ + if(pdata[i] == H264_START_CODE_PREFIX[0] && pdata[i+1] == H264_START_CODE_PREFIX[1] && pdata[i+2] == H264_START_CODE_PREFIX[2] && pdata[i+3] == H264_START_CODE_PREFIX[3]){ /* Found Start Code Prefix */ + prev_scp = last_scp; + if((i - last_scp) >= H264_RTP_PAYLOAD_SIZE || 1){ + tdav_codec_h264_rtp_callback(TDAV_CODEC_H264_COMMON(h264), pdata + prev_scp, + (i - prev_scp), (prev_scp == size)); + } + last_scp = i; + } + } + if(last_scp < (int32_t)size){ + tdav_codec_h264_rtp_callback(TDAV_CODEC_H264_COMMON(h264), pdata + last_scp, + (size - last_scp), tsk_true); + } } static inline tsk_size_t _tdav_codec_h264_cuda_pict_layout(tdav_codec_h264_cuda_t* self, void**output, tsk_size_t *output_size) @@ -739,14 +739,14 @@ static inline tsk_size_t _tdav_codec_h264_cuda_pict_layout(tdav_codec_h264_cuda_ unsigned int pitch = self->decoder.cu_buffer_pitch; tsk_size_t xsize = (w * h * 3) >> 1; // resize if too short - if(*output_sizecoded_width != TMEDIA_CODEC_VIDEO(h264)->in.width || pFormat->coded_height != TMEDIA_CODEC_VIDEO(h264)->in.height){ tsk_mutex_lock(h264->decoder.mutex); - TMEDIA_CODEC_VIDEO(h264)->in.width = pFormat->coded_width; + TMEDIA_CODEC_VIDEO(h264)->in.width = pFormat->coded_width; TMEDIA_CODEC_VIDEO(h264)->in.height = pFormat->coded_height; InitH264DecoderInfo(h264); @@ -935,195 +935,195 @@ static void CUDAAPI _NVCallback_HandleOnEndFrame(const NVVE_EndFrameInfo *pefi, return; } -/* ============ H.264 Base Profile 1.0 Plugin interface ================= */ - -/* constructor */ -static tsk_object_t* tdav_codec_h264_cuda_bp10_ctor(tsk_object_t * self, va_list * app) -{ - tdav_codec_h264_cuda_t *h264 = (tdav_codec_h264_cuda_t *)self; - if(h264){ - /* init base: called by tmedia_codec_create() */ - /* init self */ - tdav_codec_h264_cuda_init(h264, tdav_codec_h264_bp10); - } - return self; -} -/* destructor */ -static tsk_object_t* tdav_codec_h264_cuda_bp10_dtor(tsk_object_t * self) -{ - tdav_codec_h264_cuda_t *h264 = (tdav_codec_h264_cuda_t *)self; - if(h264){ - /* deinit base */ - tdav_codec_h264_common_deinit(TDAV_CODEC_H264_COMMON(self)); - /* deinit self */ - tdav_codec_h264_cuda_deinit(h264); - } - - return self; -} -/* object definition */ -static const tsk_object_def_t tdav_codec_h264_cuda_bp10_def_s = -{ - sizeof(tdav_codec_h264_cuda_t), - tdav_codec_h264_cuda_bp10_ctor, - tdav_codec_h264_cuda_bp10_dtor, - tmedia_codec_cmp, -}; -/* plugin definition*/ -static const tmedia_codec_plugin_def_t tdav_codec_h264_cuda_bp10_plugin_def_s = -{ - &tdav_codec_h264_cuda_bp10_def_s, - - tmedia_video, - "H264", - "H264 Base Profile 1.0 using CUDA", - TMEDIA_CODEC_FORMAT_H264_BP10, - tsk_true, - 90000, // rate - - /* audio */ - { 0 }, - - /* video */ - {176, 144, 15}, - - tdav_codec_h264_cuda_open, - tdav_codec_h264_cuda_close, - tdav_codec_h264_cuda_encode, - tdav_codec_h264_cuda_decode, - tdav_codec_h264_cuda_fmtp_match, - tdav_codec_h264_cuda_fmtp_get, - tdav_codec_h264_cuda_fmtp_set -}; -extern const tmedia_codec_plugin_def_t *tdav_codec_h264_cuda_bp10_plugin_def_t = &tdav_codec_h264_cuda_bp10_plugin_def_s; - - -/* ============ H.264 Base Profile 2.0 Plugin interface ================= */ - -/* constructor */ -static tsk_object_t* tdav_codec_h264_cuda_bp20_ctor(tsk_object_t * self, va_list * app) -{ - tdav_codec_h264_cuda_t *h264 = (tdav_codec_h264_cuda_t *)self; - if(h264){ - /* init base: called by tmedia_codec_create() */ - /* init self */ - tdav_codec_h264_cuda_init(h264, tdav_codec_h264_bp20); - } - return self; -} -/* destructor */ -static tsk_object_t* tdav_codec_h264_cuda_bp20_dtor(tsk_object_t * self) -{ - tdav_codec_h264_cuda_t *h264 = (tdav_codec_h264_cuda_t *)self; - if(h264){ - /* deinit base */ - tdav_codec_h264_common_deinit(TDAV_CODEC_H264_COMMON(self)); - /* deinit self */ - tdav_codec_h264_cuda_deinit(h264); - - } - - return self; -} -/* object definition */ -static const tsk_object_def_t tdav_codec_h264_cuda_bp20_def_s = -{ - sizeof(tdav_codec_h264_cuda_t), - tdav_codec_h264_cuda_bp20_ctor, - tdav_codec_h264_cuda_bp20_dtor, - tmedia_codec_cmp, -}; -/* plugin definition*/ -static const tmedia_codec_plugin_def_t tdav_codec_h264_cuda_bp20_plugin_def_s = -{ - &tdav_codec_h264_cuda_bp20_def_s, - - tmedia_video, - "H264", - "H264 Base Profile 2.0 using CUDA", - TMEDIA_CODEC_FORMAT_H264_BP20, - tsk_true, - 90000, // rate - - /* audio */ - { 0 }, - - /* video */ - {352, 288, 15}, - - tdav_codec_h264_cuda_open, - tdav_codec_h264_cuda_close, - tdav_codec_h264_cuda_encode, - tdav_codec_h264_cuda_decode, - tdav_codec_h264_cuda_fmtp_match, - tdav_codec_h264_cuda_fmtp_get, - tdav_codec_h264_cuda_fmtp_set -}; -extern const tmedia_codec_plugin_def_t *tdav_codec_h264_cuda_bp20_plugin_def_t = &tdav_codec_h264_cuda_bp20_plugin_def_s; - - -/* ============ H.264 Base Profile 3.0 Plugin interface ================= */ - -/* constructor */ -static tsk_object_t* tdav_codec_h264_cuda_bp30_ctor(tsk_object_t * self, va_list * app) -{ - tdav_codec_h264_cuda_t *h264 = (tdav_codec_h264_cuda_t *)self; - if(h264){ - /* init base: called by tmedia_codec_create() */ - /* init self */ - tdav_codec_h264_cuda_init(h264, tdav_codec_h264_bp30); - } - return self; -} -/* destructor */ -static tsk_object_t* tdav_codec_h264_cuda_bp30_dtor(tsk_object_t * self) -{ - tdav_codec_h264_cuda_t *h264 = (tdav_codec_h264_cuda_t *)self; - if(h264){ - /* deinit base */ - tdav_codec_h264_common_deinit(TDAV_CODEC_H264_COMMON(self)); - /* deinit self */ - tdav_codec_h264_cuda_deinit(h264); - - } - - return self; -} -/* object definition */ -static const tsk_object_def_t tdav_codec_h264_cuda_bp30_def_s = -{ - sizeof(tdav_codec_h264_cuda_t), - tdav_codec_h264_cuda_bp30_ctor, - tdav_codec_h264_cuda_bp30_dtor, - tmedia_codec_cmp, -}; -/* plugin definition*/ -static const tmedia_codec_plugin_def_t tdav_codec_h264_cuda_bp30_plugin_def_s = -{ - &tdav_codec_h264_cuda_bp30_def_s, - - tmedia_video, - "H264", - "H264 Base Profile 3.0 using CUDA", - TMEDIA_CODEC_FORMAT_H264_BP30, - tsk_true, - 90000, // rate - - /* audio */ - { 0 }, - - /* video */ - {352, 288, 15}, - - tdav_codec_h264_cuda_open, - tdav_codec_h264_cuda_close, - tdav_codec_h264_cuda_encode, - tdav_codec_h264_cuda_decode, - tdav_codec_h264_cuda_fmtp_match, - tdav_codec_h264_cuda_fmtp_get, - tdav_codec_h264_cuda_fmtp_set -}; -extern const tmedia_codec_plugin_def_t *tdav_codec_h264_cuda_bp30_plugin_def_t = &tdav_codec_h264_cuda_bp30_plugin_def_s; +/* ============ H.264 Base Profile 1.0 Plugin interface ================= */ + +/* constructor */ +static tsk_object_t* tdav_codec_h264_cuda_bp10_ctor(tsk_object_t * self, va_list * app) +{ + tdav_codec_h264_cuda_t *h264 = (tdav_codec_h264_cuda_t *)self; + if(h264){ + /* init base: called by tmedia_codec_create() */ + /* init self */ + tdav_codec_h264_cuda_init(h264, tdav_codec_h264_bp10); + } + return self; +} +/* destructor */ +static tsk_object_t* tdav_codec_h264_cuda_bp10_dtor(tsk_object_t * self) +{ + tdav_codec_h264_cuda_t *h264 = (tdav_codec_h264_cuda_t *)self; + if(h264){ + /* deinit base */ + tdav_codec_h264_common_deinit(TDAV_CODEC_H264_COMMON(self)); + /* deinit self */ + tdav_codec_h264_cuda_deinit(h264); + } + + return self; +} +/* object definition */ +static const tsk_object_def_t tdav_codec_h264_cuda_bp10_def_s = +{ + sizeof(tdav_codec_h264_cuda_t), + tdav_codec_h264_cuda_bp10_ctor, + tdav_codec_h264_cuda_bp10_dtor, + tmedia_codec_cmp, +}; +/* plugin definition*/ +static const tmedia_codec_plugin_def_t tdav_codec_h264_cuda_bp10_plugin_def_s = +{ + &tdav_codec_h264_cuda_bp10_def_s, + + tmedia_video, + "H264", + "H264 Base Profile 1.0 using CUDA", + TMEDIA_CODEC_FORMAT_H264_BP10, + tsk_true, + 90000, // rate + + /* audio */ + { 0 }, + + /* video */ + {176, 144, 15}, + + tdav_codec_h264_cuda_open, + tdav_codec_h264_cuda_close, + tdav_codec_h264_cuda_encode, + tdav_codec_h264_cuda_decode, + tdav_codec_h264_cuda_sdp_att_match, + tdav_codec_h264_cuda_sdp_att_get, + tdav_codec_h264_cuda_fmtp_set +}; +extern const tmedia_codec_plugin_def_t *tdav_codec_h264_cuda_bp10_plugin_def_t = &tdav_codec_h264_cuda_bp10_plugin_def_s; + + +/* ============ H.264 Base Profile 2.0 Plugin interface ================= */ + +/* constructor */ +static tsk_object_t* tdav_codec_h264_cuda_bp20_ctor(tsk_object_t * self, va_list * app) +{ + tdav_codec_h264_cuda_t *h264 = (tdav_codec_h264_cuda_t *)self; + if(h264){ + /* init base: called by tmedia_codec_create() */ + /* init self */ + tdav_codec_h264_cuda_init(h264, tdav_codec_h264_bp20); + } + return self; +} +/* destructor */ +static tsk_object_t* tdav_codec_h264_cuda_bp20_dtor(tsk_object_t * self) +{ + tdav_codec_h264_cuda_t *h264 = (tdav_codec_h264_cuda_t *)self; + if(h264){ + /* deinit base */ + tdav_codec_h264_common_deinit(TDAV_CODEC_H264_COMMON(self)); + /* deinit self */ + tdav_codec_h264_cuda_deinit(h264); + + } + + return self; +} +/* object definition */ +static const tsk_object_def_t tdav_codec_h264_cuda_bp20_def_s = +{ + sizeof(tdav_codec_h264_cuda_t), + tdav_codec_h264_cuda_bp20_ctor, + tdav_codec_h264_cuda_bp20_dtor, + tmedia_codec_cmp, +}; +/* plugin definition*/ +static const tmedia_codec_plugin_def_t tdav_codec_h264_cuda_bp20_plugin_def_s = +{ + &tdav_codec_h264_cuda_bp20_def_s, + + tmedia_video, + "H264", + "H264 Base Profile 2.0 using CUDA", + TMEDIA_CODEC_FORMAT_H264_BP20, + tsk_true, + 90000, // rate + + /* audio */ + { 0 }, + + /* video */ + {352, 288, 15}, + + tdav_codec_h264_cuda_open, + tdav_codec_h264_cuda_close, + tdav_codec_h264_cuda_encode, + tdav_codec_h264_cuda_decode, + tdav_codec_h264_cuda_sdp_att_match, + tdav_codec_h264_cuda_sdp_att_get, + tdav_codec_h264_cuda_fmtp_set +}; +extern const tmedia_codec_plugin_def_t *tdav_codec_h264_cuda_bp20_plugin_def_t = &tdav_codec_h264_cuda_bp20_plugin_def_s; + + +/* ============ H.264 Base Profile 3.0 Plugin interface ================= */ + +/* constructor */ +static tsk_object_t* tdav_codec_h264_cuda_bp30_ctor(tsk_object_t * self, va_list * app) +{ + tdav_codec_h264_cuda_t *h264 = (tdav_codec_h264_cuda_t *)self; + if(h264){ + /* init base: called by tmedia_codec_create() */ + /* init self */ + tdav_codec_h264_cuda_init(h264, tdav_codec_h264_bp30); + } + return self; +} +/* destructor */ +static tsk_object_t* tdav_codec_h264_cuda_bp30_dtor(tsk_object_t * self) +{ + tdav_codec_h264_cuda_t *h264 = (tdav_codec_h264_cuda_t *)self; + if(h264){ + /* deinit base */ + tdav_codec_h264_common_deinit(TDAV_CODEC_H264_COMMON(self)); + /* deinit self */ + tdav_codec_h264_cuda_deinit(h264); + + } + + return self; +} +/* object definition */ +static const tsk_object_def_t tdav_codec_h264_cuda_bp30_def_s = +{ + sizeof(tdav_codec_h264_cuda_t), + tdav_codec_h264_cuda_bp30_ctor, + tdav_codec_h264_cuda_bp30_dtor, + tmedia_codec_cmp, +}; +/* plugin definition*/ +static const tmedia_codec_plugin_def_t tdav_codec_h264_cuda_bp30_plugin_def_s = +{ + &tdav_codec_h264_cuda_bp30_def_s, + + tmedia_video, + "H264", + "H264 Base Profile 3.0 using CUDA", + TMEDIA_CODEC_FORMAT_H264_BP30, + tsk_true, + 90000, // rate + + /* audio */ + { 0 }, + + /* video */ + {352, 288, 15}, + + tdav_codec_h264_cuda_open, + tdav_codec_h264_cuda_close, + tdav_codec_h264_cuda_encode, + tdav_codec_h264_cuda_decode, + tdav_codec_h264_cuda_sdp_att_match, + tdav_codec_h264_cuda_sdp_att_get, + tdav_codec_h264_cuda_fmtp_set +}; +extern const tmedia_codec_plugin_def_t *tdav_codec_h264_cuda_bp30_plugin_def_t = &tdav_codec_h264_cuda_bp30_plugin_def_s; #endif /* HAVE_CUDA */ diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/h264/tdav_codec_h264_rtp.c b/branches/2.0/doubango/tinyDAV/src/codecs/h264/tdav_codec_h264_rtp.c index 1285c8f0..cca45f74 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/h264/tdav_codec_h264_rtp.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/h264/tdav_codec_h264_rtp.c @@ -126,6 +126,30 @@ int tdav_codec_h264_parse_profile(const char* profile_level_id, profile_idc_t *p case level_idc_3_0: *l_idc = level_idc_3_0; break; + case level_idc_3_1: + *l_idc = level_idc_3_1; + break; + case level_idc_3_2: + *l_idc = level_idc_3_2; + break; + case level_idc_4_0: + *l_idc = level_idc_4_0; + break; + case level_idc_4_1: + *l_idc = level_idc_4_1; + break; + case level_idc_4_2: + *l_idc = level_idc_4_2; + break; + case level_idc_5_0: + *l_idc = level_idc_5_0; + break; + case level_idc_5_1: + *l_idc = level_idc_5_1; + break; + case level_idc_5_2: + *l_idc = level_idc_5_2; + break; default: *l_idc = level_idc_none; break; @@ -295,8 +319,12 @@ void tdav_codec_h264_rtp_callback(struct tdav_codec_h264_common_s *self, const v if(size < H264_RTP_PAYLOAD_SIZE){ /* Can be packet in a Single Nal Unit */ // Send data over the network - if(TMEDIA_CODEC_VIDEO(self)->callback){ - TMEDIA_CODEC_VIDEO(self)->callback(TMEDIA_CODEC_VIDEO(self)->callback_data, pdata, size, (3003* (30/TMEDIA_CODEC_VIDEO(self)->out.fps)), marker); + if(TMEDIA_CODEC_VIDEO(self)->out.callback){ + TMEDIA_CODEC_VIDEO(self)->out.result.buffer.ptr = pdata; + TMEDIA_CODEC_VIDEO(self)->out.result.buffer.size = size; + TMEDIA_CODEC_VIDEO(self)->out.result.duration = (3003* (30/TMEDIA_CODEC_VIDEO(self)->out.fps)); + TMEDIA_CODEC_VIDEO(self)->out.result.last_chunck = marker; + TMEDIA_CODEC_VIDEO(self)->out.callback(&TMEDIA_CODEC_VIDEO(self)->out.result); } } else if(size > H264_NAL_UNIT_TYPE_HEADER_SIZE){ @@ -333,8 +361,12 @@ void tdav_codec_h264_rtp_callback(struct tdav_codec_h264_common_s *self, const v size -= packet_size; // send data - if(TMEDIA_CODEC_VIDEO(self)->callback){ - TMEDIA_CODEC_VIDEO(self)->callback(TMEDIA_CODEC_VIDEO(self)->callback_data, self->rtp.ptr, (packet_size + H264_FUA_HEADER_SIZE), (3003* (30/TMEDIA_CODEC_VIDEO(self)->out.fps)), (size == 0)); + if(TMEDIA_CODEC_VIDEO(self)->out.callback){ + TMEDIA_CODEC_VIDEO(self)->out.result.buffer.ptr = self->rtp.ptr; + TMEDIA_CODEC_VIDEO(self)->out.result.buffer.size = (packet_size + H264_FUA_HEADER_SIZE); + TMEDIA_CODEC_VIDEO(self)->out.result.duration = (3003* (30/TMEDIA_CODEC_VIDEO(self)->out.fps)); + TMEDIA_CODEC_VIDEO(self)->out.result.last_chunck = (size == 0); + TMEDIA_CODEC_VIDEO(self)->out.callback(&TMEDIA_CODEC_VIDEO(self)->out.result); } } } diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/ilbc/tdav_codec_ilbc.c b/branches/2.0/doubango/tinyDAV/src/codecs/ilbc/tdav_codec_ilbc.c index a7ad700b..b6a8671a 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/ilbc/tdav_codec_ilbc.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/ilbc/tdav_codec_ilbc.c @@ -38,7 +38,7 @@ /* ============ iLBC Plugin interface ================= */ -#define tdav_codec_ilbc_fmtp_set tsk_null +#define tdav_codec_ilbc_set tsk_null static int tdav_codec_ilbc_open(tmedia_codec_t* self) { @@ -157,32 +157,39 @@ static tsk_size_t tdav_codec_ilbc_decode(tmedia_codec_t* self, const void* in_da return out_size; } -static char* tdav_codec_ilbc_fmtp_get(const tmedia_codec_t* codec) +static char* tdav_codec_ilbc_sdp_att_get(const tmedia_codec_t* codec, const char* att_name) { - char* fmtp = tsk_null; - tsk_sprintf(&fmtp, "mode=%d", TDAV_ILBC_MODE); - return fmtp; + if(tsk_striequals(att_name, "fmtp")){ + char* fmtp = tsk_null; + tsk_sprintf(&fmtp, "mode=%d", TDAV_ILBC_MODE); + return fmtp; + } + return tsk_null; } -static tsk_bool_t tdav_codec_ilbc_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) -{ /* RFC 3952 - 5. Mapping To SDP Parameters - - The offer contains the preferred mode of the offerer. The answerer - may agree to that mode by including the same mode in the answer, or - may include a different mode. The resulting mode used by both - parties SHALL be the lower of the bandwidth modes in the offer and - answer. +static tsk_bool_t tdav_codec_ilbc_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) +{ + if(tsk_striequals(att_name, "fmtp")){ + /* RFC 3952 - 5. Mapping To SDP Parameters + + The offer contains the preferred mode of the offerer. The answerer + may agree to that mode by including the same mode in the answer, or + may include a different mode. The resulting mode used by both + parties SHALL be the lower of the bandwidth modes in the offer and + answer. - That is, an offer of "mode=20" receiving an answer of "mode=30" will - result in "mode=30" being used by both participants. Similarly, an - offer of "mode=30" and an answer of "mode=20" will result in - "mode=30" being used by both participants. + That is, an offer of "mode=20" receiving an answer of "mode=30" will + result in "mode=30" being used by both participants. Similarly, an + offer of "mode=30" and an answer of "mode=20" will result in + "mode=30" being used by both participants. - This is important when one end point utilizes a bandwidth constrained - link (e.g., 28.8k modem link or slower), where only the lower frame - size will work. - */ - return tsk_true; // FIXME + This is important when one end point utilizes a bandwidth constrained + link (e.g., 28.8k modem link or slower), where only the lower frame + size will work. + */ + return tsk_true; // FIXME + } + return tsk_true; } @@ -242,13 +249,13 @@ static const tmedia_codec_plugin_def_t tdav_codec_ilbc_plugin_def_s = /* video */ {0}, + tdav_codec_ilbc_set, tdav_codec_ilbc_open, tdav_codec_ilbc_close, tdav_codec_ilbc_encode, tdav_codec_ilbc_decode, - tdav_codec_ilbc_fmtp_match, - tdav_codec_ilbc_fmtp_get, - tdav_codec_ilbc_fmtp_set + tdav_codec_ilbc_sdp_att_match, + tdav_codec_ilbc_sdp_att_get }; const tmedia_codec_plugin_def_t *tdav_codec_ilbc_plugin_def_t = &tdav_codec_ilbc_plugin_def_s; diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/mp4ves/tdav_codec_mp4ves.c b/branches/2.0/doubango/tinyDAV/src/codecs/mp4ves/tdav_codec_mp4ves.c index ef1b59bd..b26584ec 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/mp4ves/tdav_codec_mp4ves.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/mp4ves/tdav_codec_mp4ves.c @@ -39,14 +39,53 @@ #include "tnet_endianness.h" +#include "tinymedia/tmedia_params.h" + #include "tsk_params.h" #include "tsk_memory.h" #include "tsk_debug.h" +#include + #define DEFAULT_PROFILE_LEVEL_ID Simple_Profile_Level_1 +#define MP4V_GOP_SIZE_IN_SECONDS 25 #define MP4V_RTP_PAYLOAD_SIZE 900 +typedef struct tdav_codec_mp4ves_s +{ + TMEDIA_DECLARE_CODEC_VIDEO; + + int profile; + + struct{ + uint8_t* ptr; + tsk_size_t size; + } rtp; + + // Encoder + struct{ + AVCodec* codec; + AVCodecContext* context; + AVFrame* picture; + void* buffer; + tsk_bool_t force_idr; + int quality; // [1-31] + } encoder; + + // decoder + struct{ + AVCodec* codec; + AVCodecContext* context; + AVFrame* picture; + + void* accumulator; + uint8_t ebit; + tsk_size_t accumulator_pos; + uint16_t last_seq; + } decoder; +} +tdav_codec_mp4ves_t; // From ISO-IEC-14496-2 typedef enum mp4v_codes_e @@ -115,7 +154,40 @@ static void tdav_codec_mp4ves_encap(tdav_codec_mp4ves_t* mp4v, const uint8_t* pd static void tdav_codec_mp4ves_rtp_callback(tdav_codec_mp4ves_t *mp4v, const void *data, tsk_size_t size, tsk_bool_t marker); /* ============ MP4V-ES Plugin interface functions ================= */ -#define tdav_codec_mp4ves_fmtp_set tsk_null /* MUST be removed from all codecs */ + +static int tdav_codec_mp4ves_set(tmedia_codec_t* self, const tmedia_param_t* param) +{ + tdav_codec_mp4ves_t* mp4ves = (tdav_codec_mp4ves_t*)self; + if(!self->opened){ + TSK_DEBUG_ERROR("Codec not opened"); + return -1; + } + if(param->value_type == tmedia_pvt_int32){ + if(tsk_striequals(param->key, "action")){ + tmedia_codec_action_t action = (tmedia_codec_action_t)TSK_TO_INT32((uint8_t*)param->value); + switch(action){ + case tmedia_codec_action_encode_idr: + { + mp4ves->encoder.force_idr = tsk_true; + break; + } + case tmedia_codec_action_bw_down: + { + mp4ves->encoder.quality = TSK_CLAMP(1, (mp4ves->encoder.quality + 1), 31); + mp4ves->encoder.context->global_quality = FF_QP2LAMBDA * mp4ves->encoder.quality; + break; + } + case tmedia_codec_action_bw_up: + { + mp4ves->encoder.quality = TSK_CLAMP(1, (mp4ves->encoder.quality - 1), 31); + mp4ves->encoder.context->global_quality = FF_QP2LAMBDA * mp4ves->encoder.quality; + break; + } + } + } + } + return 0; +} int tdav_codec_mp4ves_open(tmedia_codec_t* self) { @@ -149,16 +221,14 @@ int tdav_codec_mp4ves_open(tmedia_codec_t* self) mp4v->encoder.context->mb_decision = FF_MB_DECISION_RD; mp4v->encoder.context->noise_reduction = 250; mp4v->encoder.context->flags |= CODEC_FLAG_QSCALE; - mp4v->encoder.context->global_quality = FF_QP2LAMBDA * tmedia_get_video_qscale(self->bl); + mp4v->encoder.context->global_quality = FF_QP2LAMBDA * mp4v->encoder.quality; - mp4v->encoder.context->thread_count = 1; + mp4v->encoder.context->bit_rate = ((TMEDIA_CODEC_VIDEO(mp4v)->out.width * TMEDIA_CODEC_VIDEO(mp4v)->out.height * 128 / 320 / 240) * 1000); mp4v->encoder.context->rtp_payload_size = MP4V_RTP_PAYLOAD_SIZE; mp4v->encoder.context->opaque = tsk_null; - //mp4v->encoder.context->bit_rate = (int) (bitRate * 0.80f); - //mp4v->encoder.context->bit_rate_tolerance = (int) (bitRate * 0.20f); mp4v->encoder.context->profile = mp4v->profile>>4; mp4v->encoder.context->level = mp4v->profile & 0x0F; - mp4v->encoder.context->gop_size = TMEDIA_CODEC_VIDEO(mp4v)->in.fps*2; // each 2 seconds + mp4v->encoder.context->gop_size = (TMEDIA_CODEC_VIDEO(mp4v)->in.fps * MP4V_GOP_SIZE_IN_SECONDS); mp4v->encoder.context->max_b_frames = 0; mp4v->encoder.context->b_frame_strategy = 1; mp4v->encoder.context->flags |= CODEC_FLAG_AC_PRED; @@ -291,6 +361,13 @@ tsk_size_t tdav_codec_mp4ves_encode(tmedia_codec_t* self, const void* in_data, t return 0; } + if(mp4v->encoder.force_idr){ + mp4v->encoder.picture->pict_type = FF_I_TYPE; + mp4v->encoder.force_idr = tsk_false; + } + else{ + mp4v->encoder.picture->pict_type = 0;// reset + } mp4v->encoder.picture->pts = AV_NOPTS_VALUE; mp4v->encoder.picture->quality = mp4v->encoder.context->global_quality; ret = avcodec_encode_video(mp4v->encoder.context, mp4v->encoder.buffer, size, mp4v->encoder.picture); @@ -357,10 +434,15 @@ tsk_size_t tdav_codec_mp4ves_decode(tmedia_codec_t* self, const void* in_data, t packet.data = mp4v->decoder.accumulator; ret = avcodec_decode_video2(mp4v->decoder.context, mp4v->decoder.picture, &got_picture_ptr, &packet); - if(ret <0 || !got_picture_ptr){ - TSK_DEBUG_WARN("Failed to decode the buffer"); + if(ret < 0){ + TSK_DEBUG_WARN("Failed to decode the buffer with error code = %d", ret); + if(TMEDIA_CODEC_VIDEO(self)->in.callback){ + TMEDIA_CODEC_VIDEO(self)->in.result.type = tmedia_video_decode_result_type_error; + TMEDIA_CODEC_VIDEO(self)->in.result.proto_hdr = proto_hdr; + TMEDIA_CODEC_VIDEO(self)->in.callback(&TMEDIA_CODEC_VIDEO(self)->in.result); + } } - else{ + else if(got_picture_ptr){ retsize = xsize; TMEDIA_CODEC_VIDEO(mp4v)->in.width = mp4v->decoder.context->width; TMEDIA_CODEC_VIDEO(mp4v)->in.height = mp4v->decoder.context->height; @@ -376,9 +458,8 @@ tsk_size_t tdav_codec_mp4ves_decode(tmedia_codec_t* self, const void* in_data, t return retsize; } -tsk_bool_t tdav_codec_mp4ves_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +tsk_bool_t tdav_codec_mp4ves_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { - tsk_params_L_t* params = tsk_null; tdav_codec_mp4ves_t *mp4v = (tdav_codec_mp4ves_t *)codec; if(!mp4v){ @@ -386,52 +467,70 @@ tsk_bool_t tdav_codec_mp4ves_fmtp_match(const tmedia_codec_t* codec, const char* return tsk_false; } - /* e.g. profile-level-id=1; xx=yy */ - if((params = tsk_params_fromstring(fmtp, ";", tsk_true))){ - int val_int; - if((val_int = tsk_params_get_param_value_as_int(params, "profile-level-id")) != -1){ - TSK_DEBUG_INFO("Proposed profile-level-id=%d", val_int); - mp4v->profile = val_int; // FIXME: Take the remote profile-level-id even if the bandwidth level doesn't match + if(tsk_striequals(att_name, "fmtp")){ + tsk_params_L_t* params ; + /* e.g. profile-level-id=1; xx=yy */ + if((params = tsk_params_fromstring(att_value, ";", tsk_true))){ + int val_int; + if((val_int = tsk_params_get_param_value_as_int(params, "profile-level-id")) != -1){ + TSK_DEBUG_INFO("Proposed profile-level-id=%d", val_int); + mp4v->profile = val_int; // FIXME: Take the remote profile-level-id even if the bandwidth level doesn't match + } + TSK_OBJECT_SAFE_FREE(params); + } + + switch (mp4v->profile ) { + case Simple_Profile_Level_1: + TMEDIA_CODEC_VIDEO(mp4v)->out.width = TMEDIA_CODEC_VIDEO(mp4v)->in.width = 176; TMEDIA_CODEC_VIDEO(mp4v)->in.height = TMEDIA_CODEC_VIDEO(mp4v)->out.height = 144; + break; + case Simple_Profile_Level_2: + case Simple_Profile_Level_3: + default: + TMEDIA_CODEC_VIDEO(mp4v)->out.width = TMEDIA_CODEC_VIDEO(mp4v)->in.width = 352; TMEDIA_CODEC_VIDEO(mp4v)->in.height = TMEDIA_CODEC_VIDEO(mp4v)->out.height = 288; + break; } } - - switch (mp4v->profile ) { - case Simple_Profile_Level_1: - TMEDIA_CODEC_VIDEO(mp4v)->out.width = TMEDIA_CODEC_VIDEO(mp4v)->in.width = 176; TMEDIA_CODEC_VIDEO(mp4v)->in.height = TMEDIA_CODEC_VIDEO(mp4v)->out.height = 144; - break; - case Simple_Profile_Level_2: - case Simple_Profile_Level_3: - default: - TMEDIA_CODEC_VIDEO(mp4v)->out.width = TMEDIA_CODEC_VIDEO(mp4v)->in.width = 352; TMEDIA_CODEC_VIDEO(mp4v)->in.height = TMEDIA_CODEC_VIDEO(mp4v)->out.height = 288; - break; + else if(tsk_striequals(att_name, "imageattr")){ + unsigned in_width, in_height, out_width, out_height; + if(tmedia_parse_video_imageattr(att_value, TMEDIA_CODEC_VIDEO(codec)->pref_size, &in_width, &in_height, &out_width, &out_height) != 0){ + return tsk_false; + } + TMEDIA_CODEC_VIDEO(codec)->in.width = in_width; + TMEDIA_CODEC_VIDEO(codec)->in.height = in_height; + TMEDIA_CODEC_VIDEO(codec)->out.width = out_width; + TMEDIA_CODEC_VIDEO(codec)->out.height = out_height; } - TSK_OBJECT_SAFE_FREE(params); - return tsk_true; } -char* tdav_codec_mp4ves_fmtp_get(const tmedia_codec_t* self) +char* tdav_codec_mp4ves_sdp_att_get(const tmedia_codec_t* codec, const char* att_name) { - tdav_codec_mp4ves_t *mp4v = (tdav_codec_mp4ves_t *)self; - char* fmtp = tsk_null; + tdav_codec_mp4ves_t *mp4v = (tdav_codec_mp4ves_t *)codec; - switch(self->bl){ - case tmedia_bl_low: - default: - mp4v->profile = Simple_Profile_Level_1; - break; - case tmedia_bl_medium: - mp4v->profile = Simple_Profile_Level_2; - break; - case tmedia_bl_hight: - case tmedia_bl_unrestricted: - mp4v->profile = Simple_Profile_Level_3; - break; + if(tsk_striequals(att_name, "fmtp")){ + char* fmtp = tsk_null; + switch(codec->bl){//FIXME: deprecated + case tmedia_bl_low: + default: + mp4v->profile = Simple_Profile_Level_1; + break; + case tmedia_bl_medium: + mp4v->profile = Simple_Profile_Level_2; + break; + case tmedia_bl_hight: + case tmedia_bl_unrestricted: + mp4v->profile = Simple_Profile_Level_3; + break; + } + tsk_sprintf(&fmtp, "profile-level-id=%d", mp4v->profile); + return fmtp; } - - tsk_sprintf(&fmtp, "profile-level-id=%d", mp4v->profile); - return fmtp; + else if(tsk_striequals(att_name, "imageattr")){ + return tmedia_get_video_imageattr(TMEDIA_CODEC_VIDEO(codec)->pref_size, + TMEDIA_CODEC_VIDEO(codec)->in.width, TMEDIA_CODEC_VIDEO(codec)->in.height, TMEDIA_CODEC_VIDEO(codec)->out.width, TMEDIA_CODEC_VIDEO(codec)->out.height); + } + return tsk_null; } @@ -557,8 +656,12 @@ last: static void tdav_codec_mp4ves_rtp_callback(tdav_codec_mp4ves_t *mp4v, const void *data, tsk_size_t size, tsk_bool_t marker) { // Send data over the network - if(TMEDIA_CODEC_VIDEO(mp4v)->callback){ - TMEDIA_CODEC_VIDEO(mp4v)->callback(TMEDIA_CODEC_VIDEO(mp4v)->callback_data, data, size, (3003* (30/TMEDIA_CODEC_VIDEO(mp4v)->out.fps)), marker); + if(TMEDIA_CODEC_VIDEO(mp4v)->out.callback){ + TMEDIA_CODEC_VIDEO(mp4v)->out.result.buffer.ptr = data; + TMEDIA_CODEC_VIDEO(mp4v)->out.result.buffer.size = size; + TMEDIA_CODEC_VIDEO(mp4v)->out.result.duration = (3003* (30/TMEDIA_CODEC_VIDEO(mp4v)->out.fps)); + TMEDIA_CODEC_VIDEO(mp4v)->out.result.last_chunck = marker; + TMEDIA_CODEC_VIDEO(mp4v)->out.callback(&TMEDIA_CODEC_VIDEO(mp4v)->out.result); } } @@ -573,6 +676,7 @@ static tsk_object_t* tdav_codec_mp4ves_ctor(tsk_object_t * self, va_list * app) /* init base: called by tmedia_codec_create() */ /* init self */ mp4v->profile = DEFAULT_PROFILE_LEVEL_ID; + mp4v->encoder.quality = 1; } return self; } @@ -616,13 +720,13 @@ static const tmedia_codec_plugin_def_t tdav_codec_mp4ves_plugin_def_s = /* video */ {176, 144, 15}, + tdav_codec_mp4ves_set, tdav_codec_mp4ves_open, tdav_codec_mp4ves_close, tdav_codec_mp4ves_encode, tdav_codec_mp4ves_decode, - tdav_codec_mp4ves_fmtp_match, - tdav_codec_mp4ves_fmtp_get, - tdav_codec_mp4ves_fmtp_set + tdav_codec_mp4ves_sdp_att_match, + tdav_codec_mp4ves_sdp_att_get }; const tmedia_codec_plugin_def_t *tdav_codec_mp4ves_plugin_def_t = &tdav_codec_mp4ves_plugin_def_s; diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/msrp/tdav_codec_msrp.c b/branches/2.0/doubango/tinyDAV/src/codecs/msrp/tdav_codec_msrp.c index b0884ff9..8ff2e27f 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/msrp/tdav_codec_msrp.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/msrp/tdav_codec_msrp.c @@ -36,13 +36,12 @@ /* ============ MSRP Plugin interface ================= */ #define tdav_codec_msrp_open tsk_null #define tdav_codec_msrp_close tsk_null -#define tdav_codec_msrp_fmtp_get tsk_null -#define tdav_codec_msrp_fmtp_get tsk_null -#define tdav_codec_msrp_fmtp_set tsk_null +#define tdav_codec_msrp_sdp_att_get tsk_null +#define tdav_codec_msrp_sdp_att_get tsk_null #define tdav_codec_msrp_encode tsk_null #define tdav_codec_msrp_decode tsk_null -static tsk_bool_t tdav_codec_msrp_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +static tsk_bool_t tdav_codec_msrp_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { /* always match */ return tsk_true; } @@ -99,12 +98,12 @@ static const tmedia_codec_plugin_def_t tdav_codec_msrp_plugin_def_s = /* video */ {0}, + tsk_null, // set() tdav_codec_msrp_open, tdav_codec_msrp_close, tdav_codec_msrp_encode, tdav_codec_msrp_decode, - tdav_codec_msrp_fmtp_match, - tdav_codec_msrp_fmtp_get, - tdav_codec_msrp_fmtp_set + tdav_codec_msrp_sdp_att_match, + tdav_codec_msrp_sdp_att_get }; const tmedia_codec_plugin_def_t *tdav_codec_msrp_plugin_def_t = &tdav_codec_msrp_plugin_def_s; diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/speex/tdav_codec_speex.c b/branches/2.0/doubango/tinyDAV/src/codecs/speex/tdav_codec_speex.c index da84d9f9..1c32e8bd 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/speex/tdav_codec_speex.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/speex/tdav_codec_speex.c @@ -43,8 +43,6 @@ int tdav_codec_speex_deinit(tdav_codec_speex_t* self); /* ============ iLBC Plugin interface ================= */ -#define tdav_codec_speex_fmtp_set tsk_null - int tdav_codec_speex_open(tmedia_codec_t* self) { static int quality = SPEEX_DEFAULT_QUALITY; @@ -69,18 +67,15 @@ int tdav_codec_speex_open(tmedia_codec_t* self) } speex_decoder_ctl(speex->decoder.state, SPEEX_GET_FRAME_SIZE, &speex->decoder.size); - speex->decoder.size = (speex->decoder.size ? speex->decoder.size : SPEEX_BUFFER_MAX_SIZE) * sizeof(spx_int16_t); + speex->decoder.size *= sizeof(spx_int16_t); if(!(speex->decoder.buffer = tsk_calloc(speex->decoder.size, 1))){ - speex->decoder.size = 0; + speex->decoder.size = speex->decoder.size = 0; TSK_DEBUG_ERROR("Failed to allocate new buffer"); return -3; } speex_encoder_ctl(speex->encoder.state, SPEEX_SET_QUALITY, &quality); speex_encoder_ctl(speex->encoder.state, SPEEX_GET_FRAME_SIZE, &speex->encoder.size); - if(!speex->encoder.size){ - speex->encoder.size = SPEEX_BUFFER_MAX_SIZE; - } speex_bits_init(&speex->encoder.bits); speex_bits_init(&speex->decoder.bits); @@ -122,7 +117,7 @@ tsk_size_t tdav_codec_speex_encode(tmedia_codec_t* self, const void* in_data, ts } } - outsize = speex_bits_write(&speex->encoder.bits, *out_data, speex->encoder.size); + outsize = speex_bits_write(&speex->encoder.bits, *out_data, speex->encoder.size/2); return outsize; } @@ -138,11 +133,11 @@ tsk_size_t tdav_codec_speex_decode(tmedia_codec_t* self, const void* in_data, ts return 0; } - /* initializes the bit-stream */ + // initializes the bit-stream speex_bits_read_from(&speex->decoder.bits, (char*)in_data, in_size); do{ - /* performs decode() */ + // performs decode() if((ret = speex_decode_int(speex->decoder.state, &speex->decoder.bits, speex->decoder.buffer))){ TSK_DEBUG_ERROR("Failed to decode the buffer. retcode=%d", ret); break; @@ -158,7 +153,7 @@ tsk_size_t tdav_codec_speex_decode(tmedia_codec_t* self, const void* in_data, ts } } - /* copy output buffer */ + // copy output buffer memcpy(&((uint8_t*)*out_data)[out_size], speex->decoder.buffer, speex->decoder.size); out_size += speex->decoder.size; } @@ -168,12 +163,12 @@ tsk_size_t tdav_codec_speex_decode(tmedia_codec_t* self, const void* in_data, ts return out_size; } -char* tdav_codec_speex_fmtp_get(const tmedia_codec_t* codec) +char* tdav_codec_speex_sdp_att_get(const tmedia_codec_t* codec, const char* att_name) { return tsk_null; } -tsk_bool_t tdav_codec_speex_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +tsk_bool_t tdav_codec_speex_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { return tsk_true; } @@ -229,13 +224,13 @@ tsk_bool_t tdav_codec_speex_fmtp_match(const tmedia_codec_t* codec, const char* /* video */ \ {0}, \ \ + tsk_null, /* set()*/ \ tdav_codec_speex_open, \ tdav_codec_speex_close, \ tdav_codec_speex_encode, \ tdav_codec_speex_decode, \ - tdav_codec_speex_fmtp_match, \ - tdav_codec_speex_fmtp_get, \ - tdav_codec_speex_fmtp_set \ + tdav_codec_speex_sdp_att_match, \ + tdav_codec_speex_sdp_att_get \ }; \ const tmedia_codec_plugin_def_t *tdav_codec_speex_##mode##_plugin_def_t = &tdav_codec_speex_##mode##_plugin_def_s; diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/theora/tdav_codec_theora.c b/branches/2.0/doubango/tinyDAV/src/codecs/theora/tdav_codec_theora.c index 4086249a..1f1652ce 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/theora/tdav_codec_theora.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/theora/tdav_codec_theora.c @@ -36,17 +36,64 @@ #include "tinyrtp/rtp/trtp_rtp_packet.h" +#include "tinymedia/tmedia_params.h" + +#include "tsk_buffer.h" #include "tsk_time.h" #include "tsk_params.h" #include "tsk_memory.h" #include "tsk_debug.h" +#include + #define THEORA_RTP_PAYLOAD_SIZE 900 +#define THEORA_GOP_SIZE_IN_SECONDS 25 #define THEORA_PAYLOAD_HEADER_SIZE 4 /* 2.2. Payload Header */ #define THEORA_PAYLOAD_LENGTH_SIZE 2 /* 2.2. Payload Header */ #define THEORA_IDENT_HEADER_SIZE 42 /* 6.2 Identification Header Decode */ #define THEORA_CONF_SEND_COUNT 10 /* at 250ms, 500ms, 1000ms, .... */ +typedef struct tdav_codec_theora_s +{ + TMEDIA_DECLARE_CODEC_VIDEO; + + struct{ + uint8_t* ptr; + tsk_size_t size; + } rtp; + + // Encoder + struct{ + AVCodec* codec; + AVCodecContext* context; + AVFrame* picture; + void* buffer; + + uint64_t conf_last; + int conf_count; + tsk_bool_t force_idr; + int quality; + } encoder; + + // decoder + struct{ + AVCodec* codec; + AVCodecContext* context; + AVFrame* picture; + + tsk_bool_t opened; + uint8_t conf_ident[3]; + tsk_buffer_t* conf_pkt; + + void* accumulator; + uint8_t ebit; + tsk_size_t accumulator_pos; + uint16_t last_seq; + } decoder; +} +tdav_codec_theora_t; + + /* 2.2. Payload Header filed 'F'*/ typedef enum theora_frag_type_e{ Not_Fragmented = 0, @@ -72,7 +119,39 @@ static void tdav_codec_theora_encap(tdav_codec_theora_t* theora, const uint8_t* /* ============ Theora Plugin interface functions ================= */ -#define tdav_codec_theora_fmtp_set tsk_null +static int tdav_codec_theora_set(tmedia_codec_t* self, const tmedia_param_t* param) +{ + tdav_codec_theora_t* theora = (tdav_codec_theora_t*)self; + if(!self->opened){ + TSK_DEBUG_ERROR("Codec not opened"); + return -1; + } + if(param->value_type == tmedia_pvt_int32){ + if(tsk_striequals(param->key, "action")){ + tmedia_codec_action_t action = (tmedia_codec_action_t)TSK_TO_INT32((uint8_t*)param->value); + switch(action){ + case tmedia_codec_action_encode_idr: + { + theora->encoder.force_idr = tsk_true; + break; + } + case tmedia_codec_action_bw_down: + { + theora->encoder.quality = TSK_CLAMP(1, (theora->encoder.quality + 1), 31); + theora->encoder.context->global_quality = FF_QP2LAMBDA * theora->encoder.quality; + break; + } + case tmedia_codec_action_bw_up: + { + theora->encoder.quality = TSK_CLAMP(1, (theora->encoder.quality - 1), 31); + theora->encoder.context->global_quality = FF_QP2LAMBDA * theora->encoder.quality; + break; + } + } + } + } + return 0; +} int tdav_codec_theora_open(tmedia_codec_t* self) { @@ -104,32 +183,17 @@ int tdav_codec_theora_open(tmedia_codec_t* self) theora->encoder.context->time_base.den = TMEDIA_CODEC_VIDEO(theora)->out.fps; theora->encoder.context->width = TMEDIA_CODEC_VIDEO(theora)->out.width; theora->encoder.context->height = TMEDIA_CODEC_VIDEO(theora)->out.height; - theora->encoder.context->mb_decision = FF_MB_DECISION_RD; // Theoraenc doesn't honor 'CODEC_FLAG_QSCALE' - switch(self->bl){ - case tmedia_bl_low: - default: - bitRate = 72000.f; - break; - case tmedia_bl_medium: - bitRate = 150000.f; - break; - case tmedia_bl_hight: - bitRate = 320000.f; - break; - case tmedia_bl_unrestricted: - bitRate = 510000.f; - break; - } + theora->encoder.context->bit_rate = ((TMEDIA_CODEC_VIDEO(theora)->out.width * TMEDIA_CODEC_VIDEO(theora)->out.height * 128 / 320 / 240) * 1000); + theora->encoder.context->rc_lookahead = 0; + theora->encoder.context->global_quality = FF_QP2LAMBDA * theora->encoder.quality; - theora->encoder.context->thread_count = 1; + theora->encoder.context->thread_count = 0; theora->encoder.context->rtp_payload_size = THEORA_RTP_PAYLOAD_SIZE; theora->encoder.context->opaque = tsk_null; - theora->encoder.context->bit_rate = (int) (bitRate * 0.80f); - theora->encoder.context->bit_rate_tolerance = (int) (bitRate * 0.20f); - theora->encoder.context->gop_size = TMEDIA_CODEC_VIDEO(theora)->out.fps*2; // each 2 seconds + theora->encoder.context->gop_size = (TMEDIA_CODEC_VIDEO(theora)->out.fps * THEORA_GOP_SIZE_IN_SECONDS); // Picture (YUV 420) if(!(theora->encoder.picture = avcodec_alloc_frame())){ @@ -263,9 +327,15 @@ tsk_size_t tdav_codec_theora_encode(tmedia_codec_t* self, const void* in_data, t } // Encode data - //theora->encoder.picture->pts = tsk_time_now(); + if(theora->encoder.force_idr){ + theora->encoder.picture->pict_type = FF_I_TYPE; + theora->encoder.force_idr = tsk_false; + } + else{ + theora->encoder.picture->pict_type = 0;// reset + } theora->encoder.picture->pts = AV_NOPTS_VALUE; - //theora->encoder.picture->pict_type = FF_I_TYPE; + theora->encoder.picture->quality = theora->encoder.context->global_quality; ret = avcodec_encode_video(theora->encoder.context, theora->encoder.buffer, size, theora->encoder.picture); if(ret > 0){ tdav_codec_theora_encap(theora, theora->encoder.buffer, (tsk_size_t)ret); @@ -354,10 +424,15 @@ tsk_size_t tdav_codec_theora_decode(tmedia_codec_t* self, const void* in_data, t packet.data = theora->decoder.accumulator; ret = avcodec_decode_video2(theora->decoder.context, theora->decoder.picture, &got_picture_ptr, &packet); - if(ret <0 || !got_picture_ptr){ - TSK_DEBUG_WARN("Failed to decode the buffer"); + if(ret < 0){ + TSK_DEBUG_WARN("Failed to decode the buffer with error code = %d", ret); + if(TMEDIA_CODEC_VIDEO(self)->in.callback){ + TMEDIA_CODEC_VIDEO(self)->in.result.type = tmedia_video_decode_result_type_error; + TMEDIA_CODEC_VIDEO(self)->in.result.proto_hdr = proto_hdr; + TMEDIA_CODEC_VIDEO(self)->in.callback(&TMEDIA_CODEC_VIDEO(self)->in.result); + } } - else{ + else if(got_picture_ptr){ retsize = xsize; TMEDIA_CODEC_VIDEO(theora)->in.width = theora->decoder.context->width; TMEDIA_CODEC_VIDEO(theora)->in.height = theora->decoder.context->height; @@ -479,57 +554,55 @@ tsk_size_t tdav_codec_theora_decode(tmedia_codec_t* self, const void* in_data, t return retsize; } -tsk_bool_t tdav_codec_theora_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +tsk_bool_t tdav_codec_theora_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { tsk_bool_t ret = tsk_true; // accept decoding any size - tsk_params_L_t* params = tsk_null; tmedia_codec_video_t* theora = (tmedia_codec_video_t*)codec; - if((params = tsk_params_fromstring(fmtp, ";", tsk_true))){ - int width = tsk_params_get_param_value_as_int(params, "width"); - int height = tsk_params_get_param_value_as_int(params, "height"); - - // Set Encoding size - switch(codec->bl){ - case tmedia_bl_low: - default: - if(width<=176 && height<=144){ - theora->in.width = theora->out.width = width; theora->in.height = theora->out.height = height; + if(tsk_striequals(att_name, "fmtp")){ + tsk_params_L_t* params; + if((params = tsk_params_fromstring(att_value, ";", tsk_true))){ + int pref_width, pref_height; + int prop_width = tsk_params_get_param_value_as_int(params, "width"); + int prop_height = tsk_params_get_param_value_as_int(params, "height"); + + if(prop_width > 0 && prop_height > 0){ + if(tmedia_video_get_size(TMEDIA_CODEC_VIDEO(codec)->pref_size, (unsigned *)&pref_width, (unsigned *)&pref_height) != 0){ + TSK_OBJECT_SAFE_FREE(params); + return tsk_false; } - else{ - theora->in.width = theora->out.width = 176; theora->in.height = theora->out.height = 144; - } - break; - - case tmedia_bl_medium: - case tmedia_bl_hight: - case tmedia_bl_unrestricted: - if(width<=352 && height<=288){ - theora->in.width = theora->out.width = width; theora->in.height = theora->out.height = height; - } - else{ - theora->in.width = theora->out.width = 352; theora->in.height = theora->out.height = 288; - } - break; + TMEDIA_CODEC_VIDEO(codec)->in.width = TMEDIA_CODEC_VIDEO(codec)->out.width = TSK_MIN(pref_width, prop_width); + TMEDIA_CODEC_VIDEO(codec)->in.height = TMEDIA_CODEC_VIDEO(codec)->out.height = TSK_MIN(pref_height, prop_height); + } + TSK_OBJECT_SAFE_FREE(params); } } - TSK_OBJECT_SAFE_FREE(params); + else if(tsk_striequals(att_name, "imageattr")){ + unsigned in_width, in_height, out_width, out_height; + if(tmedia_parse_video_imageattr(att_value, TMEDIA_CODEC_VIDEO(codec)->pref_size, &in_width, &in_height, &out_width, &out_height) != 0){ + return tsk_false; + } + TMEDIA_CODEC_VIDEO(codec)->in.width = in_width; + TMEDIA_CODEC_VIDEO(codec)->in.height = in_height; + TMEDIA_CODEC_VIDEO(codec)->out.width = out_width; + TMEDIA_CODEC_VIDEO(codec)->out.height = out_height; + } return ret; } -char* tdav_codec_theora_fmtp_get(const tmedia_codec_t* self) +char* tdav_codec_theora_sdp_att_get(const tmedia_codec_t* codec, const char* att_name) { - switch(self->bl){ - case tmedia_bl_low: - default: - return tsk_strdup("sampling=YCbCr-4:2:0; width=176; height=144"); - break; - case tmedia_bl_medium: - case tmedia_bl_hight: - return tsk_strdup("sampling=YCbCr-4:2:0; width=352; height=288"); - break; + if(tsk_striequals(att_name, "fmtp")){ + char* fmtp = tsk_null; + tsk_sprintf(&fmtp, "sampling=YCbCr-4:2:0; width=%u; height=%u", TMEDIA_CODEC_VIDEO(codec)->out.width, TMEDIA_CODEC_VIDEO(codec)->out.height); + return fmtp; } + else if(tsk_striequals(att_name, "imageattr")){ + return tmedia_get_video_imageattr(TMEDIA_CODEC_VIDEO(codec)->pref_size, + TMEDIA_CODEC_VIDEO(codec)->in.width, TMEDIA_CODEC_VIDEO(codec)->in.height, TMEDIA_CODEC_VIDEO(codec)->out.width, TMEDIA_CODEC_VIDEO(codec)->out.height); + } + return tsk_null; } @@ -541,7 +614,7 @@ static tsk_object_t* tdav_codec_theora_ctor(tsk_object_t * self, va_list * app) if(theora){ /* init base: called by tmedia_codec_create() */ /* init self */ - //TSK_OBJECT_SAFE_FREE(theora->conf_data); + theora->encoder.quality = 1; } return self; } @@ -586,13 +659,13 @@ static const tmedia_codec_plugin_def_t tdav_codec_theora_plugin_def_s = /* video */ {176, 144, 15}, + tdav_codec_theora_set, tdav_codec_theora_open, tdav_codec_theora_close, tdav_codec_theora_encode, tdav_codec_theora_decode, - tdav_codec_theora_fmtp_match, - tdav_codec_theora_fmtp_get, - tdav_codec_theora_fmtp_set + tdav_codec_theora_sdp_att_match, + tdav_codec_theora_sdp_att_get }; const tmedia_codec_plugin_def_t *tdav_codec_theora_plugin_def_t = &tdav_codec_theora_plugin_def_s; @@ -698,8 +771,12 @@ int tdav_codec_theora_send(tdav_codec_theora_t* self, const uint8_t* data, tsk_s size -= pay_size; // Send data over the network - if(TMEDIA_CODEC_VIDEO(self)->callback){ - TMEDIA_CODEC_VIDEO(self)->callback(TMEDIA_CODEC_VIDEO(self)->callback_data, self->rtp.ptr, (pay_size + sizeof(pay_hdr)), (3003* (30/TMEDIA_CODEC_VIDEO(self)->out.fps)), (size == 0)); + if(TMEDIA_CODEC_VIDEO(self)->out.callback){ + TMEDIA_CODEC_VIDEO(self)->out.result.buffer.ptr = self->rtp.ptr; + TMEDIA_CODEC_VIDEO(self)->out.result.buffer.size = (pay_size + sizeof(pay_hdr)); + TMEDIA_CODEC_VIDEO(self)->out.result.duration = (3003* (30/TMEDIA_CODEC_VIDEO(self)->out.fps)); + TMEDIA_CODEC_VIDEO(self)->out.result.last_chunck = (size == 0); + TMEDIA_CODEC_VIDEO(self)->out.callback(&TMEDIA_CODEC_VIDEO(self)->out.result); } } diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/vpx/tdav_codec_vp8.c b/branches/2.0/doubango/tinyDAV/src/codecs/vpx/tdav_codec_vp8.c index 9e335562..72157807 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/vpx/tdav_codec_vp8.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/vpx/tdav_codec_vp8.c @@ -38,13 +38,15 @@ #include "tinyrtp/rtp/trtp_rtp_packet.h" +#include "tinymedia/tmedia_params.h" + #include "tsk_memory.h" #include "tsk_time.h" #include "tsk_debug.h" -#define TDAV_VP8_PAY_DESC_SIZE 1 /* |X|R|N|S|PartID| */ +#define TDAV_VP8_PAY_DESC_SIZE 4 #define TDAV_SYSTEM_CORES_COUNT 0 -#define TDAV_VP8_GOP_SIZE_IN_SECONDS 5 +#define TDAV_VP8_GOP_SIZE_IN_SECONDS 25 #define TDAV_VP8_RTP_PAYLOAD_MAX_SIZE 1050 #if !defined(TDAV_VP8_MAX_BANDWIDTH_KB) # define TDAV_VP8_MAX_BANDWIDTH_KB 6000 @@ -53,6 +55,44 @@ # define TDAV_VP8_MIN_BANDWIDTH_KB 100 #endif +/* VP8 codec */ +typedef struct tdav_codec_vp8_s +{ + TMEDIA_DECLARE_CODEC_VIDEO; + + // Encoder + struct{ + vpx_codec_enc_cfg_t cfg; + tsk_bool_t initialized; + vpx_codec_pts_t pts; + vpx_codec_ctx_t context; + uint16_t pic_id; + uint64_t frame_count; + tsk_bool_t force_idr; + uint32_t target_bitrate; + + struct{ + uint8_t* ptr; + tsk_size_t size; + } rtp; + } encoder; + + // decoder + struct{ + vpx_codec_dec_cfg_t cfg; + unsigned initialized:1; + vpx_codec_ctx_t context; + void* accumulator; + tsk_size_t accumulator_pos; + tsk_size_t accumulator_size; + uint16_t last_seq; + unsigned last_PartID:4; + unsigned last_S:1; + unsigned last_N:1; + } decoder; +} +tdav_codec_vp8_t; + #define vp8_interface_enc (vpx_codec_vp8_cx()) #define vp8_interface_dec (vpx_codec_vp8_dx()) @@ -61,12 +101,52 @@ static void tdav_codec_vp8_rtp_callback(tdav_codec_vp8_t *self, const void *data /* ============ VP8 Plugin interface ================= */ +static int tdav_codec_vp8_set(tmedia_codec_t* self, const tmedia_param_t* param) +{ + tdav_codec_vp8_t* vp8 = (tdav_codec_vp8_t*)self; + if(!vp8->encoder.initialized){ + TSK_DEBUG_ERROR("Codec not initialized"); + return -1; + } + if(param->value_type == tmedia_pvt_int32){ + if(tsk_striequals(param->key, "action")){ + tmedia_codec_action_t action = (tmedia_codec_action_t)TSK_TO_INT32((uint8_t*)param->value); + tsk_bool_t reconf = tsk_false; + switch(action){ + case tmedia_codec_action_encode_idr: + { + vp8->encoder.force_idr = tsk_true; + break; + } + case tmedia_codec_action_bw_down: + { + vp8->encoder.cfg.rc_target_bitrate = ((vp8->encoder.cfg.rc_target_bitrate << 1) / 3); + reconf = tsk_true; + break; + } + case tmedia_codec_action_bw_up: + { + vp8->encoder.cfg.rc_target_bitrate = ((vp8->encoder.cfg.rc_target_bitrate * 3) >> 1); + reconf = tsk_true; + break; + } + } + + if(reconf){ + vpx_codec_err_t vpx_ret = vpx_codec_enc_config_set(&vp8->encoder.context, &vp8->encoder.cfg); + if(vpx_ret != VPX_CODEC_OK){ + TSK_DEBUG_ERROR("vpx_codec_enc_config_set failed with error =%s", vpx_codec_err_to_string(vpx_ret)); + } + } + } + } + return 0; +} + static int tdav_codec_vp8_open(tmedia_codec_t* self) { tdav_codec_vp8_t* vp8 = (tdav_codec_vp8_t*)self; - vpx_codec_enc_cfg_t enc_cfg; - vpx_codec_dec_cfg_t dec_cfg; vpx_codec_caps_t dec_caps; vpx_enc_frame_flags_t enc_flags; vpx_codec_flags_t dec_flags = 0; @@ -84,44 +164,42 @@ static int tdav_codec_vp8_open(tmedia_codec_t* self) // // Encoder // - if((vpx_ret = vpx_codec_enc_config_default(vp8_interface_enc, &enc_cfg, 0)) != VPX_CODEC_OK){ + if((vpx_ret = vpx_codec_enc_config_default(vp8_interface_enc, &vp8->encoder.cfg, 0)) != VPX_CODEC_OK){ TSK_DEBUG_ERROR("vpx_codec_enc_config_default failed with error =%s", vpx_codec_err_to_string(vpx_ret)); return -2; } - enc_cfg.g_timebase.num = 1; - enc_cfg.g_timebase.den = TMEDIA_CODEC_VIDEO(vp8)->out.fps; - enc_cfg.rc_target_bitrate = TMEDIA_CODEC_VIDEO(vp8)->out.width * TMEDIA_CODEC_VIDEO(vp8)->out.height * enc_cfg.rc_target_bitrate - / enc_cfg.g_w / enc_cfg.g_h; - enc_cfg.rc_target_bitrate = TSK_CLAMP(TDAV_VP8_MIN_BANDWIDTH_KB, enc_cfg.rc_target_bitrate>>=0, TDAV_VP8_MAX_BANDWIDTH_KB); - enc_cfg.rc_end_usage = VPX_CBR; - enc_cfg.g_w = TMEDIA_CODEC_VIDEO(vp8)->out.width; - enc_cfg.g_h = TMEDIA_CODEC_VIDEO(vp8)->out.height; - enc_cfg.kf_mode = VPX_KF_DISABLED; - enc_cfg.g_error_resilient = VPX_ERROR_RESILIENT_DEFAULT; - enc_cfg.g_lag_in_frames = 0; + vp8->encoder.cfg.g_timebase.num = 1; + vp8->encoder.cfg.g_timebase.den = TMEDIA_CODEC_VIDEO(vp8)->out.fps; + vp8->encoder.cfg.rc_target_bitrate = vp8->encoder.target_bitrate = (TMEDIA_CODEC_VIDEO(vp8)->out.width * TMEDIA_CODEC_VIDEO(vp8)->out.height * 128 / 320 / 240); + vp8->encoder.cfg.rc_end_usage = VPX_CBR; + vp8->encoder.cfg.g_w = TMEDIA_CODEC_VIDEO(vp8)->out.width; + vp8->encoder.cfg.g_h = TMEDIA_CODEC_VIDEO(vp8)->out.height; + vp8->encoder.cfg.kf_mode = VPX_KF_AUTO; + vp8->encoder.cfg.kf_min_dist = vp8->encoder.cfg.kf_max_dist = (TDAV_VP8_GOP_SIZE_IN_SECONDS * TMEDIA_CODEC_VIDEO(vp8)->out.fps); + //--vp8->encoder.cfg.g_error_resilient = VPX_ERROR_RESILIENT_DEFAULT; + vp8->encoder.cfg.g_lag_in_frames = 0; #if TDAV_UNDER_WINDOWS { SYSTEM_INFO SystemInfo; GetSystemInfo(&SystemInfo); - enc_cfg.g_threads = SystemInfo.dwNumberOfProcessors; + vp8->encoder.cfg.g_threads = SystemInfo.dwNumberOfProcessors; } #else - enc_cfg.g_threads = TDAV_SYSTEM_CORES_COUNT; + vp8->encoder.cfg.g_threads = TDAV_SYSTEM_CORES_COUNT; #endif - enc_cfg.g_pass = VPX_RC_ONE_PASS; - enc_cfg.rc_min_quantizer = TSK_CLAMP(enc_cfg.rc_min_quantizer, 10, enc_cfg.rc_max_quantizer); - enc_cfg.rc_max_quantizer = TSK_CLAMP(enc_cfg.rc_min_quantizer, 51, enc_cfg.rc_max_quantizer); - enc_cfg.rc_resize_allowed = 0; - //enc_cfg.g_profile = 1; + vp8->encoder.cfg.g_pass = VPX_RC_ONE_PASS; + vp8->encoder.cfg.rc_min_quantizer = 0;//TSK_CLAMP(vp8->encoder.cfg.rc_min_quantizer, 10, vp8->encoder.cfg.rc_max_quantizer); + vp8->encoder.cfg.rc_max_quantizer = 63;//TSK_CLAMP(vp8->encoder.cfg.rc_min_quantizer, 51, vp8->encoder.cfg.rc_max_quantizer); + //vp8->encoder.cfg.rc_resize_allowed = 0; + vp8->encoder.cfg.g_profile = 0; enc_flags = 0; //VPX_EFLAG_XXX - if((vpx_ret = vpx_codec_enc_init(&vp8->encoder.context, vp8_interface_enc, &enc_cfg, enc_flags)) != VPX_CODEC_OK){ + if((vpx_ret = vpx_codec_enc_init(&vp8->encoder.context, vp8_interface_enc, &vp8->encoder.cfg, enc_flags)) != VPX_CODEC_OK){ TSK_DEBUG_ERROR("vpx_codec_enc_init failed with error =%s", vpx_codec_err_to_string(vpx_ret)); return -3; } vp8->encoder.pic_id = (rand() ^ rand()) % 0x7FFF; - vp8->encoder.gop_size = TDAV_VP8_GOP_SIZE_IN_SECONDS * TMEDIA_CODEC_VIDEO(vp8)->out.fps; vp8->encoder.initialized = tsk_true; //vpx_codec_control(&vp8->encoder.context, VP8E_SET_CPUUSED, 0); @@ -133,27 +211,25 @@ static int tdav_codec_vp8_open(tmedia_codec_t* self) // // Decoder // - dec_cfg.w = TMEDIA_CODEC_VIDEO(vp8)->out.width; - dec_cfg.h = TMEDIA_CODEC_VIDEO(vp8)->out.height; + vp8->decoder.cfg.w = TMEDIA_CODEC_VIDEO(vp8)->out.width; + vp8->decoder.cfg.h = TMEDIA_CODEC_VIDEO(vp8)->out.height; #if TDAV_UNDER_WINDOWS { SYSTEM_INFO SystemInfo; GetSystemInfo(&SystemInfo); - dec_cfg.threads = SystemInfo.dwNumberOfProcessors; + vp8->decoder.cfg.threads = SystemInfo.dwNumberOfProcessors; } -#else - dec_cfg.threads = TDAV_SYSTEM_CORES_COUNT; #endif dec_caps = vpx_codec_get_caps(&vpx_codec_vp8_dx_algo); if(dec_caps & VPX_CODEC_CAP_POSTPROC){ dec_flags |= VPX_CODEC_USE_POSTPROC; } - if(dec_caps & VPX_CODEC_CAP_ERROR_CONCEALMENT){ - dec_flags |= VPX_CODEC_USE_ERROR_CONCEALMENT; - } + //--if(dec_caps & VPX_CODEC_CAP_ERROR_CONCEALMENT){ + //-- dec_flags |= VPX_CODEC_USE_ERROR_CONCEALMENT; + //--} - if((vpx_ret = vpx_codec_dec_init(&vp8->decoder.context, vp8_interface_dec, &dec_cfg, dec_flags)) != VPX_CODEC_OK){ + if((vpx_ret = vpx_codec_dec_init(&vp8->decoder.context, vp8_interface_dec, &vp8->decoder.cfg, dec_flags)) != VPX_CODEC_OK){ TSK_DEBUG_ERROR("vpx_codec_dec_init failed with error =%s", vpx_codec_err_to_string(vpx_ret)); return -4; } @@ -219,8 +295,9 @@ static tsk_size_t tdav_codec_vp8_encode(tmedia_codec_t* self, const void* in_dat // encode data ++vp8->encoder.pts; - if(vp8->encoder.frame_count == 0 || (vp8->encoder.frame_count % vp8->encoder.gop_size) == 0){ + if(vp8->encoder.force_idr){ flags |= VPX_EFLAG_FORCE_KF; + vp8->encoder.force_idr = tsk_false; } if((vpx_ret = vpx_codec_encode(&vp8->encoder.context, &image, vp8->encoder.pts, 1, flags, VPX_DL_REALTIME)) != VPX_CODEC_OK){ TSK_DEBUG_ERROR("vpx_codec_encode failed with error =%s", vpx_codec_err_to_string(vpx_ret)); @@ -229,6 +306,7 @@ static tsk_size_t tdav_codec_vp8_encode(tmedia_codec_t* self, const void* in_dat } ++vp8->encoder.frame_count; + ++vp8->encoder.pic_id; while((pkt = vpx_codec_get_cx_data(&vp8->encoder.context, &iter))){ switch(pkt->kind){ @@ -249,7 +327,6 @@ static tsk_size_t tdav_codec_vp8_encode(tmedia_codec_t* self, const void* in_dat } vpx_img_free(&image); - return 0; } @@ -258,63 +335,70 @@ static tsk_size_t tdav_codec_vp8_decode(tmedia_codec_t* self, const void* in_dat tdav_codec_vp8_t* vp8 = (tdav_codec_vp8_t*)self; const trtp_rtp_header_t* rtp_hdr = proto_hdr; const uint8_t* pdata = in_data; + const uint8_t* pdata_end = (pdata + in_size); tsk_size_t ret = 0; - uint8_t X, R, N, S, PartID; // |X|R|N|S|PartID| - static tsk_size_t xmax_size = (1920 * 1080 * 3) >> 3; + static const tsk_size_t xmax_size = (1920 * 1080 * 3) >> 3; if(!self || !in_data || in_size<1 || !out_data || !vp8->decoder.initialized){ TSK_DEBUG_ERROR("Invalid parameter"); return 0; } - - X = (*pdata & 0x80)>>7; - R = (*pdata & 0x40)>>6; - if(R){ - TSK_DEBUG_ERROR("R<>0"); - return 0; - } - N = (*pdata & 0x20)>>5; - S = (*pdata & 0x10)>>4; - PartID = (*pdata & 0x0F); - // skip "REQUIRED" header - ++pdata, --in_size; - // check "OPTIONAL" headers - if(X){ - tsk_size_t size_to_skip = 0; - // X: |I|L|T| RSV-A | - if(*pdata & 0x80){//I - ++size_to_skip;// PictureID, not used yet + + { /* 4.2. VP8 Payload Descriptor */ + uint8_t X, R, N, S, I, L, T, K, PartID;//FIXME: store + + X = (*pdata & 0x80)>>7; + R = (*pdata & 0x40)>>6; + if(R){ + TSK_DEBUG_ERROR("R<>0"); + return 0; } - if(*pdata & 0x40){//L - ++size_to_skip;//TL0PICIDX, not used yet - } - if(*pdata & 0x20){//T - ++size_to_skip;//TID and RSV-B, not used yet - } - if(in_size<=size_to_skip){ - TSK_DEBUG_ERROR("Too short"); - goto bail; + N = (*pdata & 0x20)>>5; + S = (*pdata & 0x10)>>4; + PartID = (*pdata & 0x0F); + // skip "REQUIRED" header + if(++pdata >= pdata_end){ TSK_DEBUG_ERROR("Too short"); goto bail; } + // check "OPTIONAL" headers + if(X){ + I = (*pdata & 0x80); + L = (*pdata & 0x40); + T = (*pdata & 0x20); + K = (*pdata & 0x10); + if(++pdata >= pdata_end){ TSK_DEBUG_ERROR("Too short"); goto bail; } + + if(I){ + if(*pdata & 0x80){ // M + // PictureID on 16bits + if((pdata += 2) >= pdata_end){ TSK_DEBUG_ERROR("Too short"); goto bail; } + } + else{ + // PictureID on 8bits + if(++pdata >= pdata_end){ TSK_DEBUG_ERROR("Too short"); goto bail; } + } + } + if(L){ + if(++pdata >= pdata_end){ TSK_DEBUG_ERROR("Too short"); goto bail; } + } + if(T || K){ + if(++pdata >= pdata_end){ TSK_DEBUG_ERROR("Too short"); goto bail; } + } } } + in_size = (pdata_end - pdata); + // Packet lost? - if(vp8->decoder.last_seq != (rtp_hdr->seq_num - 1) && vp8->decoder.last_seq){ - if(vp8->decoder.last_seq == rtp_hdr->seq_num){ - // Could happen on some stupid emulators - TSK_DEBUG_INFO("Packet duplicated, seq_num=%d", rtp_hdr->seq_num); - goto bail; - } - TSK_DEBUG_INFO("Packet lost, seq_num=%d", rtp_hdr->seq_num); - vp8->decoder.frame_corrupted = tsk_true; + if(vp8->decoder.last_seq && (vp8->decoder.last_seq + 1) != rtp_hdr->seq_num){ + TSK_DEBUG_INFO("Packet lost, seq_num=%d", (vp8->decoder.last_seq + 1)); } vp8->decoder.last_seq = rtp_hdr->seq_num; + if(in_size > xmax_size){ + TSK_DEBUG_ERROR("%u too big to contain valid encoded data. xmax_size=%u", in_size, xmax_size); + goto bail; + } // start-accumulator if(!vp8->decoder.accumulator){ - if(in_size > xmax_size){ - TSK_DEBUG_ERROR("%u too big to contain valid encoded data. xmax_size=%u", in_size, xmax_size); - goto bail; - } if(!(vp8->decoder.accumulator = tsk_calloc(in_size, sizeof(uint8_t)))){ TSK_DEBUG_ERROR("Failed to allocated new buffer"); goto bail; @@ -347,11 +431,13 @@ static tsk_size_t tdav_codec_vp8_decode(tmedia_codec_t* self, const void* in_dat vpx_image_t *img; vpx_codec_iter_t iter = tsk_null; vpx_codec_err_t vpx_ret; - tsk_size_t pay_size = vp8->decoder.accumulator_pos; + const uint8_t* pay_ptr = (const uint8_t*)vp8->decoder.accumulator; + const tsk_size_t pay_size = vp8->decoder.accumulator_pos; // in all cases: reset accumulator vp8->decoder.accumulator_pos = 0; +#if 0 /* http://groups.google.com/a/webmproject.org/group/apps-devel/browse_thread/thread/c84438e70fe122fa/2dfc322018aa22a8 */ // libvpx will crash very ofen when the frame is corrupted => for now we decided not to decode such frame // according to the latest release there is a function to check if the frame // is corrupted or not => To be checked @@ -359,11 +445,17 @@ static tsk_size_t tdav_codec_vp8_decode(tmedia_codec_t* self, const void* in_dat vp8->decoder.frame_corrupted = tsk_false; goto bail; } - - vpx_ret = vpx_codec_decode(&vp8->decoder.context, vp8->decoder.accumulator, pay_size, tsk_null, 0); +#endif + + vpx_ret = vpx_codec_decode(&vp8->decoder.context, pay_ptr, pay_size, tsk_null, 0); if(vpx_ret != VPX_CODEC_OK){ TSK_DEBUG_ERROR("vpx_codec_decode failed with error =%s", vpx_codec_err_to_string(vpx_ret)); + if(TMEDIA_CODEC_VIDEO(self)->in.callback){ + TMEDIA_CODEC_VIDEO(self)->in.result.type = tmedia_video_decode_result_type_error; + TMEDIA_CODEC_VIDEO(self)->in.result.proto_hdr = proto_hdr; + TMEDIA_CODEC_VIDEO(self)->in.callback(&TMEDIA_CODEC_VIDEO(self)->in.result); + } goto bail; } @@ -371,20 +463,21 @@ static tsk_size_t tdav_codec_vp8_decode(tmedia_codec_t* self, const void* in_dat ret = 0; while((img = vpx_codec_get_frame(&vp8->decoder.context, &iter))){ unsigned int plane, y; + tsk_size_t xsize; // update sizes TMEDIA_CODEC_VIDEO(vp8)->in.width = img->d_w; TMEDIA_CODEC_VIDEO(vp8)->in.height = img->d_h; - xmax_size = (TMEDIA_CODEC_VIDEO(vp8)->in.width * TMEDIA_CODEC_VIDEO(vp8)->in.height * 3) >> 1; + xsize = (TMEDIA_CODEC_VIDEO(vp8)->in.width * TMEDIA_CODEC_VIDEO(vp8)->in.height * 3) >> 1; // allocate destination buffer - if(*out_max_size decoder.accumulator_pos = 0; *out_max_size = 0; goto bail; } - *out_max_size = xmax_size; + *out_max_size = xsize; } #if !HAVE_FFMPEG// convert flip use FFmpeg @@ -413,47 +506,54 @@ static tsk_size_t tdav_codec_vp8_decode(tmedia_codec_t* self, const void* in_dat bail: - vp8->decoder.last_PartID = PartID; - vp8->decoder.last_S = S; - vp8->decoder.last_N = N; +// vp8->decoder.last_PartID = PartID; +// vp8->decoder.last_S = S; +// vp8->decoder.last_N = N; return ret; } -static tsk_bool_t tdav_codec_vp8_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +static tsk_bool_t tdav_codec_vp8_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { - unsigned width, height, fps; - - if(tmedia_parse_video_fmtp(fmtp, codec->bl, &width, &height, &fps)){ - TSK_DEBUG_ERROR("Failed to match fmtp=%s", fmtp); - return tsk_false; +#if 0 + if(tsk_striequals(att_name, "fmtp")){ + unsigned width, height, fps; + if(tmedia_parse_video_fmtp(att_value, TMEDIA_CODEC_VIDEO(codec)->pref_size, &width, &height, &fps)){ + TSK_DEBUG_ERROR("Failed to match fmtp=%s", att_value); + return tsk_false; + } + TMEDIA_CODEC_VIDEO(codec)->in.width = TMEDIA_CODEC_VIDEO(codec)->out.width = width; + TMEDIA_CODEC_VIDEO(codec)->in.height = TMEDIA_CODEC_VIDEO(codec)->out.height = height; + TMEDIA_CODEC_VIDEO(codec)->in.fps = TMEDIA_CODEC_VIDEO(codec)->out.fps = fps; + } + else +#endif + if(tsk_striequals(att_name, "imageattr")){ + unsigned in_width, in_height, out_width, out_height; + if(tmedia_parse_video_imageattr(att_value, TMEDIA_CODEC_VIDEO(codec)->pref_size, &in_width, &in_height, &out_width, &out_height) != 0){ + return tsk_false; + } + TMEDIA_CODEC_VIDEO(codec)->in.width = in_width; + TMEDIA_CODEC_VIDEO(codec)->in.height = in_height; + TMEDIA_CODEC_VIDEO(codec)->out.width = out_width; + TMEDIA_CODEC_VIDEO(codec)->out.height = out_height; } - - TMEDIA_CODEC_VIDEO(codec)->in.width = TMEDIA_CODEC_VIDEO(codec)->out.width = width; - TMEDIA_CODEC_VIDEO(codec)->in.height = TMEDIA_CODEC_VIDEO(codec)->out.height = height; - TMEDIA_CODEC_VIDEO(codec)->in.fps = TMEDIA_CODEC_VIDEO(codec)->out.fps = fps; return tsk_true; } -static char* tdav_codec_vp8_fmtp_get(const tmedia_codec_t* self) +static char* tdav_codec_vp8_sdp_att_get(const tmedia_codec_t* codec, const char* att_name) { - switch(self->bl){ - case tmedia_bl_low: - default: - return tsk_strdup("QCIF=2;SQCIF=2"); - break; - case tmedia_bl_medium: - case tmedia_bl_hight: - case tmedia_bl_unrestricted: - return tsk_strdup("CIF=2;QCIF=2;SQCIF=2"); - break; +#if 0 + if(tsk_striequals(att_name, "fmtp")){ + return tmedia_get_video_fmtp(TMEDIA_CODEC_VIDEO(codec)->pref_size); } -} - -static int tdav_codec_vp8_fmtp_set(tmedia_codec_t* self, const char* fmtp) -{ - TSK_DEBUG_INFO("remote fmtp=%s", fmtp); - return 0; + else +#endif + if(tsk_striequals(att_name, "imageattr")){ + return tmedia_get_video_imageattr(TMEDIA_CODEC_VIDEO(codec)->pref_size, + TMEDIA_CODEC_VIDEO(codec)->in.width, TMEDIA_CODEC_VIDEO(codec)->in.height, TMEDIA_CODEC_VIDEO(codec)->out.width, TMEDIA_CODEC_VIDEO(codec)->out.height); + } + return tsk_null; } /* ============ VP8 object definition ================= */ @@ -523,13 +623,13 @@ static const tmedia_codec_plugin_def_t tdav_codec_vp8_plugin_def_s = /* video (defaul width,height,fps) */ {176, 144, 15}, + tdav_codec_vp8_set, tdav_codec_vp8_open, tdav_codec_vp8_close, tdav_codec_vp8_encode, tdav_codec_vp8_decode, - tdav_codec_vp8_fmtp_match, - tdav_codec_vp8_fmtp_get, - tdav_codec_vp8_fmtp_set + tdav_codec_vp8_sdp_att_match, + tdav_codec_vp8_sdp_att_get }; const tmedia_codec_plugin_def_t *tdav_codec_vp8_plugin_def_t = &tdav_codec_vp8_plugin_def_s; @@ -553,7 +653,7 @@ static void tdav_codec_vp8_encap(tdav_codec_vp8_t* self, const vpx_codec_cx_pkt_ is_keyframe = (pkt->data.frame.flags & VPX_FRAME_IS_KEY); // check P bit validity - if((is_keyframe && (*frame_ptr & 0x01)) || (!is_keyframe && !(*frame_ptr & 0x01))){// 4.2. VP8 Payload Header + if((is_keyframe && (*frame_ptr & 0x01)) || (!is_keyframe && !(*frame_ptr & 0x01))){// 4.3. VP8 Payload Header TSK_DEBUG_ERROR("Invalid payload header"); return; } @@ -583,6 +683,7 @@ static void tdav_codec_vp8_encap(tdav_codec_vp8_t* self, const vpx_codec_cx_pkt_ #endif // second,third,... partitions (or fragment if part_size > TDAV_VP8_RTP_PAYLOAD_MAX_SIZE) + // FIXME: low FEC part_start = tsk_true; while(indexencoder.rtp.ptr[0] = (partID & 0x0F) // PartID - | (non_ref << 5) & 0x20 // N - | (part_start << 4) &0x10 // S + | ((part_start << 4) & 0x10)// S + | ((non_ref << 5) & 0x20) // N + // R = 0 + | (0x80) // X=1 ; + // X: |I|L|T|K| RSV | + self->encoder.rtp.ptr[1] = 0x80; // I = 1, L = 0, T = 0, K = 0, RSV = 0 + // I: |M| PictureID | + self->encoder.rtp.ptr[2] = (0x80 | (self->encoder.pic_id >> 9)); // M = 1 (PictureID on 15 bits) + self->encoder.rtp.ptr[3] = (self->encoder.pic_id & 0xFF); /* 4.2. VP8 Payload Header */ if(has_hdr){ @@ -679,8 +785,12 @@ static void tdav_codec_vp8_rtp_callback(tdav_codec_vp8_t *self, const void *data } // Send data over the network - if(TMEDIA_CODEC_VIDEO(self)->callback){ - TMEDIA_CODEC_VIDEO(self)->callback(TMEDIA_CODEC_VIDEO(self)->callback_data, self->encoder.rtp.ptr, (size + TDAV_VP8_PAY_DESC_SIZE), (3003* (30/TMEDIA_CODEC_VIDEO(self)->out.fps)), last); + if(TMEDIA_CODEC_VIDEO(self)->out.callback){ + TMEDIA_CODEC_VIDEO(self)->out.result.buffer.ptr = self->encoder.rtp.ptr; + TMEDIA_CODEC_VIDEO(self)->out.result.buffer.size = (size + TDAV_VP8_PAY_DESC_SIZE); + TMEDIA_CODEC_VIDEO(self)->out.result.duration = (3003* (30/TMEDIA_CODEC_VIDEO(self)->out.fps)); + TMEDIA_CODEC_VIDEO(self)->out.result.last_chunck = last; + TMEDIA_CODEC_VIDEO(self)->out.callback(&TMEDIA_CODEC_VIDEO(self)->out.result); } } diff --git a/branches/2.0/doubango/tinyDAV/src/tdav.c b/branches/2.0/doubango/tinyDAV/src/tdav.c index cb5972d0..5013b22c 100644 --- a/branches/2.0/doubango/tinyDAV/src/tdav.c +++ b/branches/2.0/doubango/tinyDAV/src/tdav.c @@ -45,6 +45,8 @@ // Codecs #include "tinydav/codecs/dtmf/tdav_codec_dtmf.h" +#include "tinydav/codecs/fec/tdav_codec_ulpfec.h" +#include "tinydav/codecs/fec/tdav_codec_red.h" #include "tinydav/codecs/msrp/tdav_codec_msrp.h" #include "tinydav/codecs/amr/tdav_codec_amr.h" #include "tinydav/codecs/bv/tdav_codec_bv16.h" @@ -183,8 +185,10 @@ int tdav_init() #if HAVE_G729 tmedia_codec_plugin_register(tdav_codec_g729ab_plugin_def_t); #endif - // last: dtmf + // last: dtmf, ULPFEC and RED tmedia_codec_plugin_register(tdav_codec_dtmf_plugin_def_t); + // tmedia_codec_plugin_register(tdav_codec_ulpfec_plugin_def_t); + // tmedia_codec_plugin_register(tdav_codec_red_plugin_def_t); #if HAVE_LIBVPX tmedia_codec_plugin_register(tdav_codec_vp8_plugin_def_t); @@ -199,9 +203,8 @@ int tdav_init() #if HAVE_FFMPEG tmedia_codec_plugin_register(tdav_codec_mp4ves_plugin_def_t); # if !defined(HAVE_H264) || HAVE_H264 - tmedia_codec_plugin_register(tdav_codec_h264_bp10_plugin_def_t); - tmedia_codec_plugin_register(tdav_codec_h264_bp20_plugin_def_t); - tmedia_codec_plugin_register(tdav_codec_h264_bp30_plugin_def_t); + tmedia_codec_plugin_register(tdav_codec_h264_base_plugin_def_t); + tmedia_codec_plugin_register(tdav_codec_h264_main_plugin_def_t); # endif tmedia_codec_plugin_register(tdav_codec_h263p_plugin_def_t); tmedia_codec_plugin_register(tdav_codec_h263pp_plugin_def_t); @@ -318,9 +321,8 @@ static tdav_codec_decl_t __codecs[] = { #endif #if HAVE_FFMPEG # if (!defined(HAVE_H264) || HAVE_H264) || HAVE_CUDA - { tdav_codec_id_h264_bp30, &tdav_codec_h264_bp30_plugin_def_t }, - { tdav_codec_id_h264_bp20, &tdav_codec_h264_bp20_plugin_def_t }, - { tdav_codec_id_h264_bp10, &tdav_codec_h264_bp10_plugin_def_t }, + { tdav_codec_id_h264_bp, &tdav_codec_h264_base_plugin_def_t }, + { tdav_codec_id_h264_mp, &tdav_codec_h264_main_plugin_def_t }, # endif { tdav_codec_id_mp4ves_es, &tdav_codec_mp4ves_plugin_def_t }, { tdav_codec_id_h263p, &tdav_codec_h263p_plugin_def_t }, @@ -460,9 +462,8 @@ tsk_bool_t _tdav_codec_is_supported(tdav_codec_id_t codec, const tmedia_codec_pl return tsk_false; #endif - case tdav_codec_id_h264_bp10: - case tdav_codec_id_h264_bp20: - case tdav_codec_id_h264_bp30: + case tdav_codec_id_h264_bp: + case tdav_codec_id_h264_mp: { if(plugin){ #if HAVE_CUDA @@ -523,6 +524,8 @@ int tdav_deinit() /* === UnRegister codecs === */ tmedia_codec_plugin_unregister(tdav_codec_dtmf_plugin_def_t); + tmedia_codec_plugin_unregister(tdav_codec_ulpfec_plugin_def_t); + tmedia_codec_plugin_unregister(tdav_codec_red_plugin_def_t); tmedia_codec_plugin_unregister(tdav_codec_msrp_plugin_def_t); tmedia_codec_plugin_unregister(tdav_codec_g711a_plugin_def_t); tmedia_codec_plugin_unregister(tdav_codec_g711u_plugin_def_t); @@ -566,9 +569,8 @@ int tdav_deinit() tmedia_codec_plugin_unregister(tdav_codec_h263p_plugin_def_t); tmedia_codec_plugin_unregister(tdav_codec_h263pp_plugin_def_t); # if !defined(HAVE_H264) || HAVE_H264 - tmedia_codec_plugin_unregister(tdav_codec_h264_bp10_plugin_def_t); - tmedia_codec_plugin_unregister(tdav_codec_h264_bp20_plugin_def_t); - tmedia_codec_plugin_unregister(tdav_codec_h264_bp30_plugin_def_t); + tmedia_codec_plugin_unregister(tdav_codec_h264_base_plugin_def_t); + tmedia_codec_plugin_unregister(tdav_codec_h264_main_plugin_def_t); # endif # if !defined(HAVE_THEORA) || HAVE_THEORA tmedia_codec_plugin_unregister(tdav_codec_theora_plugin_def_t); diff --git a/branches/2.0/doubango/tinyDAV/src/tdav_session_av.c b/branches/2.0/doubango/tinyDAV/src/tdav_session_av.c new file mode 100644 index 00000000..0dba2e38 --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/src/tdav_session_av.c @@ -0,0 +1,778 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tdav_session_av.c + * @brief Audio/Video base Session plugin + * + * @author Mamadou Diop + */ +#include "tinydav/tdav_session_av.h" +#include "tinydav/codecs/dtmf/tdav_codec_dtmf.h" +#include "tinydav/codecs/fec/tdav_codec_red.h" +#include "tinydav/codecs/fec/tdav_codec_ulpfec.h" + +#include "tinyrtp/trtp_manager.h" +#include "tinyrtp/rtp/trtp_rtp_packet.h" + +#include "ice/tnet_ice_ctx.h" +#include "ice/tnet_ice_candidate.h" + +#include "tinymedia/tmedia_consumer.h" +#include "tinymedia/tmedia_producer.h" +#include "tinymedia/tmedia_defaults.h" + +#define TDAV_IS_DTMF_CODEC(codec) (TMEDIA_CODEC((codec))->plugin == tdav_codec_dtmf_plugin_def_t) +#define TDAV_IS_ULPFEC_CODEC(codec) (TMEDIA_CODEC((codec))->plugin == tdav_codec_ulpfec_plugin_def_t) +#define TDAV_IS_RED_CODEC(codec) (TMEDIA_CODEC((codec))->plugin == tdav_codec_red_plugin_def_t) + +int tdav_session_av_init(tdav_session_av_t* self, tsk_bool_t is_audio) +{ + uint64_t session_id; + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + /* base::init(): called by tmedia_session_create() */ + + self->media_type = is_audio ? tmedia_audio : tmedia_video; + self->use_rtcp = tsk_true; // FIXME: for now RTCP is always on, use "session_set('use-rtcp');" + self->use_rtcp_mux = tsk_true; + self->use_avpf = tsk_false; // negotiate + + tsk_safeobj_init(self); + + // session id + if(!(session_id = TMEDIA_SESSION(self)->id)){ // set the session id if not already done + TMEDIA_SESSION(self)->id = session_id = tmedia_session_get_unique_id(); + } + // consumer + TSK_OBJECT_SAFE_FREE(self->consumer); + if(!(self->consumer = tmedia_consumer_create(self->media_type, session_id))){ + TSK_DEBUG_ERROR("Failed to create %s consumer", is_audio ? "audio" : "video"); + } + // producer + TSK_OBJECT_SAFE_FREE(self->producer); + if(!(self->producer = tmedia_producer_create(self->media_type, session_id))){ + TSK_DEBUG_ERROR("Failed to create %s producer", is_audio ? "audio" : "video"); + } + +#if HAVE_SRTP + // This is the default value and can be updated by the user using "session_set('srtp-mode', mode_e)" + self->srtp_mode = tmedia_defaults_get_srtp_mode(); + self->use_srtp = (self->srtp_mode == tmedia_srtp_mode_mandatory); // if optional -> negotiate +#endif + return 0; +} + +tsk_bool_t tdav_session_av_set(tdav_session_av_t* self, const tmedia_param_t* param) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_false; + } + + if(param->plugin_type == tmedia_ppt_consumer && self->consumer){ + return (tmedia_consumer_set(self->consumer, param) == 0); + } + else if(param->plugin_type == tmedia_ppt_producer && self->producer){ + return tmedia_producer_set(self->producer, param); + } + else if(param->plugin_type == tmedia_ppt_session){ + if(param->value_type == tmedia_pvt_pchar){ + if(tsk_striequals(param->key, "remote-ip")){ + if(param->value){ + tsk_strupdate(&self->remote_ip, param->value); + return tsk_true; + } + } + else if(tsk_striequals(param->key, "local-ip")){ + tsk_strupdate(&self->local_ip, param->value); + return tsk_true; + } + else if(tsk_striequals(param->key, "local-ipver")){ + self->use_ipv6 = tsk_striequals(param->value, "ipv6"); + return tsk_true; + } + } + else if(param->value_type == tmedia_pvt_int32){ + if(tsk_striequals(param->key, "srtp-mode")){ +#if HAVE_SRTP + self->srtp_mode = (tmedia_srtp_mode_t)TSK_TO_INT32((uint8_t*)param->value); + return tsk_true; +#endif + } + else if(tsk_striequals(param->key, "rtcp-enabled")){ + self->use_rtcp = (TSK_TO_INT32((uint8_t*)param->value) != 0); + return tsk_true; + } + else if(tsk_striequals(param->key, "avpf-enabled")){ + self->use_avpf = (TSK_TO_INT32((uint8_t*)param->value) != 0); + return tsk_true; + } + } + else if(param->value_type == tmedia_pvt_pobject){ + if(tsk_striequals(param->key, "natt-ctx")){ + TSK_OBJECT_SAFE_FREE(self->natt_ctx); + self->natt_ctx = tsk_object_ref(param->value); + return tsk_true; + } + else if(tsk_striequals(param->key, "ice-ctx")){ + TSK_OBJECT_SAFE_FREE(self->ice_ctx); + self->ice_ctx = tsk_object_ref(param->value); + return tsk_true; + } + } + } + + return tsk_false; +} + +tsk_bool_t tdav_session_av_get(tdav_session_av_t* self, tmedia_param_t* param) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_false; + } + + if(param->plugin_type == tmedia_ppt_session){ + if(param->value_type == tmedia_pvt_int32){ + if(tsk_striequals(param->key, "srtp-enabled")){ +#if HAVE_SRTP + if(self->rtp_manager){ + ((int8_t*)param->value)[0] = self->use_srtp ? 1 : 0; + return tsk_true; + } +#endif + } + } + } + + return tsk_false; +} + +int tdav_session_av_prepare(tdav_session_av_t* self) +{ + int ret = 0; + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + /* set local port */ + if(!self->rtp_manager){ + self->rtp_manager = self->ice_ctx ? trtp_manager_create_2(self->ice_ctx) + : trtp_manager_create(self->use_rtcp, self->local_ip, self->use_ipv6); + if(self->rtp_manager){ + ret = trtp_manager_set_port_range(self->rtp_manager, tmedia_defaults_get_rtp_port_range_start(), tmedia_defaults_get_rtp_port_range_stop()); + self->rtp_manager->use_rtcp = self->use_rtcp; + ret = trtp_manager_prepare(self->rtp_manager); + if(self->natt_ctx){ + ret = trtp_manager_set_natt_ctx(self->rtp_manager, self->natt_ctx); + } + } + } + + /* SRTP */ +#if HAVE_SRTP + { + if(self->remote_srtp_neg.pending){ + char* str = tsk_null; + self->remote_srtp_neg.pending = tsk_false; + tsk_sprintf(&str, "%d %s inline:%s", self->remote_srtp_neg.tag, trtp_srtp_crypto_type_strings[self->remote_srtp_neg.crypto_type], self->remote_srtp_neg.key); + trtp_srtp_set_remote(self->rtp_manager, str); + TSK_FREE(str); + } + } +#endif + + /* Consumer will be prepared in tdav_session_audio_start() */ + /* Producer will be prepared in tdav_session_audio_start() */ + + return ret; +} + +int tdav_session_av_start(tdav_session_av_t* self, const tmedia_codec_t* best_codec) +{ + if(!self || !best_codec){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if(self->rtp_manager){ + int ret; + /* RTP/RTCP manager: use latest information. */ + + // these information will be updated when the RTP manager starts if ICE is enabled + ret = trtp_manager_set_rtp_remote(self->rtp_manager, self->remote_ip, self->remote_port); + ret = trtp_manager_set_payload_type(self->rtp_manager, best_codec->neg_format ? atoi(best_codec->neg_format) : atoi(best_codec->format)); + self->rtp_manager->use_rtcp_mux = self->use_rtcp_mux; //FIXME: use "set_rtcp_mux()" + ret = trtp_manager_start(self->rtp_manager); + + // because of AudioUnit under iOS => prepare both consumer and producer then start() at the same time + /* prepare consumer and producer */ + if(self->producer) ret = tmedia_producer_prepare(self->producer, best_codec); + if(self->consumer) ret = tmedia_consumer_prepare(self->consumer, best_codec); + + /* start consumer and producer */ + if(self->consumer) ret = tmedia_consumer_start(self->consumer); + if(self->producer) ret = tmedia_producer_start(self->producer); + + // not that the RTP manager is activated check that SRTP is correctly activated + self->use_srtp = trtp_srtp_is_active(self->rtp_manager); + + return ret; + } + else{ + TSK_DEBUG_ERROR("Invalid RTP/RTCP manager"); + return -3; + } + + return 0; +} + +int tdav_session_av_stop(tdav_session_av_t* self) +{ + tmedia_codec_t* codec; + tsk_list_item_t* item; + int ret = 0; + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + /* Consumer */ + if(self->consumer){ + ret = tmedia_consumer_stop(self->consumer); + } + /* Producer */ + if(self->producer){ + ret = tmedia_producer_stop(self->producer); + } + + /* RTP/RTCP manager */ + if(self->rtp_manager){ + ret = trtp_manager_stop(self->rtp_manager); + } + + /* close codecs to force open() for next start (e.g SIP UPDATE with SDP) */ + if(TMEDIA_SESSION(self)->neg_codecs){ + tsk_list_foreach(item, TMEDIA_SESSION(self)->neg_codecs){ + if(!(codec = TMEDIA_CODEC(item->data))){ + continue; + } + ret = tmedia_codec_close(codec); + } + } + + return ret; +} + +int tdav_session_av_pause(tdav_session_av_t* self) +{ + int ret = 0; + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + /* Consumer */ + if(self->consumer){ + ret = tmedia_consumer_pause(self->consumer); + } + /* Producer */ + if(self->producer){ + ret = tmedia_producer_pause(self->producer); + } + + return ret; +} + +const tsdp_header_M_t* tdav_session_av_get_lo(tdav_session_av_t* self, tsk_bool_t *updated) +{ + tmedia_session_t* base = TMEDIA_SESSION(self); + tsk_bool_t have_libsrtp = tsk_false; + + if(!base || !base->plugin || !updated){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + *updated = tsk_false; +#if HAVE_SRTP + have_libsrtp = tsk_true; +#endif + + if(!self->rtp_manager || (!self->ice_ctx && !self->rtp_manager->transport)){ + TSK_DEBUG_ERROR("RTP/RTCP manager in invalid"); + return tsk_null; + } + + if(base->ro_changed && base->M.lo){ + /* Codecs */ + tsdp_header_A_removeAll_by_field(base->M.lo->Attributes, "fmtp"); + tsdp_header_A_removeAll_by_field(base->M.lo->Attributes, "rtpmap"); + tsk_list_clear_items(base->M.lo->FMTs); + + /* QoS */ + tsdp_header_A_removeAll_by_field(base->M.lo->Attributes, "curr"); + tsdp_header_A_removeAll_by_field(base->M.lo->Attributes, "des"); + tsdp_header_A_removeAll_by_field(base->M.lo->Attributes, "conf"); + + /* SRTP */ + tsdp_header_A_removeAll_by_field(base->M.lo->Attributes, "crypto"); + + /* ICE */ + tsdp_header_A_removeAll_by_field(base->M.lo->Attributes, "candidate"); + tsdp_header_A_removeAll_by_field(base->M.lo->Attributes, "candidate"); + tsdp_header_A_removeAll_by_field(base->M.lo->Attributes, "ice-ufrag"); + tsdp_header_A_removeAll_by_field(base->M.lo->Attributes, "ice-pwd"); + + /* SDPCapNeg */ + tsdp_header_A_removeAll_by_field(base->M.lo->Attributes, "tcap"); + tsdp_header_A_removeAll_by_field(base->M.lo->Attributes, "acap"); + tsdp_header_A_removeAll_by_field(base->M.lo->Attributes, "pcfg"); + + // Others + tsdp_header_A_removeAll_by_field(base->M.lo->Attributes, "mid"); + tsdp_header_A_removeAll_by_field(base->M.lo->Attributes, "rtcp-mux"); + tsdp_header_A_removeAll_by_field(base->M.lo->Attributes, "ssrc"); + } + + *updated = (base->ro_changed || !base->M.lo); + + if(!base->M.lo){ + if((base->M.lo = tsdp_header_M_create(base->plugin->media, self->rtp_manager->rtp.public_port, "RTP/AVP"))){ + /* If NATT is active, do not rely on the global IP address Connection line */ + if(self->natt_ctx){ + tsdp_header_M_add_headers(base->M.lo, + TSDP_HEADER_C_VA_ARGS("IN", self->use_ipv6 ? "IP6" : "IP4", self->rtp_manager->rtp.public_ip), + tsk_null); + } + /* 3GPP TS 24.229 - 6.1.1 General + In order to support accurate bandwidth calculations, the UE may include the "a=ptime" attribute for all "audio" media + lines as described in RFC 4566 [39]. If a UE receives an "audio" media line with "a=ptime" specified, the UE should + transmit at the specified packetization rate. If a UE receives an "audio" media line which does not have "a=ptime" + specified or the UE does not support the "a=ptime" attribute, the UE should transmit at the default codec packetization + rate as defined in RFC 3551 [55A]. The UE will transmit consistent with the resources available from the network. + + For "video" and "audio" media types that utilize the RTP/RTCP, the UE shall specify the proposed bandwidth for each + media stream utilizing the "b=" media descriptor and the "AS" bandwidth modifier in the SDP. + + The UE shall include the MIME subtype "telephone-event" in the "m=" media descriptor in the SDP for audio media + flows that support both audio codec and DTMF payloads in RTP packets as described in RFC 4733 [23]. + */ + if(self->media_type == tmedia_audio){ + tsdp_header_M_add_headers(base->M.lo, + TSDP_HEADER_A_VA_ARGS("ptime", "20"), + tsk_null); + // the "telephone-event" fmt/rtpmap is added below + } + } + else{ + TSK_DEBUG_ERROR("Failed to create lo"); + return tsk_null; + } + } + + if(*updated){ + tmedia_codecs_L_t* neg_codecs = tsk_null; + + if(base->M.ro){ + TSK_OBJECT_SAFE_FREE(base->neg_codecs); + /* update negociated codecs */ + if((neg_codecs = tmedia_session_match_codec(base, base->M.ro))){ + base->neg_codecs = neg_codecs; + } + /* from codecs to sdp */ + if(TSK_LIST_IS_EMPTY(base->neg_codecs) || ((base->neg_codecs->tail == base->neg_codecs->head) && TDAV_IS_DTMF_CODEC(TSK_LIST_FIRST_DATA(base->neg_codecs)))){ + base->M.lo->port = 0; /* Keep the RTP transport and reuse it when we receive a reINVITE or UPDATE request */ + goto DONE; + } + else{ + tmedia_codec_to_sdp(base->neg_codecs, base->M.lo); + } + } + else{ + /* from codecs to sdp */ + tmedia_codec_to_sdp(base->codecs, base->M.lo); + } + + /* SDPCapNeg: RFC 5939 */ + { + if(base->M.ro){ + self->use_avpf = (tsk_striequals(base->M.ro->proto, "RTP/AVPF") || tsk_striequals(base->M.ro->proto, "RTP/SAVPF")); + if(!self->use_avpf){ + if(self->sdp_neg.remote_best_pcfg.t_proto){ + self->use_avpf = (tsk_striequals(self->sdp_neg.remote_best_pcfg.t_proto, "RTP/AVPF") || tsk_striequals(self->sdp_neg.remote_best_pcfg.t_proto, "RTP/SAVPF")); + } + } + if(self->sdp_neg.remote_best_pcfg.t_proto){ + // Any supported proto -> response with "a=acfg" + if(self->use_avpf/* AVPF,SAVPF */ || tsk_striequals(self->sdp_neg.remote_best_pcfg.t_proto, "RTP/AVP") || tsk_striequals(self->sdp_neg.remote_best_pcfg.t_proto, "RTP/SAVP")){ + char *str_acfg = tsk_null; + tsk_sprintf(&str_acfg, "%d t=%d", self->sdp_neg.remote_best_pcfg.tag, self->sdp_neg.remote_best_pcfg.t_tag); + tsdp_header_M_add_headers(base->M.lo, + TSDP_HEADER_A_VA_ARGS("acfg", str_acfg), + tsk_null); + TSK_FREE(str_acfg); + } + } + } + else{ + if(!self->use_avpf){ // only negotiate if not already using AVPF + tsk_bool_t enable_srtp = (have_libsrtp && (self->srtp_mode == tmedia_srtp_mode_mandatory || self->srtp_mode == tmedia_srtp_mode_optional)); + // "a=acap:1 crypto" is not included because most of SIP client don't support RFC 5939 + // "a=crypto" is always used to indicate optional support for SRTP + tsdp_header_M_add_headers(base->M.lo, + TSDP_HEADER_A_VA_ARGS("tcap", enable_srtp ? "1 RTP/SAVPF" : "1 RTP/AVPF"), + TSDP_HEADER_A_VA_ARGS("pcfg", "1 t=1"), + tsk_null); + } + } + } + + /* Hold/Resume */ + tsdp_header_M_set_holdresume_att(base->M.lo, base->lo_held, base->ro_held); + + /* SRTP */ +#if HAVE_SRTP + { + tsk_bool_t is_srtp_remote_mandatory = (base->M.ro && (tsk_striequals(base->M.ro->proto, "RTP/SAVP") || tsk_striequals(base->M.ro->proto, "RTP/SAVPF"))); + tsk_bool_t is_srtp_remote_optional = (base->M.ro && (tsdp_header_M_findA(base->M.ro, "crypto") != tsk_null)); + if((self->srtp_mode == tmedia_srtp_mode_optional && (is_srtp_remote_optional || is_srtp_remote_mandatory || !base->M.ro)) || self->srtp_mode == tmedia_srtp_mode_mandatory){ + const trtp_srtp_ctx_xt *ctx = tsk_null; + tsk_size_t ctx_count = 0, ctx_idx; + char* str = tsk_null; + // local + trtp_srtp_get_ctx_local(self->rtp_manager, &ctx, &ctx_count); + for(ctx_idx = 0; ctx_idx < ctx_count; ++ctx_idx){ + tsk_sprintf(&str, "%d %s inline:%s", ctx[ctx_idx].tag, trtp_srtp_crypto_type_strings[ctx[ctx_idx].crypto_type], ctx[ctx_idx].key_str); + tsdp_header_M_add_headers(base->M.lo, + TSDP_HEADER_A_VA_ARGS("crypto", str), + tsk_null); + TSK_FREE(str); + } + } + + if(is_srtp_remote_mandatory || (self->srtp_mode == tmedia_srtp_mode_mandatory) || trtp_srtp_is_initialized(self->rtp_manager)){ + self->use_srtp = tsk_true; + } + } +#endif + + /* Update Proto*/ + tsk_strupdate(&base->M.lo->proto, + self->use_srtp ? (self->use_avpf ? "RTP/SAVPF" : "RTP/SAVP") : (self->use_avpf ? "RTP/AVPF" : "RTP/AVP") + ); + + // RFC 5761: RTCP/RTP muxing + if(self->use_rtcp_mux){ + tsdp_header_M_add_headers(base->M.lo, TSDP_HEADER_A_VA_ARGS("rtcp-mux", tsk_null), tsk_null); + } + + // draft-lennox-mmusic-sdp-source-attributes-01 + { + char* str = tsk_null; + tsk_sprintf(&str, "%u cname:%s", self->rtp_manager->rtp.ssrc, "ldjWoB60jbyQlR6e"); + tsdp_header_M_add_headers(base->M.lo, TSDP_HEADER_A_VA_ARGS("ssrc", str), tsk_null); + tsk_sprintf(&str, "%u mslabel:%s", self->rtp_manager->rtp.ssrc, "6994f7d1-6ce9-4fbd-acfd-84e5131ca2e2"); + tsdp_header_M_add_headers(base->M.lo, TSDP_HEADER_A_VA_ARGS("ssrc", str), tsk_null); + tsk_sprintf(&str, "%u label:%s", self->rtp_manager->rtp.ssrc, "Doubango"); + tsdp_header_M_add_headers(base->M.lo, TSDP_HEADER_A_VA_ARGS("ssrc", str), tsk_null); + TSK_FREE(str); + } + + /* ICE */ + if(self->ice_ctx){ + tsk_size_t index = 0; + const tnet_ice_candidate_t* candidate; + + // FIXME: for RTCP, use "RFC 3605"in addition to "rtcp-mux" + + // "a=ice-mismatch" if "C=" line is not included in the candidates + if((candidate = tnet_ice_ctx_get_local_candidate_at(self->ice_ctx, 0))){ // at least one candidate + char* str = tsk_null; + base->M.lo->port = candidate->socket->port; + + tsdp_header_M_remove(base->M.lo, tsdp_htype_C); + tsdp_header_M_add_headers(base->M.lo, + TSDP_HEADER_C_VA_ARGS("IN", TNET_SOCKET_TYPE_IS_IPV6(candidate->socket->type) ? "IP6" : "IP4", candidate->socket->ip), + tsk_null); + tsdp_header_M_add_headers(base->M.lo, + TSDP_HEADER_A_VA_ARGS("ice-ufrag", candidate->ufrag), + TSDP_HEADER_A_VA_ARGS("ice-pwd", candidate->pwd), + tsk_null); + // RTCWeb + tsdp_header_M_add_headers(base->M.lo, + TSDP_HEADER_A_VA_ARGS("mid", self->media_type == tmedia_audio ? "audio" : "video"), + TSDP_HEADER_A_VA_ARGS("rtcp-mux", tsk_null), + tsk_null); + + while((candidate = tnet_ice_ctx_get_local_candidate_at(self->ice_ctx, index++))){ + tsdp_header_M_add_headers(base->M.lo, + TSDP_HEADER_A_VA_ARGS("candidate", tnet_ice_candidate_tostring((tnet_ice_candidate_t*)candidate)), + tsk_null); + } + } + } + + if(self->media_type == tmedia_audio){ + ///* 3GPP TS 24.229 - 6.1.1 General + // The UE shall include the MIME subtype "telephone-event" in the "m=" media descriptor in the SDP for audio media + // flows that support both audio codec and DTMF payloads in RTP packets as described in RFC 4733 [23]. + //*/ + //tsdp_header_M_add_fmt(base->M.lo, TMEDIA_CODEC_FORMAT_DTMF); + //tsdp_header_M_add_headers(base->M.lo, + // TSDP_HEADER_A_VA_ARGS("fmtp", TMEDIA_CODEC_FORMAT_DTMF" 0-15"), + // tsk_null); + //tsdp_header_M_add_headers(base->M.lo, + // TSDP_HEADER_A_VA_ARGS("rtpmap", TMEDIA_CODEC_FORMAT_DTMF" telephone-event/8000"), + // tsk_null); + } + + /* QoS */ + if(base->qos){ + tmedia_qos_tline_t* ro_tline; + if(base->M.ro && (ro_tline = tmedia_qos_tline_from_sdp(base->M.ro))){ + tmedia_qos_tline_set_ro(base->qos, ro_tline); + TSK_OBJECT_SAFE_FREE(ro_tline); + } + tmedia_qos_tline_to_sdp(base->qos, base->M.lo); + } +DONE:; + } + + return base->M.lo; +} + +int tdav_session_av_set_ro(tdav_session_av_t* self, const struct tsdp_header_M_s* m, tsk_bool_t *updated) +{ + tmedia_codecs_L_t* neg_codecs; + tsk_bool_t is_srtp_remote_mandatory; + tsk_bool_t crypto_matched = tsk_false; + tmedia_session_t* base = TMEDIA_SESSION(self); + + if(!base || !m || !updated){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + /* update remote offer */ + TSK_OBJECT_SAFE_FREE(base->M.ro); + base->M.ro = tsk_object_ref((void*)m); + + *updated = tsk_false; + is_srtp_remote_mandatory = (tsk_striequals(m->proto, "RTP/SAVP") || tsk_striequals(m->proto, "RTP/SAVPF")); + + if(base->M.lo){ + if((neg_codecs = tmedia_session_match_codec(base, m))){ + /* update negociated codecs */ + TSK_OBJECT_SAFE_FREE(base->neg_codecs); + base->neg_codecs = neg_codecs; + *updated = tsk_true; + } + else{ + TSK_DEBUG_ERROR("None Match"); + return -1; + } + /* QoS */ + if(base->qos){ + tmedia_qos_tline_t* ro_tline; + if(base->M.ro && (ro_tline = tmedia_qos_tline_from_sdp(base->M.ro))){ + tmedia_qos_tline_set_ro(base->qos, ro_tline); + TSK_OBJECT_SAFE_FREE(ro_tline); + } + } + /* AVPF */ + if(tsk_striequals(base->M.lo->proto, "RTP/AVPF") || tsk_striequals(base->M.lo->proto, "RTP/SAVPF")){ + self->use_avpf = tsk_true; + } + } + + /* get connection associated to this media line + * If the connnection is global, then the manager will call tdav_session_audio_set() */ + if(m->C && m->C->addr){ + tsk_strupdate(&self->remote_ip, m->C->addr); + self->use_ipv6 = tsk_striequals(m->C->addrtype, "IP6"); + } + /* set remote port */ + self->remote_port = m->port; + + /* RTCP-MUX */ + self->use_rtcp_mux = (tsdp_header_M_findA(m, "rtcp-mux") != tsk_null); + + /* SDPCapNeg: RFC 5939 */ + { + const tsdp_header_A_t *A_pcfg, *A_tcap; + tsk_size_t i, j; + char c_pcfg; + int tag_pcfg, tag_pcfg_t; + i = 0; + TSK_FREE(self->sdp_neg.remote_best_pcfg.t_proto); + while((A_pcfg = tsdp_header_M_findA_at(base->M.ro, "pcfg", i++))){ + char* v_pcfg = strtok((char*)A_pcfg->value, " "); + tag_pcfg = atoi(v_pcfg); + if(v_pcfg && (v_pcfg = strtok(tsk_null, " "))){ + do{ + if(sscanf(v_pcfg, "%c=%d", &c_pcfg, &tag_pcfg_t) >= 2){ + j = 0; + if(c_pcfg == 't'){ + while((A_tcap = tsdp_header_M_findA_at(base->M.ro, "tcap", j++))){ + char* v_tcap = strtok((char*)A_tcap->value, " "); + if((v_tcap && atoi(v_tcap) == tag_pcfg_t)){ + if((v_tcap = strtok(tsk_null, " "))){ + // for now only get the best proto + self->sdp_neg.remote_best_pcfg.tag = tag_pcfg; + self->sdp_neg.remote_best_pcfg.t_tag = tag_pcfg_t; + tsk_strupdate(&self->sdp_neg.remote_best_pcfg.t_proto, v_tcap); + goto SDPCapNegDone; + } + } + } + } + } + } + while((v_pcfg = strtok(tsk_null, " "))); + } + } +SDPCapNegDone:; + } + + /* SRTP */ +#if HAVE_SRTP + if(self->srtp_mode == tmedia_srtp_mode_optional || self->srtp_mode == tmedia_srtp_mode_mandatory){ + tsk_size_t i = 0; + const tsdp_header_A_t* A; + int ret; + while((A = tsdp_header_M_findA_at(m, "crypto", i++))){ + if(self->rtp_manager){ + if((ret = trtp_srtp_set_remote(self->rtp_manager, A->value)) == 0){ + crypto_matched = tsk_true; + break; + } + } + else{ + if((ret = trtp_srtp_match_line(A->value, &self->remote_srtp_neg.tag, (int32_t*)&self->remote_srtp_neg.crypto_type, self->remote_srtp_neg.key, (sizeof(self->remote_srtp_neg.key) - 1))) == 0){ + crypto_matched = tsk_true; + self->remote_srtp_neg.pending = tsk_true; + break; + } + } + } + if((self->srtp_mode == tmedia_srtp_mode_mandatory) && !crypto_matched){// local require but none match + TSK_DEBUG_ERROR("SRTP negotiation failed"); + return -3; + } + } +#endif + + if(is_srtp_remote_mandatory && !crypto_matched){// remote require but none match + TSK_DEBUG_ERROR("SRTP negotiation failed"); + return -4; + } + + self->use_srtp = trtp_srtp_is_initialized(self->rtp_manager); + + return 0; +} + +const tmedia_codec_t* tdav_session_av_get_best_neg_codec(const tdav_session_av_t* self) +{ + const tsk_list_item_t* item; + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + tsk_list_foreach(item, TMEDIA_SESSION(self)->neg_codecs){ + // exclude DTMF, RED and ULPFEC + if(!TDAV_IS_DTMF_CODEC(item->data) && !TDAV_IS_ULPFEC_CODEC(item->data) && !TDAV_IS_RED_CODEC(item->data) + && TMEDIA_CODEC(item->data)->plugin && TMEDIA_CODEC(item->data)->plugin->encode && TMEDIA_CODEC(item->data)->plugin->decode){ + return TMEDIA_CODEC(item->data); + } + } + return tsk_null; +} + +const tmedia_codec_t* tdav_session_av_get_red_codec(const tdav_session_av_t* self) +{ + const tsk_list_item_t* item; + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + tsk_list_foreach(item, TMEDIA_SESSION(self)->neg_codecs){ + if(TDAV_IS_RED_CODEC(item->data)){ + return TMEDIA_CODEC(item->data); + } + } + return tsk_null; +} + +const tmedia_codec_t* tdav_session_av_get_ulpfec_codec(const tdav_session_av_t* self) +{ + const tsk_list_item_t* item; + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + tsk_list_foreach(item, TMEDIA_SESSION(self)->neg_codecs){ + if(TDAV_IS_ULPFEC_CODEC(item->data)){ + return TMEDIA_CODEC(item->data); + } + } + return tsk_null; +} + +int tdav_session_av_deinit(tdav_session_av_t* self) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + /* deinit self (rtp manager should be destroyed after the producer) */ + TSK_OBJECT_SAFE_FREE(self->consumer); + TSK_OBJECT_SAFE_FREE(self->producer); + TSK_OBJECT_SAFE_FREE(self->rtp_manager); + TSK_FREE(self->sdp_neg.remote_best_pcfg.t_proto); + TSK_FREE(self->remote_ip); + TSK_FREE(self->local_ip); + + /* NAT Traversal context */ + TSK_OBJECT_SAFE_FREE(self->natt_ctx); + TSK_OBJECT_SAFE_FREE(self->ice_ctx); + + tsk_safeobj_deinit(self); + + /* deinit base */ + tmedia_session_deinit(TMEDIA_SESSION(self)); + + return 0; +} \ No newline at end of file diff --git a/branches/2.0/doubango/tinyDAV/src/video/jb/tdav_video_frame.c b/branches/2.0/doubango/tinyDAV/src/video/jb/tdav_video_frame.c new file mode 100644 index 00000000..3cca9eea --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/src/video/jb/tdav_video_frame.c @@ -0,0 +1,184 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tdav_video_frame.c + * @brief Video Frame + * + * @author Mamadou Diop + */ +#include "tinydav/video/jb/tdav_video_frame.h" + +#include "tsk_memory.h" +#include "tsk_debug.h" + +static tsk_object_t* tdav_video_frame_ctor(tsk_object_t * self, va_list * app) +{ + tdav_video_frame_t *frame = self; + if(frame){ + if(!(frame->pkts = tsk_list_create())){ + TSK_DEBUG_ERROR("Faile to list"); + return tsk_null; + } + tsk_safeobj_init(frame); + } + return self; +} +static tsk_object_t* tdav_video_frame_dtor(tsk_object_t * self) +{ + tdav_video_frame_t *frame = self; + if(frame){ + TSK_OBJECT_SAFE_FREE(frame->pkts); + + tsk_safeobj_deinit(frame); + } + + return self; +} +static int tdav_video_frame_cmp(const tsk_object_t *_p1, const tsk_object_t *_p2) +{ + const tdav_video_frame_t *p1 = _p1; + const tdav_video_frame_t *p2 = _p2; + + if(p1 && p2){ + return (int)(p1->timestamp - p2->timestamp); + } + else if(!p1 && !p2) return 0; + else return -1; +} +static const tsk_object_def_t tdav_video_frame_def_s = +{ + sizeof(tdav_video_frame_t), + tdav_video_frame_ctor, + tdav_video_frame_dtor, + tdav_video_frame_cmp, +}; +const tsk_object_def_t *tdav_video_frame_def_t = &tdav_video_frame_def_s; + + +tdav_video_frame_t* tdav_video_frame_create(trtp_rtp_packet_t* rtp_pkt) +{ + tdav_video_frame_t* frame; + if(!rtp_pkt || !rtp_pkt->header){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + if((frame = tsk_object_new(tdav_video_frame_def_t))){ + rtp_pkt = tsk_object_ref(rtp_pkt); + frame->payload_type = rtp_pkt->header->payload_type; + frame->timestamp = rtp_pkt->header->timestamp; + frame->highest_seq_num = rtp_pkt->header->seq_num; + tsk_list_push_ascending_data(frame->pkts, (void**)&rtp_pkt); + } + return frame; +} + +int tdav_video_frame_put(tdav_video_frame_t* self, trtp_rtp_packet_t* rtp_pkt) +{ + if(!self || !rtp_pkt || !rtp_pkt->header){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + if(self->timestamp != rtp_pkt->header->timestamp){ + TSK_DEBUG_ERROR("Timestamp mismatch"); + return -2; + } + if(self->payload_type != rtp_pkt->header->payload_type){ + TSK_DEBUG_ERROR("Payload Type mismatch"); + return -2; + } + + rtp_pkt = tsk_object_ref(rtp_pkt); + self->highest_seq_num = TSK_MAX(self->highest_seq_num, rtp_pkt->header->seq_num); + tsk_list_lock(self->pkts); + tsk_list_push_ascending_data(self->pkts, (void**)&rtp_pkt); + tsk_list_unlock(self->pkts); + + return 0; +} + +const trtp_rtp_packet_t* tdav_video_frame_find_by_seq_num(const tdav_video_frame_t* self, uint16_t seq_num) +{ + const tsk_list_item_t *item; + const trtp_rtp_packet_t* pkt; + const trtp_rtp_packet_t* ret; + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + ret = tsk_null; + + tsk_list_lock(self->pkts); + tsk_list_foreach(item, self->pkts){ + if(!(pkt = item->data) || !pkt->header){ + continue; + } + if(pkt->header->seq_num == seq_num){ + ret = pkt; + break; + } + } + tsk_list_unlock(self->pkts); + + return ret; +} + +// @buffer_ptr pointer to the destination buffer +// @buffer_size the actual buffer size. Could be enlarged if too small to fit +// @retval number of copied bytes +tsk_size_t tdav_video_frame_write(struct tdav_video_frame_s* self, void** buffer_ptr, tsk_size_t* buffer_size) +{ + const tsk_list_item_t *item; + const trtp_rtp_packet_t* pkt; + tsk_size_t ret_size = 0; + int32_t last_seq_num = -1; // guard against duplicated packets + + if(!self || !buffer_ptr || !buffer_size){ + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + + tsk_list_lock(self->pkts); + tsk_list_foreach(item, self->pkts){ + if(!(pkt = item->data) || !pkt->payload.size || !pkt->header || pkt->header->seq_num == last_seq_num){ + continue; + } + if((ret_size + pkt->payload.size) > *buffer_size){ + if(!(*buffer_ptr = tsk_realloc(*buffer_ptr, (ret_size + pkt->payload.size)))){ + TSK_DEBUG_ERROR("Failed to resize the buffer"); + *buffer_size = 0; + goto bail; + } + *buffer_size = (ret_size + pkt->payload.size); + } + memcpy(&((uint8_t*)*buffer_ptr)[ret_size], (pkt->payload.data ? pkt->payload.data : pkt->payload.data_const), pkt->payload.size); + ret_size += pkt->payload.size; + last_seq_num = pkt->header->seq_num; + } + +bail: + tsk_list_unlock(self->pkts); + + return ret_size; +} \ No newline at end of file diff --git a/branches/2.0/doubango/tinyDAV/src/video/jb/tdav_video_jb.c b/branches/2.0/doubango/tinyDAV/src/video/jb/tdav_video_jb.c new file mode 100644 index 00000000..e64a1046 --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/src/video/jb/tdav_video_jb.c @@ -0,0 +1,375 @@ +/* +* Copyright (C) 2011 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tdav_video_jb.c + * @brief Video Jitter Buffer + * + * @author Mamadou Diop + */ +#include "tinydav/video/jb/tdav_video_jb.h" +#include "tinydav/video/jb/tdav_video_frame.h" + +#include "tinyrtp/rtp/trtp_rtp_packet.h" + +#include "tsk_memory.h" +#include "tsk_timer.h" +#include "tsk_debug.h" + +// default frame rate +// the corret fps will be computed using the RTP timestamps +#define TDAV_VIDEO_JB_FPS TDAV_VIDEO_JB_FPS_MAX +#define TDAV_VIDEO_JB_FPS_MIN 1 +#define TDAV_VIDEO_JB_FPS_MAX 30 +// Number of correct consecutive RTP packets to receive before computing the FPS +#define TDAV_VIDEO_JB_FPS_PROB (TDAV_VIDEO_JB_FPS >> 1) +// Max number of frames to allow in jitter buffer +#define TDAV_VIDEO_JB_TAIL_MAX (TDAV_VIDEO_JB_FPS << 2) +// Min number of frames required before requesting a full decode +// This is required because of the FEC and NACK functions +// Will be updated using the RTT value from RTCP and probation +#define TDAV_VIDEO_JB_TAIL_MIN_MIN 1 +#define TDAV_VIDEO_JB_TAIL_MIN_MAX 2 +#define TDAV_VIDEO_JB_TAIL_MIN_PROB (TDAV_VIDEO_JB_FPS >> 2) + +#define TDAV_VIDEO_JB_MAX_DROPOUT 0xFD9B + +static const tdav_video_frame_t* _tdav_video_jb_get_frame(struct tdav_video_jb_s* self, uint32_t timestamp, uint8_t pt, tsk_bool_t *pt_matched); +static int _tdav_video_jb_timer_callback(const void* arg, tsk_timer_id_t timer_id); + +typedef struct tdav_video_jb_s +{ + TSK_DECLARE_OBJECT; + + tsk_bool_t started; + int32_t fps; + int32_t fps_prob; + int32_t avg_duration; + uint32_t last_timestamp; + int32_t conseq_frame_drop; + int32_t tail_max; + int32_t tail_min; + int32_t tail_prob; + tdav_video_frames_L_t *frames; + int64_t frames_count; + tsk_timer_manager_handle_t *h_timer; + tsk_timer_id_t timer_decode; + uint16_t seq_nums[0xFF]; + tdav_video_jb_cb_f callback; + const void* callback_data; + + // to avoid locking use different cb_data + tdav_video_jb_cb_data_xt cb_data_rtp; + tdav_video_jb_cb_data_xt cb_data_fdd; + tdav_video_jb_cb_data_xt cb_data_any; + + struct{ + void* ptr; + tsk_size_t size; + } buffer; + + TSK_DECLARE_SAFEOBJ; +} +tdav_video_jb_t; + + +static tsk_object_t* tdav_video_jb_ctor(tsk_object_t * self, va_list * app) +{ + tdav_video_jb_t *jb = self; + if(jb){ + if(!(jb->frames = tsk_list_create())){ + TSK_DEBUG_ERROR("Failed to create list"); + return tsk_null; + } + if(!(jb->h_timer = tsk_timer_manager_create())){ + TSK_DEBUG_ERROR("Failed to create timer manager"); + return tsk_null; + } + jb->cb_data_fdd.type = tdav_video_jb_cb_data_type_fdd; + jb->cb_data_rtp.type = tdav_video_jb_cb_data_type_rtp; + + tsk_safeobj_init(jb); + } + return self; +} +static tsk_object_t* tdav_video_jb_dtor(tsk_object_t * self) +{ + tdav_video_jb_t *jb = self; + if(jb){ + if(jb->started){ + tdav_video_jb_stop(jb); + } + TSK_OBJECT_SAFE_FREE(jb->frames); + if(jb->h_timer){ + tsk_timer_manager_destroy(&jb->h_timer); + } + TSK_SAFE_FREE(jb->buffer.ptr); + tsk_safeobj_deinit(jb); + } + + return self; +} +static const tsk_object_def_t tdav_video_jb_def_s = +{ + sizeof(tdav_video_jb_t), + tdav_video_jb_ctor, + tdav_video_jb_dtor, + tsk_null, +}; + +tdav_video_jb_t* tdav_video_jb_create() +{ + tdav_video_jb_t* jb; + + if((jb = tsk_object_new(&tdav_video_jb_def_s))){ + jb->fps = TDAV_VIDEO_JB_FPS; + jb->fps_prob = TDAV_VIDEO_JB_FPS_PROB; + jb->tail_max = TDAV_VIDEO_JB_TAIL_MAX; + jb->tail_min = TDAV_VIDEO_JB_TAIL_MIN_MIN; + jb->tail_prob = TDAV_VIDEO_JB_TAIL_MIN_PROB; + } + return jb; +} + +#define tdav_video_jb_reset_fps_prob(self) {\ + (self)->fps_prob = TDAV_VIDEO_JB_FPS_PROB; \ + (self)->last_timestamp = 0; \ + (self)->avg_duration = 0; \ +} +#define tdav_video_jb_reset_tail_min_prob(self) {\ + (self)->tail_prob = TDAV_VIDEO_JB_TAIL_MIN_PROB; \ + (self)->tail_min = TDAV_VIDEO_JB_TAIL_MIN_MAX; \ +} + +int tdav_video_jb_set_callback(tdav_video_jb_t* self, tdav_video_jb_cb_f callback, const void* usr_data) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + self->callback = callback; + self->cb_data_any.usr_data = usr_data; + self->cb_data_fdd.usr_data = usr_data; + self->cb_data_rtp.usr_data = usr_data; + return 0; +} + +int tdav_video_jb_start(tdav_video_jb_t* self) +{ + int ret; + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + if(self->started){ + return 0; + } + + if((ret = tsk_timer_manager_start(self->h_timer)) == 0){ + self->timer_decode = tsk_timer_manager_schedule(self->h_timer, (1000 / self->fps), _tdav_video_jb_timer_callback, self); + self->started = tsk_true; + } + return ret; +} + +int tdav_video_jb_put(tdav_video_jb_t* self, trtp_rtp_packet_t* rtp_pkt) +{ + const tdav_video_frame_t* old_frame; + tsk_bool_t pt_matched = tsk_false, is_frame_late_or_dup = tsk_false, is_restarted = tsk_false; + uint16_t* seq_num; + + if(!self || !rtp_pkt || !rtp_pkt->header){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + seq_num = &self->seq_nums[rtp_pkt->header->payload_type]; + + tsk_safeobj_lock(self); + + old_frame = _tdav_video_jb_get_frame(self, rtp_pkt->header->timestamp, rtp_pkt->header->payload_type, &pt_matched); + + if((*seq_num && *seq_num != 0xFFFF) && (*seq_num + 1) != rtp_pkt->header->seq_num){ // FIXME: check if seq_num wrapped + int32_t diff = (rtp_pkt->header->seq_num - *seq_num); + tsk_bool_t is_frame_loss = (diff > 0); + is_restarted = (TSK_ABS(diff) > TDAV_VIDEO_JB_MAX_DROPOUT); + is_frame_late_or_dup = !is_frame_loss; + tdav_video_jb_reset_fps_prob(self); + tdav_video_jb_reset_tail_min_prob(self); + TSK_DEBUG_INFO("Packet %s (from JB) [%u - %u]", is_frame_loss ? "loss" : "late/duplicated/nack", *seq_num, rtp_pkt->header->seq_num); + + if(is_frame_loss && !is_restarted){ + if(self->callback){ + self->cb_data_any.type = tdav_video_jb_cb_data_type_fl; + self->cb_data_any.ssrc = rtp_pkt->header->ssrc; + self->cb_data_any.fl.seq_num = (*seq_num + 1); + self->cb_data_any.fl.count = diff - 1; + self->callback(&self->cb_data_any); + } + } + } + else{ + --self->tail_prob; + } + self->tail_min = self->tail_prob <= 0 ? TDAV_VIDEO_JB_TAIL_MIN_MIN : TDAV_VIDEO_JB_TAIL_MIN_MAX; + + if(!old_frame){ + tdav_video_frame_t* new_frame; + if(pt_matched){ + // if we have a frame with the same payload type but without this timestamp this means that we moved to a new frame + // this happens if the frame is waiting to be decoded or the marker is lost + } + if((new_frame = tdav_video_frame_create(rtp_pkt))){ + // compute avg frame duration + if(self->last_timestamp && self->last_timestamp < rtp_pkt->header->timestamp){ + uint32_t duration = (rtp_pkt->header->timestamp - self->last_timestamp); + self->avg_duration = self->avg_duration ? ((self->avg_duration + duration) >> 1) : duration; + --self->fps_prob; + } + self->last_timestamp = rtp_pkt->header->timestamp; + + tsk_list_lock(self->frames); + if(self->frames_count >= self->tail_max){ + if(++self->conseq_frame_drop >= self->fps){ + TSK_DEBUG_INFO("Too many frames dropped and fps=%d", self->fps); + tsk_list_clear_items(self->frames); + self->conseq_frame_drop = 0; + self->frames_count = 1; + if(self->callback){ + self->cb_data_any.type = tdav_video_jb_cb_data_type_tmfr; + self->cb_data_any.ssrc = rtp_pkt->header->ssrc; + self->callback(&self->cb_data_any); + } + } + else{ + tsk_list_remove_first_item(self->frames); + // self->frames_count += 0; + } + tdav_video_jb_reset_fps_prob(self); + } + else{ + ++self->frames_count; + } + tsk_list_push_ascending_data(self->frames, (void**)&new_frame); + tsk_list_unlock(self->frames); + } + if(self->fps_prob <= 0 && self->avg_duration){ + // compute FPS + self->fps = TSK_CLAMP(TDAV_VIDEO_JB_FPS_MIN, ((3003 * 30) / self->avg_duration), TDAV_VIDEO_JB_FPS_MAX); + //self->fps = ((3003 * 30) / self->avg_duration); + self->tail_max = (self->fps << 1); + tdav_video_jb_reset_fps_prob(self); + } + } + else{ + tdav_video_frame_put((tdav_video_frame_t*)old_frame, rtp_pkt); + } + + tsk_safeobj_unlock(self); + + if(!is_frame_late_or_dup || is_restarted){ + *seq_num = rtp_pkt->header->seq_num; + } + + return 0; +} + +int tdav_video_jb_stop(tdav_video_jb_t* self) +{ + int ret; + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + if(!self->started){ + return 0; + } + + if((ret = tsk_timer_manager_stop(self->h_timer)) == 0){ + self->started = tsk_false; + } + return ret; +} + +static const tdav_video_frame_t* _tdav_video_jb_get_frame(tdav_video_jb_t* self, uint32_t timestamp, uint8_t pt, tsk_bool_t *pt_matched) +{ + const tdav_video_frame_t* ret = tsk_null; + const tsk_list_item_t *item; + + *pt_matched =tsk_false; + + tsk_list_lock(self->frames); + tsk_list_foreach(item, self->frames){ + if(TDAV_VIDEO_FRAME(item->data)->payload_type == pt){ + if(!(*pt_matched)) *pt_matched = tsk_true; + if(TDAV_VIDEO_FRAME(item->data)->timestamp == timestamp){ + ret = item->data; + break; + } + } + + } + tsk_list_unlock(self->frames); + + return ret; +} + +static int _tdav_video_jb_timer_callback(const void* arg, tsk_timer_id_t timer_id) +{ + tdav_video_jb_t* jb = (tdav_video_jb_t*)arg; + + if(!jb->started){ + return 0; + } + + if(jb->timer_decode == timer_id){ + jb->timer_decode = tsk_timer_manager_schedule(jb->h_timer, (1000 / jb->fps), _tdav_video_jb_timer_callback, jb); + if(jb->frames_count >= jb->tail_min){ + tsk_list_item_t* item; + + tsk_safeobj_lock(jb); // against get_frame() + tsk_list_lock(jb->frames); + item = tsk_list_pop_first_item(jb->frames); + --jb->frames_count; + tsk_list_unlock(jb->frames); + tsk_safeobj_unlock(jb); + + if(jb->callback){ + trtp_rtp_packet_t* pkt; + const tsk_list_item_t* _item = item; // save memory address as "tsk_list_foreach() will change it for each loop" + const tdav_video_frame_t* frame = _item->data; + int32_t last_seq_num = -1; // guard against duplicated packets + tsk_list_foreach(_item, frame->pkts){ + if(!(pkt = _item->data) || !pkt->payload.size || !pkt->header || pkt->header->seq_num == last_seq_num){ + continue; + } + // pkt->header->marker = (_item == frame->pkts->tail); // break the accumulator + jb->cb_data_rtp.rtp.pkt = pkt; + jb->callback(&jb->cb_data_rtp); + } + } + + TSK_OBJECT_SAFE_FREE(item); + } + } + + return 0; +} \ No newline at end of file diff --git a/branches/2.0/doubango/tinyDAV/src/video/tdav_session_video.c b/branches/2.0/doubango/tinyDAV/src/video/tdav_session_video.c index b057f649..8576ec94 100644 --- a/branches/2.0/doubango/tinyDAV/src/video/tdav_session_video.c +++ b/branches/2.0/doubango/tinyDAV/src/video/tdav_session_video.c @@ -27,195 +27,244 @@ * */ #include "tinydav/video/tdav_session_video.h" - #include "tinydav/video/tdav_converter_video.h" +#include "tinydav/video/jb/tdav_video_jb.h" +#include "tinydav/codecs/fec/tdav_codec_red.h" +#include "tinydav/codecs/fec/tdav_codec_ulpfec.h" + #include "tinymedia/tmedia_consumer.h" #include "tinymedia/tmedia_producer.h" #include "tinymedia/tmedia_defaults.h" +#include "tinymedia/tmedia_params.h" #include "tinyrtp/trtp_manager.h" +#include "tinyrtp/rtcp/trtp_rtcp_header.h" #include "tinyrtp/rtp/trtp_rtp_packet.h" +#include "tinyrtp/rtcp/trtp_rtcp_packet.h" +#include "tinyrtp/rtcp/trtp_rtcp_report_rr.h" +#include "tinyrtp/rtcp/trtp_rtcp_report_sr.h" +#include "tinyrtp/rtcp/trtp_rtcp_report_fb.h" #include "tsk_memory.h" #include "tsk_debug.h" -// RTP/RTCP callback (From the network to the consumer) -static int tdav_session_video_rtp_cb(const void* callback_data, const struct trtp_rtp_packet_s* packet) -{ - tdav_session_video_t* session = (tdav_session_video_t*)callback_data; - int ret = 0; +#define TDAV_SESSION_VIDEO_AVPF_PACKETS_MAX_MIN 15 +#define TDAV_SESSION_VIDEO_AVPF_PACKETS_MAX_MAX (TDAV_SESSION_VIDEO_AVPF_PACKETS_MAX_MIN << 3) +#define TDAV_SESSION_VIDEO_AVPF_FIR_INTERVAL_MIN 0//500 // millis: FIXME: RtcWeb - if(!session || !packet){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; +#define TDAV_SESSION_VIDEO_PKT_LOSS_PROB_BAD 2 +#define TDAV_SESSION_VIDEO_PKT_LOSS_PROB_GOOD 6 +#define TDAV_SESSION_VIDEO_PKT_LOSS_FACT_MIN 0 +#define TDAV_SESSION_VIDEO_PKT_LOSS_FACT_MAX 8 +#define TDAV_SESSION_VIDEO_PKT_LOSS_LOW 9 +#define TDAV_SESSION_VIDEO_PKT_LOSS_MEDIUM 22 +#define TDAV_SESSION_VIDEO_PKT_LOSS_HIGH 63 + +static const tmedia_codec_action_t __action_encode_idr = tmedia_codec_action_encode_idr; +static const tmedia_codec_action_t __action_encode_bw_up = tmedia_codec_action_bw_up; +static const tmedia_codec_action_t __action_encode_bw_down = tmedia_codec_action_bw_down; + +// FIXME: lock +#define _tdav_session_video_codec_set(__self, key, value) \ + { \ + static tmedia_param_t* __param = tsk_null; \ + if(!__param){ \ + __param = tmedia_param_create(tmedia_pat_set, \ + tmedia_video, \ + tmedia_ppt_codec, \ + tmedia_pvt_int32, \ + "action", \ + (void*)&value); \ + } \ + if((__self)->encoder.codec && __param){ \ + /*tsk_mutex_lock((__self)->encoder.h_mutex);*/ \ + tmedia_codec_set((tmedia_codec_t*)(__self)->encoder.codec, __param); \ + /*tsk_mutex_unlock((__self)->encoder.h_mutex);*/ \ + } \ + /* TSK_OBJECT_SAFE_FREE(param); */ \ } - if(session->consumer){ - tmedia_codec_t* codec; - tsk_istr_t format; - tsk_size_t out_size; +#define _tdav_session_video_request_idr(__self) { \ + uint64_t __now = tsk_time_now(); \ + if((__now - (__self)->avpf.last_fir_time) > TDAV_SESSION_VIDEO_AVPF_FIR_INTERVAL_MIN){ /* guard to avoid sending too many FIR */ \ + _tdav_session_video_codec_set((__self), "action", __action_encode_idr); \ + } \ + (__self)->avpf.last_fir_time = __now; \ +} +#define _tdav_session_video_bw_up(__self) _tdav_session_video_codec_set(__self, "action", __action_encode_bw_up) +#define _tdav_session_video_bw_down(__self) _tdav_session_video_codec_set(__self, "action", __action_encode_bw_down) - // Find the codec to use to decode the RTP payload - tsk_itoa(packet->header->payload_type, &format); - if(!(codec = tmedia_codec_find_by_format(TMEDIA_SESSION(session)->neg_codecs, format)) || !codec->plugin || !codec->plugin->decode){ - TSK_DEBUG_ERROR("%s is not a valid payload for this session", format); - ret = -2; - goto bail; - } - // Open codec if not already done - if(!TMEDIA_CODEC(codec)->opened){ - tsk_safeobj_lock(session); - if((ret = tmedia_codec_open(codec))){ - tsk_safeobj_unlock(session); - TSK_DEBUG_ERROR("Failed to open [%s] codec", codec->plugin->desc); - goto bail; +#define _tdav_session_video_reset_loss_prob(__self) \ +{ \ + (__self)->encoder.pkt_loss_level = tdav_session_video_pkt_loss_level_low; \ + (__self)->encoder.pkt_loss_prob_bad = TDAV_SESSION_VIDEO_PKT_LOSS_PROB_BAD; \ + (__self)->encoder.pkt_loss_prob_good = TDAV_SESSION_VIDEO_PKT_LOSS_PROB_GOOD; \ +} +static int _tdav_session_video_jb_cb(const tdav_video_jb_cb_data_xt* data); +static int _tdav_session_video_open_decoder(tdav_session_video_t* self, uint8_t payload_type); +static int _tdav_session_video_decode(tdav_session_video_t* self, const trtp_rtp_packet_t* packet); +static int _tdav_session_video_set_callbacks(tmedia_session_t* self); + +// Codec callback (From codec to the network) +// or Producer callback to send() data "as is" +static int tdav_session_video_raw_cb(const tmedia_video_encode_result_xt* result) +{ + tdav_session_av_t* base = (tdav_session_av_t*)result->usr_data; + tdav_session_video_t* video = (tdav_session_video_t*)result->usr_data; + trtp_rtp_packet_t* packet = tsk_null; + int ret = 0; + tsk_size_t s; + + if(base->rtp_manager && base->rtp_manager->is_started){ + if((packet = trtp_rtp_packet_create(base->rtp_manager->rtp.ssrc, base->rtp_manager->rtp.seq_num, base->rtp_manager->rtp.timestamp, base->rtp_manager->rtp.payload_type, result->last_chunck))){ + tsk_size_t rtp_hdr_size; + if(result->last_chunck){ + base->rtp_manager->rtp.timestamp += result->duration; } - tsk_safeobj_unlock(session); - } - // Decode data - out_size = codec->plugin->decode(codec, packet->payload.data, packet->payload.size, &session->decoder.buffer, &session->decoder.buffer_size, packet->header); - // check - if(!out_size || !session->decoder.buffer){ - goto bail; - } - // Convert decoded data to the consumer chroma and size -#define CONSUMER_INSIZE_MISMATCH ((session->consumer->video.in.width * session->consumer->video.in.height * 3)>>1 != out_size)// we have good reasons not to use 1.5f -#define CONSUMER_IN_N_DISPLAY_MISMATCH (session->consumer->video.in.width != session->consumer->video.display.width || session->consumer->video.in.height != session->consumer->video.display.height) -#define CONSUMER_DISPLAY_N_CODEC_MISMATCH (session->consumer->video.display.width != TMEDIA_CODEC_VIDEO(codec)->in.width || session->consumer->video.display.height != TMEDIA_CODEC_VIDEO(codec)->in.height) -#define CONSUMER_DISPLAY_N_CONVERTER_MISMATCH ( (session->conv.fromYUV420 && session->conv.fromYUV420->dstWidth != session->consumer->video.display.width) || (session->conv.fromYUV420 && session->conv.fromYUV420->dstHeight != session->consumer->video.display.height) ) -#define CONSUMER_CHROMA_MISMATCH (session->consumer->video.display.chroma != TMEDIA_CODEC_VIDEO(codec)->in.chroma) -#define DECODED_NEED_FLIP (TMEDIA_CODEC_VIDEO(codec)->in.flip) - - if((CONSUMER_CHROMA_MISMATCH || CONSUMER_DISPLAY_N_CODEC_MISMATCH || CONSUMER_IN_N_DISPLAY_MISMATCH || CONSUMER_INSIZE_MISMATCH || CONSUMER_DISPLAY_N_CONVERTER_MISMATCH || DECODED_NEED_FLIP)){ - - // Create video converter if not already done - if(!session->conv.fromYUV420 || CONSUMER_DISPLAY_N_CONVERTER_MISMATCH || CONSUMER_INSIZE_MISMATCH){ - TSK_OBJECT_SAFE_FREE(session->conv.fromYUV420); - // update in (set by the codec) - session->consumer->video.in.width = TMEDIA_CODEC_VIDEO(codec)->in.width;//decoded width - session->consumer->video.in.height = TMEDIA_CODEC_VIDEO(codec)->in.height;//decoded height - - // important: do not override the display size (used by the end-user) unless requested - if(session->consumer->video.display.auto_resize){ - session->consumer->video.display.width = session->consumer->video.in.width; - session->consumer->video.display.height = session->consumer->video.in.height; - } - // create converter - if(!(session->conv.fromYUV420 = tdav_converter_video_create(TMEDIA_CODEC_VIDEO(codec)->in.width, TMEDIA_CODEC_VIDEO(codec)->in.height, TMEDIA_CODEC_VIDEO(codec)->in.chroma, session->consumer->video.display.width, session->consumer->video.display.height, - session->consumer->video.display.chroma))){ - TSK_DEBUG_ERROR("Failed to create video converter"); - ret = -3; + packet->payload.data_const = result->buffer.ptr; + packet->payload.size = result->buffer.size; + s = trtp_manager_send_rtp_packet(base->rtp_manager, packet, tsk_false); // encrypt and send data + if(s < TRTP_RTP_HEADER_MIN_SIZE) { + TSK_DEBUG_ERROR("Failed to send packet"); + goto bail; + } + ++base->rtp_manager->rtp.seq_num; + rtp_hdr_size = TRTP_RTP_HEADER_MIN_SIZE + (packet->header->csrc_count << 2); + // Save packet + // FIXME: only if AVPF is enabled + if(1){ + trtp_rtp_packet_t* packet_avpf = tsk_object_ref(packet); + // when SRTP is used, "serial_buffer" will contains the encoded buffer with both RTP header and payload + // Hack the RTP packet payload to point to the the SRTP data instead of unencrypted ptr + packet_avpf->payload.size = (s - rtp_hdr_size); + packet_avpf->payload.data_const = tsk_null; + if(!(packet_avpf->payload.data = tsk_malloc(packet_avpf->payload.size))){// FIXME: to be optimized (reuse memory address) + TSK_DEBUG_ERROR("failed to allocate buffer"); goto bail; } - } - } + memcpy(packet_avpf->payload.data, (((const uint8_t*)base->rtp_manager->rtp.serial_buffer.ptr) + rtp_hdr_size), packet_avpf->payload.size); + tsk_list_lock(video->avpf.packets); + if(video->avpf.count > video->avpf.max){ + tsk_list_remove_first_item(video->avpf.packets); + } + else{ + ++video->avpf.count; + } - if(session->conv.fromYUV420){ - // update one-shot parameters - tdav_converter_video_init(session->conv.fromYUV420, 0/*rotation*/, TMEDIA_CODEC_VIDEO(codec)->in.flip); - // convert data to the consumer's chroma - out_size = tdav_converter_video_convert(session->conv.fromYUV420, session->decoder.buffer, &session->decoder.conv_buffer, &session->decoder.conv_buffer_size); - if(!out_size || !session->decoder.conv_buffer){ - TSK_DEBUG_ERROR("Failed to convert YUV420 buffer to consumer's chroma"); - ret = -4; - goto bail; + tsk_list_push_back_data(video->avpf.packets, (void**)&packet_avpf); + tsk_list_unlock(video->avpf.packets); } - tmedia_consumer_consume(session->consumer, session->decoder.conv_buffer, out_size, packet->header); - if(!session->decoder.conv_buffer){ - /* taken by the consumer */ - session->decoder.conv_buffer_size = 0; + // Send FEC packet + // FIXME: protect only Intra and Params packets + if(video->ulpfec.codec && (s > TRTP_RTP_HEADER_MIN_SIZE)){ + packet->payload.data_const = (((const uint8_t*)base->rtp_manager->rtp.serial_buffer.ptr) + rtp_hdr_size); + packet->payload.size = (s - rtp_hdr_size); + ret = tdav_codec_ulpfec_enc_protect((struct tdav_codec_ulpfec_s*)video->ulpfec.codec, packet); + if(result->last_chunck){ + trtp_rtp_packet_t* packet_fec; + if((packet_fec = trtp_rtp_packet_create(base->rtp_manager->rtp.ssrc, video->ulpfec.seq_num++, video->ulpfec.timestamp, video->ulpfec.payload_type, tsk_true))){ + // serialize the FEC payload packet packet + s = tdav_codec_ulpfec_enc_serialize((const struct tdav_codec_ulpfec_s*)video->ulpfec.codec, &video->encoder.buffer, &video->encoder.buffer_size); + if(s > 0){ + packet_fec->payload.data_const = video->encoder.buffer; + packet_fec->payload.size = s; + s = trtp_manager_send_rtp_packet(base->rtp_manager, packet_fec, tsk_true/* already encrypted */); + } + TSK_OBJECT_SAFE_FREE(packet_fec); + } + video->ulpfec.timestamp += result->duration; + ret = tdav_codec_ulpfec_enc_reset((struct tdav_codec_ulpfec_s*)video->ulpfec.codec); + } } - - } - else{ - tmedia_consumer_consume(session->consumer, session->decoder.buffer, out_size, packet->header); - if(!session->decoder.buffer){ - /* taken by the consumer */ - session->decoder.buffer_size = 0; +#if 0 + // Send RED Packet + if(ret == 0 && video->red.codec){ + // don't need to lock as the buffer is never used by other codecs + tsk_size_t red_pay_size = video->red.codec->plugin->encode( + video->red.codec, + buffer, size, + &video->encoder.buffer, &video->encoder.buffer_size + ); + if(red_pay_size > 1){ + packet->header->payload_type = video->red.payload_type; + ((uint8_t*)video->encoder.buffer)[0] = packet->header->payload_type; + packet->payload.data_const = video->encoder.buffer; + packet->payload.size = red_pay_size; + trtp_manager_send_rtp_2(base->rtp_manager, packet); + } } +#endif } - -bail: - TSK_OBJECT_SAFE_FREE(codec); } + else{ + TSK_DEBUG_ERROR("Failed to create packet"); + } + +bail: + TSK_OBJECT_SAFE_FREE(packet); return ret; } -// Codec callback (From codec/producer to the network) to send() data "as is" -static int tdav_session_video_raw_cb(const void* callback_data, const void* buffer, tsk_size_t size, uint32_t duration, tsk_bool_t marker) +// Codec Callback after decoding +static int tdav_session_video_decode_cb(const tmedia_video_decode_result_xt* result) { - tdav_session_video_t* session = (tdav_session_video_t*)callback_data; - - if(session->rtp_manager && session->rtp_manager->started){ - return trtp_manager_send_rtp(session->rtp_manager, buffer, size, duration, marker, marker); - } + tdav_session_video_t* video = (tdav_session_video_t*)result->usr_data; + tdav_session_av_t* base = (tdav_session_av_t*)result->usr_data; + switch(result->type){ + case tmedia_video_decode_result_type_error: + { + TSK_DEBUG_INFO("Decoding failed -> send Full Intra Request (FIR)"); + trtp_manager_signal_frame_corrupted(base->rtp_manager, ((const trtp_rtp_header_t*)result->proto_hdr)->ssrc); + break; + } + } return 0; } // Producer callback (From the producer to the network) => encode data before send() static int tdav_session_video_producer_enc_cb(const void* callback_data, const void* buffer, tsk_size_t size) { - tdav_session_video_t* session = (tdav_session_video_t*)callback_data; + tdav_session_video_t* video = (tdav_session_video_t*)callback_data; + tdav_session_av_t* base = (tdav_session_av_t*)callback_data; tsk_size_t yuv420p_size = 0; int ret = 0; - if(!session){ + if(!base){ TSK_DEBUG_ERROR("Null session"); return 0; } - if(TMEDIA_SESSION(session)->lo_held){ + if(TMEDIA_SESSION(base)->lo_held){ return 0; } - if(session->rtp_manager){ + if(base->rtp_manager && video->encoder.codec){ /* encode */ tsk_size_t out_size = 0; - tmedia_codec_t* codec = tsk_null; - // Use first codec to encode data - if((codec = tsk_object_ref(TSK_LIST_FIRST_DATA(TMEDIA_SESSION(session)->neg_codecs)))){ - if(!codec->plugin || !codec->plugin->encode){ - TSK_OBJECT_SAFE_FREE(codec); - TSK_DEBUG_ERROR("Invalid codec"); - return -2; - } - // open the codec if not already done - if(!TMEDIA_CODEC(codec)->opened){ - tsk_safeobj_lock(session); - if((ret = tmedia_codec_open(codec))){ - tsk_safeobj_unlock(session); - TSK_DEBUG_ERROR("Failed to open [%s] codec", codec->plugin->desc); - TSK_OBJECT_SAFE_FREE(codec); - return ret; - } - tsk_safeobj_unlock(session); - } + if(!base->rtp_manager->is_started){ + TSK_DEBUG_ERROR("Not started"); + return 0; } - else{ - TSK_DEBUG_ERROR("Failed to find a valid codec"); - return -4; - } - -#define PRODUCER_SIZE_CHANGED (session->conv.producerWidth != session->producer->video.width) || (session->conv.producerHeight != session->producer->video.height) \ -|| (session->conv.xProducerSize != size) -#define ENCODED_NEED_FLIP TMEDIA_CODEC_VIDEO(codec)->out.flip +#define PRODUCER_SIZE_CHANGED (video->conv.producerWidth != base->producer->video.width) || (video->conv.producerHeight != base->producer->video.height) \ +|| (video->conv.xProducerSize != size) +#define ENCODED_NEED_FLIP TMEDIA_CODEC_VIDEO(video->encoder.codec)->out.flip // Video codecs only accept YUV420P buffers ==> do conversion if needed or producer doesn't have the right size - if((session->producer->video.chroma != TMEDIA_CODEC_VIDEO(codec)->out.chroma) || PRODUCER_SIZE_CHANGED || ENCODED_NEED_FLIP){ + if((base->producer->video.chroma != TMEDIA_CODEC_VIDEO(video->encoder.codec)->out.chroma) || PRODUCER_SIZE_CHANGED || ENCODED_NEED_FLIP){ // Create video converter if not already done or producer size has changed - if(!session->conv.toYUV420 || PRODUCER_SIZE_CHANGED){ - TSK_OBJECT_SAFE_FREE(session->conv.toYUV420); - session->conv.producerWidth = session->producer->video.width; - session->conv.producerHeight = session->producer->video.height; - session->conv.xProducerSize = size; + if(!video->conv.toYUV420 || PRODUCER_SIZE_CHANGED){ + TSK_OBJECT_SAFE_FREE(video->conv.toYUV420); + video->conv.producerWidth = base->producer->video.width; + video->conv.producerHeight = base->producer->video.height; + video->conv.xProducerSize = size; - if(!(session->conv.toYUV420 = tdav_converter_video_create(session->producer->video.width, session->producer->video.height, session->producer->video.chroma, TMEDIA_CODEC_VIDEO(codec)->out.width, TMEDIA_CODEC_VIDEO(codec)->out.height, - TMEDIA_CODEC_VIDEO(codec)->out.chroma))){ + if(!(video->conv.toYUV420 = tdav_converter_video_create(base->producer->video.width, base->producer->video.height, base->producer->video.chroma, TMEDIA_CODEC_VIDEO(video->encoder.codec)->out.width, TMEDIA_CODEC_VIDEO(video->encoder.codec)->out.height, + TMEDIA_CODEC_VIDEO(video->encoder.codec)->out.chroma))){ TSK_DEBUG_ERROR("Failed to create video converter"); ret = -5; goto bail; @@ -223,12 +272,12 @@ static int tdav_session_video_producer_enc_cb(const void* callback_data, const v } } - if(session->conv.toYUV420){ + if(video->conv.toYUV420){ // update one-shot parameters - tdav_converter_video_init(session->conv.toYUV420, session->producer->video.rotation, TMEDIA_CODEC_VIDEO(codec)->out.flip); + tdav_converter_video_init(video->conv.toYUV420, base->producer->video.rotation, TMEDIA_CODEC_VIDEO(video->encoder.codec)->out.flip); // convert data to yuv420p - yuv420p_size = tdav_converter_video_convert(session->conv.toYUV420, buffer, &session->encoder.conv_buffer, &session->encoder.conv_buffer_size); - if(!yuv420p_size || !session->encoder.conv_buffer){ + yuv420p_size = tdav_converter_video_convert(video->conv.toYUV420, buffer, &video->encoder.conv_buffer, &video->encoder.conv_buffer_size); + if(!yuv420p_size || !video->encoder.conv_buffer){ TSK_DEBUG_ERROR("Failed to convert XXX buffer to YUV42P"); ret = -6; goto bail; @@ -236,21 +285,22 @@ static int tdav_session_video_producer_enc_cb(const void* callback_data, const v } // Encode data - if(session->encoder.conv_buffer && yuv420p_size){ + tsk_mutex_lock(video->encoder.h_mutex); + if(video->encoder.conv_buffer && yuv420p_size){ /* producer doesn't support yuv42p */ - out_size = codec->plugin->encode(codec, session->encoder.conv_buffer, yuv420p_size, &session->encoder.buffer, &session->encoder.buffer_size); + out_size = video->encoder.codec->plugin->encode(video->encoder.codec, video->encoder.conv_buffer, yuv420p_size, &video->encoder.buffer, &video->encoder.buffer_size); } else{ /* producer supports yuv42p */ - out_size = codec->plugin->encode(codec, buffer, size, &session->encoder.buffer, &session->encoder.buffer_size); + out_size = video->encoder.codec->plugin->encode(video->encoder.codec, buffer, size, &video->encoder.buffer, &video->encoder.buffer_size); } + tsk_mutex_unlock(video->encoder.h_mutex); if(out_size){ /* Never called, see tdav_session_video_raw_cb() */ - trtp_manager_send_rtp(session->rtp_manager, session->encoder.buffer, out_size, 6006, tsk_true, tsk_true); + trtp_manager_send_rtp(base->rtp_manager, video->encoder.buffer, out_size, 6006, tsk_true, tsk_true); } -bail: - TSK_OBJECT_SAFE_FREE(codec); +bail: ; } else{ TSK_DEBUG_ERROR("Invalid parameter"); @@ -260,6 +310,334 @@ bail: return ret; } +// RTP callback (Network -> Decoder -> Consumer) +static int tdav_session_video_rtp_cb(const void* callback_data, const trtp_rtp_packet_t* packet) +{ + tdav_session_video_t* video = (tdav_session_video_t*)callback_data; + tdav_session_av_t* base = (tdav_session_av_t*)callback_data; + + if(!video || !packet || !packet->header){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if(packet->header->payload_type == video->red.payload_type){ + static void* __red_buffer_ptr = tsk_null; // Never used + static tsk_size_t __red_buffer_size = 0; // Never used + if(!video->red.codec){ + TSK_DEBUG_ERROR("No RED codec could be found"); + return -2; + } + // Decode RED data + video->red.codec->plugin->decode( + video->red.codec, + (packet->payload.data ? packet->payload.data : packet->payload.data_const), packet->payload.size, + &__red_buffer_ptr, &__red_buffer_size, + packet->header + ); + return 0; + } + else if(packet->header->payload_type == video->ulpfec.payload_type){ + if(!video->ulpfec.codec){ + TSK_DEBUG_ERROR("No ULPFEC codec could be found"); + return -2; + } + // FIXME: do something + return 0; + } + else{ + return tdav_video_jb_put(video->jb, (trtp_rtp_packet_t*)packet); + } +} + +// RTCP callback (Network -> This) +static int tdav_session_video_rtcp_cb(const void* callback_data, const trtp_rtcp_packet_t* packet) +{ + const trtp_rtcp_report_psfb_t* psfb; + const trtp_rtcp_report_rtpfb_t* rtpfb; + const trtp_rtcp_rblocks_L_t* blocks = tsk_null; + + tdav_session_video_t* video = (tdav_session_video_t*)callback_data; + tdav_session_av_t* base = (tdav_session_av_t*)callback_data; + tsk_size_t i; + + if((blocks = (packet->header->type == trtp_rtcp_packet_type_rr) ? ((const trtp_rtcp_report_rr_t*)packet)->blocks : + (packet->header->type == trtp_rtcp_packet_type_sr ? ((const trtp_rtcp_report_sr_t*)packet)->blocks : tsk_null))){ + const tsk_list_item_t* item; + const trtp_rtcp_rblock_t* block; + tsk_list_foreach(item, blocks){ + if(!(block = item->data)) continue; + if(base->rtp_manager->rtp.ssrc == block->ssrc){ + tdav_session_video_pkt_loss_level_t pkt_loss_level = tdav_session_video_pkt_loss_level_low; + if(block->fraction > TDAV_SESSION_VIDEO_PKT_LOSS_HIGH) pkt_loss_level = tdav_session_video_pkt_loss_level_high; + else if(block->fraction > TDAV_SESSION_VIDEO_PKT_LOSS_MEDIUM) pkt_loss_level = tdav_session_video_pkt_loss_level_medium; + if(pkt_loss_level == tdav_session_video_pkt_loss_level_high || (pkt_loss_level > video->encoder.pkt_loss_level)){ // high or low -> medium + video->encoder.pkt_loss_level = pkt_loss_level; + if(video->encoder.pkt_loss_prob_bad-- <= 0){ + int32_t new_pkt_loss_fact = TSK_CLAMP(TDAV_SESSION_VIDEO_PKT_LOSS_FACT_MIN, (video->encoder.pkt_loss_fact + 1), TDAV_SESSION_VIDEO_PKT_LOSS_FACT_MAX); + if(video->encoder.pkt_loss_fact != new_pkt_loss_fact){ + TSK_DEBUG_INFO("Downgrade bandwidth %d->%d", video->encoder.pkt_loss_fact, new_pkt_loss_fact); + video->encoder.pkt_loss_fact = new_pkt_loss_fact; + _tdav_session_video_bw_down(video); + } + _tdav_session_video_reset_loss_prob(video); + } + } + else{ + if(video->encoder.pkt_loss_prob_good-- <= 0){ + int32_t new_pkt_loss_fact = TSK_CLAMP(TDAV_SESSION_VIDEO_PKT_LOSS_FACT_MIN, (video->encoder.pkt_loss_fact - 1), TDAV_SESSION_VIDEO_PKT_LOSS_FACT_MAX); + if(video->encoder.pkt_loss_fact != new_pkt_loss_fact){ + TSK_DEBUG_INFO("Upgrade bandwidth %d->%d", video->encoder.pkt_loss_fact, new_pkt_loss_fact); + video->encoder.pkt_loss_fact = new_pkt_loss_fact; + _tdav_session_video_bw_up(video); + } + _tdav_session_video_reset_loss_prob(video); + } + } + break; + } + } + } + + i = 0; + while((psfb = (const trtp_rtcp_report_psfb_t*)trtp_rtcp_packet_get_at(packet, trtp_rtcp_packet_type_psfb, i++))){ + switch(psfb->fci_type){ + case trtp_rtcp_psfb_fci_type_fir: + { + _tdav_session_video_request_idr(video); + break; + } + case trtp_rtcp_psfb_fci_type_pli: + { + uint64_t now = tsk_time_now(); + if((now - video->avpf.last_pli_time) < 500){ // more than one PLI in 500ms + _tdav_session_video_request_idr(video); + } + video->avpf.last_pli_time = now; + break; + } + default: break; + } + } + i = 0; + while((rtpfb = (const trtp_rtcp_report_rtpfb_t*)trtp_rtcp_packet_get_at(packet, trtp_rtcp_packet_type_rtpfb, i++))){ + switch(rtpfb->fci_type){ + case trtp_rtcp_rtpfb_fci_type_nack: + { + if(rtpfb->nack.blp && rtpfb->nack.pid){ + tsk_size_t i; + int32_t j; + uint16_t pid, blp; + const tsk_list_item_t* item; + const trtp_rtp_packet_t* pkt_rtp; + for(i = 0; i < rtpfb->nack.count; ++i){ + static const int32_t __Pow2[16] = { 0x8000, 0x4000, 0x2000, 0x1000, 0x800, 0x400, 0x200, 0x100, 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1 }; + int32_t blp_count; + blp = rtpfb->nack.blp[i]; + blp_count = blp ? 16 : 0; + + for(j = -1; j < blp_count; ++j){ + if(j == -1 || (blp & (1 << __Pow2[j]))){ + pid = (rtpfb->nack.pid[i] + (j + 1)); + tsk_list_lock(video->avpf.packets); + tsk_list_foreach(item, video->avpf.packets){ + if(!(pkt_rtp = item->data)){ + continue; + } + + if(pkt_rtp->header->seq_num > pid){ + int32_t old_max = video->avpf.max; + int32_t len_drop = (pkt_rtp->header->seq_num - pid); + video->avpf.max = TSK_CLAMP(TDAV_SESSION_VIDEO_AVPF_PACKETS_MAX_MIN, (old_max + len_drop), TDAV_SESSION_VIDEO_AVPF_PACKETS_MAX_MAX); + TSK_DEBUG_INFO("**NACK requesting dropped frames [requested_frame=%d, len_drop=%d, new_buff_size=%d]. RTT is probably too high.", pid, len_drop, video->avpf.max); + tsk_list_clear_items(video->avpf.packets); + video->avpf.count = 0; + _tdav_session_video_request_idr(video); + goto done; + } + if(pkt_rtp->header->seq_num == pid){ + // TSK_DEBUG_INFO("NACK Found=%d", pid); + trtp_manager_send_rtp_packet(base->rtp_manager, pkt_rtp, tsk_true); + break; + } + if(item == video->avpf.packets->tail){ + // must never be called + TSK_DEBUG_INFO("**NACK Not Found=%d", pid); + } + } +done: + tsk_list_unlock(video->avpf.packets); + } + } + } + } + break; + } + } + } + + return 0; +} + +// From jitter buffer to codec +static int _tdav_session_video_jb_cb(const tdav_video_jb_cb_data_xt* data) +{ + tdav_session_video_t* video = (tdav_session_video_t*)data->usr_data; + tdav_session_av_t* base = (tdav_session_av_t*)data->usr_data; + + switch(data->type){ + case tdav_video_jb_cb_data_type_rtp: + { + return _tdav_session_video_decode(video, data->rtp.pkt); + } + case tdav_video_jb_cb_data_type_tmfr: + { + return trtp_manager_signal_jb_error(base->rtp_manager, data->ssrc); + } + case tdav_video_jb_cb_data_type_fl: + { + tsk_size_t i, j, k; + uint16_t seq_nums[16]; + for(i = 0; i < data->fl.count; i+=16){ + for(j = 0, k = i; j < 16 && k < data->fl.count; ++j, ++k){ + seq_nums[j] = (data->fl.seq_num + i + j); + } + trtp_manager_signal_pkt_loss(base->rtp_manager, data->ssrc, seq_nums, j); + } + break; + } + } + + return 0; +} + +int _tdav_session_video_open_decoder(tdav_session_video_t* self, uint8_t payload_type) +{ + int ret = 0; + + if((self->decoder.payload_type != payload_type) || !self->decoder.codec){ + tsk_istr_t format; + TSK_OBJECT_SAFE_FREE(self->decoder.codec); + tsk_itoa(payload_type, &format); + if(!(self->decoder.codec = tmedia_codec_find_by_format(TMEDIA_SESSION(self)->neg_codecs, format)) || !self->decoder.codec->plugin || !self->decoder.codec->plugin->decode){ + TSK_DEBUG_ERROR("%s is not a valid payload for this session", format); + ret = -2; + goto bail; + } + self->decoder.payload_type = payload_type; + } + // Open codec if not already done + if(!TMEDIA_CODEC(self->decoder.codec)->opened){ + if((ret = tmedia_codec_open(self->decoder.codec))){ + TSK_DEBUG_ERROR("Failed to open [%s] codec", self->decoder.codec->plugin->desc); + goto bail; + } + } + +bail: + return ret; +} + +static int _tdav_session_video_decode(tdav_session_video_t* self, const trtp_rtp_packet_t* packet) +{ + tdav_session_av_t* base = (tdav_session_av_t*)self; + static const trtp_rtp_header_t* rtp_header = tsk_null; + int ret = 0; + + if(!self || !packet || !packet->header){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + tsk_safeobj_lock(base); + + if(base->consumer){ + tsk_size_t out_size; + + // Find the codec to use to decode the RTP payload + if(!self->decoder.codec || self->decoder.payload_type != packet->header->payload_type){ + if((ret = _tdav_session_video_open_decoder(self, packet->header->payload_type))){ + goto bail; + } + } + + // Decode data + out_size = self->decoder.codec->plugin->decode( + self->decoder.codec, + (packet->payload.data ? packet->payload.data : packet->payload.data_const), packet->payload.size, + &self->decoder.buffer, &self->decoder.buffer_size, + packet->header + ); + // check + if(!out_size || !self->decoder.buffer){ + goto bail; + } + + // Convert decoded data to the consumer chroma and size +#define CONSUMER_INSIZE_MISMATCH ((base->consumer->video.in.width * base->consumer->video.in.height * 3)>>1 != out_size)// we have good reasons not to use 1.5f +#define CONSUMER_IN_N_DISPLAY_MISMATCH (base->consumer->video.in.width != base->consumer->video.display.width || base->consumer->video.in.height != base->consumer->video.display.height) +#define CONSUMER_DISPLAY_N_CODEC_MISMATCH (base->consumer->video.display.width != TMEDIA_CODEC_VIDEO(self->decoder.codec)->in.width || base->consumer->video.display.height != TMEDIA_CODEC_VIDEO(self->decoder.codec)->in.height) +#define CONSUMER_DISPLAY_N_CONVERTER_MISMATCH ( (self->conv.fromYUV420 && self->conv.fromYUV420->dstWidth != base->consumer->video.display.width) || (self->conv.fromYUV420 && self->conv.fromYUV420->dstHeight != base->consumer->video.display.height) ) +#define CONSUMER_CHROMA_MISMATCH (base->consumer->video.display.chroma != TMEDIA_CODEC_VIDEO(self->decoder.codec)->in.chroma) +#define DECODED_NEED_FLIP (TMEDIA_CODEC_VIDEO(self->decoder.codec)->in.flip) + + if((CONSUMER_CHROMA_MISMATCH || CONSUMER_DISPLAY_N_CODEC_MISMATCH || CONSUMER_IN_N_DISPLAY_MISMATCH || CONSUMER_INSIZE_MISMATCH || CONSUMER_DISPLAY_N_CONVERTER_MISMATCH || DECODED_NEED_FLIP)){ + + // Create video converter if not already done + if(!self->conv.fromYUV420 || CONSUMER_DISPLAY_N_CONVERTER_MISMATCH || CONSUMER_INSIZE_MISMATCH){ + TSK_OBJECT_SAFE_FREE(self->conv.fromYUV420); + // update in (set by the codec) + base->consumer->video.in.width = TMEDIA_CODEC_VIDEO(self->decoder.codec)->in.width;//decoded width + base->consumer->video.in.height = TMEDIA_CODEC_VIDEO(self->decoder.codec)->in.height;//decoded height + + // important: do not override the display size (used by the end-user) unless requested + if(base->consumer->video.display.auto_resize){ + base->consumer->video.display.width = base->consumer->video.in.width; + base->consumer->video.display.height = base->consumer->video.in.height; + } + // create converter + if(!(self->conv.fromYUV420 = tdav_converter_video_create(TMEDIA_CODEC_VIDEO(self->decoder.codec)->in.width, TMEDIA_CODEC_VIDEO(self->decoder.codec)->in.height, TMEDIA_CODEC_VIDEO(self->decoder.codec)->in.chroma, base->consumer->video.display.width, base->consumer->video.display.height, + base->consumer->video.display.chroma))){ + TSK_DEBUG_ERROR("Failed to create video converter"); + ret = -3; + goto bail; + } + } + } + + if(self->conv.fromYUV420){ + // update one-shot parameters + tdav_converter_video_init(self->conv.fromYUV420, 0/*rotation*/, TMEDIA_CODEC_VIDEO(self->decoder.codec)->in.flip); + // convert data to the consumer's chroma + out_size = tdav_converter_video_convert(self->conv.fromYUV420, self->decoder.buffer, &self->decoder.conv_buffer, &self->decoder.conv_buffer_size); + if(!out_size || !self->decoder.conv_buffer){ + TSK_DEBUG_ERROR("Failed to convert YUV420 buffer to consumer's chroma"); + ret = -4; + goto bail; + } + + tmedia_consumer_consume(base->consumer, self->decoder.conv_buffer, out_size, rtp_header); + if(!self->decoder.conv_buffer){ + /* taken by the consumer */ + self->decoder.conv_buffer_size = 0; + } + + } + else{ + tmedia_consumer_consume(base->consumer, self->decoder.buffer, out_size, rtp_header); + if(!self->decoder.buffer){ + /* taken by the consumer */ + self->decoder.buffer_size = 0; + } + } + } + +bail: + tsk_safeobj_unlock(base); + + return ret; +} + /* ============ Plugin interface ================= */ @@ -267,16 +645,27 @@ static int tdav_session_video_set(tmedia_session_t* self, const tmedia_param_t* { int ret = 0; tdav_session_video_t* video; + tdav_session_av_t* base; if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } - video = (tdav_session_video_t*)self; + if(tdav_session_av_set(TDAV_SESSION_AV(self), param) == tsk_true){ + return 0; + } - if(param->plugin_type == tmedia_ppt_consumer){ - if(!video->consumer){ + video = (tdav_session_video_t*)self; + base = (tdav_session_av_t*)self; + + if(param->plugin_type == tmedia_ppt_codec){ + tsk_mutex_lock(video->encoder.h_mutex); + ret = tmedia_codec_set((tmedia_codec_t*)video->encoder.codec, param); + tsk_mutex_unlock(video->encoder.h_mutex); + } + else if(param->plugin_type == tmedia_ppt_consumer){ + if(!base->consumer){ TSK_DEBUG_ERROR("No consumer associated to this session"); return -1; } @@ -291,10 +680,10 @@ static int tdav_session_video_set(tmedia_session_t* self, const tmedia_param_t* tsk_object_unref(codecs); } } - ret = tmedia_consumer_set(video->consumer, param); + ret = tmedia_consumer_set(base->consumer, param); } else if(param->plugin_type == tmedia_ppt_producer){ - if(!video->producer){ + if(!base->producer){ TSK_DEBUG_ERROR("No producer associated to this session"); return -1; } @@ -309,23 +698,10 @@ static int tdav_session_video_set(tmedia_session_t* self, const tmedia_param_t* tsk_object_unref(codecs); } } - ret = tmedia_producer_set(video->producer, param); + ret = tmedia_producer_set(base->producer, param); } else{ - if(param->value_type == tmedia_pvt_pchar){ - if(tsk_striequals(param->key, "remote-ip")){ - if(param->value){ - tsk_strupdate(&video->remote_ip, param->value); - } - } - else if(tsk_striequals(param->key, "local-ip")){ - tsk_strupdate(&video->local_ip, param->value); - } - else if(tsk_striequals(param->key, "local-ipver")){ - video->useIPv6 = tsk_striequals(param->value, "ipv6"); - } - } - else if(param->value_type == tmedia_pvt_int32){ + if(param->value_type == tmedia_pvt_int32){ if(tsk_striequals(param->key, "bandwidth-level")){ tsk_list_item_t* item; self->bl = (tmedia_bandwidth_level_t) TSK_TO_INT32((uint8_t*)param->value); @@ -335,22 +711,6 @@ static int tdav_session_video_set(tmedia_session_t* self, const tmedia_param_t* } tsk_object_unref(self->codecs); } - else if(tsk_striequals(param->key, "srtp-optional")){ -#if HAVE_SRTP - video->srtp_mode = (TSK_TO_INT32((uint8_t*)param->value) != 0); -#endif - } - else if(tsk_striequals(param->key, "srtp-mandatory")){ -#if HAVE_SRTP - video->srtp_mode = (TSK_TO_INT32((uint8_t*)param->value) != 0); -#endif - } - } - else if(param->value_type == tmedia_pvt_pobject){ - if(tsk_striequals(param->key, "natt-ctx")){ - TSK_OBJECT_SAFE_FREE(video->natt_ctx); - video->natt_ctx = tsk_object_ref(param->value); - } } } @@ -360,72 +720,44 @@ static int tdav_session_video_set(tmedia_session_t* self, const tmedia_param_t* static int tdav_session_video_get(tmedia_session_t* self, tmedia_param_t* param) { int ret = 0; - tdav_session_video_t* video; if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } - - video = (tdav_session_video_t*)self; - - if(param->plugin_type == tmedia_ppt_session){ - if(param->value_type == tmedia_pvt_int32){ - if(tsk_striequals(param->key, "srtp-enabled")){ -#if HAVE_SRTP - if(video->rtp_manager){ - ((int8_t*)param->value)[0] = trtp_srtp_is_active(video->rtp_manager); - } -#endif - } - } + + if(tdav_session_av_get(TDAV_SESSION_AV(self), param) == tsk_true){ + return 0; } - return 0; + TSK_DEBUG_ERROR("Not expected"); + return -2; } static int tdav_session_video_prepare(tmedia_session_t* self) { - tdav_session_video_t* video; - int ret = 0; + tdav_session_av_t* base = (tdav_session_av_t*)(self); + int ret; - video = (tdav_session_video_t*)self; - - /* set local port */ - if(!video->rtp_manager){ - if((video->rtp_manager = trtp_manager_create(video->rtcp_enabled, video->local_ip, video->useIPv6))){ - - ret = trtp_manager_set_rtp_callback(video->rtp_manager, tdav_session_video_rtp_cb, video); - ret = trtp_manager_set_port_range(video->rtp_manager, tmedia_defaults_get_rtp_port_range_start(), tmedia_defaults_get_rtp_port_range_stop()); - ret = trtp_manager_prepare(video->rtp_manager); - if(video->natt_ctx){ - ret = trtp_manager_set_natt_ctx(video->rtp_manager, video->natt_ctx); - } - } + if((ret = tdav_session_av_prepare(base))){ + TSK_DEBUG_ERROR("tdav_session_av_prepare(video) failed"); + return ret; } - /* SRTP */ -#if HAVE_SRTP - { - if(video->remote_srtp_neg.pending){ - char* str = tsk_null; - video->remote_srtp_neg.pending = tsk_false; - tsk_sprintf(&str, "%d %s inline:%s", video->remote_srtp_neg.tag, trtp_srtp_crypto_type_strings[video->remote_srtp_neg.crypto_type], video->remote_srtp_neg.key); - trtp_srtp_set_remote(video->rtp_manager, str); - TSK_FREE(str); - } + if(base->rtp_manager){ + ret = trtp_manager_set_rtp_callback(base->rtp_manager, tdav_session_video_rtp_cb, base); + ret = trtp_manager_set_rtcp_callback(base->rtp_manager, tdav_session_video_rtcp_cb, base); } -#endif - - /* Consumer will be prepared in tdav_session_video_start() */ - /* Producer will be prepared in tdav_session_video_start() */ return ret; } static int tdav_session_video_start(tmedia_session_t* self) { + int ret; tdav_session_video_t* video; + const tmedia_codec_t* codec; + tdav_session_av_t* base; if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); @@ -433,308 +765,134 @@ static int tdav_session_video_start(tmedia_session_t* self) } video = (tdav_session_video_t*)self; + base = (tdav_session_av_t*)self; - if(TSK_LIST_IS_EMPTY(self->neg_codecs)){ + // ENCODER codec + if(!(codec = tdav_session_av_get_best_neg_codec(base))){ TSK_DEBUG_ERROR("No codec matched"); return -2; } - - if(video->rtp_manager){ - int ret; - const tmedia_codec_t* codec = (const tmedia_codec_t*)TSK_LIST_FIRST_DATA(self->neg_codecs); - /* RTP/RTCP manager: use latest information. */ - ret = trtp_manager_set_rtp_remote(video->rtp_manager, video->remote_ip, video->remote_port); - trtp_manager_set_payload_type(video->rtp_manager, codec->neg_format ? atoi(codec->neg_format) : atoi(codec->format)); - ret = trtp_manager_start(video->rtp_manager); - - /* Consumer */ - if(video->consumer){ - tmedia_consumer_prepare(video->consumer, codec); - tmedia_consumer_start(video->consumer); - } - /* Producer */ - if(video->producer){ - tmedia_producer_prepare(video->producer, codec); - tmedia_producer_start(video->producer); + tsk_mutex_lock(video->encoder.h_mutex); + TSK_OBJECT_SAFE_FREE(video->encoder.codec); + video->encoder.codec = tsk_object_ref((tsk_object_t*)codec); + if(!TMEDIA_CODEC(video->encoder.codec)->opened){ + if((ret = tmedia_codec_open(video->encoder.codec))){ + TSK_DEBUG_ERROR("Failed to open [%s] codec", video->encoder.codec->plugin->desc); + return ret; } + } + tsk_mutex_unlock(video->encoder.h_mutex); - /* for test */ - //trtp_manager_send_rtp(video->rtp_manager, "test", 4, tsk_true); + // RED codec + TSK_OBJECT_SAFE_FREE(video->red.codec); + video->red.payload_type = 0; + if((video->red.codec = tsk_object_ref((tsk_object_t*)tdav_session_av_get_red_codec(base)))){ + video->red.payload_type = atoi(video->red.codec->neg_format); + if(!TMEDIA_CODEC(video->red.codec)->opened){ + if((ret = tmedia_codec_open(video->red.codec))){ + TSK_DEBUG_ERROR("Failed to open [%s] codec", video->red.codec->plugin->desc); + return ret; + } + } + } + + // ULPFEC + TSK_OBJECT_SAFE_FREE(video->ulpfec.codec); + video->ulpfec.payload_type = 0; + if((video->ulpfec.codec = tsk_object_ref((tsk_object_t*)tdav_session_av_get_ulpfec_codec(base)))){ + video->ulpfec.payload_type = atoi(video->ulpfec.codec->neg_format); + if(!TMEDIA_CODEC(video->ulpfec.codec)->opened){ + if((ret = tmedia_codec_open(video->ulpfec.codec))){ + TSK_DEBUG_ERROR("Failed to open [%s] codec", video->ulpfec.codec->plugin->desc); + return ret; + } + } + } + + if((ret = tdav_video_jb_start(video->jb))){ + TSK_DEBUG_ERROR("Failed to start jitter buffer"); return ret; } - else{ - TSK_DEBUG_ERROR("Invalid RTP/RTCP manager or neg_codecs"); - return -3; - } + + if((ret = tdav_session_av_start(base, video->encoder.codec))){ + TSK_DEBUG_ERROR("tdav_session_av_start(video) failed"); + return ret; + } + + return ret; } static int tdav_session_video_stop(tmedia_session_t* self) { - tdav_session_video_t* video; - tmedia_codec_t* codec = tsk_null; + int ret; - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - - video = (tdav_session_video_t*)self; - - /* RTP/RTCP manager */ - if(video->rtp_manager){ - trtp_manager_stop(video->rtp_manager); - } - - /* Consumer */ - if(video->consumer){ - tmedia_consumer_stop(video->consumer); - } - /* Producer */ - if(video->producer){ - tmedia_producer_stop(video->producer); - } - - /* close codec to force open() for next start (e.g SIP UPDATE with SDP) */ - if((codec = tsk_object_ref(TSK_LIST_FIRST_DATA(self->neg_codecs)))){ - tmedia_codec_close(codec); - tsk_object_unref(codec); - } - - return 0; + ret = tdav_video_jb_stop(TDAV_SESSION_VIDEO(self)->jb); + ret = tdav_session_av_stop(TDAV_SESSION_AV(self)); + TSK_OBJECT_SAFE_FREE(TDAV_SESSION_VIDEO(self)->encoder.codec); + TSK_OBJECT_SAFE_FREE(TDAV_SESSION_VIDEO(self)->decoder.codec); + return ret; } static int tdav_session_video_pause(tmedia_session_t* self) { - tdav_session_video_t* video; - - video = (tdav_session_video_t*)self; - - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - - /* Consumer */ - if(video->consumer){ - tmedia_consumer_pause(video->consumer); - } - /* Producer */ - if(video->producer){ - tmedia_producer_pause(video->producer); - } - - return 0; + return tdav_session_av_pause(TDAV_SESSION_AV(self)); } static const tsdp_header_M_t* tdav_session_video_get_lo(tmedia_session_t* self) { - tdav_session_video_t* video; - tsk_bool_t changed = tsk_false; + tsk_bool_t updated = tsk_false; + const tsdp_header_M_t* ret; + tdav_session_av_t* base = TDAV_SESSION_AV(self); - if(!self || !self->plugin){ - TSK_DEBUG_ERROR("Invalid parameter"); + + if(!(ret = tdav_session_av_get_lo(base, &updated))){ + TSK_DEBUG_ERROR("tdav_session_av_get_lo(video) failed"); return tsk_null; } - video = (tdav_session_video_t*)self; - - if(!video->rtp_manager || !video->rtp_manager->transport){ - TSK_DEBUG_ERROR("RTP/RTCP manager in invalid"); - return tsk_null; + if(updated){ + // set callbacks + _tdav_session_video_set_callbacks(self); } - - if(self->ro_changed && self->M.lo){ - /* Codecs */ - tsdp_header_A_removeAll_by_field(self->M.lo->Attributes, "fmtp"); - tsdp_header_A_removeAll_by_field(self->M.lo->Attributes, "rtpmap"); - tsk_list_clear_items(self->M.lo->FMTs); - - /* QoS */ - tsdp_header_A_removeAll_by_field(self->M.lo->Attributes, "curr"); - tsdp_header_A_removeAll_by_field(self->M.lo->Attributes, "des"); - tsdp_header_A_removeAll_by_field(self->M.lo->Attributes, "conf"); - } - - changed = (self->ro_changed || !self->M.lo); - - if(!self->M.lo){ - if((self->M.lo = tsdp_header_M_create(self->plugin->media, video->rtp_manager->rtp.public_port, "RTP/AVP"))){ - /* If NATT is active, do not rely on the global IP address Connection line */ - if(video->natt_ctx){ - tsdp_header_M_add_headers(self->M.lo, - TSDP_HEADER_C_VA_ARGS("IN", video->useIPv6 ? "IP6" : "IP4", video->rtp_manager->rtp.public_ip), - tsk_null); - } - } - else{ - TSK_DEBUG_ERROR("Failed to create lo"); - return tsk_null; - } - } - - /* from codecs to sdp */ - if(changed){ - tmedia_codecs_L_t* neg_codecs = tsk_null; - - if(self->M.ro){ - TSK_OBJECT_SAFE_FREE(self->neg_codecs); - /* update negociated codecs */ - if((neg_codecs = tmedia_session_match_codec(self, self->M.ro))){ - self->neg_codecs = neg_codecs; - // set video codec callback - if(!TSK_LIST_IS_EMPTY(self->neg_codecs)){ - tmedia_codec_video_set_callback((tmedia_codec_video_t*)TSK_LIST_FIRST_DATA(self->neg_codecs), tdav_session_video_raw_cb, self); - } - } - /* from codecs to sdp */ - if(self->neg_codecs){ - tmedia_codec_to_sdp(self->neg_codecs, self->M.lo); - } - else{ - self->M.lo->port = 0; /* Keep the RTP transport and reuse it when we receive a reINVITE or UPDATE request */ - goto DONE; - } - } - else{ - /* from codecs to sdp */ - tmedia_codec_to_sdp(self->codecs, self->M.lo); - } - - /* Hold/Resume */ - tsdp_header_M_set_holdresume_att(self->M.lo, self->lo_held, self->ro_held); - - /* SRTP */ -#if HAVE_SRTP - { - tsk_bool_t is_srtp_remote_mandatory = (self->M.ro && (tsk_striequals(self->M.ro->proto, "RTP/SAVP") || tsk_striequals(self->M.ro->proto, "RTP/SAVPF"))); - tsk_bool_t is_srtp_remote_optional = (self->M.ro && (tsdp_header_M_findA(self->M.ro, "crypto") != tsk_null)); - if((video->srtp_mode == tmedia_srtp_mode_optional && (is_srtp_remote_optional || is_srtp_remote_mandatory || !self->M.ro)) || video->srtp_mode == tmedia_srtp_mode_mandatory){ - const trtp_srtp_ctx_xt *ctx = tsk_null; - tsk_size_t ctx_count = 0, ctx_idx; - char* str = tsk_null; - // local - trtp_srtp_get_ctx_local(video->rtp_manager, &ctx, &ctx_count); - for(ctx_idx = 0; ctx_idx < ctx_count; ++ctx_idx){ - tsk_sprintf(&str, "%d %s inline:%s", ctx[ctx_idx].tag, trtp_srtp_crypto_type_strings[ctx[ctx_idx].crypto_type], ctx[ctx_idx].key_str); - tsdp_header_M_add_headers(self->M.lo, - TSDP_HEADER_A_VA_ARGS("crypto", str), - tsk_null); - TSK_FREE(str); - } - } - - if(is_srtp_remote_mandatory || (video->srtp_mode == tmedia_srtp_mode_mandatory) || trtp_srtp_is_initialized(video->rtp_manager)){ - tsk_strupdate(&self->M.lo->proto, "RTP/SAVP"); - } - } -#endif - - /* QoS */ - if(self->qos){ - tmedia_qos_tline_t* ro_tline; - if(self->M.ro && (ro_tline = tmedia_qos_tline_from_sdp(self->M.ro))){ - tmedia_qos_tline_set_ro(self->qos, ro_tline); - TSK_OBJECT_SAFE_FREE(ro_tline); - } - tmedia_qos_tline_to_sdp(self->qos, self->M.lo); - } -DONE:; - } - - return self->M.lo; + + return ret; } static int tdav_session_video_set_ro(tmedia_session_t* self, const tsdp_header_M_t* m) { - tdav_session_video_t* video; - tmedia_codecs_L_t* neg_codecs; - tsk_bool_t is_srtp_remote_mandatory; - tsk_bool_t crypto_matched = tsk_false; + int ret; + tsk_bool_t updated = tsk_false; + tdav_session_av_t* base = TDAV_SESSION_AV(self); - if(!self || !m){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; + if((ret = tdav_session_av_set_ro(base, m, &updated))){ + TSK_DEBUG_ERROR("tdav_session_av_set_ro(video) failed"); + return ret; } - video = (tdav_session_video_t*)self; + if(updated){ + // set callbacks + ret = _tdav_session_video_set_callbacks(self); + } - /* update remote offer */ - TSK_OBJECT_SAFE_FREE(self->M.ro); - self->M.ro = tsk_object_ref((void*)m); - - is_srtp_remote_mandatory = (tsk_striequals(m->proto, "RTP/SAVP") || tsk_striequals(m->proto, "RTP/SAVPF")); - - if(self->M.lo){ - if((neg_codecs = tmedia_session_match_codec(self, m))){ - /* update negociated codecs */ - TSK_OBJECT_SAFE_FREE(self->neg_codecs); - self->neg_codecs = neg_codecs; - // set codec callback - if(!TSK_LIST_IS_EMPTY(self->neg_codecs)){ - tmedia_codec_video_set_callback((tmedia_codec_video_t*)TSK_LIST_FIRST_DATA(self->neg_codecs), tdav_session_video_raw_cb, self); - } - } - else{ - return -1; - } - - /* QoS */ - if(self->qos){ - tmedia_qos_tline_t* ro_tline; - if(self->M.ro && (ro_tline = tmedia_qos_tline_from_sdp(self->M.ro))){ - tmedia_qos_tline_set_ro(self->qos, ro_tline); - TSK_OBJECT_SAFE_FREE(ro_tline); - } - } - } - - /* get connection associated to this media line - * If the connnection is global, then the manager will call tdav_session_video_set() */ - if(m->C && m->C->addr){ - tsk_strupdate(&video->remote_ip, m->C->addr); - video->useIPv6 = tsk_striequals(m->C->addrtype, "IP6"); - } - /* set remote port */ - video->remote_port = m->port; - - /* SRTP */ -#if HAVE_SRTP - if(video->srtp_mode == tmedia_srtp_mode_optional || video->srtp_mode == tmedia_srtp_mode_mandatory){ - tsk_size_t i = 0; - const tsdp_header_A_t* A; - int ret; - while((A = tsdp_header_M_findA_at(m, "crypto", i++))){ - if(video->rtp_manager){ - if((ret = trtp_srtp_set_remote(video->rtp_manager, A->value)) == 0){ - crypto_matched = tsk_true; - break; - } - } - else{ - int ret; - if((ret = trtp_srtp_match_line(A->value, &video->remote_srtp_neg.tag, (int32_t*)&video->remote_srtp_neg.crypto_type, video->remote_srtp_neg.key, (sizeof(video->remote_srtp_neg.key) - 1))) == 0){ - crypto_matched = tsk_true; - video->remote_srtp_neg.pending = tsk_true; - break; - } - } - } - if((video->srtp_mode == tmedia_srtp_mode_mandatory) && !crypto_matched){// local require but none match - TSK_DEBUG_ERROR("SRTP negotiation failed"); - return -3; - } - } -#endif - - if(is_srtp_remote_mandatory && !crypto_matched){// remote require but none match - TSK_DEBUG_ERROR("SRTP negotiation failed"); - return -4; - } - - return 0; + return ret; } - +static int _tdav_session_video_set_callbacks(tmedia_session_t* self) +{ + if(self){ + tsk_list_item_t* item; + tsk_list_foreach(item, TMEDIA_SESSION(self)->neg_codecs){ + // set codec callbacks + tmedia_codec_video_set_enc_callback(TMEDIA_CODEC_VIDEO(item->data), tdav_session_video_raw_cb, self); + tmedia_codec_video_set_dec_callback(TMEDIA_CODEC_VIDEO(item->data), tdav_session_video_decode_cb, self); + // set RED callback: redundant data to decode and send to the consumer + if(TMEDIA_CODEC(item->data)->plugin == tdav_codec_red_plugin_def_t){ + tdav_codec_red_set_callback((struct tdav_codec_red_s *)(item->data), tdav_session_video_rtp_cb, self); + } + } + } + return 0; +} @@ -744,57 +902,74 @@ static int tdav_session_video_set_ro(tmedia_session_t* self, const tsdp_header_M /* constructor */ static tsk_object_t* tdav_session_video_ctor(tsk_object_t * self, va_list * app) { - tdav_session_video_t *session = self; - if(session){ - /* init base: called by tmedia_session_create() */ - /* init self */ - tsk_safeobj_init(session); - if(!(session->consumer = tmedia_consumer_create(tdav_session_video_plugin_def_t->type, TMEDIA_SESSION(session)->id))){ - TSK_DEBUG_ERROR("Failed to create Video consumer"); - } - if((session->producer = tmedia_producer_create(tdav_session_video_plugin_def_t->type, TMEDIA_SESSION(session)->id))){ - tmedia_producer_set_enc_callback(session->producer, tdav_session_video_producer_enc_cb, self); - tmedia_producer_set_raw_callback(session->producer, tdav_session_video_raw_cb, self); - } - else{ - TSK_DEBUG_ERROR("Failed to create Video producer"); - } + tdav_session_video_t *video = self; + if(video){ + int ret; + tdav_session_av_t *base = TDAV_SESSION_AV(self); + static const tsk_bool_t is_audio = tsk_false; -#if HAVE_SRTP - session->srtp_mode = tmedia_defaults_get_srtp_mode(); -#endif + /* init() base */ + if((ret = tdav_session_av_init(base, is_audio)) != 0){ + TSK_DEBUG_ERROR("tdav_session_av_init(video) failed"); + return tsk_null; + } + + /* init() self */ + if(!(video->encoder.h_mutex = tsk_mutex_create())){ + TSK_DEBUG_ERROR("Failed to create encode mutex"); + return tsk_null; + } + if(!(video->avpf.packets = tsk_list_create())){ + TSK_DEBUG_ERROR("Failed to create list"); + return tsk_null; + } + if(!(video->jb = tdav_video_jb_create())){ + TSK_DEBUG_ERROR("Failed to create jitter buffer"); + return tsk_null; + } + tdav_video_jb_set_callback(video->jb, _tdav_session_video_jb_cb, video); + + if(base->producer){ + tmedia_producer_set_enc_callback(base->producer, tdav_session_video_producer_enc_cb, self); + tmedia_producer_set_raw_callback(base->producer, tdav_session_video_raw_cb, self); + } + video->avpf.max = TDAV_SESSION_VIDEO_AVPF_PACKETS_MAX_MIN; + video->encoder.pkt_loss_level = tdav_session_video_pkt_loss_level_low; + video->encoder.pkt_loss_prob_bad = 0; // honor first report + video->encoder.pkt_loss_prob_good = TDAV_SESSION_VIDEO_PKT_LOSS_PROB_GOOD; } return self; } /* destructor */ static tsk_object_t* tdav_session_video_dtor(tsk_object_t * self) { - tdav_session_video_t *session = self; - if(session){ - - // Do it in this order (deinit self first) - + tdav_session_video_t *video = self; + if(video){ + tdav_session_video_stop((tmedia_session_t*)video); // deinit self (rtp manager should be destroyed after the producer) - TSK_OBJECT_SAFE_FREE(session->consumer); - TSK_OBJECT_SAFE_FREE(session->producer); - TSK_OBJECT_SAFE_FREE(session->conv.toYUV420); - TSK_OBJECT_SAFE_FREE(session->conv.fromYUV420); - TSK_OBJECT_SAFE_FREE(session->rtp_manager); - TSK_FREE(session->remote_ip); - TSK_FREE(session->local_ip); + TSK_OBJECT_SAFE_FREE(video->conv.toYUV420); + TSK_OBJECT_SAFE_FREE(video->conv.fromYUV420); - TSK_FREE(session->encoder.buffer); - TSK_FREE(session->encoder.conv_buffer); - TSK_FREE(session->decoder.buffer); - TSK_FREE(session->decoder.conv_buffer); + TSK_FREE(video->encoder.buffer); + TSK_FREE(video->encoder.conv_buffer); + TSK_FREE(video->decoder.buffer); + TSK_FREE(video->decoder.conv_buffer); - // NAT Traversal context - TSK_OBJECT_SAFE_FREE(session->natt_ctx); + TSK_OBJECT_SAFE_FREE(video->encoder.codec); + TSK_OBJECT_SAFE_FREE(video->decoder.codec); + TSK_OBJECT_SAFE_FREE(video->red.codec); + TSK_OBJECT_SAFE_FREE(video->ulpfec.codec); - tsk_safeobj_deinit(session); + TSK_OBJECT_SAFE_FREE(video->avpf.packets); - // deinit base - tmedia_session_deinit(self); + TSK_OBJECT_SAFE_FREE(video->jb); + + if(video->encoder.h_mutex){ + tsk_mutex_destroy(&video->encoder.h_mutex); + } + + /* deinit() base */ + tdav_session_av_deinit(TDAV_SESSION_AV(video)); } return self; diff --git a/branches/2.0/doubango/tinyDAV/src/video/tdav_video_jitterbuffer.c b/branches/2.0/doubango/tinyDAV/src/video/tdav_video_jitterbuffer.c deleted file mode 100644 index 8a61e8da..00000000 --- a/branches/2.0/doubango/tinyDAV/src/video/tdav_video_jitterbuffer.c +++ /dev/null @@ -1,299 +0,0 @@ -/* -* Copyright (C) 2011 Doubango Telecom -* -* Contact: Mamadou Diop -* -* This file is part of Open Source Doubango Framework. -* -* DOUBANGO is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* DOUBANGO is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with DOUBANGO. -* -*/ - -/**@file tdav_video_jitterbuffer.c - * @brief Video Jitter Buffer - * - * @author Mamadou Diop - */ -#include "tinydav/video/tdav_video_jitterbuffer.h" - -#include "tinyrtp/rtp/trtp_rtp_header.h" - -#include "tsk_debug.h" - -#define TDAV_VIDEO_JB_TAIL 1000 // in milliseconds - -// Internal functions -static tdav_video_jitterbuffer_packet_t* _tdav_video_jitterbuffer_packet_create(void* data, tsk_size_t data_size); - - - -static int tdav_video_jitterbuffer_set(tmedia_jitterbuffer_t *self, const tmedia_param_t* param) -{ - TSK_DEBUG_ERROR("Not implemented"); - return -2; -} - -static int tdav_video_jitterbuffer_open(tmedia_jitterbuffer_t* self, uint32_t frame_duration, uint32_t rate) -{ - tdav_video_jitterbuffer_t *jb = (tdav_video_jitterbuffer_t *)self; - - if(!jb->packets && !(jb->packets = tsk_list_create())){ - TSK_DEBUG_ERROR("Failed to create list"); - return -2; - } - if(!jb->timer && !(jb->timer = tsk_timer_manager_create())){ - TSK_DEBUG_ERROR("Failed to create list"); - return -3; - } - - jb->frame_duration = frame_duration; - jb->frame_max_count = (jb->tail / jb->frame_duration); - - return 0; -} - -static int tdav_video_jitterbuffer_tick(tmedia_jitterbuffer_t* self) -{ - tdav_video_jitterbuffer_t *jb = (tdav_video_jitterbuffer_t *)self; - - (jb); - - // do nothing - // only useful for audio - - return 0; -} - -static int tdav_video_jitterbuffer_put(tmedia_jitterbuffer_t* self, void* data, tsk_size_t data_size, const tsk_object_t* proto_hdr) -{ - tdav_video_jitterbuffer_t *jb = (tdav_video_jitterbuffer_t *)self; - const trtp_rtp_header_t* rtp_hdr; - register uint32_t i = 0; - tsk_bool_t item_found = tsk_false; - const tsk_list_item_t *item; - tdav_video_jitterbuffer_packet_t *jb_packet = tsk_null; - int ret = 0; - - if(!data || !data_size || !proto_hdr){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - - rtp_hdr = TRTP_RTP_HEADER(proto_hdr); - - tsk_safeobj_lock(jb); - - tsk_list_foreach(item, jb->packets){ - if(i++ == jb->frame_curr_index){ - if((jb_packet = (tdav_video_jitterbuffer_packet_t*)item->data)){ - if((ret = tsk_buffer_copy(jb_packet->data, 0, data, data_size))){ - TSK_DEBUG_ERROR("Failed to copy buffer"); - goto done; - } - } - else{ - TSK_DEBUG_ERROR("Item contains null data"); - goto done; - } - // update values - jb_packet->taken = tsk_false; - jb_packet->seq_num = rtp_hdr->seq_num; - item_found = tsk_true; - } - } - - if(!item_found && !jb_packet){ - if((jb_packet = _tdav_video_jitterbuffer_packet_create(data, data_size))){ - // update values (use constructor) - jb_packet->seq_num = rtp_hdr->seq_num; - - tsk_list_push_ascending_data(jb->packets, (void**)&jb_packet); - TSK_OBJECT_SAFE_FREE(jb_packet); - } - else{ - TSK_DEBUG_ERROR("Failed to create jb packet"); - ret = -2; - goto done; - } - } - -done: - if(ret == 0){ - jb->frame_curr_index = (++jb->frame_curr_index % jb->frame_max_count); - } - tsk_safeobj_unlock(jb); - - return ret; -} - -static tsk_size_t tdav_video_jitterbuffer_get(tmedia_jitterbuffer_t* self, void* out_data, tsk_size_t out_size) -{ - tdav_video_jitterbuffer_t *jb = (tdav_video_jitterbuffer_t *)self; - const tsk_list_item_t *item; - tdav_video_jitterbuffer_packet_t *jb_packet = tsk_null; - tsk_size_t ret_size = 0; - - if(!out_data || !out_size){ - TSK_DEBUG_ERROR("Invalid parameter"); - return 0; - } - - tsk_safeobj_lock(jb); - - tsk_list_foreach(item, jb->packets){ - if((jb_packet = (tdav_video_jitterbuffer_packet_t*)item->data) && !jb_packet->taken){ - ret_size = TSK_MIN(TSK_BUFFER_SIZE(jb_packet->data), out_size); - memcpy(out_data, TSK_BUFFER_DATA(jb_packet->data), ret_size); - jb_packet->taken = tsk_true; - break; - } - } - - tsk_safeobj_unlock(jb); - - return ret_size; -} - -static int tdav_video_jitterbuffer_reset(tmedia_jitterbuffer_t* self) -{ - tdav_video_jitterbuffer_t *jb = (tdav_video_jitterbuffer_t *)self; - - (jb); - - return 0; -} - -static int tdav_video_jitterbuffer_close(tmedia_jitterbuffer_t* self) -{ - tdav_video_jitterbuffer_t *jb = (tdav_video_jitterbuffer_t *)self; - - (jb); - - return 0; -} - - -// -// Speex jitterbuffer Packet Object definition -// -static tdav_video_jitterbuffer_packet_t* _tdav_video_jitterbuffer_packet_create(void* data, tsk_size_t data_size) -{ - tdav_video_jitterbuffer_packet_t *jb_packet; - if((jb_packet = tsk_object_new(tdav_video_jitterbuffer_packet_def_t))){ - jb_packet->data = tsk_buffer_create(data, data_size); - } - return jb_packet; -} - -/* constructor */ -static tsk_object_t* tdav_video_jitterbuffer_packet_ctor(tsk_object_t * self, va_list * app) -{ - tdav_video_jitterbuffer_packet_t *jb_packet = self; - if(jb_packet){ - TSK_OBJECT_SAFE_FREE(jb_packet->data); - tsk_safeobj_init(jb_packet); - } - return self; -} - -/* destructor */ -static tsk_object_t* tdav_video_jitterbuffer_packet_dtor(tsk_object_t * self) -{ - tdav_video_jitterbuffer_packet_t *jb_packet = self; - if(jb_packet){ - tsk_safeobj_deinit(jb_packet); - } - - return self; -} -/* comparator */ -static int tdav_video_jitterbuffer_packet_cmp(const tsk_object_t *_p1, const tsk_object_t *_p2) -{ - const tdav_video_jitterbuffer_packet_t *p1 = _p1; - const tdav_video_jitterbuffer_packet_t *p2 = _p2; - - if(p1 && p2){ - return (int)(p1->seq_num - p2->seq_num); - } - else if(!p1 && !p2) return 0; - else return -1; -} -/* object definition */ -static const tsk_object_def_t tdav_video_jitterbuffer_packet_def_s = -{ - sizeof(tdav_video_jitterbuffer_packet_t), - tdav_video_jitterbuffer_packet_ctor, - tdav_video_jitterbuffer_packet_dtor, - tdav_video_jitterbuffer_packet_cmp, -}; -const tsk_object_def_t *tdav_video_jitterbuffer_packet_def_t = &tdav_video_jitterbuffer_packet_def_s; - -// -// Speex jitterbuffer Plugin definition -// - -/* constructor */ -static tsk_object_t* tdav_video_jitterbuffer_ctor(tsk_object_t * self, va_list * app) -{ - tdav_video_jitterbuffer_t *jb = self; - if(jb){ - /* init base */ - tmedia_jitterbuffer_init(TMEDIA_JITTER_BUFFER(jb)); - /* init self */ - tsk_safeobj_init(jb); - jb->tail = TDAV_VIDEO_JB_TAIL; - } - return self; -} -/* destructor */ -static tsk_object_t* tdav_video_jitterbuffer_dtor(tsk_object_t * self) -{ - tdav_video_jitterbuffer_t *jb = self; - if(jb){ - /* deinit base */ - tmedia_jitterbuffer_deinit(TMEDIA_JITTER_BUFFER(jb)); - /* deinit self */ - TSK_OBJECT_SAFE_FREE(jb->packets); - if(jb->timer){ - tsk_timer_manager_destroy(&jb->timer); - } - tsk_safeobj_deinit(jb); - } - - return self; -} -/* object definition */ -static const tsk_object_def_t tdav_video_jitterbuffer_def_s = -{ - sizeof(tdav_video_jitterbuffer_t), - tdav_video_jitterbuffer_ctor, - tdav_video_jitterbuffer_dtor, - tsk_null, -}; -/* plugin definition*/ -static const tmedia_jitterbuffer_plugin_def_t tdav_video_jitterbuffer_plugin_def_s = -{ - &tdav_video_jitterbuffer_def_s, - tmedia_video, - "Native Video JitterBuffer", - - tdav_video_jitterbuffer_set, - tdav_video_jitterbuffer_open, - tdav_video_jitterbuffer_tick, - tdav_video_jitterbuffer_put, - tdav_video_jitterbuffer_get, - tdav_video_jitterbuffer_reset, - tdav_video_jitterbuffer_close, -}; -const tmedia_jitterbuffer_plugin_def_t *tdav_video_jitterbuffer_plugin_def_t = &tdav_video_jitterbuffer_plugin_def_s; diff --git a/branches/2.0/doubango/tinyDAV/tinyDAV.vcproj b/branches/2.0/doubango/tinyDAV/tinyDAV.vcproj index 8ec65886..d21b84e5 100644 --- a/branches/2.0/doubango/tinyDAV/tinyDAV.vcproj +++ b/branches/2.0/doubango/tinyDAV/tinyDAV.vcproj @@ -187,6 +187,10 @@ RelativePath=".\include\tinydav\tdav.h" > + + @@ -358,6 +362,18 @@ > + + + + + + - - @@ -490,6 +502,18 @@ Name="v4linux" > + + + + + + + + @@ -678,6 +706,18 @@ > + + + + + + - - @@ -810,6 +846,18 @@ Name="v4linux" > + + + + + + Release(); x = NULL; } -#define SAFE_DELETE_PTR(x) if (x) { delete x; x = NULL; } -#define SAFE_DELETE_ARRAY(x) if (x) { delete[] x; x = NULL; } +#define SAFE_RELEASE(x) if ((x)) { (x)->Release(); (x) = NULL; } +#define SAFE_DELETE_PTR(x) if ((x)) { delete (x); (x) = NULL; } +#define SAFE_DELETE_ARRAY(x) if ((x)) { delete[] (x); (x) = NULL; } #define DS_NANOS_TO_100NS(NANOS) (((LONGLONG)(NANOS)) / 100ui64) #define DS_MICROS_TO_100NS(MICROS) (((LONGLONG)(MICROS)) * 10ui64) @@ -63,6 +63,8 @@ // -------------------------------------------------------------------------------- +HWND GetMainWindow(); + bool IsMainThread(); IPin *GetPin(IBaseFilter *pFilter, PIN_DIRECTION dir); @@ -75,4 +77,6 @@ bool DisconnectAllFilters(IGraphBuilder *graphBuilder); bool RemoveAllFilters(IGraphBuilder *graphBuilder); +int createOnUIThead(HWND hWnd, void** ppRet, bool display); + #endif /* TINYDSHOW_DUTILS_H */ diff --git a/branches/2.0/doubango/tinyDSHOW/src/DSDisplay.cxx b/branches/2.0/doubango/tinyDSHOW/src/DSDisplay.cxx index 40d57edc..e3a14913 100644 --- a/branches/2.0/doubango/tinyDSHOW/src/DSDisplay.cxx +++ b/branches/2.0/doubango/tinyDSHOW/src/DSDisplay.cxx @@ -61,7 +61,7 @@ static int __pred_find_display_by_hwnd(const tsk_list_item_t *item, const void * } // C Callback that dispatch event to the right display -LRESULT CALLBACK __directshow__WndProcWindow(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +static LRESULT CALLBACK __directshow__WndProcWindow(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LRESULT result = FALSE; @@ -80,7 +80,6 @@ LRESULT CALLBACK __directshow__WndProcWindow(HWND hWnd, UINT uMsg, WPARAM wParam } - DSDisplay::DSDisplay(HRESULT *hr) { this->window = NULL; @@ -434,7 +433,10 @@ void DSDisplay::hook() } this->hooked = TRUE; - tsk_list_lock(__directshow__Displays); + bool lock = (__directshow__Displays != NULL); + + if(lock) + tsk_list_lock(__directshow__Displays); { // Gets the parent Window procedure #if defined(_WIN32_WCE) @@ -448,7 +450,8 @@ void DSDisplay::hook() tsk_object_new(tdshow_display_def_t, this->window, this); #endif } - tsk_list_unlock(__directshow__Displays); + if(lock) + tsk_list_unlock(__directshow__Displays); RECT rect; GetWindowRect(this->window, &rect); @@ -501,8 +504,9 @@ void DSDisplay::unhook() hr = this->graph->getVideoWindow()->put_AutoShow(OAFALSE); #endif - - tsk_list_lock(__directshow__Displays); + bool lock = (__directshow__Displays != NULL); + if(lock) + tsk_list_lock(__directshow__Displays); { // Remove this instance from the callback map tsk_list_remove_item_by_pred(__directshow__Displays, __pred_find_display_by_hwnd, &this->window); @@ -515,7 +519,8 @@ void DSDisplay::unhook() SetWindowLongPtr(this->window, GWL_WNDPROC, (LONG) this->parentWindowProc); #endif } - tsk_list_unlock(__directshow__Displays); + if(lock) + tsk_list_unlock(__directshow__Displays); this->hooked = FALSE; } @@ -530,9 +535,6 @@ void DSDisplay::unhook() - - - //================================================================================================= // String object definition // @@ -559,9 +561,9 @@ static tsk_object_t* tdshow_display_dtor(tsk_object_t * self) if(display){ if(__directshow__Displays){ tsk_list_remove_item_by_data(__directshow__Displays, display); - if(TSK_LIST_IS_EMPTY(__directshow__Displays)){ - TSK_OBJECT_SAFE_FREE(__directshow__Displays); - } + //if(TSK_LIST_IS_EMPTY(__directshow__Displays)){ + // TSK_OBJECT_SAFE_FREE(__directshow__Displays); + //} } } diff --git a/branches/2.0/doubango/tinyDSHOW/src/DSUtils.cxx b/branches/2.0/doubango/tinyDSHOW/src/DSUtils.cxx index 9c1c63af..49d4de5b 100644 --- a/branches/2.0/doubango/tinyDSHOW/src/DSUtils.cxx +++ b/branches/2.0/doubango/tinyDSHOW/src/DSUtils.cxx @@ -24,12 +24,24 @@ #include #include -bool IsMainThread() +#include "tsk_debug.h" + +HWND GetMainWindow() { - HWND hWnd = GetActiveWindow(); - if(!hWnd) hWnd = GetForegroundWindow(); - if(!hWnd) hWnd = GetConsoleWindow(); - + HWND hWnd; + if(!(hWnd = GetActiveWindow())){ + if(!(hWnd = GetForegroundWindow())){ + if(!(hWnd = GetConsoleWindow())){ + return NULL; + } + } + } + return hWnd; +} + +bool IsMainThread() +{ + HWND hWnd = GetMainWindow(); if(hWnd){ DWORD mainTid = GetWindowThreadProcessId(hWnd, NULL); DWORD currentTid = GetCurrentThreadId(); @@ -153,3 +165,106 @@ bool RemoveAllFilters(IGraphBuilder *graphBuilder) filterEnum.Release(); return true; } + + +#include +#include + +#define WM_CREATE_DISPLAY_ON_UI_THREAD (WM_USER + 101) +#define WM_CREATE_GRABBER_ON_UI_THREAD (WM_CREATE_DISPLAY_ON_UI_THREAD + 1) +#define WM_CREATE_ON_UI_THREAD_TIMEOUT 1000 + +// C Callback that dispatch event to create display on UI thread +static LRESULT CALLBACK __create__WndProcWindow(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + HANDLE* event = reinterpret_cast(wParam); + + if(event && lParam){ + switch(uMsg){ + case WM_CREATE_DISPLAY_ON_UI_THREAD: + { + HRESULT hr; + DSDisplay** ppDisplay = reinterpret_cast(lParam); + *ppDisplay = new DSDisplay(&hr); + SetEvent(event); + break; + } + case WM_CREATE_GRABBER_ON_UI_THREAD: + { + HRESULT hr; + DSGrabber** ppGrabber = reinterpret_cast(lParam); + *ppGrabber = new DSGrabber(&hr); + SetEvent(event); + break; + } + } + } + return DefWindowProc(hWnd, uMsg, wParam, lParam); +} + +int createOnUIThead(HWND hWnd, void** ppRet, bool display) +{ + if(!ppRet){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if(IsMainThread()){ + HRESULT hr; + if(display) *ppRet = new DSDisplay(&hr); + else *ppRet = new DSGrabber(&hr); + if(FAILED(hr)){ + TSK_DEBUG_ERROR("Failed to created DirectShow %s", display ? "Display" : "Grabber"); + SAFE_DELETE_PTR(*ppRet); + return -2; + } + return 0; + } + else{ + + HANDLE event = NULL; + int ret = 0; + DWORD retWait, retryCount = 3; + + if(!hWnd){ + if(!(hWnd = FindWindowA(NULL, "Boghe - IMS/RCS Client"))){ + if(!(hWnd = GetMainWindow())){ + TSK_DEBUG_ERROR("No Window handle could be used"); + return -2; + } + } + } + + WNDPROC wndProc = (WNDPROC) SetWindowLongPtr(hWnd, GWL_WNDPROC, (LONG) __create__WndProcWindow); + if(!wndProc){ + TSK_DEBUG_ERROR("SetWindowLongPtr() failed"); + return -3; + } + + if(!(event = CreateEvent(NULL, TRUE, FALSE, NULL))){ + TSK_DEBUG_ERROR("Failed to create new event"); + ret = -4; goto bail; + } + + if(!PostMessageA(hWnd, display ? WM_CREATE_DISPLAY_ON_UI_THREAD : WM_CREATE_GRABBER_ON_UI_THREAD, reinterpret_cast(event), reinterpret_cast(ppRet))){ + TSK_DEBUG_ERROR("PostMessageA() failed"); + ret = -5; goto bail; + } + + do{ + retWait = WaitForSingleObject(event, WM_CREATE_ON_UI_THREAD_TIMEOUT); + } + while(retryCount-- > 0 && (retWait == WAIT_TIMEOUT)); + + bail: + // restore + if(hWnd && wndProc){ + SetWindowLongPtr(hWnd, GWL_WNDPROC, (LONG)wndProc); + } + if(event){ + CloseHandle(event); + } + + return ret; + } +} \ No newline at end of file diff --git a/branches/2.0/doubango/tinyDSHOW/src/plugin/DSConsumer.cxx b/branches/2.0/doubango/tinyDSHOW/src/plugin/DSConsumer.cxx index 259cc1ca..d4619457 100644 --- a/branches/2.0/doubango/tinyDSHOW/src/plugin/DSConsumer.cxx +++ b/branches/2.0/doubango/tinyDSHOW/src/plugin/DSConsumer.cxx @@ -54,17 +54,21 @@ int tdshow_consumer_set(tmedia_consumer_t *self, const tmedia_param_t* param) if(param->value_type == tmedia_pvt_int64){ if(tsk_striequals(param->key, "remote-hwnd")){ - INT64 hWnd = (INT64)*((int64_t*)param->value); + DSCONSUMER(self)->window = (INT64)*((int64_t*)param->value); if(DSCONSUMER(self)->display){ - if(hWnd){ - DSCONSUMER(self)->display->attach(hWnd); + if(DSCONSUMER(self)->window){ + DSCONSUMER(self)->display->attach(DSCONSUMER(self)->window); } else{ DSCONSUMER(self)->display->detach(); } } - else{ - DSCONSUMER(self)->window = hWnd; + } + } + else if(param->value_type == tmedia_pvt_int32){ + if(tsk_striequals(param->key, "fullscreen")){ + if(DSCONSUMER(self)->display){ + DSCONSUMER(self)->display->setFullscreen(*((int32_t*)param->value) != 0); } } } @@ -99,7 +103,6 @@ int tdshow_consumer_prepare(tmedia_consumer_t* self, const tmedia_codec_t* codec int tdshow_consumer_start(tmedia_consumer_t* self) { tdshow_consumer_t* consumer = (tdshow_consumer_t*)self; - HRESULT hr; if(!consumer){ TSK_DEBUG_ERROR("Invalid parameter"); @@ -107,22 +110,18 @@ int tdshow_consumer_start(tmedia_consumer_t* self) } if(consumer->started){ - TSK_DEBUG_WARN("Producer already started"); return 0; } - if(!consumer->display){ /* Last chance to create the display */ - if(!IsMainThread()){ - TSK_DEBUG_WARN("Creating DirectShow objects outside the MainThread"); - } - // create display - consumer->display = new DSDisplay(&hr); - if(FAILED(hr)){ - TSK_DEBUG_ERROR("Failed to created DirectShow Display"); - SAFE_DELETE_PTR(consumer->display); + // create display on UI thread + if(!consumer->display){ + createOnUIThead(reinterpret_cast((void*)consumer->window), (void**)&consumer->display, true); + if(!consumer->display){ + TSK_DEBUG_ERROR("Failed to create display"); return -2; } } + // Set parameters consumer->display->setFps(TMEDIA_CONSUMER(consumer)->video.fps); // do not change the display size: see hook() @@ -132,10 +131,8 @@ int tdshow_consumer_start(tmedia_consumer_t* self) } // Start display - TSK_DEBUG_INFO("Before starting DirectShow consumer"); consumer->display->start(); consumer->started = tsk_true; - TSK_DEBUG_INFO("After starting DirectShow consumer"); return 0; } @@ -182,7 +179,6 @@ int tdshow_consumer_stop(tmedia_consumer_t* self) } if(!consumer->started){ - TSK_DEBUG_WARN("Consumer not started"); return 0; } @@ -210,8 +206,6 @@ static tsk_object_t* tdshow_consumer_ctor(tsk_object_t * self, va_list * app) tdshow_consumer_t *consumer = (tdshow_consumer_t *)self; if(consumer){ - HRESULT hr; - /* init base */ tmedia_consumer_init(TMEDIA_CONSUMER(consumer)); TMEDIA_CONSUMER(consumer)->video.display.chroma = tmedia_chroma_bgr24; // RGB24 on x86 (little endians) stored as BGR24 @@ -221,14 +215,6 @@ static tsk_object_t* tdshow_consumer_ctor(tsk_object_t * self, va_list * app) TMEDIA_CONSUMER(consumer)->video.display.width = 352; TMEDIA_CONSUMER(consumer)->video.display.height = 288; TMEDIA_CONSUMER(consumer)->video.display.auto_resize = tsk_true; - - if(IsMainThread()){ - consumer->display = new DSDisplay(&hr); - if(FAILED(hr)){ - TSK_DEBUG_ERROR("Failed to created DirectShow Display"); - SAFE_DELETE_PTR(consumer->display); - } - } } return self; } diff --git a/branches/2.0/doubango/tinyDSHOW/src/plugin/DSProducer.cxx b/branches/2.0/doubango/tinyDSHOW/src/plugin/DSProducer.cxx index 655ae1aa..64552c2d 100644 --- a/branches/2.0/doubango/tinyDSHOW/src/plugin/DSProducer.cxx +++ b/branches/2.0/doubango/tinyDSHOW/src/plugin/DSProducer.cxx @@ -67,11 +67,9 @@ static int tdshow_producer_set(tmedia_producer_t *self, const tmedia_param_t* pa if(param->value_type == tmedia_pvt_int64){ if(tsk_striequals(param->key, "local-hwnd")){ + DSPRODUCER(producer)->previewHwnd = (INT64)*((int64_t*)param->value); if(DSPRODUCER(producer)->grabber && DSPRODUCER(self)->grabber->preview){ - DSPRODUCER(producer)->grabber->preview->attach((INT64)*((int64_t*)param->value)); - } - else{ - DSPRODUCER(producer)->previewHwnd = (INT64)*((int64_t*)param->value); + DSPRODUCER(producer)->grabber->preview->attach(DSPRODUCER(producer)->previewHwnd); } } } @@ -111,7 +109,6 @@ static int tdshow_producer_prepare(tmedia_producer_t* self, const tmedia_codec_t static int tdshow_producer_start(tmedia_producer_t* self) { tdshow_producer_t* producer = (tdshow_producer_t*)self; - HRESULT hr; if(!producer){ TSK_DEBUG_ERROR("Invalid parameter"); @@ -119,18 +116,14 @@ static int tdshow_producer_start(tmedia_producer_t* self) } if(producer->started){ - TSK_DEBUG_WARN("Producer already started"); return 0; } - if(!producer->grabber){ /* Last chance to greate the graber */ - if(!IsMainThread()){ - TSK_DEBUG_WARN("Creating DirectShow objects outside the MainThread"); - } - producer->grabber = new DSGrabber(&hr); - if(FAILED(hr)){ - TSK_DEBUG_ERROR("Failed to created DirectShow Grabber"); - SAFE_DELETE_PTR(producer->grabber); + // create grabber on UI thread + if(!producer->grabber){ + createOnUIThead(reinterpret_cast((void*)DSPRODUCER(producer)->previewHwnd), (void**)&producer->grabber, false); + if(!producer->grabber){ + TSK_DEBUG_ERROR("Failed to create grabber"); return -2; } } @@ -153,12 +146,10 @@ static int tdshow_producer_start(tmedia_producer_t* self) } // start grabber - TSK_DEBUG_INFO("Before starting DirectShow producer"); if(!producer->mute){ producer->grabber->start(); } producer->started = tsk_true; - TSK_DEBUG_INFO("After starting DirectShow producer"); return 0; } @@ -192,7 +183,6 @@ static int tdshow_producer_stop(tmedia_producer_t* self) } if(!producer->started){ - TSK_DEBUG_WARN("Producer not started"); return 0; } @@ -218,8 +208,6 @@ static tsk_object_t* tdshow_producer_ctor(tsk_object_t * self, va_list * app) tdshow_producer_t *producer = (tdshow_producer_t *)self; if(producer){ - HRESULT hr; - /* init base */ tmedia_producer_init(TMEDIA_PRODUCER(producer)); TMEDIA_PRODUCER(producer)->video.chroma = tmedia_chroma_bgr24; // RGB24 on x86 (little endians) stored as BGR24 @@ -227,14 +215,6 @@ static tsk_object_t* tdshow_producer_ctor(tsk_object_t * self, va_list * app) TMEDIA_PRODUCER(producer)->video.fps = 15; TMEDIA_PRODUCER(producer)->video.width = 352; TMEDIA_PRODUCER(producer)->video.height = 288; - - if(IsMainThread()){ - producer->grabber = new DSGrabber(&hr); - if(FAILED(hr)){ - TSK_DEBUG_ERROR("Failed to created DirectShow Grabber"); - SAFE_DELETE_PTR(producer->grabber); - } - } } return self; } @@ -243,7 +223,6 @@ static tsk_object_t* tdshow_producer_dtor(tsk_object_t * self) { tdshow_producer_t *producer = (tdshow_producer_t *)self; if(producer){ - /* stop */ if(producer->started){ tdshow_producer_stop((tmedia_producer_t*)self); @@ -258,7 +237,6 @@ static tsk_object_t* tdshow_producer_dtor(tsk_object_t * self) tmedia_producer_deinit(TMEDIA_PRODUCER(producer)); /* deinit self */ SAFE_DELETE_PTR(producer->grabber); - } return self; diff --git a/branches/2.0/doubango/tinyDSHOW/tinyDSHOW.vcproj b/branches/2.0/doubango/tinyDSHOW/tinyDSHOW.vcproj index 5f49ed2f..94f7ea75 100644 --- a/branches/2.0/doubango/tinyDSHOW/tinyDSHOW.vcproj +++ b/branches/2.0/doubango/tinyDSHOW/tinyDSHOW.vcproj @@ -42,7 +42,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="..\thirdparties\win32\include;"$(PSDK_DIR)include";"$(DXSDK_DIR)include";..\thirdparties\win32\include\directshow;include;..\tinySAK\src;..\tinyMEDIA\include;..\tinySDP\include" - PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;TINYDSHOW_EXPORTS;_WIN32_WINNT=0x0501" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;TINYDSHOW_EXPORTS;_WIN32_WINNT=0x0501;DEBUG_LEVEL=DEBUG_LEVEL_INFO" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" diff --git a/branches/2.0/doubango/tinyHTTP/include/thttp.h b/branches/2.0/doubango/tinyHTTP/include/thttp.h index d02fb9dc..823be257 100644 --- a/branches/2.0/doubango/tinyHTTP/include/thttp.h +++ b/branches/2.0/doubango/tinyHTTP/include/thttp.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file thttp.h * @brief HTTP (RFC 2616) and HTTP basic/digest authetication (RFC 2617) implementations. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp.h index 5e857feb..ae5a6ecf 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tinyhttp.h * @brief API functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/auth/thttp_auth.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/auth/thttp_auth.h index 2a16bfc2..46d783b7 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/auth/thttp_auth.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/auth/thttp_auth.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file thttp_auth.h * @brief HTTP basic/digest authetication (RFC 2617) implementations. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/auth/thttp_challenge.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/auth/thttp_challenge.h index c6734057..bc7e14f0 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/auth/thttp_challenge.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/auth/thttp_challenge.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_challenge.h * @brief HTTP authentication challenge. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header.h index 0cc8841f..13d7dc26 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_header.h * @brief Defines a HTTP header (field-name: field-value). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Authorization.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Authorization.h index 81a21a3d..d2c78fda 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Authorization.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Authorization.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_header_Authorization.h * @brief HTTP header 'Authorization'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Content_Length.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Content_Length.h index 3b075e88..f8ba9e0b 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Content_Length.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Content_Length.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_header_Content_Length.h * @brief HTTP header 'Content-Length'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Content_Type.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Content_Type.h index 307aeaa4..89f167cc 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Content_Type.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Content_Type.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_header_Content_Type.h * @brief HTTP header 'Content-Type'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Dummy.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Dummy.h index 97cc8c65..77943b05 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Dummy.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Dummy.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_header_Dummy.h * @brief HTTP dummy header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_ETag.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_ETag.h index ab0682ed..21bba415 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_ETag.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_ETag.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_header_ETag.h * @brief HTTP 'ETag' header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Transfer_Encoding.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Transfer_Encoding.h index 53b7a1aa..cc666492 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Transfer_Encoding.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_Transfer_Encoding.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_header_Transfer_Encoding.h * @brief HTTP header 'Transfer-Encoding'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_WWW_Authenticate.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_WWW_Authenticate.h index 14696ff7..55522b70 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_WWW_Authenticate.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/headers/thttp_header_WWW_Authenticate.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_header_WWW_Authenticate.h * @brief HTTP header 'WWW-Authenticate'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/parsers/thttp_parser_header.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/parsers/thttp_parser_header.h index 6232861b..cd42b9d4 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/parsers/thttp_parser_header.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/parsers/thttp_parser_header.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_parser_header.h * @brief HTTP headers parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/parsers/thttp_parser_message.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/parsers/thttp_parser_message.h index 11a2732e..2c32a4ea 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/parsers/thttp_parser_message.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/parsers/thttp_parser_message.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_parser_message.h * @brief HTTP message parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/parsers/thttp_parser_url.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/parsers/thttp_parser_url.h index 437c2170..bb221bec 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/parsers/thttp_parser_url.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/parsers/thttp_parser_url.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_parser_url.h * @brief HTTP/HTTPS URL parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_action.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_action.h index 1b956f8a..aded62c0 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_action.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_action.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_action.h * @brief HTTP action. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_dialog.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_dialog.h index e435feba..04685275 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_dialog.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_dialog.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_dialog.h * @brief HTTP Dialog. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_event.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_event.h index a53dcbd4..c07833ad 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_event.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_event.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_event.h * @brief HTTP/HTTPS event. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_message.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_message.h index e216a328..6b896885 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_message.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_message.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ * @brief Represents a HTTP message. A HTTP message is either a request from a client to a server, or a * response from a server to a client. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_session.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_session.h index 62e0c27b..22aded24 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_session.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_session.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_session.h * @brief HTTP session. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_url.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_url.h index 0ad91d08..049f9988 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_url.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp/thttp_url.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_url.h * @brief HTTP/HTTPS URL. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/include/tinyhttp_config.h b/branches/2.0/doubango/tinyHTTP/include/tinyhttp_config.h index 468de4e7..abc61423 100644 --- a/branches/2.0/doubango/tinyHTTP/include/tinyhttp_config.h +++ b/branches/2.0/doubango/tinyHTTP/include/tinyhttp_config.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinyHTTP/ragel/thttp_machine_header.rl b/branches/2.0/doubango/tinyHTTP/ragel/thttp_machine_header.rl index db1dda07..d56c53bd 100644 --- a/branches/2.0/doubango/tinyHTTP/ragel/thttp_machine_header.rl +++ b/branches/2.0/doubango/tinyHTTP/ragel/thttp_machine_header.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file thttp_machine_headers.rl. * @brief Ragel file. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/ragel/thttp_machine_message.rl b/branches/2.0/doubango/tinyHTTP/ragel/thttp_machine_message.rl index ee0bc37c..46ea995b 100644 --- a/branches/2.0/doubango/tinyHTTP/ragel/thttp_machine_message.rl +++ b/branches/2.0/doubango/tinyHTTP/ragel/thttp_machine_message.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file thttp_machine_message.rl * @brief Ragel file. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/ragel/thttp_machine_utils.rl b/branches/2.0/doubango/tinyHTTP/ragel/thttp_machine_utils.rl index 317a7165..7196f3fe 100644 --- a/branches/2.0/doubango/tinyHTTP/ragel/thttp_machine_utils.rl +++ b/branches/2.0/doubango/tinyHTTP/ragel/thttp_machine_utils.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file thttp_machine_utils.rl * @brief Ragel file. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header.rl b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header.rl index 1dfc72f0..046cf4ab 100644 --- a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header.rl +++ b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_parser_header.c * @brief HTTP headers parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Authorization.rl b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Authorization.rl index afe0be08..4c2ee88e 100644 --- a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Authorization.rl +++ b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Authorization.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_header_Authorization.c * @brief HTTP Authorization header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Content_Length.rl b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Content_Length.rl index 2bfe5380..f7b2124d 100644 --- a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Content_Length.rl +++ b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Content_Length.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_header_Content_Length.c * @brief HTTP Content-Length header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Content_Type.rl b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Content_Type.rl index 717cdd9f..ab99dd2d 100644 --- a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Content_Type.rl +++ b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Content_Type.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_header_Content_Type.c * @brief HTTP Content-Type header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Dummy.rl b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Dummy.rl index d4ce2616..971a6db3 100644 --- a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Dummy.rl +++ b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Dummy.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_header_Dummy.c * @brief HTTP 'Dummy' header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_ETag.rl b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_ETag.rl index 16fa170c..31069cb2 100644 --- a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_ETag.rl +++ b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_ETag.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_header_ETag.c * @brief HTTP 'Etag' header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Transfer_Encoding.rl b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Transfer_Encoding.rl index 147d83cf..ce53a4b3 100644 --- a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Transfer_Encoding.rl +++ b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_Transfer_Encoding.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_header_Transfer_Encoding.c * @brief HTTP Transfer-Encoding header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_WWW_Authenticate.rl b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_WWW_Authenticate.rl index bb0f2fc9..92e651cb 100644 --- a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_WWW_Authenticate.rl +++ b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_header_WWW_Authenticate.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_header_WWW_Authenticate.c * @brief HTTP WWW-Authenticate header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_message.rl b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_message.rl index 19daaa3e..b1b364c0 100644 --- a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_message.rl +++ b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_message.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_parser_message.c * @brief HTTP parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_url.rl b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_url.rl index 8ea75730..636a55eb 100644 --- a/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_url.rl +++ b/branches/2.0/doubango/tinyHTTP/ragel/thttp_parser_url.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_parser_url.c * @brief HTTP/HTTPS URL parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/src/auth/thttp_auth.c b/branches/2.0/doubango/tinyHTTP/src/auth/thttp_auth.c index d3b91f33..cb9eaa74 100644 --- a/branches/2.0/doubango/tinyHTTP/src/auth/thttp_auth.c +++ b/branches/2.0/doubango/tinyHTTP/src/auth/thttp_auth.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file thttp_auth.c * @brief HTTP basic/digest authetication (RFC 2617) implementations. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/src/auth/thttp_challenge.c b/branches/2.0/doubango/tinyHTTP/src/auth/thttp_challenge.c index bde613c8..54380adc 100644 --- a/branches/2.0/doubango/tinyHTTP/src/auth/thttp_challenge.c +++ b/branches/2.0/doubango/tinyHTTP/src/auth/thttp_challenge.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_challenge.c * @brief HTTP authentication challenge. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header.c b/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header.c index 6a729ac2..a9079a44 100644 --- a/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header.c +++ b/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_header.c * @brief Defines a HTTP header (field-name: field-value). * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -46,9 +46,9 @@ const char *thttp_header_get_name(thttp_header_type_t type) case thttp_htype_Proxy_Authorization: return "Proxy-Authorization"; case thttp_htype_Transfer_Encoding: return "Transfer-Encoding"; case thttp_htype_WWW_Authenticate: return "WWW-Authenticate"; - case thttp_htype_Sec_WebSocket_Accept: return "Sec-WebSocket-Accept"; - case thttp_htype_Sec_WebSocket_Protocol: return "Sec-WebSocket-Protocol"; - case thttp_htype_Sec_WebSocket_Key: return "Sec-WebSocket-Key"; + case thttp_htype_Sec_WebSocket_Accept: return "Sec-WebSocket-Accept"; + case thttp_htype_Sec_WebSocket_Protocol: return "Sec-WebSocket-Protocol"; + case thttp_htype_Sec_WebSocket_Key: return "Sec-WebSocket-Key"; case thttp_htype_Sec_WebSocket_Version: return "Sec-WebSocket-Version"; default: return "unknown-header"; diff --git a/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Authorization.c b/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Authorization.c index 63611107..25842aac 100644 --- a/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Authorization.c +++ b/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Authorization.c @@ -1,126 +1,126 @@ /* #line 1 "./ragel/thttp_parser_header_Authorization.rl" */ -/* -* Copyright (C) 2010-2011 Mamadou Diop. -* -* Contact: Mamadou Diop -* -* This file is part of Open Source Doubango Framework. -* -* DOUBANGO is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* DOUBANGO is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with DOUBANGO. -* -*/ - -/**@file thttp_header_Authorization.c - * @brief HTTP Authorization header. - * - * @author Mamadou Diop - * - - */ -#include "tinyhttp/headers/thttp_header_Authorization.h" - -#include "tinyhttp/parsers/thttp_parser_url.h" - -#include "tsk_debug.h" -#include "tsk_memory.h" -#include "tsk_time.h" - -#include - -/*********************************** -* Ragel state machine. -*/ +/* +* Copyright (C) 2010-2011 Mamadou Diop. +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file thttp_header_Authorization.c + * @brief HTTP Authorization header. + * + * @author Mamadou Diop + * + + */ +#include "tinyhttp/headers/thttp_header_Authorization.h" + +#include "tinyhttp/parsers/thttp_parser_url.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_time.h" + +#include + +/*********************************** +* Ragel state machine. +*/ /* #line 148 "./ragel/thttp_parser_header_Authorization.rl" */ - - -thttp_header_Authorization_t* thttp_header_authorization_create() -{ - return tsk_object_new(thttp_header_Authorization_def_t); -} - -int thttp_header_Authorization_tostring(const thttp_header_t* header, tsk_buffer_t* output) -{ - if(header) - { - const thttp_header_Authorization_t *Authorization = (const thttp_header_Authorization_t*)header; - if(Authorization && Authorization->scheme) - { - if(tsk_striequals(Authorization->scheme, "Basic")){ - return tsk_buffer_append_2(output, "%s %s", - Authorization->scheme, Authorization->response); - } - else{ - return tsk_buffer_append_2(output, "%s %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", - Authorization->scheme, - - Authorization->username ? "username=\"" : "", - Authorization->username ? Authorization->username : "", - Authorization->username ? "\"" : "", - - Authorization->realm ? ",realm=\"" : "", - Authorization->realm ? Authorization->realm : "", - Authorization->realm ? "\"" : "", - - Authorization->nonce ? ",nonce=\"" : "", - Authorization->nonce ? Authorization->nonce : "", - Authorization->nonce ? "\"" : "", - - Authorization->uri ? ",uri=\"" : "", - Authorization->uri ? Authorization->uri : "", - Authorization->uri ? "\"" : "", - - Authorization->response ? ",response=\"" : "", - Authorization->response ? Authorization->response : "", - Authorization->response ? "\"" : "", - - Authorization->algorithm ? ",algorithm=" : "", - Authorization->algorithm ? Authorization->algorithm : "", - - Authorization->cnonce ? ",cnonce=\"" : "", - Authorization->cnonce ? Authorization->cnonce : "", - Authorization->cnonce ? "\"" : "", - - Authorization->opaque ? ",opaque=\"" : "", - Authorization->opaque ? Authorization->opaque : "", - Authorization->opaque ? "\"" : "", - - Authorization->qop ? ",qop=" : "", - Authorization->qop ? Authorization->qop : "", - - Authorization->nc ? ",nc=" : "", - Authorization->nc ? Authorization->nc : "" - ); - } - } - } - return -1; -} - -/**@ingroup thttp_header_group -*/ -thttp_header_Authorization_t *thttp_header_Authorization_parse(const char *data, tsk_size_t size) -{ - int cs = 0; - const char *p = data; - const char *pe = p + size; - const char *eof = pe; - thttp_header_Authorization_t *hdr_Authorization = thttp_header_authorization_create(); - - const char *tag_start; - + + +thttp_header_Authorization_t* thttp_header_authorization_create() +{ + return tsk_object_new(thttp_header_Authorization_def_t); +} + +int thttp_header_Authorization_tostring(const thttp_header_t* header, tsk_buffer_t* output) +{ + if(header) + { + const thttp_header_Authorization_t *Authorization = (const thttp_header_Authorization_t*)header; + if(Authorization && Authorization->scheme) + { + if(tsk_striequals(Authorization->scheme, "Basic")){ + return tsk_buffer_append_2(output, "%s %s", + Authorization->scheme, Authorization->response); + } + else{ + return tsk_buffer_append_2(output, "%s %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", + Authorization->scheme, + + Authorization->username ? "username=\"" : "", + Authorization->username ? Authorization->username : "", + Authorization->username ? "\"" : "", + + Authorization->realm ? ",realm=\"" : "", + Authorization->realm ? Authorization->realm : "", + Authorization->realm ? "\"" : "", + + Authorization->nonce ? ",nonce=\"" : "", + Authorization->nonce ? Authorization->nonce : "", + Authorization->nonce ? "\"" : "", + + Authorization->uri ? ",uri=\"" : "", + Authorization->uri ? Authorization->uri : "", + Authorization->uri ? "\"" : "", + + Authorization->response ? ",response=\"" : "", + Authorization->response ? Authorization->response : "", + Authorization->response ? "\"" : "", + + Authorization->algorithm ? ",algorithm=" : "", + Authorization->algorithm ? Authorization->algorithm : "", + + Authorization->cnonce ? ",cnonce=\"" : "", + Authorization->cnonce ? Authorization->cnonce : "", + Authorization->cnonce ? "\"" : "", + + Authorization->opaque ? ",opaque=\"" : "", + Authorization->opaque ? Authorization->opaque : "", + Authorization->opaque ? "\"" : "", + + Authorization->qop ? ",qop=" : "", + Authorization->qop ? Authorization->qop : "", + + Authorization->nc ? ",nc=" : "", + Authorization->nc ? Authorization->nc : "" + ); + } + } + } + return -1; +} + +/**@ingroup thttp_header_group +*/ +thttp_header_Authorization_t *thttp_header_Authorization_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + thttp_header_Authorization_t *hdr_Authorization = thttp_header_authorization_create(); + + const char *tag_start; + /* #line 126 "./src/headers/thttp_header_Authorization.c" */ static const char _thttp_machine_parser_header_Authorization_actions[] = { @@ -6785,110 +6785,110 @@ _match: { case 0: /* #line 49 "./ragel/thttp_parser_header_Authorization.rl" */ - { - tag_start = p; + { + tag_start = p; } break; case 1: /* #line 53 "./ragel/thttp_parser_header_Authorization.rl" */ - { - hdr_Authorization->scheme = tsk_strdup("Digest"); + { + hdr_Authorization->scheme = tsk_strdup("Digest"); } break; case 2: /* #line 57 "./ragel/thttp_parser_header_Authorization.rl" */ - { - hdr_Authorization->scheme = tsk_strdup("Basic"); + { + hdr_Authorization->scheme = tsk_strdup("Basic"); } break; case 3: /* #line 61 "./ragel/thttp_parser_header_Authorization.rl" */ - { - THTTP_HEADER(hdr_Authorization)->type = thttp_htype_Authorization; + { + THTTP_HEADER(hdr_Authorization)->type = thttp_htype_Authorization; } break; case 4: /* #line 65 "./ragel/thttp_parser_header_Authorization.rl" */ - { - THTTP_HEADER(hdr_Authorization)->type = thttp_htype_Proxy_Authorization; + { + THTTP_HEADER(hdr_Authorization)->type = thttp_htype_Proxy_Authorization; } break; case 5: /* #line 69 "./ragel/thttp_parser_header_Authorization.rl" */ - { - TSK_PARSER_SET_STRING(hdr_Authorization->username); - tsk_strunquote(&hdr_Authorization->username); + { + TSK_PARSER_SET_STRING(hdr_Authorization->username); + tsk_strunquote(&hdr_Authorization->username); } break; case 6: /* #line 74 "./ragel/thttp_parser_header_Authorization.rl" */ - { - TSK_PARSER_SET_STRING(hdr_Authorization->realm); - tsk_strunquote(&hdr_Authorization->realm); + { + TSK_PARSER_SET_STRING(hdr_Authorization->realm); + tsk_strunquote(&hdr_Authorization->realm); } break; case 7: /* #line 79 "./ragel/thttp_parser_header_Authorization.rl" */ - { - TSK_PARSER_SET_STRING(hdr_Authorization->nonce); - tsk_strunquote(&hdr_Authorization->nonce); + { + TSK_PARSER_SET_STRING(hdr_Authorization->nonce); + tsk_strunquote(&hdr_Authorization->nonce); } break; case 8: /* #line 84 "./ragel/thttp_parser_header_Authorization.rl" */ - { - TSK_PARSER_SET_STRING(hdr_Authorization->uri); + { + TSK_PARSER_SET_STRING(hdr_Authorization->uri); } break; case 9: /* #line 88 "./ragel/thttp_parser_header_Authorization.rl" */ - { - TSK_PARSER_SET_STRING(hdr_Authorization->response); - tsk_strunquote(&hdr_Authorization->response); + { + TSK_PARSER_SET_STRING(hdr_Authorization->response); + tsk_strunquote(&hdr_Authorization->response); } break; case 10: /* #line 93 "./ragel/thttp_parser_header_Authorization.rl" */ - { - TSK_PARSER_SET_STRING(hdr_Authorization->algorithm); + { + TSK_PARSER_SET_STRING(hdr_Authorization->algorithm); } break; case 11: /* #line 97 "./ragel/thttp_parser_header_Authorization.rl" */ - { - TSK_PARSER_SET_STRING(hdr_Authorization->cnonce); - tsk_strunquote(&hdr_Authorization->cnonce); + { + TSK_PARSER_SET_STRING(hdr_Authorization->cnonce); + tsk_strunquote(&hdr_Authorization->cnonce); } break; case 12: /* #line 102 "./ragel/thttp_parser_header_Authorization.rl" */ - { - TSK_PARSER_SET_STRING(hdr_Authorization->opaque); - tsk_strunquote(&hdr_Authorization->opaque); + { + TSK_PARSER_SET_STRING(hdr_Authorization->opaque); + tsk_strunquote(&hdr_Authorization->opaque); } break; case 13: /* #line 107 "./ragel/thttp_parser_header_Authorization.rl" */ - { - TSK_PARSER_SET_STRING(hdr_Authorization->qop); - //tsk_strunquote(&hdr_Authorization->qop); + { + TSK_PARSER_SET_STRING(hdr_Authorization->qop); + //tsk_strunquote(&hdr_Authorization->qop); } break; case 14: /* #line 112 "./ragel/thttp_parser_header_Authorization.rl" */ - { - TSK_PARSER_SET_STRING(hdr_Authorization->nc); + { + TSK_PARSER_SET_STRING(hdr_Authorization->nc); } break; case 15: /* #line 116 "./ragel/thttp_parser_header_Authorization.rl" */ - { - TSK_PARSER_ADD_PARAM(THTTP_HEADER_PARAMS(hdr_Authorization)); + { + TSK_PARSER_ADD_PARAM(THTTP_HEADER_PARAMS(hdr_Authorization)); } break; case 16: /* #line 120 "./ragel/thttp_parser_header_Authorization.rl" */ - { + { } break; /* #line 6895 "./src/headers/thttp_header_Authorization.c" */ @@ -6905,75 +6905,75 @@ _again: } /* #line 228 "./ragel/thttp_parser_header_Authorization.rl" */ - + if( cs < /* #line 6911 "./src/headers/thttp_header_Authorization.c" */ 1351 /* #line 229 "./ragel/thttp_parser_header_Authorization.rl" */ - ){ - TSK_DEBUG_ERROR("Failed to parse Authorization header."); - TSK_OBJECT_SAFE_FREE(hdr_Authorization); - } - - return hdr_Authorization; -} - -/**@ingroup thttp_header_group -*/ -thttp_header_Proxy_Authorization_t *thttp_header_Proxy_Authorization_parse(const char *data, tsk_size_t size) -{ - return thttp_header_Authorization_parse(data, size); -} - - - -//======================================================== -// Authorization header object definition -// - -static tsk_object_t* thttp_header_Authorization_ctor(tsk_object_t *self, va_list * app) -{ - thttp_header_Authorization_t *Authorization = self; - if(Authorization){ - THTTP_HEADER(Authorization)->type = thttp_htype_Authorization; - THTTP_HEADER(Authorization)->tostring = thttp_header_Authorization_tostring; - } - else{ - TSK_DEBUG_ERROR("Failed to create new Authorization header."); - } - return self; -} - -static tsk_object_t* thttp_header_Authorization_dtor(tsk_object_t *self) -{ - thttp_header_Authorization_t *Authorization = self; - if(Authorization){ - TSK_FREE(Authorization->scheme); - TSK_FREE(Authorization->username); - TSK_FREE(Authorization->realm); - TSK_FREE(Authorization->nonce); - TSK_FREE(Authorization->uri); - TSK_FREE(Authorization->response); - TSK_FREE(Authorization->algorithm); - TSK_FREE(Authorization->cnonce); - TSK_FREE(Authorization->opaque); - TSK_FREE(Authorization->qop); - TSK_FREE(Authorization->nc); - - TSK_OBJECT_SAFE_FREE(THTTP_HEADER_PARAMS(Authorization)); - } - else{ - TSK_DEBUG_ERROR("Null Authorization header."); - } - - return self; -} - -static const tsk_object_def_t thttp_header_Authorization_def_s = -{ - sizeof(thttp_header_Authorization_t), - thttp_header_Authorization_ctor, - thttp_header_Authorization_dtor, - tsk_null -}; -const tsk_object_def_t *thttp_header_Authorization_def_t = &thttp_header_Authorization_def_s; + ){ + TSK_DEBUG_ERROR("Failed to parse Authorization header."); + TSK_OBJECT_SAFE_FREE(hdr_Authorization); + } + + return hdr_Authorization; +} + +/**@ingroup thttp_header_group +*/ +thttp_header_Proxy_Authorization_t *thttp_header_Proxy_Authorization_parse(const char *data, tsk_size_t size) +{ + return thttp_header_Authorization_parse(data, size); +} + + + +//======================================================== +// Authorization header object definition +// + +static tsk_object_t* thttp_header_Authorization_ctor(tsk_object_t *self, va_list * app) +{ + thttp_header_Authorization_t *Authorization = self; + if(Authorization){ + THTTP_HEADER(Authorization)->type = thttp_htype_Authorization; + THTTP_HEADER(Authorization)->tostring = thttp_header_Authorization_tostring; + } + else{ + TSK_DEBUG_ERROR("Failed to create new Authorization header."); + } + return self; +} + +static tsk_object_t* thttp_header_Authorization_dtor(tsk_object_t *self) +{ + thttp_header_Authorization_t *Authorization = self; + if(Authorization){ + TSK_FREE(Authorization->scheme); + TSK_FREE(Authorization->username); + TSK_FREE(Authorization->realm); + TSK_FREE(Authorization->nonce); + TSK_FREE(Authorization->uri); + TSK_FREE(Authorization->response); + TSK_FREE(Authorization->algorithm); + TSK_FREE(Authorization->cnonce); + TSK_FREE(Authorization->opaque); + TSK_FREE(Authorization->qop); + TSK_FREE(Authorization->nc); + + TSK_OBJECT_SAFE_FREE(THTTP_HEADER_PARAMS(Authorization)); + } + else{ + TSK_DEBUG_ERROR("Null Authorization header."); + } + + return self; +} + +static const tsk_object_def_t thttp_header_Authorization_def_s = +{ + sizeof(thttp_header_Authorization_t), + thttp_header_Authorization_ctor, + thttp_header_Authorization_dtor, + tsk_null +}; +const tsk_object_def_t *thttp_header_Authorization_def_t = &thttp_header_Authorization_def_s; diff --git a/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Content_Length.c b/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Content_Length.c index 08b8e5cb..0a25e212 100644 --- a/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Content_Length.c +++ b/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Content_Length.c @@ -1,73 +1,73 @@ /* #line 1 "./ragel/thttp_parser_header_Content_Length.rl" */ -/* -* Copyright (C) 2010-2011 Mamadou Diop. -* -* Contact: Mamadou Diop -* -* This file is part of Open Source Doubango Framework. -* -* DOUBANGO is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* DOUBANGO is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with DOUBANGO. -* -*/ - -/**@file thttp_header_Content_Length.c - * @brief HTTP Content-Length header. - * - * @author Mamadou Diop - * - - */ -#include "tinyhttp/headers/thttp_header_Content_Length.h" - -#include "tsk_debug.h" -#include "tsk_memory.h" - -/*********************************** -* Ragel state machine. -*/ +/* +* Copyright (C) 2010-2011 Mamadou Diop. +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file thttp_header_Content_Length.c + * @brief HTTP Content-Length header. + * + * @author Mamadou Diop + * + + */ +#include "tinyhttp/headers/thttp_header_Content_Length.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" + +/*********************************** +* Ragel state machine. +*/ /* #line 60 "./ragel/thttp_parser_header_Content_Length.rl" */ - - -thttp_header_Content_Length_t* thttp_header_content_length_create(uint32_t length) -{ - return tsk_object_new(THTTP_HEADER_CONTENT_LENGTH_VA_ARGS(length)); -} - -int thttp_header_Content_Length_tostring(const thttp_header_t* header, tsk_buffer_t* output) -{ - if(header){ - const thttp_header_Content_Length_t *Content_Length = (const thttp_header_Content_Length_t*)header; - return tsk_buffer_append_2(output, "%d", Content_Length->length); - } - - return -1; -} - -/**@ingroup thttp_header_group -*/ -thttp_header_Content_Length_t *thttp_header_Content_Length_parse(const char *data, tsk_size_t size) -{ - int cs = 0; - const char *p = data; - const char *pe = p + size; - const char *eof = pe; - thttp_header_Content_Length_t *hdr_clength = thttp_header_content_length_create(0); - - const char *tag_start; - + + +thttp_header_Content_Length_t* thttp_header_content_length_create(uint32_t length) +{ + return tsk_object_new(THTTP_HEADER_CONTENT_LENGTH_VA_ARGS(length)); +} + +int thttp_header_Content_Length_tostring(const thttp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const thttp_header_Content_Length_t *Content_Length = (const thttp_header_Content_Length_t*)header; + return tsk_buffer_append_2(output, "%d", Content_Length->length); + } + + return -1; +} + +/**@ingroup thttp_header_group +*/ +thttp_header_Content_Length_t *thttp_header_Content_Length_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + thttp_header_Content_Length_t *hdr_clength = thttp_header_content_length_create(0); + + const char *tag_start; + /* #line 73 "./src/headers/thttp_header_Content_Length.c" */ static const char _thttp_machine_parser_header_Content_Length_actions[] = { @@ -223,19 +223,19 @@ _match: { case 0: /* #line 44 "./ragel/thttp_parser_header_Content_Length.rl" */ - { - tag_start = p; + { + tag_start = p; } break; case 1: /* #line 48 "./ragel/thttp_parser_header_Content_Length.rl" */ - { - TSK_PARSER_SET_INTEGER(hdr_clength->length); + { + TSK_PARSER_SET_INTEGER(hdr_clength->length); } break; case 2: /* #line 52 "./ragel/thttp_parser_header_Content_Length.rl" */ - { + { } break; /* #line 242 "./src/headers/thttp_header_Content_Length.c" */ @@ -252,61 +252,61 @@ _again: } /* #line 92 "./ragel/thttp_parser_header_Content_Length.rl" */ - + if( cs < /* #line 258 "./src/headers/thttp_header_Content_Length.c" */ 22 /* #line 93 "./ragel/thttp_parser_header_Content_Length.rl" */ - ){ - TSK_OBJECT_SAFE_FREE(hdr_clength); - } - - return hdr_clength; -} - - - - - - - -//======================================================== -// Content_Length header object definition -// - -static tsk_object_t* thttp_header_Content_Length_ctor(tsk_object_t *self, va_list * app) -{ - thttp_header_Content_Length_t *Content_Length = self; - if(Content_Length){ - Content_Length->length = va_arg(*app, uint32_t); - - THTTP_HEADER(Content_Length)->type = thttp_htype_Content_Length; - THTTP_HEADER(Content_Length)->tostring = thttp_header_Content_Length_tostring; - } - else{ - TSK_DEBUG_ERROR("Failed to create new Content_Length header."); - } - return self; -} - -static tsk_object_t* thttp_header_Content_Length_dtor(tsk_object_t *self) -{ - thttp_header_Content_Length_t *Content_Length = self; - if(Content_Length){ - TSK_OBJECT_SAFE_FREE(THTTP_HEADER_PARAMS(Content_Length)); - } - else{ - TSK_DEBUG_ERROR("Null Content_Length header."); - } - - return self; -} - -static const tsk_object_def_t thttp_header_Content_Length_def_s = -{ - sizeof(thttp_header_Content_Length_t), - thttp_header_Content_Length_ctor, - thttp_header_Content_Length_dtor, - tsk_null -}; -const tsk_object_def_t *thttp_header_Content_Length_def_t = &thttp_header_Content_Length_def_s; + ){ + TSK_OBJECT_SAFE_FREE(hdr_clength); + } + + return hdr_clength; +} + + + + + + + +//======================================================== +// Content_Length header object definition +// + +static tsk_object_t* thttp_header_Content_Length_ctor(tsk_object_t *self, va_list * app) +{ + thttp_header_Content_Length_t *Content_Length = self; + if(Content_Length){ + Content_Length->length = va_arg(*app, uint32_t); + + THTTP_HEADER(Content_Length)->type = thttp_htype_Content_Length; + THTTP_HEADER(Content_Length)->tostring = thttp_header_Content_Length_tostring; + } + else{ + TSK_DEBUG_ERROR("Failed to create new Content_Length header."); + } + return self; +} + +static tsk_object_t* thttp_header_Content_Length_dtor(tsk_object_t *self) +{ + thttp_header_Content_Length_t *Content_Length = self; + if(Content_Length){ + TSK_OBJECT_SAFE_FREE(THTTP_HEADER_PARAMS(Content_Length)); + } + else{ + TSK_DEBUG_ERROR("Null Content_Length header."); + } + + return self; +} + +static const tsk_object_def_t thttp_header_Content_Length_def_s = +{ + sizeof(thttp_header_Content_Length_t), + thttp_header_Content_Length_ctor, + thttp_header_Content_Length_dtor, + tsk_null +}; +const tsk_object_def_t *thttp_header_Content_Length_def_t = &thttp_header_Content_Length_def_s; diff --git a/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Content_Type.c b/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Content_Type.c index 986e9c17..00cfda1e 100644 --- a/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Content_Type.c +++ b/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Content_Type.c @@ -1,80 +1,80 @@ /* #line 1 "./ragel/thttp_parser_header_Content_Type.rl" */ -/* -* Copyright (C) 2010-2011 Mamadou Diop. -* -* Contact: Mamadou Diop -* -* This file is part of Open Source Doubango Framework. -* -* DOUBANGO is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* DOUBANGO is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with DOUBANGO. -* -*/ - -/**@file thttp_header_Content_Type.c - * @brief HTTP Content-Type header. - * - * @author Mamadou Diop - * - - */ -#include "tinyhttp/headers/thttp_header_Content_Type.h" - -#include "tsk_debug.h" -#include "tsk_memory.h" - -#include - -/*********************************** -* Ragel state machine. -*/ +/* +* Copyright (C) 2010-2011 Mamadou Diop. +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file thttp_header_Content_Type.c + * @brief HTTP Content-Type header. + * + * @author Mamadou Diop + * + + */ +#include "tinyhttp/headers/thttp_header_Content_Type.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" + +#include + +/*********************************** +* Ragel state machine. +*/ /* #line 79 "./ragel/thttp_parser_header_Content_Type.rl" */ - - -thttp_header_Content_Type_t* thttp_header_content_type_create(const char* type) -{ - return tsk_object_new(THTTP_HEADER_CONTENT_TYPE_VA_ARGS(type)); -} - -thttp_header_Content_Type_t* thttp_header_content_type_create_null() -{ - return thttp_header_content_type_create(tsk_null); -} - -int thttp_header_Content_Type_tostring(const thttp_header_t* header, tsk_buffer_t* output) -{ - if(header){ - const thttp_header_Content_Type_t *Content_Type = (const thttp_header_Content_Type_t*)header; - return tsk_buffer_append(output, Content_Type->type, tsk_strlen(Content_Type->type)); - } - - return -1; -} - -/**@ingroup thttp_header_group -*/ -thttp_header_Content_Type_t *thttp_header_Content_Type_parse(const char *data, tsk_size_t size) -{ - int cs = 0; - const char *p = data; - const char *pe = p + size; - const char *eof = pe; - thttp_header_Content_Type_t *hdr_ctype = thttp_header_content_type_create_null(); - - const char *tag_start; - + + +thttp_header_Content_Type_t* thttp_header_content_type_create(const char* type) +{ + return tsk_object_new(THTTP_HEADER_CONTENT_TYPE_VA_ARGS(type)); +} + +thttp_header_Content_Type_t* thttp_header_content_type_create_null() +{ + return thttp_header_content_type_create(tsk_null); +} + +int thttp_header_Content_Type_tostring(const thttp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const thttp_header_Content_Type_t *Content_Type = (const thttp_header_Content_Type_t*)header; + return tsk_buffer_append(output, Content_Type->type, tsk_strlen(Content_Type->type)); + } + + return -1; +} + +/**@ingroup thttp_header_group +*/ +thttp_header_Content_Type_t *thttp_header_Content_Type_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + thttp_header_Content_Type_t *hdr_ctype = thttp_header_content_type_create_null(); + + const char *tag_start; + /* #line 80 "./src/headers/thttp_header_Content_Type.c" */ static const char _thttp_machine_parser_header_Content_Type_actions[] = { @@ -317,25 +317,25 @@ _match: { case 0: /* #line 46 "./ragel/thttp_parser_header_Content_Type.rl" */ - { - tag_start = p; + { + tag_start = p; } break; case 1: /* #line 50 "./ragel/thttp_parser_header_Content_Type.rl" */ - { - TSK_PARSER_SET_STRING(hdr_ctype->type); + { + TSK_PARSER_SET_STRING(hdr_ctype->type); } break; case 2: /* #line 54 "./ragel/thttp_parser_header_Content_Type.rl" */ - { - TSK_PARSER_ADD_PARAM(THTTP_HEADER_PARAMS(hdr_ctype)); + { + TSK_PARSER_ADD_PARAM(THTTP_HEADER_PARAMS(hdr_ctype)); } break; case 3: /* #line 58 "./ragel/thttp_parser_header_Content_Type.rl" */ - { + { } break; /* #line 342 "./src/headers/thttp_header_Content_Type.c" */ @@ -352,67 +352,67 @@ _again: } /* #line 116 "./ragel/thttp_parser_header_Content_Type.rl" */ - + if( cs < /* #line 358 "./src/headers/thttp_header_Content_Type.c" */ 55 /* #line 117 "./ragel/thttp_parser_header_Content_Type.rl" */ - ){ - TSK_DEBUG_ERROR("Failed to parse Content-Type header."); - TSK_OBJECT_SAFE_FREE(hdr_ctype); - } - - return hdr_ctype; -} - - - - - - - -//======================================================== -// Content_Type header object definition -// - -/**@ingroup thttp_header_Content_Type_group -*/ -static tsk_object_t* thttp_header_Content_Type_ctor(tsk_object_t *self, va_list * app) -{ - thttp_header_Content_Type_t *Content_Type = self; - if(Content_Type){ - THTTP_HEADER(Content_Type)->type = thttp_htype_Content_Type; - THTTP_HEADER(Content_Type)->tostring = thttp_header_Content_Type_tostring; - - Content_Type->type = tsk_strdup( va_arg(*app, const char*) ); - } - else{ - TSK_DEBUG_ERROR("Failed to create new Content_Type header."); - } - return self; -} - -/**@ingroup thttp_header_Content_Type_group -*/ -static tsk_object_t* thttp_header_Content_Type_dtor(tsk_object_t *self) -{ - thttp_header_Content_Type_t *Content_Type = self; - if(Content_Type){ - TSK_FREE(Content_Type->type); - TSK_OBJECT_SAFE_FREE(THTTP_HEADER_PARAMS(Content_Type)); - } - else{ - TSK_DEBUG_ERROR("Null Content_Type header."); - } - - return self; -} - -static const tsk_object_def_t thttp_header_Content_Type_def_s = -{ - sizeof(thttp_header_Content_Type_t), - thttp_header_Content_Type_ctor, - thttp_header_Content_Type_dtor, - tsk_null -}; -const tsk_object_def_t *thttp_header_Content_Type_def_t = &thttp_header_Content_Type_def_s; + ){ + TSK_DEBUG_ERROR("Failed to parse Content-Type header."); + TSK_OBJECT_SAFE_FREE(hdr_ctype); + } + + return hdr_ctype; +} + + + + + + + +//======================================================== +// Content_Type header object definition +// + +/**@ingroup thttp_header_Content_Type_group +*/ +static tsk_object_t* thttp_header_Content_Type_ctor(tsk_object_t *self, va_list * app) +{ + thttp_header_Content_Type_t *Content_Type = self; + if(Content_Type){ + THTTP_HEADER(Content_Type)->type = thttp_htype_Content_Type; + THTTP_HEADER(Content_Type)->tostring = thttp_header_Content_Type_tostring; + + Content_Type->type = tsk_strdup( va_arg(*app, const char*) ); + } + else{ + TSK_DEBUG_ERROR("Failed to create new Content_Type header."); + } + return self; +} + +/**@ingroup thttp_header_Content_Type_group +*/ +static tsk_object_t* thttp_header_Content_Type_dtor(tsk_object_t *self) +{ + thttp_header_Content_Type_t *Content_Type = self; + if(Content_Type){ + TSK_FREE(Content_Type->type); + TSK_OBJECT_SAFE_FREE(THTTP_HEADER_PARAMS(Content_Type)); + } + else{ + TSK_DEBUG_ERROR("Null Content_Type header."); + } + + return self; +} + +static const tsk_object_def_t thttp_header_Content_Type_def_s = +{ + sizeof(thttp_header_Content_Type_t), + thttp_header_Content_Type_ctor, + thttp_header_Content_Type_dtor, + tsk_null +}; +const tsk_object_def_t *thttp_header_Content_Type_def_t = &thttp_header_Content_Type_def_s; diff --git a/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Dummy.c b/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Dummy.c index b8d9dcae..25ae6855 100644 --- a/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Dummy.c +++ b/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Dummy.c @@ -1,86 +1,86 @@ /* #line 1 "./ragel/thttp_parser_header_Dummy.rl" */ -/* -* Copyright (C) 2010-2011 Mamadou Diop. -* -* Contact: Mamadou Diop -* -* This file is part of Open Source Doubango Framework. -* -* DOUBANGO is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* DOUBANGO is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with DOUBANGO. -* -*/ - -/**@file thttp_header_Dummy.c - * @brief HTTP 'Dummy' header. - * - * @author Mamadou Diop - * - - */ -#include "tinyhttp/headers/thttp_header_Dummy.h" - -#include "tinyhttp/parsers/thttp_parser_url.h" - -#include "tsk_debug.h" -#include "tsk_memory.h" - -#include - -/*********************************** -* Ragel state machine. -*/ +/* +* Copyright (C) 2010-2011 Mamadou Diop. +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file thttp_header_Dummy.c + * @brief HTTP 'Dummy' header. + * + * @author Mamadou Diop + * + + */ +#include "tinyhttp/headers/thttp_header_Dummy.h" + +#include "tinyhttp/parsers/thttp_parser_url.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" + +#include + +/*********************************** +* Ragel state machine. +*/ /* #line 68 "./ragel/thttp_parser_header_Dummy.rl" */ - - -thttp_header_Dummy_t* thttp_header_dummy_create(const char* name, const char* value) -{ - return tsk_object_new(THTTP_HEADER_DUMMY_VA_ARGS(name, value)); -} - -thttp_header_Dummy_t* thttp_header_dummy_create_null() -{ - return thttp_header_dummy_create(tsk_null, tsk_null); -} - - -int thttp_header_Dummy_tostring(const thttp_header_t* header, tsk_buffer_t* output) -{ - if(header){ - const thttp_header_Dummy_t *Dummy = (const thttp_header_Dummy_t*)header; - if(Dummy->value){ - return tsk_buffer_append(output, Dummy->value, tsk_strlen(Dummy->value)); - } - return 0; - } - - return -1; -} - -/**@ingroup thttp_header_group -*/ -thttp_header_Dummy_t *thttp_header_Dummy_parse(const char *data, tsk_size_t size) -{ - int cs = 0; - const char *p = data; - const char *pe = p + size; - const char *eof = pe; - thttp_header_Dummy_t *hdr_Dummy = thttp_header_dummy_create_null(); - - const char *tag_start; - + + +thttp_header_Dummy_t* thttp_header_dummy_create(const char* name, const char* value) +{ + return tsk_object_new(THTTP_HEADER_DUMMY_VA_ARGS(name, value)); +} + +thttp_header_Dummy_t* thttp_header_dummy_create_null() +{ + return thttp_header_dummy_create(tsk_null, tsk_null); +} + + +int thttp_header_Dummy_tostring(const thttp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const thttp_header_Dummy_t *Dummy = (const thttp_header_Dummy_t*)header; + if(Dummy->value){ + return tsk_buffer_append(output, Dummy->value, tsk_strlen(Dummy->value)); + } + return 0; + } + + return -1; +} + +/**@ingroup thttp_header_group +*/ +thttp_header_Dummy_t *thttp_header_Dummy_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + thttp_header_Dummy_t *hdr_Dummy = thttp_header_dummy_create_null(); + + const char *tag_start; + /* #line 86 "./src/headers/thttp_header_Dummy.c" */ static const char _thttp_machine_parser_header_Dummy_actions[] = { @@ -228,25 +228,25 @@ _match: { case 0: /* #line 48 "./ragel/thttp_parser_header_Dummy.rl" */ - { - tag_start = p; + { + tag_start = p; } break; case 1: /* #line 52 "./ragel/thttp_parser_header_Dummy.rl" */ - { - TSK_PARSER_SET_STRING(hdr_Dummy->name); + { + TSK_PARSER_SET_STRING(hdr_Dummy->name); } break; case 2: /* #line 56 "./ragel/thttp_parser_header_Dummy.rl" */ - { - TSK_PARSER_SET_STRING(hdr_Dummy->value); + { + TSK_PARSER_SET_STRING(hdr_Dummy->value); } break; case 3: /* #line 60 "./ragel/thttp_parser_header_Dummy.rl" */ - { + { } break; /* #line 253 "./src/headers/thttp_header_Dummy.c" */ @@ -263,65 +263,65 @@ _again: } /* #line 109 "./ragel/thttp_parser_header_Dummy.rl" */ - + if( cs < /* #line 269 "./src/headers/thttp_header_Dummy.c" */ 10 /* #line 110 "./ragel/thttp_parser_header_Dummy.rl" */ - ){ - TSK_OBJECT_SAFE_FREE(hdr_Dummy); - } - - return hdr_Dummy; -} - - - - - - - -//======================================================== -// Dummy header object definition -// - -static tsk_object_t* thttp_header_Dummy_ctor(tsk_object_t *self, va_list * app) -{ - thttp_header_Dummy_t *Dummy = self; - if(Dummy){ - THTTP_HEADER(Dummy)->type = thttp_htype_Dummy; - THTTP_HEADER(Dummy)->tostring = thttp_header_Dummy_tostring; - - Dummy->name = tsk_strdup(va_arg(*app, const char*)); - Dummy->value = tsk_strdup(va_arg(*app, const char*)); - } - else{ - TSK_DEBUG_ERROR("Failed to create new Dummy header."); - } - return self; -} - -static tsk_object_t* thttp_header_Dummy_dtor(tsk_object_t *self) -{ - thttp_header_Dummy_t *Dummy = self; - if(Dummy){ - TSK_FREE(Dummy->name); - TSK_FREE(Dummy->value); - - TSK_OBJECT_SAFE_FREE(THTTP_HEADER_PARAMS(Dummy)); - } - else{ - TSK_DEBUG_ERROR("Null Dummy header."); - } - - return self; -} - -static const tsk_object_def_t thttp_header_Dummy_def_s = -{ - sizeof(thttp_header_Dummy_t), - thttp_header_Dummy_ctor, - thttp_header_Dummy_dtor, - tsk_null -}; -const tsk_object_def_t *thttp_header_Dummy_def_t = &thttp_header_Dummy_def_s; + ){ + TSK_OBJECT_SAFE_FREE(hdr_Dummy); + } + + return hdr_Dummy; +} + + + + + + + +//======================================================== +// Dummy header object definition +// + +static tsk_object_t* thttp_header_Dummy_ctor(tsk_object_t *self, va_list * app) +{ + thttp_header_Dummy_t *Dummy = self; + if(Dummy){ + THTTP_HEADER(Dummy)->type = thttp_htype_Dummy; + THTTP_HEADER(Dummy)->tostring = thttp_header_Dummy_tostring; + + Dummy->name = tsk_strdup(va_arg(*app, const char*)); + Dummy->value = tsk_strdup(va_arg(*app, const char*)); + } + else{ + TSK_DEBUG_ERROR("Failed to create new Dummy header."); + } + return self; +} + +static tsk_object_t* thttp_header_Dummy_dtor(tsk_object_t *self) +{ + thttp_header_Dummy_t *Dummy = self; + if(Dummy){ + TSK_FREE(Dummy->name); + TSK_FREE(Dummy->value); + + TSK_OBJECT_SAFE_FREE(THTTP_HEADER_PARAMS(Dummy)); + } + else{ + TSK_DEBUG_ERROR("Null Dummy header."); + } + + return self; +} + +static const tsk_object_def_t thttp_header_Dummy_def_s = +{ + sizeof(thttp_header_Dummy_t), + thttp_header_Dummy_ctor, + thttp_header_Dummy_dtor, + tsk_null +}; +const tsk_object_def_t *thttp_header_Dummy_def_t = &thttp_header_Dummy_def_s; diff --git a/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_ETag.c b/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_ETag.c index f417341c..fd8fe505 100644 --- a/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_ETag.c +++ b/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_ETag.c @@ -1,88 +1,88 @@ /* #line 1 "./ragel/thttp_parser_header_ETag.rl" */ -/* -* Copyright (C) 2010-2011 Mamadou Diop. -* -* Contact: Mamadou Diop -* -* This file is part of Open Source Doubango Framework. -* -* DOUBANGO is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* DOUBANGO is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with DOUBANGO. -* -*/ - -/**@file thttp_header_ETag.c - * @brief HTTP 'Etag' header. - * - * @author Mamadou Diop - * - - */ -#include "tinyhttp/headers/thttp_header_ETag.h" - -#include "tinyhttp/parsers/thttp_parser_url.h" - -#include "tsk_debug.h" -#include "tsk_memory.h" - -#include - -/*********************************** -* Ragel state machine. -*/ +/* +* Copyright (C) 2010-2011 Mamadou Diop. +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file thttp_header_ETag.c + * @brief HTTP 'Etag' header. + * + * @author Mamadou Diop + * + + */ +#include "tinyhttp/headers/thttp_header_ETag.h" + +#include "tinyhttp/parsers/thttp_parser_url.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" + +#include + +/*********************************** +* Ragel state machine. +*/ /* #line 73 "./ragel/thttp_parser_header_ETag.rl" */ - - -thttp_header_ETag_t* thttp_header_etag_create(const char* value) -{ - return tsk_object_new(THTTP_HEADER_ETAG_VA_ARGS(value)); -} - -thttp_header_ETag_t* thttp_header_etag_create_null() -{ - return thttp_header_etag_create(tsk_null); -} - - -int thttp_header_ETag_tostring(const thttp_header_t* header, tsk_buffer_t* output) -{ - if(header){ - const thttp_header_ETag_t *ETag = (const thttp_header_ETag_t*)header; - if(ETag->value){ - return tsk_buffer_append_2(output, "%s\"%s\"", - ETag->isWeak ? "W/" : "", - ETag->value); - } - return 0; - } - - return -1; -} - -/**@ingroup thttp_header_group -*/ -thttp_header_ETag_t *thttp_header_ETag_parse(const char *data, tsk_size_t size) -{ - int cs = 0; - const char *p = data; - const char *pe = p + size; - const char *eof = pe; - thttp_header_ETag_t *hdr_ETag = thttp_header_etag_create_null(); - - const char *tag_start; - + + +thttp_header_ETag_t* thttp_header_etag_create(const char* value) +{ + return tsk_object_new(THTTP_HEADER_ETAG_VA_ARGS(value)); +} + +thttp_header_ETag_t* thttp_header_etag_create_null() +{ + return thttp_header_etag_create(tsk_null); +} + + +int thttp_header_ETag_tostring(const thttp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const thttp_header_ETag_t *ETag = (const thttp_header_ETag_t*)header; + if(ETag->value){ + return tsk_buffer_append_2(output, "%s\"%s\"", + ETag->isWeak ? "W/" : "", + ETag->value); + } + return 0; + } + + return -1; +} + +/**@ingroup thttp_header_group +*/ +thttp_header_ETag_t *thttp_header_ETag_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + thttp_header_ETag_t *hdr_ETag = thttp_header_etag_create_null(); + + const char *tag_start; + /* #line 88 "./src/headers/thttp_header_ETag.c" */ static const char _thttp_machine_parser_header_ETag_actions[] = { @@ -244,26 +244,26 @@ _match: { case 0: /* #line 49 "./ragel/thttp_parser_header_ETag.rl" */ - { - tag_start = p; + { + tag_start = p; } break; case 1: /* #line 53 "./ragel/thttp_parser_header_ETag.rl" */ - { - hdr_ETag->isWeak = tsk_true; + { + hdr_ETag->isWeak = tsk_true; } break; case 2: /* #line 57 "./ragel/thttp_parser_header_ETag.rl" */ - { - TSK_PARSER_SET_STRING(hdr_ETag->value); - tsk_strunquote(&hdr_ETag->value); + { + TSK_PARSER_SET_STRING(hdr_ETag->value); + tsk_strunquote(&hdr_ETag->value); } break; case 3: /* #line 62 "./ragel/thttp_parser_header_ETag.rl" */ - { + { } break; /* #line 270 "./src/headers/thttp_header_ETag.c" */ @@ -280,65 +280,65 @@ _again: } /* #line 116 "./ragel/thttp_parser_header_ETag.rl" */ - + if( cs < /* #line 286 "./src/headers/thttp_header_ETag.c" */ 22 /* #line 117 "./ragel/thttp_parser_header_ETag.rl" */ - ){ - TSK_DEBUG_ERROR("Failed to parse ETag header."); - TSK_OBJECT_SAFE_FREE(hdr_ETag); - } - - return hdr_ETag; -} - - - - - - - -//======================================================== -// ETag header object definition -// - -static tsk_object_t* thttp_header_ETag_ctor(tsk_object_t *self, va_list * app) -{ - thttp_header_ETag_t *ETag = self; - if(ETag){ - THTTP_HEADER(ETag)->type = thttp_htype_ETag; - THTTP_HEADER(ETag)->tostring = thttp_header_ETag_tostring; - - ETag->value = tsk_strdup(va_arg(*app, const char*)); - } - else{ - TSK_DEBUG_ERROR("Failed to create new ETag header."); - } - return self; -} - -static tsk_object_t* thttp_header_ETag_dtor(tsk_object_t *self) -{ - thttp_header_ETag_t *ETag = self; - if(ETag) - { - TSK_FREE(ETag->value); - - TSK_OBJECT_SAFE_FREE(THTTP_HEADER_PARAMS(ETag)); - } - else{ - TSK_DEBUG_ERROR("Null ETag header."); - } - - return self; -} - -static const tsk_object_def_t thttp_header_ETag_def_s = -{ - sizeof(thttp_header_ETag_t), - thttp_header_ETag_ctor, - thttp_header_ETag_dtor, - tsk_null -}; -const tsk_object_def_t *thttp_header_ETag_def_t = &thttp_header_ETag_def_s; + ){ + TSK_DEBUG_ERROR("Failed to parse ETag header."); + TSK_OBJECT_SAFE_FREE(hdr_ETag); + } + + return hdr_ETag; +} + + + + + + + +//======================================================== +// ETag header object definition +// + +static tsk_object_t* thttp_header_ETag_ctor(tsk_object_t *self, va_list * app) +{ + thttp_header_ETag_t *ETag = self; + if(ETag){ + THTTP_HEADER(ETag)->type = thttp_htype_ETag; + THTTP_HEADER(ETag)->tostring = thttp_header_ETag_tostring; + + ETag->value = tsk_strdup(va_arg(*app, const char*)); + } + else{ + TSK_DEBUG_ERROR("Failed to create new ETag header."); + } + return self; +} + +static tsk_object_t* thttp_header_ETag_dtor(tsk_object_t *self) +{ + thttp_header_ETag_t *ETag = self; + if(ETag) + { + TSK_FREE(ETag->value); + + TSK_OBJECT_SAFE_FREE(THTTP_HEADER_PARAMS(ETag)); + } + else{ + TSK_DEBUG_ERROR("Null ETag header."); + } + + return self; +} + +static const tsk_object_def_t thttp_header_ETag_def_s = +{ + sizeof(thttp_header_ETag_t), + thttp_header_ETag_ctor, + thttp_header_ETag_dtor, + tsk_null +}; +const tsk_object_def_t *thttp_header_ETag_def_t = &thttp_header_ETag_def_s; diff --git a/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Transfer_Encoding.c b/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Transfer_Encoding.c index bfed19d6..5c287ddb 100644 --- a/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Transfer_Encoding.c +++ b/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_Transfer_Encoding.c @@ -1,84 +1,84 @@ /* #line 1 "./ragel/thttp_parser_header_Transfer_Encoding.rl" */ -/* -* Copyright (C) 2010-2011 Mamadou Diop. -* -* Contact: Mamadou Diop -* -* This file is part of Open Source Doubango Framework. -* -* DOUBANGO is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* DOUBANGO is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with DOUBANGO. -* -*/ - -/**@file thttp_header_Transfer_Encoding.c - * @brief HTTP Transfer-Encoding header. - * - * @author Mamadou Diop - * - - */ -#include "tinyhttp/headers/thttp_header_Transfer_Encoding.h" - -#include "tsk_debug.h" -#include "tsk_memory.h" - -#include - -/*********************************** -* Ragel state machine. -*/ +/* +* Copyright (C) 2010-2011 Mamadou Diop. +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file thttp_header_Transfer_Encoding.c + * @brief HTTP Transfer-Encoding header. + * + * @author Mamadou Diop + * + + */ +#include "tinyhttp/headers/thttp_header_Transfer_Encoding.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" + +#include + +/*********************************** +* Ragel state machine. +*/ /* #line 66 "./ragel/thttp_parser_header_Transfer_Encoding.rl" */ - - -thttp_header_Transfer_Encoding_t* thttp_header_transfer_encoding_create(const char* encoding) -{ - return tsk_object_new(THTTP_HEADER_TRANSFER_ENCODING_VA_ARGS(encoding)); -} - -thttp_header_Transfer_Encoding_t* thttp_header_transfer_encoding_create_null() -{ - return thttp_header_transfer_encoding_create(tsk_null); -} - - -int thttp_header_Transfer_Encoding_tostring(const thttp_header_t* header, tsk_buffer_t* output) -{ - if(header){ - const thttp_header_Transfer_Encoding_t *Transfer_Encoding = (const thttp_header_Transfer_Encoding_t*)header; - if(Transfer_Encoding->encoding){ - return tsk_buffer_append(output, Transfer_Encoding->encoding, tsk_strlen(Transfer_Encoding->encoding)); - } - return 0; - } - - return -1; -} - -/**@ingroup thttp_header_group -*/ -thttp_header_Transfer_Encoding_t *thttp_header_Transfer_Encoding_parse(const char *data, tsk_size_t size) -{ - int cs = 0; - const char *p = data; - const char *pe = p + size; - const char *eof = pe; - thttp_header_Transfer_Encoding_t *hdr_tencoding = thttp_header_transfer_encoding_create_null(); - - const char *tag_start; - + + +thttp_header_Transfer_Encoding_t* thttp_header_transfer_encoding_create(const char* encoding) +{ + return tsk_object_new(THTTP_HEADER_TRANSFER_ENCODING_VA_ARGS(encoding)); +} + +thttp_header_Transfer_Encoding_t* thttp_header_transfer_encoding_create_null() +{ + return thttp_header_transfer_encoding_create(tsk_null); +} + + +int thttp_header_Transfer_Encoding_tostring(const thttp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const thttp_header_Transfer_Encoding_t *Transfer_Encoding = (const thttp_header_Transfer_Encoding_t*)header; + if(Transfer_Encoding->encoding){ + return tsk_buffer_append(output, Transfer_Encoding->encoding, tsk_strlen(Transfer_Encoding->encoding)); + } + return 0; + } + + return -1; +} + +/**@ingroup thttp_header_group +*/ +thttp_header_Transfer_Encoding_t *thttp_header_Transfer_Encoding_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + thttp_header_Transfer_Encoding_t *hdr_tencoding = thttp_header_transfer_encoding_create_null(); + + const char *tag_start; + /* #line 84 "./src/headers/thttp_header_Transfer_Encoding.c" */ static const char _thttp_machine_parser_header_Transfer_Encoding_actions[] = { @@ -275,25 +275,25 @@ _match: { case 0: /* #line 46 "./ragel/thttp_parser_header_Transfer_Encoding.rl" */ - { - tag_start = p; + { + tag_start = p; } break; case 1: /* #line 50 "./ragel/thttp_parser_header_Transfer_Encoding.rl" */ - { - TSK_PARSER_SET_STRING(hdr_tencoding->encoding); + { + TSK_PARSER_SET_STRING(hdr_tencoding->encoding); } break; case 2: /* #line 54 "./ragel/thttp_parser_header_Transfer_Encoding.rl" */ - { - TSK_PARSER_ADD_PARAM(THTTP_HEADER_PARAMS(hdr_tencoding)); + { + TSK_PARSER_ADD_PARAM(THTTP_HEADER_PARAMS(hdr_tencoding)); } break; case 3: /* #line 58 "./ragel/thttp_parser_header_Transfer_Encoding.rl" */ - { + { } break; /* #line 300 "./src/headers/thttp_header_Transfer_Encoding.c" */ @@ -310,63 +310,63 @@ _again: } /* #line 107 "./ragel/thttp_parser_header_Transfer_Encoding.rl" */ - + if( cs < /* #line 316 "./src/headers/thttp_header_Transfer_Encoding.c" */ 33 /* #line 108 "./ragel/thttp_parser_header_Transfer_Encoding.rl" */ - ){ - TSK_DEBUG_ERROR("Failed to parse Tansfer-Encoding header."); - TSK_OBJECT_SAFE_FREE(hdr_tencoding); - } - - return hdr_tencoding; -} - - - - - - - -//======================================================== -// Transfer_Encoding header object definition -// - -static tsk_object_t* thttp_header_Transfer_Encoding_ctor(tsk_object_t *self, va_list * app) -{ - thttp_header_Transfer_Encoding_t *Transfer_Encoding = self; - if(Transfer_Encoding){ - THTTP_HEADER(Transfer_Encoding)->type = thttp_htype_Transfer_Encoding; - THTTP_HEADER(Transfer_Encoding)->tostring = thttp_header_Transfer_Encoding_tostring; - - Transfer_Encoding->encoding = tsk_strdup( va_arg(*app, const char*) ); - } - else{ - TSK_DEBUG_ERROR("Failed to create new Transfer_Encoding header."); - } - return self; -} - -static tsk_object_t* thttp_header_Transfer_Encoding_dtor(tsk_object_t* self) -{ - thttp_header_Transfer_Encoding_t *Transfer_Encoding = self; - if(Transfer_Encoding){ - TSK_FREE(Transfer_Encoding->encoding); - TSK_OBJECT_SAFE_FREE(THTTP_HEADER_PARAMS(Transfer_Encoding)); - } - else{ - TSK_DEBUG_ERROR("Null Transfer_Encoding header."); - } - - return self; -} - -static const tsk_object_def_t thttp_header_Transfer_Encoding_def_s = -{ - sizeof(thttp_header_Transfer_Encoding_t), - thttp_header_Transfer_Encoding_ctor, - thttp_header_Transfer_Encoding_dtor, - tsk_null -}; -const tsk_object_def_t *thttp_header_Transfer_Encoding_def_t = &thttp_header_Transfer_Encoding_def_s; + ){ + TSK_DEBUG_ERROR("Failed to parse Tansfer-Encoding header."); + TSK_OBJECT_SAFE_FREE(hdr_tencoding); + } + + return hdr_tencoding; +} + + + + + + + +//======================================================== +// Transfer_Encoding header object definition +// + +static tsk_object_t* thttp_header_Transfer_Encoding_ctor(tsk_object_t *self, va_list * app) +{ + thttp_header_Transfer_Encoding_t *Transfer_Encoding = self; + if(Transfer_Encoding){ + THTTP_HEADER(Transfer_Encoding)->type = thttp_htype_Transfer_Encoding; + THTTP_HEADER(Transfer_Encoding)->tostring = thttp_header_Transfer_Encoding_tostring; + + Transfer_Encoding->encoding = tsk_strdup( va_arg(*app, const char*) ); + } + else{ + TSK_DEBUG_ERROR("Failed to create new Transfer_Encoding header."); + } + return self; +} + +static tsk_object_t* thttp_header_Transfer_Encoding_dtor(tsk_object_t* self) +{ + thttp_header_Transfer_Encoding_t *Transfer_Encoding = self; + if(Transfer_Encoding){ + TSK_FREE(Transfer_Encoding->encoding); + TSK_OBJECT_SAFE_FREE(THTTP_HEADER_PARAMS(Transfer_Encoding)); + } + else{ + TSK_DEBUG_ERROR("Null Transfer_Encoding header."); + } + + return self; +} + +static const tsk_object_def_t thttp_header_Transfer_Encoding_def_s = +{ + sizeof(thttp_header_Transfer_Encoding_t), + thttp_header_Transfer_Encoding_ctor, + thttp_header_Transfer_Encoding_dtor, + tsk_null +}; +const tsk_object_def_t *thttp_header_Transfer_Encoding_def_t = &thttp_header_Transfer_Encoding_def_s; diff --git a/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_WWW_Authenticate.c b/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_WWW_Authenticate.c index d43ed44d..fb92c4c9 100644 --- a/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_WWW_Authenticate.c +++ b/branches/2.0/doubango/tinyHTTP/src/headers/thttp_header_WWW_Authenticate.c @@ -1,110 +1,110 @@ /* #line 1 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ -/* -* Copyright (C) 2010-2011 Mamadou Diop. -* -* Contact: Mamadou Diop -* -* This file is part of Open Source Doubango Framework. -* -* DOUBANGO is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* DOUBANGO is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with DOUBANGO. -* -*/ - -/**@file thttp_header_WWW_Authenticate.c - * @brief HTTP WWW-Authenticate header. - * - * @author Mamadou Diop - * - - */ -#include "tinyhttp/headers/thttp_header_WWW_Authenticate.h" - -#include "tinyhttp/parsers/thttp_parser_url.h" - -#include "tsk_debug.h" -#include "tsk_memory.h" -#include "tsk_time.h" - -#include - -// Check if we have ",CRLF" ==> See WWW-Authenticate header -// As :>CRLF is preceded by any+ ==> p will be at least (start + 1) -// p point to CR -#define prev_not_comma(p) !(p && p[-1] == ',') - -/*********************************** -* Ragel state machine. -*/ +/* +* Copyright (C) 2010-2011 Mamadou Diop. +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file thttp_header_WWW_Authenticate.c + * @brief HTTP WWW-Authenticate header. + * + * @author Mamadou Diop + * + + */ +#include "tinyhttp/headers/thttp_header_WWW_Authenticate.h" + +#include "tinyhttp/parsers/thttp_parser_url.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_time.h" + +#include + +// Check if we have ",CRLF" ==> See WWW-Authenticate header +// As :>CRLF is preceded by any+ ==> p will be at least (start + 1) +// p point to CR +#define prev_not_comma(p) !(p && p[-1] == ',') + +/*********************************** +* Ragel state machine. +*/ /* #line 137 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ - - -thttp_header_WWW_Authenticate_t* thttp_header_www_authenticate_create() -{ - return tsk_object_new(thttp_header_WWW_Authenticate_def_t); -} - -int thttp_header_WWW_Authenticate_tostring(const thttp_header_t* header, tsk_buffer_t* output) -{ - if(header){ - const thttp_header_WWW_Authenticate_t *WWW_Authenticate = (const thttp_header_WWW_Authenticate_t*)header; - if(WWW_Authenticate && WWW_Authenticate->scheme){ - return tsk_buffer_append_2(output, "%s realm=\"%s\"%s%s%s%s%s%s%s%s%s%s%s%s,stale=%s%s%s", - WWW_Authenticate->scheme, - WWW_Authenticate->realm ? WWW_Authenticate->realm : "", - - WWW_Authenticate->domain ? ",domain=\"" : "", - WWW_Authenticate->domain ? WWW_Authenticate->domain : "", - WWW_Authenticate->domain ? "\"" : "", - - - WWW_Authenticate->qop ? ",qop=\"" : "", - WWW_Authenticate->qop ? WWW_Authenticate->qop : "", - WWW_Authenticate->qop ? "\"" : "", - - - WWW_Authenticate->nonce ? ",nonce=\"" : "", - WWW_Authenticate->nonce ? WWW_Authenticate->nonce : "", - WWW_Authenticate->nonce ? "\"" : "", - - WWW_Authenticate->opaque ? ",opaque=\"" : "", - WWW_Authenticate->opaque ? WWW_Authenticate->opaque : "", - WWW_Authenticate->opaque ? "\"" : "", - - WWW_Authenticate->stale ? "TRUE" : "FALSE", - - WWW_Authenticate->algorithm ? ",algorithm=" : "", - WWW_Authenticate->algorithm ? WWW_Authenticate->algorithm : "" - ); - } - } - return -1; -} - -/**@ingroup thttp_header_group -*/ -thttp_header_WWW_Authenticate_t *thttp_header_WWW_Authenticate_parse(const char *data, tsk_size_t size) -{ - int cs = 0; - const char *p = data; - const char *pe = p + size; - const char *eof = pe; - thttp_header_WWW_Authenticate_t *hdr_WWW_Authenticate = thttp_header_www_authenticate_create(); - - const char *tag_start; - + + +thttp_header_WWW_Authenticate_t* thttp_header_www_authenticate_create() +{ + return tsk_object_new(thttp_header_WWW_Authenticate_def_t); +} + +int thttp_header_WWW_Authenticate_tostring(const thttp_header_t* header, tsk_buffer_t* output) +{ + if(header){ + const thttp_header_WWW_Authenticate_t *WWW_Authenticate = (const thttp_header_WWW_Authenticate_t*)header; + if(WWW_Authenticate && WWW_Authenticate->scheme){ + return tsk_buffer_append_2(output, "%s realm=\"%s\"%s%s%s%s%s%s%s%s%s%s%s%s,stale=%s%s%s", + WWW_Authenticate->scheme, + WWW_Authenticate->realm ? WWW_Authenticate->realm : "", + + WWW_Authenticate->domain ? ",domain=\"" : "", + WWW_Authenticate->domain ? WWW_Authenticate->domain : "", + WWW_Authenticate->domain ? "\"" : "", + + + WWW_Authenticate->qop ? ",qop=\"" : "", + WWW_Authenticate->qop ? WWW_Authenticate->qop : "", + WWW_Authenticate->qop ? "\"" : "", + + + WWW_Authenticate->nonce ? ",nonce=\"" : "", + WWW_Authenticate->nonce ? WWW_Authenticate->nonce : "", + WWW_Authenticate->nonce ? "\"" : "", + + WWW_Authenticate->opaque ? ",opaque=\"" : "", + WWW_Authenticate->opaque ? WWW_Authenticate->opaque : "", + WWW_Authenticate->opaque ? "\"" : "", + + WWW_Authenticate->stale ? "TRUE" : "FALSE", + + WWW_Authenticate->algorithm ? ",algorithm=" : "", + WWW_Authenticate->algorithm ? WWW_Authenticate->algorithm : "" + ); + } + } + return -1; +} + +/**@ingroup thttp_header_group +*/ +thttp_header_WWW_Authenticate_t *thttp_header_WWW_Authenticate_parse(const char *data, tsk_size_t size) +{ + int cs = 0; + const char *p = data; + const char *pe = p + size; + const char *eof = pe; + thttp_header_WWW_Authenticate_t *hdr_WWW_Authenticate = thttp_header_www_authenticate_create(); + + const char *tag_start; + /* #line 110 "./src/headers/thttp_header_WWW_Authenticate.c" */ static const char _thttp_machine_parser_header_WWW_Authenticate_actions[] = { @@ -8148,90 +8148,90 @@ _match: { case 0: /* #line 54 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ - { - tag_start = p; + { + tag_start = p; } break; case 1: /* #line 58 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ - { - hdr_WWW_Authenticate->scheme = tsk_strdup("Digest"); + { + hdr_WWW_Authenticate->scheme = tsk_strdup("Digest"); } break; case 2: /* #line 62 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ - { - hdr_WWW_Authenticate->scheme = tsk_strdup("Basic"); + { + hdr_WWW_Authenticate->scheme = tsk_strdup("Basic"); } break; case 3: /* #line 66 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ - { - THTTP_HEADER(hdr_WWW_Authenticate)->type = thttp_htype_WWW_Authenticate; + { + THTTP_HEADER(hdr_WWW_Authenticate)->type = thttp_htype_WWW_Authenticate; } break; case 4: /* #line 70 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ - { - THTTP_HEADER(hdr_WWW_Authenticate)->type = thttp_htype_Proxy_Authenticate; + { + THTTP_HEADER(hdr_WWW_Authenticate)->type = thttp_htype_Proxy_Authenticate; } break; case 5: /* #line 74 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ - { - TSK_PARSER_SET_STRING(hdr_WWW_Authenticate->realm); - tsk_strunquote(&hdr_WWW_Authenticate->realm); + { + TSK_PARSER_SET_STRING(hdr_WWW_Authenticate->realm); + tsk_strunquote(&hdr_WWW_Authenticate->realm); } break; case 6: /* #line 79 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ - { - TSK_PARSER_SET_STRING(hdr_WWW_Authenticate->domain); - //tsk_strunquote(&hdr_WWW_Authenticate->domain); + { + TSK_PARSER_SET_STRING(hdr_WWW_Authenticate->domain); + //tsk_strunquote(&hdr_WWW_Authenticate->domain); } break; case 7: /* #line 84 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ - { - TSK_PARSER_SET_STRING(hdr_WWW_Authenticate->nonce); - tsk_strunquote(&hdr_WWW_Authenticate->nonce); + { + TSK_PARSER_SET_STRING(hdr_WWW_Authenticate->nonce); + tsk_strunquote(&hdr_WWW_Authenticate->nonce); } break; case 8: /* #line 89 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ - { - TSK_PARSER_SET_STRING(hdr_WWW_Authenticate->opaque); - tsk_strunquote(&hdr_WWW_Authenticate->opaque); + { + TSK_PARSER_SET_STRING(hdr_WWW_Authenticate->opaque); + tsk_strunquote(&hdr_WWW_Authenticate->opaque); } break; case 9: /* #line 94 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ - { - hdr_WWW_Authenticate->stale = tsk_strniequals(tag_start, "true", 4); + { + hdr_WWW_Authenticate->stale = tsk_strniequals(tag_start, "true", 4); } break; case 10: /* #line 98 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ - { - TSK_PARSER_SET_STRING(hdr_WWW_Authenticate->algorithm); + { + TSK_PARSER_SET_STRING(hdr_WWW_Authenticate->algorithm); } break; case 11: /* #line 102 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ - { - TSK_PARSER_SET_STRING(hdr_WWW_Authenticate->qop); - //tsk_strunquote(&hdr_WWW_Authenticate->qop); + { + TSK_PARSER_SET_STRING(hdr_WWW_Authenticate->qop); + //tsk_strunquote(&hdr_WWW_Authenticate->qop); } break; case 12: /* #line 107 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ - { - TSK_PARSER_ADD_PARAM(THTTP_HEADER_PARAMS(hdr_WWW_Authenticate)); + { + TSK_PARSER_ADD_PARAM(THTTP_HEADER_PARAMS(hdr_WWW_Authenticate)); } break; case 13: /* #line 115 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ - { + { } break; /* #line 8238 "./src/headers/thttp_header_WWW_Authenticate.c" */ @@ -8248,71 +8248,71 @@ _again: } /* #line 196 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ - + if( cs < /* #line 8254 "./src/headers/thttp_header_WWW_Authenticate.c" */ 1738 /* #line 197 "./ragel/thttp_parser_header_WWW_Authenticate.rl" */ - ){ - TSK_DEBUG_ERROR("Failed to parse WWW-Authenticate header."); - TSK_OBJECT_SAFE_FREE(hdr_WWW_Authenticate); - } - - return hdr_WWW_Authenticate; -} - -thttp_header_Proxy_Authenticate_t *thttp_header_Proxy_Authenticate_parse(const char *data, tsk_size_t size) -{ - return thttp_header_WWW_Authenticate_parse(data, size); -} - - - - - -//======================================================== -// WWW_Authenticate header object definition -// - -static tsk_object_t* thttp_header_WWW_Authenticate_ctor(tsk_object_t *self, va_list * app) -{ - thttp_header_WWW_Authenticate_t *WWW_Authenticate = self; - if(WWW_Authenticate){ - THTTP_HEADER(WWW_Authenticate)->type = thttp_htype_WWW_Authenticate; - THTTP_HEADER(WWW_Authenticate)->tostring = thttp_header_WWW_Authenticate_tostring; - } - else{ - TSK_DEBUG_ERROR("Failed to create new WWW_Authenticate header."); - } - return self; -} - -static tsk_object_t* thttp_header_WWW_Authenticate_dtor(tsk_object_t *self) -{ - thttp_header_WWW_Authenticate_t *WWW_Authenticate = self; - if(WWW_Authenticate){ - TSK_FREE(WWW_Authenticate->scheme); - TSK_FREE(WWW_Authenticate->realm); - TSK_FREE(WWW_Authenticate->domain); - TSK_FREE(WWW_Authenticate->nonce); - TSK_FREE(WWW_Authenticate->opaque); - TSK_FREE(WWW_Authenticate->algorithm); - TSK_FREE(WWW_Authenticate->qop); - - TSK_OBJECT_SAFE_FREE(THTTP_HEADER_PARAMS(WWW_Authenticate)); - } - else{ - TSK_DEBUG_ERROR("Null WWW_Authenticate header."); - } - - return self; -} - -static const tsk_object_def_t thttp_header_WWW_Authenticate_def_s = -{ - sizeof(thttp_header_WWW_Authenticate_t), - thttp_header_WWW_Authenticate_ctor, - thttp_header_WWW_Authenticate_dtor, - tsk_null -}; -const tsk_object_def_t *thttp_header_WWW_Authenticate_def_t = &thttp_header_WWW_Authenticate_def_s; + ){ + TSK_DEBUG_ERROR("Failed to parse WWW-Authenticate header."); + TSK_OBJECT_SAFE_FREE(hdr_WWW_Authenticate); + } + + return hdr_WWW_Authenticate; +} + +thttp_header_Proxy_Authenticate_t *thttp_header_Proxy_Authenticate_parse(const char *data, tsk_size_t size) +{ + return thttp_header_WWW_Authenticate_parse(data, size); +} + + + + + +//======================================================== +// WWW_Authenticate header object definition +// + +static tsk_object_t* thttp_header_WWW_Authenticate_ctor(tsk_object_t *self, va_list * app) +{ + thttp_header_WWW_Authenticate_t *WWW_Authenticate = self; + if(WWW_Authenticate){ + THTTP_HEADER(WWW_Authenticate)->type = thttp_htype_WWW_Authenticate; + THTTP_HEADER(WWW_Authenticate)->tostring = thttp_header_WWW_Authenticate_tostring; + } + else{ + TSK_DEBUG_ERROR("Failed to create new WWW_Authenticate header."); + } + return self; +} + +static tsk_object_t* thttp_header_WWW_Authenticate_dtor(tsk_object_t *self) +{ + thttp_header_WWW_Authenticate_t *WWW_Authenticate = self; + if(WWW_Authenticate){ + TSK_FREE(WWW_Authenticate->scheme); + TSK_FREE(WWW_Authenticate->realm); + TSK_FREE(WWW_Authenticate->domain); + TSK_FREE(WWW_Authenticate->nonce); + TSK_FREE(WWW_Authenticate->opaque); + TSK_FREE(WWW_Authenticate->algorithm); + TSK_FREE(WWW_Authenticate->qop); + + TSK_OBJECT_SAFE_FREE(THTTP_HEADER_PARAMS(WWW_Authenticate)); + } + else{ + TSK_DEBUG_ERROR("Null WWW_Authenticate header."); + } + + return self; +} + +static const tsk_object_def_t thttp_header_WWW_Authenticate_def_s = +{ + sizeof(thttp_header_WWW_Authenticate_t), + thttp_header_WWW_Authenticate_ctor, + thttp_header_WWW_Authenticate_dtor, + tsk_null +}; +const tsk_object_def_t *thttp_header_WWW_Authenticate_def_t = &thttp_header_WWW_Authenticate_def_s; diff --git a/branches/2.0/doubango/tinyHTTP/src/parsers/thttp_parser_header.c b/branches/2.0/doubango/tinyHTTP/src/parsers/thttp_parser_header.c index 4a69cee9..c68e4da8 100644 --- a/branches/2.0/doubango/tinyHTTP/src/parsers/thttp_parser_header.c +++ b/branches/2.0/doubango/tinyHTTP/src/parsers/thttp_parser_header.c @@ -1,105 +1,105 @@ /* #line 1 "./ragel/thttp_parser_header.rl" */ -/* -* Copyright (C) 2010-2011 Mamadou Diop. -* -* Contact: Mamadou Diop -* -* This file is part of Open Source Doubango Framework. -* -* DOUBANGO is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* DOUBANGO is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with DOUBANGO. -* -*/ - -/**@file thttp_parser_header.c - * @brief HTTP headers parser. - * - * @author Mamadou Diop - * - - */ -#include "tinyhttp/parsers/thttp_parser_header.h" - -//#include "tinyhttp/headers/thttp_header_Allow.h" -//#include "tinyhttp/headers/thttp_header_Allow_Events.h" -#include "tinyhttp/headers/thttp_header_Authorization.h" -//#include "tinyhttp/headers/thttp_header_Call_ID.h" -//#include "tinyhttp/headers/thttp_header_Contact.h" -//#include "tinyhttp/headers/thttp_header_CSeq.h" -#include "tinyhttp/headers/thttp_header_Dummy.h" -#include "tinyhttp/headers/thttp_header_ETag.h" -//#include "tinyhttp/headers/thttp_header_Expires.h" -//#include "tinyhttp/headers/thttp_header_From.h" -//#include "tinyhttp/headers/thttp_header_Max_Forwards.h" -//#include "tinyhttp/headers/thttp_header_Min_Expires.h" -//#include "tinyhttp/headers/thttp_header_Path.h" -//#include "tinyhttp/headers/thttp_header_P_Access_Network_Info.h" -//#include "tinyhttp/headers/thttp_header_P_Preferred_Identity.h" -//#include "tinyhttp/headers/thttp_header_Privacy.h" -//#include "tinyhttp/headers/thttp_header_Proxy_Authenticate.h" -//#include "tinyhttp/headers/thttp_header_Proxy_Authorization.h" -//#include "tinyhttp/headers/thttp_header_Record_Route.h" -//#include "tinyhttp/headers/thttp_header_Require.h" -//#include "tinyhttp/headers/thttp_header_Route.h" -#include "tinyhttp/headers/thttp_header_Sec_WebSocket_Accept.h" -#include "tinyhttp/headers/thttp_header_Sec_WebSocket_Key.h" -#include "tinyhttp/headers/thttp_header_Sec_WebSocket_Protocol.h" -#include "tinyhttp/headers/thttp_header_Sec_WebSocket_Version.h" -//#include "tinyhttp/headers/thttp_header_Service_Route.h" -//#include "tinyhttp/headers/thttp_header_Supported.h" -#include "tinyhttp/headers/thttp_header_Transfer_Encoding.h" -//#include "tinyhttp/headers/thttp_header_User_Agent.h" -//#include "tinyhttp/headers/thttp_header_Via.h" -#include "tinyhttp/headers/thttp_header_WWW_Authenticate.h" - -#include "tsk_debug.h" - -#undef ADD_HEADERS -#undef ADD_HEADER - -#define ADD_HEADERS(headers)\ - if(headers)\ - {\ - tsk_list_item_t *item;\ - tsk_list_foreach(item, headers)\ - {\ - thttp_header_t *hdr = tsk_object_ref(item->data);\ - tsk_list_push_back_data(message->headers, ((void**) &hdr));\ - }\ - \ - TSK_OBJECT_SAFE_FREE(headers);\ - } -#define ADD_HEADER(header)\ - if(header)\ - {\ - tsk_list_push_back_data(message->headers, ((void**) &header));\ - } - -/*********************************** -* Ragel state machine. -*/ +/* +* Copyright (C) 2010-2011 Mamadou Diop. +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file thttp_parser_header.c + * @brief HTTP headers parser. + * + * @author Mamadou Diop + * + + */ +#include "tinyhttp/parsers/thttp_parser_header.h" + +//#include "tinyhttp/headers/thttp_header_Allow.h" +//#include "tinyhttp/headers/thttp_header_Allow_Events.h" +#include "tinyhttp/headers/thttp_header_Authorization.h" +//#include "tinyhttp/headers/thttp_header_Call_ID.h" +//#include "tinyhttp/headers/thttp_header_Contact.h" +//#include "tinyhttp/headers/thttp_header_CSeq.h" +#include "tinyhttp/headers/thttp_header_Dummy.h" +#include "tinyhttp/headers/thttp_header_ETag.h" +//#include "tinyhttp/headers/thttp_header_Expires.h" +//#include "tinyhttp/headers/thttp_header_From.h" +//#include "tinyhttp/headers/thttp_header_Max_Forwards.h" +//#include "tinyhttp/headers/thttp_header_Min_Expires.h" +//#include "tinyhttp/headers/thttp_header_Path.h" +//#include "tinyhttp/headers/thttp_header_P_Access_Network_Info.h" +//#include "tinyhttp/headers/thttp_header_P_Preferred_Identity.h" +//#include "tinyhttp/headers/thttp_header_Privacy.h" +//#include "tinyhttp/headers/thttp_header_Proxy_Authenticate.h" +//#include "tinyhttp/headers/thttp_header_Proxy_Authorization.h" +//#include "tinyhttp/headers/thttp_header_Record_Route.h" +//#include "tinyhttp/headers/thttp_header_Require.h" +//#include "tinyhttp/headers/thttp_header_Route.h" +#include "tinyhttp/headers/thttp_header_Sec_WebSocket_Accept.h" +#include "tinyhttp/headers/thttp_header_Sec_WebSocket_Key.h" +#include "tinyhttp/headers/thttp_header_Sec_WebSocket_Protocol.h" +#include "tinyhttp/headers/thttp_header_Sec_WebSocket_Version.h" +//#include "tinyhttp/headers/thttp_header_Service_Route.h" +//#include "tinyhttp/headers/thttp_header_Supported.h" +#include "tinyhttp/headers/thttp_header_Transfer_Encoding.h" +//#include "tinyhttp/headers/thttp_header_User_Agent.h" +//#include "tinyhttp/headers/thttp_header_Via.h" +#include "tinyhttp/headers/thttp_header_WWW_Authenticate.h" + +#include "tsk_debug.h" + +#undef ADD_HEADERS +#undef ADD_HEADER + +#define ADD_HEADERS(headers)\ + if(headers)\ + {\ + tsk_list_item_t *item;\ + tsk_list_foreach(item, headers)\ + {\ + thttp_header_t *hdr = tsk_object_ref(item->data);\ + tsk_list_push_back_data(message->headers, ((void**) &hdr));\ + }\ + \ + TSK_OBJECT_SAFE_FREE(headers);\ + } +#define ADD_HEADER(header)\ + if(header)\ + {\ + tsk_list_push_back_data(message->headers, ((void**) &header));\ + } + +/*********************************** +* Ragel state machine. +*/ /* #line 508 "./ragel/thttp_parser_header.rl" */ - - -int thttp_header_parse(tsk_ragel_state_t *state, thttp_message_t *message) -{ - int cs = 0; - const char *p = state->tag_start; - const char *pe = state->tag_end; - const char *eof = pe; - + + +int thttp_header_parse(tsk_ragel_state_t *state, thttp_message_t *message) +{ + int cs = 0; + const char *p = state->tag_start; + const char *pe = state->tag_end; + const char *eof = pe; + /* #line 105 "./src/parsers/thttp_parser_header.c" */ static const char _thttp_machine_parser_headers_actions[] = { @@ -2419,408 +2419,408 @@ _match: { case 0: /* #line 96 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Accept NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Accept NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 1: /* #line 105 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Accept_Charset NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Accept_Charset NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 2: /* #line 114 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Accept_Encoding NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Accept_Encoding NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 3: /* #line 123 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Accept_Language NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Accept_Language NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 4: /* #line 132 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Allow NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Allow NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 5: /* #line 141 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Authorization_t *header = thttp_header_Authorization_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); + { + thttp_header_Authorization_t *header = thttp_header_Authorization_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); } break; case 6: /* #line 148 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Cache_Control NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Cache_Control NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 7: /* #line 157 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Connection NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Connection NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 8: /* #line 166 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Content_Encoding NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Content_Encoding NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 9: /* #line 175 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Content_Language NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Content_Language NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 10: /* #line 184 "./ragel/thttp_parser_header.rl" */ - { - if(!message->Content_Length){ - message->Content_Length = thttp_header_Content_Length_parse(state->tag_start, (state->tag_end-state->tag_start)); - } - else{ - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - //TSK_DEBUG_WARN("The message already have 'Content-Length' header."); - } + { + if(!message->Content_Length){ + message->Content_Length = thttp_header_Content_Length_parse(state->tag_start, (state->tag_end-state->tag_start)); + } + else{ + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + //TSK_DEBUG_WARN("The message already have 'Content-Length' header."); + } } break; case 11: /* #line 197 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Content_Location NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Content_Location NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 12: /* #line 206 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Content_MD5 NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Content_MD5 NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 13: /* #line 215 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Content_Range NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Content_Range NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 14: /* #line 224 "./ragel/thttp_parser_header.rl" */ - { - if(!message->Content_Type){ - message->Content_Type = thttp_header_Content_Type_parse(state->tag_start, (state->tag_end-state->tag_start)); - } - else{ - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - //TSK_DEBUG_WARN("The message already have 'Content-Type' header."); - } + { + if(!message->Content_Type){ + message->Content_Type = thttp_header_Content_Type_parse(state->tag_start, (state->tag_end-state->tag_start)); + } + else{ + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + //TSK_DEBUG_WARN("The message already have 'Content-Type' header."); + } } break; case 15: /* #line 237 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Date NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Date NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 16: /* #line 246 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_ETag_t *header = thttp_header_ETag_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Expires NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_ETag_t *header = thttp_header_ETag_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Expires NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 17: /* #line 255 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Expect NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Expect NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 18: /* #line 264 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Expires NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Expires NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 19: /* #line 273 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_From NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_From NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 20: /* #line 282 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Host NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Host NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 21: /* #line 291 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_If_Match NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_If_Match NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 22: /* #line 300 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_If_Modified_Since NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_If_Modified_Since NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 23: /* #line 309 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_If_None_Match NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_If_None_Match NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 24: /* #line 318 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_If_Range NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_If_Range NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 25: /* #line 327 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_If_Unmodified_Since NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_If_Unmodified_Since NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 26: /* #line 336 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Last_Modified NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Last_Modified NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 27: /* #line 345 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Max_Forwards NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Max_Forwards NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 28: /* #line 354 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Pragma NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Pragma NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 29: /* #line 363 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Proxy_Authenticate_t *header = thttp_header_Proxy_Authenticate_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); + { + thttp_header_Proxy_Authenticate_t *header = thttp_header_Proxy_Authenticate_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); } break; case 30: /* #line 370 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Proxy_Authorization_t *header = thttp_header_Proxy_Authorization_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); + { + thttp_header_Proxy_Authorization_t *header = thttp_header_Proxy_Authorization_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); } break; case 31: /* #line 377 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Range NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Range NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 32: /* #line 386 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Referer NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Referer NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 33: /* #line 395 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Sec_WebSocket_Accept_t* header = thttp_header_Sec_WebSocket_Accept_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); + { + thttp_header_Sec_WebSocket_Accept_t* header = thttp_header_Sec_WebSocket_Accept_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); } break; case 34: /* #line 402 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Sec_WebSocket_Key_t* header = thttp_header_Sec_WebSocket_Key_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); + { + thttp_header_Sec_WebSocket_Key_t* header = thttp_header_Sec_WebSocket_Key_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); } break; case 35: /* #line 409 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Sec_WebSocket_Protocol_t* header = thttp_header_Sec_WebSocket_Protocol_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); + { + thttp_header_Sec_WebSocket_Protocol_t* header = thttp_header_Sec_WebSocket_Protocol_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); } break; case 36: /* #line 417 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Sec_WebSocket_Version_t* header = thttp_header_Sec_WebSocket_Version_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); + { + thttp_header_Sec_WebSocket_Version_t* header = thttp_header_Sec_WebSocket_Version_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); } break; case 37: /* #line 424 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_TE NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_TE NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 38: /* #line 433 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Trailer NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Trailer NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 39: /* #line 442 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Transfer_Encoding_t *header = thttp_header_Transfer_Encoding_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Trailer NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Transfer_Encoding_t *header = thttp_header_Transfer_Encoding_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Trailer NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 40: /* #line 451 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Upgrade NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Upgrade NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 41: /* #line 460 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_User_Agent NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_User_Agent NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 42: /* #line 469 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Via NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Via NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 43: /* #line 478 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_Warning NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_Warning NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 44: /* #line 487 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_WWW_Authenticate_t *header = thttp_header_WWW_Authenticate_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); + { + thttp_header_WWW_Authenticate_t *header = thttp_header_WWW_Authenticate_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); } break; case 45: /* #line 494 "./ragel/thttp_parser_header.rl" */ - { - thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); - ADD_HEADER(header); - - //TSK_DEBUG_WARN("parse_header_extension_header NOT IMPLEMENTED. Will be added as Dummy header."); + { + thttp_header_Dummy_t *header = thttp_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); + ADD_HEADER(header); + + //TSK_DEBUG_WARN("parse_header_extension_header NOT IMPLEMENTED. Will be added as Dummy header."); } break; /* #line 2827 "./src/parsers/thttp_parser_header.c" */ @@ -2837,10 +2837,10 @@ _again: } /* #line 520 "./ragel/thttp_parser_header.rl" */ - + return ( cs >= /* #line 2843 "./src/parsers/thttp_parser_header.c" */ 639 /* #line 521 "./ragel/thttp_parser_header.rl" */ - ) ? 0 : -1; -} + ) ? 0 : -1; +} diff --git a/branches/2.0/doubango/tinyHTTP/src/parsers/thttp_parser_message.c b/branches/2.0/doubango/tinyHTTP/src/parsers/thttp_parser_message.c index 0704e327..8b25191f 100644 --- a/branches/2.0/doubango/tinyHTTP/src/parsers/thttp_parser_message.c +++ b/branches/2.0/doubango/tinyHTTP/src/parsers/thttp_parser_message.c @@ -1,55 +1,55 @@ /* #line 1 "./ragel/thttp_parser_message.rl" */ -/* -* Copyright (C) 2010-2011 Mamadou Diop. -* -* Contact: Mamadou Diop -* -* This file is part of Open Source Doubango Framework. -* -* DOUBANGO is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* DOUBANGO is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with DOUBANGO. -* -*/ - -/**@file thttp_parser_message.c - * @brief HTTP parser. - * - * @author Mamadou Diop - * - - */ -#include "tinyhttp/parsers/thttp_parser_message.h" -#include "tinyhttp/parsers/thttp_parser_header.h" - -#include "tinyhttp/parsers/thttp_parser_url.h" - -#include "tsk_debug.h" -#include "tsk_memory.h" - -static void thttp_message_parser_execute(tsk_ragel_state_t *state, thttp_message_t *message, tsk_bool_t extract_content); -static void thttp_message_parser_init(tsk_ragel_state_t *state); -static void thttp_message_parser_eoh(tsk_ragel_state_t *state, thttp_message_t *message, tsk_bool_t extract_content); - -/*********************************** -* Ragel state machine. -*/ +/* +* Copyright (C) 2010-2011 Mamadou Diop. +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file thttp_parser_message.c + * @brief HTTP parser. + * + * @author Mamadou Diop + * + + */ +#include "tinyhttp/parsers/thttp_parser_message.h" +#include "tinyhttp/parsers/thttp_parser_header.h" + +#include "tinyhttp/parsers/thttp_parser_url.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" + +static void thttp_message_parser_execute(tsk_ragel_state_t *state, thttp_message_t *message, tsk_bool_t extract_content); +static void thttp_message_parser_init(tsk_ragel_state_t *state); +static void thttp_message_parser_eoh(tsk_ragel_state_t *state, thttp_message_t *message, tsk_bool_t extract_content); + +/*********************************** +* Ragel state machine. +*/ /* #line 165 "./ragel/thttp_parser_message.rl" */ - - - -/* Regel data */ + + + +/* Regel data */ /* #line 55 "./src/parsers/thttp_parser_message.c" */ static const char _thttp_machine_parser_message_actions[] = { @@ -173,54 +173,54 @@ static const int thttp_machine_parser_message_en_main = 1; /* #line 170 "./ragel/thttp_parser_message.rl" */ - -/** Parses raw HTTP buffer. - * - * @param state Ragel state containing the buffer references. - * @param result @ref thttp_message_t object representing the raw buffer. - * @param extract_content Indicates wheteher to parse the message content or not. If set to true, then - * only headers will be parsed. - * - * @retval Zero if succeed and non-zero error code otherwise. -**/ -int thttp_message_parse(tsk_ragel_state_t *state, thttp_message_t **result, tsk_bool_t extract_content) -{ - if(!state || state->pe <= state->p){ - return -1; - } - - if(!*result){ - *result = thttp_message_create(); - } - - /* Ragel init */ - thttp_message_parser_init(state); - - /* - * State mechine execution. - */ - thttp_message_parser_execute(state, *result, extract_content); - - /* Check result */ - + +/** Parses raw HTTP buffer. + * + * @param state Ragel state containing the buffer references. + * @param result @ref thttp_message_t object representing the raw buffer. + * @param extract_content Indicates wheteher to parse the message content or not. If set to true, then + * only headers will be parsed. + * + * @retval Zero if succeed and non-zero error code otherwise. +**/ +int thttp_message_parse(tsk_ragel_state_t *state, thttp_message_t **result, tsk_bool_t extract_content) +{ + if(!state || state->pe <= state->p){ + return -1; + } + + if(!*result){ + *result = thttp_message_create(); + } + + /* Ragel init */ + thttp_message_parser_init(state); + + /* + * State mechine execution. + */ + thttp_message_parser_execute(state, *result, extract_content); + + /* Check result */ + if( state->cs < /* #line 208 "./src/parsers/thttp_parser_message.c" */ 39 /* #line 200 "./ragel/thttp_parser_message.rl" */ - ){ - TSK_DEBUG_ERROR("Failed to parse HTTP message."); - TSK_OBJECT_SAFE_FREE(*result); - return -2; - } - return 0; -} - - -static void thttp_message_parser_init(tsk_ragel_state_t *state) -{ - int cs = 0; - - /* Regel machine initialization. */ + ){ + TSK_DEBUG_ERROR("Failed to parse HTTP message."); + TSK_OBJECT_SAFE_FREE(*result); + return -2; + } + return 0; +} + + +static void thttp_message_parser_init(tsk_ragel_state_t *state) +{ + int cs = 0; + + /* Regel machine initialization. */ /* #line 226 "./src/parsers/thttp_parser_message.c" */ { @@ -228,17 +228,17 @@ static void thttp_message_parser_init(tsk_ragel_state_t *state) } /* #line 215 "./ragel/thttp_parser_message.rl" */ - - state->cs = cs; -} - -static void thttp_message_parser_execute(tsk_ragel_state_t *state, thttp_message_t *message, tsk_bool_t extract_content) -{ - int cs = state->cs; - const char *p = state->p; - const char *pe = state->pe; - const char *eof = state->eof; - + + state->cs = cs; +} + +static void thttp_message_parser_execute(tsk_ragel_state_t *state, thttp_message_t *message, tsk_bool_t extract_content) +{ + int cs = state->cs; + const char *p = state->p; + const char *pe = state->pe; + const char *eof = state->eof; + /* #line 244 "./src/parsers/thttp_parser_message.c" */ { @@ -316,112 +316,112 @@ _match: { case 0: /* #line 49 "./ragel/thttp_parser_message.rl" */ - { - state->tag_start = p; + { + state->tag_start = p; } break; case 1: /* #line 54 "./ragel/thttp_parser_message.rl" */ - { - int len; - state->tag_end = p; - len = (int)(state->tag_end - state->tag_start); - - if(message->type == thttp_unknown){ - message->type = thttp_request; - if(!message->line.request.method){ - message->line.request.method = tsk_calloc(1, len+1); - memcpy(message->line.request.method, state->tag_start, len); - } - } - else{ - state->cs = thttp_machine_parser_message_error; - } + { + int len; + state->tag_end = p; + len = (int)(state->tag_end - state->tag_start); + + if(message->type == thttp_unknown){ + message->type = thttp_request; + if(!message->line.request.method){ + message->line.request.method = tsk_calloc(1, len+1); + memcpy(message->line.request.method, state->tag_start, len); + } + } + else{ + state->cs = thttp_machine_parser_message_error; + } } break; case 2: /* #line 72 "./ragel/thttp_parser_message.rl" */ - { - int len; - state->tag_end = p; - len = (int)(state->tag_end - state->tag_start); - - if(!message->line.request.url){ - message->line.request.url = thttp_url_parse(state->tag_start, (tsk_size_t)len); - } + { + int len; + state->tag_end = p; + len = (int)(state->tag_end - state->tag_start); + + if(!message->line.request.url){ + message->line.request.url = thttp_url_parse(state->tag_start, (tsk_size_t)len); + } } break; case 3: /* #line 83 "./ragel/thttp_parser_message.rl" */ - { - int len; - state->tag_end = p; - len = (int)(state->tag_end - state->tag_start); - - if(!message->http_version){ - message->http_version = tsk_calloc(1, len+1); - memcpy(message->http_version, state->tag_start, len); - } + { + int len; + state->tag_end = p; + len = (int)(state->tag_end - state->tag_start); + + if(!message->http_version){ + message->http_version = tsk_calloc(1, len+1); + memcpy(message->http_version, state->tag_start, len); + } } break; case 4: /* #line 95 "./ragel/thttp_parser_message.rl" */ - { - int len; - state->tag_end = p; - len = (int)(state->tag_end - state->tag_start); - - if(message->type == thttp_unknown){ - message->type = thttp_response; - message->line.response.status_code = atoi(state->tag_start); - } - else{ - state->cs = thttp_machine_parser_message_error; - } + { + int len; + state->tag_end = p; + len = (int)(state->tag_end - state->tag_start); + + if(message->type == thttp_unknown){ + message->type = thttp_response; + message->line.response.status_code = atoi(state->tag_start); + } + else{ + state->cs = thttp_machine_parser_message_error; + } } break; case 5: /* #line 110 "./ragel/thttp_parser_message.rl" */ - { - int len; - state->tag_end = p; - len = (int)(state->tag_end - state->tag_start); - - if(!message->line.response.reason_phrase){ - message->line.response.reason_phrase = tsk_calloc(1, len+1); - memcpy(message->line.response.reason_phrase, state->tag_start, len); - } + { + int len; + state->tag_end = p; + len = (int)(state->tag_end - state->tag_start); + + if(!message->line.response.reason_phrase){ + message->line.response.reason_phrase = tsk_calloc(1, len+1); + memcpy(message->line.response.reason_phrase, state->tag_start, len); + } } break; case 6: /* #line 122 "./ragel/thttp_parser_message.rl" */ - { - int len; - state->tag_end = p; - len = (int)(state->tag_end - state->tag_start); - - if(thttp_header_parse(state, message)){ - TSK_DEBUG_ERROR("Failed to parse header - %s", state->tag_start); - } - else{ - //TSK_DEBUG_INFO("THTTP_MESSAGE_PARSER::PARSE_HEADER len=%d state=%d", len, state->cs); - } + { + int len; + state->tag_end = p; + len = (int)(state->tag_end - state->tag_start); + + if(thttp_header_parse(state, message)){ + TSK_DEBUG_ERROR("Failed to parse header - %s", state->tag_start); + } + else{ + //TSK_DEBUG_INFO("THTTP_MESSAGE_PARSER::PARSE_HEADER len=%d state=%d", len, state->cs); + } } break; case 7: /* #line 145 "./ragel/thttp_parser_message.rl" */ - { - state->cs = cs; - state->p = p; - state->pe = pe; - state->eof = eof; - - thttp_message_parser_eoh(state, message, extract_content); - - cs = state->cs; - p = state->p; - pe = state->pe; - eof = state->eof; + { + state->cs = cs; + state->p = p; + state->pe = pe; + state->eof = eof; + + thttp_message_parser_eoh(state, message, extract_content); + + cs = state->cs; + p = state->p; + pe = state->pe; + eof = state->eof; } break; /* #line 428 "./src/parsers/thttp_parser_message.c" */ @@ -438,36 +438,36 @@ _again: } /* #line 227 "./ragel/thttp_parser_message.rl" */ - - state->cs = cs; - state->p = p; - state->pe = pe; - state->eof = eof; -} - -static void thttp_message_parser_eoh(tsk_ragel_state_t *state, thttp_message_t *message, tsk_bool_t extract_content) -{ - int cs = state->cs; - const char *p = state->p; - const char *pe = state->pe; - const char *eof = state->eof; - - if(extract_content && message){ - uint32_t clen = THTTP_MESSAGE_CONTENT_LENGTH(message); - if(clen){ - if((p + clen)Content){ - message->Content = tsk_buffer_create((p+1), clen); - p = (p + clen); - } - else{ - p = (pe - 1); - } - } - } - //%%write eof; - - state->cs = cs; - state->p = p; - state->pe = pe; - state->eof = eof; -} + + state->cs = cs; + state->p = p; + state->pe = pe; + state->eof = eof; +} + +static void thttp_message_parser_eoh(tsk_ragel_state_t *state, thttp_message_t *message, tsk_bool_t extract_content) +{ + int cs = state->cs; + const char *p = state->p; + const char *pe = state->pe; + const char *eof = state->eof; + + if(extract_content && message){ + uint32_t clen = THTTP_MESSAGE_CONTENT_LENGTH(message); + if(clen){ + if((p + clen)Content){ + message->Content = tsk_buffer_create((p+1), clen); + p = (p + clen); + } + else{ + p = (pe - 1); + } + } + } + //%%write eof; + + state->cs = cs; + state->p = p; + state->pe = pe; + state->eof = eof; +} diff --git a/branches/2.0/doubango/tinyHTTP/src/parsers/thttp_parser_url.c b/branches/2.0/doubango/tinyHTTP/src/parsers/thttp_parser_url.c index 86ad8f6d..bef19bf7 100644 --- a/branches/2.0/doubango/tinyHTTP/src/parsers/thttp_parser_url.c +++ b/branches/2.0/doubango/tinyHTTP/src/parsers/thttp_parser_url.c @@ -1,75 +1,75 @@ /* #line 1 "./ragel/thttp_parser_url.rl" */ -/* -* Copyright (C) 2010-2011 Mamadou Diop. -* -* Contact: Mamadou Diop -* -* This file is part of Open Source Doubango Framework. -* -* DOUBANGO is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* DOUBANGO is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with DOUBANGO. -* -*/ - -/**@file thttp_parser_url.c - * @brief HTTP/HTTPS URL parser. - * - * @author Mamadou Diop - * - - */ -#include "tinyhttp/parsers/thttp_parser_url.h" - -#include "tsk_string.h" -#include "tsk_memory.h" -#include "tsk_debug.h" - -/*********************************** -* Ragel state machine. -*/ +/* +* Copyright (C) 2010-2011 Mamadou Diop. +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file thttp_parser_url.c + * @brief HTTP/HTTPS URL parser. + * + * @author Mamadou Diop + * + + */ +#include "tinyhttp/parsers/thttp_parser_url.h" + +#include "tsk_string.h" +#include "tsk_memory.h" +#include "tsk_debug.h" + +/*********************************** +* Ragel state machine. +*/ /* #line 88 "./ragel/thttp_parser_url.rl" */ - - -/**@ingroup thttp_url_group -* Parses a HTTP/HTTPS url. -* @param urlstring A pointer to a valid url string. If the port is missing, then it's default value will be 443 if -* the scheme is 'https' and 80 otherwise.
-* @param length The length of the url string. -* @retval A well-defined object representing the url string. -* -* @code -* thttp_url_t* url = thttp_url_parse("http://www.google.com", tsk_strlen("http://www.google.com")); -* @endcode -* -* @sa @ref thttp_url_tostring
@ref thttp_url_serialize -**/ -thttp_url_t *thttp_url_parse(const char *urlstring, tsk_size_t length) -{ - tsk_bool_t have_port = tsk_false; - int cs = 0; - const char *p = urlstring; - const char *pe = p + length; - const char *eof = pe; - - const char *ts = 0, *te = 0; - int act =0; - - thttp_url_t *url = thttp_url_create(thttp_url_unknown); - - const char *tag_start = 0; - + + +/**@ingroup thttp_url_group +* Parses a HTTP/HTTPS url. +* @param urlstring A pointer to a valid url string. If the port is missing, then it's default value will be 443 if +* the scheme is 'https' and 80 otherwise.
+* @param length The length of the url string. +* @retval A well-defined object representing the url string. +* +* @code +* thttp_url_t* url = thttp_url_parse("http://www.google.com", tsk_strlen("http://www.google.com")); +* @endcode +* +* @sa @ref thttp_url_tostring
@ref thttp_url_serialize +**/ +thttp_url_t *thttp_url_parse(const char *urlstring, tsk_size_t length) +{ + tsk_bool_t have_port = tsk_false; + int cs = 0; + const char *p = urlstring; + const char *pe = p + length; + const char *eof = pe; + + const char *ts = 0, *te = 0; + int act =0; + + thttp_url_t *url = thttp_url_create(thttp_url_unknown); + + const char *tag_start = 0; + /* #line 75 "./src/parsers/thttp_parser_url.c" */ static const char _thttp_machine_parser_url_actions[] = { @@ -358,8 +358,8 @@ _match: { case 0: /* #line 45 "./ragel/thttp_parser_url.rl" */ - { - tag_start = p; + { + tag_start = p; } break; case 1: @@ -384,26 +384,26 @@ _match: break; case 6: /* #line 58 "./ragel/thttp_parser_url.rl" */ - { - TSK_PARSER_SET_STRING(url->host); + { + TSK_PARSER_SET_STRING(url->host); } break; case 7: /* #line 62 "./ragel/thttp_parser_url.rl" */ - { - have_port = 1; - TSK_PARSER_SET_INT(url->port); + { + have_port = 1; + TSK_PARSER_SET_INT(url->port); } break; case 8: /* #line 67 "./ragel/thttp_parser_url.rl" */ - { - TSK_PARSER_SET_STRING(url->hpath); + { + TSK_PARSER_SET_STRING(url->hpath); } break; case 10: /* #line 75 "./ragel/thttp_parser_url.rl" */ - { + { } break; /* #line 410 "./src/parsers/thttp_parser_url.c" */ @@ -424,33 +424,33 @@ _again: switch ( *__acts++ ) { case 0: /* #line 45 "./ragel/thttp_parser_url.rl" */ - { - tag_start = p; + { + tag_start = p; } break; case 6: /* #line 58 "./ragel/thttp_parser_url.rl" */ - { - TSK_PARSER_SET_STRING(url->host); + { + TSK_PARSER_SET_STRING(url->host); } break; case 7: /* #line 62 "./ragel/thttp_parser_url.rl" */ - { - have_port = 1; - TSK_PARSER_SET_INT(url->port); + { + have_port = 1; + TSK_PARSER_SET_INT(url->port); } break; case 8: /* #line 67 "./ragel/thttp_parser_url.rl" */ - { - TSK_PARSER_SET_STRING(url->hpath); + { + TSK_PARSER_SET_STRING(url->hpath); } break; case 9: /* #line 71 "./ragel/thttp_parser_url.rl" */ - { - TSK_PARSER_SET_STRING(url->search); + { + TSK_PARSER_SET_STRING(url->search); } break; /* #line 457 "./src/parsers/thttp_parser_url.c" */ @@ -462,23 +462,23 @@ _again: } /* #line 121 "./ragel/thttp_parser_url.rl" */ - + if( cs < /* #line 468 "./src/parsers/thttp_parser_url.c" */ 63 /* #line 122 "./ragel/thttp_parser_url.rl" */ - ){ - TSK_DEBUG_ERROR("Failed to parse HTTP/HTTPS URL."); - TSK_OBJECT_SAFE_FREE(url); - } - else if(!have_port){ - if(url->type == thttp_url_https){ - url->port = 443; - } - else{ - url->port = 80; - } - } - - return url; -} + ){ + TSK_DEBUG_ERROR("Failed to parse HTTP/HTTPS URL."); + TSK_OBJECT_SAFE_FREE(url); + } + else if(!have_port){ + if(url->type == thttp_url_https){ + url->port = 443; + } + else{ + url->port = 80; + } + } + + return url; +} diff --git a/branches/2.0/doubango/tinyHTTP/src/thttp.c b/branches/2.0/doubango/tinyHTTP/src/thttp.c index e5c687c9..be193b5e 100644 --- a/branches/2.0/doubango/tinyHTTP/src/thttp.c +++ b/branches/2.0/doubango/tinyHTTP/src/thttp.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file thttp.c * @brief HTTP (RFC 2616) and HTTP basic/digest authetication (RFC 2617) implementations. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/src/thttp_action.c b/branches/2.0/doubango/tinyHTTP/src/thttp_action.c index c11652a3..014a6b9c 100644 --- a/branches/2.0/doubango/tinyHTTP/src/thttp_action.c +++ b/branches/2.0/doubango/tinyHTTP/src/thttp_action.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_action.h * @brief HTTP action. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/src/thttp_dialog.c b/branches/2.0/doubango/tinyHTTP/src/thttp_dialog.c index e569565e..8fa75191 100644 --- a/branches/2.0/doubango/tinyHTTP/src/thttp_dialog.c +++ b/branches/2.0/doubango/tinyHTTP/src/thttp_dialog.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_dialog.c * @brief HTTP Dialog. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/src/thttp_event.c b/branches/2.0/doubango/tinyHTTP/src/thttp_event.c index 15525538..dadc9f07 100644 --- a/branches/2.0/doubango/tinyHTTP/src/thttp_event.c +++ b/branches/2.0/doubango/tinyHTTP/src/thttp_event.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_event.c * @brief HTTP/HTTPS event. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/src/thttp_message.c b/branches/2.0/doubango/tinyHTTP/src/thttp_message.c index 309bac88..79bcf99e 100644 --- a/branches/2.0/doubango/tinyHTTP/src/thttp_message.c +++ b/branches/2.0/doubango/tinyHTTP/src/thttp_message.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ * @brief Represents a HTTP message. A HTTP message is either a request from a client to a server, or a * response from a server to a client. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/src/thttp_session.c b/branches/2.0/doubango/tinyHTTP/src/thttp_session.c index 5733da1c..9b1539d8 100644 --- a/branches/2.0/doubango/tinyHTTP/src/thttp_session.c +++ b/branches/2.0/doubango/tinyHTTP/src/thttp_session.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_session.c * @brief HTTP/HTTPS session. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyHTTP/src/thttp_url.c b/branches/2.0/doubango/tinyHTTP/src/thttp_url.c index ee25e044..84647ffc 100644 --- a/branches/2.0/doubango/tinyHTTP/src/thttp_url.c +++ b/branches/2.0/doubango/tinyHTTP/src/thttp_url.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file thttp_url.c * @brief HTTP URL. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyIPSec/src/tinyipsec_config.h b/branches/2.0/doubango/tinyIPSec/src/tinyipsec_config.h index 77398c07..27fe30d6 100644 --- a/branches/2.0/doubango/tinyIPSec/src/tinyipsec_config.h +++ b/branches/2.0/doubango/tinyIPSec/src/tinyipsec_config.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinyIPSec/src/tipsec.c b/branches/2.0/doubango/tinyIPSec/src/tipsec.c index fe126c31..5853694f 100644 --- a/branches/2.0/doubango/tinyIPSec/src/tipsec.c +++ b/branches/2.0/doubango/tinyIPSec/src/tipsec.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tipsec.c * @brief IPSec manager. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyIPSec/src/tipsec.h b/branches/2.0/doubango/tinyIPSec/src/tipsec.h index dec35a18..db567862 100644 --- a/branches/2.0/doubango/tinyIPSec/src/tipsec.h +++ b/branches/2.0/doubango/tinyIPSec/src/tipsec.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tipsec.h * @brief IPSec manager. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyIPSec/src/tipsec_common.c b/branches/2.0/doubango/tinyIPSec/src/tipsec_common.c index 02bbe69a..844c41c1 100644 --- a/branches/2.0/doubango/tinyIPSec/src/tipsec_common.c +++ b/branches/2.0/doubango/tinyIPSec/src/tipsec_common.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tipsec_common.c * @brief IPSec common functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyIPSec/src/tipsec_common.h b/branches/2.0/doubango/tinyIPSec/src/tipsec_common.h index 8fc25b88..5745e5e2 100644 --- a/branches/2.0/doubango/tinyIPSec/src/tipsec_common.h +++ b/branches/2.0/doubango/tinyIPSec/src/tipsec_common.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tipsec_common.h * @brief IPSec common functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyIPSec/src/tipsec_racoon.c b/branches/2.0/doubango/tinyIPSec/src/tipsec_racoon.c index 416a6aaf..30e79acb 100644 --- a/branches/2.0/doubango/tinyIPSec/src/tipsec_racoon.c +++ b/branches/2.0/doubango/tinyIPSec/src/tipsec_racoon.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tipsec_racoon.c * @brief IPSec racoon functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyIPSec/src/tipsec_racoon.h b/branches/2.0/doubango/tinyIPSec/src/tipsec_racoon.h index 3a3e4527..f0be510a 100644 --- a/branches/2.0/doubango/tinyIPSec/src/tipsec_racoon.h +++ b/branches/2.0/doubango/tinyIPSec/src/tipsec_racoon.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tipsec_racoon.h * @brief IPSec racoon functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyIPSec/src/tipsec_vista.c b/branches/2.0/doubango/tinyIPSec/src/tipsec_vista.c index c83ba05d..6eccc693 100644 --- a/branches/2.0/doubango/tinyIPSec/src/tipsec_vista.c +++ b/branches/2.0/doubango/tinyIPSec/src/tipsec_vista.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tipsec_vista.c * @brief Windows Vista/7 IPsec implementation using WFP. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyIPSec/src/tipsec_vista.h b/branches/2.0/doubango/tinyIPSec/src/tipsec_vista.h index 382385ec..a2e923ed 100644 --- a/branches/2.0/doubango/tinyIPSec/src/tipsec_vista.h +++ b/branches/2.0/doubango/tinyIPSec/src/tipsec_vista.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tipsec_vista.h * @brief Windows Vista/7 IPsec implementation using WFP. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyIPSec/src/tipsec_xp.c b/branches/2.0/doubango/tinyIPSec/src/tipsec_xp.c index 3150c06c..d2609d08 100644 --- a/branches/2.0/doubango/tinyIPSec/src/tipsec_xp.c +++ b/branches/2.0/doubango/tinyIPSec/src/tipsec_xp.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ * @brief Windows XP/2003 IPsec implementation using ipsec6 tool. * @sa http://technet.microsoft.com/en-us/library/cc787900.aspx * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyIPSec/src/tipsec_xp.h b/branches/2.0/doubango/tinyIPSec/src/tipsec_xp.h index eae70724..f655b819 100644 --- a/branches/2.0/doubango/tinyIPSec/src/tipsec_xp.h +++ b/branches/2.0/doubango/tinyIPSec/src/tipsec_xp.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ * @brief Windows XP/2003 IPsec implementation using ipsec6 tool. * @sa http://technet.microsoft.com/en-us/library/cc787900.aspx * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyMEDIA/droid-makefile b/branches/2.0/doubango/tinyMEDIA/droid-makefile index 1dab9c08..f6682b9f 100644 --- a/branches/2.0/doubango/tinyMEDIA/droid-makefile +++ b/branches/2.0/doubango/tinyMEDIA/droid-makefile @@ -13,6 +13,7 @@ OBJS = \ src/tmedia_consumer.o \ src/tmedia_defaults.o \ src/tmedia_denoise.o \ + src/tmedia_imageattr.o \ src/tmedia_jitterbuffer.o \ src/tmedia_params.o \ src/tmedia_producer.o \ diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia.h index 3941dd0f..d8178411 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tinymedia.h * @brief tinyMEDIA API. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -37,6 +37,7 @@ #include "tinymedia/tmedia_jitterbuffer.h" #include "tinymedia/tmedia_resampler.h" #include "tinymedia/tmedia_denoise.h" +#include "tinymedia/tmedia_imageattr.h" #include "tinymedia/tmedia_common.h" #include "tinymedia/tmedia_qos.h" diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/content/tmedia_content.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/content/tmedia_content.h index 41c51694..a3178c6f 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/content/tmedia_content.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/content/tmedia_content.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_content.h * @brief Base content object. * - * @author Mamadou Diop + * @author Mamadou Diop * */ #ifndef TINYMEDIA_CONTENT_H diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/content/tmedia_content_cpim.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/content/tmedia_content_cpim.h index 2e2dcfc8..2acd3a87 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/content/tmedia_content_cpim.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/content/tmedia_content_cpim.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_content_cpim.h * @brief Common Presence and Instant Messaging (CPIM): Message Format (RFC 3862) * - * @author Mamadou Diop + * @author Mamadou Diop * */ #ifndef TINYMEDIA_CONTENT_CPIM_H diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia.h index 2fcded07..64a85ba9 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia.h * @brief Base media object. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_codec.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_codec.h index c012c7d0..db83f311 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_codec.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_codec.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,9 +23,8 @@ /**@file tmedia_codec.h * @brief Base codec object. * - * @author Mamadou Diop + * @author Mamadou Diop * - */ #ifndef TINYMEDIA_CODEC_H #define TINYMEDIA_CODEC_H @@ -72,7 +71,9 @@ TMEDIA_BEGIN_DECLS #define TMEDIA_CODEC_FORMAT_MP2T "33" #define TMEDIA_CODEC_FORMAT_H263 "34" -/******* Dynamic Payload Type **********/ +/******* Dynamic Payload Type +Must starts at 96 to be conform to RFC 5761 (rtcp-mux) +**********/ #define TMEDIA_CODEC_FORMAT_ILBC "96" @@ -83,10 +84,10 @@ TMEDIA_BEGIN_DECLS #define TMEDIA_CODEC_FORMAT_DTMF "101" #define TMEDIA_CODEC_FORMAT_H263_2000 "102" -#define TMEDIA_CODEC_FORMAT_H263_1998 "103" // for stupid clients, should be equal to "103" -#define TMEDIA_CODEC_FORMAT_H264_BP10 "104" -#define TMEDIA_CODEC_FORMAT_H264_BP20 "105" -#define TMEDIA_CODEC_FORMAT_H264_BP30 "106" +#define TMEDIA_CODEC_FORMAT_H263_1998 "103" +#define TMEDIA_CODEC_FORMAT_H264_BP "104" +#define TMEDIA_CODEC_FORMAT_H264_MP "105" +#define TMEDIA_CODEC_FORMAT_H264_HP "106" #define TMEDIA_CODEC_FORMAT_AMR_WBP_BE "107" @@ -102,9 +103,10 @@ TMEDIA_BEGIN_DECLS #define TMEDIA_CODEC_FORMAT_BV16 "115" #define TMEDIA_CODEC_FORMAT_MP4V_ES "121" -#define TMEDIA_CODEC_FORMAT_FFV1 "122" -#define TMEDIA_CODEC_FORMAT_FFVHUFF "123" -#define TMEDIA_CODEC_FORMAT_HUFFYUV "124" + +#define TMEDIA_CODEC_FORMAT_ULPFEC "122" +#define TMEDIA_CODEC_FORMAT_RED "123" +// #define TMEDIA_CODEC_FORMAT_HUFFYUV "124" #define TMEDIA_CODEC_FORMAT_VP8 "125" #define TMEDIA_CODEC_FORMAT_THEORA "126" @@ -122,8 +124,20 @@ TMEDIA_BEGIN_DECLS #define TMEDIA_CODEC_RATE(self) (TMEDIA_CODEC((self))->plugin->rate) //#define TMEDIA_CODEC_FRAMES_COUNT(buff_size) (((buff_size))/TMEDIA_CODEC_FRAME_SIZE(self)) -/** callback for video codecs */ -typedef int (*tmedia_codec_video_rtpcb_f)(const void* callback_data, const void* buffer, tsk_size_t size, uint32_t duration, tsk_bool_t marker); +/** callbacks for video codecs */ +typedef int (*tmedia_codec_video_enc_cb_f)(const tmedia_video_encode_result_xt* result); +typedef int (*tmedia_codec_video_dec_cb_f)(const tmedia_video_decode_result_xt* result); + + +struct tmedia_param_s; + +typedef enum tmedia_codec_action_e +{ + tmedia_codec_action_encode_idr, + tmedia_codec_action_bw_down, + tmedia_codec_action_bw_up +} +tmedia_codec_action_t; /** Base object for all Codecs */ typedef struct tmedia_codec_s @@ -143,7 +157,7 @@ typedef struct tmedia_codec_s //! the format. e.g. "0" for PCMU or "8" for PCMA or "*" for MSRP. char* format; //! bandwidth level - tmedia_bandwidth_level_t bl; + tmedia_bandwidth_level_t bl; // @deprecated //! the negociated format (only useful for codecs with dyn. payload type) char* neg_format; @@ -185,6 +199,8 @@ typedef struct tmedia_codec_plugin_def_s /* ...to be continued */ } video; + //! set parameters + int (*set) (tmedia_codec_t* , const struct tmedia_param_s*); //! open the codec int (*open) (tmedia_codec_t*); //! close the codec @@ -193,12 +209,10 @@ typedef struct tmedia_codec_plugin_def_s tsk_size_t (*encode) (tmedia_codec_t*, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size); //! decode data tsk_size_t (*decode) (tmedia_codec_t*, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size, const tsk_object_t* proto_hdr); - //! whether the codec can handle the fmtp - tsk_bool_t (* fmtp_match) (const tmedia_codec_t*, const char* ); - //! gets fmtp value. e.g. "mode-set=0,2,5,7; mode-change-period=2; mode-change-neighbor=1" - char* (* fmtp_get) (const tmedia_codec_t* ); - //! sets fmtp received from the remote party - int (* fmtp_set) (tmedia_codec_t*, const char* ); + //! whether the codec can handle this sdp attribute + tsk_bool_t (* sdp_att_match) (const tmedia_codec_t*, const char* att_name, const char* att_value); + //! gets sdp attribute value. e.g. "mode-set=0,2,5,7; mode-change-period=2; mode-change-neighbor=1" + char* (* sdp_att_get) (const tmedia_codec_t*, const char* att_name); } tmedia_codec_plugin_def_t; @@ -209,6 +223,7 @@ typedef tsk_list_t tmedia_codecs_L_t; #define TMEDIA_DECLARE_CODEC tmedia_codec_t __codec__ TINYMEDIA_API int tmedia_codec_init(tmedia_codec_t* self, tmedia_type_t type, const char* name, const char* desc, const char* format); +TINYMEDIA_API int tmedia_codec_set(tmedia_codec_t* self, const struct tmedia_param_s* param); TINYMEDIA_API int tmedia_codec_open(tmedia_codec_t* self); TINYMEDIA_API int tmedia_codec_close(tmedia_codec_t* self); TINYMEDIA_API int tmedia_codec_cmp(const tsk_object_t* codec1, const tsk_object_t* codec2); @@ -218,9 +233,8 @@ TINYMEDIA_API tsk_bool_t tmedia_codec_plugin_is_registered(const tmedia_codec_pl TINYMEDIA_API int tmedia_codec_plugin_unregister(const tmedia_codec_plugin_def_t* plugin); TINYMEDIA_API tmedia_codec_t* tmedia_codec_create(const char* format); TINYMEDIA_API char* tmedia_codec_get_rtpmap(const tmedia_codec_t* self); -TINYMEDIA_API char* tmedia_codec_get_fmtp(const tmedia_codec_t* self); -TINYMEDIA_API tsk_bool_t tmedia_codec_match_fmtp(const tmedia_codec_t* self, const char* fmtp); -TINYMEDIA_API int tmedia_codec_set_remote_fmtp(tmedia_codec_t* self, const char* fmtp); +TINYMEDIA_API tsk_bool_t tmedia_codec_sdp_att_match(const tmedia_codec_t* self, const char* att_name, const char* att_value); +TINYMEDIA_API char* tmedia_codec_sdp_att_get(const tmedia_codec_t* self, const char* att_name); TINYMEDIA_API int tmedia_codec_removeAll_exceptThese(tmedia_codecs_L_t* codecs, const tmedia_codecs_L_t * codecs2keep); TINYMEDIA_API int tmedia_codec_to_sdp(const tmedia_codecs_L_t* codecs, tsdp_header_M_t* m); TINYMEDIA_API tmedia_codec_t* tmedia_codec_find_by_format(tmedia_codecs_L_t* codecs, const char* format); @@ -264,6 +278,9 @@ typedef struct tmedia_codec_video_s unsigned max_mbps; tmedia_chroma_t chroma; tsk_bool_t flip; + + tmedia_codec_video_dec_cb_f callback; + tmedia_video_decode_result_xt result; }in;// decoded struct{ unsigned width; @@ -273,11 +290,13 @@ typedef struct tmedia_codec_video_s unsigned max_mbps; tmedia_chroma_t chroma; tsk_bool_t flip; + + tmedia_codec_video_enc_cb_f callback; + tmedia_video_encode_result_xt result; }out;// encoded - - tmedia_codec_video_rtpcb_f callback; - const void* callback_data; + //! preferred video size + tmedia_pref_video_size_t pref_size; } tmedia_codec_video_t; @@ -296,9 +315,11 @@ tmedia_codec_video_t; #define TMEDIA_DECLARE_CODEC_VIDEO tmedia_codec_video_t __video__ #define TMEDIA_CODEC_VIDEO(self) ((tmedia_codec_video_t*)(self)) #define tmedia_codec_video_init(self, name, desc, format) tmedia_codec_init(TMEDIA_CODEC(self), tmedia_video, name, desc, format) -TINYMEDIA_API int tmedia_codec_video_set_callback(tmedia_codec_video_t *self, tmedia_codec_video_rtpcb_f callback, const void* callback_data); +TINYMEDIA_API int tmedia_codec_video_set_enc_callback(tmedia_codec_video_t *self, tmedia_codec_video_enc_cb_f callback, const void* callback_data); +TINYMEDIA_API int tmedia_codec_video_set_dec_callback(tmedia_codec_video_t *self, tmedia_codec_video_dec_cb_f callback, const void* callback_data); #define tmedia_codec_video_deinit(self) tmedia_codec_deinit(TMEDIA_CODEC(self)) + /** MSRP codec */ typedef struct tmedia_codec_msrp_s { diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_codec_dummy.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_codec_dummy.h index 05ec3148..afc4e4f8 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_codec_dummy.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_codec_dummy.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_codec_dummy.h * @brief Dummy codecs used for test only. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_common.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_common.h index 295e53fe..e951a3d5 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_common.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_common.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_common.h * @brief Common functions and definitions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -37,6 +37,7 @@ TMEDIA_BEGIN_DECLS /** List of all supported media types */ +// @tinyWRAP typedef enum tmedia_type_e { tmedia_none = 0x00, @@ -55,29 +56,7 @@ typedef enum tmedia_type_e } tmedia_type_t; -typedef enum tmedia_video_size_type_e -{ - tmedia_vst_none, - tmedia_vst_sqcif, - tmedia_vst_qcif, - tmedia_vst_qvga, - tmedia_vst_cif, - tmedia_vst_vga, - tmedia_vst_4cif, - tmedia_vst_svga, - tmedia_vst_xga, - tmedia_vst_sxga, - tmedia_vst_16cif, - tmedia_vst_hd720p, - tmedia_vst_hd1080p, - - tmedia_vst_ios_low, - tmedia_vst_ios_medium, - tmedia_vst_ios_high -} -tmedia_video_size_type_t; - -// used by tinyWRAP +// @tinyWRAP typedef enum tmedia_srtp_mode_e { tmedia_srtp_mode_none, @@ -86,16 +65,76 @@ typedef enum tmedia_srtp_mode_e } tmedia_srtp_mode_t; -typedef struct tmedia_video_size_s +// @tinyWRAP +typedef enum tmedia_profile_e { - tmedia_video_size_type_t type; - tsk_size_t width; - tsk_size_t height; + tmedia_profile_default, + // Enable all RTCWeb specifications: + // ICE, DTLS-SRTP, RTP/AVPF, FEC, RED, SDPCapNeg, RTCP-MUX, imageattr... + tmedia_profile_rtcweb } -tmedia_video_size_t; +tmedia_profile_t; + +// @tinyWRAP +typedef enum tmedia_pref_video_size_s +{ /* must be sorted like this */ + tmedia_pref_video_size_sqcif, // 128 x 98 + tmedia_pref_video_size_qcif, // 176 x 144 + tmedia_pref_video_size_qvga, // 320 x 240 + tmedia_pref_video_size_cif, // 352 x 288 + tmedia_pref_video_size_hvga, // 480 x 320 + tmedia_pref_video_size_vga, // 640 x 480 + tmedia_pref_video_size_4cif, // 704 x 576 + tmedia_pref_video_size_svga, // 800 x 600 + tmedia_pref_video_size_480p, // 852 x 480 + tmedia_pref_video_size_720p, // 1280 x 720 + tmedia_pref_video_size_16cif, // 1408 x 1152 + tmedia_pref_video_size_1080p, // 1920 x 1080 +} +tmedia_pref_video_size_t; + +typedef enum tmedia_video_encode_result_type_e +{ + tmedia_video_encode_result_type_none = 0x00, + tmedia_video_encode_result_type_parms = (0x01 << 0), // e.g. SPS or PPS, DCT coeff., Quant params.... + tmedia_video_encode_result_type_intra = (0x01 << 1), + tmedia_video_encode_result_type_key = tmedia_video_encode_result_type_intra, + tmedia_video_encode_result_type_gold = tmedia_video_encode_result_type_intra, + tmedia_video_encode_result_type_predicted = (0x01 << 2), + tmedia_video_encode_result_type_bipredicted = (0x01 << 3) +} +tmedia_video_encode_result_type_t; + +typedef struct tmedia_video_encode_result_xs +{ + tmedia_video_encode_result_type_t type; + const void* usr_data; + struct{ + const void* ptr; + tsk_size_t size; + } buffer; + uint32_t duration; + tsk_bool_t last_chunck; +} +tmedia_video_encode_result_xt; + +typedef enum tmedia_video_decode_result_type_e +{ + tmedia_video_decode_result_type_error, + tmedia_video_decode_result_type_success, +} +tmedia_video_decode_result_type_t; + +typedef struct tmedia_video_decode_result_xs +{ + tmedia_video_decode_result_type_t type; + const void* usr_data; + const tsk_object_t* proto_hdr; // RTP, RTSP.... +} +tmedia_video_decode_result_xt; -// used by tinyWRAP +// @tinyWRAP typedef enum tmedia_chroma_e { tmedia_chroma_none=0, @@ -112,7 +151,8 @@ typedef enum tmedia_chroma_e } tmedia_chroma_t; -// used by tinyWRAP +// @tinyWRAP +// @deprecated // keep order (low->unrestricted) typedef enum tmedia_bandwidth_level_e { @@ -125,8 +165,12 @@ tmedia_bandwidth_level_t; TINYMEDIA_API tmedia_type_t tmedia_type_from_sdp(const tsdp_message_t* sdp); TINYMEDIA_API int tmedia_parse_rtpmap(const char* rtpmap, char** name, int32_t* rate, int32_t* channels); -TINYMEDIA_API int tmedia_parse_video_fmtp(const char* fmtp, tmedia_bandwidth_level_t bl, unsigned* width, unsigned* height, unsigned* fps); -TINYMEDIA_API const tmedia_video_size_t* tmedia_get_video_size(tmedia_chroma_t chroma, tsk_size_t size); +TINYMEDIA_API int tmedia_video_get_size(tmedia_pref_video_size_t pref_vs, unsigned *width, unsigned *height); +TINYMEDIA_API int tmedia_video_get_closest_cif_size(tmedia_pref_video_size_t pref_vs, tmedia_pref_video_size_t *cif_vs); +TINYMEDIA_API int tmedia_parse_video_fmtp(const char* fmtp, tmedia_pref_video_size_t pref_vs, unsigned* width, unsigned* height, unsigned* fps); +TINYMEDIA_API int tmedia_parse_video_imageattr(const char* imageattr, tmedia_pref_video_size_t pref_vs, unsigned* in_width, unsigned* in_height, unsigned* out_width, unsigned* out_height); +TINYMEDIA_API char* tmedia_get_video_fmtp(tmedia_pref_video_size_t pref_vs); +TINYMEDIA_API char* tmedia_get_video_imageattr(tmedia_pref_video_size_t pref_vs, unsigned in_width, unsigned in_height, unsigned out_width, unsigned out_height); TINYMEDIA_API int tmedia_get_video_quality(tmedia_bandwidth_level_t bl); #define tmedia_get_video_qscale tmedia_get_video_quality diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_consumer.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_consumer.h index 65ab482f..50e9b929 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_consumer.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_consumer.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_consumer.h * @brief Base consumer object. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_defaults.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_defaults.h index 483643ff..d0f4f008 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_defaults.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_defaults.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * - * Contact: Mamadou Diop + * Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -28,15 +28,13 @@ TMEDIA_BEGIN_DECLS -// -// Codecs: Bandwidth -// + +TINYMEDIA_API int tmedia_defaults_set_profile(tmedia_profile_t profile); +TINYMEDIA_API tmedia_profile_t tmedia_defaults_get_profile(); TINYMEDIA_API int tmedia_defaults_set_bl(tmedia_bandwidth_level_t bl); TINYMEDIA_API tmedia_bandwidth_level_t tmedia_defaults_get_bl(); - -// -// Denoiser: Echo suppression, AEC, Noise redution, AGC, ... -// +TINYMEDIA_API int tmedia_defaults_set_pref_video_size(tmedia_pref_video_size_t pref_video_size); +TINYMEDIA_API tmedia_pref_video_size_t tmedia_defaults_get_pref_video_size(); TINYMEDIA_API int tmedia_defaults_set_jb_margin(int32_t jb_margin_ms); TINYMEDIA_API int32_t tmedia_defaults_get_jb_margin(); TINYMEDIA_API int tmedia_defaults_set_jb_max_late_rate(int32_t jb_max_late_rate_percent); @@ -65,8 +63,8 @@ TINYMEDIA_API int32_t tmedia_defaults_get_screen_y(); TINYMEDIA_API int tmedia_defaults_set_audio_gain(int32_t audio_producer_gain, int32_t audio_consumer_gain); TINYMEDIA_API int32_t tmedia_defaults_get_audio_producer_gain(); TINYMEDIA_API int32_t tmedia_defaults_get_audio_consumer_gain(); -TINYMEDIA_API uint16_t tmedia_defaults_get_rtp_port_range_start(); -TINYMEDIA_API uint16_t tmedia_defaults_get_rtp_port_range_stop(); +TINYMEDIA_API uint16_t tmedia_defaults_get_rtp_port_range_start(); +TINYMEDIA_API uint16_t tmedia_defaults_get_rtp_port_range_stop(); TINYMEDIA_API int tmedia_defaults_set_rtp_port_range(uint16_t start, uint16_t stop); TINYMEDIA_API tmedia_type_t tmedia_defaults_get_media_type(); TINYMEDIA_API int tmedia_defaults_set_media_type(tmedia_type_t media_type); @@ -78,6 +76,8 @@ TINYMEDIA_API const char* tmedia_defaults_get_inv_session_refresher(); TINYMEDIA_API int tmedia_defaults_set_inv_session_refresher(const char* refresher); TINYMEDIA_API tmedia_srtp_mode_t tmedia_defaults_get_srtp_mode(); TINYMEDIA_API int tmedia_defaults_set_srtp_mode(tmedia_srtp_mode_t mode); +TINYMEDIA_API int tmedia_defaults_set_ice_enabled(tsk_bool_t ice_enabled); +TINYMEDIA_API tsk_bool_t tmedia_defaults_get_ice_enabled(); TMEDIA_END_DECLS diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_denoise.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_denoise.h index c8598d1f..89310bd2 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_denoise.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_denoise.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_denoise.h * @brief Denoiser (Noise suppression, AGC, AEC, VAD) Plugin * - * @author Mamadou Diop + * @author Mamadou Diop */ #ifndef TINYMEDIA_DENOISE_H #define TINYMEDIA_DENOISE_H diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_imageattr.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_imageattr.h new file mode 100644 index 00000000..5f163985 --- /dev/null +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_imageattr.h @@ -0,0 +1,108 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tmedia_imageattr.h + * @brief 'image-attr' parser as per RFC 6236 + * + * @author Mamadou Diop + * + */ +#ifndef TINYMEDIA_imageattr_H +#define TINYMEDIA_imageattr_H + +#include "tinymedia_config.h" + +#include "tmedia_common.h" + +TMEDIA_BEGIN_DECLS + +#define TMEDIA_imageattr_ARRAY_MAX_SIZE 16 + +typedef int32_t xyvalue_t; +typedef double qvalue_t; +typedef double spvalue_t; + +typedef struct tmedia_imageattr_srange_xs +{ + unsigned is_range:1; + union{ + struct{ + spvalue_t start; + spvalue_t end; + }range; + struct{ + spvalue_t values[TMEDIA_imageattr_ARRAY_MAX_SIZE + 1]; + tsk_size_t count; + }array; + }; +} +tmedia_imageattr_srange_xt; + +typedef struct tmedia_imageattr_xyrange_xs +{ + unsigned is_range:1; + union{ + struct{ + xyvalue_t start; + xyvalue_t step; + xyvalue_t end; + }range; + struct{ + xyvalue_t values[TMEDIA_imageattr_ARRAY_MAX_SIZE + 1]; + tsk_size_t count; + }array; + }; +} +tmedia_imageattr_xyrange_xt; + +typedef struct tmedia_imageattr_set_xs +{ + tmedia_imageattr_xyrange_xt xrange; + tmedia_imageattr_xyrange_xt yrange; + tmedia_imageattr_srange_xt srange; + struct{ + unsigned is_present:1; + spvalue_t start; + spvalue_t end; + }prange; + qvalue_t qvalue; +} +tmedia_imageattr_set_xt; + +typedef struct tmedia_imageattr_xs +{ + struct{ + tmedia_imageattr_set_xt sets[TMEDIA_imageattr_ARRAY_MAX_SIZE + 1]; + tsk_size_t count; + }send; + struct{ + tmedia_imageattr_set_xt sets[TMEDIA_imageattr_ARRAY_MAX_SIZE + 1]; + tsk_size_t count; + }recv; +} +tmedia_imageattr_xt; + +TINYMEDIA_API int tmedia_imageattr_parse(tmedia_imageattr_xt* self, const void* in_data, tsk_size_t in_size); + +TMEDIA_END_DECLS + +#endif /* TINYMEDIA_imageattr_H */ diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_jitterbuffer.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_jitterbuffer.h index f954f8a2..1bc733cf 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_jitterbuffer.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_jitterbuffer.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_jitterbuffer.h * @brief Audio/Video JitterBuffer Plugin * - * @author Mamadou Diop + * @author Mamadou Diop */ #ifndef TINYMEDIA_JITTER_BUFFER_H #define TINYMEDIA_JITTER_BUFFER_H diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_params.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_params.h index 2da457dd..a0881eb1 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_params.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_params.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_params.h * @brief Media parameters used to configure any session or plugin. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_producer.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_producer.h index 23b27fd1..00f8cd64 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_producer.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_producer.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_producer.h * @brief Base producer object. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -49,7 +49,7 @@ TMEDIA_BEGIN_DECLS #define TMEDIA_PRODUCER(self) ((tmedia_producer_t*)(self)) typedef int (*tmedia_producer_enc_cb_f)(const void* callback_data, const void* buffer, tsk_size_t size); -typedef int (*tmedia_producer_raw_cb_f)(const void* callback_data, const void* buffer, tsk_size_t size, uint32_t duration, tsk_bool_t marker); +typedef int (*tmedia_producer_raw_cb_f)(const tmedia_video_encode_result_xt* chunck); /** Default Video chroma */ #define TMEDIA_PRODUCER_CHROMA_DEFAULT tmedia_chroma_yuv420p @@ -90,7 +90,7 @@ typedef struct tmedia_producer_s struct{ tmedia_producer_raw_cb_f callback; - const void* callback_data; + tmedia_video_encode_result_xt chunck_curr; } raw_cb; } tmedia_producer_t; diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_qos.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_qos.h index 35421496..64d44232 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_qos.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_qos.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_qos.h * @brief RFC 3312 (Preconditions) implementation. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_resampler.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_resampler.h index 073a3954..5b1ee87a 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_resampler.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_resampler.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_resampler.h * @brief Audio Resampler Plugin * - * @author Mamadou Diop + * @author Mamadou Diop */ #ifndef TINYMEDIA_RESAMPLER_H #define TINYMEDIA_RESAMPLER_H diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_session.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_session.h index 44e21ac4..7b40bc0b 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_session.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_session.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_session.h * @brief Base session object. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -120,6 +120,7 @@ tmedia_session_plugin_def_t; TINYMEDIA_API uint64_t tmedia_session_get_unique_id(); TINYMEDIA_API int tmedia_session_init(tmedia_session_t* self, tmedia_type_t type); +TINYMEDIA_API int tmedia_session_set(tmedia_session_t* self, ...); TINYMEDIA_API int tmedia_session_cmp(const tsk_object_t* sess1, const tsk_object_t* sess2); TINYMEDIA_API int tmedia_session_plugin_register(const tmedia_session_plugin_def_t* plugin); TINYMEDIA_API const tmedia_session_plugin_def_t* tmedia_session_plugin_find_by_media(const char* media); @@ -216,12 +217,18 @@ typedef struct tmedia_session_mgr_s /* NAT Traversal context */ tnet_nat_context_handle_t* natt_ctx; + struct { + struct tnet_ice_ctx_s *ctx_audio; + struct tnet_ice_ctx_s *ctx_video; + } ice; //! List of all sessions tmedia_sessions_L_t* sessions; //! User's parameters used to confugure plugins tmedia_params_L_t* params; + + TSK_DECLARE_SAFEOBJ; } tmedia_session_mgr_t; @@ -372,6 +379,7 @@ TINYMEDIA_API tmedia_session_mgr_t* tmedia_session_mgr_create(tmedia_type_t type TINYMEDIA_API int tmedia_session_mgr_set_media_type(tmedia_session_mgr_t* self, tmedia_type_t type); TINYMEDIA_API tmedia_session_t* tmedia_session_mgr_find(tmedia_session_mgr_t* self, tmedia_type_t type); TINYMEDIA_API int tmedia_session_mgr_set_natt_ctx(tmedia_session_mgr_t* self, tnet_nat_context_handle_t* natt_ctx, const char* public_addr); +TINYMEDIA_API int tmedia_session_mgr_set_ice_ctx(tmedia_session_mgr_t* self, struct tnet_ice_ctx_s* ctx_audio, struct tnet_ice_ctx_s* ctx_video); TINYMEDIA_API int tmedia_session_mgr_start(tmedia_session_mgr_t* self); TINYMEDIA_API int tmedia_session_mgr_set(tmedia_session_mgr_t* self, ...); TINYMEDIA_API int tmedia_session_mgr_set_2(tmedia_session_mgr_t* self, va_list *app); diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_session_dummy.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_session_dummy.h index a9f15fb0..35fa75a1 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_session_dummy.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_session_dummy.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_session_dummy.h * @brief Dummy sessions used for test only. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_session_ghost.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_session_ghost.h index 469066fa..3faad80d 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_session_ghost.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_session_ghost.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_session_ghost.h * @brief Ghost session. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia_config.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia_config.h index 993606c7..da5c1913 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia_config.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia_config.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinyMEDIA/ragel.sh b/branches/2.0/doubango/tinyMEDIA/ragel.sh index f8339f53..f3761465 100644 --- a/branches/2.0/doubango/tinyMEDIA/ragel.sh +++ b/branches/2.0/doubango/tinyMEDIA/ragel.sh @@ -1,8 +1,11 @@ -# Ragel generator -# For more information about Ragel: http://www.complang.org/ragel/ - -export OPTIONS="-C -L -T0" -#export OPTIONS="-C -L -G2" - -# SDP Message parser -ragel.exe $OPTIONS -o ./src/content/tmedia_content_cpim.c ./ragel/tmedia_content_cpim.rl \ No newline at end of file +# Ragel generator +# For more information about Ragel: http://www.complang.org/ragel/ + +export OPTIONS="-C -L -T0" +#export OPTIONS="-C -L -G2" + +# SDP Message parser +ragel.exe $OPTIONS -o ./src/content/tmedia_content_cpim.c ./ragel/tmedia_content_cpim.rl + +# 'image-attr' (RFC 6236) +ragel.exe $OPTIONS -o ./src/tmedia_imageattr.c ./ragel/tmedia_imageattr.rl \ No newline at end of file diff --git a/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_content_cpim.rl b/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_content_cpim.rl index e8938210..a9a35080 100644 --- a/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_content_cpim.rl +++ b/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_content_cpim.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_content_cpim.c * @brief Common Presence and Instant Messaging (CPIM): Message Format (RFC 3862) * - * @author Mamadou Diop + * @author Mamadou Diop * */ #include "tinymedia/content/tmedia_content_cpim.h" @@ -67,7 +67,7 @@ A complete message looks something like this: machine tmedia_machine_content_cpim; # Includes - include tmedia_machine_utils "./ragel/tmedia_machine_utils.rl"; + include tmedia_machine_utils "./tmedia_machine_utils.rl"; action tag{ tag_start = p; diff --git a/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_imageattr.rl b/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_imageattr.rl new file mode 100644 index 00000000..090546cd --- /dev/null +++ b/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_imageattr.rl @@ -0,0 +1,181 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tmedia_imageattr.c + * @brief 'image-attr' parser as per RFC 6236 + * + * @author Mamadou Diop + * + */ +#include "tinymedia/tmedia_imageattr.h" + +#include "tsk_debug.h" + +#include + +/*********************************** +* Ragel state machine. +*/ +%%{ + machine tmedia_machine_imageattr; + + # Includes + include tmedia_machine_utils "./tmedia_machine_utils.rl"; + + action tag{ + tag_start = p; + } + + action is_send{ + sets = &self->send.sets[0]; + sets_count = &self->send.count; + *sets_count = 0; + } + + action is_recv{ + sets = &self->recv.sets[0]; + sets_count = &self->recv.count; + *sets_count = 0; + } + + action is_xrange{ + xyrange = (*sets_count < TMEDIA_imageattr_ARRAY_MAX_SIZE) ? &sets[*sets_count].xrange : tsk_null; + } + action is_yrange{ + xyrange = (*sets_count < TMEDIA_imageattr_ARRAY_MAX_SIZE) ? &sets[*sets_count].yrange : tsk_null; + } + action set_parsed{ + if(*sets_count < TMEDIA_imageattr_ARRAY_MAX_SIZE) (*sets_count)++; + } + action set_is_not_range{ + if(xyrange) xyrange->is_range = 0; + } + action set_is_range{ + if(xyrange) xyrange->is_range = 1; + } + action parse_xyvalue_range_start{ + if(xyrange)xyrange->range.start = atoi(tag_start); + } + action parse_xyvalue_range_step{ + if(xyrange)xyrange->range.step = atoi(tag_start); + } + action parse_xyvalue_range_end{ + if(xyrange)xyrange->range.end = atoi(tag_start); + } + action parse_xyvalue_array_value{ + if(xyrange && xyrange->array.count < TMEDIA_imageattr_ARRAY_MAX_SIZE){ + xyrange->array.values[xyrange->array.count++] = atoi(tag_start); + } + } + action set_parse_qvalue{ + if(*sets_count < TMEDIA_imageattr_ARRAY_MAX_SIZE){ + sets[*sets_count].qvalue = atof(tag_start); + } + } + + action srange_is_array{ + if(srange) srange->is_range = 0; + } + action srange_is_not_array{ + if(srange) srange->is_range = 1; + } + action start_srange{ + srange = (*sets_count < TMEDIA_imageattr_ARRAY_MAX_SIZE) ? &sets[*sets_count].srange : tsk_null; + } + action parse_srange_array_value{ + if(srange && srange->array.count < TMEDIA_imageattr_ARRAY_MAX_SIZE){ + srange->array.values[srange->array.count++] = atof(tag_start); + } + } + action parse_srange_range_start{ + if(srange) srange->range.start = atof(tag_start); + } + action parse_srange_range_end{ + if(srange) srange->range.end = atof(tag_start); + } + + action parse_prange_start{ + if(*sets_count < TMEDIA_imageattr_ARRAY_MAX_SIZE) sets[*sets_count].prange.start = atof(tag_start); + } + action parse_prange_end{ + if(*sets_count < TMEDIA_imageattr_ARRAY_MAX_SIZE) sets[*sets_count].prange.end = atof(tag_start), sets[*sets_count].prange.is_present = 1; + } + + PT = DIGIT+ | "*"; + onetonine = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"; + xyvalue = (onetonine DIGIT{,5}); + step = xyvalue; + xyrange = ( "[" xyvalue>tag %parse_xyvalue_range_start ":" ( step>tag %parse_xyvalue_range_step ":" )? xyvalue>tag %parse_xyvalue_range_end "]" )%set_is_range | ( "[" xyvalue>tag %parse_xyvalue_array_value ( "," xyvalue>tag %parse_xyvalue_array_value )+ "]" )%set_is_not_range | xyvalue%set_is_not_range>tag %parse_xyvalue_array_value; + spvalue = ( "0" "." onetonine DIGIT{,3} ) | ( onetonine "." DIGIT{1,4} ); + srange = (( "[" spvalue>tag %parse_srange_array_value ( "," spvalue>tag %parse_srange_array_value )+ "]" )%srange_is_array | ( "[" spvalue>tag %parse_srange_range_start "-" spvalue>tag %parse_srange_range_end "]" )%srange_is_not_array | spvalue>tag %parse_srange_array_value %srange_is_array)>start_srange; + prange = ( "[" spvalue>tag %parse_prange_start "-" spvalue>tag %parse_prange_end "]" ); + _qvalue = (( "0" "." DIGIT{1,2} ) | ( "1" "." "0"{1,2} ))>tag %set_parse_qvalue; #qvalue collision + key_value = ( "sar="i srange ) | ( "par="i prange ) | ( "q="i _qvalue ); + set = ("[" "x="i xyrange>is_xrange "," "y="i xyrange>is_yrange ( "," key_value )* "]")%set_parsed; + attr_list = ( set ( WSP+ set )* ) | "*"; + imageattr = ( WSP* ( "send"i%is_send | "recv"i%is_recv ) WSP+ attr_list ){1,2}; + + # Entry point + main:= imageattr; +}%% + +static int tmedia_imageattr_reset(tmedia_imageattr_xt* self) +{ + if(self){ + tsk_size_t i; + memset(self, 0, sizeof(*self)); + for(i = 0; i < TMEDIA_imageattr_ARRAY_MAX_SIZE; ++i){ + self->send.sets[i].qvalue = 0.5; + self->recv.sets[i].qvalue = 0.5; + } + return 0; + } + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; +} + +int tmedia_imageattr_parse(tmedia_imageattr_xt* self, const void* in_data, tsk_size_t in_size) +{ + int cs = 0; + const char *p = in_data; + const char *pe = p + in_size; + const char *eof = pe; + + const char *tag_start; + + tmedia_imageattr_set_xt* sets; + tsk_size_t* sets_count; + tmedia_imageattr_xyrange_xt* xyrange; + tmedia_imageattr_srange_xt* srange; + + %%write data; + %%write init; + tmedia_imageattr_reset(self); + %%write exec; + + if( cs < %%{ write first_final; }%% ){ + TSK_DEBUG_ERROR("Parsing failed to parse image-attr=%s", in_data); + return -1; + } + + return 0; +} \ No newline at end of file diff --git a/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_machine_utils.rl b/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_machine_utils.rl index 780ceb98..1b35fe6f 100644 --- a/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_machine_utils.rl +++ b/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_machine_utils.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tmedia_machine_utils.rl * @brief Ragel file. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyMEDIA/src/content/tmedia_content.c b/branches/2.0/doubango/tinyMEDIA/src/content/tmedia_content.c index 69c2cf92..97eb1109 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/content/tmedia_content.c +++ b/branches/2.0/doubango/tinyMEDIA/src/content/tmedia_content.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_content.c * @brief Base content object. * - * @author Mamadou Diop + * @author Mamadou Diop * */ #include "tinymedia/content/tmedia_content.h" diff --git a/branches/2.0/doubango/tinyMEDIA/src/content/tmedia_content_cpim.c b/branches/2.0/doubango/tinyMEDIA/src/content/tmedia_content_cpim.c index 34fd43e1..cf2149e6 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/content/tmedia_content_cpim.c +++ b/branches/2.0/doubango/tinyMEDIA/src/content/tmedia_content_cpim.c @@ -1,9 +1,9 @@ - -/* #line 1 "./ragel/tmedia_content_cpim.rl" */ + +/* #line 1 "./ragel/tmedia_content_cpim.rl" */ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tmedia_content_cpim.c * @brief Common Presence and Instant Messaging (CPIM): Message Format (RFC 3862) * - * @author Mamadou Diop + * @author Mamadou Diop * */ #include "tinymedia/content/tmedia_content_cpim.h" @@ -65,8 +65,8 @@ A complete message looks something like this: /*********************************** * Ragel state machine. */ - -/* #line 129 "./ragel/tmedia_content_cpim.rl" */ + +/* #line 129 "./ragel/tmedia_content_cpim.rl" */ @@ -83,206 +83,206 @@ static int tmedia_content_cpim_parse(tmedia_content_t* self, const void* in_data char* hvalue = tsk_null; tsk_bool_t parsing_mime_headers = tsk_true; - -/* #line 88 "./src/content/tmedia_content_cpim.c" */ -static const char _tmedia_machine_content_cpim_actions[] = { - 0, 1, 0, 1, 3, 1, 4, 1, - 5, 2, 0, 4, 2, 0, 5, 2, - 1, 0, 2, 2, 0 -}; - -static const char _tmedia_machine_content_cpim_key_offsets[] = { - 0, 0, 14, 30, 32, 34, 35, 36, - 51, 52, 66, 82, 84, 86, 87, 88, - 103, 104, 104 -}; - -static const char _tmedia_machine_content_cpim_trans_keys[] = { - 33, 37, 39, 126, 42, 43, 45, 46, - 48, 57, 65, 90, 95, 122, 32, 33, - 37, 39, 58, 126, 42, 43, 45, 46, - 48, 57, 65, 90, 95, 122, 32, 58, - 13, 32, 13, 10, 13, 33, 37, 39, - 126, 42, 43, 45, 46, 48, 57, 65, - 90, 95, 122, 10, 33, 37, 39, 126, - 42, 43, 45, 46, 48, 57, 65, 90, - 95, 122, 32, 33, 37, 39, 58, 126, - 42, 43, 45, 46, 48, 57, 65, 90, - 95, 122, 32, 58, 13, 32, 13, 10, - 13, 33, 37, 39, 126, 42, 43, 45, - 46, 48, 57, 65, 90, 95, 122, 10, - 0 -}; - -static const char _tmedia_machine_content_cpim_single_lengths[] = { - 0, 4, 6, 2, 2, 1, 1, 5, - 1, 4, 6, 2, 2, 1, 1, 5, - 1, 0, 0 -}; - -static const char _tmedia_machine_content_cpim_range_lengths[] = { - 0, 5, 5, 0, 0, 0, 0, 5, - 0, 5, 5, 0, 0, 0, 0, 5, - 0, 0, 0 -}; - -static const char _tmedia_machine_content_cpim_index_offsets[] = { - 0, 0, 10, 22, 25, 28, 30, 32, - 43, 45, 55, 67, 70, 73, 75, 77, - 88, 90, 91 -}; - -static const char _tmedia_machine_content_cpim_indicies[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 3, 3, 3, 4, 3, - 3, 3, 3, 3, 3, 1, 5, 6, - 1, 8, 6, 7, 10, 9, 11, 1, - 12, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 1, 14, 1, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 1, 16, - 17, 17, 17, 18, 17, 17, 17, 17, - 17, 17, 1, 19, 20, 1, 22, 20, - 21, 24, 23, 25, 1, 26, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 1, - 28, 1, 29, 30, 0 -}; - -static const char _tmedia_machine_content_cpim_trans_targs[] = { - 2, 0, 3, 2, 4, 3, 4, 5, - 6, 5, 6, 7, 8, 2, 9, 10, - 11, 10, 12, 11, 12, 13, 14, 13, - 14, 15, 16, 10, 17, 18, 18 -}; - -static const char _tmedia_machine_content_cpim_trans_actions[] = { - 15, 0, 3, 0, 3, 0, 0, 1, - 9, 0, 5, 0, 0, 1, 0, 18, - 3, 0, 3, 0, 0, 1, 9, 0, - 5, 0, 0, 1, 0, 1, 0 -}; - -static const char _tmedia_machine_content_cpim_eof_actions[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 12, 7 -}; - -static const int tmedia_machine_content_cpim_start = 1; -static const int tmedia_machine_content_cpim_first_final = 17; -static const int tmedia_machine_content_cpim_error = 0; - -static const int tmedia_machine_content_cpim_en_main = 1; - - -/* #line 146 "./ragel/tmedia_content_cpim.rl" */ - -/* #line 180 "./src/content/tmedia_content_cpim.c" */ - { - cs = tmedia_machine_content_cpim_start; - } - -/* #line 147 "./ragel/tmedia_content_cpim.rl" */ - -/* #line 187 "./src/content/tmedia_content_cpim.c" */ - { - int _klen; - unsigned int _trans; - const char *_acts; - unsigned int _nacts; - const char *_keys; - - if ( p == pe ) - goto _test_eof; - if ( cs == 0 ) - goto _out; -_resume: - _keys = _tmedia_machine_content_cpim_trans_keys + _tmedia_machine_content_cpim_key_offsets[cs]; - _trans = _tmedia_machine_content_cpim_index_offsets[cs]; - - _klen = _tmedia_machine_content_cpim_single_lengths[cs]; - if ( _klen > 0 ) { - const char *_lower = _keys; - const char *_mid; - const char *_upper = _keys + _klen - 1; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( (*p) < *_mid ) - _upper = _mid - 1; - else if ( (*p) > *_mid ) - _lower = _mid + 1; - else { - _trans += (_mid - _keys); - goto _match; - } - } - _keys += _klen; - _trans += _klen; - } - - _klen = _tmedia_machine_content_cpim_range_lengths[cs]; - if ( _klen > 0 ) { - const char *_lower = _keys; - const char *_mid; - const char *_upper = _keys + (_klen<<1) - 2; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( (*p) < _mid[0] ) - _upper = _mid - 2; - else if ( (*p) > _mid[1] ) - _lower = _mid + 2; - else { - _trans += ((_mid - _keys)>>1); - goto _match; - } - } - _trans += _klen; - } - -_match: - _trans = _tmedia_machine_content_cpim_indicies[_trans]; - cs = _tmedia_machine_content_cpim_trans_targs[_trans]; - - if ( _tmedia_machine_content_cpim_trans_actions[_trans] == 0 ) - goto _again; - - _acts = _tmedia_machine_content_cpim_actions + _tmedia_machine_content_cpim_trans_actions[_trans]; - _nacts = (unsigned int) *_acts++; - while ( _nacts-- > 0 ) - { - switch ( *_acts++ ) - { - case 0: -/* #line 72 "./ragel/tmedia_content_cpim.rl" */ + +/* #line 88 "./src/content/tmedia_content_cpim.c" */ +static const char _tmedia_machine_content_cpim_actions[] = { + 0, 1, 0, 1, 3, 1, 4, 1, + 5, 2, 0, 4, 2, 0, 5, 2, + 1, 0, 2, 2, 0 +}; + +static const char _tmedia_machine_content_cpim_key_offsets[] = { + 0, 0, 14, 30, 32, 34, 35, 36, + 51, 52, 66, 82, 84, 86, 87, 88, + 103, 104, 104 +}; + +static const char _tmedia_machine_content_cpim_trans_keys[] = { + 33, 37, 39, 126, 42, 43, 45, 46, + 48, 57, 65, 90, 95, 122, 32, 33, + 37, 39, 58, 126, 42, 43, 45, 46, + 48, 57, 65, 90, 95, 122, 32, 58, + 13, 32, 13, 10, 13, 33, 37, 39, + 126, 42, 43, 45, 46, 48, 57, 65, + 90, 95, 122, 10, 33, 37, 39, 126, + 42, 43, 45, 46, 48, 57, 65, 90, + 95, 122, 32, 33, 37, 39, 58, 126, + 42, 43, 45, 46, 48, 57, 65, 90, + 95, 122, 32, 58, 13, 32, 13, 10, + 13, 33, 37, 39, 126, 42, 43, 45, + 46, 48, 57, 65, 90, 95, 122, 10, + 0 +}; + +static const char _tmedia_machine_content_cpim_single_lengths[] = { + 0, 4, 6, 2, 2, 1, 1, 5, + 1, 4, 6, 2, 2, 1, 1, 5, + 1, 0, 0 +}; + +static const char _tmedia_machine_content_cpim_range_lengths[] = { + 0, 5, 5, 0, 0, 0, 0, 5, + 0, 5, 5, 0, 0, 0, 0, 5, + 0, 0, 0 +}; + +static const char _tmedia_machine_content_cpim_index_offsets[] = { + 0, 0, 10, 22, 25, 28, 30, 32, + 43, 45, 55, 67, 70, 73, 75, 77, + 88, 90, 91 +}; + +static const char _tmedia_machine_content_cpim_indicies[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 2, 3, 3, 3, 4, 3, + 3, 3, 3, 3, 3, 1, 5, 6, + 1, 8, 6, 7, 10, 9, 11, 1, + 12, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 1, 14, 1, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 1, 16, + 17, 17, 17, 18, 17, 17, 17, 17, + 17, 17, 1, 19, 20, 1, 22, 20, + 21, 24, 23, 25, 1, 26, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 1, + 28, 1, 29, 30, 0 +}; + +static const char _tmedia_machine_content_cpim_trans_targs[] = { + 2, 0, 3, 2, 4, 3, 4, 5, + 6, 5, 6, 7, 8, 2, 9, 10, + 11, 10, 12, 11, 12, 13, 14, 13, + 14, 15, 16, 10, 17, 18, 18 +}; + +static const char _tmedia_machine_content_cpim_trans_actions[] = { + 15, 0, 3, 0, 3, 0, 0, 1, + 9, 0, 5, 0, 0, 1, 0, 18, + 3, 0, 3, 0, 0, 1, 9, 0, + 5, 0, 0, 1, 0, 1, 0 +}; + +static const char _tmedia_machine_content_cpim_eof_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 7 +}; + +static const int tmedia_machine_content_cpim_start = 1; +static const int tmedia_machine_content_cpim_first_final = 17; +static const int tmedia_machine_content_cpim_error = 0; + +static const int tmedia_machine_content_cpim_en_main = 1; + + +/* #line 146 "./ragel/tmedia_content_cpim.rl" */ + +/* #line 180 "./src/content/tmedia_content_cpim.c" */ + { + cs = tmedia_machine_content_cpim_start; + } + +/* #line 147 "./ragel/tmedia_content_cpim.rl" */ + +/* #line 187 "./src/content/tmedia_content_cpim.c" */ + { + int _klen; + unsigned int _trans; + const char *_acts; + unsigned int _nacts; + const char *_keys; + + if ( p == pe ) + goto _test_eof; + if ( cs == 0 ) + goto _out; +_resume: + _keys = _tmedia_machine_content_cpim_trans_keys + _tmedia_machine_content_cpim_key_offsets[cs]; + _trans = _tmedia_machine_content_cpim_index_offsets[cs]; + + _klen = _tmedia_machine_content_cpim_single_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_mid; + const char *_upper = _keys + _klen - 1; + while (1) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( (*p) < *_mid ) + _upper = _mid - 1; + else if ( (*p) > *_mid ) + _lower = _mid + 1; + else { + _trans += (_mid - _keys); + goto _match; + } + } + _keys += _klen; + _trans += _klen; + } + + _klen = _tmedia_machine_content_cpim_range_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_mid; + const char *_upper = _keys + (_klen<<1) - 2; + while (1) { + if ( _upper < _lower ) + break; + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( (*p) < _mid[0] ) + _upper = _mid - 2; + else if ( (*p) > _mid[1] ) + _lower = _mid + 2; + else { + _trans += ((_mid - _keys)>>1); + goto _match; + } + } + _trans += _klen; + } + +_match: + _trans = _tmedia_machine_content_cpim_indicies[_trans]; + cs = _tmedia_machine_content_cpim_trans_targs[_trans]; + + if ( _tmedia_machine_content_cpim_trans_actions[_trans] == 0 ) + goto _again; + + _acts = _tmedia_machine_content_cpim_actions + _tmedia_machine_content_cpim_trans_actions[_trans]; + _nacts = (unsigned int) *_acts++; + while ( _nacts-- > 0 ) + { + switch ( *_acts++ ) + { + case 0: +/* #line 72 "./ragel/tmedia_content_cpim.rl" */ { tag_start = p; - } - break; - case 1: -/* #line 76 "./ragel/tmedia_content_cpim.rl" */ + } + break; + case 1: +/* #line 76 "./ragel/tmedia_content_cpim.rl" */ { parsing_mime_headers = tsk_true; - } - break; - case 2: -/* #line 80 "./ragel/tmedia_content_cpim.rl" */ + } + break; + case 2: +/* #line 80 "./ragel/tmedia_content_cpim.rl" */ { parsing_mime_headers = tsk_false; - } - break; - case 3: -/* #line 84 "./ragel/tmedia_content_cpim.rl" */ + } + break; + case 3: +/* #line 84 "./ragel/tmedia_content_cpim.rl" */ { TSK_PARSER_SET_STRING(hname); - } - break; - case 4: -/* #line 88 "./ragel/tmedia_content_cpim.rl" */ + } + break; + case 4: +/* #line 88 "./ragel/tmedia_content_cpim.rl" */ { tmedia_content_header_t* header; TSK_PARSER_SET_STRING(hvalue); @@ -301,32 +301,32 @@ _match: } tsk_list_push_back_data(TMEDIA_CONTENT_CPIM(self)->h_headers, (void**)&header); } - } - break; -/* #line 307 "./src/content/tmedia_content_cpim.c" */ - } - } - -_again: - if ( cs == 0 ) - goto _out; - if ( ++p != pe ) - goto _resume; - _test_eof: {} - if ( p == eof ) - { - const char *__acts = _tmedia_machine_content_cpim_actions + _tmedia_machine_content_cpim_eof_actions[cs]; - unsigned int __nacts = (unsigned int) *__acts++; - while ( __nacts-- > 0 ) { - switch ( *__acts++ ) { - case 0: -/* #line 72 "./ragel/tmedia_content_cpim.rl" */ + } + break; +/* #line 307 "./src/content/tmedia_content_cpim.c" */ + } + } + +_again: + if ( cs == 0 ) + goto _out; + if ( ++p != pe ) + goto _resume; + _test_eof: {} + if ( p == eof ) + { + const char *__acts = _tmedia_machine_content_cpim_actions + _tmedia_machine_content_cpim_eof_actions[cs]; + unsigned int __nacts = (unsigned int) *__acts++; + while ( __nacts-- > 0 ) { + switch ( *__acts++ ) { + case 0: +/* #line 72 "./ragel/tmedia_content_cpim.rl" */ { tag_start = p; - } - break; - case 5: -/* #line 108 "./ragel/tmedia_content_cpim.rl" */ + } + break; + case 5: +/* #line 108 "./ragel/tmedia_content_cpim.rl" */ { int len = (int)(p - tag_start); if(len && tag_start){ @@ -335,25 +335,25 @@ _again: } TMEDIA_CONTENT_CPIM(self)->e = tsk_buffer_create(tag_start, len); } - } - break; -/* #line 341 "./src/content/tmedia_content_cpim.c" */ - } - } - } - - _out: {} - } - -/* #line 148 "./ragel/tmedia_content_cpim.rl" */ + } + break; +/* #line 341 "./src/content/tmedia_content_cpim.c" */ + } + } + } + + _out: {} + } + +/* #line 148 "./ragel/tmedia_content_cpim.rl" */ TSK_FREE(hname); TSK_FREE(hvalue); - if( cs < -/* #line 355 "./src/content/tmedia_content_cpim.c" */ -17 -/* #line 152 "./ragel/tmedia_content_cpim.rl" */ + if( cs < +/* #line 355 "./src/content/tmedia_content_cpim.c" */ +17 +/* #line 152 "./ragel/tmedia_content_cpim.rl" */ ){ TSK_DEBUG_ERROR("Failed to parse CPIM content"); return -1; diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia.c index c594e123..baf1c030 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia.c * @brief Media. * - * @author Mamadou Diop + * @author Mamadou Diop * */ #include "tinymedia/tmedia.h" diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_codec.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_codec.c index 5f81264f..9c58996c 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia_codec.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_codec.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_codec.c * @brief Base codec object. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -83,17 +83,46 @@ int tmedia_codec_init(tmedia_codec_t* self, tmedia_type_t type, const char* name // according to the CFLAGS: 'FLIP_ENCODED_PICT' and 'FLIP_DECODED_PICT'. At any time you // can update thse values (e.g. when the device switch from landscape to portrait) using video_session->set(); if(type & tmedia_video){ + tmedia_codec_video_t* video = TMEDIA_CODEC_VIDEO(self); #if FLIP_ENCODED_PICT - TMEDIA_CODEC_VIDEO(self)->out.flip = tsk_true; + video->out.flip = tsk_true; #endif #if FLIP_DECODED_PICT - TMEDIA_CODEC_VIDEO(self)->in.flip = tsk_true; + video->in.flip = tsk_true; #endif + if(!video->in.fps) video->in.fps = video->out.fps = self->plugin->video.fps; + if(video->in.chroma == tmedia_chroma_none) video->in.chroma = tmedia_chroma_yuv420p; + if(video->out.chroma == tmedia_chroma_none) video->out.chroma = tmedia_chroma_yuv420p; + + if(0){ // @deprecated + if(!video->in.width) video->in.width = video->out.width = self->plugin->video.width; + if(!video->in.height) video->in.height = video->out.height = self->plugin->video.height; + } + else{ + int ret; + unsigned width, height; + video->pref_size = tmedia_defaults_get_pref_video_size(); + if((ret = tmedia_video_get_size(video->pref_size, &width, &height)) != 0){ + width = self->plugin->video.width; + height = self->plugin->video.height; + } + if(!video->in.width) video->in.width = video->out.width = width; + if(!video->in.height) video->in.height = video->out.height = height; + } + } return 0; } +int tmedia_codec_set(tmedia_codec_t* self, const struct tmedia_param_s* param) +{ + if(self && self->plugin && self->plugin->set && param){ + return self->plugin->set(self, param); + } + return 0; +} + /**@ingroup tmedia_codec_group * Prepares a codec by opening it. * @param self The codec to open. @@ -141,7 +170,6 @@ int tmedia_codec_close(tmedia_codec_t* self) return -1; } if(!self->opened){ - TSK_DEBUG_WARN("Codec not opened"); return 0; } @@ -335,11 +363,6 @@ tmedia_codec_t* tmedia_codec_create(const char* format) { /* Video codec */ tmedia_codec_video_t* video = TMEDIA_CODEC_VIDEO(codec); tmedia_codec_video_init(TMEDIA_CODEC(video), plugin->name, plugin->desc, plugin->format); - if(!video->in.width)video->in.width = video->out.width = plugin->video.width; - if(!video->in.height)video->in.height = video->out.height = plugin->video.height; - if(!video->in.fps)video->in.fps = video->out.fps = plugin->video.fps; - if(video->in.chroma==tmedia_chroma_none)video->in.chroma = tmedia_chroma_yuv420p; - if(video->out.chroma==tmedia_chroma_none)video->out.chroma = tmedia_chroma_yuv420p; break; } case tmedia_msrp: @@ -409,71 +432,48 @@ char* tmedia_codec_get_rtpmap(const tmedia_codec_t* self) } /**@ingroup tmedia_codec_group -* Gets the codec's fmtp attribute value. -* @param self the codec for which to get the fmtp attribute. Should be created using @ref tmedia_codec_create(). -* @retval fmtp attribute string (e.g. "mode-set=0,2,5,7; mode-change-period=2; mode-change-neighbor=1"). It's up to the caller to free the -* returned string. -*/ -char* tmedia_codec_get_fmtp(const tmedia_codec_t* self) -{ - char* fmtp = tsk_null; - - if(!self || !self->plugin){ - TSK_DEBUG_ERROR("invalid parameter"); - return tsk_null; - } - - if(self->plugin->fmtp_get){ /* some codecs, like G711, won't produce fmtp */ - fmtp = self->plugin->fmtp_get(self); - } - - return fmtp; -} - -/**@ingroup tmedia_codec_group -* Indicates whether the codec can handle this fmtp. +* Indicates whether the codec can handle this sdp attribute. * @param self the codec to match aginst to. -* @param fmtp the fmtp to match +* @param att_name the name of the sdp attribute to match e.g. 'fmtp' or 'imageattr' * @retval @a tsk_true if the codec can handle this fmtp and @a tsk_false otherwise */ -tsk_bool_t tmedia_codec_match_fmtp(const tmedia_codec_t* self, const char* fmtp) +tsk_bool_t tmedia_codec_sdp_att_match(const tmedia_codec_t* self, const char* att_name, const char* att_value) { /* checks */ - if(!self || !self->plugin || !self->plugin->fmtp_match){ + if(!self || !self->plugin || !self->plugin->sdp_att_match || !att_name){ TSK_DEBUG_ERROR("invalid parameter"); return tsk_false; } - /* if fmtp is null or empty -> always match */ - if(tsk_strnullORempty(fmtp)){ + /* if attribute value is null or empty -> always match */ + if(tsk_strnullORempty(att_value)){ return tsk_true; } else{ - return self->plugin->fmtp_match(self, fmtp); + return self->plugin->sdp_att_match(self, att_name, att_value); } } /**@ingroup tmedia_codec_group -* Sets remote fmtp. -* @param self codec for which to set the remote fmtp. -* @param fmtp fmtp received from remote party (e.g. "mode-set=0,2,5,7; mode-change-period=2; mode-change-neighbor=1"). -* @retval Zero if succeed and non-zero error code otherwise. +* Gets the codec's sdp attribute value +* @att_name the name of the attribute to get e.g. 'fmtp' or 'imageattr' +* @param self the codec for which to get the fmtp attribute. Should be created using @ref tmedia_codec_create(). +* @retval sdp attribute attribute string (e.g. "mode-set=0,2,5,7; mode-change-period=2; mode-change-neighbor=1"). It's up to the caller to free the +* returned string. */ -int tmedia_codec_set_remote_fmtp(tmedia_codec_t* self, const char* fmtp) +char* tmedia_codec_sdp_att_get(const tmedia_codec_t* self, const char* att_name) { - if(!self || !self->plugin){ + if(!self || !self->plugin || !att_name){ TSK_DEBUG_ERROR("invalid parameter"); - return -1; + return tsk_null; } - - if(self->plugin->fmtp_set){ - return self->plugin->fmtp_set(self, fmtp); - } - else{ /* some codecs, like G711, could ignore remote fmtp attribute */ - return 0; + if(self->plugin->sdp_att_get){ /* some codecs, like G711, won't produce fmtp */ + return self->plugin->sdp_att_get(self, att_name); } + return tsk_null; } + /**@ingroup tmedia_codec_group * Remove all codecs except the specified ones. * @param codecs the list of codecs from which to remove codecs. @@ -508,7 +508,7 @@ int tmedia_codec_to_sdp(const tmedia_codecs_L_t* codecs, tsdp_header_M_t* m) { const tsk_list_item_t* item; const tmedia_codec_t* codec; - char *fmtp, *rtpmap; + char *fmtp, *rtpmap, *imageattr; int ret; if(!m){ @@ -537,8 +537,17 @@ int tmedia_codec_to_sdp(const tmedia_codecs_L_t* codecs, tsdp_header_M_t* m) tsk_null); TSK_FREE(rtpmap); } + /* add 'imageattr' attributes */ + if((imageattr = tmedia_codec_sdp_att_get(codec, "imageattr"))){ + tsk_sprintf(&temp, "%s %s", neg_format, imageattr); + tsdp_header_M_add_headers(m, + TSDP_HEADER_A_VA_ARGS("imageattr", temp), + tsk_null); + TSK_FREE(temp); + TSK_FREE(imageattr); + } /* add fmtp attributes */ - if((fmtp = tmedia_codec_get_fmtp(codec))){ + if((fmtp = tmedia_codec_sdp_att_get(codec, "fmtp"))){ if(is_video && tmedia_defaults_get_screen_x() > 0 && tmedia_defaults_get_screen_y() > 0){ tsk_sprintf(&temp, "%s %s;sx=%d;sy=%d", neg_format, fmtp, tmedia_defaults_get_screen_x(), tmedia_defaults_get_screen_y());//doubango clients } @@ -672,15 +681,24 @@ int tmedia_codec_deinit(tmedia_codec_t* self) return 0; } -int tmedia_codec_video_set_callback(tmedia_codec_video_t *self, tmedia_codec_video_rtpcb_f callback, const void* callback_data) +int tmedia_codec_video_set_enc_callback(tmedia_codec_video_t *self, tmedia_codec_video_enc_cb_f callback, const void* callback_data) { if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } + self->out.callback = callback; + self->out.result.usr_data = callback_data; + return 0; +} - self->callback = callback; - self->callback_data = callback_data; - +int tmedia_codec_video_set_dec_callback(tmedia_codec_video_t *self, tmedia_codec_video_dec_cb_f callback, const void* callback_data) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + self->in.callback = callback; + self->in.result.usr_data = callback_data; return 0; } \ No newline at end of file diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_codec_dummy.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_codec_dummy.c index 5de353a1..a6813f45 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia_codec_dummy.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_codec_dummy.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_codec_dummy.c * @brief Dummy codecs used for test only. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -35,12 +35,11 @@ // Dummy G.711u object definition // -#define tmedia_codec_dpcmu_fmtp_get tsk_null -#define tmedia_codec_dpcmu_fmtp_set tsk_null +#define tmedia_codec_dpcmu_sdp_att_get tsk_null #define tmedia_codec_dpcmu_fmtp_encode tsk_null #define tmedia_codec_dpcmu_fmtp_decode tsk_null -tsk_bool_t tmedia_codec_dpcmu_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +tsk_bool_t tmedia_codec_dpcmu_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { /* always match */ return tsk_true; } @@ -95,13 +94,13 @@ static const tmedia_codec_plugin_def_t tmedia_codec_dpcmu_plugin_def_s = /* video */ {0}, + tsk_null, // set() tsk_null, // open tsk_null, // close tmedia_codec_dpcmu_fmtp_encode, tmedia_codec_dpcmu_fmtp_decode, - tmedia_codec_dpcmu_fmtp_match, - tmedia_codec_dpcmu_fmtp_get, - tmedia_codec_dpcmu_fmtp_set + tmedia_codec_dpcmu_sdp_att_match, + tmedia_codec_dpcmu_sdp_att_get, }; const tmedia_codec_plugin_def_t *tmedia_codec_dpcmu_plugin_def_t = &tmedia_codec_dpcmu_plugin_def_s; @@ -109,12 +108,12 @@ const tmedia_codec_plugin_def_t *tmedia_codec_dpcmu_plugin_def_t = &tmedia_codec // Dummy G.711a object definition // -#define tmedia_codec_dpcma_fmtp_get tsk_null +#define tmedia_codec_dpcma_sdp_att_get tsk_null #define tmedia_codec_dpcma_fmtp_set tsk_null #define tmedia_codec_dpcma_fmtp_encode tsk_null #define tmedia_codec_dpcma_fmtp_decode tsk_null -tsk_bool_t tmedia_codec_dpcma_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +tsk_bool_t tmedia_codec_dpcma_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { /* always match */ return tsk_true; } @@ -169,13 +168,13 @@ static const tmedia_codec_plugin_def_t tmedia_codec_dpcma_plugin_def_s = /* video */ {0}, + tsk_null, // set() tsk_null, // open tsk_null, // close tmedia_codec_dpcma_fmtp_encode, tmedia_codec_dpcma_fmtp_decode, - tmedia_codec_dpcma_fmtp_match, - tmedia_codec_dpcma_fmtp_get, - tmedia_codec_dpcma_fmtp_set + tmedia_codec_dpcma_sdp_att_match, + tmedia_codec_dpcma_sdp_att_get }; const tmedia_codec_plugin_def_t *tmedia_codec_dpcma_plugin_def_t = &tmedia_codec_dpcma_plugin_def_s; @@ -195,14 +194,14 @@ tsk_size_t tmedia_codec_dh263_fmtp_decode(tmedia_codec_t* self, const void* in_d return 0; } -tsk_bool_t tmedia_codec_dh263_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +tsk_bool_t tmedia_codec_dh263_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { /* check whether we can match this fmtp with our local * check size, maxbr, fps ...*/ return tsk_true; } -char* tmedia_codec_dh263_fmtp_get(const tmedia_codec_t* self) +char* tmedia_codec_dh263_sdp_att_get(const tmedia_codec_t* codec, const char* att_name) { return tsk_strdup("CIF=2/MaxBR=3840;QCIF=2/MaxBR=1920"); } @@ -261,13 +260,13 @@ static const tmedia_codec_plugin_def_t tmedia_codec_dh263_plugin_def_s = /* video */ {176, 144}, + tsk_null, // set() tsk_null, // open tsk_null, // close tmedia_codec_dh263_fmtp_encode, tmedia_codec_dh263_fmtp_decode, - tmedia_codec_dh263_fmtp_match, - tmedia_codec_dh263_fmtp_get, - tmedia_codec_dh263_fmtp_set + tmedia_codec_dh263_sdp_att_match, + tmedia_codec_dh263_sdp_att_get }; const tmedia_codec_plugin_def_t *tmedia_codec_dh263_plugin_def_t = &tmedia_codec_dh263_plugin_def_s; @@ -288,14 +287,14 @@ tsk_size_t tmedia_codec_dh264_fmtp_decode(tmedia_codec_t* self, const void* in_d return 0; } -tsk_bool_t tmedia_codec_dh264_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +tsk_bool_t tmedia_codec_dh264_sdp_att_match(const tmedia_codec_t* codec, const char* att_name, const char* att_value) { /* check whether we can match this fmtp with our local * check size, maxbr, fps, profile-level-id, packetization-mode ...*/ return tsk_true; } -char* tmedia_codec_dh264_fmtp_get(const tmedia_codec_t* self) +char* tmedia_codec_dh264_sdp_att_get(const tmedia_codec_t* codec, const char* att_name) { return tsk_strdup("profile-level-id=42A01E;sprop-parameter-sets=Z0IACpZTBYmI,aMljiA=="); } @@ -344,7 +343,7 @@ static const tmedia_codec_plugin_def_t tmedia_codec_dh264_plugin_def_s = tmedia_video, "H264", "Dummy H.264 (base profile 10) codec", - TMEDIA_CODEC_FORMAT_H264_BP10, + TMEDIA_CODEC_FORMAT_H264_BP, tsk_true, 90000, // rate @@ -354,12 +353,12 @@ static const tmedia_codec_plugin_def_t tmedia_codec_dh264_plugin_def_s = /* video */ {176, 144}, + tsk_null, // set() tsk_null, // open tsk_null, // close tmedia_codec_dh264_fmtp_encode, tmedia_codec_dh264_fmtp_decode, - tmedia_codec_dh264_fmtp_match, - tmedia_codec_dh264_fmtp_get, - tmedia_codec_dh264_fmtp_set + tmedia_codec_dh264_sdp_att_match, + tmedia_codec_dh264_sdp_att_get }; const tmedia_codec_plugin_def_t *tmedia_codec_dh264_plugin_def_t = &tmedia_codec_dh264_plugin_def_s; diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_common.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_common.c index ccafc1c7..ca6c6d4b 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia_common.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_common.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,19 +23,44 @@ /**@file tmedia_common.c * @brief Common functions and definitions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ #include "tinymedia/tmedia_common.h" #include "tinymedia/tmedia_session.h" +#include "tinymedia/tmedia_imageattr.h" #include "tsk_params.h" #include "tsk_debug.h" #include /* atoi() */ +typedef struct fmtp_size_s{ + const char* name; + tmedia_pref_video_size_t pref_vs; + tsk_bool_t cif_family; + unsigned width; + unsigned height; +}fmtp_size_t; +static const fmtp_size_t fmtp_sizes[] = +{ + /* must be sorted like this */ + {"1080P", tmedia_pref_video_size_1080p, tsk_false, 1920, 1080}, + {"16CIF", tmedia_pref_video_size_16cif, tsk_true, 1408, 1152}, + {"720P", tmedia_pref_video_size_720p, tsk_false, 1280, 720}, + {"480P", tmedia_pref_video_size_480p, tsk_false, 852, 480}, + {"SVGA", tmedia_pref_video_size_svga, tsk_false, 800, 600}, + {"4CIF", tmedia_pref_video_size_4cif, tsk_true, 704, 576}, + {"VGA", tmedia_pref_video_size_vga, tsk_false, 640, 480}, + {"HVGA", tmedia_pref_video_size_hvga, tsk_false, 480, 320}, + {"CIF", tmedia_pref_video_size_cif, tsk_true, 352, 288}, + {"QVGA", tmedia_pref_video_size_qvga, tsk_false, 320, 240}, + {"QCIF", tmedia_pref_video_size_qcif, tsk_true, 176, 144}, + {"SQCIF", tmedia_pref_video_size_sqcif, tsk_true, 128, 96} +}; + tmedia_type_t tmedia_type_from_sdp(const tsdp_message_t* sdp) { tmedia_type_t type = tmedia_none; @@ -123,8 +148,36 @@ int tmedia_parse_rtpmap(const char* rtpmap, char** name, int32_t* rate, int32_t* //} } +int tmedia_video_get_size(tmedia_pref_video_size_t pref_vs, unsigned *width, unsigned *height) +{ + int i; + for(i=0; idata)) || !param->name || !param->value){ continue; } - for(i=0;i= (int)fmtp_sizes[i].min_bl && tsk_striequals(fmtp_sizes[i].name, param->name)){ + for(i=0; i= (int)fmtp_sizes[i].pref_vs && tsk_striequals(fmtp_sizes[i].name, param->name)){ *width= fmtp_sizes[i].width; *height = fmtp_sizes[i].height; *fps = atoi(param->value); @@ -194,68 +218,86 @@ done: return ret; } -static const tmedia_video_size_t tmedia_video_sizes[] = +static void _imageattr_get_best_size(const tmedia_imageattr_set_xt* set, xyvalue_t *width, xyvalue_t *height) { - {tmedia_vst_none , 176, 144}, - - {tmedia_vst_sqcif, 128, 96}, - {tmedia_vst_qcif, 176, 144}, - {tmedia_vst_qvga, 320, 240}, - {tmedia_vst_cif, 352, 288}, - {tmedia_vst_vga, 640, 480}, - {tmedia_vst_4cif, 704, 576}, - {tmedia_vst_svga, 800, 600}, - {tmedia_vst_xga, 1024, 768}, - {tmedia_vst_sxga, 1280, 1024}, - {tmedia_vst_16cif, 1408, 1152}, - {tmedia_vst_hd720p, 1280, 720}, - {tmedia_vst_hd1080p, 1920, 1080}, - - {tmedia_vst_ios_low, 200, 152}, - {tmedia_vst_ios_medium, 480, 360}, - {tmedia_vst_ios_high, 400, 304}, -}; - -const tmedia_video_size_t* tmedia_get_video_size(tmedia_chroma_t chroma, tsk_size_t size) -{ - float factor = 3.f; tsk_size_t i; - switch(chroma) - { - case tmedia_chroma_rgb24: - case tmedia_chroma_bgr24: - factor = 3.f; - break; - case tmedia_chroma_rgb565le: - case tmedia_chroma_rgb565be: - factor = 2.f; - break; - - case tmedia_chroma_rgb32: - factor = 4.f; - break; - - case tmedia_chroma_nv21: - case tmedia_chroma_nv12: - case tmedia_chroma_yuv420p: - factor = 1.5f; - break; - - case tmedia_chroma_yuv422p: - case tmedia_chroma_uyvy422: - factor = 2.f; - break; + if(set->xrange.is_range){ + *width = TSK_MIN(set->xrange.range.end, *width); } - - for(i = 1; i< sizeof(tmedia_video_sizes)/sizeof(tmedia_video_size_t); i++){ - if((((float)(tmedia_video_sizes[i].width * tmedia_video_sizes[i].height)) * factor) == size){ - return &tmedia_video_sizes[i]; + else{ + for(i = 0; i < set->xrange.array.count; ++i){ + *width = TSK_MIN(set->xrange.array.values[i], *width); + } + } + if(set->yrange.is_range){ + *height = TSK_MIN(set->yrange.range.end, *height); + } + else{ + for(i = 0; i < set->yrange.array.count; ++i){ + *height = TSK_MIN(set->yrange.array.values[i], *height); } } - - return &tmedia_video_sizes[0];; } +int tmedia_parse_video_imageattr(const char* imageattr, tmedia_pref_video_size_t pref_vs, unsigned* in_width, unsigned* in_height, unsigned* out_width, unsigned* out_height) +{ + tmedia_imageattr_xt attr; + int ret; + tsk_size_t i; + + if(!imageattr || !in_width || !in_height || !out_width || !out_height){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + // set default values + ret = tmedia_video_get_size(pref_vs, in_width, in_height); + if(ret != 0){ + TSK_DEBUG_ERROR("tmedia_video_get_size() failed with error code=%d", ret); + return ret; + } + *out_width = *in_width, *out_height = *in_height; + + if((ret = tmedia_imageattr_parse(&attr, imageattr, tsk_strlen(imageattr)))){ + TSK_DEBUG_ERROR("Failed to parse"); + return 0; // use default values + } + + + for(i = 0; i < attr.send.count; ++i) _imageattr_get_best_size(&attr.send.sets[i], out_width, out_height); + for(i = 0; i < attr.recv.count; ++i) _imageattr_get_best_size(&attr.recv.sets[i], in_width, in_height); + + return 0; +} + +char* tmedia_get_video_fmtp(tmedia_pref_video_size_t pref_vs) +{ + tsk_size_t i; + char* fmtp = tsk_null; + + + for(i = 0; i < sizeof(fmtp_sizes)/sizeof(fmtp_sizes[0]); ++i){ + if(fmtp_sizes[i].cif_family && fmtp_sizes[i].pref_vs <= pref_vs){ + if(!fmtp) tsk_strcat_2(&fmtp, "%s=2", fmtp_sizes[i].name); + else tsk_strcat_2(&fmtp, ";%s=2", fmtp_sizes[i].name); + } + } + return fmtp; +} + +char* tmedia_get_video_imageattr(tmedia_pref_video_size_t pref_vs, unsigned in_width, unsigned in_height, unsigned out_width, unsigned out_height) +{ + unsigned width, height; + const fmtp_size_t* size_min = &fmtp_sizes[(sizeof(fmtp_sizes) / sizeof(fmtp_sizes[0]))-1]; + char* ret = tsk_null; + if(tmedia_video_get_size(pref_vs, &width, &height) == 0){ + tsk_sprintf(&ret, "recv [x=[%u:16:%u],y=[%u:16:%u]] send [x=[%u:16:%u],y=[%u:16:%u]]", + size_min->width, in_width, size_min->height, in_height, + size_min->width, out_width, size_min->height, out_height); + } + return ret; +} + + // #retval: 1(best)-31(worst) */ int tmedia_get_video_quality(tmedia_bandwidth_level_t bl) { diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_consumer.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_consumer.c index 372070f3..1521858b 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia_consumer.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_consumer.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_consumer.c * @brief Base consumer object. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_defaults.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_defaults.c index 34a3ba3e..736307ef 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia_defaults.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_defaults.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * - * Contact: Mamadou Diop + * Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,28 +23,11 @@ #include "tsk_debug.h" -// -// Codecs: Bandwidth -// +// /!\ These are global values shared by all sessions and stacks. Could be set (update) per session using "session_set()" +static tmedia_profile_t __profile = tmedia_profile_rtcweb; static tmedia_bandwidth_level_t __bl = tmedia_bl_unrestricted; - -int tmedia_defaults_set_bl(tmedia_bandwidth_level_t bl) -{ - __bl = bl; - return 0; -} - -tmedia_bandwidth_level_t tmedia_defaults_get_bl() -{ - return __bl; -} - - - -// -// Denoiser: Echo suppression, AEC, Noise redution, AGC, ... -// +static tmedia_pref_video_size_t __pref_video_size = tmedia_pref_video_size_cif; // 352 x 288: Android, iOS, WP7 static int32_t __jb_margin_ms = -1; // disable static int32_t __jb_max_late_rate_percent = -1; // -1: disable 4: default for speex static uint32_t __echo_tail = 20; @@ -67,37 +50,58 @@ static int32_t __volume = 100; static int32_t __inv_session_expires = 0; // Session Timers: 0: disabled static char* __inv_session_refresher = tsk_null; static tmedia_srtp_mode_t __srtp_mode = tmedia_srtp_mode_none; +static tsk_bool_t __ice_enabled = tsk_false; -int tmedia_defaults_set_jb_margin(int32_t jb_margin_ms) -{ +int tmedia_defaults_set_profile(tmedia_profile_t profile){ + __profile = profile; + return 0; +} +tmedia_profile_t tmedia_defaults_get_profile(){ + return __profile; +} + +// @deprecated +int tmedia_defaults_set_bl(tmedia_bandwidth_level_t bl){ + __bl = bl; + return 0; +} +// @deprecated +tmedia_bandwidth_level_t tmedia_defaults_get_bl(){ + return __bl; +} + +int tmedia_defaults_set_pref_video_size(tmedia_pref_video_size_t pref_video_size){ + __pref_video_size = pref_video_size; + return 0; +} +tmedia_pref_video_size_t tmedia_defaults_get_pref_video_size(){ + return __pref_video_size; +} + +int tmedia_defaults_set_jb_margin(int32_t jb_margin_ms){ __jb_margin_ms = jb_margin_ms; return __jb_margin_ms; } -int32_t tmedia_defaults_get_jb_margin() -{ +int32_t tmedia_defaults_get_jb_margin(){ return __jb_margin_ms; } -int tmedia_defaults_set_jb_max_late_rate(int32_t jb_max_late_rate_percent) -{ - __jb_max_late_rate_percent = jb_max_late_rate_percent; - return 0; -} - -int32_t tmedia_defaults_get_jb_max_late_rate() -{ +int tmedia_defaults_set_jb_max_late_rate(int32_t jb_max_late_rate_percent){ + __jb_max_late_rate_percent = jb_max_late_rate_percent; + return 0; +} + +int32_t tmedia_defaults_get_jb_max_late_rate(){ return __jb_max_late_rate_percent; } -int tmedia_defaults_set_echo_tail(uint32_t echo_tail) -{ +int tmedia_defaults_set_echo_tail(uint32_t echo_tail){ __echo_tail = echo_tail; return 0; } -int tmedia_defaults_set_echo_skew(uint32_t echo_skew) -{ +int tmedia_defaults_set_echo_skew(uint32_t echo_skew){ __echo_skew = echo_skew; return 0; } @@ -107,35 +111,29 @@ uint32_t tmedia_defaults_get_echo_tail() return __echo_tail; } -uint32_t tmedia_defaults_get_echo_skew() -{ +uint32_t tmedia_defaults_get_echo_skew(){ return __echo_skew; } -int tmedia_defaults_set_echo_supp_enabled(tsk_bool_t echo_supp_enabled) -{ +int tmedia_defaults_set_echo_supp_enabled(tsk_bool_t echo_supp_enabled){ __echo_supp_enabled = echo_supp_enabled; return 0; } -tsk_bool_t tmedia_defaults_get_echo_supp_enabled() -{ +tsk_bool_t tmedia_defaults_get_echo_supp_enabled(){ return __echo_supp_enabled; } -int tmedia_defaults_set_agc_enabled(tsk_bool_t agc_enabled) -{ +int tmedia_defaults_set_agc_enabled(tsk_bool_t agc_enabled){ __agc_enabled = agc_enabled; return 0; } -tsk_bool_t tmedia_defaults_get_agc_enabled() -{ +tsk_bool_t tmedia_defaults_get_agc_enabled(){ return __agc_enabled; } -int tmedia_defaults_set_agc_level(float agc_level) -{ +int tmedia_defaults_set_agc_level(float agc_level){ __agc_level = agc_level; return 0; } @@ -145,36 +143,30 @@ float tmedia_defaults_get_agc_level() return __agc_level; } -int tmedia_defaults_set_vad_enabled(tsk_bool_t vad_enabled) -{ +int tmedia_defaults_set_vad_enabled(tsk_bool_t vad_enabled){ __vad_enabled = vad_enabled; return 0; } -tsk_bool_t tmedia_defaults_get_vad_enabled() -{ +tsk_bool_t tmedia_defaults_get_vad_enabled(){ return __vad_enabled; } -int tmedia_defaults_set_noise_supp_enabled(tsk_bool_t noise_supp_enabled) -{ +int tmedia_defaults_set_noise_supp_enabled(tsk_bool_t noise_supp_enabled){ __noise_supp_enabled = noise_supp_enabled; return 0; } -tsk_bool_t tmedia_defaults_get_noise_supp_enabled() -{ +tsk_bool_t tmedia_defaults_get_noise_supp_enabled(){ return __noise_supp_enabled; } -int tmedia_defaults_set_noise_supp_level(int32_t noise_supp_level) -{ +int tmedia_defaults_set_noise_supp_level(int32_t noise_supp_level){ __noise_supp_level = noise_supp_level; return 0; } -int32_t tmedia_defaults_get_noise_supp_level() -{ +int32_t tmedia_defaults_get_noise_supp_level(){ return __noise_supp_level; } @@ -232,51 +224,59 @@ int tmedia_defaults_set_rtp_port_range(uint16_t start, uint16_t stop){ return 0; } -tmedia_type_t tmedia_defaults_get_media_type(){ - return __media_type; -} - -int tmedia_defaults_set_media_type(tmedia_type_t media_type){ - __media_type = media_type; - return 0; -} - -int tmedia_defaults_set_volume(int32_t volume){ - __volume = TSK_CLAMP(0, volume, 100); - return 0; -} -int32_t tmedia_defaults_get_volume(){ - return __volume; -} - -int32_t tmedia_defaults_get_inv_session_expires(){ - return __inv_session_expires; -} -int tmedia_defaults_set_inv_session_expires(int32_t timeout){ - if(timeout >= 0){ - __inv_session_expires = timeout; - return 0; - } - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; -} - -const char* tmedia_defaults_get_inv_session_refresher(){ - return __inv_session_refresher; -} -int tmedia_defaults_set_inv_session_refresher(const char* refresher){ - if(refresher){ - tsk_strupdate(&__inv_session_refresher, refresher); - return 0; - } - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; -} - -tmedia_srtp_mode_t tmedia_defaults_get_srtp_mode(){ - return __srtp_mode; -} -int tmedia_defaults_set_srtp_mode(tmedia_srtp_mode_t mode){ - __srtp_mode = mode; - return 0; +tmedia_type_t tmedia_defaults_get_media_type(){ + return __media_type; +} + +int tmedia_defaults_set_media_type(tmedia_type_t media_type){ + __media_type = media_type; + return 0; +} + +int tmedia_defaults_set_volume(int32_t volume){ + __volume = TSK_CLAMP(0, volume, 100); + return 0; +} +int32_t tmedia_defaults_get_volume(){ + return __volume; +} + +int32_t tmedia_defaults_get_inv_session_expires(){ + return __inv_session_expires; +} +int tmedia_defaults_set_inv_session_expires(int32_t timeout){ + if(timeout >= 0){ + __inv_session_expires = timeout; + return 0; + } + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; +} + +const char* tmedia_defaults_get_inv_session_refresher(){ + return __inv_session_refresher; +} +int tmedia_defaults_set_inv_session_refresher(const char* refresher){ + if(refresher){ + tsk_strupdate(&__inv_session_refresher, refresher); + return 0; + } + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; +} + +tmedia_srtp_mode_t tmedia_defaults_get_srtp_mode(){ + return __srtp_mode; +} +int tmedia_defaults_set_srtp_mode(tmedia_srtp_mode_t mode){ + __srtp_mode = mode; + return 0; +} + +int tmedia_defaults_set_ice_enabled(tsk_bool_t ice_enabled){ + __ice_enabled = ice_enabled; + return 0; +} +tsk_bool_t tmedia_defaults_get_ice_enabled(){ + return __ice_enabled; } \ No newline at end of file diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_denoise.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_denoise.c index c868e330..cec88823 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia_denoise.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_denoise.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_denoise.c * @brief Denoiser (Noise suppression, AGC, AEC, VAD) Plugin * -* @author Mamadou Diop +* @author Mamadou Diop * */ @@ -176,7 +176,6 @@ int tmedia_denoise_close(tmedia_denoise_t* self) return -1; } if(!self->opened){ - TSK_DEBUG_WARN("Denoiser not opened"); return 0; } diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_imageattr.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_imageattr.c new file mode 100644 index 00000000..874981c5 --- /dev/null +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_imageattr.c @@ -0,0 +1,952 @@ + +/* #line 1 "./ragel/tmedia_imageattr.rl" */ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tmedia_imageattr.c + * @brief 'image-attr' parser as per RFC 6236 + * + * @author Mamadou Diop + * + */ +#include "tinymedia/tmedia_imageattr.h" + +#include "tsk_debug.h" + +#include + +/*********************************** +* Ragel state machine. +*/ + +/* #line 139 "./ragel/tmedia_imageattr.rl" */ + + +static int tmedia_imageattr_reset(tmedia_imageattr_xt* self) +{ + if(self){ + tsk_size_t i; + memset(self, 0, sizeof(*self)); + for(i = 0; i < TMEDIA_imageattr_ARRAY_MAX_SIZE; ++i){ + self->send.sets[i].qvalue = 0.5; + self->recv.sets[i].qvalue = 0.5; + } + return 0; + } + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; +} + +int tmedia_imageattr_parse(tmedia_imageattr_xt* self, const void* in_data, tsk_size_t in_size) +{ + int cs = 0; + const char *p = in_data; + const char *pe = p + in_size; + const char *eof = pe; + + const char *tag_start; + + tmedia_imageattr_set_xt* sets; + tsk_size_t* sets_count; + tmedia_imageattr_xyrange_xt* xyrange; + tmedia_imageattr_srange_xt* srange; + + +/* #line 75 "./src/tmedia_imageattr.c" */ +static const char _tmedia_machine_imageattr_actions[] = { + 0, 1, 0, 1, 1, 1, 2, 1, + 3, 1, 4, 1, 5, 1, 6, 1, + 7, 1, 8, 1, 9, 1, 10, 1, + 11, 1, 12, 1, 13, 1, 14, 1, + 15, 1, 16, 1, 17, 1, 18, 1, + 19, 1, 20, 2, 3, 0, 2, 4, + 0, 2, 6, 11, 2, 15, 0, 2, + 16, 13 +}; + +static const short _tmedia_machine_imageattr_key_offsets[] = { + 0, 0, 6, 8, 10, 12, 14, 18, + 20, 22, 24, 26, 30, 32, 33, 36, + 39, 41, 42, 45, 49, 55, 57, 59, + 60, 61, 64, 65, 67, 70, 73, 74, + 76, 79, 82, 85, 86, 88, 91, 92, + 94, 97, 100, 101, 102, 104, 105, 107, + 108, 110, 114, 116, 117, 118, 121, 123, + 125, 126, 130, 131, 133, 137, 141, 145, + 147, 148, 150, 153, 154, 156, 160, 163, + 164, 166, 170, 174, 178, 180, 182, 183, + 185, 188, 189, 191, 194, 197, 200, 201, + 203, 204, 206, 210, 214, 216, 217, 219, + 223, 227, 231, 235, 237, 239, 243, 245, + 249, 253, 257, 261, 265, 267, 269, 273, + 277, 281, 285, 287, 289, 293, 297, 301, + 305, 309, 311, 313, 316, 319, 322, 325, + 328, 329, 331, 334, 337, 340, 343, 344, + 346, 350, 352, 356, 360, 364, 368, 372, + 374, 375, 379, 383, 387, 391, 393, 395, + 399, 403, 407, 411, 415, 417, 419, 422, + 425, 428, 431, 434, 435, 436, 438, 440, + 442, 444, 446, 447, 450, 453, 455, 456, + 459, 463, 469, 471, 473, 474, 475, 478, + 479, 481, 484, 487, 488, 490, 493, 496, + 499, 500, 502, 503, 505, 508, 511, 512, + 513, 515, 516, 518, 519, 521, 525, 527, + 528, 529, 532, 534, 536, 537, 541, 542, + 544, 548, 552, 556, 558, 559, 561, 564, + 565, 567, 571, 574, 575, 577, 581, 585, + 589, 591, 593, 594, 596, 599, 600, 602, + 605, 608, 611, 612, 614, 615, 617, 621, + 625, 627, 628, 630, 634, 638, 642, 646, + 648, 650, 654, 656, 660, 664, 668, 672, + 676, 678, 680, 684, 688, 692, 696, 698, + 700, 704, 708, 712, 716, 720, 722, 724, + 727, 730, 733, 736, 739, 740, 742, 745, + 748, 751, 754, 755, 757, 761, 763, 767, + 771, 775, 779, 783, 785, 786, 790, 794, + 798, 802, 804, 806, 810, 814, 818, 822, + 826, 828, 830, 833, 836, 839, 842, 845, + 846, 847, 849, 851, 853, 855, 861, 861, + 863, 869 +}; + +static const char _tmedia_machine_imageattr_trans_keys[] = { + 9, 32, 82, 83, 114, 115, 69, 101, + 67, 99, 86, 118, 9, 32, 9, 32, + 42, 91, 69, 101, 67, 99, 86, 118, + 9, 32, 9, 32, 42, 91, 88, 120, + 61, 91, 49, 57, 44, 48, 57, 89, + 121, 61, 91, 49, 57, 44, 93, 48, + 57, 80, 81, 83, 112, 113, 115, 65, + 97, 82, 114, 61, 91, 48, 49, 57, + 46, 49, 57, 45, 48, 57, 48, 49, + 57, 46, 49, 57, 93, 48, 57, 93, + 48, 57, 93, 48, 57, 93, 44, 93, + 9, 32, 91, 46, 48, 57, 45, 48, + 57, 45, 48, 57, 45, 46, 48, 57, + 61, 48, 49, 46, 48, 57, 44, 93, + 48, 57, 44, 93, 46, 48, 44, 48, + 93, 65, 97, 82, 114, 61, 48, 91, + 49, 57, 46, 49, 57, 44, 93, 48, + 57, 44, 93, 48, 57, 44, 93, 48, + 57, 44, 93, 46, 48, 57, 48, 49, + 57, 46, 49, 57, 44, 45, 48, 57, + 48, 49, 57, 46, 49, 57, 44, 93, + 48, 57, 44, 93, 48, 57, 44, 93, + 48, 57, 44, 93, 44, 93, 46, 48, + 57, 48, 49, 57, 46, 49, 57, 93, + 48, 57, 93, 48, 57, 93, 48, 57, + 93, 44, 93, 46, 48, 57, 44, 45, + 48, 57, 44, 45, 48, 57, 44, 45, + 46, 48, 57, 44, 93, 48, 57, 44, + 93, 48, 57, 44, 93, 48, 57, 44, + 93, 48, 57, 44, 93, 49, 57, 44, + 58, 48, 57, 49, 57, 44, 93, 48, + 57, 44, 93, 48, 57, 44, 93, 48, + 57, 44, 93, 48, 57, 44, 93, 48, + 57, 44, 93, 44, 93, 44, 58, 48, + 57, 44, 58, 48, 57, 44, 58, 48, + 57, 44, 58, 48, 57, 44, 58, 49, + 57, 58, 93, 48, 57, 58, 93, 48, + 57, 58, 93, 48, 57, 58, 93, 48, + 57, 58, 93, 48, 57, 58, 93, 49, + 57, 93, 48, 57, 93, 48, 57, 93, + 48, 57, 93, 48, 57, 93, 48, 57, + 93, 44, 93, 44, 48, 57, 44, 48, + 57, 44, 48, 57, 44, 48, 57, 44, + 49, 57, 44, 58, 48, 57, 49, 57, + 44, 93, 48, 57, 44, 93, 48, 57, + 44, 93, 48, 57, 44, 93, 48, 57, + 44, 93, 48, 57, 44, 93, 44, 44, + 58, 48, 57, 44, 58, 48, 57, 44, + 58, 48, 57, 44, 58, 48, 57, 44, + 58, 49, 57, 58, 93, 48, 57, 58, + 93, 48, 57, 58, 93, 48, 57, 58, + 93, 48, 57, 58, 93, 48, 57, 58, + 93, 49, 57, 93, 48, 57, 93, 48, + 57, 93, 48, 57, 93, 48, 57, 93, + 48, 57, 93, 44, 69, 101, 78, 110, + 68, 100, 9, 32, 88, 120, 61, 91, + 49, 57, 44, 48, 57, 89, 121, 61, + 91, 49, 57, 44, 93, 48, 57, 80, + 81, 83, 112, 113, 115, 65, 97, 82, + 114, 61, 91, 48, 49, 57, 46, 49, + 57, 45, 48, 57, 48, 49, 57, 46, + 49, 57, 93, 48, 57, 93, 48, 57, + 93, 48, 57, 93, 44, 93, 46, 48, + 57, 45, 48, 57, 45, 48, 57, 45, + 46, 48, 57, 61, 48, 49, 46, 48, + 57, 44, 93, 48, 57, 44, 93, 46, + 48, 44, 48, 93, 65, 97, 82, 114, + 61, 48, 91, 49, 57, 46, 49, 57, + 44, 93, 48, 57, 44, 93, 48, 57, + 44, 93, 48, 57, 44, 93, 46, 48, + 57, 48, 49, 57, 46, 49, 57, 44, + 45, 48, 57, 48, 49, 57, 46, 49, + 57, 44, 93, 48, 57, 44, 93, 48, + 57, 44, 93, 48, 57, 44, 93, 44, + 93, 46, 48, 57, 48, 49, 57, 46, + 49, 57, 93, 48, 57, 93, 48, 57, + 93, 48, 57, 93, 44, 93, 46, 48, + 57, 44, 45, 48, 57, 44, 45, 48, + 57, 44, 45, 46, 48, 57, 44, 93, + 48, 57, 44, 93, 48, 57, 44, 93, + 48, 57, 44, 93, 48, 57, 44, 93, + 49, 57, 44, 58, 48, 57, 49, 57, + 44, 93, 48, 57, 44, 93, 48, 57, + 44, 93, 48, 57, 44, 93, 48, 57, + 44, 93, 48, 57, 44, 93, 44, 93, + 44, 58, 48, 57, 44, 58, 48, 57, + 44, 58, 48, 57, 44, 58, 48, 57, + 44, 58, 49, 57, 58, 93, 48, 57, + 58, 93, 48, 57, 58, 93, 48, 57, + 58, 93, 48, 57, 58, 93, 48, 57, + 58, 93, 49, 57, 93, 48, 57, 93, + 48, 57, 93, 48, 57, 93, 48, 57, + 93, 48, 57, 93, 44, 93, 44, 48, + 57, 44, 48, 57, 44, 48, 57, 44, + 48, 57, 44, 49, 57, 44, 58, 48, + 57, 49, 57, 44, 93, 48, 57, 44, + 93, 48, 57, 44, 93, 48, 57, 44, + 93, 48, 57, 44, 93, 48, 57, 44, + 93, 44, 44, 58, 48, 57, 44, 58, + 48, 57, 44, 58, 48, 57, 44, 58, + 48, 57, 44, 58, 49, 57, 58, 93, + 48, 57, 58, 93, 48, 57, 58, 93, + 48, 57, 58, 93, 48, 57, 58, 93, + 48, 57, 58, 93, 49, 57, 93, 48, + 57, 93, 48, 57, 93, 48, 57, 93, + 48, 57, 93, 48, 57, 93, 44, 69, + 101, 78, 110, 68, 100, 9, 32, 9, + 32, 82, 83, 114, 115, 9, 32, 9, + 32, 82, 83, 114, 115, 9, 32, 82, + 83, 91, 114, 115, 0 +}; + +static const char _tmedia_machine_imageattr_single_lengths[] = { + 0, 6, 2, 2, 2, 2, 4, 2, + 2, 2, 2, 4, 2, 1, 1, 1, + 2, 1, 1, 2, 6, 2, 2, 1, + 1, 1, 1, 0, 1, 1, 1, 0, + 1, 1, 1, 1, 2, 3, 1, 0, + 1, 1, 1, 1, 0, 1, 2, 1, + 0, 2, 2, 1, 1, 3, 2, 2, + 1, 2, 1, 0, 2, 2, 2, 2, + 1, 0, 1, 1, 0, 2, 1, 1, + 0, 2, 2, 2, 2, 2, 1, 0, + 1, 1, 0, 1, 1, 1, 1, 2, + 1, 0, 2, 2, 2, 1, 0, 2, + 2, 2, 2, 2, 0, 2, 0, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 0, 2, 2, 2, 2, + 2, 2, 0, 1, 1, 1, 1, 1, + 1, 2, 1, 1, 1, 1, 1, 0, + 2, 0, 2, 2, 2, 2, 2, 2, + 1, 2, 2, 2, 2, 2, 0, 2, + 2, 2, 2, 2, 2, 0, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 2, + 2, 2, 1, 1, 1, 2, 1, 1, + 2, 6, 2, 2, 1, 1, 1, 1, + 0, 1, 1, 1, 0, 1, 1, 1, + 1, 2, 1, 0, 1, 1, 1, 1, + 0, 1, 2, 1, 0, 2, 2, 1, + 1, 3, 2, 2, 1, 2, 1, 0, + 2, 2, 2, 2, 1, 0, 1, 1, + 0, 2, 1, 1, 0, 2, 2, 2, + 2, 2, 1, 0, 1, 1, 0, 1, + 1, 1, 1, 2, 1, 0, 2, 2, + 2, 1, 0, 2, 2, 2, 2, 2, + 0, 2, 0, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 2, 2, 0, 1, + 1, 1, 1, 1, 1, 2, 1, 1, + 1, 1, 1, 0, 2, 0, 2, 2, + 2, 2, 2, 2, 1, 2, 2, 2, + 2, 2, 0, 2, 2, 2, 2, 2, + 2, 0, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 6, 0, 2, + 6, 7 +}; + +static const char _tmedia_machine_imageattr_range_lengths[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 1, 1, 0, 0, 0, 0, + 0, 1, 0, 1, 1, 1, 0, 1, + 1, 1, 1, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 1, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 1, 1, 1, 1, 0, + 0, 1, 1, 0, 1, 1, 1, 0, + 1, 1, 1, 1, 0, 0, 0, 1, + 1, 0, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 1, 0, + 1, 1, 1, 0, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 0, 0, + 1, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 1, + 1, 1, 1, 0, 0, 1, 1, 0, + 1, 1, 1, 0, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 0, 1, 1, + 1, 1, 0, 0, 0, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 +}; + +static const short _tmedia_machine_imageattr_index_offsets[] = { + 0, 0, 7, 10, 13, 16, 19, 24, + 27, 30, 33, 36, 41, 44, 46, 49, + 52, 55, 57, 60, 64, 71, 74, 77, + 79, 81, 84, 86, 88, 91, 94, 96, + 98, 101, 104, 107, 109, 112, 116, 118, + 120, 123, 126, 128, 130, 132, 134, 137, + 139, 141, 145, 148, 150, 152, 156, 159, + 162, 164, 168, 170, 172, 176, 180, 184, + 187, 189, 191, 194, 196, 198, 202, 205, + 207, 209, 213, 217, 221, 224, 227, 229, + 231, 234, 236, 238, 241, 244, 247, 249, + 252, 254, 256, 260, 264, 267, 269, 271, + 275, 279, 283, 287, 290, 292, 296, 298, + 302, 306, 310, 314, 318, 321, 324, 328, + 332, 336, 340, 343, 345, 349, 353, 357, + 361, 365, 368, 370, 373, 376, 379, 382, + 385, 387, 390, 393, 396, 399, 402, 404, + 406, 410, 412, 416, 420, 424, 428, 432, + 435, 437, 441, 445, 449, 453, 456, 458, + 462, 466, 470, 474, 478, 481, 483, 486, + 489, 492, 495, 498, 500, 502, 505, 508, + 511, 514, 517, 519, 522, 525, 528, 530, + 533, 537, 544, 547, 550, 552, 554, 557, + 559, 561, 564, 567, 569, 571, 574, 577, + 580, 582, 585, 587, 589, 592, 595, 597, + 599, 601, 603, 606, 608, 610, 614, 617, + 619, 621, 625, 628, 631, 633, 637, 639, + 641, 645, 649, 653, 656, 658, 660, 663, + 665, 667, 671, 674, 676, 678, 682, 686, + 690, 693, 696, 698, 700, 703, 705, 707, + 710, 713, 716, 718, 721, 723, 725, 729, + 733, 736, 738, 740, 744, 748, 752, 756, + 759, 761, 765, 767, 771, 775, 779, 783, + 787, 790, 793, 797, 801, 805, 809, 812, + 814, 818, 822, 826, 830, 834, 837, 839, + 842, 845, 848, 851, 854, 856, 859, 862, + 865, 868, 871, 873, 875, 879, 881, 885, + 889, 893, 897, 901, 904, 906, 910, 914, + 918, 922, 925, 927, 931, 935, 939, 943, + 947, 950, 952, 955, 958, 961, 964, 967, + 969, 971, 974, 977, 980, 983, 990, 991, + 994, 1001 +}; + +static const short _tmedia_machine_imageattr_trans_targs[] = { + 1, 1, 2, 321, 2, 321, 0, 3, + 3, 0, 4, 4, 0, 5, 5, 0, + 6, 6, 0, 6, 6, 325, 169, 0, + 8, 8, 0, 9, 9, 0, 10, 10, + 0, 11, 11, 0, 11, 11, 326, 12, + 0, 13, 13, 0, 14, 0, 135, 15, + 0, 16, 130, 0, 17, 17, 0, 18, + 0, 100, 19, 0, 20, 327, 95, 0, + 21, 45, 54, 21, 45, 54, 0, 22, + 22, 0, 23, 23, 0, 24, 0, 25, + 0, 26, 43, 0, 27, 0, 28, 0, + 29, 40, 0, 30, 38, 0, 31, 0, + 32, 0, 36, 33, 0, 36, 34, 0, + 36, 35, 0, 36, 0, 20, 327, 0, + 37, 37, 12, 0, 39, 0, 32, 0, + 29, 41, 0, 29, 42, 0, 29, 0, + 44, 0, 28, 0, 46, 0, 47, 51, + 0, 48, 0, 49, 0, 20, 327, 50, + 0, 20, 327, 0, 52, 0, 53, 0, + 20, 50, 327, 0, 55, 55, 0, 56, + 56, 0, 57, 0, 58, 66, 64, 0, + 59, 0, 60, 0, 20, 327, 61, 0, + 20, 327, 62, 0, 20, 327, 63, 0, + 20, 327, 0, 65, 0, 60, 0, 67, + 93, 0, 68, 0, 69, 0, 70, 80, + 90, 0, 71, 78, 0, 72, 0, 73, + 0, 70, 77, 74, 0, 70, 77, 75, + 0, 70, 77, 76, 0, 70, 77, 0, + 20, 327, 0, 79, 0, 73, 0, 81, + 88, 0, 82, 0, 83, 0, 87, 84, + 0, 87, 85, 0, 87, 86, 0, 87, + 0, 20, 327, 0, 89, 0, 83, 0, + 70, 80, 91, 0, 70, 80, 92, 0, + 70, 80, 0, 94, 0, 69, 0, 20, + 327, 96, 0, 20, 327, 97, 0, 20, + 327, 98, 0, 20, 327, 99, 0, 20, + 327, 0, 101, 0, 102, 115, 110, 0, + 103, 0, 102, 109, 104, 0, 102, 109, + 105, 0, 102, 109, 106, 0, 102, 109, + 107, 0, 102, 109, 108, 0, 102, 109, + 0, 20, 327, 0, 102, 115, 111, 0, + 102, 115, 112, 0, 102, 115, 113, 0, + 102, 115, 114, 0, 102, 115, 0, 116, + 0, 122, 129, 117, 0, 122, 129, 118, + 0, 122, 129, 119, 0, 122, 129, 120, + 0, 122, 129, 121, 0, 122, 129, 0, + 123, 0, 129, 124, 0, 129, 125, 0, + 129, 126, 0, 129, 127, 0, 129, 128, + 0, 129, 0, 20, 327, 0, 16, 131, + 0, 16, 132, 0, 16, 133, 0, 16, + 134, 0, 16, 0, 136, 0, 137, 150, + 145, 0, 138, 0, 137, 144, 139, 0, + 137, 144, 140, 0, 137, 144, 141, 0, + 137, 144, 142, 0, 137, 144, 143, 0, + 137, 144, 0, 16, 0, 137, 150, 146, + 0, 137, 150, 147, 0, 137, 150, 148, + 0, 137, 150, 149, 0, 137, 150, 0, + 151, 0, 157, 164, 152, 0, 157, 164, + 153, 0, 157, 164, 154, 0, 157, 164, + 155, 0, 157, 164, 156, 0, 157, 164, + 0, 158, 0, 164, 159, 0, 164, 160, + 0, 164, 161, 0, 164, 162, 0, 164, + 163, 0, 164, 0, 16, 0, 166, 166, + 0, 167, 167, 0, 168, 168, 0, 11, + 11, 0, 170, 170, 0, 171, 0, 291, + 172, 0, 173, 286, 0, 174, 174, 0, + 175, 0, 256, 176, 0, 177, 328, 251, + 0, 178, 201, 210, 178, 201, 210, 0, + 179, 179, 0, 180, 180, 0, 181, 0, + 182, 0, 183, 199, 0, 184, 0, 185, + 0, 186, 196, 0, 187, 194, 0, 188, + 0, 189, 0, 193, 190, 0, 193, 191, + 0, 193, 192, 0, 193, 0, 177, 328, + 0, 195, 0, 189, 0, 186, 197, 0, + 186, 198, 0, 186, 0, 200, 0, 185, + 0, 202, 0, 203, 207, 0, 204, 0, + 205, 0, 177, 328, 206, 0, 177, 328, + 0, 208, 0, 209, 0, 177, 206, 328, + 0, 211, 211, 0, 212, 212, 0, 213, + 0, 214, 222, 220, 0, 215, 0, 216, + 0, 177, 328, 217, 0, 177, 328, 218, + 0, 177, 328, 219, 0, 177, 328, 0, + 221, 0, 216, 0, 223, 249, 0, 224, + 0, 225, 0, 226, 236, 246, 0, 227, + 234, 0, 228, 0, 229, 0, 226, 233, + 230, 0, 226, 233, 231, 0, 226, 233, + 232, 0, 226, 233, 0, 177, 328, 0, + 235, 0, 229, 0, 237, 244, 0, 238, + 0, 239, 0, 243, 240, 0, 243, 241, + 0, 243, 242, 0, 243, 0, 177, 328, + 0, 245, 0, 239, 0, 226, 236, 247, + 0, 226, 236, 248, 0, 226, 236, 0, + 250, 0, 225, 0, 177, 328, 252, 0, + 177, 328, 253, 0, 177, 328, 254, 0, + 177, 328, 255, 0, 177, 328, 0, 257, + 0, 258, 271, 266, 0, 259, 0, 258, + 265, 260, 0, 258, 265, 261, 0, 258, + 265, 262, 0, 258, 265, 263, 0, 258, + 265, 264, 0, 258, 265, 0, 177, 328, + 0, 258, 271, 267, 0, 258, 271, 268, + 0, 258, 271, 269, 0, 258, 271, 270, + 0, 258, 271, 0, 272, 0, 278, 285, + 273, 0, 278, 285, 274, 0, 278, 285, + 275, 0, 278, 285, 276, 0, 278, 285, + 277, 0, 278, 285, 0, 279, 0, 285, + 280, 0, 285, 281, 0, 285, 282, 0, + 285, 283, 0, 285, 284, 0, 285, 0, + 177, 328, 0, 173, 287, 0, 173, 288, + 0, 173, 289, 0, 173, 290, 0, 173, + 0, 292, 0, 293, 306, 301, 0, 294, + 0, 293, 300, 295, 0, 293, 300, 296, + 0, 293, 300, 297, 0, 293, 300, 298, + 0, 293, 300, 299, 0, 293, 300, 0, + 173, 0, 293, 306, 302, 0, 293, 306, + 303, 0, 293, 306, 304, 0, 293, 306, + 305, 0, 293, 306, 0, 307, 0, 313, + 320, 308, 0, 313, 320, 309, 0, 313, + 320, 310, 0, 313, 320, 311, 0, 313, + 320, 312, 0, 313, 320, 0, 314, 0, + 320, 315, 0, 320, 316, 0, 320, 317, + 0, 320, 318, 0, 320, 319, 0, 320, + 0, 173, 0, 322, 322, 0, 323, 323, + 0, 324, 324, 0, 6, 6, 0, 325, + 325, 7, 165, 7, 165, 0, 0, 37, + 37, 0, 329, 329, 7, 165, 7, 165, + 0, 329, 329, 7, 165, 169, 7, 165, + 0, 0 +}; + +static const char _tmedia_machine_imageattr_trans_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 43, + 0, 49, 0, 0, 0, 0, 0, 0, + 0, 9, 46, 0, 49, 49, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 0, + 39, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 41, 0, 0, 41, 0, 0, + 41, 0, 0, 41, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 39, 0, 0, 39, 0, 0, 39, 0, + 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 25, 25, 0, + 0, 25, 25, 0, 0, 0, 0, 0, + 25, 0, 25, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 52, 31, 52, 0, + 0, 0, 0, 0, 55, 55, 0, 0, + 55, 55, 0, 0, 55, 55, 0, 0, + 55, 55, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 33, 35, + 0, 0, 1, 1, 0, 0, 0, 0, + 0, 33, 33, 0, 0, 33, 33, 0, + 0, 33, 33, 0, 0, 33, 33, 0, + 27, 27, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 37, 0, + 0, 37, 0, 0, 37, 0, 0, 37, + 0, 29, 29, 0, 0, 0, 0, 0, + 33, 35, 0, 0, 33, 35, 0, 0, + 33, 35, 0, 0, 0, 0, 0, 49, + 49, 0, 0, 49, 49, 0, 0, 49, + 49, 0, 0, 49, 49, 0, 0, 49, + 49, 0, 1, 0, 23, 17, 0, 0, + 1, 0, 23, 23, 0, 0, 23, 23, + 0, 0, 23, 23, 0, 0, 23, 23, + 0, 0, 23, 23, 0, 0, 23, 23, + 0, 13, 13, 0, 23, 17, 0, 0, + 23, 17, 0, 0, 23, 17, 0, 0, + 23, 17, 0, 0, 23, 17, 0, 1, + 0, 19, 21, 0, 0, 19, 21, 0, + 0, 19, 21, 0, 0, 19, 21, 0, + 0, 19, 21, 0, 0, 19, 21, 0, + 1, 0, 21, 0, 0, 21, 0, 0, + 21, 0, 0, 21, 0, 0, 21, 0, + 0, 21, 0, 15, 15, 0, 49, 0, + 0, 49, 0, 0, 49, 0, 0, 49, + 0, 0, 49, 0, 1, 0, 23, 17, + 0, 0, 1, 0, 23, 23, 0, 0, + 23, 23, 0, 0, 23, 23, 0, 0, + 23, 23, 0, 0, 23, 23, 0, 0, + 23, 23, 0, 13, 0, 23, 17, 0, + 0, 23, 17, 0, 0, 23, 17, 0, + 0, 23, 17, 0, 0, 23, 17, 0, + 1, 0, 19, 21, 0, 0, 19, 21, + 0, 0, 19, 21, 0, 0, 19, 21, + 0, 0, 19, 21, 0, 0, 19, 21, + 0, 1, 0, 21, 0, 0, 21, 0, + 0, 21, 0, 0, 21, 0, 0, 21, + 0, 0, 21, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 3, 0, 0, 0, 0, 0, 0, 7, + 43, 0, 49, 0, 0, 0, 0, 0, + 0, 0, 9, 46, 0, 49, 49, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 0, + 0, 39, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 41, 0, 0, 41, 0, + 0, 41, 0, 0, 41, 0, 0, 0, + 0, 0, 0, 0, 0, 39, 0, 0, + 39, 0, 0, 39, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 25, 25, 0, 0, 25, 25, + 0, 0, 0, 0, 0, 25, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 52, 31, 52, 0, 0, 0, 0, + 0, 55, 55, 0, 0, 55, 55, 0, + 0, 55, 55, 0, 0, 55, 55, 0, + 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 33, 35, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 33, 33, + 0, 0, 33, 33, 0, 0, 33, 33, + 0, 0, 33, 33, 0, 27, 27, 0, + 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 37, 0, 0, 37, 0, + 0, 37, 0, 0, 37, 0, 29, 29, + 0, 0, 0, 0, 0, 33, 35, 0, + 0, 33, 35, 0, 0, 33, 35, 0, + 0, 0, 0, 0, 49, 49, 0, 0, + 49, 49, 0, 0, 49, 49, 0, 0, + 49, 49, 0, 0, 49, 49, 0, 1, + 0, 23, 17, 0, 0, 1, 0, 23, + 23, 0, 0, 23, 23, 0, 0, 23, + 23, 0, 0, 23, 23, 0, 0, 23, + 23, 0, 0, 23, 23, 0, 13, 13, + 0, 23, 17, 0, 0, 23, 17, 0, + 0, 23, 17, 0, 0, 23, 17, 0, + 0, 23, 17, 0, 1, 0, 19, 21, + 0, 0, 19, 21, 0, 0, 19, 21, + 0, 0, 19, 21, 0, 0, 19, 21, + 0, 0, 19, 21, 0, 1, 0, 21, + 0, 0, 21, 0, 0, 21, 0, 0, + 21, 0, 0, 21, 0, 0, 21, 0, + 15, 15, 0, 49, 0, 0, 49, 0, + 0, 49, 0, 0, 49, 0, 0, 49, + 0, 1, 0, 23, 17, 0, 0, 1, + 0, 23, 23, 0, 0, 23, 23, 0, + 0, 23, 23, 0, 0, 23, 23, 0, + 0, 23, 23, 0, 0, 23, 23, 0, + 13, 0, 23, 17, 0, 0, 23, 17, + 0, 0, 23, 17, 0, 0, 23, 17, + 0, 0, 23, 17, 0, 1, 0, 19, + 21, 0, 0, 19, 21, 0, 0, 19, + 21, 0, 0, 19, 21, 0, 0, 19, + 21, 0, 0, 19, 21, 0, 1, 0, + 21, 0, 0, 21, 0, 0, 21, 0, + 0, 21, 0, 0, 21, 0, 0, 21, + 0, 15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 11, + 11, 0, 11, 11, 11, 11, 11, 11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 +}; + +static const char _tmedia_machine_imageattr_eof_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 11, + 11, 0 +}; + +static const int tmedia_machine_imageattr_start = 1; +static const int tmedia_machine_imageattr_first_final = 325; +static const int tmedia_machine_imageattr_error = 0; + +static const int tmedia_machine_imageattr_en_main = 1; + + +/* #line 171 "./ragel/tmedia_imageattr.rl" */ + +/* #line 694 "./src/tmedia_imageattr.c" */ + { + cs = tmedia_machine_imageattr_start; + } + +/* #line 172 "./ragel/tmedia_imageattr.rl" */ + tmedia_imageattr_reset(self); + +/* #line 702 "./src/tmedia_imageattr.c" */ + { + int _klen; + unsigned int _trans; + const char *_acts; + unsigned int _nacts; + const char *_keys; + + if ( p == pe ) + goto _test_eof; + if ( cs == 0 ) + goto _out; +_resume: + _keys = _tmedia_machine_imageattr_trans_keys + _tmedia_machine_imageattr_key_offsets[cs]; + _trans = _tmedia_machine_imageattr_index_offsets[cs]; + + _klen = _tmedia_machine_imageattr_single_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_mid; + const char *_upper = _keys + _klen - 1; + while (1) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( (*p) < *_mid ) + _upper = _mid - 1; + else if ( (*p) > *_mid ) + _lower = _mid + 1; + else { + _trans += (_mid - _keys); + goto _match; + } + } + _keys += _klen; + _trans += _klen; + } + + _klen = _tmedia_machine_imageattr_range_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_mid; + const char *_upper = _keys + (_klen<<1) - 2; + while (1) { + if ( _upper < _lower ) + break; + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( (*p) < _mid[0] ) + _upper = _mid - 2; + else if ( (*p) > _mid[1] ) + _lower = _mid + 2; + else { + _trans += ((_mid - _keys)>>1); + goto _match; + } + } + _trans += _klen; + } + +_match: + cs = _tmedia_machine_imageattr_trans_targs[_trans]; + + if ( _tmedia_machine_imageattr_trans_actions[_trans] == 0 ) + goto _again; + + _acts = _tmedia_machine_imageattr_actions + _tmedia_machine_imageattr_trans_actions[_trans]; + _nacts = (unsigned int) *_acts++; + while ( _nacts-- > 0 ) + { + switch ( *_acts++ ) + { + case 0: +/* #line 44 "./ragel/tmedia_imageattr.rl" */ + { + tag_start = p; + } + break; + case 1: +/* #line 48 "./ragel/tmedia_imageattr.rl" */ + { + sets = &self->send.sets[0]; + sets_count = &self->send.count; + *sets_count = 0; + } + break; + case 2: +/* #line 54 "./ragel/tmedia_imageattr.rl" */ + { + sets = &self->recv.sets[0]; + sets_count = &self->recv.count; + *sets_count = 0; + } + break; + case 3: +/* #line 60 "./ragel/tmedia_imageattr.rl" */ + { + xyrange = (*sets_count < TMEDIA_imageattr_ARRAY_MAX_SIZE) ? &sets[*sets_count].xrange : tsk_null; + } + break; + case 4: +/* #line 63 "./ragel/tmedia_imageattr.rl" */ + { + xyrange = (*sets_count < TMEDIA_imageattr_ARRAY_MAX_SIZE) ? &sets[*sets_count].yrange : tsk_null; + } + break; + case 5: +/* #line 66 "./ragel/tmedia_imageattr.rl" */ + { + if(*sets_count < TMEDIA_imageattr_ARRAY_MAX_SIZE) (*sets_count)++; + } + break; + case 6: +/* #line 69 "./ragel/tmedia_imageattr.rl" */ + { + if(xyrange) xyrange->is_range = 0; + } + break; + case 7: +/* #line 72 "./ragel/tmedia_imageattr.rl" */ + { + if(xyrange) xyrange->is_range = 1; + } + break; + case 8: +/* #line 75 "./ragel/tmedia_imageattr.rl" */ + { + if(xyrange)xyrange->range.start = atoi(tag_start); + } + break; + case 9: +/* #line 78 "./ragel/tmedia_imageattr.rl" */ + { + if(xyrange)xyrange->range.step = atoi(tag_start); + } + break; + case 10: +/* #line 81 "./ragel/tmedia_imageattr.rl" */ + { + if(xyrange)xyrange->range.end = atoi(tag_start); + } + break; + case 11: +/* #line 84 "./ragel/tmedia_imageattr.rl" */ + { + if(xyrange && xyrange->array.count < TMEDIA_imageattr_ARRAY_MAX_SIZE){ + xyrange->array.values[xyrange->array.count++] = atoi(tag_start); + } + } + break; + case 12: +/* #line 89 "./ragel/tmedia_imageattr.rl" */ + { + if(*sets_count < TMEDIA_imageattr_ARRAY_MAX_SIZE){ + sets[*sets_count].qvalue = atof(tag_start); + } + } + break; + case 13: +/* #line 95 "./ragel/tmedia_imageattr.rl" */ + { + if(srange) srange->is_range = 0; + } + break; + case 14: +/* #line 98 "./ragel/tmedia_imageattr.rl" */ + { + if(srange) srange->is_range = 1; + } + break; + case 15: +/* #line 101 "./ragel/tmedia_imageattr.rl" */ + { + srange = (*sets_count < TMEDIA_imageattr_ARRAY_MAX_SIZE) ? &sets[*sets_count].srange : tsk_null; + } + break; + case 16: +/* #line 104 "./ragel/tmedia_imageattr.rl" */ + { + if(srange && srange->array.count < TMEDIA_imageattr_ARRAY_MAX_SIZE){ + srange->array.values[srange->array.count++] = atof(tag_start); + } + } + break; + case 17: +/* #line 109 "./ragel/tmedia_imageattr.rl" */ + { + if(srange) srange->range.start = atof(tag_start); + } + break; + case 18: +/* #line 112 "./ragel/tmedia_imageattr.rl" */ + { + if(srange) srange->range.end = atof(tag_start); + } + break; + case 19: +/* #line 116 "./ragel/tmedia_imageattr.rl" */ + { + if(*sets_count < TMEDIA_imageattr_ARRAY_MAX_SIZE) sets[*sets_count].prange.start = atof(tag_start); + } + break; + case 20: +/* #line 119 "./ragel/tmedia_imageattr.rl" */ + { + if(*sets_count < TMEDIA_imageattr_ARRAY_MAX_SIZE) sets[*sets_count].prange.end = atof(tag_start), sets[*sets_count].prange.is_present = 1; + } + break; +/* #line 911 "./src/tmedia_imageattr.c" */ + } + } + +_again: + if ( cs == 0 ) + goto _out; + if ( ++p != pe ) + goto _resume; + _test_eof: {} + if ( p == eof ) + { + const char *__acts = _tmedia_machine_imageattr_actions + _tmedia_machine_imageattr_eof_actions[cs]; + unsigned int __nacts = (unsigned int) *__acts++; + while ( __nacts-- > 0 ) { + switch ( *__acts++ ) { + case 5: +/* #line 66 "./ragel/tmedia_imageattr.rl" */ + { + if(*sets_count < TMEDIA_imageattr_ARRAY_MAX_SIZE) (*sets_count)++; + } + break; +/* #line 933 "./src/tmedia_imageattr.c" */ + } + } + } + + _out: {} + } + +/* #line 174 "./ragel/tmedia_imageattr.rl" */ + + if( cs < +/* #line 944 "./src/tmedia_imageattr.c" */ +325 +/* #line 175 "./ragel/tmedia_imageattr.rl" */ + ){ + TSK_DEBUG_ERROR("Parsing failed to parse image-attr=%s", in_data); + return -1; + } + + return 0; +} \ No newline at end of file diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_jitterbuffer.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_jitterbuffer.c index ceb7642d..45637ac4 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia_jitterbuffer.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_jitterbuffer.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_jitterbuffer.c * @brief Audio/Video JitterBuffer plugin * - * @author Mamadou Diop + * @author Mamadou Diop */ #include "tinymedia/tmedia_jitterbuffer.h" diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_params.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_params.c index c4c5c678..30209005 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia_params.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_params.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_params.c * @brief Media parameters used to configure any session or plugin. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -43,7 +43,7 @@ tmedia_param_t* tmedia_param_create(tmedia_param_access_type_t access_type, { tmedia_param_t* param; - if(!key ||!value){ + if(!key || (!value && (value_type != tmedia_pvt_pobject && value_type != tmedia_pvt_pchar))){ TSK_DEBUG_ERROR("Invalid parameter"); return tsk_null; } @@ -62,7 +62,6 @@ tmedia_param_t* tmedia_param_create(tmedia_param_access_type_t access_type, case tmedia_pvt_int32: if(param->value = tsk_calloc(1, sizeof(int32_t))){ memcpy(param->value, value, sizeof(int32_t)); - //*((int32_t*)param->value) = *((int32_t*)value); } break; case tmedia_pvt_pobject: @@ -74,7 +73,6 @@ tmedia_param_t* tmedia_param_create(tmedia_param_access_type_t access_type, case tmedia_pvt_int64: if(param->value = tsk_calloc(1, sizeof(int64_t))){ memcpy(param->value, value, sizeof(int64_t)); - //*((int64_t*)param->value) = *((int64_t*)value); } break; } diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_producer.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_producer.c index 7c521fe7..c0fbd021 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia_producer.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_producer.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_producer.c * @brief Base producer object. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -88,7 +88,7 @@ int tmedia_producer_set_raw_callback(tmedia_producer_t *self, tmedia_producer_ra } self->raw_cb.callback = callback; - self->raw_cb.callback_data = callback_data; + self->raw_cb.chunck_curr.usr_data = callback_data; return 0; } diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_qos.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_qos.c index 0482e1fb..b13c0345 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia_qos.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_qos.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_qos.c * @brief RFC 3312 (Preconditions) implementation. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_resampler.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_resampler.c index 665e0c2c..0570de00 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia_resampler.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_resampler.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_resampler.c * @brief Audio Resample plugin * - * @author Mamadou Diop + * @author Mamadou Diop */ #include "tinymedia/tmedia_resampler.h" diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_session.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_session.c index b2b90efc..1cdba7ca 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia_session.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_session.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_session.h * @brief Base session object. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -125,6 +125,34 @@ int tmedia_session_init(tmedia_session_t* self, tmedia_type_t type) return 0; } +int tmedia_session_set(tmedia_session_t* self, ...) +{ + va_list ap; + tmedia_params_L_t* params; + + if(!self || !self->plugin || !self->plugin->set){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + va_start(ap, self); + if((params = tmedia_params_create_2(&ap))){ + const tsk_list_item_t *item; + const tmedia_param_t* param; + tsk_list_foreach(item, params){ + if(!(param = item->data)){ + continue; + } + if((self->type & param->media_type)){ + self->plugin->set(self, param); + } + } + TSK_OBJECT_SAFE_FREE(params); + } + va_end(ap); + return 0; +} + /**@ingroup tmedia_session_group * Generic function to compare two sessions. * @param sess1 The first session to compare. @@ -321,7 +349,7 @@ const tsdp_header_M_t* tmedia_session_get_lo(tmedia_session_t* self) tmedia_codecs_L_t* tmedia_session_match_codec(tmedia_session_t* self, const tsdp_header_M_t* M) { const tmedia_codec_t *codec; - char *rtpmap = tsk_null, *fmtp = tsk_null, *name = tsk_null; + char *rtpmap = tsk_null, *fmtp = tsk_null, *image_attr = tsk_null, *name = tsk_null; const tsdp_fmt_t* fmt; const tsk_list_item_t *it1, *it2; tsk_bool_t found = tsk_false; @@ -357,7 +385,7 @@ tmedia_codecs_L_t* tmedia_session_match_codec(tmedia_session_t* self, const tsdp goto next; } - /* compare name and rate. what about channels? */ + /* compare name and rate... what about channels? */ if(tsk_striequals(name, codec->name) && (!rate || (codec->plugin->rate == rate))){ goto compare_fmtp; } @@ -374,19 +402,33 @@ tmedia_codecs_L_t* tmedia_session_match_codec(tmedia_session_t* self, const tsdp compare_fmtp: if((fmtp = tsdp_header_M_get_fmtp(M, fmt->value))){ /* remote have fmtp? */ - if(tmedia_codec_match_fmtp(codec, fmtp)){ /* fmtp matches? */ - tsk_strupdate((char**)&codec->neg_format, fmt->value); - found = tsk_true; + if(tmedia_codec_sdp_att_match(codec, "fmtp", fmtp)){ /* fmtp matches? */ + if(codec->type & tmedia_video) goto compare_imageattr; + else found = tsk_true; } + else goto next; } else{ /* no fmtp -> always match */ - tsk_strupdate((char**)&codec->neg_format, fmt->value); - found = tsk_true; + if(codec->type & tmedia_video) goto compare_imageattr; + else found = tsk_true; } + +compare_imageattr: + if(codec->type & tmedia_video){ + if((image_attr = tsdp_header_M_get_imageattr(M, fmt->value))){ + if(tmedia_codec_sdp_att_match(codec, "imageattr", image_attr)) found = tsk_true; + } + else found = tsk_true; + } + + // update neg. format + if(found) tsk_strupdate((char**)&codec->neg_format, fmt->value); + next: TSK_FREE(name); TSK_FREE(fmtp); TSK_FREE(rtpmap); + TSK_FREE(image_attr); if(found){ tmedia_codec_t * copy; if(!matchingCodecs){ @@ -553,6 +595,34 @@ int tmedia_session_mgr_set_natt_ctx(tmedia_session_mgr_t* self, tnet_nat_context return 0; } +int tmedia_session_mgr_set_ice_ctx(tmedia_session_mgr_t* self, struct tnet_ice_ctx_s* ctx_audio, struct tnet_ice_ctx_s* ctx_video) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + TSK_OBJECT_SAFE_FREE(self->ice.ctx_audio); + TSK_OBJECT_SAFE_FREE(self->ice.ctx_video); + + self->ice.ctx_audio = tsk_object_ref(ctx_audio); + self->ice.ctx_video = tsk_object_ref(ctx_video); + + if(self->type & tmedia_audio){ + tmedia_session_mgr_set(self, + TMEDIA_SESSION_SET_POBJECT(tmedia_audio, "ice-ctx", self->ice.ctx_audio), + TMEDIA_SESSION_SET_NULL()); + } + + if(self->type & tmedia_video){ + tmedia_session_mgr_set(self, + TMEDIA_SESSION_SET_POBJECT(tmedia_video, "ice-ctx", self->ice.ctx_video), + TMEDIA_SESSION_SET_NULL()); + } + + return 0; +} + /**@ingroup tmedia_session_group * Starts the session manager by starting all underlying sessions. * You should set both remote and local offers before calling this function. @@ -563,7 +633,7 @@ int tmedia_session_mgr_set_natt_ctx(tmedia_session_mgr_t* self, tnet_nat_context */ int tmedia_session_mgr_start(tmedia_session_mgr_t* self) { - int ret; + int ret = 0; tsk_list_item_t* item; tmedia_session_t* session; @@ -571,16 +641,18 @@ int tmedia_session_mgr_start(tmedia_session_mgr_t* self) TSK_DEBUG_ERROR("Invalid parameter"); return -1; } + + tsk_safeobj_lock(self); if(self->started){ - TSK_DEBUG_WARN("Session manager already started"); - return 0; + goto bail; } tsk_list_foreach(item, self->sessions){ if(!(session = item->data) || !session->plugin || !session->plugin->start){ TSK_DEBUG_ERROR("Invalid session"); - return -2; + ret = -2; + goto bail; } if((ret = session->plugin->start(session))){ TSK_DEBUG_ERROR("Failed to start %s session", session->plugin->media); @@ -589,7 +661,10 @@ int tmedia_session_mgr_start(tmedia_session_mgr_t* self) } self->started = tsk_true; - return 0; + +bail: + tsk_safeobj_unlock(self); + return ret; } /**@ingroup tmedia_session_group @@ -720,7 +795,7 @@ int tmedia_session_mgr_get(tmedia_session_mgr_t* self, ...) */ int tmedia_session_mgr_stop(tmedia_session_mgr_t* self) { - int ret; + int ret = 0; tsk_list_item_t* item; tmedia_session_t* session; @@ -728,24 +803,28 @@ int tmedia_session_mgr_stop(tmedia_session_mgr_t* self) TSK_DEBUG_ERROR("Invalid parameter"); return -1; } + tsk_safeobj_lock(self); if(!self->started){ - TSK_DEBUG_WARN("Session manager not started"); - return 0; + goto bail; } tsk_list_foreach(item, self->sessions){ if(!(session = item->data) || !session->plugin || !session->plugin->stop){ TSK_DEBUG_ERROR("Invalid session"); - return -2; + ret = -2; + goto bail; } if((ret = session->plugin->stop(session))){ TSK_DEBUG_ERROR("Failed to stop session"); - return ret; + continue; } } self->started = tsk_false; - return 0; + +bail: + tsk_safeobj_unlock(self); + return ret; } /**@ingroup tmedia_session_group @@ -756,17 +835,20 @@ const tsdp_message_t* tmedia_session_mgr_get_lo(tmedia_session_mgr_t* self) const tsk_list_item_t* item; const tmedia_session_t* ms; const tsdp_header_M_t* m; + const tsdp_message_t* ret = tsk_null; if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); return tsk_null; } + + tsk_safeobj_lock(self); /* prepare the session manager if not already done (create all sessions) */ if(TSK_LIST_IS_EMPTY(self->sessions)){ if(_tmedia_session_mgr_load_sessions(self)){ TSK_DEBUG_ERROR("Failed to prepare the session manager"); - return tsk_null; + goto bail; } } @@ -783,17 +865,18 @@ const tsdp_message_t* tmedia_session_mgr_get_lo(tmedia_session_mgr_t* self) } if(self->sdp.lo){ - return self->sdp.lo; + ret = self->sdp.lo; + goto bail; } else if((self->sdp.lo = tsdp_message_create_empty(self->public_addr ? self->public_addr : self->addr, self->ipv6, self->sdp.lo_ver++))){ /* Set connection "c=" */ tsdp_message_add_headers(self->sdp.lo, - TSDP_HEADER_C_VA_ARGS("IN", self->ipv6 ? "IP6" : "IP4", self->public_addr ? self->public_addr : self->addr), + TSDP_HEADER_C_VA_ARGS("IN", self->ipv6 ? "IP6" : "IP4", self->public_addr ? self->public_addr : self->addr),//FIXME tsk_null); }else{ self->sdp.lo_ver--; TSK_DEBUG_ERROR("Failed to create empty SDP message"); - return tsk_null; + goto bail; } /* gets each "m=" line from the sessions and add them to the local sdp */ @@ -822,7 +905,11 @@ const tsdp_message_t* tmedia_session_mgr_get_lo(tmedia_session_mgr_t* self) } } - return self->sdp.lo; + ret = self->sdp.lo; + +bail: + tsk_safeobj_unlock(self); + return ret; } @@ -836,6 +923,7 @@ int tmedia_session_mgr_set_ro(tmedia_session_mgr_t* self, const tsdp_message_t* const tsdp_header_C_t* C; /* global "c=" line */ const tsdp_header_O_t* O; tsk_size_t index = 0; + tsk_size_t active_sessions_count = 0; int ret = 0; tsk_bool_t found; tsk_bool_t stopped_to_reconf = tsk_false; @@ -851,6 +939,8 @@ int tmedia_session_mgr_set_ro(tmedia_session_mgr_t* self, const tsdp_message_t* return -1; } + tsk_safeobj_lock(self); + had_ro_sdp = (self->sdp.ro != tsk_null); /* RFC 3264 subcaluse 8 @@ -862,13 +952,15 @@ int tmedia_session_mgr_set_ro(tmedia_session_mgr_t* self, const tsdp_message_t* if((O = (const tsdp_header_O_t*)tsdp_message_get_header(sdp, tsdp_htype_O))){ if(self->sdp.ro_ver == (int32_t)O->sess_version){ TSK_DEBUG_INFO("Remote offer has not changed"); - return 0; + ret = 0; + goto bail; } self->sdp.ro_ver = (int32_t)O->sess_version; } else{ TSK_DEBUG_ERROR("o= line is missing"); - return -2; + ret = -2; + goto bail; } /* This is to hack fake forking from ZTE => ignore SDP with loopback address in order to not start/stop the camera several @@ -903,7 +995,7 @@ int tmedia_session_mgr_set_ro(tmedia_session_mgr_t* self, const tsdp_message_t* if(self->started && ((!is_hold_resume && !is_loopback_address) || is_mediatype_changed)){ if((ret = tmedia_session_mgr_stop(self))){ TSK_DEBUG_ERROR("Failed to stop session manager"); - return ret; + goto bail; } stopped_to_reconf = tsk_true; } @@ -916,7 +1008,8 @@ int tmedia_session_mgr_set_ro(tmedia_session_mgr_t* self, const tsdp_message_t* * if network-initiated: think about tmedia_type_from_sdp() before creating the manager */ if(_tmedia_session_mgr_load_sessions(self)){ TSK_DEBUG_ERROR("Failed to prepare the session manager"); - return -3; + ret = -3; + goto bail; } /* get global connection line (common to all sessions) @@ -936,11 +1029,12 @@ int tmedia_session_mgr_set_ro(tmedia_session_mgr_t* self, const tsdp_message_t* /* set remote ro at session-level */ if((ret = _tmedia_session_set_ro(TMEDIA_SESSION(ms), M)) == 0){ found = tsk_true; + ++active_sessions_count; } else{ // will send 488 Not Acceptable TSK_DEBUG_WARN("_tmedia_session_set_ro() failed"); - return ret; + goto bail; } /* set QoS type (only if we are not the offerer) */ if(/*!self->offerer ==> we suppose that the remote party respected our demand &&*/ (qos_type == tmedia_qos_stype_none)){ @@ -981,11 +1075,16 @@ int tmedia_session_mgr_set_ro(tmedia_session_mgr_t* self, const tsdp_message_t* (tmedia_session_mgr_get_lo(self)); if((ret = tmedia_session_mgr_start(self))){ TSK_DEBUG_ERROR("Failed to re-start session manager"); - return ret; + goto bail; } } - return 0; + // will send [488 Not Acceptable] / [BYE] if no active session + ret = (active_sessions_count > 0) ? 0 : -0xFF; + +bail: + tsk_safeobj_unlock(self); + return ret; } /**@ingroup tmedia_session_group @@ -1339,7 +1438,12 @@ int _tmedia_session_mgr_load_sessions(tmedia_session_mgr_t* self) while((i < TMED_SESSION_MAX_PLUGINS) && (plugin = __tmedia_session_plugins[i++])){ if((plugin->type & self->type) == plugin->type && !has_media(plugin->type)){// we don't have a session with this media type yet if((session = tmedia_session_create(plugin->type))){ + struct tnet_ice_ctx_s * ctx_ice = (plugin->type == tmedia_audio ? self->ice.ctx_audio : (plugin->type == tmedia_video ? self->ice.ctx_video : tsk_null)); tsk_list_push_back_data(self->sessions, (void**)(&session)); + // set ICE context for the new session + tmedia_session_mgr_set(self, + TMEDIA_SESSION_SET_POBJECT(plugin->type, "ice-ctx", ctx_ice), + TMEDIA_SESSION_SET_NULL()); } } else if(!(plugin->type & self->type) && has_media(plugin->type)){// we have media session from previous call (before update) @@ -1351,7 +1455,7 @@ int _tmedia_session_mgr_load_sessions(tmedia_session_mgr_t* self) TMEDIA_SESSION_SET_STR(self->type, "local-ip", self->addr), TMEDIA_SESSION_SET_STR(self->type, "local-ipver", self->ipv6 ? "ipv6" : "ipv4"), TMEDIA_SESSION_SET_INT32(self->type, "bandwidth-level", self->bl), - TMEDIA_SESSION_SET_NULL()); + TMEDIA_SESSION_SET_NULL()); /* load params */ _tmedia_session_mgr_apply_params(self); @@ -1403,7 +1507,7 @@ int _tmedia_session_mgr_apply_params(tmedia_session_mgr_t* self) if(!(session = it2->data) || !session->plugin){ continue; } - if((session->type & param->media_type) == session->type && session->plugin->set){ + if(session->plugin->set && (session->type & param->media_type) == session->type){ session->plugin->set(session, param); } } @@ -1432,6 +1536,8 @@ static tsk_object_t* tmedia_session_mgr_ctor(tsk_object_t * self, va_list * app) mgr->qos.type = tmedia_qos_stype_none; mgr->qos.strength = tmedia_qos_strength_optional; mgr->bl = tmedia_defaults_get_bl(); + + tsk_safeobj_init(mgr); } return self; } @@ -1450,7 +1556,12 @@ static tsk_object_t* tmedia_session_mgr_dtor(tsk_object_t * self) TSK_OBJECT_SAFE_FREE(mgr->natt_ctx); TSK_FREE(mgr->public_addr); + TSK_OBJECT_SAFE_FREE(mgr->ice.ctx_audio); + TSK_OBJECT_SAFE_FREE(mgr->ice.ctx_video); + TSK_FREE(mgr->addr); + + tsk_safeobj_deinit(mgr); } return self; diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_session_dummy.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_session_dummy.c index 647a681e..cd241e43 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia_session_dummy.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_session_dummy.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_session_dummy.c * @brief Dummy sessions used for test only. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_session_ghost.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_session_ghost.c index e34b8fa3..5426e73e 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia_session_ghost.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_session_ghost.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tmedia_session_ghost.c * @brief Ghost session. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyMEDIA/test/test.c b/branches/2.0/doubango/tinyMEDIA/test/test.c index 8235bd24..4efee71a 100644 --- a/branches/2.0/doubango/tinyMEDIA/test/test.c +++ b/branches/2.0/doubango/tinyMEDIA/test/test.c @@ -26,6 +26,7 @@ #include "test_codecs.h" #include "test_sessions.h" +#include "test_image_attr.h" #include "test_qos.h" #include "test_contents.h" @@ -35,11 +36,14 @@ #define RUN_TEST_CODECS 0 #define RUN_TEST_SESSIONS 0 #define RUN_TEST_QOS 0 -#define RUN_TEST_CONTENTS 1 +#define RUN_TEST_IMAGEATTR 1 +#define RUN_TEST_CONTENTS 0 + static void test_register_dummy_plugins(); static void test_register_contents_plugins(); + #ifdef _WIN32_WCE int _tmain(int argc, _TCHAR* argv[]) #else @@ -65,6 +69,10 @@ int main() test_qos(); #endif +#if RUN_TEST_ALL || RUN_TEST_IMAGEATTR + test_qos_imageattr(); +#endif + #if RUN_TEST_ALL || RUN_TEST_CONTENTS test_contents(); #endif diff --git a/branches/2.0/doubango/tinyMEDIA/test/test.vcproj b/branches/2.0/doubango/tinyMEDIA/test/test.vcproj index 94a78512..8b9ca187 100644 --- a/branches/2.0/doubango/tinyMEDIA/test/test.vcproj +++ b/branches/2.0/doubango/tinyMEDIA/test/test.vcproj @@ -41,7 +41,7 @@ + + diff --git a/branches/2.0/doubango/tinyMEDIA/test/test_image_attr.h b/branches/2.0/doubango/tinyMEDIA/test/test_image_attr.h new file mode 100644 index 00000000..f79ae48c --- /dev/null +++ b/branches/2.0/doubango/tinyMEDIA/test/test_image_attr.h @@ -0,0 +1,54 @@ +/* +* Copyright (C) 20012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#ifndef _TEST_IMG_ATTR_H_ +#define _TEST_IMG_ATTR_H_ + +static const char* __test_imageattrs[] = +{ + "send [x=800,y=640,sar=1.1,q=0.6] [x=480,y=320] recv [x=330,y=250]", + "recv [x=800,y=640,sar=1.1] send [x=330,y=250]", + "recv [x=800,y=640,sar=1.1] send [x=[320:16:640],y=[240:16:480],par=[1.2-1.3]]", + "send [x=[480:16:800],y=[320:16:640],par=[1.2-1.3],q=0.6] [x=[176:8:208],y=[144:8:176],par=[1.2-1.3]] recv *", + "send [x=176,y=144] [x=224,y=176] [x=272,y=224] [x=320,y=240] recv [x=176,y=144] [x=224,y=176] [x=272,y=224,q=0.6] [x=320,y=240]", + "send [x=320,y=240]", + "recv [x=320,y=240]", + "send [x=[400:16:800],y=[320:16:640],sar=[1.0-1.3],par=[1.2-1.3]] recv [x=800,y=600,sar=1.1]", + "recv [x=464,y=384,sar=1.15] send [x=800,y=600,sar=1.1]" +}; + +void test_qos_imageattr() +{ + tsk_size_t i; + tmedia_imageattr_xt imageattr; + for(i = 0; i < sizeof(__test_imageattrs)/sizeof(__test_imageattrs[0]); ++i){ + if(tmedia_imageattr_parse(&imageattr, __test_imageattrs[i], tsk_strlen(__test_imageattrs[i])) == 0){ + TSK_DEBUG_INFO("image-attr parsed (OK): %s", __test_imageattrs[i]); + } + else{ + TSK_DEBUG_ERROR("image-attr parsed (NOK): %s", __test_imageattrs[i]); + } + } +} + + + +#endif /* _TEST_IMG_ATTR_H_ */ diff --git a/branches/2.0/doubango/tinyMEDIA/test/test_sessions.h b/branches/2.0/doubango/tinyMEDIA/test/test_sessions.h index 08075111..85bcd198 100644 --- a/branches/2.0/doubango/tinyMEDIA/test/test_sessions.h +++ b/branches/2.0/doubango/tinyMEDIA/test/test_sessions.h @@ -185,7 +185,7 @@ void test_sessions_hold_resume() ); /* resume */ - tmedia_session_mgr_resume(mgr, type); + tmedia_session_mgr_resume(mgr, type, tsk_true); sdp_lo = tmedia_session_mgr_get_lo(mgr); if((temp = tsdp_message_tostring(sdp_lo))){ TSK_DEBUG_INFO("sdp_lo(resume)=%s", temp); diff --git a/branches/2.0/doubango/tinyMEDIA/tinyMEDIA.vcproj b/branches/2.0/doubango/tinyMEDIA/tinyMEDIA.vcproj index 57e2dc35..677b4b25 100644 --- a/branches/2.0/doubango/tinyMEDIA/tinyMEDIA.vcproj +++ b/branches/2.0/doubango/tinyMEDIA/tinyMEDIA.vcproj @@ -215,6 +215,10 @@ RelativePath=".\include\tinymedia\tmedia_denoise.h" > + + @@ -305,6 +309,10 @@ RelativePath=".\src\tmedia_denoise.c" > + + @@ -369,6 +377,10 @@ RelativePath=".\ragel\tmedia_content_cpim.rl" > + + diff --git a/branches/2.0/doubango/tinyNET/droid-makefile b/branches/2.0/doubango/tinyNET/droid-makefile index 29319283..162abbdd 100644 --- a/branches/2.0/doubango/tinyNET/droid-makefile +++ b/branches/2.0/doubango/tinyNET/droid-makefile @@ -63,8 +63,11 @@ OBJS += src/dns/tnet_dns.o\ ################### ## ICE ################### -OBJS += src/ice/tnet_ice.o - +OBJS += src/ice/tnet_ice_candidate.o \ + src/ice/tnet_ice_ctx.o \ + src/ice/tnet_ice_event.o \ + src/ice/tnet_ice_pair.o \ + src/ice/tnet_ice_utils.o ################### ## STUN ################### diff --git a/branches/2.0/doubango/tinyNET/ragel/tnet_dns_regexp.rl b/branches/2.0/doubango/tinyNET/ragel/tnet_dns_regexp.rl index 25e31ef2..296bc1a5 100644 --- a/branches/2.0/doubango/tinyNET/ragel/tnet_dns_regexp.rl +++ b/branches/2.0/doubango/tinyNET/ragel/tnet_dns_regexp.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_regexp.h * @brief DNS Regex parser for NAPTR RR. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -141,7 +141,7 @@ bail: ///* //* Copyright (C) 2010-2011 Mamadou Diop. //* -//* Contact: Mamadou Diop +//* Contact: Mamadou Diop //* //* This file is part of Open Source Doubango Framework. //* @@ -162,7 +162,7 @@ bail: ///**@file tnet_dns_regexp.h // * @brief DNS Regex parser for NAPTR RR. // * -// * @author Mamadou Diop +// * @author Mamadou Diop // * // // */ diff --git a/branches/2.0/doubango/tinyNET/ragel/tnet_dns_resolvconf.rl b/branches/2.0/doubango/tinyNET/ragel/tnet_dns_resolvconf.rl index d137f064..bbd93f78 100644 --- a/branches/2.0/doubango/tinyNET/ragel/tnet_dns_resolvconf.rl +++ b/branches/2.0/doubango/tinyNET/ragel/tnet_dns_resolvconf.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_resolvconf.c * @brief Parser for "/etc/resolv.conf" file to retrive DNS servers. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp.c b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp.c index 40a23e12..c17bb434 100644 --- a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp.c +++ b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ * @brief DHCP/BOOTP (RFC 2131 - Dynamic Host Configuration Protocol) utilities function for P-CSCF discovery(RFC 3319 and 3361). * Also implement: RFC 3315, 3118, 3319, 3825 (Geoconf), 4676 (Civic Addresses Configuration Information) ... * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp.h b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp.h index 15211bfa..9572641b 100644 --- a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp.h +++ b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ * @brief DHCP (RFC 2131 - Dynamic Host Configuration Protocol) utilities function for P-CSCF discovery(RFC 3319 and 3361) * Also implement: RFC 3315, 3118, 3319, 3825 (Geoconf), 4676 (Civic Addresses Configuration Information)... * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_message.c b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_message.c index b97eefbb..4b307d1f 100644 --- a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_message.c +++ b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_message.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dhcp_message.c * @brief DHCP Message as per RFC 2131 subclause 2. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_message.h b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_message.h index 9261824c..c7005fac 100644 --- a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_message.h +++ b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_message.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dhcp_message.h * @brief DHCP Message as per RFC 2131 subclause 2. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_option.c b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_option.c index ee65fa8b..4f91a0aa 100644 --- a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_option.c +++ b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_option.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dhcp_option.c * @brief DHCP Options and BOOTP Vendor Extensions as per RFC 2132. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_option.h b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_option.h index a424e3a4..8e892c2e 100644 --- a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_option.h +++ b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_option.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dhcp_option.h * @brief DHCP Options and BOOTP Vendor Extensions as per RFC 2132. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_option_sip.c b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_option_sip.c index 2f3e29b7..079e0d49 100644 --- a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_option_sip.c +++ b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_option_sip.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ * @brief Dynamic Host Configuration Protocol (DHCP-for-IPv4) Option for * Session Initiation Protocol (SIP) Servers as per RFC 3361. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_option_sip.h b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_option_sip.h index d2cc0e18..a9d65c5d 100644 --- a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_option_sip.h +++ b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp_option_sip.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ * @brief Dynamic Host Configuration Protocol (DHCP-for-IPv4) Option for * Session Initiation Protocol (SIP) Servers as per RFC 3361. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6.c b/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6.c index d8f72ae4..309b90c9 100644 --- a/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6.c +++ b/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ * @brief Dynamic Host Configuration Protocol for IPv6 (DHCPv6) as per RFC 3315. * Also implement: RFC 3319, 3633, 3646, 3736, 4242, 5007 ... * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6.h b/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6.h index 38683b4d..259e7f5a 100644 --- a/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6.h +++ b/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ * @brief Dynamic Host Configuration Protocol for IPv6 (DHCPv6) as per RFC 3315. * Also implement: RFC 3319, 3633, 3646, 3736, 4242, 5007 ... * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_duid.c b/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_duid.c index e9c230d8..38f2a52d 100644 --- a/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_duid.c +++ b/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_duid.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dhcp6_duid.c * @brief DHCPv6 (RFC 3315) DHCP Unique Identifier (DUID) as defined in subclause 9. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_duid.h b/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_duid.h index 7a42c902..83389202 100644 --- a/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_duid.h +++ b/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_duid.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dhcp6_duid.h * @brief DHCPv6 (RFC 3315) DHCP Unique Identifier (DUID) as defined in subclause 9. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_message.c b/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_message.c index 76abc3d4..b231c857 100644 --- a/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_message.c +++ b/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_message.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dhcp6_message.c * @brief DHCPv6 (RFC 3315) Messages. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_message.h b/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_message.h index f00737bd..1d48e615 100644 --- a/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_message.h +++ b/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_message.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dhcp6_message.h * @brief DHCPv6 (RFC 3315) Messages. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_option.c b/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_option.c index 4c3b13fb..b8dfc3fb 100644 --- a/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_option.c +++ b/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_option.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dhcp6_option.c * @brief DHCPv6 Options as per RFC 3315 subclause 22. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_option.h b/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_option.h index 48fa3561..b69666e3 100644 --- a/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_option.h +++ b/branches/2.0/doubango/tinyNET/src/dhcp6/tnet_dhcp6_option.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dhcp6_option.h * @brief DHCPv6 Options as per RFC 3315 subclause 22. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns.c b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns.c index 9e3d8e9a..9c63ca8a 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns.c +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns.c * @brief DNS utility functions (RFCS [1034 1035] [3401 3402 3403 3404] [3761]). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns.h b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns.h index ebffb1f6..c1be501e 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns.h +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns.h * @brief DNS utilities functions (RFCS [1034 1035] [2671] [3401 3402 3403 3404] [3761]). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_a.c b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_a.c index 0ece58f8..b6553cce 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_a.c +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_a.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_a.c * @brief DNS Address record - RR - (RFC 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_a.h b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_a.h index c47a6f0f..752fdefa 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_a.h +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_a.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_a.h * @brief DNS Address record - RR - (RFC 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_aaaa.c b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_aaaa.c index f8129cba..0a6d5e0e 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_aaaa.c +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_aaaa.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_aaaA.c * @brief DNS IPv6 address record - RR - (RFC 3596). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_aaaa.h b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_aaaa.h index 989b4182..37703e73 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_aaaa.h +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_aaaa.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_aaaa.h * @brief DNS IPv6 address record - RR - (RFC 3596). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_cname.c b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_cname.c index cff710e8..9462ba71 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_cname.c +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_cname.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_cname.c * @brief DNS Mail eXchange record - RR - (RFC 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_cname.h b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_cname.h index ebf726ba..3f47ec3d 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_cname.h +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_cname.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_cname.h * @brief DNS Mail eXchange record - RR - (RFC 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_message.c b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_message.c index bd5441c1..28b7898d 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_message.c +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_message.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_message.h * @brief DNS Message holding RRs (RFC 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_message.h b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_message.h index 4285d3ae..ea716757 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_message.h +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_message.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_message.h * @brief DNS Message holding RRs (RFC 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_mx.c b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_mx.c index 238c36bd..46321295 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_mx.c +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_mx.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_mx.c * @brief DNS Mail eXchange record - RR - (RFC 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_mx.h b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_mx.h index 2d6478a5..23b31df7 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_mx.h +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_mx.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_mx.h * @brief DNS Mail eXchange record - RR - (RFC 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_naptr.c b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_naptr.c index 90747748..e74c86af 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_naptr.c +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_naptr.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_naptr.c * @brief DNS Naming Authority Pointer - RR - (RFC 3403). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_naptr.h b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_naptr.h index b7695522..ac89c087 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_naptr.h +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_naptr.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_naptr.h * @brief DNS Naming Authority Pointer - RR - (RFC 3403). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_ns.c b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_ns.c index 1377cb83..b9475802 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_ns.c +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_ns.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_ns.c * @brief DNS Name Server record - RR - (RFC 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_ns.h b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_ns.h index 2721ba1d..530b2b1a 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_ns.h +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_ns.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_ns.h * @brief DNS Name Server record - RR - (RFC 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_opt.c b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_opt.c index 86977dc0..b6579f56 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_opt.c +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_opt.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_opt.c * @brief DNS OPT pseudo-RR (RFC 2671). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_opt.h b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_opt.h index 16e2cc67..ef9779dc 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_opt.h +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_opt.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_opt.h * @brief DNS OPT pseudo-RR (RFC 2671). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_ptr.c b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_ptr.c index 01078446..41c705b9 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_ptr.c +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_ptr.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_ptr.c * @brief DNS Pointer record - RR - (RFC 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_ptr.h b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_ptr.h index 871d232b..a7fb2e5e 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_ptr.h +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_ptr.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_ptr.h * @brief DNS Pointer record - RR - (RFC 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_regexp.c b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_regexp.c index 42592132..468960f1 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_regexp.c +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_regexp.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tnet_dns_regexp.h * @brief DNS Regex parser for NAPTR RR. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -298,7 +298,7 @@ bail: ///* //* Copyright (C) 2010-2011 Mamadou Diop. //* -//* Contact: Mamadou Diop +//* Contact: Mamadou Diop //* //* This file is part of Open Source Doubango Framework. //* @@ -319,7 +319,7 @@ bail: ///**@file tnet_dns_regexp.h // * @brief DNS Regex parser for NAPTR RR. // * -// * @author Mamadou Diop +// * @author Mamadou Diop // * // // */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_regexp.h b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_regexp.h index 2a028da9..c3fcd292 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_regexp.h +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_regexp.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_regexp.h * @brief DNS Regexp parser for NAPTR RR. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_resolvconf.c b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_resolvconf.c index 4a45cada..bce14cf6 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_resolvconf.c +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_resolvconf.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tnet_dns_resolvconf.c * @brief Parser for "/etc/resolv.conf" file to retrive DNS servers. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_resolvconf.h b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_resolvconf.h index dff817d4..763b52fb 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_resolvconf.h +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_resolvconf.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_resolvconf.h * @brief Parser for "/etc/resolv.conf" file to retrive DNS servers. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_rr.c b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_rr.c index 0842c145..8f3d92d2 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_rr.c +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_rr.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_rr.c * @brief DNS Resource Record (RFC 1034 and 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_rr.h b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_rr.h index ff1f80da..002aa746 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_rr.h +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_rr.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_rr.h * @brief DNS Resource Record (RFCS 1034 and 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_soa.c b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_soa.c index f3b6aea7..977676a0 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_soa.c +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_soa.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_soa.c * @brief DNS Start Of Authority record - RR - (RFC 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_soa.h b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_soa.h index d687b6a8..b38c6372 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_soa.h +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_soa.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_soa.h * @brief DNS Start Of Authority record - RR - (RFC 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_srv.c b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_srv.c index ca845a48..97e4e23f 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_srv.c +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_srv.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_srv.c * @brief DNS SeRVice locator record - RR - (RFC 2782). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_srv.h b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_srv.h index cefd93e4..493326ce 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_srv.h +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_srv.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_srv.h * @brief DNS SeRVice locator record - RR - (RFC 2782). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_txt.c b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_txt.c index aa852977..eaa9dfa8 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_txt.c +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_txt.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_txt.c * @brief DNS TeXT record - RR - (RFC 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_txt.h b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_txt.h index de198699..1e158a20 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_txt.h +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_txt.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_dns_txt.h * @brief DNS TeXT record - RR - (RFC 1035). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_candidate.c b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_candidate.c new file mode 100644 index 00000000..45f68b04 --- /dev/null +++ b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_candidate.c @@ -0,0 +1,618 @@ +/* +* Copyright (C) 2012 Doubango Telecom . +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#include "tnet_ice_candidate.h" +#include "tnet_ice_utils.h" +#include "tnet_utils.h" + +#include "tsk_md5.h" +#include "tsk_memory.h" +#include "tsk_list.h" +#include "tsk_string.h" +#include "tsk_debug.h" + +static int _tnet_ice_candidate_tostring( + uint8_t* foundation, + uint32_t comp_id, + const char* transport_str, + uint32_t priority, + const char* connection_addr, + tnet_port_t port, + const char* cand_type_str, + const tsk_params_L_t *extension_att_list, + char** output); +static const char* _tnet_ice_candidate_get_foundation(tnet_ice_cand_type_t type); +static tnet_stun_message_t * _tnet_ice_candidate_stun_create_bind_request(tnet_ice_candidate_t* self, const char* username, const char* password); +static tsk_bool_t _tnet_ice_candidate_stun_transac_id_equals(const tnet_stun_transacid_t id1, const tnet_stun_transacid_t id2); +static int _tnet_ice_candidate_stun_address_tostring(const uint8_t in_ip[16], tnet_stun_addr_family_t family, char** out_ip); +static const char* _tnet_ice_candidate_get_transport_str(tnet_socket_type_t transport_e); +static tnet_socket_type_t _tnet_ice_candidate_get_transport_type(tsk_bool_t ipv6, const char* transport_str); +static const char* _tnet_ice_candidate_get_candtype_str(tnet_ice_cand_type_t candtype_e); +static tnet_ice_cand_type_t _tnet_ice_candtype_get_transport_type(const char* candtype_str); + +static tsk_object_t* tnet_ice_candidate_ctor(tsk_object_t * self, va_list * app) +{ + tnet_ice_candidate_t *candidate = self; + if(candidate){ + candidate->extension_att_list = tsk_list_create(); + } + return self; +} + +static tsk_object_t* tnet_ice_candidate_dtor(tsk_object_t * self) +{ + tnet_ice_candidate_t *candidate = self; + if(candidate){ + TSK_SAFE_FREE(candidate->transport_str); + TSK_SAFE_FREE(candidate->cand_type_str); + TSK_OBJECT_SAFE_FREE(candidate->extension_att_list); + TSK_OBJECT_SAFE_FREE(candidate->socket); + + TSK_SAFE_FREE(candidate->stun.nonce); + TSK_SAFE_FREE(candidate->stun.realm); + TSK_SAFE_FREE(candidate->stun.srflx_addr); + + TSK_SAFE_FREE(candidate->ufrag); + TSK_SAFE_FREE(candidate->pwd); + + TSK_SAFE_FREE(candidate->tostring); + } + return self; +} + +static int tnet_ice_candidate_cmp(const tsk_object_t *_s1, const tsk_object_t *_s2) +{ + const tnet_ice_candidate_t *c1 = _s1; + const tnet_ice_candidate_t *c2 = _s2; + + if(c1 && c2){ + return (c2 - c1); + } + else if(!c1 && !c2) return 0; + else return -1; +} + +static const tsk_object_def_t tnet_ice_candidate_def_s = +{ + sizeof(tnet_ice_candidate_t), + tnet_ice_candidate_ctor, + tnet_ice_candidate_dtor, + tnet_ice_candidate_cmp, +}; + +tnet_ice_candidate_t* tnet_ice_candidate_create(tnet_ice_cand_type_t type_e, tnet_socket_t* socket, tsk_bool_t is_ice_jingle, tsk_bool_t is_rtp, tsk_bool_t is_video, const char* ufrag, const char* pwd) +{ + tnet_ice_candidate_t* candidate; + const char *foundation; + + if(!(candidate = tsk_object_new(&tnet_ice_candidate_def_s))){ + TSK_DEBUG_ERROR("Failed to create candidate"); + return tsk_null; + } + + foundation = _tnet_ice_candidate_get_foundation(type_e); + + candidate->transport_e = socket->type; + candidate->type_e = type_e; + candidate->socket = tsk_object_ref(socket); + candidate->local_pref = 0xFFFF; + candidate->is_ice_jingle = is_ice_jingle; + candidate->is_rtp = is_rtp; + candidate->is_video = is_video; + candidate->comp_id = is_rtp ? TNET_ICE_CANDIDATE_COMPID_RTP : TNET_ICE_CANDIDATE_COMPID_RTCP; + memcpy(candidate->foundation, foundation, TSK_MIN(sizeof(candidate->foundation), tsk_strlen(foundation))); + candidate->priority = tnet_ice_utils_get_priority(candidate->type_e, candidate->local_pref, candidate->is_rtp); + if(candidate->socket){ + memcpy(candidate->connection_addr, candidate->socket->ip, sizeof(candidate->socket->ip)); + candidate->port = candidate->socket->port; + } + tnet_ice_candidate_set_credential(candidate, ufrag, pwd); + + return candidate; +} + +// @param str e.g. "1 1 udp 1 192.168.196.1 57806 typ host name video_rtcp network_name {0C0137CC-DB78-46B6-9B6C-7E097FFA79FE} username StFEVThMK2DHThkv password qkhKUDr4WqKRwZTo generation 0" +tnet_ice_candidate_t* tnet_ice_candidate_parse(const char* str) +{ + char *v, *copy; + int32_t k; + tnet_ice_candidate_t* candidate; + + if(tsk_strnullORempty(str)){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + if(!(candidate = tsk_object_new(&tnet_ice_candidate_def_s))){ + TSK_DEBUG_ERROR("Failed to create candidate"); + return tsk_null; + } + + k = 0; + copy = tsk_strdup(str); + v = strtok(copy, " "); + + while(v){ + switch(k){ + case 0: + { + memcpy(candidate->foundation, v, TSK_MIN(tsk_strlen(v), sizeof(candidate->foundation))); + break; + } + case 1: + { + candidate->comp_id = atoi(v); + break; + } + case 2: + { + candidate->transport_str = tsk_strdup(v); + break; + } + case 3: + { + candidate->priority = atoi(v); + break; + } + case 4: + { + memcpy(candidate->connection_addr, v, TSK_MIN(tsk_strlen(v), sizeof(candidate->connection_addr))); + break; + } + case 5: + { + tnet_family_t family; + candidate->port = atoi(v); + family = tnet_get_family(candidate->connection_addr, candidate->port); + candidate->transport_e = _tnet_ice_candidate_get_transport_type((family == AF_INET6), candidate->transport_str); + break; + } + case 6: + { + v = strtok(tsk_null, " "); + tsk_strupdate(&candidate->cand_type_str, v); + candidate->type_e = _tnet_ice_candtype_get_transport_type(v); + break; + } + default: + { + const char* name = v; + const char* value = (v = strtok(tsk_null, " ")); + tsk_param_t* param = tsk_param_create(name, value); + if(param){ + tsk_list_push_back_data(candidate->extension_att_list, (void**)¶m); + } + break; + } + } + + ++k; + v = strtok(tsk_null, " "); + } + + if(k < 6){ + TSK_DEBUG_ERROR("Failed to parse: %s", str); + TSK_OBJECT_SAFE_FREE(candidate); + } + TSK_FREE(copy); + + return candidate; +} + +int tnet_ice_candidate_set_credential(tnet_ice_candidate_t* self, const char* ufrag, const char* pwd) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + tsk_strupdate(&self->ufrag, ufrag); + tsk_strupdate(&self->pwd, pwd); + + return 0; +} + +int tnet_ice_candidate_set_rflx_addr(tnet_ice_candidate_t* self, const char* addr, tnet_port_t port) +{ + if(!self || !addr || !port){ + TSK_DEBUG_ERROR("Invalid argument"); + return -1; + } + memset(self->connection_addr, 0, sizeof(self->connection_addr)); + memcpy(self->connection_addr, addr, TSK_MIN(tsk_strlen(addr), sizeof(self->connection_addr))); + self->port = port; + return 0; +} + +const char* tnet_ice_candidate_get_att_value(const tnet_ice_candidate_t* self, const char* att_name) +{ + if(!self || !att_name){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + return tsk_params_get_param_value(self->extension_att_list, att_name); +} + +int tnet_ice_candidate_set_local_pref(tnet_ice_candidate_t* self, uint16_t local_pref) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + self->local_pref = local_pref; + self->priority = tnet_ice_utils_get_priority(self->type_e, self->local_pref, self->is_rtp); + return 0; +} + +const char* tnet_ice_candidate_tostring(tnet_ice_candidate_t* self) +{ + char* _transport_str; + char __str[16]; // always allocated: bad idea :( + + if(!self){ + TSK_DEBUG_ERROR("Invalid argument"); + return tsk_null; + } + + _transport_str = self->transport_str ? self->transport_str : _tnet_ice_candidate_get_transport_str(self->transport_e); + if(self->is_ice_jingle){ + tsk_size_t i, s = tsk_strlen(_transport_str); + memset(__str, 0, sizeof(__str)); + for(i = 0; i < s && i < sizeof(__str)/sizeof(__str[0]); ++i){ + __str[i] = tolower(_transport_str[i]); + } + _transport_str = &__str[0]; + } + + _tnet_ice_candidate_tostring( + self->foundation, + self->comp_id, + _transport_str, + self->priority, + (tsk_strnullORempty(self->connection_addr) && self->socket) ? self->socket->ip : self->connection_addr, + (self->port <= 0 && self->socket) ? self->socket->port : self->port, + self->cand_type_str ? self->cand_type_str : _tnet_ice_candidate_get_candtype_str(self->type_e), + self->extension_att_list, + &self->tostring); + + // WebRTC (Chrome) specific + if(self->is_ice_jingle){ + if(!tsk_params_have_param(self->extension_att_list, "name")){ + tsk_strcat_2(&self->tostring, " name %s", self->is_rtp ? (self->is_video ? "video_rtp" : "rtp") : (self->is_video ? "video_rtcp" : "rtcp")); + } + if(!tsk_params_have_param(self->extension_att_list, "username")){ + tsk_strcat_2(&self->tostring, " username %s", self->ufrag); + } + if(!tsk_params_have_param(self->extension_att_list, "password")){ + tsk_strcat_2(&self->tostring, " password %s", self->pwd); + } + if(!tsk_params_have_param(self->extension_att_list, "network_name")){ + tsk_strcat_2(&self->tostring, " network_name %s", "{9EBBE687-CCE6-42D3-87F5-B57BB30DEE23}"); + } + if(!tsk_params_have_param(self->extension_att_list, "generation")){ + tsk_strcat_2(&self->tostring, " generation %s", "0"); + } + } + + return self->tostring; +} + +int tnet_ice_candidate_send_stun_bind_request(tnet_ice_candidate_t* self, struct sockaddr_storage* server_addr, const char* username, const char* password) +{ + tnet_stun_message_t *request = tsk_null; + tsk_buffer_t *buffer = tsk_null; + int ret, sendBytes; + + if(!self || !server_addr || !TNET_SOCKET_IS_VALID(self->socket)){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + request = _tnet_ice_candidate_stun_create_bind_request(self, username, password); + if(!request){ + TSK_DEBUG_ERROR("Failed to create STUN request"); + ret = -2; + goto bail; + } + + if(!(buffer = tnet_stun_message_serialize(request))){ + TSK_DEBUG_ERROR("Failed to serialize STUN request"); + ret = -3; + goto bail; + } + + sendBytes = tnet_sockfd_sendto(self->socket->fd, (const struct sockaddr*)server_addr, buffer->data, buffer->size);// return number of sent bytes + if(sendBytes == buffer->size){ + memcpy(self->stun.transac_id, request->transaction_id, sizeof(tnet_stun_transacid_t)); + ret = 0; + } + else{ + TSK_DEBUG_ERROR("Only %d bytes sent", sendBytes); + ret = -4; + goto bail; + } + +bail: + TSK_OBJECT_SAFE_FREE(request); + TSK_OBJECT_SAFE_FREE(buffer); + + return 0; +} + +int tnet_ice_candidate_process_stun_response(tnet_ice_candidate_t* self, const tnet_stun_response_t* response, tnet_fd_t fd) +{ + int ret = 0; + + if(!self || !response){ + TSK_DEBUG_ERROR("Inavlid parameter"); + return -1; + } + + //if(!(_tnet_ice_candidate_stun_transac_id_equals(response->transaction_id, self->stun.transac_id))){ + // TSK_DEBUG_ERROR("Transaction id mismatch"); + // return -2; + //} + + if(TNET_STUN_RESPONSE_IS_ERROR(response)){ + short code = tnet_stun_message_get_errorcode(response); + const char* realm = tnet_stun_message_get_realm(response); + const char* nonce = tnet_stun_message_get_nonce(response); + + if(code == 401 && realm && nonce){ + if(!self->stun.nonce){ + /* First time we get a nonce */ + tsk_strupdate(&self->stun.nonce, nonce); + tsk_strupdate(&self->stun.realm, realm); + return 0; + } + else{ + TSK_DEBUG_ERROR("Authentication failed"); + return -3; + } + } + else{ + TSK_DEBUG_ERROR("STUN error: %hi", code); + return -4; + } + } + else if(TNET_STUN_RESPONSE_IS_SUCCESS(response)){ + const tnet_stun_attribute_t *attribute; + + if((attribute = tnet_stun_message_get_attribute(response, stun_xor_mapped_address))){ + const tnet_stun_attribute_xmapped_addr_t *xmaddr = (const tnet_stun_attribute_xmapped_addr_t *)attribute; + _tnet_ice_candidate_stun_address_tostring(xmaddr->xaddress, xmaddr->family, &self->stun.srflx_addr); + self->stun.srflx_port = xmaddr->xport; + } + else if((attribute = tnet_stun_message_get_attribute(response, stun_mapped_address))){ + const tnet_stun_attribute_mapped_addr_t *maddr = (const tnet_stun_attribute_mapped_addr_t *)attribute; + ret = _tnet_ice_candidate_stun_address_tostring(maddr->address, maddr->family, &self->stun.srflx_addr); + self->stun.srflx_port = maddr->port; + } + } + + return ret; +} + +const tnet_ice_candidate_t* tnet_ice_candidate_find_by_fd(tnet_ice_candidates_L_t* candidates, tnet_fd_t fd) +{ + if(candidates){ + const tsk_list_item_t *item; + const tnet_ice_candidate_t* candidate; + + tsk_list_lock(candidates); + tsk_list_foreach(item, candidates){ + if(!(candidate = item->data)){ + continue; + } + if(candidate->socket && (candidate->socket->fd == fd)){ + tsk_list_unlock(candidates); + return candidate; + } + } + } + + return tsk_null; +} + +const char* tnet_ice_candidate_get_ufrag(const tnet_ice_candidate_t* self) +{ + if(self){ + return self->ufrag ? self->ufrag : tnet_ice_candidate_get_att_value(self, "username"); + } + return tsk_null; +} + +const char* tnet_ice_candidate_get_pwd(const tnet_ice_candidate_t* self) +{ + if(self){ + return self->pwd ? self->pwd : tnet_ice_candidate_get_att_value(self, "password"); + } + return tsk_null; +} + +static int _tnet_ice_candidate_tostring( + uint8_t* foundation, + uint32_t comp_id, + const char* transport_str, + uint32_t priority, + const char* connection_addr, + tnet_port_t port, + const char* cand_type_str, + const tsk_params_L_t *extension_att_list, + char** output) +{ + if(!output){ + TSK_DEBUG_ERROR("Invalid argument"); + return -1; + } + tsk_sprintf(output, "%s %d %s %d %s %d typ %s", + foundation, + comp_id, + transport_str, + priority, + connection_addr, + port, + cand_type_str); + + if(extension_att_list){ + const tsk_list_item_t *item; + tsk_list_foreach(item, extension_att_list){ + tsk_strcat_2(output, " %s %s", TSK_PARAM(item->data)->name, TSK_PARAM(item->data)->value); + } + } + return 0; +} + +static const char* _tnet_ice_candidate_get_foundation(tnet_ice_cand_type_t type) +{ + switch(type){ + case tnet_ice_cand_type_host: return TNET_ICE_CANDIDATE_FOUNDATION_HOST; + case tnet_ice_cand_type_srflx: return TNET_ICE_CANDIDATE_FOUNDATION_SRFLX; + case tnet_ice_cand_type_prflx: return TNET_ICE_CANDIDATE_FOUNDATION_PRFLX; + case tnet_ice_cand_type_relay: default: return TNET_ICE_CANDIDATE_FOUNDATION_RELAY; + } +} + + +static tsk_bool_t _tnet_ice_candidate_stun_transac_id_equals(const tnet_stun_transacid_t id1, const tnet_stun_transacid_t id2) +{ + tsk_size_t i; + static const tsk_size_t size = sizeof(tnet_stun_transacid_t); + for(i = 0; i < size; i++){ + if(id1[i] != id2[i]){ + return tsk_false; + } + } + return tsk_true; +} + +static int _tnet_ice_candidate_stun_address_tostring(const uint8_t in_ip[16], tnet_stun_addr_family_t family, char** out_ip) +{ + if(family == stun_ipv6){ + tsk_sprintf(out_ip, "%x:%x:%x:%x:%x:%x:%x:%x", + TSK_TO_UINT16(&in_ip[0]), TSK_TO_UINT16(&in_ip[2]), TSK_TO_UINT16(&in_ip[4]), TSK_TO_UINT16(&in_ip[6]), + TSK_TO_UINT16(&in_ip[8]), TSK_TO_UINT16(&in_ip[10]), TSK_TO_UINT16(&in_ip[12]), TSK_TO_UINT16(&in_ip[14])); + } + else if(family == stun_ipv4){ + tsk_sprintf(out_ip, "%u.%u.%u.%u", in_ip[0], in_ip[1], in_ip[2], in_ip[3]); + + return 0; + } + else{ + TSK_DEBUG_ERROR("Unsupported address family: %u.", family); + } + + return -1; +} + +static tnet_stun_message_t * _tnet_ice_candidate_stun_create_bind_request(tnet_ice_candidate_t* self, const char* username, const char* password) +{ + tnet_stun_message_t *request = tsk_null; + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + request = tnet_stun_message_create(username, password); + + if(request){ + tnet_stun_attribute_t* attribute; + request->realm = tsk_strdup(self->stun.realm); + request->nonce = tsk_strdup(self->stun.nonce); + + /* Set the request type (RFC 5389 defines only one type) */ + request->type = stun_binding_request; + + /* Add software attribute */ + if((attribute = (tnet_stun_attribute_t*)tnet_stun_attribute_software_create(TNET_SOFTWARE, tsk_strlen(TNET_SOFTWARE)))){ + tnet_stun_message_add_attribute(request, &attribute); + } + } + + return request; +} + +static const char* _tnet_ice_candidate_get_transport_str(tnet_socket_type_t transport_e) +{ +#define TRANSPORT_GET(STR) \ + if(TNET_SOCKET_TYPE_IS_##STR(transport_e)){ \ + return TNET_ICE_CANDIDATE_TRANSPORT_##STR; \ + } + TRANSPORT_GET(UDP); + TRANSPORT_GET(TCP); + TRANSPORT_GET(TLS); + TRANSPORT_GET(SCTP); + TRANSPORT_GET(WS); + TRANSPORT_GET(WSS); + return "UNKNOWN"; + +#undef TRANSPORT_GET +} + +static tnet_socket_type_t _tnet_ice_candidate_get_transport_type(tsk_bool_t ipv6, const char* transport_str) +{ +#define TRANSPORT_GET(STR, str) \ + if(tsk_striequals(TNET_ICE_CANDIDATE_TRANSPORT_##STR, transport_str)){ \ + return tnet_socket_type_##str##_ipv4; \ + } + + TRANSPORT_GET(UDP, udp); + TRANSPORT_GET(TCP, tcp); + TRANSPORT_GET(TLS, tls); + TRANSPORT_GET(SCTP, sctp); + TRANSPORT_GET(WS, ws); + TRANSPORT_GET(WSS, wss); + return tnet_socket_type_invalid; + +#undef TRANSPORT_GET +} + +static const char* _tnet_ice_candidate_get_candtype_str(tnet_ice_cand_type_t candtype_e) +{ + switch(candtype_e){ + case tnet_ice_cand_type_unknown: + default: return "unknown"; + case tnet_ice_cand_type_host: return "host"; + case tnet_ice_cand_type_srflx: return "srflx"; + case tnet_ice_cand_type_prflx: return "prflx"; + case tnet_ice_cand_type_relay: return "relay"; + } +} + +static tnet_ice_cand_type_t _tnet_ice_candtype_get_transport_type(const char* candtype_str) +{ + if(tsk_striequals(TNET_ICE_CANDIDATE_TYPE_HOST, candtype_str)){ + return tnet_ice_cand_type_host; + } + else if(tsk_striequals(TNET_ICE_CANDIDATE_TYPE_SRFLX, candtype_str)){ + return tnet_ice_cand_type_srflx; + } + else if(tsk_striequals(TNET_ICE_CANDIDATE_TYPE_PRFLX, candtype_str)){ + return tnet_ice_cand_type_prflx; + } + else if(tsk_striequals(TNET_ICE_CANDIDATE_TYPE_RELAY, candtype_str)){ + return tnet_ice_cand_type_relay; + } + else{ + return tnet_ice_cand_type_unknown; + } +} \ No newline at end of file diff --git a/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_candidate.h b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_candidate.h new file mode 100644 index 00000000..335ac4a3 --- /dev/null +++ b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_candidate.h @@ -0,0 +1,122 @@ +/* +* Copyright (C) 2012 Doubango Telecom . +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#ifndef TNET_ICE_CANDIDATE_H +#define TNET_ICE_CANDIDATE_H + +#include "tinynet_config.h" + +#include "stun/tnet_stun_message.h" +#include "tnet_socket.h" + +#include "tsk_params.h" + +TNET_BEGIN_DECLS + +#define TNET_ICE_CANDIDATE_TRANSPORT_UDP "UDP" +#define TNET_ICE_CANDIDATE_TRANSPORT_TCP "TCP" +#define TNET_ICE_CANDIDATE_TRANSPORT_TLS "TLS" +#define TNET_ICE_CANDIDATE_TRANSPORT_SCTP "SCTP" +#define TNET_ICE_CANDIDATE_TRANSPORT_WS "WS" +#define TNET_ICE_CANDIDATE_TRANSPORT_WSS "WSS" + +#define TNET_ICE_CANDIDATE_TYPE_HOST "host" +#define TNET_ICE_CANDIDATE_TYPE_SRFLX "srflx" +#define TNET_ICE_CANDIDATE_TYPE_PRFLX "prflx" +#define TNET_ICE_CANDIDATE_TYPE_RELAY "relay" + +#define TNET_ICE_CANDIDATE_PREF_HOST 126 +#define TNET_ICE_CANDIDATE_PREF_SRFLX 100 +#define TNET_ICE_CANDIDATE_PREF_PRFLX 110 +#define TNET_ICE_CANDIDATE_PREF_RELAY 0 + +#define TNET_ICE_CANDIDATE_FOUNDATION_HOST "00host00" +#define TNET_ICE_CANDIDATE_FOUNDATION_SRFLX "00srflx00" +#define TNET_ICE_CANDIDATE_FOUNDATION_PRFLX "00prflx00" +#define TNET_ICE_CANDIDATE_FOUNDATION_RELAY "00relay00" + +#define TNET_ICE_CANDIDATE_COMPID_RTP 1 +#define TNET_ICE_CANDIDATE_COMPID_RTCP 2 + +typedef enum tnet_ice_cand_type_e +{ + tnet_ice_cand_type_unknown, + tnet_ice_cand_type_host, + tnet_ice_cand_type_srflx, + tnet_ice_cand_type_prflx, + tnet_ice_cand_type_relay +} +tnet_ice_cand_type_t; + +typedef struct tnet_ice_candidate_s +{ + TSK_DECLARE_OBJECT; + + tnet_ice_cand_type_t type_e; + uint8_t foundation[33]; // 1*32ice-char + uint32_t comp_id; // 1*5DIGIT + char* transport_str; // "UP" / token + enum tnet_socket_type_e transport_e; + uint32_t priority; // 1*10DIGIST [1 - (2**31 - 1)] + char* cand_type_str; // "host" / "srflx" / "prflx" / "relay" / "token" + tnet_ip_t connection_addr; + tnet_port_t port; + tsk_params_L_t *extension_att_list; + + tsk_bool_t is_ice_jingle; + tsk_bool_t is_rtp; + tsk_bool_t is_video; + uint16_t local_pref; // [0 - 65535] + + char* ufrag; + char* pwd; + + struct tnet_socket_s* socket; + struct{ + char* nonce; + char* realm; + char* srflx_addr; + tnet_stun_transacid_t transac_id; + tnet_port_t srflx_port; + } stun; + + char *tostring; +} +tnet_ice_candidate_t; + +typedef tsk_list_t tnet_ice_candidates_L_t; + +tnet_ice_candidate_t* tnet_ice_candidate_create(tnet_ice_cand_type_t type_e, struct tnet_socket_s* socket, tsk_bool_t is_ice_jingle, tsk_bool_t is_rtp, tsk_bool_t is_video, const char* ufrag, const char* pwd); +tnet_ice_candidate_t* tnet_ice_candidate_parse(const char* str); +int tnet_ice_candidate_set_credential(tnet_ice_candidate_t* self, const char* ufrag, const char* pwd); +int tnet_ice_candidate_set_rflx_addr(tnet_ice_candidate_t* self, const char* addr, tnet_port_t port); +TINYNET_API const char* tnet_ice_candidate_get_att_value(const tnet_ice_candidate_t* self, const char* att_name); +int tnet_ice_candidate_set_local_pref(tnet_ice_candidate_t* self, uint16_t local_pref); +TINYNET_API const char* tnet_ice_candidate_tostring(tnet_ice_candidate_t* self); +int tnet_ice_candidate_send_stun_bind_request(tnet_ice_candidate_t* self, struct sockaddr_storage* server_addr, const char* username, const char* password); +int tnet_ice_candidate_process_stun_response(tnet_ice_candidate_t* self, const tnet_stun_response_t* response, tnet_fd_t fd); +const tnet_ice_candidate_t* tnet_ice_candidate_find_by_fd(tnet_ice_candidates_L_t* candidates, tnet_fd_t fd); +const char* tnet_ice_candidate_get_ufrag(const tnet_ice_candidate_t* self); +const char* tnet_ice_candidate_get_pwd(const tnet_ice_candidate_t* self); + +TNET_END_DECLS + +#endif /* TNET_ICE_CANDIDATE_H */ diff --git a/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_ctx.c b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_ctx.c new file mode 100644 index 00000000..f0ebe003 --- /dev/null +++ b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_ctx.c @@ -0,0 +1,1466 @@ +/* +* Copyright (C) 2012 Doubango Telecom . +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tnet_ice_ctx.c + * @brief Interactive Connectivity Establishment (ICE) implementation as per RFC 5245 + * @author Mamadou Diop + * + */ +#include "tnet_ice_ctx.h" +#include "tnet_ice_event.h" +#include "tnet_ice_candidate.h" +#include "tnet_ice_pair.h" +#include "tnet_ice_utils.h" +#include "tnet_utils.h" +#include "tnet_endianness.h" + +#include "stun/tnet_stun.h" +#include "stun/tnet_stun_message.h" + +#include "tsk_time.h" +#include "tsk_timer.h" +#include "tsk_runnable.h" +#include "tsk_memory.h" +#include "tsk_string.h" +#include "tsk_fsm.h" +#include "tsk_debug.h" + +#ifndef LONG_MAX +# define LONG_MAX 2147483647L +#endif + +/**@ingroup tnet_nat_group +* Estimate of the round-trip time (RTT) in millisecond. +*/ +#define TNET_ICE_DEFAULT_RTO 500 +/**@ingroup tnet_nat_group +* Number of retransmission for UDP retransmission in millisecond. +/* 7.2.1. Sending over UDP + Rc SHOULD be configurable and SHOULD have a default of 7. +*/ +#define TNET_ICE_DEFAULT_RC 4 //7 + +#define TNET_ICE_CONFLICT_ERROR_CODE 487 + +static int _tnet_ice_ctx_fsm_act_async(struct tnet_ice_ctx_s* self, tsk_fsm_action_id action_id); +static int _tnet_ice_ctx_signal_async(struct tnet_ice_ctx_s* self, tnet_ice_event_type_t type, const char* phrase); +static int _tnet_ice_ctx_restart(struct tnet_ice_ctx_s* self); +static int _tnet_ice_ctx_build_pairs(tnet_ice_candidates_L_t* local_candidates, tnet_ice_candidates_L_t* remote_candidates, tnet_ice_pairs_L_t* result_pairs, tsk_bool_t is_controlling, uint64_t tie_breaker, tsk_bool_t is_ice_jingle); +static void *_tnet_ice_ctx_run(void* self); + +static int _tnet_ice_ctx_fsm_Started_2_GatheringHostCandidates_X_GatherHostCandidates(va_list *app); +static int _tnet_ice_ctx_fsm_GatheringHostCandidates_2_GatheringHostCandidatesDone_X_Success(va_list *app); +static int _tnet_ice_ctx_fsm_GatheringHostCandidates_2_Terminated_X_Failure(va_list *app); +static int _tnet_ice_ctx_fsm_GatheringHostCandidatesDone_2_GatheringReflexiveCandidates_X_GatherReflexiveCandidates(va_list *app); +static int _tnet_ice_ctx_fsm_GatheringReflexiveCandidates_2_GatheringReflexiveCandidatesDone_X_Success(va_list *app); +static int _tnet_ice_ctx_fsm_GatheringReflexiveCandidates_2_Terminated_X_Failure(va_list *app); +static int _tnet_ice_ctx_fsm_Any_2_GatheringCompleted_X_GatheringComplet(va_list *app); +static int _tnet_ice_ctx_fsm_Any_2_Started_X_Cancel(va_list *app); +static int _tnet_ice_ctx_fsm_GatheringComplet_2_ConnChecking_X_ConnCheck(va_list *app); +static int _tnet_ice_ctx_fsm_ConnChecking_2_ConnCheckingCompleted_X_Success(va_list *app); +static int _tnet_ice_ctx_fsm_ConnChecking_2_Terminated_X_Failure(va_list *app); +static int _tnet_ice_ctx_fsm_Any_2_Terminated_X_AnyNotStarted(va_list *app); // Any action if not started + +static int _tnet_ice_ctx_fsm_OnTerminated(struct tnet_ice_ctx_s* self); +static tsk_bool_t _tnet_ice_ctx_fsm_cond_NotStarted(struct tnet_ice_ctx_s* self, const void* _any); + +typedef struct tnet_ice_ctx_s +{ + TSK_DECLARE_RUNNABLE; + + tsk_bool_t is_started; + tsk_bool_t is_active; + tnet_ice_callback_f callback; + const void* userdata; + tsk_bool_t use_ipv6; + tsk_bool_t use_rtcp; + tsk_bool_t is_video; + tsk_bool_t unicast; + tsk_bool_t anycast; + tsk_bool_t multicast; + + tsk_bool_t is_controlling; + tsk_bool_t is_ice_jingle; + uint64_t tie_breaker; + uint64_t concheck_timeout; + + const void* rtp_callback_data; + tnet_ice_rtp_callback_f rtp_callback; + + char* ufrag; + char* pwd; + + tsk_timer_manager_handle_t* h_timer_mgr; + + tsk_fsm_t* fsm; + + tnet_ice_candidates_L_t* candidates_local; + tnet_ice_candidates_L_t* candidates_remote; + tnet_ice_pairs_L_t* candidates_pairs; + tsk_bool_t has_nominated_offer; + tsk_bool_t has_nominated_answer; + tsk_bool_t has_nominated_symetric; /**< Whether symetic RTP has been negotiated */ + + uint16_t RTO; /**< Estimate of the round-trip time (RTT) in millisecond */ + uint16_t Rc; /**< Number of retransmissions for UDP in millisecond */ + + struct{ + char* username; /**< The username to use to authenticate against the STUN server */ + char* password; /**< The password to use to authenticate against the STUN server */ + char* software; /**< The stun client name */ + char* server_addr; /**< STUN server address (could be FQDN or IP) */ + tnet_port_t server_port; /**< STUN server port */ + } stun; +} +tnet_ice_ctx_t; + +typedef struct tnet_ice_action_s +{ + TSK_DECLARE_OBJECT; + + tsk_fsm_action_id id; +} +tnet_ice_action_t; + +typedef enum _fsm_state_e +{ + _fsm_state_Started, + _fsm_state_GatheringHostCandidates, + _fsm_state_GatheringHostCandidatesDone, + _fsm_state_GatheringReflexiveCandidates, + _fsm_state_GatheringReflexiveCandidatesDone, + _fsm_state_GatheringCompleted, + _fsm_state_ConnChecking, + _fsm_state_ConnCheckingCompleted, + _fsm_state_Terminated +} +_fsm_state_t; + +typedef enum _fsm_action_e +{ + _fsm_action_Success, + _fsm_action_Failure, + _fsm_action_GatherHostCandidates, + _fsm_action_GatherReflexiveCandidates, + _fsm_action_GatheringComplet, + _fsm_action_ConnCheck, + _fsm_action_Cancel, + _fsm_action_Error, +} +_fsm_action_t; + +static tsk_object_t* tnet_ice_action_ctor(tsk_object_t * self, va_list * app) +{ + tnet_ice_action_t *action = self; + if(action){ + } + return self; +} +static tsk_object_t* tnet_ice_action_dtor(tsk_object_t * self) +{ + tnet_ice_action_t *action = self; + if(action){ + } + return self; +} +static const tsk_object_def_t tnet_ice_action_def_s = +{ + sizeof(tnet_ice_action_t), + tnet_ice_action_ctor, + tnet_ice_action_dtor, + tsk_null, +}; +static tnet_ice_action_t* tnet_ice_action_create(tsk_fsm_action_id id) +{ + tnet_ice_action_t *action = tsk_object_new(&tnet_ice_action_def_s); + if(action){ + action->id = id; + } + return action; +} + + + + +static tsk_object_t* tnet_ice_ctx_ctor(tsk_object_t * self, va_list * app) +{ + tnet_ice_ctx_t *ctx = self; + if(ctx){ + if(!(ctx->h_timer_mgr = tsk_timer_manager_create())){ + TSK_DEBUG_ERROR("Failed to create timer manager"); + return tsk_null; + } + if(!(ctx->fsm = tsk_fsm_create(_fsm_state_Started, _fsm_state_Terminated))){ + TSK_DEBUG_ERROR("Failed to create state machine"); + return tsk_null; + } + if(!(ctx->candidates_local = tsk_list_create())){ + TSK_DEBUG_ERROR("Failed to create candidates list"); + return tsk_null; + } + if(!(ctx->candidates_remote = tsk_list_create())){ + TSK_DEBUG_ERROR("Failed to create candidates list"); + return tsk_null; + } + if(!(ctx->candidates_pairs = tsk_list_create())){ + TSK_DEBUG_ERROR("Failed to create candidates list"); + return tsk_null; + } + + TSK_SAFE_FREE(ctx->ufrag); + TSK_SAFE_FREE(ctx->pwd); + + tsk_runnable_set_important(TSK_RUNNABLE(self), tsk_true); + + /* 7.2.1. Sending over UDP + In fixed-line access links, a value of 500 ms is RECOMMENDED. + */ + ctx->RTO = TNET_ICE_DEFAULT_RTO; + + /* 7.2.1. Sending over UDP + Rc SHOULD be configurable and SHOULD have a default of 7. + */ + ctx->Rc = TNET_ICE_DEFAULT_RC; + + ctx->tie_breaker = ((tsk_time_now() << 32) ^ tsk_time_now()); + ctx->is_ice_jingle = tsk_false; + + ctx->concheck_timeout = LONG_MAX; + } + return self; +} +static tsk_object_t* tnet_ice_ctx_dtor(tsk_object_t * self) +{ + tnet_ice_ctx_t *ctx = self; + if(ctx){ + tnet_ice_ctx_stop(ctx); + if(ctx->h_timer_mgr){ + tsk_timer_manager_destroy(&ctx->h_timer_mgr); + } + + TSK_SAFE_FREE(ctx->stun.username); + TSK_SAFE_FREE(ctx->stun.password); + TSK_SAFE_FREE(ctx->stun.software); + TSK_SAFE_FREE(ctx->stun.server_addr); + + TSK_OBJECT_SAFE_FREE(ctx->fsm); + TSK_OBJECT_SAFE_FREE(ctx->candidates_local); + TSK_OBJECT_SAFE_FREE(ctx->candidates_remote); + TSK_OBJECT_SAFE_FREE(ctx->candidates_pairs); + } + return self; +} +static const tsk_object_def_t tnet_ice_ctx_def_s = +{ + sizeof(tnet_ice_ctx_t), + tnet_ice_ctx_ctor, + tnet_ice_ctx_dtor, + tsk_null, +}; + + +tnet_ice_ctx_t* tnet_ice_ctx_create(tsk_bool_t is_ice_jingle, tsk_bool_t use_ipv6, tsk_bool_t use_rtcp, tsk_bool_t is_video, tnet_ice_callback_f callback, const void* userdata) +{ + tnet_ice_ctx_t* ctx; + + if(!(ctx = tsk_object_new(&tnet_ice_ctx_def_s))){ + TSK_DEBUG_ERROR("Failed to create ICE context object"); + return tsk_null; + } + + ctx->is_ice_jingle = is_ice_jingle; + ctx->use_ipv6 = use_ipv6; + ctx->use_rtcp = use_rtcp; + ctx->is_video = is_video; + ctx->callback = callback; + ctx->userdata = userdata; + ctx->unicast = tsk_true; + ctx->anycast = tsk_false; + ctx->multicast = tsk_false; + + tnet_ice_utils_set_ufrag(&ctx->ufrag); + tnet_ice_utils_set_pwd(&ctx->pwd); + + tsk_fsm_set_callback_terminated(ctx->fsm, TSK_FSM_ONTERMINATED_F(_tnet_ice_ctx_fsm_OnTerminated), (const void*)ctx); + tsk_fsm_set(ctx->fsm, + // (Started) -> (GatherHostCandidates) -> (GatheringHostCandidates) + TSK_FSM_ADD_ALWAYS(_fsm_state_Started, _fsm_action_GatherHostCandidates, _fsm_state_GatheringHostCandidates, _tnet_ice_ctx_fsm_Started_2_GatheringHostCandidates_X_GatherHostCandidates, "ICE_Started_2_GatheringHostCandidates_X_GatherHostCandidates"), + // (GatheringHostCandidates) -> (Success) -> (GatheringHostCandidatesDone) + TSK_FSM_ADD_ALWAYS(_fsm_state_GatheringHostCandidates, _fsm_action_Success, _fsm_state_GatheringHostCandidatesDone, _tnet_ice_ctx_fsm_GatheringHostCandidates_2_GatheringHostCandidatesDone_X_Success, "ICE_GatheringHostCandidates_2_GatheringHostCandidatesDone_X_Success"), + // (GatheringHostCandidates) -> (Failure) -> (Terminated) + TSK_FSM_ADD_ALWAYS(_fsm_state_GatheringHostCandidates, _fsm_action_Failure, _fsm_state_Terminated, _tnet_ice_ctx_fsm_GatheringHostCandidates_2_Terminated_X_Failure, "ICE_GatheringHostCandidates_2_Terminated_X_Failure"), + + // (GatheringHostCandidatesDone) -> (GatherReflexiveCandidates) -> (GatheringReflexiveCandidates) + TSK_FSM_ADD_ALWAYS(_fsm_state_GatheringHostCandidatesDone, _fsm_action_GatherReflexiveCandidates, _fsm_state_GatheringReflexiveCandidates, _tnet_ice_ctx_fsm_GatheringHostCandidatesDone_2_GatheringReflexiveCandidates_X_GatherReflexiveCandidates, "ICE_GatheringHostCandidatesDone_2_GatheringReflexiveCandidates_X_GatherReflexiveCandidates"), + // (GatheringReflexiveCandidates) -> (Success) -> GatheringReflexiveCandidatesDone + TSK_FSM_ADD_ALWAYS(_fsm_state_GatheringReflexiveCandidates, _fsm_action_Success, _fsm_state_GatheringReflexiveCandidatesDone, _tnet_ice_ctx_fsm_GatheringReflexiveCandidates_2_GatheringReflexiveCandidatesDone_X_Success, "ICE_fsm_GatheringReflexiveCandidates_2_GatheringReflexiveCandidatesDone_X_Success"), + // (GatheringReflexiveCandidates) -> (Failure) -> Terminated + TSK_FSM_ADD_ALWAYS(_fsm_state_GatheringReflexiveCandidates, _fsm_action_Failure, _fsm_state_Terminated, _tnet_ice_ctx_fsm_GatheringReflexiveCandidates_2_Terminated_X_Failure, "ICE_GatheringReflexiveCandidates_2_Terminated_X_Failure"), + + // (GatheringComplet) -> (ConnCheck) -> ConnChecking + TSK_FSM_ADD_ALWAYS(_fsm_state_GatheringCompleted, _fsm_action_ConnCheck, _fsm_state_ConnChecking, _tnet_ice_ctx_fsm_GatheringComplet_2_ConnChecking_X_ConnCheck, "ICE_GatheringComplet_2_ConnChecking_X_ConnCheck"), + // (ConnChecking) -> (Success) -> ConnCheckingCompleted + TSK_FSM_ADD_ALWAYS(_fsm_state_ConnChecking, _fsm_action_Success, _fsm_state_ConnCheckingCompleted, _tnet_ice_ctx_fsm_ConnChecking_2_ConnCheckingCompleted_X_Success, "ICE_ConnChecking_2_ConnCheckingCompleted_X_Success"), + // (ConnChecking) -> (Failure) -> Terminated + TSK_FSM_ADD_ALWAYS(_fsm_state_ConnChecking, _fsm_action_Failure, _fsm_state_Terminated, _tnet_ice_ctx_fsm_ConnChecking_2_Terminated_X_Failure, "ICE_ConnChecking_2_Terminated_X_Failure"), + + // (Any) -> (GatheringComplet) -> GatheringCompleted + TSK_FSM_ADD_ALWAYS(tsk_fsm_state_any, _fsm_action_GatheringComplet, _fsm_state_GatheringCompleted, _tnet_ice_ctx_fsm_Any_2_GatheringCompleted_X_GatheringComplet, "ICE_Any_2_GatheringCompleted_X_GatheringComplet"), + // (Any) -> (Cancel) -> Started + TSK_FSM_ADD_ALWAYS(tsk_fsm_state_any, _fsm_action_Cancel, _fsm_state_Started, _tnet_ice_ctx_fsm_Any_2_Started_X_Cancel, "ICE_Any_2_Started_X_Cancel"), + // (Any) -> (AnyNotStarted) -> Terminated + TSK_FSM_ADD(tsk_fsm_state_any, tsk_fsm_action_any, _tnet_ice_ctx_fsm_cond_NotStarted, _fsm_state_Terminated, _tnet_ice_ctx_fsm_Any_2_Terminated_X_AnyNotStarted, "ICE_fsm_Any_2_Terminated_X_AnyNotStarted") + ); + + return ctx; +} + +int tnet_ice_ctx_set_userdata(tnet_ice_ctx_t* self, const void* userdata) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + self->userdata = userdata; + return 0; +} + +int tnet_ice_ctx_set_stun( + tnet_ice_ctx_t* self, + const char* server_addr, + uint16_t server_port, + const char* software, + const char* username, + const char* password) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + tsk_strupdate(&self->stun.server_addr, server_addr); + self->stun.server_port = server_port; + tsk_strupdate(&self->stun.software, software); + tsk_strupdate(&self->stun.username, username); + tsk_strupdate(&self->stun.password, password); + + return 0; +} + +int tnet_ice_ctx_start(tnet_ice_ctx_t* self) +{ + int ret; + tsk_bool_t timer_mgr_started = tsk_false; + tsk_bool_t runnable_started = tsk_false; + const char* err = tsk_null; + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if(self->is_started){ + if(!self->is_active){ + TSK_DEBUG_INFO("ICE restart"); + return _tnet_ice_ctx_restart(self); + } + TSK_DEBUG_INFO("Already started"); + return 0; + } + + /* === Timer manager === */ + if((ret = tsk_timer_manager_start(self->h_timer_mgr))){ + err = "Failed to start timer manager"; + TSK_DEBUG_ERROR("%s", err); + goto bail; + } + timer_mgr_started = tsk_true; + + /* === Runnable === */ + TSK_RUNNABLE(self)->run = _tnet_ice_ctx_run; + if((ret = tsk_runnable_start(TSK_RUNNABLE(self), tnet_ice_event_def_t))){ + err = "Failed to start runnable"; + TSK_DEBUG_ERROR("%s", err); + goto bail; + } + runnable_started = tsk_true; + + if((ret = _tnet_ice_ctx_fsm_act_async(self, _fsm_action_GatherHostCandidates))){ + err = "FSM execution failed"; + TSK_DEBUG_ERROR("%s", err); + goto bail; + } + + self->is_started = tsk_true; + self->is_active = tsk_true; + +bail: + + if(ret){ + _tnet_ice_ctx_signal_async(self, tnet_ice_event_type_start_failed, err); + if(timer_mgr_started){ + tsk_timer_manager_stop(self->h_timer_mgr); + } + if(runnable_started){ + tsk_runnable_stop(TSK_RUNNABLE(self)); + } + } + return ret; +} + +// register callback to call when we receive early RTP packets while negotaiating ICE pairs +int tnet_ice_ctx_rtp_callback(tnet_ice_ctx_t* self, tnet_ice_rtp_callback_f rtp_callback, const void* rtp_callback_data) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + self->rtp_callback_data = rtp_callback_data; + self->rtp_callback = rtp_callback; + return 0; +} + +// timeout (millis): <=0 to disable +int tnet_ice_ctx_set_concheck_timeout(tnet_ice_ctx_t* self, int64_t timeout) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + self->concheck_timeout = (timeout <=0 ? LONG_MAX : timeout); + + return 0; +} + +// @param candidates (candidate \r\n)+ +int tnet_ice_ctx_set_remote_candidates(tnet_ice_ctx_t* self, const char* candidates, const char* ufrag, const char* pwd, tsk_bool_t is_controlling, tsk_bool_t is_ice_jingle) +{ + int ret = 0; + char *v, *copy; + tsk_size_t size, idx = 0; + tnet_ice_candidate_t* candidate; + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + self->is_controlling = is_controlling; + self->is_ice_jingle = is_ice_jingle; + + if(tsk_strnullORempty(candidates)){ + // remote party is ICE-lite or doesn't support ICE + return tnet_ice_ctx_cancel(self); + } + + // active if remote is full-ICE + // in all case we are always full-ICE + // self->is_active = tsk_true; + + copy = tsk_strdup(candidates); + size = tsk_strlen(copy); + do{ + v = strtok(©[idx], "\r\n"); + idx += tsk_strlen(v) + 2; + if(v && (candidate = tnet_ice_candidate_parse(v))){ + if(ufrag && pwd){ + tnet_ice_candidate_set_credential(candidate, ufrag, pwd); + } + tsk_list_lock(self->candidates_remote); + tsk_list_push_back_data(self->candidates_remote, (void**)&candidate); + tsk_list_unlock(self->candidates_remote); + } + } + while(v && (idx < size)); + + TSK_FREE(copy); + + if(!tnet_ice_ctx_is_connected(self) && tnet_ice_ctx_got_local_candidates(self) && !TSK_LIST_IS_EMPTY(self->candidates_remote)){ + ret = _tnet_ice_ctx_fsm_act_async(self, _fsm_action_ConnCheck); + } + return ret; +} + +tsk_bool_t tnet_ice_ctx_got_local_candidates(const tnet_ice_ctx_t* self) +{ + tsk_fsm_state_id curr_state; + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_false; + } + if(!self->is_started){ + return tsk_false; + } + + curr_state = tsk_fsm_get_current_state(self->fsm); + + return (curr_state >= _fsm_state_GatheringCompleted && curr_state < _fsm_state_Terminated); +} + +const tnet_ice_candidate_t* tnet_ice_ctx_get_local_candidate_at(const tnet_ice_ctx_t* self, tsk_size_t index) +{ + const tsk_list_item_t *item; + tsk_size_t pos = 0; + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + tsk_list_foreach(item, self->candidates_local){ + if(pos++ == index){ + return (const tnet_ice_candidate_t*)item->data; + } + } + return tsk_null; +} + +tsk_bool_t tnet_ice_ctx_is_started(const tnet_ice_ctx_t* self) +{ + return (self && self->is_started); +} + +// says if ICE is enabled +// doesn't say if the connection has been negotiated (see is_connecte()) +tsk_bool_t tnet_ice_ctx_is_active(const tnet_ice_ctx_t* self) +{ + return (self && self->is_started && self->is_active); +} + +// says if media can start in both direction +tsk_bool_t tnet_ice_ctx_is_connected(const tnet_ice_ctx_t* self) +{ + return (self && self->has_nominated_symetric); +} + +tsk_bool_t tnet_ice_ctx_is_can_send(const tnet_ice_ctx_t* self) +{ + return (self && self->has_nominated_offer); +} + +tsk_bool_t tnet_ice_ctx_is_can_recv(const tnet_ice_ctx_t* self) +{ + return (self && self->has_nominated_answer); +} + +tsk_bool_t tnet_ice_ctx_use_ipv6(const tnet_ice_ctx_t* self) +{ + return (self && self->use_ipv6); +} + +tsk_bool_t tnet_ice_ctx_use_rtcp(const tnet_ice_ctx_t* self) +{ + return (self && self->use_rtcp); +} + +int tnet_ice_ctx_get_nominated_symetric_candidates(const tnet_ice_ctx_t* self, uint32_t comp_id, + const tnet_ice_candidate_t** candidate_offer, + const tnet_ice_candidate_t** candidate_answer_src, + const tnet_ice_candidate_t** candidate_answer_dest) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + return tnet_ice_pairs_get_nominated_symetric(self->candidates_pairs, comp_id, candidate_offer, candidate_answer_src, candidate_answer_dest); +} + +int tnet_ice_ctx_recv_stun_message(tnet_ice_ctx_t* self, const void* data, tsk_size_t size, tnet_fd_t local_fd, const struct sockaddr_storage* remote_addr, tsk_bool_t *role_conflict) +{ + tnet_stun_message_t* message; + int ret = 0; + const tnet_ice_pair_t* pair; + if(!self || !role_conflict || !data || !size || local_fd < 0 || !remote_addr){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + *role_conflict = tsk_false; + + if(!TNET_IS_STUN2_MSG(((uint8_t*)data), size)){ + if(self->rtp_callback){ + return self->rtp_callback(self->rtp_callback_data, data, size, local_fd, remote_addr); + } + TSK_DEBUG_WARN("Not STUN message"); + return 0; + } + + if((message = tnet_stun_message_deserialize(data, size))){ + if(message->type == stun_binding_request){ + // check controlling flag + if((pair = tnet_ice_pairs_find_by_fd_and_addr(self->candidates_pairs, local_fd, remote_addr))){ + short resp_code = 0; + char* resp_phrase = tsk_null; + // authenticate the request + tnet_ice_pair_auth_conncheck(pair, message, data, size, &resp_code, &resp_phrase); + if(resp_code > 0 && resp_phrase){ + if(resp_code >= 200 && resp_code <= 299){ + // Before sending the success response check that there are no role conflict + if(self->is_controlling){ // I'm ICE-CONTROLLING + const tnet_stun_attribute_ice_controlling_t* stun_att_ice_controlling; + if((stun_att_ice_controlling = (const tnet_stun_attribute_ice_controlling_t*)tnet_stun_message_get_attribute(message, stun_ice_controlling))){ + TSK_DEBUG_WARN("Role conflicts (SEND)"); + if(self->tie_breaker >= stun_att_ice_controlling->value){ + resp_code = TNET_ICE_CONFLICT_ERROR_CODE; + tsk_strupdate(&resp_phrase, "Role conflicts"); + } + else{ + // switch to "controlled" role + self->is_controlling = tsk_false; + *role_conflict = tsk_true; + } + } + else; + } + else{ // I'm ICE-CONTROLLED + const tnet_stun_attribute_ice_controlled_t* stun_att_ice_controlled; + if((stun_att_ice_controlled = (const tnet_stun_attribute_ice_controlled_t*)tnet_stun_message_get_attribute(message, stun_ice_controlled))){ + TSK_DEBUG_WARN("Role conflicts (SEND)"); + if(self->tie_breaker >= stun_att_ice_controlled->value){ + self->is_controlling = tsk_true; + *role_conflict = tsk_true; + } + else{ + resp_code = TNET_ICE_CONFLICT_ERROR_CODE; + tsk_strupdate(&resp_phrase, "Role conflicts"); + } + } + } + } + ret = tnet_ice_pair_send_response((tnet_ice_pair_t *)pair, message, resp_code, resp_phrase, remote_addr); + } + TSK_FREE(resp_phrase); + } + } + else if(TNET_STUN_MESSAGE_IS_RESPONSE(message)){ + if((pair = tnet_ice_pairs_find_by_response(self->candidates_pairs, message))){ + ret = tnet_ice_pair_recv_response(((tnet_ice_pair_t*)pair), message); + if(TNET_STUN_RESPONSE_IS_ERROR(message)){ + if(tnet_stun_message_get_errorcode(message) == TNET_ICE_CONFLICT_ERROR_CODE){ + // If this code is called this means that we have lower tie-breaker and we must toggle our role + TSK_DEBUG_WARN("Role conflicts (RECV)"); + self->is_controlling = !self->is_controlling; + *role_conflict = tsk_true; + } + } + } + } + } + TSK_OBJECT_SAFE_FREE(message); + + return ret; +} + +// cancels the ICE processing without stopping the process +int tnet_ice_ctx_cancel(tnet_ice_ctx_t* self) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if(tsk_fsm_get_current_state(self->fsm) == _fsm_state_Started){ + // Do nothing if already in the "started" state + return 0; + } + + self->is_active = tsk_false; + self->has_nominated_symetric = tsk_false; + self->has_nominated_answer = tsk_false; + self->has_nominated_offer = tsk_false; + return _tnet_ice_ctx_fsm_act_async(self, _fsm_action_Cancel); +} + +int tnet_ice_ctx_stop(tnet_ice_ctx_t* self) +{ + int ret; + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if(!self->is_started){ + return 0; + } + + self->is_started = tsk_false; + + ret = tsk_timer_manager_stop(self->h_timer_mgr); + ret = tsk_runnable_stop(TSK_RUNNABLE(self)); + + return ret; +} + +//-------------------------------------------------------- +// == STATE MACHINE BEGIN == +//-------------------------------------------------------- + +// Started -> (GatherHostCandidates) -> (GatheringHostCandidates) +static int _tnet_ice_ctx_fsm_Started_2_GatheringHostCandidates_X_GatherHostCandidates(va_list *app) +{ + int ret = 0; + tnet_ice_ctx_t* self; + tnet_addresses_L_t* addresses; + const tsk_list_item_t *item; + const tnet_address_t* address; + tnet_ice_candidate_t* candidate; + tnet_socket_t* socket_rtp = tsk_null; + tnet_socket_t* socket_rtcp = tsk_null; + tnet_socket_type_t socket_type; + uint16_t local_pref, curr_local_pref; + tnet_ip_t best_local_ip; + tsk_bool_t check_best_local_ip; + static const tsk_bool_t dnsserver = tsk_false; + static const long if_index_any = -1; // any interface + static const char* destination = "doubango.org"; + + self = va_arg(*app, tnet_ice_ctx_t *); + socket_type = self->use_ipv6 ? tnet_socket_type_udp_ipv6 : tnet_socket_type_udp_ipv4; + + addresses = tnet_get_addresses((self->use_ipv6 ? AF_INET6 : AF_INET), self->unicast, self->anycast, self->multicast, dnsserver, if_index_any); + if(!addresses || TSK_LIST_IS_EMPTY(addresses)){ + TSK_DEBUG_ERROR("Failed to get addresses"); + ret = -1; + goto bail; + } + + + check_best_local_ip = (tnet_getbestsource(destination, 5060, socket_type, &best_local_ip) == 0); + curr_local_pref = local_pref = check_best_local_ip ? 0xFFFE : 0xFFFF; + + // lock-list + tsk_list_lock(self->candidates_local); + // clear-list + tsk_list_clear_items(self->candidates_local); + + tsk_list_foreach(item, addresses){ + if(!(address = item->data)){ + continue; + } + + // Skip loopback address to avoid problems :) + if((address->family == AF_INET && tsk_striequals(address->ip, "127.0.0.1")) || (address->family == AF_INET6 && tsk_striequals(address->ip, "::1"))){ + continue; + } + + // host candidates + ret = tnet_ice_utils_create_sockets(socket_type, + address->ip, &socket_rtp, + self->use_rtcp ? &socket_rtcp : tsk_null); + if(ret == 0){ + tsk_list_lock(self->candidates_local); + if(socket_rtp){ + if((candidate = tnet_ice_candidate_create(tnet_ice_cand_type_host, socket_rtp, self->is_ice_jingle, tsk_true, self->is_video, self->ufrag, self->pwd))){ + if(check_best_local_ip && (candidate->socket && (tsk_striequals(candidate->socket->ip, best_local_ip)))){ + curr_local_pref = 0xFFFF; + check_best_local_ip = tsk_false; + tnet_ice_candidate_set_local_pref(candidate, curr_local_pref); + tsk_list_push_front_data(self->candidates_local, (void**)&candidate); + } + else{ + curr_local_pref = local_pref--; + tnet_ice_candidate_set_local_pref(candidate, curr_local_pref); + tsk_list_push_back_data(self->candidates_local, (void**)&candidate); + } + } + } + if(socket_rtcp){ + if((candidate = tnet_ice_candidate_create(tnet_ice_cand_type_host, socket_rtcp, self->is_ice_jingle, tsk_false, self->is_video, self->ufrag, self->pwd))){ + tnet_ice_candidate_set_local_pref(candidate, curr_local_pref); + tsk_list_push_back_data(self->candidates_local, (void**)&candidate); + } + } + tsk_list_unlock(self->candidates_local); + } + + TSK_OBJECT_SAFE_FREE(socket_rtp); + TSK_OBJECT_SAFE_FREE(socket_rtcp); + + // break if no longer running + if(!self->is_started){ + break; + } + + TSK_DEBUG_INFO("local ip address = %s", address->ip); + } + + // unlock-list + tsk_list_unlock(self->candidates_local); + +bail: + if(self->is_started){ + if(ret == 0 && !TSK_LIST_IS_EMPTY(self->candidates_local)){ + ret = _tnet_ice_ctx_fsm_act_async(self, _fsm_action_Success); + } + else{ + ret = _tnet_ice_ctx_fsm_act_async(self, _fsm_action_Failure); + } + } + + TSK_OBJECT_SAFE_FREE(addresses); + return ret; +} + +// GatheringHostCandidates -> (Success) -> (GatheringHostCandidatesDone) +static int _tnet_ice_ctx_fsm_GatheringHostCandidates_2_GatheringHostCandidatesDone_X_Success(va_list *app) +{ + int ret; + tnet_ice_ctx_t* self; + + self = va_arg(*app, tnet_ice_ctx_t *); + + ret = _tnet_ice_ctx_signal_async(self, tnet_ice_event_type_gathering_host_candidates_succeed, "Gathering host candidates succeed"); + if(ret == 0){ + if(self->stun.server_addr && self->stun.server_port){ + ret = _tnet_ice_ctx_fsm_act_async(self, _fsm_action_GatherReflexiveCandidates); + } + else{ + ret = _tnet_ice_ctx_fsm_act_async(self, _fsm_action_GatheringComplet); + } + } + + return ret; +} + +// GatheringHostCandidates -> (Failure) -> (Terminated) +static int _tnet_ice_ctx_fsm_GatheringHostCandidates_2_Terminated_X_Failure(va_list *app) +{ + tnet_ice_ctx_t* self; + + self = va_arg(*app, tnet_ice_ctx_t *); + return _tnet_ice_ctx_signal_async(self, tnet_ice_event_type_gathering_host_candidates_failed, "Gathering host candidates failed"); +} + +// GatheringHostCandidatesDone -> (GatherReflexiveCandidate) -> GatheringReflexiveCandidates +static int _tnet_ice_ctx_fsm_GatheringHostCandidatesDone_2_GatheringReflexiveCandidates_X_GatherReflexiveCandidates(va_list *app) +{ + /* RFC 5389 - 7.2.1. Sending over UDP + STUN indications are not retransmitted; thus, indication transactions over UDP + are not reliable. + */ + int ret; + struct sockaddr_storage server_addr; + tnet_ice_ctx_t* self; + tnet_socket_type_t socket_type; + uint16_t i, k, rto, rc; + struct timeval tv; + tnet_stun_response_t *response = tsk_null; + const tsk_list_item_t *item; + tnet_ice_candidate_t* candidate; + tnet_fd_t fds[40] = { -1 }; + uint16_t fds_count = 0; + tnet_fd_t fd_max = -1; + fd_set set; + + self = va_arg(*app, tnet_ice_ctx_t *); + + socket_type = self->use_ipv6 ? tnet_socket_type_udp_ipv6 : tnet_socket_type_udp_ipv4; + + if((ret = tnet_sockaddr_init(self->stun.server_addr, self->stun.server_port, socket_type, &server_addr))){ + TSK_DEBUG_ERROR("tnet_sockaddr_init(%s, %d) failed", self->stun.server_addr, self->stun.server_port); + goto bail; + } + + rto = self->RTO; + rc = self->Rc; + tv.tv_sec = 0; + tv.tv_usec = 0; + + // load fds for both rtp and rtcp sockets + tsk_list_foreach(item, self->candidates_local){ + if(!(candidate = item->data)){ + continue; + } + + if((fds_count < sizeof(fds)/sizeof(fds[0])) && candidate->socket){ + fds[fds_count++] = candidate->socket->fd; + if(candidate->socket->fd > fd_max){ + fd_max = candidate->socket->fd; + } + } + } + + + /* RFC 5389 - 7.2.1. Sending over UDP + A client SHOULD retransmit a STUN request message starting with an + interval of RTO ("Retransmission TimeOut"), doubling after each + retransmission. + + e.g. 0 ms, 500 ms, 1500 ms, 3500 ms, 7500ms, 15500 ms, and 31500 ms + */ + for(i = 0; (i < rc && self->is_started); ++i){ + tv.tv_sec += rto/1000; + tv.tv_usec += (rto % 1000) * 1000; + + FD_ZERO(&set); + for(k = 0; k < fds_count; ++k){ + FD_SET(fds[k], &set); + } + + // sends STUN binding requets + tsk_list_foreach(item, self->candidates_local){ + if(!(candidate = (tnet_ice_candidate_t*)item->data)){ + continue; + } + if(candidate->socket && tsk_strnullORempty(candidate->stun.srflx_addr)){ + ret = tnet_ice_candidate_send_stun_bind_request(candidate, &server_addr, self->stun.username, self->stun.password); + } + } + + if((ret = select(fd_max+1, &set, NULL, NULL, &tv))<0){ + goto bail; + } + else if(ret == 0){ + // timeout + // TSK_DEBUG_INFO("STUN request timedout at %d", i); + rto <<= 1; + continue; + } + else if(ret > 0){ + // there is data to read + for(k = 0; k < fds_count; ++k){ + tnet_fd_t fd = fds[k]; + if(FD_ISSET(fd, &set)){ + tsk_size_t len = 0; + void* data = 0; + const tnet_ice_candidate_t* candidate_curr; + + // Check how many bytes are pending + if((ret = tnet_ioctlt(fd, FIONREAD, &len))<0){ + continue; + } + + if(len==0){ + // TSK_DEBUG_INFO("tnet_ioctlt() returent zero bytes"); + continue; + } + + // Receive pending data + data = tsk_calloc(len, sizeof(uint8_t)); + if((ret = tnet_sockfd_recvfrom(fd, data, len, 0, (struct sockaddr *)&server_addr))<0){ + TSK_FREE(data); + + TSK_DEBUG_ERROR("Recving STUN dgrams failed with error code:%d", tnet_geterrno()); + continue; + } + + // Parse the incoming response + response = tnet_stun_message_deserialize(data, (tsk_size_t)ret); + TSK_FREE(data); + + if(response){ + ret = 0; + if((candidate_curr = tnet_ice_candidate_find_by_fd(self->candidates_local, fd))){ + if(tsk_strnullORempty(candidate_curr->stun.srflx_addr)){ + ret = tnet_ice_candidate_process_stun_response((tnet_ice_candidate_t*)candidate_curr, response, fd); + if(!tsk_strnullORempty(candidate_curr->stun.srflx_addr)){ + tnet_ice_candidate_t* new_cand = tnet_ice_candidate_create(tnet_ice_cand_type_srflx, candidate_curr->socket, candidate_curr->is_ice_jingle, candidate_curr->is_rtp, self->is_video, self->ufrag, self->pwd); + if(new_cand){ + tsk_list_lock(self->candidates_local); + tnet_ice_candidate_set_rflx_addr(new_cand, candidate_curr->stun.srflx_addr, candidate_curr->stun.srflx_port); + tsk_list_push_back_data(self->candidates_local, (void**)&new_cand); + tsk_list_unlock(self->candidates_local); + } + } + } + } + } + TSK_OBJECT_SAFE_FREE(response); + } + } + + //goto bail; + } + else{ + continue; + } + } + + +bail: + if(self->is_started){ + if(ret == 0){ + ret = _tnet_ice_ctx_fsm_act_async(self, _fsm_action_Success); + } + else{ + ret = _tnet_ice_ctx_fsm_act_async(self, _fsm_action_Failure); + } + } + + tsk_list_foreach(item, self->candidates_local){ + if(!(candidate = (tnet_ice_candidate_t*)item->data)){ + continue; + } + TSK_DEBUG_INFO("Candidate: %s", tnet_ice_candidate_tostring(candidate)); + } + return ret; +} + +// GatheringReflexiveCandidates -> (Success) -> GatheringReflexiveCandidatesDone +static int _tnet_ice_ctx_fsm_GatheringReflexiveCandidates_2_GatheringReflexiveCandidatesDone_X_Success(va_list *app) +{ + int ret = 0; + tnet_ice_ctx_t* self; + + self = va_arg(*app, tnet_ice_ctx_t *); + + if(self->is_started){ + // For now do not gather relayed candidates + ret = _tnet_ice_ctx_fsm_act_async(self, _fsm_action_GatheringComplet); + } + else{ + return -1; + } + + return ret; +} + +// GatheringReflexiveCandidates -> (Failure) -> Terminated +static int _tnet_ice_ctx_fsm_GatheringReflexiveCandidates_2_Terminated_X_Failure(va_list *app) +{ + return 0; +} + +// Any -> (Cancel) -> Started +static int _tnet_ice_ctx_fsm_Any_2_Started_X_Cancel(va_list *app) +{ + tnet_ice_ctx_t* self; + self = va_arg(*app, tnet_ice_ctx_t *); + + tsk_list_lock(self->candidates_remote); + tsk_list_clear_items(self->candidates_remote); + tsk_list_unlock(self->candidates_remote); + + tsk_list_lock(self->candidates_pairs); + tsk_list_clear_items(self->candidates_pairs); + tsk_list_unlock(self->candidates_pairs); + + // Do not clear local candidates because then will be used as fallback if the remote peer is an ICE-lite + // These candidates will be cleared before the next local gathering + // tsk_list_lock(self->candidates_local); + // tsk_list_clear_items(self->candidates_local); + // tsk_list_unlock(self->candidates_local); + + // restore "is_cancelled" until next cancel + // set "is_active" to false to allow ICE re-start + // self->is_cancelled = tsk_false; + // self->is_active = tsk_false; + + // alert user + _tnet_ice_ctx_signal_async(self, tnet_ice_event_type_cancelled, "Cancelled"); + + return 0; + +} + +// Any -> (GatheringComplet) -> GatheringCompleted +static int _tnet_ice_ctx_fsm_Any_2_GatheringCompleted_X_GatheringComplet(va_list *app) +{ + int ret = 0; + tnet_ice_ctx_t* self; + tsk_bool_t has_remote_candidates; + + self = va_arg(*app, tnet_ice_ctx_t *); + + // alert user + _tnet_ice_ctx_signal_async(self, tnet_ice_event_type_gathering_completed, "Gathering candidates completed"); + + if(self->is_started){ + tsk_list_lock(self->candidates_remote); + has_remote_candidates = !TSK_LIST_IS_EMPTY(self->candidates_remote); + tsk_list_unlock(self->candidates_remote); + + if(has_remote_candidates){ + ret = _tnet_ice_ctx_fsm_act_async(self, _fsm_action_ConnCheck); + } + } + else{ + return -1; + } + + return ret; +} + +// GatheringComplet -> (ConnCheck) -> ConnChecking +static int _tnet_ice_ctx_fsm_GatheringComplet_2_ConnChecking_X_ConnCheck(va_list *app) +{ + // Implements: + // 5.8. Scheduling Checks + + int ret; + const tsk_list_item_t *item; + tnet_ice_ctx_t* self; + tnet_fd_t fds[40] = { -1 }; + uint16_t fds_count = 0, k; + tnet_fd_t fd_max = -1; + fd_set set; + const tnet_ice_pair_t *pair; + struct timeval tv; + static const long rto = 160; // milliseconds + tnet_stun_message_t *message = tsk_null; + struct sockaddr_storage remote_addr; + uint64_t time_start, time_curr, time_end, concheck_timeout; + tsk_bool_t role_conflict; + + self = va_arg(*app, tnet_ice_ctx_t *); + +start_conneck: + role_conflict = tsk_false; + + tsk_list_lock(self->candidates_pairs); + tsk_list_clear_items(self->candidates_pairs); + tsk_list_unlock(self->candidates_pairs); + + if((ret = _tnet_ice_ctx_build_pairs(self->candidates_local, self->candidates_remote, self->candidates_pairs, self->is_controlling, self->tie_breaker, self->is_ice_jingle))){ + TSK_DEBUG_ERROR("_tnet_ice_ctx_build_pairs() failed"); + return ret; + } + + // load fds for both rtp and rtcp sockets + tsk_list_foreach(item, self->candidates_pairs){ + if(!(pair = item->data) || !pair->candidate_offer || !pair->candidate_offer->socket){ + continue; + } + + if((fds_count < sizeof(fds)/sizeof(fds[0])) && pair->candidate_offer->socket){ + fds[fds_count++] = pair->candidate_offer->socket->fd; + if(pair->candidate_offer->socket->fd > fd_max){ + fd_max = pair->candidate_offer->socket->fd; + } + } + } + + concheck_timeout = self->concheck_timeout; + time_start = time_curr = tsk_time_now(); + time_end = (time_start + concheck_timeout); + + while(self->is_started && self->is_active && (time_curr < time_end) && !self->has_nominated_symetric){ + tv.tv_sec = 0; + tv.tv_usec = (rto * 1000); + + FD_ZERO(&set); + for(k = 0; k < fds_count; ++k){ + FD_SET(fds[k], &set); + } + + // set new current time here to avoid "continue" skips + // ignore already ellapsed time if new timeout value is defined + time_curr = tsk_time_now(); + if(self->concheck_timeout != concheck_timeout){ + concheck_timeout = self->concheck_timeout; + time_start = time_curr; + time_end = (time_start + concheck_timeout); + } + + // Send ConnCheck requests + // the pairs are already order by priority (from high to low) + if(!self->has_nominated_symetric){ + tsk_list_foreach(item, self->candidates_pairs){ + if(!(pair = item->data) || !pair->candidate_offer || !pair->candidate_offer->socket){ + continue; + } + switch(pair->state_offer){ + case tnet_ice_pair_state_failed: + case tnet_ice_pair_state_succeed: + continue; + } + + ret = tnet_ice_pair_send_conncheck((tnet_ice_pair_t *)pair); + } + } + + if((ret = select(fd_max+1, &set, NULL, NULL, &tv))<0){ + TNET_PRINT_LAST_ERROR("select() failed"); + goto bail; + } + else if(ret == 0){ + // timeout + // TSK_DEBUG_INFO("STUN request timedout"); + continue; + } + else if(ret > 0){ + void* data = tsk_null; + // there is data to read + for(k = 0; k < fds_count; ++k){ + tnet_fd_t fd = fds[k]; + tsk_size_t len = 0; + + if(!FD_ISSET(fd, &set)){ + continue; + } + + // Check how many bytes are pending + if((ret = tnet_ioctlt(fd, FIONREAD, &len))<0){ + continue; + } + + if(len==0){ + // TSK_DEBUG_INFO("tnet_ioctlt() returent zero bytes"); + continue; + } + + // Receive pending data + TSK_FREE(data); + data = tsk_calloc(len, sizeof(uint8_t)); + if((ret = tnet_sockfd_recvfrom(fd, data, len, 0, (struct sockaddr *)&remote_addr))<0){ + TSK_FREE(data); + + TNET_PRINT_LAST_ERROR("Receiving STUN dgrams failed with error code"); + goto bail; + } + // recv() STUN message (request / response) + ret = tnet_ice_ctx_recv_stun_message(self, data, (tsk_size_t)ret, fd, &remote_addr, &role_conflict); + if(ret == 0 && role_conflict){ + // A change in roles will require to recompute pair priorities + goto start_conneck; + } + } + TSK_FREE(data); + } + + if(!self->has_nominated_offer){ + self->has_nominated_offer = tnet_ice_pairs_has_nominated_offer(self->candidates_pairs); + } + if(!self->has_nominated_answer){ + self->has_nominated_answer = tnet_ice_pairs_has_nominated_answer(self->candidates_pairs); + } + if(self->has_nominated_offer && self->has_nominated_answer){ + self->has_nominated_symetric = tnet_ice_pairs_has_nominated_symetric(self->candidates_pairs, self->use_rtcp); + } + } + +bail: + // move to the next state depending on the conncheck result + if(self->is_started){ + if(ret == 0 && self->has_nominated_symetric){ + _tnet_ice_ctx_fsm_act_async(self, _fsm_action_Success); + } + else{ + if(time_curr >= time_end){ + TSK_DEBUG_ERROR("ConnCheck timedout"); + } + _tnet_ice_ctx_fsm_act_async(self, _fsm_action_Failure); + } + } + + return ret; +} + +// ConnChecking -> (Success) -> ConnCheckingCompleted +static int _tnet_ice_ctx_fsm_ConnChecking_2_ConnCheckingCompleted_X_Success(va_list *app) +{ + tnet_ice_ctx_t* self = va_arg(*app, tnet_ice_ctx_t *); + return _tnet_ice_ctx_signal_async(self, tnet_ice_event_type_conncheck_succeed, "ConnCheck succeed"); +} + +// ConnChecking -> (Failure) ->Terminated +static int _tnet_ice_ctx_fsm_ConnChecking_2_Terminated_X_Failure(va_list *app) +{ + tnet_ice_ctx_t* self = va_arg(*app, tnet_ice_ctx_t *); + return _tnet_ice_ctx_signal_async(self, tnet_ice_event_type_conncheck_failed, "ConnCheck failed"); +} + +// Any (AnyNotStarted) -> Terminated +static int _tnet_ice_ctx_fsm_Any_2_Terminated_X_AnyNotStarted(va_list *app) +{ + return 0; +} + +//++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// == STATE MACHINE END == +//++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +static int _tnet_ice_ctx_fsm_OnTerminated(tnet_ice_ctx_t* self) +{ + TSK_DEBUG_INFO("=== ICE CTX SM Terminated ==="); + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter."); + return -1; + } + + // still started but no longer active + self->is_active = tsk_false; + + return 0; +} + +static tsk_bool_t _tnet_ice_ctx_fsm_cond_NotStarted(tnet_ice_ctx_t* self, const void* _any) +{ + return (!self || !self->is_started); +} + +static int _tnet_ice_ctx_restart(tnet_ice_ctx_t* self) +{ + int ret = 0; + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + tsk_list_lock(self->candidates_local); + tsk_list_clear_items(self->candidates_local); + tsk_list_unlock(self->candidates_local); + + ret = tsk_fsm_set_current_state(self->fsm, _fsm_state_Started); + ret = _tnet_ice_ctx_fsm_act_async(self, _fsm_action_GatherHostCandidates); + + self->is_active = (ret == 0); + return ret; +} + +// build pairs as per RFC 5245 section "5.7.1. Forming Candidate Pairs" +int _tnet_ice_ctx_build_pairs(tnet_ice_candidates_L_t* local_candidates, tnet_ice_candidates_L_t* remote_candidates, tnet_ice_pairs_L_t* result_pairs, tsk_bool_t is_controlling, uint64_t tie_breaker, tsk_bool_t is_ice_jingle) +{ + const tsk_list_item_t *item_local, *item_remote; + const tnet_ice_candidate_t *cand_local, *cand_remote; + tnet_ice_pair_t *pair; + if(TSK_LIST_IS_EMPTY(local_candidates) || TSK_LIST_IS_EMPTY(remote_candidates) || !result_pairs){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + tsk_list_clear_items(result_pairs); + + tsk_list_lock(local_candidates); + tsk_list_lock(remote_candidates); + tsk_list_lock(result_pairs); + + tsk_list_foreach(item_local, local_candidates){ + if(!(cand_local = item_local->data)){ + continue; + } + tsk_list_foreach(item_remote, remote_candidates){ + if(!(cand_remote = item_remote->data)){ + continue; + } + + if((cand_remote->comp_id != cand_local->comp_id) || (cand_remote->transport_e != cand_local->transport_e)){ + continue; + } + + if((pair = tnet_ice_pair_create(cand_local, cand_remote, is_controlling, tie_breaker, is_ice_jingle))){ + tsk_list_push_descending_data(result_pairs, (void**)&pair); + } + } + } + + tsk_list_unlock(local_candidates); + tsk_list_unlock(remote_candidates); + tsk_list_unlock(result_pairs); + + return 0; +} + +static int _tnet_ice_ctx_fsm_act_async(tnet_ice_ctx_t* self, tsk_fsm_action_id action_id) +{ + tnet_ice_action_t *action = tsk_null; + tnet_ice_event_t* e = tsk_null; + static const char* phrase = "$action$"; + int ret = 0; + + if(!self || !self->fsm){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + if(!(action = tnet_ice_action_create(action_id))){ + TSK_DEBUG_ERROR("Failed to create action"); + return -2; + } + + if((e = tnet_ice_event_create(tnet_ice_event_type_action, phrase, self->userdata))){ + tnet_ice_event_set_action(e, action); + TSK_RUNNABLE_ENQUEUE_OBJECT_SAFE(TSK_RUNNABLE(self), e); + goto bail; + } + else{ + TSK_DEBUG_ERROR("Failed to create ICE event"); + ret = -2; + goto bail; + } + +bail: + TSK_OBJECT_SAFE_FREE(e); + TSK_OBJECT_SAFE_FREE(action); + return ret; +} + +static int _tnet_ice_ctx_signal_async(tnet_ice_ctx_t* self, tnet_ice_event_type_t type, const char* phrase) +{ + tnet_ice_event_t* e; + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if((e = tnet_ice_event_create(type, phrase, self->userdata))){ + TSK_RUNNABLE_ENQUEUE_OBJECT_SAFE(TSK_RUNNABLE(self), e); + return 0; + } + else{ + TSK_DEBUG_ERROR("Failed to create ICE event"); + return -2; + } +} + +static void *_tnet_ice_ctx_run(void* self) +{ + tsk_list_item_t *curr; + tnet_ice_ctx_t *ctx = self; + tnet_ice_event_t *e; + + TSK_DEBUG_INFO("ICE CTX::run -- START"); + + TSK_RUNNABLE_RUN_BEGIN(ctx); + + if((curr = TSK_RUNNABLE_POP_FIRST(ctx))){ + e = (tnet_ice_event_t*)curr->data; + switch(e->type){ + case tnet_ice_event_type_action: + { + if(e->action){ + tsk_fsm_act(ctx->fsm, e->action->id, ctx, e->action, ctx, e->action); + } + break; + } + default: + { + if(ctx->callback){ + ctx->callback(e); + } + break; + } + } + tsk_object_unref(curr); + } + + TSK_RUNNABLE_RUN_END(ctx); + + TSK_DEBUG_INFO("ICE CTX::run -- STOP"); + + tsk_list_clear_items(ctx->candidates_local); + tsk_list_clear_items(ctx->candidates_remote); + tsk_list_clear_items(ctx->candidates_pairs); + + return 0; +} diff --git a/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_ctx.h b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_ctx.h new file mode 100644 index 00000000..505f85fe --- /dev/null +++ b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_ctx.h @@ -0,0 +1,78 @@ +/* +* Copyright (C) 2012 Doubango Telecom . +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tnet_ice_ctx.h + * @brief Interactive Connectivity Establishment (ICE) implementation as per RFC 5245. + * @author Mamadou Diop + */ + +#ifndef TNET_ICE_CTX_H +#define TNET_ICE_CTX_H + +#include "tinynet_config.h" + +#include "tnet_types.h" + +#include "tsk_common.h" + +TNET_BEGIN_DECLS + +struct tnet_ice_event_s; + +typedef int (*tnet_ice_callback_f)(const struct tnet_ice_event_s *e); +typedef int (*tnet_ice_rtp_callback_f)(const void* callback_data, const uint8_t* data_ptr, tsk_size_t data_size, tnet_fd_t local_fd, const struct sockaddr_storage* remote_addr); + +TINYNET_API struct tnet_ice_ctx_s* tnet_ice_ctx_create(tsk_bool_t is_ice_jingle, tsk_bool_t use_ipv6, tsk_bool_t use_rtcp, tsk_bool_t is_video, tnet_ice_callback_f callback, const void* userdata); +TINYNET_API int tnet_ice_ctx_set_userdata(struct tnet_ice_ctx_s* self, const void* userdata); +TINYNET_API int tnet_ice_ctx_set_stun( + struct tnet_ice_ctx_s* self, + const char* server_addr, + uint16_t server_port, + const char* software, + const char* username, + const char* password); +TINYNET_API int tnet_ice_ctx_start(struct tnet_ice_ctx_s* self); +TINYNET_API int tnet_ice_ctx_rtp_callback(struct tnet_ice_ctx_s* self, tnet_ice_rtp_callback_f rtp_callback, const void* rtp_callback_data); +TINYNET_API int tnet_ice_ctx_set_concheck_timeout(struct tnet_ice_ctx_s* self, int64_t timeout); +TINYNET_API int tnet_ice_ctx_set_remote_candidates(struct tnet_ice_ctx_s* self, const char* candidates, const char* ufrag, const char* pwd, tsk_bool_t is_controlling, tsk_bool_t is_ice_jingle); +TINYNET_API tsk_bool_t tnet_ice_ctx_got_local_candidates(const struct tnet_ice_ctx_s* self); +TINYNET_API const struct tnet_ice_candidate_s* tnet_ice_ctx_get_local_candidate_at(const struct tnet_ice_ctx_s* self, tsk_size_t index); +TINYNET_API tsk_bool_t tnet_ice_ctx_is_started(const struct tnet_ice_ctx_s* self); +TINYNET_API tsk_bool_t tnet_ice_ctx_is_active(const struct tnet_ice_ctx_s* self); +TINYNET_API tsk_bool_t tnet_ice_ctx_is_connected(const struct tnet_ice_ctx_s* self); +TINYNET_API tsk_bool_t tnet_ice_ctx_is_can_send(const struct tnet_ice_ctx_s* self); +TINYNET_API tsk_bool_t tnet_ice_ctx_is_can_recv(const struct tnet_ice_ctx_s* self); +TINYNET_API tsk_bool_t tnet_ice_ctx_use_ipv6(const struct tnet_ice_ctx_s* self); +TINYNET_API tsk_bool_t tnet_ice_ctx_use_rtcp(const struct tnet_ice_ctx_s* self); +TINYNET_API int tnet_ice_ctx_get_nominated_symetric_candidates(const struct tnet_ice_ctx_s* self, uint32_t comp_id, + const struct tnet_ice_candidate_s** candidate_offer, + const struct tnet_ice_candidate_s** candidate_answer_src, + const struct tnet_ice_candidate_s** candidate_answer_dest); +TINYNET_API int tnet_ice_ctx_recv_stun_message(struct tnet_ice_ctx_s* self, const void* data, tsk_size_t size, tnet_fd_t local_fd, const struct sockaddr_storage* remote_addr, tsk_bool_t *role_conflict); + +TINYNET_API int tnet_ice_ctx_cancel(struct tnet_ice_ctx_s* self); +TINYNET_API int tnet_ice_ctx_stop(struct tnet_ice_ctx_s* self); + + +TNET_END_DECLS + +#endif /* TNET_ICE_CTX_H */ diff --git a/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_event.c b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_event.c new file mode 100644 index 00000000..69f03ec3 --- /dev/null +++ b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_event.c @@ -0,0 +1,84 @@ +/* +* Copyright (C) 2012 Doubango Telecom . +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#include "tnet_ice_event.h" + +#include "tsk_string.h" +#include "tsk_memory.h" +#include "tsk_debug.h" + +static tsk_object_t* tnet_ice_event_ctor(tsk_object_t * self, va_list * app) +{ + tnet_ice_event_t *e = self; + if(e){ + + } + return self; +} +static tsk_object_t* tnet_ice_event_dtor(tsk_object_t * self) +{ + tnet_ice_event_t *e = self; + if(e){ + TSK_SAFE_FREE(e->phrase); + TSK_OBJECT_SAFE_FREE(e->action); + } + + return self; +} +static const tsk_object_def_t tnet_ice_event_def_s = +{ + sizeof(tnet_ice_event_t), + tnet_ice_event_ctor, + tnet_ice_event_dtor, + tsk_null, +}; +const tsk_object_def_t *tnet_ice_event_def_t = &tnet_ice_event_def_s; + + +tnet_ice_event_t* tnet_ice_event_create(tnet_ice_event_type_t type, const char* phrase, const void* userdata) +{ + tnet_ice_event_t* e; + + if((e = tsk_object_new(tnet_ice_event_def_t))){ + e->type = type; + e->phrase = tsk_strdup(phrase); + e->userdata = userdata; + } + else{ + TSK_DEBUG_ERROR("Failed to create ICE event"); + } + + return e; +} + +int tnet_ice_event_set_action(tnet_ice_event_t* self, struct tnet_ice_action_s* action) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + self->type = tnet_ice_event_type_action; + TSK_OBJECT_SAFE_FREE(self->action); + if(action){ + self->action = tsk_object_ref(action); + } + return 0; +} diff --git a/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_event.h b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_event.h new file mode 100644 index 00000000..fac537f4 --- /dev/null +++ b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_event.h @@ -0,0 +1,72 @@ +/* +* Copyright (C) 2012 Doubango Telecom . +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +#ifndef TNET_ICE_EVENT_H +#define TNET_ICE_EVENT_H + +#include "tinynet_config.h" + +#include "tsk_object.h" + +TNET_BEGIN_DECLS + +typedef enum tnet_ice_event_type_e +{ + // Public events + tnet_ice_event_type_started, + tnet_ice_event_type_start_failed, + tnet_ice_event_type_stopped, + tnet_ice_event_type_stop_failed, + tnet_ice_event_type_gathering_host_candidates_failed, + tnet_ice_event_type_gathering_host_candidates_succeed, + tnet_ice_event_type_gathering_reflexive_candidates_failed, + tnet_ice_event_type_gathering_reflexive_candidates_succeed, + tnet_ice_event_type_gathering_completed, + tnet_ice_event_type_conncheck_succeed, + tnet_ice_event_type_conncheck_failed, + tnet_ice_event_type_cancelled, + + // Private events + tnet_ice_event_type_action +} +tnet_ice_event_type_t; + +typedef struct tnet_ice_event_s +{ + TSK_DECLARE_OBJECT; + + tnet_ice_event_type_t type; + char* phrase; + struct tnet_ice_action_s* action; + + const void* userdata; +} +tnet_ice_event_t; + +TINYNET_GEXTERN const tsk_object_def_t *tnet_ice_event_def_t; + +tnet_ice_event_t* tnet_ice_event_create(tnet_ice_event_type_t type, const char* phrase, const void* userdata); +int tnet_ice_event_set_action(tnet_ice_event_t* self, struct tnet_ice_action_s* action); + +TNET_END_DECLS + +#endif /* TNET_ICE_EVENT_H */ diff --git a/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_pair.c b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_pair.c new file mode 100644 index 00000000..7643f6d4 --- /dev/null +++ b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_pair.c @@ -0,0 +1,632 @@ +#include "tnet_ice_pair.h" +#include "tnet_ice_utils.h" +#include "tnet_ice_candidate.h" + +#include "stun/tnet_stun.h" +#include "stun/tnet_stun_message.h" + +#include "tnet_endianness.h" +#include "tnet_utils.h" + +#include "tsk_hmac.h" +#include "tsk_memory.h" +#include "tsk_string.h" +#include "tsk_debug.h" + +static int __pred_find_by_pair(const tsk_list_item_t *item, const void *pair) +{ + if(item && item->data){ + const tnet_ice_pair_t *_pair = item->data; + return (_pair - ((const tnet_ice_pair_t *)pair)); + } + return -1; +} + + +static tsk_object_t* tnet_ice_pair_ctor(tsk_object_t * self, va_list * app) +{ + tnet_ice_pair_t *pair = self; + if(pair){ + pair->state_offer = tnet_ice_pair_state_frozen; + pair->state_answer = tnet_ice_pair_state_frozen; + } + return self; +} +static tsk_object_t* tnet_ice_pair_dtor(tsk_object_t * self) +{ + tnet_ice_pair_t *pair = self; + if(pair){ + TSK_OBJECT_SAFE_FREE(pair->candidate_offer); + TSK_OBJECT_SAFE_FREE(pair->candidate_answer); + TSK_OBJECT_SAFE_FREE(pair->last_request); + } + return self; +} +static int tnet_ice_pair_cmp(const tsk_object_t *_p1, const tsk_object_t *_p2) +{ + const tnet_ice_pair_t *p1 = _p1; + const tnet_ice_pair_t *p2 = _p2; + + if(p1 && p2){ + return (int)(p1->priority - p2->priority); + } + else if(!p1 && !p2) return 0; + else return -1; +} +static const tsk_object_def_t tnet_ice_pair_def_s = +{ + sizeof(tnet_ice_pair_t), + tnet_ice_pair_ctor, + tnet_ice_pair_dtor, + tnet_ice_pair_cmp, +}; + +tnet_ice_pair_t* tnet_ice_pair_create(const tnet_ice_candidate_t* candidate_offer, const tnet_ice_candidate_t* candidate_answer, tsk_bool_t is_controlling, uint64_t tie_breaker, tsk_bool_t is_ice_jingle) +{ + tnet_ice_pair_t *pair; + if(!candidate_offer || !candidate_answer){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + if((pair = tsk_object_new(&tnet_ice_pair_def_s))){ + pair->candidate_offer = tsk_object_ref((tsk_object_t*)candidate_offer); + pair->candidate_answer = tsk_object_ref((tsk_object_t*)candidate_answer); + pair->is_controlling = is_controlling; + pair->tie_breaker = tie_breaker; + pair->is_ice_jingle = is_ice_jingle; + pair->priority = (((uint64_t)TSK_MIN(candidate_offer->priority, candidate_answer->priority)) << 32) + + (TSK_MAX(candidate_offer->priority, candidate_answer->priority) << 1) + + ((candidate_offer->priority > candidate_answer->priority) ? 1 : 0); + } + + return pair; +} + +int tnet_ice_pair_send_conncheck(tnet_ice_pair_t *self) +{ + char* username = tsk_null; + const char* password; + uint32_t priority; + struct sockaddr_storage remote_addr; + tnet_stun_attribute_t *stun_att; + int ret; + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if(ret = tnet_sockaddr_init(self->candidate_answer->connection_addr, self->candidate_answer->port, self->candidate_offer->socket->type, &remote_addr)){ + TNET_PRINT_LAST_ERROR("tnet_sockaddr_init(%s:%d) failed", self->candidate_answer->connection_addr, self->candidate_answer->port); + goto bail; + } + + // 7.1.2.3. Forming Credentials + // username= "RFRAG:LFRAG" + // password= "RPASS" + if(self->is_ice_jingle){ + tsk_sprintf(&username, "%s%s", tnet_ice_candidate_get_ufrag(self->candidate_answer), tnet_ice_candidate_get_ufrag(self->candidate_offer)); + } + else{ + tsk_sprintf(&username, "%s:%s", tnet_ice_candidate_get_ufrag(self->candidate_answer), tnet_ice_candidate_get_ufrag(self->candidate_offer)); + } + password = tnet_ice_candidate_get_pwd(self->candidate_answer); + + if(!self->last_request && (self->last_request = tnet_stun_message_create(username, password))){ + self->last_request->type = stun_binding_request; + + // 7.1.2.1. PRIORITY + priority = tnet_ice_utils_get_priority(tnet_ice_cand_type_prflx, self->candidate_offer->local_pref, self->candidate_offer->is_rtp); + if((stun_att = (tnet_stun_attribute_t*)tnet_stun_attribute_ice_priority_create(priority))){ + tnet_stun_message_add_attribute(self->last_request, &stun_att); + } + // 7.1.2.1. USE-CANDIDATE + if(self->is_controlling){ // aggressive mode + if((stun_att = (tnet_stun_attribute_t*)tnet_stun_attribute_ice_use_candidate_create())){ + tnet_stun_message_add_attribute(self->last_request, &stun_att); + } + } + // 7.1.2.2. ICE-CONTROLLING / ICE-CONTROLLED + if(self->is_controlling){ + if((stun_att = (tnet_stun_attribute_t*)tnet_stun_attribute_ice_controlling_create(self->tie_breaker))){ + tnet_stun_message_add_attribute(self->last_request, &stun_att); + } + } + else{ + if((stun_att = (tnet_stun_attribute_t*)tnet_stun_attribute_ice_controlled_create(self->tie_breaker))){ + tnet_stun_message_add_attribute(self->last_request, &stun_att); + } + } + + // SOFTWARE + if((stun_att = (tnet_stun_attribute_t*)tnet_stun_attribute_software_create(TNET_SOFTWARE, tsk_strlen(TNET_SOFTWARE)))){ + tnet_stun_message_add_attribute(self->last_request, &stun_att); + } + } + else if(self->last_request){ + if(self->is_controlling){ + tnet_stun_message_remove_attribute(self->last_request, stun_ice_controlled); + if(!tnet_stun_message_has_attribute(self->last_request, stun_ice_controlling)){ + if((stun_att = (tnet_stun_attribute_t*)tnet_stun_attribute_ice_controlling_create(self->tie_breaker))){ + tnet_stun_message_add_attribute(self->last_request, &stun_att); + } + } + if(!tnet_stun_message_has_attribute(self->last_request, stun_ice_use_candidate)){ + if((stun_att = (tnet_stun_attribute_t*)tnet_stun_attribute_ice_use_candidate_create())){ + tnet_stun_message_add_attribute(self->last_request, &stun_att); + } + } + } + else{ + tnet_stun_message_remove_attribute(self->last_request, stun_ice_use_candidate); + tnet_stun_message_remove_attribute(self->last_request, stun_ice_controlling); + if(!tnet_stun_message_has_attribute(self->last_request, stun_ice_controlled)){ + if((stun_att = (tnet_stun_attribute_t*)tnet_stun_attribute_ice_controlled_create(self->tie_breaker))){ + tnet_stun_message_add_attribute(self->last_request, &stun_att); + } + } + } + } + + if(self->last_request){ + tsk_buffer_t *req_buffer; + self->last_request->fingerprint = !self->is_ice_jingle; + if((req_buffer = tnet_stun_message_serialize(self->last_request))){ + int sendBytes = tnet_sockfd_sendto(self->candidate_offer->socket->fd, (const struct sockaddr*)&remote_addr, req_buffer->data, req_buffer->size); + TSK_OBJECT_SAFE_FREE(req_buffer); + } + } + +bail: + TSK_FREE(username); + + if(ret == 0 && self->state_offer == tnet_ice_pair_state_frozen){ + self->state_offer = tnet_ice_pair_state_in_progress; + } + + return ret; +} + +int tnet_ice_pair_send_response(tnet_ice_pair_t *self, const tnet_stun_request_t* request, const short code, const char* phrase, const struct sockaddr_storage *remote_addr) +{ + tnet_stun_message_t* message; + const char *password, *username; + int ret = -1; + tnet_stun_attribute_t *stun_att = tsk_null; + struct sockaddr_storage dest_addr; + tsk_bool_t is_error = ((code / 100) != 2); + + if(!self || !phrase || !request){ + TSK_DEBUG_ERROR("Invalid paramter"); + return -1; + } + + if(ret = tnet_sockaddr_init(self->candidate_answer->connection_addr, self->candidate_answer->port, self->candidate_offer->socket->type, &dest_addr)){ + TNET_PRINT_LAST_ERROR("tnet_sockaddr_init(%s:%d) failed", self->candidate_answer->connection_addr, self->candidate_answer->port); + return ret; + } + + username = tsk_null; + password = tnet_ice_candidate_get_pwd(self->candidate_offer); + + if((message = tnet_stun_message_create(username, password))){ + tsk_buffer_t *req_buffer; + + message->type = is_error ? stun_binding_error_response : stun_binding_success_response; + memcpy(message->transaction_id, request->transaction_id, sizeof(request->transaction_id)); + message->nointegrity = self->is_ice_jingle; + message->fingerprint = !self->is_ice_jingle; + + // ERROR + if(is_error){ + tnet_stun_attribute_errorcode_t* stun_att_err; + if((stun_att_err = tnet_stun_attribute_errorcode_create(tsk_null, 0))){ + stun_att_err->_class = ((code / 100) & 0x07); + stun_att_err->number = (code - ((code / 100) * 100)); + stun_att_err->reason_phrase = tsk_strdup(phrase); + TNET_STUN_ATTRIBUTE(stun_att_err)->length = 4 + tsk_strlen(phrase); + tnet_stun_message_add_attribute(message, (tnet_stun_attribute_t**)&stun_att_err); + } + } + else{ + tnet_stun_attribute_xmapped_addr_t* stun_att_xma; + if(self->is_ice_jingle){ + const tnet_stun_attribute_username_t * stun_att_usr_name; + tnet_stun_attribute_mapped_addr_t* stun_att_ma; + + // USERNAME + if((stun_att_usr_name = (const tnet_stun_attribute_username_t *)tnet_stun_message_get_attribute(request, stun_username))){ + stun_att_usr_name = tsk_object_ref((tsk_object_t*)stun_att_usr_name); + tnet_stun_message_add_attribute(message, (tnet_stun_attribute_t**)&stun_att_usr_name); + } + + // MAPPED-ADDRESS + if((stun_att_ma = tnet_stun_attribute_mapped_address_create(tsk_null, 0))){ + uint32_t addr; + if(TNET_SOCKET_TYPE_IS_IPV6(self->candidate_offer->socket->type)){ + tsk_size_t i; + const struct sockaddr_in6* sin6 = (const struct sockaddr_in6*)remote_addr; + stun_att_ma->family = stun_ipv6; + stun_att_ma->port = tnet_ntohs(sin6->sin6_port); + for(i = 0; i < 16; i+=4){ + addr = tnet_ntohl_2(&sin6->sin6_addr.s6_addr[i]); + memcpy(&stun_att_ma->address[i], &addr, 4); + } + TNET_STUN_ATTRIBUTE(stun_att_ma)->length = 4 + 16; + } + else{ + const struct sockaddr_in* sin = (const struct sockaddr_in*)remote_addr; + stun_att_ma->family = stun_ipv4; + stun_att_ma->port = tnet_ntohs(sin->sin_port); + addr = tnet_ntohl(sin->sin_addr.s_addr); + memcpy(&stun_att_ma->address[0], &addr, 4); + TNET_STUN_ATTRIBUTE(stun_att_ma)->length = 4 + 4; + } + tnet_stun_message_add_attribute(message, (tnet_stun_attribute_t**)&stun_att_ma); + } + } + + // XOR-MAPPED-ADDRESS + if((stun_att_xma = tnet_stun_attribute_xmapped_address_create(tsk_null, 0))){//JINGLE_ICE + tsk_size_t addr_size; + tsk_size_t i; + uint32_t addr; + if(TNET_SOCKET_TYPE_IS_IPV6(self->candidate_offer->socket->type)){ + addr_size = 16; + stun_att_xma->family = stun_ipv6; + } + else{ + addr_size = 4; + stun_att_xma->family = stun_ipv4; + } + + if(stun_att_xma->family == stun_ipv4){ + const struct sockaddr_in* sin = (const struct sockaddr_in*)remote_addr; + stun_att_xma->xport = tnet_ntohs(sin->sin_port) ^ 0x2112; + addr = (tnet_ntohl(sin->sin_addr.s_addr) ^ TNET_STUN_MAGIC_COOKIE); + memcpy(&stun_att_xma->xaddress[0], &addr, 4); + } + else{ + const struct sockaddr_in6* sin6 = (const struct sockaddr_in6*)remote_addr; + stun_att_xma->xport = tnet_ntohs(sin6->sin6_port) ^ 0x2112; + for(i = 0; i < addr_size; i+=4){ + addr = (tnet_ntohl_2(&sin6->sin6_addr.s6_addr[i]) ^ TNET_STUN_MAGIC_COOKIE); + memcpy(&stun_att_xma->xaddress[i], &addr, 4); + } + } + + TNET_STUN_ATTRIBUTE(stun_att_xma)->length = 4 + addr_size; + tnet_stun_message_add_attribute(message, (tnet_stun_attribute_t**)&stun_att_xma); + } + + // SOFTWARE + if((stun_att = (tnet_stun_attribute_t*)tnet_stun_attribute_software_create(TNET_SOFTWARE, tsk_strlen(TNET_SOFTWARE)))){ + tnet_stun_message_add_attribute(message, &stun_att); + } + } + + if((req_buffer = tnet_stun_message_serialize(message))){ + int sendBytes = tnet_sockfd_sendto(self->candidate_offer->socket->fd, (const struct sockaddr*)&dest_addr, req_buffer->data, req_buffer->size); + TSK_OBJECT_SAFE_FREE(req_buffer); + ret = (sendBytes > 0) ? 0 : -2; + } + + TSK_OBJECT_SAFE_FREE(message); + } + + if(ret == 0 && !is_error){ + tsk_bool_t change_state = + self->is_ice_jingle || // ICE-JINGLE don't have ICE-CONTROLLING/ICE-CONTROLLED attributes + (!self->is_controlling && tnet_stun_message_has_attribute(request, stun_ice_use_candidate)) || // Sender is controlling and uses "ICE-USE-CANDIDATE" attribute + (self->is_controlling) // We always use agressive nomination and final check-list will have high-priority pairs on the top + ; + if(change_state){ + self->state_answer = tnet_ice_pair_state_succeed; + } + } + + return ret; +} + +int tnet_ice_pair_auth_conncheck(const tnet_ice_pair_t *self, const tnet_stun_request_t* request, const void* request_buff, tsk_size_t request_buff_size, short* resp_code, char** resp_phrase) +{ + const uint8_t* _request_buff = (const uint8_t*)request_buff; + + const tnet_stun_attribute_t* stun_att; + const tnet_stun_attribute_username_t *stun_att_usr_name; + const tnet_stun_attribute_fingerprint_t *stun_att_fingerprint; + const tnet_stun_attribute_integrity_t *stun_att_integrity; + + const tsk_list_item_t *item; + tsk_sha1digest_t hmac; + const char* pwd; + + tsk_size_t msg_integrity_start = 0, length, i; + + if(!self || !request || !request_buff || !request_buff_size || !resp_code || !resp_phrase){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if(!TNET_IS_STUN2_MSG(_request_buff, request_buff_size)){ + TSK_DEBUG_ERROR("Not STUN buffer"); + return -1; + } + + pwd = tnet_ice_candidate_get_pwd(self->candidate_offer); + stun_att_usr_name = tsk_null; + stun_att_fingerprint = tsk_null; + stun_att_integrity = tsk_null; + + tsk_list_foreach(item, request->attributes){ + if((!(stun_att = item->data))){ + continue; + } + + switch(stun_att->type){ + case stun_username: + { + stun_att_usr_name = (const tnet_stun_attribute_username_t *)stun_att; + break; + } + case stun_fingerprint: + { + stun_att_fingerprint = (const tnet_stun_attribute_fingerprint_t *)stun_att; + break; + } + case stun_message_integrity: + { + stun_att_integrity = (const tnet_stun_attribute_integrity_t *)stun_att; + break; + } + } + + if(!stun_att_integrity){ + if((length = (4 + stun_att->length)) & 0x03){ + length += (4 - (length & 0x03)); + } + msg_integrity_start += length; + } + } + + if(!stun_att_usr_name){ + TSK_DEBUG_ERROR("USERNAME is missing"); + *resp_code = 400; + tsk_strupdate(resp_phrase, "USERNAME is missing"); + return -2; + } + + if(!stun_att_integrity){ + if(self->is_ice_jingle){ // Bug introduced in Chrome 20.0.1120.0 + *resp_code = 200; + tsk_strupdate(resp_phrase, "MESSAGE-INTEGRITY is missing by accepted"); + return 0; + } + else{ + TSK_DEBUG_ERROR("MESSAGE-INTEGRITY is missing"); + *resp_code = 400; + tsk_strupdate(resp_phrase, "MESSAGE-INTEGRITY is missing"); + return -3; + } + } + + if((TNET_STUN_HEADER_SIZE + msg_integrity_start) >= request_buff_size){ + TSK_DEBUG_ERROR("Invalid length"); + *resp_code = 400; + tsk_strupdate(resp_phrase, "Invalid length"); + return -20; + } + + if(request->length != msg_integrity_start){ + tsk_size_t size = (TNET_STUN_HEADER_SIZE + msg_integrity_start); + uint8_t* new_buffer = (uint8_t*)tsk_calloc(size, 1); + if(!new_buffer){ + TSK_DEBUG_ERROR("Failed to allocate buffer with size = %u", msg_integrity_start); + return -30; + } + memcpy(new_buffer, request_buff, size); + length = msg_integrity_start + (2/* Type */ + 2 /* Length */+ TSK_SHA1_DIGEST_SIZE /* INTEGRITY VALUE*/); + new_buffer[2] = (length >> 8) & 0xFF; + new_buffer[3] = (length & 0xFF); + hmac_sha1digest_compute(new_buffer, size, pwd, tsk_strlen(pwd), hmac); + TSK_FREE(new_buffer); + } + else{ + // must never happen + hmac_sha1digest_compute(request_buff, request_buff_size, pwd, tsk_strlen(pwd), hmac); + } + + for(i = 0; i < TSK_SHA1_DIGEST_SIZE; ++i){ + if(hmac[i] != stun_att_integrity->sha1digest[i]){ + TSK_DEBUG_ERROR("MESSAGE-INTEGRITY MISMATCH"); + *resp_code = 401; + tsk_strupdate(resp_phrase, "MESSAGE-INTEGRITY MISMATCH"); + return -40; + } + } + + *resp_code = 200; + tsk_strupdate(resp_phrase, "Ok"); + + return 0; +} + +int tnet_ice_pair_recv_response(tnet_ice_pair_t *self, const tnet_stun_response_t* response) +{ + if(self && response){ + if(self->last_request && tnet_stun_message_transac_id_equals(self->last_request->transaction_id, response->transaction_id)){ + // ignore errors (e.g. STALE-CREDENTIALS) which could happen in some special cases before success + if(TNET_STUN_RESPONSE_IS_SUCCESS(response)){ + self->state_offer = tnet_ice_pair_state_succeed; + } + } + } + return 0; +} + +const tnet_ice_pair_t* tnet_ice_pairs_find_by_response(tnet_ice_pairs_L_t* pairs, const tnet_stun_message_t* response) +{ + if(pairs && response){ + const tsk_list_item_t *item; + const tnet_ice_pair_t *pair; + tsk_list_foreach(item, pairs){ + if(!(pair = item->data)){ + continue; + } + if(pair->last_request && tnet_stun_message_transac_id_equals(pair->last_request->transaction_id, response->transaction_id)){ + return pair; + } + } + } + return tsk_null; +} + +const tnet_ice_pair_t* tnet_ice_pairs_find_by_fd_and_addr(tnet_ice_pairs_L_t* pairs, uint16_t local_fd, const struct sockaddr_storage *remote_addr) +{ + int ret; + const tsk_list_item_t *item; + const tnet_ice_pair_t *pair; + tnet_ip_t remote_ip; + tnet_port_t remote_port; + + if(!pairs || !remote_addr){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + if((ret = tnet_get_sockip_n_port((const struct sockaddr*)remote_addr, &remote_ip, &remote_port))){ + TNET_PRINT_LAST_ERROR("tnet_get_sockip_n_port() failed"); + return tsk_null; + } + + tsk_list_foreach(item, pairs){ + if(!(pair = item->data) || !pair->candidate_offer->socket || pair->candidate_offer->socket->fd != local_fd){ + continue; + } + if(!tsk_striequals(pair->candidate_answer->connection_addr, remote_ip) || pair->candidate_answer->port != remote_port){ + continue; + } + + return pair; + } + + return tsk_null; +} + +// both RTP and RTCP have succeeded +#define _tnet_ice_pairs_get_nominated_at(pairs, dir, index, ret) \ +{ \ + ret = tsk_null; \ + if(pairs){ \ + const tsk_list_item_t *item; \ + const tnet_ice_pair_t *pair; \ + tsk_size_t pos; \ + tsk_bool_t nominated; \ + tsk_list_foreach(item, pairs){ \ + if(!(pair = item->data)){ \ + continue; \ + } \ + if(pair->state_##dir == tnet_ice_pair_state_succeed){ \ + /* find another pair with same foundation (e.g. host) but different comp-id (e.g. RTCP) */ \ + const tsk_list_item_t *item2; \ + const tnet_ice_pair_t *pair2; \ + pos = 0; \ + nominated = tsk_true; \ + tsk_list_foreach(item2, pairs){ \ + if(!(pair2 = item2->data)){ \ + continue; \ + } \ + if((tsk_striequals(pair2->candidate_##dir->foundation, pair->candidate_##dir->foundation)) \ + && (pair2->candidate_##dir->comp_id != pair2->candidate_##dir->comp_id) \ + && (pair2->state_##dir != tnet_ice_pair_state_succeed)){ \ + nominated = tsk_false; \ + break; \ + } \ + } \ + \ + if(nominated && (pos++ >= index)){ \ + ret = pair; \ + break; \ + }\ + } \ + } \ + } \ +} \ + +// true only if both RTP and RTCP are nominated +tsk_bool_t tnet_ice_pairs_has_nominated_offer(const tnet_ice_pairs_L_t* pairs) +{ + const tnet_ice_pair_t *pair_ = tsk_null; + _tnet_ice_pairs_get_nominated_at((pairs), offer, 0, (pair_)); + return (pair_ != tsk_null); +} + +// true only if both RTP and RTCP are nominated +tsk_bool_t tnet_ice_pairs_has_nominated_answer(const tnet_ice_pairs_L_t* pairs) +{ + const tnet_ice_pair_t *pair_ = tsk_null; + _tnet_ice_pairs_get_nominated_at((pairs), answer, 0, (pair_)); + return (pair_ != tsk_null); +} + +// true only if both RTP and RTCP are nominated in symetric way +tsk_bool_t tnet_ice_pairs_has_nominated_symetric(const tnet_ice_pairs_L_t* pairs, tsk_bool_t check_rtcp) +{ + const tnet_ice_candidate_t *candidate_offer, *candidate_answer_src, *candidate_answer_dest; + tsk_bool_t is_nominated_rtp, is_nominated_rtcp = tsk_true; + + int ret = tnet_ice_pairs_get_nominated_symetric(pairs, TNET_ICE_CANDIDATE_COMPID_RTP, &candidate_offer, &candidate_answer_src, &candidate_answer_dest); + is_nominated_rtp = (ret == 0 && candidate_offer && candidate_answer_src && candidate_answer_dest); + if(is_nominated_rtp && check_rtcp){ + ret = tnet_ice_pairs_get_nominated_symetric(pairs, TNET_ICE_CANDIDATE_COMPID_RTCP, &candidate_offer, &candidate_answer_src, &candidate_answer_dest); + is_nominated_rtcp = (ret == 0 && candidate_offer && candidate_answer_src && candidate_answer_dest); + } + return (is_nominated_rtp && is_nominated_rtcp); +} + +// gets symetric nominated candidates with the highest priority +// will succeed only if both RTP and RTCP are ok +int tnet_ice_pairs_get_nominated_symetric(const tnet_ice_pairs_L_t* pairs, uint32_t comp_id, + const tnet_ice_candidate_t** candidate_offer, + const tnet_ice_candidate_t** candidate_answer_src, + const tnet_ice_candidate_t** candidate_answer_dest) +{ + const tnet_ice_pair_t *pair_offer = tsk_null; + const tnet_ice_pair_t *pair_answer = tsk_null; + tsk_size_t i_offer, i_answer; + + if(!pairs || !candidate_offer || !candidate_answer_src || !candidate_answer_dest){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + *candidate_offer = tsk_null; + *candidate_answer_src = tsk_null; + *candidate_answer_dest = tsk_null; + + i_offer = 0; + while(1){ + _tnet_ice_pairs_get_nominated_at((pairs), offer, i_offer, (pair_offer)); // pair with socket SO as sender + if(!pair_offer) return 0; + ++i_offer; + if(pair_offer->candidate_offer->comp_id != comp_id) continue; + // find another pair with socket SO as receiver + + i_answer = 0; + while(1){ + _tnet_ice_pairs_get_nominated_at((pairs), answer, i_answer, (pair_answer)); + if(!pair_answer) break; + ++i_answer; + if(pair_answer->candidate_offer->comp_id != comp_id) continue; + if(pair_answer->candidate_offer == pair_offer->candidate_offer){ + *candidate_offer = pair_offer->candidate_offer; + *candidate_answer_src = pair_answer->candidate_answer; + *candidate_answer_dest = pair_offer->candidate_answer; + return 0; + } + } + } + return 0; + +} diff --git a/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_pair.h b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_pair.h new file mode 100644 index 00000000..e5e42ca2 --- /dev/null +++ b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_pair.h @@ -0,0 +1,76 @@ +/* +* Copyright (C) 2012 Doubango Telecom . +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#ifndef TNET_ICE_PAIR_H +#define TNET_ICE_PAIR_H + +#include "tinynet_config.h" + +#include "tnet_types.h" + +#include "tsk_list.h" + +typedef tsk_list_t tnet_ice_pairs_L_t; + +struct tnet_ice_candidate_s; + +typedef enum tnet_ice_pair_state_e +{ + tnet_ice_pair_state_frozen, + tnet_ice_pair_state_waiting, + tnet_ice_pair_state_in_progress, + tnet_ice_pair_state_succeed, + tnet_ice_pair_state_failed +} +tnet_ice_pair_state_t; + +typedef struct tnet_ice_pair_s +{ + TSK_DECLARE_OBJECT; + + uint64_t priority; + tnet_ice_pair_state_t state_offer; + tnet_ice_pair_state_t state_answer; + tsk_bool_t is_ice_jingle; + tsk_bool_t is_controlling; + uint64_t tie_breaker; + struct tnet_ice_candidate_s* candidate_offer; + struct tnet_ice_candidate_s* candidate_answer; + struct tnet_stun_message_s* last_request; +} +tnet_ice_pair_t; + +tnet_ice_pair_t* tnet_ice_pair_create(const struct tnet_ice_candidate_s* candidate_offer, const struct tnet_ice_candidate_s* candidate_answer, tsk_bool_t is_controlling, uint64_t tie_breaker, tsk_bool_t is_ice_jingle); +int tnet_ice_pair_send_conncheck(tnet_ice_pair_t *self); +int tnet_ice_pair_send_response(tnet_ice_pair_t *self, const struct tnet_stun_message_s* request, const short code, const char* phrase, const struct sockaddr_storage *remote_addr); +int tnet_ice_pair_auth_conncheck(const tnet_ice_pair_t *self, const struct tnet_stun_message_s* request, const void* request_buff, tsk_size_t request_buff_size, short* resp_code, char** resp_phrase); +int tnet_ice_pair_recv_response(tnet_ice_pair_t *self, const struct tnet_stun_message_s* response); +const tnet_ice_pair_t* tnet_ice_pairs_find_by_response(tnet_ice_pairs_L_t* pairs, const struct tnet_stun_message_s* response); +const tnet_ice_pair_t* tnet_ice_pairs_find_by_fd_and_addr(tnet_ice_pairs_L_t* pairs, uint16_t local_fd, const struct sockaddr_storage *remote_addr); +tsk_bool_t tnet_ice_pairs_has_nominated_offer(const tnet_ice_pairs_L_t* pairs); +tsk_bool_t tnet_ice_pairs_has_nominated_answer(const tnet_ice_pairs_L_t* pairs); +tsk_bool_t tnet_ice_pairs_has_nominated_symetric(const tnet_ice_pairs_L_t* pairs, tsk_bool_t check_rtcp); +int tnet_ice_pairs_get_nominated_symetric(const tnet_ice_pairs_L_t* pairs, uint32_t comp_id, + const struct tnet_ice_candidate_s** candidate_offer, + const struct tnet_ice_candidate_s** candidate_answer_src, + const struct tnet_ice_candidate_s** candidate_answer_dest); + +#endif /* TNET_ICE_PAIR_H */ diff --git a/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_utils.c b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_utils.c new file mode 100644 index 00000000..ee255709 --- /dev/null +++ b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_utils.c @@ -0,0 +1,145 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ + +#include "tnet_ice_utils.h" +#include "tnet_ice_candidate.h" +#include "tnet_socket.h" + +#include "tsk_time.h" +#include "tsk_string.h" +#include "tsk_debug.h" + +#include + +static const char ice_chars[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'k', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'K', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + '0','1', '2', '3', '4', '5', '6', '7', '8', '9'}; // /!\do not add '/' and '+' because WebRTC password +static const tsk_size_t ice_chars_count = sizeof(ice_chars); + +uint32_t tnet_ice_utils_get_priority(tnet_ice_cand_type_t type, uint16_t local_pref, tsk_bool_t is_rtp) +{ + uint32_t pref; + switch(type){ + case tnet_ice_cand_type_host: pref = TNET_ICE_CANDIDATE_PREF_HOST; break; + case tnet_ice_cand_type_srflx: pref = TNET_ICE_CANDIDATE_PREF_SRFLX; break; + case tnet_ice_cand_type_prflx: pref = TNET_ICE_CANDIDATE_PREF_PRFLX; break; + case tnet_ice_cand_type_relay: default: pref = TNET_ICE_CANDIDATE_PREF_RELAY; break; + } + return (pref << 24) + + (local_pref << 8) + + ((256 - (is_rtp ? TNET_ICE_CANDIDATE_COMPID_RTP : TNET_ICE_CANDIDATE_COMPID_RTCP)) << 0); +} + + +int tnet_ice_utils_compute_foundation(char* foundation, tsk_size_t size) +{ + + tsk_size_t i; + + if(!foundation || !size){ + TSK_DEBUG_ERROR("Invalid argument"); + return -1; + } + for( + i = 0; i < size; ++i){ + foundation[i] = ice_chars[(rand() ^ rand()) % ice_chars_count]; + } + + return 0; +} + +int tnet_ice_utils_create_sockets(tnet_socket_type_t socket_type, const char* local_ip, tnet_socket_t** socket_rtp, tnet_socket_t** socket_rtcp) +{ + tsk_bool_t look4_rtp = (socket_rtp != tsk_null); + tsk_bool_t look4_rtcp = (socket_rtcp != tsk_null); + uint8_t retry_count = 4; + static const uint64_t port_range_start = 1024; + static const uint64_t port_range_stop = 65535; + static uint64_t counter = 0; + + /* Creates local rtp and rtcp sockets */ + while(retry_count--){ + /* random number in the range [start - stop] */ + tnet_port_t local_port = (tnet_port_t)(((tsk_time_epoch() ^ ++counter) % (port_range_stop - port_range_start)) + port_range_start); + local_port = (local_port & 0xFFFE); /* turn to even number */ + + /* beacuse failure will cause errors in the log, print a message to alert that there is + * nothing to worry about */ + TSK_DEBUG_INFO("RTP/RTCP manager[Begin]: Trying to bind to random ports"); + + if(look4_rtp){ + if(!(*socket_rtp = tnet_socket_create(local_ip, local_port, socket_type))){ + TSK_DEBUG_INFO("Failed to bind to %d", local_port); + continue; + } + } + + if(look4_rtcp){ + if(!(*socket_rtcp = tnet_socket_create(local_ip, (local_port + 1), socket_type))){ + TSK_DEBUG_INFO("Failed to bind to %d", (local_port + 1)); + if(look4_rtp){ + TSK_OBJECT_SAFE_FREE((*socket_rtp)); + } + continue; + } + } + + TSK_DEBUG_INFO("RTP/RTCP manager[End]: Trying to bind to random ports"); + return 0; + } + + TSK_DEBUG_ERROR("Failed to bind sockets"); + return -1; +} + +int tnet_ice_utils_set_ufrag(char** ufrag) +{ + if(ufrag){ + char tmp[16]; int i; + for(i = 0; i < (sizeof(tmp)/sizeof(tmp[0])) - 1; ++i){ + tmp[i] = ice_chars[(rand() ^ rand()) % ice_chars_count]; + } + tmp[i] = '\0'; + tsk_strupdate(ufrag, tmp); + return 0; + } + else{ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } +} + +int tnet_ice_utils_set_pwd(char** pwd) +{ + if(pwd){ + char tmp[22]; int i; + for(i = 0; i < (sizeof(tmp)/sizeof(tmp[0])) - 1; ++i){ + tmp[i] = ice_chars[(rand() ^ rand()) % ice_chars_count]; + } + tmp[i] = '\0'; + tsk_strupdate(pwd, tmp); + return 0; + } + else{ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } +} \ No newline at end of file diff --git a/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_utils.h b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_utils.h new file mode 100644 index 00000000..32e918f4 --- /dev/null +++ b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_utils.h @@ -0,0 +1,40 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ + +#ifndef TNET_ICE_UTILS_H +#define TNET_ICE_UTILS_H + +#include "tinynet_config.h" + +#include "tsk_common.h" + +enum tnet_ice_cand_type_e type; +enum tnet_socket_type_e socket_type; +struct tnet_socket_s; + +uint32_t tnet_ice_utils_get_priority(enum tnet_ice_cand_type_e type, uint16_t local_pref, tsk_bool_t is_rtp); +int tnet_ice_utils_compute_foundation(char* foundation, tsk_size_t size); +int tnet_ice_utils_create_sockets(enum tnet_socket_type_e socket_type, const char* local_ip, struct tnet_socket_s** socket_rtp, struct tnet_socket_s** socket_rtcp); +int tnet_ice_utils_set_ufrag(char** ufrag); +int tnet_ice_utils_set_pwd(char** pwd); + + +#endif /* TNET_ICE_UTILS_H */ diff --git a/branches/2.0/doubango/tinyNET/src/stun/tnet_stun.c b/branches/2.0/doubango/tinyNET/src/stun/tnet_stun.c index da559014..bd47f527 100644 --- a/branches/2.0/doubango/tinyNET/src/stun/tnet_stun.c +++ b/branches/2.0/doubango/tinyNET/src/stun/tnet_stun.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_stun.c * @brief Session Traversal Utilities for NAT (STUN) implementation as per RFC 5389 and RFC 3489(Obsolete). * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -63,10 +63,11 @@ tnet_stun_binding_t* tnet_stun_binding_create(tnet_fd_t fd, tnet_socket_type_t s tnet_stun_message_t *tnet_stun_create_request(const tnet_stun_binding_t* binding) { tnet_stun_message_t *message = tnet_stun_message_create(binding->username, binding->password); - message->realm = tsk_strdup(binding->realm); - message->nonce = tsk_strdup(binding->nonce); if(message){ + message->realm = tsk_strdup(binding->realm); + message->nonce = tsk_strdup(binding->nonce); + /* Set the request type (RFC 5389 defines only one type) */ message->type = stun_binding_request; @@ -123,7 +124,7 @@ tnet_stun_response_t* tnet_stun_send_unreliably(tnet_fd_t localFD, uint16_t RTO, fd_set set; tsk_buffer_t *buffer = tnet_stun_message_serialize(message); - tnet_stun_response_t *response = 0; + tnet_stun_response_t *response = tsk_null; if(!buffer) { @@ -403,7 +404,9 @@ static tsk_object_t* tnet_stun_binding_ctor(tsk_object_t * self, va_list * app) binding->username = tsk_strdup(va_arg(*app, const char*)); binding->password = tsk_strdup(va_arg(*app, const char*)); - tnet_sockaddr_init(server_address, server_port, binding->socket_type, &binding->server); + if(server_address){ + tnet_sockaddr_init(server_address, server_port, binding->socket_type, &binding->server); + } binding->software = tsk_strdup(TNET_SOFTWARE); } diff --git a/branches/2.0/doubango/tinyNET/src/stun/tnet_stun.h b/branches/2.0/doubango/tinyNET/src/stun/tnet_stun.h index c7a53fbe..4d131ee7 100644 --- a/branches/2.0/doubango/tinyNET/src/stun/tnet_stun.h +++ b/branches/2.0/doubango/tinyNET/src/stun/tnet_stun.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_stun.h * @brief Session Traversal Utilities for NAT (STUN) implementation as per RFC 5389 and RFC 3489(Obsolete). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/stun/tnet_stun_attribute.c b/branches/2.0/doubango/tinyNET/src/stun/tnet_stun_attribute.c index 750325c1..740b7e13 100644 --- a/branches/2.0/doubango/tinyNET/src/stun/tnet_stun_attribute.c +++ b/branches/2.0/doubango/tinyNET/src/stun/tnet_stun_attribute.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_stun_attribute.c * @brief STUN2(RFC 5389) attribute parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -151,6 +151,39 @@ tnet_stun_attribute_altserver_t* tnet_stun_attribute_altserver_create(const void return tsk_object_new(tnet_stun_attribute_altserver_def_t, payload, payload_size); } + + +/**@ingroup tnet_stun_group +* RFC 5245 - 19.1. PRIORITY */ +tnet_stun_attribute_ice_priority_t* tnet_stun_attribute_ice_priority_create(uint32_t value) +{ + return tsk_object_new(tnet_stun_attribute_ice_priority_def_t, value); +} + +/**@ingroup tnet_stun_group +* RFC 5245 - 19.1. USE_CANDIDATE */ +tnet_stun_attribute_ice_use_candidate_t* tnet_stun_attribute_ice_use_candidate_create() +{ + return tsk_object_new(tnet_stun_attribute_ice_use_candidate_def_t); +} + +/**@ingroup tnet_stun_group +* RFC 5245 - 19.1. ICE_CONTROLLED */ +tnet_stun_attribute_ice_controlled_t* tnet_stun_attribute_ice_controlled_create(uint64_t value) +{ + return tsk_object_new(tnet_stun_attribute_ice_controlled_def_t, value); +} + +/**@ingroup tnet_stun_group +* RFC 5245 - 19.1. ICE_CONTROLLING */ +tnet_stun_attribute_ice_controlling_t* tnet_stun_attribute_ice_controlling_create(uint64_t value) +{ + return tsk_object_new(tnet_stun_attribute_ice_controlling_def_t, value); +} + + + + /**@ingroup tnet_stun_group * Creates @ref tnet_stun_attribute_t from raw buffer. * @param data Raw buffer from which to create the STUN attribute.* @@ -277,6 +310,41 @@ tnet_stun_attribute_t* tnet_stun_attribute_deserialize(const void* data, tsk_siz break; } + /* RFC 5245 - 19.1. PRIORITY */ + case stun_ice_priority: + { + if(length >= 4){ + uint32_t value = dataPtr[0] << 24 | dataPtr[1] << 16 | dataPtr[2] << 8 | dataPtr[3]; + attribute = (tnet_stun_attribute_t *)tnet_stun_attribute_ice_priority_create(value); + } + break; + } + /* RFC 5245 - 19.1. USE_CANDIDATE */ + case stun_ice_use_candidate: + { + attribute = (tnet_stun_attribute_t *)tnet_stun_attribute_ice_use_candidate_create(); + break; + } + /* RFC 5245 - 19.1. ICE_CONTROLLED*/ + case stun_ice_controlled: + { + if(length >= 8){ + uint64_t value = ((((uint64_t)dataPtr[0]) << 56) | (((uint64_t)dataPtr[1]) << 48) | (((uint64_t)dataPtr[2]) << 40) | (((uint64_t)dataPtr[3]) << 32) | (((uint64_t)dataPtr[4]) << 24) | (((uint64_t)dataPtr[5]) << 16) | ((uint64_t)dataPtr[6]) << 8 | ((uint64_t)dataPtr[7])); + attribute = (tnet_stun_attribute_t *)tnet_stun_attribute_ice_controlled_create(value); + } + break; + } + /* RFC 5245 - 19.1. ICE_CONTROLLING*/ + case stun_ice_controlling: + { + if(length >= 8){ + uint64_t value = ((((uint64_t)dataPtr[0]) << 56) | (((uint64_t)dataPtr[1]) << 48) | (((uint64_t)dataPtr[2]) << 40) | (((uint64_t)dataPtr[3]) << 32) | (((uint64_t)dataPtr[4]) << 24) | (((uint64_t)dataPtr[5]) << 16) | ((uint64_t)dataPtr[6]) << 8 | ((uint64_t)dataPtr[7])); + attribute = (tnet_stun_attribute_t *)tnet_stun_attribute_ice_controlling_create(value); + } + break; + } + + default: //TSK_DEBUG_WARN("==> NOT IMPLEMENTED"); break; @@ -320,111 +388,177 @@ int tnet_stun_attribute_serialize(const tnet_stun_attribute_t* attribute, tsk_bu tsk_buffer_append(output, &(length), 2); } - /* Attribute Value - */ + /* Attribute Value */ + // NEED to be refactorized switch(attribute->type){ - /* RFC 5389 - 15.1. MAPPED-ADDRESS */ - case stun_mapped_address: - { - TSK_DEBUG_ERROR("NOT IMPLEMENTED"); - return -3; - } + /* RFC 5389 - 15.1. MAPPED-ADDRESS */ + case stun_mapped_address: + { + uint32_t u32 = 0; + tnet_stun_attribute_mapped_addr_t* ma = (tnet_stun_attribute_mapped_addr_t*)attribute; + tsk_size_t addr_size, i; + uint32_t addr[4]; - /* RFC 5389 - 15.2. XOR-MAPPED-ADDRESS*/ - case stun_xor_mapped_address: - { - TSK_DEBUG_ERROR("NOT IMPLEMENTED"); - return -3; - } + u32 |= (ma->family << 16); + u32 |= (ma->port); + u32 = tnet_htonl(u32); + tsk_buffer_append(output, &u32, 4); - /* RFC 5389 - 15.3. USERNAME*/ - case stun_username: - { - tnet_stun_attribute_username_t *username = (tnet_stun_attribute_username_t*)attribute; - tsk_buffer_append(output, username->value, tsk_strlen(username->value)); - return 0; - } + addr_size = (ma->family == stun_ipv6 ? 16 : 4); + for(i = 0; i < addr_size; i += 4){ + addr[i >> 2] = tnet_htonl_2(&ma->address[i]); + } + tsk_buffer_append(output, addr, addr_size); + + return 0; + } + + /* RFC 5389 - 15.2. XOR-MAPPED-ADDRESS*/ + case stun_xor_mapped_address: + { + uint32_t u32 = 0; + tnet_stun_attribute_xmapped_addr_t* xma = (tnet_stun_attribute_xmapped_addr_t*)attribute; + tsk_size_t addr_size, i; + uint32_t addr[4]; + + u32 |= (xma->family << 16); + u32 |= (xma->xport); + u32 = tnet_htonl(u32); + tsk_buffer_append(output, &u32, 4); + + addr_size = (xma->family == stun_ipv6 ? 16 : 4); + for(i = 0; i < addr_size; i += 4){ + addr[i >> 2] = tnet_htonl_2(&xma->xaddress[i]); + } + tsk_buffer_append(output, addr, addr_size); + return 0; + } + + /* RFC 5389 - 15.3. USERNAME*/ + case stun_username: + { + tnet_stun_attribute_username_t *username = (tnet_stun_attribute_username_t*)attribute; + tsk_buffer_append(output, username->value, tsk_strlen(username->value)); + return 0; + } - /* RFC 5389 - MESSAGE-INTEGRITY*/ - case stun_message_integrity: - { - tnet_stun_attribute_integrity_t *integrity = (tnet_stun_attribute_integrity_t*)attribute; - tsk_buffer_append(output, integrity->sha1digest, TSK_SHA1_DIGEST_SIZE); - return 0; - } + /* RFC 5389 - MESSAGE-INTEGRITY*/ + case stun_message_integrity: + { + tnet_stun_attribute_integrity_t *integrity = (tnet_stun_attribute_integrity_t*)attribute; + tsk_buffer_append(output, integrity->sha1digest, TSK_SHA1_DIGEST_SIZE); + return 0; + } - /* RFC 5389 - 15.5. FINGERPRINT*/ - case stun_fingerprint: - { - uint32_t fingerprint = /*tnet_htonl*/(((tnet_stun_attribute_fingerprint_t*)attribute)->value); - tsk_buffer_append(output, &fingerprint, 4); - return 0; - } + /* RFC 5389 - 15.5. FINGERPRINT*/ + case stun_fingerprint: + { + uint32_t fingerprint = /*tnet_htonl*/(((tnet_stun_attribute_fingerprint_t*)attribute)->value); + tsk_buffer_append(output, &fingerprint, 4); + return 0; + } - /* RFC 5389 - 15.6. ERROR-CODE*/ - case stun_error_code: - { - TSK_DEBUG_ERROR("NOT IMPLEMENTED"); - return -3; - } + /* RFC 5389 - 15.6. ERROR-CODE*/ + case stun_error_code: + { + uint32_t u32 = 0; + tnet_stun_attribute_errorcode_t *errorcode = (tnet_stun_attribute_errorcode_t*)attribute; + u32 |= (errorcode->_class & 0x07) << 8; + u32 |= errorcode->number; + u32 = tnet_htonl(u32); + tsk_buffer_append(output, &u32, 4); + tsk_buffer_append(output, errorcode->reason_phrase, tsk_strlen(errorcode->reason_phrase)); + return 0; + } - /* RFC 5389 - 15.7. REALM*/ - case stun_realm: - { - tnet_stun_attribute_realm_t *realm = (tnet_stun_attribute_realm_t*)attribute; - tsk_buffer_append(output, realm->value, tsk_strlen(realm->value)); - return 0; - } + /* RFC 5389 - 15.7. REALM*/ + case stun_realm: + { + tnet_stun_attribute_realm_t *realm = (tnet_stun_attribute_realm_t*)attribute; + tsk_buffer_append(output, realm->value, tsk_strlen(realm->value)); + return 0; + } - /* RFC 5389 - 15.8. NONCE*/ - case stun_nonce: - { - tnet_stun_attribute_nonce_t *nonce = (tnet_stun_attribute_nonce_t*)attribute; - tsk_buffer_append(output, nonce->value, tsk_strlen(nonce->value)); - return 0; - } + /* RFC 5389 - 15.8. NONCE*/ + case stun_nonce: + { + tnet_stun_attribute_nonce_t *nonce = (tnet_stun_attribute_nonce_t*)attribute; + tsk_buffer_append(output, nonce->value, tsk_strlen(nonce->value)); + return 0; + } - /* RFC 5389 - 15.9. UNKNOWN-ATTRIBUTES*/ - case stun_unknown_attributes: - { - TSK_DEBUG_ERROR("NOT IMPLEMENTED"); - return -3; - } + /* RFC 5389 - 15.9. UNKNOWN-ATTRIBUTES*/ + case stun_unknown_attributes: + { + TSK_DEBUG_ERROR("NOT IMPLEMENTED"); + return -3; + } - /* RFC 5389 - 15.10. SOFTWARE */ - case stun_software: - { - tnet_stun_attribute_software_t *software = (tnet_stun_attribute_software_t*)attribute; - tsk_buffer_append(output, software->value, tsk_strlen(software->value)); - return 0; - } + /* RFC 5389 - 15.10. SOFTWARE */ + case stun_software: + { + tnet_stun_attribute_software_t *software = (tnet_stun_attribute_software_t*)attribute; + tsk_buffer_append(output, software->value, tsk_strlen(software->value)); + return 0; + } - /* RFC 5389 - 15.11. ALTERNATE-SERVER */ - case stun_alternate_server: - { - TSK_DEBUG_ERROR("NOT IMPLEMENTED"); - return -3; - } - /* draft-ietf-behave-turn-16 - */ - case stun_channel_number: - case stun_lifetime: - case stun_reserved2: - case stun_xor_peer_address: - case stun_data: - case stun_xor_relayed_address: - case stun_even_port: - case stun_requested_transport: - case stun_dont_fragment: - case stun_reserved3: - case stun_reservation_token: - { - return tnet_turn_attribute_serialize(attribute, output); - } + /* RFC 5389 - 15.11. ALTERNATE-SERVER */ + case stun_alternate_server: + { + TSK_DEBUG_ERROR("NOT IMPLEMENTED"); + return -3; + } + /* draft-ietf-behave-turn-16 - */ + case stun_channel_number: + case stun_lifetime: + case stun_reserved2: + case stun_xor_peer_address: + case stun_data: + case stun_xor_relayed_address: + case stun_even_port: + case stun_requested_transport: + case stun_dont_fragment: + case stun_reserved3: + case stun_reservation_token: + { + return tnet_turn_attribute_serialize(attribute, output); + } - default: - return -2; + + /* RFC 5245 - 19.1. PRIORITY */ + case stun_ice_priority: + { + uint32_t value = tnet_htonl(((tnet_stun_attribute_ice_priority_t*)attribute)->value); + tsk_buffer_append(output, &value, 4); + return 0; + } + /* RFC 5245 - 19.1. USE_CANDIDATE */ + case stun_ice_use_candidate: + { + // no body + return 0; + } + /* RFC 5245 - 19.1. ICE_CONTROLLED */ + case stun_ice_controlled: + { + uint64_t value = ((tnet_stun_attribute_ice_controlled_t*)attribute)->value; + value = ((((uint64_t)tnet_htonl(value >> 32)) << 32) | ((uint64_t)tnet_htonl(value & 0xFFFFFFFF))); + tsk_buffer_append(output, &value, 8); + return 0; + } + /* RFC 5245 - 19.1. ICE_CONTROLLING */ + case stun_ice_controlling: + { + uint64_t value = ((tnet_stun_attribute_ice_controlling_t*)attribute)->value; + value = ((((uint64_t)tnet_htonl(value >> 32)) << 32) | ((uint64_t)tnet_htonl(value & 0xFFFFFFFF))); + tsk_buffer_append(output, &value, 8); + return 0; + } + + default: + return -2; } } @@ -435,9 +569,9 @@ int tnet_stun_attribute_serialize(const tnet_stun_attribute_t* attribute, tsk_bu */ void tnet_stun_attribute_pad(const tnet_stun_attribute_t* attribute, tsk_buffer_t *output) { - if(attribute->length%4){ + if(attribute->length & 0x03){ static uint32_t zeros = 0x00000000; - tsk_buffer_append(output, &zeros, 4-(attribute->length%4)); + tsk_buffer_append(output, &zeros, 4-(attribute->length & 0x03)); } } @@ -485,10 +619,7 @@ static tsk_object_t* tnet_stun_attribute_mapped_addr_ctor(tsk_object_t * self, v if(payload && payload_size){ const uint8_t *payloadPtr = (const uint8_t*)payload; - payloadPtr += 1; /* Ignore first 8bits */ - - TNET_STUN_ATTRIBUTE(attribute)->type = stun_mapped_address; - TNET_STUN_ATTRIBUTE(attribute)->length = payload_size; + payloadPtr += 1; /* Ignore first 8bits */ attribute->family = (tnet_stun_addr_family_t) (*(payloadPtr++)); attribute->port = tnet_ntohs_2(payloadPtr); @@ -513,6 +644,9 @@ static tsk_object_t* tnet_stun_attribute_mapped_addr_ctor(tsk_object_t * self, v } } } + + TNET_STUN_ATTRIBUTE(attribute)->type = stun_mapped_address; + TNET_STUN_ATTRIBUTE(attribute)->length = payload_size; } return self; } @@ -547,9 +681,6 @@ static tsk_object_t* tnet_stun_attribute_xmapped_addr_ctor(tsk_object_t * self, if(payload && payload_size){ const uint8_t *payloadPtr = (const uint8_t*)payload; payloadPtr += 1; /* Ignore first 8bits */ - - TNET_STUN_ATTRIBUTE(attribute)->type = stun_xor_mapped_address; - TNET_STUN_ATTRIBUTE(attribute)->length = payload_size; attribute->family = (tnet_stun_addr_family_t)(*(payloadPtr++)); @@ -586,6 +717,9 @@ static tsk_object_t* tnet_stun_attribute_xmapped_addr_ctor(tsk_object_t * self, } } } + + TNET_STUN_ATTRIBUTE(attribute)->type = stun_xor_mapped_address; + TNET_STUN_ATTRIBUTE(attribute)->length = payload_size; } return self; @@ -958,3 +1092,133 @@ static const tsk_object_def_t tnet_stun_attribute_altserver_def_s = }; const tsk_object_def_t *tnet_stun_attribute_altserver_def_t = &tnet_stun_attribute_altserver_def_s; + +//================================================================================================= +// [[RFC 5245 - 19.1. PRIORITY]] object definition +// +static tsk_object_t* tnet_stun_attribute_ice_priority_ctor(tsk_object_t * self, va_list * app) +{ + tnet_stun_attribute_ice_priority_t *attribute = self; + if(attribute){ + attribute->value = va_arg(*app, uint32_t); + + TNET_STUN_ATTRIBUTE(attribute)->type = stun_ice_priority; + TNET_STUN_ATTRIBUTE(attribute)->length = 4; + } + return self; +} + +static tsk_object_t* tnet_stun_attribute_ice_priority_dtor(tsk_object_t * self) +{ + tnet_stun_attribute_ice_priority_t *attribute = self; + if(attribute){ + } + return self; +} + +static const tsk_object_def_t tnet_stun_attribute_ice_priority_def_s = +{ + sizeof(tnet_stun_attribute_ice_priority_t), + tnet_stun_attribute_ice_priority_ctor, + tnet_stun_attribute_ice_priority_dtor, + tsk_null, +}; +const tsk_object_def_t *tnet_stun_attribute_ice_priority_def_t = &tnet_stun_attribute_ice_priority_def_s; + + +//================================================================================================= +// [[RFC 5245 - 19.1. USE-CANDIDATE]] object definition +// +static tsk_object_t* tnet_stun_attribute_ice_use_candidate_ctor(tsk_object_t * self, va_list * app) +{ + tnet_stun_attribute_ice_use_candidate_t *attribute = self; + if(attribute){ + TNET_STUN_ATTRIBUTE(attribute)->type = stun_ice_use_candidate; + TNET_STUN_ATTRIBUTE(attribute)->length = 0; + } + return self; +} + +static tsk_object_t* tnet_stun_attribute_ice_use_candidate_dtor(tsk_object_t * self) +{ + tnet_stun_attribute_ice_use_candidate_t *attribute = self; + if(attribute){ + } + return self; +} + +static const tsk_object_def_t tnet_stun_attribute_ice_use_candidate_def_s = +{ + sizeof(tnet_stun_attribute_ice_use_candidate_t), + tnet_stun_attribute_ice_use_candidate_ctor, + tnet_stun_attribute_ice_use_candidate_dtor, + tsk_null, +}; +const tsk_object_def_t *tnet_stun_attribute_ice_use_candidate_def_t = &tnet_stun_attribute_ice_use_candidate_def_s; + + +//================================================================================================= +// [[RFC 5245 - 19.1. ICE-CONTROLLED]] object definition +// +static tsk_object_t* tnet_stun_attribute_ice_controlled_ctor(tsk_object_t * self, va_list * app) +{ + tnet_stun_attribute_ice_controlled_t *attribute = self; + if(attribute){ + attribute->value = va_arg(*app, uint64_t); + + TNET_STUN_ATTRIBUTE(attribute)->type = stun_ice_controlled; + TNET_STUN_ATTRIBUTE(attribute)->length = 8; + } + return self; +} + +static tsk_object_t* tnet_stun_attribute_ice_controlled_dtor(tsk_object_t * self) +{ + tnet_stun_attribute_ice_controlled_t *attribute = self; + if(attribute){ + } + return self; +} + +static const tsk_object_def_t tnet_stun_attribute_ice_controlled_def_s = +{ + sizeof(tnet_stun_attribute_ice_controlled_t), + tnet_stun_attribute_ice_controlled_ctor, + tnet_stun_attribute_ice_controlled_dtor, + tsk_null, +}; +const tsk_object_def_t *tnet_stun_attribute_ice_controlled_def_t = &tnet_stun_attribute_ice_controlled_def_s; + + + +//================================================================================================= +// [[RFC 5245 - 19.1. ICE-CONTROLLING]] object definition +// +static tsk_object_t* tnet_stun_attribute_ice_controlling_ctor(tsk_object_t * self, va_list * app) +{ + tnet_stun_attribute_ice_controlling_t *attribute = self; + if(attribute){ + attribute->value = va_arg(*app, uint64_t); + + TNET_STUN_ATTRIBUTE(attribute)->type = stun_ice_controlling; + TNET_STUN_ATTRIBUTE(attribute)->length = 8; + } + return self; +} + +static tsk_object_t* tnet_stun_attribute_ice_controlling_dtor(tsk_object_t * self) +{ + tnet_stun_attribute_ice_controlling_t *attribute = self; + if(attribute){ + } + return self; +} + +static const tsk_object_def_t tnet_stun_attribute_ice_controlling_def_s = +{ + sizeof(tnet_stun_attribute_ice_controlling_t), + tnet_stun_attribute_ice_controlling_ctor, + tnet_stun_attribute_ice_controlling_dtor, + tsk_null, +}; +const tsk_object_def_t *tnet_stun_attribute_ice_controlling_def_t = &tnet_stun_attribute_ice_controlling_def_s; diff --git a/branches/2.0/doubango/tinyNET/src/stun/tnet_stun_attribute.h b/branches/2.0/doubango/tinyNET/src/stun/tnet_stun_attribute.h index 6e8a8507..ba7a4061 100644 --- a/branches/2.0/doubango/tinyNET/src/stun/tnet_stun_attribute.h +++ b/branches/2.0/doubango/tinyNET/src/stun/tnet_stun_attribute.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_stun_attribute.h * @brief STUN2(RFC 5389) attribute parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -63,8 +63,7 @@ tnet_stun_addr_family_t; **/ typedef enum tnet_stun_attribute_type_e { - /* === RFC 5389 - Comprehension-required range (0x0000-0x7FFF): - */ + /* === RFC 5389 - Comprehension-required range (0x0000-0x7FFF) */ stun_reserved = 0x0000, /**< (Reserved) */ stun_mapped_address = 0x0001, /**< http://tools.ietf.org/html/rfc5389#page-32 */ stun_response_address = 0x0002, /**< (Reserved; was RESPONSE-ADDRESS) */ @@ -81,14 +80,12 @@ typedef enum tnet_stun_attribute_type_e stun_nonce = 0x0015, /**< http://tools.ietf.org/html/rfc5389#page-38 */ stun_xor_mapped_address = 0x0020, /**< http://tools.ietf.org/html/rfc5389#page-33 */ - /* === RFC 5389 - Comprehension-optional range (0x8000-0xFFFF) - */ + /* === RFC 5389 - Comprehension-optional range (0x8000-0xFFFF) */ stun_software = 0x8022, /**< http://tools.ietf.org/html/rfc5389#page-39 */ stun_alternate_server = 0x8023, /**< http://tools.ietf.org/html/rfc5389#page-39 */ stun_fingerprint = 0x8028, /**< http://tools.ietf.org/html/rfc5389#page-36 */ - /* === draft-ietf-behave-turn-16 - */ + /* === draft-ietf-behave-turn-16 */ stun_channel_number = 0x000C, /**< draft-ietf-behave-turn-16 - CHANNEL-NUMBER */ stun_lifetime = 0x000D, /**< draft-ietf-behave-turn-16 - LIFETIME */ stun_reserved2 = 0x0010, /**< draft-ietf-behave-turn-16 - Reserved (was BANDWIDTH) */ @@ -100,6 +97,12 @@ typedef enum tnet_stun_attribute_type_e stun_dont_fragment = 0x001A, /**< draft-ietf-behave-turn-16 - DONT-FRAGMENT */ stun_reserved3 = 0x0021, /**< draft-ietf-behave-turn-16 - Reserved (was TIMER-VAL) */ stun_reservation_token = 0x0022, /**< draft-ietf-behave-turn-16 - RESERVATION-TOKEN */ + + /* RFC 5245 */ + stun_ice_priority = 0x0024, /**< 21.2. STUN Attributes */ + stun_ice_use_candidate = 0x0025, /**< 21.2. STUN Attributes */ + stun_ice_controlled = 0x8029, /**< 21.2. STUN Attributes */ + stun_ice_controlling = 0x802A, /**< 21.2. STUN Attributes */ } tnet_stun_attribute_type_t; @@ -301,6 +304,44 @@ typedef struct tnet_stun_attribute_altserver_s tnet_stun_attribute_altserver_t; TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_altserver_def_t; +/**@ingroup tnet_stun_group +* RFC 5245 - 19.1. New Attributes */ +typedef struct tnet_stun_attribute_ice_priority_s +{ + TNET_STUN_DECLARE_ATTRIBUTE; + uint32_t value; +} +tnet_stun_attribute_ice_priority_t; +TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_ice_priority_def_t; + +/**@ingroup tnet_stun_group +* RFC 5245 - 19.1. New Attributes */ +typedef struct tnet_stun_attribute_ice_use_candidate_s +{ + TNET_STUN_DECLARE_ATTRIBUTE; +} +tnet_stun_attribute_ice_use_candidate_t; +TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_ice_use_candidate_def_t; + +/**@ingroup tnet_stun_group +* RFC 5245 - 19.1. New Attributes */ +typedef struct tnet_stun_attribute_ice_controlled_s +{ + TNET_STUN_DECLARE_ATTRIBUTE; + uint64_t value; +} +tnet_stun_attribute_ice_controlled_t; +TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_ice_controlled_def_t; + +/**@ingroup tnet_stun_group +* RFC 5245 - 19.1. New Attributes */ +typedef struct tnet_stun_attribute_ice_controlling_s +{ + TNET_STUN_DECLARE_ATTRIBUTE; + uint64_t value; +} +tnet_stun_attribute_ice_controlling_t; +TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_ice_controlling_def_t; tnet_stun_attribute_t* tnet_stun_attribute_deserialize(const void* data, tsk_size_t size); int tnet_stun_attribute_serialize(const tnet_stun_attribute_t* attribute, tsk_buffer_t *output); @@ -321,6 +362,10 @@ tnet_stun_attribute_nonce_t* tnet_stun_attribute_nonce_create(const void* payloa tnet_stun_attribute_unknowns_t* tnet_stun_attribute_unknowns_create(const void* payload, tsk_size_t payload_size); tnet_stun_attribute_software_t* tnet_stun_attribute_software_create(const void* payload, tsk_size_t payload_size); tnet_stun_attribute_altserver_t* tnet_stun_attribute_altserver_create(const void* payload, tsk_size_t payload_size); +tnet_stun_attribute_ice_priority_t* tnet_stun_attribute_ice_priority_create(uint32_t value); +tnet_stun_attribute_ice_use_candidate_t* tnet_stun_attribute_ice_use_candidate_create(); +tnet_stun_attribute_ice_controlled_t* tnet_stun_attribute_ice_controlled_create(uint64_t value); +tnet_stun_attribute_ice_controlling_t* tnet_stun_attribute_ice_controlling_create(uint64_t value); TNET_END_DECLS diff --git a/branches/2.0/doubango/tinyNET/src/stun/tnet_stun_message.c b/branches/2.0/doubango/tinyNET/src/stun/tnet_stun_message.c index 7f8466a8..f028d6e5 100644 --- a/branches/2.0/doubango/tinyNET/src/stun/tnet_stun_message.c +++ b/branches/2.0/doubango/tinyNET/src/stun/tnet_stun_message.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_stun_message.c * @brief STUN2 (RFC 5389) message parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -42,6 +42,15 @@ #include +static int __pred_find_attribute_by_type(const tsk_list_item_t *item, const void *att_type) +{ + if(item && item->data){ + tnet_stun_attribute_t *att = item->data; + tnet_stun_attribute_type_t type = *((tnet_stun_attribute_type_t*)att_type); + return (att->type - type); + } + return -1; +} /**@ingroup tnet_stun_group * Creates new STUN message. @@ -110,7 +119,7 @@ tsk_buffer_t* tnet_stun_message_serialize(const tnet_stun_message_t *self) /* Message Length ==> Will be updated after attributes have been added. */ { - uint16_t length = 0; + static const uint16_t length = 0; tsk_buffer_append(output, &(length), 2); } @@ -134,8 +143,7 @@ tsk_buffer_t* tnet_stun_message_serialize(const tnet_stun_message_t *self) TSK_OBJECT_SAFE_FREE(attribute); } - /*=== Attributes === - */ + /*=== Attributes === */ { tsk_list_item_t *item; tsk_list_foreach(item, self->attributes) @@ -147,21 +155,31 @@ tsk_buffer_t* tnet_stun_message_serialize(const tnet_stun_message_t *self) } /* AUTHENTICATION */ - if(self->realm && self->nonce){ - SERIALIZE_N_ADD_ATTRIBUTE(username, self->username, tsk_strlen(self->username)); + if(self->realm && self->nonce){ // long term SERIALIZE_N_ADD_ATTRIBUTE(realm, self->realm, tsk_strlen(self->realm)); SERIALIZE_N_ADD_ATTRIBUTE(nonce, self->nonce, tsk_strlen(self->nonce)); - compute_integrity = 1; + compute_integrity = !self->nointegrity; + } + else if(self->password){ // short term + compute_integrity = !self->nointegrity; + } + + if(compute_integrity && self->username){ + SERIALIZE_N_ADD_ATTRIBUTE(username, self->username, tsk_strlen(self->username)); } /* Message Length: The message length MUST contain the size, in bytes, of the message not including the 20-byte STUN header. */ { + // compute length for 'MESSAGE-INTEGRITY' + // will be computed again to store the correct value uint16_t length = (output->size) - TNET_STUN_HEADER_SIZE; +#if 0 if(self->fingerprint) length += (2/* Type */ + 2 /* Length */+ 4 /* FINGERPRINT VALUE*/); +#endif if(compute_integrity) length += (2/* Type */ + 2 /* Length */+ TSK_SHA1_DIGEST_SIZE /* INTEGRITY VALUE*/); @@ -176,24 +194,28 @@ tsk_buffer_t* tnet_stun_message_serialize(const tnet_stun_message_t *self) For long-term credentials ==> key = MD5(username ":" realm ":" SASLprep(password)) For short-term credentials ==> key = SASLprep(password) - FIXME: what about short term credentials? - FIXME: what about SASLprep */ - char* keystr = 0; + tsk_sha1digest_t hmac; - tsk_md5digest_t md5; + + if(self->username && self->realm && self->password){ // long term + char* keystr = tsk_null; + tsk_md5digest_t md5; + tsk_sprintf(&keystr, "%s:%s:%s", self->username, self->realm, self->password); + TSK_MD5_DIGEST_CALC(keystr, tsk_strlen(keystr), md5); + hmac_sha1digest_compute(output->data, output->size, (const char*)md5, TSK_MD5_DIGEST_SIZE, hmac); + + TSK_FREE(keystr); + } + else{ // short term + hmac_sha1digest_compute(output->data, output->size, self->password, tsk_strlen(self->password), hmac); + } - tsk_sprintf(&keystr, "%s:%s:%s", self->username, self->realm, self->password); - TSK_MD5_DIGEST_CALC(keystr, tsk_strlen(keystr), md5); - hmac_sha1digest_compute(output->data, output->size, (const char*)md5, TSK_MD5_DIGEST_SIZE, hmac); - SERIALIZE_N_ADD_ATTRIBUTE(integrity, hmac, TSK_SHA1_DIGEST_SIZE); - - TSK_FREE(keystr); } /* FINGERPRINT */ - if(self->fingerprint){ + if(self->fingerprint){//JINGLE_ICE /* RFC 5389 - 15.5. FINGERPRINT The FINGERPRINT attribute MAY be present in all STUN messages. The value of the attribute is computed as the CRC-32 of the STUN message @@ -209,6 +231,9 @@ tsk_buffer_t* tnet_stun_message_serialize(const tnet_stun_message_t *self) TSK_OBJECT_SAFE_FREE(attribute); } + // LENGTH + *(((uint16_t*)output->data)+1) = tnet_htons(((output->size) - TNET_STUN_HEADER_SIZE)); + bail: return output; } @@ -229,8 +254,7 @@ tnet_stun_message_t* tnet_stun_message_deserialize(const uint8_t *data, tsk_size uint8_t* dataPtr, *dataEnd; - if(!data || (size < TNET_STUN_HEADER_SIZE) || !TNET_IS_STUN2(data)) - { + if(!data || (size < TNET_STUN_HEADER_SIZE) || !TNET_IS_STUN2_MSG(data, size)){ goto bail; } @@ -273,7 +297,7 @@ tnet_stun_message_t* tnet_stun_message_deserialize(const uint8_t *data, tsk_size tnet_stun_attribute_t *attribute = tnet_stun_attribute_deserialize(dataPtr, (dataEnd - dataPtr)); if(attribute){ tsk_size_t att_size = (attribute->length + 2 /* Type*/ + 2/* Length */); - att_size += (att_size%4) ? 4-(att_size%4) : 0; // Skip zero bytes used to pad the attribute. + att_size += (att_size & 0x03) ? 4-(att_size & 0x03) : 0; // Skip zero bytes used to pad the attribute. dataPtr += att_size; tsk_list_push_back_data(message->attributes, (void**)&attribute); @@ -282,18 +306,20 @@ tnet_stun_message_t* tnet_stun_message_deserialize(const uint8_t *data, tsk_size } else{ continue; - } - - - - + } } - bail: return message; } +/**@ingroup tnet_stun_group +*/ +tsk_bool_t tnet_stun_message_has_attribute(const tnet_stun_message_t *self, tnet_stun_attribute_type_t type) +{ + return (tnet_stun_message_get_attribute(self, type) != tsk_null); +} + /**@ingroup tnet_stun_group * Adds an attribute to a STUN message. * @param self The STUN message into which to add the attribute. @@ -302,14 +328,24 @@ bail: */ int tnet_stun_message_add_attribute(tnet_stun_message_t *self, tnet_stun_attribute_t** attribute) { - //if(self && attribute) - { + if(self && attribute && *attribute){ tsk_list_push_back_data(self->attributes, (void**)attribute); return 0; } return -1; } +/**@ingroup tnet_stun_group +*/ +int tnet_stun_message_remove_attribute(tnet_stun_message_t *self, tnet_stun_attribute_type_t type) +{ + if(self && self->attributes){ + tsk_list_remove_item_by_pred(self->attributes, __pred_find_attribute_by_type, &type); + } + return 0; +} + + /**@ingroup tnet_stun_group * Gets a STUN attribute from a message. * @param self The message from which to get the attribute. @@ -387,8 +423,19 @@ int32_t tnet_stun_message_get_lifetime(const tnet_stun_message_t *self) return -1; } - - +/**@ingroup tnet_stun_group +*/ +tsk_bool_t tnet_stun_message_transac_id_equals(const tnet_stun_transacid_t id1, const tnet_stun_transacid_t id2) +{ + tsk_size_t i; + static const tsk_size_t size = sizeof(tnet_stun_transacid_t); + for(i = 0; i < size; i++){ + if(id1[i] != id2[i]){ + return tsk_false; + } + } + return tsk_true; +} @@ -410,6 +457,16 @@ static tsk_object_t* tnet_stun_message_ctor(tsk_object_t * self, va_list * app) message->fingerprint = 1; message->integrity = 0; + + { /* Create random transaction id */ + tsk_istr_t random; + tsk_md5digest_t digest; + + tsk_strrandom(&random); + TSK_MD5_DIGEST_CALC(random, sizeof(random), digest); + + memcpy(message->transaction_id, digest, TNET_STUN_TRANSACID_SIZE); + } } return self; } diff --git a/branches/2.0/doubango/tinyNET/src/stun/tnet_stun_message.h b/branches/2.0/doubango/tinyNET/src/stun/tnet_stun_message.h index 534c863a..056be8ff 100644 --- a/branches/2.0/doubango/tinyNET/src/stun/tnet_stun_message.h +++ b/branches/2.0/doubango/tinyNET/src/stun/tnet_stun_message.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_stun_message.h * @brief STUN2 (RFC 5389) message parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -43,11 +43,11 @@ TNET_BEGIN_DECLS #define TNET_STUN_CLASS_ERROR_MASK (0x0110) /**@ingroup tnet_stun_group -* @def TNET_STUN_RESPONSE_IS_REQUEST +* @def TNET_STUN_MESSAGE_IS_REQUEST * Checks whether the STUN message is a request or not. */ /**@ingroup tnet_stun_group -* @def TNET_STUN_RESPONSE_IS_INDICATION +* @def TNET_STUN_MESSAGE_IS_INDICATION * Checks whether the STUN message is an indicaton message or not. */ /**@ingroup tnet_stun_group @@ -58,10 +58,11 @@ TNET_BEGIN_DECLS * @def TNET_STUN_RESPONSE_IS_ERROR * Checks whether the STUN message is an error response or not. */ -#define TNET_STUN_RESPONSE_IS_REQUEST(self) ((self->type & TNET_STUN_CLASS_REQUEST_MASK) == TNET_STUN_CLASS_REQUEST_MASK) -#define TNET_STUN_RESPONSE_IS_INDICATION(self) ((self->type & TNET_STUN_CLASS_INDICATION_MASK) == TNET_STUN_CLASS_INDICATION_MASK) -#define TNET_STUN_RESPONSE_IS_SUCCESS(self) ((self->type & TNET_STUN_CLASS_SUCCESS_MASK) == TNET_STUN_CLASS_SUCCESS_MASK) -#define TNET_STUN_RESPONSE_IS_ERROR(self) ((self->type & TNET_STUN_CLASS_ERROR_MASK) == TNET_STUN_CLASS_ERROR_MASK) +#define TNET_STUN_MESSAGE_IS_REQUEST(self) ((self) && (((self)->type & 0x0110) == TNET_STUN_CLASS_REQUEST_MASK)) +#define TNET_STUN_MESSAGE_IS_RESPONSE(self) (TNET_STUN_RESPONSE_IS_SUCCESS((self)) || TNET_STUN_RESPONSE_IS_ERROR((self))) +#define TNET_STUN_MESSAGE_IS_INDICATION(self) ((self) && (((self)->type & 0x0110) == TNET_STUN_CLASS_INDICATION_MASK)) +#define TNET_STUN_RESPONSE_IS_SUCCESS(self) ((self) && (((self)->type & 0x0110) == TNET_STUN_CLASS_SUCCESS_MASK)) +#define TNET_STUN_RESPONSE_IS_ERROR(self) ((self) && (((self)->type & 0x0110) == TNET_STUN_CLASS_ERROR_MASK)) /**@ingroup tnet_stun_group * Checks if the pointer to the buffer hold a STUN header by checking that it starts with 0b00 and contain the magic cookie. @@ -72,9 +73,14 @@ TNET_BEGIN_DECLS * * @param PU8 The pointer to the buffer holding the STUN raw data. **/ -#define TNET_IS_STUN2(PU8) \ - (((PU8)[0] & 0xc0) == 0x00) && \ - ( (*(((uint32_t *)(PU8))+1)) == tnet_htonl(TNET_STUN_MAGIC_COOKIE) ) +#define TNET_IS_STUN2_MSG(PU8, SIZE) \ + ( \ + ((PU8)) && \ + ((SIZE) >= TNET_STUN_HEADER_SIZE) && \ + (((PU8)[0] & 0xc0) == 0x00) && \ + ( PU8[4] == 0x21 && PU8[5] == 0x12 && PU8[6] == 0xA4 && PU8[7] == 0x42 ) \ + ) +#define TNET_IS_STUN2 TNET_IS_STUN2_MSG // for backward compatibility /**@ingroup tnet_stun_group * STUN trasactionn ID size (96bits = 12bytes). @@ -204,6 +210,7 @@ typedef struct tnet_stun_message_s unsigned fingerprint:1; unsigned integrity:1; unsigned dontfrag:1; + unsigned nointegrity:1; char* username; char* password; @@ -219,12 +226,15 @@ typedef tnet_stun_message_t tnet_stun_request_t; tsk_buffer_t* tnet_stun_message_serialize(const tnet_stun_message_t *message); tnet_stun_message_t* tnet_stun_message_deserialize(const uint8_t *data, tsk_size_t size); +tsk_bool_t tnet_stun_message_has_attribute(const tnet_stun_message_t *self, tnet_stun_attribute_type_t type); int tnet_stun_message_add_attribute(tnet_stun_message_t *self, tnet_stun_attribute_t** attribute); +int tnet_stun_message_remove_attribute(tnet_stun_message_t *self, tnet_stun_attribute_type_t type); const tnet_stun_attribute_t* tnet_stun_message_get_attribute(const tnet_stun_message_t *self, tnet_stun_attribute_type_t type); short tnet_stun_message_get_errorcode(const tnet_stun_message_t *self); const char* tnet_stun_message_get_realm(const tnet_stun_message_t *self); const char* tnet_stun_message_get_nonce(const tnet_stun_message_t *self); int32_t tnet_stun_message_get_lifetime(const tnet_stun_message_t *self); +tsk_bool_t tnet_stun_message_transac_id_equals(const tnet_stun_transacid_t id1, const tnet_stun_transacid_t id2); tnet_stun_message_t* tnet_stun_message_create(const char* username, const char* password); diff --git a/branches/2.0/doubango/tinyNET/src/tinynet.h b/branches/2.0/doubango/tinyNET/src/tinynet.h index 89eea2a7..79f5cee9 100644 --- a/branches/2.0/doubango/tinyNET/src/tinynet.h +++ b/branches/2.0/doubango/tinyNET/src/tinynet.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tinynet.h * @brief API functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -36,12 +36,17 @@ /* === tinyNET === */ #include "tnet.h" +#include "tnet_endianness.h" #include "tnet_nat.h" #include "tnet_socket.h" #include "tnet_transport.h" #include "stun/tnet_stun.h" +#include "ice/tnet_ice_event.h" +#include "ice/tnet_ice_candidate.h" +#include "ice/tnet_ice_ctx.h" + #include "dns/tnet_dns.h" #include "dns/tnet_dns_naptr.h" #include "dns/tnet_dns_regexp.h" diff --git a/branches/2.0/doubango/tinyNET/src/tinynet_config.h b/branches/2.0/doubango/tinyNET/src/tinynet_config.h index 6e44461d..789e0772 100644 --- a/branches/2.0/doubango/tinyNET/src/tinynet_config.h +++ b/branches/2.0/doubango/tinyNET/src/tinynet_config.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ * This file incude all your preferences or configuration. All specific configuration * must be defined in this file. You must include this file in all your header files. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -85,21 +85,20 @@ /* whether to use poll() */ #if TNET_UNDER_WINDOWS -# define TNET_USE_POLL 0 /* Do not use WSAPoll event if under Vista. */ -#else -# define TNET_USE_POLL 1 -#endif - -#if defined(__APPLE__) -# define HAVE_IFADDRS 1 -# define HAVE_DNS_H 1 -# define TNET_HAVE_SS_LEN 1 -# define TNET_HAVE_SA_LEN 0 -#else -# define HAVE_IFADDRS 0 -# define HAVE_DNS_H 0 -# define TNET_HAVE_SS_LEN 0 -# define TNET_HAVE_SA_LEN 0 +# define TNET_USE_POLL 0 /* Do not use WSAPoll event if under Vista */ +#else // iOS, Android, Linux, OS X... +# define TNET_USE_POLL 1 // fallback to cfsocket implementation on iOS4+ +# if defined(__APPLE__) || !ANDROID +# define HAVE_IFADDRS 1 +# define HAVE_DNS_H 1 +# define TNET_HAVE_SS_LEN 1 +# define TNET_HAVE_SA_LEN 0 +# else +# define HAVE_IFADDRS 0 +# define HAVE_DNS_H 0 +# define TNET_HAVE_SS_LEN 0 +# define TNET_HAVE_SA_LEN 0 +# endif #endif /* Used in TURN/STUN2 attributes. */ diff --git a/branches/2.0/doubango/tinyNET/src/tls/tnet_tls.c b/branches/2.0/doubango/tinyNET/src/tls/tnet_tls.c index 997692d7..f9c636f5 100644 --- a/branches/2.0/doubango/tinyNET/src/tls/tnet_tls.c +++ b/branches/2.0/doubango/tinyNET/src/tls/tnet_tls.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_tls.c * @brief TLS utilitity functions, based on openssl. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/tls/tnet_tls.h b/branches/2.0/doubango/tinyNET/src/tls/tnet_tls.h index 48f9f211..41ea4465 100644 --- a/branches/2.0/doubango/tinyNET/src/tls/tnet_tls.h +++ b/branches/2.0/doubango/tinyNET/src/tls/tnet_tls.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_tls.h * @brief TLS utilitity functions, based on openssl. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/tnet.c b/branches/2.0/doubango/tinyNET/src/tnet.c index 24ac9875..858f2de6 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet.c +++ b/branches/2.0/doubango/tinyNET/src/tnet.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet.c * @brief Network stack. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/tnet.h b/branches/2.0/doubango/tinyNET/src/tnet.h index 04d8ddba..75b5018a 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet.h +++ b/branches/2.0/doubango/tinyNET/src/tnet.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet.h * @brief Network stack. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/tnet_auth.c b/branches/2.0/doubango/tinyNET/src/tnet_auth.c index 8220477a..42bf04a7 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_auth.c +++ b/branches/2.0/doubango/tinyNET/src/tnet_auth.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_auth.c * @brief HTTP Authentication: Basic and Digest Access Authentication as per RFC 2617. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/tnet_auth.h b/branches/2.0/doubango/tinyNET/src/tnet_auth.h index e3ee457a..a8010a15 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_auth.h +++ b/branches/2.0/doubango/tinyNET/src/tnet_auth.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_auth.h * @brief HTTP Authentication: Basic and Digest Access Authentication as per RFC 2617. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/tnet_endianness.c b/branches/2.0/doubango/tinyNET/src/tnet_endianness.c index e43295ad..64d8e112 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_endianness.c +++ b/branches/2.0/doubango/tinyNET/src/tnet_endianness.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_endianness.c * @brief Byte Ordering. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/tnet_endianness.h b/branches/2.0/doubango/tinyNET/src/tnet_endianness.h index 0343c150..61962a64 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_endianness.h +++ b/branches/2.0/doubango/tinyNET/src/tnet_endianness.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_endianness.h * @brief Byte Ordering. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -47,7 +47,7 @@ TINYNET_API TNET_INLINE tsk_bool_t tnet_is_BE(); #define tnet_ntohl(x) tnet_htonl(x) #define tnet_ntohl_2(px) tnet_htonl_2(px) -TNET_BEGIN_DECLS +TNET_END_DECLS #endif /*TNET_ENDIANNESS_H*/ diff --git a/branches/2.0/doubango/tinyNET/src/tnet_hardwares.h b/branches/2.0/doubango/tinyNET/src/tnet_hardwares.h index a05d87a0..ee523a64 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_hardwares.h +++ b/branches/2.0/doubango/tinyNET/src/tnet_hardwares.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tnet_hardwares.h * @brief List of Hardware types as assigned by the IANA. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/tnet_nat.c b/branches/2.0/doubango/tinyNET/src/tnet_nat.c index 748f5ee8..944b89a3 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_nat.c +++ b/branches/2.0/doubango/tinyNET/src/tnet_nat.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_nat.c * @brief NAT Traversal helper functions using STUN, TURN and ICE. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/tnet_nat.h b/branches/2.0/doubango/tinyNET/src/tnet_nat.h index 5ac5b116..a0c3e957 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_nat.h +++ b/branches/2.0/doubango/tinyNET/src/tnet_nat.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_nat.h * @brief NAT Traversal helper functions using STUN, TURN and ICE. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/tnet_poll.c b/branches/2.0/doubango/tinyNET/src/tnet_poll.c index 6ba2dce4..4f78a9d4 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_poll.c +++ b/branches/2.0/doubango/tinyNET/src/tnet_poll.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinyNET/src/tnet_poll.h b/branches/2.0/doubango/tinyNET/src/tnet_poll.h index f6a30957..96778664 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_poll.h +++ b/branches/2.0/doubango/tinyNET/src/tnet_poll.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_poll.h * @brief poll() method implementation for multiplexing network sockets. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/tnet_proto.h b/branches/2.0/doubango/tinyNET/src/tnet_proto.h index 1576787e..1f077d9f 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_proto.h +++ b/branches/2.0/doubango/tinyNET/src/tnet_proto.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_proto.h * @brief List of all assigned protocols as defined by the IANA (http://www.iana.org/assignments/protocol-numbers/). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/tnet_socket.c b/branches/2.0/doubango/tinyNET/src/tnet_socket.c index 70158787..1c496e61 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_socket.c +++ b/branches/2.0/doubango/tinyNET/src/tnet_socket.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet.h * @brief Protocol agnostic socket. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -287,8 +287,11 @@ bail: tnet_freeaddrinfo(result); /* Close socket if failed. */ - if(status && TNET_SOCKET_IS_VALID(sock)){ - tnet_socket_close(sock); + if(status){ + if(TNET_SOCKET_IS_VALID(sock)){ + tnet_socket_close(sock); + } + return tsk_null; } } @@ -301,7 +304,7 @@ static tsk_object_t* tnet_socket_dtor(tsk_object_t * self) if(sock){ /* Close the socket. */ - if(sock->fd > 0){ + if(TNET_SOCKET_IS_VALID(sock)){ tnet_socket_close(sock); } /* Clean up TLS handle*/ diff --git a/branches/2.0/doubango/tinyNET/src/tnet_socket.h b/branches/2.0/doubango/tinyNET/src/tnet_socket.h index 942f5960..bc78865d 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_socket.h +++ b/branches/2.0/doubango/tinyNET/src/tnet_socket.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet.h * @brief Protocol agnostic socket. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/tnet_transport.c b/branches/2.0/doubango/tinyNET/src/tnet_transport.c index 3ec9dc6e..5367a88f 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_transport.c +++ b/branches/2.0/doubango/tinyNET/src/tnet_transport.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -27,7 +27,7 @@ * A transport layer always has a master socket which determine what kind of network traffic we expect (stream or dgram). * Stream transport can manage TCP, TLS and SCTP sockets. Datagram socket can only manage UDP sockets.
* A transport can hold both IPv4 and IPv6 sockets. - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -50,8 +50,49 @@ static void *run(void* self); tnet_transport_t* tnet_transport_create(const char* host, tnet_port_t port, tnet_socket_type_t type, const char* description) +{ + tnet_transport_t* transport; + + if((transport = tsk_object_new(tnet_transport_def_t))){ + transport->description = tsk_strdup(description); + transport->local_host = tsk_strdup(host); + transport->req_local_port = port; + transport->type = type; + transport->context = tnet_transport_context_create(); + + if((transport->master = tnet_socket_create(transport->local_host, transport->req_local_port, transport->type))){ + transport->local_ip = tsk_strdup(transport->master->ip); + transport->bind_local_port = transport->master->port; + } + else{ + TSK_DEBUG_ERROR("Failed to create master socket"); + TSK_OBJECT_SAFE_FREE(transport); + } + } + return transport; +} + +tnet_transport_t* tnet_transport_create_2(tnet_socket_t *master, const char* description) { - return tsk_object_new(tnet_transport_def_t, host, port, type, description); + tnet_transport_t* transport; + if(!master){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + if((transport = tsk_object_new(tnet_transport_def_t))){ + transport->description = tsk_strdup(description); + transport->local_host = tsk_strdup(master->ip); + transport->req_local_port = master->port; + transport->type = master->type; + + transport->master = tsk_object_ref(master); + transport->local_ip = tsk_strdup(transport->master->ip); + transport->bind_local_port = transport->master->port; + + transport->context = tnet_transport_context_create(); + } + return transport; } tnet_transport_event_t* tnet_transport_event_create(tnet_transport_event_type_t type, const void* callback_data, tnet_fd_t fd) @@ -172,9 +213,6 @@ int tnet_transport_get_public_ip_n_port(const tnet_transport_handle_t *handle, t tnet_stun_binding_id_t bind_id = TNET_STUN_INVALID_BINDING_ID; // if the socket is already monitored by the transport we should pause because both the transport and // NAT binder will try to read from it - - // FIXME: change when ICE will be fully implemented - TSK_DEBUG_INFO("Getting public address"); // Pause the soket tnet_transport_pause_socket(transport, fd, tsk_true); @@ -394,29 +432,6 @@ static tsk_object_t* tnet_transport_ctor(tsk_object_t * self, va_list * app) { tnet_transport_t *transport = self; if(transport){ - const char *local_host = va_arg(*app, const char*); -#if defined(__GNUC__) - tnet_port_t req_local_port = (uint16_t)va_arg(*app, unsigned); -#else - tnet_port_t req_local_port = (tnet_port_t)va_arg(*app, tnet_port_t); -#endif - tnet_socket_type_t type = va_arg(*app, tnet_socket_type_t); - const char *description = va_arg(*app, const char*); - - transport->description = tsk_strdup(description); - transport->local_host = tsk_strdup(local_host); - transport->req_local_port = req_local_port; - transport->type = type; - transport->context = tnet_transport_context_create(); - - if((transport->master = tnet_socket_create(local_host, req_local_port, type))){ - transport->local_ip = tsk_strdup(transport->master->ip); - transport->bind_local_port = transport->master->port; - } - else{ - TSK_DEBUG_ERROR("Failed to create master socket"); - return tsk_null; - } } return self; } @@ -425,6 +440,7 @@ static tsk_object_t* tnet_transport_dtor(tsk_object_t * self) { tnet_transport_t *transport = self; if(transport){ + tnet_transport_set_callback(transport, tsk_null, tsk_null); tnet_transport_shutdown(transport); TSK_OBJECT_SAFE_FREE(transport->master); TSK_OBJECT_SAFE_FREE(transport->context); diff --git a/branches/2.0/doubango/tinyNET/src/tnet_transport.h b/branches/2.0/doubango/tinyNET/src/tnet_transport.h index 1927d2c0..fe9665db 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_transport.h +++ b/branches/2.0/doubango/tinyNET/src/tnet_transport.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_transport.h * @brief Network transport layer. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -134,6 +134,7 @@ tnet_transport_t; tsk_object_t* tnet_transport_context_create(); TINYNET_API tnet_transport_t* tnet_transport_create(const char* host, tnet_port_t port, tnet_socket_type_t type, const char* description); +TINYNET_API tnet_transport_t* tnet_transport_create_2(tnet_socket_t *master, const char* description); tnet_transport_event_t* tnet_transport_event_create(tnet_transport_event_type_t type, const void* callback_data, tnet_fd_t fd); TINYNET_GEXTERN const tsk_object_def_t *tnet_transport_def_t; diff --git a/branches/2.0/doubango/tinyNET/src/tnet_transport_poll.c b/branches/2.0/doubango/tinyNET/src/tnet_transport_poll.c index 3464f3e2..852a7437 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_transport_poll.c +++ b/branches/2.0/doubango/tinyNET/src/tnet_transport_poll.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_transport_poll.c * @brief Network transport layer using polling. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/tnet_transport_win32.c b/branches/2.0/doubango/tinyNET/src/tnet_transport_win32.c index a60acb15..d6241464 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_transport_win32.c +++ b/branches/2.0/doubango/tinyNET/src/tnet_transport_win32.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_transport_win32.c * @brief Network transport layer for WIN32(XP/Vista/7) and WINCE(5.0 or higher) systems. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -470,7 +470,9 @@ int tnet_transport_prepare(tnet_transport_t *transport) } /* Add the master socket to the context. */ - if((ret = addSocket(transport->master->fd, transport->master->type, transport, tsk_true, tsk_false))){ + // don't take ownership: will be closed by the dctor() + // otherwise will be closed twice: dctor() and removeSocket() + if((ret = addSocket(transport->master->fd, transport->master->type, transport, tsk_false, tsk_false))){ TSK_DEBUG_ERROR("Failed to add master socket"); goto bail; } diff --git a/branches/2.0/doubango/tinyNET/src/tnet_types.h b/branches/2.0/doubango/tinyNET/src/tnet_types.h index 3a490390..6f84f0f6 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_types.h +++ b/branches/2.0/doubango/tinyNET/src/tnet_types.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_types.h * @brief ????. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/tnet_utils.c b/branches/2.0/doubango/tinyNET/src/tnet_utils.c index a233fd9c..786d6003 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_utils.c +++ b/branches/2.0/doubango/tinyNET/src/tnet_utils.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,16 +23,17 @@ /**@file tnet_utils.c * @brief Network utility functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ #include "tnet_utils.h" -#include "tsk_debug.h" +#include "tsk_thread.h" #include "tsk_string.h" #include "tsk_memory.h" +#include "tsk_debug.h" #include "tnet_socket.h" #include "tnet_endianness.h" @@ -40,6 +41,15 @@ #include +#if defined(__APPLE__) +# include +# if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_3_2 +# include "net/route.h" +# else +# include +# endif +#endif + /**@defgroup tnet_utils_group Network utility functions. */ @@ -252,6 +262,15 @@ tnet_interfaces_L_t* tnet_get_interfaces() TSK_DEBUG_ERROR("ioctl(SIOCGIFCONF) failed and errno= [%d]", tnet_geterrno()); goto done; } + if(!ifr || !ifc.ifc_req){ + TSK_DEBUG_ERROR("ifr or ifc.ifc_req is null"); + goto done; + } + + if(!ifr->ifr_name){ + TSK_DEBUG_ERROR("ifr->ifr_name is null"); + goto done; + } for(ifr = ifc.ifc_req; ifr && !tsk_strempty(ifr->ifr_name); ifr++){ sin = (struct sockaddr_in *)&(ifr->ifr_addr); @@ -292,7 +311,7 @@ bail: * -1 mean all interfaces. * @retval List of all addresses. */ -tnet_addresses_L_t* tnet_get_addresses(tnet_family_t family, unsigned unicast, unsigned anycast, unsigned multicast, unsigned dnsserver, long if_index) +tnet_addresses_L_t* tnet_get_addresses(tnet_family_t family, tsk_bool_t unicast, tsk_bool_t anycast, tsk_bool_t multicast, tsk_bool_t dnsserver, long if_index) { tnet_addresses_L_t *addresses = tsk_list_create(); @@ -423,12 +442,12 @@ bail: #else /* !TSK_UNDER_WINDOWS (MAC OS X, UNIX, ANDROID ...) */ + tnet_ip_t ip; #if HAVE_IFADDRS /*=== Using getifaddrs ===*/ // see http://www.kernel.org/doc/man-pages/online/pages/man3/getifaddrs.3.html - struct ifaddrs *ifaddr = 0, *ifa = 0; - struct sockaddr *addr; - tnet_ip_t ip; + struct ifaddrs *ifaddr = tsk_null, *ifa = tsk_null; + struct sockaddr *addr; /* Get interfaces */ if(getifaddrs(&ifaddr) == -1){ @@ -475,6 +494,60 @@ bail: if (ifaddr) { free(ifaddr); } + +#else /* ANDROID or any system without getifaddrs */ + + tnet_address_t *address; + tnet_fd_t fd = TNET_INVALID_FD; + struct ifconf ifc; + struct ifreq *ifr = 0; + memset(&ifc, 0, sizeof(ifc)); + + if((fd = socket(family, SOCK_DGRAM, IPPROTO_UDP)) < 0){ + TSK_DEBUG_ERROR("Failed to create new DGRAM socket and errno= [%d]", tnet_geterrno()); + goto done; + } + + if(ioctl(fd, SIOCGIFCONF, &ifc) < 0){ + TSK_DEBUG_ERROR("ioctl(SIOCGIFCONF) failed and errno= [%d]", tnet_geterrno()); + goto done; + } + + if (!(ifr = (struct ifreq*) malloc(ifc.ifc_len))) { + TSK_DEBUG_ERROR("Could not malloc ifreq with size =%d", ifc.ifc_len); + goto done; + } + + ifc.ifc_ifcu.ifcu_req = ifr; + if (ioctl(fd, SIOCGIFCONF, &ifc) < 0) { + TSK_DEBUG_ERROR("ioctl SIOCGIFCONF failed"); + goto done; + } + + int i; + for(i = 0; i < ifc.ifc_len / sizeof(struct ifreq); ++i){ + if (unicast) { + + } + // Skip unwanted interface + if (if_index != -1 && ifr->ifr_ifindex != if_index) { + continue; + } + + // Get the IP string + if(tnet_get_sockip(&ifr[i].ifr_addr, &ip) == 0){ + // Push a new address + if((address = tnet_address_create(ip))){ + address->family = family; + address->unicast = unicast; + tsk_list_push_ascending_data(addresses, (void **) &address); + } + } + } + +done: + TSK_FREE(ifr); + tnet_sockfd_close(&fd); #endif /* HAVE_IFADDRS */ @@ -494,17 +567,6 @@ bail: return addresses; } -#if defined(__APPLE__) - -#include - -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_3_2 -#include "net/route.h" -#else -#include -#endif - -#endif /**@ingroup tnet_utils_group * Retrieves the @a source IP address that has the best route to the specified IPv4 or IPv6 @a destination. @@ -821,25 +883,25 @@ done: * @param port [out] The port. * @retval Zero if succeed and non-zero error code otherwise. */ -int tnet_get_sockip_n_port(struct sockaddr *addr, tnet_ip_t *ip, tnet_port_t *port) +int tnet_get_sockip_n_port(const struct sockaddr *addr, tnet_ip_t *ip, tnet_port_t *port) { int status = -1; if(addr->sa_family == AF_INET){ - struct sockaddr_in *sin = (struct sockaddr_in *)addr; + const struct sockaddr_in *sin = (const struct sockaddr_in *)addr; if(port){ *port = tnet_ntohs(sin->sin_port); status = 0; } if(ip){ - if((status = tnet_getnameinfo((struct sockaddr*)sin, sizeof(*sin), *ip, sizeof(*ip), 0, 0, NI_NUMERICHOST))){ + if((status = tnet_getnameinfo((const struct sockaddr*)sin, sizeof(*sin), *ip, sizeof(*ip), 0, 0, NI_NUMERICHOST))){ return status; } } } else if(addr->sa_family == AF_INET6) { - struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr; + const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)addr; #if TNET_UNDER_WINDOWS int index; #endif @@ -848,7 +910,7 @@ int tnet_get_sockip_n_port(struct sockaddr *addr, tnet_ip_t *ip, tnet_port_t *po status = 0; } if(ip){ - if((status = tnet_getnameinfo((struct sockaddr*)sin6, sizeof(*sin6), *ip, sizeof(*ip), 0, 0, NI_NUMERICHOST))){ + if((status = tnet_getnameinfo((const struct sockaddr*)sin6, sizeof(*sin6), *ip, sizeof(*ip), 0, 0, NI_NUMERICHOST))){ return status; } @@ -1242,17 +1304,28 @@ int tnet_sockfd_sendto(tnet_fd_t fd, const struct sockaddr *to, const void* buf, } while(sent < size){ + int try_guard = 6; #if TNET_UNDER_WINDOWS WSABUF wsaBuffer; DWORD numberOfBytesSent = 0; wsaBuffer.buf = ((CHAR*)buf) + sent; - wsaBuffer.len = (size-sent); + wsaBuffer.len = (size - sent); +try_again: ret = WSASendTo(fd, &wsaBuffer, 1, &numberOfBytesSent, 0, to, tnet_get_sockaddr_size(to), 0, 0); // returns zero if succeed if(ret == 0) ret = numberOfBytesSent; #else +try_again: ret = sendto(fd, (((const uint8_t*)buf)+sent), (size-sent), 0, to, tnet_get_sockaddr_size(to)); // returns number of sent bytes if succeed #endif if(ret <= 0){ + if(tnet_geterrno() == TNET_ERROR_WOULDBLOCK){ + if(try_guard--){ + TSK_DEBUG_INFO("WSAEWOULDBLOCK"); + tsk_thread_sleep(5); + goto try_again; + } + } + TNET_PRINT_LAST_ERROR("sendto() failed"); goto bail; } else{ diff --git a/branches/2.0/doubango/tinyNET/src/tnet_utils.h b/branches/2.0/doubango/tinyNET/src/tnet_utils.h index 89a1d52c..1277e50f 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_utils.h +++ b/branches/2.0/doubango/tinyNET/src/tnet_utils.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_utils.h * @brief Network utility functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -77,7 +77,7 @@ TINYNET_API void tnet_getlasterror(tnet_error_t *error); TINYNET_API int tnet_geterrno(); TINYNET_API tnet_interfaces_L_t* tnet_get_interfaces(); -TINYNET_API tnet_addresses_L_t* tnet_get_addresses(tnet_family_t family, unsigned unicast, unsigned anycast, unsigned multicast, unsigned dnsserver, long if_index); +TINYNET_API tnet_addresses_L_t* tnet_get_addresses(tnet_family_t family, tsk_bool_t unicast, tsk_bool_t anycast, tsk_bool_t multicast, tsk_bool_t dnsserver, long if_index); #define tnet_get_addresses_all() tnet_get_addresses(AF_UNSPEC, 1, 1, 1, 1, -1) #define tnet_get_addresses_all_unicast() tnet_get_addresses(AF_UNSPEC, 1, 0, 0, 0, -1) #define tnet_get_addresses_unicast4() tnet_get_addresses(AF_INET, 1, 0, 0, 0, -1) @@ -99,7 +99,7 @@ TINYNET_API int tnet_get_sockaddr(tnet_fd_t fd, struct sockaddr_storage *result) TINYNET_API tnet_socket_type_t tnet_get_socket_type(tnet_fd_t fd); TINYNET_API tnet_family_t tnet_get_family(const char* host, tnet_port_t port); TINYNET_API int tnet_get_ip_n_port(tnet_fd_t fd, tnet_ip_t *ip, tnet_port_t *port); -TINYNET_API int tnet_get_sockip_n_port(struct sockaddr *addr, tnet_ip_t *ip, tnet_port_t *port); +TINYNET_API int tnet_get_sockip_n_port(const struct sockaddr *addr, tnet_ip_t *ip, tnet_port_t *port); TINYNET_API int tnet_get_peerip_n_port(tnet_fd_t localFD, tnet_ip_t *ip, tnet_port_t *port); #define tnet_get_ip(fd, ip) tnet_get_ip_n_port(fd, ip, 0) #define tnet_get_port(fd, port) tnet_get_ip_n_port(fd, 0, port) diff --git a/branches/2.0/doubango/tinyNET/src/turn/tnet_turn.c b/branches/2.0/doubango/tinyNET/src/turn/tnet_turn.c index 8927fe67..f5a8673b 100644 --- a/branches/2.0/doubango/tinyNET/src/turn/tnet_turn.c +++ b/branches/2.0/doubango/tinyNET/src/turn/tnet_turn.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -27,7 +27,7 @@ * http://tools.ietf.org/html/draft-ietf-behave-turn-tcp-05 * http://tools.ietf.org/html/draft-ietf-behave-turn-ipv6-07 * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/turn/tnet_turn.h b/branches/2.0/doubango/tinyNET/src/turn/tnet_turn.h index b3ec5b35..2c2ac246 100644 --- a/branches/2.0/doubango/tinyNET/src/turn/tnet_turn.h +++ b/branches/2.0/doubango/tinyNET/src/turn/tnet_turn.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -27,7 +27,7 @@ * http://tools.ietf.org/html/draft-ietf-behave-turn-tcp-05 * http://tools.ietf.org/html/draft-ietf-behave-turn-ipv6-07 * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_attribute.c b/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_attribute.c index 5ef74f0d..af1ec130 100644 --- a/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_attribute.c +++ b/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_attribute.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_turn_attribute.c * @brief New STUN Attributes as per draft-ietf-behave-turn-16 subclause 14. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_attribute.h b/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_attribute.h index 7ececaed..4980b1ec 100644 --- a/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_attribute.h +++ b/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_attribute.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_turn_attribute.h * @brief New STUN Attributes as per draft-ietf-behave-turn-16 subclause 14. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_message.c b/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_message.c index a2d06d8f..d499bd28 100644 --- a/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_message.c +++ b/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_message.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_turn_message.c * @brief Traversal Using Relays around NAT (TURN) messages. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_message.h b/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_message.h index 2f8a7c75..57853d2e 100644 --- a/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_message.h +++ b/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_message.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tnet_turn_message.h * @brief Traversal Using Relays around NAT (TURN) messages. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinyNET/test/stdafx.c b/branches/2.0/doubango/tinyNET/test/stdafx.c index df71e1b8..0e8c6617 100644 --- a/branches/2.0/doubango/tinyNET/test/stdafx.c +++ b/branches/2.0/doubango/tinyNET/test/stdafx.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinyNET/test/stdafx.h b/branches/2.0/doubango/tinyNET/test/stdafx.h index b1200be5..5da470d4 100644 --- a/branches/2.0/doubango/tinyNET/test/stdafx.h +++ b/branches/2.0/doubango/tinyNET/test/stdafx.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinyNET/test/test.c b/branches/2.0/doubango/tinyNET/test/test.c index f27e05ca..dd179637 100644 --- a/branches/2.0/doubango/tinyNET/test/test.c +++ b/branches/2.0/doubango/tinyNET/test/test.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -32,18 +32,20 @@ #include "test_nat.h" #include "test_ifaces.h" #include "test_dns.h" +#include "test_ice.h" #include "test_dhcp.h" #include "test_dhcp6.h" #include "test_tls.h" -#define RUN_TEST_LOOP 1 +#define RUN_TEST_LOOP 0 #define RUN_TEST_ALL 0 #define RUN_TEST_SOCKETS 0 /* FIXME: Android */ #define RUN_TEST_TRANSPORT 0 #define RUN_TEST_AUTH 0 #define RUN_TEST_STUN 0 -#define RUN_TEST_NAT 1 +#define RUN_TEST_ICE 1 +#define RUN_TEST_NAT 0 #define RUN_TEST_IFACES 0 #define RUN_TEST_DNS 0 #define RUN_TEST_DHCP 0 @@ -82,6 +84,10 @@ int main() test_stun(); #endif +#if RUN_TEST_ALL || RUN_TEST_ICE + test_ice(); +#endif + #if RUN_TEST_ALL || RUN_TEST_NAT test_nat(); #endif diff --git a/branches/2.0/doubango/tinyNET/test/test.vcproj b/branches/2.0/doubango/tinyNET/test/test.vcproj index fcf6413a..8af3f411 100644 --- a/branches/2.0/doubango/tinyNET/test/test.vcproj +++ b/branches/2.0/doubango/tinyNET/test/test.vcproj @@ -44,7 +44,7 @@
+ + diff --git a/branches/2.0/doubango/tinyNET/test/test_auth.h b/branches/2.0/doubango/tinyNET/test/test_auth.h index 20e96af7..52e3d639 100644 --- a/branches/2.0/doubango/tinyNET/test/test_auth.h +++ b/branches/2.0/doubango/tinyNET/test/test_auth.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinyNET/test/test_dhcp.h b/branches/2.0/doubango/tinyNET/test/test_dhcp.h index 6b976aa3..6f2faef0 100644 --- a/branches/2.0/doubango/tinyNET/test/test_dhcp.h +++ b/branches/2.0/doubango/tinyNET/test/test_dhcp.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinyNET/test/test_dhcp6.h b/branches/2.0/doubango/tinyNET/test/test_dhcp6.h index a132cca0..adb3b6bf 100644 --- a/branches/2.0/doubango/tinyNET/test/test_dhcp6.h +++ b/branches/2.0/doubango/tinyNET/test/test_dhcp6.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinyNET/test/test_dns.h b/branches/2.0/doubango/tinyNET/test/test_dns.h index b7990b56..076a3016 100644 --- a/branches/2.0/doubango/tinyNET/test/test_dns.h +++ b/branches/2.0/doubango/tinyNET/test/test_dns.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -215,10 +215,10 @@ void test_resolvconf() void test_dns() { - //test_dns_naptr_srv(); + test_dns_naptr_srv(); //test_dns_srv(); //test_dns_query(); - test_enum(); + //test_enum(); //test_regex(); //test_resolvconf(); } diff --git a/branches/2.0/doubango/tinyNET/test/test_ice.h b/branches/2.0/doubango/tinyNET/test/test_ice.h new file mode 100644 index 00000000..f1809721 --- /dev/null +++ b/branches/2.0/doubango/tinyNET/test/test_ice.h @@ -0,0 +1,145 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ + +#ifndef TNET_TEST_ICE_H +#define TNET_TEST_ICE_H + +#define ICE_CANDIDATES "1 1 udp 1 192.168.196.1 57806 typ host name video_rtcp network_name {0C0137CC-DB78-46B6-9B6C-7E097FFA79FE} username StFEVThMK2DHThkv password qkhKUDr4WqKRwZTo generation 0\r\n" \ + "1 2 udp 1 192.168.211.1 57808 typ srflx name video_rtcp network_name {F53974D9-C92C-4644-AF7A-EA09D29BD5A5} username 9ONjPsYvSFh0JvAc password rDHSkokdvp9dyXqQ generation 0\r\n" \ + "1 1 udp 1 192.168.196.1 57809 typ prflx name video_rtp network_name {0C0137CC-DB78-46B6-9B6C-7E097FFA79FE} username S1vDZTVVky3r0pT+ password XgLb+H9uofxuWg7G generation 0\r\n" \ + "1 2 udp 1 192.168.211.1 57811 typ relay name video_rtp network_name {F53974D9-C92C-4644-AF7A-EA09D29BD5A5} username x64BhO4BXjBFkpz2 password ZwHhRhu0KU9R6iWd generation 0\r\n" \ + "1 1 udp 1 192.168.211.1 57811 typ token name video_rtp network_name {F53974D9-C92C-4644-AF7A-EA09D29BD5A5} username x64BhO4BXjBFkpz2 password ZwHhRhu0KU9R6iWd generation 0\r\n" + +static int tnet_ice_callback(const tnet_ice_event_t *e) +{ + TSK_DEBUG_INFO("ICE callback: %s", e->phrase); + + switch(e->type) + { + case tnet_ice_event_type_gathering_completed: + { + struct tnet_ice_ctx_s *ctx; + if((ctx = (struct tnet_ice_ctx_s *)e->userdata)){ + tnet_ice_ctx_set_remote_candidates(ctx, ICE_CANDIDATES, "ice-ufrag", "ice-pwd", tsk_true, tsk_false); + } + break; + } + } + return 0; +} + +void test_ice() +{ + struct tnet_ice_ctx_s *ctx; + int ret; + static const tsk_bool_t use_ipv6 = tsk_false; + static const tsk_bool_t use_rtcp = tsk_true; + + + long a = tnet_htonl(0x6b0c76a7); + long b = tnet_htonl(0x034aa76b); + long c = tnet_htonl(0x510da598); + + ctx = tnet_ice_ctx_create(use_ipv6, use_rtcp, tsk_false, tnet_ice_callback, tsk_null); + tnet_ice_ctx_set_userdata(ctx, ctx); + ret = tnet_ice_ctx_set_stun(ctx, "numb.viagenie.ca", 3478, "Doubango", "bossiel@yahoo.fr", "stun-password"); + ret = tnet_ice_ctx_start(ctx); + // ret = tnet_ice_ctx_set_remote_candidates(ctx, ICE_CANDIDATES); + + getchar(); + + ret = tnet_ice_ctx_stop(ctx); + + TSK_OBJECT_SAFE_FREE(ctx); +} + + +#endif /* TNET_TEST_ICE_H */ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ + +#ifndef TNET_TEST_ICE_H +#define TNET_TEST_ICE_H + +#define ICE_CANDIDATES "1 1 udp 1 192.168.196.1 57806 typ host name video_rtcp network_name {0C0137CC-DB78-46B6-9B6C-7E097FFA79FE} username StFEVThMK2DHThkv password qkhKUDr4WqKRwZTo generation 0\r\n" \ + "1 2 udp 1 192.168.211.1 57808 typ srflx name video_rtcp network_name {F53974D9-C92C-4644-AF7A-EA09D29BD5A5} username 9ONjPsYvSFh0JvAc password rDHSkokdvp9dyXqQ generation 0\r\n" \ + "1 1 udp 1 192.168.196.1 57809 typ prflx name video_rtp network_name {0C0137CC-DB78-46B6-9B6C-7E097FFA79FE} username S1vDZTVVky3r0pT+ password XgLb+H9uofxuWg7G generation 0\r\n" \ + "1 2 udp 1 192.168.211.1 57811 typ relay name video_rtp network_name {F53974D9-C92C-4644-AF7A-EA09D29BD5A5} username x64BhO4BXjBFkpz2 password ZwHhRhu0KU9R6iWd generation 0\r\n" \ + "1 1 udp 1 192.168.211.1 57811 typ token name video_rtp network_name {F53974D9-C92C-4644-AF7A-EA09D29BD5A5} username x64BhO4BXjBFkpz2 password ZwHhRhu0KU9R6iWd generation 0\r\n" + +static int tnet_ice_callback(const tnet_ice_event_t *e) +{ + TSK_DEBUG_INFO("ICE callback: %s", e->phrase); + + switch(e->type) + { + case tnet_ice_event_type_gathering_completed: + { + struct tnet_ice_ctx_s *ctx; + if((ctx = (struct tnet_ice_ctx_s *)e->userdata)){ + tnet_ice_ctx_set_remote_candidates(ctx, ICE_CANDIDATES); + } + break; + } + } + return 0; +} + +void test_ice() +{ + struct tnet_ice_ctx_s *ctx; + int ret; + static const tsk_bool_t use_ipv6 = tsk_false; + static const tsk_bool_t use_rtcp = tsk_true; + + ctx = tnet_ice_ctx_create(use_ipv6, use_rtcp, tnet_ice_callback, tsk_null); + tnet_ice_ctx_set_userdata(ctx, ctx); + ret = tnet_ice_ctx_stun_configure(ctx, "numb.viagenie.ca", 3478, "Doubango", "bossiel@yahoo.fr", "stun-password"); + ret = tnet_ice_ctx_start(ctx); + // ret = tnet_ice_ctx_set_remote_candidates(ctx, ICE_CANDIDATES); + + getchar(); + + ret = tnet_ice_ctx_stop(ctx); + + TSK_OBJECT_SAFE_FREE(ctx); +} + + +#endif /* TNET_TEST_ICE_H */ diff --git a/branches/2.0/doubango/tinyNET/test/test_ifaces.h b/branches/2.0/doubango/tinyNET/test/test_ifaces.h index a3bb4111..b47c4fce 100644 --- a/branches/2.0/doubango/tinyNET/test/test_ifaces.h +++ b/branches/2.0/doubango/tinyNET/test/test_ifaces.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinyNET/test/test_nat.h b/branches/2.0/doubango/tinyNET/test/test_nat.h index ac1e4cb2..6cb2c1a9 100644 --- a/branches/2.0/doubango/tinyNET/test/test_nat.h +++ b/branches/2.0/doubango/tinyNET/test/test_nat.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinyNET/test/test_sockets.h b/branches/2.0/doubango/tinyNET/test/test_sockets.h index 32e1ccac..67849b69 100644 --- a/branches/2.0/doubango/tinyNET/test/test_sockets.h +++ b/branches/2.0/doubango/tinyNET/test/test_sockets.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinyNET/test/test_stun.h b/branches/2.0/doubango/tinyNET/test/test_stun.h index 4209f034..bc8edccb 100644 --- a/branches/2.0/doubango/tinyNET/test/test_stun.h +++ b/branches/2.0/doubango/tinyNET/test/test_stun.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinyNET/test/test_tls.h b/branches/2.0/doubango/tinyNET/test/test_tls.h index ff86823d..42e088ab 100644 --- a/branches/2.0/doubango/tinyNET/test/test_tls.h +++ b/branches/2.0/doubango/tinyNET/test/test_tls.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinyNET/test/test_transport.h b/branches/2.0/doubango/tinyNET/test/test_transport.h index 870c8b51..1b7fb6e0 100644 --- a/branches/2.0/doubango/tinyNET/test/test_transport.h +++ b/branches/2.0/doubango/tinyNET/test/test_transport.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinyNET/tinyNET.sln b/branches/2.0/doubango/tinyNET/tinyNET.sln index b800c122..67435778 100644 --- a/branches/2.0/doubango/tinyNET/tinyNET.sln +++ b/branches/2.0/doubango/tinyNET/tinyNET.sln @@ -2,10 +2,17 @@ Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyNET", "tinyNET.vcproj", "{7522A458-92F4-4259-B906-E84C2A65D9F1}" + ProjectSection(ProjectDependencies) = postProject + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySAK", "..\tinySAK\tinySAK.vcproj", "{6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test\test.vcproj", "{2189FB5C-B2B2-4ED2-8A78-64853B55DAD5}" + ProjectSection(ProjectDependencies) = postProject + {7522A458-92F4-4259-B906-E84C2A65D9F1} = {7522A458-92F4-4259-B906-E84C2A65D9F1} + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/branches/2.0/doubango/tinyNET/tinyNET.vcproj b/branches/2.0/doubango/tinyNET/tinyNET.vcproj index ae35f56c..de0f4b9d 100644 --- a/branches/2.0/doubango/tinyNET/tinyNET.vcproj +++ b/branches/2.0/doubango/tinyNET/tinyNET.vcproj @@ -205,6 +205,10 @@ RelativePath=".\src\tnet_transport.c" > + + @@ -253,7 +257,23 @@ Name="ice" > + + + + + + + +
@@ -465,7 +485,23 @@ Name="ice" > + + + + + + + + diff --git a/branches/2.0/doubango/tinyRTP/droid-makefile b/branches/2.0/doubango/tinyRTP/droid-makefile index 919b99be..01f52169 100644 --- a/branches/2.0/doubango/tinyRTP/droid-makefile +++ b/branches/2.0/doubango/tinyRTP/droid-makefile @@ -20,7 +20,19 @@ OBJS = \ src/trtp_srtp.o ## RTCP -OBJS += src/rtcp/trtp_rtcp_session.o +OBJS += src/rtcp/trtp_rtcp_header.o \ + src/rtcp/trtp_rtcp_packet.o \ + src/rtcp/trtp_rtcp_rblock.o \ + src/rtcp/trtp_rtcp_report.o \ + src/rtcp/trtp_rtcp_report_bye.o \ + src/rtcp/trtp_rtcp_report_fb.o \ + src/rtcp/trtp_rtcp_report_rr.o \ + src/rtcp/trtp_rtcp_report_sdes.o \ + src/rtcp/trtp_rtcp_report_sr.o \ + src/rtcp/trtp_rtcp_report_xr.o \ + src/rtcp/trtp_rtcp_sdes_chunck.o \ + src/rtcp/trtp_rtcp_sdes_item.o \ + src/rtcp/trtp_rtcp_session.o ## RTP OBJS += src/rtp/trtp_rtp_header.o \ diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp.h index 8ef13145..06bf48d7 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_header.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_header.h index 64cb16fa..eb094b74 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_header.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_header.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -41,7 +41,8 @@ typedef struct trtp_rtcp_header_s unsigned padding:1; unsigned rc:5; trtp_rtcp_packet_type_t type; /**< Packet Type on 8bits */ - uint16_t length; + uint16_t length_in_words_minus1; /**< The length of this RTCP packet in 32-bit words minus one */ + uint32_t length_in_bytes; } trtp_rtcp_header_t; @@ -49,11 +50,10 @@ trtp_rtcp_header_t; typedef tsk_list_t trtp_rtcp_headers_L_t; /**< List of @ref trtp_rtcp_header_t elements */ TINYRTP_API trtp_rtcp_header_t* trtp_rtcp_header_create_null(); -TINYRTP_API trtp_rtcp_header_t* trtp_rtcp_header_create(uint8_t version, uint8_t padding, uint8_t rc, trtp_rtcp_packet_type_t type, uint16_t length); -TINYRTP_API tsk_buffer_t* trtp_rtcp_header_serialize(const trtp_rtcp_header_t *self); -TINYRTP_API int trtp_rtcp_header_serialize_2(const trtp_rtcp_header_t *self, uint8_t output[TRTP_RTCP_HEADER_SIZE]); +TINYRTP_API trtp_rtcp_header_t* trtp_rtcp_header_create(uint8_t version, uint8_t padding, uint8_t rc, trtp_rtcp_packet_type_t type, uint16_t length_in_bytes); +TINYRTP_API int trtp_rtcp_header_serialize_to(const trtp_rtcp_header_t *self, void* data, tsk_size_t size); TINYRTP_API trtp_rtcp_header_t* trtp_rtcp_header_deserialize(const void *data, tsk_size_t size); -TINYRTP_API int trtp_rtcp_header_deserialize_2(trtp_rtcp_header_t** self, const void *data, tsk_size_t size); +TINYRTP_API int trtp_rtcp_header_deserialize_to(trtp_rtcp_header_t** self, const void *data, tsk_size_t size); TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_header_def_t; diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_packet.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_packet.h index 42b6a95f..2af53899 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_packet.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_packet.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -24,13 +24,17 @@ #include "tinyrtp_config.h" +#include "tsk_buffer.h" #include "tsk_list.h" TRTP_BEGIN_DECLS #define TRTP_RTCP_PACKET(self) ((trtp_rtcp_packet_t*)(self)) +#define TRTP_DECLARE_RTCP_PACKET trtp_rtcp_packet_t __packet__ // RFC 3550 12.1 RTCP Packet Types +// RFC 4585 +// RFC 5104 (FIXME: not supported yet!) typedef enum trtp_rtcp_packet_type_e { trtp_rtcp_packet_type_sr = 200, @@ -38,6 +42,8 @@ typedef enum trtp_rtcp_packet_type_e trtp_rtcp_packet_type_sdes = 202, trtp_rtcp_packet_type_bye = 203, trtp_rtcp_packet_type_app = 204, + trtp_rtcp_packet_type_rtpfb = 205, + trtp_rtcp_packet_type_psfb = 206 } trtp_rtcp_packet_type_t; @@ -49,15 +55,19 @@ typedef struct trtp_rtcp_packet_s } trtp_rtcp_packet_t; -#define TRTP_DECLARE_RTCP_PACKET trtp_rtcp_packet_t __packet__ typedef tsk_list_t trtp_rtcp_packets_L_t; /**< List of @ref trtp_rtcp_packet_t elements */ -TINYRTP_API int trtp_rtcp_packet_init(trtp_rtcp_packet_t* self, uint8_t version, uint8_t padding, uint8_t rc, trtp_rtcp_packet_type_t type, uint16_t length); -int trtp_rtcp_packet_init_header(trtp_rtcp_packet_t* self, const void* data, tsk_size_t size); -TINYRTP_API trtp_rtcp_packet_t* trtp_rtcp_packet_deserialize(const void* data, tsk_size_t size); -TINYRTP_API int trtp_rtcp_packet_set_length(trtp_rtcp_packet_t* self, uint16_t length); -tsk_size_t trtp_rtcp_packet_get_size(trtp_rtcp_packet_t* self); -TINYRTP_API int trtp_rtcp_packet_deinit(trtp_rtcp_packet_t* self); +trtp_rtcp_packet_t* trtp_rtcp_packet_create(struct trtp_rtcp_header_s* header); +int trtp_rtcp_packet_init(trtp_rtcp_packet_t* self, uint8_t version, uint8_t padding, uint8_t rc, trtp_rtcp_packet_type_t type, uint16_t length_in_bytes); +trtp_rtcp_packet_t* trtp_rtcp_packet_deserialize(const void* data, tsk_size_t size); +int trtp_rtcp_packet_serialize_to(const trtp_rtcp_packet_t* self, void* data, tsk_size_t size); +tsk_buffer_t* trtp_rtcp_packet_serialize(const trtp_rtcp_packet_t* self, tsk_size_t num_bytes_pad); +int trtp_rtcp_packet_add_packet(trtp_rtcp_packet_t* self, trtp_rtcp_packet_t* packet, tsk_bool_t front); +TINYRTP_API const trtp_rtcp_packet_t* trtp_rtcp_packet_get_at(const trtp_rtcp_packet_t* self, trtp_rtcp_packet_type_t type, tsk_size_t index); +TINYRTP_API const trtp_rtcp_packet_t* trtp_rtcp_packet_get(const trtp_rtcp_packet_t* self, trtp_rtcp_packet_type_t type); +tsk_size_t trtp_rtcp_packet_get_size(const trtp_rtcp_packet_t* self); + +int trtp_rtcp_packet_deinit(trtp_rtcp_packet_t* self); TRTP_END_DECLS diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_rblock.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_rblock.h index a2af8eaf..36adda37 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_rblock.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_rblock.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -28,6 +28,10 @@ TRTP_BEGIN_DECLS +#define TRTP_RTCP_RBLOCK_SIZE 24 + +#define TRTP_RTCP_RBLOCK(self) ((trtp_rtcp_rblock_t*)(self)) + // RFC 3550 6.4.1 SR: Sender Report RTCP Packet => Report block part typedef struct trtp_rtcp_rblock_s { @@ -42,14 +46,13 @@ typedef struct trtp_rtcp_rblock_s uint32_t dlsr; /* delay since last SR packet */ } trtp_rtcp_rblock_t; -#define TRTP_RTCP_RBLOCK(self) ((trtp_rtcp_rblock_t*)(self)) -TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_rblock_def_t; + typedef tsk_list_t trtp_rtcp_rblocks_L_t; /**< List of @ref trtp_rtcp_rblock_t elements */ trtp_rtcp_rblock_t* trtp_rtcp_rblock_create_null(); trtp_rtcp_rblock_t* trtp_rtcp_rblock_deserialize(const void* data, tsk_size_t size); -int trtp_rtcp_rblock_deserialize_payload(trtp_rtcp_rblock_t* self, const void* payload, tsk_size_t size); -tsk_size_t trtp_rtcp_rblock_get_size(trtp_rtcp_rblock_t* self); +int trtp_rtcp_rblock_deserialize_list(const void* data, tsk_size_t size, trtp_rtcp_rblocks_L_t* dest_list); +int trtp_rtcp_rblock_serialize_to(const trtp_rtcp_rblock_t* self, void* data, tsk_size_t size); TRTP_END_DECLS diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report.h index c9d447ad..2323e256 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_bye.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_bye.h new file mode 100644 index 00000000..8904e305 --- /dev/null +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_bye.h @@ -0,0 +1,45 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#ifndef TINYRTP_RTCP_REPORT_BYE_H +#define TINYRTP_RTCP_REPORT_BYE_H + +#include "tinyrtp_config.h" + +#include "tinyrtp/rtcp/trtp_rtcp_packet.h" + +typedef struct trtp_rtcp_report_bye_s +{ + TRTP_DECLARE_RTCP_PACKET; + + uint32_t *ssrc_list; + trtp_rtcp_packets_L_t* packets; +} +trtp_rtcp_report_bye_t; + +trtp_rtcp_report_bye_t* trtp_rtcp_report_bye_create_null(); +trtp_rtcp_report_bye_t* trtp_rtcp_report_bye_create(struct trtp_rtcp_header_s* header); +trtp_rtcp_report_bye_t* trtp_rtcp_report_bye_create_2(uint32_t ssrc); +trtp_rtcp_report_bye_t* trtp_rtcp_report_bye_deserialize(const void* data, tsk_size_t size); +int trtp_rtcp_report_bye_serialize_to(const trtp_rtcp_report_bye_t* self, void* data, tsk_size_t size); +tsk_size_t trtp_rtcp_report_bye_get_size(const trtp_rtcp_report_bye_t* self); + +#endif /* TINYRTP_RTCP_REPORT_BYE_H */ diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_fb.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_fb.h new file mode 100644 index 00000000..f2f99bb9 --- /dev/null +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_fb.h @@ -0,0 +1,132 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#ifndef TINYRTP_RTCP_REPORT_FB_H +#define TINYRTP_RTCP_REPORT_FB_H + +#include "tinyrtp_config.h" + +#include "tinyrtp/rtcp/trtp_rtcp_packet.h" + +#define TRTP_RTCP_REPORT_FB(self) ((trtp_rtcp_report_fb_t*)(self)) +#define TRTP_DECLARE_RTCP_FB_PACKET trtp_rtcp_report_fb_t __packet_fb__ + +// RFC 4585 6.1. Common Packet Format for Feedback Messages +typedef struct trtp_rtcp_report_fb_s +{ + TRTP_DECLARE_RTCP_PACKET; + + uint32_t ssrc_sender; /* SSRC of packet sender */ + uint32_t ssrc_media_src; /* SSRC of media source */ +} +trtp_rtcp_report_fb_t; + +typedef enum trtp_rtcp_rtpfb_fci_type_e +{ + trtp_rtcp_rtpfb_fci_type_nack = 1, // RFC 4585 + trtp_rtcp_rtpfb_fci_type_tmmbn = 4, // RFC 5104 +} +trtp_rtcp_rtpfb_fci_type_t; + +// Transport layer FB message +typedef struct trtp_rtcp_report_rtpfb_s +{ + TRTP_DECLARE_RTCP_FB_PACKET; + + trtp_rtcp_rtpfb_fci_type_t fci_type; + union{ + struct{ + tsk_size_t count; // not part of the specification + uint16_t* pid; // 16 bits + uint16_t* blp; // 16 bits + }nack; + struct{ + tsk_size_t count; // not part of the specification + uint32_t* ssrc; // 32 bits + uint8_t* MxTBR_Exp; // 6 bits + uint32_t* MxTBR_Mantissa; // 17 bits + uint16_t* MeasuredOverhead; // 9 bits + }tmmbn; + }; +} +trtp_rtcp_report_rtpfb_t; + +trtp_rtcp_report_rtpfb_t* trtp_rtcp_report_rtpfb_create_null(); +trtp_rtcp_report_rtpfb_t* trtp_rtcp_report_rtpfb_create(struct trtp_rtcp_header_s* header); +trtp_rtcp_report_rtpfb_t* trtp_rtcp_report_rtpfb_create_2(trtp_rtcp_rtpfb_fci_type_t fci_type, uint32_t ssrc_sender, uint32_t ssrc_media_src); +trtp_rtcp_report_rtpfb_t* trtp_rtcp_report_rtpfb_create_nack(uint32_t ssrc_sender, uint32_t ssrc_media_src, const uint16_t* seq_nums, tsk_size_t count); +trtp_rtcp_report_rtpfb_t* trtp_rtcp_report_rtpfb_deserialize(const void* data, tsk_size_t size); +int trtp_rtcp_report_rtpfb_serialize_to(const trtp_rtcp_report_rtpfb_t* self, void* data, tsk_size_t size); +tsk_size_t trtp_rtcp_report_rtpfb_get_size(const trtp_rtcp_report_rtpfb_t* self); + + +typedef enum trtp_rtcp_psfb_fci_type_e +{ + trtp_rtcp_psfb_fci_type_pli = 1, /* rfc 4585: Picture Loss Indication (PLI) */ + trtp_rtcp_psfb_fci_type_sli = 2, /* rfc 4585: Slice Loss Indication (SLI) */ + trtp_rtcp_psfb_fci_type_rpsi = 3, /* rfc 4585: Reference Picture Selection Indication (RPSI) */ + trtp_rtcp_psfb_fci_type_fir = 4, /* rfc 5104: Full Intra Request (FIR) Command*/ + trtp_rtcp_psfb_fci_type_afb = 15, /* rfc 4585: Application layer FB (AFB) message */ + +} +trtp_rtcp_psfb_fci_type_t; + +// Payload-specific FB message +typedef struct trtp_rtcp_report_psfb_s +{ + TRTP_DECLARE_RTCP_FB_PACKET; + + trtp_rtcp_psfb_fci_type_t fci_type; + union{ + // struct{ //rfc 4585: 6.3.1.2 + // } pli; + struct{ // rfc 4585: 6.3.2.2 + uint16_t* first; + uint16_t* number; + uint8_t* pic_id; + } sli; + struct{ // rfc 4585: 6.3.3.2 + unsigned pb:8; + unsigned pt:7; + uint8_t* bytes; + } rpsi; + struct{// rfc 5104: 4.3.1.1 + tsk_size_t count; + uint32_t* ssrc; // 32 bits + uint8_t* seq_num; // 8 bits + }fir; + struct{ // rfc 4585: 6.4 + uint8_t* bytes; + }afb; + }; +} +trtp_rtcp_report_psfb_t; + +trtp_rtcp_report_psfb_t* trtp_rtcp_report_psfb_create_null(); +trtp_rtcp_report_psfb_t* trtp_rtcp_report_psfb_create(struct trtp_rtcp_header_s* header); +trtp_rtcp_report_psfb_t* trtp_rtcp_report_psfb_create_2(trtp_rtcp_psfb_fci_type_t fci_type, uint32_t ssrc_sender, uint32_t ssrc_media_src); +trtp_rtcp_report_psfb_t* trtp_rtcp_report_psfb_create_pli(uint32_t ssrc_sender, uint32_t ssrc_media_src); +trtp_rtcp_report_psfb_t* trtp_rtcp_report_psfb_create_fir(uint8_t seq_num, uint32_t ssrc_sender, uint32_t ssrc_media_src); +trtp_rtcp_report_psfb_t* trtp_rtcp_report_psfb_deserialize(const void* data, tsk_size_t size); +int trtp_rtcp_report_psfb_serialize_to(const trtp_rtcp_report_psfb_t* self, void* data, tsk_size_t size); +tsk_size_t trtp_rtcp_report_psfb_get_size(const trtp_rtcp_report_psfb_t* self); + +#endif /* TINYRTP_RTCP_REPORT_FB_H */ diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_rr.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_rr.h index d8420976..c5f0b277 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_rr.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_rr.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -24,8 +24,30 @@ #include "tinyrtp_config.h" +#include "tinyrtp/rtcp/trtp_rtcp_packet.h" +#include "tinyrtp/rtcp/trtp_rtcp_rblock.h" + TRTP_BEGIN_DECLS +#define TRTP_RTCP_REPORT_RR(self) ((trtp_rtcp_report_rr_t*)(self)) + +// RFC 3550 6.4.2 RR: Receiver Report RTCP Packet +typedef struct trtp_rtcp_report_rr_s +{ + TRTP_DECLARE_RTCP_PACKET; + + uint32_t ssrc; + trtp_rtcp_rblocks_L_t* blocks; + trtp_rtcp_packets_L_t* packets; +} +trtp_rtcp_report_rr_t; + +trtp_rtcp_report_rr_t* trtp_rtcp_report_rr_create_null(); +trtp_rtcp_report_rr_t* trtp_rtcp_report_rr_create(struct trtp_rtcp_header_s* header); +trtp_rtcp_report_rr_t* trtp_rtcp_report_rr_create_2(uint32_t ssrc); +trtp_rtcp_report_rr_t* trtp_rtcp_report_rr_deserialize(const void* data, tsk_size_t size); +int trtp_rtcp_report_rr_serialize_to(const trtp_rtcp_report_rr_t* self, void* data, tsk_size_t size); +tsk_size_t trtp_rtcp_report_rr_get_size(const trtp_rtcp_report_rr_t* self); TRTP_END_DECLS diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_sdes.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_sdes.h index adabfe4b..9c122827 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_sdes.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_sdes.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -29,6 +29,8 @@ TRTP_BEGIN_DECLS +#define TRTP_RTCP_REPORT_SDES(self) ((trtp_rtcp_report_sdes_t*)(self)) + /* RFC 3550 6.5 SDES: Source Description RTCP Packet */ typedef struct trtp_rtcp_report_sdes_s { @@ -36,13 +38,15 @@ typedef struct trtp_rtcp_report_sdes_s trtp_rtcp_sdes_chuncks_L_t* chuncks; } trtp_rtcp_report_sdes_t; -#define TRTP_RTCP_REPORT_SDES(self) ((trtp_rtcp_report_sdes_t*)(self)) -TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_report_sdes_def_t; + typedef tsk_list_t trtp_rtcp_report_sdess_L_t; /**< List of @ref trtp_rtcp_report_sdes_t elements */ trtp_rtcp_report_sdes_t* trtp_rtcp_report_sdes_create_null(); +trtp_rtcp_report_sdes_t* trtp_rtcp_report_sdes_create(struct trtp_rtcp_header_s* header); trtp_rtcp_report_sdes_t* trtp_rtcp_report_sdes_deserialize(const void* data, tsk_size_t size); -int trtp_rtcp_report_sdes_deserialize_payload(trtp_rtcp_report_sdes_t* self, const void* payload, tsk_size_t size); +int trtp_rtcp_report_sdes_serialize_to(const trtp_rtcp_report_sdes_t* self, void* data, tsk_size_t size); +int trtp_rtcp_report_sdes_add_chunck(trtp_rtcp_report_sdes_t* self, trtp_rtcp_sdes_chunck_t* chunck); +tsk_size_t trtp_rtcp_report_sdes_get_size(const trtp_rtcp_report_sdes_t* self); TRTP_END_DECLS diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_sr.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_sr.h index 605ce793..3d477e07 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_sr.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_sr.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -35,8 +35,8 @@ TRTP_BEGIN_DECLS typedef struct trtp_rtcp_report_sr_s { TRTP_DECLARE_RTCP_PACKET; - - uint32_t sender_ssrc; + + uint32_t ssrc; struct{ uint32_t ntp_msw; /**< NTP timestamp, most significant word */ uint32_t ntp_lsw; /**< NTP timestamp, least significant word */ @@ -44,16 +44,19 @@ typedef struct trtp_rtcp_report_sr_s uint32_t sender_pcount; /**< sender's packet count */ uint32_t sender_ocount; /**< sender's octet count */ } sender_info; - trtp_rtcp_rblocks_L_t* rblocks; + + trtp_rtcp_rblocks_L_t* blocks; + trtp_rtcp_packets_L_t* packets; } trtp_rtcp_report_sr_t; +trtp_rtcp_report_sr_t* trtp_rtcp_report_sr_create_null(); +trtp_rtcp_report_sr_t* trtp_rtcp_report_sr_create(struct trtp_rtcp_header_s* header); +trtp_rtcp_report_sr_t* trtp_rtcp_report_sr_deserialize(const void* data, tsk_size_t size); +int trtp_rtcp_report_sr_serialize_to(const trtp_rtcp_report_sr_t* self, void* data, tsk_size_t size); +int trtp_rtcp_report_sr_add_block(trtp_rtcp_report_sr_t* self, trtp_rtcp_rblock_t* rblock); +tsk_size_t trtp_rtcp_report_sr_get_size(const trtp_rtcp_report_sr_t* self); + TRTP_END_DECLS -TINYRTP_API trtp_rtcp_report_sr_t* trtp_rtcp_report_sr_create_null(); -trtp_rtcp_report_sr_t* trtp_rtcp_report_sr_deserialize(const void* data, tsk_size_t size); -int trtp_rtcp_report_sr_deserialize_payload(trtp_rtcp_report_sr_t* self, const void* payload, tsk_size_t size); - -TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_report_sr_def_t; - #endif /* TINYRTP_RTCP_REPORT_SR_H */ diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_xr.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_xr.h index f40f3914..c9459a44 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_xr.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_xr.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_sdes_chunck.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_sdes_chunck.h index 03446407..29a348c0 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_sdes_chunck.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_sdes_chunck.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -29,24 +29,27 @@ #define TRTP_RTCP_SDES_CHUNCK_MIN_SIZE 4 #define TRTP_RTCP_SDES_CHUNCK_SSRC_OR_CSRC_SIZE 4 +#define TRTP_RTCP_SDES_CHUNCK(self) ((trtp_rtcp_sdes_chunck_t*)(self)) + TRTP_BEGIN_DECLS typedef struct trtp_rtcp_sdes_chunck_s { TSK_DECLARE_OBJECT; - uint32_t ssrc_or_csrc; + uint32_t ssrc; trtp_rtcp_sdes_items_L_t* items; } trtp_rtcp_sdes_chunck_t; -#define TRTP_RTCP_SDES_CHUNCK(self) ((trtp_rtcp_sdes_chunck_t*)(self)) -TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_chunck_def_t; + typedef tsk_list_t trtp_rtcp_sdes_chuncks_L_t; /**< List of @ref trtp_rtcp_sdes_item_t elements */ trtp_rtcp_sdes_chunck_t* trtp_rtcp_sdes_chunck_create_null(); -trtp_rtcp_sdes_chunck_t* trtp_rtcp_sdes_chunck_create(uint32_t ssrc_or_csrc); +trtp_rtcp_sdes_chunck_t* trtp_rtcp_sdes_chunck_create(uint32_t ssrc); trtp_rtcp_sdes_chunck_t* trtp_rtcp_sdes_chunck_deserialize(const void* data, tsk_size_t size); -tsk_size_t trtp_rtcp_sdes_chunck_get_size(trtp_rtcp_sdes_chunck_t* self); +int trtp_rtcp_sdes_chunck_serialize_to(const trtp_rtcp_sdes_chunck_t* self, void* data, tsk_size_t size); +int trtp_rtcp_sdes_chunck_add_item(trtp_rtcp_sdes_chunck_t* self, trtp_rtcp_sdes_item_type_t type, const void* data, uint8_t length); +tsk_size_t trtp_rtcp_sdes_chunck_get_size(const trtp_rtcp_sdes_chunck_t* self); TRTP_END_DECLS diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_sdes_item.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_sdes_item.h index 97e2e67d..f47b473f 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_sdes_item.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_sdes_item.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -27,7 +27,9 @@ #include "tsk_list.h" #include "tsk_buffer.h" -#define TRTP_RTCP_SDES_HEADER_SIZE 4 +#define TRTP_RTCP_SDES_ITEM_MIN_SIZE 2 /* Type + Length */ + +#define TRTP_RTCP_SDES_ITEM(self) ((trtp_rtcp_sdes_item_t*)(self)) TRTP_BEGIN_DECLS @@ -49,129 +51,20 @@ trtp_rtcp_sdes_item_type_t; typedef struct trtp_rtcp_sdes_item_s { TSK_DECLARE_OBJECT; - struct{ - unsigned version:2; - unsigned padding:1; - unsigned source_count:5; - trtp_rtcp_sdes_item_type_t type; /**< Packet type: 8bits */ - uint16_t length; - } header; + + trtp_rtcp_sdes_item_type_t type; + tsk_buffer_t *data; } trtp_rtcp_sdes_item_t; -#define TRTP_RTCP_SDES_ITEM(self) ((trtp_rtcp_sdes_item_t*)(self)) -#define TRTP_DECLARE_RTCP_SDES_ITEM trtp_rtcp_sdes_item_t __sdes_item__ + typedef tsk_list_t trtp_rtcp_sdes_items_L_t; /**< List of @ref trtp_rtcp_sdes_item_t elements */ -int trtp_rtcp_sdes_item_init(trtp_rtcp_sdes_item_t* self, uint8_t version, uint8_t padding, trtp_rtcp_sdes_item_type_t type, uint16_t length); -trtp_rtcp_sdes_item_t* trtp_rtcp_sdes_item_create(uint8_t version, uint8_t padding, trtp_rtcp_sdes_item_type_t type, uint16_t length); + +trtp_rtcp_sdes_item_t* trtp_rtcp_sdes_item_create(trtp_rtcp_sdes_item_type_t type, const void* data, uint8_t length); trtp_rtcp_sdes_item_t* trtp_rtcp_sdes_item_deserialize(const void* data, tsk_size_t size); -tsk_buffer_t* trtp_rtcp_sdes_item_serialize(trtp_rtcp_sdes_item_t* self); -tsk_size_t trtp_rtcp_sdes_item_get_size(trtp_rtcp_sdes_item_t* self); - -// RFC 3550 6.5.1 CNAME: Canonical End-Point Identifier SDES Item -typedef struct trtp_rtcp_sdes_item_cname_s -{ - TRTP_DECLARE_RTCP_SDES_ITEM; - char* cname; -} -trtp_rtcp_sdes_item_cname_t; -#define TRTP_RTCP_SDES_ITEM_CNAME(self) ((trtp_rtcp_sdes_item_cname_t*)(self)) -TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_item_cname_def_t; -trtp_rtcp_sdes_item_cname_t* trtp_rtcp_sdes_item_cname_create_null(); -trtp_rtcp_sdes_item_cname_t* trtp_rtcp_sdes_item_cname_create(const char* cname); -tsk_size_t trtp_rtcp_sdes_item_cname_get_size(trtp_rtcp_sdes_item_cname_t* self); - -// RFC 3550 6.5.2 NAME: User Name SDES Item -typedef struct trtp_rtcp_sdes_item_name_s -{ - TRTP_DECLARE_RTCP_SDES_ITEM; - char* name; -} -trtp_rtcp_sdes_item_name_t; -#define TRTP_RTCP_SDES_ITEM_NAME(self) ((trtp_rtcp_sdes_item_name_t*)(self)) -TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_item_name_def_t; -trtp_rtcp_sdes_item_name_t* trtp_rtcp_sdes_item_name_create_null(); -trtp_rtcp_sdes_item_name_t* trtp_rtcp_sdes_item_name_create(const char* name); -tsk_size_t trtp_rtcp_sdes_item_name_get_size(trtp_rtcp_sdes_item_name_t* self); - -// RFC 3550 6.5.3 EMAIL: Electronic Mail Address SDES Item -typedef struct trtp_rtcp_sdes_item_email_s -{ - TRTP_DECLARE_RTCP_SDES_ITEM; - char* email; -} -trtp_rtcp_sdes_item_email_t; -#define TRTP_RTCP_SDES_ITEM_EMAIL(self) ((trtp_rtcp_sdes_item_email_t*)(self)) -TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_item_email_def_t; -trtp_rtcp_sdes_item_email_t* trtp_rtcp_sdes_item_email_create_null(); -trtp_rtcp_sdes_item_email_t* trtp_rtcp_sdes_item_email_create(const char* email); -tsk_size_t trtp_rtcp_sdes_item_email_get_size(trtp_rtcp_sdes_item_email_t* self); - -// RFC 3550 6.5.4 PHONE: Phone Number SDES Item -typedef struct trtp_rtcp_sdes_item_phone_s -{ - TRTP_DECLARE_RTCP_SDES_ITEM; - char* phone; -} -trtp_rtcp_sdes_item_phone_t; -#define TRTP_RTCP_SDES_ITEM_PHONE(self) ((trtp_rtcp_sdes_item_phone_t*)(self)) -TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_item_phone_def_t; -trtp_rtcp_sdes_item_phone_t* trtp_rtcp_sdes_item_phone_create_null(); -trtp_rtcp_sdes_item_phone_t* trtp_rtcp_sdes_item_phone_create(const char* phone); -tsk_size_t trtp_rtcp_sdes_item_phone_get_size(trtp_rtcp_sdes_item_phone_t* self); - -// RFC 3550 6.5.5 LOC: Geographic User Location SDES Item -typedef struct trtp_rtcp_sdes_item_loc_s -{ - TRTP_DECLARE_RTCP_SDES_ITEM; - char* loc; -} -trtp_rtcp_sdes_item_loc_t; -#define TRTP_RTCP_SDES_ITEM_LOC(self) ((trtp_rtcp_sdes_item_loc_t*)(self)) -TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_item_loc_def_t; -trtp_rtcp_sdes_item_loc_t* trtp_rtcp_sdes_item_loc_create_null(); -trtp_rtcp_sdes_item_loc_t* trtp_rtcp_sdes_item_loc_create(const char* loc); -tsk_size_t trtp_rtcp_sdes_item_loc_get_size(trtp_rtcp_sdes_item_loc_t* self); - -// RFC 3550 6.5.6 TOOL: Application or Tool Name SDES Item -typedef struct trtp_rtcp_sdes_item_tool_s -{ - TRTP_DECLARE_RTCP_SDES_ITEM; - char* tool; -} -trtp_rtcp_sdes_item_tool_t; -#define TRTP_RTCP_SDES_ITEM_TOOL(self) ((trtp_rtcp_sdes_item_tool_t*)(self)) -TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_item_tool_def_t; -trtp_rtcp_sdes_item_tool_t* trtp_rtcp_sdes_item_tool_create_null(); -trtp_rtcp_sdes_item_tool_t* trtp_rtcp_sdes_item_tool_create(const char* tool); -tsk_size_t trtp_rtcp_sdes_item_tool_get_size(trtp_rtcp_sdes_item_tool_t* self); - -// RFC 3550 6.5.7 NOTE: Notice/Status SDES Item -typedef struct trtp_rtcp_sdes_item_note_s -{ - TRTP_DECLARE_RTCP_SDES_ITEM; - char* note; -} -trtp_rtcp_sdes_item_note_t; -#define TRTP_RTCP_SDES_ITEM_NOTE(self) ((trtp_rtcp_sdes_item_note_t*)(self)) -TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_item_note_def_t; -trtp_rtcp_sdes_item_note_t* trtp_rtcp_sdes_item_note_create_null(); -trtp_rtcp_sdes_item_note_t* trtp_rtcp_sdes_item_note_create(const char* note); -tsk_size_t trtp_rtcp_sdes_item_note_get_size(trtp_rtcp_sdes_item_note_t* self); - - -// RFC 3550 6.5.8 PRIV: Private Extensions SDES Item -typedef struct trtp_rtcp_sdes_item_priv_s -{ - TRTP_DECLARE_RTCP_SDES_ITEM; - tsk_buffer_t* priv; -} -trtp_rtcp_sdes_item_priv_t; -#define TRTP_RTCP_SDES_ITEM_PRIV(self) ((trtp_rtcp_sdes_item_priv_t*)(self)) -TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_item_priv_def_t; -trtp_rtcp_sdes_item_priv_t* trtp_rtcp_sdes_item_priv_create_null(); -trtp_rtcp_sdes_item_priv_t* trtp_rtcp_sdes_item_priv_create(const void* data, tsk_size_t size); -tsk_size_t trtp_rtcp_sdes_item_priv_get_size(trtp_rtcp_sdes_item_priv_t* self); +tsk_buffer_t* trtp_rtcp_sdes_item_serialize(const trtp_rtcp_sdes_item_t* self); +int trtp_rtcp_sdes_item_serialize_to(const trtp_rtcp_sdes_item_t* self, void* data, tsk_size_t size); +tsk_size_t trtp_rtcp_sdes_item_get_size(const trtp_rtcp_sdes_item_t* self); TRTP_END_DECLS diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_session.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_session.h index 3fedb2a3..dcb204c1 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_session.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_session.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -30,9 +30,33 @@ #define TINYMEDIA_RTCP_SESSION_H #include "tinyrtp_config.h" +#include "tinyrtp/trtp_srtp.h" + +#include "tnet_types.h" + +#include "tsk_common.h" TRTP_BEGIN_DECLS +struct trtp_rtcp_packet_s; +struct trtp_rtp_packet_s; + +typedef int (*trtp_rtcp_cb_f)(const void* callback_data, const struct trtp_rtcp_packet_s* packet); + +struct trtp_rtcp_session_s* trtp_rtcp_session_create(uint32_t ssrc); +int trtp_rtcp_session_set_callback(struct trtp_rtcp_session_s* self, trtp_rtcp_cb_f callback, const void* callback_data); +#if HAVE_SRTP +int trtp_rtcp_session_set_srtp_sess(struct trtp_rtcp_session_s* self, const srtp_t* session); +#endif +int trtp_rtcp_session_start(struct trtp_rtcp_session_s* self, tnet_fd_t local_fd, const struct sockaddr* remote_addr); +int trtp_rtcp_session_stop(struct trtp_rtcp_session_s* self); +int trtp_rtcp_session_process_rtp_out(struct trtp_rtcp_session_s* self, const struct trtp_rtp_packet_s* packet_rtp, tsk_size_t size); +int trtp_rtcp_session_process_rtp_in(struct trtp_rtcp_session_s* self, const struct trtp_rtp_packet_s* packet_rtp, tsk_size_t size); +int trtp_rtcp_session_process_rtcp_in(struct trtp_rtcp_session_s* self, const void* buffer, tsk_size_t size); +int trtp_rtcp_session_signal_pkt_loss(struct trtp_rtcp_session_s* self, uint32_t ssrc_media, const uint16_t* seq_nums, tsk_size_t count); +int trtp_rtcp_session_signal_frame_corrupted(struct trtp_rtcp_session_s* self, uint32_t ssrc_media); +int trtp_rtcp_session_signal_jb_error(struct trtp_rtcp_session_s* self, uint32_t ssrc_media); + TRTP_END_DECLS #endif /* TINYMEDIA_RTCP_SESSION_H */ diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtp/trtp_rtp_header.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtp/trtp_rtp_header.h index b8c5d5f5..2ade6800 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtp/trtp_rtp_header.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtp/trtp_rtp_header.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtp/trtp_rtp_packet.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtp/trtp_rtp_packet.h index 9410dc96..d79471a1 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtp/trtp_rtp_packet.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtp/trtp_rtp_packet.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -45,7 +45,7 @@ typedef struct trtp_rtp_packet_s struct{ void* data; - const void* data_const; + const void* data_const; // never free()d. an alternative to "data" tsk_size_t size; } payload; @@ -56,6 +56,7 @@ typedef struct trtp_rtp_packet_s } extension; } trtp_rtp_packet_t; +typedef tsk_list_t trtp_rtp_packets_L_t; TINYRTP_API trtp_rtp_packet_t* trtp_rtp_packet_create_null(); TINYRTP_API trtp_rtp_packet_t* trtp_rtp_packet_create(uint32_t ssrc, uint16_t seq_num, uint32_t timestamp, uint8_t payload_type, tsk_bool_t marker); diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtp/trtp_rtp_session.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtp/trtp_rtp_session.h index 81e4e39b..61462c8d 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtp/trtp_rtp_session.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtp/trtp_rtp_session.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -33,6 +33,10 @@ TRTP_BEGIN_DECLS +struct trtp_rtp_packet_s; + +typedef int (*trtp_rtp_cb_f)(const void* callback_data, const struct trtp_rtp_packet_s* packet); + TRTP_END_DECLS #endif /* TINYMEDIA_RTP_SESSION_H */ diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/trtp.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/trtp.h index 1a90017f..1b0896c7 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/trtp.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/trtp.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/trtp_manager.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/trtp_manager.h index 2610c577..6ef0c8d6 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/trtp_manager.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/trtp_manager.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -31,23 +31,23 @@ #include "tinyrtp_config.h" +#include "tinyrtp/rtp/trtp_rtp_session.h" +#include "tinyrtp/rtcp/trtp_rtcp_session.h" #include "tinyrtp/trtp_srtp.h" + #include "tinynet.h" TRTP_BEGIN_DECLS -/* Forward declarations */ struct trtp_rtp_packet_s; -struct trtp_rtcp_packet_s; - -typedef int (*trtp_manager_rtp_cb_f)(const void* callback_data, const struct trtp_rtp_packet_s* packet); -typedef int (*trtp_manager_rtcp_cb_f)(const void* callback_data, const struct trtp_rtcp_packet_s* packet); /** RTP/RTCP manager */ typedef struct trtp_manager_s { TSK_DECLARE_OBJECT; + struct tnet_ice_ctx_s* ice_ctx; + struct{ uint16_t seq_num; uint32_t timestamp; @@ -62,7 +62,12 @@ typedef struct trtp_manager_s tnet_port_t public_port; const void* callback_data; - trtp_manager_rtp_cb_f callback; + trtp_rtp_cb_f callback; + + struct{ + void* ptr; + tsk_size_t size; + } serial_buffer; } rtp; struct{ @@ -75,13 +80,16 @@ typedef struct trtp_manager_s tnet_port_t public_port; const void* callback_data; - trtp_manager_rtcp_cb_f callback; + trtp_rtcp_cb_f callback; + + struct trtp_rtcp_session_s* session; } rtcp; char* local_ip; - tsk_bool_t ipv6; - tsk_bool_t started; - tsk_bool_t enable_rtcp; + tsk_bool_t use_ipv6; + tsk_bool_t is_started; + tsk_bool_t use_rtcp; + tsk_bool_t use_rtcp_mux; tsk_bool_t socket_disabled; tnet_transport_t* transport; struct{ @@ -89,6 +97,8 @@ typedef struct trtp_manager_s uint16_t stop; } port_range; + TSK_DECLARE_SAFEOBJ; + #if HAVE_SRTP trtp_srtp_ctx_xt srtp_contexts[2][2]; const struct trtp_srtp_ctx_xs* srtp_ctx_neg_local; @@ -97,19 +107,24 @@ typedef struct trtp_manager_s } trtp_manager_t; -TINYRTP_API trtp_manager_t* trtp_manager_create(tsk_bool_t enable_rtcp, const char* local_ip, tsk_bool_t ipv6); +TINYRTP_API trtp_manager_t* trtp_manager_create(tsk_bool_t use_rtcp, const char* local_ip, tsk_bool_t use_ipv6); +TINYRTP_API trtp_manager_t* trtp_manager_create_2(struct tnet_ice_ctx_s* ice_ctx); TINYRTP_API int trtp_manager_prepare(trtp_manager_t* self); -TINYRTP_API tsk_bool_t trtp_manager_is_prepared(trtp_manager_t* self); +TINYRTP_API tsk_bool_t trtp_manager_is_ready(trtp_manager_t* self); TINYRTP_API int trtp_manager_set_natt_ctx(trtp_manager_t* self, tnet_nat_context_handle_t* natt_ctx); -TINYRTP_API int trtp_manager_set_rtp_callback(trtp_manager_t* self, trtp_manager_rtp_cb_f callback, const void* callback_data); +TINYRTP_API int trtp_manager_set_rtp_callback(trtp_manager_t* self, trtp_rtp_cb_f callback, const void* callback_data); +TINYRTP_API int trtp_manager_set_rtcp_callback(trtp_manager_t* self, trtp_rtcp_cb_f callback, const void* callback_data); TINYRTP_API int trtp_manager_set_payload_type(trtp_manager_t* self, uint8_t payload_type); TINYRTP_API int trtp_manager_set_rtp_remote(trtp_manager_t* self, const char* remote_ip, tnet_port_t remote_port); -TINYRTP_API int trtp_manager_set_rtp_remote(trtp_manager_t* self, const char* remote_ip, tnet_port_t remote_port); TINYRTP_API int trtp_manager_set_rtcp_remote(trtp_manager_t* self, const char* remote_ip, tnet_port_t remote_port); TINYRTP_API int trtp_manager_set_port_range(trtp_manager_t* self, uint16_t start, uint16_t stop); TINYRTP_API int trtp_manager_start(trtp_manager_t* self); -TINYRTP_API int trtp_manager_send_rtp(trtp_manager_t* self, const void* data, tsk_size_t size, uint32_t duration, tsk_bool_t marker, tsk_bool_t last_packet); -TINYRTP_API int trtp_manager_send_rtp_2(trtp_manager_t* self, const struct trtp_rtp_packet_s* packet); +TINYRTP_API tsk_size_t trtp_manager_send_rtp(trtp_manager_t* self, const void* data, tsk_size_t size, uint32_t duration, tsk_bool_t marker, tsk_bool_t last_packet); +TINYRTP_API tsk_size_t trtp_manager_send_rtp_packet(trtp_manager_t* self, const struct trtp_rtp_packet_s* packet, tsk_bool_t bypass_encrypt); +TINYRTP_API tsk_size_t trtp_manager_send_rtp_raw(trtp_manager_t* self, const void* data, tsk_size_t size); +TINYRTP_API int trtp_manager_signal_pkt_loss(trtp_manager_t* self, uint32_t ssrc_media, const uint16_t* seq_nums, tsk_size_t count); +TINYRTP_API int trtp_manager_signal_frame_corrupted(trtp_manager_t* self, uint32_t ssrc_media); +TINYRTP_API int trtp_manager_signal_jb_error(trtp_manager_t* self, uint32_t ssrc_media); TINYRTP_API int trtp_manager_stop(trtp_manager_t* self); TINYRTP_GEXTERN const tsk_object_def_t *trtp_manager_def_t; diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp_config.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp_config.h index 6f52355e..9ddab4d1 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp_config.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp_config.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_header.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_header.c index 0d1040b7..79fb1ba7 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_header.c +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_header.c @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -38,7 +38,7 @@ trtp_rtcp_header_t* trtp_rtcp_header_create_null() return tsk_object_new(trtp_rtcp_header_def_t); } -trtp_rtcp_header_t* trtp_rtcp_header_create(uint8_t version, uint8_t padding, uint8_t rc, trtp_rtcp_packet_type_t type, uint16_t length) +trtp_rtcp_header_t* trtp_rtcp_header_create(uint8_t version, uint8_t padding, uint8_t rc, trtp_rtcp_packet_type_t type, uint16_t length_in_bytes) { trtp_rtcp_header_t* header; if((header = trtp_rtcp_header_create_null())){ @@ -46,88 +46,60 @@ trtp_rtcp_header_t* trtp_rtcp_header_create(uint8_t version, uint8_t padding, ui header->padding = padding; header->rc = rc; header->type = type; - header->length = length; + header->length_in_words_minus1 = ((length_in_bytes >> 2) - 1); + header->length_in_bytes = length_in_bytes; } return header; } -// for performance reasons you should use "trtp_rtcp_header_serialize_2()" which doesn't alloc() any buffer -tsk_buffer_t* trtp_rtcp_header_serialize(const trtp_rtcp_header_t *self) +int trtp_rtcp_header_serialize_to(const trtp_rtcp_header_t *self, void* data, tsk_size_t size) { - tsk_buffer_t* buffer = tsk_null; - uint8_t* bytes = tsk_null; - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return tsk_null; - } - if((bytes = tsk_calloc(TRTP_RTCP_HEADER_SIZE, sizeof(uint8_t)))){ - if(trtp_rtcp_header_serialize_2(self, bytes)){ - TSK_DEBUG_ERROR("Failed to serialize rtcp header"); - TSK_FREE(bytes); - return tsk_null; - } - if(!(buffer = tsk_buffer_create_null())){ - TSK_DEBUG_ERROR("Failed to allocate new buffer"); - TSK_FREE(bytes); - return tsk_null; - } - tsk_buffer_takeownership(buffer, (void**)&bytes, TRTP_RTCP_HEADER_SIZE); - } - else{ - TSK_DEBUG_ERROR("Failed to allocate new buffer"); - return tsk_null; - } - return buffer; -} - -int trtp_rtcp_header_serialize_2(const trtp_rtcp_header_t *self, uint8_t output[TRTP_RTCP_HEADER_SIZE]) -{ - if(!self){ + uint8_t* pdata = (uint8_t*)data; + if(!self || !data || size < TRTP_RTCP_HEADER_SIZE){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } // Octet-0: version(2), Padding(1), RC(5) - output[0] = ((uint8_t)self->version)<<6 | + pdata[0] = ((uint8_t)self->version)<<6 | ((uint8_t)self->padding)<<5 | ((uint8_t)self->rc); // Octet-1: PT(8) - output[1] = self->type; + pdata[1] = self->type; // Octet-2 and Octet3: length (16) - *((uint16_t*)&output[2]) = tnet_htons(self->length); + pdata[2] = self->length_in_words_minus1 >> 8; + pdata[3] = self->length_in_words_minus1 & 0xFF; return 0; } trtp_rtcp_header_t* trtp_rtcp_header_deserialize(const void *data, tsk_size_t size) { trtp_rtcp_header_t* header = tsk_null; - if(trtp_rtcp_header_deserialize_2(&header, data, size)){ + if(trtp_rtcp_header_deserialize_to(&header, data, size) != 0){ TSK_DEBUG_ERROR("Failed to deserialize the rtcp header"); TSK_OBJECT_SAFE_FREE(header); } return header; } -int trtp_rtcp_header_deserialize_2(trtp_rtcp_header_t** self, const void *data, tsk_size_t size) +int trtp_rtcp_header_deserialize_to(trtp_rtcp_header_t** self, const void *data, tsk_size_t size) { const uint8_t* pdata = (uint8_t*)data; - if(!self || !data || !size){ + if(!self || !data || size < TRTP_RTCP_HEADER_SIZE){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } - if(sizeversion = pdata[0]>>6; - (*self)->padding = (pdata[0]>>5)&0x01; - (*self)->rc = pdata[0]&0x1f; + (*self)->version = pdata[0] >> 6; + (*self)->padding = (pdata[0] >> 5) & 0x01; + (*self)->rc = (pdata[0] & 0x1f); (*self)->type = (enum trtp_rtcp_packet_type_e)pdata[1]; - (*self)->length = tnet_ntohs_2(&pdata[2]); + (*self)->length_in_words_minus1 = tnet_ntohs_2(&pdata[2]); + (*self)->length_in_bytes = ((*self)->length_in_words_minus1 + 1) << 2; return 0; } diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_packet.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_packet.c index 931a717f..ca1d399b 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_packet.c +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_packet.c @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -23,116 +23,224 @@ #include "tinyrtp/rtcp/trtp_rtcp_header.h" #include "tinyrtp/rtcp/trtp_rtcp_report_sdes.h" +#include "tinyrtp/rtcp/trtp_rtcp_report_sr.h" +#include "tinyrtp/rtcp/trtp_rtcp_report_rr.h" +#include "tinyrtp/rtcp/trtp_rtcp_report_bye.h" +#include "tinyrtp/rtcp/trtp_rtcp_report_fb.h" #include "tsk_debug.h" -int trtp_rtcp_packet_init(trtp_rtcp_packet_t* self, uint8_t version, uint8_t padding, uint8_t rc, trtp_rtcp_packet_type_t type, uint16_t length) +static tsk_object_t* trtp_rtcp_packet_ctor(tsk_object_t * self, va_list * app) +{ + trtp_rtcp_packet_t *packet = self; + if(packet){ + } + return self; +} + +static tsk_object_t* trtp_rtcp_packet_dtor(tsk_object_t * self) +{ + trtp_rtcp_packet_t *packet = self; + if(packet){ + + } + + return self; +} + +static const tsk_object_def_t trtp_rtcp_packet_def_s = +{ + sizeof(trtp_rtcp_packet_t), + trtp_rtcp_packet_ctor, + trtp_rtcp_packet_dtor, + tsk_null, +}; +const tsk_object_def_t *trtp_rtcp_packet_def_t = &trtp_rtcp_packet_def_s; + +trtp_rtcp_packet_t* trtp_rtcp_packet_create(struct trtp_rtcp_header_s* header) +{ + trtp_rtcp_packet_t* packet; + if((packet = tsk_object_new(trtp_rtcp_packet_def_t)) && header){ + packet->header = tsk_object_ref(header); + } + return packet; +} + + +int trtp_rtcp_packet_init(trtp_rtcp_packet_t* self, uint8_t version, uint8_t padding, uint8_t rc, trtp_rtcp_packet_type_t type, uint16_t length_in_bytes) { if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } if(!self->header){ - self->header = trtp_rtcp_header_create(version, padding, rc, type, length); + self->header = trtp_rtcp_header_create(version, padding, rc, type, length_in_bytes); } else{ self->header->version = version; self->header->padding = padding; self->header->rc = rc; self->header->type = type; - self->header->length = length; + self->header->length_in_bytes = length_in_bytes; + self->header->length_in_words_minus1 = ((length_in_bytes >> 2) - 1); } return 0; } -int trtp_rtcp_packet_init_header(trtp_rtcp_packet_t* self, const void* data, tsk_size_t size) -{ - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - return trtp_rtcp_header_deserialize_2(&self->header, data, size); -} - -// @NotImplemented trtp_rtcp_packet_t* trtp_rtcp_packet_deserialize(const void* data, tsk_size_t size) { - trtp_rtcp_packet_t* packet = tsk_null; - trtp_rtcp_header_t* header = tsk_null; - const uint8_t* pdata = (const uint8_t*)data; - if(data || !size){ + trtp_rtcp_packet_type_t type; + int ret = 0; + + if(!data || size < TRTP_RTCP_HEADER_SIZE){ TSK_DEBUG_ERROR("Invalid parameter"); return tsk_null; } - if(trtp_rtcp_header_deserialize_2(&header, data, size)){ - TSK_DEBUG_ERROR("failed to derialize rtcp header"); - goto bail; - } - TSK_DEBUG_ERROR("Not Implemented"); - pdata += TRTP_RTCP_HEADER_SIZE; - size -= TRTP_RTCP_HEADER_SIZE; - switch(header->type){ - case trtp_rtcp_packet_type_sr: - break; - case trtp_rtcp_packet_type_rr: - break; - case trtp_rtcp_packet_type_sdes: - if((packet = (trtp_rtcp_packet_t*)trtp_rtcp_report_sdes_create_null())){ - packet->header = tsk_object_ref(header); - if(!(trtp_rtcp_report_sdes_deserialize_payload(TRTP_RTCP_REPORT_SDES(packet),(const void*)pdata,size))){ - TSK_DEBUG_ERROR("Failed to parse data"); - goto bail; - } - } - break; - case trtp_rtcp_packet_type_bye: - break; - case trtp_rtcp_packet_type_app: - break; + + type = (trtp_rtcp_packet_type_t)((const uint8_t*)data)[1]; + + switch(type){ + case trtp_rtcp_packet_type_rr: return (trtp_rtcp_packet_t*)trtp_rtcp_report_rr_deserialize(data, size); + case trtp_rtcp_packet_type_sr: return (trtp_rtcp_packet_t*)trtp_rtcp_report_sr_deserialize(data, size); + case trtp_rtcp_packet_type_sdes: return (trtp_rtcp_packet_t*)trtp_rtcp_report_sdes_deserialize(data, size); + case trtp_rtcp_packet_type_bye: return (trtp_rtcp_packet_t*)trtp_rtcp_report_bye_deserialize(data, size); + case trtp_rtcp_packet_type_rtpfb: return (trtp_rtcp_packet_t*)trtp_rtcp_report_rtpfb_deserialize(data, size); + case trtp_rtcp_packet_type_psfb: return (trtp_rtcp_packet_t*)trtp_rtcp_report_psfb_deserialize(data, size); default: - TSK_DEBUG_ERROR("%d is not a valid packet type", header->type); - goto bail; + { + // returns abstract RTCP packet + trtp_rtcp_header_t* header; + TSK_DEBUG_ERROR("%d not recognized as valid RTCP packet type", (int)type); + if((header = trtp_rtcp_header_deserialize(data, size))){ + trtp_rtcp_packet_t* packet = trtp_rtcp_packet_create(header); + TSK_OBJECT_SAFE_FREE(header); + return packet; + } + break; + } } -bail: - TSK_OBJECT_SAFE_FREE(header); - return packet; + return tsk_null; } -// @NotImplemented -tsk_size_t trtp_rtcp_packet_get_size(trtp_rtcp_packet_t* self) +int trtp_rtcp_packet_serialize_to(const trtp_rtcp_packet_t* self, void* data, tsk_size_t size) +{ + if(!self || !self->header || !data || !size){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + switch(self->header->type){ + case trtp_rtcp_packet_type_rr: return trtp_rtcp_report_rr_serialize_to((const trtp_rtcp_report_rr_t*)self, data, size); + case trtp_rtcp_packet_type_sr: return trtp_rtcp_report_sr_serialize_to((const trtp_rtcp_report_sr_t*)self, data, size); + case trtp_rtcp_packet_type_sdes: return trtp_rtcp_report_sdes_serialize_to((const trtp_rtcp_report_sdes_t*)self, data, size); + case trtp_rtcp_packet_type_bye: return trtp_rtcp_report_bye_serialize_to((const trtp_rtcp_report_bye_t*)self, data, size); + case trtp_rtcp_packet_type_psfb: return trtp_rtcp_report_psfb_serialize_to((const trtp_rtcp_report_psfb_t*)self, data, size); + case trtp_rtcp_packet_type_rtpfb: return trtp_rtcp_report_rtpfb_serialize_to((const trtp_rtcp_report_rtpfb_t*)self, data, size); + default: + { + TSK_DEBUG_ERROR("%d not recognized as valid RTCP packet type", (int)self->header->type); + return -2; + } + } +} + +tsk_buffer_t* trtp_rtcp_packet_serialize(const trtp_rtcp_packet_t* self, tsk_size_t num_bytes_pad) +{ + tsk_size_t size = trtp_rtcp_packet_get_size(self); + if(self && size){ + tsk_buffer_t* buffer; + const tsk_size_t _size = (size + num_bytes_pad); + if((buffer = tsk_buffer_create(tsk_null, _size))){ + if(trtp_rtcp_packet_serialize_to(self, buffer->data, size) != 0){ + TSK_OBJECT_SAFE_FREE(buffer); + } + else buffer->size = size; + return buffer; + } + } + return tsk_null; +} + +int trtp_rtcp_packet_add_packet(trtp_rtcp_packet_t* self, trtp_rtcp_packet_t* packet, tsk_bool_t front) +{ + trtp_rtcp_packets_L_t* packets = tsk_null; + if(!self || !self->header || !packet){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + switch(self->header->type){ + case trtp_rtcp_packet_type_rr: packets = ((trtp_rtcp_report_rr_t*)self)->packets; break; + case trtp_rtcp_packet_type_sr: packets = ((trtp_rtcp_report_sr_t*)self)->packets; break; + case trtp_rtcp_packet_type_bye: packets = ((trtp_rtcp_report_bye_t*)self)->packets; break; + default: TSK_DEBUG_ERROR("not valid operation for packet type %d", (int)self->header->type); return -2; + } + + if(packets){ + //tsk_size_t packet_size = trtp_rtcp_packet_get_size(packet); + packet = tsk_object_ref(packet); + // self->header->length_in_bytes += packet_size; + // self->header->length_in_words_minus1 = ((self->header->length_in_bytes >> 2) - 1) + + // ((self->header->length_in_bytes & 0x03) ? 1 : 0); + tsk_list_push_data(packets, (void**)&packet, !front); + } + + return 0; +} + +const trtp_rtcp_packet_t* trtp_rtcp_packet_get_at(const trtp_rtcp_packet_t* self, trtp_rtcp_packet_type_t type, tsk_size_t index) +{ + const tsk_list_item_t *item; + const trtp_rtcp_packets_L_t* packets = tsk_null; + tsk_size_t i; + + if(!self || !self->header){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + if(self->header->type == type && index == 0){ + return self; + } + switch(self->header->type){ + case trtp_rtcp_packet_type_rr: packets = ((const trtp_rtcp_report_rr_t*)self)->packets; break; + case trtp_rtcp_packet_type_sr: packets = ((const trtp_rtcp_report_sr_t*)self)->packets; break; + case trtp_rtcp_packet_type_bye: packets = ((const trtp_rtcp_report_bye_t*)self)->packets; break; + } + + i = 0; + tsk_list_foreach(item, packets){ + if(TRTP_RTCP_PACKET(item->data)->header->type == type && i++ >= index){ + return TRTP_RTCP_PACKET(item->data); + } + } + return tsk_null; +} + +const trtp_rtcp_packet_t* trtp_rtcp_packet_get(const trtp_rtcp_packet_t* self, trtp_rtcp_packet_type_t type) +{ + return trtp_rtcp_packet_get_at(self, type, 0); +} + +tsk_size_t trtp_rtcp_packet_get_size(const trtp_rtcp_packet_t* self) { if(!self || !self->header){ TSK_DEBUG_ERROR("Invalid parameter"); return 0; } - TSK_DEBUG_ERROR("Not implemented"); - switch(self->header->type){ - case trtp_rtcp_packet_type_sr: - return 0; - case trtp_rtcp_packet_type_rr: - return 0; - case trtp_rtcp_packet_type_sdes: - return 0; - case trtp_rtcp_packet_type_bye: - return 0; - case trtp_rtcp_packet_type_app: - return 0; - default: - TSK_DEBUG_ERROR("%d is not a valid packet type", self->header->type); - return 0; - } -} -int trtp_rtcp_packet_set_length(trtp_rtcp_packet_t* self, uint16_t length) -{ - if(self && self->header){ - self->header->length = length; - return 0; - } - else{ - TSK_DEBUG_ERROR("Invalid parameter. Did you forget to call trtp_rtcp_packet_init()"); - return -1; + switch(self->header->type){ + case trtp_rtcp_packet_type_rr: return trtp_rtcp_report_rr_get_size((const trtp_rtcp_report_rr_t*)self); + case trtp_rtcp_packet_type_sr: return trtp_rtcp_report_sr_get_size((const trtp_rtcp_report_sr_t*)self); + case trtp_rtcp_packet_type_sdes: return trtp_rtcp_report_sdes_get_size((const trtp_rtcp_report_sdes_t*)self); + case trtp_rtcp_packet_type_bye: return trtp_rtcp_report_bye_get_size((const trtp_rtcp_report_bye_t*)self); + case trtp_rtcp_packet_type_rtpfb: return trtp_rtcp_report_rtpfb_get_size((const trtp_rtcp_report_rtpfb_t*)self); + case trtp_rtcp_packet_type_psfb: return trtp_rtcp_report_psfb_get_size((const trtp_rtcp_report_psfb_t*)self); + default: + { + TSK_DEBUG_ERROR("%d not recognized as valid RTCP packet type", (int)self->header->type); + return self->header->length_in_bytes; + } } } diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_rblock.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_rblock.c index c9b69ffb..759e831f 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_rblock.c +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_rblock.c @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -24,8 +24,6 @@ #include "tnet_endianness.h" #include "tsk_debug.h" -#define TRTP_RTCP_RBLOCK_SIZE 24 - /* 6.4.1 SR: Sender Report RTCP Packet +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ @@ -42,65 +40,6 @@ block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | delay since last SR (DLSR) | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ */ -trtp_rtcp_rblock_t* trtp_rtcp_rblock_create_null() -{ - return tsk_object_new(trtp_rtcp_rblock_def_t); -} - -trtp_rtcp_rblock_t* trtp_rtcp_rblock_deserialize(const void* data, tsk_size_t size) -{ - trtp_rtcp_rblock_t* block = tsk_null; - if(!data || !size){ - TSK_DEBUG_ERROR("Invalid parameter"); - return tsk_null; - } - if((block = trtp_rtcp_rblock_create_null())){ - if(trtp_rtcp_rblock_deserialize_payload(block, data, size)){ - TSK_DEBUG_ERROR("Failed to deserialize the payload"); - TSK_OBJECT_SAFE_FREE(block); - } - } - else{ - TSK_DEBUG_ERROR("Failed to create report block object"); - } - - return block; -} - -int trtp_rtcp_rblock_deserialize_payload(trtp_rtcp_rblock_t* self, const void* payload, tsk_size_t size) -{ - const uint8_t* pdata = (const uint8_t*)payload; - if(!self || !payload || !size){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - if(size < TRTP_RTCP_RBLOCK_SIZE){ - TSK_DEBUG_ERROR("%u is too short", size); - return -2; - } - self->ssrc = tnet_ntohl_2(pdata); - self->fraction = pdata[4]; - self->cumulative_no_lost = tnet_ntohl_2(&pdata[5]); - self->last_seq = tnet_ntohl_2(&pdata[8]); - self->jitter = tnet_ntohl_2(&pdata[12]); - self->lsr = tnet_ntohl_2(&pdata[16]); - self->dlsr = tnet_ntohl_2(&pdata[18]); - - return 0; -} - -tsk_size_t trtp_rtcp_rblock_get_size(trtp_rtcp_rblock_t* self) -{ - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return 0; - } - return TRTP_RTCP_RBLOCK_SIZE; -} - -// -// Object definition -// static tsk_object_t* trtp_rtcp_rblock_ctor(tsk_object_t * self, va_list * app) { trtp_rtcp_rblock_t *block = self; @@ -124,3 +63,91 @@ static const tsk_object_def_t trtp_rtcp_rblock_def_s = tsk_null, }; const tsk_object_def_t *trtp_rtcp_rblock_def_t = &trtp_rtcp_rblock_def_s; + +trtp_rtcp_rblock_t* trtp_rtcp_rblock_create_null() +{ + return tsk_object_new(trtp_rtcp_rblock_def_t); +} + +trtp_rtcp_rblock_t* trtp_rtcp_rblock_deserialize(const void* data, tsk_size_t size) +{ + trtp_rtcp_rblock_t* rblock = tsk_null; + const uint8_t* pdata = (const uint8_t*)data; + if(!data || size < TRTP_RTCP_RBLOCK_SIZE){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + if((rblock = trtp_rtcp_rblock_create_null())){ + rblock->ssrc = tnet_ntohl_2(pdata); + rblock->fraction = pdata[4]; + rblock->cumulative_no_lost = (tnet_ntohl_2(&pdata[5]) >> 8) & 0xFFFFFF; + rblock->last_seq = tnet_ntohl_2(&pdata[8]); + rblock->jitter = tnet_ntohl_2(&pdata[12]); + rblock->lsr = tnet_ntohl_2(&pdata[16]); + rblock->dlsr = tnet_ntohl_2(&pdata[18]); + } + else{ + TSK_DEBUG_ERROR("Failed to create report block object"); + } + + return rblock; +} + +// Up to the +int trtp_rtcp_rblock_deserialize_list(const void* data, tsk_size_t _size, trtp_rtcp_rblocks_L_t* dest_list) +{ + int32_t size = _size; + const uint8_t* pdata = (const uint8_t*)data; + trtp_rtcp_rblock_t* rblock; + + if(!data || !size || !dest_list){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + while(size >= TRTP_RTCP_RBLOCK_SIZE){ + if((rblock = trtp_rtcp_rblock_deserialize(pdata, size))){ + tsk_list_push_back_data(dest_list, (void**)&rblock); + } + if((size -= TRTP_RTCP_RBLOCK_SIZE) > 0){ + pdata += TRTP_RTCP_RBLOCK_SIZE; + } + } + return 0; +} + +int trtp_rtcp_rblock_serialize_to(const trtp_rtcp_rblock_t* self, void* data, tsk_size_t size) +{ + uint8_t* pdata = (uint8_t*)data; + if(!self || !data || size < TRTP_RTCP_RBLOCK_SIZE){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + pdata[0] = self->ssrc >> 24; + pdata[1] = (self->ssrc >> 16) & 0xFF; + pdata[2] = (self->ssrc >> 8) & 0xFF; + pdata[3] = (self->ssrc & 0xFF); + pdata[4] = self->fraction; + pdata[5] = (self->cumulative_no_lost >> 16) & 0xFF; + pdata[6] = (self->cumulative_no_lost >> 8) & 0xFF; + pdata[7] = (self->cumulative_no_lost & 0xFF); + pdata[8] = self->last_seq >> 24; + pdata[9] = (self->last_seq >> 16) & 0xFF; + pdata[10] = (self->last_seq >> 8) & 0xFF; + pdata[11] = (self->last_seq & 0xFF); + pdata[12] = self->jitter >> 24; + pdata[13] = (self->jitter >> 16) & 0xFF; + pdata[14] = (self->jitter >> 8) & 0xFF; + pdata[15] = (self->jitter & 0xFF); + pdata[16] = self->lsr >> 24; + pdata[17] = (self->lsr >> 16) & 0xFF; + pdata[18] = (self->lsr >> 8) & 0xFF; + pdata[19] = (self->lsr & 0xFF); + pdata[20] = self->dlsr >> 24; + pdata[21] = (self->dlsr >> 16) & 0xFF; + pdata[22] = (self->dlsr >> 8) & 0xFF; + pdata[23] = (self->dlsr & 0xFF); + + return 0; +} \ No newline at end of file diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report.c index afa946f1..794cc3a8 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report.c +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report.c @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_bye.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_bye.c new file mode 100644 index 00000000..20f88d94 --- /dev/null +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_bye.c @@ -0,0 +1,225 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#include "tinyrtp/rtcp/trtp_rtcp_report_bye.h" +#include "tinyrtp/rtcp/trtp_rtcp_header.h" + +#include "tnet_endianness.h" + +#include "tsk_memory.h" +#include "tsk_debug.h" + +#define TRTP_RTCP_PACKET_BYE_MIN_SIZE (TRTP_RTCP_HEADER_SIZE + 0/* could have zero ssrc */) + +static tsk_object_t* trtp_rtcp_report_bye_ctor(tsk_object_t * self, va_list * app) +{ + trtp_rtcp_report_bye_t *bye = self; + if(bye){ + bye->packets = tsk_list_create(); + } + return self; +} + +static tsk_object_t* trtp_rtcp_report_bye_dtor(tsk_object_t * self) +{ + trtp_rtcp_report_bye_t *bye = self; + if(bye){ + // deinit self + TSK_OBJECT_SAFE_FREE(bye->packets); + TSK_FREE(bye->ssrc_list); + // deinit base + trtp_rtcp_packet_deinit(TRTP_RTCP_PACKET(bye)); + } + + return self; +} + +static const tsk_object_def_t trtp_rtcp_report_bye_def_s = +{ + sizeof(trtp_rtcp_report_bye_t), + trtp_rtcp_report_bye_ctor, + trtp_rtcp_report_bye_dtor, + tsk_null, +}; +const tsk_object_def_t *trtp_rtcp_report_bye_def_t = &trtp_rtcp_report_bye_def_s; + +trtp_rtcp_report_bye_t* trtp_rtcp_report_bye_create_null() +{ + trtp_rtcp_report_bye_t* bye; + if((bye = (trtp_rtcp_report_bye_t*)tsk_object_new(trtp_rtcp_report_bye_def_t))){ + trtp_rtcp_packet_init(TRTP_RTCP_PACKET(bye), TRTP_RTCP_HEADER_VERSION_DEFAULT, 0, 0, trtp_rtcp_packet_type_bye, TRTP_RTCP_HEADER_SIZE); + } + return bye; +} + +trtp_rtcp_report_bye_t* trtp_rtcp_report_bye_create(struct trtp_rtcp_header_s* header) +{ + trtp_rtcp_report_bye_t* bye; + if((bye = (trtp_rtcp_report_bye_t*)tsk_object_new(trtp_rtcp_report_bye_def_t))){ + TRTP_RTCP_PACKET(bye)->header = tsk_object_ref(header); + } + return bye; +} + +trtp_rtcp_report_bye_t* trtp_rtcp_report_bye_create_2(uint32_t ssrc) +{ + uint32_t* ssrc_list = tsk_malloc(sizeof(uint32_t)); + if(ssrc_list){ + trtp_rtcp_report_bye_t* bye; + if((bye = (trtp_rtcp_report_bye_t*)tsk_object_new(trtp_rtcp_report_bye_def_t))){ + trtp_rtcp_packet_init(TRTP_RTCP_PACKET(bye), TRTP_RTCP_HEADER_VERSION_DEFAULT, 0, 0, trtp_rtcp_packet_type_bye, (TRTP_RTCP_HEADER_SIZE + 4)); + TRTP_RTCP_PACKET(bye)->header->rc = 1; + *ssrc_list = ssrc, bye->ssrc_list = ssrc_list, ssrc_list = tsk_null; + } + TSK_FREE(ssrc_list); + return bye; + } + return tsk_null; +} + +trtp_rtcp_report_bye_t* trtp_rtcp_report_bye_deserialize(const void* data, tsk_size_t _size) +{ + trtp_rtcp_report_bye_t* bye = tsk_null; + trtp_rtcp_header_t* header = tsk_null; + const uint8_t* pdata = (const uint8_t*)data; + int32_t size = _size; + + if(!data || size < TRTP_RTCP_PACKET_BYE_MIN_SIZE){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + if(!(header = trtp_rtcp_header_deserialize(pdata, size))){ + TSK_DEBUG_ERROR("Failed to deserialize the header"); + goto bail; + } + if(header->length_in_bytes < TRTP_RTCP_PACKET_BYE_MIN_SIZE){ + TSK_DEBUG_ERROR("Too short"); + goto bail; + } + + if(!(bye = trtp_rtcp_report_bye_create(header))){ + TSK_DEBUG_ERROR("Failed to create object"); + goto bail; + } + + pdata += (TRTP_RTCP_HEADER_SIZE); + size -= (TRTP_RTCP_HEADER_SIZE); + + // SSRCs + if(header->rc > 0){ + tsk_size_t i; + if((int32_t)(header->rc * sizeof(uint32_t)) > size){ + TSK_DEBUG_ERROR("Too short"); + goto bail; + } + if(!(bye->ssrc_list = tsk_calloc(header->rc, sizeof(uint32_t)))){ + goto bail; + } + for(i = 0; i < header->rc; ++i){ + bye->ssrc_list[i] = tnet_ntohl_2(&pdata[0]); + pdata += sizeof(uint32_t); + size -= sizeof(uint32_t); + } + } + + // Other Packets + while(size > TRTP_RTCP_HEADER_SIZE){ + trtp_rtcp_packet_t* packet; + + if((packet = trtp_rtcp_packet_deserialize(pdata, size))){ + if((size -= packet->header->length_in_bytes) > 0){ + pdata += packet->header->length_in_bytes; + } + tsk_list_push_back_data(bye->packets, (void**)&packet); + continue; + } + break; + } + +bail: + TSK_OBJECT_SAFE_FREE(header); + return bye; +} + +int trtp_rtcp_report_bye_serialize_to(const trtp_rtcp_report_bye_t* self, void* data, tsk_size_t size) +{ + int ret; + tsk_size_t i; + uint8_t* pdata = (uint8_t*)data; + const tsk_list_item_t* item; + + if(!self || !data || size < trtp_rtcp_report_bye_get_size(self)){ + return -1; + } + + if((ret = trtp_rtcp_header_serialize_to(TRTP_RTCP_PACKET(self)->header, pdata, size))){ + TSK_DEBUG_ERROR("Failed to serialize the header"); + return ret; + } + + pdata += (TRTP_RTCP_HEADER_SIZE); + size -= (TRTP_RTCP_HEADER_SIZE); + + for(i = 0; i < TRTP_RTCP_PACKET(self)->header->rc; ++i){ + pdata[0] = self->ssrc_list[i] >> 24; + pdata[1] = (self->ssrc_list[i] >> 16) & 0xFF; + pdata[2] = (self->ssrc_list[i] >> 8) & 0xFF; + pdata[3] = (self->ssrc_list[i] & 0xFF); + pdata += 4; + size -= 4; + } + + tsk_list_foreach(item, self->packets){ + if(!item->data){ + continue; + } + if((ret = trtp_rtcp_packet_serialize_to(TRTP_RTCP_PACKET(item->data), pdata, size))){ + TSK_DEBUG_ERROR("Failed to serialize packet"); + goto bail; + } + pdata += TRTP_RTCP_PACKET(item->data)->header->length_in_bytes; + size -= TRTP_RTCP_PACKET(item->data)->header->length_in_bytes; + } + +bail: + return ret; +} + +tsk_size_t trtp_rtcp_report_bye_get_size(const trtp_rtcp_report_bye_t* self) +{ + tsk_size_t size; + const tsk_list_item_t* item; + + if(!self || !TRTP_RTCP_PACKET(self)->header){ + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + + size = TRTP_RTCP_PACKET(self)->header->length_in_bytes; + tsk_list_foreach(item, self->packets){ + if(item->data && TRTP_RTCP_PACKET(item->data)->header){ + size += TRTP_RTCP_PACKET(item->data)->header->length_in_bytes; + } + } + + return size; +} diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_fb.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_fb.c new file mode 100644 index 00000000..caedfacd --- /dev/null +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_fb.c @@ -0,0 +1,555 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WArtpfbANTY; without even the implied wartpfbanty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#include "tinyrtp/rtcp/trtp_rtcp_report_fb.h" +#include "tinyrtp/rtcp/trtp_rtcp_header.h" + +#include "tnet_endianness.h" + +#include "tsk_memory.h" +#include "tsk_debug.h" + +#define TRTP_RTCP_PACKET_FB_MIN_SIZE (TRTP_RTCP_HEADER_SIZE + 4 + 4) + +static int _trtp_rtcp_report_fb_deserialize(const void* data, tsk_size_t _size, trtp_rtcp_header_t** header, uint32_t* ssrc_sender, uint32_t* ssrc_media_src) +{ + const uint8_t* pdata = data; + if(!data || !header || _size < TRTP_RTCP_PACKET_FB_MIN_SIZE || (_size & 0x03)){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if(!(*header = trtp_rtcp_header_deserialize(pdata, _size))){ + TSK_DEBUG_ERROR("Failed to deserialize the header"); + return -3; + } + if((*header)->length_in_bytes < TRTP_RTCP_PACKET_FB_MIN_SIZE){ + TSK_DEBUG_ERROR("Too short"); + return -4; + } + else if((*header)->length_in_bytes > _size){ + TSK_DEBUG_ERROR("Too long"); + return -5; + } + + *ssrc_sender = tnet_ntohl_2(&pdata[4]); + *ssrc_media_src = tnet_ntohl_2(&pdata[8]); + return 0; +} + + +static int _trtp_rtcp_report_fb_serialize_to(const trtp_rtcp_report_fb_t* self, void* data, tsk_size_t size) +{ + int ret; + uint8_t* pdata = (uint8_t*)data; + + if(!self || !data || size < TRTP_RTCP_PACKET_FB_MIN_SIZE){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + if((ret = trtp_rtcp_header_serialize_to(TRTP_RTCP_PACKET(self)->header, pdata, size))){ + TSK_DEBUG_ERROR("Failed to serialize the header"); + return ret; + } + + pdata[TRTP_RTCP_HEADER_SIZE] = self->ssrc_sender >> 24; + pdata[TRTP_RTCP_HEADER_SIZE + 1] = (self->ssrc_sender >> 16) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 2] = (self->ssrc_sender >> 8) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 3] = (self->ssrc_sender & 0xFF); + pdata[TRTP_RTCP_HEADER_SIZE + 4] = self->ssrc_media_src >> 24; + pdata[TRTP_RTCP_HEADER_SIZE + 5] = (self->ssrc_media_src >> 16) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 6] = (self->ssrc_media_src >> 8) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 7] = (self->ssrc_media_src & 0xFF); + + return 0; +} + + + +static tsk_object_t* trtp_rtcp_report_rtpfb_ctor(tsk_object_t * self, va_list * app) +{ + trtp_rtcp_report_rtpfb_t *rtpfb = self; + if(rtpfb){ + + } + return self; +} +static tsk_object_t* trtp_rtcp_report_rtpfb_dtor(tsk_object_t * self) +{ + trtp_rtcp_report_rtpfb_t *rtpfb = self; + if(rtpfb){ + // deinit self + switch(rtpfb->fci_type){ + case trtp_rtcp_rtpfb_fci_type_nack: + { + TSK_FREE(rtpfb->nack.pid); + TSK_FREE(rtpfb->nack.blp); + break; + } + case trtp_rtcp_rtpfb_fci_type_tmmbn: + { + TSK_FREE(rtpfb->tmmbn.ssrc); + TSK_FREE(rtpfb->tmmbn.MxTBR_Exp); + TSK_FREE(rtpfb->tmmbn.MxTBR_Mantissa); + TSK_FREE(rtpfb->tmmbn.MeasuredOverhead); + break; + } + } + // deinit base + trtp_rtcp_packet_deinit(TRTP_RTCP_PACKET(rtpfb)); + } + + return self; +} +static const tsk_object_def_t trtp_rtcp_report_rtpfb_def_s = +{ + sizeof(trtp_rtcp_report_rtpfb_t), + trtp_rtcp_report_rtpfb_ctor, + trtp_rtcp_report_rtpfb_dtor, + tsk_null, +}; +const tsk_object_def_t *trtp_rtcp_report_rtpfb_def_t = &trtp_rtcp_report_rtpfb_def_s; + +trtp_rtcp_report_rtpfb_t* trtp_rtcp_report_rtpfb_create_null() +{ + trtp_rtcp_report_rtpfb_t* rtpfb; + if((rtpfb = (trtp_rtcp_report_rtpfb_t*)tsk_object_new(trtp_rtcp_report_rtpfb_def_t))){ + trtp_rtcp_packet_init(TRTP_RTCP_PACKET(rtpfb), TRTP_RTCP_HEADER_VERSION_DEFAULT, 0, 0, trtp_rtcp_packet_type_rtpfb, TRTP_RTCP_PACKET_FB_MIN_SIZE); + } + return rtpfb; +} + +trtp_rtcp_report_rtpfb_t* trtp_rtcp_report_rtpfb_create(trtp_rtcp_header_t* header) +{ + trtp_rtcp_report_rtpfb_t* rtpfb; + if((rtpfb = (trtp_rtcp_report_rtpfb_t*)tsk_object_new(trtp_rtcp_report_rtpfb_def_t))){ + TRTP_RTCP_PACKET(rtpfb)->header = tsk_object_ref(header); + } + return rtpfb; +} + +trtp_rtcp_report_rtpfb_t* trtp_rtcp_report_rtpfb_create_2(trtp_rtcp_rtpfb_fci_type_t fci_type, uint32_t ssrc_sender, uint32_t ssrc_media_src) +{ + trtp_rtcp_report_rtpfb_t* rtpfb; + if((rtpfb = trtp_rtcp_report_rtpfb_create_null())){ + rtpfb->fci_type = TRTP_RTCP_PACKET(rtpfb)->header->rc = fci_type; + TRTP_RTCP_REPORT_FB(rtpfb)->ssrc_sender = ssrc_sender; + TRTP_RTCP_REPORT_FB(rtpfb)->ssrc_media_src = ssrc_media_src; + } + return rtpfb; +} + +// seq_nums[n] must be in [seq_nums[0], seq_nums[0] + 16] and > seq_nums[n - 1] +trtp_rtcp_report_rtpfb_t* trtp_rtcp_report_rtpfb_create_nack(uint32_t ssrc_sender, uint32_t ssrc_media_src, const uint16_t* seq_nums, tsk_size_t count) +{ + trtp_rtcp_report_rtpfb_t* rtpfb; + if(!seq_nums || !count){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + if((rtpfb = trtp_rtcp_report_rtpfb_create_2(trtp_rtcp_rtpfb_fci_type_nack, ssrc_sender, ssrc_media_src))){ + tsk_size_t i, j; + rtpfb->nack.count = 1; // max = 16 + rtpfb->nack.blp = tsk_malloc(sizeof(uint16_t)); + rtpfb->nack.pid = tsk_malloc(sizeof(uint16_t)); + if(!rtpfb->nack.blp || !rtpfb->nack.pid){ + TSK_OBJECT_SAFE_FREE(rtpfb); + return tsk_null; + } + rtpfb->nack.pid[0] = seq_nums[0]; + rtpfb->nack.blp[0] = 0; + for(i = 1; i <= 16 && i < count; ++i){ + j = seq_nums[i] - rtpfb->nack.pid[0]; + rtpfb->nack.blp[0] |= (1 << (16 - j - 1)); + } + + TRTP_RTCP_PACKET(rtpfb)->header->length_in_bytes += (rtpfb->nack.count << 2); + TRTP_RTCP_PACKET(rtpfb)->header->length_in_words_minus1 = ((TRTP_RTCP_PACKET(rtpfb)->header->length_in_bytes >> 2) - 1); + } + return rtpfb; +} + + +trtp_rtcp_report_rtpfb_t* trtp_rtcp_report_rtpfb_deserialize(const void* data, tsk_size_t _size) +{ + trtp_rtcp_report_rtpfb_t* rtpfb = tsk_null; + trtp_rtcp_header_t* header = tsk_null; + uint32_t ssrc_sender, ssrc_media_src; + + if(_trtp_rtcp_report_fb_deserialize(data, _size, &header, &ssrc_sender, &ssrc_media_src) == 0){ + if((rtpfb = trtp_rtcp_report_rtpfb_create(header))){ + const uint8_t* pdata = ((const uint8_t*)data) + TRTP_RTCP_PACKET_FB_MIN_SIZE; + tsk_size_t size = (header->length_in_bytes - TRTP_RTCP_PACKET_FB_MIN_SIZE), i; + + TRTP_RTCP_REPORT_FB(rtpfb)->ssrc_sender = ssrc_sender; + TRTP_RTCP_REPORT_FB(rtpfb)->ssrc_media_src = ssrc_media_src; + + switch(rtpfb->fci_type = (trtp_rtcp_rtpfb_fci_type_t)header->rc){ + case trtp_rtcp_rtpfb_fci_type_nack: + { + if((rtpfb->nack.count = (size >> 2)) > 0){ + rtpfb->nack.pid = tsk_realloc(rtpfb->nack.pid, (rtpfb->nack.count * sizeof(uint16_t))); + rtpfb->nack.blp = tsk_realloc(rtpfb->nack.blp, (rtpfb->nack.count * sizeof(uint16_t))); + for(i = 0; i < rtpfb->nack.count; ++i){ + if(rtpfb->nack.pid) rtpfb->nack.pid[i] = tnet_ntohs_2(&pdata[0]); + if(rtpfb->nack.blp) rtpfb->nack.blp[i] = tnet_ntohs_2(&pdata[2]); + pdata += 4; + } + } + break; + } + case trtp_rtcp_rtpfb_fci_type_tmmbn: + { + TSK_DEBUG_INFO("TMMBN"); + if((rtpfb->tmmbn.count = (size >> 3)) > 0){ + uint32_t u32; + rtpfb->tmmbn.ssrc = tsk_realloc(rtpfb->tmmbn.ssrc, (rtpfb->tmmbn.count * sizeof(uint32_t))); + rtpfb->tmmbn.MxTBR_Exp = tsk_realloc(rtpfb->tmmbn.MxTBR_Exp, (rtpfb->tmmbn.count * sizeof(uint16_t))); + rtpfb->tmmbn.MxTBR_Mantissa = tsk_realloc(rtpfb->tmmbn.MxTBR_Mantissa, (rtpfb->tmmbn.count * sizeof(uint32_t))); + rtpfb->tmmbn.MeasuredOverhead = tsk_realloc(rtpfb->tmmbn.MeasuredOverhead, (rtpfb->tmmbn.count * sizeof(uint16_t))); + for(i = 0; i < rtpfb->tmmbn.count; ++i){ + if(rtpfb->tmmbn.ssrc) rtpfb->tmmbn.ssrc[i] = tnet_ntohl_2(&pdata[0]); + u32 = tnet_ntohl_2(&pdata[4]); + if(rtpfb->tmmbn.MxTBR_Exp) rtpfb->tmmbn.MxTBR_Exp[i] = (u32 >> 26); + if(rtpfb->tmmbn.MxTBR_Mantissa) rtpfb->tmmbn.MxTBR_Mantissa[i] = ((u32 >> 9) & 0x1FFFF); + if(rtpfb->tmmbn.MeasuredOverhead) rtpfb->tmmbn.MeasuredOverhead[i] = (u32 & 0x1FF); + pdata += 8; + } + } + break; + } + + default: + { + TSK_DEBUG_ERROR("Unsupported Feedback message type %d", (int)rtpfb->fci_type); + break; + } + } + } + } + + TSK_OBJECT_SAFE_FREE(header); + return rtpfb; +} + +int trtp_rtcp_report_rtpfb_serialize_to(const trtp_rtcp_report_rtpfb_t* self, void* data, tsk_size_t size) +{ + int ret; + uint8_t* pdata = (uint8_t*)data; + + if(!self || !data || size < trtp_rtcp_report_rtpfb_get_size(self)){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + if((ret = _trtp_rtcp_report_fb_serialize_to(TRTP_RTCP_REPORT_FB(self), pdata, size))){ + TSK_DEBUG_ERROR("Failed to serialize FB message"); + return ret; + } + pdata += TRTP_RTCP_PACKET_FB_MIN_SIZE; + size -= TRTP_RTCP_PACKET_FB_MIN_SIZE; + + switch(self->fci_type){ + case trtp_rtcp_rtpfb_fci_type_nack: + { + tsk_size_t i; + for(i = 0; i < self->nack.count; ++i){ + pdata[0] = self->nack.pid[i] >> 8; + pdata[1] = (self->nack.pid[i] & 0xFF); + pdata[2] = self->nack.blp[i] >> 8; + pdata[3] = (self->nack.blp[i] & 0xFF); + pdata += 4; + } + break; + } + default: + { + TSK_DEBUG_ERROR("Not implemented"); + return -2; + } + } + return 0; +} + +tsk_size_t trtp_rtcp_report_rtpfb_get_size(const trtp_rtcp_report_rtpfb_t* self) +{ + if(!self || !TRTP_RTCP_PACKET(self)->header){ + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + return TRTP_RTCP_PACKET(self)->header->length_in_bytes; +} + + + + + + + + + +static tsk_object_t* trtp_rtcp_report_psfb_ctor(tsk_object_t * self, va_list * app) +{ + trtp_rtcp_report_psfb_t *psfb = self; + if(psfb){ + + } + return self; +} +static tsk_object_t* trtp_rtcp_report_psfb_dtor(tsk_object_t * self) +{ + trtp_rtcp_report_psfb_t *psfb = self; + if(psfb){ + // deinit self + switch(psfb->fci_type){ + case trtp_rtcp_psfb_fci_type_pli: + break; + case trtp_rtcp_psfb_fci_type_sli: + TSK_FREE(psfb->sli.first); + TSK_FREE(psfb->sli.number); + TSK_FREE(psfb->sli.pic_id); + break; + case trtp_rtcp_psfb_fci_type_rpsi: + TSK_FREE(psfb->rpsi.bytes); + break; + case trtp_rtcp_psfb_fci_type_fir: + TSK_FREE(psfb->fir.ssrc); + TSK_FREE(psfb->fir.seq_num); + break; + case trtp_rtcp_psfb_fci_type_afb: + TSK_FREE(psfb->afb.bytes); + break; + } + // deinit base + trtp_rtcp_packet_deinit(TRTP_RTCP_PACKET(psfb)); + } + + return self; +} +static const tsk_object_def_t trtp_rtcp_report_psfb_def_s = +{ + sizeof(trtp_rtcp_report_psfb_t), + trtp_rtcp_report_psfb_ctor, + trtp_rtcp_report_psfb_dtor, + tsk_null, +}; +const tsk_object_def_t *trtp_rtcp_report_psfb_def_t = &trtp_rtcp_report_psfb_def_s; + + +trtp_rtcp_report_psfb_t* trtp_rtcp_report_psfb_create_null() +{ + trtp_rtcp_report_psfb_t* psfb; + if((psfb = (trtp_rtcp_report_psfb_t*)tsk_object_new(trtp_rtcp_report_psfb_def_t))){ + trtp_rtcp_packet_init(TRTP_RTCP_PACKET(psfb), TRTP_RTCP_HEADER_VERSION_DEFAULT, 0, 0, trtp_rtcp_packet_type_psfb, TRTP_RTCP_PACKET_FB_MIN_SIZE); + } + return psfb; +} + +trtp_rtcp_report_psfb_t* trtp_rtcp_report_psfb_create(trtp_rtcp_header_t* header) +{ + trtp_rtcp_report_psfb_t* psfb; + if((psfb = (trtp_rtcp_report_psfb_t*)tsk_object_new(trtp_rtcp_report_psfb_def_t))){ + TRTP_RTCP_PACKET(psfb)->header = tsk_object_ref(header); + } + return psfb; +} + +trtp_rtcp_report_psfb_t* trtp_rtcp_report_psfb_create_2(trtp_rtcp_psfb_fci_type_t fci_type, uint32_t ssrc_sender, uint32_t ssrc_media_src) +{ + trtp_rtcp_report_psfb_t* psfb; + if((psfb = trtp_rtcp_report_psfb_create_null())){ + TRTP_RTCP_PACKET(psfb)->header->rc = psfb->fci_type = fci_type; + TRTP_RTCP_REPORT_FB(psfb)->ssrc_sender = ssrc_sender; + TRTP_RTCP_REPORT_FB(psfb)->ssrc_media_src = ssrc_media_src; + } + return psfb; +} + +trtp_rtcp_report_psfb_t* trtp_rtcp_report_psfb_create_pli(uint32_t ssrc_sender, uint32_t ssrc_media_src) +{ + return trtp_rtcp_report_psfb_create_2(trtp_rtcp_psfb_fci_type_pli, ssrc_sender, ssrc_media_src); +} + +trtp_rtcp_report_psfb_t* trtp_rtcp_report_psfb_create_fir(uint8_t seq_num, uint32_t ssrc_sender, uint32_t ssrc_media_src) +{ + trtp_rtcp_report_psfb_t* psfb; + if((psfb = trtp_rtcp_report_psfb_create_2(trtp_rtcp_psfb_fci_type_fir, ssrc_sender, ssrc_media_src))){ + psfb->fir.ssrc = tsk_malloc(sizeof(uint32_t)); + psfb->fir.seq_num = tsk_malloc(sizeof(uint8_t)); + if(!psfb->fir.ssrc || !psfb->fir.seq_num){ + TSK_OBJECT_SAFE_FREE(psfb); + return tsk_null; + } + psfb->fir.count = 1; + psfb->fir.seq_num[0] = seq_num; + psfb->fir.ssrc[0] = ssrc_media_src; + TRTP_RTCP_PACKET(psfb)->header->length_in_bytes += (psfb->fir.count << 3); + TRTP_RTCP_PACKET(psfb)->header->length_in_words_minus1 = ((TRTP_RTCP_PACKET(psfb)->header->length_in_bytes >> 2) - 1); + } + return psfb; +} + +trtp_rtcp_report_psfb_t* trtp_rtcp_report_psfb_deserialize(const void* data, tsk_size_t _size) +{ + trtp_rtcp_report_psfb_t* psfb = tsk_null; + trtp_rtcp_header_t* header = tsk_null; + uint32_t ssrc_sender, ssrc_media_src; + + if(_trtp_rtcp_report_fb_deserialize(data, _size, &header, &ssrc_sender, &ssrc_media_src) == 0){ + if((psfb = trtp_rtcp_report_psfb_create(header))){ + const uint8_t* pdata = ((const uint8_t*)data) + TRTP_RTCP_PACKET_FB_MIN_SIZE; + tsk_size_t size = (header->length_in_bytes - TRTP_RTCP_PACKET_FB_MIN_SIZE); + + TRTP_RTCP_REPORT_FB(psfb)->ssrc_sender = ssrc_sender; + TRTP_RTCP_REPORT_FB(psfb)->ssrc_media_src = ssrc_media_src; + + switch((psfb->fci_type = header->rc)/* FMT for RTCP-FB messages */){ + case trtp_rtcp_psfb_fci_type_pli: + { + // No FCI in PLI + // TSK_DEBUG_INFO("PLI"); + break; + } + case trtp_rtcp_psfb_fci_type_sli: + { + tsk_size_t sli_count = (size >> 2), i; + uint32_t u32; + if(sli_count == 0){ + TSK_DEBUG_ERROR("Too short"); + goto bail; + } + psfb->sli.first = tsk_realloc(psfb->sli.first, (sli_count * sizeof(uint16_t))); + psfb->sli.number = tsk_realloc(psfb->sli.number, (sli_count * sizeof(uint16_t))); + psfb->sli.pic_id = tsk_realloc(psfb->sli.pic_id, (sli_count * sizeof(uint16_t))); + for(i = 0; i < sli_count; ++i){ + u32 = tnet_ntohl_2(&pdata[i >> 2]); + if(psfb->sli.first) psfb->sli.first[i] = (u32 >> 19); + if(psfb->sli.number) psfb->sli.number[i] = (u32 >> 6) & 0x1FFF; + if(psfb->sli.pic_id) psfb->sli.pic_id[i] = u32 & 0x3F; + } + + break; + } + case trtp_rtcp_psfb_fci_type_rpsi: + { + uint16_t u16; + if(size < 2){ + TSK_DEBUG_ERROR("Too short"); + goto bail; + } + u16 = tnet_ntohs_2(&pdata[0]); + psfb->rpsi.pb = (u16 >> 8); + psfb->rpsi.pt = (u16 & 0x7F); + if((psfb->rpsi.bytes = tsk_calloc((size - 2), sizeof(uint8_t)))){ + memcpy(psfb->rpsi.bytes, &pdata[2], (size - 2)); + } + break; + } + case trtp_rtcp_psfb_fci_type_fir: + { + tsk_size_t fir_count = (size >> 3), i; + if(fir_count == 0){ + TSK_DEBUG_ERROR("Too short"); + goto bail; + } + psfb->fir.count = fir_count; + psfb->fir.ssrc = tsk_realloc(psfb->fir.seq_num, (fir_count * sizeof(uint32_t))); + psfb->fir.seq_num = tsk_realloc(psfb->fir.seq_num, (fir_count * sizeof(uint8_t))); + for(i = 0; i < fir_count; ++i){ + if(psfb->fir.ssrc) psfb->fir.ssrc[i] = tnet_ntohl_2(&pdata[0]); + if(psfb->fir.seq_num) psfb->fir.seq_num[i] = pdata[4]; + pdata+=8; + } + break; + } + case trtp_rtcp_psfb_fci_type_afb: + { + if(size > 0 && (psfb->afb.bytes = tsk_calloc(size, sizeof(uint8_t)))){ + memcpy(psfb->afb.bytes, &pdata[0], size); + } + break; + } + default: + { + TSK_DEBUG_ERROR("%d not a valid FCI", psfb->fci_type); + goto bail; + } + } + } + } + +bail: + TSK_OBJECT_SAFE_FREE(header); + return psfb; +} + +int trtp_rtcp_report_psfb_serialize_to(const trtp_rtcp_report_psfb_t* self, void* data, tsk_size_t size) +{ + int ret; + uint8_t* pdata = (uint8_t*)data; + + if(!self || !data || size < trtp_rtcp_report_psfb_get_size(self)){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + if((ret = _trtp_rtcp_report_fb_serialize_to(TRTP_RTCP_REPORT_FB(self), pdata, size))){ + TSK_DEBUG_ERROR("Failed to serialize FB message"); + return ret; + } + pdata += TRTP_RTCP_PACKET_FB_MIN_SIZE; + size -= TRTP_RTCP_PACKET_FB_MIN_SIZE; + + switch(self->fci_type){ + case trtp_rtcp_psfb_fci_type_pli: + { + // No FCI in PLI + break; + } + case trtp_rtcp_psfb_fci_type_fir: + { + tsk_size_t i; + for(i = 0; i < self->fir.count; ++i){ + pdata[0] = self->fir.ssrc[i] >> 24; + pdata[1] = (self->fir.ssrc[i] >> 16) & 0xFF; + pdata[2] = (self->fir.ssrc[i] >> 8) & 0xFF; + pdata[3] = (self->fir.ssrc[i] & 0xFF); + pdata[4] = self->fir.seq_num[i]; + pdata += 8; // SSRC (4), Seq nr(1), Reserved(3) + } + break; + } + default: + { + TSK_DEBUG_ERROR("Not implemented yet"); + return -1; + } + } + + return ret; +} + +tsk_size_t trtp_rtcp_report_psfb_get_size(const trtp_rtcp_report_psfb_t* self) +{ + if(!self || !TRTP_RTCP_PACKET(self)->header){ + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + return TRTP_RTCP_PACKET(self)->header->length_in_bytes; +} \ No newline at end of file diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_rr.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_rr.c index afa946f1..f6b51bb6 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_rr.c +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_rr.c @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -18,4 +18,215 @@ * You should have received a copy of the GNU General Public License * along with DOUBANGO. * -*/ \ No newline at end of file +*/ +#include "tinyrtp/rtcp/trtp_rtcp_report_rr.h" +#include "tinyrtp/rtcp/trtp_rtcp_header.h" + +#include "tnet_endianness.h" + +#include "tsk_debug.h" + +#define TRTP_RTCP_PACKET_RR_MIN_SIZE (TRTP_RTCP_HEADER_SIZE + 4) + +static tsk_object_t* trtp_rtcp_report_rr_ctor(tsk_object_t * self, va_list * app) +{ + trtp_rtcp_report_rr_t *rr = self; + if(rr){ + rr->packets = tsk_list_create(); + rr->blocks = tsk_list_create(); + } + return self; +} +static tsk_object_t* trtp_rtcp_report_rr_dtor(tsk_object_t * self) +{ + trtp_rtcp_report_rr_t *rr = self; + if(rr){ + // deinit self + TSK_OBJECT_SAFE_FREE(rr->packets); + TSK_OBJECT_SAFE_FREE(rr->blocks); + // deinit base + trtp_rtcp_packet_deinit(TRTP_RTCP_PACKET(rr)); + } + + return self; +} +static const tsk_object_def_t trtp_rtcp_report_rr_def_s = +{ + sizeof(trtp_rtcp_report_rr_t), + trtp_rtcp_report_rr_ctor, + trtp_rtcp_report_rr_dtor, + tsk_null, +}; +const tsk_object_def_t *trtp_rtcp_report_rr_def_t = &trtp_rtcp_report_rr_def_s; + + +trtp_rtcp_report_rr_t* trtp_rtcp_report_rr_create_null() +{ + trtp_rtcp_report_rr_t* rr; + if((rr = (trtp_rtcp_report_rr_t*)tsk_object_new(trtp_rtcp_report_rr_def_t))){ + trtp_rtcp_packet_init(TRTP_RTCP_PACKET(rr), TRTP_RTCP_HEADER_VERSION_DEFAULT, 0, 0, trtp_rtcp_packet_type_rr, (TRTP_RTCP_HEADER_SIZE + 4)); + } + return rr; +} + +trtp_rtcp_report_rr_t* trtp_rtcp_report_rr_create(trtp_rtcp_header_t* header) +{ + trtp_rtcp_report_rr_t* rr; + if((rr = (trtp_rtcp_report_rr_t*)tsk_object_new(trtp_rtcp_report_rr_def_t))){ + TRTP_RTCP_PACKET(rr)->header = tsk_object_ref(header); + } + return rr; +} + +trtp_rtcp_report_rr_t* trtp_rtcp_report_rr_create_2(uint32_t ssrc) +{ + trtp_rtcp_report_rr_t* rr; + if((rr = trtp_rtcp_report_rr_create_null())){ + rr->ssrc = ssrc; + } + return rr; +} + +trtp_rtcp_report_rr_t* trtp_rtcp_report_rr_deserialize(const void* data, tsk_size_t _size) +{ + trtp_rtcp_report_rr_t* rr = tsk_null; + trtp_rtcp_header_t* header = tsk_null; + const uint8_t* pdata = (const uint8_t*)data; + int32_t size = _size; + + if(!data || size < TRTP_RTCP_PACKET_RR_MIN_SIZE){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + if(!(header = trtp_rtcp_header_deserialize(pdata, size))){ + TSK_DEBUG_ERROR("Failed to deserialize the header"); + goto bail; + } + if(header->length_in_bytes < TRTP_RTCP_PACKET_RR_MIN_SIZE){ + TSK_DEBUG_ERROR("Too short"); + goto bail; + } + + if(!(rr = trtp_rtcp_report_rr_create(header))){ + TSK_DEBUG_ERROR("Failed to create object"); + goto bail; + } + + rr->ssrc = tnet_ntohl_2(&pdata[4]); + + pdata += (TRTP_RTCP_HEADER_SIZE + 4); + size -= (TRTP_RTCP_HEADER_SIZE + 4); + + // Blocks + if(header->rc > 0){ + tsk_size_t i = 0; + trtp_rtcp_rblock_t* rblock; + + while(i++ < header->rc && size >= TRTP_RTCP_RBLOCK_SIZE){ + if((rblock = trtp_rtcp_rblock_deserialize(pdata, size))){ + tsk_list_push_back_data(rr->blocks, (void**)&rblock); + } + pdata += TRTP_RTCP_RBLOCK_SIZE; + size -= TRTP_RTCP_RBLOCK_SIZE; + } + } + + // Other Packets + while(size > TRTP_RTCP_HEADER_SIZE){ + trtp_rtcp_packet_t* packet; + + if((packet = trtp_rtcp_packet_deserialize(pdata, size))){ + if((size -= packet->header->length_in_bytes) > 0){ + pdata += packet->header->length_in_bytes; + } + tsk_list_push_back_data(rr->packets, (void**)&packet); + continue; + } + break; + } + +bail: + TSK_OBJECT_SAFE_FREE(header); + return rr; +} + +int trtp_rtcp_report_rr_serialize_to(const trtp_rtcp_report_rr_t* self, void* data, tsk_size_t size) +{ + int ret; + const tsk_list_item_t* item; + uint8_t* pdata = (uint8_t*)data; + + if(!self || !data || size < trtp_rtcp_report_rr_get_size(self)){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + if((ret = trtp_rtcp_header_serialize_to(TRTP_RTCP_PACKET(self)->header, pdata, size))){ + TSK_DEBUG_ERROR("Failed to serialize the header"); + return ret; + } + + pdata[TRTP_RTCP_HEADER_SIZE] = self->ssrc >> 24; + pdata[TRTP_RTCP_HEADER_SIZE + 1] = (self->ssrc >> 16) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 2] = (self->ssrc >> 8) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 3] = (self->ssrc & 0xFF); + + pdata += (TRTP_RTCP_HEADER_SIZE + 4); + size -= (TRTP_RTCP_HEADER_SIZE + 4); + + if(TRTP_RTCP_PACKET(self)->header->rc > 0){ + tsk_list_foreach(item, self->blocks){ + if(!item->data){ + continue; + } + if((ret = trtp_rtcp_rblock_serialize_to(TRTP_RTCP_RBLOCK(item->data), pdata, size))){ + TSK_DEBUG_ERROR("Failed to serialize the rblock"); + goto bail; + } + pdata += TRTP_RTCP_RBLOCK_SIZE; + size -= TRTP_RTCP_RBLOCK_SIZE; + } + } + + tsk_list_foreach(item, self->packets){ + if(!item->data){ + continue; + } + if((ret = trtp_rtcp_packet_serialize_to(TRTP_RTCP_PACKET(item->data), pdata, size))){ + TSK_DEBUG_ERROR("Failed to serialize packet"); + goto bail; + } + pdata += TRTP_RTCP_PACKET(item->data)->header->length_in_bytes; + size -= TRTP_RTCP_PACKET(item->data)->header->length_in_bytes; + } + +bail: + return ret; +} + +tsk_size_t trtp_rtcp_report_rr_get_size(const trtp_rtcp_report_rr_t* self) +{ + tsk_size_t size; + const tsk_list_item_t* item; + + if(!self || !TRTP_RTCP_PACKET(self)->header){ + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + + size = TRTP_RTCP_PACKET(self)->header->length_in_bytes; + if(TRTP_RTCP_PACKET(self)->header->rc > 0){ + tsk_list_foreach(item, self->blocks){ + if(item->data){ + size += TRTP_RTCP_RBLOCK_SIZE; + } + } + } + tsk_list_foreach(item, self->packets){ + if(item->data && TRTP_RTCP_PACKET(item->data)->header){ + size += TRTP_RTCP_PACKET(item->data)->header->length_in_bytes; + } + } + + return size; +} \ No newline at end of file diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_sdes.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_sdes.c index ba824b86..2fcb4526 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_sdes.c +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_sdes.c @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -42,62 +42,23 @@ chunk | SSRC/CSRC_2 | | ... | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ */ -trtp_rtcp_report_sdes_t* trtp_rtcp_report_sdes_create_null() -{ - return tsk_object_new(trtp_rtcp_report_sdes_def_t); -} -// @NotImplemented -trtp_rtcp_report_sdes_t* trtp_rtcp_report_sdes_deserialize(const void* data, tsk_size_t size) -{ - trtp_rtcp_report_sdes_t* packet = tsk_null; - //-- const uint8_t* pdata = (const uint8_t*)data; - if(!data || !size){ - TSK_DEBUG_ERROR("Invalid parameter"); - return tsk_null; - } - if(sizeheader->type = trtp_rtcp_packet_type_sdes; - TRTP_RTCP_PACKET(packet)->header->version = TRTP_RTCP_HEADER_VERSION_DEFAULT; - packet->chuncks = tsk_list_create(); - // init base + trtp_rtcp_report_sdes_t *sdes = self; + if(sdes){ + sdes->chuncks = tsk_list_create(); } return self; } static tsk_object_t* trtp_rtcp_report_sdes_dtor(tsk_object_t * self) { - trtp_rtcp_report_sdes_t *packet = self; - if(packet){ + trtp_rtcp_report_sdes_t *sdes = self; + if(sdes){ // deinit base - trtp_rtcp_packet_deinit(TRTP_RTCP_PACKET(packet)); + trtp_rtcp_packet_deinit(TRTP_RTCP_PACKET(sdes)); // deinit self - TSK_OBJECT_SAFE_FREE(packet->chuncks); + TSK_OBJECT_SAFE_FREE(sdes->chuncks); } return self; @@ -110,3 +71,144 @@ static const tsk_object_def_t trtp_rtcp_report_sdes_def_s = tsk_null, }; const tsk_object_def_t *trtp_rtcp_report_sdes_def_t = &trtp_rtcp_report_sdes_def_s; + + +trtp_rtcp_report_sdes_t* trtp_rtcp_report_sdes_create_null() +{ + trtp_rtcp_report_sdes_t* sdes; + if((sdes = (trtp_rtcp_report_sdes_t*)tsk_object_new(trtp_rtcp_report_sdes_def_t))){ + trtp_rtcp_packet_init(TRTP_RTCP_PACKET(sdes), TRTP_RTCP_HEADER_VERSION_DEFAULT, 0, 0, trtp_rtcp_packet_type_sdes, TRTP_RTCP_HEADER_SIZE); + } + return sdes; +} + +trtp_rtcp_report_sdes_t* trtp_rtcp_report_sdes_create(trtp_rtcp_header_t* header) +{ + trtp_rtcp_report_sdes_t* sdes; + if((sdes = (trtp_rtcp_report_sdes_t*)tsk_object_new(trtp_rtcp_report_sdes_def_t))){ + TRTP_RTCP_PACKET(sdes)->header = tsk_object_ref(header); + } + return sdes; +} + +trtp_rtcp_report_sdes_t* trtp_rtcp_report_sdes_deserialize(const void* data, tsk_size_t _size) +{ + trtp_rtcp_report_sdes_t* sdes = tsk_null; + trtp_rtcp_header_t* header = tsk_null; + const uint8_t* pdata = (const uint8_t*)data; + int32_t size = _size; + + if(!data || size < TRTP_RTCP_HEADER_SIZE){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + if(!(header = trtp_rtcp_header_deserialize(pdata, size))){ + TSK_DEBUG_ERROR("Failed to deserialize the header"); + goto bail; + } + if(header->length_in_bytes < (TRTP_RTCP_HEADER_SIZE + 4)){ + TSK_DEBUG_ERROR("Too short"); + goto bail; + } + + if(!(sdes = trtp_rtcp_report_sdes_create(header))){ + TSK_DEBUG_ERROR("Failed to create object"); + goto bail; + } + + pdata += TRTP_RTCP_HEADER_SIZE; + size -= TRTP_RTCP_HEADER_SIZE; + + // Chuncks + if(header->rc > 0){ + tsk_size_t i = 0, chunck_size; + trtp_rtcp_sdes_chunck_t* chunck; + while(i++ < header->rc && size > TRTP_RTCP_SDES_CHUNCK_MIN_SIZE){ + if((chunck = trtp_rtcp_sdes_chunck_deserialize(pdata, size))){ + chunck_size = trtp_rtcp_sdes_chunck_get_size(chunck); + if((size -= chunck_size)){ + pdata += chunck_size; + } + tsk_list_push_ascending_data(sdes->chuncks, (void**)&chunck); + continue; + } + break; + } + } + +bail: + TSK_OBJECT_SAFE_FREE(header); + return sdes; +} + +int trtp_rtcp_report_sdes_serialize_to(const trtp_rtcp_report_sdes_t* self, void* data, tsk_size_t size) +{ + int ret; + uint8_t* pdata = (uint8_t*)data; + if(!self || !data || size < trtp_rtcp_report_sdes_get_size(self)){ + return -1; + } + + if((ret = trtp_rtcp_header_serialize_to(TRTP_RTCP_PACKET(self)->header, pdata, size))){ + TSK_DEBUG_ERROR("Failed to serialize the header"); + return ret; + } + + pdata += (TRTP_RTCP_HEADER_SIZE); + size -= (TRTP_RTCP_HEADER_SIZE); + + if(TRTP_RTCP_PACKET(self)->header->rc > 0){ + const tsk_list_item_t* item; + tsk_size_t i = 0, chunck_size; + const trtp_rtcp_sdes_chunck_t* chunck; + tsk_list_foreach(item, self->chuncks){ + if(!(chunck = item->data)){ + continue; + } + if((ret = trtp_rtcp_sdes_chunck_serialize_to(chunck, pdata, size))){ + TSK_DEBUG_ERROR("Failed to serialize SDES chunck"); + goto bail; + } + chunck_size = trtp_rtcp_sdes_chunck_get_size(chunck); + pdata += chunck_size; + size -= chunck_size; + } + } + +bail: + return ret; +} + +int trtp_rtcp_report_sdes_add_chunck(trtp_rtcp_report_sdes_t* self, trtp_rtcp_sdes_chunck_t* chunck) +{ + if(!self || !self->chuncks || !chunck){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + chunck = tsk_object_ref(chunck); + TRTP_RTCP_PACKET(self)->header->length_in_bytes += trtp_rtcp_sdes_chunck_get_size(chunck); + TRTP_RTCP_PACKET(self)->header->length_in_words_minus1 = ((TRTP_RTCP_PACKET(self)->header->length_in_bytes >> 2) - 1) + + ((TRTP_RTCP_PACKET(self)->header->length_in_bytes & 0x03) ? 1 : 0); + ++TRTP_RTCP_PACKET(self)->header->rc; + tsk_list_push_back_data(self->chuncks, (void**)&chunck); + return 0; +} + +tsk_size_t trtp_rtcp_report_sdes_get_size(const trtp_rtcp_report_sdes_t* self) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + else{ + tsk_size_t size = TRTP_RTCP_HEADER_SIZE; + const tsk_list_item_t* item; + tsk_list_foreach(item, self->chuncks){ + size += trtp_rtcp_sdes_chunck_get_size(TRTP_RTCP_SDES_CHUNCK(item->data)); + } + return size; + } +} + diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_sr.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_sr.c index a6bd1d2b..929a535d 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_sr.c +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_sr.c @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -20,58 +20,33 @@ * */ #include "tinyrtp/rtcp/trtp_rtcp_report_sr.h" +#include "tinyrtp/rtcp/trtp_rtcp_header.h" + +#include "tnet_endianness.h" #include "tsk_debug.h" -trtp_rtcp_report_sr_t* trtp_rtcp_report_sr_create_null() -{ - return tsk_object_new(trtp_rtcp_report_sr_def_t); -} +#define TRTP_RTCP_PACKET_SR_MIN_SIZE (TRTP_RTCP_HEADER_SIZE + 4 + 20) -// @NotImplemented -trtp_rtcp_report_sr_t* trtp_rtcp_report_sr_deserialize(const void* data, tsk_size_t size) -{ - trtp_rtcp_report_sr_t* packet = tsk_null; - if(!data || !size){ - TSK_DEBUG_ERROR("Invalid parameter"); - return tsk_null; - } - - TSK_DEBUG_ERROR("Not Implemented"); - return packet; -} - -// @NotImplemented -int trtp_rtcp_report_sr_deserialize_payload(trtp_rtcp_report_sr_t* self, const void* payload, tsk_size_t size) -{ - if(!self || !payload || !size){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - - TSK_DEBUG_ERROR("Not Implemented"); - return 0; -} - -//================================================================================================= -// RTCP Sender Report (SR) Packet object definition -// static tsk_object_t* trtp_rtcp_report_sr_ctor(tsk_object_t * self, va_list * app) { - trtp_rtcp_report_sr_t *packet = self; - if(packet){ + trtp_rtcp_report_sr_t *sr = self; + if(sr){ + sr->blocks = tsk_list_create(); + sr->packets = tsk_list_create(); } return self; } static tsk_object_t* trtp_rtcp_report_sr_dtor(tsk_object_t * self) { - trtp_rtcp_report_sr_t *packet = self; - if(packet){ + trtp_rtcp_report_sr_t *sr = self; + if(sr){ // deinit self - TSK_OBJECT_SAFE_FREE(packet->rblocks); + TSK_OBJECT_SAFE_FREE(sr->blocks); + TSK_OBJECT_SAFE_FREE(sr->packets); // deinit base - trtp_rtcp_packet_deinit(TRTP_RTCP_PACKET(packet)); + trtp_rtcp_packet_deinit(TRTP_RTCP_PACKET(sr)); } return self; @@ -85,3 +60,211 @@ static const tsk_object_def_t trtp_rtcp_report_sr_def_s = tsk_null, }; const tsk_object_def_t *trtp_rtcp_report_sr_def_t = &trtp_rtcp_report_sr_def_s; + +trtp_rtcp_report_sr_t* trtp_rtcp_report_sr_create_null() +{ + trtp_rtcp_report_sr_t* sr; + if((sr = (trtp_rtcp_report_sr_t*)tsk_object_new(trtp_rtcp_report_sr_def_t))){ + trtp_rtcp_packet_init(TRTP_RTCP_PACKET(sr), TRTP_RTCP_HEADER_VERSION_DEFAULT, 0, 0, trtp_rtcp_packet_type_sr, (TRTP_RTCP_HEADER_SIZE + 4 + 20)); + } + return sr; +} + +trtp_rtcp_report_sr_t* trtp_rtcp_report_sr_create(struct trtp_rtcp_header_s* header) +{ + trtp_rtcp_report_sr_t* sr; + if((sr = (trtp_rtcp_report_sr_t*)tsk_object_new(trtp_rtcp_report_sr_def_t))){ + TRTP_RTCP_PACKET(sr)->header = tsk_object_ref(header); + } + return sr; +} + + +trtp_rtcp_report_sr_t* trtp_rtcp_report_sr_deserialize(const void* data, tsk_size_t _size) +{ + trtp_rtcp_report_sr_t* sr = tsk_null; + trtp_rtcp_header_t* header = tsk_null; + const uint8_t* pdata = (const uint8_t*)data; + int32_t size = _size; + + if(!data || size < TRTP_RTCP_PACKET_SR_MIN_SIZE){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + if(!(header = trtp_rtcp_header_deserialize(pdata, size))){ + TSK_DEBUG_ERROR("Failed to deserialize the header"); + goto bail; + } + if(header->length_in_bytes < TRTP_RTCP_PACKET_SR_MIN_SIZE){ + TSK_DEBUG_ERROR("Too short"); + goto bail; + } + + if(!(sr = trtp_rtcp_report_sr_create(header))){ + TSK_DEBUG_ERROR("Failed to create object"); + goto bail; + } + + sr->ssrc = tnet_ntohl_2(&pdata[4]); + pdata += (TRTP_RTCP_HEADER_SIZE + 4); + size -= (TRTP_RTCP_HEADER_SIZE + 4); + + // sender info + sr->sender_info.ntp_msw = tnet_ntohl_2(&pdata[0]); + sr->sender_info.ntp_lsw = tnet_ntohl_2(&pdata[4]); + sr->sender_info.rtp_timestamp = tnet_ntohl_2(&pdata[8]); + sr->sender_info.sender_pcount = tnet_ntohl_2(&pdata[12]); + sr->sender_info.sender_ocount = tnet_ntohl_2(&pdata[16]); + pdata += 20; + size -= 20; + + // Blocks + if(header->rc > 0){ + tsk_size_t i = 0; + trtp_rtcp_rblock_t* rblock; + + while(i++ < header->rc && size >= TRTP_RTCP_RBLOCK_SIZE){ + if((rblock = trtp_rtcp_rblock_deserialize(pdata, size))){ + tsk_list_push_back_data(sr->blocks, (void**)&rblock); + } + pdata += TRTP_RTCP_RBLOCK_SIZE; + size -= TRTP_RTCP_RBLOCK_SIZE; + } + } + + // Other Packets + while(size > TRTP_RTCP_HEADER_SIZE){ + trtp_rtcp_packet_t* packet; + + if((packet = trtp_rtcp_packet_deserialize(pdata, size))){ + if((size -= packet->header->length_in_bytes) > 0){ + pdata += packet->header->length_in_bytes; + } + tsk_list_push_back_data(sr->packets, (void**)&packet); + continue; + } + break; + } + +bail: + TSK_OBJECT_SAFE_FREE(header); + return sr; +} + +int trtp_rtcp_report_sr_serialize_to(const trtp_rtcp_report_sr_t* self, void* data, tsk_size_t size) +{ + int ret; + const tsk_list_item_t* item; + uint8_t* pdata = (uint8_t*)data; + + if(!self || !data || size < trtp_rtcp_report_sr_get_size(self)){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + if((ret = trtp_rtcp_header_serialize_to(TRTP_RTCP_PACKET(self)->header, pdata, size))){ + TSK_DEBUG_ERROR("Failed to serialize the header"); + return ret; + } + + pdata[TRTP_RTCP_HEADER_SIZE] = self->ssrc >> 24; + pdata[TRTP_RTCP_HEADER_SIZE + 1] = (self->ssrc >> 16) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 2] = (self->ssrc >> 8) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 3] = (self->ssrc & 0xFF); + pdata[TRTP_RTCP_HEADER_SIZE + 4] = self->sender_info.ntp_msw >> 24; + pdata[TRTP_RTCP_HEADER_SIZE + 5] = (self->sender_info.ntp_msw >> 16) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 6] = (self->sender_info.ntp_msw >> 8) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 7] = self->sender_info.ntp_msw & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 8] = self->sender_info.ntp_lsw >> 24; + pdata[TRTP_RTCP_HEADER_SIZE + 9] = (self->sender_info.ntp_lsw >> 16) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 10] = (self->sender_info.ntp_lsw >> 8) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 11] = self->sender_info.ntp_lsw & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 12] = self->sender_info.rtp_timestamp >> 24; + pdata[TRTP_RTCP_HEADER_SIZE + 13] = (self->sender_info.rtp_timestamp >> 16) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 14] = (self->sender_info.rtp_timestamp >> 8) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 15] = self->sender_info.rtp_timestamp & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 16] = self->sender_info.sender_pcount >> 24; + pdata[TRTP_RTCP_HEADER_SIZE + 17] = (self->sender_info.sender_pcount >> 16) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 18] = (self->sender_info.sender_pcount >> 8) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 19] = self->sender_info.sender_pcount & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 20] = self->sender_info.sender_ocount >> 24; + pdata[TRTP_RTCP_HEADER_SIZE + 21] = (self->sender_info.sender_ocount >> 16) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 22] = (self->sender_info.sender_ocount >> 8) & 0xFF; + pdata[TRTP_RTCP_HEADER_SIZE + 23] = self->sender_info.sender_ocount & 0xFF; + + pdata += (TRTP_RTCP_HEADER_SIZE + 4 + 20); + size -= (TRTP_RTCP_HEADER_SIZE + 4 + 20); + + if(TRTP_RTCP_PACKET(self)->header->rc > 0){ + tsk_list_foreach(item, self->blocks){ + if(!item->data){ + continue; + } + if((ret = trtp_rtcp_rblock_serialize_to(TRTP_RTCP_RBLOCK(item->data), pdata, size))){ + TSK_DEBUG_ERROR("Failed to serialize the rblock"); + goto bail; + } + pdata += TRTP_RTCP_RBLOCK_SIZE; + size -= TRTP_RTCP_RBLOCK_SIZE; + } + } + + tsk_list_foreach(item, self->packets){ + if(!item->data){ + continue; + } + if((ret = trtp_rtcp_packet_serialize_to(TRTP_RTCP_PACKET(item->data), pdata, size))){ + TSK_DEBUG_ERROR("Failed to serialize packet"); + goto bail; + } + pdata += TRTP_RTCP_PACKET(item->data)->header->length_in_bytes; + size -= TRTP_RTCP_PACKET(item->data)->header->length_in_bytes; + } + +bail: + return ret; +} + +int trtp_rtcp_report_sr_add_block(trtp_rtcp_report_sr_t* self, trtp_rtcp_rblock_t* rblock) +{ + if(!self || !TRTP_RTCP_PACKET(self)->header || !rblock){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + rblock = tsk_object_ref(rblock); + tsk_list_push_back_data(self->blocks, (void**)&rblock); + ++TRTP_RTCP_PACKET(self)->header->rc; + TRTP_RTCP_PACKET(self)->header->length_in_bytes += TRTP_RTCP_RBLOCK_SIZE; + TRTP_RTCP_PACKET(self)->header->length_in_words_minus1 = ((TRTP_RTCP_PACKET(self)->header->length_in_bytes >> 2) - 1) + + ((TRTP_RTCP_PACKET(self)->header->length_in_bytes & 0x03) ? 1 : 0); + return 0; +} + +tsk_size_t trtp_rtcp_report_sr_get_size(const trtp_rtcp_report_sr_t* self) +{ + tsk_size_t size; + const tsk_list_item_t* item; + + if(!self || !TRTP_RTCP_PACKET(self)->header){ + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + + size = TRTP_RTCP_PACKET(self)->header->length_in_bytes; + //if(TRTP_RTCP_PACKET(self)->header->rc > 0){ + // tsk_list_foreach(item, self->blocks){ + // if(item->data){ + // size += TRTP_RTCP_RBLOCK_SIZE; + // } + // } + //} + tsk_list_foreach(item, self->packets){ + if(item->data && TRTP_RTCP_PACKET(item->data)->header){ + size += TRTP_RTCP_PACKET(item->data)->header->length_in_bytes; + } + } + + return size; +} + diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_xr.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_xr.c index afa946f1..794cc3a8 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_xr.c +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_xr.c @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_sdes_chunck.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_sdes_chunck.c index 1a65c959..175c25e2 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_sdes_chunck.c +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_sdes_chunck.c @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -41,78 +41,7 @@ Each chunk consists of an SSRC/CSRC identifier followed by a list of | ... | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ */ -trtp_rtcp_sdes_chunck_t* trtp_rtcp_sdes_chunck_create_null() -{ - return tsk_object_new(trtp_rtcp_sdes_chunck_def_t); -} -trtp_rtcp_sdes_chunck_t* trtp_rtcp_sdes_chunck_create(uint32_t ssrc_or_csrc) -{ - trtp_rtcp_sdes_chunck_t* chunck; - if((chunck = trtp_rtcp_sdes_chunck_create_null())){ - chunck->ssrc_or_csrc = ssrc_or_csrc; - } - return chunck; -} - -trtp_rtcp_sdes_chunck_t* trtp_rtcp_sdes_chunck_deserialize(const void* data, tsk_size_t size) -{ - trtp_rtcp_sdes_chunck_t* chunck = tsk_null; - const uint8_t* pdata = (uint8_t*)data; - const uint8_t* pend; - if(!data || !size){ - TSK_DEBUG_ERROR("Invalid parameter"); - return tsk_null; - } - if(sizessrc_or_csrc = tnet_ntohl_2(pdata); - pdata+=4; - while(pdataitems, (void**)&item); - pdata+=trtp_rtcp_sdes_item_get_size(item); - } - else{ - TSK_DEBUG_ERROR("Failed to deserialize sdes item"); - break; - } - } - } - else{ - TSK_DEBUG_ERROR("Failed to create new sdes_chunck object"); - return tsk_null; - } - - return chunck; -} - -tsk_size_t trtp_rtcp_sdes_chunck_get_size(trtp_rtcp_sdes_chunck_t* self) -{ - tsk_size_t size = TRTP_RTCP_SDES_CHUNCK_SSRC_OR_CSRC_SIZE; - const tsk_list_item_t* item; - if(self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return 0; - } - tsk_list_foreach(item, self->items){ - size+=trtp_rtcp_sdes_item_get_size(TRTP_RTCP_SDES_ITEM(item->data)); - } - if(size%4){//Each chunk starts on a 32-bit boundary - size += (4-size%4); - } - return size; -} - -// -// Object definition -// static tsk_object_t* trtp_rtcp_sdes_chunck_ctor(tsk_object_t * self, va_list * app) { trtp_rtcp_sdes_chunck_t *chunck = self; @@ -138,3 +67,124 @@ static const tsk_object_def_t trtp_rtcp_sdes_chunck_def_s = tsk_null, }; const tsk_object_def_t *trtp_rtcp_sdes_chunck_def_t = &trtp_rtcp_sdes_chunck_def_s; + + + +trtp_rtcp_sdes_chunck_t* trtp_rtcp_sdes_chunck_create_null() +{ + return tsk_object_new(trtp_rtcp_sdes_chunck_def_t); +} + +trtp_rtcp_sdes_chunck_t* trtp_rtcp_sdes_chunck_create(uint32_t ssrc) +{ + trtp_rtcp_sdes_chunck_t* chunck; + if((chunck = trtp_rtcp_sdes_chunck_create_null())){ + chunck->ssrc = ssrc; + } + return chunck; +} + +trtp_rtcp_sdes_chunck_t* trtp_rtcp_sdes_chunck_deserialize(const void* data, tsk_size_t size) +{ + trtp_rtcp_sdes_chunck_t* chunck = tsk_null; + const uint8_t* pdata = (uint8_t*)data; + const uint8_t* pend; + if(!data || size < TRTP_RTCP_SDES_CHUNCK_MIN_SIZE){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + pend = (pdata + size); + if((chunck = trtp_rtcp_sdes_chunck_create_null())){ + trtp_rtcp_sdes_item_t* item; + tsk_bool_t is_last_item = tsk_false; + // SSRC/CSRC + chunck->ssrc = tnet_ntohl_2(pdata); + pdata += TRTP_RTCP_SDES_CHUNCK_SSRC_OR_CSRC_SIZE; + while((pdata < pend) && !is_last_item){ + if((item = trtp_rtcp_sdes_item_deserialize(pdata, (pend-pdata)))){ + is_last_item = (item->type == trtp_rtcp_sdes_item_type_end); + pdata += trtp_rtcp_sdes_item_get_size(item); + tsk_list_push_back_data(chunck->items, (void**)&item); + } + else{ + TSK_DEBUG_ERROR("Failed to deserialize sdes item"); + break; + } + } + } + else{ + TSK_DEBUG_ERROR("Failed to create new sdes_chunck object"); + return tsk_null; + } + + return chunck; +} + +int trtp_rtcp_sdes_chunck_serialize_to(const trtp_rtcp_sdes_chunck_t* self, void* data, tsk_size_t size) +{ + uint8_t* pdata = (uint8_t*)data; + const tsk_list_item_t* item; + const trtp_rtcp_sdes_item_t* sdes_item; + tsk_size_t sdes_item_size; + int ret = 0; + + if(!self || !data || size < trtp_rtcp_sdes_chunck_get_size(self)){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + pdata[0] = self->ssrc >> 24; + pdata[1] = (self->ssrc >> 16) & 0xFF; + pdata[2] = (self->ssrc >> 8) & 0xFF; + pdata[3] = (self->ssrc & 0xFF); + pdata += 4; + + tsk_list_foreach(item, self->items){ + if(!(sdes_item = TRTP_RTCP_SDES_ITEM(item->data))){ + continue; + } + if((ret = trtp_rtcp_sdes_item_serialize_to(sdes_item, pdata, size))){ + TSK_DEBUG_ERROR("SDES item serialization failed"); + goto bail; + } + sdes_item_size = trtp_rtcp_sdes_item_get_size(sdes_item); + pdata += sdes_item_size; size -= sdes_item_size; + } + +bail: + return ret; +} + +int trtp_rtcp_sdes_chunck_add_item(trtp_rtcp_sdes_chunck_t* self, trtp_rtcp_sdes_item_type_t type, const void* data, uint8_t length) +{ + trtp_rtcp_sdes_item_t *item; + if(!self || !self->items){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + if((item = trtp_rtcp_sdes_item_create(type, data, length))){ + tsk_list_push_back_data(self->items, (void**)&item); + } + return 0; +} + +tsk_size_t trtp_rtcp_sdes_chunck_get_size(const trtp_rtcp_sdes_chunck_t* self) +{ + const tsk_list_item_t* item; + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + else{ + tsk_size_t size = TRTP_RTCP_SDES_CHUNCK_SSRC_OR_CSRC_SIZE; + tsk_list_foreach(item, self->items){ + size += trtp_rtcp_sdes_item_get_size(TRTP_RTCP_SDES_ITEM(item->data)); + } + if(size & 0x03){//Each chunk starts on a 32-bit boundary + size += (4 - (size & 0x03)); + } + return size; + } +} + diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_sdes_item.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_sdes_item.c index fa7603b2..a72cb931 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_sdes_item.c +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_sdes_item.c @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -30,53 +30,49 @@ #include /* strlen() */ -static trtp_rtcp_sdes_item_t* _trtp_rtcp_sdes_item_create_null(trtp_rtcp_sdes_item_type_t type) +static tsk_object_t* trtp_rtcp_sdes_item_ctor(tsk_object_t * self, va_list * app) { - switch(type){ - case trtp_rtcp_sdes_item_type_end: - default: - TSK_DEBUG_ERROR("%d is not a valid SDES type", type); - return tsk_null; - case trtp_rtcp_sdes_item_type_cname: - return (trtp_rtcp_sdes_item_t*)trtp_rtcp_sdes_item_cname_create_null(); - case trtp_rtcp_sdes_item_type_name: - return (trtp_rtcp_sdes_item_t*)trtp_rtcp_sdes_item_name_create_null(); - case trtp_rtcp_sdes_item_type_email: - return (trtp_rtcp_sdes_item_t*)trtp_rtcp_sdes_item_email_create_null(); - case trtp_rtcp_sdes_item_type_phone: - return (trtp_rtcp_sdes_item_t*)trtp_rtcp_sdes_item_phone_create_null(); - case trtp_rtcp_sdes_item_type_loc: - return (trtp_rtcp_sdes_item_t*)trtp_rtcp_sdes_item_loc_create_null(); - case trtp_rtcp_sdes_item_type_tool: - return (trtp_rtcp_sdes_item_t*)trtp_rtcp_sdes_item_tool_create_null(); - case trtp_rtcp_sdes_item_type_note: - return (trtp_rtcp_sdes_item_t*)trtp_rtcp_sdes_item_note_create_null(); - case trtp_rtcp_sdes_item_type_priv: - return (trtp_rtcp_sdes_item_t*)trtp_rtcp_sdes_item_priv_create_null(); + trtp_rtcp_sdes_item_t *item = self; + if(item){ } + return self; +} +static tsk_object_t* trtp_rtcp_sdes_item_dtor(tsk_object_t * self) +{ + trtp_rtcp_sdes_item_t *item = self; + if(item){ + TSK_OBJECT_SAFE_FREE(item->data); + } + + return self; +} +static const tsk_object_def_t trtp_rtcp_sdes_item_def_s = +{ + sizeof(trtp_rtcp_sdes_item_t), + trtp_rtcp_sdes_item_ctor, + trtp_rtcp_sdes_item_dtor, + tsk_null, +}; +const tsk_object_def_t *trtp_rtcp_sdes_item_def_t = &trtp_rtcp_sdes_item_def_s; + + +trtp_rtcp_sdes_item_t* _trtp_rtcp_sdes_item_create_null(trtp_rtcp_sdes_item_type_t type) +{ + return tsk_object_new(trtp_rtcp_sdes_item_def_t); } -int trtp_rtcp_sdes_item_init(trtp_rtcp_sdes_item_t* self, uint8_t version, uint8_t padding, trtp_rtcp_sdes_item_type_t type, uint16_t length) -{ - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - self->header.version = version; - self->header.padding = padding; - self->header.type = type; - self->header.length = length; - return 0; -} - -trtp_rtcp_sdes_item_t* trtp_rtcp_sdes_item_create(uint8_t version, uint8_t padding, trtp_rtcp_sdes_item_type_t type, uint16_t length) +trtp_rtcp_sdes_item_t* trtp_rtcp_sdes_item_create(trtp_rtcp_sdes_item_type_t type, const void* data, uint8_t length) { trtp_rtcp_sdes_item_t* item; if(!(item = _trtp_rtcp_sdes_item_create_null(type))){ TSK_DEBUG_ERROR("Failed to create new SDES item"); return tsk_null; } - trtp_rtcp_sdes_item_init(item, version, padding, type, length); + item->type = type; + if(data && length){ + item->data = tsk_buffer_create(data, length); + } + return item; } @@ -84,559 +80,70 @@ trtp_rtcp_sdes_item_t* trtp_rtcp_sdes_item_deserialize(const void* data, tsk_siz { trtp_rtcp_sdes_item_t* item = tsk_null; const uint8_t* pdata = (const uint8_t*)data; - struct{ - unsigned version:2; - unsigned padding:1; - unsigned source_count:5; - trtp_rtcp_sdes_item_type_t type; - uint16_t length; - } header; + if(!data || !size){ TSK_DEBUG_ERROR("Invlaid parameter"); return tsk_null; } - if(size>6; - header.padding = (pdata[0]>>5)&0x01; - header.source_count = pdata[0]&0x1f; - header.type = (enum trtp_rtcp_packet_type_e)pdata[1]; - header.length = tnet_ntohs_2(&pdata[2]); - // check the length - if(size<(unsigned)(header.length+TRTP_RTCP_SDES_HEADER_SIZE)){ - TSK_DEBUG_ERROR("%hu is invalid as header length", header.length); + + if(size < TRTP_RTCP_SDES_ITEM_MIN_SIZE || size < (tsk_size_t)(pdata[1] + 2)){ + TSK_DEBUG_ERROR("Too short"); return tsk_null; } - pdata+=TRTP_RTCP_SDES_HEADER_SIZE; - // create item - if((item = trtp_rtcp_sdes_item_create(header.version, header.padding, header.type, header.length))){ - switch(item->header.type){ - case trtp_rtcp_sdes_item_type_end: - default: - TSK_DEBUG_ERROR("%d is not a valid SDES type", item->header.type); - break; - case trtp_rtcp_sdes_item_type_cname: - TRTP_RTCP_SDES_ITEM_CNAME(item)->cname = tsk_strndup((const char*)pdata, item->header.length); - break; - case trtp_rtcp_sdes_item_type_name: - TRTP_RTCP_SDES_ITEM_NAME(item)->name = tsk_strndup((const char*)pdata, item->header.length); - break; - case trtp_rtcp_sdes_item_type_email: - TRTP_RTCP_SDES_ITEM_EMAIL(item)->email = tsk_strndup((const char*)pdata, item->header.length); - break; - case trtp_rtcp_sdes_item_type_phone: - TRTP_RTCP_SDES_ITEM_PHONE(item)->phone = tsk_strndup((const char*)pdata, item->header.length); - break; - case trtp_rtcp_sdes_item_type_loc: - TRTP_RTCP_SDES_ITEM_LOC(item)->loc = tsk_strndup((const char*)pdata, item->header.length); - break; - case trtp_rtcp_sdes_item_type_tool: - TRTP_RTCP_SDES_ITEM_TOOL(item)->tool = tsk_strndup((const char*)pdata, item->header.length); - break; - case trtp_rtcp_sdes_item_type_note: - TRTP_RTCP_SDES_ITEM_NOTE(item)->note = tsk_strndup((const char*)pdata, item->header.length); - break; - case trtp_rtcp_sdes_item_type_priv: - TRTP_RTCP_SDES_ITEM_PRIV(item)->priv = tsk_buffer_create(pdata, item->header.length); - break; - } - } - return item; + return trtp_rtcp_sdes_item_create((trtp_rtcp_sdes_item_type_t)pdata[0], &pdata[2], pdata[1]); } -tsk_buffer_t* trtp_rtcp_sdes_item_serialize(trtp_rtcp_sdes_item_t* self) +tsk_buffer_t* trtp_rtcp_sdes_item_serialize(const trtp_rtcp_sdes_item_t* self) { tsk_buffer_t*buffer = tsk_null; if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); return tsk_null; } + if((buffer = tsk_buffer_create(tsk_null, trtp_rtcp_sdes_item_get_size(self)))){ + if(trtp_rtcp_sdes_item_serialize_to(self, buffer->data, buffer->size) != 0){ + TSK_OBJECT_SAFE_FREE(buffer); + } + } return buffer; } -tsk_size_t trtp_rtcp_sdes_item_get_size(trtp_rtcp_sdes_item_t* self) +int trtp_rtcp_sdes_item_serialize_to(const trtp_rtcp_sdes_item_t* self, void* data, tsk_size_t size) +{ + if(!self || !data || (size < trtp_rtcp_sdes_item_get_size(self))){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + if(self->type == trtp_rtcp_sdes_item_type_end){ + ((uint8_t*)data)[0] = trtp_rtcp_sdes_item_type_end; + } + else{ + ((uint8_t*)data)[0] = self->type; + if(self->data){ + ((uint8_t*)data)[1] = self->data->size; + memcpy(&((uint8_t*)data)[2], self->data->data, self->data->size); + } + else{ + ((uint8_t*)data)[1] = 0; + } + } + return 0; +} + +tsk_size_t trtp_rtcp_sdes_item_get_size(const trtp_rtcp_sdes_item_t* self) { if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); return 0; } - switch(self->header.type){ - case trtp_rtcp_sdes_item_type_end: - default: - TSK_DEBUG_ERROR("%d is not a valid SDES type", self->header.type); - return 0; - case trtp_rtcp_sdes_item_type_cname: - return trtp_rtcp_sdes_item_cname_get_size(TRTP_RTCP_SDES_ITEM_CNAME(self)); - case trtp_rtcp_sdes_item_type_name: - return trtp_rtcp_sdes_item_name_get_size(TRTP_RTCP_SDES_ITEM_NAME(self)); - case trtp_rtcp_sdes_item_type_email: - return trtp_rtcp_sdes_item_email_get_size(TRTP_RTCP_SDES_ITEM_EMAIL(self)); - case trtp_rtcp_sdes_item_type_phone: - return trtp_rtcp_sdes_item_phone_get_size(TRTP_RTCP_SDES_ITEM_PHONE(self)); - case trtp_rtcp_sdes_item_type_loc: - return trtp_rtcp_sdes_item_loc_get_size(TRTP_RTCP_SDES_ITEM_LOC(self)); - case trtp_rtcp_sdes_item_type_tool: - return trtp_rtcp_sdes_item_tool_get_size(TRTP_RTCP_SDES_ITEM_TOOL(self)); - case trtp_rtcp_sdes_item_type_note: - return trtp_rtcp_sdes_item_note_get_size(TRTP_RTCP_SDES_ITEM_NOTE(self)); - case trtp_rtcp_sdes_item_type_priv: - return trtp_rtcp_sdes_item_priv_get_size(TRTP_RTCP_SDES_ITEM_PRIV(self)); + switch(self->type){ + case trtp_rtcp_sdes_item_type_end: return 1; + default: return 2 + (self->data ? self->data->size : 0); } } - -/* RFC 3550 6.5.1 CNAME: Canonical End-Point Identifier SDES Item - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | CNAME=1 | length | user and domain name ... - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -*/ -trtp_rtcp_sdes_item_cname_t* trtp_rtcp_sdes_item_cname_create_null() -{ - return tsk_object_new(trtp_rtcp_sdes_item_cname_def_t); -} - -trtp_rtcp_sdes_item_cname_t* trtp_rtcp_sdes_item_cname_create(const char* cname) -{ - trtp_rtcp_sdes_item_cname_t* item; - if((item = trtp_rtcp_sdes_item_cname_create_null())){ - item->cname = tsk_strdup(cname); - } - return item; -} - -tsk_size_t trtp_rtcp_sdes_item_cname_get_size(trtp_rtcp_sdes_item_cname_t* self) -{ - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - return TRTP_RTCP_SDES_HEADER_SIZE + tsk_strlen(self->cname); -} - -static tsk_object_t* trtp_rtcp_sdes_item_cname_ctor(tsk_object_t * self, va_list * app) -{ - trtp_rtcp_sdes_item_cname_t *item = self; - if(item){ - } - return self; -} -static tsk_object_t* trtp_rtcp_sdes_item_cname_dtor(tsk_object_t * self) -{ - trtp_rtcp_sdes_item_cname_t *item = self; - if(item){ - // deinit self - TSK_FREE(item->cname); - } - - return self; -} -static const tsk_object_def_t trtp_rtcp_sdes_item_cname_def_s = -{ - sizeof(trtp_rtcp_sdes_item_cname_t), - trtp_rtcp_sdes_item_cname_ctor, - trtp_rtcp_sdes_item_cname_dtor, - tsk_null, -}; -const tsk_object_def_t *trtp_rtcp_sdes_item_cname_def_t = &trtp_rtcp_sdes_item_cname_def_s; - -/* RFC 3550 6.5.2 NAME: User Name SDES Item - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | NAME=2 | length | common name of source ... - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -*/ -trtp_rtcp_sdes_item_name_t* trtp_rtcp_sdes_item_name_create_null() -{ - return tsk_object_new(trtp_rtcp_sdes_item_name_def_t); -} - -trtp_rtcp_sdes_item_name_t* trtp_rtcp_sdes_item_name_create(const char* name) -{ - trtp_rtcp_sdes_item_name_t* item; - if((item = trtp_rtcp_sdes_item_name_create_null())){ - item->name = tsk_strdup(name); - } - return item; -} - -tsk_size_t trtp_rtcp_sdes_item_name_get_size(trtp_rtcp_sdes_item_name_t* self) -{ - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - return TRTP_RTCP_SDES_HEADER_SIZE + tsk_strlen(self->name); -} - -static tsk_object_t* trtp_rtcp_sdes_item_name_ctor(tsk_object_t * self, va_list * app) -{ - trtp_rtcp_sdes_item_name_t *item = self; - if(item){ - } - return self; -} -static tsk_object_t* trtp_rtcp_sdes_item_name_dtor(tsk_object_t * self) -{ - trtp_rtcp_sdes_item_name_t *item = self; - if(item){ - // deinit self - TSK_FREE(item->name); - } - - return self; -} -static const tsk_object_def_t trtp_rtcp_sdes_item_name_def_s = -{ - sizeof(trtp_rtcp_sdes_item_name_t), - trtp_rtcp_sdes_item_name_ctor, - trtp_rtcp_sdes_item_name_dtor, - tsk_null, -}; -const tsk_object_def_t *trtp_rtcp_sdes_item_name_def_t = &trtp_rtcp_sdes_item_name_def_s; - - -/* RFC 3550 6.5.3 EMAIL: Electronic Mail Address SDES Item - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | EMAIL=3 | length | email address of source ... - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -*/ -trtp_rtcp_sdes_item_email_t* trtp_rtcp_sdes_item_email_create_null() -{ - return tsk_object_new(trtp_rtcp_sdes_item_email_def_t); -} - -trtp_rtcp_sdes_item_email_t* trtp_rtcp_sdes_item_email_create(const char* email) -{ - trtp_rtcp_sdes_item_email_t* item; - if((item = trtp_rtcp_sdes_item_email_create_null())){ - item->email = tsk_strdup(email); - } - return item; -} - -tsk_size_t trtp_rtcp_sdes_item_email_get_size(trtp_rtcp_sdes_item_email_t* self) -{ - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - return TRTP_RTCP_SDES_HEADER_SIZE + tsk_strlen(self->email); -} - -static tsk_object_t* trtp_rtcp_sdes_item_email_ctor(tsk_object_t * self, va_list * app) -{ - trtp_rtcp_sdes_item_email_t *item = self; - if(item){ - } - return self; -} -static tsk_object_t* trtp_rtcp_sdes_item_email_dtor(tsk_object_t * self) -{ - trtp_rtcp_sdes_item_email_t *item = self; - if(item){ - // deinit self - TSK_FREE(item->email); - } - - return self; -} -static const tsk_object_def_t trtp_rtcp_sdes_item_email_def_s = -{ - sizeof(trtp_rtcp_sdes_item_email_t), - trtp_rtcp_sdes_item_email_ctor, - trtp_rtcp_sdes_item_email_dtor, - tsk_null, -}; -const tsk_object_def_t *trtp_rtcp_sdes_item_email_def_t = &trtp_rtcp_sdes_item_email_def_s; - - -/* RFC 3550 6.5.4 PHONE: Phone Number SDES Item - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | PHONE=4 | length | phone number of source ... - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -*/ -trtp_rtcp_sdes_item_phone_t* trtp_rtcp_sdes_item_phone_create_null() -{ - return tsk_object_new(trtp_rtcp_sdes_item_phone_def_t); -} - -trtp_rtcp_sdes_item_phone_t* trtp_rtcp_sdes_item_phone_create(const char* phone) -{ - trtp_rtcp_sdes_item_phone_t* item; - if((item = trtp_rtcp_sdes_item_phone_create_null())){ - item->phone = tsk_strdup(phone); - } - return item; -} - -tsk_size_t trtp_rtcp_sdes_item_phone_get_size(trtp_rtcp_sdes_item_phone_t* self) -{ - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - return TRTP_RTCP_SDES_HEADER_SIZE + tsk_strlen(self->phone); -} - -static tsk_object_t* trtp_rtcp_sdes_item_phone_ctor(tsk_object_t * self, va_list * app) -{ - trtp_rtcp_sdes_item_phone_t *item = self; - if(item){ - } - return self; -} -static tsk_object_t* trtp_rtcp_sdes_item_phone_dtor(tsk_object_t * self) -{ - trtp_rtcp_sdes_item_phone_t *item = self; - if(item){ - // deinit self - TSK_FREE(item->phone); - } - - return self; -} -static const tsk_object_def_t trtp_rtcp_sdes_item_phone_def_s = -{ - sizeof(trtp_rtcp_sdes_item_phone_t), - trtp_rtcp_sdes_item_phone_ctor, - trtp_rtcp_sdes_item_phone_dtor, - tsk_null, -}; -const tsk_object_def_t *trtp_rtcp_sdes_item_phone_def_t = &trtp_rtcp_sdes_item_phone_def_s; - -/* RFC 3550 6.5.5 LOC: Geographic User Location SDES Item - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | LOC=5 | length | geographic location of site ... - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -*/ -trtp_rtcp_sdes_item_loc_t* trtp_rtcp_sdes_item_loc_create_null() -{ - return tsk_object_new(trtp_rtcp_sdes_item_loc_def_t); -} - -trtp_rtcp_sdes_item_loc_t* trtp_rtcp_sdes_item_loc_create(const char* loc) -{ - trtp_rtcp_sdes_item_loc_t* item; - if((item = trtp_rtcp_sdes_item_loc_create_null())){ - item->loc = tsk_strdup(loc); - } - return item; -} - -tsk_size_t trtp_rtcp_sdes_item_loc_get_size(trtp_rtcp_sdes_item_loc_t* self) -{ - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - return TRTP_RTCP_SDES_HEADER_SIZE + tsk_strlen(self->loc); -} - -static tsk_object_t* trtp_rtcp_sdes_item_loc_ctor(tsk_object_t * self, va_list * app) -{ - trtp_rtcp_sdes_item_loc_t *item = self; - if(item){ - } - return self; -} -static tsk_object_t* trtp_rtcp_sdes_item_loc_dtor(tsk_object_t * self) -{ - trtp_rtcp_sdes_item_loc_t *item = self; - if(item){ - // deinit self - TSK_FREE(item->loc); - } - - return self; -} -static const tsk_object_def_t trtp_rtcp_sdes_item_loc_def_s = -{ - sizeof(trtp_rtcp_sdes_item_loc_t), - trtp_rtcp_sdes_item_loc_ctor, - trtp_rtcp_sdes_item_loc_dtor, - tsk_null, -}; -const tsk_object_def_t *trtp_rtcp_sdes_item_loc_def_t = &trtp_rtcp_sdes_item_loc_def_s; - -/* RFC 3550 6.5.6 TOOL: Application or Tool Name SDES Item - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | TOOL=6 | length |name/version of source appl. ... - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -*/ -trtp_rtcp_sdes_item_tool_t* trtp_rtcp_sdes_item_tool_create_null() -{ - return tsk_object_new(trtp_rtcp_sdes_item_tool_def_t); -} - -trtp_rtcp_sdes_item_tool_t* trtp_rtcp_sdes_item_tool_create(const char * tool) -{ - trtp_rtcp_sdes_item_tool_t* item; - if((item = trtp_rtcp_sdes_item_tool_create_null())){ - item->tool = tsk_strdup(tool); - } - return item; -} - -tsk_size_t trtp_rtcp_sdes_item_tool_get_size(trtp_rtcp_sdes_item_tool_t* self) -{ - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - return TRTP_RTCP_SDES_HEADER_SIZE + tsk_strlen(self->tool); -} - -static tsk_object_t* trtp_rtcp_sdes_item_tool_ctor(tsk_object_t * self, va_list * app) -{ - trtp_rtcp_sdes_item_tool_t *item = self; - if(item){ - } - return self; -} -static tsk_object_t* trtp_rtcp_sdes_item_tool_dtor(tsk_object_t * self) -{ - trtp_rtcp_sdes_item_tool_t *item = self; - if(item){ - // deinit self - TSK_FREE(item->tool); - } - - return self; -} -static const tsk_object_def_t trtp_rtcp_sdes_item_tool_def_s = -{ - sizeof(trtp_rtcp_sdes_item_tool_t), - trtp_rtcp_sdes_item_tool_ctor, - trtp_rtcp_sdes_item_tool_dtor, - tsk_null, -}; -const tsk_object_def_t *trtp_rtcp_sdes_item_tool_def_t = &trtp_rtcp_sdes_item_tool_def_s; - -/* RFC 3550 6.5.7 NOTE: Notice/Status SDES Item - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | NOTE=7 | length | note about the source ... - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -*/ -trtp_rtcp_sdes_item_note_t* trtp_rtcp_sdes_item_note_create_null() -{ - return tsk_object_new(trtp_rtcp_sdes_item_note_def_t); -} - -trtp_rtcp_sdes_item_note_t* trtp_rtcp_sdes_item_note_create(const char* note) -{ - trtp_rtcp_sdes_item_note_t* item; - if((item = trtp_rtcp_sdes_item_note_create_null())){ - item->note = tsk_strdup(note); - } - return item; -} - -tsk_size_t trtp_rtcp_sdes_item_note_get_size(trtp_rtcp_sdes_item_note_t* self) -{ - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - return TRTP_RTCP_SDES_HEADER_SIZE + tsk_strlen(self->note); -} - -static tsk_object_t* trtp_rtcp_sdes_item_note_ctor(tsk_object_t * self, va_list * app) -{ - trtp_rtcp_sdes_item_note_t *item = self; - if(item){ - } - return self; -} -static tsk_object_t* trtp_rtcp_sdes_item_note_dtor(tsk_object_t * self) -{ - trtp_rtcp_sdes_item_note_t *item = self; - if(item){ - // deinit self - TSK_FREE(item->note); - } - - return self; -} -static const tsk_object_def_t trtp_rtcp_sdes_item_note_def_s = -{ - sizeof(trtp_rtcp_sdes_item_note_t), - trtp_rtcp_sdes_item_note_ctor, - trtp_rtcp_sdes_item_note_dtor, - tsk_null, -}; -const tsk_object_def_t *trtp_rtcp_sdes_item_note_def_t = &trtp_rtcp_sdes_item_note_def_s; - -/* RFC 3550 6.5.8 PRIV: Private Extensions SDES Item - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | PRIV=8 | length | prefix length |prefix string... - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - ... | value string ... - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -*/ -trtp_rtcp_sdes_item_priv_t* trtp_rtcp_sdes_item_priv_create_null() -{ - return tsk_object_new(trtp_rtcp_sdes_item_priv_def_t); -} - -trtp_rtcp_sdes_item_priv_t* trtp_rtcp_sdes_item_priv_create(const void* data, tsk_size_t size) -{ - trtp_rtcp_sdes_item_priv_t* item; - if((item = trtp_rtcp_sdes_item_priv_create_null())){ - item->priv = tsk_buffer_create(data, size); - } - return item; -} - -tsk_size_t trtp_rtcp_sdes_item_priv_get_size(trtp_rtcp_sdes_item_priv_t* self) -{ - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - return self->priv ? TRTP_RTCP_SDES_HEADER_SIZE + self->priv->size : TRTP_RTCP_SDES_HEADER_SIZE; -} - -static tsk_object_t* trtp_rtcp_sdes_item_priv_ctor(tsk_object_t * self, va_list * app) -{ - trtp_rtcp_sdes_item_priv_t *item = self; - if(item){ - } - return self; -} -static tsk_object_t* trtp_rtcp_sdes_item_priv_dtor(tsk_object_t * self) -{ - trtp_rtcp_sdes_item_priv_t *item = self; - if(item){ - // deinit self - TSK_OBJECT_SAFE_FREE(item->priv); - } - - return self; -} -static const tsk_object_def_t trtp_rtcp_sdes_item_priv_def_s = -{ - sizeof(trtp_rtcp_sdes_item_priv_t), - trtp_rtcp_sdes_item_priv_ctor, - trtp_rtcp_sdes_item_priv_dtor, - tsk_null, -}; -const tsk_object_def_t *trtp_rtcp_sdes_item_priv_def_t = &trtp_rtcp_sdes_item_priv_def_s; diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_session.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_session.c index c1b489ef..9efece1c 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_session.c +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_session.c @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -27,3 +27,1435 @@ */ #include "tinyrtp/rtcp/trtp_rtcp_session.h" +#include "tinyrtp/rtcp/trtp_rtcp_packet.h" +#include "tinyrtp/rtcp/trtp_rtcp_header.h" +#include "tinyrtp/rtcp/trtp_rtcp_report_rr.h" +#include "tinyrtp/rtcp/trtp_rtcp_report_sr.h" +#include "tinyrtp/rtcp/trtp_rtcp_report_sdes.h" +#include "tinyrtp/rtcp/trtp_rtcp_report_bye.h" +#include "tinyrtp/rtcp/trtp_rtcp_report_fb.h" +#include "tinyrtp/rtp/trtp_rtp_packet.h" + +#include "tnet_utils.h" + +#include "tsk_string.h" +#include "tsk_md5.h" +#include "tsk_list.h" +#include "tsk_time.h" +#include "tsk_timer.h" +#include "tsk_safeobj.h" +#include "tsk_memory.h" +#include "tsk_debug.h" + +#ifdef _MSC_VER +static double drand48() { return (((double)rand()) / RAND_MAX); } +static void srand48(long sv) { srand((unsigned int) sv); } +#endif + +#define RTCP_BW (160 * 50) // FIXME: default bandwidth (octet/second) +#define CODEC_RATE 8000 // FIXME +#define RTP_SEQ_MOD (1 << 16) +#define MAX_DROPOUT 3000 +#define MAX_MISORDER 100 +#define MIN_SEQUENTIAL 2 + +typedef double time_tp; +typedef void* packet_; + +typedef enum event_ +{ + EVENT_BYE, + EVENT_REPORT, + EVENT_RTP +} +event_; + +typedef enum PacketType_ +{ + PACKET_RTCP_REPORT, + PACKET_BYE, + PACKET_RTP, +} +PacketType_; + +#define TypeOfEvent(e) (e) + +#define TRTP_RTCP_SOURCE(self) ((trtp_rtcp_source_t*)self) + +typedef struct trtp_rtcp_source_s +{ + TSK_DECLARE_OBJECT; + + uint32_t ssrc; /* source's ssrc */ + uint16_t max_seq; /* highest seq. number seen */ + uint32_t cycles; /* shifted count of seq. number cycles */ + uint32_t base_seq; /* base seq number */ + uint32_t bad_seq; /* last 'bad' seq number + 1 */ + uint32_t probation; /* sequ. packets till source is valid */ + uint32_t received; /* packets received */ + uint32_t expected_prior; /* packet expected at last interval */ + uint32_t received_prior; /* packet received at last interval */ + uint32_t transit; /* relative trans time for prev pkt */ + double jitter; /* estimated jitter */ + + uint32_t base_ts; /* base timestamp */ + uint32_t max_ts; /* highest timestamp number seen */ + uint32_t rate; /* codec sampling rate */ + + uint32_t ntp_msw; /* last received NTP timestamp from RTCP sender */ + uint32_t ntp_lsw; /* last received NTP timestamp from RTCP sender */ + uint64_t dlsr; /* delay since last SR */ +} +trtp_rtcp_source_t; +typedef tsk_list_t trtp_rtcp_sources_L_t; /**< List of @ref trtp_rtcp_header_t elements */ + +static tsk_object_t* trtp_rtcp_source_ctor(tsk_object_t * self, va_list * app) +{ + trtp_rtcp_source_t *source = self; + if(source){ + } + return self; +} +static tsk_object_t* trtp_rtcp_source_dtor(tsk_object_t * self) +{ + trtp_rtcp_source_t *source = self; + if(source){ + } + return self; +} +static const tsk_object_def_t trtp_rtcp_source_def_s = +{ + sizeof(trtp_rtcp_source_t), + trtp_rtcp_source_ctor, + trtp_rtcp_source_dtor, + tsk_null, +}; +const tsk_object_def_t *trtp_rtcp_source_def_t = &trtp_rtcp_source_def_s; + +static int _trtp_rtcp_source_init_seq(trtp_rtcp_source_t* self, uint16_t seq, uint32_t ts); +static tsk_bool_t _trtp_rtcp_source_update_seq(trtp_rtcp_source_t* self, uint16_t seq, uint32_t ts); + +static int __pred_find_source_by_ssrc(const tsk_list_item_t *item, const void *pssrc) +{ + if(item && item->data){ + trtp_rtcp_source_t *source = item->data; + return source->ssrc - *((uint32_t*)pssrc); + } + return -1; +} + +static trtp_rtcp_source_t* _trtp_rtcp_source_create(uint32_t ssrc, uint16_t seq, uint32_t ts) +{ + trtp_rtcp_source_t* source; + if(!(source = tsk_object_new(trtp_rtcp_source_def_t))){ + TSK_DEBUG_ERROR("Failed to create source object"); + return tsk_null; + } + + _trtp_rtcp_source_init_seq(source, seq, ts); + source->ssrc = ssrc; + source->max_seq = seq - 1; + source->probation = MIN_SEQUENTIAL; + source->rate = CODEC_RATE;//FIXME + + return source; +} + +static int _trtp_rtcp_source_init_seq(trtp_rtcp_source_t* self, uint16_t seq, uint32_t ts) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + self->base_seq = seq; + self->max_seq = seq; + self->bad_seq = RTP_SEQ_MOD + 1; /* so seq == bad_seq is false */ + self->cycles = 0; + self->received = 0; + self->received_prior = 0; + self->expected_prior = 0; + self->base_ts = ts; + self->max_ts = ts; + return 0; +} + +static tsk_bool_t _trtp_rtcp_source_update_seq(trtp_rtcp_source_t* self, uint16_t seq, uint32_t ts) +{ + uint16_t udelta; + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_false; + } + + udelta = seq - self->max_seq; + + /* + * Source is not valid until MIN_SEQUENTIAL packets with + * sequential sequence numbers have been received. + */ + if (self->probation) { + /* packet is in sequence */ + if (seq == self->max_seq + 1) { + self->probation--; + self->max_seq = seq; + self->max_ts = ts; + if (self->probation == 0) { + _trtp_rtcp_source_init_seq(self, seq, ts); + self->received++; + return tsk_true; + } + } else { + self->probation = MIN_SEQUENTIAL - 1; + self->max_seq = seq; + self->max_ts = ts; + } + return tsk_false; + } else if (udelta < MAX_DROPOUT) { + /* in order, with permissible gap */ + if (seq < self->max_seq) { + /* + * Sequence number wrapped - count another 64K cycle. + */ + self->cycles += RTP_SEQ_MOD; + } + self->max_seq = seq; + self->max_ts = ts; + } else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) { + /* the sequence number made a very large jump */ + if (seq == self->bad_seq) { + /* + * Two sequential packets -- assume that the other side + * restarted without telling us so just re-sync + * (i.e., pretend this was the first packet). + */ + _trtp_rtcp_source_init_seq(self, seq, ts); + } + else { + self->bad_seq = (seq + 1) & (RTP_SEQ_MOD-1); + return tsk_false; + } + } else { + /* duplicate or reordered packet */ + } + self->received++; + return tsk_true; +} + +static tsk_bool_t _trtp_rtcp_source_is_probed(const trtp_rtcp_source_t* self) +{ + return (self && self->probation == 0); +} + + + + + + + +typedef time_tp (*tc_f)(); +static time_tp _trtp_rtcp_session_tc() { return (time_tp)tsk_time_now(); } + +typedef struct trtp_rtcp_session_s +{ + TSK_DECLARE_OBJECT; + + tnet_fd_t local_fd; + const struct sockaddr * remote_addr; + + const void* callback_data; + trtp_rtcp_cb_f callback; + + struct{ + tsk_bool_t started; + tsk_timer_id_t id_report; + tsk_timer_id_t id_bye; + } timer; + + trtp_rtcp_source_t* source_local; /**< local source */ + trtp_rtcp_report_sdes_t* sdes; + uint64_t time_start; /**< Start time in millis (NOT in NTP unit yet) */ + + // + uint8_t fir_seqnr; + // + + // + tsk_md5string_t cname; + tsk_bool_t is_cname_defined; + uint32_t packets_count; + uint32_t octets_count; + // + + // + time_tp tp; /**< the last time an RTCP packet was transmitted; */ + tc_f tc; /**< the current time */ + time_tp tn; /**< the next scheduled transmission time of an RTCP packet */ + int32_t pmembers; /**< the estimated number of session members at the time tn was last recomputed */ + int32_t members; /**< the most current estimate for the number of session members */ + int32_t senders; /**< the most current estimate for the number of senders in the session */ + double rtcp_bw; /**< The target RTCP bandwidth, i.e., the total bandwidth + that will be used for RTCP packets by all members of this session, + in octets per second. This will be a specified fraction of the + "session bandwidth" parameter supplied to the application at + startup*/ + tsk_bool_t we_sent; /**< Flag that is true if the application has sent data since the 2nd previous RTCP report was transmitted */ + double avg_rtcp_size; /**< The average compound RTCP packet size, in octets, + over all RTCP packets sent and received by this participant. The + size includes lower-layer transport and network protocol headers + (e.g., UDP and IP) as explained in Section 6.2*/ + tsk_bool_t initial; /**< Flag that is true if the application has not yet sent an RTCP packet */ + // + + trtp_rtcp_sources_L_t *sources; + + TSK_DECLARE_SAFEOBJ; + +#if HAVE_SRTP + struct{ + const srtp_t* session; + } srtp; +#endif +} +trtp_rtcp_session_t; + +static tsk_object_t* trtp_rtcp_session_ctor(tsk_object_t * self, va_list * app) +{ + trtp_rtcp_session_t *session = self; + if(session){ + session->sources = tsk_list_create(); + session->timer.id_report = TSK_INVALID_TIMER_ID; + session->timer.id_bye = TSK_INVALID_TIMER_ID; + session->tc = _trtp_rtcp_session_tc; + tsk_safeobj_init(session); + + tsk_timer_mgr_global_ref(); + } + return self; +} +static tsk_object_t* trtp_rtcp_session_dtor(tsk_object_t * self) +{ + trtp_rtcp_session_t *session = self; + if(session){ + trtp_rtcp_session_stop(session); + + TSK_OBJECT_SAFE_FREE(session->sources); + TSK_OBJECT_SAFE_FREE(session->source_local); + TSK_OBJECT_SAFE_FREE(session->sdes); + + tsk_safeobj_deinit(session); + + tsk_timer_mgr_global_unref(); + } + return self; +} +static const tsk_object_def_t trtp_rtcp_session_def_s = +{ + sizeof(trtp_rtcp_session_t), + trtp_rtcp_session_ctor, + trtp_rtcp_session_dtor, + tsk_null, +}; +const tsk_object_def_t *trtp_rtcp_session_def_t = &trtp_rtcp_session_def_s; + + +static void _trtp_rtcp_session_set_cname(trtp_rtcp_session_t* self, const void* random_data, tsk_size_t size); +static tsk_bool_t _trtp_rtcp_session_have_source(trtp_rtcp_session_t* self, uint32_t ssrc); +static trtp_rtcp_source_t* _trtp_rtcp_session_find_source(trtp_rtcp_session_t* self, uint32_t ssrc); +static trtp_rtcp_source_t* _trtp_rtcp_session_find_or_add_source(trtp_rtcp_session_t* self, uint32_t ssrc, uint16_t seq_if_add, uint32_t ts_id_add); +static int _trtp_rtcp_session_add_source(trtp_rtcp_session_t* self, trtp_rtcp_source_t* source); +static int _trtp_rtcp_session_add_source_2(trtp_rtcp_session_t* self, uint32_t ssrc, uint16_t seq, uint32_t ts, tsk_bool_t *added); +static int _trtp_rtcp_session_remove_source(trtp_rtcp_session_t* self, uint32_t ssrc, tsk_bool_t *removed); +static tsk_size_t _trtp_rtcp_session_send_pkt(trtp_rtcp_session_t* self, trtp_rtcp_packet_t* pkt); +static int _trtp_rtcp_session_timer_callback(const void* arg, tsk_timer_id_t timer_id); + +static void Schedule(trtp_rtcp_session_t* session, double tn, event_ e); +static void OnReceive(trtp_rtcp_session_t* session, const packet_ p, event_ e, tsk_size_t ReceivedPacketSize); +static void OnExpire(trtp_rtcp_session_t* session, event_ e); +static void SendBYEPacket(trtp_rtcp_session_t* session, event_ e); + +trtp_rtcp_session_t* trtp_rtcp_session_create(uint32_t ssrc) +{ + trtp_rtcp_session_t* session; + + if(!(session = tsk_object_new(trtp_rtcp_session_def_t))){ + TSK_DEBUG_ERROR("Failed to create new session object"); + return tsk_null; + } + + // RFC 3550 - 6.3.2 Initialization + if(!(session->source_local = _trtp_rtcp_source_create(ssrc, 0, 0))){ + TSK_DEBUG_ERROR("Failed to create new local source"); + TSK_OBJECT_SAFE_FREE(session); + goto bail; + } + _trtp_rtcp_session_add_source(session, session->source_local); + session->initial = tsk_true; + session->we_sent = tsk_false; + session->senders = 1; + session->members = 1; + session->rtcp_bw = RTCP_BW;//FIXME: as parameter from the code, Also added possiblities to update this value + +bail: + return session; +} + +int trtp_rtcp_session_set_callback(trtp_rtcp_session_t* self, trtp_rtcp_cb_f callback, const void* callback_data) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + tsk_safeobj_lock(self); + self->callback = callback; + self->callback_data = callback_data; + tsk_safeobj_unlock(self); + return 0; +} + +#if HAVE_SRTP +int trtp_rtcp_session_set_srtp_sess(trtp_rtcp_session_t* self, const srtp_t* session) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + tsk_safeobj_lock(self); + self->srtp.session = session; + tsk_safeobj_unlock(self); + + return 0; +} +#endif + +int trtp_rtcp_session_start(trtp_rtcp_session_t* self, tnet_fd_t local_fd, const struct sockaddr * remote_addr) +{ + int ret; + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + if(self->timer.started){ + TSK_DEBUG_WARN("Already started"); + return 0; + } + + // start global timer manager + if((ret = tsk_timer_mgr_global_start())){ + TSK_DEBUG_ERROR("Failed to start timer"); + return ret; + } + self->timer.started = tsk_true; + + self->local_fd = local_fd; + self->remote_addr = remote_addr; + + // Send Initial RR (mandatory) + Schedule(self, 0., EVENT_REPORT); + + // set start time + self->time_start = tsk_time_now(); + + return ret; +} + +int trtp_rtcp_session_stop(trtp_rtcp_session_t* self) +{ + int ret = 0; + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + // send BYE synchronous way + SendBYEPacket(self, EVENT_REPORT); + + if(self->timer.started){ + // this is a global timer shared by many components -> stopping it won't remove + // all scheduled items as it could continue running if still used + tsk_safeobj_lock(self); // must + if(TSK_TIMER_ID_IS_VALID(self->timer.id_bye)){ + tsk_timer_mgr_global_cancel(self->timer.id_bye); + self->timer.id_bye = TSK_INVALID_TIMER_ID; + } + if(TSK_TIMER_ID_IS_VALID(self->timer.id_report)){ + tsk_timer_mgr_global_cancel(self->timer.id_report); + self->timer.id_report = TSK_INVALID_TIMER_ID; + } + tsk_safeobj_unlock(self); + ret = tsk_timer_mgr_global_stop(); + self->timer.started = tsk_false; + } + + return ret; +} + +int trtp_rtcp_session_process_rtp_out(trtp_rtcp_session_t* self, const trtp_rtp_packet_t* packet_rtp, tsk_size_t size) +{ + int ret = 0; + + if(!self || !packet_rtp || !packet_rtp->header){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if(!self->timer.started){ + TSK_DEBUG_ERROR("Not started"); + return -2; + } + + tsk_safeobj_lock(self); + + // initialize CNAME if not already done + if(!self->is_cname_defined){ + _trtp_rtcp_session_set_cname(self, packet_rtp->payload.data, packet_rtp->payload.size); + } + + // create local source if not already done + // first destroy it if the ssrc don't match + if(self->source_local && self->source_local->ssrc != packet_rtp->header->ssrc){ + tsk_bool_t removed = tsk_false; + // local ssrc has changed: sould never happen ...but who know? + // remove the source + TSK_DEBUG_WARN("Not expected to be called"); + _trtp_rtcp_session_remove_source(self, self->source_local->ssrc, &removed); + TSK_OBJECT_SAFE_FREE(self->source_local); + TSK_OBJECT_SAFE_FREE(self->sdes); + self->packets_count = 0; + self->octets_count = 0; + if(removed){ + --self->senders; + --self->members; + } + } + if(!self->source_local){ + if(!(self->source_local = _trtp_rtcp_source_create(packet_rtp->header->ssrc, packet_rtp->header->seq_num, packet_rtp->header->timestamp))){ + TSK_DEBUG_ERROR("Failed to create new local source"); + } + // add the source (refresh the number of senders, ...) + _trtp_rtcp_session_add_source(self, self->source_local); + // 'members' and 'senders' were already initialized in the constructor + } + + if(!self->we_sent){ + self->we_sent = tsk_true; + } + + ++self->packets_count; + self->octets_count += size; + + tsk_safeobj_unlock(self); + + return ret; +} + +int trtp_rtcp_session_process_rtp_in(trtp_rtcp_session_t* self, const trtp_rtp_packet_t* packet_rtp, tsk_size_t size) +{ + int ret = 0; + trtp_rtcp_source_t* source; + + if(!self || !packet_rtp || !packet_rtp->header){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if(!self->timer.started){ + TSK_DEBUG_ERROR("Not started"); + return -2; + } + + tsk_safeobj_lock(self); + OnReceive(self, (const packet_)packet_rtp, EVENT_RTP, size); + if((source = _trtp_rtcp_session_find_source(self, packet_rtp->header->ssrc))){ + if(_trtp_rtcp_source_update_seq(source, packet_rtp->header->seq_num, packet_rtp->header->timestamp)){ + // RFC 3550 A.8 Estimating the Interarrival Jitter + uint32_t expected = (source->cycles + source->max_seq) - source->base_seq + 1; + double arrival = (((double)(source->max_ts - source->base_ts) / (double)source->rate) * 1000); + int32_t transit = (int32_t)arrival - packet_rtp->header->timestamp; + int32_t d = (transit - source->transit); + if(d < 0) d = -d; + source->transit = transit; + source->jitter += (1./16.) * ((double)d - source->jitter); + } + TSK_OBJECT_SAFE_FREE(source); + } + + tsk_safeobj_unlock(self); + + return ret; +} + +int trtp_rtcp_session_process_rtcp_in(trtp_rtcp_session_t* self, const void* buffer, tsk_size_t size) +{ + int ret = 0; + trtp_rtcp_packet_t* packet_rtcp = tsk_null; + + if(!self || !buffer || size < TRTP_RTCP_HEADER_SIZE){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if(!self->timer.started){ + TSK_DEBUG_ERROR("Not started"); + return -2; + } + + // derialize the RTCP packet for processing + packet_rtcp = trtp_rtcp_packet_deserialize(buffer, size); + if(packet_rtcp){ + tsk_safeobj_lock(self); + OnReceive(self, + (const packet_)packet_rtcp, + (packet_rtcp->header->type == trtp_rtcp_packet_type_bye) ? EVENT_BYE : EVENT_REPORT, + size); + if(packet_rtcp->header->type == trtp_rtcp_packet_type_sr){ + trtp_rtcp_source_t* source; + const trtp_rtcp_report_sr_t* sr = (const trtp_rtcp_report_sr_t*)packet_rtcp; + if((source = _trtp_rtcp_session_find_source(self, sr->ssrc))){ + source->ntp_lsw = sr->sender_info.ntp_lsw; + source->ntp_msw = sr->sender_info.ntp_msw; + source->dlsr = tsk_time_now(); + TSK_OBJECT_SAFE_FREE(source); + } + } + tsk_safeobj_unlock(self); // must be before callback() + + if(self->callback){ + ret = self->callback(self->callback_data, packet_rtcp); + } + TSK_OBJECT_SAFE_FREE(packet_rtcp); + } + + + return ret; +} + +int trtp_rtcp_session_signal_pkt_loss(trtp_rtcp_session_t* self, uint32_t ssrc_media, const uint16_t* seq_nums, tsk_size_t count) +{ + trtp_rtcp_report_rr_t* rr; + if(!self || !self->source_local || !seq_nums || !count){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if((rr = trtp_rtcp_report_rr_create_2(self->source_local->ssrc))){ + trtp_rtcp_report_rtpfb_t* rtpfb; + if((rtpfb = trtp_rtcp_report_rtpfb_create_nack(self->source_local->ssrc, ssrc_media, seq_nums, count))){ + trtp_rtcp_packet_add_packet((trtp_rtcp_packet_t*)rr, (trtp_rtcp_packet_t*)rtpfb, tsk_false); + _trtp_rtcp_session_send_pkt(self, (trtp_rtcp_packet_t*)rr); + TSK_OBJECT_SAFE_FREE(rtpfb); + } + TSK_OBJECT_SAFE_FREE(rr); + } + return 0; +} + +// Frame corrupted means the prediction chain is broken -> Send FIR +int trtp_rtcp_session_signal_frame_corrupted(trtp_rtcp_session_t* self, uint32_t ssrc_media) +{ + trtp_rtcp_report_rr_t* rr; + if(!self || !self->source_local){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if((rr = trtp_rtcp_report_rr_create_2(self->source_local->ssrc))){ + trtp_rtcp_report_psfb_t* psfb_fir = trtp_rtcp_report_psfb_create_fir(self->fir_seqnr++, self->source_local->ssrc, ssrc_media); + if(psfb_fir){ + trtp_rtcp_packet_add_packet((trtp_rtcp_packet_t*)rr, (trtp_rtcp_packet_t*)psfb_fir, tsk_false); + _trtp_rtcp_session_send_pkt(self, (trtp_rtcp_packet_t*)rr); + TSK_OBJECT_SAFE_FREE(psfb_fir); + } + TSK_OBJECT_SAFE_FREE(rr); + } + return 0; +} + +// for now send just a FIR +int trtp_rtcp_session_signal_jb_error(struct trtp_rtcp_session_s* self, uint32_t ssrc_media) +{ + return trtp_rtcp_session_signal_frame_corrupted(self, ssrc_media); +} + +static tsk_bool_t _trtp_rtcp_session_have_source(trtp_rtcp_session_t* self, uint32_t ssrc) +{ + tsk_list_item_t* item; + tsk_list_foreach(item, self->sources){ + if(TRTP_RTCP_SOURCE(item->data)->ssrc == ssrc){ + return tsk_true; + } + } + return tsk_false; +} + +// find source by ssrc +// the caller must release the returned object +static trtp_rtcp_source_t* _trtp_rtcp_session_find_source(trtp_rtcp_session_t* self, uint32_t ssrc) +{ + tsk_list_item_t* item; + tsk_list_foreach(item, self->sources){ + if(TRTP_RTCP_SOURCE(item->data)->ssrc == ssrc){ + return tsk_object_ref(item->data); + } + } + return tsk_null; +} + +// find or add source by ssrc +// the caller must release the returned object +static trtp_rtcp_source_t* _trtp_rtcp_session_find_or_add_source(trtp_rtcp_session_t* self, uint32_t ssrc, uint16_t seq_if_add, uint32_t ts_id_add) +{ + trtp_rtcp_source_t* source; + if((source = _trtp_rtcp_session_find_source(self, ssrc))){ + return source; + } + + if((source = _trtp_rtcp_source_create(ssrc, seq_if_add, ts_id_add))){ + if((_trtp_rtcp_session_add_source(self, source)) != 0){ + TSK_DEBUG_ERROR("Failed to add source"); + TSK_OBJECT_SAFE_FREE(source); + return tsk_null; + } + return tsk_object_ref(source); + } + return tsk_null; +} + +int _trtp_rtcp_session_add_source(trtp_rtcp_session_t* self, trtp_rtcp_source_t* source) +{ + if(!self || !source){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + tsk_list_lock(self->sources); + source = tsk_object_ref(source); + tsk_list_push_back_data(self->sources, (void**)&source); + tsk_list_unlock(self->sources); + + return 0; +} + +// adds a source if doesn't exist +static int _trtp_rtcp_session_add_source_2(trtp_rtcp_session_t* self, uint32_t ssrc, uint16_t seq, uint32_t ts, tsk_bool_t *added) +{ + int ret = 0; + tsk_list_item_t* item; + trtp_rtcp_source_t* source; + + tsk_list_lock(self->sources); + tsk_list_foreach(item, self->sources){ + if(TRTP_RTCP_SOURCE(item->data)->ssrc == ssrc){ + tsk_list_unlock(self->sources); + *added = tsk_false; + return 0; + } + } + + tsk_list_unlock(self->sources); + + if((source = _trtp_rtcp_source_create(ssrc, seq, ts))){ + ret = _trtp_rtcp_session_add_source(self, source); + } + + TSK_OBJECT_SAFE_FREE(source); + + *added = tsk_true; + return ret; +} + +int _trtp_rtcp_session_remove_source(trtp_rtcp_session_t* self, uint32_t ssrc, tsk_bool_t *removed) +{ + *removed = tsk_false; + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + tsk_list_lock(self->sources); + if((*removed = tsk_list_remove_item_by_pred(self->sources, __pred_find_source_by_ssrc, &ssrc)) == tsk_true){ + // ... + } + tsk_list_unlock(self->sources); + return 0; +} + +static tsk_size_t _trtp_rtcp_session_send_pkt(trtp_rtcp_session_t* self, trtp_rtcp_packet_t* pkt) +{ + tsk_size_t ret = 0; + tsk_size_t __num_bytes_pad = 0; + tsk_buffer_t* buffer; + + if(!self->remote_addr || self->local_fd <= 0){ + TSK_DEBUG_ERROR("Invalid network settings"); + return 0; + } + +#if HAVE_SRTP + if(self->srtp.session) __num_bytes_pad = (SRTP_MAX_TRAILER_LEN + 0x4); +#endif + + if(!self->is_cname_defined){ // should not be true + uint64_t now = (tsk_time_now() ^ rand()); // not really random...but we hope it'll never called + _trtp_rtcp_session_set_cname(self, &now, sizeof(now)); + } + + // SDES + if(!self->sdes && (self->sdes = trtp_rtcp_report_sdes_create_null())){ + trtp_rtcp_sdes_chunck_t* chunck = trtp_rtcp_sdes_chunck_create(self->source_local->ssrc); + if(chunck){ + static const char* _name = "test@doubango.org"; + trtp_rtcp_sdes_chunck_add_item(chunck, trtp_rtcp_sdes_item_type_cname, self->cname, TSK_MD5_STRING_SIZE); + trtp_rtcp_sdes_chunck_add_item(chunck, trtp_rtcp_sdes_item_type_name, _name, tsk_strlen(_name)); + trtp_rtcp_report_sdes_add_chunck(self->sdes, chunck); + TSK_OBJECT_SAFE_FREE(chunck); + } + } + if(self->sdes){ + trtp_rtcp_packet_add_packet(pkt, (trtp_rtcp_packet_t*)self->sdes, tsk_true); + } + + if((buffer = trtp_rtcp_packet_serialize(pkt, __num_bytes_pad))){ + void* data = buffer->data; + int size = buffer->size; +#if HAVE_SRTP + if(self->srtp.session){ + if(srtp_protect_rtcp(((srtp_t)*self->srtp.session), data, &size) != err_status_ok){ + TSK_DEBUG_ERROR("srtp_protect_rtcp() failed"); + } + } +#endif + if(tnet_sockfd_sendto(self->local_fd, self->remote_addr, data, size) > 0){ + ret = size; + } + TSK_OBJECT_SAFE_FREE(buffer); + } + + return ret; +} + +// sets cname from rtp payload (sound or video) which is random xor'ed with some rand values +static void _trtp_rtcp_session_set_cname(trtp_rtcp_session_t* self, const void* random_data, tsk_size_t size) +{ + tsk_size_t i; + uint8_t _cname[16] = { 'd', 'o', 'u', 'b', 'a', 'n', 'g', 'o', 'd', 'o', 'u', 'b', 'a', 'n', 'g', 'o' }; + + if(random_data && size){ + memcpy(_cname, random_data, TSK_MIN(sizeof(_cname), size)); + } + + for(i = 0; i < sizeof(_cname); i+= 4){ + *((uint32_t*)&_cname[i]) ^= rand(); + } + + tsk_md5compute(_cname, sizeof(_cname), &self->cname); + self->is_cname_defined = tsk_true; +} + +static int _trtp_rtcp_session_timer_callback(const void* arg, tsk_timer_id_t timer_id) +{ + trtp_rtcp_session_t* session = (trtp_rtcp_session_t*)arg; + tsk_safeobj_lock(session); // must + if(session->timer.id_bye == timer_id){ + session->timer.id_bye = TSK_INVALID_TIMER_ID; + OnExpire(session, EVENT_BYE); + } + else if(session->timer.id_report == timer_id){ + session->timer.id_report = TSK_INVALID_TIMER_ID; + OnExpire(session, EVENT_REPORT); + } + tsk_safeobj_unlock(session); + return 0; +} + +static tsk_bool_t IsRtpPacket(const packet_ p) +{ + return (TSK_OBJECT_HEADER(p)->base == trtp_rtp_packet_def_t); +} + +static PacketType_ PacketType(const packet_ p) +{ + if(IsRtpPacket(p)){ + return PACKET_RTP; + } + else{ + switch(((const trtp_rtcp_packet_t*)p)->header->type){ + case trtp_rtcp_packet_type_bye: return PACKET_BYE; + default: return PACKET_RTCP_REPORT; + } + } +} + +// Returns true if the packet is from a member or not +// also checks all csrc +static tsk_bool_t NewMember(trtp_rtcp_session_t* session, const packet_ p) +{ + uint32_t ssrc = 0; + if(IsRtpPacket(p)){ + const trtp_rtp_packet_t* packet_rtp = (const trtp_rtp_packet_t*)p; + tsk_size_t i; + for(i = 0; i < packet_rtp->header->csrc_count && i < sizeof(packet_rtp->header->csrc)/sizeof(packet_rtp->header->csrc[0]); ++i){ + if(!(_trtp_rtcp_session_have_source(session, packet_rtp->header->csrc[i]))){ + return tsk_false; + } + } + ssrc = packet_rtp->header->ssrc; + } + else{ + switch(((const trtp_rtcp_packet_t*)p)->header->type){ + case trtp_rtcp_packet_type_rr: ssrc = ((const trtp_rtcp_report_rr_t*)p)->ssrc; break; + case trtp_rtcp_packet_type_sr: ssrc = ((const trtp_rtcp_report_sr_t*)p)->ssrc; break; + case trtp_rtcp_packet_type_bye: + { + tsk_size_t i; + const trtp_rtcp_report_bye_t* bye = (const trtp_rtcp_report_bye_t*)p; + for(i = 0; i < TRTP_RTCP_PACKET(bye)->header->rc; ++i){ + if(!_trtp_rtcp_session_have_source(session, bye->ssrc_list[i])){ + return tsk_false; + } + } + return tsk_true; + } + default: return tsk_false; + } + } + + return !_trtp_rtcp_session_have_source(session, ssrc); +} + +#define NewSender(session, p) NewMember((session), (p)) + +static tsk_size_t AddMemberUsingRTCPPacket(trtp_rtcp_session_t* session, const trtp_rtcp_packet_t* p, tsk_bool_t sender) +{ + trtp_rtcp_packets_L_t* packets = tsk_null; + trtp_rtcp_rblocks_L_t* blocks = tsk_null; + tsk_bool_t added = tsk_false; + tsk_size_t count = 0; + + switch(p->header->type){ + case trtp_rtcp_packet_type_rr: + { + const trtp_rtcp_report_rr_t* rr = (const trtp_rtcp_report_rr_t*)p; + _trtp_rtcp_session_add_source_2(session, ((const trtp_rtcp_report_rr_t*)p)->ssrc, 0, 0, &added); + if(added) ++count; + + packets = rr->packets; + blocks = rr->blocks; + break; + } + case trtp_rtcp_packet_type_sr: + { + const trtp_rtcp_report_sr_t* sr = (const trtp_rtcp_report_sr_t*)p; + _trtp_rtcp_session_add_source_2(session, ((const trtp_rtcp_report_sr_t*)p)->ssrc, 0, 0, &added); + if(added) ++count; + packets = sr->packets; + blocks = sr->blocks; + break; + } + } + + if(!sender){ + if(packets){ + const tsk_list_item_t *item; + tsk_list_foreach(item, packets){ + AddMemberUsingRTCPPacket(session, (const trtp_rtcp_packet_t*)item->data, sender); + } + } + if(blocks){ + const tsk_list_item_t *item; + tsk_list_foreach(item, blocks){ + _trtp_rtcp_session_add_source_2(session, TRTP_RTCP_RBLOCK(item->data)->ssrc, 0, 0, &added); + if(added) ++count; + } + } + } + + return count; +} + +static tsk_size_t AddMember_(trtp_rtcp_session_t* session, const packet_ p, tsk_bool_t sender) +{ + tsk_size_t count = 0; + if(IsRtpPacket(p)){ + const trtp_rtp_packet_t* packet_rtp = (const trtp_rtp_packet_t*)p; + tsk_size_t i; + tsk_bool_t added = tsk_false; + _trtp_rtcp_session_add_source_2(session, packet_rtp->header->ssrc, packet_rtp->header->seq_num, packet_rtp->header->timestamp, &added); + if(added) ++count; + for(i = 0; i < packet_rtp->header->csrc_count && i < sizeof(packet_rtp->header->csrc)/sizeof(packet_rtp->header->csrc[0]); ++i){ + _trtp_rtcp_session_add_source_2(session, packet_rtp->header->csrc[i], 0, 0, &added); + if(added) ++count; + } + } + else{ + count += AddMemberUsingRTCPPacket(session, (const trtp_rtcp_packet_t*) p, sender); + } + return count; +} + +#define AddMember(session, p) AddMember_((session), (p), tsk_false) +#define AddSender(session, p) AddMember_((session), (p), tsk_true) + + +static tsk_size_t RemoveMemberUsingRTCPPacket(trtp_rtcp_session_t* session, const trtp_rtcp_packet_t* p) +{ + trtp_rtcp_packets_L_t* packets = tsk_null; + trtp_rtcp_rblocks_L_t* blocks = tsk_null; + tsk_bool_t removed = tsk_false; + tsk_size_t count = 0; + + switch(p->header->type){ + case trtp_rtcp_packet_type_rr: + { + const trtp_rtcp_report_rr_t* rr = (const trtp_rtcp_report_rr_t*)p; + _trtp_rtcp_session_remove_source(session, ((const trtp_rtcp_report_rr_t*)p)->ssrc, &removed); + if(removed) ++count; + + packets = rr->packets; + blocks = rr->blocks; + break; + } + case trtp_rtcp_packet_type_sr: + { + const trtp_rtcp_report_sr_t* sr = (const trtp_rtcp_report_sr_t*)p; + _trtp_rtcp_session_remove_source(session, ((const trtp_rtcp_report_sr_t*)p)->ssrc, &removed); + if(removed) ++count; + packets = sr->packets; + blocks = sr->blocks; + break; + } + } + + if(packets){ + const tsk_list_item_t *item; + tsk_list_foreach(item, packets){ + RemoveMemberUsingRTCPPacket(session, (const trtp_rtcp_packet_t*)item->data); + } + } + if(blocks){ + const tsk_list_item_t *item; + tsk_list_foreach(item, blocks){ + _trtp_rtcp_session_remove_source(session, TRTP_RTCP_RBLOCK(item->data)->ssrc, &removed); + if(removed) ++count; + } + } + + + return count; +} + +static tsk_size_t RemoveMember(trtp_rtcp_session_t* session, const packet_ p) +{ + tsk_size_t count = 0; + if(IsRtpPacket(p)){ + const trtp_rtp_packet_t* packet_rtp = (const trtp_rtp_packet_t*)p; + tsk_size_t i; + tsk_bool_t removed = tsk_false; + _trtp_rtcp_session_remove_source(session, packet_rtp->header->ssrc, &removed); + if(removed) ++count; + for(i = 0; i < packet_rtp->header->csrc_count && i < sizeof(packet_rtp->header->csrc)/sizeof(packet_rtp->header->csrc[0]); ++i){ + _trtp_rtcp_session_remove_source(session, packet_rtp->header->csrc[i], &removed); + if(removed) ++count; + } + } + else{ + count += RemoveMemberUsingRTCPPacket(session, (const trtp_rtcp_packet_t*) p); + } + return count; +} + +#define RemoveSender(session, p) RemoveMember((session), (p)) + +// Sends BYE in synchronous mode +static void SendBYEPacket(trtp_rtcp_session_t* session, event_ e) +{ + trtp_rtcp_report_bye_t* bye; + tsk_size_t __num_bytes_pad = 0; + + if(!session->remote_addr || session->local_fd <= 0){ + TSK_DEBUG_ERROR("Invalid network settings"); + return; + } + + tsk_safeobj_lock(session); + +#if HAVE_SRTP + if(session->srtp.session) __num_bytes_pad = (SRTP_MAX_TRAILER_LEN + 0x4); +#endif + + if(session->source_local && (bye = trtp_rtcp_report_bye_create_2(session->source_local->ssrc))){ + tsk_buffer_t* buffer; + // serialize and send the packet + if((buffer = trtp_rtcp_packet_serialize((const trtp_rtcp_packet_t*)bye, __num_bytes_pad))){ + void* data = buffer->data; + int size = buffer->size; +#if HAVE_SRTP + if(session->srtp.session){ + if(srtp_protect_rtcp(((srtp_t)*session->srtp.session), data, &size) != err_status_ok){ + TSK_DEBUG_ERROR("srtp_protect_rtcp() failed"); + } + } +#endif + tnet_sockfd_sendto(session->local_fd, session->remote_addr, data, size); + TSK_OBJECT_SAFE_FREE(buffer); + } + TSK_OBJECT_SAFE_FREE(bye); + } + + tsk_safeobj_unlock(session); +} + +// returns sent packet size +static tsk_size_t SendRTCPReport(trtp_rtcp_session_t* session, event_ e) +{ + tsk_size_t ret = 0; + + tsk_safeobj_lock(session); + + if(session->initial){ + // Send Receiver report (manadatory to be the first on) + trtp_rtcp_report_rr_t* rr = trtp_rtcp_report_rr_create_2(session->source_local->ssrc); + if(rr){ + // serialize and send the packet + ret = _trtp_rtcp_session_send_pkt(session, (trtp_rtcp_packet_t*)rr); + TSK_OBJECT_SAFE_FREE(rr); + } + } + else{ + trtp_rtcp_report_sr_t* sr = trtp_rtcp_report_sr_create_null(); + if(sr){ + uint64_t ntp_now = tsk_time_ntp(); + uint64_t time_now = tsk_time_now(); + trtp_rtcp_rblock_t* rblock; + trtp_rtcp_source_t* source; + tsk_list_item_t *item; + tsk_bool_t packet_lost = tsk_false; + + // sender info + sr->ssrc = session->source_local->ssrc; + sr->sender_info.ntp_msw = (ntp_now >> 32); + sr->sender_info.ntp_lsw = (ntp_now & 0xFFFFFFFF); + sr->sender_info.sender_pcount = session->packets_count; + sr->sender_info.sender_ocount = session->octets_count; + { /* rtp_timestamp */ + struct timeval tv; + uint64_t rtp_timestamp = (time_now - session->time_start) * (session->source_local->rate / 1000); + tv.tv_sec = (long)(rtp_timestamp / 1000); + tv.tv_usec = (long)(rtp_timestamp - ((rtp_timestamp / 1000) * 1000)) * 1000; +#if 1 + sr->sender_info.rtp_timestamp = (uint32_t)tsk_time_get_ms(&tv); +#else + sr->sender_info.rtp_timestamp = (uint32_t)tsk_time_get_ntp_ms(&tv); +#endif + } + + // report blocks + tsk_list_foreach(item, session->sources){ + if(!(source = (trtp_rtcp_source_t*)item->data) || !_trtp_rtcp_source_is_probed(source)){ + continue; + } + if((rblock = trtp_rtcp_rblock_create_null())){ + uint32_t expected, expected_interval, received_interval, lost_interval; + + rblock->ssrc = source->ssrc; + // RFC 3550 - A.3 Determining Number of Packets Expected and Lost + expected = (source->cycles + source->max_seq) - source->base_seq + 1; + expected_interval = expected - source->expected_prior; + source->expected_prior = expected; + received_interval = source->received - source->received_prior; + source->received_prior = source->received; + lost_interval = expected_interval - received_interval; + if (expected_interval == 0 || lost_interval <= 0) rblock->fraction = 0; + else rblock->fraction = (lost_interval << 8) / expected_interval; + rblock->cumulative_no_lost = ((expected - source->received)); + if(!packet_lost && rblock->fraction) packet_lost = tsk_true; + + rblock->last_seq = ((source->cycles & 0xFFFF) << 16) | source->max_seq; + rblock->jitter = (uint32_t)source->jitter; + rblock->lsr = ((source->ntp_msw & 0xFFFF) << 16) | ((source->ntp_lsw & 0xFFFF0000) >> 16); + if(source->dlsr){ + rblock->dlsr = (uint32_t)(((time_now - source->dlsr) * 65536) / 1000); // in units of 1/65536 seconds + } + + trtp_rtcp_report_sr_add_block(sr, rblock); + TSK_OBJECT_SAFE_FREE(rblock); + } + } + + // RFC 4885 - 3.1. Compound RTCP Feedback Packets + // The FB message(s) MUST be placed in the compound packet after RR and + // SDES RTCP packets defined in [1]. The ordering with respect to other + // RTCP extensions is not defined. + // RFC 5104 Full Intra Request (FIR) + if(packet_lost){ +#if 0 // Will be managed by the jitter buffer + trtp_rtcp_report_psfb_t* psfb_fir = trtp_rtcp_report_psfb_create_fir(session->fir_seqnr++, session->source_local->ssrc, source->ssrc); + if(psfb_fir){ + trtp_rtcp_packet_add_packet((trtp_rtcp_packet_t*)sr, (trtp_rtcp_packet_t*)psfb_fir, tsk_false); + TSK_OBJECT_SAFE_FREE(psfb_fir); + } + TSK_DEBUG_INFO("RTCP Packet Lost (Sending FIR)"); +#endif + } + + // serialize and send the packet + ret = _trtp_rtcp_session_send_pkt(session, (trtp_rtcp_packet_t*)sr); + TSK_OBJECT_SAFE_FREE(sr); + } + } + + tsk_safeobj_unlock(session); + return ret; +} + +static void Schedule(trtp_rtcp_session_t* session, double tn, event_ e) +{ + tsk_safeobj_lock(session); // must + switch(e){ + case EVENT_BYE: + if(!TSK_TIMER_ID_IS_VALID(session->timer.id_bye)){ + session->timer.id_bye = tsk_timer_mgr_global_schedule((uint64_t)tn, _trtp_rtcp_session_timer_callback, session); + } + break; + case EVENT_REPORT: + if(!TSK_TIMER_ID_IS_VALID(session->timer.id_report)){ + session->timer.id_report = tsk_timer_mgr_global_schedule((uint64_t)tn, _trtp_rtcp_session_timer_callback, session); + } + break; + default: TSK_DEBUG_ERROR("Unexpected code called"); break; + } + tsk_safeobj_unlock(session); +} + +#define Reschedule(session, tn, e) Schedule((session), (tn), (e)) + +static double rtcp_interval(int32_t members, + int32_t senders, + double rtcp_bw, + int32_t we_sent, + double avg_rtcp_size, + tsk_bool_t initial) +{ + /* + * Minimum average time between RTCP packets from this site (in + * seconds). This time prevents the reports from `clumping' when + * sessions are small and the law of large numbers isn't helping + * to smooth out the traffic. It also keeps the report interval + * from becoming ridiculously small during transient outages like + * a network partition. + */ + #define RTCP_MIN_TIME 5. + /* + * Fraction of the RTCP bandwidth to be shared among active + * senders. (This fraction was chosen so that in a typical + * session with one or two active senders, the computed report + * time would be roughly equal to the minimum report time so that + * we don't unnecessarily slow down receiver reports.) The + * receiver fraction must be 1 - the sender fraction. + */ + #define RTCP_SENDER_BW_FRACTION 0.25 + #define RTCP_RCVR_BW_FRACTION (1 - RTCP_SENDER_BW_FRACTION) + /* + /* To compensate for "timer reconsideration" converging to a + * value below the intended average. + */ + #define COMPENSATION (2.71828 - 1.5) + + double t; /* interval */ + double rtcp_min_time = RTCP_MIN_TIME; + int n; /* no. of members for computation */ + + /* + * Very first call at application start-up uses half the min + * delay for quicker notification while still allowing some time + * before reporting for randomization and to learn about other + * sources so the report interval will converge to the correct + * interval more quickly. + */ + if (initial) { + rtcp_min_time /= 2; + } + /* + * Dedicate a fraction of the RTCP bandwidth to senders unless + * the number of senders is large enough that their share is + * more than that fraction. + */ + n = members; + if (senders <= members * RTCP_SENDER_BW_FRACTION) { + if (we_sent) { + rtcp_bw *= RTCP_SENDER_BW_FRACTION; + n = senders; + } else { + rtcp_bw *= RTCP_RCVR_BW_FRACTION; + n -= senders; + } + } + + /* + * The effective number of sites times the average packet size is + * the total number of octets sent when each site sends a report. + * Dividing this by the effective bandwidth gives the time + * interval over which those packets must be sent in order to + * meet the bandwidth target, with a minimum enforced. In that + * time interval we send one report so this time is also our + * average time between reports. + */ + t = avg_rtcp_size * n / rtcp_bw; + if (t < rtcp_min_time) t = rtcp_min_time; + + /* + * To avoid traffic bursts from unintended synchronization with + * other sites, we then pick our actual next report interval as a + * random number uniformly distributed between 0.5*t and 1.5*t. + */ + t = t * (drand48() + 0.5); + t = t / COMPENSATION; + + return (t * 1000); +} + + +static void OnExpire(trtp_rtcp_session_t* session, event_ e) +{ + /* This function is responsible for deciding whether to send an + * RTCP report or BYE packet now, or to reschedule transmission. + * It is also responsible for updating the pmembers, initial, tp, + * and avg_rtcp_size state variables. This function should be + * called upon expiration of the event timer used by Schedule(). + */ + + double t; /* Interval */ + double tn; /* Next transmit time */ + double tc; + + /* In the case of a BYE, we use "timer reconsideration" to + * reschedule the transmission of the BYE if necessary */ + + if (TypeOfEvent(e) == EVENT_BYE) { + t = rtcp_interval(session->members, + session->senders, + session->rtcp_bw, + session->we_sent, + session->avg_rtcp_size, + session->initial); + tn = session->tp + t; + if (tn <= session->tc()) { + SendBYEPacket(session, e); +#if 0 + exit(1); +#endif + } else { +#if 0 + Schedule(session, tn, e); +#else + Schedule(session, 0, e); +#endif + } + + } else if (TypeOfEvent(e) == EVENT_REPORT) { + t = rtcp_interval(session->members, + session->senders, + session->rtcp_bw, + session->we_sent, + session->avg_rtcp_size, + session->initial); + tn = session->tp + t; + if (tn <= (tc = session->tc())) { + tsk_size_t SentPacketSize = SendRTCPReport(session, e); + session->avg_rtcp_size = (1./16.)*SentPacketSize + (15./16.)*(session->avg_rtcp_size); + session->tp = tc; + + /* We must redraw the interval. Don't reuse the + one computed above, since its not actually + distributed the same, as we are conditioned + on it being small enough to cause a packet to + be sent */ + + t = rtcp_interval(session->members, + session->senders, + session->rtcp_bw, + session->we_sent, + session->avg_rtcp_size, + session->initial); +#if 0 + Schedule(session, t+tc, e); +#else + Schedule(session, t, e); +#endif + session->initial = tsk_false; + } else { +#if 0 + Schedule(session, tn, e); +#else + Schedule(session, 0, e); +#endif + } + session->pmembers = session->members; + } +} + +static void OnReceive(trtp_rtcp_session_t* session, const packet_ p, event_ e, tsk_size_t ReceivedPacketSize) +{ + /* What we do depends on whether we have left the group, and are + * waiting to send a BYE (TypeOfEvent(e) == EVENT_BYE) or an RTCP + * report. p represents the packet that was just received. */ + + if (PacketType(p) == PACKET_RTCP_REPORT) { + if (NewMember(session, p) && (TypeOfEvent(e) == EVENT_REPORT)) { + session->members += AddMember(session, p); + } + session->avg_rtcp_size = (1./16.)*ReceivedPacketSize + (15./16.)*(session->avg_rtcp_size); + } else if (PacketType(p) == PACKET_RTP) { +#if 0 + if (NewMember(session, p) && (TypeOfEvent(e) == EVENT_REPORT)) { + session->members += AddMember(session, p); + } + if (NewSender(session, p) && (TypeOfEvent(e) == EVENT_REPORT)) { + tsk_size_t count = AddSender(session, p); + session->senders += count; + session->members += count; + } +#else + if (NewSender(session, p)) { + tsk_size_t count = AddSender(session, p); + session->senders += count; + session->members += count; + } +#endif + } else if (PacketType(p) == PACKET_BYE) { + session->avg_rtcp_size = (1./16.)*ReceivedPacketSize + (15./16.)*(session->avg_rtcp_size); + + if (TypeOfEvent(e) == EVENT_REPORT) { + double tc = session->tc(); + tsk_size_t count = RemoveMember(session, p); + session->senders -= count; + session->members -= count; +#if 0 + if (NewSender(session, p) == tsk_false) { + RemoveSender(p); + session->senders -= 1; + } + if (NewMember(session, p) == tsk_false) { + RemoveMember(p); + session->members -= 1; + } +#endif + + if (session->members < session->pmembers && session->pmembers) { + session->tn = (time_tp)(tc + + (((double) session->members)/(session->pmembers))*(session->tn - tc)); + session->tp = (time_tp)(tc - + (((double) session->members)/(session->pmembers))*(tc - session->tp)); + + /* Reschedule the next report for time tn */ + + Reschedule(session, session->tn, e); + session->pmembers = session->members; + } + + } else if (TypeOfEvent(e) == EVENT_BYE) { + session->members += 1; + } + } +} diff --git a/branches/2.0/doubango/tinyRTP/src/rtp/trtp_rtp_header.c b/branches/2.0/doubango/tinyRTP/src/rtp/trtp_rtp_header.c index 0b3db3e4..fc8714ca 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtp/trtp_rtp_header.c +++ b/branches/2.0/doubango/tinyRTP/src/rtp/trtp_rtp_header.c @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -68,7 +68,7 @@ trtp_rtp_header_t* trtp_rtp_header_create(uint32_t ssrc, uint16_t seq_num, uint3 return header; } -/* guess what is the minimum require size to serialize the header */ +/* guess what is the minimum required size to serialize the header */ tsk_size_t trtp_rtp_header_guess_serialbuff_size(const trtp_rtp_header_t *self) { if(!self){ @@ -207,12 +207,12 @@ trtp_rtp_header_t* trtp_rtp_header_deserialize(const void *data, tsk_size_t size pdata += 2; /* timestamp (32bits) */ - header->timestamp = pdata[0] << 8 | pdata[1]; + header->timestamp = pdata[0] << 24 | pdata[1] << 16 | pdata[2] << 8 | pdata[3]; // skip octets pdata += 4; /* synchronization source (SSRC) identifier (32bits) */ - header->ssrc = pdata[0] << 8 | pdata[1]; + header->ssrc = pdata[0] << 24 | pdata[1] << 16 | pdata[2] << 8 | pdata[3]; // skip octets pdata += 4; diff --git a/branches/2.0/doubango/tinyRTP/src/rtp/trtp_rtp_packet.c b/branches/2.0/doubango/tinyRTP/src/rtp/trtp_rtp_packet.c index 2bd738f6..41c9221f 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtp/trtp_rtp_packet.c +++ b/branches/2.0/doubango/tinyRTP/src/rtp/trtp_rtp_packet.c @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -50,7 +50,7 @@ trtp_rtp_packet_t* trtp_rtp_packet_create(uint32_t ssrc, uint16_t seq_num, uint3 return packet; } -/* guess what is the minimum require size to serialize the header */ +/* guess what is the minimum required size to serialize the packet */ tsk_size_t trtp_rtp_packet_guess_serialbuff_size(const trtp_rtp_packet_t *self) { tsk_size_t size = 0; @@ -108,9 +108,8 @@ tsk_buffer_t* trtp_rtp_packet_serialize(const trtp_rtp_packet_t *self, tsk_size_ } size = (trtp_rtp_packet_guess_serialbuff_size(self) + num_bytes_pad); - while(size % 4){ - ++size; - } + if(size & 0x03) size += (4 - (size & 0x03)); + if(!(buffer = tsk_buffer_create(tsk_null, size))){ TSK_DEBUG_ERROR("Failed to create buffer with size = %u", size); return tsk_null; @@ -214,7 +213,6 @@ static tsk_object_t* trtp_rtp_packet_ctor(tsk_object_t * self, va_list * app) } return self; } - static tsk_object_t* trtp_rtp_packet_dtor(tsk_object_t * self) { trtp_rtp_packet_t *packet = self; @@ -227,12 +225,24 @@ static tsk_object_t* trtp_rtp_packet_dtor(tsk_object_t * self) return self; } +// comparison must be by sequence number because of the jb +static int trtp_rtp_packet_cmp(const tsk_object_t *_p1, const tsk_object_t *_p2) +{ + const trtp_rtp_packet_t *p1 = _p1; + const trtp_rtp_packet_t *p2 = _p2; + + if(p1 && p1->header && p2 && p2->header){ + return (int)(p1->header->seq_num - p2->header->seq_num); + } + else if(!p1 && !p2) return 0; + else return -1; +} static const tsk_object_def_t trtp_rtp_packet_def_s = { sizeof(trtp_rtp_packet_t), trtp_rtp_packet_ctor, trtp_rtp_packet_dtor, - tsk_null, + trtp_rtp_packet_cmp, }; const tsk_object_def_t *trtp_rtp_packet_def_t = &trtp_rtp_packet_def_s; diff --git a/branches/2.0/doubango/tinyRTP/src/rtp/trtp_rtp_session.c b/branches/2.0/doubango/tinyRTP/src/rtp/trtp_rtp_session.c index 005e5e23..c52698c0 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtp/trtp_rtp_session.c +++ b/branches/2.0/doubango/tinyRTP/src/rtp/trtp_rtp_session.c @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * diff --git a/branches/2.0/doubango/tinyRTP/src/trtp.c b/branches/2.0/doubango/tinyRTP/src/trtp.c index 1a7c6d0a..f4b3f0c4 100644 --- a/branches/2.0/doubango/tinyRTP/src/trtp.c +++ b/branches/2.0/doubango/tinyRTP/src/trtp.c @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * diff --git a/branches/2.0/doubango/tinyRTP/src/trtp_manager.c b/branches/2.0/doubango/tinyRTP/src/trtp_manager.c index 19df1190..0d31da81 100644 --- a/branches/2.0/doubango/tinyRTP/src/trtp_manager.c +++ b/branches/2.0/doubango/tinyRTP/src/trtp_manager.c @@ -1,5 +1,5 @@ /* -* Copyright (C) 2010-2011 Mamadou Diop. +* Copyright (C) 2012 Doubango Telecom * * Contact: Mamadou Diop * @@ -20,24 +20,32 @@ * */ /**@file trtp_manager.c - * @brief RTP/RTCP manager. - * - * @author Mamadou Diop - * +* @brief RTP/RTCP manager. +* +* @author Mamadou Diop +* - */ +*/ #include "tinyrtp/trtp_manager.h" #include "tinyrtp/rtp/trtp_rtp_packet.h" +#include "tinyrtp/rtcp/trtp_rtcp_packet.h" +#include "tinyrtp/rtcp/trtp_rtcp_session.h" + +#include "ice/tnet_ice_candidate.h" #include "tsk_string.h" #include "tsk_memory.h" #include "tsk_base64.h" #include "tsk_debug.h" -#define TINY_RCVBUF (256/2/*Will be doubled and min on linux is 256*/) /* tiny buffer used to disable receiving */ -#define BIG_RCVBUF (64 * 1024) -#define BIG_SNDBUF (64 * 1024) +#define TRTP_TRANSPORT_NAME "RTP/RTCP Manager" + +#define DISABLE_SOCKETS_BEFORE_START 0 +#define TINY_RCVBUF (256>>1/*Will be doubled and min on linux is 256*/) /* tiny buffer used to disable receiving */ +#define BIG_RCVBUF 0x1FFFE +#define BIG_SNDBUF 0x1FFFE + #if !defined(TRTP_PORT_RANGE_START) # define TRTP_PORT_RANGE_START 1024 @@ -46,82 +54,28 @@ # define TRTP_PORT_RANGE_STOP 65535 #endif +static int _trtp_manager_recv_data(const trtp_manager_t* self, const uint8_t* data_ptr, tsk_size_t data_size, tnet_fd_t local_fd, const struct sockaddr_storage* remote_addr); + /* ======================= Transport callback ========================== */ static int _trtp_transport_layer_cb(const tnet_transport_event_t* e) { - int ret = -1; const trtp_manager_t *manager = e->callback_data; - trtp_rtp_packet_t* packet = tsk_null; - void* data_ptr; - int data_size; switch(e->type){ case event_data: { - break; - } + break; + } case event_closed: case event_connected: default:{ - return 0; - } - } - - // - // RTCP - // - if(manager->rtcp.local_socket && manager->rtcp.local_socket->fd == e->local_fd){ - data_ptr = (void*)(e->data); - data_size = (int)(e->size); -#if HAVE_SRTP - if(manager->srtp_ctx_neg_remote){ - if(srtp_unprotect_rtcp(manager->srtp_ctx_neg_remote->session, data_ptr, &data_size) != err_status_ok){ - TSK_DEBUG_ERROR("srtp_unprotect() failed"); - goto bail; - } + return 0; } -#endif - - TSK_DEBUG_INFO("RTCP packet"); - } - // - // RTP - // - else if(manager->transport->master && (manager->transport->master->fd == e->local_fd)){ - data_ptr = (void*)(e->data); - data_size = (int)(e->size); - if(manager->rtp.callback){ -#if HAVE_SRTP - if(manager->srtp_ctx_neg_remote){ - if(srtp_unprotect(manager->srtp_ctx_neg_remote->session, data_ptr, &data_size) != err_status_ok){ - TSK_DEBUG_ERROR("srtp_unprotect() failed"); - goto bail; - } - } -#endif - if((packet = trtp_rtp_packet_deserialize(data_ptr, data_size))){ - manager->rtp.callback(manager->rtp.callback_data, packet); - TSK_OBJECT_SAFE_FREE(packet); - } - else{ - TSK_DEBUG_ERROR("RTP packet === NOK"); - goto bail; - } - } - } - // - // UNKNOWN - // - else{ - TSK_DEBUG_INFO("XXXX packet"); - goto bail; } -bail: - - return ret; + return _trtp_manager_recv_data((const trtp_manager_t*)e->callback_data, e->data, e->size, e->local_fd, &e->remote_addr); } - +#if 0 static int _trtp_manager_enable_sockets(trtp_manager_t* self) { int rcv_buf = BIG_RCVBUF; @@ -149,9 +103,9 @@ static int _trtp_manager_enable_sockets(trtp_manager_t* self) self->socket_disabled = tsk_false; return 0; } +#endif -/** Create RTP/RTCP manager */ -trtp_manager_t* trtp_manager_create(tsk_bool_t enable_rtcp, const char* local_ip, tsk_bool_t ipv6) +static trtp_manager_t* _trtp_manager_create(tsk_bool_t use_rtcp, const char* local_ip, tsk_bool_t ipv6) { trtp_manager_t* manager; @@ -167,19 +121,180 @@ trtp_manager_t* trtp_manager_create(tsk_bool_t enable_rtcp, const char* local_ip #endif if((manager = tsk_object_new(trtp_manager_def_t))){ - manager->enable_rtcp = enable_rtcp; + manager->use_rtcp = use_rtcp; manager->local_ip = tsk_strdup(local_ip); - manager->ipv6 = ipv6; + manager->use_ipv6 = ipv6; manager->rtp.payload_type = 127; } return manager; } +static int _trtp_manager_recv_data(const trtp_manager_t* self, const uint8_t* data_ptr, tsk_size_t data_size, tnet_fd_t local_fd, const struct sockaddr_storage* remote_addr) +{ + tsk_bool_t is_rtcp, is_stun; + + // defined when RTCP-MUX is disabled and RTCP port is equal to "RTP Port + 1" + is_rtcp = (self->rtcp.local_socket && self->rtcp.local_socket->fd == local_fd); + if(!is_rtcp && data_size >= 2 && (data_ptr[1] & 0x80)){ + // RFC 5761 + switch((data_ptr[1] & 0x7F)){ + case 64: case 65: + case 72: case 73: case 74: case 75: case 76: + case 77: case 78: + case 79: is_rtcp = tsk_true; + } + } + is_stun = !is_rtcp && TNET_IS_STUN2_MSG(((uint8_t*)data_ptr), data_size); + + if(is_stun){ + static tsk_bool_t role_conflict = tsk_false; + if(self->ice_ctx){ + return tnet_ice_ctx_recv_stun_message(self->ice_ctx, data_ptr, data_size, local_fd, remote_addr, &role_conflict); + } + return 0; + } + else if(is_rtcp){ + if(self->rtcp.session){ + #if HAVE_SRTP + if(self->srtp_ctx_neg_remote){ + if(srtp_unprotect_rtcp(self->srtp_ctx_neg_remote->session, (void*)data_ptr, &data_size) != err_status_ok){ + TSK_DEBUG_ERROR("srtp_unprotect() failed"); + return -1; + } + } + #endif + return trtp_rtcp_session_process_rtcp_in(self->rtcp.session, data_ptr, data_size); + } + TSK_DEBUG_WARN("No RTCP session"); + return 0; + } + else{ + if(self->rtp.callback){ + trtp_rtp_packet_t* packet_rtp = tsk_null; + #if HAVE_SRTP + err_status_t status; + if(self->srtp_ctx_neg_remote){ + if((status = srtp_unprotect(self->srtp_ctx_neg_remote->session, (void*)data_ptr, &data_size)) != err_status_ok){ + TSK_DEBUG_ERROR("srtp_unprotect() failed with error code=%d", (int)status); + return -1; + } + } + #endif + if((packet_rtp = trtp_rtp_packet_deserialize(data_ptr, data_size))){ + self->rtp.callback(self->rtp.callback_data, packet_rtp); + // forward packet to the RTCP session + if(self->rtcp.session){ + trtp_rtcp_session_process_rtp_in(self->rtcp.session, packet_rtp, data_size); + } + TSK_OBJECT_SAFE_FREE(packet_rtp); + return 0; + } + else{ + TSK_DEBUG_ERROR("RTP packet === NOK"); + return -1; + } + } + return 0; + } +} + +static int _trtp_manager_ice_init(trtp_manager_t* self) +{ + int ret; + const tnet_ice_candidate_t *candidate_offer, *candidate_answer_src, *candidate_answer_dest; + + if(!self || !self->ice_ctx){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if(!self->transport){ + // get rtp nominated symetric candidates + ret = tnet_ice_ctx_get_nominated_symetric_candidates(self->ice_ctx, TNET_ICE_CANDIDATE_COMPID_RTP, + &candidate_offer, &candidate_answer_src, &candidate_answer_dest); + if(ret != 0 || !candidate_offer || !candidate_answer_src || !candidate_answer_dest){ + // If this code is called this means that ICE negotiation has failed + // This is not really an error because it could happen if the remote peer is not an ICE agent or is an ICE-lite + // in this case, use the first offered candidate which is the best one and already used in the "c=" line + if(!(candidate_offer = tnet_ice_ctx_get_local_candidate_at(self->ice_ctx, 0))){ + // Must never happen as we always have at least one local "host" candidate + TSK_DEBUG_ERROR("ICE context not ready"); + return -3; + } + } + + // create transport + if(!(self->transport = tnet_transport_create_2(candidate_offer->socket, TRTP_TRANSPORT_NAME))){ + TSK_DEBUG_ERROR("Failed to create transport(%s:%u)", candidate_offer->socket->ip, candidate_offer->socket->port); + return -4; + } + // set rtp local and remote IPs and ports + if(candidate_answer_dest){ // could be "null" if remote peer is ICE-lite. Use + tsk_strupdate(&self->rtp.remote_ip, candidate_answer_dest->connection_addr); + self->rtp.remote_port = candidate_answer_dest->port; + tsk_strupdate(&self->rtp.public_ip, candidate_offer->connection_addr); + self->rtp.public_port = candidate_offer->port; + } + + // get rtp nominated symetric candidates + if(self->use_rtcp){ + ret = tnet_ice_ctx_get_nominated_symetric_candidates(self->ice_ctx, TNET_ICE_CANDIDATE_COMPID_RTCP, + &candidate_offer, &candidate_answer_src, &candidate_answer_dest); + if(ret == 0 && candidate_offer && candidate_answer_src && candidate_answer_dest){ + // set rtp local and remote IPs and ports + tsk_strupdate(&self->rtcp.remote_ip, candidate_answer_dest->connection_addr); + self->rtcp.remote_port = candidate_answer_dest->port; + tsk_strupdate(&self->rtcp.public_ip, candidate_offer->connection_addr); + self->rtcp.public_port = candidate_offer->port; + TSK_OBJECT_SAFE_FREE(self->rtcp.local_socket); + self->rtcp.local_socket = tsk_object_ref((tsk_object_t*)candidate_offer->socket); + } + } + } + + // set callback functions + ret = tnet_transport_set_callback(self->transport, _trtp_transport_layer_cb, self); // NetTransport to RtpManager + ret = tnet_ice_ctx_rtp_callback(self->ice_ctx, _trtp_manager_recv_data, self); // ICE 2 RtpManager + + return ret; +} + + +/** Create RTP/RTCP manager */ +trtp_manager_t* trtp_manager_create(tsk_bool_t use_rtcp, const char* local_ip, tsk_bool_t ipv6) +{ + trtp_manager_t* manager; + if((manager = _trtp_manager_create(use_rtcp, local_ip, ipv6))){ + } + return manager; +} + +/** Create RTP/RTCP manager */ +trtp_manager_t* trtp_manager_create_2(struct tnet_ice_ctx_s* ice_ctx) +{ + trtp_manager_t* manager; + const char* local_ip; + tsk_bool_t use_ipv6, use_rtcp; + + if(!ice_ctx){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_null; + } + + local_ip = (use_ipv6 = tnet_ice_ctx_use_ipv6(ice_ctx)) ? "::1" : "127.0.0.1"; + use_rtcp = tnet_ice_ctx_use_rtcp(ice_ctx); + + if((manager = _trtp_manager_create(use_rtcp, local_ip, use_ipv6))){ + manager->ice_ctx = tsk_object_ref(ice_ctx); + } + return manager; +} + /** Prepares the RTP/RTCP manager */ int trtp_manager_prepare(trtp_manager_t* self) { - uint8_t retry_count = 7; - tnet_socket_type_t socket_type; + const char *rtp_local_ip = tsk_null, *rtcp_local_ip = tsk_null; + tnet_port_t rtp_local_port = 0, rtcp_local_port = 0; if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); @@ -190,57 +305,77 @@ int trtp_manager_prepare(trtp_manager_t* self) return -2; } - socket_type = self->ipv6 ? tnet_socket_type_udp_ipv6 : tnet_socket_type_udp_ipv4; - - /* Creates local rtp and rtcp sockets */ - while(retry_count--){ - /* random number in the range 1024 to 65535 */ -#if 0 - tnet_port_t local_port = 6060; -#else - tnet_port_t local_port = ((rand() % (self->port_range.stop - self->port_range.start)) + self->port_range.start); -#endif - local_port = (local_port & 0xFFFE); /* turn to even number */ - - /* beacuse failure will cause errors in the log, print a message to alert that there is - * nothing to worry about */ - TSK_DEBUG_INFO("RTP/RTCP manager[Begin]: Trying to bind to random ports"); - - /* RTP */ - if((self->transport = tnet_transport_create(self->local_ip, local_port, socket_type, "RTP/RTCP Manager"))){ - /* set callback function */ - tnet_transport_set_callback(self->transport, _trtp_transport_layer_cb, self); - tsk_strupdate(&self->rtp.public_ip, self->transport->master->ip); - self->rtp.public_port = local_port; - /* Disable receiving until we start the transport (To avoid buffering) */ - if(!self->socket_disabled){ - int err, optval = TINY_RCVBUF; - if((err = setsockopt(self->transport->master->fd, SOL_SOCKET, SO_RCVBUF, (char*)&optval, sizeof(optval)))){ - TNET_PRINT_LAST_ERROR("setsockopt(SOL_SOCKET, SO_RCVBUF) has failed with error code %d", err); - } - self->socket_disabled = (err == 0); - } - } - else { - TSK_DEBUG_ERROR("Failed to create RTP/RTCP Transport"); - return -3; - } + if(self->ice_ctx){ + TSK_DEBUG_INFO("ICE enabled on RTP manager"); + // Get Sockets when the transport is started + rtp_local_ip = rtcp_local_ip = self->use_ipv6 ? "::1" : "127.0.0.1"; + } + else{ + uint8_t retry_count = 4; + tnet_socket_type_t socket_type = self->use_ipv6 ? tnet_socket_type_udp_ipv6 : tnet_socket_type_udp_ipv4; - /* RTCP */ - if(self->enable_rtcp){ - if(!(self->rtcp.local_socket = tnet_socket_create(self->local_ip, local_port+1, socket_type))){ - TSK_DEBUG_WARN("Failed to bind to %d", local_port+1); - TSK_OBJECT_SAFE_FREE(self->transport); - continue; + /* Creates local rtp and rtcp sockets */ + while(retry_count--){ + /* random number in the range 1024 to 65535 */ + static int counter = 0; +#if 0 + tnet_port_t local_port = 6060; +#else + tnet_port_t local_port = (((rand() ^ ++counter) % (self->port_range.stop - self->port_range.start)) + self->port_range.start); +#endif + local_port = (local_port & 0xFFFE); /* turn to even number */ + + /* beacuse failure will cause errors in the log, print a message to alert that there is + * nothing to worry about */ + TSK_DEBUG_INFO("RTP/RTCP manager[Begin]: Trying to bind to random ports"); + + /* RTP */ + if(!(self->transport = tnet_transport_create(self->local_ip, local_port, socket_type, TRTP_TRANSPORT_NAME))){ + TSK_DEBUG_ERROR("Failed to create RTP/RTCP Transport"); + return -3; } - else{ - tsk_strupdate(&self->rtcp.public_ip, self->rtcp.local_socket->ip); - self->rtcp.public_port = local_port + 1; + + /* RTCP */ + if(self->use_rtcp){ + if(!(self->rtcp.local_socket = tnet_socket_create(self->local_ip, local_port+1, socket_type))){ + TSK_DEBUG_WARN("Failed to bind to %d", local_port+1); + TSK_OBJECT_SAFE_FREE(self->transport); + continue; + } } + + TSK_DEBUG_INFO("RTP/RTCP manager[End]: Trying to bind to random ports"); + break; + }// end-of-while(retry_count) + + rtp_local_ip = self->transport->master->ip; + rtp_local_port = self->transport->master->port; + if(self->rtcp.local_socket){ + rtcp_local_ip = self->rtcp.local_socket->ip; + rtcp_local_port = self->rtcp.local_socket->port; + } - - TSK_DEBUG_INFO("RTP/RTCP manager[End]: Trying to bind to random ports"); - break; + }// end-of-else(!ice) + + tsk_strupdate(&self->rtp.public_ip, rtp_local_ip); + self->rtp.public_port = rtp_local_port; + + tsk_strupdate(&self->rtcp.public_ip, rtcp_local_ip); + self->rtcp.public_port = rtcp_local_port; + + if(self->transport){ + /* set callback function */ + tnet_transport_set_callback(self->transport, _trtp_transport_layer_cb, self); + /* Disable receiving until we start the transport (To avoid buffering) */ +#if DISABLE_SOCKETS_BEFORE_START + if(!self->socket_disabled){ + int err, optval = TINY_RCVBUF; + if((err = setsockopt(self->transport->master->fd, SOL_SOCKET, SO_RCVBUF, (char*)&optval, sizeof(optval)))){ + TNET_PRINT_LAST_ERROR("setsockopt(SOL_SOCKET, SO_RCVBUF) has failed with error code %d", err); + } + self->socket_disabled = (err == 0); + } +#endif } /* SRTP */ @@ -254,14 +389,14 @@ int trtp_manager_prepare(trtp_manager_t* self) return 0; } -/** Indicates whether the manager is already prepared or not */ -tsk_bool_t trtp_manager_is_prepared(trtp_manager_t* self) +/** Indicates whether the manager is already ready or not */ +tsk_bool_t trtp_manager_is_ready(trtp_manager_t* self) { if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); return tsk_false; } - return self->transport == tsk_null ? tsk_false : tsk_true; + return (self->transport != tsk_null); } /** Sets NAT Traversal context */ @@ -289,25 +424,44 @@ int trtp_manager_set_natt_ctx(trtp_manager_t* self, tnet_nat_context_handle_t* n self->rtcp.public_port = public_port; } // re-enable sockets to be able to receive STUN packets +#if 0 _trtp_manager_enable_sockets(self); +#endif } return ret; } /** Sets RTP callback */ -int trtp_manager_set_rtp_callback(trtp_manager_t* self, trtp_manager_rtp_cb_f callback, const void* callback_data) +int trtp_manager_set_rtp_callback(trtp_manager_t* self, trtp_rtp_cb_f callback, const void* callback_data) { if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } - + self->rtp.callback = callback; self->rtp.callback_data = callback_data; return 0; } +/** Sets RTCP callback */ +int trtp_manager_set_rtcp_callback(trtp_manager_t* self, trtp_rtcp_cb_f callback, const void* callback_data) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + self->rtcp.callback = callback; + self->rtcp.callback_data = callback_data; + if(self->rtcp.session){ + return trtp_rtcp_session_set_callback(self->rtcp.session, callback, callback_data); + } + + return 0; +} + /** Sets the payload type */ int trtp_manager_set_payload_type(trtp_manager_t* self, uint8_t payload_type) { @@ -326,6 +480,7 @@ int trtp_manager_set_rtp_remote(trtp_manager_t* self, const char* remote_ip, tne TSK_DEBUG_ERROR("Invalid parameter"); return -1; } + // if ICE is enabled then, these values will be updated when the manager start()s and call ice_init() tsk_strupdate(&self->rtp.remote_ip, remote_ip); self->rtp.remote_port = remote_port; return 0; @@ -338,6 +493,9 @@ int trtp_manager_set_rtcp_remote(trtp_manager_t* self, const char* remote_ip, tn TSK_DEBUG_ERROR("Invalid parameter"); return -1; } + if(self->ice_ctx){ + TSK_DEBUG_WARN("Manually setting RTCP remote IP and Port while ICE is enabled"); + } tsk_strupdate(&self->rtcp.remote_ip, remote_ip); self->rtcp.remote_port = remote_port; return 0; @@ -358,44 +516,66 @@ int trtp_manager_set_port_range(trtp_manager_t* self, uint16_t start, uint16_t s int trtp_manager_start(trtp_manager_t* self) { int ret = 0; + int rcv_buf = BIG_RCVBUF; + int snd_buf = BIG_SNDBUF; if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } - if(self->started){ - TSK_DEBUG_WARN("RTP/RTCP manager already started"); + if(self->is_started){ return 0; } - if(!self->transport){ + // Initialize transport with ICE context + if(self->ice_ctx && (ret = _trtp_manager_ice_init(self)) != 0){ + TSK_DEBUG_ERROR("_trtp_manager_ice_init() failed"); + return ret; + } + + if(!self->transport && (ret = trtp_manager_prepare(self))){ + TSK_DEBUG_ERROR("Failed to prepare RTP/RTCP mamanger"); + return ret; + } + + if(!self->transport || !self->transport->master){ TSK_DEBUG_ERROR("RTP/RTCP manager not prepared"); return -2; } /* Flush buffers and re-enable sockets */ - if(self->transport->master){ - char buff[2048]; - + if(self->transport->master && self->socket_disabled){ + static char buff[BIG_RCVBUF]; + tsk_size_t guard_count = 0; +#if 0 // re-enable sockets _trtp_manager_enable_sockets(self); - +#endif + TSK_DEBUG_INFO("Start flushing RTP socket..."); // Buffer should be empty ...but who know? // rcv() should never block() as we are always using non-blocking sockets - while ((ret = recv(self->transport->master->fd, buff, sizeof(buff), 0)) > 0){ + while ((ret = recv(self->transport->master->fd, buff, sizeof(buff), 0)) > 0 && ++guard_count < 0xF0){ TSK_DEBUG_INFO("Flushing RTP Buffer %d", ret); } TSK_DEBUG_INFO("End flushing RTP socket"); } + /* enlarge socket buffer */ + if((ret = setsockopt(self->transport->master->fd, SOL_SOCKET, SO_RCVBUF, (char*)&rcv_buf, sizeof(rcv_buf)))){ + TNET_PRINT_LAST_ERROR("setsockopt(SOL_SOCKET, SO_RCVBUF) has failed with error code %d", ret); + } + if((ret = setsockopt(self->transport->master->fd, SOL_SOCKET, SO_SNDBUF, (char*)&snd_buf, sizeof(snd_buf)))){ + TNET_PRINT_LAST_ERROR("setsockopt(SOL_SOCKET, SO_RCVBUF) has failed with error code %d", ret); + } + /* start the transport */ if((ret = tnet_transport_start(self->transport))){ TSK_DEBUG_ERROR("Failed to start the RTP/RTCP transport"); return ret; } - + /* RTP */ if((ret = tnet_sockaddr_init(self->rtp.remote_ip, self->rtp.remote_port, self->transport->master->type, &self->rtp.remote_addr))){ tnet_transport_shutdown(self->transport); @@ -404,46 +584,50 @@ int trtp_manager_start(trtp_manager_t* self) } /* RTCP */ - if(self->enable_rtcp){ + if(self->use_rtcp){ + tnet_fd_t local_rtcp_fd = self->rtcp.local_socket ? self->rtcp.local_socket->fd : -1; + if(local_rtcp_fd < 0 && self->use_rtcp_mux){ + local_rtcp_fd = self->transport->master->fd; + } + if(!self->rtcp.remote_ip){ - self->rtcp.remote_ip = tsk_strdup(self->rtp.remote_ip); + self->rtcp.remote_ip = tsk_strdup(self->rtcp.remote_ip ? self->rtcp.remote_ip : self->rtp.remote_ip); } if(!self->rtcp.remote_port){ - self->rtcp.remote_port = self->rtp.remote_port; + self->rtcp.remote_port = self->rtcp.remote_port ? self->rtcp.remote_port : (self->use_rtcp_mux ? self->rtp.remote_port : (self->rtp.remote_port + 1)); + } + + if((ret = tnet_sockaddr_init(self->rtcp.remote_ip, self->rtcp.remote_port, self->transport->master->type, &self->rtcp.remote_addr))){ + TSK_DEBUG_ERROR("Invalid RTCP host:port [%s:%u]", self->rtcp.remote_ip, self->rtcp.remote_port); + /* do not exit */ + } + + /* add RTCP socket to the transport */ + if(self->rtcp.local_socket){ + if(ret == 0 && (ret = tnet_transport_add_socket(self->transport, self->rtcp.local_socket->fd, self->rtcp.local_socket->type, tsk_false, tsk_true/* only Meaningful for tls*/))){ + TSK_DEBUG_ERROR("Failed to add RTCP socket"); + /* do not exit */ + } + } + /* create and start RTCP session */ + if(!self->rtcp.session && ret == 0){ + self->rtcp.session = trtp_rtcp_session_create(self->rtp.ssrc); + } + if(self->rtcp.session){ + ret = trtp_rtcp_session_set_callback(self->rtcp.session, self->rtcp.callback, self->rtcp.callback_data); + if((ret = trtp_rtcp_session_start(self->rtcp.session, local_rtcp_fd, (const struct sockaddr *)&self->rtcp.remote_addr))){ + TSK_DEBUG_ERROR("Failed to start RTCP session"); + return ret; + } } } - if(self->enable_rtcp && (ret = tnet_sockaddr_init(self->rtcp.remote_ip, self->rtcp.remote_port, self->rtcp.local_socket->type, &self->rtp.remote_addr))){ - TSK_DEBUG_ERROR("Invalid RTCP host:port [%s:%u]", self->rtcp.remote_ip, self->rtcp.remote_port); - /* do not exit */ - } - - /* add RTCP socket to the transport */ - if(self->enable_rtcp && (ret = tnet_transport_add_socket(self->transport, self->rtcp.local_socket->fd, self->rtcp.local_socket->type, tsk_false, tsk_true/* only Meaningful for tls*/))){ - TSK_DEBUG_ERROR("Failed to add RTCP socket"); - /* do not exit */ - } - - -#if 0 - { - int flags; - if((flags = fcntl(self->transport->master->fd, F_GETFL, 0)) < 0) { - TNET_PRINT_LAST_ERROR("fcntl(F_GETFL) have failed."); - } - else{ - if(fcntl(self->transport->master->fd, F_SETFL, flags | O_DIRECT) < 0){ - TNET_PRINT_LAST_ERROR("fcntl(O_DIRECT) have failed."); - } - } - } -#endif /*SRTP*/ #if HAVE_SRTP { const trtp_srtp_ctx_xt* ctx_remote = &self->srtp_contexts[TRTP_SRTP_LINE_IDX_REMOTE][0]; const trtp_srtp_ctx_xt* ctx_local = &self->srtp_contexts[TRTP_SRTP_LINE_IDX_LOCAL][0]; - + if(ctx_remote->initialized){ self->srtp_ctx_neg_remote = ctx_remote; if(ctx_local[0].crypto_type == ctx_remote->crypto_type){ @@ -457,34 +641,36 @@ int trtp_manager_start(trtp_manager_t* self) self->srtp_ctx_neg_local = tsk_null; self->srtp_ctx_neg_remote = tsk_null; } + // Pass SRTP session to the RTCP session manager + trtp_rtcp_session_set_srtp_sess(self->rtcp.session, self->srtp_ctx_neg_local ? &self->srtp_ctx_neg_local->session : tsk_null); } #endif /* HAVE_SRTP */ - self->started = tsk_true; + self->is_started = tsk_true; return 0; } /* Encapsulate raw data into RTP packet and send it over the network * Very IMPORTANT: For voice packets, the marker bits indicates the beginning of a talkspurt */ -int trtp_manager_send_rtp(trtp_manager_t* self, const void* data, tsk_size_t size, uint32_t duration, tsk_bool_t marker, tsk_bool_t last_packet) +tsk_size_t trtp_manager_send_rtp(trtp_manager_t* self, const void* data, tsk_size_t size, uint32_t duration, tsk_bool_t marker, tsk_bool_t last_packet) { trtp_rtp_packet_t* packet; - int ret = -1; + tsk_size_t ret; - if(!self || !self->transport || !data || !size){ + if(!self || !self->transport || !self->transport->master || !data || !size){ TSK_DEBUG_ERROR("Invalid parameter"); - return -1; + return 0; } - if(!self->started || !self->transport->master){ + if(!self->is_started || !self->transport->master){ //--TSK_DEBUG_ERROR("RTP/RTCP manager should be started before trying to send data"); - return -2; + return 0; } - + /* create packet with header */ if(!(packet = trtp_rtp_packet_create(self->rtp.ssrc, self->rtp.seq_num++, self->rtp.timestamp, self->rtp.payload_type, marker))){ - return -3; + return 0; } if(last_packet){ self->rtp.timestamp += duration; @@ -501,77 +687,132 @@ int trtp_manager_send_rtp(trtp_manager_t* self, const void* data, tsk_size_t siz packet->payload.size = size; #endif - ret = trtp_manager_send_rtp_2(self, packet); + ret = trtp_manager_send_rtp_packet(self, packet, tsk_false); TSK_OBJECT_SAFE_FREE(packet); return ret; } -int trtp_manager_send_rtp_2(trtp_manager_t* self, const struct trtp_rtp_packet_s* packet) +// serialize, encrypt then send the data +tsk_size_t trtp_manager_send_rtp_packet(trtp_manager_t* self, const struct trtp_rtp_packet_s* packet, tsk_bool_t bypass_encrypt) { - tsk_buffer_t* buffer; - int ret = -2; + int ret = 0; tsk_size_t rtp_buff_pad_count = 0; + tsk_size_t xsize; #if HAVE_SRTP - if(self->srtp_ctx_neg_local){ - rtp_buff_pad_count = SRTP_MAX_TRAILER_LEN; + if(self->srtp_ctx_neg_local && !bypass_encrypt){ + rtp_buff_pad_count = (SRTP_MAX_TRAILER_LEN + 0x04); } #endif if(!self || !packet){ TSK_DEBUG_ERROR("Invalid parameter"); - return -1; + return 0; + } + + tsk_safeobj_lock(self); + + xsize = (trtp_rtp_packet_guess_serialbuff_size(packet) + rtp_buff_pad_count); + if(self->rtp.serial_buffer.size < xsize){ + if(!(self->rtp.serial_buffer.ptr = tsk_realloc(self->rtp.serial_buffer.ptr, xsize))){ + TSK_DEBUG_ERROR("Failed to allocate buffer with size = %d", xsize); + self->rtp.serial_buffer.size = 0; + goto bail; + } + self->rtp.serial_buffer.size = xsize; } /* serialize and send over the network */ - if((buffer = trtp_rtp_packet_serialize(packet, rtp_buff_pad_count))){ - void* data_ptr = buffer->data; - int data_size = buffer->size; + if((ret = trtp_rtp_packet_serialize_to(packet, self->rtp.serial_buffer.ptr, xsize))){ + void* data_ptr = self->rtp.serial_buffer.ptr; + int data_size = ret; #if HAVE_SRTP - if(self->srtp_ctx_neg_local){ - if(srtp_protect(self->srtp_ctx_neg_local->session, data_ptr, &data_size) != err_status_ok){ - TSK_DEBUG_ERROR("srtp_protect() failed"); - TSK_OBJECT_SAFE_FREE(buffer); - return -5; + err_status_t status; + if(self->srtp_ctx_neg_local && !bypass_encrypt){ + if((status = srtp_protect(self->srtp_ctx_neg_local->session, data_ptr, &data_size)) != err_status_ok){ + TSK_DEBUG_ERROR("srtp_protect() failed with error code =%d", (int)status); + goto bail; } } #endif - if(/* number of bytes sent */tnet_sockfd_sendto(self->transport->master->fd, (const struct sockaddr *)&self->rtp.remote_addr, data_ptr, data_size)){ - ret = 0; + if(/* number of bytes sent */(ret = tnet_sockfd_sendto(self->transport->master->fd, (const struct sockaddr *)&self->rtp.remote_addr, data_ptr, data_size)) > 0){ + // forward packet to the RTCP session + if(self->rtcp.session){ + trtp_rtcp_session_process_rtp_out(self->rtcp.session, packet, data_size); + } } - TSK_OBJECT_SAFE_FREE(buffer); + else ret = 0; } else{ TSK_DEBUG_ERROR("Failed to serialize RTP packet"); - ret = -5; } +bail: + tsk_safeobj_unlock(self); return ret; } +// send raw data "as is" without adding any RTP header or SRTP encryption +tsk_size_t trtp_manager_send_rtp_raw(trtp_manager_t* self, const void* data, tsk_size_t size) +{ + tsk_size_t ret; + + if(!self || !self->transport || !self->transport->master || !data || !size){ + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + tsk_safeobj_lock(self); + ret = tnet_sockfd_sendto(self->transport->master->fd, (const struct sockaddr *)&self->rtp.remote_addr, data, size); + tsk_safeobj_unlock(self); + return 0; +} + +int trtp_manager_signal_pkt_loss(trtp_manager_t* self, uint32_t ssrc_media, const uint16_t* seq_nums, tsk_size_t count) +{ + if(self && self->rtcp.session){ + return trtp_rtcp_session_signal_pkt_loss(self->rtcp.session, ssrc_media, seq_nums, count); + } + return -1; +} +int trtp_manager_signal_frame_corrupted(trtp_manager_t* self, uint32_t ssrc_media) +{ + if(self && self->rtcp.session){ + return trtp_rtcp_session_signal_frame_corrupted(self->rtcp.session, ssrc_media); + } + return -1; +} + +int trtp_manager_signal_jb_error(trtp_manager_t* self, uint32_t ssrc_media) +{ + if(self && self->rtcp.session){ + return trtp_rtcp_session_signal_jb_error(self->rtcp.session, ssrc_media); + } + return -1; +} + /** Stops the RTP/RTCP manager */ int trtp_manager_stop(trtp_manager_t* self) { - int ret; + int ret = 0; if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } - if(!self->started){ - TSK_DEBUG_WARN("RTP/RTCP manager not started"); + if(!self->is_started){ return 0; } - if(!self->transport){ - TSK_DEBUG_ERROR("RTP/RTCP manager not prepared"); - return -2; + // Stop the RTCP session first (will send BYE) + if(self->rtcp.session){ + ret = trtp_rtcp_session_stop(self->rtcp.session); } - if(!(ret = tnet_transport_shutdown(self->transport))){ - self->started = tsk_false; - } + // Free transport to force next call to start() to create new one with new sockets + TSK_OBJECT_SAFE_FREE(self->transport); + + self->is_started = tsk_false; return ret; } @@ -592,9 +833,11 @@ static tsk_object_t* trtp_manager_ctor(tsk_object_t * self, va_list * app) /* rtp */ manager->rtp.timestamp = rand()^rand(); manager->rtp.seq_num = rand()^rand(); - manager->rtp.ssrc = rand()^rand(); + manager->rtp.ssrc = rand()^rand()^(int)tsk_time_epoch(); /* rtcp */ + + tsk_safeobj_init(manager); } return self; } @@ -604,20 +847,26 @@ static tsk_object_t* trtp_manager_dtor(tsk_object_t * self) trtp_manager_t *manager = self; if(manager){ /* stop */ - if(manager->started){ + if(manager->is_started){ trtp_manager_stop(manager); } + TSK_OBJECT_SAFE_FREE(manager->transport); + + TSK_FREE(manager->local_ip); + /* rtp */ TSK_FREE(manager->rtp.remote_ip); TSK_FREE(manager->rtp.public_ip); + TSK_FREE(manager->rtp.serial_buffer.ptr); /* rtcp */ + TSK_OBJECT_SAFE_FREE(manager->rtcp.session); TSK_FREE(manager->rtcp.remote_ip); TSK_FREE(manager->rtcp.public_ip); TSK_OBJECT_SAFE_FREE(manager->rtcp.local_socket); - - /* srtp */ + + /* SRTP */ #if HAVE_SRTP { int i; @@ -628,8 +877,13 @@ static tsk_object_t* trtp_manager_dtor(tsk_object_t * self) } #endif - TSK_FREE(manager->local_ip); - TSK_OBJECT_SAFE_FREE(manager->transport); + /* ICE */ + if(manager->ice_ctx){ + tnet_ice_ctx_rtp_callback(manager->ice_ctx, tsk_null, tsk_null); + TSK_OBJECT_SAFE_FREE(manager->ice_ctx); + } + + tsk_safeobj_deinit(manager); } return self; diff --git a/branches/2.0/doubango/tinyRTP/src/trtp_srtp.c b/branches/2.0/doubango/tinyRTP/src/trtp_srtp.c index 221367b1..1a3d0dad 100644 --- a/branches/2.0/doubango/tinyRTP/src/trtp_srtp.c +++ b/branches/2.0/doubango/tinyRTP/src/trtp_srtp.c @@ -69,7 +69,7 @@ int trtp_srtp_ctx_init(trtp_srtp_ctx_xt* ctx, int32_t tag, trtp_srtp_crypto_type } ctx->policy.key = (unsigned char*)ctx->key_bin; - ctx->policy.ssrc.type = ssrc_any_inbound; + ctx->policy.ssrc.type = ssrc_any_outbound; ctx->policy.ssrc.value = ssrc; if((srtp_err = srtp_create(&ctx->session, &ctx->policy)) != err_status_ok){ TSK_DEBUG_ERROR("srtp_create() failed"); @@ -230,7 +230,6 @@ int trtp_srtp_set_remote(trtp_manager_t* rtp_mgr, const char* crypto_line) tsk_bool_t trtp_srtp_is_initialized(trtp_manager_t* rtp_mgr) { if(!rtp_mgr){ - TSK_DEBUG_ERROR("Invalid argument"); return tsk_false; } return ((rtp_mgr->srtp_contexts[TRTP_SRTP_LINE_IDX_LOCAL][0].initialized || rtp_mgr->srtp_contexts[TRTP_SRTP_LINE_IDX_LOCAL][1].initialized) diff --git a/branches/2.0/doubango/tinyRTP/tinyRTP.vcproj b/branches/2.0/doubango/tinyRTP/tinyRTP.vcproj index 6a19f12e..ffe747fb 100644 --- a/branches/2.0/doubango/tinyRTP/tinyRTP.vcproj +++ b/branches/2.0/doubango/tinyRTP/tinyRTP.vcproj @@ -226,6 +226,14 @@ RelativePath=".\src\rtcp\trtp_rtcp_report.c" > + + + + @@ -320,6 +328,14 @@ RelativePath=".\include\tinyrtp\rtcp\trtp_rtcp_report.h" > + + + + diff --git a/branches/2.0/doubango/tinySAK/src/tinysak_config.h b/branches/2.0/doubango/tinySAK/src/tinysak_config.h index 73044fe4..5c673c49 100644 --- a/branches/2.0/doubango/tinySAK/src/tinysak_config.h +++ b/branches/2.0/doubango/tinySAK/src/tinysak_config.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ * This file incude all your preferences or configuration. All specific configuration * must be defined in this file. You must include this file in all your header files. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -88,8 +88,8 @@ # define HAVE_GETTIMEOFDAY 1 #endif -#if defined(ANDROID) -# define HAVE_CLOCK_GETTIME 1 +#if ANDROID +# define HAVE_CLOCK_GETTIME 1 #endif #include diff --git a/branches/2.0/doubango/tinySAK/src/tsk.c b/branches/2.0/doubango/tinySAK/src/tsk.c index 93fc8e66..1a29a730 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk.c +++ b/branches/2.0/doubango/tinySAK/src/tsk.c @@ -1,6 +1,6 @@ /** * @file tsk.c -* @author Mamadou Diop +* @author Mamadou Diop * @version 1.0 * * @section LICENSE diff --git a/branches/2.0/doubango/tinySAK/src/tsk.h b/branches/2.0/doubango/tinySAK/src/tsk.h index 7346cc7e..402b9804 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk.h +++ b/branches/2.0/doubango/tinySAK/src/tsk.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk.h * @brief This file contains all headers needed to export public API functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_base64.c b/branches/2.0/doubango/tinySAK/src/tsk_base64.c index 2408526f..b0ca95b9 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_base64.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_base64.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_base64.c * @brief Base64 encoder and decoder as per RFC 4648. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_base64.h b/branches/2.0/doubango/tinySAK/src/tsk_base64.h index f6a8e060..d7e9b21d 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_base64.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_base64.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_base64.h * @brief Base64 encoder and decoder as per RFC 4648. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_binaryutils.c b/branches/2.0/doubango/tinySAK/src/tsk_binaryutils.c index 606b5722..0600efe6 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_binaryutils.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_binaryutils.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_binaryutils.c * @brief Utility functions for binary manipulation. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_binaryutils.h b/branches/2.0/doubango/tinySAK/src/tsk_binaryutils.h index 41bc2839..1d09cd1f 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_binaryutils.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_binaryutils.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_binaryutils.h * @brief Binary utils. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_buffer.c b/branches/2.0/doubango/tinySAK/src/tsk_buffer.c index 0c2e101c..d798fb20 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_buffer.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_buffer.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_buffer.c * @brief Buffer manager. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_buffer.h b/branches/2.0/doubango/tinySAK/src/tsk_buffer.h index 739d9204..8afb5268 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_buffer.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_buffer.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_buffer.h * @brief Buffer manager. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_common.h b/branches/2.0/doubango/tinySAK/src/tsk_common.h index 9673b2cd..042f0ba3 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_common.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_common.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_common.h * Commons. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_condwait.c b/branches/2.0/doubango/tinySAK/src/tsk_condwait.c index 89b4c083..13ef345b 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_condwait.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_condwait.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_condwait.c * @brief Pthread/Windows functions for waiting an signaling on condition variables. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_condwait.h b/branches/2.0/doubango/tinySAK/src/tsk_condwait.h index b729321c..5d5c5503 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_condwait.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_condwait.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_condwait.h * @brief Pthread CondWait * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_debug.c b/branches/2.0/doubango/tinySAK/src/tsk_debug.c index 5c1eee13..234d96d9 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_debug.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_debug.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_debug.c * @brief Utility functions for debugging purpose. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_debug.h b/branches/2.0/doubango/tinySAK/src/tsk_debug.h index e00eaae9..6185d477 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_debug.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_debug.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_debug.h * @brief Useful functions for debugging purpose. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_errno.h b/branches/2.0/doubango/tinySAK/src/tsk_errno.h index cb61c83c..5435d8ef 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_errno.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_errno.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_mutex.h * @brief ERRNO. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_fsm.c b/branches/2.0/doubango/tinySAK/src/tsk_fsm.c index 33bce925..ab50ba80 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_fsm.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_fsm.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ * @brief Finite-state machine (FSM) implementation. * @sa http://en.wikipedia.org/wiki/Finite-state_machine. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -141,7 +141,7 @@ int tsk_fsm_act(tsk_fsm_t* self, tsk_fsm_action_id action, const void* cond_data tsk_list_foreach(item, self->entries) { tsk_fsm_entry_t* entry = item->data; - if((entry->from != tsk_fsm_state_any) && (entry->from != self->current)){ + if(((entry->from != tsk_fsm_state_any) && (entry->from != tsk_fsm_state_current)) && (entry->from != self->current)){ continue; } @@ -156,7 +156,7 @@ int tsk_fsm_act(tsk_fsm_t* self, tsk_fsm_action_id action, const void* cond_data TSK_DEBUG_INFO("State machine: %s", entry->desc); } - if(entry->to != tsk_fsm_state_any){ /* Stay at the current state if dest. state is Any */ + if(entry->to != tsk_fsm_state_any && entry->to != tsk_fsm_state_current){ /* Stay at the current state if destination state is Any or Current */ self->current = entry->to; } @@ -193,6 +193,25 @@ int tsk_fsm_act(tsk_fsm_t* self, tsk_fsm_action_id action, const void* cond_data return ret_exec; } +tsk_fsm_state_id tsk_fsm_get_current_state(tsk_fsm_t* self) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_fsm_state_any; + } + return self->current; +} + +int tsk_fsm_set_current_state(tsk_fsm_t* self, tsk_fsm_state_id new_state) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + self->current = new_state; + return 0; +} + tsk_bool_t tsk_fsm_terminated(tsk_fsm_t* self) { if(self){ @@ -282,7 +301,7 @@ static int tsk_fsm_entry_cmp(const tsk_object_t *_entry1, const tsk_object_t *_e const tsk_fsm_entry_t* entry1 = _entry1; const tsk_fsm_entry_t* entry2 = _entry2; if(entry1 && entry2){ - /* Put "Any" states at the bottom. (Strong)*/ + /* Put "Any" states at the bottom (Strong)*/ if(entry1->from == tsk_fsm_state_any){ return -20; } @@ -290,13 +309,15 @@ static int tsk_fsm_entry_cmp(const tsk_object_t *_entry1, const tsk_object_t *_e return +20; } - /* Put "Any" actions at the bottom. (Weak)*/ + /* Put "Any" actions at the bottom (Weak)*/ if(entry1->action == tsk_fsm_action_any){ return -10; } else if(entry1->action == tsk_fsm_action_any){ return +10; } + // put conditions first + return entry1->cond ? -1 : (entry2->cond ? 1 : 0); } return 0; } diff --git a/branches/2.0/doubango/tinySAK/src/tsk_fsm.h b/branches/2.0/doubango/tinySAK/src/tsk_fsm.h index e39777c7..1cd754f2 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_fsm.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_fsm.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ * @brief Finite-state machine (FSM) implementation. * @sa http://en.wikipedia.org/wiki/Finite-state_machine. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -56,7 +56,7 @@ TSK_BEGIN_DECLS * @def tsk_fsm_state_final */ #define tsk_fsm_state_any -0xFFFF -#define tsk_fsm_state_default -0xFFF0 +#define tsk_fsm_state_current -0xFFF0 #define tsk_fsm_state_none -0xFF00 #define tsk_fsm_state_final -0xF000 @@ -168,6 +168,8 @@ TINYSAK_API tsk_bool_t tsk_fsm_cond_always(const void*, const void*); TINYSAK_API int tsk_fsm_set(tsk_fsm_t* self, ...); TINYSAK_API int tsk_fsm_set_callback_terminated(tsk_fsm_t* self, tsk_fsm_onterminated_f callback, const void* callbackdata); TINYSAK_API int tsk_fsm_act(tsk_fsm_t* self, tsk_fsm_action_id action, const void* cond_data1, const void* cond_data2, ...); +TINYSAK_API tsk_fsm_state_id tsk_fsm_get_current_state(tsk_fsm_t* self); +TINYSAK_API int tsk_fsm_set_current_state(tsk_fsm_t* self, tsk_fsm_state_id new_state); TINYSAK_API tsk_bool_t tsk_fsm_terminated(tsk_fsm_t* self); TINYSAK_GEXTERN const tsk_object_def_t *tsk_fsm_def_t; diff --git a/branches/2.0/doubango/tinySAK/src/tsk_hmac.c b/branches/2.0/doubango/tinySAK/src/tsk_hmac.c index a90adfd5..187d42d3 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_hmac.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_hmac.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_hmac.c * @brief HMAC: Keyed-Hashing for Message Authentication (RFC 2104) / FIPS-198-1. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_hmac.h b/branches/2.0/doubango/tinySAK/src/tsk_hmac.h index 1824f212..5bd76b4d 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_hmac.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_hmac.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ * @brief HMAC: Keyed-Hashing for Message Authentication (RFC 2104) / FIPS-198-1. * HMAC-MD5 and HMAC-SHA-1 are also implemented. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_list.c b/branches/2.0/doubango/tinySAK/src/tsk_list.c index ea32b2b0..3bf935eb 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_list.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_list.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_list.c * @brief Linked list. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -110,7 +110,9 @@ int tsk_list_unlock(tsk_list_t* list) */ void tsk_list_remove_item(tsk_list_t* list, tsk_list_item_t* item) { - tsk_list_remove_item_by_pred(list, tsk_list_find_by_item, (const void*)item); + if(item){ + tsk_list_remove_item_by_pred(list, tsk_list_find_by_item, (const void*)item); + } } /**@ingroup tsk_list_group @@ -163,13 +165,16 @@ tsk_list_item_t* tsk_list_pop_item_by_data(tsk_list_t* list, const tsk_object_t * Removes an object from the @a list. * @param list The list from which to remove the object. * @param tskobj Any valid object(declared using @ref TSK_DECLARE_OBJECT) to remove. +* @retval True if removed and false otherwise */ -void tsk_list_remove_item_by_data(tsk_list_t* list, const tsk_object_t * tskobj) +tsk_bool_t tsk_list_remove_item_by_data(tsk_list_t* list, const tsk_object_t * tskobj) { tsk_list_item_t* item; if((item = tsk_list_pop_item_by_data(list, tskobj))){ tsk_object_unref(item); + return tsk_true; } + return tsk_false; } /**@ingroup tsk_list_group @@ -224,13 +229,16 @@ tsk_list_item_t* tsk_list_pop_item_by_pred(tsk_list_t* list, tsk_list_func_predi * @param list The list from which to remove the item. * @param predicate The predicate function used to match the item. * @param data Arbitrary data to pass to the predicate function. +* @retval True if removed and false otherwise */ -void tsk_list_remove_item_by_pred(tsk_list_t* list, tsk_list_func_predicate predicate, const void * data) +tsk_bool_t tsk_list_remove_item_by_pred(tsk_list_t* list, tsk_list_func_predicate predicate, const void * data) { tsk_list_item_t* item; if((item = tsk_list_pop_item_by_pred(list, predicate, data))){ tsk_object_unref(item); + return tsk_true; } + return tsk_false; } /**@ingroup tsk_list_group @@ -440,7 +448,7 @@ const tsk_list_item_t* tsk_list_find_item_by_pred(const tsk_list_t* list, tsk_li if(predicate){ const tsk_list_item_t *item; tsk_list_foreach(item, list){ - if(!predicate(item, data)){ + if(predicate(item, data) == 0){ return item; } } @@ -461,8 +469,15 @@ const tsk_list_item_t* tsk_list_find_item_by_pred(const tsk_list_t* list, tsk_li */ const tsk_object_t* tsk_list_find_object_by_pred(const tsk_list_t* list, tsk_list_func_predicate predicate, const void* data) { + return tsk_list_find_object_by_pred_at_index(list, predicate, data, 0); +} + +/**@ingroup tsk_list_group */ +const tsk_object_t* tsk_list_find_object_by_pred_at_index(const tsk_list_t* list, tsk_list_func_predicate predicate, const void* data, tsk_size_t index) +{ + tsk_size_t pos = 0; const tsk_list_item_t *item; - if((item = tsk_list_find_item_by_pred(list, predicate, data))){ + if((item = tsk_list_find_item_by_pred(list, predicate, data)) && pos++ >= index){ return item->data; } else{ @@ -470,20 +485,36 @@ const tsk_object_t* tsk_list_find_object_by_pred(const tsk_list_t* list, tsk_lis } } +/**@ingroup tsk_list_group */ +int tsk_list_find_index_by_pred(const tsk_list_t* list, tsk_list_func_predicate predicate, const void* data) +{ + if(list && predicate){ + int index = 0; + const tsk_list_item_t *item; + tsk_list_foreach(item, list){ + if(predicate(item, data) == 0){ + return index; + } + ++index; + } + } + return -1; +} + /**@ingroup tsk_list_group * Counts the number of item matching the predicate. * @param list The list containing the items to count -* @param predicate The predicate to use to match the items +* @param predicate The predicate to use to match the items. Set to null to count all items * @param data Data passed to the predicate function for comparaison * @retval The number of item matching the predicate */ tsk_size_t tsk_list_count(const tsk_list_t* list, tsk_list_func_predicate predicate, const void* data) { tsk_size_t count = 0; - if(predicate && list){ + if(list){ const tsk_list_item_t *item; tsk_list_foreach(item, list){ - if(!predicate(item, data)){ + if(!predicate || (predicate(item, data) == 0)){ ++count; } } diff --git a/branches/2.0/doubango/tinySAK/src/tsk_list.h b/branches/2.0/doubango/tinySAK/src/tsk_list.h index 5da47cc3..5deba1f1 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_list.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_list.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_list.h * @brief Linked list. For more information about linked list you can visit http://en.wikipedia.org/wiki/Linked_list. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -46,6 +46,7 @@ TSK_BEGIN_DECLS #define TSK_LIST_IS_LAST(self, item) ((self) ? ((self)->tail == item) : tsk_false) #define TSK_LIST_FIRST_DATA(self) (((self) && (self)->head) ? (self)->head->data : tsk_null) +#define TSK_LIST_LAST_DATA(self) (((self) && (self)->tail) ? (self)->tail->data : tsk_null) /**@ingroup tsk_list_group * Item for linked list. @@ -95,9 +96,11 @@ TINYSAK_API int tsk_list_lock(tsk_list_t* list); TINYSAK_API int tsk_list_unlock(tsk_list_t* list); TINYSAK_API void tsk_list_remove_item(tsk_list_t* list, tsk_list_item_t* item); +#define tsk_list_remove_first_item(list) tsk_list_remove_item((list), (list) ? (list)->head : tsk_null) +#define tsk_list_remove_last_item(list) tsk_list_remove_item((list), (list) ? (list)->tail : tsk_null) TINYSAK_API tsk_list_item_t* tsk_list_pop_item_by_data(tsk_list_t* list, const tsk_object_t * tskobj); -TINYSAK_API void tsk_list_remove_item_by_data(tsk_list_t* list, const tsk_object_t * tskobj); -TINYSAK_API void tsk_list_remove_item_by_pred(tsk_list_t* list, tsk_list_func_predicate predicate, const void * data); +TINYSAK_API tsk_bool_t tsk_list_remove_item_by_data(tsk_list_t* list, const tsk_object_t * tskobj); +TINYSAK_API tsk_bool_t tsk_list_remove_item_by_pred(tsk_list_t* list, tsk_list_func_predicate predicate, const void * data); TINYSAK_API tsk_list_item_t* tsk_list_pop_item_by_pred(tsk_list_t* list, tsk_list_func_predicate predicate, const void * data); TINYSAK_API void tsk_list_clear_items(tsk_list_t* list); @@ -123,6 +126,9 @@ TINYSAK_API int tsk_list_push_filtered_data(tsk_list_t* list, void** data, tsk_b TINYSAK_API const tsk_list_item_t* tsk_list_find_item_by_data(const tsk_list_t* list, const tsk_object_t * tskobj); TINYSAK_API const tsk_list_item_t* tsk_list_find_item_by_pred(const tsk_list_t* list, tsk_list_func_predicate predicate, const void* data); TINYSAK_API const tsk_object_t* tsk_list_find_object_by_pred(const tsk_list_t* list, tsk_list_func_predicate predicate, const void* data); +TINYSAK_API const tsk_object_t* tsk_list_find_object_by_pred_at_index(const tsk_list_t* list, tsk_list_func_predicate predicate, const void* data, tsk_size_t index); +TINYSAK_API int tsk_list_find_index_by_pred(const tsk_list_t* list, tsk_list_func_predicate predicate, const void* data); + TINYSAK_API tsk_size_t tsk_list_count(const tsk_list_t* list, tsk_list_func_predicate predicate, const void* data); TINYSAK_GEXTERN const tsk_object_def_t *tsk_list_def_t; diff --git a/branches/2.0/doubango/tinySAK/src/tsk_md5.c b/branches/2.0/doubango/tinySAK/src/tsk_md5.c index d26a9695..6a62e218 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_md5.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_md5.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ * @brief Implements Message-Digest algorithm 5 (RFC 1321). * * @author Colin Plumb - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -37,7 +37,7 @@ /**@defgroup tsk_md5_group MD5 (RFC 1321) utility functions. * The code in this file is a modified version of an implementation placed in the public domain by the following persons: * @author Colin Plumb - * @author Mamadou Diop + * @author Mamadou Diop */ /**@ingroup tsk_md5_group diff --git a/branches/2.0/doubango/tinySAK/src/tsk_md5.h b/branches/2.0/doubango/tinySAK/src/tsk_md5.h index dc2dc97a..87f711d2 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_md5.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_md5.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_md5.h * @brief Implements Message-Digest algorithm 5 (RFC 1321). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_memory.c b/branches/2.0/doubango/tinySAK/src/tsk_memory.c index af242e93..4330407c 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_memory.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_memory.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ * @brief Useful memory management functions to handle memory. * As I'm a lazy man, some definition come from this website
* - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_memory.h b/branches/2.0/doubango/tinySAK/src/tsk_memory.h index ad8b7148..1161bd15 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_memory.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_memory.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_memory.h * @brief Useful memory management functions to handle memory. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_mutex.c b/branches/2.0/doubango/tinySAK/src/tsk_mutex.c index 3cf59675..42cb6abd 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_mutex.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_mutex.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_mutex.c * @brief Pthread/Windows Mutex utility functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_mutex.h b/branches/2.0/doubango/tinySAK/src/tsk_mutex.h index 75477ac7..c02f7f2e 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_mutex.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_mutex.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_mutex.h * @brief Pthread Mutex. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_object.c b/branches/2.0/doubango/tinySAK/src/tsk_object.c index b14419ef..697c4774 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_object.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_object.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_object.c * @brief Base object implementation. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -43,15 +43,6 @@ static int tsk_objects_count = 0; # define TSK_DEBUG_OBJECTS 0 #endif -/** Object meta-data (definition). -*/ -typedef struct tsk_object_header_s{ - const void* base; /**< Opaque data holding a pointer to the actual meta-data(size, constructor, destructor and comparator) */ - int refCount; /**< Reference counter. */ -} -tsk_object_header_t; -#define TSK_OBJECT_HEADER(object) ((tsk_object_header_t*)object) - /**@ingroup tsk_object_group * Creates new object. The object MUST be declared using @ref TSK_DECLARE_OBJECT macro. * @param objdef The object meta-data (definition). For more infomation see @ref tsk_object_def_t. @@ -68,10 +59,15 @@ tsk_object_t* tsk_object_new(const tsk_object_def_t *objdef, ...) TSK_OBJECT_HEADER(newobj)->refCount = 1; if(objdef->constructor){ va_list ap; + tsk_object_t * newobj_ = newobj;// save va_start(ap, objdef); - newobj = objdef->constructor(newobj, &ap); + newobj = objdef->constructor(newobj, &ap); // must return new va_end(ap); + if(!newobj){ // null if constructor failed to initialized the object + tsk_free(&newobj_); + } + #if TSK_DEBUG_OBJECTS TSK_DEBUG_INFO("N∞ objects:%d", ++tsk_objects_count); #endif diff --git a/branches/2.0/doubango/tinySAK/src/tsk_object.h b/branches/2.0/doubango/tinySAK/src/tsk_object.h index 8604d009..e527a489 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_object.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_object.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_object.h * @brief Base object implementation. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -83,6 +83,14 @@ typedef void tsk_object_t; */ #define TSK_OBJECT_DEF(self) ((const tsk_object_def_t*)self) +/** Object meta-data (definition) */ +typedef struct tsk_object_header_s{ + const void* base; /**< Opaque data holding a pointer to the actual meta-data(size, constructor, destructor and comparator) */ + int refCount; /**< Reference counter. */ +} +tsk_object_header_t; +#define TSK_OBJECT_HEADER(object) ((tsk_object_header_t*)object) + /**@ingroup tsk_object_group * Meta-data used of define an object. * You MUST provide at least a constructor and a destructor. The comparator should diff --git a/branches/2.0/doubango/tinySAK/src/tsk_options.c b/branches/2.0/doubango/tinySAK/src/tsk_options.c index 86a8b7e6..2301a4c2 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_options.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_options.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_options.c * @brief Options. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_options.h b/branches/2.0/doubango/tinySAK/src/tsk_options.h index 71eefd58..6581b60b 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_options.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_options.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_options.h * @brief Options. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_params.c b/branches/2.0/doubango/tinySAK/src/tsk_params.c index 8c608c8d..bfd37245 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_params.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_params.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_params.c * @brief SIP/MSRP/XCAP Parameters parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_params.h b/branches/2.0/doubango/tinySAK/src/tsk_params.h index 90d1f4d0..03dc9049 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_params.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_params.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_params.h * @brief SIP/MSRP/XCAP Parameters parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_ppfcs16.c b/branches/2.0/doubango/tinySAK/src/tsk_ppfcs16.c index 3119348f..cc825747 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_ppfcs16.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_ppfcs16.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_ppfcs16.c * @brief PPP in HDLC-like Framing (RFC 1662). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_ppfcs16.h b/branches/2.0/doubango/tinySAK/src/tsk_ppfcs16.h index 6c77267d..af340d15 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_ppfcs16.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_ppfcs16.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_ppfcs16.h * @brief PPP in HDLC-like Framing (RFC 1662). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_ppfcs32.c b/branches/2.0/doubango/tinySAK/src/tsk_ppfcs32.c index 5bf1e171..e1a92651 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_ppfcs32.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_ppfcs32.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_ppfcs32.c * @brief PPP in HDLC-like Framing (RFC 1662). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_ppfcs32.h b/branches/2.0/doubango/tinySAK/src/tsk_ppfcs32.h index 37ddbd6d..f9cff1f5 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_ppfcs32.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_ppfcs32.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_ppfcs32.h * @brief PPP in HDLC-like Framing (RFC 1662). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_ragel_state.c b/branches/2.0/doubango/tinySAK/src/tsk_ragel_state.c index 0a9e829c..e0b6dd0f 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_ragel_state.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_ragel_state.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_ragel_state.c * @brief Ragel state for SIP, HTTP and MSRP parsing. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_ragel_state.h b/branches/2.0/doubango/tinySAK/src/tsk_ragel_state.h index de10247a..cf8c972d 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_ragel_state.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_ragel_state.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_ragel_state.h * @brief Ragel state for SIP, HTTP and MSRP parsing. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_runnable.c b/branches/2.0/doubango/tinySAK/src/tsk_runnable.c index 8f5c55e6..fbc2f5f3 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_runnable.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_runnable.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_runnable.c * @brief Base class for runnable object. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_runnable.h b/branches/2.0/doubango/tinySAK/src/tsk_runnable.h index 84c6eca7..3ab364a9 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_runnable.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_runnable.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_runnable.h * @brief Base class for runnable object. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_safeobj.c b/branches/2.0/doubango/tinySAK/src/tsk_safeobj.c index 7901be79..fb5f8365 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_safeobj.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_safeobj.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_safeobj.c * @brief Thread-Safe object. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_safeobj.h b/branches/2.0/doubango/tinySAK/src/tsk_safeobj.h index 96dfe41e..6d826b74 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_safeobj.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_safeobj.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_safeobj.h * @brief Thread-Safe object. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_semaphore.c b/branches/2.0/doubango/tinySAK/src/tsk_semaphore.c index 4aae9d44..579daf66 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_semaphore.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_semaphore.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_semaphore.c * @brief Pthread/Windows Semaphore utility functions. * -* @author Mamadou Diop +* @author Mamadou Diop * * @date Created: Sat Nov 8 16:54:58 2009 mdiop */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_semaphore.h b/branches/2.0/doubango/tinySAK/src/tsk_semaphore.h index f07247a6..205e8c02 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_semaphore.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_semaphore.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_semaphore.h * @brief Pthread Semaphore. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_sha1.c b/branches/2.0/doubango/tinySAK/src/tsk_sha1.c index 01eef013..8fed8710 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_sha1.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_sha1.c @@ -64,7 +64,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -86,7 +86,7 @@ /**@file tsk_sha1.c * @brief US Secure Hash Algorithm 1 (RFC 3174) * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_sha1.h b/branches/2.0/doubango/tinySAK/src/tsk_sha1.h index d733ab9f..ff1e3d30 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_sha1.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_sha1.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_sha1.h * @brief US Secure Hash Algorithm 1 (RFC 3174) * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -68,8 +68,8 @@ tsk_sha1_errcode_t; #define TSK_SHA1_BLOCK_SIZE 64 #define TSK_SHA1_STRING_SIZE (TSK_SHA1_DIGEST_SIZE*2) -typedef char tsk_sha1string_t[TSK_SHA1_STRING_SIZE+1]; -typedef char tsk_sha1digest_t[TSK_SHA1_DIGEST_SIZE]; /**< SHA-1 digest bytes. */ +typedef uint8_t tsk_sha1string_t[TSK_SHA1_STRING_SIZE+1]; +typedef uint8_t tsk_sha1digest_t[TSK_SHA1_DIGEST_SIZE]; /**< SHA-1 digest bytes. */ /**@ingroup tsk_sha1_group * Computes SHA-1 digest. diff --git a/branches/2.0/doubango/tinySAK/src/tsk_string.c b/branches/2.0/doubango/tinySAK/src/tsk_string.c index 1961d1b8..0087be5a 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_string.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_string.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ * @brief Useful string functions to manipulate strings. * As I'm a lazy man, some comments come from this website * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_string.h b/branches/2.0/doubango/tinySAK/src/tsk_string.h index 9f524c82..6c733667 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_string.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_string.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_string.h * @brief Useful string functions to manipulate strings. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_thread.c b/branches/2.0/doubango/tinySAK/src/tsk_thread.c index 689245dd..d62a7a28 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_thread.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_thread.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_thread.c * @brief Utility functions for threading. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_thread.h b/branches/2.0/doubango/tinySAK/src/tsk_thread.h index d56019cf..4a468975 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_thread.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_thread.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_thread.h * @brief Utility functions for threading. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_time.c b/branches/2.0/doubango/tinySAK/src/tsk_time.c index 0b56662f..58bc86ef 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_time.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_time.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_time.c * @brief Datetime functions. * -* @author Mamadou Diop +* @author Mamadou Diop * * @date Created: Sat Nov 8 16:54:58 2009 mdiop */ @@ -32,9 +32,7 @@ #include "tsk_debug.h" #if TSK_UNDER_WINDOWS -//# ifdef _WIN32_WCE -# include // timeval -//# endif +# include // timeval # include #elif defined(__SYMBIAN32__) # include <_timeval.h> @@ -144,20 +142,33 @@ uint64_t tsk_time_get_ms(const struct timeval* tv) uint64_t tsk_time_epoch() { struct timeval tv; - gettimeofday(&tv, 0); + gettimeofday(&tv, tsk_null); return (((uint64_t)tv.tv_sec)*(uint64_t)1000) + (((uint64_t)tv.tv_usec)/(uint64_t)1000); } +// /!\ NOT CURRENT TIME +// only make sense when comparing two values (e.g. for duration) uint64_t tsk_time_now() { #if TSK_UNDER_WINDOWS - static LARGE_INTEGER __liFrequency = {0}; - LARGE_INTEGER liPerformanceCount; - if(!__liFrequency.QuadPart){ - QueryPerformanceFrequency(&__liFrequency); + static int __cpu_count = 0; + if(__cpu_count == 0){ + SYSTEM_INFO SystemInfo; + GetSystemInfo(&SystemInfo); + __cpu_count = SystemInfo.dwNumberOfProcessors; + } + if(__cpu_count == 1){ + static LARGE_INTEGER __liFrequency = {0}; + LARGE_INTEGER liPerformanceCount; + if(!__liFrequency.QuadPart){ + QueryPerformanceFrequency(&__liFrequency); + } + QueryPerformanceCounter(&liPerformanceCount); + return (uint64_t)(((double)liPerformanceCount.QuadPart/(double)__liFrequency.QuadPart)*1000.0); + } + else{ + return timeGetTime(); } - QueryPerformanceCounter(&liPerformanceCount); - return (uint64_t)(((double)liPerformanceCount.QuadPart/(double)__liFrequency.QuadPart)*1000.0); #elif HAVE_CLOCK_GETTIME || _POSIX_TIMERS > 0 struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); @@ -170,8 +181,38 @@ uint64_t tsk_time_now() return (uint64_t)((mach_absolute_time() * __apple_timebase_info.numer) / (1e+6 * __apple_timebase_info.denom)); #else struct timeval tv; - gettimeofday(&tv, 0); + gettimeofday(&tv, tsk_null); return (((uint64_t)tv.tv_sec)*(uint64_t)1000) + (((uint64_t)tv.tv_usec)/(uint64_t)1000); #endif } +// http://en.wikipedia.org/wiki/Network_Time_Protocol +uint64_t tsk_time_ntp() +{ + struct timeval tv; + gettimeofday(&tv, tsk_null); + return tsk_time_get_ntp_ms(&tv); +} + +uint64_t tsk_time_get_ntp_ms(const struct timeval *tv) +{ + static const unsigned long __epoch = 2208988800UL; + static const double __ntp_scale_frac = 4294967295.0; + + uint64_t tv_ntp; + uint64_t tv_usecs; + + if(!tv){ + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + + tv_ntp = tv->tv_sec + __epoch; +#if 0 // ARM floating point calc issue (__aeabi_d2uiz) + tv_usecs = (tv->tv_usec * 1e-6) * __ntp_scale_frac; + return ((tv_ntp << 32) | (uint32_t)tv_usecs); +#else + tv_usecs = ((uint64_t)tv->tv_usec * (uint64_t)__ntp_scale_frac) / (uint64_t)1000000; + return ((((uint64_t)tv_ntp) << 32) | (uint32_t)tv_usecs); +#endif +} \ No newline at end of file diff --git a/branches/2.0/doubango/tinySAK/src/tsk_time.h b/branches/2.0/doubango/tinySAK/src/tsk_time.h index 4e922125..b0c81078 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_time.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_time.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_time.h * @brief Datetime functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -49,7 +49,8 @@ TINYSAK_API int tsk_gettimeofday(struct timeval *tv, struct timezone *tz); TINYSAK_API uint64_t tsk_time_get_ms(const struct timeval *tv); TINYSAK_API uint64_t tsk_time_epoch(); TINYSAK_API uint64_t tsk_time_now(); - +TINYSAK_API uint64_t tsk_time_ntp(); +TINYSAK_API uint64_t tsk_time_get_ntp_ms(const struct timeval *tv); TSK_END_DECLS diff --git a/branches/2.0/doubango/tinySAK/src/tsk_timer.c b/branches/2.0/doubango/tinySAK/src/tsk_timer.c index 6f95d3b9..4d848845 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_timer.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_timer.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_timer.c * @brief Timer Manager. * -* @author Mamadou Diop +* @author Mamadou Diop * * @date Created: Sat Nov 8 16:54:58 2009 mdiop */ @@ -181,6 +181,7 @@ int tsk_timer_manager_stop(tsk_timer_manager_handle_t *self) } bail: + tsk_list_clear_items(manager->timers); return ret; } @@ -191,6 +192,7 @@ tsk_timer_id_t tsk_timer_manager_schedule(tsk_timer_manager_handle_t *self, uint tsk_timer_id_t timer_id = TSK_INVALID_TIMER_ID; tsk_timer_manager_t *manager = self; + //FIXME if(manager && (TSK_RUNNABLE(manager)->running || TSK_RUNNABLE(manager)->started)){ tsk_timer_t *timer; @@ -200,7 +202,7 @@ tsk_timer_id_t tsk_timer_manager_schedule(tsk_timer_manager_handle_t *self, uint tsk_list_push_ascending_data(manager->timers, ((void**) &timer)); tsk_mutex_unlock(manager->mutex); - //tsk_timer_manager_debug(self); + // tsk_timer_manager_debug(self); tsk_condwait_signal(manager->condwait); tsk_semaphore_increment(manager->sem); @@ -228,6 +230,7 @@ int tsk_timer_manager_cancel(tsk_timer_manager_handle_t *self, tsk_timer_id_t id if(item && item->data){ tsk_timer_t *timer = item->data; timer->canceled = 1; + timer->callback = tsk_null; if(item == manager->timers->head){ /* The timer we are waiting on ? ==> remove it now. */ @@ -298,7 +301,7 @@ static void *__tsk_timer_manager_mainthread(void *param) { int ret; tsk_timer_t *curr; - uint64_t epoch; + uint64_t now; tsk_timer_manager_t *manager = param; TSK_DEBUG_INFO("TIMER MANAGER -- START"); @@ -316,18 +319,18 @@ peek_first: tsk_mutex_unlock(manager->mutex); if(curr && !curr->canceled) { - epoch = tsk_time_now(); - if(epoch >= curr->timeout){ + now = tsk_time_now(); + if(now >= curr->timeout){ tsk_timer_t *timer = tsk_object_ref(curr); //TSK_DEBUG_INFO("Timer raise %llu", timer->id); - tsk_mutex_lock(manager->mutex); TSK_RUNNABLE_ENQUEUE_OBJECT_SAFE(TSK_RUNNABLE(manager), timer); + tsk_mutex_lock(manager->mutex); tsk_list_remove_item_by_data(manager->timers, curr); tsk_mutex_unlock(manager->mutex); } else{ - if((ret = tsk_condwait_timedwait(manager->condwait, (curr->timeout - epoch)))){ + if((ret = tsk_condwait_timedwait(manager->condwait, (curr->timeout - now)))){ TSK_DEBUG_ERROR("CONWAIT for timer manager failed [%d]", ret); break; } @@ -381,7 +384,9 @@ int tsk_timer_mgr_global_start() return ret; } } + tsk_mutex_lock(__timer_mgr->mutex); __timer_mgr_start_count++; + tsk_mutex_unlock(__timer_mgr->mutex); return ret; } @@ -422,7 +427,9 @@ int tsk_timer_mgr_global_stop() return ret; } } + tsk_mutex_lock(__timer_mgr->mutex); __timer_mgr_start_count--; + tsk_mutex_unlock(__timer_mgr->mutex); } return 0; } diff --git a/branches/2.0/doubango/tinySAK/src/tsk_timer.h b/branches/2.0/doubango/tinySAK/src/tsk_timer.h index 28e6c545..e241889e 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_timer.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_timer.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_timer.h * @brief Timer Manager. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_url.c b/branches/2.0/doubango/tinySAK/src/tsk_url.c index 88955a2b..6bd90ab2 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_url.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_url.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_url.c * @brief Utility functions to encode/decode urls. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_url.h b/branches/2.0/doubango/tinySAK/src/tsk_url.h index 76a412c7..70716136 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_url.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_url.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_url.h * @brief Useful string functions to manipulate strings. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_uuid.c b/branches/2.0/doubango/tinySAK/src/tsk_uuid.c index 6b4e7aab..61fbe0cb 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_uuid.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_uuid.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ * @brief Universally Unique Identifier (UUID version 5) implementation (RFC 4122). * This implementation is not fully conform to RFC 4122 but could be safely used to generate random UUIDs. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_uuid.h b/branches/2.0/doubango/tinySAK/src/tsk_uuid.h index 1b377b8a..3ec300ea 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_uuid.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_uuid.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ * @brief Universally Unique Identifier (UUID version 5) implementation (RFC 4122). * This implementation is not fully conform to RFC 4122 but could be safely used to generate random UUIDs. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_xml.c b/branches/2.0/doubango/tinySAK/src/tsk_xml.c index 2501460e..2e581da3 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_xml.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_xml.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_xml.c * @brief Useful functions to manipulate xml documents. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_xml.h b/branches/2.0/doubango/tinySAK/src/tsk_xml.h index 1edd469c..8af6fa3a 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_xml.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_xml.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsk_xml.h * @brief Useful functions to manipulate xml document. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySAK/test/test_sha1.h b/branches/2.0/doubango/tinySAK/test/test_sha1.h index b02464c2..412988a7 100644 --- a/branches/2.0/doubango/tinySAK/test/test_sha1.h +++ b/branches/2.0/doubango/tinySAK/test/test_sha1.h @@ -79,6 +79,11 @@ void test_hmac_sha1() size_t i; tsk_sha1string_t sha1result; + // const uint8_t* bytes = "\x00\x01\x00\x3c\x21\x12\xa4\x42\x33\x6f\x57\x50\x31\x4f\x4d\x65\x65\x58\x73\x7a\x00\x06\x00\x20\x33\x68\x50\x30\x6f\x53\x7a\x6b\x48\x75\x33\x52\x56\x2f\x4c\x35\x48\x49\x78\x49\x70\x34\x73\x55\x46\x47\x73\x38\x55\x6a\x4b\x57\x00\x08\x00\x14\x21\xee\x75\x15\xc0\x9c\x0a\x90\xf2\xf3\xa5\x3e\x22\x00\x0c\xd3\xd5\xc0\x2c\x82"; + //const uint8_t* bytes = "\x00\x01\x00\x24\x21\x12\xa4\x42\x33\x6f\x57\x50\x31\x4f\x4d\x65\x65\x58\x73\x7a\x00\x06\x00\x20\x33\x68\x50\x30\x6f\x53\x7a\x6b\x48\x75\x33\x52\x56\x2f\x4c\x35\x48\x49\x78\x49\x70\x34\x73\x55\x46\x47\x73\x38\x55\x6a\x4b\x57\x00\x08\x00\x14\x21\xee\x75\x15\xc0\x9c\x0a\x90\xf2\xf3\xa5\x3e\x22\x00\x0c\xd3\xd5\xc0\x2c\x82"; + + //hmac_sha1_compute(bytes, 56, "tLzlCDl+o9yiWkp3", tsk_strlen("tLzlCDl+o9yiWkp3"), &sha1result); + for(i=0; i< sizeof(hmac_sha1_msgs)/sizeof(struct hmac_sha1_result); i++) { hmac_sha1_compute((const uint8_t*)hmac_sha1_msgs[i].msg, strlen(hmac_sha1_msgs[i].msg), hmac_sha1_msgs[i].key, strlen(hmac_sha1_msgs[i].key), &sha1result); diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp.h b/branches/2.0/doubango/tinySDP/include/tinysdp.h index 49fb25b8..f676ef15 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tinysdp.h * @brief SDP API functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header.h b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header.h index eab32d12..1e50285e 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header.h * @brief Defines a SDP header/line (=). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_A.h b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_A.h index 7c626c56..cd495bdc 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_A.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_A.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_A.h * @brief SDP "a=" header (Attributes). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_B.h b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_B.h index a5cf8d4d..2fd0d7c3 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_B.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_B.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_B.h * @brief SDP "b=" header (Bandwidth). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_C.h b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_C.h index a1ea3395..eacf8415 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_C.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_C.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_C.h * @brief SDP "c=" header (Connection Data). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_Dummy.h b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_Dummy.h index 79028b94..9cb98159 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_Dummy.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_Dummy.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_Dummy.h * @brief SDP dummy header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_E.h b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_E.h index a622cae7..5299d338 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_E.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_E.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_E.h * @brief SDP "e=" header (Email Address). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_I.h b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_I.h index 9cd9b46a..4ca56da3 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_I.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_I.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_I.h * @brief SDP "i=" header (Session Information). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_K.h b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_K.h index 38697c18..bd99fed8 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_K.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_K.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_K.h * @brief SDP "k=" header (Encryption Key). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_M.h b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_M.h index ce35a432..8d1db484 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_M.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_M.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_M.h * @brief SDP "m=" header (Media Descriptions). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ @@ -104,14 +104,17 @@ TINYSDP_API tsdp_header_M_t* tsdp_header_M_create(const char* media, uint32_t po TINYSDP_API tsdp_header_M_t* tsdp_header_M_create_null(); TINYSDP_API tsdp_header_M_t *tsdp_header_M_parse(const char *data, tsk_size_t size); +TINYSDP_API int tsdp_header_M_remove(tsdp_header_M_t* self, tsdp_header_type_t type); TINYSDP_API int tsdp_header_M_add(tsdp_header_M_t* self, const tsdp_header_t* header); TINYSDP_API int tsdp_header_M_add_headers(tsdp_header_M_t* self, ...); TINYSDP_API int tsdp_header_M_add_headers_2(tsdp_header_M_t* self, const tsdp_headers_L_t* headers); TINYSDP_API int tsdp_header_M_add_fmt(tsdp_header_M_t* self, const char* fmt); TINYSDP_API const tsdp_header_A_t* tsdp_header_M_findA_at(const tsdp_header_M_t* self, const char* field, tsk_size_t index); TINYSDP_API const tsdp_header_A_t* tsdp_header_M_findA(const tsdp_header_M_t* self, const char* field); -TINYSDP_API char* tsdp_header_M_get_rtpmap(const tsdp_header_M_t* self, const char* fmt); -TINYSDP_API char* tsdp_header_M_get_fmtp(const tsdp_header_M_t* self, const char* fmt); +TINYSDP_API char* tsdp_header_M_getAValue(const tsdp_header_M_t* self, const char* field, const char* fmt); +#define tsdp_header_M_get_rtpmap(self, fmt) tsdp_header_M_getAValue((self), "rtpmap", (fmt)) +#define tsdp_header_M_get_fmtp(self, fmt) tsdp_header_M_getAValue((self), "fmtp", (fmt)) +#define tsdp_header_M_get_imageattr(self, fmt) tsdp_header_M_getAValue((self), "imageattr", (fmt)) TINYSDP_API int tsdp_header_M_hold(tsdp_header_M_t* self, tsk_bool_t local); TINYSDP_API tsk_bool_t tsdp_header_M_is_held(const tsdp_header_M_t* self, tsk_bool_t local); TINYSDP_API int tsdp_header_M_set_holdresume_att(tsdp_header_M_t* self, tsk_bool_t lo_held, tsk_bool_t ro_held); diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_O.h b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_O.h index 4d285663..fda2940e 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_O.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_O.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_O.h * @brief SDP "o=" header (Origin). * - * @author Mamadou Diop + * @author Mamadou Diop * * @date Created: Oat Nov 8 16:54:58 2009 mdiop */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_P.h b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_P.h index 399d4bee..faba60c8 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_P.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_P.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_P.h * @brief SDP "p=" header (Phone Number). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_R.h b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_R.h index aa978a2b..1f8caf35 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_R.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_R.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_R.h * @brief SDP "r=" header (Repeat Times). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_S.h b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_S.h index 83452211..b8605e7d 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_S.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_S.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_S.h * @brief SDP "s=" header (Session Name). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_T.h b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_T.h index cf6f07e3..2534fe19 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_T.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_T.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_T.h * @brief SDP "t=" header (Timing). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_U.h b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_U.h index 7715e258..a44963ee 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_U.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_U.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_U.h * @brief SDP "u=" header (URI). * - * @author Mamadou Diop + * @author Mamadou Diop * * @date Created: Uat Nov 8 16:54:58 2009 mdiop */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_V.h b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_V.h index 653e5749..88025554 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_V.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_V.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_V.h * @brief SDP "v=" header (Protocol Version). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_Z.h b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_Z.h index 26e377e3..deef51d2 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_Z.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/headers/tsdp_header_Z.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_Z.h * @brief SDP "z=" header (Time Zones). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/parsers/tsdp_parser_message.h b/branches/2.0/doubango/tinySDP/include/tinysdp/parsers/tsdp_parser_message.h index bdff905b..f506d132 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/parsers/tsdp_parser_message.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/parsers/tsdp_parser_message.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_parser_message.h * @brief SDP message parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp/tsdp_message.h b/branches/2.0/doubango/tinySDP/include/tinysdp/tsdp_message.h index 1b23be94..a0195d3a 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp/tsdp_message.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp/tsdp_message.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_message.h * @brief SDP message. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -80,6 +80,8 @@ static void TSDP_MESSAGE_ADD_HEADER(tsdp_message_t *self, ...) TINYSDP_API const tsdp_header_t *tsdp_message_get_headerAt(const tsdp_message_t *self, tsdp_header_type_t type, tsk_size_t index); TINYSDP_API const tsdp_header_t *tsdp_message_get_header(const tsdp_message_t *self, tsdp_header_type_t type); +TINYSDP_API const tsdp_header_A_t* tsdp_message_get_headerA_at(const tsdp_message_t* self, const char* field, tsk_size_t index); +TINYSDP_API const tsdp_header_A_t* tsdp_message_get_headerA(const tsdp_message_t* self, const char* field); TINYSDP_API const tsdp_header_t *tsdp_message_get_headerByName(const tsdp_message_t *self, char name); TINYSDP_API int tsdp_message_serialize(const tsdp_message_t *self, tsk_buffer_t *output); @@ -90,6 +92,7 @@ TINYSDP_API tsdp_message_t* tsdp_message_clone(const tsdp_message_t *self); TINYSDP_API int tsdp_message_add_media(tsdp_message_t *self, const char* media, uint32_t port, const char* proto, ...); TINYSDP_API int tsdp_message_add_media_2(tsdp_message_t *self, const char* media, uint32_t port, const char* proto, va_list *ap); TINYSDP_API int tsdp_message_remove_media(tsdp_message_t *self, const char* media); +TINYSDP_API const tsdp_header_M_t* tsdp_message_find_media(const tsdp_message_t *self, const char* media); // 3GPP TS 24.610 Communication HOLD diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp_config.h b/branches/2.0/doubango/tinySDP/include/tinysdp_config.h index c00a2192..a94eb9b0 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp_config.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp_config.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySDP/include/tsdp.h b/branches/2.0/doubango/tinySDP/include/tsdp.h index 3776823f..0b6e3c25 100644 --- a/branches/2.0/doubango/tinySDP/include/tsdp.h +++ b/branches/2.0/doubango/tinySDP/include/tsdp.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tsdp.h * @brief SDP (RFC 4566) implementations with both MMTel and PoC extensions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_machine_utils.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_machine_utils.rl index 29a30091..2f30a227 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_machine_utils.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_machine_utils.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tsdp_machine_utils.rl * @brief Ragel file. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_A.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_A.rl index 541ebf8d..2db0fd06 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_A.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_A.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsdp_header_A.c * @brief SDP "a=" header (Attributes). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_B.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_B.rl index ef7083e5..88208714 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_B.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_B.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsdp_header_B.c * @brief SDP "b=" header (Bandwidth). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_C.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_C.rl index 52d717bd..7a8c2f17 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_C.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_C.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsdp_header_C.c * @brief "c=" header (Connection Data). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_Dummy.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_Dummy.rl index 8b7fe9ea..01088196 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_Dummy.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_Dummy.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_Dummy.c * @brief SDP Dummy header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_E.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_E.rl index 5c006170..9753f722 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_E.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_E.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsdp_header_E.c * @brief SDP "e=" header (Session Information). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_I.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_I.rl index 8ff76287..04476e5b 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_I.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_I.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsdp_header_I.c * @brief SDP "i=" header (Session Information). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_K.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_K.rl index a6c72c7e..b5fca978 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_K.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_K.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsdp_header_K.c * @brief SDP "k=" header (Encryption Key). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_M.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_M.rl index c6bdaedb..5a254365 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_M.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_M.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsdp_header_M.c * @brief SDP "m=" header (Media Descriptions). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ @@ -232,7 +232,35 @@ tsdp_header_M_t *tsdp_header_M_parse(const char *data, tsk_size_t size) return hdr_M; } - +// for A headers, use "tsdp_header_A_removeAll_by_field()" +int tsdp_header_M_remove(tsdp_header_M_t* self, tsdp_header_type_t type) +{ + switch(type){ + case tsdp_htype_I: + { + TSK_OBJECT_SAFE_FREE(self->I); + break; + } + case tsdp_htype_C: + { + TSK_OBJECT_SAFE_FREE(self->C); + break; + } + case tsdp_htype_B: + { + if(self->Bandwidths){ + tsk_list_clear_items(self->Bandwidths); + } + break; + } + case tsdp_htype_K: + { + TSK_OBJECT_SAFE_FREE(self->K); + break; + } + } + return 0; +} int tsdp_header_M_add(tsdp_header_M_t* self, const tsdp_header_t* header) { @@ -378,9 +406,9 @@ const tsdp_header_A_t* tsdp_header_M_findA(const tsdp_header_M_t* self, const ch return tsdp_header_M_findA_at(self, field, 0); } -char* tsdp_header_M_get_rtpmap(const tsdp_header_M_t* self, const char* fmt) -{ - char *rtpmap = tsk_null; /* e.g. AMR-WB/16000 */ +char* tsdp_header_M_getAValue(const tsdp_header_M_t* self, const char* field, const char* fmt) +{ + char *value = tsk_null; /* e.g. AMR-WB/16000 */ tsk_size_t i = 0, fmt_len, A_len; int indexof; const tsdp_header_A_t* A; @@ -392,44 +420,17 @@ char* tsdp_header_M_get_rtpmap(const tsdp_header_M_t* self, const char* fmt) } /* find "a=rtpmap" */ - while((A = tsdp_header_M_findA_at(self, "rtpmap", i++))){ + while((A = tsdp_header_M_findA_at(self, field, i++))){ /* A->value would be: "98 AMR-WB/16000" */ if((A_len = tsk_strlen(A->value)) < (fmt_len + 1/*space*/)){ continue; } if((indexof = tsk_strindexOf(A->value, A_len, fmt)) == 0 && (A->value[fmt_len] == ' ')){ - rtpmap = tsk_strndup(&A->value[fmt_len+1], (A_len-(fmt_len+1))); + value = tsk_strndup(&A->value[fmt_len+1], (A_len-(fmt_len+1))); break; } } - return rtpmap; -} - -char* tsdp_header_M_get_fmtp(const tsdp_header_M_t* self, const char* fmt) -{ - char *fmtp = tsk_null; /* e.g. octet-align=1 */ - tsk_size_t i = 0, fmt_len, A_len; - int indexof; - const tsdp_header_A_t* A; - - fmt_len = tsk_strlen(fmt); - if(!self || !fmt_len || fmt_len > 3/*'0-255' or '*'*/){ - TSK_DEBUG_ERROR("Invalid parameter"); - return tsk_null; - } - - /* find "a=fmtp" */ - while((A = tsdp_header_M_findA_at(self, "fmtp", i++))){ - /* A->value would be: "98 octet-align=1" */ - if((A_len = tsk_strlen(A->value)) < (fmt_len + 1/*space*/)){ - continue; - } - if((indexof = tsk_strindexOf(A->value, A_len, fmt)) == 0 && (A->value[fmt_len] == ' ')){ - fmtp = tsk_strndup(&A->value[fmt_len+1], (A_len-(fmt_len+1))); - break; - } - } - return fmtp; + return value; } /* as per 3GPP TS 34.610 */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_O.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_O.rl index 2215734b..f4ff5915 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_O.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_O.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_O.c * @brief SDP "o=" header (Origin). * - * @author Mamadou Diop + * @author Mamadou Diop * * @date Created: Uat Nov 8 16:54:58 2009 mdiop */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_P.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_P.rl index 5ae25c1b..319cc77e 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_P.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_P.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsdp_header_P.c * @brief SDP "p=" header (Phone Number). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_R.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_R.rl index 3ff56d18..a2364bdc 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_R.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_R.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsdp_header_R.c * @brief SDP "r=" header (Repeat Times). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_S.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_S.rl index c47309b9..96ffc741 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_S.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_S.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_S.c * @brief SDP "s=" header (Session Name). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_T.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_T.rl index cf54a360..a71de9c9 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_T.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_T.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_T.c * @brief SDP "t=" header (Timing). * - * @author Mamadou Diop + * @author Mamadou Diop * * @date Created: Uat Nov 8 16:54:58 2009 mdiop */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_U.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_U.rl index 06df2d21..5bdff610 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_U.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_U.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_U.c * @brief SDP "u=" header (URI). * - * @author Mamadou Diop + * @author Mamadou Diop * * @date Created: Uat Nov 8 16:54:58 2009 mdiop */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_V.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_V.rl index 957b2ba5..98002690 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_V.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_V.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header_V.c * @brief SDP "v=" header (Protocol Version). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_Z.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_Z.rl index 45f6b574..acdd8088 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_Z.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_Z.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsdp_header_Z.c * @brief SDP "z=" header (Time Zones). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_message.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_message.rl index 05a58152..3bb08d24 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_message.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_message.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tsdp_machine_message.rl * @brief Ragel file. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header.c index 52b3e9ee..8ab5ac17 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_header.c * @brief Defines a SDP header/line (=). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_A.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_A.c index e0267f41..1ae2d056 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_A.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_A.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsdp_header_A.c * @brief SDP "a=" header (Attributes). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_B.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_B.c index a03fd28b..1f40f69e 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_B.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_B.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsdp_header_B.c * @brief SDP "b=" header (Bandwidth). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_C.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_C.c index 5249836d..214a256e 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_C.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_C.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsdp_header_C.c * @brief "c=" header (Connection Data). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_Dummy.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_Dummy.c index e86db21f..3855f21e 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_Dummy.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_Dummy.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsdp_header_Dummy.c * @brief SDP Dummy header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_E.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_E.c index 9141ab10..ec140fa4 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_E.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_E.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsdp_header_E.c * @brief SDP "e=" header (Session Information). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_I.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_I.c index b6a5e063..880377a6 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_I.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_I.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsdp_header_I.c * @brief SDP "i=" header (Session Information). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_K.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_K.c index 20b50dbd..29a5fa8d 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_K.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_K.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsdp_header_K.c * @brief SDP "k=" header (Encryption Key). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_M.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_M.c index 6f76fcec..dbe5b02e 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_M.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_M.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsdp_header_M.c * @brief SDP "m=" header (Media Descriptions). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ @@ -430,7 +430,35 @@ _again: return hdr_M; } - +// for A headers, use "tsdp_header_A_removeAll_by_field()" +int tsdp_header_M_remove(tsdp_header_M_t* self, tsdp_header_type_t type) +{ + switch(type){ + case tsdp_htype_I: + { + TSK_OBJECT_SAFE_FREE(self->I); + break; + } + case tsdp_htype_C: + { + TSK_OBJECT_SAFE_FREE(self->C); + break; + } + case tsdp_htype_B: + { + if(self->Bandwidths){ + tsk_list_clear_items(self->Bandwidths); + } + break; + } + case tsdp_htype_K: + { + TSK_OBJECT_SAFE_FREE(self->K); + break; + } + } + return 0; +} int tsdp_header_M_add(tsdp_header_M_t* self, const tsdp_header_t* header) { @@ -576,9 +604,9 @@ const tsdp_header_A_t* tsdp_header_M_findA(const tsdp_header_M_t* self, const ch return tsdp_header_M_findA_at(self, field, 0); } -char* tsdp_header_M_get_rtpmap(const tsdp_header_M_t* self, const char* fmt) -{ - char *rtpmap = tsk_null; /* e.g. AMR-WB/16000 */ +char* tsdp_header_M_getAValue(const tsdp_header_M_t* self, const char* field, const char* fmt) +{ + char *value = tsk_null; /* e.g. AMR-WB/16000 */ tsk_size_t i = 0, fmt_len, A_len; int indexof; const tsdp_header_A_t* A; @@ -590,44 +618,17 @@ char* tsdp_header_M_get_rtpmap(const tsdp_header_M_t* self, const char* fmt) } /* find "a=rtpmap" */ - while((A = tsdp_header_M_findA_at(self, "rtpmap", i++))){ + while((A = tsdp_header_M_findA_at(self, field, i++))){ /* A->value would be: "98 AMR-WB/16000" */ if((A_len = tsk_strlen(A->value)) < (fmt_len + 1/*space*/)){ continue; } if((indexof = tsk_strindexOf(A->value, A_len, fmt)) == 0 && (A->value[fmt_len] == ' ')){ - rtpmap = tsk_strndup(&A->value[fmt_len+1], (A_len-(fmt_len+1))); + value = tsk_strndup(&A->value[fmt_len+1], (A_len-(fmt_len+1))); break; } } - return rtpmap; -} - -char* tsdp_header_M_get_fmtp(const tsdp_header_M_t* self, const char* fmt) -{ - char *fmtp = tsk_null; /* e.g. octet-align=1 */ - tsk_size_t i = 0, fmt_len, A_len; - int indexof; - const tsdp_header_A_t* A; - - fmt_len = tsk_strlen(fmt); - if(!self || !fmt_len || fmt_len > 3/*'0-255' or '*'*/){ - TSK_DEBUG_ERROR("Invalid parameter"); - return tsk_null; - } - - /* find "a=fmtp" */ - while((A = tsdp_header_M_findA_at(self, "fmtp", i++))){ - /* A->value would be: "98 octet-align=1" */ - if((A_len = tsk_strlen(A->value)) < (fmt_len + 1/*space*/)){ - continue; - } - if((indexof = tsk_strindexOf(A->value, A_len, fmt)) == 0 && (A->value[fmt_len] == ' ')){ - fmtp = tsk_strndup(&A->value[fmt_len+1], (A_len-(fmt_len+1))); - break; - } - } - return fmtp; + return value; } /* as per 3GPP TS 34.610 */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_O.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_O.c index 2e5eef51..6aea8af0 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_O.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_O.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsdp_header_O.c * @brief SDP "o=" header (Origin). * - * @author Mamadou Diop + * @author Mamadou Diop * * @date Created: Uat Nov 8 16:54:58 2009 mdiop */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_P.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_P.c index b53d8fff..1a533a4a 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_P.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_P.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsdp_header_P.c * @brief SDP "p=" header (Phone Number). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_R.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_R.c index 97df1eba..75bd4167 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_R.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_R.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsdp_header_R.c * @brief SDP "r=" header (Repeat Times). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_S.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_S.c index 4de08edc..771dbf6b 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_S.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_S.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsdp_header_S.c * @brief SDP "s=" header (Session Name). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_T.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_T.c index 26cc028b..f4b6da4f 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_T.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_T.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsdp_header_T.c * @brief SDP "t=" header (Timing). * - * @author Mamadou Diop + * @author Mamadou Diop * * @date Created: Uat Nov 8 16:54:58 2009 mdiop */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_U.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_U.c index 0b220ccf..8deb014e 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_U.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_U.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsdp_header_U.c * @brief SDP "u=" header (URI). * - * @author Mamadou Diop + * @author Mamadou Diop * * @date Created: Uat Nov 8 16:54:58 2009 mdiop */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_V.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_V.c index 968d7dc3..a0a89b46 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_V.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_V.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsdp_header_V.c * @brief SDP "v=" header (Protocol Version). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_Z.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_Z.c index ddbfe878..208b6f28 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_Z.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_Z.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsdp_header_Z.c * @brief SDP "z=" header (Time Zones). * - * @author Mamadou Diop + * @author Mamadou Diop * * */ diff --git a/branches/2.0/doubango/tinySDP/src/parsers/tsdp_parser_message.c b/branches/2.0/doubango/tinySDP/src/parsers/tsdp_parser_message.c index 784ae3ca..d8226fc0 100644 --- a/branches/2.0/doubango/tinySDP/src/parsers/tsdp_parser_message.c +++ b/branches/2.0/doubango/tinySDP/src/parsers/tsdp_parser_message.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsdp_machine_message.rl * @brief Ragel file. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/src/tsdp.c b/branches/2.0/doubango/tinySDP/src/tsdp.c index 08602532..465117d5 100644 --- a/branches/2.0/doubango/tinySDP/src/tsdp.c +++ b/branches/2.0/doubango/tinySDP/src/tsdp.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tsdp.c * @brief SDP (RFC 4566) implementations with both MMTel and PoC extensions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySDP/src/tsdp_message.c b/branches/2.0/doubango/tinySDP/src/tsdp_message.c index 0dfd50ac..b8384935 100644 --- a/branches/2.0/doubango/tinySDP/src/tsdp_message.c +++ b/branches/2.0/doubango/tinySDP/src/tsdp_message.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsdp_message.c * @brief SDP message. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -168,6 +168,35 @@ const tsdp_header_t *tsdp_message_get_header(const tsdp_message_t *self, tsdp_he return tsdp_message_get_headerAt(self, type, 0); } +const tsdp_header_A_t* tsdp_message_get_headerA_at(const tsdp_message_t* self, const char* field, tsk_size_t index) +{ + + tsk_size_t pos = 0; + const tsk_list_item_t *item; + const tsdp_header_t *hdr; + const tsdp_header_A_t *hdrA; + + if(!self || !self->headers){ + return tsk_null; + } + + tsk_list_foreach(item, self->headers){ + hdr = item->data; + if((hdr->type == tsdp_htype_A) && (hdrA = (const tsdp_header_A_t *)hdr) && (tsk_striequals(hdrA->field, field))){ + if(pos++ >= index){ + return hdrA; + } + } + } + + return tsk_null; +} + +const tsdp_header_A_t* tsdp_message_get_headerA(const tsdp_message_t* self, const char* field) +{ + return tsdp_message_get_headerA_at(self, field, 0); +} + const tsdp_header_t *tsdp_message_get_headerByName(const tsdp_message_t *self, char name) { if(self){ @@ -308,16 +337,23 @@ int tsdp_message_add_media_2(tsdp_message_t *self, const char* media, uint32_t p int tsdp_message_remove_media(tsdp_message_t *self, const char* media) { - int ret = -1; - - if(!self){ - goto bail; + if(!self || !media){ + return 0; } tsk_list_remove_item_by_pred(self->headers, __pred_find_media_by_name, media); + return 0; +} -bail: - return ret; +const tsdp_header_M_t* tsdp_message_find_media(const tsdp_message_t *self, const char* media) +{ + if(self && media){ + const tsk_list_item_t* item; + if((item = tsk_list_find_item_by_pred(self->headers, __pred_find_media_by_name, media))){ + return TSDP_HEADER_M(item->data); + } + } + return tsk_null; } diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp.c index f5dc558a..cfb2b50d 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp.h index 350d6e1f..a49a9de2 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_buffer.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_buffer.c index 0080568b..3d8b1130 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_buffer.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_buffer.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_buffer.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_buffer.h index 05b9a8f3..641656f9 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_buffer.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_buffer.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compartment.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compartment.c index 2fcf8068..144fb923 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compartment.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compartment.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compartment.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compartment.h index 9fdcc62d..2ab019da 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compartment.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compartment.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor.h index e458adbc..6d714011 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor_deflate.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor_deflate.c index 1469e6fc..4d153bf7 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor_deflate.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor_deflate.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor_deflate.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor_deflate.h index d3afc7e1..81216ada 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor_deflate.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor_deflate.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor_dummy.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor_dummy.c index 0194ddfe..47544c13 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor_dummy.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor_dummy.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor_dummy.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor_dummy.h index f3f9a017..50c7c88b 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor_dummy.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressor_dummy.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressordata.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressordata.c index 913b9468..1d8fe541 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressordata.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressordata.c @@ -1,7 +1,7 @@ ///* //* Copyright (C) 2010-2011 Mamadou Diop. //* -//* Contact: Mamadou Diop +//* Contact: Mamadou Diop //* //* This file is part of Open Source Doubango Framework. //* diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressordata.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressordata.h index 7f10ea01..917fa5ef 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressordata.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressordata.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressordisp.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressordisp.c index ae58ded1..350e4223 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressordisp.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressordisp.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressordisp.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressordisp.h index d0d29a83..17146f53 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressordisp.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_compressordisp.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_decompressordisp.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_decompressordisp.c index f5817e8c..87078a76 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_decompressordisp.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_decompressordisp.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_decompressordisp.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_decompressordisp.h index 0c6751b6..f2f139a6 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_decompressordisp.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_decompressordisp.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_deflatedata.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_deflatedata.c index 7c151211..eb83966e 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_deflatedata.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_deflatedata.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_deflatedata.ghost.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_deflatedata.ghost.c index 9855a492..7987cff3 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_deflatedata.ghost.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_deflatedata.ghost.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_deflatedata.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_deflatedata.h index c093ddd3..da521323 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_deflatedata.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_deflatedata.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_deflatedata.zlib.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_deflatedata.zlib.c index cf0a57de..97548cdf 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_deflatedata.zlib.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_deflatedata.zlib.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_dicts.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_dicts.c index f16f5b2c..b87a7578 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_dicts.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_dicts.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_dicts.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_dicts.h index 57a26aeb..dab3d887 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_dicts.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_dicts.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_headers_index.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_headers_index.h index f7dc5f7b..0402debd 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_headers_index.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_headers_index.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_instructions.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_instructions.h index 95f52f60..5eec34cf 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_instructions.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_instructions.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_manager.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_manager.c index 81e9e214..1d8f8af0 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_manager.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_manager.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_manager.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_manager.h index a97ab216..58e9227a 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_manager.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_manager.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_message.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_message.c index 32ffb9c1..e432ca8e 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_message.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_message.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_message.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_message.h index 83f33390..4cf772cf 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_message.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_message.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_nack_codes.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_nack_codes.h index a566d9d9..4fbcc57f 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_nack_codes.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_nack_codes.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_nackinfo.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_nackinfo.c index 9ae6365d..cc332aec 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_nackinfo.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_nackinfo.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_nackinfo.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_nackinfo.h index cf0208ad..4e5e7c15 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_nackinfo.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_nackinfo.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_operands.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_operands.h index a8726be7..985391a4 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_operands.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_operands.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_params.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_params.c index 713ecf31..b36e9737 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_params.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_params.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_params.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_params.h index a82acda0..e39fe547 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_params.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_params.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_reqfeed.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_reqfeed.c index 837d8099..0969c04d 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_reqfeed.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_reqfeed.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_reqfeed.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_reqfeed.h index d3ba8493..a3f90896 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_reqfeed.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_reqfeed.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_result.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_result.c index 05e2a1c0..1cbfcf0c 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_result.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_result.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_result.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_result.h index 0abfa38d..df3ba511 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_result.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_result.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_rfc3485_dictionary_sip.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_rfc3485_dictionary_sip.h index 5bf2cdcc..e1fdbc13 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_rfc3485_dictionary_sip.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_rfc3485_dictionary_sip.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_rfc5049_sip.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_rfc5049_sip.h index 30857a64..fc2d96dc 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_rfc5049_sip.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_rfc5049_sip.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_rfc5112_dictionary_presence.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_rfc5112_dictionary_presence.h index 451e503f..b4ee068f 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_rfc5112_dictionary_presence.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_rfc5112_dictionary_presence.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_state.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_state.c index f00adbb7..777ceeb0 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_state.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_state.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_state.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_state.h index a3b0e959..caecc5ec 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_state.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_state.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_statehandler.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_statehandler.c index 6643ca76..3fc3724e 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_statehandler.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_statehandler.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_statehandler.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_statehandler.h index 33109982..fb6bbdf1 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_statehandler.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_statehandler.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_types.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_types.h index a6a9e192..0cb48c91 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_types.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_types.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.bytecopy.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.bytecopy.c index 57bf7e06..df24ac10 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.bytecopy.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.bytecopy.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.c index c180d92f..4e4edd1b 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.h b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.h index fb5e1352..c24e33b1 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.instructions.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.instructions.c index bc77b36a..12c518c4 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.instructions.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.instructions.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.nack.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.nack.c index 94ef0763..4f6347f3 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.nack.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.nack.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.operands.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.operands.c index 3c2ce4c7..867d955e 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.operands.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.operands.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.statemanagment.c b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.statemanagment.c index 9191e680..27c247eb 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.statemanagment.c +++ b/branches/2.0/doubango/tinySIGCOMP/src/tcomp_udvm.statemanagment.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tinysigcomp_config.h b/branches/2.0/doubango/tinySIGCOMP/src/tinysigcomp_config.h index bbcbae79..9645625a 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tinysigcomp_config.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tinysigcomp_config.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIP/droid-makefile b/branches/2.0/doubango/tinySIP/droid-makefile index 6ecc7395..a82b6abf 100644 --- a/branches/2.0/doubango/tinySIP/droid-makefile +++ b/branches/2.0/doubango/tinySIP/droid-makefile @@ -38,6 +38,7 @@ OBJS += src/dialogs/tsip_dialog.o\ src/dialogs/tsip_dialog_invite.conf.o\ src/dialogs/tsip_dialog_invite.ect.o\ src/dialogs/tsip_dialog_invite.hold.o\ + src/dialogs/tsip_dialog_invite.ice.o\ src/dialogs/tsip_dialog_invite.qos.o\ src/dialogs/tsip_dialog_invite.server.o\ src/dialogs/tsip_dialog_invite.timers.o\ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip.h b/branches/2.0/doubango/tinySIP/include/tinysip.h index a36b4e7e..95e1b6d4 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tinysip.h * @brief SIP (RFC 3261) and 3GPP IMS/LTE (TS 24.229) API. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_common.h b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_common.h index 6d843b2f..38ce17de 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_common.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_common.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_api_common.h * @brief Public common functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_invite.h b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_invite.h index e4e099a4..accdb9e2 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_invite.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_invite.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_api_invite.h * @brief Public messaging (INVITE) functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_message.h b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_message.h index 5a8e65d9..3584d6e9 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_message.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_message.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_api_message.h * @brief Public messaging (MESSAGE) functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_options.h b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_options.h index a063ca9a..c39a1151 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_options.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_options.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_api_options.h * @brief Public functions to handle OPTIONS. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_publish.h b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_publish.h index 12eaa958..16f38608 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_publish.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_publish.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_api_publish.h * @brief Public piblication (PUBLISH) functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_register.h b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_register.h index 32a4dd0f..5c0d045c 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_register.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_register.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_api_register.h * @brief Public registration (REGISTER) functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_subscribe.h b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_subscribe.h index 01ea27ed..edbe172b 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_subscribe.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_subscribe.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_api_subscribe.h * @brief Public subscription (SUBSCRIBE) functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/authentication/tsip_challenge.h b/branches/2.0/doubango/tinySIP/include/tinysip/authentication/tsip_challenge.h index 4a058d1e..5de04ba4 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/authentication/tsip_challenge.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/authentication/tsip_challenge.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_challenge.h * @brief SIP authentication challenge. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/authentication/tsip_milenage.h b/branches/2.0/doubango/tinySIP/include/tinysip/authentication/tsip_milenage.h index 2c52cd55..b13eb31e 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/authentication/tsip_milenage.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/authentication/tsip_milenage.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -48,7 +48,7 @@ * *----------------------------------------------------------------- * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/authentication/tsip_rijndael.h b/branches/2.0/doubango/tinySIP/include/tinysip/authentication/tsip_rijndael.h index ce776d62..2327cadf 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/authentication/tsip_rijndael.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/authentication/tsip_rijndael.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -52,7 +52,7 @@ * *----------------------------------------------------------------- * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog.h b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog.h index 6f292c65..80e62494 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_dialog.h * @brief SIP dialog base class as per RFC 3261 subclause 17. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -153,6 +153,8 @@ typedef struct tsip_dialog_s tsip_challenges_L_t *challenges; tsip_dialog_event_callback_f callback; + + TSK_DECLARE_SAFEOBJ; } tsip_dialog_t; diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_info.h b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_info.h index 270db26d..e687b2f2 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_info.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_info.h @@ -23,7 +23,7 @@ /**@file tsip_dialog_info.h * @brief SIP dialog INFO. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_invite.common.h b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_invite.common.h index e80bc435..afe34211 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_invite.common.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_invite.common.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_dialog_invite.common.h * @brief SIP dialog INVITE (common variables). * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -37,6 +37,8 @@ tsip_invite_event_signal(type, TSIP_DIALOG(self)->ss, code, phrase, message) #define TSIP_DIALOG_INVITE_TIMER_SCHEDULE(TX) TSIP_DIALOG_TIMER_SCHEDULE(invite, TX) +#define TSIP_DIALOG_INVITE_ICE_CONNCHECK_TIMEOUT 6000 + /* ======================== actions ======================== */ typedef enum _fsm_action_e { diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_invite.h b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_invite.h index 696fb526..ecbbe11b 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_invite.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_invite.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_dialog_invite.h * @brief SIP dialog INVITE. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -48,6 +48,7 @@ typedef struct tsip_dialog_invite tsk_bool_t is_client; tsk_bool_t is_transf; tsk_bool_t refersub; + tsk_bool_t use_rtcp; uint32_t rseq; tsip_timer_t timershutdown; @@ -57,8 +58,21 @@ typedef struct tsip_dialog_invite tsip_request_t* last_iInvite; tsip_request_t* last_oInvite; tsip_request_t* last_iRefer; - tmedia_session_mgr_t* msession_mgr; /**< Media session Manager. */ + tmedia_session_mgr_t* msession_mgr; /**< Media session Manager */ + struct tsip_ssession_s* ss_transf; + + /* ICE */ + struct{ + tmedia_type_t media_type; + tsk_bool_t is_jingle; + tsk_bool_t start_smgr; + struct tnet_ice_ctx_s *ctx_audio; + struct tnet_ice_ctx_s *ctx_video; + tsk_fsm_action_id last_action_id; + tsip_action_t* last_action; + tsip_message_t* last_message; + } ice; /* Session Timers */ struct{ @@ -84,6 +98,7 @@ typedef struct tsip_dialog_invite unsigned precondition:1; unsigned timer:1; unsigned norefersub:1; + unsigned ice:1; } supported; struct{ @@ -91,6 +106,7 @@ typedef struct tsip_dialog_invite unsigned precondition:1; unsigned timer:1; unsigned norefersub; + unsigned ice:1; } require; } tsip_dialog_invite_t; diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_layer.h b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_layer.h index eb6d31ac..e55a4cc7 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_layer.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_layer.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_dialog.h * @brief SIP dialog layer. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_message.h b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_message.h index 1be23377..f2cbd611 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_message.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_message.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_dialog_message.h * @brief SIP dialog MESSAGE. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_options.h b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_options.h index f731b8b7..9b36d12d 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_options.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_options.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_dialog_options.h * @brief SIP dialog OPTIONS as per RFC 3261 section 11. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_publish.h b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_publish.h index 88610a8c..cf59a5df 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_publish.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_publish.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_dialog_publish.h * @brief SIP dialog PUBLISH as per RFC 3903. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_register.common.h b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_register.common.h index ebc0fa49..14d34db9 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_register.common.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_register.common.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_register.h b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_register.h index 9c7507e9..595ee8c9 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_register.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_register.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_dialog_register.h * @brief SIP dialog REGISTER. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_subscribe.h b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_subscribe.h index 011e68e3..7dde34f6 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_subscribe.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/dialogs/tsip_dialog_subscribe.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_dialog_subscribe.h * @brief SIP dialog SUBSCRIBE as per RFC 3265. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header.h index 7c2693bc..e1489807 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header.h * @brief Defines a SIP header (field-name: field-value). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Accept_Contact.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Accept_Contact.h index b3486c81..216adbe5 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Accept_Contact.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Accept_Contact.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Accept_Contact.h * @brief SIP header 'Accept-Contact'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Accept_Encoding.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Accept_Encoding.h index 4736e6e3..84d7bd05 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Accept_Encoding.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Accept_Encoding.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Accept_Encoding.h * @brief SIP header 'Accept-Encoding'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Accept_Language.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Accept_Language.h index 581a0b7f..6e84494b 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Accept_Language.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Accept_Language.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Accept_Language.h * @brief SIP header 'Accept-Language'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Accept_Resource_Priority.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Accept_Resource_Priority.h index be04beea..c28fbd8d 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Accept_Resource_Priority.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Accept_Resource_Priority.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Accept_Resource_Priority.h * @brief SIP header 'Accept-Resource-Priority'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Alert_Info.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Alert_Info.h index 53467636..b594d791 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Alert_Info.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Alert_Info.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Alert_Info.h * @brief SIP header 'Alert-Info'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Allow.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Allow.h index c93767cb..943294f7 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Allow.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Allow.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Allow.h * @brief SIP header 'Allow'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Allow_Events.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Allow_Events.h index 0b4b84b1..0fc76963 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Allow_Events.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Allow_Events.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Allow_Events.h * @brief SIP header 'Allow-Events'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Authentication_Info.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Authentication_Info.h index 04d58972..fa81943a 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Authentication_Info.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Authentication_Info.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Authentication_Info.h * @brief SIP header 'Authentication-Info'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Authorization.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Authorization.h index 3e986634..745a1b5a 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Authorization.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Authorization.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Authorization.h * @brief SIP header 'Authorization'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_CSeq.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_CSeq.h index 976c2cac..f084eb67 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_CSeq.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_CSeq.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_CSeq.h * @brief SIP header 'CSeq'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Call_ID.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Call_ID.h index c31abd7d..f0729e73 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Call_ID.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Call_ID.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Call_ID.h * @brief SIP header 'Call-ID'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Call_Info.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Call_Info.h index 5b48ac09..c9c4466c 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Call_Info.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Call_Info.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Call_Info.h * @brief SIP header 'Call-Info'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Contact.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Contact.h index c6e4a9a2..30d3e62e 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Contact.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Contact.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Contact.h * @brief SIP header 'Contact' as per RFC 3261 subclause 20.1. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Disposition.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Disposition.h index dae52bf1..d65f55f6 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Disposition.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Disposition.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Content_Disposition.h * @brief SIP header 'Content-Disposition'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Encoding.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Encoding.h index cb56814b..b5341d45 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Encoding.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Encoding.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Content_Encoding.h * @brief SIP header 'Content-Encoding' as per RFC 3261 subclause 20.1. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Language.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Language.h index 87144fe6..cb71e930 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Language.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Language.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Content_Language.h * @brief SIP header 'Content-Language'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Length.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Length.h index c7dd5bb1..69805131 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Length.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Length.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Content_Length.h * @brief SIP header 'Content-Length'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Type.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Type.h index 1d91b62e..acce3672 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Type.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Content_Type.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Content_Type.h * @brief SIP header 'Content-Type'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Date.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Date.h index 6ae8afd3..42da06ba 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Date.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Date.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Date.h * @brief SIP dummy header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Dummy.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Dummy.h index 274abb1e..b0cc9626 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Dummy.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Dummy.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Dummy.h * @brief SIP dummy header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Error_Info.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Error_Info.h index 25da8539..2aa25ab1 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Error_Info.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Error_Info.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Error_Info.h * @brief SIP header 'Error-Info'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Event.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Event.h index 0abfe831..cb947ca7 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Event.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Event.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Event.h * @brief SIP header 'Event/o'as per RFC 3265. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Expires.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Expires.h index 3c7a6f09..42693314 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Expires.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Expires.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Expires.h * @brief SIP header 'Expires'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_From.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_From.h index 951f3adb..8235a2d7 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_From.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_From.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_From.h * @brief SIP header 'From'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_History_Info.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_History_Info.h index d99d5f6c..0123bd69 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_History_Info.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_History_Info.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_History_Info.h * @brief SIP header 'History-Info'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Identity.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Identity.h index 76294b06..5d537ef3 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Identity.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Identity.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Identity.h * @brief SIP header 'Identity'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Identity_Info.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Identity_Info.h index 3ad58187..154abdd6 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Identity_Info.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Identity_Info.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Identity_Info.h * @brief SIP header 'Identity-Info'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_In_Reply_To.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_In_Reply_To.h index 92056b71..e8377bda 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_In_Reply_To.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_In_Reply_To.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_In_Reply_To.h * @brief SIP header 'In-Reply-To'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Join.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Join.h index 517ffd4a..edea6508 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Join.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Join.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Join.h * @brief SIP header 'Join'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_MIME_Version.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_MIME_Version.h index 606d9983..de85814f 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_MIME_Version.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_MIME_Version.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_MIME_Version.h * @brief SIP header 'MIME-Version'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Max_Forwards.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Max_Forwards.h index 16eef334..7bf5d27b 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Max_Forwards.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Max_Forwards.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Max_Forwards.h * @brief SIP header 'Max-Forwards'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Min_Expires.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Min_Expires.h index 85c64bdd..89473717 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Min_Expires.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Min_Expires.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Min_Expires.h * @brief SIP header 'Min-Expires'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Min_SE.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Min_SE.h index 0bf5972f..8f0faa99 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Min_SE.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Min_SE.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Min_SE.h * @brief SIP header 'Min-SE'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Organization.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Organization.h index 2e1f58fb..eed14785 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Organization.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Organization.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Organization.h * @brief SIP header 'Organization'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Access_Network_Info.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Access_Network_Info.h index 645f3120..8fdf5f54 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Access_Network_Info.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Access_Network_Info.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_Access_Network_Info.h * @brief SIP header 'P-Access-Network-Info'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Answer_State.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Answer_State.h index 06f70ae3..13ebf04a 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Answer_State.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Answer_State.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_Answer_State.h * @brief SIP header 'P-Answer-State'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Asserted_Identity.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Asserted_Identity.h index 3f482c79..e02ede3b 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Asserted_Identity.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Asserted_Identity.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_Asserted_Identity.h * @brief SIP header 'P-Asserted-Identity' as per RFC 3325. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Associated_URI.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Associated_URI.h index bccbfb6c..af856360 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Associated_URI.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Associated_URI.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_Associated_URI.h * @brief SIP header 'P-Associated-URI'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Called_Party_ID.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Called_Party_ID.h index 0be5a8b6..41d34008 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Called_Party_ID.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Called_Party_ID.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_Called_Party_ID.h * @brief SIP header 'P-Called-Party-ID'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Charging_Function_Addresses.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Charging_Function_Addresses.h index fa75b21d..d96cf0d9 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Charging_Function_Addresses.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Charging_Function_Addresses.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_Charging_Function_Addresses.h * @brief SIP header 'P-Charging-Function-Addresses'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Charging_Vector.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Charging_Vector.h index ca641e1b..5c44a1e8 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Charging_Vector.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Charging_Vector.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_Charging_Vector.h * @brief SIP header 'P-Charging-Vector'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_Billing_Info.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_Billing_Info.h index 74eee6ab..178376f1 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_Billing_Info.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_Billing_Info.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_DCS_Billing_Info.h * @brief SIP header 'P-DCS-Billing-Info'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_LAES.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_LAES.h index fd2c267c..a763305e 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_LAES.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_LAES.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_DCS_LAES.h * @brief SIP header 'P-DCS-LAES'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_OSPS.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_OSPS.h index c09f49ca..212d04b5 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_OSPS.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_OSPS.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_DCS_OSPS.h * @brief SIP header 'P-DCS-OSPS'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_Redirect.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_Redirect.h index 3f4c2238..f6acfa15 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_Redirect.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_Redirect.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_DCS_Redirect.h * @brief SIP header 'P-DCS-Redirect'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_Trace_Party_ID.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_Trace_Party_ID.h index cb17d4e3..ebb5b557 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_Trace_Party_ID.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_DCS_Trace_Party_ID.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_DCS_Trace_Party_ID.h * @brief SIP header 'P-DCS-Trace-Party-ID'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Early_Media.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Early_Media.h index f08d4293..db418eeb 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Early_Media.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Early_Media.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_Early_Media.h * @brief SIP header 'P-Early-Media'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Media_Authorization.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Media_Authorization.h index 674afc3f..db254bc4 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Media_Authorization.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Media_Authorization.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_Media_Authorization.h * @brief SIP header 'P-Media-Authorization'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Preferred_Identity.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Preferred_Identity.h index cc81d9bb..5ec38af8 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Preferred_Identity.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Preferred_Identity.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_Preferred_Identity.h * @brief SIP header 'P-Preferred-Identity'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Profile_Key.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Profile_Key.h index f1f605e6..bd6ccd6f 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Profile_Key.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Profile_Key.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_Profile_Key.h * @brief SIP header 'P-Profile-Key'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_User_Database.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_User_Database.h index 04f36438..bb203156 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_User_Database.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_User_Database.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_User_Database.h * @brief SIP header 'P-User-Database'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Visited_Network_ID.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Visited_Network_ID.h index c7d5b7bb..dff16688 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Visited_Network_ID.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_P_Visited_Network_ID.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_Visited_Network_ID.h * @brief SIP header 'P-Visited-Network-ID'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Path.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Path.h index f1062577..63f4e7f4 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Path.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Path.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Path.h * @brief SIP header 'Path'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Priority.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Priority.h index bcda1559..38d3a619 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Priority.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Priority.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Priority.h * @brief SIP header 'Priority'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Privacy.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Privacy.h index e0bcc4ed..97307917 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Privacy.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Privacy.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Privacy.h * @brief SIP header 'Privacy'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Proxy_Authenticate.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Proxy_Authenticate.h index 6a4bf0f8..d0940c0f 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Proxy_Authenticate.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Proxy_Authenticate.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Proxy_Authenticate.h * @brief SIP header 'Proxy-Authenticate'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Proxy_Authorization.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Proxy_Authorization.h index 8e13bbe3..b4171e8a 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Proxy_Authorization.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Proxy_Authorization.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Proxy_Authorization.h * @brief SIP header 'Proxy-Authorization'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Proxy_Require.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Proxy_Require.h index a7a21ec9..4042453e 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Proxy_Require.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Proxy_Require.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Proxy_Require.h * @brief SIP header 'Proxy-Require'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_RAck.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_RAck.h index 8a98cecd..ac212ec7 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_RAck.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_RAck.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_RAck.h * @brief SIP header 'RAck'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_RSeq.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_RSeq.h index a8e5d501..52dc2ede 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_RSeq.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_RSeq.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_RSeq.h * @brief SIP header 'RSeq'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Reason.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Reason.h index 9861f856..1acc2b2b 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Reason.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Reason.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Reason.h * @brief SIP header 'Reason'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Record_Route.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Record_Route.h index 908344c5..60376f1c 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Record_Route.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Record_Route.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Record_Route.h * @brief SIP header 'Record-Route'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Refer_Sub.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Refer_Sub.h index c0e025fa..b3c52d40 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Refer_Sub.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Refer_Sub.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Refer_Sub.h * @brief SIP header 'Refer-Sub' as per 4488. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Refer_To.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Refer_To.h index 1bad147b..64c9a579 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Refer_To.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Refer_To.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Refer_To.h * @brief SIP Refer-To header as per RFC 3515. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Referred_By.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Referred_By.h index 009ce85a..afa10b1c 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Referred_By.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Referred_By.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Referred_By.h * @brief SIP Referred-By header as per RFC 3892. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Reject_Contact.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Reject_Contact.h index 28826f1e..13a46dca 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Reject_Contact.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Reject_Contact.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Reject_Contact.h * @brief SIP header 'Reject-Contact'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Replaces.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Replaces.h index a6e8f14f..64381d29 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Replaces.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Replaces.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Replaces.h * @brief SIP header 'Replaces'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Reply_To.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Reply_To.h index df5735d5..91b72289 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Reply_To.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Reply_To.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Reply_To.h * @brief SIP header 'Reply_To'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Request_Disposition.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Request_Disposition.h index 0789bbdd..7892762a 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Request_Disposition.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Request_Disposition.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Request_Disposition.h * @brief SIP header 'Request-Disposition'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Require.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Require.h index 1c8fca30..83cd9508 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Require.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Require.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Require.h * @brief SIP header 'Require'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Resource_Priority.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Resource_Priority.h index ee83eb99..d85e5640 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Resource_Priority.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Resource_Priority.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Resource_Priority.h * @brief SIP header 'Resource-Priority'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Retry_After.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Retry_After.h index 67c15148..3fd3d1e8 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Retry_After.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Retry_After.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Retry_After.h * @brief SIP header 'Retry-After'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Route.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Route.h index 3f4b1cc1..c5d3dc01 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Route.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Route.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Route.h * @brief SIP header 'Route'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_SIP_ETag.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_SIP_ETag.h index a234922b..96db5b7a 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_SIP_ETag.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_SIP_ETag.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_SIP_ETag.h * @brief SIP header 'SIP-ETag'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_SIP_If_Match.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_SIP_If_Match.h index 708127fa..cbe4f9a6 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_SIP_If_Match.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_SIP_If_Match.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_SIP_If_Match.h * @brief SIP header 'SIP-If-Match'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Security_Client.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Security_Client.h index 160ce490..8158eeeb 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Security_Client.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Security_Client.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Security_Server.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Security_Server.h index 48ff0f92..aed1c0d9 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Security_Server.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Security_Server.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Security_Verify.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Security_Verify.h index b253bf67..7ae3e44b 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Security_Verify.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Security_Verify.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Server.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Server.h index 83c59bd8..005c60de 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Server.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Server.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Server.h * @brief SIP header 'Server'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Service_Route.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Service_Route.h index d82b81eb..47932b57 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Service_Route.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Service_Route.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Service_Route.h * @brief SIP header 'Service-Route'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Session_Expires.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Session_Expires.h index ea5e7501..fe66fa1d 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Session_Expires.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Session_Expires.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Session_Expires.h * @brief SIP header 'Session-Expires'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Subject.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Subject.h index 2f111775..142df09d 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Subject.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Subject.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Subject.h * @brief SIP header 'Subject'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Subscription_State.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Subscription_State.h index 2f23f290..4d2b878c 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Subscription_State.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Subscription_State.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Subscription_State.h * @brief SIP header 'Subscription-State'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Supported.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Supported.h index a135ae54..e9724184 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Supported.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Supported.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Supported.h * @brief SIP header 'Supported'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Target_Dialog.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Target_Dialog.h index 06670dd1..38ae8673 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Target_Dialog.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Target_Dialog.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Target_Dialog.h * @brief SIP header 'Target-Dialog'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Timestamp.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Timestamp.h index f1444d69..66e9dbdb 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Timestamp.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Timestamp.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Timestamp.h * @brief SIP header 'Timestamp'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_To.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_To.h index a372b21f..1450f58f 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_To.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_To.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_To.h * @brief SIP header 'To'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Unsupported.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Unsupported.h index 1c52554d..db11d982 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Unsupported.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Unsupported.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Unsupported.h * @brief SIP header 'Unsupported'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_User_Agent.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_User_Agent.h index 408ee520..88bd22b5 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_User_Agent.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_User_Agent.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_User_Agent.h * @brief SIP header 'User-Agent'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Via.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Via.h index fd4a1e10..c1cafc57 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Via.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Via.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Via.h * @brief SIP Via/v header as per RFC 3261 subclause 20.42. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_WWW_Authenticate.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_WWW_Authenticate.h index 5150a2bc..6445bf50 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_WWW_Authenticate.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_WWW_Authenticate.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_WWW_Authenticate.h * @brief SIP header 'WWW-Authenticate'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Warning.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Warning.h index 62755e9e..92fd9471 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Warning.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_Warning.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Warning.h * @brief SIP header 'Warning. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_accept.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_accept.h index c752cd5a..e5acf3e1 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_accept.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_header_accept.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_accept.h * @brief SIP header 'Accept-Contact'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_headers.h b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_headers.h index 882ccba8..80d87701 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_headers.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/headers/tsip_headers.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header.h * @brief List of all supported 3GPP/SIP headers. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/parsers/tsip_parser_header.h b/branches/2.0/doubango/tinySIP/include/tinysip/parsers/tsip_parser_header.h index a99066b7..9ad556df 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/parsers/tsip_parser_header.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/parsers/tsip_parser_header.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_parser_header.h * @brief SIP headers parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/parsers/tsip_parser_message.h b/branches/2.0/doubango/tinySIP/include/tinysip/parsers/tsip_parser_message.h index 867180e6..b9783598 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/parsers/tsip_parser_message.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/parsers/tsip_parser_message.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_parser_message.h * @brief SIP message parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/parsers/tsip_parser_uri.h b/branches/2.0/doubango/tinySIP/include/tinysip/parsers/tsip_parser_uri.h index 1247f4de..6da3ac4c 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/parsers/tsip_parser_uri.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/parsers/tsip_parser_uri.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_parser_uri.h * @brief SIP/SIPS/TEL URI parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/sigcomp/tsip_sigcomp.h b/branches/2.0/doubango/tinySIP/include/tinysip/sigcomp/tsip_sigcomp.h index 5be58f4d..887b09b1 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/sigcomp/tsip_sigcomp.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/sigcomp/tsip_sigcomp.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_sigcomp.h * @brief SigComp helper API. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac.h b/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac.h index ce3af635..917d8c7a 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_transac.h * @brief SIP transaction base class as per RFC 3261 subclause 17. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_ict.h b/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_ict.h index 9fd6277b..e40a755c 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_ict.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_ict.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_transac_ict.h * @brief SIP INVITE Client Transaction as per RFC 3261 subclause 17.1.1. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_ist.h b/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_ist.h index 9b396b55..543ec9f3 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_ist.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_ist.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_transac_ist.h * @brief SIP INVITE Server Transaction as per RFC 3261 subclause 17.2.1. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_layer.h b/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_layer.h index c78abe3e..a2f90502 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_layer.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_layer.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_transac.h * @brief SIP transaction layer. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_nict.h b/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_nict.h index abd011b7..74c93d08 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_nict.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_nict.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_transac_nict.h * @brief SIP Non-INVITE Client Transaction as per RFC 3261 subcaluse 17.1.2. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_nist.h b/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_nist.h index a4b7cee9..c8252c0e 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_nist.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/transactions/tsip_transac_nist.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_transac_nist.h * @brief SIP Non-INVITE Server Transaction as per RFC 3261 subclause 17.2.2. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/transports/tsip_transport.h b/branches/2.0/doubango/tinySIP/include/tinysip/transports/tsip_transport.h index ec805669..d8195c6a 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/transports/tsip_transport.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/transports/tsip_transport.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_transport.h * @brief SIP transport. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/transports/tsip_transport_ipsec.h b/branches/2.0/doubango/tinySIP/include/tinysip/transports/tsip_transport_ipsec.h index b6544fa8..102c490b 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/transports/tsip_transport_ipsec.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/transports/tsip_transport_ipsec.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_transport_ipsec.h * @brief SIP/IPSec transport. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/transports/tsip_transport_layer.h b/branches/2.0/doubango/tinySIP/include/tinysip/transports/tsip_transport_layer.h index ca7b0369..921de75f 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/transports/tsip_transport_layer.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/transports/tsip_transport_layer.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_transport_layer.h * @brief SIP transport layer. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/transports/tsip_transport_tls.h b/branches/2.0/doubango/tinySIP/include/tinysip/transports/tsip_transport_tls.h index 192ce00c..106a562a 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/transports/tsip_transport_tls.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/transports/tsip_transport_tls.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_transport_tls.h * @brief SIP/TLS transport. * - * @author Mamadou Diop + * @author Mamadou Diop * */ #ifndef TINYSIP_TRANSPORT_TLS_H diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_action.h b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_action.h index af58b5b5..bedf3d44 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_action.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_action.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_action.h * @brief SIP action. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_event.h b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_event.h index 86bc2f4f..0d0c39b7 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_event.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_event.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_event.h * @brief SIP event. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_message.h b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_message.h index 8b8ae5e6..27a7c755 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_message.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_message.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ * @brief Represents a SIP message. A SIP message is either a request from a client to a server, or a * response from a server to a client. See RFC 3261 suc-bclause 7. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_message_common.h b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_message_common.h index 046f70c2..1d5b34e6 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_message_common.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_message_common.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ * @brief Common macros and enums for SIP messages. * Mostly used to avoid circular #includes. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_ssession.h b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_ssession.h index 5f4e3f5b..783b252e 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_ssession.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_ssession.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_ssession.h * @brief SIP ssession. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -103,9 +103,15 @@ typedef enum tsip_msession_param_type_e { mstype_null = 0, + mstype_set_profile, + mstype_set_srtp_mode, + mstype_set_100rel, mstype_unset_100rel, + mstype_set_ice, + mstype_unset_ice, + mstype_set_qos, mstype_unset_qos, @@ -116,8 +122,12 @@ typedef enum tsip_msession_param_type_e } tsip_msession_param_type_t; +#define TSIP_MSESSION_SET_SRTP_MODE(SRTP_MODE_ENUM) mstype_set_profile, (tmedia_srtp_mode_t)SRTP_MODE_ENUM +#define TSIP_MSESSION_SET_PROFILE(PROFILE_ENUM) mstype_set_srtp_mode, (tmedia_profile_t)PROFILE_ENUM #define TSIP_MSESSION_SET_100rel() mstype_set_100rel #define TSIP_MSESSION_UNSET_100rel() mstype_unset_100rel +#define TSIP_MSESSION_SET_ICE() mstype_set_ice +#define TSIP_MSESSION_UNSET_ICE() mstype_unset_ice #define TSIP_MSESSION_SET_QOS(TYPE_ENUM, STRENGTH_ENUM) mstype_set_qos, (tmedia_qos_stype_t)TYPE_ENUM, (tmedia_qos_strength_t)STRENGTH_ENUM #define TSIP_MSESSION_UNSET_QOS() mstype_unset_qos #define TSIP_MSESSION_SET_TIMERS(TIMEOUT_UINT, REFRESHER_STR) mstype_set_timers, (unsigned)TIMEOUT_UINT, (const char*)REFRESHER_STR @@ -155,6 +165,9 @@ typedef struct tsip_ssession_s //======= struct{ tmedia_type_t type; + tmedia_profile_t profile; + tmedia_srtp_mode_t srtp_mode; + /* Session timers */ struct{ char* refresher; @@ -172,6 +185,7 @@ typedef struct tsip_ssession_s /* Features */ unsigned enable_100rel:1; + unsigned enable_ice:1; } media; } tsip_ssession_t; diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_timers.h b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_timers.h index 6b1944e1..0441bfa8 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_timers.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_timers.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_timers.h * @brief SIP timers. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_uri.h b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_uri.h index 80cd40ed..dce74a23 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_uri.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_uri.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_uri.h * @brief SIP/SIPS/TEL URI. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip_config.h b/branches/2.0/doubango/tinySIP/include/tinysip_config.h index 1b5d4512..226913af 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip_config.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip_config.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIP/include/tsip.h b/branches/2.0/doubango/tinySIP/include/tsip.h index 97c108d3..7e068102 100644 --- a/branches/2.0/doubango/tinySIP/include/tsip.h +++ b/branches/2.0/doubango/tinySIP/include/tsip.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip.h * @brief SIP (RFC 3261) and 3GPP IMS/LTE (TS 24.229) implementation. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_machine_header.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_machine_header.rl index 4459cf2c..984cba6c 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_machine_header.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_machine_header.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tsip_machine_headers.rl. * @brief Ragel file. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_machine_message.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_machine_message.rl index 92424431..af796b2b 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_machine_message.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_machine_message.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tsip_machine_message.rl * @brief Ragel file. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_machine_utils.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_machine_utils.rl index 33f92593..33a96f73 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_machine_utils.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_machine_utils.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -22,7 +22,7 @@ /**@file tsip_machine_utils.rl * @brief Ragel file. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header.rl index ad36166f..36931bd6 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_parser_header.c * @brief SIP headers parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -71,7 +71,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Accept NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Accept NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Accept-Contact: ==*/ @@ -79,7 +79,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Accept_Contact NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Accept_Contact NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Accept-Encoding: ==*/ @@ -87,7 +87,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Accept_Encoding NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Accept_Encoding NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Accept-Language: ==*/ @@ -95,7 +95,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Accept_Language NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Accept_Language NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Accept-Resource-Priority : ==*/ @@ -103,7 +103,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Accept_Resource_Priority NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Accept_Resource_Priority NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Alert-Info: ==*/ @@ -111,7 +111,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Alert_Info NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Alert_Info NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Allow: ==*/ @@ -133,7 +133,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Authentication_Info NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Authentication_Info NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Authorization: ==*/ @@ -161,7 +161,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Call_Info NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Call_Info NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Contact: ==*/ @@ -191,7 +191,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Content_Disposition NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Content_Disposition NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Content-Encoding: ==*/ @@ -207,7 +207,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Content_Language NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Content_Language NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Content-Length: ==*/ @@ -261,7 +261,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Error_Info NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Error_Info NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Event: ==*/ @@ -302,7 +302,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_History_Info NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_History_Info NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Identity: ==*/ @@ -310,7 +310,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Identity NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Identity NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Identity-Info: ==*/ @@ -318,7 +318,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Identity_Info NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Identity_Info NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== In_Reply-To: ==*/ @@ -326,7 +326,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_In_Reply_To NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_In_Reply_To NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Join: ==*/ @@ -334,7 +334,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Join NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Join NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Max-Forwards: ==*/ @@ -349,7 +349,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_MIME_Version NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_MIME_Version NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Min-Expires: ==*/ @@ -371,7 +371,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Organization NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Organization NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== P-Access-Network-Info: ==*/ @@ -386,7 +386,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_Answer_State NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_P_Answer_State NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== P-Asserted-Identity: ==*/ @@ -408,7 +408,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_Called_Party_ID NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_P_Called_Party_ID NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== P-Charging-Function-Addresses : ==*/ @@ -423,7 +423,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_Charging_Vector NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_P_Charging_Vector NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== P-DCS-Billing-Info: ==*/ @@ -431,7 +431,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_DCS_Billing_Info NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_P_DCS_Billing_Info NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== P-DCS-LAES: ==*/ @@ -439,7 +439,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_DCS_LAES NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_P_DCS_LAES NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== P-DCS-OSPS: ==*/ @@ -447,7 +447,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_DCS_OSPS NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_P_DCS_OSPS NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== P-DCS-Redirect: ==*/ @@ -455,7 +455,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_DCS_Redirect NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_P_DCS_Redirect NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== P-DCS-Trace-Party-ID: ==*/ @@ -463,7 +463,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_DCS_Trace_Party_ID NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_P_DCS_Trace_Party_ID NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== P-Early-Media: ==*/ @@ -471,7 +471,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_Early_Media NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_P_Early_Media NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== P-Media-Authorization: ==*/ @@ -479,7 +479,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_Media_Authorization NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_P_Media_Authorization NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== P-Preferred-Identity: ==*/ @@ -494,7 +494,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_Profile_Key NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_P_Profile_Key NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== P-User-Database: ==*/ @@ -502,7 +502,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_User_Database NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_P_User_Database NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== P-Visited-Network-ID: ==*/ @@ -510,7 +510,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_Visited_Network_ID NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_P_Visited_Network_ID NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Path: ==*/ @@ -525,7 +525,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Priority NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Priority NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Privacy: ==*/ @@ -568,7 +568,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Reason NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Reason NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Record-Route: ==*/ @@ -604,7 +604,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Reject_Contact NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Reject_Contact NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Replaces: ==*/ @@ -612,7 +612,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Replaces NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Replaces NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Reply-To: ==*/ @@ -620,7 +620,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Reply_To NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Reply_To NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Request-Disposition: ==*/ @@ -628,7 +628,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Request_Disposition NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Request_Disposition NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Require: ==*/ @@ -643,7 +643,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Resource_Priority NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Resource_Priority NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Retry-After: ==*/ @@ -651,7 +651,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Retry_After NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Retry_After NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Route: ==*/ @@ -729,7 +729,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Subject NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Subject NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Subscription-State: ==*/ @@ -751,7 +751,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Target_Dialog NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Target_Dialog NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== Timestamp: ==*/ @@ -759,7 +759,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Timestamp NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Timestamp NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== To: ==*/ @@ -780,7 +780,7 @@ { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Unsupported NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Unsupported NOT IMPLEMENTED. Will be added as Dummy header."); } # /*== User-Agent: ==*/ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Allow.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Allow.rl index e7d18e6b..57a733fb 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Allow.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Allow.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Allow.c * @brief SIP Allow header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Allow_Events.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Allow_Events.rl index d2027bb2..27ad63a4 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Allow_Events.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Allow_Events.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Allow_events.c * @brief SIP Allow-Events/u header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Authorization.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Authorization.rl index 8a7c2907..d47e6851 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Authorization.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Authorization.rl @@ -1,7 +1,7 @@ ///* //* Copyright (C) 2010-2011 Mamadou Diop. //* -//* Contact: Mamadou Diop +//* Contact: Mamadou Diop //* //* This file is part of Open Source Doubango Framework. //* @@ -23,7 +23,7 @@ ///**@file tsip_header_Authorization.c // * @brief SIP Authorization header. // * -// * @author Mamadou Diop +// * @author Mamadou Diop // * // // */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_CSeq.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_CSeq.rl index 30eebbf6..26f5c544 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_CSeq.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_CSeq.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_CSeq.c * @brief SIP CSeq header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Call_ID.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Call_ID.rl index 59765274..a12c197b 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Call_ID.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Call_ID.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Call_ID.c * @brief SIP Call-ID/i header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Contact.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Contact.rl index 26fbf8af..aa5c182e 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Contact.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Contact.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Contact.c * @brief SIP Contact/m header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Content_Length.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Content_Length.rl index ffe54caf..9008a95e 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Content_Length.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Content_Length.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Content_Length.c * @brief SIP Content-Length/l header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Content_Type.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Content_Type.rl index e6f2458e..9ca07962 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Content_Type.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Content_Type.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Content_Type.c * @brief SIP Content-Type/c header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Date.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Date.rl index 00d682f9..a16693ba 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Date.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Date.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Date.c * @brief SIP DUmmy header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Dummy.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Dummy.rl index 396065bf..2e04c542 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Dummy.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Dummy.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Dummy.c * @brief SIP DUmmy header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Event.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Event.rl index 9a64f351..6c42d166 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Event.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Event.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Event.c * @brief SIP Event/o header as per RFC 3265.. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Expires.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Expires.rl index 32b27f34..151b3137 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Expires.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Expires.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Expires.c * @brief SIP Expires header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_From.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_From.rl index 9949e9bf..2b120cb9 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_From.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_From.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_From.c * @brief SIP From/f header as per RFC 3261 subclause 20.20. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Max_Forwards.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Max_Forwards.rl index ebbbf9f2..e5e4b97b 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Max_Forwards.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Max_Forwards.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Max_Forwards.c * @brief SIP Max-Forwards header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Min_Expires.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Min_Expires.rl index 9513074e..7c17b995 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Min_Expires.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Min_Expires.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Min_Expires.c * @brief SIP Min-Expiress header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Min_SE.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Min_SE.rl index f88edda4..e0b90b06 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Min_SE.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Min_SE.rl @@ -2,7 +2,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsip_header_Min_SE.c * @brief SIP Min-SE header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Access_Network_Info.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Access_Network_Info.rl index 1bc42196..e0135d62 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Access_Network_Info.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Access_Network_Info.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -31,7 +31,7 @@ ___________________________________________________________ P-Access-Network-Info o o o o o o o * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Asserted_Identity.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Asserted_Identity.rl index 6342c446..c20ff17a 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Asserted_Identity.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Asserted_Identity.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_Asserted_Identity.c * @brief SIP P-Asserted-Identity header as per RFC 3325. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Associated_URI.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Associated_URI.rl index 874ac29c..12810f4f 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Associated_URI.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Associated_URI.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_Associated_URI.c * @brief SIP P-Associated-URI header as per RFC 3455. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Charging_Function_Addresses.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Charging_Function_Addresses.rl index c0628fb2..b4aeba0c 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Charging_Function_Addresses.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Charging_Function_Addresses.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_P_Charging_Function_Addresses.c * @brief SIP P-Charging-Function-Addresses header as per RFC 3455. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Preferred_Identity.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Preferred_Identity.rl index 0af73e22..dac42470 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Preferred_Identity.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Preferred_Identity.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -31,7 +31,7 @@ * --- --- --- --- --- --- * o o o - - - * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Path.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Path.rl index 3db82fdc..5298e5e0 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Path.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Path.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Path.c * @brief SIP Service-Path header as per RFC 3608. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Privacy.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Privacy.rl index 1a04e499..d10fbf93 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Privacy.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Privacy.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -31,7 +31,7 @@ * ___________________________________________________________ * Privacy o o o o o o * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Authenticate.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Authenticate.rl index eab99065..0845f41f 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Authenticate.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Authenticate.rl @@ -1,7 +1,7 @@ ///* //* Copyright (C) 2010-2011 Mamadou Diop. //* -//* Contact: Mamadou Diop +//* Contact: Mamadou Diop //* //* This file is part of Open Source Doubango Framework. //* @@ -23,7 +23,7 @@ ///**@file tsip_header_Proxy_Authenticate.c // * @brief SIP Proxy-Authenticate header. // * -// * @author Mamadou Diop +// * @author Mamadou Diop // * // // */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Authorization.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Authorization.rl index bf766c83..3314ca64 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Authorization.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Authorization.rl @@ -1,7 +1,7 @@ ///* //* Copyright (C) 2010-2011 Mamadou Diop. //* -//* Contact: Mamadou Diop +//* Contact: Mamadou Diop //* //* This file is part of Open Source Doubango Framework. //* @@ -23,7 +23,7 @@ ///**@file tsip_header_Proxy_Authorization.c // * @brief SIP Proxy-Authenticate header. // * -// * @author Mamadou Diop +// * @author Mamadou Diop // * // // */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Require.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Require.rl index 20116a6e..be48bc57 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Require.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Require.rl @@ -2,7 +2,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsip_header_Proxy_Require.c * @brief SIP Proxy-Require header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_RAck.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_RAck.rl index b77bcbb0..a8e8c33f 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_RAck.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_RAck.rl @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_RAck.c * @brief SIP RAck header as per RFC 3262. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_RSeq.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_RSeq.rl index 2be99bd9..28a18bb8 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_RSeq.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_RSeq.rl @@ -2,7 +2,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsip_header_RSeq.c * @brief SIP RSeq header as per RFC 3262. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Record_Route.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Record_Route.rl index 88444e6b..5e5d3a44 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Record_Route.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Record_Route.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Record_Route.c * @brief SIP Record-Route header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Refer_Sub.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Refer_Sub.rl index c1f7b429..e780c390 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Refer_Sub.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Refer_Sub.rl @@ -2,7 +2,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsip_header_Refer_Sub.c * @brief SIP header 'Refer-Sub' as per 4488. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Refer_To.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Refer_To.rl index bc0409aa..c962e778 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Refer_To.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Refer_To.rl @@ -2,7 +2,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsip_header_Refer_To.c * @brief SIP Refer-To header as per RFC 3515. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Referred_By.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Referred_By.rl index 58ced007..18a8633b 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Referred_By.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Referred_By.rl @@ -2,7 +2,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsip_header_Referred_By.c * @brief SIP Referred-By header as per RFC 3892. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Require.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Require.rl index 8f39534d..b41d4d1f 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Require.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Require.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Require.c * @brief SIP Require header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Route.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Route.rl index 0f967dc8..893faade 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Route.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Route.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Route.c * @brief SIP Route header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_SIP_ETag.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_SIP_ETag.rl index 7a877678..5f639d6c 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_SIP_ETag.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_SIP_ETag.rl @@ -2,7 +2,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsip_header_SIP_ETag.c * @brief SIP SIP-ETag header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_SIP_If_Match.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_SIP_If_Match.rl index fd5ffc65..155c5163 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_SIP_If_Match.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_SIP_If_Match.rl @@ -2,7 +2,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsip_header_SIP_If_Match.c * @brief SIP SIP-If-Match header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Client.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Client.rl index 3f64144a..c9de2057 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Client.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Client.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Security_Client.c * @brief SIP Security-Client header as per RFC 3329. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Server.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Server.rl index 8662b56e..af09baee 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Server.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Server.rl @@ -2,7 +2,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ /**@file tsip_header_Security_Server.c * @brief SIP Security-Server header as per RFC 3329. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Verify.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Verify.rl index f9167908..b4c36974 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Verify.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Verify.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Security_Verify.c * @brief SIP Security-Verify header as per RFC 3329. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Server.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Server.rl index 879eb867..0c5fe39a 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Server.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Server.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Server.c * @brief SIP Server header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Service_Route.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Service_Route.rl index faf7cbc4..21602c24 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Service_Route.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Service_Route.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Service_Route.c * @brief SIP Service-Route header as per RFC 3608. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Session_Expires.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Session_Expires.rl index 94b723a5..ae9db05e 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Session_Expires.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Session_Expires.rl @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Session_Expires.c * @brief SIP Min-SE header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Subscription_State.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Subscription_State.rl index 7fa2ca00..cbe320e6 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Subscription_State.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Subscription_State.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Subscription_State.c * @brief SIP Subscription_State header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Supported.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Supported.rl index e57998f5..220fa03f 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Supported.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Supported.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Supported.c * @brief SIP Supported/k header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_To.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_To.rl index 62eb7a18..d2997af0 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_To.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_To.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_To.c * @brief SIP To/t header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_User_Agent.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_User_Agent.rl index 2720a29f..078ad225 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_User_Agent.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_User_Agent.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_User_Agent.c * @brief SIP User-Agent/t header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Via.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Via.rl index 7fea6fc2..34a8d995 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Via.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Via.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Via.c * @brief SIP Via/v header as per RFC 3261 subclause 20.42. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_WWW_Authenticate.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_WWW_Authenticate.rl index f1b319b9..ad3be617 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_WWW_Authenticate.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_WWW_Authenticate.rl @@ -1,7 +1,7 @@ ///* //* Copyright (C) 2010-2011 Mamadou Diop. //* -//* Contact: Mamadou Diop +//* Contact: Mamadou Diop //* //* This file is part of Open Source Doubango Framework. //* @@ -23,7 +23,7 @@ ///**@file tsip_header_WWW_Authenticate.c // * @brief SIP WWW-Authenticate header. // * -// * @author Mamadou Diop +// * @author Mamadou Diop // * // // */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Warning.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Warning.rl index afa4caec..9beaa1e3 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Warning.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Warning.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_Warning.c * @brief SIP Warning header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_message.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_message.rl index 49d928b7..c4819035 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_message.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_message.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_parser_message.c * @brief SIP parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_uri.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_uri.rl index d2d16848..a484f7e4 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_uri.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_uri.rl @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_parser_uri.c * @brief SIP/SIPS/TEL URI parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/api/tsip_api_common.c b/branches/2.0/doubango/tinySIP/src/api/tsip_api_common.c index 1326de67..76d0e9c5 100644 --- a/branches/2.0/doubango/tinySIP/src/api/tsip_api_common.c +++ b/branches/2.0/doubango/tinySIP/src/api/tsip_api_common.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_api_common.c * @brief Public common functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/api/tsip_api_info.c b/branches/2.0/doubango/tinySIP/src/api/tsip_api_info.c index 7dcbd512..ec20b8b8 100644 --- a/branches/2.0/doubango/tinySIP/src/api/tsip_api_info.c +++ b/branches/2.0/doubango/tinySIP/src/api/tsip_api_info.c @@ -23,7 +23,7 @@ /**@file tsip_api_info.c * @brief Public short messaging (MESSAGE) functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/api/tsip_api_invite.c b/branches/2.0/doubango/tinySIP/src/api/tsip_api_invite.c index 97014ab1..530eb67f 100644 --- a/branches/2.0/doubango/tinySIP/src/api/tsip_api_invite.c +++ b/branches/2.0/doubango/tinySIP/src/api/tsip_api_invite.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_api_invite.c * @brief Public short messaging (INVITE) functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -240,8 +240,8 @@ int tsip_api_invite_send_ect(const tsip_ssession_handle_t *ss, const char* toUri return ret; } -int tsip_api_invite_send_ect_accept(const tsip_ssession_handle_t *ss, ...) -{ +int tsip_api_invite_send_ect_accept(const tsip_ssession_handle_t *ss, ...) +{ int ret = -1; va_list ap; @@ -251,9 +251,9 @@ int tsip_api_invite_send_ect_accept(const tsip_ssession_handle_t *ss, ...) } va_end(ap); - return ret; -} - + return ret; +} + int tsip_api_invite_send_ect_reject(const tsip_ssession_handle_t *ss, ...) { int ret = -1; diff --git a/branches/2.0/doubango/tinySIP/src/api/tsip_api_message.c b/branches/2.0/doubango/tinySIP/src/api/tsip_api_message.c index 53a99f92..232e9c60 100644 --- a/branches/2.0/doubango/tinySIP/src/api/tsip_api_message.c +++ b/branches/2.0/doubango/tinySIP/src/api/tsip_api_message.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_api_message.c * @brief Public short messaging (MESSAGE) functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/api/tsip_api_options.c b/branches/2.0/doubango/tinySIP/src/api/tsip_api_options.c index a9b07e9e..df87a4d5 100644 --- a/branches/2.0/doubango/tinySIP/src/api/tsip_api_options.c +++ b/branches/2.0/doubango/tinySIP/src/api/tsip_api_options.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_api_options.c * @brief Public functions to handle OPTIONS. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/api/tsip_api_publish.c b/branches/2.0/doubango/tinySIP/src/api/tsip_api_publish.c index 4e10c1b5..916ed6f8 100644 --- a/branches/2.0/doubango/tinySIP/src/api/tsip_api_publish.c +++ b/branches/2.0/doubango/tinySIP/src/api/tsip_api_publish.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_api_publish.c * @brief Public subscription (PUBLISH) functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/api/tsip_api_register.c b/branches/2.0/doubango/tinySIP/src/api/tsip_api_register.c index 4814f5cb..4d616329 100644 --- a/branches/2.0/doubango/tinySIP/src/api/tsip_api_register.c +++ b/branches/2.0/doubango/tinySIP/src/api/tsip_api_register.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_api_register.c * @brief Public registration (REGISTER) functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/api/tsip_api_subscribe.c b/branches/2.0/doubango/tinySIP/src/api/tsip_api_subscribe.c index c7b3dd6e..867b2585 100644 --- a/branches/2.0/doubango/tinySIP/src/api/tsip_api_subscribe.c +++ b/branches/2.0/doubango/tinySIP/src/api/tsip_api_subscribe.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_api_subscribe.c * @brief Public subscription (SUBSCRIBE) functions. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/authentication/tsip_challenge.c b/branches/2.0/doubango/tinySIP/src/authentication/tsip_challenge.c index a0997a77..40defa52 100644 --- a/branches/2.0/doubango/tinySIP/src/authentication/tsip_challenge.c +++ b/branches/2.0/doubango/tinySIP/src/authentication/tsip_challenge.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_challenge.c * @brief SIP authentication challenge. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/authentication/tsip_milenage.c b/branches/2.0/doubango/tinySIP/src/authentication/tsip_milenage.c index 31e0faf4..f1d65e04 100644 --- a/branches/2.0/doubango/tinySIP/src/authentication/tsip_milenage.c +++ b/branches/2.0/doubango/tinySIP/src/authentication/tsip_milenage.c @@ -1,7 +1,7 @@ /* * Partial Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIP/src/authentication/tsip_rijndael.c b/branches/2.0/doubango/tinySIP/src/authentication/tsip_rijndael.c index 35489517..ddcd89f9 100644 --- a/branches/2.0/doubango/tinySIP/src/authentication/tsip_rijndael.c +++ b/branches/2.0/doubango/tinySIP/src/authentication/tsip_rijndael.c @@ -1,7 +1,7 @@ /* * Partial Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog.c index ba5c3676..c1e881f7 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_dialog.c * @brief SIP dialog base class as per RFC 3261 subclause 17. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -1053,6 +1053,8 @@ int tsip_dialog_init(tsip_dialog_t *self, tsip_dialog_type_t type, const char* c TSK_DEBUG_ERROR("Invalid SIP Session id."); } + tsk_safeobj_init(self); + self->initialized = tsk_true; return 0; } @@ -1061,11 +1063,18 @@ int tsip_dialog_init(tsip_dialog_t *self, tsip_dialog_type_t type, const char* c int tsip_dialog_fsm_act(tsip_dialog_t* self, tsk_fsm_action_id action_id, const tsip_message_t* message, const tsip_action_handle_t* action) { + int ret; if(!self || !self->fsm){ TSK_DEBUG_ERROR("Invalid parameter."); return -1; } - return tsk_fsm_act(self->fsm, action_id, self, message, self, message, action); + + tsk_safeobj_lock(self); + ret = tsip_dialog_set_curr_action(self, action); + ret = tsk_fsm_act(self->fsm, action_id, self, message, self, message, action); + tsk_safeobj_unlock(self); + + return ret; } int tsip_dialog_set_curr_action(tsip_dialog_t* self, const tsip_action_t* action) @@ -1196,6 +1205,8 @@ int tsip_dialog_deinit(tsip_dialog_t *self) TSK_OBJECT_SAFE_FREE(self->fsm); + tsk_safeobj_deinit(self); + self->initialized = 0; return 0; diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_info.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_info.c index 8b6d2941..fc6f4eba 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_info.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_info.c @@ -23,7 +23,7 @@ /**@file tsip_dialog_info.c * @brief SIP dialog message (Client side). * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -233,7 +233,6 @@ int tsip_dialog_info_Started_2_Sending_X_sendINFO(va_list *app) action = va_arg(*app, const tsip_action_t *); TSIP_DIALOG(self)->running = tsk_true; - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); return send_INFO(self); } diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.c index b118fb6e..1453a743 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ * The SOA machine is designed as per RFC 3264 and draft-ietf-sipping-sip-offeranswer-12. * MMTel services implementation follow 3GPP TS 24.173. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -79,6 +79,8 @@ */ /* ======================== internal functions ======================== */ +/*static*/ int tsip_dialog_invite_msession_start(tsip_dialog_invite_t *self); +/*static*/ int tsip_dialog_invite_msession_configure(tsip_dialog_invite_t *self); /*static*/ int send_INVITEorUPDATE(tsip_dialog_invite_t *self, tsk_bool_t is_INVITE, tsk_bool_t force_sdp); /*static*/ int send_PRACK(tsip_dialog_invite_t *self, const tsip_response_t* r1xx); /*static*/ int send_ACK(tsip_dialog_invite_t *self, const tsip_response_t* r2xxINVITE); @@ -90,6 +92,7 @@ static int tsip_dialog_invite_OnTerminated(tsip_dialog_invite_t *self); /* ======================== external functions ======================== */ +extern int tsip_dialog_invite_ice_process_ro(tsip_dialog_invite_t * self, const tsdp_message_t* sdp_ro, tsk_bool_t is_remote_offer); extern int tsip_dialog_invite_stimers_cancel(tsip_dialog_invite_t* self); extern int tsip_dialog_invite_qos_timer_cancel(tsip_dialog_invite_t* self); extern int tsip_dialog_invite_qos_timer_schedule(tsip_dialog_invite_t* self); @@ -97,6 +100,11 @@ extern int tsip_dialog_invite_stimers_schedule(tsip_dialog_invite_t* self, uint6 extern int tsip_dialog_invite_stimers_handle(tsip_dialog_invite_t* self, const tsip_message_t* message); extern int tsip_dialog_invite_hold_handle(tsip_dialog_invite_t* self, const tsip_request_t* rINVITEorUPDATE); +extern int tsip_dialog_invite_ice_timers_set(tsip_dialog_invite_t *self, int64_t timeout); +extern tsk_bool_t tsip_dialog_invite_ice_is_enabled(const tsip_dialog_invite_t * self); +extern tsk_bool_t tsip_dialog_invite_ice_is_connected(const tsip_dialog_invite_t * self); +extern int tsip_dialog_invite_ice_process_lo(tsip_dialog_invite_t * self, const tsdp_message_t* sdp_lo); + /* ======================== transitions ======================== */ static int x0000_Connected_2_Connected_X_oDTMF(va_list *app); static int x0000_Connected_2_Connected_X_oLMessage(va_list *app); @@ -148,6 +156,8 @@ static tsk_bool_t _fsm_cond_is_resp2INFO(tsip_dialog_invite_t* self, tsip_messag /* ======================== states ======================== */ /* #include "tinysip/dialogs/tsip_dialog_invite.common.h" */ +/* ICE handler */ +extern int tsip_dialog_invite_ice_init(tsip_dialog_invite_t *self); /* Client-Side dialog */ extern int tsip_dialog_invite_client_init(tsip_dialog_invite_t *self); /* Server-Side dialog */ @@ -287,6 +297,8 @@ int tsip_dialog_invite_init(tsip_dialog_invite_t *self) { /* special cases (fsm) should be tried first */ + /* ICE */ + tsip_dialog_invite_ice_init(self); /* Client-Side dialog */ tsip_dialog_invite_client_init(self); /* Server-Side dialog */ @@ -420,6 +432,10 @@ int tsip_dialog_invite_process_ro(tsip_dialog_invite_t *self, const tsip_message TSK_DEBUG_ERROR("Failed to parse remote sdp message"); return -2; } + // ICE processing + if(self->supported.ice){ + tsip_dialog_invite_ice_process_ro(self, sdp_ro, TSIP_MESSAGE_IS_REQUEST(message)); + } } else{ TSK_DEBUG_ERROR("[%s] content-type is not supportted", TSIP_MESSAGE_CONTENT_TYPE(message)); @@ -447,7 +463,9 @@ int tsip_dialog_invite_process_ro(tsip_dialog_invite_t *self, const tsip_message if(TSIP_DIALOG_GET_STACK(self)->natt.ctx){ tmedia_session_mgr_set_natt_ctx(self->msession_mgr, TSIP_DIALOG_GET_STACK(self)->natt.ctx, TSIP_DIALOG_GET_STACK(self)->network.aor.ip); } + ret = tmedia_session_mgr_set_ice_ctx(self->msession_mgr, self->ice.ctx_audio, self->ice.ctx_video); } + ret = tsip_dialog_invite_msession_configure(self); if(sdp_ro){ if((ret = tmedia_session_mgr_set_ro(self->msession_mgr, sdp_ro))){ @@ -470,8 +488,9 @@ int tsip_dialog_invite_process_ro(tsip_dialog_invite_t *self, const tsip_message if((self->msession_mgr->type & tmedia_msrp) == tmedia_msrp){ tmedia_session_mgr_set_msrp_cb(self->msession_mgr, TSIP_DIALOG_GET_SS(self)->userdata, TSIP_DIALOG_GET_SS(self)->media.msrp.callback); } - /* starts */ - ret = tmedia_session_mgr_start(self->msession_mgr); + /* starts session manager*/ + ret = tsip_dialog_invite_msession_start(self); + if(ret == 0 && TSIP_DIALOG(self)->state == tsip_early){ TSIP_DIALOG_INVITE_SIGNAL(self, tsip_m_early_media, TSIP_RESPONSE_CODE(message), TSIP_RESPONSE_PHRASE(message), message); @@ -545,6 +564,11 @@ int x0000_Connected_2_Connected_X_iACK(va_list *app) return ret; } + // starts ICE timers now that both parties receive the "candidates" + if(tsip_dialog_invite_ice_is_enabled(self)){ + tsip_dialog_invite_ice_timers_set(self, TSIP_DIALOG_INVITE_ICE_CONNCHECK_TIMEOUT); + } + /* alert the user */ TSIP_DIALOG_INVITE_SIGNAL(self, tsip_i_request, tsip_event_code_dialog_request_incoming, "Incoming Request", rACK); @@ -607,7 +631,11 @@ int x0000_Connected_2_Connected_X_iINVITEorUPDATE(va_list *app) /* alert the user */ TSIP_DIALOG_INVITE_SIGNAL(self, tsip_i_request, tsip_event_code_dialog_request_incoming, "Incoming Request.", rINVITEorUPDATE); - + + // stops ICE timers until both parties receive the "candidates" + if(tsip_dialog_invite_ice_is_enabled(self)){ + tsip_dialog_invite_ice_timers_set(self, -1); + } return ret; } @@ -624,9 +652,6 @@ static int x0000_Connected_2_Connected_X_oINVITE(va_list *app) va_arg(*app, const tsip_message_t *); action = va_arg(*app, const tsip_action_t *); - /* Update current action */ - ret = tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); - /* Get Media type from the action */ mediaType_changed = (TSIP_DIALOG_GET_SS(self)->media.type != action->media.type && action->media.type != tmedia_none); if(self->msession_mgr && mediaType_changed){ @@ -669,7 +694,7 @@ int x0000_Any_2_Any_X_iPRACK(va_list *app) } /* Send 488 */ - return send_ERROR(self, self->last_iInvite, 488, "Not Acceptable", "SIP; cause=488; text=\"Failed to match PRACK request\""); + return send_ERROR(self, rPRACK, 488, "Failed to match PRACK request", "SIP; cause=488; text=\"Failed to match PRACK request\""); } /* Any -> (iOPTIONS) -> Any */ @@ -724,7 +749,7 @@ int x0000_Any_2_Any_X_i2xxINVITEorUPDATE(va_list *app) /* Process remote offer */ if((ret = tsip_dialog_invite_process_ro(self, r2xx))){ - /* Send error */ + send_BYE(self); return ret; } @@ -732,6 +757,11 @@ int x0000_Any_2_Any_X_i2xxINVITEorUPDATE(va_list *app) if(TSIP_RESPONSE_IS_TO_INVITE(r2xx)){ ret = send_ACK(self, r2xx); } + + // starts ICE timers now that both parties received the "candidates" + if(tsip_dialog_invite_ice_is_enabled(self)){ + tsip_dialog_invite_ice_timers_set(self, TSIP_DIALOG_INVITE_ICE_CONNCHECK_TIMEOUT); + } return ret; } @@ -914,6 +944,42 @@ int x9999_Any_2_Any_X_Error(va_list *app) // == STATE MACHINE END == //++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +int tsip_dialog_invite_msession_configure(tsip_dialog_invite_t *self) +{ + tmedia_srtp_mode_t srtp_mode; + tsk_bool_t is_rtcweb_enabled; + + if(!self || !self->msession_mgr){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + is_rtcweb_enabled = (((tsip_ssession_t*)TSIP_DIALOG(self)->ss)->media.profile == tmedia_profile_rtcweb); + srtp_mode = is_rtcweb_enabled ? tmedia_srtp_mode_mandatory : ((tsip_ssession_t*)TSIP_DIALOG(self)->ss)->media.srtp_mode; + + return tmedia_session_mgr_set(self->msession_mgr, + TMEDIA_SESSION_SET_INT32(self->msession_mgr->type, "srtp-mode", srtp_mode), + TMEDIA_SESSION_SET_INT32(self->msession_mgr->type, "avpf-enabled", is_rtcweb_enabled), // Otherwise will be negociated using SDPCapNeg (RFC 5939) + TMEDIA_SESSION_SET_INT32(self->msession_mgr->type, "rtcp-enabled", is_rtcweb_enabled), + tsk_null); +} + +int tsip_dialog_invite_msession_start(tsip_dialog_invite_t *self) +{ + if(!self || !self->msession_mgr){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if(tsip_dialog_invite_ice_is_enabled(self) && !tsip_dialog_invite_ice_is_connected(self)){ + self->ice.start_smgr = tsk_true; + } + else{ + self->ice.start_smgr = tsk_false; + return tmedia_session_mgr_start(self->msession_mgr); + } + return 0; +} // send INVITE/UPDATE request int send_INVITEorUPDATE(tsip_dialog_invite_t *self, tsk_bool_t is_INVITE, tsk_bool_t force_sdp) @@ -948,6 +1014,9 @@ int send_INVITEorUPDATE(tsip_dialog_invite_t *self, tsk_bool_t is_INVITE, tsk_bo char* sdp; if((sdp_lo = tmedia_session_mgr_get_lo(self->msession_mgr)) && (sdp = tsdp_message_tostring(sdp_lo))){ tsip_message_add_content(request, "application/sdp", sdp, tsk_strlen(sdp)); + if(tsip_dialog_invite_ice_is_enabled(self)){ + ret = tsip_dialog_invite_ice_process_lo(self, sdp_lo); + } TSK_FREE(sdp); } } @@ -1293,7 +1362,8 @@ int send_ACK(tsip_dialog_invite_t *self, const tsip_response_t* r2xxINVITE) if((self->msession_mgr->type & tmedia_msrp) == tmedia_msrp){ tmedia_session_mgr_set_msrp_cb(self->msession_mgr, TSIP_DIALOG_GET_SS(self)->userdata, TSIP_DIALOG_GET_SS(self)->media.msrp.callback); } - ret = tmedia_session_mgr_start(self->msession_mgr); + // starts session manager + ret = tsip_dialog_invite_msession_start(self); } } @@ -1417,9 +1487,12 @@ int send_RESPONSE(tsip_dialog_invite_t *self, const tsip_request_t* request, sho const tsdp_message_t* sdp_lo; char* sdp = tsk_null; if((sdp_lo = tmedia_session_mgr_get_lo(self->msession_mgr)) && (sdp = tsdp_message_tostring(sdp_lo))){ - tsip_message_add_content(response, "application/sdp", sdp, tsk_strlen(sdp)); + ret = tsip_message_add_content(response, "application/sdp", sdp, tsk_strlen(sdp)); + if(tsip_dialog_invite_ice_is_enabled(self)){ + ret = tsip_dialog_invite_ice_process_lo(self, sdp_lo); + } } - TSK_FREE(sdp); + TSK_FREE(sdp); } /* Add Allow header */ @@ -1489,6 +1562,14 @@ int tsip_dialog_invite_OnTerminated(tsip_dialog_invite_t *self) if(self->msession_mgr && self->msession_mgr->started){ tmedia_session_mgr_stop(self->msession_mgr); } + // because of C# and Java garbage collectors, the ICE context could + // be destroyed (then stoppped) very late + if(self->ice.ctx_audio){ + tnet_ice_ctx_stop(self->ice.ctx_audio); + } + if(self->ice.ctx_video){ + tnet_ice_ctx_stop(self->ice.ctx_video); + } /* alert the user */ TSIP_DIALOG_SIGNAL_2(self, tsip_event_code_dialog_terminated, @@ -1537,9 +1618,13 @@ static tsk_object_t* tsip_dialog_invite_ctor(tsk_object_t * self, va_list * app) TSIP_DIALOG_GET_FSM(dialog)->debug = DEBUG_STATE_MACHINE; tsk_fsm_set_callback_terminated(TSIP_DIALOG_GET_FSM(dialog), TSK_FSM_ONTERMINATED_F(tsip_dialog_invite_OnTerminated), (const void*)dialog); - /* default values */ - dialog->supported._100rel = tmedia_defaults_get_100rel_enabled(); + /* default values */ + dialog->supported._100rel = ((tsip_ssession_t*)ss)->media.enable_100rel; dialog->supported.norefersub = tsk_true; + dialog->supported.ice = (((tsip_ssession_t*)ss)->media.profile == tmedia_profile_rtcweb) ? tsk_true : ((tsip_ssession_t*)ss)->media.enable_ice; + dialog->ice.is_jingle = (((tsip_ssession_t*)ss)->media.profile == tmedia_profile_rtcweb); + dialog->use_rtcp = tsk_false; // FIXME: this is used for ICE neg. For now we always use "rtcp-mux" + dialog->ice.last_action_id = tsk_fsm_state_none; dialog->refersub = tsk_true; // ... do the same for preconditions, replaces, .... @@ -1565,11 +1650,17 @@ static tsk_object_t* tsip_dialog_invite_dtor(tsk_object_t * _self) // DeInitialize self TSK_OBJECT_SAFE_FREE(self->ss_transf); TSK_OBJECT_SAFE_FREE(self->msession_mgr); + TSK_OBJECT_SAFE_FREE(self->last_oInvite); TSK_OBJECT_SAFE_FREE(self->last_iInvite); TSK_OBJECT_SAFE_FREE(self->last_o1xxrel); TSK_OBJECT_SAFE_FREE(self->last_iRefer); TSK_FREE(self->stimers.refresher); + + TSK_OBJECT_SAFE_FREE(self->ice.ctx_audio); + TSK_OBJECT_SAFE_FREE(self->ice.ctx_video); + TSK_OBJECT_SAFE_FREE(self->ice.last_action); + TSK_OBJECT_SAFE_FREE(self->ice.last_message); //... TSK_DEBUG_INFO("*** INVITE Dialog destroyed ***"); diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.client.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.client.c index 0377969a..2faa7fce 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.client.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.client.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ * The SOA machine is designed as per RFC 3264 and draft-ietf-sipping-sip-offeranswer-12. * MMTel services implementation follow 3GPP TS 24.173. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -45,11 +45,16 @@ extern int send_INVITEorUPDATE(tsip_dialog_invite_t *self, tsk_bool_t is_INVITE, tsk_bool_t force_sdp); extern int send_ACK(tsip_dialog_invite_t *self, const tsip_response_t* r2xxINVITE); extern int send_CANCEL(tsip_dialog_invite_t *self); +extern int send_BYE(tsip_dialog_invite_t *self); extern int send_RESPONSE(tsip_dialog_invite_t *self, const tsip_request_t* request, short code, const char* phrase, tsk_bool_t force_sdp); +extern int tsip_dialog_invite_msession_configure(tsip_dialog_invite_t *self); extern int tsip_dialog_invite_process_ro(tsip_dialog_invite_t *self, const tsip_message_t* message); extern int tsip_dialog_invite_stimers_handle(tsip_dialog_invite_t* self, const tsip_message_t* message); extern int tsip_dialog_invite_notify_parent(tsip_dialog_invite_t *self, const tsip_response_t* response); +extern int tsip_dialog_invite_ice_timers_set(tsip_dialog_invite_t *self, int64_t timeout); +extern tsk_bool_t tsip_dialog_invite_ice_is_enabled(const tsip_dialog_invite_t * self); + extern int x0000_Any_2_Any_X_i1xx(va_list *app); /* ======================== transitions ======================== */ @@ -125,8 +130,11 @@ int c0000_Started_2_Outgoing_X_oINVITE(va_list *app) self->msession_mgr = tmedia_session_mgr_create(action ? action->media.type : tmedia_all, TSIP_DIALOG_GET_STACK(self)->network.local_ip, TNET_SOCKET_TYPE_IS_IPV6(TSIP_DIALOG_GET_STACK(self)->network.proxy_cscf_type), tsk_true); if(TSIP_DIALOG_GET_STACK(self)->natt.ctx){ - tmedia_session_mgr_set_natt_ctx(self->msession_mgr, TSIP_DIALOG_GET_STACK(self)->natt.ctx, TSIP_DIALOG_GET_STACK(self)->network.aor.ip); + ret = tmedia_session_mgr_set_natt_ctx(self->msession_mgr, TSIP_DIALOG_GET_STACK(self)->natt.ctx, TSIP_DIALOG_GET_STACK(self)->network.aor.ip); } + + ret = tmedia_session_mgr_set_ice_ctx(self->msession_mgr, self->ice.ctx_audio, self->ice.ctx_video); + ret = tsip_dialog_invite_msession_configure(self); } /* We are the client */ @@ -134,9 +142,6 @@ int c0000_Started_2_Outgoing_X_oINVITE(va_list *app) /* Whether it's a client dialog for call transfer */ self->is_transf = (TSIP_DIALOG_GET_SS(self)->id_parent != TSIP_SSESSION_INVALID_ID); - /* Update current action */ - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); - /* Get Media type from the action */ TSIP_DIALOG_GET_SS(self)->media.type = action->media.type; /* Appy media params received from the user */ @@ -176,9 +181,6 @@ int c0000_Started_2_Outgoing_X_oINVITE(va_list *app) self->supported.precondition = (self->qos.strength == tmedia_qos_strength_optional); self->require.precondition = (self->qos.strength == tmedia_qos_strength_mandatory); - /* 100rel */ - self->supported._100rel = TSIP_DIALOG_GET_SS(self)->media.enable_100rel; - /* send the request */ ret = send_INVITE(self, tsk_false); @@ -205,7 +207,7 @@ int c0000_Outgoing_2_Connected_X_i2xxINVITE(va_list *app) /* Process remote offer */ if((ret = tsip_dialog_invite_process_ro(self, r2xxINVITE))){ - /* Send error */ + send_BYE(self); return ret; } else{ @@ -220,6 +222,11 @@ int c0000_Outgoing_2_Connected_X_i2xxINVITE(va_list *app) if(self->stimers.timer.timeout){ tsip_dialog_invite_stimers_handle(self, r2xxINVITE); } + + // starts ICE timers now that both parties received the "candidates" + if(tsip_dialog_invite_ice_is_enabled(self)){ + tsip_dialog_invite_ice_timers_set(self, TSIP_DIALOG_INVITE_ICE_CONNCHECK_TIMEOUT); + } /* Alert the user (session) */ ret = TSIP_DIALOG_INVITE_SIGNAL(self, tsip_ao_request, diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.ect.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.ect.c index 0d01097b..13c16f9f 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.ect.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.ect.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ * communication to a third party. * This code inplement Consultative transfer mode (A.2). * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -47,7 +47,7 @@ #include "tsk_debug.h" -static int sendNOTIFY(tsip_dialog_invite_t *self, short code, const char* phrase); +static int send_NOTIFY(tsip_dialog_invite_t *self, short code, const char* phrase); static int send_REFER(tsip_dialog_invite_t *self, const char* to); static short get_SipFragResponseCode(const tsip_request_t* notify); static tsip_response_t * get_SipFragMessage(const tsip_request_t* notify); @@ -156,7 +156,6 @@ static int x0400_Connected_2_oECTing_X_oECT(va_list *app) va_arg(*app, const tsip_message_t *); action = va_arg(*app, const tsip_action_t *); - ret = tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); ret = send_REFER(self, action->ect.to); if(ret == 0){ @@ -283,8 +282,6 @@ static int x0400_iECTreq_2_Connected_X_reject(va_list *app) va_arg(*app, const tsip_message_t *); action = va_arg(*app, const tsip_action_t *); - ret = tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); - // Send Reject code = action->line_resp.code>=300 ? action->line_resp.code : 603; phrase = action->line_resp.phrase ? action->line_resp.phrase : "Decline Transfer"; @@ -307,8 +304,6 @@ static int x0400_iECTreq_2_iECTing_X_accept(va_list *app) va_arg(*app, const tsip_message_t *); action = va_arg(*app, const tsip_action_t *); - ret = tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); - // Send 200 OK ret = send_RESPONSE(self, self->last_iRefer, 200, "Transfering", tsk_false); Refer_To = (const tsip_header_Refer_To_t*)tsip_message_get_header(self->last_iRefer, tsip_htype_Refer_To); // Not null: already checked @@ -350,7 +345,7 @@ static int x0400_iECTing_2_iECTing_X_1xxfNOTIFY(va_list *app) response = va_arg(*app, const tsip_message_t *); // send NOTIFY (event if norefersub enabled) and alert user - ret = sendNOTIFY(self, TSIP_RESPONSE_CODE(response), TSIP_RESPONSE_PHRASE(response)); + ret = send_NOTIFY(self, TSIP_RESPONSE_CODE(response), TSIP_RESPONSE_PHRASE(response)); return ret; } @@ -368,7 +363,7 @@ static int x0400_iECTing_2_Connected_X_23456fNOTIFY(va_list *app) code = TSIP_RESPONSE_CODE(response); // send NOTIFY (event if norefersub enabled) and alert user - ret = sendNOTIFY(self, code, TSIP_RESPONSE_PHRASE(response)); + ret = send_NOTIFY(self, code, TSIP_RESPONSE_PHRASE(response)); if(code >= 200 && code <= 299){ TSIP_DIALOG_INVITE_SIGNAL(self, tsip_i_ect_completed, @@ -385,7 +380,12 @@ static int x0400_iECTing_2_Connected_X_23456fNOTIFY(va_list *app) } -static int sendNOTIFY(tsip_dialog_invite_t *self, short code, const char* phrase) +//++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// == STATE MACHINE END == +//++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + +static int send_NOTIFY(tsip_dialog_invite_t *self, short code, const char* phrase) { tsip_request_t *notify = tsk_null; int ret = -1; diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.hold.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.hold.c index 6765ac55..d8f51f80 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.hold.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.hold.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ * The Communication Hold supplementary service enables a user to suspend the reception of media stream(s) of an established IP multimedia session, * and resume the media stream(s) at a later time. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -108,9 +108,6 @@ int x0100_Connected_2_Holding_X_oHold(va_list *app) /* put on hold */ ret = tmedia_session_mgr_hold(self->msession_mgr, action->media.type); - /* update current action */ - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); - /* send the request */ if((ret = send_INVITE(self, tsk_false))){ // FIXME: signal error without breaking the state machine @@ -175,9 +172,6 @@ int x0102_Connected_2_Resuming_X_oResume(va_list *app) ret = tmedia_session_mgr_resume(self->msession_mgr, action->media.type, tsk_true); ret = tmedia_session_mgr_resume(self->msession_mgr, action->media.type, tsk_false); - /* update current action */ - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); - /* send the request */ if((ret = send_INVITE(self, tsk_false))){ // FIXME: signal error without breaking the state machine diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.ice.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.ice.c new file mode 100644 index 00000000..3a2e4b5e --- /dev/null +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.ice.c @@ -0,0 +1,471 @@ +/* +* Copyright (C) 2012 Doubango Telecom +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as publishd by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#include "tinysip/dialogs/tsip_dialog_invite.h" + +#include "tinysip/dialogs/tsip_dialog_invite.common.h" + +#include "tinysdp/parsers/tsdp_parser_message.h" +#include "tinysdp/tsdp_message.h" +#include "tinysdp/headers/tsdp_header_S.h" + +#include "ice/tnet_ice_ctx.h" + +#include "tsk_debug.h" + +extern int tsip_dialog_invite_msession_start(tsip_dialog_invite_t *self); + +static int tsip_dialog_invite_ice_create_ctx(tsip_dialog_invite_t * self, tmedia_type_t media_type); +static int tsip_dialog_invite_ice_audio_callback(const tnet_ice_event_t *e); +static int tsip_dialog_invite_ice_video_callback(const tnet_ice_event_t *e); +tsk_bool_t tsip_dialog_invite_ice_got_local_candidates(const tsip_dialog_invite_t * self); +int tsip_dialog_invite_ice_process_ro(tsip_dialog_invite_t * self, const tsdp_message_t* sdp_ro, tsk_bool_t is_remote_offer); + +/* ======================== transitions ======================== */ +// Use "Current" instead of "Any" to avoid priority reordering +static int x0500_Current_2_Current_X_oINVITE(va_list *app); +static int x0500_Current_2_Current_X_iINVITE(va_list *app); + +/* ======================== conds ======================== */ +static tsk_bool_t _fsm_cond_get_local_candidates(tsip_dialog_invite_t* self, tsip_message_t* message) +{ + if(self->supported.ice){ + tsk_bool_t use_ice = tsk_false; + // "action->media.type" will be defined for locally initiated media update + tmedia_type_t new_media = TSIP_DIALOG(self)->curr_action ? TSIP_DIALOG(self)->curr_action->media.type : tmedia_none; + + if(message && TSIP_MESSAGE_HAS_CONTENT(message) && tsk_striequals("application/sdp", TSIP_MESSAGE_CONTENT_TYPE(message))){ + // If this code is called this means that we are the "answerer" + // only gets the candidates if ICE is enabled and the remote peer supports ICE + tsdp_message_t* sdp_ro; + const tsdp_header_M_t* M; + if(!(sdp_ro = tsdp_message_parse(TSIP_MESSAGE_CONTENT_DATA(message), TSIP_MESSAGE_CONTENT_DATA_LENGTH(message)))){ + TSK_DEBUG_ERROR("Failed to parse remote sdp message"); + return tsk_false; + } + // For now do not use ICE one of the media is ICE-less + use_ice = !(((M = tsdp_message_find_media(sdp_ro, "audio")) && !tsdp_header_M_findA(M, "candidate")) + || ((M = tsdp_message_find_media(sdp_ro, "video")) && !tsdp_header_M_findA(M, "candidate"))); + new_media = tmedia_type_from_sdp(sdp_ro); + + TSK_OBJECT_SAFE_FREE(sdp_ro); + } + else if(!message){ + // we are the "offerer" + use_ice = tsk_true; + } + + if(use_ice){ + if(!self->ice.ctx_audio && !self->ice.ctx_video){ // First time + return tsk_true; + } + else{ + if(self->ice.media_type != new_media){ + return tsk_true; + } + return !tsip_dialog_invite_ice_got_local_candidates(self); + } + } + } + return tsk_false; +} + +int tsip_dialog_invite_ice_init(tsip_dialog_invite_t *self) +{ + tsk_fsm_set(TSIP_DIALOG_GET_FSM(self), + // Current -> (oINVITE) -> Current + TSK_FSM_ADD(tsk_fsm_state_current, _fsm_action_oINVITE, _fsm_cond_get_local_candidates, tsk_fsm_state_current, x0500_Current_2_Current_X_oINVITE, "x0500_Current_2_Current_X_oINVITE"), + // Current -> (iINVITE) -> Current + TSK_FSM_ADD(tsk_fsm_state_current, _fsm_action_iINVITE, _fsm_cond_get_local_candidates, tsk_fsm_state_current, x0500_Current_2_Current_X_iINVITE, "x0500_Current_2_Current_X_iINVITE") + ); + + return 0; +} + +int tsip_dialog_invite_ice_timers_set(tsip_dialog_invite_t *self, int64_t timeout) +{ + if(tnet_ice_ctx_is_active(self->ice.ctx_audio)){ + tnet_ice_ctx_set_concheck_timeout(self->ice.ctx_audio, timeout); + } + if(tnet_ice_ctx_is_active(self->ice.ctx_video)){ + tnet_ice_ctx_set_concheck_timeout(self->ice.ctx_video, timeout); + } + return 0; +} + +static int tsip_dialog_invite_ice_create_ctx(tsip_dialog_invite_t * self, tmedia_type_t media_type) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if(!self->ice.ctx_audio && (media_type & tmedia_audio)){ + self->ice.ctx_audio = tnet_ice_ctx_create(self->ice.is_jingle, TNET_SOCKET_TYPE_IS_IPV6(TSIP_DIALOG_GET_STACK(self)->network.proxy_cscf_type), + self->use_rtcp, tsk_false, tsip_dialog_invite_ice_audio_callback, self); + if(!self->ice.ctx_audio){ + TSK_DEBUG_ERROR("Failed to create ICE audio context"); + return -2; + } + tnet_ice_ctx_set_stun(self->ice.ctx_audio, "stun.l.google.com", 19302, "Doubango", "bossiel@yahoo.fr", "stun-password"); //FIXME + } + if(!self->ice.ctx_video && (media_type & tmedia_video)){ + self->ice.ctx_video = tnet_ice_ctx_create(self->ice.is_jingle, TNET_SOCKET_TYPE_IS_IPV6(TSIP_DIALOG_GET_STACK(self)->network.proxy_cscf_type), + self->use_rtcp, tsk_true, tsip_dialog_invite_ice_video_callback, self); + if(!self->ice.ctx_video){ + TSK_DEBUG_ERROR("Failed to create ICE video context"); + return -2; + } + tnet_ice_ctx_set_stun(self->ice.ctx_video, "stun.l.google.com", 19302, "Doubango", "bossiel@yahoo.fr", "stun-password"); // FIXME + } + + // "none" comparison is used to exclude the "first call" + if(self->ice.media_type != tmedia_none && self->ice.media_type != media_type){ + // cancels contexts associated to old medias + if(self->ice.ctx_audio && !(media_type & tmedia_audio)){ + tnet_ice_ctx_cancel(self->ice.ctx_audio); + } + if(self->ice.ctx_video && !(media_type & tmedia_video)){ + tnet_ice_ctx_cancel(self->ice.ctx_video); + } + // cancels contexts associated to new medias (e.g. session "remove" then "add") + // cancel() on newly created contexts don't have any effect + if(self->ice.ctx_audio && (!(media_type & tmedia_audio) && (self->ice.media_type & tmedia_audio))){ + //tnet_ice_ctx_cancel(self->ice.ctx_audio); + } + if(self->ice.ctx_video && (!(media_type & tmedia_video) && (self->ice.media_type & tmedia_video))){ + //tnet_ice_ctx_cancel(self->ice.ctx_video); + } + } + + self->ice.media_type = media_type; + + + // For now disable timers until both parties get candidates + // (RECV ACK) or RECV (200 OK) + tsip_dialog_invite_ice_timers_set(self, -1); + + // update session manager with the right ICE contexts + if(self->msession_mgr){ + tmedia_session_mgr_set_ice_ctx(self->msession_mgr, self->ice.ctx_audio, self->ice.ctx_video); + } + + return 0; +} + +static int tsip_dialog_invite_ice_start_ctx(tsip_dialog_invite_t * self) +{ + int ret = 0; + if(self){ + if((self->ice.media_type & tmedia_audio)){ + if(self->ice.ctx_audio && (ret = tnet_ice_ctx_start(self->ice.ctx_audio)) != 0){ + return ret; + } + } + if((self->ice.media_type & tmedia_video)){ + if(self->ice.ctx_video && (ret = tnet_ice_ctx_start(self->ice.ctx_video)) != 0){ + return ret; + } + } + } + return 0; +} + +tsk_bool_t tsip_dialog_invite_ice_is_enabled(const tsip_dialog_invite_t * self) +{ + if(self){ + return (self->supported.ice && (tnet_ice_ctx_is_active(self->ice.ctx_audio) || tnet_ice_ctx_is_active(self->ice.ctx_video))); + } + return tsk_false; +} + +tsk_bool_t tsip_dialog_invite_ice_is_connected(const tsip_dialog_invite_t * self) +{ + if(self){ + return (!tnet_ice_ctx_is_active(self->ice.ctx_audio) || tnet_ice_ctx_is_connected(self->ice.ctx_audio)) + && (!tnet_ice_ctx_is_active(self->ice.ctx_video) || tnet_ice_ctx_is_connected(self->ice.ctx_video)); + } + return tsk_false; +} + +tsk_bool_t tsip_dialog_invite_ice_got_local_candidates(const tsip_dialog_invite_t * self) +{ + if(self){ + return (!tnet_ice_ctx_is_active(self->ice.ctx_audio) || tnet_ice_ctx_got_local_candidates(self->ice.ctx_audio)) + && (!tnet_ice_ctx_is_active(self->ice.ctx_video) || tnet_ice_ctx_got_local_candidates(self->ice.ctx_video)); + } + return tsk_false; +} + +int tsip_dialog_invite_ice_save_action(tsip_dialog_invite_t * self, tsk_fsm_action_id action_id, const tsip_action_t* action, const tsip_message_t* message) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + // There are good reasons to ref() the action and message before safe_free() + // /!\ do not change + + self->ice.last_action_id = action_id; + action = tsk_object_ref((tsk_object_t*)action); + TSK_OBJECT_SAFE_FREE(self->ice.last_action); + self->ice.last_action = (tsip_action_t*)action; + + message = tsk_object_ref((tsk_object_t*)message); + TSK_OBJECT_SAFE_FREE(self->ice.last_message); + self->ice.last_message = (tsip_message_t*)message; + return 0; +} + +int tsip_dialog_invite_ice_process_lo(tsip_dialog_invite_t * self, const tsdp_message_t* sdp_lo) +{ + const tsdp_header_M_t* M; + const tsdp_header_A_t *A; + int ret = 0, i; + + if(!self || !sdp_lo){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + // cancels all ICE contexts without candidates + // this happens if codecs negotiations mismatch for one media out of two or three + for(i = 0; i < 2; ++i){ + struct tnet_ice_ctx_s *ctx = i == 0 ? self->ice.ctx_audio : self->ice.ctx_video; + const char* media = i == 0 ? "audio" : "video"; + if(tnet_ice_ctx_is_active(ctx)){ + tsk_bool_t cancel = tsk_true; + if((M = tsdp_message_find_media(sdp_lo, media))){ + if((A = tsdp_header_M_findA(M, "candidate"))){ + cancel = tsk_false; + } + } + if(cancel){ + ret = tnet_ice_ctx_cancel(ctx); + } + } + } + + return ret; +} + +int tsip_dialog_invite_ice_process_ro(tsip_dialog_invite_t * self, const tsdp_message_t* sdp_ro, tsk_bool_t is_remote_offer) +{ + char* ice_remote_candidates; + const tsdp_header_M_t* M; + tsk_size_t index; + const tsdp_header_A_t *A; + const char* sess_ufrag = tsk_null; + const char* sess_pwd = tsk_null; + int ret = 0, i; + + if(!self || !sdp_ro){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + if(!self->ice.ctx_audio && !self->ice.ctx_video){ + return 0; + } + + // session level attributes + + if((A = tsdp_message_get_headerA(sdp_ro, "ice-ufrag"))){ + sess_ufrag = A->value; + } + if((A = tsdp_message_get_headerA(sdp_ro, "ice-pwd"))){ + sess_pwd = A->value; + } + +#if 0 // Use RTCWeb Profile (tmedia_profile_rtcweb) + { + const tsdp_header_S_t *S; + if((S = (const tsdp_header_S_t *)tsdp_message_get_header(sdp_ro, tsdp_htype_S)) && S->value){ + self->ice.is_jingle = tsk_strcontains(S->value, tsk_strlen(S->value), "webrtc"); + } + } +#endif + + for(i = 0; i < 2; ++i){ + if((M = tsdp_message_find_media(sdp_ro, i==0 ? "audio": "video"))){ + const char *ufrag = sess_ufrag, *pwd = sess_pwd; + ice_remote_candidates = tsk_null; + index = 0; + if((A = tsdp_header_M_findA(M, "ice-ufrag"))){ + ufrag = A->value; + } + if((A = tsdp_header_M_findA(M, "ice-pwd"))){ + pwd = A->value; + } + + while((A = tsdp_header_M_findA_at(M, "candidate", index++))){ + tsk_strcat_2(&ice_remote_candidates, "%s\r\n", A->value); + } + // ICE processing will be automatically stopped if the remote candidates are not valid + // ICE-CONTROLLING role if we are the offerer + ret = tnet_ice_ctx_set_remote_candidates(i==0 ? self->ice.ctx_audio : self->ice.ctx_video, ice_remote_candidates, ufrag, pwd, !is_remote_offer, self->ice.is_jingle); + TSK_SAFE_FREE(ice_remote_candidates); + } + } + + return ret; +} + + +//-------------------------------------------------------- +// == STATE MACHINE BEGIN == +//-------------------------------------------------------- + + +// Started -> (oINVITE) -> Started +static int x0500_Current_2_Current_X_oINVITE(va_list *app) +{ + int ret; + tsip_dialog_invite_t *self; + const tsip_action_t* action; + const tsip_message_t *message; + tmedia_type_t media_type; + + self = va_arg(*app, tsip_dialog_invite_t *); + message = va_arg(*app, const tsip_message_t *); + action = va_arg(*app, const tsip_action_t *); + + media_type = (action && action->media.type != tmedia_none) ? action->media.type : TSIP_DIALOG_GET_SS(self)->media.type; + self->is_client = tsk_true; + tsip_dialog_invite_ice_save_action(self, _fsm_action_oINVITE, action, message); + + // create ICE context + if((ret = tsip_dialog_invite_ice_create_ctx(self, media_type))){ + TSK_DEBUG_ERROR("tsip_dialog_invite_ice_create_ctx() failed"); + return ret; + } + + // Start ICE + ret = tsip_dialog_invite_ice_start_ctx(self); + + // alert the user only if we are in initial state which means that it's not media update + if(TSIP_DIALOG(self)->state == tsip_initial){ + TSIP_DIALOG_SIGNAL(self, tsip_event_code_dialog_connecting, "Dialog connecting"); + } + + return ret; +} + +// Started -> (iINVITE) -> Started +static int x0500_Current_2_Current_X_iINVITE(va_list *app) +{ + int ret; + tsip_dialog_invite_t *self; + const tsip_action_t* action; + const tsip_message_t *message; + + self = va_arg(*app, tsip_dialog_invite_t *); + message = va_arg(*app, const tsip_message_t *); + action = va_arg(*app, const tsip_action_t *); + + self->is_client = tsk_false; + ret = tsip_dialog_invite_ice_save_action(self, _fsm_action_iINVITE, action, message); + + // set remote candidates + if(TSIP_MESSAGE_HAS_CONTENT(message)){ + if(tsk_striequals("application/sdp", TSIP_MESSAGE_CONTENT_TYPE(message))){ + tsdp_message_t* sdp_ro; + if(!(sdp_ro = tsdp_message_parse(TSIP_MESSAGE_CONTENT_DATA(message), TSIP_MESSAGE_CONTENT_DATA_LENGTH(message)))){ + TSK_DEBUG_ERROR("Failed to parse remote sdp message"); + return -2; + } + // create ICE context + if((ret = tsip_dialog_invite_ice_create_ctx(self, tmedia_type_from_sdp(sdp_ro)))){ + TSK_DEBUG_ERROR("tsip_dialog_invite_ice_create_ctx() failed"); + return ret; + } + ret = tsip_dialog_invite_ice_process_ro(self, sdp_ro, tsk_true); + TSK_OBJECT_SAFE_FREE(sdp_ro); + } + else{ + TSK_DEBUG_ERROR("[%s] content-type is not supportted", TSIP_MESSAGE_CONTENT_TYPE(message)); + return -3; + } + } + + // Start ICE + ret = tsip_dialog_invite_ice_start_ctx(self); + + return ret; +} + + + + +//++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// == STATE MACHINE END == +//++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +static int tsip_dialog_invite_ice_callback(const tnet_ice_event_t *e) +{ + int ret = 0; + tsip_dialog_invite_t *dialog; + + TSK_DEBUG_INFO("ICE callback: %s", e->phrase); + + dialog = (tsip_dialog_invite_t *)e->userdata; + + // Do not lock: caller is thread safe + + switch(e->type){ + case tnet_ice_event_type_gathering_completed: + case tnet_ice_event_type_conncheck_succeed: + case tnet_ice_event_type_conncheck_failed: + case tnet_ice_event_type_cancelled: + { + if(dialog->ice.last_action_id != tsk_fsm_state_none){ + if(tsip_dialog_invite_ice_got_local_candidates(dialog)){ + tsip_dialog_fsm_act(TSIP_DIALOG(dialog), dialog->ice.last_action_id, dialog->ice.last_message, dialog->ice.last_action); + dialog->ice.last_action_id = tsk_fsm_state_none; + } + } + if(dialog->ice.start_smgr){ + ret = tsip_dialog_invite_msession_start(dialog); + } + break; + } + case tnet_ice_event_type_gathering_host_candidates_failed: // fatal error + { + if(dialog->ice.last_action_id != tsk_fsm_state_none){ + tsip_dialog_fsm_act(TSIP_DIALOG(dialog), dialog->ice.last_action_id, dialog->ice.last_message, dialog->ice.last_action); + dialog->ice.last_action_id = tsk_fsm_state_none; + } + break; + } + } + + return ret; +} + +static int tsip_dialog_invite_ice_audio_callback(const tnet_ice_event_t *e) +{ + return tsip_dialog_invite_ice_callback(e); +} + +static int tsip_dialog_invite_ice_video_callback(const tnet_ice_event_t *e) +{ + return tsip_dialog_invite_ice_callback(e); +} \ No newline at end of file diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.qos.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.qos.c index 177f8e66..c241dfc7 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.qos.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.qos.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ * @brief Integration of Resource Management and Session Initiation Protocol (SIP) (RFC 3312) * QoS Reservation. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.server.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.server.c index ec45c55e..581dc4da 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.server.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.server.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ * The SOA machine is designed as per RFC 3264 and draft-ietf-sipping-sip-offeranswer-12. * MMTel services implementation follow 3GPP TS 24.173. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -46,12 +46,15 @@ static const char* supported_options[] = { "100rel", "precondition", "timer" }; /* ======================== external functions ======================== */ +extern int tsip_dialog_invite_msession_start(tsip_dialog_invite_t *self); extern int send_RESPONSE(tsip_dialog_invite_t *self, const tsip_request_t* request, short code, const char* phrase, tsk_bool_t force_sdp); extern int tsip_dialog_invite_process_ro(tsip_dialog_invite_t *self, const tsip_message_t* message); extern int tsip_dialog_invite_stimers_schedule(tsip_dialog_invite_t* self, uint64_t timeout); extern int send_ERROR(tsip_dialog_invite_t* self, const tsip_request_t* request, short code, const char* phrase, const char* reason); extern int tsip_dialog_invite_timer_callback(const tsip_dialog_invite_t* self, tsk_timer_id_t timer_id); +extern tsk_bool_t tsip_dialog_invite_ice_is_enabled(const tsip_dialog_invite_t * self); +extern tsk_bool_t tsip_dialog_invite_ice_is_connected(const tsip_dialog_invite_t * self); /* ======================== internal functions ======================== */ static int send_UNSUPPORTED(tsip_dialog_invite_t* self, const tsip_request_t* request, const char* option); @@ -156,20 +159,24 @@ static tsk_bool_t _fsm_cond_toosmall(tsip_dialog_invite_t* self, tsip_message_t* } return tsk_false; } -static tsk_bool_t _fsm_cond_supports_100rel(tsip_dialog_invite_t* self, tsip_message_t* message) + +// 100rel && (QoS or ICE) +static tsk_bool_t _fsm_cond_use_early_media(tsip_dialog_invite_t* self, tsip_message_t* message) { if((tsip_message_supported(message, "100rel") && self->supported._100rel) || tsip_message_required(message, "100rel")){ + if((tsip_message_supported(message, "precondition") && self->supported.precondition) || tsip_message_required(message, "precondition")){ + return tsk_true; + } + } +#if 0 + if(tsip_dialog_invite_ice_is_enabled(self)){ return tsk_true; } +#endif return tsk_false; } -static tsk_bool_t _fsm_cond_supports_precondition(tsip_dialog_invite_t* self, tsip_message_t* message) -{ - if((tsip_message_supported(message, "precondition") && self->supported.precondition) || tsip_message_required(message, "precondition")){ - return tsk_true; - } - return tsk_false; -} + + static tsk_bool_t _fsm_cond_prack_match(tsip_dialog_invite_t* self, tsip_message_t* message) { const tsip_header_RAck_t* RAck; @@ -224,8 +231,8 @@ int tsip_dialog_invite_server_init(tsip_dialog_invite_t *self) TSK_FSM_ADD(_fsm_state_Started, _fsm_action_iINVITE, _fsm_cond_bad_content, _fsm_state_Terminated, s0000_Started_2_Terminated_X_iINVITE, "s0000_Started_2_Terminated_X_iINVITE"), // Started -> (Session Interval Too Small) -> Started TSK_FSM_ADD(_fsm_state_Started, _fsm_action_iINVITE, _fsm_cond_toosmall, _fsm_state_Started, s0000_Started_2_Started_X_iINVITE, "s0000_Started_2_Started_X_iINVITE"), - // Started -> (100rel or QoS, the later need the first) -> InProgress - TSK_FSM_ADD(_fsm_state_Started, _fsm_action_iINVITE, _fsm_cond_supports_precondition, _fsm_state_InProgress, s0000_Started_2_InProgress_X_iINVITE, "s0000_Started_2_InProgress_X_iINVITE"), + // Started -> (100rel && (QoS or ICE)) -> InProgress + TSK_FSM_ADD(_fsm_state_Started, _fsm_action_iINVITE, _fsm_cond_use_early_media, _fsm_state_InProgress, s0000_Started_2_InProgress_X_iINVITE, "s0000_Started_2_InProgress_X_iINVITE"), // Started -> (non-100rel and non-QoS, referred to as "basic") -> Ringing TSK_FSM_ADD_ALWAYS(_fsm_state_Started, _fsm_action_iINVITE, _fsm_state_Ringing, s0000_Started_2_Ringing_X_iINVITE, "s0000_Started_2_Ringing_X_iINVITE"), @@ -577,9 +584,6 @@ int s0000_Ringing_2_Connected_X_Accept(va_list *app) va_arg(*app, const tsip_message_t *); action = va_arg(*app, const tsip_action_t *); - /* Update current action */ - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); - /* Determine whether the remote party support UPDATE */ self->support_update = tsip_message_allowed(self->last_iInvite, "UPDATE"); @@ -593,7 +597,8 @@ int s0000_Ringing_2_Connected_X_Accept(va_list *app) if((self->msession_mgr->type & tmedia_msrp) == tmedia_msrp){ tmedia_session_mgr_set_msrp_cb(self->msession_mgr, TSIP_DIALOG_GET_SS(self)->userdata, TSIP_DIALOG_GET_SS(self)->media.msrp.callback); } - ret = tmedia_session_mgr_start(self->msession_mgr); + // starts session manager + ret = tsip_dialog_invite_msession_start(self); } /* Cancel 100rel timer */ @@ -637,9 +642,6 @@ int s0000_Ringing_2_Terminated_X_Reject(va_list *app) va_arg(*app, const tsip_message_t *); action = va_arg(*app, const tsip_action_t *); - /* Update current action */ - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); - /* Cancel 100rel timer */ TSIP_DIALOG_TIMER_CANCEL(100rel); diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.timers.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.timers.c index 66145e1e..1c59156b 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.timers.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.timers.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ * The SOA machine is designed as per RFC 3264 and draft-ietf-sipping-sip-offeranswer-12. * Session Timers as per RFC 4028. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_layer.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_layer.c index a2c120e7..01fe5605 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_layer.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_layer.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_dialog_layer.c * @brief SIP dialog layer. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -117,8 +117,10 @@ tsip_dialog_t* tsip_dialog_layer_find(const tsip_dialog_layer_t *self, const cha tsk_bool_t is_register = (type == tsip_REGISTER); // Incoming REGISTER tsk_bool_t is_notify = (type == tsip_NOTIFY); // Incoming NOTIFY *cid_matched = tsk_true; - /* CANCEL Request will have the same local tag than the INVITE request -> do not compare tags */ - if((is_cancel || tsk_strequals(dialog->tag_local, from_tag)) && tsk_strequals(dialog->tag_remote, to_tag)){ + /* CANCEL Request will have the same local tag than the INVITE request + the remote tag could be null if the CANCEL request is received immediately after a 100 Trying + */ + if((is_cancel || tsk_strequals(dialog->tag_local, from_tag)) && (!dialog->tag_remote || tsk_strequals(dialog->tag_remote, to_tag))){ ret = tsk_object_ref(dialog); break; } diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_message.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_message.c index 70e1ee19..af684453 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_message.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_message.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_dialog_message.c * @brief SIP dialog message (Client side). * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -226,14 +226,10 @@ int tsip_dialog_message_init(tsip_dialog_message_t *self) int tsip_dialog_message_Started_2_Sending_X_sendMESSAGE(va_list *app) { tsip_dialog_message_t *self; - const tsip_action_t* action; self = va_arg(*app, tsip_dialog_message_t *); - va_arg(*app, tsip_message_t *); - action = va_arg(*app, const tsip_action_t *); TSIP_DIALOG(self)->running = tsk_true; - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); return send_MESSAGE(self); } diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_options.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_options.c index 0b858fce..ae5d8828 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_options.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_options.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_dialog_options.c * @brief SIP dialog OPTIONS as per RFC 3261 section 11. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -223,14 +223,10 @@ int tsip_dialog_options_init(tsip_dialog_options_t *self) int tsip_dialog_options_Started_2_Sending_X_sendOPTIONS(va_list *app) { tsip_dialog_options_t *self; - const tsip_action_t* action; self = va_arg(*app, tsip_dialog_options_t *); - /*tsip_request_t *request =*/ va_arg(*app, tsip_request_t *); - action = va_arg(*app, const tsip_action_t *); TSIP_DIALOG(self)->running = tsk_true; - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); /* alert the user */ TSIP_DIALOG_SIGNAL(self, tsip_event_code_dialog_connecting, "Dialog connecting"); diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_publish.client.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_publish.client.c index f69dc80b..36c5db10 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_publish.client.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_publish.client.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_dialog_publish.client.c * @brief SIP dialog PUBLISH as per RFC 3903. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -311,14 +311,10 @@ int tsip_dialog_publish_init(tsip_dialog_publish_t *self) int tsip_dialog_publish_Started_2_Trying_X_publish(va_list *app) { tsip_dialog_publish_t *self; - const tsip_action_t* action; self = va_arg(*app, tsip_dialog_publish_t *); - va_arg(*app, const tsip_message_t *); - action = va_arg(*app, const tsip_action_t *); TSIP_DIALOG(self)->running = tsk_true; - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); /* alert the user */ TSIP_DIALOG_SIGNAL(self, tsip_event_code_dialog_connecting, "Dialog connecting"); @@ -487,14 +483,8 @@ int tsip_dialog_publish_Trying_2_Terminated_X_cancel(va_list *app) int tsip_dialog_publish_Connected_2_Trying_X_publish(va_list *app) { tsip_dialog_publish_t *self; - const tsip_action_t* action; self = va_arg(*app, tsip_dialog_publish_t *); - va_arg(*app, const tsip_message_t *); - action = va_arg(*app, const tsip_action_t *); - - /* Set current action */ - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); return send_PUBLISH(self); } @@ -504,14 +494,8 @@ int tsip_dialog_publish_Connected_2_Trying_X_publish(va_list *app) int tsip_dialog_publish_Any_2_Trying_X_hangup(va_list *app) { tsip_dialog_publish_t *self; - const tsip_action_t* action; self = va_arg(*app, tsip_dialog_publish_t *); - va_arg(*app, const tsip_message_t *); - action = va_arg(*app, const tsip_action_t *); - - /* Set current action */ - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); /* Alert the user */ TSIP_DIALOG_SIGNAL(self, tsip_event_code_dialog_terminating, "Terminating dialog"); diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_register.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_register.c index cf39ed22..c22cec55 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_register.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_register.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -175,7 +175,7 @@ int tsip_dialog_register_init(tsip_dialog_register_t *self) tsip_dialog_register_client_init(self); // initialize server side tsip_dialog_register_server_init(self); - + /* Initialize common side */ tsk_fsm_set(TSIP_DIALOG_GET_FSM(self), @@ -198,7 +198,7 @@ int tsip_dialog_register_init(tsip_dialog_register_t *self) TSK_FSM_ADD_ALWAYS(tsk_fsm_state_any, _fsm_action_error, _fsm_state_Terminated, tsip_dialog_register_Any_2_Terminated_X_Error, "tsip_dialog_register_Any_2_Terminated_X_Error"), TSK_FSM_ADD_NULL()); - + /* Sets callback function */ TSIP_DIALOG(self)->callback = TSIP_DIALOG_EVENT_CALLBACK_F(tsip_dialog_register_event_callback); @@ -207,7 +207,7 @@ int tsip_dialog_register_init(tsip_dialog_register_t *self) self->timerrefresh.timeout = TSIP_DIALOG(self)->expires; self->timershutdown.id = TSK_INVALID_TIMER_ID; self->timershutdown.timeout = TSIP_DIALOG_SHUTDOWN_TIMEOUT; - + return 0; } @@ -219,14 +219,8 @@ int tsip_dialog_register_init(tsip_dialog_register_t *self) int tsip_dialog_register_Any_2_InProgress_X_hangup(va_list *app) { tsip_dialog_register_t *self; - const tsip_action_t* action; self = va_arg(*app, tsip_dialog_register_t *); - va_arg(*app, const tsip_message_t *); - action = va_arg(*app, const tsip_action_t *); - - /* Set current action */ - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); /* Alert the user */ TSIP_DIALOG_SIGNAL(self, tsip_event_code_dialog_terminating, "Terminating dialog"); diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_register.client.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_register.client.c index 51944bd1..93af061e 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_register.client.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_register.client.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_dialog_register.client.c * @brief SIP dialog register (Client side). * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -131,14 +131,10 @@ int tsip_dialog_register_client_init(tsip_dialog_register_t *self) int tsip_dialog_register_Started_2_InProgress_X_oRegister(va_list *app) { tsip_dialog_register_t *self; - const tsip_action_t* action; self = va_arg(*app, tsip_dialog_register_t *); - va_arg(*app, const tsip_message_t *); - action = va_arg(*app, const tsip_action_t *); TSIP_DIALOG(self)->running = tsk_true; - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); /* alert the user */ TSIP_DIALOG_SIGNAL(self, tsip_event_code_dialog_connecting, "Dialog connecting"); @@ -403,14 +399,8 @@ int tsip_dialog_register_InProgress_2_Terminated_X_cancel(va_list *app) int tsip_dialog_register_Connected_2_InProgress_X_oRegister(va_list *app) { tsip_dialog_register_t *self; - const tsip_action_t* action; self = va_arg(*app, tsip_dialog_register_t *); - /*const tsip_message_t *message =*/ va_arg(*app, const tsip_message_t *); - action = va_arg(*app, const tsip_action_t *); - - /* Set current action */ - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); return tsip_dialog_register_send_REGISTER(self, tsk_true); } diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_register.server.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_register.server.c index a40ef802..68c73b1b 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_register.server.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_register.server.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -150,14 +150,8 @@ int s0000_Incoming_2_Connected_X_Accept(va_list *app) int ret; tsip_dialog_register_t *self; - const tsip_action_t* action; self = va_arg(*app, tsip_dialog_register_t *); - va_arg(*app, const tsip_message_t *); - action = va_arg(*app, const tsip_action_t *); - - /* update current action */ - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); /* send 2xx OK */ if((ret = tsip_dialog_register_send_RESPONSE(self, self->last_iRegister, 200, "OK"))){ diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_subscribe.client.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_subscribe.client.c index 60713625..142e3b8c 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_subscribe.client.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_subscribe.client.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_dialog_subscribe.client.c * @brief SIP dialog SUBSCRIBE (Client side) as per RFC 3265. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -337,14 +337,10 @@ int tsip_dialog_subscribe_init(tsip_dialog_subscribe_t *self) int tsip_dialog_subscribe_Started_2_Trying_X_subscribe(va_list *app) { tsip_dialog_subscribe_t *self; - const tsip_action_t* action; self = va_arg(*app, tsip_dialog_subscribe_t *); - va_arg(*app, const tsip_message_t *); - action = va_arg(*app, const tsip_action_t *); TSIP_DIALOG(self)->running = tsk_true; - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); /* alert the user */ TSIP_DIALOG_SIGNAL(self, tsip_event_code_dialog_connecting, "Dialog connecting"); @@ -518,14 +514,8 @@ int tsip_dialog_subscribe_Trying_2_Trying_X_NOTIFY(va_list *app) int tsip_dialog_subscribe_Connected_2_Trying_X_subscribe(va_list *app) { tsip_dialog_subscribe_t *self; - const tsip_action_t* action; self = va_arg(*app, tsip_dialog_subscribe_t *); - va_arg(*app, const tsip_message_t *); - action = va_arg(*app, const tsip_action_t *); - - /* Set current action */ - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); return send_SUBSCRIBE(self); } @@ -563,14 +553,8 @@ int tsip_dialog_subscribe_Connected_2_Terminated_X_NOTIFY(va_list *app) int tsip_dialog_subscribe_Any_2_Trying_X_hangup(va_list *app) { tsip_dialog_subscribe_t *self; - const tsip_action_t* action; self = va_arg(*app, tsip_dialog_subscribe_t *); - /*const tsip_response_t *response =*/ va_arg(*app, const tsip_response_t *); - action = va_arg(*app, const tsip_action_t *); - - /* Set current action */ - tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); /* Alert the user */ TSIP_DIALOG_SIGNAL(self, tsip_event_code_dialog_terminating, "Terminating dialog"); diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header.c index e00ae9e4..04ce4ef5 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header.c * @brief Defines a SIP header (field-name: field-value). * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Allow.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Allow.c index 58495de2..e9d1b338 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Allow.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Allow.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Allow.c * @brief SIP Allow header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Allow_Events.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Allow_Events.c index 407fc9dc..f503206c 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Allow_Events.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Allow_Events.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Allow_events.c * @brief SIP Allow-Events/u header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Authorization.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Authorization.c index 336d86c6..029f93a2 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Authorization.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Authorization.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Authorization.c * @brief SIP Proxy-Authenticate header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_CSeq.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_CSeq.c index 750b117b..e9ac0219 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_CSeq.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_CSeq.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_CSeq.c * @brief SIP CSeq header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Call_ID.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Call_ID.c index f80859a6..ffae41dd 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Call_ID.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Call_ID.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Call_ID.c * @brief SIP Call-ID/i header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Contact.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Contact.c index 40fc23e8..8b79919b 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Contact.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Contact.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Contact.c * @brief SIP Contact/m header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Content_Length.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Content_Length.c index 56751af0..0c699889 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Content_Length.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Content_Length.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Content_Length.c * @brief SIP Content-Length/l header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Content_Type.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Content_Type.c index b38d2fb0..5caacbb4 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Content_Type.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Content_Type.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Content_Type.c * @brief SIP Content-Type/c header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Date.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Date.c index 6c65cf6a..e623660d 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Date.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Date.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Date.c * @brief SIP DUmmy header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Dummy.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Dummy.c index a3b08320..9c1ddb71 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Dummy.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Dummy.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Dummy.c * @brief SIP DUmmy header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Event.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Event.c index 924d2c79..55c602d2 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Event.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Event.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Event.c * @brief SIP Event/o header as per RFC 3265.. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Expires.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Expires.c index ea13afdb..6c6bff6b 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Expires.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Expires.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Expires.c * @brief SIP Expires header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_From.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_From.c index d2b925b5..51f35cc3 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_From.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_From.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_From.c * @brief SIP From/f header as per RFC 3261 subclause 20.20. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Max_Forwards.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Max_Forwards.c index 1f4df38b..1cde7c07 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Max_Forwards.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Max_Forwards.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Max_Forwards.c * @brief SIP Max-Forwards header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Min_Expires.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Min_Expires.c index abb94b5a..e726ee95 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Min_Expires.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Min_Expires.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Min_Expires.c * @brief SIP Min-Expiress header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Min_SE.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Min_SE.c index 5fab7867..2a34c60d 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Min_SE.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Min_SE.c @@ -4,7 +4,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsip_header_Min_SE.c * @brief SIP Min-SE header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Access_Network_Info.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Access_Network_Info.c index e9eb79fa..befa52ef 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Access_Network_Info.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Access_Network_Info.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -33,7 +33,7 @@ ___________________________________________________________ P-Access-Network-Info o o o o o o o * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Asserted_Identity.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Asserted_Identity.c index c27fcbf8..55adc4ea 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Asserted_Identity.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Asserted_Identity.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_P_Asserted_Identity.c * @brief SIP P-Asserted-Identity header as per RFC 3325. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Associated_URI.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Associated_URI.c index 1ef6b566..f955c8f2 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Associated_URI.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Associated_URI.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_P_Associated_URI.c * @brief SIP P-Associated-URI header as per RFC 3455. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Charging_Function_Addresses.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Charging_Function_Addresses.c index 974fba18..a35d44a7 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Charging_Function_Addresses.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Charging_Function_Addresses.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_P_Charging_Function_Addresses.c * @brief SIP P-Charging-Function-Addresses header as per RFC 3455. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Preferred_Identity.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Preferred_Identity.c index 87709862..76dcc0b1 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Preferred_Identity.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Preferred_Identity.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -33,7 +33,7 @@ * --- --- --- --- --- --- * o o o - - - * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Path.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Path.c index 66e20554..bd197436 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Path.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Path.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Path.c * @brief SIP Service-Path header as per RFC 3608. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Privacy.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Privacy.c index 427c66e3..08b0ed82 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Privacy.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Privacy.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -33,7 +33,7 @@ * ___________________________________________________________ * Privacy o o o o o o * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Proxy_Authenticate.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Proxy_Authenticate.c index c716bb5b..e7337e6c 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Proxy_Authenticate.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Proxy_Authenticate.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Proxy_Authenticate.c * @brief SIP Proxy-Authenticate header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Proxy_Authorization.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Proxy_Authorization.c index 9c9a0027..2ee970a8 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Proxy_Authorization.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Proxy_Authorization.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Proxy_Authorization.c * @brief SIP Proxy-Authenticate header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Proxy_Require.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Proxy_Require.c index 72fec480..b31daaa2 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Proxy_Require.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Proxy_Require.c @@ -4,7 +4,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsip_header_Proxy_Require.c * @brief SIP Proxy-Require header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_RAck.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_RAck.c index 9131e326..01105e0f 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_RAck.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_RAck.c @@ -5,7 +5,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -27,7 +27,7 @@ /**@file tsip_header_RAck.c * @brief SIP RAck header as per RFC 3262. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_RSeq.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_RSeq.c index 5655f724..ae053b7b 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_RSeq.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_RSeq.c @@ -4,7 +4,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsip_header_RSeq.c * @brief SIP RSeq header as per RFC 3262. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Record_Route.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Record_Route.c index d77e8375..128d0a38 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Record_Route.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Record_Route.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Record_Route.c * @brief SIP Record-Route header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Refer_Sub.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Refer_Sub.c index 03bc6e58..9884c34c 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Refer_Sub.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Refer_Sub.c @@ -4,7 +4,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsip_header_Refer_Sub.c * @brief SIP header 'Refer-Sub' as per 4488. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Refer_To.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Refer_To.c index 353ae8c5..a38a5976 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Refer_To.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Refer_To.c @@ -4,7 +4,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsip_header_Refer_To.c * @brief SIP Refer-To header as per RFC 3515. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Referred_By.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Referred_By.c index 3c8925dc..1a3d8067 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Referred_By.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Referred_By.c @@ -4,7 +4,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsip_header_Referred_By.c * @brief SIP Referred-By header as per RFC 3892. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Require.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Require.c index 66e31064..1422e833 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Require.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Require.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Require.c * @brief SIP Require header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Route.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Route.c index 358657fe..ff9d0145 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Route.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Route.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Route.c * @brief SIP Route header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_SIP_ETag.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_SIP_ETag.c index ec117910..67402d8c 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_SIP_ETag.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_SIP_ETag.c @@ -4,7 +4,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsip_header_SIP_ETag.c * @brief SIP SIP-ETag header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_SIP_If_Match.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_SIP_If_Match.c index b1fa6205..ee34c193 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_SIP_If_Match.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_SIP_If_Match.c @@ -4,7 +4,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsip_header_SIP_If_Match.c * @brief SIP SIP-If-Match header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Client.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Client.c index c6023b0a..54b063e6 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Client.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Client.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Security_Client.c * @brief SIP Security-Client header as per RFC 3329. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Server.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Server.c index 170efb93..d5b30097 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Server.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Server.c @@ -4,7 +4,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -26,7 +26,7 @@ /**@file tsip_header_Security_Server.c * @brief SIP Security-Server header as per RFC 3329. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Verify.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Verify.c index ccec770a..c0b31931 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Verify.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Verify.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Security_Verify.c * @brief SIP Security-Verify header as per RFC 3329. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Server.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Server.c index b8356903..35b4eb67 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Server.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Server.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Server.c * @brief SIP Server header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Service_Route.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Service_Route.c index bbadc78f..9b7c9e55 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Service_Route.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Service_Route.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Service_Route.c * @brief SIP Service-Route header as per RFC 3608. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Session_Expires.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Session_Expires.c index 507b7887..e44c1331 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Session_Expires.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Session_Expires.c @@ -5,7 +5,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -27,7 +27,7 @@ /**@file tsip_header_Session_Expires.c * @brief SIP Min-SE header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Subscription_State.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Subscription_State.c index 1f7bf15d..23b4fd84 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Subscription_State.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Subscription_State.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Subscription_State.c * @brief SIP Subscription_State header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Supported.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Supported.c index 3cba9362..4b6f096f 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Supported.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Supported.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Supported.c * @brief SIP Supported/k header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_To.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_To.c index 43f55d4e..d46895ed 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_To.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_To.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_To.c * @brief SIP To/t header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_User_Agent.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_User_Agent.c index 319ca4fb..69c50a04 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_User_Agent.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_User_Agent.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_User_Agent.c * @brief SIP User-Agent/t header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Via.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Via.c index 06f3434e..4bcd12ce 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Via.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Via.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Via.c * @brief SIP Via/v header as per RFC 3261 subclause 20.42. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_WWW_Authenticate.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_WWW_Authenticate.c index ed2235e0..6919919b 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_WWW_Authenticate.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_WWW_Authenticate.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_WWW_Authenticate.c * @brief SIP WWW-Authenticate header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Warning.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Warning.c index ba9ee7ce..ea2ed99c 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Warning.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Warning.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_header_Warning.c * @brief SIP Warning header. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_accept.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_accept.c index dbe89304..6ddfcdfe 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_accept.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_accept.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_header_accept.c * @brief SIP header 'Accept'. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/parsers/tsip_parser_header.c b/branches/2.0/doubango/tinySIP/src/parsers/tsip_parser_header.c index c9f1da58..3468599c 100644 --- a/branches/2.0/doubango/tinySIP/src/parsers/tsip_parser_header.c +++ b/branches/2.0/doubango/tinySIP/src/parsers/tsip_parser_header.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_parser_header.c * @brief SIP headers parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -5569,7 +5569,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Accept NOT IMPLEMENTED. Will be added as Dummy header."); + // //TSK_DEBUG_WARN("parse_header_Accept NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 1: @@ -5577,7 +5577,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Accept_Contact NOT IMPLEMENTED. Will be added as Dummy header."); + // //TSK_DEBUG_WARN("parse_header_Accept_Contact NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 2: @@ -5585,7 +5585,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Accept_Encoding NOT IMPLEMENTED. Will be added as Dummy header."); + // //TSK_DEBUG_WARN("parse_header_Accept_Encoding NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 3: @@ -5593,7 +5593,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Accept_Language NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Accept_Language NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 4: @@ -5601,7 +5601,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Accept_Resource_Priority NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Accept_Resource_Priority NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 5: @@ -5609,7 +5609,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Alert_Info NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Alert_Info NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 6: @@ -5631,7 +5631,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Authentication_Info NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Authentication_Info NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 9: @@ -5659,7 +5659,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Call_Info NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Call_Info NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 12: @@ -5689,7 +5689,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Content_Disposition NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Content_Disposition NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 14: @@ -5697,7 +5697,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("PARSE_HEADER_ACCEPT NOT IMPLEMENTED. Will be added as Dummy header."); + // TSK_DEBUG_WARN("PARSE_HEADER_ACCEPT NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 15: @@ -5705,7 +5705,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Content_Language NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Content_Language NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 16: @@ -5759,7 +5759,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Error_Info NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Error_Info NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 21: @@ -5800,7 +5800,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_History_Info NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_History_Info NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 25: @@ -5808,7 +5808,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Identity NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Identity NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 26: @@ -5816,7 +5816,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Identity_Info NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Identity_Info NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 27: @@ -5824,7 +5824,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_In_Reply_To NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_In_Reply_To NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 28: @@ -5832,7 +5832,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Join NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Join NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 29: @@ -5847,7 +5847,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_MIME_Version NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_MIME_Version NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 31: @@ -5869,7 +5869,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Organization NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Organization NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 34: @@ -5884,7 +5884,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_Answer_State NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_P_Answer_State NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 36: @@ -5906,7 +5906,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_Called_Party_ID NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_P_Called_Party_ID NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 39: @@ -5921,7 +5921,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_Charging_Vector NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_P_Charging_Vector NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 41: @@ -5929,7 +5929,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_DCS_Billing_Info NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_P_DCS_Billing_Info NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 42: @@ -5937,7 +5937,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_DCS_LAES NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_P_DCS_LAES NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 43: @@ -5945,7 +5945,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_DCS_OSPS NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_P_DCS_OSPS NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 44: @@ -5953,7 +5953,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_DCS_Redirect NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_P_DCS_Redirect NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 45: @@ -5961,7 +5961,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_DCS_Trace_Party_ID NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_P_DCS_Trace_Party_ID NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 46: @@ -5969,7 +5969,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_Early_Media NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_P_Early_Media NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 47: @@ -5977,7 +5977,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_Media_Authorization NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_P_Media_Authorization NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 48: @@ -5992,7 +5992,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_Profile_Key NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_P_Profile_Key NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 50: @@ -6000,7 +6000,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_User_Database NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_P_User_Database NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 51: @@ -6008,7 +6008,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_P_Visited_Network_ID NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_P_Visited_Network_ID NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 52: @@ -6023,7 +6023,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Priority NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Priority NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 54: @@ -6066,7 +6066,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Reason NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Reason NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 60: @@ -6102,7 +6102,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Reject_Contact NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Reject_Contact NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 65: @@ -6110,7 +6110,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Replaces NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Replaces NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 66: @@ -6118,7 +6118,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Reply_To NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Reply_To NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 67: @@ -6126,7 +6126,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Request_Disposition NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Request_Disposition NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 68: @@ -6141,7 +6141,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Resource_Priority NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Resource_Priority NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 70: @@ -6149,7 +6149,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Retry_After NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Retry_After NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 71: @@ -6227,7 +6227,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Subject NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Subject NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 82: @@ -6249,7 +6249,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Target_Dialog NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Target_Dialog NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 85: @@ -6257,7 +6257,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Timestamp NOT IMPLEMENTED. Will be added as Dummy header."); + ////TSK_DEBUG_WARN("parse_header_Timestamp NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 86: @@ -6278,7 +6278,7 @@ _match: { tsip_header_Dummy_t *header = tsip_header_Dummy_parse(state->tag_start, (state->tag_end-state->tag_start)); ADD_HEADER(header); - TSK_DEBUG_WARN("parse_header_Unsupported NOT IMPLEMENTED. Will be added as Dummy header."); + //TSK_DEBUG_WARN("parse_header_Unsupported NOT IMPLEMENTED. Will be added as Dummy header."); } break; case 88: diff --git a/branches/2.0/doubango/tinySIP/src/parsers/tsip_parser_message.c b/branches/2.0/doubango/tinySIP/src/parsers/tsip_parser_message.c index 0be2fb2e..e74b8bef 100644 --- a/branches/2.0/doubango/tinySIP/src/parsers/tsip_parser_message.c +++ b/branches/2.0/doubango/tinySIP/src/parsers/tsip_parser_message.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_parser_message.c * @brief SIP parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/parsers/tsip_parser_uri.c b/branches/2.0/doubango/tinySIP/src/parsers/tsip_parser_uri.c index dc85d184..f1879a15 100644 --- a/branches/2.0/doubango/tinySIP/src/parsers/tsip_parser_uri.c +++ b/branches/2.0/doubango/tinySIP/src/parsers/tsip_parser_uri.c @@ -3,7 +3,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -25,7 +25,7 @@ /**@file tsip_parser_uri.c * @brief SIP/SIPS/TEL URI parser. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/sigcomp/tsip_sigcomp.c b/branches/2.0/doubango/tinySIP/src/sigcomp/tsip_sigcomp.c index deffbd63..22674a1f 100644 --- a/branches/2.0/doubango/tinySIP/src/sigcomp/tsip_sigcomp.c +++ b/branches/2.0/doubango/tinySIP/src/sigcomp/tsip_sigcomp.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_sigcomp.c * @brief SigComp helper API. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac.c b/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac.c index 4ea34db3..a808f68f 100644 --- a/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac.c +++ b/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_transac.c * @brief SIP transaction base class as per RFC 3261 subclause 17. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_ict.c b/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_ict.c index 641cab27..b0ba780c 100644 --- a/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_ict.c +++ b/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_ict.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -73,7 +73,7 @@ /**@file tsip_transac_ict.c * @brief SIP INVITE Client Transaction as per RFC 3261 subclause 17.1.1. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_ist.c b/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_ist.c index 36b4e60a..42092534 100644 --- a/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_ist.c +++ b/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_ist.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -75,7 +75,7 @@ /**@file tsip_transac_ist.c * @brief SIP INVITE Server Transaction as per RFC 3261 subclause 17.2.1. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -98,23 +98,23 @@ int tsip_transac_ist_init(tsip_transac_ist_t *self); int tsip_transac_ist_OnTerminated(tsip_transac_ist_t *self); /* ======================== transitions ======================== */ -int tsip_transac_ist_Started_2_Proceeding_X_INVITE(va_list *app); -int tsip_transac_ist_Proceeding_2_Proceeding_X_INVITE(va_list *app); -int tsip_transac_ist_Proceeding_2_Proceeding_X_1xx(va_list *app); -int tsip_transac_ist_Proceeding_2_Completed_X_300_to_699(va_list *app); -int tsip_transac_ist_Proceeding_2_Accepted_X_2xx(va_list *app); -int tsip_transac_ist_Completed_2_Completed_INVITE(va_list *app); -int tsip_transac_ist_Completed_2_Completed_timerG(va_list *app); -int tsip_transac_ist_Completed_2_Terminated_timerH(va_list *app); -int tsip_transac_ist_Completed_2_Confirmed_ACK(va_list *app); -int tsip_transac_ist_Accepted_2_Accepted_INVITE(va_list *app); -int tsip_transac_ist_Accepted_2_Accepted_2xx(va_list *app); -int tsip_transac_ist_Accepted_2_Accepted_iACK(va_list *app); /* doubango-specific */ -int tsip_transac_ist_Accepted_2_Terminated_timerL(va_list *app); -int tsip_transac_ist_Confirmed_2_Terminated_timerI(va_list *app); -int tsip_transac_ist_Any_2_Terminated_X_transportError(va_list *app); -int tsip_transac_ist_Any_2_Terminated_X_Error(va_list *app); -int tsip_transac_ist_Any_2_Terminated_X_cancel(va_list *app); /* doubango-specific */ +static int tsip_transac_ist_Started_2_Proceeding_X_INVITE(va_list *app); +static int tsip_transac_ist_Proceeding_2_Proceeding_X_INVITE(va_list *app); +static int tsip_transac_ist_Proceeding_2_Proceeding_X_1xx(va_list *app); +static int tsip_transac_ist_Proceeding_2_Completed_X_300_to_699(va_list *app); +static int tsip_transac_ist_Proceeding_2_Accepted_X_2xx(va_list *app); +static int tsip_transac_ist_Completed_2_Completed_INVITE(va_list *app); +static int tsip_transac_ist_Completed_2_Completed_timerG(va_list *app); +static int tsip_transac_ist_Completed_2_Terminated_timerH(va_list *app); +static int tsip_transac_ist_Completed_2_Confirmed_ACK(va_list *app); +static int tsip_transac_ist_Accepted_2_Accepted_INVITE(va_list *app); +static int tsip_transac_ist_Accepted_2_Accepted_2xx(va_list *app); +static int tsip_transac_ist_Accepted_2_Accepted_iACK(va_list *app); /* doubango-specific */ +static int tsip_transac_ist_Accepted_2_Terminated_timerL(va_list *app); +static int tsip_transac_ist_Confirmed_2_Terminated_timerI(va_list *app); +static int tsip_transac_ist_Any_2_Terminated_X_transportError(va_list *app); +static int tsip_transac_ist_Any_2_Terminated_X_Error(va_list *app); +static int tsip_transac_ist_Any_2_Terminated_X_cancel(va_list *app); /* doubango-specific */ /* ======================== conds ======================== */ static tsk_bool_t _fsm_cond_is_resp2INVITE(tsip_transac_ist_t* self, tsip_message_t* message) @@ -665,7 +665,7 @@ int tsip_transac_ist_Any_2_Terminated_X_transportError(va_list *app) /* Timers will be canceled by "tsip_transac_nict_OnTerminated" */ - return TSIP_TRANSAC(self)->dialog->callback(TSIP_TRANSAC(self)->dialog, tsip_dialog_i_msg, tsk_null); + return TSIP_TRANSAC(self)->dialog->callback(TSIP_TRANSAC(self)->dialog, tsip_dialog_transport_error, tsk_null); } /* Any -> (Error) -> Terminated @@ -738,8 +738,6 @@ static tsk_object_t* tsip_transac_ist_ctor(tsk_object_t * self, va_list * app) /* Initialize ICT object */ tsip_transac_ist_init(transac); - - TSK_DEBUG_INFO("*** IST destroyed ***"); } return self; } diff --git a/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_layer.c b/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_layer.c index bc0b263d..8bd0c05b 100644 --- a/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_layer.c +++ b/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_layer.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_transac_layer.c * @brief SIP transaction layer. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_nict.c b/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_nict.c index ce068cfb..33695a9e 100644 --- a/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_nict.c +++ b/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_nict.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -67,7 +67,7 @@ /**@file tsip_transac_nict.c * @brief SIP Non-INVITE Client Transaction as per RFC 3261 subcaluse 17.1.2. * - * @author Mamadou Diop + * @author Mamadou Diop * */ #include "tinysip/transactions/tsip_transac_nict.h" diff --git a/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_nist.c b/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_nist.c index 56cafc2c..ce0c74d1 100644 --- a/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_nist.c +++ b/branches/2.0/doubango/tinySIP/src/transactions/tsip_transac_nist.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -67,7 +67,7 @@ /**@file tsip_transac_nist.c * @brief SIP Non-INVITE Server Transaction as per RFC 3261 subclause 17.2.2. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/transports/tsip_transport.c b/branches/2.0/doubango/tinySIP/src/transports/tsip_transport.c index c25b99bb..39a09166 100644 --- a/branches/2.0/doubango/tinySIP/src/transports/tsip_transport.c +++ b/branches/2.0/doubango/tinySIP/src/transports/tsip_transport.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_transport.c * @brief SIP transport. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/transports/tsip_transport_ipsec.c b/branches/2.0/doubango/tinySIP/src/transports/tsip_transport_ipsec.c index 9d9adcd9..c51e5aa8 100644 --- a/branches/2.0/doubango/tinySIP/src/transports/tsip_transport_ipsec.c +++ b/branches/2.0/doubango/tinySIP/src/transports/tsip_transport_ipsec.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_transport_ipsec.c * @brief SIP/IPSec transport. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/transports/tsip_transport_layer.c b/branches/2.0/doubango/tinySIP/src/transports/tsip_transport_layer.c index e462e6b8..7b83e2c2 100644 --- a/branches/2.0/doubango/tinySIP/src/transports/tsip_transport_layer.c +++ b/branches/2.0/doubango/tinySIP/src/transports/tsip_transport_layer.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_transport_layer.c * @brief SIP transport layer. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/tsip.c b/branches/2.0/doubango/tinySIP/src/tsip.c index 3d105516..a34e6f2f 100644 --- a/branches/2.0/doubango/tinySIP/src/tsip.c +++ b/branches/2.0/doubango/tinySIP/src/tsip.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip.c * @brief SIP (RFC 3261) and 3GPP IMS/LTE (TS 24.229) implementation. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -633,7 +633,7 @@ int tsip_stack_start(tsip_stack_handle_t *self) /* === Runnable === */ TSK_RUNNABLE(stack)->run = run; if((ret = tsk_runnable_start(TSK_RUNNABLE(stack), tsip_event_def_t))){ - stack_error_desc = "Failed to start timer manager"; + stack_error_desc = "Failed to start runnable"; TSK_DEBUG_ERROR("%s", stack_error_desc); goto bail; } diff --git a/branches/2.0/doubango/tinySIP/src/tsip_action.c b/branches/2.0/doubango/tinySIP/src/tsip_action.c index deed72ff..487ef2e7 100644 --- a/branches/2.0/doubango/tinySIP/src/tsip_action.c +++ b/branches/2.0/doubango/tinySIP/src/tsip_action.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_action.h * @brief SIP action. * -* @author Mamadou Diop +* @author Mamadou Diop * * @date Created: Sat Nov 8 16:54:58 2009 mdiop */ diff --git a/branches/2.0/doubango/tinySIP/src/tsip_event.c b/branches/2.0/doubango/tinySIP/src/tsip_event.c index 5511a5cf..83cc165e 100644 --- a/branches/2.0/doubango/tinySIP/src/tsip_event.c +++ b/branches/2.0/doubango/tinySIP/src/tsip_event.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_event.c * @brief SIP event. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -75,7 +75,7 @@ int tsip_event_signal_2(tsip_event_type_t type, tsip_ssession_t* ss, short code, { tsip_event_t* e; if((e = tsip_event_create(ss, code, phrase, sipmessage, type))){ - TSK_RUNNABLE_ENQUEUE_OBJECT(TSK_RUNNABLE(ss->stack), e); + TSK_RUNNABLE_ENQUEUE_OBJECT_SAFE(TSK_RUNNABLE(ss->stack), e); return 0; } return -1; diff --git a/branches/2.0/doubango/tinySIP/src/tsip_message.c b/branches/2.0/doubango/tinySIP/src/tsip_message.c index a7893d39..4c5f756b 100644 --- a/branches/2.0/doubango/tinySIP/src/tsip_message.c +++ b/branches/2.0/doubango/tinySIP/src/tsip_message.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -24,7 +24,7 @@ * @brief Represents a SIP message. A SIP message is either a request from a client to a server, or a * response from a server to a client. See RFC 3261 suc-bclause 7. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/tsip_ssession.c b/branches/2.0/doubango/tinySIP/src/tsip_ssession.c index af555dfb..37736a0c 100644 --- a/branches/2.0/doubango/tinySIP/src/tsip_ssession.c +++ b/branches/2.0/doubango/tinySIP/src/tsip_ssession.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_ssession.c * @brief SIP session. * - * @author Mamadou Diop + * @author Mamadou Diop * */ @@ -247,12 +247,26 @@ int __tsip_ssession_set(tsip_ssession_t *self, va_list *app) //========= while((mscurr = va_arg(*app, tsip_msession_param_type_t)) != mstype_null){ switch(mscurr){ + case mstype_set_profile: + // (tmedia_profile_t)PROFILE_ENUM + self->media.profile = va_arg(*app, tmedia_profile_t); + break; + case mstype_set_srtp_mode: + // (tmedia_srtp_mode_t)SRTP_MODE_ENUM + self->media.srtp_mode = va_arg(*app, tmedia_srtp_mode_t); + break; case mstype_set_100rel: self->media.enable_100rel = tsk_true; break; case mstype_unset_100rel: self->media.enable_100rel = tsk_false; break; + case mstype_set_ice: + self->media.enable_ice = tsk_true; + break; + case mstype_unset_ice: + self->media.enable_ice = tsk_false; + break; case mstype_set_qos: { /* (tmedia_qos_stype_t)TYPE_ENUM, (tmedia_qos_strength_t)STRENGTH_ENUM */ self->media.qos.type = va_arg(*app, tmedia_qos_stype_t); @@ -559,7 +573,10 @@ static tsk_object_t* tsip_ssession_ctor(tsk_object_t * self, va_list * app) // default parentid: not parent -> no pending transfer ss->id_parent = TSIP_SSESSION_INVALID_ID; // default media values + ss->media.profile = tmedia_defaults_get_profile(); + ss->media.srtp_mode = tmedia_defaults_get_srtp_mode(); ss->media.enable_100rel = tmedia_defaults_get_100rel_enabled(); + ss->media.enable_ice = tmedia_defaults_get_ice_enabled(); ss->media.type = tmedia_none; ss->media.qos.type = tmedia_qos_stype_none; ss->media.qos.strength = tmedia_qos_strength_none; diff --git a/branches/2.0/doubango/tinySIP/src/tsip_timers.c b/branches/2.0/doubango/tinySIP/src/tsip_timers.c index 7e251577..942b8957 100644 --- a/branches/2.0/doubango/tinySIP/src/tsip_timers.c +++ b/branches/2.0/doubango/tinySIP/src/tsip_timers.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_timers.c * @brief SIP timers. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/src/tsip_uri.c b/branches/2.0/doubango/tinySIP/src/tsip_uri.c index c817d5cc..90d98597 100644 --- a/branches/2.0/doubango/tinySIP/src/tsip_uri.c +++ b/branches/2.0/doubango/tinySIP/src/tsip_uri.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2010-2011 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * @@ -23,7 +23,7 @@ /**@file tsip_uri.c * @brief SIP/SIPS/TEL URI. * - * @author Mamadou Diop + * @author Mamadou Diop * */ diff --git a/branches/2.0/doubango/tinySIP/test/stdafx.c b/branches/2.0/doubango/tinySIP/test/stdafx.c index 59df1b5e..614f55cf 100644 --- a/branches/2.0/doubango/tinySIP/test/stdafx.c +++ b/branches/2.0/doubango/tinySIP/test/stdafx.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIP/test/stdafx.h b/branches/2.0/doubango/tinySIP/test/stdafx.h index d3508bf8..3f398341 100644 --- a/branches/2.0/doubango/tinySIP/test/stdafx.h +++ b/branches/2.0/doubango/tinySIP/test/stdafx.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIP/test/test.c b/branches/2.0/doubango/tinySIP/test/test.c index 5cd54a23..a746c7ca 100644 --- a/branches/2.0/doubango/tinySIP/test/test.c +++ b/branches/2.0/doubango/tinySIP/test/test.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIP/test/test_imsaka.h b/branches/2.0/doubango/tinySIP/test/test_imsaka.h index 868fd2c1..c1a2cd80 100644 --- a/branches/2.0/doubango/tinySIP/test/test_imsaka.h +++ b/branches/2.0/doubango/tinySIP/test/test_imsaka.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIP/test/test_sipmessages.h b/branches/2.0/doubango/tinySIP/test/test_sipmessages.h index acbd8239..9dcad9da 100644 --- a/branches/2.0/doubango/tinySIP/test/test_sipmessages.h +++ b/branches/2.0/doubango/tinySIP/test/test_sipmessages.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIP/test/test_stack.h b/branches/2.0/doubango/tinySIP/test/test_stack.h index 14556ef2..7cfc04c3 100644 --- a/branches/2.0/doubango/tinySIP/test/test_stack.h +++ b/branches/2.0/doubango/tinySIP/test/test_stack.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIP/test/test_transac.h b/branches/2.0/doubango/tinySIP/test/test_transac.h index 59f8941a..e3bd7978 100644 --- a/branches/2.0/doubango/tinySIP/test/test_transac.h +++ b/branches/2.0/doubango/tinySIP/test/test_transac.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIP/test/test_uri.h b/branches/2.0/doubango/tinySIP/test/test_uri.h index 61f726c9..c4a709f2 100644 --- a/branches/2.0/doubango/tinySIP/test/test_uri.h +++ b/branches/2.0/doubango/tinySIP/test/test_uri.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2009 Mamadou Diop. * -* Contact: Mamadou Diop +* Contact: Mamadou Diop * * This file is part of Open Source Doubango Framework. * diff --git a/branches/2.0/doubango/tinySIP/tinySIP.sln b/branches/2.0/doubango/tinySIP/tinySIP.sln index 759daea3..40925124 100644 --- a/branches/2.0/doubango/tinySIP/tinySIP.sln +++ b/branches/2.0/doubango/tinySIP/tinySIP.sln @@ -2,22 +2,61 @@ Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySIP", "tinySIP.vcproj", "{4CE20732-9978-4A88-B586-CFEFCB63E82D}" + ProjectSection(ProjectDependencies) = postProject + {B3E45009-C7C3-4090-837C-2D30C9058443} = {B3E45009-C7C3-4090-837C-2D30C9058443} + {52814B0D-7DCA-45B8-9A16-8B147040D619} = {52814B0D-7DCA-45B8-9A16-8B147040D619} + {E45DB518-6562-4033-80E8-60030F0B169F} = {E45DB518-6562-4033-80E8-60030F0B169F} + {7522A458-92F4-4259-B906-E84C2A65D9F1} = {7522A458-92F4-4259-B906-E84C2A65D9F1} + {002FF064-588F-402E-A096-C8D033F49F40} = {002FF064-588F-402E-A096-C8D033F49F40} + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + {76261DC8-25B3-43F4-9FB5-112C4AC0880E} = {76261DC8-25B3-43F4-9FB5-112C4AC0880E} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySAK", "..\tinySAK\tinySAK.vcproj", "{6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyNET", "..\tinyNET\tinyNET.vcproj", "{7522A458-92F4-4259-B906-E84C2A65D9F1}" + ProjectSection(ProjectDependencies) = postProject + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyHTTP", "..\tinyHTTP\tinyHTTP.vcproj", "{B3E45009-C7C3-4090-837C-2D30C9058443}" + ProjectSection(ProjectDependencies) = postProject + {7522A458-92F4-4259-B906-E84C2A65D9F1} = {7522A458-92F4-4259-B906-E84C2A65D9F1} + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyIPSec", "..\tinyIPSec\tinyIPSec.vcproj", "{002FF064-588F-402E-A096-C8D033F49F40}" + ProjectSection(ProjectDependencies) = postProject + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySDP", "..\tinySDP\tinySDP.vcproj", "{E45DB518-6562-4033-80E8-60030F0B169F}" + ProjectSection(ProjectDependencies) = postProject + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyMEDIA", "..\tinyMEDIA\tinyMEDIA.vcproj", "{52814B0D-7DCA-45B8-9A16-8B147040D619}" + ProjectSection(ProjectDependencies) = postProject + {E45DB518-6562-4033-80E8-60030F0B169F} = {E45DB518-6562-4033-80E8-60030F0B169F} + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test\test.vcproj", "{353640F9-25C2-4850-BCF8-07A07D8E46AE}" + ProjectSection(ProjectDependencies) = postProject + {B3E45009-C7C3-4090-837C-2D30C9058443} = {B3E45009-C7C3-4090-837C-2D30C9058443} + {52814B0D-7DCA-45B8-9A16-8B147040D619} = {52814B0D-7DCA-45B8-9A16-8B147040D619} + {E45DB518-6562-4033-80E8-60030F0B169F} = {E45DB518-6562-4033-80E8-60030F0B169F} + {4CE20732-9978-4A88-B586-CFEFCB63E82D} = {4CE20732-9978-4A88-B586-CFEFCB63E82D} + {7522A458-92F4-4259-B906-E84C2A65D9F1} = {7522A458-92F4-4259-B906-E84C2A65D9F1} + {002FF064-588F-402E-A096-C8D033F49F40} = {002FF064-588F-402E-A096-C8D033F49F40} + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + {76261DC8-25B3-43F4-9FB5-112C4AC0880E} = {76261DC8-25B3-43F4-9FB5-112C4AC0880E} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySIGCOMP", "..\tinySIGCOMP\tinySIGCOMP.vcproj", "{76261DC8-25B3-43F4-9FB5-112C4AC0880E}" + ProjectSection(ProjectDependencies) = postProject + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/branches/2.0/doubango/tinySIP/tinySIP.vcproj b/branches/2.0/doubango/tinySIP/tinySIP.vcproj index 2ad0fe19..52de4f90 100644 --- a/branches/2.0/doubango/tinySIP/tinySIP.vcproj +++ b/branches/2.0/doubango/tinySIP/tinySIP.vcproj @@ -636,6 +636,10 @@ RelativePath=".\src\dialogs\tsip_dialog_invite.hold.c" > + + diff --git a/branches/2.0/doubango/website/Doubango_Layers.png b/branches/2.0/doubango/website/Doubango_Layers.png new file mode 100644 index 0000000000000000000000000000000000000000..7d972d196fbdfc3553da283106e73588e9aa85fa GIT binary patch literal 83207 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 literal 0 HcmV?d00001

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 Y#)+wEqGb^)Bh%!6niDrqwXbFb0CHe7*8l(j delta 164 zcmbQx#5e(nWY`SNOij#8CMz&XOtgA{;C(?b#U~pwwZpjknAA8U_{{u5)fpJN z-ps*#kXOL`@At<&%eod$+riPa4l8lU-|7qs2BD9K4?$8%t25R3tTmKm+ WrlyIOMXZdBlmBT>+&tC3nh^j!EjVTX diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/G722.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/G722.lib index a23ef2c25693e6ebf9451694dfac765dca391e74..6bf1861bb241fc5907d6b3a2d5e3588c4ec44e46 100644 GIT binary patch delta 215 zcmcb%oax$frU^1^mWGCgCZ?13F^g@q*u{v%-OR_d3W5M!w_blPt%0 z1l%3piRF6Cd{(2$a!UT|9kb2z1+OSEGEZJFB)+-ZB$*Xv-U1eh$vjqk%$h)rvR2qM ues=3un!HX(Vsf|1yv-I_PAo9{8uB3at<1Z{i)r8Fnhyd{`)2oAvjG4u2}_9p delta 217 zcmcb%oax$frU^1^hGwQFW@eN3F^g@q*u{v%-OR_d3W|-p zf4@KOS=P01+76D+-U$sMlA s0%@GwZ8C4OMV1o_M6>DShCDUqNT7`?^KS8C+Bmu9g82wGq7G>CYiqjm-DZWGQJn7pKO!W4xba{ ztt$z1`?kAWb4%_@YfAV2x+NE%Pyge3ky3i1G0gh^ec zAO+BqsmV}MgFU+g$E&uACM>DC3T1Uct%19u_F7zGBrX8Y32N_v6j-ron!`jWc;zJ_ z+?Xd?YpOiT2SC1h%a;-u+}7+$uy)c$sxq*w9^I2>={?Z9=X93Vh~C|lwtf`Gmeg6N zU5s?a=@WKNbE6^Iukj;O8-;pTWYIwTd2a%A2ZBAvL;dQE-Ez^?4ECvtDT7f!Z+~ej z074sSNuEQuqK2C-YjY57s9i$@#I?;r6CA2#QzQ=)X$$=Rb zh3J_a=uS5f>AF(5CZs)CKS`9yU-LCgO&)45gV*eq|0cmD8fIi-Xy#Ig>@ZoEgSJ(} z?@T@X4AWhp_`>3gK@A1{uTLBaz7=-HSb8SCJ76ov;Q5FdOy)d*Wwh^Ah-@&G23z2g5GN*mjS8L7I*}X& zfQ32{+N#3OtV2px9ORkMau8ndz*HvKy$f))IrV-$tR4mo#{l3AD|G29?6D_A3a|YM zX>7(a>AV5=aL8;n$k5%r@R$>hVdZ-I;rI|2T|t?o2hALLgK)O}|0+c_rK+M~8Uvpm zB{)Lhnots1WfNSC&xabHRED=1dlo1e)3L^ zU?^5N)~H~N8;#2qesgdXizAmSHPV@W&iWuQOI%4GQ-nhaFr5)9FB3fGgs@Vwdurjd z$iT&C0gxQ_>h=Pm(_xkIVx_%WjMw6!i32>`fYWFl$x zF`@KD1DlrQp@!_?8>^=R8QA?5Xs3%~4q@id11r%iXjwiqSdF&(U?wxhu@@mc96NuX ziCw%8t&OwF|M^FVC;t+&>W7_ zeb-QZPQ?dxb7eiLti=4;QBkLg|oQQ@1s@=x}Mxxn*S%7V1r|s zv3DP#bA~<&8*_J|GG%yhbvpYJMr_I)h(F*Iyk*Bc<>r~n9f-wmMVUpvPsC?JMYZ?D zE&ILUno&TndCv_%ygn@I{hQ;cO~TE*5HEzJ;g}%N_6!_w7~s@48P716i*AeTF7*10 zXI+2Q;~Dxlxd8ZeboyoiZszP`ZwcmjbEX6rx#2kGe)BS1W1dS2JC}&F3OkY3JI$=Z zZ*ct9CfkZhj%*g|>6NuOCe{S5dl^@UOxOEQ^7{%3nLNf-qO0@6O!bB@jY(5lk9#;d z*26`PH)FRY1GJ|Z(|kCdvB*1xZw|3=oyA7Nn*0Fdgf~_FS^OjK06c{B1CTUb!R6K} zy;pE+HuSJ6jzL^wPN9)9vg@I#)&7V0lJzK|4R&$14Q8{5E=d&ohNVSzPw^{}ad}_6 z6r`cJoJMvPc*VqJWs5*>On3p78TC3*JeI@lb;a>9VU4DDp4G| r)^u>USMi7S64_ZhU85w2DJiSPe|d|niKSX%XT=y7KW%Cf8-#xVrKM~d delta 3263 zcmb7Ge{54#6n^L3`&hTGYuS&!G6owH#y|&a>DCf(a~NdE1V(}&$*?fC5TnTChl$F5 z#6V!$z2=Jzx2BtE_Z- z?Pz6EVW`Ku&EfFfyL^CD61W7ivZz|eT~&QKDRm^SAUr23eYc#URhwqo421mG zUlC)4<;1H+EsXODLY{KXJ2o`9HRwn&SJF-bSy)z%G>X{k=9ArtZ=Qb|%oD>4K1?F%ZWR zG%!(RF`D=lJX)S}xR?~lz@G=#1WMb%q<$$aPW_u-kAJs#{bmjZK zG4UlPe!Ei;Y*A_GU=?)QI9}JVAkzK~P;3E7E18^n4Ze=3eQTrWlHK_u!D~~8gKvSZ z1XInVZ#%Sb3|@ek!DQ||D5L#509jxZ4L89uqbIjEn50Spd;GI%igNveuvlw^wkYtq zc}U5seLNGI_QBa4urL#DpM|xNsn^1)PZx|61ba-O^OvC4nle&&^-oBB5X+?N3N&+? z*{nB1clW_jJH#=%-T{~t>4m5Y$|N(adagD@-C>wx{l7|4RjEKc#53?&aiT2(t_tNO zYb>IJ3H7nsPlno0F+FY(yErVZsiL3LLK`qYC`uE19FV|RHs**q#(2BQ`?+EcWAHqr zGw9<+lctEj+c=6PkqZ@S(-VB0^+6z8T1`j$#RDk@)xt6{$CwaCCA$hdGlvFF3qf+W zAf(5B~AcEt!hyCL7>vYHj_PJx6 zae~Hq+a(Ce+OQ~hu1=&DCl2yLyckH`QPD{|vT(=-4knsqI-YGT7mpSvm&fhZpLOk3 zPiE-fP7ws3hECtk$3f0Mc9&p|Hz!MQp-b<923O!J<6QEvbBWjk*pAfN>4X4&i{rOC z*=9^~XtPvHFRsH0iIB|duXz<$8m6=Q(|q2150gi~N;GwTd{nvO9nYjGt;M~Z9Bbhs z$AZ{p$^h*RVwz`=O+AjUM!RsF!a4C8e1lIAa$}pS_7wh!cK{wh+5t!!F5-n|mcEO) zWiq6&mTZH#%9uhuWn|}lL#x*N_`LZjp>jjBq@5WY2Yrm l-xt$MzpQ4dEy=N#{A;Cud5g@6rD|e}67-9oHZ(|e;y=&r#)<#{ diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/PCM16B.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/PCM16B.lib index 142784aca91498f04b3841d607d5819b8aed187f..8b9f15fba6ad866880eeed2f03d08caf4d4d960e 100644 GIT binary patch delta 96 zcmexi_``6544b8)p`nT8#4}10U7FyWB~aGnGR74=ksmN%2S;b`gb6{L19?QaSQr@?7$ys{iEOSFt7ZZK_wgR2 diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/aec.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/aec.lib index bb4cb4c1413cccfa727c1cf3d61e12874c676c87..8762bae369dbcb2033301f16f37653bc487afac3 100644 GIT binary patch delta 15136 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 btESEUX+`J%&O4cZ@--P-|G)P-X5;?^;Hx6R delta 16615 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 pj&X&dwPWO6{h~?imLzs diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/aecm.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/aecm.lib index bb33ea741bddb84b0df69790fef37fcd9f65bb64..825f821fadd6f13ab79d46a8c3e4400169c05525 100644 GIT binary patch delta 22819 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 Qi@kSM!OZoao?c@6KMOCN_5c6? literal 62554 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 diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/agc.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/agc.lib index b42ecac294d16f47915a82156b5547a2b6b69215..877e65f086201db6c10a869204d7becdcdc5f41a 100644 GIT binary patch delta 191 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 diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/audio_conference_mixer.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/audio_conference_mixer.lib index 4b35db248bdbe0355fd6fa43af2b33a7d8ca0ab6..d8c67a4958b05fa36805932b5c568bc4fee8e6a8 100644 GIT binary patch delta 443 zcmX@IhU3T@jtMesmWGCg7N(Q!6vQ@KM9VRHOlSSdsIhsETn!^sYO|ffW*MmXH28Q6t_Z`GHPYDkd$1r{K&%8z@m_d_ot(&*mVA2W> zghAqyzs}+Z8zd*fz#tDcNM&{>H>N>*m$7od4BC8aodq+(5V6U6n*^AFuG#FkDboY$ z;mrqr2{L1NZ1Tgu7MNyh{$o~Wx-T)^F^o}c@_Ik^>E5c0OPN**Z2zRn*sug<>vmu` ORB17KYzM}Ty&?eW<)P>R delta 441 zcmX@IhU3T@jtMeshGwRw#>SKF6vQ@KM9VRHPG|kfsIhsETn!^sYO|ffW*MmX0?KH#n#<&*3xMeAA(smoa_vd_U322Yv-iKIE4#VE*^}5gHHVw2bVu}}9_Wn9X{D7gKTDr3VEnCrI# PgP}@`(Q`X6X6zLK&GD-g diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/audio_device.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/audio_device.lib index 325e5ed64de30d16eb95aaa21c65c424d5cffef2..f7e6d95a42636ae1865c4c684ea4c3d8773118e0 100644 GIT binary patch delta 8745 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 O{=t+uvnP;pDE?olB`<0K delta 8717 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 diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/iLBC.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/iLBC.lib index a2bc9365495f2a234c263434ed7ebe767f0875ae..b5f502136d5dce395eb3d807218394bdd5887be0 100644 GIT binary patch delta 10244 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 QFUm57UcjHd5zR;c4b!mJKmY&$ delta 10184 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 diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/iSAC.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/iSAC.lib index f045c772545cb5c2e11d5af66ac430a8aed5e4f6..3272efd79468ad2a7111f5ee6d31fea0031f3ac0 100644 GIT binary patch delta 13460 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 delta 13507 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 diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/iSACFix.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/iSACFix.lib index 93ee0dfa17c4bc3f783b8159e540c1da724ed452..5f84ae303fd1e870f3597a38ca0c39eaf83f3117 100644 GIT binary patch delta 2323 zcmZ`*YfKzf7`@+}8K4X7PI>I?F7E>NEi8+$kQCjd@<>Vpu1aD{aYd}DVuL>j+Coy( z`h#dAS&}P+(8dsHQrm=X+ne}Ei$&64EjB4FM58ST7y*G6h#Il(%w@~az09wjAA8RC zopZjESvYH6IBWhSUdprE?Rh;Zu{QRrCB@=%+pbvxZ;CI=(J5(fPU339ig(&63ojjZ z`5rk>Ms6>1{b{Z(Zksr|RUAlK{5c1q3P4B(RNH?!JMQTs!`ww@#<|RG2=$T!KCJi# z3qRWhvBY&9xBDVa)a#I~-qX!S4Y{Y;z(X!y2l*?8yi7{WU{;aaeD}_G3i_GbFR+=< zU3kDlE?WorONM;^>Sz=w47u|5{2Js#!wk7`xWEt{tj29`*`nebAH4@)VE|R*b)X+@ zdSXS+i4ToRFu+5EP^`D^xP{24A(Q-bPzv|WE*2hMfun;pFr*hz$;!(~R-ac5d%%GF zM(u4$M<{{RHQ{He)ImzlCGl8Z&H0 z%mmtL#04h#$qnd{1boK`3GClfJMcFltIAkOzXKaJE2S+6MQd`U^S!i{nOwc!Zv(=ESQEe-ls6Cdz6 z<~c`ansKZZlGvCXUHAhXphEJySH>*u#uMQjqdZ&@=sq7FkAYPm?y15s1pA(iR2sY`4P4N$5^S)XxavjSZy301g!f5FMCC9&-b zabq}#_`o{E*BNmm759Zg8Y6!9iufAniOJkmktJlx&lbbjI)~F}aj!UH2-1|=Z;16_ zkj~ItL!#@kC93`8)Lqe}S<-V?#K!HxF}kVUMR54$$y_szqkoT!W2x{IgReJ8vJ@EB z4{uSja#xKpX~q;6Amm`i+%ZWrk({IXiGPYy3DWl&u$fVn?Unw}m9~XcxFwTTO%?eF zG_7 B1+f4C delta 2322 zcmZ`*drVtZ7(d^+_wp#Ty}Wu$8OR*ybXyn{N=LG46NQlofnh@8#;_vJ%vbOa!km!I zh{>95fs}aMBoJpamP|=l)nj~Q!{M^bIb1R}&_p*7FaqH*z(>S+?>&^(^}t_{(BJR- zJ-+XB@vLR>tfg&(ljVq?FxZ?p!gY!|J;zm!0py-SMH{>$zpa}!|kO*>`b zl*tje=R9uQQn>QR*wNG858nMe=E$+Ow%rI-141&0?uLc2Bdso_we`G@KiL<+ zN?@?~)J_26zKl->;#(WnpdYW26koU3tV8#C4Ls<|b)dgw&?}_W0$77S5xCvkC4^0_ z_})Lqpg%shz=N(>2l@*JedoexA_xq+=Ei(Dw8eK|m>JSM>@p-p8gj!|v7`jXM{fg& z454v)lHONHU!Gpu+Cixv8 z$EsZ@e?AEzqsEZt%bd)jM?2tK1E(8%xhx1>(p{#$Znz%3%0~X}fq{@Lh5UR5WIOC2yCdoDy!ik^X`$I|1K^3@8tKqM zf#2&ffy{fcjrRWlrHK&3i2Y+wEQAr0s7a8cv@DvkNJS6Mphc6gV&DW(#J`5ougz)nAYD-2K}MLnxymi6F?I8IO=t_gHc z0FNg_JXNnyHCvYa?fTs$pIpImtY39_Xau1Z=J0P<@Jwd%{ZS#*fqj)r7IJS2JCY+$ z=|2Lg4PXncoyN;Fs9@GF)Tis)sS;|})M~fq73yWzEE@mFywUHUEuk{MM+ zx%9gjd}dT759u#VbrC{EIyiZ?2WQdVD(Mw7XLGh=;xUO9@?@Qq!6{s+K-#C()j3ut RO+UiEhn%2E$E7>b{{h6HO5^|l diff --git a/branches/2.0/doubango/thirdparties/win32/lib/webrtc/libjingle_app.lib b/branches/2.0/doubango/thirdparties/win32/lib/webrtc/libjingle_app.lib index f2a45224462b414637889e1bcff6df263e0348bb..4fbe3a130d2a61a7aa0b339f50396ef66d746e50 100644 GIT binary patch delta 809 zcmZ9}IZRV=0LSr14=gC~q@}ICD)Q7S9_0`atXJ_U1w<6Z8>@n#76GZ?fdcCDp+Vzf zUK|{B(8}VX{ukq*kq~1fkW?&h8+&%zzLU7M%-x*doYl2wpTs)(U))eko)^_7Fzlz0Jf~D|c8I~g-E3gu)uo^xTpb$kU#u}8M6lGY8a#Ua){8*0- z*oaNoi~uUJ1zWKV+Yv++La0U!YOw=#*ok`V!frHR5B8!F`>-Dea1e)Z7)Q{AqX^>| zj^hNH(Snm`MH^1xG|q@tepI?Mt z9_`MSXND8$HBq-!o|#(|*GFR}hkd%~&O1w6=wnu;ef<8@N0Ri(Ysh16r*3J8;yilL uiwn4jOSmj74Sj*J{}RWQD|%eHihc}W5Z7=WH=yArbPVB^h%2}AdjA4n|2{|n delta 789 zcmZ9}OKi(=0KoD8)~@S@`P-^19p+W<`ERt{)T>_Ay-Y`qdDOFP^_bS?&G7eMmysUC zKd}o3Qr`8i2AEW411Adzf|kRX;GdJzYSuN`;z+`hMOPhZN|gG7n``bW^xsi;bp zs${E*K~;>ZlA|gnRmpv>m>-8m0xc6VBMQjzYT{ywV5 zp9K4~uxAElVisn@fjO9qd6aht8*o*)gu?1TZ#5OcxJ9eNMJFyG9u?HdS#XjuE0UX33 zgmD;0(1KPG_C$OIBQL8I{h2@FFnr|Ypg)46IELdmfi|2JgZ^kToo#w2w8~htP#%3u zY>eR)+R=g2ID@k| oCyb5fy#xQ>KG25k7jO}ma2cJrf~&X&71yDm3vn@Q?=J252M_Najl7GO?+z- zSmS9;LTeIP<7G`^YrL)Tu_lQ%Nv%m{O>%2eSd-G4RMw=n#@CuO)}*y2oi*vL$zY9k z$!JX`YcgAt#hR?vWV0r_H94%wX-%$eCU?Au|4ua8KO(ovqw=bJ%1`;L{HlN|s0yjV zs)#D8imBqNges{@snV*93Q&QntSYC33R1zUlB%q#sH&=(s;+9NnyQwnt?H<{ zs-CK^8mNXl{39BbDfs^d!lE0E4vTKAny99#nQE?DsFtdgYOUI+wyK?KuR5rXs*~!h zx~Q%yM1`tus=Ml;da7Qkx9X$%sxZ}0^;ZMbKs87WRzuWKHB1dxBh*M`)hIPujZtIO zI5l2PP!rW86|N?$DQc>krlzYIYNnc{W~(`Bu9~Ojs|d9~MXH5rky@;lsHJL|TCP^8 zm1>n*t=6cuYMolIHmHqiliIAdsI6+7+OBq}oobibt@fzBYMax0`uBvP5y1Joms$1%|x})x@f7Cs7Up-I{ z)g$#-Jy9|0sd}cKs~75}dZk{gH|ni=r{1d%>ZAIkKC3V4tNNzCs~_s8`lWuWKjXuq zop1#%hy`xo4jvF2;y_%82k{{RctS!*1YVFByuk;OKvGBs$sq-#gjA3kd?5{_g>;Y} zGJt`MkO?wF7RU=06KsYpuobq!cGv+sVHfO%J+K${!G4H>18@)y z!C^Q8N8uP8hZArTPQht7183nJoQDf=5u)J|T!t%f6|TW`xB)le7TktAaMy{_>*jo( z=>GRh5$RM<;YuDkuEjmaD^}akfba-S;yyfphwumpZxhA;3HzQK3+0YBjv{Dwcy_z(}51_xXa3*5jR{;tMmiUV;W9>j+P;0XyK z5qLpj@CF}90!bkmB!?7`5>i2G@P#yx7Scg_$N&a1LMF%zSs*K9gY1w4azZZ14S66h z6Tj`Q{a delta 2864 zcmX}sRaDSP7>4olN2M(6!Wz335p1y&ySrPk#awG_!cN4*?oRAZ>|7hWJNJF|oZXA( zcfNDJiToO1XMj2}yYh0{}XH9%-5?JGEjhi*@)_7RsX-z_F z5?Pbjnk3dFwZ_YuWY#3NCWSRAtx07~YHQM1lh&Ga)}*&4gEijPWV9xeHJPo+Vog?S zbV@dBvRjkGnw-|;vL?4Rd92B6O+IV#Z!-lvBmcY7c%R4us-P;Q3acW@M-^4Rs+jUq z{;Ietp-QS!sp@d(}a8RGn03)kSqx-Bfqg zL-ka>RFDc*y;UF8SM^i<)c`e64N@U$uo|LTh*V-B%CP zL-j~KR!>x%da9nO=jw%esa~nq>WzA<-l_NMgZijGsn6<*`l`OE@9Ky8seY;7>d)km zSSMV83&ex?kN{l44cx&4JRu<@g2a#nl7bf`gXE9`QbH<74QU`Pq=WR30lXn2WP;3) z1+s#HY>*vtKu*X7xgihag?x}73P3?91cjjp_&`zcg<{|b{!koBKuIVCrJ)Rzg>n!8 z<)H#pgi25usz6n!2GyYk)P!0P2(_UO)P;Ib9~wYIXatR+2{eUf&>UJoOK1hHp$)W! zcF-O=Ku72VouLbKg>KLtdO%O;1wjxDy`c~Eg?`W<2EafV1R*dOhQLr52E$;bYihX0o%Me-@5+V|UE&;fuL)gl2FCC1 z*5ldy7R#$IDjyae798h@r%p^*@H406tf*E|$DHW!AlK)PcmXfr6}*Nw@D|>|d-wn! z;S+p@FYpzn;yJ9vO6B!one7?MCz@PcHJ z98y3^NCl}O4Wxy1kRCFCH)MoNkQuT-RxpqavO^BY3ArFQ zbKmox{harl^PXjqTwCT-Rb5>(e}3hn>Y7Y?rTSU5U_s?vVP0FTChs}d!%PNCCZT+1wZ@e?sl#F-AlUwbZW9#~o zt#A|7WXVsGzCF00A3bJvEQ{@PkUoi$}zc_J=fUA-e> zU*Y$9Gp%YpzL2ZV6}0;n%$;kp^48V`LoT;{rK8!CX%&ow-R^KWWcP-fR%BX*+yRF_ z5Q^C2iD;|Is?Hy*b$MXbxz1!24urzqdY9AgpEtKM(^aGnmTsTh-WE+pGpuSNo`}=o zLy{T!stmhD9(OS8589VixZHT1@qp7+UAZhXs}}|Qkw|@AxGsYY5y)h7y6usOx8C7& zdF?&@$=-hC{ks14_E_Jtnov_9kP)!cYxmWAz4bw#!|rJIFRN)sRa#cl-2+EGy|M0C z+p>9?4r=XnwSKp&K4ce6t^Iv{vF>E&)@3z)v1nVodp+Zy>BMjMMruRB+EBf{zk6eM z&*tuBH7F$n*3;J&MM#YfpOq_LZEc+^?6bE=5vjIiHOU?sDJ_<8<4t5cth2l7>g#LW z?nqXW;@$CNJlYw*7~UD{x3kV3aRi+qXRXJ+0?9z7bhG@bm(|3&5pqwv8fJ#0dV46~ ztgrLbBE+7ySgXG~fy9Vx>5H}YtnZfLn6o2b4+s4bhs&RlFy@|`EgdkTw6gLsV2{+* z`aIsSy{S9V-`m^Mmt?jevWQ(@?4tfyck9+{XF+?d*A=Qo^F;O=+{vQW%7B@POfg3m zj%%IXT8A@Y53y22m(^^JZbB82uHnF+>_NFCIuILt)n(+X%VBq-YWaK~cdo=re{v)l z?$O#qZkMYTX^yUA-Ava4Lxp8LHpSawJyuZ&*ZRUC)P@m#i1xR|Eqrj=gAUZEI(V_N zFP@C8jBe6uN4(pjeL*m2g45-)J8L7g!Md==-tFp$c6Y}*6U%BgMLYXr%PQOIX( z>x^DBM%Q&7kHZgnn2~+0s4Pijg}=KY31b&3=(-KD)@0hD*X|5^9S(=vpR?H7dSZx) zsI48ML{}P}yMh6i+YOPFtJJfcuP{3IJ0cE$eIR1b>U+?psw17ztq@I-o&=hs(OJ;t z@P(a@pxuv#>ev)#c1w}s7X@1*+Lh}Rnky4uZR1^|FrUEZ+>* z{*c!jb_;={Rw+j!*wfuZv6Cse)6V>MXPvV?==Rw~Ql!X1#qUnW+v6-yLlZZ;a``=h zI%JShQpL6MUszvzu_{M;&`VU!ug`EAaM$_+$X<(F)ue}>uSSP%S2*bNIO;R%ZeJ|f z7muYSNCH9i^K{UmOT(jM>=E=1?vOeaJ?%twGGKw zAG!?Tg&~X64#W0{+wTa}=8$8kV`?l=q-X+ZhY`ES=X0Ugb=X@W^x1Q^#SmIoyc=24 z*54OR#(R**99W=T86EnZ^}etVqc~fPu>u?Os8(C{~SMRR()Hyv4%^h8gEKks_ z2WlNbPrcu|t%-)+67Ozjzlb#IA)<}c)j={i>*|c6s4doxB%;D)MAYccYY#Z;{3r{j z(cMTQ3<9qZuXPQ|7&0N#j4plth|}o^1gu?h5TIwe z(HR7nx6U1OSvwN}YQ>xppwI4cyL^uNI*jPd6K9S~4CTbyzBwJH&yF#$%MtL`=XPlb zvN!G0Z}&uks0A37KtLRCyt=AeCK zXAWnR-h(1&d^U3mCusO?32B~cH80kdUz8k}8LCqwCP`0I+8$O;6&^>hC4}+%uzf~TZyWSOi13Kvs7W?TIR=!L!&EQ~6Hn|pG1U>HM|s!#+&&y;&Clu4$aUYM2s09sPc=}h zn=uv?z@o~wa*``%fFsufbN9G07~R70MF@kV1}J*Oq<>{!w6_B?Oez+4W zWR<#|A3DAaf8{cpx)zsVBV1OQ0=0;lcp*N-N#e62)Vao#DrEWQ2 z>Zj8-8Gh=vnLesyt`jbBI{ofi57zu#eN;qeuB9x*l3x(IRIispQOu94HVSILXJ#?b=L9ec@hN>@) zS!#N=o3*e3eL|?tfq6leqx7;umZMs`-|GuHgP4Q}y|_W?)QiMgu71_p>;3f}moMP3 zYdkf&<~54C3SDScKv*&hLw)bT0*KarG_7}Utd*)>i?y0MyRR-7c6&YHtk`iqO3iEY z3QwIq?032xeqYd@<{CMM^>$|@5QhF6y0MHR!aUlaP!$fA#f9~+P{if&*88knveFn; z{uw15LZJ2GI-i#-ZvCAoVWGR>N~Nx^Y=^uNN>;878Y@=FURxjVV;MWWl%-aabjP8t z7G#wNX1b`=VK+3bqTsO%rn=SVoQRAF+QMxJnjojsQ)iW4Lo2YV+bBwhGk|G!R*~wJ zDIv9(S>ZwliM42~&133pP+!OOHPB@>!&LQ%z0O@LiZ_?zVH#HivK9-_F6ai0uG6}I zA?jIVLa&&)UW_{La{23nb#)%QOI4mmJ3D(?#hMrMSl#OoUbi8udlG4yV_Ne$%Ng zxcBzNyHPw)^x}n*V0{u=G`4;!3XCp;9&EnwMEuaIs})PuV{L&23FSgzLTmkLw{Ckl z;`K+Mt;kqsN#|I<+!>-S5~dv@cf$^kx7Lrn8)~D2?tUHj3s9wLNU3z1cImZ4ofYx< zB9KmoJlf1bAC?+AJE;l9ax`it;=FEahD&IS9Uf26u8Ihe8$I3JK)@((rVAumlig{j zSb)N!P|z86Wdv%h&c=3};V=@euXVarp`C8KebLR!Y8J}E!M>K7^fFl5HS}+;y4r|m zm{tT4uxyc3Jf#&@7|%LG{$O1MV$PA?fss)mlB}S5tw@Ji4=tWAj8$Ww9Sa8Wu70fW zvbh^q4n!WYj-WCbUHY(v2ZA}X_8K!uPp?RA+G!B+tqXeKJR^V8^+;V0N~lZDMwec< z*X6|alpHR*VqHCbh`oq&k73yi8+p*wG2Hgru}sv56=5`&AX3!T&#e^eMD`@8^v2S8 z#(GD{9(Fk$Ax|CGg3LWZkGlFLo6s`sW#UE=Bs?8wEG^bYpz}nO^_>&k#2~z4xC<*Q zE4g-8HJ=89%Lt^C*Xi_O7m|=IsuUA7KHjHSU%mP2VY;yy0*hY`Xw1_>UsQi}6ri;} zE&6GfE_;2r-WRM#Q`I|LDy;p`k)npI=kywh^sBmiZY)U0*zI91hk`yoI)c+f61pNjFIMX!eLbyM``}txV+RFTS1j4lgSM&W{)P7CM7+r<~=qr7J5haA^MA8m146LoKN1cEY+dLv+9FW|M zd`i2-jsfU<10H|a-q2zPFa(h(hkFRf1L*^_uAUwLyUG}aNd@dy&eo9 z92g^eYQrOiD4gmcdeFoI*eK`mJME3}u2>WH8gzzYTawmwBJIv+_c=WEt_Vi*xe7#f z0xXuav!LDUsB=35P`>Nkofzn0*o!fMST{`~9JBm933$DJj1Acoq&{8@4>7j{ zCA~Arr^iO05@DjHY37%;r0p{%Mwo0Fc`~O*CJ)T3OL{<G*``)yFT6MeEWK~rn%ClH2*5;fZnry8rKbs4Jacr zSTk@q{FciGwbAaj&KO&O3zeTUKP*64dITZ3N~B5?U>JxRR6dq&m=l^}LwA-|sUDu2 zkpiQZfq|)O5DB$e=SU8s))L|z-k;E$@yM*Q?vKP5h+%UUCfdU(H<+CaUX^nBW+oOi z9YV#UxyvUv&5lId%~{H|P$wf0nT={Na@&{Gom-b07V9%(W)KtBL5a%Ya8+u~WN(!_ zZ^c@fEUUa~z3Oj6ESX-m&?@;bp`d-SVdr1(A*4=2vZq(iiD6nj1-jL6YXm3F z)O@lWy<$y22e-?SU7t-&owY;vj0*f=yg~tGuxlbdSO3r8Wi^)}Xj8CZf)E{*C_!DL zlY_fSbRXGkQewKGE@TYT?_}&rV5*i?1moR^XMYU4BbGTTw^S}#6kS+VonBnHz@e^{ zEUQG{>kqj-t308`6&Gaf=-?`Zwyq+0gARYF*5hz{R#@_ibpiS*SN>E^Z2(8#RF3S8 zCaR6o-xzd6u+uo4(=p~YI8(49=xFq;(uaDw-&NY)ldMq1nIR`8wJuk^1LtV$VW?pd zS5`ib!10RX8R>yH7Z0G{cVW*EHhrZP@8Y0O4(+Ma?uPoD+u&8rEA#*eB$u)k^G-)? zpf-rwwQNB$>=Bju5T~O(ZY&Gh;IUU`ko_WY}7Q*o=Z^(;% zYxLLbEXt8yR%ke^;PZ2{H#SQ(8BdB(MWAkI)-s>MMW1;=72>XsIKA%d+z9q;iZ}GH zb9F%3s%Hw62#A*M99t#p>O!@lfG=du%v{b<19azJ>;uHPFt;10cuZxH%QLz*t!+T)@Adeo8pLOTqaE388bvSUe$KhDV zKgI=$ss%v@mc?8+PC)WzY3~x}wT#S;wli zTa=EY$tp7)ZikFvFuD-~mi|6hYgP;z9DWZTMv@&&mOazCavp;eis{C!y)iqqAYwv5 zN6^mqM*Cu%r;2tX_rxT!{6R`ZRgd%!TR2WxI6Bt{tUSWDW-%ZlSFR!yDFQ>zk`d)1 z7;==0oV(M9>bVY{rm~94syZWEKrBId`+B-u^5CYG6Rg@H-`LubtA<*x?k2LRB2q=A zx(G(&-NUd_Sg4$a>NJc4QH6yI_F7pH7UBatab-m!-$*4)9%Ijtn|q*7?Bm$Du?MG} zvLeEUtch8<%gUl`MFX*nl4u$^-Hq%dk4mBWF4HtpA!^)Nbtum?WVstD4Y@0y+9ik> zGN!R?QNkf|H${0({zckXsoe!`1NB8nxZEMWy?vcuj(QlRtA-8hjJ>4{!*NrLZ?UVYnOW!(a zsb11;Ggl4`8!O+xfW@$1Z(iu1cmd0iZE4Nx_LdR$z25^{vf^eHYLucSDa-3p$ET)c@qmif}*6C^WUubdKhZqkrP|@KIik&C{L^z6Xs zFA6)Na|cIu$JppkEsS!x&}ARxwPsxD`?oqL@!sCT_8y$l@Y?^au6}#Z4wa1Z#<@|R zMX9y_8(md5>SHswuj&0;?((_iZuF;%-jng}UG)byTQtvC8}RHMF>??|@aVE4`u z-s$(xKmPS^c8}nDcUtWTZZI6>F*h8k`;Wi-aP%knMtf`G|6eBnM|DG_*ZxmGIQSl1 zN_j+Q72lKlERSq=CpL$U@`U9P+@m?_!=FWfmfzbD_3RN!|RWF$0 zhG@f8p`$!6`=5Nn=xEOZh_jGE7m_{x!QPvv2eypME) z`5(H;9*4lq+g!2LMmxD}JR+`d{xF>Yx7-4PLwZI(GB<*lJjmw=`C*?0$otmW!#kV) z4?AL@WqSIQt;O#e{Rf;#(9h$h&#>tgDdQaf|JebC_u_&8o<-8mD~xn=D)%azPhx7v z5Da_LhdYLlvG+`#2YLVG1&;&HUFoc!$xu7@En}G~5J+_X6oh z>)_1L2=jK9zU?uO@G?6KW9TED*c#PoK~=#sO#i@xfw?1!(l+ezFeYr6(_tA$ zDo4JCoc*0SJ^z7M@XMQ9jFXsL6Mf`{TEqX*XFl`%6@d3Is}lKdyzPk-(DaNu<90uB z=2u*_HR8=Ua!h9QSG`+6pVepiY-$Z^J&nOQ|*ny}zg zcqC^l+HWfH3aWqnWmTg)i$01gu8#cYP2RsFE5{vK>B@3MKm79k)dD?-bBjTKR|_1@ z=-T*eHit93Ho809@pa~neTLuj8EJ$q?kV`k-HDL**gI#04|nvP)1zU>-y+$=48V=o zN{l@IR_7BrqXHjfISex=QOEE`Kd8bI!>G~To@aD7?9>idC5c{22p*}e|EK+Y(7C2d zFsiDnYv#|dTvS~nF1pbFRH~+``BkcEZSgthtk(aph+!ox5nGL)V_)6Hi9t&{Mw|v? zi~3^>=YT`eoxw1&%Q$Y0$=6wQQ(S~B_>0fgqOHYVOWiy@VZu;VSvh|`uJ%|^vtYh- zvbH!-aGP@ZH8+OG{6mosTxiZTwy@#m+%X|k7A+O7B|=E--I6<-pUm>Ytb1aleqrm4J4 zuB|k()|`%CgMJ2hikC^p;{o=I?I>3NO_s^6s zXTt6=l}9k*kH{BOxTk>rKj1scDY?b~tipW-^y%O!a7jMi=3z7m>$!VPqhWjS?Y^-2-7{6TMo)4Z&y@D;Bf2Mr70@indXMs=h zDEBV6qX3v9< z^>lq6d}o30+C2DXf$w{H@Uc99lPBMSJosk7zdz=|$8e`yh(CtMD*x!;iFxqRzh!yw zO#`1h4?g<0){4(mukJ#9j)8AV3mo7n!fREp_CbKgz!O|2*wXUFRIg5g^@mj+$!T5h z8NW~G$@jTD_@=_YTdnv^>79i1J^;SGtul7G(%UvhQI2m@ln=E_z6k)UcEozWN9B>6 z*6C%w{K1OP6u+5>U(tF+sqB!xFH5FLq16a^>H2SfA1(d9=S)?Z^eoWm$aL@jDeA z!ADGdR{57i1-zvX^?r*C)dR5V_wN9G@5PGJ{~^hjtG+P3KLF33OC(>e^fJFDTq=3A zzgGR*pI|u&eE+NRPQw37(gBNIs_5syC-n)*m#h6&!TK4MM{-)H*9FTlpVT-cTFKM( zu=0TKc9l0*`{2CuC*XPPdg)iL_;GlB^bL|n`)d`hAO5WZ-z}e(T)D!11o`qfcy@hO z^5qKG59{Ytp5emXhH$6dq$t;aPI65KShcqz)W6c36=mudBww!j$MNK+RUXM{T^^io zJ(36CeDM7;4?gyn$KI-iDA6jP?}F6@;G6hG$%E{)Oz)G(my^M>|4WjO^1-UT%>@0V zFH0WnuV^2paRmEm7x?Z_d2^L7>(vY3dEzV5w+R5Na9yC6epT{lf34E{L0C3`?+%qW zSGb(-zW|=P+of;0(t9qfx2ZhoaG?h=rMC(GeT{tVu<;y?*Q#EvMFCs|p5L=z@Z<`& z5O$~BEm-tFR&t2$EAr%I(}!v@}@la&IRA&dGK-k zd@zeIdwjJH>GeF1Il~JwcDd5~Cel0Qr|1WNF8Ok$cQ&k-s63L>I=xKC`aJkJKK*1K ze9XTe=fO7zeDCDJcOLl8cnNBlPn&Vcn&D?U^FSf5+LcbCdL7T;F!qki|t;PJjL!_5`H6JdRo$|E_| z{FCcFjT&t=3|}(yVZ8^7P3O8jUPn`)G2nMDKCLspuC=!-d0HkFR<2;9i5L#JLyn-Q z;WQhC>l=7KQKTrfNSovKb@A@i zt)1t@w!n2)n=&Un*ET1-j(@h==J<0&!P>@}x;ohr?`vzpZ>J=;uHKyNTpjOj?d)%h z<>1bdK>VI}tgk)Vnvb)?;Z+L_k;>oyDD$rc3(_dI)m`|NlDu3ew&JG8u9nSx(cWJC zUdM=TjM;|EB9r*h^R7hO#+J?T?ggv49GqB!MD0me``=nn-Q zt4MXNXlz;G2)SEm;qu_iRf}J>Yl%2kI9h5Q4K1EkjWBs}HJ6(#GR%O-5o)2UAPn@z z(HLk6g~ghYrEvs$GFNH3eIoP522j z5E{ebK)t`QrP=RU*|4+<6i>+E40u{rc!J?Zf5>N~Mdn6Y@GE&4e7;DNk;UT+_=66g zN6=bY8XA#u#*E2VV}j_rJ&_e27k){PRt>H|4y%mmcmk6CrJ}`xv9Rc48{4ycT z?h7D7{VwEwDBS1}8QLQA#w|0pDdczIpfFf-yu4hTJ{g82$u zu(ursyJ7dlrq+d(=k&I%v&~sqZJX0-oAZIVZBApvHfM9&yy_a1ED=9RLaeC-3vgl8 zB7xY_AaSnbtD0M*elL(%t=dU){9;~=8kn@)5{cC9fgI55@q9xWUmX6YKUJPQ;q}q zrgC^OaA;$wClYT>_V?jO;syOnI=!*85?21UEy`5z-hB{hh7RL{e^NOen|0dhi(R8BsQ3 zN16H~vys*=5d&Hj8Z8`w=w=ZZZ6+9Pg8j6jZ|fO3HDkmEu;$1@;TtUwjA2Xayt$Ri zNvabqFNKq)?v33&o4b*V6Uq)EsBr@Y%At}_k8+GoCWLmlYilf#P>xbb1qzSJK&2)*#wcRfp7570#tLgmV@}J!>2HIhgz zLB%uhw02d^-&lLG@a0sMqsYXuP-8esDJo<7G0a@pl0^L~D(lB*KfW<=N}^sAmDyAR z8TgHulfP=d`i*wR@A>oaeXQ!A{Hf5El|6lJtn5W)MkDAg0V*v$?d|ZCT$A9wH`&pL%G$NAm42W&ipm(aA*}iH1l5+N3NIIm zgiQyP2@?@#5Oj=bPE1Wl5}#VS86^3Q5v!W7Oa^&AoCRDhez$TmzWy8Wl+jA3PEFh* zSi8V%ZM}H$dHvnpkVf;P3bM3c$B_`3dNEU|bo z8eFJHHm1|Sf!tP19H=1<&4F?{c#14|dJ@Sr)7fCMXEVtfi;9oAM4FlLVmma2Dw{HY znG(XMsBApSszqi8vX(i`ti=2vseT?$hIr4q{&r;&Y^(8^NJf*Q>{z=DC5lXEo$JMP zcvG~c6F&wEX(o%VrGY=NEvRg7uUfpAmu$3fpL0tG>K>-S%ma#h6Pw;yB$PA2@d;~>T(wQ1dd;V4 z;JX8Sn`7(xlC6sur+Wf+5hucyVob9YVoTl|gKn~@>`H@6Y=IZ;eLCp#kS5KIN?*KK z|M^gbshpdGCH-sNf^AL?w)78xiz-%Nh@>$<#t89^3BP`ha?KqpQFWN$8x4t~`;~H5 ziar(zMm5pA@N~EKZH11ar&~D%R!fXg$ow^NWj^d{bK9HSVPC74qnGoA)Ox`XYta#N z^R}n~XBzS*U2eWucdReoD%`F!L|5N&E@JytLn6~|o4T2rlMve-hESOau4rfHx@hZ0 z;Vs8mS}ur~io81&&H{!+ntzN|G>Ov@>1iqCFCwA5mNvZWipNeZdgnh*_;-L#(DdPkm6*mSoTQZKSo zFDF*Xn+?93MwtprD{inyZDyw~BEj>}qPl<7z>uybq7HmIGvw|Br%S>S2O?U0MVtb$ zO|ed4sc*Aajy@uBx@Q5CTg1n_Iwh4lq{lPrgVNempC?pP1 z&+dC7Na~0IeUTV3ya`9EphPbKmKNOZ{n;+x-Pdfm@>4I~^3E4O`xF*?1%3CMfBH#} z+rPQ%sDjs*y*<7anvCCgS-}MzGt|)g3`nq3qe)!b#|2g9`uNRCj`qC${QRMf6 zzWd5eJO8kLY0o)V$M3uF;uqe+f)mnKS}@I4F{kYI6aQ>$X&v8D+I<;%PC;Kg=a=8O zFuwJTmnL8S?$4eYdO}g|7xaghpZLuyUU+rSBVQT3zrFe6TNLGQf__QO(9-+fx$^m7 z@x<;I-n#sBEZ#t~URrSBb-MQnBV9!cDI^!jS7222`H|9`#vzaHCt)!OI({$khTiI2TI5AhfD?ZL~xJ^94vr=N1$ zx9S6Dd=%w)ouI#c#b;X1#%KYq_$Xl;+zh$ zK))gM;q4GC(3 zR4ilV0+Y32Tpm^uMxT|5B=qH@iiUpvNCa+~dW$q*04&!Ej3t56jCaS>8ZoR-2Ir!P zq3Q4H>gjG_r8<%tmDt>il1#Rr6YmzwG^47Pt+G0dx>|4D6zx2cMD!g#HDAxG%N5f_IRjUy?JXd)5oJCc;N_9fGDW>hsI5$znNZN<9RquQeicelsa_xFh* z!aQ}j-&gFR~dYy=wZxWpf}+Qdj<0=F+l`~ zhvR(Xvy|IC@sRfoynT4jQc5uQO+T8OVvz2^q+5N2@^hMU3}&oWj}7d{D1~JOus=p= zp-PB~V<<)o%c?*tQ(79((P2G-QTP+yN`p5Ha{v=YrlvxrF9C_hr9j37Cx`~Hjz@(u zma$f;rb!BSIFVMYd`qX@r_&mmQ*Tu79x5F2jvMk8RlhXkot$!4OkTNR-mXh$H>@05 zQ#!P!e8@X>Xw9^tHMXHO6+>%gip=d8z}Bl>q3(v|Lu=L!t!W!t)3I|+=gu`f8&aH>9Z(;vY;bkm#S??L<(Y#Zh^tdzcCCaCPX{O_=6i0qwk2#=r-K4Nc4 zJ-X(D4~5A8s%oGeAC^7M zd=X>iOL+Nc_Ho#cRlhK|R&Euxnf7DE`AnROfL+SMUcu@EAJ#3Vc!g4$QMVW;hWBN> zJJU9rLd8n0X1=ciYOTyVC_{vYT&#lLrLgP@_ z9>$4v5%Xweo=QXs46KB?33w^68F&To0^k>bC>K!|d8%WA!rDgDB;^6sRIJQH7E2m; zaMM(*$R1>CV2HtWsDcM-kP2UZQ_OOcZAwM4$ zKbsf7S^TU_e2n&E)UP){zZ`Fasrcw8{WuBlnQ76W6`!tHUz@-pTC~sBhO0Pu88Hl) zdSNlGr|-Azn9YGC&dMe_;kDzlr5@hlCn)T6)UMdshwu|0FDDP zorOT!pM_V7XPTsVrm0vtsM=0a{;rye6|DK#IES%e8f1&(ism@31-m%bcG!i=miw<- zsA-+KS#}}P+Vf8>RGdN=g*sU+v{E1owH(MoodRT`9GxCRwO7$wHMh7OJE{ zfDK&QsjN(fQr~B{xZ_ar#MD!wAH3$KP0NyyF+1FVhO$0>__DyoFe`);fdvFfGHI?p~Ql?eVAvEl15G>mR{>xv4NUHw>vi zuWo^RjYi)ql&if$={PLk^e3H}9m9B3C##NueF;;Q#EU^Zx(v}*;ER<*WHOKs)5FSv zf)S%|fbtO(B5@E%`VJtQ-{n9X@H!y7@*&`vz^j1lYCZ~NrTI9J`9nTd2GXSDp-D;} znu@WwA#Ep7Y6(75chb{~mF~84P(y@h`M;?lwTR2VKn)pX7xP}!kQ-34$Ta2CK-Q2O zfvh2)1=@gL0kVeN3}g-Y0+2Q2i$IqAmw~JyiDBKB`Eo{Pocw6z~wzPpp1TW#Fm$4QMi$|6Ru)2*gu zU18f9sHlvjezbFSMa`jS2M*Z=G4-3P{>w0rQyLrWe;C}~~C z$e|!TjJY1lfw8;%O8!AvHM?91V$Q7GP=vHhL$(}xHq}@$Ep;&U(4KvzCHL%3J+Wv1 z)IGl{8v7V2MKFPg4|m1Xl6#(|#S_SmX^8CX!9ztQJC>q`9Vp!O8D`IeY97trb!!EU zi2w2FtXipN)n0Q}mF%cP?O}FyE*0J)QE7Yajbe`%v?k)MKfq_xx_^ zo>z@TI8l6xK>E4fMACz1*NB7BW~W~h0b>VT|p0jj|P@`c~K$3Crc7nR)GJh^=c zQA9?S!Z$?av66dW{;nF8C)&q8);<)PTyk$HpR{?8u08~>rVZ}?sg9Rl!UZWK_ePCU3aNA1S3 zv3gil@%xGF!fi__(hDo|T6{e`5&C+S>U|J(+UxG>c{8QaDe!NEGrX*>* zO*f@r`k-)oJxnr;uj{t(M2vH81!@oPkerDR+VSByhwk{z>Cm+%`!B)1Q01Ni`)f@0 zzlQyIb(}+g7$c+qwAVD!^~kRa5Ky*#DVc;Sk6YYArg0MEOus(|{9az;B+l9Ni=M>{ zoMCE@3{8BYw2GC*Wq-$7z!V5q(~#+Cb@Jwgi_OtZ$e>AOFN2jHwDos&ZDlx6EKe$X z1ypY37W=m42JkR$Hs(C;O;~L`26MTtUTm6$+I~{mK9IPBoZH3I%*VjyMcC}rndf5Z zW>J|#jrVy7mfwxYB0k#pZ%yAvBT+{Ci%j3w7`}yW_fO!ynu9y_VSZP_9L9T@N`C<3 zx1;gB8_2wT49Kzd<3Jbi31BVoN5B@~kAbbgOUEb!N#Jw%X3KmYcn9!B;17U513nHU z-_L=+#P_Sfmw_iBVXp!!fv*AQ0m0!xvmL%qLYE8z*B%TfHQz+0?!0q2s{_q3akPqfQZAuAaDurTA&knAJ7ea9#{|j z9WV@h8yErp9XK7x)s@qL#{p*nPXL|`JPB9>tOR1q=Rggx0T=}04wZomfop;7z$kDd z5NRH`5qJskb3o?zUBGVOeZXEIw^P#oY1RH$zy!YkrqbV4=_RN~*it%B1tkAGpeR4! zhw$B}()(5V<-nDovz?QV^99aDCMYkerb!C>JkpAly(mqZCMiEuO~uMjb=pfhjm<;y z9nfj09V!j=LiKL~N>B1lQccCm@j4CVs`6Fpw0SzM+lAi=?v8aPY}lUGA6q)3P0Uvk z{k`0A9c!DebUWk8L?qVN5XJT7v7BsNv$eJ2WNUvfoXzGur?n&2X7hx-wwczk$I#oOMMoW*GrCrdnmA5At!*XImg+&>N{HXHy<+M+fHy_j4ZnAz47ONc~ukjCBL zvlRXviIXyJmXLJWoXMUZTcQIwgv5lKR&eN9)SOCI6j4D?o_e9=&YuoBR)IQoa9_b* z$7~44LqiuuhL*1`x$Jrr{ouaw$G_IK^4 zVnjBj1)(uAdmWVl99@#mw!cf|N^3@+u*se~yN z3cruTMImk;(S{!v!1OUei|VFpVY*7tIJJ`|j>Crpjl(E*?`aiY8@{v$iU#qp&*j4b z3sqLkJ;wGn3;XfvfQ5XYv#>X6{9gu-S>w+z>Gtcu`|}!bs6R|9^bLon@#lDeY3awC z5W+!-iC8N(RHRoATUGfYh7XjBWM5|#DPnNKOrnk6(xuv%9sEu;A7G^NMs)D!z`RYR zqoW_7-4#Hl9hXxL90yDR7XzOGHUeJ&a#{X5U=TRe*riF_(fnT z@HXJ_K)S=Kh;TO@NOu*$+kvxzcLA$`cLUD@eiP^h-V5YF6_>pZaHREJ;A-Iafvvy? zft|oTz$EYoKn_421?~beo>v1I-nGCV0-+{Vo&>T!kel-bTf`N#wfDs?>c<)1to{`<=y*=~X7 z)OKA~F@UcIC}AI{xDF=l&3S1hw$<#T{ouhvP`swqvT0$8Y1n?2b5rW}iW}ifY}4sj za$wWKRH%IWJM^>UV-(6D&A6X6D0O`5nB~wflt)reK{FI8U$Upay};X1u%=>BcSYYT zB@ber+>F;dW_c=v6`|#+AB#v}QD_CIN8cc)m)BL?49_u#9rCsfb=!uTr#;(aPnE03WYqAlIV7P zvkc0W*YS6|F#QF8KaIDL>+dFsbt@>^GYO@}c(9cDP-1Z%l&yRU-XGyL+Rp>8wnoVo z_d^T&0(FW-e>hw=yVpVs!R|_veUgdBfm=Rr;C&6RSryGV)9)AY-gr0?k24^QEriTt zq_js9*Z9UL^)TjGrK;59(irx;;k;T2D9lSq>FGsMCY5bFc<9h&m_mtZn3xs~szGyF zq)%&ht3(3RSP5hqe2WA;FQGNsfWHKu27DPvo>ze$;A=qU>3(1f5JUZeZXkyG1DkF12IP%cm`Mkd>)9Y!T|HW3`nW> zSGdP+4xX?Q(t>`;VK7Z{7)%q^Ucn`4oc>7KtvZdpqoig2_V&zKv&EQlT?}1C%qBA0 z*4vZ7<_{b$ZI5CY+Gb1k2tB)yCvuuPU1>ls7cxUdNfX;}89(TI$-M z*`b1*Ew#Dy?BSn97n4hnm@;< z#z24n)S;(S`*!?c+p9|sT(STH$Vnfc27mJDRA^eN*|vOz!IR|uP%}+Mz@-h#g^b#_ z-5se=#g5&Z&R+6Z-xPIz}zD^nl1HUS`6Uk5Rm^N>jYhs={Q?J%!RI#zt%v zz~8j{$IxnV#$C`R;qP%K_p~ooLt~ib7WNYj;)R`Xz@))poEgU%z&&}17s?fAaKtHB z^D>t~wv5SI<}&MSw54<#@<-j4HO(MUIOECOltmRwROALkH-h5#&FZ(Na`~po{w0$= zI|x2>udT3&!jWWgz>{L;WV~;xv`5hNkv$4-X&smYdj(Y{-|VYGt@Ol zBG}X2v)G2M8om8Vo2)RlP*WgaxxQ#{ITLebxwbf4b*6o(RcxtkMrYfsv;dtf1nAU; zl}$Mp!l&&xG_nBYQdh%Du5?|tJNes!H8UYxQx9u0h&9zLgYFWvv<#x;cndFUf%a@v z4Y{PudXv3b%Cwm5%~FQbL_V7TW+}5$T4&fBrOXqsH&5FbXG)n4ydN&dANdTkQA=$3 zJR&i(1}z+wMQC~{Lk+t>r&x*^Ay2f_H^H?StB8F)y;_WcOiLx+NqF1v@(G{?q0%ai zKuU;aASDEJ>Ow+%07wbZ3XA}u-y66P*aBpEM1e8jIw13ie9Zr^YS4((Y%0tU1v8l% zw?of9iU3Q^@i9gZ4AT_VxfbPNXjdYSm=<$FEW8Bkv^-feB8Ytu(-5KKQV*LmEOm^a zA48k03`3+y7g=V=$dWr(V`BjROtTI|ILay))w8TX(#hO&U~1~eGOAZ1gexEZOJ~Kj zT*YO|*fB4q<1*%@<@i*6N|RA>jHO^KZ&qMYV5_m~F8>;kwq&mH8MbHxz~$;XP&g{;lczkm-908Vn!CSB?q9pg_wOTCr_a0{OBV z=F^2voIdpdj{ z0w#br1Frzy3dFWl1)CuTz5%=qh{a{)t3WIUD_;lx9(X4Zi@3_&KrYjL6L>E0+dvNx zi{Px3=Qlg<~_X)&F4kxuK^Y1?($4xM(5 zPWyyTyG5scQK#Ll)4r|K_UN=9=(J~a+VeW?S32!=o%V)KdrPOW#MJy#O~^l;#-^s` zpHAZKh}&}kl>wp^z*>9nX$i|MqBbXvbo+pg1g=(KBe+9!0{EjsOsI_++q z_HCWEN2mQjr$I5G=D{mEjbrGd)L3ZRu+25~L#b?=ux8S3o_<}Kx^xw0oZ}xvHB_2* zb<5wMY}$t}W$=+AsO6`nyfagwNMu97$_-;MAeZ|33!#CB^A7SExr>S*u5fBYU2CDzioeo! zGfY$9(zhcR z4>nMrGbL4Tv7*k&*M>22u?&;c!GmLxXJdu|g*d*@@O=7oqg>8YIlCEynWg;X?%*=9 zTY1kbMPv6wmh4N+Nj1oDa6DdL1miYLD$Jqww(C37-PEujml^}bIJD=1iiq5IxsPca ze1x{F`vZ98su`7mg<{o=Wmm4a@b^hUV_8WWbNz8a`?gNw=wUnFa&gW>n&>k}54Ymg z9@Zo`UX~aiwn+L)URJvo@EYwuj~0W|XrRj4_7ju+E3hwC72H!`_hSqD@oH!c=P?U= zt%bY+yV=2O{>Gu{3Y?}zeIJyCUtTX@wg9o@Xmkux7AOnVHC5(0dfH8kynJ@+Zb zyK(Mbot7X^pjZ)p8}L_L;6MP++V2>&aXI zEEmeQl})(avxM*H!G-u`XaHJW;R#+h;aFyFjni_oZ82p4#uKa7p~j2X7aM}0U9 z?KZbaGjSZ1NM(r=w|8^I@BuY6Z9d*-_!jeB%7tE)NMO1v@lL|qhL_KBv|BV4XOFY zJd(yeWs>#?f@{v_Dv?wN{B0Szr$*r|Rwr?y{%0_4!f?!Y|V3TYV zOG<0eCQVC9=mGa3HP~m!4K$Zd+trB^SC34qJ~ZTAJLIj{>Fo@rj>QNB>h5z3BAgfa z2F^RTI5~dskbT?h_|rc%*T~^fH~I+-L~u?DPx`PH&b3|ktodBqWzQPUwSA96{|Dc! z7N@}5_IhWx!-HGs%aFHH9>Gg_Z97BrhPoqry^S}+Vy|}dH$?L z-ipmLMD)*)11Llv$8gRl*-?w04XgR(DR0FRuWi#ydNk!>xDn!qVOJ+2phhgk0XNPE zRbDxT!eVE$8m&L#BO_YHARt;*jFxtI4KuFN4RhsiO~!6+$&RnSn;E;oOV=tTmt6;{ z7=&??lQ;lVy<3!>)llpJ!ZHrUw&R;`x$+78rL#hX-SO+f^lRO89&+(jLFWO}4tFn@>^VFuREK9L!2W3q`vNsI3U(@kjN#M0 zad<|(WwS|yGR}1SGBE$`P3fQ7V27#ga$?xpV-TW;HA2f{lan?wt1yhr)~exZBePSH z96s9j_YB{PdK68~AL72xPeo02cx;2QCI)30w-qiJk#F@Y6s}x^4tg zl->lSC|y`6_ZQrZ@2m0sci?ltcY!|#9s-J*2)?5bei4v6T#A9*A211cHt;Cm0^sq$ zIB+_U1FqA7)CJD~QZsP|@NwWwAQfwKfjC8?%mcD~86Vcom+?xGPLmYrG)a*zX%y*_ z_BquwiD%ta+MPP>n>vjHI_dUFop$>4c);nZt}IsKo$Fc^`8gM#7MBch8&+1mGK{{& zPAm%f+1QlT(<{Y2)+{Geb0fxGlba)$bG~8NSCuiv6ldp8u{^?<-gM<%yK?a0M2Po; z#r>PB4-v-h+Acu55CmkeUXBEC7BWGwE ztD01Gkl0hjqn#_|sZKgE?bh1yQva#KbJMZE()8$0%57}3;ufrPu?6ewj8IQ7hYFW+ z*Mr=KrG89B0=R3qP^?K&1eD{49&jv3(CqjtXE%CjO;=$tyF9ENT8A-PCGaZXe*q~4ndxmL}B9;pIk`SZ;ha3{3W}Wj!c0-a1e+I6%(iLsYxyPS@=N8;uqMu^%f;EJUESlb zu{KkW2syA1nXBsAA9Z!f&%sA*kir*0qrUWJ*!Guhn7G#^2FI*=%7H0MnVJ1_1esDs zkg+#*47bMa`q1p}aAb>1RMuPwKMSaNFH&?R<$;M-dPH4L7l~ct9C8&Z74Sw%$yqSH zj<--;M)rM}%5guRHX!93SPnj~hH0E|`x)KzMVO>7l$vkhy%n$a+@l(h7vkaI^H`Y3 z3y;LXZdz#el(5IB5_SyeU#BG=&7KkxzY8L07{LjRy4k)|m8axl?D!bnPcqEk**eXG zPsW*X{3hPdm*J0mhSAn%4iY#`)CQlLV`6Fg14$c3XU`ct=jDv_)rf#-6yo+5&dU?3 zH~PBspFq&0D(x8mO1un@(uvPxNC4(nDR3t6T;Tb@Dqt-TXBq}p0p|l-fQx_><__RT zfKK4$Ko@WbSO=uv=L0_hTn79UuoieH&<|w(k&lw60EI0j4^2|?&{V9f$6ra?sG5p} z%0SXC(`kAp;9^Yi%L=xB!xwe^L_TxP;vMStNC5Y~@p% zFsRCP36fkZu)3%MQ{6ET4nO3EPouspWAAwh5;__M8I>k{n8|$Dz@`AT2G%O5X?wGR z>_U@08<=r-d6R{`ad&xxg}rg#C%ZSZf{bxy9NX|7hJq|pKxduWJFMoV?K01A`)3Fd z<)b$_sT5x;i1H89#6~v}FNbz~BB=Z*R^tuK$8xKvg@z7MPY{g$myF@ifMYyD~vzB}o6C0t-%FI$@OTZ}3Qj@j)_ip%l z3t}bDrg3PNx~w7qXh_{y(Fo*;vj|X}SZjk}WkbX~0YYKzqaUg3DmdUkpNPw(_j)Tx z8)~+3PH;cy%JxIz{OyTDm!?%ptCcqkpu$vf zoQTw0@&2U8Qr_|u^dLD|!cBK|50h z@XAwc$HS&jsmHhMOF3%WjxXzZiyyZ1ORMs1^sHdak!g6Rn(Ql4E6aqfywj7y#^}BW z_7l}UayHy^jA^#lR5~IY3wtd#Z@@jrtmb`&j5FQN0^WvBO?^h_RdG%-Lze@`+M^{N z-{{$fS#2|(FzIdWLaxcKmHPv8oLJ)#Hu~R>S8Pk9n+Krj`xK^L=_71ZkMQB#MO!&5 zHAInVu7v%mc*m*qjcC;HMCk{Hfgb{Lt$Z7>9e4?F1MtJZ&A>t6#Xua^8`uuK9JmvB z1@Ic+5by@zF5r#8tASqtUIV-xcrEZ-z)u111%4XH5#DEjKLB12d=mHx;B&xF0)Gy? z0r*Sc=YW3(-VEfB?N(qJ@QXm!vo8ZHfOi5p7r6__GQJzgI`lOlg&5~6Qi#zcg&0l6 zyv$J8PU7{2!h~z-b=rM8%|eK=Lr+(cnJ8UNXi2?{u9l&J1&Ny;X7Snrqk3lLu=*LO zKBib|XUxLluY3OI)UkgRikMUN^Q?xoe0>a#)q9=+kqR2@YoE4cZ{parvV@1_swe;l zq0>=HuHf*?5CNm|$mnG#l4{0w9~_v2u$B9Kc#Q63Bz77+Kl|X=hgU{0hkz1j$=?3L z0+0`gBXA;^%_E)rQxDk*^-fZ%cc3!Deg_CaOlPn`C?YjHk>x84;rELm7zYYM^_<;I z6zND~9X5p-g0B}QDHJ)dJx$Oa)@i?niPflF;q5b2uofz(W4oqQrbM zk8$SMi9LV*>L0X`!`J(m<>qkP6euVSiXUxNQINU%O(8DSL05v2kEZUS$l{}IR(Mx_ z>h>WukBsV|g({7#%nyp#3cRyb`aKXi_*A|RWS6rWSOt6t=mkCsTn*d{TnBstND+(E z=HizN3X7zueG1=KgN}j2z;(c9ffTJj0e%_yXW%!0e*yjo_%`qvAl?52_%nQS#pjp6 zKLB3_z5#p%NKyJL;5guGz#`!5z+&KUfmDP24mbt)2O!lt{|)38UHU%{_zu3A7k>qM zfw*B+T!C;1*oE%`@LdEP4`h9zJJ$7SFiTNPlN7}?6^lzJB<(7EOWO6S30q}#8dW}$ z?{=L=K`m(y=(MMG+D~*EtAbh|7u&pslgs!a={Ca!q34L7sMk4Tu*4P$UVNWvp)T5r z4H(#qukF9UIcZzeR#n-RfZ)fB?i?%az9BBg&O=lAh^t4%@j!0A(RKSp-$i1SrRvDk z5y6!#H-oU(AxEb2rkDeZmZ}3&GRT3cyszcJ)TQdURN8P{>R1ce0+8cUdC81+fzI+( zDaYEugX5Aj1`m!;+6E66CQq`wKL_JVsDgGb@7n8_3E!}Kj88VWO2oHN{J4k|i{n6} zFl3|Ap1V|o6kk#pl0;rsT2_4Xm`-!^b=ZBi41eS^@|Z4{ibV4PII@a_gEYpLLPiYI z^d+=?27egGO1w<@FI0Ll8Ul@zfu+Dw;ITk>H$c8)fzyFgfM)@Z2UY=30?q@T0$c*L z0o}mUfE>G@0pwh97O)9;HjskmOkgXp0=NM<19%Z|CNK#+7kD{vE|8kFYT!-4g}_^Y zHNabe^MPLjE&wvmY0m~t;UKSbrb%AsOjEJ)Yt?p=m~Kg$OS??i23;zf&BFTHi^VM^ zXfjpv)epnf0ePN$onlzx(swY5%Xszku158T`Q$4l*+`>;aYzm;E;B=WHmU}zUL0O3 zoSE~{?9Cbws=N4T_GS$T2j_f@_C^f|XYhQC_C^iJ6R;cZiw;hcYlX*hE4$&qy9 zqdWP^DGHyo>VxXW4ndQDnEz~G#dulS`7A}nWZrv#bAUb|8;~E!9ykD`x-kT#8*HK$ zYRBck7`|5k83yUh*BW>xdn}q{k42L_@hWLN@hWNTyCm&uon|q4FlK2!st>VQXT)pJ zPan9nYoyE22Orgy`01O_?TD-KCUoXk1aF~2QIjdS+d$DCYL57@ZSdhJmRcx&!%Ic0 zpGJG*P3W2i&uDMF3H>_wQE%Fx!7v#H%kbVZ{E^Qv^;c+CTg0z*n-?D`!__BS=yN2= zn0*_e=qg}+vb|Pw2xOdC4;imUynLEbf8eLG3OF730U+z+g+Lc@4bTT%2do3G1yXQF zflM3etba?9k@C1LdwpvW zs1VsujqxDIWRNhsz@-leMKbLpOWKyXxc_zh$+ER$JCz))&=+Rr{_o+B9G;NGxz7Ht zlEiUI$&Sy#2r@?``>(~HEFVwT7q2FQj~RZTTdrEI$2SGRfi+f+DrA^+gk&ffB8h>} zTzs>X4$R7OMAk{PIy%#8@WX4B{)sJX#BDO;l)=4vgHn&890f-o!z)`96&~fvT>QOC z&=%saq_KtV5wvEV_Ia3?lZDD{I_;-0aV}CQwv0=+lkv@i2!#sw$4DAgAhm+V&Q{Wx zc__u;oKLKIT@t++@#Q%h+mz7WP`JWkvB>*pE^Bs5fALJzn#0j&WjPt^huq zSF29MlK81#EZJJOY^_U#pSfFh<_edlMw_X|A5Im~0|Yu3lgi*au`!l>}}EZUSBk+ycB3crox3z-_=AftLbr0bT|CCh(&`wwkMf zj{-jq{1Nav;7@>`1ik>g0k{wN86bPg&jSAj{2Xu$;(iNoBJc~qNx<8ICj;*Qo&mfY z$hlp?M0w5KSRi|b2|yQcJTMF_1hSk+XEu9i7RRP&lE11)Q?bHvm86}gnu-R0O!5|ZB9F-QLLhysVgR41pY8Zd|JjDaG3jBQXnEK<)TL}Jl~0)AtSyt#wXGX6kGc~0MOSsi$HIk4MmLdg}JKOd^tLFZV? zlTm@9&hpew?ikh=-S=E@UFqBVp%JUt^VdTD;KHecyMHqFi5uR2C$(=s6{obqO?tTH zG_`Nf|Bl~3B~2@lv~l~nI9mOe)bYFA^Xwb20T^2Yyu3E6p#QRgZS$6KBk;TSZ7<_b z$z?rQ+jtaw-1KX|j|oT}%6C7ljgi?kd0@}4#^3kn6Q9`lHkL&uq<**O52ud(-TrOx zO7}BgA5TV+SHvIxBi!l>Et-!9=IGlPjC#`p$Dsl(7bTZ*Hi}n#m5Xb@V31|}ELL3x z;B^ab_0n${9DIaT^JcOh(&ZUDA6xTb3yo^KU&w;Obi7<8Y&#*x4TF>NA!p@z5!_;fK{ z(j;6t^20t!x;7WKMuB5XBRS52?IPj&32ZE%m{@{>{6N?)gY7Kf6SQk!lN_61s}s1p z4BXqWNnbvKZIN)@30u9eeF|H(uzdmB*}{ec^b~HdVcQ4W0^!P;8A>Kkq-Ptr36E~# z;Tpn+-b}C!OvN{IA_dPj_+xh8g2u_FT1?VC8N*#)>fwbujzYEYLm9%z(5Ul^V!G33 zIpo1nuE;i$GLzzI@ZLMDHj>9ayL)>Yc~W0lP)u7hQo51Bi7$9ySr(FhpldU{x2x8m}p~_8b=B3fE%9v=^p(=4z%ZKXwwL|6iR-`@6GwSaI@kep81psI33T`3O@#I6_;L(69lsn7Kczj<8cq}0M40gb~0Ve?72S|UO1Uv!o9l%L|>`$Hq_&>nOfb0v9 z?l8bp0ohwT4Uo$lvjEw)X9Ly(l8(z{W&mCSI1`ZnxN`u10XP?sad!i94YUXFK0q(v z1Ayg#PXSf{J_}d{_$FWt;5&eIfI9%s2K)!$Yk)j!|4qOgz_$Qr1HJ>e6mSRNTEM>p z;@DwrC*X~My8wR)_!%IN3itvL$M9-<09juc4;Gm!gdzXtX_J5Rv?Xb$<4tXstmP|P zl2!;CHBquwqHIY*Z&AY}3oS%jlGcJZbxpF?u55CB1a()kb^+eBC25!9P2H8u`}2ei zx1K>dDNDMtC24j8mto*C4II-&%Iq+3ZUg5xaMcE`#lW>2IP(%F)-C-Q;7QFBv?iQT zkHNX-Kq%1D(b^fXH!CH=VQ_2~o2s^=iXrg{vCaS$KI#X7hR+D)9e;ueYn;q{O+5kZ zIk$T|aqUH*vBTcAs4dVGGE?*fLOrbk949Y)X5F?gZw|l}6VY2`RfW$moc5eqxMTE+6vi zRDhI&>WXQh$N3vn7s|F5@EE}F0Ve?N1Dpgn0t@9%1Vowcqx}44_3A}p$XlOjlea$8 zmL$3b68EX1i@E0^B8t3TJMz$2cqjV6^0M0gt*N+$HZ}6T+JOhYMts(M0~a|VT`PES zlWoI-ClVn+AG}Er)0whM!dNh7>Ea}b3}JH_II3oeV+yl$G~>}tm2OdxrGs>Q5R5p7 zLOBT_OAlSe&nX&utD(DoE(A-@T0D_!@fjw4sKm2=SfyuG)YwqeIyNSZGJ_SLFX8Uc zi2x}FOV3C=Ie2K$fb~(fg@A1I76HxxYyzab0YH`(Dn>c9MVlPjq76In@s>CabVyv3 z_<4EJQ9^;a=+j5xH}<{ksvWqWHw^R4@^d;)|0=pHv`}s81p{~IjUL!8zIKnu-n>En zgsopgF9fzN*w)>Dw0RXS z6(k(|Xp_5T>C6JcFuT=ZPVdDVJvLmDAYw;8Dp&ON_n7s z7H))_y#BI`JAuI!WGALPxFzMm?_b`DYb7?sJ0Jjm!xpc@}s<2|^itYKL2$tPSz-t@LLiVx@nIPkW;YI*}N*+5Hyk#DcT-WH#| z`AA;SwX$Z2p>n^ z#*4cIcQLKnR2eaO?HWr7bExnQ#JU1+O%F|)vjdn(XJ`N;O zD`&vQCtY-_e~tuC7uP*sD{M7zxklI)!S*v@WA~ZeZ){Y7?Mi{W+Hn09Y@DJ=5bOA* z>t764cAYl}*N*c@nqPLf)3xhiV+)Y3@eHT60vC^OwnCfm=mv*DYpk-& zPa3u&Nr0qfQGGPRy%LUb!d3pb@(L+4|CMmpTOp2v-yOqU|D|Q`>GqiJQW~~mXF~GG zUs}pc8J__B*|1tMF1y1O+vZt(3auMG^7uwlMs$E8|1sHP6sJBWf}CT);)+<8K1XdF z2zeEpmbEqqy24KU+hkZr>P{7%?JKcYHaTrR>Vpq|hPZL1tg+kMxwy+XM=3dNGaOHc zqwr1kbxp2)%2kMAaizy@xCX$Bvn$n)uwpg!>vkfIb;GpH#77>U_Y}SZEid!38;}D` z=K>Z1qOORQpdrA;_{K1`I0$?t;H~(^+)UpCfEZ#DL(dlja>#iN;OBss0DcLGGAV|f zF9qC>@5=yBK-gCR@;CEJz|#PK3dnWFsE=Z~&^3VP;`>@a4tL%J$X_IsZ?R$bc0g{} z{SDx!fWHI$Hy~QMzLCi2djO9Egp7S*J8rOMv{{e-&^PAkw67Jm6b^ zrvknWcp4z|NnZ}&yMVI+(Sr5O2mA=|Jivbfvcvru;LU*l0%Uzcn)W>c_!Z!0z^?&W zSD4OhUDqHD-Uo$0sQVT=c zwF)cGk(%j3^ns0JKw_m!iA0kR0=D+)Z0#qeJXoD^grAFUu^3qWdXdTlDijl2_U2u4 zV1+MQA0ByH-z3=5#ZrR|VJpU4w(zyE$rk=R*nW*fOBYj_x5Jho+E&>%LqDj&V|H(4 zi@XIk*fkN-!d0}e$=<>7u-yb)y5@mxt&lGsZ?@~J@#qHEFKXNI z!TL_acHIt0+VOZU!DDv+5DjX)aFv%vtcl?s$D##e$8!;$NPa!EJ#gbtQ)IhMnaFz` zo&hw0$_z1fp>z*dJ?a}28K`db$l)96%{mmFkah`zI8+O@vV&u%%@24CzEK9mRjM_B^YL8^$bnJV`#p$RuVqMmF?BW>Ykd1*tZ0t(MXu!ZOoYUAl;^ogy z|8GzoXHh%OJf&#fPk|q%HLu_{k63rBsb79HcH;Do1MZ#JJ7Pm&XK2L0D zY2xwy`)$34r99x;pYp(A8{Db3m-nu7AJVz|$dtcSZ|qL_%lR8SH&o}@Uj9Dr3H&@} zb{gI~`=1zr6FMG+ALDBJpX#iY4K`Xd%bwJSkXhyxnNDQ#{Q}2Du2ShQh3!{(62vlG ziMs;d_XxV{4LZ(u-ijxk-8YT16bV`d-c;kUcV{%fg+|v(RJn)an~G;7p1KJ4$lV$9 zBHYcpGm^ny7Q@}Vu9GW!X!P*OZ(i5A8E%oo$&{HgqU!yC-5Kga6M2_S)OcVj{8I*% zE#hy=yhnrQ=?}F>gEMueJsSF~S)z(3!=U_Be{87t5dm{#9MlAi9q<&u69LZv#O=s^ z4!~0Y=L4dvE!1KIU<1CV0xki}1jH|kHXV>^lJ0D1(G?e4$Y%m>!uKq|JCr+qEws7# z#;<~w54cU?@k^k&@ckTMA>hk^MS$q?YbAj10r~*r5f4A$XuvAKqXBCG#{=RL1hFx# z9uTTiTL8%XqFl^ts!G|Nr%iU}X_MR1C2lpoC5~;WCI9m5;h7dpqsX%;umz#3L*Da< z=2Gr#h~UCO812};5aM$lLrXNg)Mw$=Ah`H-MN<{P3N9L^#*dvGXp|(2k z?jz`jcyWtM_yRe5T~&>L5JlUMlPx|=SjhJ+S5FozQRg)At6ILS!R}fvfa+8&-AJRT_%(LKE-pBq?m>%9kwc(6_JIziiQl z!mfdT4?KJ7S68Gw;NQP4{g9LgQrD&RZyw?7|Cg766D$>ck)WiplmjrGhY|jhZd9XbrY*emNk=_8?Hi4Ur_f}!c!dog~ zH*8x3j*3v?s5;rRWp&dHdk{3bnxUE{HEF44&x&xTnmt_gY|+WpbTzB9@ zZGe{oVsuK|0N4w-5pX3SPP!M1C2`TcP~q1A@_+tXz@GzRbhPglz+V8eM&1l~7vQac zn*lcgQicBt@O8k)0RIa3XTTkRcL4qa5Tl!7!yHb`@6!;sdjZ)z-3K@hkbHJP@^M7# zPk;{fjo!4j4BwpEUk=E!K{{r}pJA6Ooi?e`X-m=`C6&N!R<;d=k#L~!ynpS6C>OW|2>|rljorp9@5W{L*WF+#8 zX3B0{A&=jwP-AN+=J{E1)X~K;rUGL`FQTns9nrUFquPk7p?_Q39yU2+YH@DFPGq2l z@sZfq9CIn?Igcl5bx##`Xag5aG44aC+Hj7X@2L_V$c6G#FvgPZZyTjwWPnqQw-q)c z=hcW2#=9ENZou^l^sp@;D4H2E1X~^a9RdCUPe$7aeKdL%VegH-Hda@#Ypd|k=En`A zPs@a>)m^WGac~R8a5rxw!JJFf`Dv7iGO&o#)(zy5In3x zG<#628PBf)sg}P3JQZ*sU;*HN0Sf^WN6KZT`|-_zlM(n10LB5fD))B4k@#K#m;lHy zMgcMn$5k;kOP*E>)ZcYa}R>GSNj>AH&f%=*Dg&xJX)$lCc?=E%kieXF$r& zV#+x9@X$C=dGMYS1c({ud2J4TO^e00^Zq#2=^x#$w+nlnEg0}u?2W|{}RM{lf|O%TUc>u|F1Pqr%d|N;GT(aHB~?STa5CmI%B> zSf-Ru0xr&Wl5)Rw%&wzkyomTzVM#MWYv>4cVDF;B34cuK!<31$9VaL;4Ri9HH%NcX zGP7pH*>>=ahbGyO`2@s7V(2psrhb&sG36GFId{f_GR`)IZ#>y$-;_qD7@MIun*)C6 zDK^%ywJ4v*Y9d~y^x<$!oDGR0OvT05=gWBU^Jc|G8Y%N@3Zv55ls>7TIgo_ZG*$^y z4GI6Fd`=Y-f>6trLBb|vHigB0Zk+8ByjgzUyluyv=+rn&(5!&3dTJbM*tqb7=Fljg z+2+go&U7xS`WQjM3rj6vTNGzA`EKX(QVUCT8#qq$#*(M5C z%w?Rl604wed0G`0X{@oZ3oczFJ$CoaH-))=t++^I<(eS4r~zo24&MzWsE73r#YGw` z7iEjHokA9vZ#^|o$~xCXRWV3oE~Z{Mtj~V>AN*D6Dc`BMNMq$6agj#)gahaeBQZEyUKu-mHfdVX;@IxC z$=>7A;}g50>keyioQ)bwCA>Dpu%(TX9#4s?JFLZVHr8>PL!Um>RL0zji!|1l^0zn~ z(--Ie)UL-$9GVGN?3lx20+=xK*@-h|1DO0gWlrE37+X-)*C#{!2& z2}2rdEOG^xp3cqZl)K?L>>Xl59(xLNr; zBPtfNKo{7&{5jP0W6SfJAenh*qsAi~TwVlg^N$Jir$cEBOd zb{F1Ec;~SXJrV7*Q_z^x$6@$fu6%Zg^Z}uExx#1yV{Y*agg>gG((1ljenB|y*C{U2 zSmVyLinD!*HmYOo$|RjD()qMYYg5rTQ0d`QCOZ26c=f%u_y&5 z&Q?Yin2M)IYzlKFD9=b^jRh(yxW0$r^!UQW2?#4P7W6aD_7GyB0>?PTNZ@ErS3diq zVo?s)IGf5UZRD9V&}_mBVfqypX{@neE`-~H-=8;cN0{pl#YGw`mtSz{VJ)0{sVVMH zC@#`ix#kHj<|ECeSDk@~>JomUxJYA7u}Wa#Y!O-Oq`8> zD>O&!I%##7>+gz-G*+%UVB&0gie2CI)nCF~>CoOZq_L*hd|={i58%xdyX3fQ(ZEKQ zu`>nDI7C-9uoxrL%UG%Md45!ioh7)Y<4tqb#UfQhqlDF)?v=(UXIXn7V2nysc(Z7}4yLiyYfB~PRD8E=}0PkZ>aFBTc{j826k%%UiH5Ha|Cig3jY*CT#cSRSw9 zB8@ed1A^-)#T9Sg^Up9>zv3c|m20u!nxVLsuf2L&m`m*Vg9~Y_Tr3rFHnuD@x39Pa zMP9GDU#hT3V@-iiu3ih*oc@ka!dz*G!4ZZu*0?VN2BX%f zxhKHZHsJwiS|o&}r?*_tBqFnpfsJOF5%(#|=Vc=9JPe2KJb8pZCs^XO0+{e$_8Z^d zniQ7sT;&gGtnpeYxb!^zex(}|cA&3j2Igy2O&kni}T=6CV3|H0^~`!dwd#7inY)@kAeK>=FLpHvs z%hVQJCj7DEP18}-zf+GDX2lg3Y4jB9rYeN7tGItOsLvZf71nIMKc5u}`|Ln&(vU`` zVZXwtyfBSbZUjx7jf)-l7kSz{Q!kHB4WK|ny{xCkM#J`y@_D0>+1w6ZA-HDXP4meO zU*E4wgBy|+7ip|z>`GwbY^Rb1CjRr!7lyfJ9xagEb{)a>Q((e9hi9I=_)lT3ZpB3! zYgktat}?u7*8k@XQ-ACZ#YGx9%h{x7j*O`(4X*}GoQ+GVnTE4#PLI(8K~(|G*QPYQ z+DOB{sj#k&O2cae*A%>I_TFmuh2u3@HRq(U#_L*O!l`lHJ$-11WI52ZM#V)ME7#8j z*DSngUU=vhQ0iRQDK64jxvm2yoL?QikN+dg^@`#mjg{+q!8H|cn(t=3X5t#dY6(Lc zE7vc8iL;$SN0^?zTTNx&qqs<8<+=eFlyI`Z%wKXpnm9dPs}vV$z-7wQ8-aNg1*2VC@eaid|oU-^7vRG$7)aOL7n^U|X2wPAVUkCj-`SYvTBFyR(| zMd!uPfqE=XS6rmA#^M&ibur$QaN)~kz0t9_RnVBnDsM4jajx?DmZ(_VCb;yra__@8 zqyM1G^OWKujWrgV1lNgp)BNQ2b5JRDuKkLOG}c)B3K%(t28FDxcC_O^B{DB=7c`u` zMdcIbS4J#mAE#sN5%T;R4skYB{j~dD9}UH?%X7KnA`Rq`Ygel2(;b4Vo>q%_3LN=M z%Nkb{Vkr$zeB=fo2S4h18oRp#Jr219$KlBG7HIjd3b)7A;HoGu^cFSvJmp2z#SWYW zLV7D&arEmBy_7}L%0&jkU%h8bODs~hVRd}4m#pRBu0Q0l+vn@ym z*@`0L2yy(*`CbZ?pY1r)IUir*V|olq$9#~9`v&0X>}_uC;$DI1u+5Q$$S&!uU>Ozzipm@a4zE2TDRq%* zd9cb45J~U}rXjs|wRZ&rdU9COw7oU7(h^xF5Ep*_ko0lN^bu@>N7d%y=W-anp%BZWVcdV6pW7qX)r#UQYC(m=@Af)<#s289SqZ|PWw^XeUCm%*ieN3g z+(94BW#p(6Wz30Es*aMh%Ik6z6#I+IN-8{#PFD*~xeT-i^K+Lqw)Y0|Gu-9*8Lq-+ zC4I2BySu9go1wx&7dt8nO3Qt|BA27Hpfwcq2YRX+JGxmH2K6G$UFPr?yPe)LuTyBa z{M@Flo}S)rgpi*pQmCl~)?80TVSX+I@gmK_%%zSZPg!A!%kMr2<`PG-531AW7P*A= z&8Wd*^=)+{tb>Sdgq`CrsqmG%i`)(_G*snN7U&$8v&8Qy@cSK$JD>|JZmvQ{K}Dg{ z>2!M?<#QOVsRoa(}%78e$ml$E>Ojyh+pC(>tEna|~Rd&`FJ zb7k0PkKa{PQtI?OD!qk;7M}~s9L2>2g~iSS|DZl&zf*p0umwc}F(|RH=al&?-0q5s zaz|lBO{H{dKqC`CO@PwDbp>5ZTLYTIjA{uqEmaPV94(*A(NW4p`9DA*_rip$Vu8=$ zFDWka6jnHD!k1I$=i(AGq&N;q?#1fsl@PhWDsn-I$6x4ll{-M_v^u$qD+;{D#a=qq zSey#HjzWKNd0BCJsRL_cJG+*5=I0`x^m3J-TkR||g{5M}DvZ)MM7-EQSSznNj;=C? zr=q0PS5)eESiNLn64`;8Br4FN07^K@8kUS28IL5YDD(QMD&;=u{M-=olDbJr-vVo( z$0WE?ItOT;qE(LH=`rOE+WZP{d0}CN+hOuh?zyM7#BMZfs?N`qJLC;{Jw*+!hZZxJmBes&}*GtOz2tYr3JK0>fz}V#FU+iT%NzR*u4` z&RTYU#YL6u)v6>EH-8tAzE2kX>r*Qg+`YM5>f$#?+~Z_KSs68_PEO`(4L?m zyIGi9eFd)U%zQo5RdZKf;w>w7Au(Iq7d2Tl;%uMS?=LN>D6#mE73l-Cg0I|JP+km` z5Y;JVmA1qRv1Gi$vHY>6&FgSgR1_B#AoOUDsY39SumnOEaYHzjqfy}8C61DkqJlzS zL2*=pYXzyPVN`n6UvDfV?Eq92YhUlIl)7+AvNGXrMtio079wenK5r`@eR58OU z59TuKET}O$o|b;2y8u!5xr+-*O0cy98R$e+p z#EpOuFhj)mk1XJ>Qb(b;%vn^13^V!2MoZrIs%ui-_lh2AuaQ&u#q~SO3d#$LJ&~N) ze}*P{vFf+Ve_W{#+(nKGPnj1#w1tsOR%MRERfH}#fv{)?<>Y&P^mZC3u@hP5DZgPVC(f_(QHP@ zqVqSH;>h)T`~}V;^r6MIR~8MIQ|u`!ca@-1OE;@ix!dRT`pVJJ;EF8e#9^-RWiCTV z#I(SeQ(X=@3dN6J5bDfS2Kb*-=t3(5yKIW~8R4sK^C&r$b&8 zK~1P`ihxyJ6(Q>k8f>G`yPS>!41E+8K`jo_0hi%Nb;D(K!(T^HadC;OqR7I|krUHT zWnnN{Vwa=D<8gZN+h^gFw@&2e>fJMlEbg6v#I7D*ND*@=vdZaq)=tk7<7!ec6jQgW zqO8c{EVcNr-&vtc$Fn%_6Wkgyl7!tqkF%txtlYt<^FU%t?=9jwgtFk!+3w{~mXfK^ z;f0{yQr{p$EEcaR(DbMdiBZN;qO8#^EyNf~QCUT_IIK?j8O0T5&)_@zH5gwTp7KKB zjcAJTX&HiQDCeKA$|QZ1Pai8*hjsYV%Xk6@Zx;>SsERt?U8RaqCoC<8N3V9w|E#QuUaI#F@t85J{2Hvaf*PO$B18;3Ja>h0s|O zmGAgfce*X(%22FmM#|kT^y?2O-ZGB2o5ZVt`iz+#bvcwr+{aVBvOC~_$`fhIBxM$; zQ3g4T5v>T!$|GV-C*mKt2va1bUS~yxSM;JR{<7;9(N-9R)#XEbP~!EKmX*e42h&Db@_fK0igq_n{6N08C+rQ)+B3xczJ%QKFm8HY}&>855I zT?Mz(j}8<@vMgSgbs?%qsYWz}rqLO5go_GFizFcQ7nc;_ zFDxQ!BzIKi7>vl83YX90DkwDqWY?Yy=p34ckAe`I<8)!paz}Ytsjsl2)TN6`PG>M2 zq$OJoMmO{wdRzV?uk4H)#VE`uM<~VIRde_!tq`RFBV8UhdhzB~tCbT)kT@z=sfOVD z@Y*trW}3Uh5$&2#k76ptUFh&ROT377f%z9ReEy6jlZ;rS>rqfrP+Epx5z~+9;9Qhl zA4CZ>vn(7~lUfI42aN%LEbx!)^%Xe~LjG)Z+K1lx(L0qw%>3Mr)^HraP*~_IbKzG% z7AH>t;cqqmyU7>q0H-w`|F>CDfWKy6L1~Gn81tUtzkTs{6h1)$DpZYFoR&MwZZ^}i zvvX(6$ef*>YsT8`(=#(?%$Q-f&zzMtd%AF1nB>Fx1eaWSL&asgaOa&Gw0b3v{&u8hI?Ss%h(7{PM+BWc z)xXfZD~fbH?y($Nhj4K z<)FDn(Sc2i<=;!d-wc}WGFV`^vP1Z1T6ac#DxOkztN;=~Z-trQc4_tq0Ays)P?F-x$zc zZqx!9b}ac4A>S`Rcbiy~Vk!p_>BpsZuY=}uMK_py`#?9M25a;1&=~m zX5&b8MAbKj+XK1*MLSryUx4nHpt-zG`Z!p)xp3a1Xe4Fq^2`-%-+*q~d`UG}xH(9_ z0?;fwQ_>9pxU-v+Da)I&!#VqXd#8nDGo z=eK~L0-E?mq#C>)wZLr#Xl_z;Z0cgwqvL_UwF&u)hi0(!+X1)NL34jIsRq~28{zgU zXc_~8OteR_(q%Ow_-oLdxny}N1;&u zwgPqJ0!eoiK&<}8T;PAUO48`>Sn*{(y*doKNuc{+7<8;3qb}4#lrUDfN5JXCVbC25 zx-*7BM}2?hFzD#tg~Onud^Ze(ZUX4;83x@f(7hUqE<#UU0lMTq2O>Jx+fGZypLJ_xOeqU&{VCFzEKay3ilY` zf3IjHrP4zY;jTbH+d=18C#kqlJ65@W4GA%SJ#;x0Cd>(VVud>q_)9M*McBkDe=N^; z4ug*A|MD>CGC}wHFz8rcM>3O5CYF3`r;m$87m_=nUAs3Z#(E7z6J+= z{zB3*e`2Md6Zk7`kTm*Rw1W})l-B-h)qdqNUx{HT{Re~Gs67U|(wfLP^)<$3h2l16{W3YX<_BIwRhwD3M=xYRG_g66Z^q;G@i zmt)~vv`NzF?^xk-*q}LrE>?W+K)82-uJ(56TQY!%Z$y1#Jhp;nzoHu~9^CtI*st-w zb%*qCuz0ZF^$$fODH(3`cnQnj{s_8Q@nHI${2N?J@Y{%RBjWKn{R7Qszms%~Z!G`V zuRHrr+-!80q+|VyRSu|+|E_2xW$bt`KjQzOQ%D#qT;@kP=)SpI(hQa#%-ZHZ;`E<; zB;8=;`3v~x22IX=l5Vi_JOR!RC>lwr;t`?OlHmB}FzA@?e;)>24(L9KMHi88OycA2 z$Jyz4XqX?d(k~VH_CL@Z@{k}4_YWfcV|=dw%^wxrVC8uq=$-`4mOn}VjB*g+-!?dZ z1)7JcXkZfY#FCGvm?S*{o$#0-6K592Dp&0HKc{FUW$bcw1M>H;pj-JDNyT~C9Jv=DrsX?B72@^Sz=Q%s-A7$G?Pr z=gUL;N4>iMH1E73=?2rM>yU57uVSa+8#@ABja5QLfGg z-N&FScuV>QF=FNi>(N5c?0Z|%4VE9r!Fk#{IE@<*&0u=tBe*RDjr(0eHt0At^LG(w zmMOZy@`L%?2bxXqN&g0ukN&*@noktnQ2u=lnsM(B?H}`_1T@PP-C+J*4TpyYk|Wxp!wg<2>(nwH0e^0Cv%si(chdu!c^61Zcm}J##in07UWHA zZ(Y>X-4U8-#lp!|Rvm$?@VU7OvudI}9zO2Db2(ZYk7i?=p}ArlvtD_iW7Zp5vEynQ z7HZ)H#WT`ucFqq`1CK^`PKRZ!O+8(~uEinyTFn3UXi154 z(zK@K%`uO95B4CzO?n%c?a@9A2CYh&$PV;8Is2Uy!0>}_nf zSB1DM&^~)wW__)zeo<>@eN+3izzT48G;32Uvg}hU7V)*xKGhrRw0VdS+a)%(9(UvR zG&giN_Jmf}FAufXw{|wQ_cjLxp&lfHt({oKw-~!yhr#wkXnR9qE*(M*-+!@+1{Tam>mS<=2U0yvWb4BKi%uHbMS?j5^d}pIv z32JvmT@|e5*z{Ch=A2KgtFpSG(pm0qpo7bUFITbCTi)PzRyrGsomCB<`PHx$Vu7%m zBr;5&$64M$t}IOeOQmC>DcMXKBsrLH3)n`I_x2Hl6rW{ePcDtBNbh^`-?Z9(4r1ISI+Vd!^Y*r(QI+owW@oz-feTJ5(_UEZ9Nor|0$oIOLp+)R+* zd)D;X0%CoHgjteqdRDIbo+)9ra?e)ovm{?uru@#zo+aqAa&i=u{MpkbUv{qi&dHK= z2w2eNW=ednqRX9*8U(p=Rd_QLe#Uf3KU0M_GgH#d%#`t&MfuD8_Nkp+?OjW{>{A0h zJ=o$K;5OpCZrsA!9fD$=2zCF1RDn|E&;dW3H%g6ohtfnHXwnRFImqFLajkkjLVK|P^TosiKXbq~Mb{oo^CH%@lpJ-It-b3MapH17JQr@K< zY9La9C~I7~D1fCeI+14EpK@j(h@bsYY5Ty2A)YR0Q&S)qM88&|Y#P^%X@{uK5t`Vv zA^asroN$&nrh^Qe{#H2~=yg~CN(3Z?I@}ByFiUwS)aPk-;sgOhSpQYwYPnzXL0lMx_ytY!SpBR%jtBv6@X{ z%K{x;JuAcLc!`!vXGPxKjqa{ZTgtHHehe%h6ah~}0CYsaVaM?PFG0i1CrzB0My;3D zbPph5*aIx0Q;Y9}2X^JbC<{$f$MhLXi_a4j$194&2#Q%cf$qiV2!iY^oq~mXG^B(e zqKFova~yC7+Ho}zb7CyYeTufUGSuxtUFI<_C{Bsu`dRb}XElW2nwZv$MD4{l`Z*z# zuf#OFLXd#p2tb4T^cm`#zvlR!k%RBUlz(-BMU|nZhPtkv=2^m568S37Q^6w;EY|#J z@K;x&5+|mOMQ*ltH8r*eTCqBuyMTL}LPEfaAg%JAgJW>vaM}r= zsxg8fVKRK|4z={4qI4{3qOT|jiD{1j-B9gsz|JpUfzwrrw!GF`Sy8S{h2xWhIOgS@ z(c8(bA(BjrOt z=s7hWp4|^={N|W>(f@IlyF4P@$Zqx&Cr6$DCaSH<06N~#FRreh;^v<6-i`paV7ukc zN*uwPm^K6X=W{iP>+%xQ;uwyrrVhI`praDgm_Z0usXZve#I(Hk@7X zFSc`JI<+@7G+`Ie64dUw(AtSYl`U&(XbfSS_@Z8Hkj=}3LM!i*%4#AgPztpO3e-lY z&LCo)7=xxO7zz`e3XdGoL{fD?tw1$}i76NLTtui+RdV6JNW?h&fBS1Ikccd=BUyB0 z;-KQNA~J*U(-TskN0Okm3%eLanP9aul@#P2Glog;uB)izJ%)*C-3Vb>V?%o@E<9vi zzEc$l>?iRF@^k44em5#{=v!i%UI#_!=TbVEr!1H(Tc+Sp$tWU~19wnCMEcKS5o%l_ zO9sWcnKBpEAc`!HccEx44=m~lHRa`n+f3|g!Ht%QX>0*>SE1SE!f)YrgNc*cQ5{8v zTO5(SCb#O=rlr-b9RalKiD{Q2aNR>($k($HV-8)NLb<$w)YF}e<-}SBnC>IQwu8^xi^yKROi^WYnxt2GgmIG2P+5S7 zQ3OSqWczPqh0%)$ijuy%xaqN`yg`NTplo^?5{&^N@D7r&ZoEKgJmJ4udus zgnv|S*kR)=ukkk&RaW5bVr%OQQ_@T7M4=K{*?+6EMRq>e1-eUjH2WzU3#xh1xe?tZ zs(R|~;z~~y282cH&Li(tX9tan=k4{ z?|=KemRCRg`{IFF55ly*q#Y(_0?eu4!ipeAne!znb&l z%(KRRaoab4b2hbW+Rp{P<=N%C^B2F;H1W$aQ1% z>wI<0s%PN;2>SoXy_t7=Zuv{$rmd4Mx=eFmQl6LlrP{9TyyCZQk$1Q_lZ3Pt)EL__mvV^T@wj+dp5FR{TYK#ki|*-5X{B zQf-^R{_?dhw|9BRSld7Hza80xi7J7A@xM1tzajUls+NYIte-pLn!jP;x4_?7o|-=D zw-=pRwdI6g|DyNXX}FkO;IIDt)t_oNeLtgZLHFFn-*5aCCP>k=rrH)x{p&sFw65Iq z?wGazd;7)ph*yiiryjE4OK;=Sm7(slEAkqfzQ6)jfq(XQryaff(|fxve?4*WJ1cMc z6jucb{AGKS;@(VtJEM61DR&>S?mQ1JGD9Ax+7>nbe*4(J-xt^TUC*}u&wqIZCOHJ& zu_bOVG`m%q?1(;m8P2it%z4LrCuD5)-rtpkQ9yopn4hVSM_X^DDHVgdp__ymvEk5y=U&sCO z{_B3%b_*8v2>c0I$6bH(dZ= z1&@68=!Hj|v}eTHt>@0X9Sg+;{`|)}R@`;-Is4xD+0Dm2{|qM^Pr-ags_j2{-~MLW z$d3kc3yy!WD)HWZSY#vcw|w?ae&1o9ebc^b-B?od@h6&gqrktO(sk$K{on0*=k7Pk z{By2A`Fu~{?`iF{&B{CXcN3pVdHclqEiRN#tX@d9U3Xjey=T01U;JNPlYTk&k!O+4 zXA1o9^8b2!plH{c{?fXM_rIEqN_oA&UpV&XdEVb%echQKj=g4U+S8jg?QMZy9e91& zlO>aW+jdX+%ME^Hmx@_HNOXhSbIyC?-{@%xe8UBw6rKOrvtK=O z{yRMv3-$#5qs{Mc-+bA^*Y~~E@pSO=|K&h_fq!%F*4pu>biaFDaDLVLz5B3u zDGs_I)plp$+Z&4hcxBtA*S>YjcfYz3df-HXzinsLqe-1h{&(*26N9&w9DzyCg#w@c zeCNM+Bz84?wD0DJ3m!S{Tur-K;GcW{nP)y&`qR#u^&f6}Y}8}-VnS8mODEiP=}B3m z=DqSj>remk>y&43A^jMJ`@fUoYr2jNeKap=#`j&yT|-pun#lwIgAHEvM-6wf~sw`i<6#$xDHM;pUYqSEM~~)K6ZmZK?F7U5yDr zj3=eqzP{LZ&xq{f{xHEGyy1`~*=4wLK;SPbTYLYQqhFtJ+#UCo`cB+cu56p-elWWW5 zTvsqW*R{-;vZ(J31{xYWgRRqAhVlZFCBb^0#-a~7HtOSk_1(diZgfSbAG8O-?m!d% z`|!6Elm~l-{!hH>?Zml12kp}$+#wwbHcS4fOQtz7H|QKzJ$?|DHgGcSphH(FebD^K zuIA>Y%K|+^`!Hm|2&`!8KKPtK3_1g$&JSKbI=~36!rvuR3Yv>fF2pL5;lb}ICjv& zcXUWSeb62(>1_>bksnzJMH4$*KTzf5Di2d#9y%67CZlX&r3XWbU^+8WUK@ZiKDd>XtH)T9PVd8{(W0j=$MOtAu;OAs6u6Ll_bU80UB8!GUo zu8t0PO#Ltv8QsI}c+8Lok4A{M2pn`Sq6njZt$JZGLmpNOt`=quEyj?wzcC0g4!$-( zdEoAVB?sSvFAa5=vT3j$#E?-yZ?3iLM-hWlck;%Mgmn^z$YC7_yX_w1j9IP*)?X;9w~`JQ*4qn-5S* zhfZVJ$_@1=J0$-~3;{DMGO9D}(|Q`K0*yUQE%rI~j6iF*oyY~^BPc&|?5Eo2{196B zvuK6z2P>cG*AHcu;bK{o66DAECPm>Ys)LthI@VNKg*jONq%WoG^M){m{6nGL!qGk|tUj-8(K!(P{_w4EQn<*B>%q z8}P^Pe`VmQ1&_zmLBoKin2`Vw1_Qvt(2b@XqhuIh7ql3B!xAQG%H{SnS* zX{ner3LE-KKQKe2-JNdW^$DSf8A3S$oR=39jft{DQw<+r(dE!IJH}bZY6)rohKPq^ zodXV3I8;kcBf$wkvG;_I6K3pZr(r};n0J96A?}9Mz62sup$RDSTM(LZXAl8{!Q4I! z7Hb&n?V}Jg05J%PP`MNzLyE$dtevlHN!oV?4g=Z3HA&;4F62no#wlBp$RCk6iThvK zhVgpLf;>UNBXcL5c%&ITcciOyH|Nd4*k?~=RZggWe$)#z5uQ*`C+-ilt&&3 z6Or<>6q{d&yd7@Vc@7pfTe8^qLR*q{w}HD) z+4P*kr^y@xyG$Et!`uvJe~Dv7;C{XY?HhMSybT&h7UaGR5jO*$-X{a)f(nAdtkwXZJiNi2u8Kq5@QQDHU|C6$}3|_e+qH8XDZ^ekN zzW9U1Pq#IF6?3#83cpxZSe41eirIzdjEKY`4{2B)eib8eM0Xr3WCR>Wszl~G^L!c} z8Clw7WNAahd>Qd;o(_#>gFL3qw*M7F-)F#GH>@Evj0a7m!np!CZ$!Lw9yY;$j1ezA zqx16IEY)2rhm-Y8sWjD^@-A-qlPwxkr31A*Xd7K2Wl~sWC=WN{QGe@kn~1_d=Mw-a zC-9;r&4yj37i}`VXp@CQ;#fE&?j>bQ)?PDk&^toiKnW$>F}s^}5A)@mhd183r$nwIL|P$dOu#m6vz0YDjg2Ex2n0$8Dk3%juOVDN^JWsz!j47^nF8>@~uqU zSP~hBDGIqz)B0#_1f;rL1W0+C07*X=k1Ub2$r4Fhl314`aV&ijH{gtK!H4E=OKKY- z%3=T3)c)=JMddDnLjtOd>~M!0J##W2MQ)RctnjPhHZLNXb)Io>OFv*TbKz!9C#F)% z11oSKZkO2L@PiUtujJ;Wr3{ftyI3XdQozIE-VR6^J5fbvmG_rs1=-wkl2v?eT38J#IANa`s zS)FGR+)heYjDxm1Ms{*X+5s~2FxAS~(8@6Sf<=rUu%+=EL7^DI&TM1$u&~l(A^8cj z0r~$w3y^)M*?{m+%LP0Ea0Vb{C!X0=k4I(~Z8E!PlWJ1pwkx_MjU|(E2~}v$7xXt# z>k`*I-8*W{=H5}r8f4RVr*H2Wq|(9l-BY*p?@bTB7CR5eBg{5D3ED|`GnVQ2`9--F zxMBmxyyG}V1|Hp1Dodh*k=1k)@D&l&ROguox08pTul}we_7`+@a>=-L=tzZ4fSP)w z%G{ACo47l(C*<$K*nC+K|CzGBN{6m)9j`Zo(5i-^jLdf|z0;Z%b}sUf)_g$ba|Pg` zfPTQk09}CW6BYvU-=GLEQ@KwE^y2#rKp!CEPCk|k`Y+1`ZL(a@mZW{8T$8n(%9f;c zw02@|WrrPGj#k?Bn~IEz9Ax8}m1*w?POwDY-oag|ivo5me+$|}=%LwzAtMQ7ZJ*t3N`{Ae?$`M)ntB`ASuLfk>d?w%&z_S3E>t_R=23QM7 z`T5OU?!qH;nKqfrv?XcVm20y0oU)(Q~}p5ESe^n(I+Y|hS{VxNvv6Ef}4+u7J- zoN1q2eBQ}&)Db_SWBC($fRV>>2*YfcA8|l1QBdHG(HNbE?&d$Do8WMEM2)7O^y5f8 z!ykEE^?xuh9D5M>OUS_nS2vU|awKv#`bv~J50L)}sF{6~ABA7!*K*k99~N!$4~w=W z?Vor{+$YKgt%IbKxOioY81lFfq_M{$8MxWV1eY1I2M)b>3L+AmJotGMy@@xdd!#Xb zLBm4>M(25mdSQqB{11y74vHENVz`mxL4Q*Tc0Sx>0jEtCaN1<2Q{o=Qx5UBn|Cy2F znk?Yb#>Pt8STQfclYng^I*$5Ay0X|v+jzrfH*6V(ZL(pbB9I(Z{L+?V*jOYb?hM1` zFl=taR&3aOhK*`T@>UzR`G&3Duq`xf&4%s&C*!#5AW%(2K}L%s3NaJ--60F|!H%J* zF@}h;&5ZBEBWpNqvWC-^q*c`nv}cUL2vnUM`d;5D|6W=j{HG^H?`?pSBcYMRT1>-Qve$LsC$7_`JDm)43m*LnsJn5*+x{U?xYJqDs zY>Q#L98ZF_5^ol)@K4qzeCcMRvcxM$)x#>zZwRGbs_?q|d2mk@u2TK1i*SDs?xRG0 z65<%(815rPe3;5OMlpsv*76H1Ro`WJBL4~~Gi4mWa|jbenkdyL$D$1NC$`^3b{u6$ z!UI)Ih8~KFY*#1?`v**)DN+u$JADDz*}n7vqN?|;1w@Zpv@49$DD5r0X-gKrYP2P3 zKKLYYer3Z?8y34^Gb7ypzcU;GlTDRN*b?#f3ELRFuMsw;+z6zZER+9*yb0J8iM>n0 zm8El(aJ9oWM%Xf7dt1;=hV4^42_ntD7B-gRHNrIqw)ce%DXD!ZY)C^bP59z~?FeCW z!}gVMErxBruu;lI!sdsqP1veo>k_v4uq_w1df0fBVuH31wo8SLY5WUetE#EZ{w(X= z+3gvrbpv}=9Xn7iYxqEU{rbZBr#~M`KYdG2>iW+5ft|ZY4Dm*h8J!uB1w8f2`&Ful+?&(sSxugI2hOD}JCqIN>#4X_B zgcbG`^*;*^ukzcWB;hnRzt2+NEAe~4Z#}Z-sqYmgdNE)i2dD2)XadHSN&!AzsBLNEl z698HG69HNDlK@%B#{ez_JOuDuz%)SSA?1=vh&HK&XiL)OL2`+!QMM$l(ZB@^+_?s> z*T7w5;8>NVe^(l~pBcD24cy%ZuK&}-s)729RJOe12RvGB-N5-7c7I(J7QB?pvG{px zD^aRw z_%ftYK$XR`z}fv<6CWR=4HWwOciK``uSNjT{A8uJ0RJnL#fBJ;H#{0B9OK7FhK!xA zKqjx*4+SDsMSLA}Mc?^|grP&EW*Gy;0#>_Vg+SSxb$O~Y(lJ(KuNt&+!|7X6E?xwx#i~C=)rb0Ns z!lS-E| zl7mI{Hv)%KHI+Ku1lt|JC1`iSCc}6UwqFSxTPKN&$2Z3@HsR3?uarr|2dfVa`%3JP zla>!#DziHeC^=HN$o|SZ5$-OyAF9+Yl#BLq4EH1z8dVA9H2Y8f(I&Nf8{Eqy)GlSF zj2{EO4UMPFAZnKi7yAO_Ws~A;1ooF0rfv|VZqSlMOx+!>Mpjah8uIRVUtn>_79&m z(fzZC?-P-CoM z{{@IT)AuzX6n-C?AZ-aCni{PY5KRbsRDE3Q)($uxuoG}HU^n1tfY7&n4nQ;seHDNV zuLjTy2tTw+KsFqRXI}`g4v_sY^xpc|3&V*AeLn@P2fPmO96Ge?_j=4eaO{sStB+pla%TJi`Tm!fP*+A#+1cmsE; zfjiB>oo?Xr4P2>#t1xiv7v3slX)$n4yDZ`MZVprjdN{ZjYT-~VOFRd3%WHhT2{^?r zWN+%lX^fqr_LXA%mn)iZT5M0CYl2qYvyz`7&h9ieW7eQ^Do%B=HwG1jT^vVipUjz6 zabtE5{wq$_Sn0#wOo1pN5jdwG)cOUxyi#5aElWu(e^q&TQHo(AX|`JVRq&A%lH|DK%9)NreV@ z_2%Bu=bWtw>e%kf{y3WYOf;Nq>eoy}s`ssGgpF4N^sh?QLeoVk=!|o&U;gJuwDg%G zga*U!mMapCfAx4wucV-HoHwvtPz`L~JtF(*^`Z}PD*FAx^GfxXFDTGtqOp$j6G@PP z{y=&$CQ?%_NkO69pRtA!tEsA!YRKyq@`hU%K_H ziUk%qoV}T)t8Z1awxO`OcjQA99=Yfju|PKJ1%!WW{ae$;Pn%ILHh4*XKyv~p>hL6p zRb_72(y{hS&I6@u>tXv?xbjb1y8aF}*{h)z{|HaIM*aPvuu+45fG0tmcpy3U<6Cl| ztP+MdRpKPg>AdQod6r#pLA`8VROK?Rk$|7wnf;M!*-*f+W?!CY7=ZM z#R=N)VS7Z_9)wLw{~B!X3*1|@i32)%#SZxft zYKBP>6Kvu$!&g2%8=Wn7gvYQ=45eZCqqYDh}8~F;xINYOG4j~{xWqU)_IHr%DT>j)6D#nq(4#9 z%yz@Um}5nuPflZoXX06g>&?3=I@?zY`ABW)gth}gqjy3#$xovb%DxqiK8o?ADi3-m zlYLAMN9%@p&psy0-q(uvTlA6Wz85eT@O!}7fLDyr`bhU*eAfb^f7HiO5#m|)FzVOW z2^a@>G2kJ9>i`b}ydE$e@OHq%0UrP)-=6@-0kVeTitxS<0LKG<4|psf|KCVA7SImJ zPW2?fY{1EY9>9|U=K-Dqi2k6UN555@g72k(QvuNr)v^FD0L%qk3pf*S0B|-S`<8it z*8&y-J^@$`_zWQWXnoHCdI9+_hTdD>8-R6y{{+NoS$(?!>jA$2Yyd1!V8B6YwO!Zop}P=K->hcmbdr@IpX@sa*_M1=tUG4&Yiq*7J3MU4R3C zKLLd9=mV{GIpDQ`Otw9Oa^>G;aTt>#3TE_w8=g&ZAlt?>}(m5HKsFdNm?Fk z%%xX{E4Hqb6%CceEw3hc0wxviO&w_DtemfzYza{2vguBr(cL9h{6G38{^f zv=F3|vaC?HByF{ULwtp6l6JL$`?-PJWZ>>FaE}_e%?8e_zwG=$3^dEWZDTvT$KmcX z`r5ei0O#Pc6D*cOO$ut0sXFAsn?UGfP5u$HBi@B7Ylm-L%hlp3cCpD7)CwB`nq~hR zC-wxE1?*x`m{@ToJMWEl?4fLJwmWORg2{@-A*;lMai@5DY4@MR6JT zQFPqKaUAz?7Xd{_ol)G^QO8jfH`Eb#zW1%Fd;9k7B?0IEJ-_Pb_Nja7)T#Z{sr7ck zUp3dvLYgBT2|EMBg3s?jP0*^vKNL%>oCV7YPk1(vK5c%3m?rlnaRWUT z$ixy_I@Z9Z&0o-Ulv(SIIrp>$3v6OaO3g=M5^T#T1V@>cE_OCi_@-m;0zPMoCsFg` zKTqHi@NezoHvnfgobTBW2-2b|YZsUuVdpfvJc%boFUR9%!)bQAn(v`LOPOglbl2C$ zs6(tZJHk$P^V%3SphC-h597=@UWljf4aAk)03-{!&(1w;lQ!o;(CrGNcTvnp8ZR8^ z-YH*=F6>;>yRp;mPK6|3+}TGB1H6$4m`fnbm>0hX_zJm=AaZAT?`94KY1_3t&0kAv?M&0B-}F3kZ#}y9w|Pz%v2w0bB)m7hpHw z-GIzf;we)|xLi2H6l ziDLH;i!!wIv=(o=IYGB5Xl)a0Yi46@6Vx-zhVJGzk!^N_o$h*@*oF5i@#I_TJmbVV z&-t-K`qXQ^ov~{CVE9)Cy@+LQlQsHi<*L_sJ+ive1!wAAPDMt*xUo(%ev^oRxgT|i z?|%b41n>dCV*nonWEvgnr`xdM~US(WrT*aET3BzHrVsb}kmvp*lYmeXcja-j+&B)+l6;@}#K z5D%DmN#`0%oz}%ElEp}YhDDqu19qkd^GmRK^*A$DO})fkRhZdZf_a0o)a*T6syH9a zf^&RDJwIZ;gpG4g#_t(GWwlRqFv0K7-t)WDU)+HuqLDj0LfD-PLv~QiTavJT&Il1T zea2%jV&)2NQ(mWr$afwmR$nTs1A|l$I}g?^2L)3rgHHzsRAY^IQ(!>wCqdeEM6hhy z122`jAh~jg85ZgQ%=#BTz2eCKp~`_ z@YAZ%rYR(K5QS?!~Xk>qeX)XE$(^_EO3 z0#hp1moOzFm!QHHY|Javq1B~`$tc7sY&ndx5Pg~hK`|1wD3OQAG%0-QVLMphR={?k zu$^VNZh>u>zan?t(xK5U#dOV>C<&w)fbS53JB3eI-?4-zxbyiAw;rRVksuoWxY&p`id~$4FW}g%)=%LhUbH}m8>F-`>1=zS+U&i9lb z;#p_daZ;gpS>Z9L?PeNZ1Uwe-B|z56cL3)B{tIwE;0J(90sjry0{9=m0N@V5a{xaD zq#|*$UF*IM@C&@(4EQDBJ%GCaw*meD_#)uXfUf}l3iuWvG?wmn2mm=zn*jI;;2^+n z08;=d5%ve9nUP_nzm#y4MBOB!bM9V8I#2{1SM^XMm3tYWHAlFTuneE5IY$c%4-=H%4Uh9Y?in)4P3W@JKw-zB1X|& zW8gL#xZ4ffod)g^1GmY*J!jxvFmP`hxc3a)w+8Ne1DD&ia3PitP0NVZCB)Dq#d3%T zKc_OpVKAH@$J~Y3Dm6+g!N*Z5j5!gEGUNzD&Yxg|Ks%NQ<&XrwssRYYJHC*tksSbVuO=lkPgP{wi z_f}=3p8XbdwY-d)D9eY(EGC=qBWq%_4tV5cKevOfJzEPmkHjKmR}$5#gy27V0~v#{ zSh$KyglK6P2Xfi)SlD`2VX-hL=rIOZ`dU!67R(h2+4E{_#etR7gCat*E*%aDmKsZk zSUB9&>q&+7IW1T%Ly59*I9S9x2K%`W4nd-V->k>psc&uy1~MAgm+k5KVc^hnhoP1{ zjt6S;dL|q(ORv-yEqkz@CKp=~aA=ha>f9%6`P)1`{A-_3Dn|GlC~|q{Q@yKvpHPej z-5F8=mrI9-28%OLept>cO*Izp0{iuL`F5TWnU@T4HNuJrMXmOo%C$<5Tt=J;q5xQr zm<@}g!kn0)YpDPt#PwBh5gCSUPiKFR=)pJ2Qk#BeMhTY;JyXm&;Ble$pXRAxb}r1Zu3AT2nEHxZ_&b9U)@+Cv%=sjrX9$fQxGK? zKJ0bPeh&Uc7_uGeY6wG!YS{l*plB0uWK3T~r7n|)C!KfMiyk3ey8*V@g6?+1^(Djg z->`j%Ctc{*e8Z=IKwTz$49CCZ$3gXS;W`mE_BH8Zdod@(6UC-tY-|B;CH@Nqj(v*s zdkbxN(zUzr@5Ym;ZN-0^;P*Cc?Az0|FYwQ)_CzkkD8EC{PB{^ut{nv1bm2M^w#fol z0o#*;%Np38fGv@W0cxa!sWLUv!DN?4y+SUS%Fz!cK$gHgY0$k4+XR7wCZ%HV4Qw*y z`=PbSl%D{b#6eR~IP~e-al&sSY%=8?u#FYCGY#B&*r>~;YnQ;5A#69pCiy)8n+)Uc zuyFz-QF|FS$#0k8`ZH`r!j(fBkFX`cMy)APOM(p>pI{pd8#OJQ>M?BTuyGm$+tdvk zEDfrm)ZRYDD(RXS4sB|i~Ff?mt!WJri864syp=}u}zE1 zMPdA~`W{J5w5;q}SAM6)8fnc(oMNo>iu2nXkue`FE4NI^1{6Z*ggysL%%w|!72_~* zGTz&YufB0{cm$kcEDm!Cml>UjCwvL_0rNh>5g>aS2!1vVcZQ0gtO!HQjGqP1H2T=- zVfkt-=5AH*y8CA+aT^#KZmMjt!LX-7&A-LO6^#`{blK2vzKEV09UYJwa!J&$*e zmi`G?57-1e>*sd7uLXPwkli9a%F}%yxEa7SufLN;4ssPsk&I6?8J|FOXz*<0z97Xzv zqU09h9V0t_yr>%^GJ(fPN}GZA7QlSK9>4;?s{p-#cL6g0HUqwieBn{nw*cARiD#{6 zUnNIXw8>EwZOPpHDVA_kG?%g^i{6T*kRlEp(Uz>8gn!D^6mGi|wq$XHhEg+yTRnyR zOxDhTjdC_cqozh1j=JKXQaDAsP}!2TWk|J*3zocvEt!kj3U{7?yUf6G8C%BrW&?*M z8il*xz+sA9;h57h4EAEuuUNb^bfsgXL0BNV=Xxb+JY4UE-*hEI1$SMJwMv8){tLv!j?di)WUZr_xxz@ z+D~YiSg63HIuzS~%2)9(SE6f!WhJ4d=rn|arRW#LQgjKW@1^IY*dopzUn*$fzs%GCFk{M7NFPX zJg1)EP+uw5=w6Ui;-B$nXG!I5tHL)!s4`8hfSkH+13Vb81MoP&PQY1!R|Dn%t^o7` zt^%9~xEgQ);8}ovz_ozP-*W-a0$c~ksmLH8N8=X&UJSSa@M^$|0NLqY0(d>(Wq_e7_Fx5WtOqT$#QekZHI9kTI!;Ke;kZn_QWuEmEf`SygwDUpyu;oA+v%6im z%B?=RQQQZJbuxKrDdSjbSrucLl!O@5`F~)2%FY?rfKd?>JdXha!XCPu^sUiBw zEOFE-#DfBoi+(h^06kj18t*RCyRmI&fkF~69jr)$0IP_Axd|18X}bjwf>^s1kgL46 z0XhKx49M*}e+A3}{0kr}*d2h(58_$TmVoa-jiV6SQpAZ;+LFaeufz?*yTl!#Y$+P6 zoWvb(;Ia)|p@AzgaC^IVraoLkb%4?TbqU36^jIq4-byH`*hW;o-z=W`Bc1L>rJ!`W z2awX~UO-Bx`v6&a?gwN<+E5l!I?*Pj6K%<2p-AG=@h))=WlPaA4BRvWM>!?wBBYbd z3PUsvHbfJJQt!E3?hgs2*rMlH#F)k`T4?8kz{UM@0AcQC(KDKkFlPT|(en`8taoQK zOwzNhkLpwORQdz*=Hz@R{BCvBGNKB^l|TA*d(RCEtz`@K%qo3GAx1PIb3JBC;^t96){w^lna0NfSu>U+L!~&OO^OrRlEt#3#2tuti5snKDLhrEaI6oK z&S~JPc~E_D@Dm)=-Ve%P*P)9Mlx5Ya7QND`n^VQ9wUKLn68Ef)Tl15+Xf0#SPueQX z6OD}G?-bqR9P7GK8Yb@b)tlf~XMcx{MxiC6(5dVB1_xBjk(Iu=YDz!&kKp$^7*Atv zzXw|lhGANM#QalIw$*Yy7(*LGnF}oQPwAb3?vt+v09}hGQCtz92V1)60y+e)8vhd4 z4BLmo^>_IHx3Ha$|86i&6nBV7y1Rf|1zftunmS$3ZNh(suqEK1o%M})bn}I>u%v0& zS+n+$ma+a64~_2r7fiwp6t1$f{zy89xnuHJV8`QMA7knMKZSpN!wpAtOb<=CyL{UP z{B}In`|KEJhOiUQ=ssH<8(N&MUJn?&AY?3Ez24OHGcaOil>I-0xAgx}CQRv_{5k*0 z+wr`ug{LEwM4;FbH{sC@)5MlI9PnO+d=f1UaniN{jsbiIkTUw;fXv%x0p|lg4_L48 z%+nX}z83IBz;%Ex18xL-1(0P=|F;0X0eBzan}FK@-vWFN@Et(r`@4W|1Cst-uc~3kg!I_A+94FBx$4Ru|%mMx-?h0i~))pE&`?>R9On#`Zj;WKeqoU}i3;NPe z=l$Q&PoGAXSg#H!0*+0p0MDU)R#|SU#m)fziq3v1sGNgWw|<)y)OK~vCwT0Og34;T z0FQ2%4y%6p5vl>x_Awx9`wl?rr=J2k0CxgT0Q?d#3-EJ5su*7YGCzoCH98wrM0O~& z$qt1!scJ|ZRSk)AD4SF@BremyO)}`HpGv>fPbFO?w|3Vi1?`+5dv?$E^9mN=wDWP( z3OGv^+VZXMNEoIj$)3dqZ?4c{+|#oQco@G&UE|T{>ba3?Vp>Biv_%gQl?M;Yr7JZ3 zAb$Z*fkk0voJfB?o+JBg6=JftmNza(=u50V$|xajY7YAKMfX7p3m#%^Dq3rprg-SX zHz*Rq=`YK(>x=0Y?Jv24t)F9*~n>_Wk7D zLqFoZ0`I>9b^`7JJX^U_nA<>i3E%)g<{SMn`R5^Asi@N?6?NK@#p$5^}VfwmV5pIecyu_Y|d~kRr&Tdvr6Y*Y`?dKqEem|8EE;KEnO6Vsx!=j-iDSK#{1z{UL>1KVm>Q+ZRW$ak*gaiLBeIKyHYIeAV=mqU+WB0w^2QajsSGI{jbN z`{(E-=>CZ5Jv1~mi)W^f4T0Lr`HI?wiqACX0-_PHM-$hyqjwY6AD~usv(GCA1P$iv zu}=li2UrIP4X1lCAOvzZ!-kus4s zDHCZ+7N?se?hw37+)>JwA}(!_IPR~Ible*#arp+W$iU4pa9oC#bPEmK5(CGn7`mot zYYkj@Sz~sS+pd$U#bt~mf&+aqZ(}?j#{#zvL^{QxKu*Q;kl;apXp3yW3E6wNWm^h^ zu4Byy|J0Fg96S>Z9s5#^3k7+nqPR*a+w4INP)ye`Ld2&F&tX3EaZc|0q~$BrO-i@~ zv07b%xN}}GA1`W$K(X0nmdQn&A)L-xvEJ#}{F=Ul36vXb5i^|d8;R?g0s{qlr`%#7 zyd-kgtapZpmAsK(pLjDoo5W{Gzf*gF!Mi_(s?t{Eu=(H|s-5+=LE}RLcd21x zw=Z#Q((Jcy#G@Ok0yKIqQshE*Xr!eR2LUv?I|qJg!j-Yc%^enZ?xN5y$YmAhDmabq zpYHkvxk}e=^NIMqKl#ABoFEkU|p{$JJO+VaL@VgoV+& z1icH<-)~ax`WDGME%X$VG^7u88SK(^!~AELF%}38CTY%r=%y7au2@G10*=G``G6Av zF92j$fmS63z*hp!!#mnR_Y%NA0Iml71n?}tjet~_{|I!@Z}Et%eZ{1Y{}Yp2JS}#mpDMDOI9{?(+2Jk z19y~xJJ!HC4P2gqQ+E!?6I88j=KEHRDdecPJDSc|O=25_?t3q2V4zhlT|ttPn*xMWxR7Y=!gKIXF=?)~Bx-CGo;VF*SJVW`|tc!l{vL z5N2Z7b==ywx{f~Xsp+`daoG{U@`S~x5#sc}?7h*;pJMn$je?@UWvnBEa}%lsspaTX zdWahF&9D#s{ib!e{26EMXL0E@b%|EF#8%CX9t>OT`dDJ)E2c*!!_b|HID``7hECdn z?m83E9>@%lqmA4w$TL!7(B-FV7$}##5p23XFhdq11g9dslqeY*Bs*ZlUiUCIYLvtCsa{&Um#r? z@uZ7sjF(Yg6E&*Kc>+hN_aboV+T*ajAY3U&q-!ePpBK18@Go)YutA!@$2qVK5w?)p@8ros`=vSAN=BC0vwO` zKLXAMya})p@D{*kKn&`|L>1{+S0MAdHvpnecHat!^6$PKknVp4MA+i4I`lf-58?e$ zK=g*xn!DdrbngIe#yfg9Z3`fEsv)mhGcICu1aK20PZl?~;WNU#3K<`(t7~cNYDItx@nt(=0*>WP zIJ;c$7u)y!jr?5Y2ng=!Q*|>=Sw<+x z;R6k6DOiRfqpK|ILb{)0;C}F42^MiU$aDw`45ArizGbCfzktGY0cIc4CCYlgE?*X* zQHEBUc(o-HK`GT~{emL1MLLA8wlrp*DK~V(JYglb1M2y^0~MI=P`|{+fSrJ>&~JcF zPCwEnryps<*Mjjcacn>mhXPJQ`6evU)aAjOlSJqBGdP7d*6U$1JiSOLdugm?dM|O7 zGS&Sc6SOz=7xak!`i?*YJ}0k#V@>T>HQ!qjbzsJDm5E)NdvTqJAw+eqfQ+U!&vE9n zn_F&J2_J3RQXuB`g%dP(eLERK`pKk$=TIMp z2F@Q<@E3#%9#V~={Yw=*w7UQ*c!(L=^H_LE4j$+W=8hl(>fvbNxNsb^f|TXZ#Vgn6 zCsg~QY2(oUsf}+pY5gYVrfuU=882w8_8H2!(!#}FO(^CJ9Db>ckBq8}mm!np;z{I; zua<`=U0aHOsd%r1?F*D;A}0@&>oc%H&H=}%HtB|?0v>?8HAu%&KAB~Ad!FPB6= zBdl-fpk^OZtf?p8gD_}xJ$kcz6?!t=zg6#7Au@bFRuze^S5H>&y53!^-u1aLUGFyL zzP<*-5sHYsSzhcj9Iy{o_|Dqe%Szk%V zS^_;qDcH101)H{HZ8!cU?k8nS)&`hJ z0s~iU;N}{*Qw&_YfeRQoi*l~6>k-=d(PKJ~7CT*d_YbaEGhYO3DC;f$mbQ+Sf-LN+ zpQsyIf|q98h};UU&A0|&PVnB0+X0tgqZziG%&CC$y?C#Ho+f$_>^r#v@AJcVouneC z^<5`9ut~W{Im@ZOkUp0OjBdC)fvlt?lKLD6jtO`O$KtWNOIInkQownRMc*S&`gP+u z0*y_X82Vng+_Gx%3|lvhlQMSJAoEoUVT+}@MsK?4px=V5k6Z0|<$=EAq_L}|Wo2k@ zOH|#Rd9fIIga~UHD)Nt@Z7_cx2V@>?Qf=iM(8z?1bpmtbAl+pn?ak71sQ#Po%zRpF%OS!I5|e6=PmVl#+C2zF4p4#!rb)_ zFzf>Ud^{&v%AY*R<4`;^`Yiw7_&HkBcSczNlsUi0BlD3qnUA!^*1b8E9cmvLpw*2Y zeRhI0(Z)O0Z#3$DnDejeFERUVH4%-g%zvZm-S4%c{*HH`gLN~_rvoxAX8q6MQ6%$%NTRt^ZYLGwoXXu*}Qjo-qqODw(nz|y~=RJnfgK|9^Ej` zR@tyx<$1Tt^EE2Z2cTb)c}|b%=5o-7(78hPBv8(&mT-js!xVfx|7$jC;nCsh{g(iI< zij!2ly_(n6$$@euCM2UTF2xznf=fXXKNC7qbfR)RTi#eb+ZfNv#ibGE#U(YKO^rI9 zEkJ?E@oWWbd3e&bM*Pe1Y$t4(yhabz4V!d*3O2cr^n!u=0XEL(q-&X=9wKaR*yPA| z4s6Q>E&>1S%WuS^n+CYjm~}b!Tco8EC(LPdck39J%fME5eT+K+4ihZy<}q#q+$n!( zbpFy^zEM=9!@pHjFwTr4#}Fg-N>qs6GODQ1!w1`biVDgC#v*LFh+SPKp77-&GB-&G z4kYgcibfxJa?y}RA4sOEeA5S-hpKn;0#3K^A^(^sY|bqGfWikM3h3=3B^oXUqzK`A zEg;|P)jPIRi1&-s`@8D>ef3U}P5Pq&>7RMecP4l+a!hVDpiPd~XiL`42bIKaP_|^T zG$?T!4ICFcCGJiG_lSYpWZ<~yD(PM~aMAYoM-Gjc-xwNUkaRC>93rKPA<_eQQ{7th z0a7}WrVo%juy%9>r0M8BQmF=sxmME>mr{z-#ijvSJ@iVE zq4JhsjI!%xXB`!AM#Wm_x}VW-J6!kJ&q9wa>r_Mtkl_BPMg1;l78s>nlqo$ zKDwau#?GB34^8;_{M9Ql=|f-U(D%c;-Ij-lQV7x{hyxC^QHaqbXbuZ!=B3@HSJ$F-2Y(pJ znf&awu_n%m2Img4g-MLy%>LGHqhEN`ZhJqtDU$ObLGuFs8GD)}!^Z78G)a=PDG!r@ zwcA*A^&FF&Nlo2~hBPu?{~_M_=TMk8A~0;v(m1ebl`6hoCK78dixi;jwj&hH!-d~m zC8^D2!JgJ`dyoHkXi|)H4P$l)j2<6R%b02Im_T=V5{~2!+;7 zDC>qf=Z6Dlx3L^)x=ubnCo&amk9J!Uxazqw+^}(Ni)Oe8%gp&8VC}Yp@z1zlGTe!M zGbA?W&j>;DGyZkX2N|}Js%jo2ID>>AWK>3!g{h@56uT`~xn8}#;%ONw5kcik#>5=M zLxivRG34Bz-S!p!^%x#v*tRInhsd;>;=`6@w@t=B&1s*nel--IPn0j&`poe;477IJ zH2jm~Ur!FcGcw1-oTP0MGE$GvVTLV3RfWSM;=@*Kw;hjvnwxW%BM=o0?KI^}wsdoR z9H6z^j>11_Z>{Y?6GXsaB{)jZa73iX$6?t1tT;O&;xk(KV(HWD$(n@#^!VUDQ(;IG zE+vix#%`;?Kjq=ye_D-wtk(FT5rU@56rUrF_zYEI^vH<#j1j&#RY7y{pMM1#JwCb0 z7ikb5QzTZ%{b8uQQb|nS173JsPxj+eG}6_N(rrqvYyXLBlmUJy(x5 zY`E4)n4=?7ag6XaK{{(EEIc07R*%nz$`@(EbCs#K+w`(HI`wtR&e7m-q?(QaFef3{(1^pw^sU!;+^ zGj-O252>#)VVZ2+1|{8S%;m*a(^o&3DQMo~KOUOnjZ{3M!a6=8f3iSlw_SjL=IRxH z8T3(PeP%te+o=BQQO+`KZ!1(*ME+z8UrG32U1V4gnxNT= zB4*!DGt~&|7}YSQim=RiI30A*Dg`};>Ze`@#Y#`}0_BS|;Wub{oH0Ln-s7<+4)Sw_x3t2oaR zIgdk1lh|e^fFC(0hSg^$Fm@a9G@pF%($Y{2CsIj-apDP2mkSuXO|M_B8?S_5)AMkt z@V2hTA9>JNq3eD+n%=PPBux(oLA&unxUn^%e zSZ;HUQaY?TQr{rWX~TI@h92i4v>F=HNZdMwk#!z%W+T!rkIK0KE_Rz9=ltEnAar%k ze^-1+BXNm?$%)1R3^->|QnyFtTnLv?KEJv4xfY!ZG?e32$RK4rkzZBm-y+;w^FA0y*aE@-&JNi`iT=M?YWWhsSq@{-b_rS;srZk_4th6pYOyt zz?pS}&5}oS$T?iHRRUwTjmAICshclEvFI^etoV>7yxgmRvD=Wj!Yuu0_N^gbHz;4E zk(}OE7}+l9C0!SadJMBzpEHaYlBOhrhN+-#D^o$5--pqdYi2cEL-R;;e^|askBz2n zRK7?fWB5=QAGTbIn@{kB!umOahP~rEVKnlSMnD^6QCgsr80-DV^L1rpYBPZl&!gGR6SCmA(!avB_APSW#-MXK>@733UV zGfx4=ZgY_U=DV6}5m`MqZdZIr6P~UbU_$kI{GumM5Bd6!@s17@S$b zwS=gg>)~Rz9ZLe3PsaT&pmV{#NyUdWlJnhbTm>58j$E~ty? zaD*X^j5uep+Fcu!b0b_rdem3HK5?DS1v;kULmJ8X#|X}p8w(B2Xz$aQ_59wH zXggu;-7ms&;GgEHhSghjzE~O?F0rHuuL)4>5JT$lG`?e2m|}R2@3UD4I+2CeGUDBMaIJZg8runGTgs(%CkB-m& zQXWd_S;`k_!c*EIeCe&b___U&XapQqTRH`eIp;f!_&lOGcSNK#Abfp+f96lqIWNB& z$+=6=upiaa7cguCM!*p!AUM;OuQ0M6noD^ZT2(`MN{-B29Q%tOmwzy958M2}ce0?262> zZb6fZ+M?&!Y9q%!R-9Lh90Q@2p*IDYho&~TM(|-CQW89PbROh@4L0-4(piG$XZ-6m zbB$s1E6!^oIQIx&)D$s9&|IyLJrK!xt)Ss?+%(u|dJN8&D$YHUv#A8n2A$oe`#ANc z7St%lp5|WVi!|Z6dJZsl+ciiWNsjvTeK4@5^jtxMlNN@ica9OCj}+%~M0}`GgIFB3 zCui1e=<jhiGV}C&au)=A(wCPglL|((o7}IM`1L>MiNKE(AiVd z{sx{9pOdXL(@FE3K?7geWKD@nU-q!JvyK>B2L5SoIi&RAP|jbaIFly474!mQw<+PM zE!>uk3Za+R%gPsN!hM}5e2J`pE%&;kehK+XQk@uS!b>?Qd_9QRb8z#@?xyU>QbvPE ze9lKH>uo1!lya`(929w2i;pU{HngvV2N;JXhUXT{E*8Gh73X=UK8j9;VVEV!C4z>dVqKD4Y}j5?oG*^x zd}$cxE6&RPTO{Y-3!1Se&X*dTQ;vWm%%u^WF9X(YV{guWdG?Dd5q-Rb#rbkUvktXo z7;H3`8Ju$!=gTB#lZ?6obavZ#L67;AN7~-fOBA`Te32%+Zd@sR>2;&|tlr~8zCKaD zNE2SBR|#LI@E^}b*B1FAQ*pJRq4d*p{wl+EqyvsHSIJbE%Jdpw?KTz+Yh(2F_df`l z5BZOW<{E?Zc@BX9#$k!`wQ!KTP!J_8dYN7)Xw0?cT7&Z)4miSG8^L)aup!RT>*4i+ z#>{!6!TBQx9AP#_aJ~UpS*DEhe)pdBL}WhyQP5lp0zIE^Fl>j8f+Nfgnl(459ocOS z@I{Gq=vA9aBRStBXs92OhUP|t^D@Qx#t6r3>S}6h zt!%)h9E}FiY?sIBbIq|3>8!Gx&XcvA5`Wz?ztciu;p1|7=FJ0bPL})_j1fR70uTk6P>T4t-;^f8OIM3=W1+pR&~@h z_ziAI%iKu}s#ldg6P<;=+`N-Tp}3v3nI5;(T~d};;_>D>qeUPmJ7;p$ z;-=1=$u0iC;x?z2)4!PI)RKE%zBA9|_7&uNT~6iC!mu%CGMVFwn4HNtI^Bo>=HQE~ zjm*~kwvLv%K#VMKyK2kkP70BABB{RIYUAi5US-u|JlsB~+nt}ATi`Br3JQdZi~DmX z<0~j#O&xy30$11I51|UHIT~!IaUy~23^45(4O2b(X8oLrOvnyCnv+5o0H*k znZwY(tr4rhnOd)EOCmwV&OBd1d0}Z$fwKiy(zkTAz*InUaJIMqsi? zkOKv7w-?`{&3Brwe?b9vb)pdJ5#MIiyqw9rnkQ#+rx8u&mA|!NWt_Y)$FSU4TI?&z zMb_u*KEZ7+}QXl3D`D4g5$mysYOf-e~rg5{M2SnWv{QPo4tUAkHMWkDuCe`bBDLk|_ zcA@0t;(|i2lUZnvFWOjr7m_4WuIIhs(^KFqaCwT| zzFc2;RzqNCN0x?`V?H9OQWCxLpdMJ$o0|u5)`#@=dMAeDYF@e1TjcSU6r-y&2aEzj zEkqmA6Ia)aM%B2|NS4p(Dap_G<`+3pUfx!dIQ9pCDN>D3$;NzVVPS5O%i}3UD58)> z@6^`H^5-oI%Z;u=l)yqG9ORnM<;r!ti;A4`mNaCvD6>FE6MAAql;0y!{Z6O{5LodQ znLcYwjJ_?mz*$&Uah^3Se8OCP!8~e^A?N;u9Ns`&F+27Gr_WbjT$r0zW{prs-SV8t z(_~}MnvydaUro=MjBZc#G|UCq_a!b~b3cp>DJ(AWmX;Oytl@_~!5%e3LeBdZ2~(jI zIP;2gi%W~qqYIf8ssOT*QmF~A01#HcHB@)5v)tv)^ZI;cVHLiigPmH=WL>~Oea08$ z89v*J($Ys4b`*`!!I;qQ!aM)$-K7A#J$8>UgmRq^3fxONl8jqug(kn zy?At?td>&V%~d8KI5B_3x9B!^VhMJ!b(--pzU9*j(9 zsM+sxd?h1DuYKpBMrST(ZeboOPM*^^$|;9qs=Di)s=O=6G>FJ8auyV!8_4%SU9zZ2 zm=S2}VBcbDEh;>>v$(vtptRUq7HR~d0jP@31hEY$g)JkmOoS;qd?SYa(KW(LInSzT zSh^Fuin=F8hET`C+K>l|pbMhaQ&=uVj}ejRx<{x9xt*mRPl?at^E$n)sz+X^4=^#X z&6$j}=A-o(BSXV4v$pN(eoasvG zKpI4!ZfGI>iOxi}DJK%SvKb%{Xeu|28g|Wx-rVacNPJ$LX$X6|+cG z(;I{e!p5d%@RSM?R;BZboy7(Dkn$yYeYI@Ci4&f+oqmi6q0`hhw6!g5@@q~rYO%jz zsd8{mk}8NHEkY8{I{Fq$h`YJ1lbt6Om_E7}Y8BP(jYuN8qeAHMm^O|(pyueyED=N1 z8gjhco9lLY3rd|KxgDC3i=y`QBSB$`5A^c9!lGP=qwpM%ijTpKVjqvL`bd1}JIUdG z!&Epm^7k48?^rV!VbLmf=Ato+S{y|mQ-i#>|7R91dCqcQzSmb=Qtp(WLY9hNs1>QNA!8s_zr^1Fv8E;i%+op1 zvpkpMei4>=lpBXO#t0WfhvK3_Z!xF%@MX`O$)cm?XH(T2C;L%ou+-Mo7e0ZJQ+`zK zrx&>ji#)E-!!fvo`f8bHeH6K6?$C%#zsCeoq9L1t8~tdx z%adOS6@wgVHg4FxYnuuy&vpy%w(_dCRe1*x(N%p>lUF z>SqyVQX;B@J}h2{YKXzyG}#Sd7+^FC)QJ4Ne0Oe%H(Xf`)d+bbujBh4Zoxy~I`G^334$u}j(`&&Xnp0kW}fBIFH@ru>(WNz5Tg;Mc+=CXBLlNz;p znpum|j#F)96~(l7B=5-T*UxxbBWbCFvJHh-?0!bG56;%wEjrue6=UjA6`6oL=_tTs29MWL0 z{A#bH(f_0ITZ{O;2)gQGNtFT+jUTq3YFiXdJbv60IUU<*U%{R`npphG;pQ&GohW!{ zkgTZnFAw}~2F<7R0Au8zX?LiOABmlsW+U3ArQSaVf>EIRm!jo9zG(Tv)3v{VrmIqN zjFk@VdHuJdk(AN-C4t|{DotB6CqBOsaQ+fB1LsOQBtL5Wz6CxFH2ckybVj~d(o23* zK~t{i;_*8PG^N_4xk}en%`uoyJ2GkDm)Plba-6y!b5w&1yv# zk6$lnRxOFokM;Slp!vI^i^Y%i`DM_&zBE3+tKpp7jC{sJlZYo;`3Au6eb7|53bIgr zvB*gr)6vdVG?J3?K2m=n-4)U3Eb?VK=>BA(ix$5U#P0*pO=y>)#ww55a9#kKyA)ll z^iBi6&p|T=r9pnG>ke13ZdKnGlj^Ezirx`6=E;x`lgszGzns`&h} zK(_@n-~KK>KYr42#%g?We2t`w)nAg|XP`N(r*D1@ptE(v~Ti4+UN;;#ySlUMgoZnP5l9KJi8KK`#gX6gKbqWciwIf!O#t6Dde&ay*Mg$$& zrKP=X0^NS=@j*~LG)zad^nQy0v#q6zq8;l@*3pf^^%VDA{xJM z!EeqVHLd7oNoVl0l<#0TpQ&ghrIPoSbhM$PUkAF~w@Ioa0iuOlf^e&E$9J*rkaR}4 z7Jh7wFM;Odze>7Tdc;`d^I4#|?aui8Zh-UKp!wZhk}e4#TKpQp?;oI}p%y>}JvAsl#-#Apb!4GNLv`6Ff;|&T+K=aV! zk}fp{ze_=P@+N!>aC3ZqE%d)d)7ImmiB%r#2k!&Tm?tIOAb@D&!5-jOgJ!@}l8*Ht zT6$~1ZxU!WYzxuF;GW+V>JHUrB$QDk>w?MWv)_BMC9OEc&$Ffq>=~%9D zaIF#x9vzxJ>BKaxVR>WJd+j?r8fsd^GG?dwGW*W9u8s!3*3e8(I1#p}qprol+4#gcC|jD z5Zxs@wkEK+siU#By{;p$vSxXpxu&VLp}DKkAA>qZ0>ufFg*cJd4{v)zt9D@^QaG2; zPyThxKkP^1X3UzFI%Hsfe0Q$Ip5B()n&sxfte=9YyGdNGc6jL)l`>n+Qk$p5mc6Ejz2 z;@}yuc%9>^2z$>)y%N-U<#Q`xEh{hemX*5Z5$mp~s;zL9<<-)`?ZKP7(B&ls zwS}(ATF<;H*z&#DS4I*UW{JmDR!d){u#k2)Lb%gU=*7@rT%rB#mc1rRU=72|NHbd$5tf)KCCD!eHQKP5}jPgUVf z&6IRgGi7>kCKQ?ObBu3oYi?WA<{0nq=xDM||bUgtG*3l66dnF2#D2EK# zd%qE4#2Zf%Rpu3U*34~cZERcKS+i`)giM!70R2DmnJ0wiJO{#djCFM_!Z}{YM6BH& zV+wknh7L=cP-FD|4GkJUD)ZZ_D0Bv?i;7cEN;Vf~(!uVFYYRNhj0mcYO zL~6J}$VdSv>4oAFo1M2LJUVnQhAl= z5kN178jdU!{;>xk;P>KWJU%TZT@sXwhwae7qC^CJ9zP_c9R}Km(isbPc||Sy(n@q% zwWY2izD*Rxco4=YD1Tqw%I3DZMxKi2%@@Mw4e*Ija4AM5jS_px2ys+Z={?y~TZPh-5mNlC89??# zL1lyg5}&&g>{3B>Bs^6cA<|z82-*XSu@S7XrM`iI;Kr_`w1!Ha&}Rp$1H45N25Q(WtNBs{SKRrsMmqRqM6Itm**%DP(o z9Zd~+XwR)^K7&Ct1qD~)uJz`LqP8;}clBImavEG&G6+^xKvb@zv@cMwGLu7vsmgLX zoZa9T-PxKW%?-6YRImu2Pv_K>FsCBNJIO z_hTiInS&O?7RLgD@*YsH2a%wu4f`)eonZSiwI`Gwc{1zs=9X8;f@wzx%j#;In>uBq zyX@s$z5}zny)<{-0Q|PL(Q7Cjmo*>4Q z5v(PFx<#_0Fm@Z6go0|M_z=8NU@rI9cLW+{%n(vc9-ct|m6UcKYN76iPK+Z{Z4~g6 zz|w-BF$4SJPy*P=iEr;ErA>@MQi{Prp~scysSsr2V~{~t_002>RaKlMDu&GzNfi+h zAY+91`US5yQ5dmfB?|mtCJM>d$#7h%V7Qyn9GH2vnDt@}dNl#fyQbkiPY%7#kZKwIkrA#1x@i zZ&fKqF=hGXD#olKydGIktSDU(Qn87lzPnXq;Vu(DOGMRO8@TX2DQ$(xzu@Y|7EYcN z5H+gF6eiQ5`(#IQRk+XAPO7r#6O%;88x~V>V~^+s{H9ppFqJ32yrL9?ta+ljutDZ~ zOFSaz2k=5!Tj?$JVH~A*8`@X|aF=p(bMRU1t1YM~$G@ABxFkf$7RUx7+6TL!+jMW% zE{MswLw7Xu6wzu&BNR=VQibwB^mn2|Wha3YX@wP@N=$MIa<`(SVcMis?>&Fdq0hB&ov!;#>(wa-}2er2V#4Uz;F8Y>zCW|yvtjL*#48Vd%p&J?7>d{uYJFD z&d6ii-@3AMUS;q1KVPS5^926-&)>}H9_IOZ!Z%G96jguxDYhO6{8c#~&$o3G(mMY6 z`9lw`ydKlcuL}GtL)&iO-1Eb(H}8D4)OX?rWZH0)O{(qgrdHdu8K?bu^ixCMIBMQv zHeC9pYAzpf2^4dI|8veeH~R}d zIlHHL?&$koNEA;x+nV;wCM-<}{96Aj%bqM6bK8=;%QiQz zeFOC*8S~kxw&GFOo_F-bfwQ;Y-*oZgw+u!87YqEEkG8D1W84Kal)~jJfCM z-=F^Ohu@ul`C)th@WtVXzrg=|!v4WCx4v}Pd6Ryg_tv3npTN|xz<=|{Tb^kd^?BX> z8JmAv@f|<^_oBeR@$H98hhI9RbmHvOj^FsfqnHCf81uiWwqM@6-+4!M{lDLPccRbXK?HB@o%B-x;``$Qx@k{@Hf8o$;zpTKt zy1>tz@%a14-nr`7KXvW6;^ONccpBSyv5t~zTm0^i3>xSEwjCkX^ zE3R#PX7)#)7h}0Fnfx#Pwe!SRR&HM5J$>glIiKDhKu<34v#vR+wCB3_|2%c}qn}a zyZ_)bUYfJGq9pB7d_r8{zdftu?g80{|8&}h2HH<4pHbKF73!hDKl|t7583(IJ#81hlC<#6mDheI zugU#_)9;woz!Zm=5|{I)Eyf%?CPX`Hpp+TY3U&I}p4df=O%oRHqxY7E75nTLLD%Es zwfpS9y>oFp`p{{=mBFNaW`GoQ_!s>a@2!FOzL&|x49t1xiy6y|Iq8}P4%ejrh%W*|{S9@^JorqlQC}B`AEP+cbx~JS zBa#%~f80!4h7-?vmPAbr&K0#Frp&xPaxP9h+uPb%H{%pe%;l}HNw$4%)XV%G@iQq- z3{{o0{uhbi{AW|czQ@I!rYB1RptEtG6NLh%4zugXI*pr=*RWVD>>>~>zY?~Hg(p>Z8_osojPiH``$i~FQ_8%;}xfQ!@F4V z1%r&LOvi+dx=MdtN5f*riH;0^Q@ex6`QoKhzD#l)=Qwe1Xu+p`h2Vn~Zt~h&&oW%D zZ>yO6Hg+;DSWW+5#^txM!&3adM`j;`mf0{7tN;5R^u$b6q@gn2SB5e=S={BY@A1jv zHX?ct#V5p3&R;q(?8oY-7JMT6nck${!i3&J{15IeOzka9?=2kBTR5_}(9v6%(OWpS zw{ToO^RmGSj}sQ)u$R zcr3Y)&VhCTIk*iPU<(j@rU@EwVl|V!hFb>utSb(f$(bNG>1FQ#R@iYKB0UH4s zXFni|U<4jn1hmN_pe4(`o z7Ee)RHe1(}X3Vf+`cc)rmW=*dg$E!EjE*w$Rb3At{@Wwpw+(Xh*0qfO=-ZOLNwN8&c&UE+dO8A-t>f+ZOVy-D~V z-0MpK3Zgd&^>A~lmHNtuXX^f^V7n((r z4lM&)Ui*=O$AYzL-)UM(8e_y&HfUr^n;NlrpOThjpc!oxP>@G{)*8Lm_ zw>_aAGNP19>z3lvBwZcuhCa$R@ zNe`mSC!!}0EP{cIk<$}bPe213;alIsL)gCA3|$LeLigSS72}?*gZFH&ou9pl%(t<< zXhx7adMS_-@uZ8AWZPVeM>jVpi@DU9O9^MjaRbjeGS+8ra((wy9mJnG`Vuaj<}=I-PXFWX_2pvJ2|is zvlE*qQp6U#Z{QIFJ2)xTwhSC>M?E*UBWT;g znB4~mPO=?50@qwiJ0MT;V43Vr!=E$}(iQDMzaBM0yz1e>D@2l|0kDdbfHhVB22yFK zsF&7yip>SW==IiXde`gaVud4M+*vQlr-lfa*{BapPlc)%m4Juf{baywz*7Kc0^%@c zcMjmGfVqIxfW?4w0GSuWvtCWbGf-QhY$;+F3vtQXhX#&PQ{uigaNip^N>;jJLyxj0 zYaQl!t!6(SU7$l*5YvCj%}4WUXihTm;wx*bdkV$UGuF!(m;O z^^Z1L|7c6rb}H8t?Mr1#)_yW@dkkC(Vl4d*Rkma;!@!L-aHxOXkBvc&YJtg164vKe ziKgab<<_7B?0)^wO-z7ozs$_W`rdOUfpXh9)9{~}wY(mcX^VQxly3)s)`KTej68E; z3n>SAc+(9Vo7q?^TdCO*cDkD@+Zy1kV|Manp->?H5~s3Z-!IM;`gt>^P_SiX>D)U3 zC#s562Nxhb-7pTUEQ0{66!KLRD&zHrD%`gLDU?10JQ46yKquf%Ko{T+Knf+|nHJ(% zDd;9E1#PlY&?beF#If8Y&O2#hW|$7izD%3mLlG0HKI(eq$8(?|4xYPBkbzQL*Tc%O z{tQE}3_!1Z_-VN4dgYlJBhKCv$fag^_IJOV5$xefUG#;+^h%VlO`zaKnE$1cs`C(E#>92Cbcu7LdtN!CYlJ; zRn89(M5M}js8Tuq16Qb=rBdZoVv=6Tdl($8if1QA=Thm!Tu7vA9R1S)dKz8O-YZ`X zLHjk{?^HMf<`bLFFu)s$fceJ&*>wI1$QZr=crf60z|nv&0UibTH6Z74UIokqd;^f> z`7gi7}Kx|^uz5x6SAa-+hKLEH3kmbj47>^=6 zQtzZq>YcPDYa5UPiKDhDaT^WXjRx*c14nIB(mie9sBKD|c@!9@1t%eXa%A}Nx}FR) zDyRm7MOzLv<+;8%FX__FsBDiA?Tv;?U@1bu^pDZQ8cOsg}sw}&c( z(jH{XOfvLTbK7IS(IiO_p{KG9)9CKzwns5oDO|(d^|unZxud$XG-TWR2+-R07$>&9 zOYnTwXWKKWAp73-#5wP<;hx_1K1BqmoXF!Maa0rsVoRg9ob%-*gWZU@#kZotMUA7%$lxRD4KuXwwfRuTI0G9zK1G0^z z05U)6kGVe^k8BIH$+kdSGDm5`HHCV)uqA8r4IFePg@g8^=sFDCIs2XZDIl@wnG9Ss9@ z5D*v|_5d2%ATYAqLRyMeN|;u5GJUnQUJod!*lT6xTb5c@S{PQAR`zD{{r=Bk&Dw_< z%)alvuJ60P=h|!i@AVw+=X^i+b69IXlFzJy_fWX{RE;v8ycy<*e1{qnWc2(;t}D6D z&6pqgFw*G;AHmIccSuAUOUWO9Pk0a!mPPbk((Qp;<`|wtuFB=9wocHQ5saI zszaZj4f#Qj+&6+s+a^$TFptZwEQzu!OQP)hw6)vo{1pbK90&bRmt(=e2Pn6?Tt{juD96#pDaRIDsIf}C7D9VMBxG?!B zex!gm2?y%h$H^n6z=9caMEb6M9dtaSYx^+jUPA^hO8YN;|6F1EWoGG8oXz1CxW0vc zy%lE~X=YbfnliikCtcBA4=SzOUC}OvwnZz-7Okkl;2G}L?pa3_22ueEQjaxnT^HM* zx3w<#SaE#Q)7^hd)#Zx%^8kR@ybY&s_69`;~K>! z6Lmk-J;|TA%S7FMz3yP@D=onrrAgsjd%Y)t7G_aL5+MzP@6`w!Zv|Q&bWw z4Vl&RDXK$xz6n&?Zg$mk3G|`Cjod{IF)OE{3WI#STe|{BvBuw=`deyhzMUzhp53@7 zfAe#fAKI!_cNPbm^XI0PmlZDywl=&q)Ax#@OsxtobYAAAULW=6NiSUSJ~3hXUSBqx zp)r{#E89n$>O(MD7R(L*h7mp7L= zB3h54b*W6&WVlPy%X77kY8q-NKD^ZgZ8eR+eNIOBb!NoYIAsbT$8aQ-4L&cRwwv~5&zF*ho?Vb zbBzKyqjafl6@iw)(s~Oh4xa;$0dED51@8fm2R{#f5c~poHh4QIOaugD?!F5tILL)HVThrf#b4q&v3+0L8Nh> zND^%0tb%IhDlv=J)=q__#@Wv0jT*6x@Aa8W0OBDNb@wYvhhpDkT+`kClW$yA8I4PE zN==*3RebQqRbiS#<{0f01P?k%#(KIJQ)0e~wiF#!`o?TEE~UX6rAv)Vtm~cSy;Qc+ zdLJlm-vW;Y9{@*z4}ua2$cUb);BHVn9|hG&)L^WD6J-UQsKQ_vFRJ9{Y7(s$=t;#+54)wzh>@lnERXN{ucLT@up<2#(=H88t!a5 z6xB4IlD+lj-em4`%w2*d*(;%v?7hg`+s*x}=B`DOWUm%TlD%5|NcP@u?z_x=kGbzP zcP*GCd!I7*XSi?NQ%*i0Y%|+P+DdrO8wW#at;kZ>g_NpR!X(-V^)dLU$!vs2<#3NS zLN)K{8Nxz5RryDQ12w`~9US}6_x+Z4tZV34u}~Yp12o5MnGso{UKh!P;#Y%I16%Iw zOAoOPas*h6-HD(^n3F&WgECOM%gLb1?G*4v@crO-z>(m8gQtRn;r#(n`5Of)o-4U* zLl$KlvZ%t~Mef#4ZOq!)`GDs7+4KA)zWM}48Bg8}bA;+qMs+2lX9)!H9%!C_n?iw#SLC94EPQob1X`>wvaBin8S>%9f+GQ#o3@gUs{$@7fv@WeO~0 zb!`dp%(32wQTIA_;G+Cj=J}T+!YLZHrcvEm~1_?6-E$@@(xk zzFJ^aEjtU0E|6|mUzR_suC_MWyALUoIBp4nf@KGm4O*7JPb8B>oj%#Pr(idV`z$nc z6!m2>r`ONRkC|{fFlODDVKybVy$CN8+&XXEQ>u9Q2v2F^P!q%co7f!|(-PvaRXZB$ zHmJWvtlQd`S(kB-T5pOP^q zi>G+pz%|g;v2;R}r5T8$ktlL!24yMlQr6!(aNs~UKFk`BwD~uk1>Z(OZzb|S;o9SP z2$Uv`3mV1}vcOc+IF!y>Pz`)4D5bp)JQth}R)Xh)wIE;TFv|N(P~-M2a4R?m`~)}` zROguwD(?!X@%m;iJ6?;jr5SrD*9$+tmvCZ_%ozM-+W@o!#r%M@&jfV5 zS4mgBAszTC72i+en^tx$P-{(zKK{1)Z3CDeVXHK&0VtpK&i;#oZ5#PAcsO=6b6H(n6;)!Y_D(~c&RrQTF(+5PZYWJbZ3y2K zsgO|ZxJPBdI^1hAWPx}}7i;1gNI$RQ!HQx^&4?X~n03QKIg1f=d;G^JpkOR9tO8*m}s{IZw z+n+_*{w%7{toB$t&G)R`yk*6yKbnfwqRy_wD7QL4)Evw&wg>ZhAxa1HZ57+fZ+WCR zu+L+6_1Q>XoyS#TroZsliD80VYi|kIkw7v^H;Yl;{dLriv`LVNy2g%bb57Q)-6OQ$||n^7MqHW)#@a z6RdMQ(|M?Mo@SlBiiO0*?V zcN*7T?$-75A+;x@eic#@xjO$sH#jhiZ05oqKhgteahNRz`wPVW+d@C>EW(H zsfSr?&DM9cH6UZFDSKfPxk&`M6HU z`_DeRVd=_wZOgkm_<-$dzWmYAUdqRc&dnOyJU5U5eJB!3$(F=wGfzsWo)-2gw&gr} zqqM1V)F8{8u`idy4uZSu%n-kXVMV_tQYy{Olo`U4yvCk!2 z@{=tE$(EtXmf~bfNwQ^FvSoO(r8L=6mTVcBY#E(wDNnYHOSVi%woFd8#FH)6$(Cu! zmilB%Q?g}FvSog<<)UOud$MIovSoR)WmU2zk!)F)Y*{~c*WzUDg2l<+D~W3C6N{6L zEsK-eHtFH%#mVhG5Po{PzuMfdG571t{YLI^xXHk_9mZ~_x!-2)x10M{&HYYu zzsKA)Y9@Ew&z&fC8R&h)z_vZs@-ZN}W3RbCY3@%Mhu&ulZ2OV1d)C~aH}@CK{Uvi( z@g?;kH1U7UK<}T7-5ciqrm@=gmVxbW1FS4>%cnYL&m=z@pT#0z(RW8R5AS5@cUjyn z{%+mATzrzf?ZB+$4mA?btoL7C5w^?0%Sw_vo>#JVXabwu@shdkGxt}`{WWuc!`$EG zzGcT-hL+^nvLoNz58R}S=3dHu%Z@U0*FoCkj*;fBGqTAY zI{lj5p)=LV9XeCJWrxo2nJlvvHfeX_eNMqneJ|M?_fG8LUa))Yu53H$0^i{(39cf^ z8x8eLNIgz?tB3s;)Dy;)^N?m;v?TaTNaf@5XRdZGZ}g{%QKNB3{&W$6&XT2>%pKpq z=Wrk71e(T;4|8R%%_>gue;a)My&-!q!usBXcV7n1oS+qiK~!})1`XWRvZwX=3lyhX zoyLjD&Ym9E!+Fx+TOj8}gKvZTLD~P#*>kqe*bgPlUM{;qCdzJ*iLz5HYo}gh?cBnR ze~rk#0x~FN6e{*e3lc|$uWqD&b>N2~AMeo4lf>gwAbdi^}O%slyNSs?TxS z^g*LERu+unt;PdSr5V_Ay^+{8ESH$ORjxk4v!(71sXb7ujKAN9c89_HUSp?* zrAEGq%NzYOX8{koWTMKI{J%ekyPr&|WBr^f8h*A0GRLhR>V=%{YBF}(@)DS-JSk0T zjHAHU2IvGvc{1l$&1mhjAl5blQ91g7KZ~g2O6|N5!GSBgMv=h#a{G3%-b(h%S1UW# zY9nN|;!AX_G%s`^3ykr{RZq=$E+g$Sa`(#GE@NYF%A-2nQ9NpplUW_J%31=HzOWWN z5xf)}1@iA~J!gQQ1IL5wL3P-Vf?5dM0M>w;KrJC`0cU|pa1EFOw}acjUEsB#MCWzj zbKrLH@8C_~dq~?(Q2%^(3#htKyeio5bJ@eMqU_;UQH6S?(YOu?njBTA*Uy~YMWLOB zJR5dZXh*7@9qBeyVeqdC3XMLQf6yF6UD1HD+P&^GvP$*sr3Mt=KP>8aELX;I0)=q-L+DTAY zI|&MFCqZHDBq*$%1ckMeps;q#f&BZT?_WX;X0K<7#-V+BV!}C`A^368fqCt?IM6Y} z5`92mI7dVo`|UBUQhyZJ?EuxfBZlMrE~r`g*+<0wcwyP*UESk|VA!Nbi#Bb8|D?ye z3pO7p+I%InBECJAh{e$c&`tcRi_SAPD^8O-794vXl#(43ZF-%1t_*B{l_<@zv00W$ zYMX4(n3LO-n#X%z<1T{^Gd#9kcCVbm8jez+oKC6wmz=r!mGlr?5wI(Jd@K3wix_|Sn*$oE|xe>c{Oh>=xCO zH8%0&%`3Rd6k9ObRvvUdmz-YC;qJAqak$@};eKsI+tT7EBeXG|zjg1^wxohj%~&;2 znv{lLgZXGH&SXtFv<=wMxn}9??uBN7H*1CD9qC-9WHn9a(#!Hr=aOC~CaODj2+uSJ z{*)DGF(%C-+*FJNL7lRiTq&X2yH~8Zv^9L$FapeOUDBpVi0JKDp%pVb4DvLik z0rqF`1fKr_jt2h;IZI6;3?oPkoj`YcR^;%JuiZ%gGxVh=bjj8Jrf)Po&)MQ*16!ZU>uajUIm^F zP6hd#L@*7U2iAcSuG2w@R^@}&uY(3K2{wV(fU`jclVC2$U=hp%86<*ckio%(V{izV z%k&`ZgNfiT!LvcNBk@(W{DjL60HW*wAgVC95ntBsCPx(p;p{fEsf|4K>{9F&En#u4 zV`Y13=VG((S~`HSd$I#^)YdJ#lbO^Jd;IU~bRD_g_ac0a82osNPaWzH7%?P%Z0j`p4GXy19JIsa^SwRbhMi@hv( zPkFF*Vbjc6;S`r~g^&912@oc=;w3Sz1|1dS^LhS*v6C3Tg{vg^GIuqTK5^R4lQ+8@ zQQ%OM*QhwXKZm;)r=P~{#2oH^^7=>Ie#{lm5SP2KQyf~!ehb;7 z7lJCYR#19o8>nGvAvghC4Nd~v!D?_Z*a%(>HiJvR72s0v!=U^pz)tWE@WbG@z%Eeb zD|d;JSGnx!k|?{nB#N(dkz#9iq@xOh6GFR_Lc23UyRo4i-|2B-t3tc^p`C^V8%J8# zD{Wg{YTkCu5E7=UN1nYQLy2O@}Pa;s2}6{#9NggKMyPY5f+clHfw_Itn}3yzFD`p5(dzuKP<|WqfB)*FAz~ z)B~dl{Y;LSsQY`3tLZgH+sbt3Z=Xz<{<^N>R2PS7z5;L)RgR!CLSb@KW$3@G?*u%;n(O;1!^zgdYbhKmwW9 zX08Nh^SlvU0B!bllWUDw*F>smW?U2CVVYwgr^t)05AwNux%c3EB5d?X^H>zb;j>&}es`0FqstHUKa z&$W;A1{pj4IuM9^nVhV9qdO5`m$B_^aD6ute#c4SFn;|)aygTq^LHN$i)OBp zKow#sjewR?hxjv>UwnfM(G(JPsI* zB|?*kjLs3B=a>e6Zxp8*?qG1Tvnf&aX~C-+JBT?++aFB$5|i7 z9|_z1`qbD)%kUI=S*_RX>@9GwthwzAzaB!uXNC#S=o_q+G$q$(CcM?9yA9u|#)RF3 z(V1J0x(titvFIVQt6cQZ_8wEP`Aws~vn*fdVR+M%8nMd>HaU3e#Z%EkW>AMwDdyZ+g+u1%ob)gowiiPk~k(r zq70MD0+EtBE#kIuPh6j(Jb(9bWYG!(DOZ-dJfuDqQr`$E%?+(TtzcM6D;Sp2rzb4+ zsgQa!q?pq>*CWZd^>;={HHOr(km?Po&xMqPfyCA(E^oepYeYzx)emjo$_}UCt_*h_ z}f`x`LQ;oNolwnJgC@1fH$-)T^W8s=!oKI zbdpBSz$}OS`xCAsNuxK4TjK9TEQUM#2E>}uGXvDhLldaAx7px)a4vWWI1k(aHiNf< z{H0>gBjAU?J>UhPG_VW7AAqf(6p1$Qr(ip%ae68EI(P}F`uZ>^rMer8gKI#o9IOS` zgO`F@fL#yX3SI$zA7q};^DA%zs8y^hLH+IIM(}v@xd~*IAm{~WfmeYm!7bo5U=q9& z{1~XZNP#NQL*Zdp5JcG(1X1?Gg4V87evDmsY_GX*{}(~Xyt^x>fM*YQ?C+YA%gf45 zzY9e~s}a-Zlcy0>w`tYw3c*4m3k!eyia_ZI7( zd8RMbc##z>vj|lkCL%Kv?FUIfs&R=;U+(x*jmrnjzuB)(HLk)_vX`Z-fSmMK7Kwu< zW!=C@S)U^*MfYy&p^ez0pd{iHzAZ2%BfT{6dnJBNGF0UKRf!pV2CkKD8gp_~j7ZuXd>>vnH?F7biXHXUP{ z^j(g6^s*cqOnUSRqjoh>@TOV_Vav<6f{Ax1L}J~nYj_z0MYiYvn=X3UwFDf95h~L`x{Fs3IJRq_u^e z9CVfA@nLm_K3(Oa(C(ulbxTM+98$jsDJ=n5E+>XmMMzx~QmK&oT1Y(^Qu{;da0=e? z)26zmSj%=4b7DuOpjMHJlHl{9-NPaEN=WfJFc+dcq!^){9b=}W^oPbawg*D$=OGnC zd$6u2h19f=>Itc9p=_!i3hkZ?DXA}(%X^`$KVCt0cDyX*sEeR9vJVbALc29kHU#X9 zzIGev&6T*y-ka#zAc`WmBEvoN;Pqu0?wJR#*X3~c2d@j^|KS|&e(y~BoOb%=Wh~Ds z&6-Y1iFzmcoSFRF7oe?C(IY zQTpxzM}YT$Q^0${cJMxMBls=w^We9^N5TI9Uk2|7^WjB%GF$Esf;Bup1h#{ZfFB3< zfNb{%kAhkkd<^^p_&9h3IoJ!bdlNhXvdkNN2fPY=5@hWr_yPEJ@EPzw!5@RKgU^CT z(Sm;ho(=vKM8^!C1GQHCJoq{A1(3LcpMkG{wECVQ6zGfKY2Yuwx!_A+EBG?F2>cDW z7W^&9hqi*>gM1Atcpdx__*ZZ@_}}2m;M?GPC}$dK&r#rDkQc~vp=8lE45{ph}y`a=D7dcH+b3#qI`_nZ2 zQUXz02^z}z)V6D|i>jN<6QvE>d1A!hb@;QR0<%T=u(QR8j~nq3Dq19|Z*CoWLJzvh z@R1T^CczB$>7xN&c7$H~OUzE=LqltIS+%s#41FuL?KXTIBr&ONw_7&-rX{uQtD%p6 zl48}+ZFgFK$zB~ohF^bWbk93U)_q~5xr->Z?f%e5TCym+UATnBEd_nD(eag@ta5$? zzov{-8~s+;9uwDq74}%@B`rDG%79l%iA*Y~8f;FLlzgi}kA!b@$VYKOPkaqaua`<& zBu;6a87mujlt^qM`{?G@i)*sx>+NLRX*6C#AyMLE7i>be)b=+G8!hQ5S@^ImHuOPE zZ-p`So0zvlFKLO1a*^UevTTxbqz2{At94Yd?TmQSDxpf!sa5IAJ|tNsouedu5vHkD zC{;E^J|aGQ#wu~HMW97w$PWFRLrOcQ*6zC@rRuVFN02{DofT5&htx+x>PsQ@y^wk> zq%?q7F5^Q=gNU_bOTkgMgw(%7ts)gA!IPogt0AQU#fF^_QW{jO-A6-81BznEM@Oa<|_LoIo$m!djWwK=5Y5L zTK%anKF$?{eJARR*>-#f>Wk9j45i+``Vyy(y-`}EzMPE3IA?zjXMj>) z#()=tV?n89<3R1`jt8~;L_PGp0iFdO4X+8{Byb|g|4#&GgC7OY0j0`M0iOorpw7Hj zfJc+^N>Iy4RUo_2K{d!$RZs)o0Zs+K3D$!@0%w4K0cU|H&^~5^lR?@*&&41rNDoU- z!94J*U^DoAa6b4Z_#se@pbb10YzIkGa50EouoPSdE(cX-Tt=-ZA;pv z32Rr(v$e~)^Hg6qd(J+JEHajug`TXPCnvvnd%=u^Gn2i=F_i#o$PuFRLx zJx>X@gLVdUG)-R}H0RQyQAKEqAxGOcgA{Riqj=Tu4+X28CI3&C}d8ZxAlE zUAr>j$r}GR7DuIejq5fo!!`L=OZ=NMM=^pbtWk|-HTl&k`)+S)+fZ@Lu&mAJh-!}S z*9{|8R%D(AwU(>IykKRirJI1YD@G* z(|*WCuruN&Qtr{Vl)x_Yof7dBk6XB2crQ0=vX1STui%+I&aCr|s(xoEuzuQ+YRwzP zsdl6z+MAr^4`>%k$J1aj_#<#Q_$+uP_)}2Zz%PI^z!$;!;IF_H;IBdD?>FF;;66|S z_qU+peihV?(C-6j=f+o34CO=|6)b^gp}E{%NPg~nRM$Mbkh_P%KD zFPZy3bAQ#`r57Yk^Gli+nYQ%4Wo)#kv!yrR+z;WNwC{JB?Qkojl6H&HtQ}jueM@hd z@vj}uWG}}cxoh<-X%@WfU$G?3U$JcIRX?$!E!kU5j4iuWLsxR;ZdUi=5;d94O50~q zli94a>zw%!Oz~88ev@mUW@Wx>_b+_VP9ka;dGto{s%e#inwrYIPE{){Z-52hUqE_B z@FsX9_&4x<;D3V}yZ;WJ488^GG}k{sHNm&Rv%mx3IbiINpr;BP1lEChpqgersNrES zcmY@dwt3q-4;L+f% z;4tt@;IZJ>!Qr6F{diDK{3Oc3HgQq5iHowL*4jzbTDy&}@>dc1n5$i?magxIOnXk< zD)$;~-B77EztMd1sX&vaM4^2*ap)s_wYV{VcC$8lAKXg>oS)BT)%&Dzak5-91o2at z?N1q(=s|jutU+71J!4!l66WTMy;_O)sWYp!AwzX!CLNJgjxI2_2p%(+{) zYiY};Jhh;#bkqqp=%^Q%c_r^qH@|T6b5|TiewM{%+rs4igxC({odClp8mefkGAf>= zg!c_ROP3B`>ETNq&Ym+mRPZ^P$aRm_ixV5)EbThvzEbgGw%4?^cbZ9`kJr7?uz#L{ zw0Dou%Oo2Qkfn#>F8b#5ESbFlB{lh=vawzP4_sL zx2wzaT89(LPr;@&ZbkG3kM};wBR}3m=gm>I%+?F~T4@Om8Y@bI(IM3uQtF!4^^+m> zwUGKwNU1GYf0|EQN}|b9<3nmjNG%Pi9U;Z5MDBeG&fL4Ohe@Ervqb0F9mSDQM|}e7 z!^ZV?D5auL%-_b7H(I5XILLPv660EN)w3?G;%B;h?O`VFH)gnh?{F;L$--Gs+jF{$ zBjSO)NOVT|57qGR-uU<<)PAna4|OZeN~2z_9)1LbHCft;4#ro^tIJxnHoA&Uf(k^(%!y@7AkKr>S%K!U7X_&`>6T#y_4Lv7-Q^AE`19&312s{at9$5xz zs5lwC3p@q<9{7In_uxoSN5M`7hl3vgb%t;hI2#-dt_DvBmDX}lb$KSJ)%3C8=fDqw zdJp0(@Ii1Q_+9X9@Q2{J;IF_6P^TZNz$3|T4LAav3hFFP9mqQu!Fk{uun}AcHi23` znF($JXM;LjGZ$35n+M(so)6v)D!zxnR`6$F8~6)Q<)n6g0jM^mXEl$Jq{*&!i?XZT zq6+oOpm7}%-03L2ed~tE$QpO{z*cQub&rlU?yWI>9MO)HL(CavE0By(9<g#b=z_i!iw=w&NCtmn`iw@(X%AQjYX}G_ddguOgI)D#eid@J2q~$A*6vdwb$3WfN3yQJ4Jj!L z)=sC~EY%iLmxdItzdF}ngp}sPb~Mr6@JsOQ8%^4I@}>#bs5H+UO=@$v`_V*um}7Ie z`_ZJo(LixZ8uFIbI~fhK)&R3cg94u$bI$IajRt9g-;V}qL&Uot4J2{AQC^qud?FT- z%rYHFE9L)U@O|J?Fb-YLpeD&TfSMZL2uj!a45+hlisw}D7LYggg3p1fd*x4U?=-^L#Y9ndF;P^Z{!-Pr z4hdE{%Kk-#e>E&+rqFt2>u_$}rEZaD|1qeRxz=}5X0nY-gQN<(o;FpYb?p%!pI$+${4_%l~Emp3as;V^SPu49f-lQ|#%IF6Guw*SR5 zk83&CKud;ZndhHd;mP&Zm8Q8eX|HDV7%O{Idepq%14`YJVGqX4(~ksIy(QpqkmIZ7 z6%CrCnU@~}PR70ztOZX5)$A!zv*dU(coEOMdEc`Xr0Mo3-*hj-cMS2``LHNE9~M;@ zJdQ7G_n(d`H1E1uyXQi?*Ft|9d2Lv?Rvl3ZwD;BDVs$CQT-x538D-6ZYV)xhJ3rH) zr*&y&QOlhoAur4nU7I`jR#+PeZ00I4Qhg}dED1EDS!L{e^NUJ$NebC}qvoY&T|{pF z_B7MoOLhs=HO?>of` zy8@oA-TxI$h+g^sL=(!=4*m}{p`%zWR1+EostFwjstKI{stJt%)r3w0)r3w4H-M*r zYC@AKZ`*`K*(M~)HX&=LCS>h4zPestXniGB!=Ev+#?xKk|J5zkkRRK;504TpbJjAhw=CoXm}DX@Gm>dyWi=}!Rx<%2yAyKrnVg$XJd2Mhvue-8 zrV-v7&ee-ki6NZ*WRdBDjeFMb{!3nI_iJOH+p?hS2(BY}qosV}32T0KO=_+?ECKTz zY3F2acBEz`NWGSqDB~b~8I#Eg8fEyOx6$2Osb%GP4u{{|w0ApG^xPdnEVuH{?_u611NlQ)(1$oEZ#Ga$ym z)fTQ1RF_?33L>p#)R(QwnVn6Bk^9?+(Q=8%7Wle;7%J2KFx;7op}1`-yT>?XG%4az>$uL8XAYjqZ`ilO zf-SmtPT9D=!%C`CaZfLOd75TD&7s8P=`rs~ZVQMzWxS+O zERP?<;{^Im_r!B}OLaA?$$Xh->*e-8=(i@y>Ro3COGZsLWjiZ)#V z@mO`)5wZOZ1V6HS>^W`S1RuTi0Yz>8_}Yd}k?ENc4mCF5k+J9V5$Hrn?6%$d?QAW;kX>+Wq%gWN3i5@)IQy_Mk;Ixpc4k_(nSyzoymNGq&r;^~-(C*tI^-M@O{zin9&b-*L%^}qp zQoMBKTt6RDyF!Yiz0UP7A;mFTXU7R3M@CcD6rJVn53x(HVJSPyJ-Qw6JL)&{AKaB@rEv^6&@{nq z2V}gHxSo*S6ni4q%8$O!f4^JbU(Vk-=pR2yvAYVpasuk(I9ckW`3BRCE|ggU(m#CM z<}J+seymo)46EJQQR?^m%L>`Wv&SD5cm?Zj%$k!Fi!c1Oo0;lH8U7X_Z8zj~wkUP3$21a^}0jKf29&80U)NXduc^ShT0Qo5RHS9U$-t!>10sI-r%LqMx z05^hziE9(6wVBPJre(cgBX|{f3AhE^41Nr}2D}=)4lH3&>PGP6Jbwnf7Q7j}4!jk- z9{eJ>9sCM-1E?*9PlH+2KP58ee{0)7+J ziN9}yZ-V~;79yAK2Tukc0BgYq!3#iSN6%_-7kC}`F!&|#5pWN<8+;ku1M*Tq@F>V! zCU^|wbYk!XI1_vl9Z4HyUafz!ZO!3Oa6;0*9J@Ivs9;3Du1up9g%2@VF~6%>GPfk@S!LA1;FfYf<#I5-?E1|{>3 z0M7uA1SO}`E+p?Ns8hSeB+70vi7E{4q_(WxJ&x)-Xk`C?V)GM;0=^T)?2HdZnRQ2} zDjd!Zc#Cm;Z;Jo*JMh$QO4ck$m6(;|dY<~$@2h$8M!SenBk@ly8v#$Mf>BXNXu11U z9<9$yo6r2?Eb$bN30wmm`nke=e(axLXB-A+nTru0T6g@QeGGnwd^4M>=3OI+0dJHh zi4bZc{FDZ3-#tnvV!()!U7$qC!{904BcSrI8&uWR65cKtin0raq6*Ci)~((5oWH{0 zr;ZvDNW55oS|+sq-VE)`nMR%G;*%BoxFeRz%+sN6agY6>-ITgn94ZNphteEBcXggD z1`(54ohL=yL}pg!N3pBVSd zg1+f)V_{8c`Z%bnxfXmc_(@Pzcs)1*ya80YZv^G9a86q)M_Zni`*@t2Uq3T8`ZQLf4;j^2AS^B zj{RlaD>GU`4|d`q4Qim4Aoa#-7qeH~tT z@}>tutwwP#ca{r~^-6yWI1Ic9lwep0R)OuHj!`gPn2oe0;9{Paf?A`y1Y8BK1lNL{ zpvpr26;BiKSpgx+wk}cjRJ*k+=Goe9cr_md<`%*QWA`LCl}V+Y*POb)tOTO(Gil3W zncqk&IqZZHYK%{iowAzs7cnnt@vM%w-40?rLsY z^2$H7a#LMadf+I9qMa6);C{|qz&TgG<6E50eE%)3#j+!Ia(`Q9emjhwuzy9L{|_9@ zzlr~q$ta1btILWhl9cH%AG@w>7!S#9Qi@WCZ`qy?@(0vp|1op0Hs-#h$e&?cT~>hC z)|RnP?o+Nd>`{R~GSoMuGybn#+TNk>m>Hi^2F}Kpj5Zzh++rWY=j+|`3a32$M~3_F zGM=^dE#vuJ7{#1Ud(UYLdoIUNr{72stpmOmYPCs;1Yanq+ zJ?eqC{<+h9=H}0!1Osi=yodC6kSll#JOI884pv@b_VYI}Q12<_fhT~6fXXX=dQJt0 zfI4)-Mx!|@@E%aThGPXiYFE5zW+bNCuie!UWp_116$aC|Tf2Hk6`CGn?bPqAKb5q# zTOQhJ#mL&N5AC*uc2|dXnx|QRH-&b$hjw2L?RJHBdqTUpD_3`~TGiQ==-_+1U8RdU zySlnpCG7v5c6P03O9WM&-OJmIyJ?-KTus8zlo3?RY)3$tR`-njOiNlL(%Og)- z&G+{Ff9$!vWcFChr!e~4OJ@Ca>~s2NSNT4o&{-z;=2K)RnVk;pB*&$17+?MkC%=>I zK0@YoPxtvW|LFIb`C}JtiN|C033vxhRh_=nxsX-@51 z7R>eOp4q%CW*>a=;`Whg&TKb?4D>;bHnOkYV>i1GrOrx%9-cLiF9|*lHQ7)%K&|2` z3GU`@L#TIHN~t-|xW3MPqoHX3&QVKIozY`Yisb6`PPQgJQ#cR=z;V+qwz--y=X#pgDauB4YdVo0aQuwDJZS~mjpYZR8l48 zg|`ZxN`h~2zr#@XbJy-bN$?9OwTRr>(eH7U^5L7E`j#|0Js-uzXq)BEemS<*9~1v9 z_o#NnC>orTp&cns#qnQUzaKz5szRknbi8~0Nb9RgX__K5px$!|zGb|gGQmEE&uiVY z*L!{taqsJoyPT~+c~$AFETvt@@S1`7VD2Zukvv}qo(XdN+Ps)|16axPr@>j^&EOpH zv)~2b=fDfWuYl5p`Dmf}*KyuXHvc-#M-I(@tK1K&A3p%z20je_JNO9rEpRuu3w#v( zA@~@mI(Zyaf9)dORhlEYZgr?KYdmE!r+hbMV%{FoxZgFuyvb)11M>E zL3}Z7?(}k_j9Q!1+q*gzCDwEhorW&-wKGJfnbX@l7It4;Hd~hJ?|HGk?@#lI?P!?T4W= z__*dO2u6MgmFQTPFwb`E%8QM2Pk;E-b2J>~KAKY)!MPY~g_ju|QXjPz*py~)M%WOl z#<|b><>_0qIUi>H42^Iu2swYzg)GS8tg$*TcB*rqdrtX?Y|cZBAB|o<&4nQ)StnDN z#aX=}FILK3Ci&)lDE}lbtuzpv_<4!D=R7o|6raq{EY62x+sAqD;Bo{(Cg&pKNAq9L z`S6fpmSD``S)8RjjkO zr<|V6`AFj@K|@oy$Q%)J_Orhu4CmGr9V-^C(x@ks*;-1l%Ztr2Zj^WG2pYO#jkZI{ z*1XsztW~=*C1G6Ol4oO+$yxLByqI)1nQb@RjLMM7`50XCVmC!NA02Xj(Q!UH$mFbb zvAoy}?&@b>c=YysCiB@X!czxEI z-LvwZwz2A2um8x%PkQe@4x7A~#%@WO-+liD?j$9xRENtowhkV?RF4Z&xWsWj&ZGyA z8e5!E3T3{RW)qby$K#q8+iraEqSTLH-jE&pzZpL|qU&QnK8*c2$N6|$8WE`_t%CN< zUAcMqs82KeiHf$CQl9f-Z*cdec0x#@0UL9I;oQ1-Eq}+@VXd;_8i9RZTuVOrA5&5NeJFn;z$IG-AF*4Yx7Qw`_V#jDvUw>E*ZNpvh<9<_&@?yupM}giLH}t0LxXO*6`H{HJ2;-XP;yS~|g~VRn zk-)!+u!)3-b&iIMOH8zav^DeHjS-BXW#(C(MY7mi`oIjYwd3?xO`}8v7vpAoHZC-5P zKB##|dLKM1_W*;`e=2I38mc0 z^xpF#cQTOHq7c4tu8-vFoG@RUt1#vqo1REponk`G*_`9Xk5(vrwx)!X zPA|wzF`Py5`mZykE@zEdHoQ!h;b&)>O;k!$;4?4Qs5{sG*jK)uox)1vCn|p`!W8ay zoGZckzg@U1JFaTu=N|m{(x?il<1`__RE2S!>udsJ6U|o*{_0$7Elw$)#W(XWO1HqLLGpayc|g7eL6cA(~KXjHThgj4XK+Q z=c!>X?sYac7X%IdE6paFuR6o|OgPKSqsgI&A0E>3HQo5BCWT(NsS9I2TGJy;oryil z`8;g%VxIGYF9aL1IoBIMQO@UuoX>Hb&&%T6U_!k@GSxHJ-(Nvj;~_20rUk~-2z`k) zgjBoZ++aCJ+jdQQ1X*LV{I~_!nKzTFMgvh)H5!W{G^9cFV2f~ zbC>zq&gYrVsYS^gd6-4{v39eZjjhwx#T}iCtrza48Jv~=yqHFLnbF_*01eY~Uf}r1 zPrB5ajZI!`7k8D|6P4#6ATvvKj`8y*)_#^WJ1o`DIL@=P(lghDl9nrzTyn~led*cl zLdj2h`OL#6FLsoIV8-l!@VLHE|LsD_PkJtzvB``5lDl$o*(U~lJUbWjjh|>Pn!{Y2 zAyI;9&dSC4*xIpM?$_RXGb+C?)n*q;e$sRCArs2y;y?B_(jI)MZ7!7jr03!S6Kb9A zT!%h&6>42(T`VwuhGXqp_yr-g+i||Y<{~nJTxde+Z#IsAdimUE<6wwX{vxy$T)_0F|@ zWjM`+lArW4T!>9xOkZp~3F?K0Pkk{vJ&TN=`bc^fhUr=1I4{h~X}bw^6?d2iou~ce zscg<2#?Q!DUm3QCoIme4w`XxypSCL%5*u|-p8Bb5&KDa$?Get4L(We+&Wp1+FEOF+ zM6_@jnw&Yi}O zv=k?7f|ViXb&m7OEY7P;sEyo}(`_Suc1AX5ik@25{)jJ)RUx(AabA_hx$7NpUY*6c zE9Cry zbY@CJx{WXAH6iCy-h(4%O%`V(8)GNqM%4!otlv*~erYA^aW!_?MPe)7>D_wgCy_{fhO*RxwfukoWVJ-TWS zHiw)?JI0XVjioRT-}vH>P|_Sw%&hHfFZYBc+kW#FRv3u9B$CSrU~sCWBMP#Lus2s+e!8 zWy)9{=JTY~+bAQs|EHqNRUF-k%1aX+S!~FDovH7p?nHgfnIFvQVX7%mc^FIOu34%s z5jH__Fd2YDrTJ&}oL-tLYtnsvs2^|Dk;v*hR$iP~Qp=yOS9N!Fb*xO}3Nw9rBt%7m z_qKBRnm^q{Z$2b5i&fB^e$)`mr(dhs%3j{F&V2#4U%zyceoK{dQM&NbZ@E@fn36SK z`YG9p3X^O_G(g!>1&T}g(qFyiN^hi*S60TW>&~m0UQ<&MZ|qD=8Q->Y%6NM5l=0f! zpHfy;=^B1TdwYCNSKFe#%AQ>@zj>Uos_$6Su{=H|?j9RD+q-ELW8%}ADyu(4TBex( zL{wFkbxjrZ^|dalDdUyGtf=fu8Wk(s=dA6lTGG~4)!E)Lr;|4vbLFK@ktoAeoKEPf zTiM>RuAcWHb9tSwDsAdqMH`~^$XBK;SKpNzYv`5oQoFQ^SaLFv zpLudILB|-uU$bIW;?n-Sw>F9+C2XYAoX&xB;bnJI_v$5;ZHq3+&6S)qRT}wWPQn?M z{T50i=M!?X$;=Bmqjjphr<64;T{*99d3Q&=EVJ&{nW;H8l3(c2A@_NZ>T)4vc9pQ@|^}Zv9~T#f9mM! z^698*h*zK2R9Rcy(DY6jF*cA6Wz>vbK3Ld5OyQdHG7ZW~iMn{>jLN#&#@eYy-I_9f zrNokydW6$zE>&klFgf8;8$YkMrna%NW~z_I7qW>vEL}T{D@_Abcy^jo2s%)%*36MCesQB6xp^pNB_vy=QS)+H9-jz@6|*Uee2D%+?=Cg zWK?K~H&stRud%keBHnENHfzebwlzzqjCW&!XCBc>tV(qd<|bVDXAk|Rz3)5zxx5(Z z8~rBx0G?=gIX=XdE5I}(2uxF*SC^Hq{zI6wW;y$D#1~XnE%aXjK1fy?`VZn#-S;Vh ztn~O+G3Ctu1hJ1c+EfOP@nA}{UKz+rhzh28oMs8(Yc+9XHA8r7W1kGDs)|potFN9` zhwzHL%YYQ(UjgT3Z{smnW7=xtr73Oi!0i5+5_p3q~TXshCzjtpTAwShSMv~^Ku=Os%!f_Q7h xYDveUOPoWT6q#x~Sk2gBHD}#8UCNftSq&8x4b!ToR++L{Ym23-UKlB({{`c-1lj-q literal 272368 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