From 4b6de6647b1bf7a40c54c45b0ec890dbd117000d Mon Sep 17 00:00:00 2001 From: Thiago Camargo Date: Thu, 4 Jan 2007 17:25:30 +0000 Subject: [PATCH] Jingle Extension added to Smack Repository git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@6517 b35dd754-fafc-0310-a699-88a17e54d16e --- jingle/extension/build/build.properties | 1 + jingle/extension/build/build.xml | 167 +++ jingle/extension/build/lib/junit.jar | Bin 0 -> 121179 bytes jingle/extension/build/lib/smack.jar | Bin 0 -> 260948 bytes jingle/extension/build/lib/smackx-debug.jar | Bin 0 -> 55602 bytes jingle/extension/build/lib/smackx.jar | Bin 0 -> 327428 bytes jingle/extension/build/merge/jstun-0.6.1.jar | Bin 0 -> 73886 bytes jingle/extension/build/projects/Jingle.ipr | 315 +++++ jingle/extension/build/projects/Jingle.iws | 635 +++++++++ .../build/projects/JingleExtension.iml | 51 + jingle/extension/build/projects/Smack.iws | 593 +++++++++ .../smackx/jingle/IncomingJingleSession.java | 421 ++++++ .../smackx/jingle/JingleManager.java | 703 ++++++++++ .../smackx/jingle/JingleNegotiator.java | 354 ++++++ .../smackx/jingle/JingleSession.java | 1129 +++++++++++++++++ .../smackx/jingle/JingleSessionRequest.java | 106 ++ .../smackx/jingle/OutgoingJingleSession.java | 440 +++++++ .../CreatedJingleSessionListener.java | 32 + .../jingle/listeners/JingleListener.java | 40 + .../listeners/JingleMediaInfoListener.java | 50 + .../jingle/listeners/JingleMediaListener.java | 42 + .../listeners/JingleSessionListener.java | 75 ++ .../JingleSessionRequestListener.java | 36 + .../listeners/JingleTransportListener.java | 56 + .../smackx/jingle/media/ContentInfo.java | 77 ++ .../jingle/media/JingleMediaManager.java | 85 ++ .../jingle/media/JingleMediaSession.java | 119 ++ .../smackx/jingle/media/MediaNegotiator.java | 555 ++++++++ .../smackx/jingle/media/PayloadType.java | 289 +++++ .../smackx/jingle/nat/BasicResolver.java | 102 ++ .../jingle/nat/BasicTransportManager.java | 32 + .../smackx/jingle/nat/BridgedResolver.java | 94 ++ .../jingle/nat/BridgedTransportManager.java | 75 ++ .../smackx/jingle/nat/FixedResolver.java | 67 + .../smackx/jingle/nat/ICEResolver.java | 85 ++ .../jingle/nat/ICETransportManager.java | 46 + .../jingle/nat/JingleTransportManager.java | 54 + .../smackx/jingle/nat/RTPBridge.java | 462 +++++++ .../smackx/jingle/nat/STUNResolver.java | 509 ++++++++ .../jingle/nat/STUNTransportManager.java | 51 + .../smackx/jingle/nat/TransportCandidate.java | 855 +++++++++++++ .../jingle/nat/TransportNegotiator.java | 842 ++++++++++++ .../smackx/jingle/nat/TransportResolver.java | 433 +++++++ .../jingle/nat/TransportResolverListener.java | 48 + .../org/jivesoftware/smackx/package.html | 1 + .../jivesoftware/smackx/packet/Jingle.java | 504 ++++++++ .../packet/JingleContentDescription.java | 278 ++++ .../smackx/packet/JingleContentInfo.java | 138 ++ .../smackx/packet/JingleError.java | 102 ++ .../smackx/packet/JingleTransport.java | 409 ++++++ .../jivesoftware/smackx/packet/package.html | 1 + .../JingleContentDescriptionProvider.java | 125 ++ .../provider/JingleContentInfoProvider.java | 106 ++ .../smackx/provider/JingleProvider.java | 128 ++ .../provider/JingleTransportProvider.java | 231 ++++ .../jivesoftware/smackx/provider/package.html | 1 + jingle/extension/source/overview.html | 4 + jingle/extension/test/config/test-case.xml | 13 + .../smack/test/SmackTestCase.java | 368 ++++++ .../smackx/jingle/JingleManagerTest.java | 1016 +++++++++++++++ .../smackx/jingle/JingleSessionTest.java | 51 + .../smackx/jingle/JingleSupportTests.java | 74 ++ .../smackx/jingle/PayloadTypeTest.java | 89 ++ .../smackx/jingle/nat/BasicResolverTest.java | 101 ++ .../jingle/nat/BridgedResolverTest.java | 172 +++ .../smackx/jingle/nat/STUNResolverTest.java | 342 +++++ .../jingle/nat/TransportCandidateTest.java | 59 + .../jingle/nat/TransportResolverTest.java | 50 + .../smackx/provider/JingleProviderTest.java | 112 ++ jingle/media/build/lib/Speex.jar | Bin 0 -> 94008 bytes .../media/build/lib/commons-logging-1.1.jar | Bin 0 -> 52915 bytes .../lib/commons-logging-adapters-1.1.jar | Bin 0 -> 20937 bytes .../build/lib/commons-logging-api-1.1.jar | Bin 0 -> 44598 bytes jingle/media/build/lib/jmf.jar | Bin 0 -> 2084994 bytes jingle/media/build/lib/jspeex-0.9.7-jfcom.jar | Bin 0 -> 100003 bytes jingle/media/build/lib/windows/jmacm.dll | Bin 0 -> 49152 bytes jingle/media/build/lib/windows/jmam.dll | Bin 0 -> 53248 bytes jingle/media/build/lib/windows/jmcvid.dll | Bin 0 -> 49152 bytes jingle/media/build/lib/windows/jmdaud.dll | Bin 0 -> 40960 bytes jingle/media/build/lib/windows/jmdaudc.dll | Bin 0 -> 28672 bytes jingle/media/build/lib/windows/jmddraw.dll | Bin 0 -> 32768 bytes jingle/media/build/lib/windows/jmfjawt.dll | Bin 0 -> 32768 bytes jingle/media/build/lib/windows/jmg723.dll | Bin 0 -> 98304 bytes jingle/media/build/lib/windows/jmgdi.dll | Bin 0 -> 36864 bytes jingle/media/build/lib/windows/jmgsm.dll | Bin 0 -> 57344 bytes jingle/media/build/lib/windows/jmh263enc.dll | Bin 0 -> 106496 bytes jingle/media/build/lib/windows/jmjpeg.dll | Bin 0 -> 143360 bytes jingle/media/build/lib/windows/jmmci.dll | Bin 0 -> 28672 bytes jingle/media/build/lib/windows/jmmpa.dll | Bin 0 -> 380928 bytes jingle/media/build/lib/windows/jmmpegv.dll | Bin 0 -> 77824 bytes jingle/media/build/lib/windows/jmutil.dll | Bin 0 -> 73728 bytes jingle/media/build/lib/windows/jmvcm.dll | Bin 0 -> 36864 bytes jingle/media/build/lib/windows/jmvfw.dll | Bin 0 -> 45056 bytes jingle/media/build/lib/windows/jmvh263.dll | Bin 0 -> 184320 bytes jingle/media/build/projects/JingleMedia.iml | 74 ++ .../source/org/jivesoftware/demo/Demo.java | 157 +++ .../jingleaudio/jmf/AudioChannel.java | 439 +++++++ .../jingleaudio/jmf/AudioFormatUtils.java | 51 + .../jingleaudio/jmf/AudioMediaSession.java | 155 +++ .../jingleaudio/jmf/AudioReceiver.java | 143 +++ .../jingleaudio/jmf/JmfMediaManager.java | 119 ++ .../jingleaudio/jspeex/AudioMediaSession.java | 209 +++ .../jingleaudio/jspeex/SpeexMediaManager.java | 101 ++ jingle/media/test/JingleMediaTest.java | 362 ++++++ 104 files changed, 16411 insertions(+) create mode 100644 jingle/extension/build/build.properties create mode 100644 jingle/extension/build/build.xml create mode 100644 jingle/extension/build/lib/junit.jar create mode 100644 jingle/extension/build/lib/smack.jar create mode 100644 jingle/extension/build/lib/smackx-debug.jar create mode 100644 jingle/extension/build/lib/smackx.jar create mode 100644 jingle/extension/build/merge/jstun-0.6.1.jar create mode 100644 jingle/extension/build/projects/Jingle.ipr create mode 100644 jingle/extension/build/projects/Jingle.iws create mode 100644 jingle/extension/build/projects/JingleExtension.iml create mode 100644 jingle/extension/build/projects/Smack.iws create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/IncomingJingleSession.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/JingleManager.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/JingleNegotiator.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/JingleSession.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/JingleSessionRequest.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/OutgoingJingleSession.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/CreatedJingleSessionListener.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleListener.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleMediaInfoListener.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleMediaListener.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleSessionListener.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleSessionRequestListener.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleTransportListener.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/media/ContentInfo.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/media/JingleMediaManager.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/media/JingleMediaSession.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/media/MediaNegotiator.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/media/PayloadType.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/nat/BasicResolver.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/nat/BasicTransportManager.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/nat/BridgedResolver.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/nat/BridgedTransportManager.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/nat/FixedResolver.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/nat/ICEResolver.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/nat/ICETransportManager.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/nat/JingleTransportManager.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/nat/RTPBridge.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/nat/STUNResolver.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/nat/STUNTransportManager.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportCandidate.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportNegotiator.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportResolver.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportResolverListener.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/package.html create mode 100644 jingle/extension/source/org/jivesoftware/smackx/packet/Jingle.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/packet/JingleContentDescription.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/packet/JingleContentInfo.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/packet/JingleError.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/packet/JingleTransport.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/packet/package.html create mode 100644 jingle/extension/source/org/jivesoftware/smackx/provider/JingleContentDescriptionProvider.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/provider/JingleContentInfoProvider.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/provider/JingleProvider.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/provider/JingleTransportProvider.java create mode 100644 jingle/extension/source/org/jivesoftware/smackx/provider/package.html create mode 100644 jingle/extension/source/overview.html create mode 100644 jingle/extension/test/config/test-case.xml create mode 100644 jingle/extension/test/org/jivesoftware/smack/test/SmackTestCase.java create mode 100644 jingle/extension/test/org/jivesoftware/smackx/jingle/JingleManagerTest.java create mode 100644 jingle/extension/test/org/jivesoftware/smackx/jingle/JingleSessionTest.java create mode 100644 jingle/extension/test/org/jivesoftware/smackx/jingle/JingleSupportTests.java create mode 100644 jingle/extension/test/org/jivesoftware/smackx/jingle/PayloadTypeTest.java create mode 100644 jingle/extension/test/org/jivesoftware/smackx/jingle/nat/BasicResolverTest.java create mode 100644 jingle/extension/test/org/jivesoftware/smackx/jingle/nat/BridgedResolverTest.java create mode 100644 jingle/extension/test/org/jivesoftware/smackx/jingle/nat/STUNResolverTest.java create mode 100644 jingle/extension/test/org/jivesoftware/smackx/jingle/nat/TransportCandidateTest.java create mode 100644 jingle/extension/test/org/jivesoftware/smackx/jingle/nat/TransportResolverTest.java create mode 100644 jingle/extension/test/org/jivesoftware/smackx/provider/JingleProviderTest.java create mode 100644 jingle/media/build/lib/Speex.jar create mode 100644 jingle/media/build/lib/commons-logging-1.1.jar create mode 100644 jingle/media/build/lib/commons-logging-adapters-1.1.jar create mode 100644 jingle/media/build/lib/commons-logging-api-1.1.jar create mode 100644 jingle/media/build/lib/jmf.jar create mode 100644 jingle/media/build/lib/jspeex-0.9.7-jfcom.jar create mode 100644 jingle/media/build/lib/windows/jmacm.dll create mode 100644 jingle/media/build/lib/windows/jmam.dll create mode 100644 jingle/media/build/lib/windows/jmcvid.dll create mode 100644 jingle/media/build/lib/windows/jmdaud.dll create mode 100644 jingle/media/build/lib/windows/jmdaudc.dll create mode 100644 jingle/media/build/lib/windows/jmddraw.dll create mode 100644 jingle/media/build/lib/windows/jmfjawt.dll create mode 100644 jingle/media/build/lib/windows/jmg723.dll create mode 100644 jingle/media/build/lib/windows/jmgdi.dll create mode 100644 jingle/media/build/lib/windows/jmgsm.dll create mode 100644 jingle/media/build/lib/windows/jmh263enc.dll create mode 100644 jingle/media/build/lib/windows/jmjpeg.dll create mode 100644 jingle/media/build/lib/windows/jmmci.dll create mode 100644 jingle/media/build/lib/windows/jmmpa.dll create mode 100644 jingle/media/build/lib/windows/jmmpegv.dll create mode 100644 jingle/media/build/lib/windows/jmutil.dll create mode 100644 jingle/media/build/lib/windows/jmvcm.dll create mode 100644 jingle/media/build/lib/windows/jmvfw.dll create mode 100644 jingle/media/build/lib/windows/jmvh263.dll create mode 100644 jingle/media/build/projects/JingleMedia.iml create mode 100644 jingle/media/source/org/jivesoftware/demo/Demo.java create mode 100644 jingle/media/source/org/jivesoftware/jingleaudio/jmf/AudioChannel.java create mode 100644 jingle/media/source/org/jivesoftware/jingleaudio/jmf/AudioFormatUtils.java create mode 100644 jingle/media/source/org/jivesoftware/jingleaudio/jmf/AudioMediaSession.java create mode 100644 jingle/media/source/org/jivesoftware/jingleaudio/jmf/AudioReceiver.java create mode 100644 jingle/media/source/org/jivesoftware/jingleaudio/jmf/JmfMediaManager.java create mode 100644 jingle/media/source/org/jivesoftware/jingleaudio/jspeex/AudioMediaSession.java create mode 100644 jingle/media/source/org/jivesoftware/jingleaudio/jspeex/SpeexMediaManager.java create mode 100644 jingle/media/test/JingleMediaTest.java diff --git a/jingle/extension/build/build.properties b/jingle/extension/build/build.properties new file mode 100644 index 000000000..a15542f03 --- /dev/null +++ b/jingle/extension/build/build.properties @@ -0,0 +1 @@ +jdk.home.1.5=C:/Arquivos de programas/Java/jdk1.5.0_09 \ No newline at end of file diff --git a/jingle/extension/build/build.xml b/jingle/extension/build/build.xml new file mode 100644 index 000000000..f7e950a54 --- /dev/null +++ b/jingle/extension/build/build.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jingle/extension/build/lib/junit.jar b/jingle/extension/build/lib/junit.jar new file mode 100644 index 0000000000000000000000000000000000000000..02ac8fb5b2841a1a85264dad1eb3a300e76c909e GIT binary patch literal 121179 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 R=0)Hq3pmwn@Mk={{{!pFA6EbX literal 0 HcmV?d00001 diff --git a/jingle/extension/build/lib/smack.jar b/jingle/extension/build/lib/smack.jar new file mode 100644 index 0000000000000000000000000000000000000000..8576e5b19d3edeaefdf8978a1485a738a87f2241 GIT binary patch literal 260948 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%0A%Bf<_HrBSmV2tT?6K^yX+>%uGooo=u3zVYuB}m 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 O^OE3vngTG&!u>yi%IuZ^ literal 0 HcmV?d00001 diff --git a/jingle/extension/build/lib/smackx-debug.jar b/jingle/extension/build/lib/smackx-debug.jar new file mode 100644 index 0000000000000000000000000000000000000000..64336e76719975d69bca637c24a20bddf1bc9c0d GIT binary patch literal 55602 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 Coc0I+ literal 0 HcmV?d00001 diff --git a/jingle/extension/build/lib/smackx.jar b/jingle/extension/build/lib/smackx.jar new file mode 100644 index 0000000000000000000000000000000000000000..4c7f358ba51f8a61da5f66980eb289c8697a3a6a GIT binary patch literal 327428 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

L0j>IGka3X%1&<&ND{S)Md}}KB3+x z`G_~Zg!2IDDjIk318f_BZ0~Y)6|;VTYV}3C!Sn7CzelRxKhKJ^#Qa z=|A=5KSPyuhjk?+?Yhhr`30huRz19!HtIy$S}{zUu>H6e8Tv*=yiPci6#gbz1YmWB zIxU5)7X+QxwJE;28T7sd+xH*3J($}+DhN5P&BmnO@G>1AS3Rq})!*JfpJ=-QQ~ITm z5$W>WM1{eI;D+c)T~U>_`rhfb20ibde2{QU(EQ>1LmaeY`h;J`MQaNTkbo15k`155 zbZA9u5rpOW3oasx04p!p`Y6{-+NswdK&T{Iqm*4HIE!X)sn<)?tbfV(>TNktb?4w! z6x+;pov;M@&xRj{Hp1(LUv+E+`J~<<2mAFXziFSTT9HPn^=8y=E|} zK`GP#&TovXGYE>PY&2bnjG{>IKImL>P1%Iz;_|MB))?BzBX|JL|R}eQZebS|a{8D|dW(v4hHhJz4V`nps68xO+B>gPG=n?vJ@t%pLKbu6SRTNEGs9LR7&ypXmnKix+D0qa#~c11 zEK%eXGV~v%q_0LNI-x2+$y|?bS@6Y8PrOffOBqL$x%%MFi&PkH zce%})-(mwH`K3VF3U`Kego|M55c+JBkCmnsnwPet^G#>}{> zHYcB#WW01Q;a7lXAdEmVuDi<1c7W2w7i=|}vhq!Y94k^_7*mijIMMwJhD3Ls0Z)80 zjVa4-b^#K256o>9nxG zQh*Zh#_AxgZgB8Qto-3z<4*v=Z3 zI}($UlIOM!Ry!H>?P*oWm7KG$c(z?-o?cA4KhNW*0i=4B>~N3P=|Yjx6|H3I)kF8x zf#D~{)r`6e*hS(pEjk%^jgUIR_l92E9gon!fAzMaz(;_7=bQ5k7 z_I0E77RhKNVrf;ma?(J(a=;Uv`E*H#i)r0kotG*BPwx^xO6lbRen?3J6LqdtsAHkqDt zg!}EO-_n4bN11{$DbAt@OX%X8E(9FLSKy->ce{$#2~HF4Hxf4wSk!k(7%5AMIksjZ zj;(jW+73deg;gzS!C33JaW|u1->`xrn!RLwQi9wdrms>DZ7j52k0NcqDahejRcSQ%g$#mZ16W3PaI2Rxh_avK^* zSjk!Bu9e>%CS^j9jjN5Lt(8HOScGlLkUklugK@}m$CQwGsDvai2m(RDqCcY@Qf6?( z*kmUxfX7~(7n({Yfgtm4+c`Tdk2&4?KpmS;DRO^ltv|<2V(`0q{duRc7z5AxL-IwA zkwYO~MRBE09wC`Z(Jh;wI=r!Kl-I6n!?Nd7tzO&9!l?gOY^+EaD`Mk?#+F9k!mljW zFozf)dOtY83Iz>dwGw6C3(q)8cVL8w)C)3UQ!?7v>)+S>;h;8zJtQL}PUYd@v5TRo zHKT22g6Nqmy=cZtun}w|Ba#(%*~#3?eYeqY&vw~l3esIZKd`nyacv=BmIAiTAhIkV zU={S5k(6mRm~CP1fWuYO!d;TEzl6%{MhUn3p`PzYu>kDKlwccbCH zyE#_raW6~nwJrLer%XQxIabMWFBcCys6$riXP=8_nC(bxh_qy#OYXgv0i%{jw-(Xw z+ly<1&GFjp!w^_{h87{FY4NWIxdBV;aNiR*xInO%@hx(^D-^4q-AQDEN^a_$;#4nq z*A#gBg>jy!&wD)Ckug?1ct?IhTuGaSnD?{Umh6C0bMpysYB(c9EeO#`*MWBVMcU2= zUC%^cmv-Wcar5pm`3QjU?lbuC19b0E`1Cu!N3q_5ZuMp_#zM*0tBy|X89B4DzVD8> zr4PL#K@fjKP2wC#$@Gn5(Eirq;2+3D{+|Wv{~($|WlP0* zIXG@q2}}W?3a$ZAz`RF%A)!NM3RwObKxem-ZK?6Xf+BHJae%MHDYA)@eNmq0e5|LU zTqg;8kkqM-&34!6(XIOQ`={*d?jMmmzawq9;^|2AxdOq_0cz8cTqHzL5fF-kq$S*F zF2404;EsKn$+H2d2q;8U;qS?lNLmQv4q(*+ZrB18fylu#aaS!#A7T9JEYdd9m}&cV zA^a3^^|q_)P`gSx>+?#2jE-k*mggom;lAypJ*5f8#|s@@!`PO?o6A;J9Kh6Xw|vxd zW7^Kfjy|gk+S-hBEUqo7hXJ38VWcTDr&OaeXkj+=Ku49f%5;%B9e^GVmQn4HAhdS#+KUhaOYmV!?WF?l1iknSV-^mTu9W0u ztcq*;C+q1&ERB+H3Zj8vAQC~C2(h7vkh7Ie`VyRN(&1AyUvQko^wz*V&M_ zgKS0@p`pSMd@~=lOy!zxgA#l&mrKU>&>yiWE37 zI0Q(XfkGr3T93xN%`t3@n}OxCiK6FiE91O56noqQ}^a7_=Ku6~|Xxf~yG5Pb|j07H*&-Vkij`q;(y<}T-q?t!W_ z5`y$QS=hHDe|D9x-?uKvLpRG&=9=4cF1!2xV(p!SGf~_0!Px28wr$(CZQFM8#yX0GvU=X} z%5w(O9?h-he&arU^h9S;rMZd3oA356&DHDL^^sPECdEZgph(@5G1+W1`h`yD4ohf9 zrxqO+dmnMD(en4A215YeW}G=LIv5sTJ1I$={bwQ@`C|@=NCI=|s4{b7M&f*ge_ngM zUcNjcB@qb`H*oB?@|u2*U-a_DSl>D0%~%a6XiU&Qka&qLf1lG79-7Xy2#-*9@<#VI znJlgK6q;Xuj1Ww;VABom3496m@2$!89RhtfIqasr9$}Qsn4HzGV~rbTO5q3cyEjbt zL#)8i;7rE>(j9@1BaPt``4!VYrg9Wib|k9eJY{vSsB$j{_j***hFQFLfdM9e5*I}u zOCpMrC)^!$k0weki^$NstXqBDyaH$QEw6a_*k+qw|Kf9f8z6Ff3@q%W27N3$4pK&i{S+x-3-up1OwOpZBp6TmlC>)DVmfHO?Yfo?zG($+$Wha z$R--_r$6F)tC4EnC%KCI|0}ubKMLSKTl&k`emaWr%{Ex%ZA&e5M#;RfmAq}(!4(n| z$QLldlX60n+HHV||%|6HKKAs5H3{;g54**uLtxv92F zsFthAyfYc3hop@qmR`kRhg!wJW1t4>0mnvch`$;GE0b1}tf#YPlYC5w`J&gB`^a3^ zL{2cfav6@tU>R?$;7W6#k!D@(0kE%0b6sYSqh%q-pyyB4CBNd>%QW@N!_Jbg_9H~PdjVdoqgX#y&Kp?T=IC4Tk1p=AGYj=&*E zrn>psGF?&`4xu@TlXn`?F;DtUP8+V9jko6J2>)vh7cKu%DR_ucwK?;+cY<8-=j$(B zin?sl^i1)$+bWMwZpGrpxbR&$zZ?C}wf&_HUj=$$t(+ozmji>LE``gXWDehg`Vk=f zDQ}1JZbAv=BqqwJvdVlzeTjQO6K8y5#v}9{!fi3Q$9n;k`XadXhfrcveK-h;vZrY+$%{;0EyE1hC)|+50-0sUVp6d)yF11ozrG+^M+c^HWL;Je( z>UH&zmzV6i5ukMvgB`}Ty1U4$9(L^zpmi$yy3#bOFT+nFICX`AG#E3btrCXU%0);OY4eRl6m_l5FE*qyNmUo10nqk89;B~sHy6m(+#AYj_vDA zlU_XSabB)>hQ%HeJ~DqT1PF2Xmu|m{|9sD7e}KGyMQM74O?QMfdykbPx($!qqni(E z6N9^f0>6Pq(;<$-OYDa)+{c+;Za&N&h$HJIb;B>+7QfASxmtW&HZ%kK*yxF58vg6{ zTY~Z;{`?86%l|(t>i&e)f8Txo@>*rLUHhu1UxF$s##GDh@KyPiZq5?Apb~oNUSIo? zT+7g@3CDwj?seVZApH*^abzx1`Sk06z+RuyYzH)A=}dpbmd|y^Y0hchDZdXz!28ow zJ&?Gf@*VdA%&1yug1ra<`C4ZsamXzFzRQ;JE~$qHGCxBVLbnkQ_x%0&SNOzfd-gP-(GQ{H6XPnZzxl+xV6{N2@J;PUav5IY( zvi--MH6d{hIhp}UcZDt+nfoElWM+k0Y*B|1!0y%gU_bFS9d7o(ZHNjo8y%1OGhu8n z+BQR|Zb!y}c4rBmi;u*SOT07#gFqKDN~(=cN-sKsbe!#alxg(b-X!N^ z!hJLs9SIOveM2IUl`)JIhuScg69kn*f|QWALg~K=mzZcO zxfP0OvoNje6iqmG_;RMkSf#dD7+AQbwVj)KP&s3|`(pq#9(pRNWE!*MRSVU70Yt;H zE4rwx4RrCYLuVfVX5YgoRUeOUJhzBrOa~L4BH=;>? ze~){wlIRpW`UL=_#k?a?z7+prS-R{p?viT`%`}YjG>Q7{Zhn|$y!tI&H}RWaXn^=7 zFe>y!@wV_irJLjvTDMp^=m*5eRt%?b7soiyMkpqq5NR$uqFa_1gDhj>b~178V5XJy zmweK4#wE!as9;L&MBlh^tHr9@6Ux)piaDKlYgNPO3DZ3zC!jjDLd?u;q*@I9`xIV5 z9jK|wVv5M=vbgXs`G7i~Gk3v0j$z%1EA$BuE04S@aAWfZXzx8RZy*9h4miJ%cBDDv zRm;+z?-+{bAPmRJ+Z*^B={OWt6Ok-<1tNnAPt{nQf)-GHg*0>&KacskNB0F%e+b!%jdu-#Y8GVy>FJ%)*o_-2zaD6&;pZjp(fi(EMt4oz@b^Z>@hEUq!|FfUN{l#&iEr*n5wzl#5)4TD zoW;*#2tM{+vvFU@kus2RKN`C{UUHJRd)hwkE~hwviZh~%@kp4Oja0L27IZZj(Irqx zsO=>KSY{@4s6TVvNrt+pN7YPCISYxa5Apy%kzWOccuYX&QkDWml_*v4LTJ4MaK6W3VM&HITZ)r2=C-0CE3ONHLzkf(@IoD;lL>|A^RM_-n z%sw22eP zqk*XnLjmK7{Uq8$AgM~kDA~gv zIf@)9s9`wHnOATU8Y~5_VdgD2;0CS&Q--#s=%`|BZahB1IELsJcFx5fqF#~3Q>Mi7 z9nf&lm8O?zW?8LmHh4t4dHn|oH|8Ca_1;-1Vb5YgdJ$WMa(kh*F`*9e4z2y}n4H_jeK2aEmgbK& zws(Nd?#8h@-Zt1$@-3e?#(ZnzViaYtM(Ekj@i)~;APd0+PflCl5=<3JRI;7D4)TLD zEEhq1MV(QsV+Z1lhDFV6eu8>Kd5sV`dP_S}m2uuQx>uID7lVs9^8Jcg*!08V_GAls z{g}q`v^q$*F$f0Dlw2+Wp?68U`uo=vmj!R974JnyM}E{m ztwkW-)}~acD&-Uv^Ddcf=t~!n=8}s23oK+XVr<&%^)8ji?zTulRDz4MA3Aqmj&od+ zuim|1fcr^Lj3teU0l=~_E zRk)_Y8msIrX7wwKstGh3k=oimRc+Ib+G&Q=bXxl_UA`Bz3wzHsi(7*1r>ov6KnmUK zgQyG(P)L^uRGEC^NGf8reza3&VRnb>zF{YIts0mMkdZ8QwOXg-d@QYo&EK%|mxsq2 zS0CE@r#Qn8nd6KV#icV?A+R725{(lq*NqoqV!AR?nE*!Cq$W6vB5<~nqgqOlro$hc zrAaYJN=bn0umwJ`=*eGeXrx>(^cLt*b|#xUJs4KQLq` z*$&Y$#r)F2;S^zTO6mX*K}=jL@pPOqpjoSY3TgJoFG{^{zW=3N_=OH#I3o;UUfM@HY#ZF~ zzFGSQ$-g(YPMQd5J@}EeFYHXB1SSg8jF>3>>{;IQv}BAg(L(_yN*@8y1IUk_kRIrR zo^ZdN4tKpP+R0UA6`2%WEN3Lacze77U-qkhiWUL>SASk}=%sa_6)opoQ#uD`=xWY* zrYuT9YhjJT7oDq+Ultic5c7YExXKJ{Oa4HM*T1cne?kNPS9A5B_DiaN?Ux*k|Zf)h0m>Z}D1OAsP{=DxC^j5(7-q4)lF+3|VNpZ(sq^Bb{0}INcogwv6c{)K*^DIb&`A@rN=-T0Ok-YRhM8a7h*uO>)G29R zx~I@V@NhIT1Jk!Drs*+7&*JlVKP?gL6S%NDYHb!*M}?# zQqP;LO?JW61%)LHYpmG^OAa9!ZIN$Zpqqvd@%fQcO%}Y~;q>AJq5>836n}U;<8h;Z zC1n-*oVEQW{4v-7-=lS0%_4bf{Rq(c^nfCE@$fFKWw^^8mrSGXHqd;Y7IppupvSDB z4yHs&DRYueyv7oEpm|cRWD>}2&3|VC9k&CTtuIx#k$B%f{EBFG*{oM*aI6R9elguIRz^;Uc*#DHh@Bma8f3SFnJ*6u3_AE%e^(?30;sX@Xk#c;Ig?j60 z^(XZh1pF_j$~qmrgmtla?cShuzML90sejx~ts(1r18qoiWLlm5 zrXh532nhMx!bO>?Z?wbQ>6-xC1SFZun-eAxDLY7}+&$Cy0*mW8^F7me{^AZZu3niv z{$LPdV%3eV=M)Eyn-eYZ+ z3N8Wta;5M#(qL_9X!$gam18(U@nrl%CZ0Lo)q9~H&r-P0a$O6+skxG&!yaMsVFxlvU&j$;pnOnqJ%;aQlJM0PsfZqajq1zj_fWg{8 zSfe{@vNhDrc8cwVN6F#YVzpZo3?$q{fKDi$#|&pW`XRw>*8#c>UlR)3Pr>sxEHo{3 zKelP&&Udyqh3-anJO3dmoMrZ>R~&jW^_j1;uRiMw&BajPTg-t*uM6icaW8J1c|e%cLlqztyI&+82?AfsnzorVIC5 z$t=>OL?2LAD(f((<&+(3Px?W4?gQ@xYIstDx?yD)?Uf?DQ-(W~wj?W=jry-Qac|sg z^6hf@nErmaxd{Nt=s(2{Pf%$n8k9Cx6Up|}MtN=w7h0oU3F|2$X0R0+!o+2AVZ(*9 z5Q8V#zmh{EL(9wffgLVlp*2L}sA^l$PVLE|;;N4__Rd#ckL5n=G}f=B^Sz}Spg8v-=R@P_lM&;XHUQfXo+4NEX2F=8v? zDh;aDB*%7@TE}%eCv$DsHxbcS$ zKU3qN@e~fI@Fe=FH+M6nVLDq6xH`J+kA0u_J#EpvsTm)#dyhR^FDWr?=t;{WEV*hv=G!-Z=ZjbUus<6F5;zc1{E7hG9I1NmAs#($ZkRdO z&s-j4rVTnZz2J^CR&>nytz4uT#_s1h9;E=}RNj8YJcysA4Off>*W!>EXE>I&*ir>4 zW-3_id72KJC$S^m8iZY~(5Xp5tKq&6oq>H`g2%42X(*imzl9c&PIuKgDm}f0Wwn8ih1A~YJlP*X3Cwhq9+Mo~&Q2cS zd<)AodOc{ol)9OZb#|xTl#Xh*x9Z(2vXQTe70iC|%x)&KJ4oc$n2W9B>saL9;md4d zoeavUIbKg-FMhMNyv70EgHJ(fy@mNo)T!;~fBOyERgnGExQdhZ=VqU`Wo6pq zQ@SnHWW-U0^K?M99SK%gxiIBvXMk}x8MyLh+WST6$$~y@j|GY!8SF3`JiAu|rZ9yq z7h`H~;_+zjCpE3H$()`5XG~7ty!MJaGv@R?%Gpn(&f(HgZj#0y7~`=0S-hi{Vim!y zUDO0gm*Fs#v#ytNHU8*F<(E~mmG(VvwE7XJCy5UGI#Q2q;}=^v&(UOqAU z3I6XM)PG=2DEAr6XXR*XCS+>*$F zuXDK<3+s~=cFjdG)32^)eGHT!ZG=`fWK!PK@HD+}SZTE<%f@*)eVNpM?+-@-fyzx? zu|1Ve;}EX*B}!S!T)Tpi=QVm~zzXTF-P2i~gQ^SnUSneoZXFyZ5-Gi86ZnI^icKQ+ zyWtZ>pgytYf5sX9e}FUp?PK}Z2lOwJn7Ym%R(8Kuq^`c1AC}l>wT1>d(Q`7@CbL_~ z*efQXD?0-_TcOn9_#E0^teJb{mJt#Ofg?Z#fgwZT1BO8fRe{4u#p$S_L=iufA~O%& z4!CWiN*G+sXJ&j)d01RVdw<^4@&I+-l?9u3_ZtI7SfjDfn`r49+e`L{rqzO?8N{i!kFIjqcq=d3sn_*>YOOl(Uh_{+NT4jH6MEEV)W`&j1 z6EY^n2tkSybtiU}Nk(%Bq}qO3@*HJ76?{8q1wHBD-Bng*#=2~vwMom00V@q`cinSq ziEd$OUR9bSB006HHeAvp9g|uuYoX8qUU)LJMvGi*!15 zPAdn^&_fO$zmxdUymJaQkDrxqOc8oxG;-W^(VOau3g;}mw2^z z8pCthL^mmCj%?6hK`d0zS@OFkxaH9z)Jj`?akel8UFHaLppX)vmh6p{?hdim6$z~w z?dHH2K}E#Qm;VT){{cN^A|3{>>Q-0$W6X}Te$7{*zrqU=G92a@yCwyq?*{p5U*01) zB4^X{jeK%O4z=MY(TK0AE9}iPT{p3ZuVXw-VwN&7K^OA58-=op^pOhStp+YJLF6cf z2B{@w9HUNDz6(W3CQ7$FgJBBslgyAaa7Zs|?T~`_Hkk_btwc{Wi(OGi`p5?GRtAS; zZ@}-_&qnfVA;$Mq+H{VOuF5omS!8o`jHl<(Nka)eq|FEW#fftTK{VJGTVhA1 z!CVFDJwlzW2^~&kXjar-s*zpm;Wm*l2ey&jCA#Lj#;8#_+}@cu379zR29xinio`+1 zamN@52&lXtn|XHYGRq0WiEMJUwp3yD zoTy&_545B1`>e-`cfXxBz-HQc2xj%)WDT8HL8pbN{Q_-Xc>9q~f%z$p9ysM~0-McC z9Ao^|XBGh7Z+||Y6wHtxi=U_h@wce*5A6K@8>;;K*_85FR7d?~%9D5i1r?sq*$hYI z$b7&kB54%`T^nt(ND7WjS+FKeTr4S`L{#`7dFoZ<(q*)n*D6JM`slhSm%jao@aU1^ zui%a=G7X}6*6Wjh{o3=h?r}As@8gRhjz3f}crmklI8whQ9{YYuO!;8NfR)e;l(Rab zTmq92^V7Jn1|$6nv=IjtXE8ok4$3g9wu+JFSF|gogmfqV81fiu$Ki``tWgz3#7l5+ zjIhrR7z;do_-DBpFUg@6*6f6*J_uR~&OPo>)*6G6)>f;oLQ}U%mX={BgCx}OA&h=XLCJyz#Lswg3DVGyr)fiOzJfin zUh2sqD{zKI!J2x>ibVkMrw_34*IvS{=S(d%S+Y;jwqd7WT!-^Z8N!*1!)Qk!*vz^h2A<2-=(~Hy5n3kPxZwZ z6nv58zRcf|2o2&3OFc7sxla0^qX$p1Oxt^BcP1~&my;M;@F@o7l;v$W;K>Ve6%W_m zMDa=$N4UJ?)&!kdJdIW51JTsF>(VPBK8G2^A?R%yn$od|j}+~yl%3Yc9FTAdBexO% z!9~1pO?Xb>S;zWIc+gW=1-nb-u2V8rDz3eqpWC{C$|V#SdYS_DSc`m2$wu!LJY1R> znMnGE3mVKnp1na4_koGC2>5wmn>5ruHO;EE2z=;j^hLfi&W)G~u@U^M)UPl0LTGgc zYIoT5)t-6@9AI834warb>1N%<2YTIOpv|@t{dEU^zJxLSs&`2IX?IZog}Y3^>}RSR z24>1#DWE=7>Y?QH*vGgbhkbN(mzsH+r`5v3mPOq@qHL2;>Ky8(1kg?su9Z%%;SkT$tUhnbE?Td3>h_U`b7 ziqXJ_`@X->niAC&>R^x$6t6axMfz>)`$?Ca=DH3tHjNPt{^c+BxZ(sG-Gz_4oPxP5 z#9yezu5VtzI-6ApVdD#W_{$|HWsg>~FBCaCy^aqVl;Gv;W1>!yY+En{5pn*#1(|gj z{BPa%4Z(Gr3XK;bC83k{LDCoajCI_HsI&CZ9)|9;)L!R5w)#9uNDjBn&R`BnhqprTkzM!0_K)5;p2d7?~sX>Y+Z4 zbe@vv%OU1s5cz8RS@DZX(Cr+75JcXkc!NX80s@p3_B(I5t;M-ZxR##Bl{#GTOY|NT zi=0_m<2x(1G+E*qOEVE`Flgo0{03?4xvBE zL41mxYZ8$HQtV>QM@{~LJVboqyaH`#%P@Obvw?I`j8#$Sxpa|#ib5c7A6Y3#=X-FV zVTluyYi(a@?OD2Ehe3E%MqS6UYh%^9FRiEEg>FxyeRzrR(Rsu;ejZJh`qPfE7m{-BJE-w% z!Z`O^0<&?>k-1a2d}oxeXw58BLrWO15MENNhf)`jt>dXx%8cPAoHLyuyfjEAV70m= zN3D*c1w#8+cE%~4f6XFvR8?pTpC<~Fzm={F{=YZf3g+g2a6kTKTJmT1q@uHfyOpV# z^I!Opt1730B82FdY`cc29x5n^s)$4eJ&r9X7_1~(Bdtc*P@sHaheGc3Nn&&7AkzMY z#OHKag+bXoNwBxRTl`E5EZtjm%S^z>SHF9CotfX)_W_j9|A4r`L`;Gmj6h-+Nkkt$ zPdF;v9)Cx;M2HWiBJ3#(#zbWzJt~5=2uJtOS=mJe5x|;ek$_(7Hsi=vob6kxPUYw$ zM}uh!ZBbKXe#EAO@v}_HdH3Rr2&09Ln_uoGob(23M~|gt+|aoxzsb6pn@GLO7q*j&B+Ze2YBIAUW-VCVV1{k_MJ92)ua)nR0R5x%FLclq{#IsI^h#j zGN|dRbSk30Lx|ees9wut+;K5j8}-_3UE>C4#6vyh4)G3_ZgN79+*ruzadal?10>T_ zlE(Uxj$UG;Cg4=OMnGD!7eL?&4F!8x=vbzgK%qw0zoRGSh%Bqa&C`}`jY2T=!ZRNL z%iXSxx?_fVV}=szCTD#W#==+*?fS(kxyQ^N8qF}37jdJ^V~*8zwb{o<0=@{gOE|tw zWmroqiIyiNS*9`4>rw@<^j;X&^s_eNv3nN9Ly0@BN^v=ff^85-Zid|M5rO)~DFj`9 z@%Yxi>=`_lL-3REbs|I=X#*sK?BM3<1@E-oi2{UuZCP>Q+OA2C#^^WP=P(krTj!Tu zm3hkpQ#Rh31fGv0=fRwSWWkJ(x~M1CMG(p$Ubm@B{HYuJrTkj9NF|xYvcNQ?SLVKcE_(82*@9 z6MCnw=0C4|ntyxc`v;1q|6V@-T9c~is4NPi{%UP2VbZ0A3g)0KC~b+2#28i%1F%e| zLD_FLMq%R zIl*^VM>>Nd#$hzOqeZ3YFe095bcAc!V3gr%lp?zR6-Pd*k6Bb_==Aa%R29Icz0Me{ zIAzP;81vv~o<{y+bCrI{sV`7~0;AH*jM>_|i6^jaWuPj)`zzY%nYjJP|pr(J1xv*^}ue##b zxx*oKmkk7XktzYeEk8T$-r?(yOcz5Qo)wv4j<;(6g*!&j=mVN;%e1Nt~laOKoYZ#sgYRSbu97 z(f3+eNVc^ydDp`58D)zuWr|JJS}}NvK0?Q|oEyT3%_E-nP2$r(4(g^C^`mG39;uu* zy@QG<%gTs(?b3;y^Ylk1GBz(fgI!~hsLD*|P|o*IO3X~9=LX2V(o^il^z z^Bat&5mX*|a2z}(C4NH4ARM%*Ffqi_V6^>Db{>gnyNF*mOanr-bpm&Gt)wRujphe|=KfQa_&VW&|Eep7p7)2qHP*ZQRQ4$;QLLTSVl1x8w- zVYSF(mhCUdN?aH^{APYK>*-y|F=`Ckkj`62c=SzmvaK%ANO#-ZYsimjSAdV0&Y4mN zqjV{oxUyCAz!hJ=%P~uD0W^%_Rv-1w*_Cn8c<-;v*rm#!SVxyCr{cTBbH(YKzpOuC zyKL#li8YrpyI}Crf3N&SsK@ka;~X}YQ^ug|pC^Nkw;R>DQtZREA=;~sJm&^vTV}2r zJxxCSnxxhQYrC>{&JJpp@X=iR#4gbb$bfswn7`c0W%ls#`J zIAO+?@NxN)PtF3i5U3t;z-IUs!h%wIsmlpns{etLnl6`NeQc>4GqP+I>BmAKO3#rF zf_NpzDthcWcVQY#+-dzU>*RZ6>>k3CE zgo!c(pVskFzD1d{5r|T+qVyb*@AnNcc%lRjLepldRw(yFkL1REiQ^Sc08c@2z7q}9 zdgpF^rDt{RZfTpIg@p>!CH7g{15p**EGW=j!b2YI2KgiQxp+FbL&(OpQC|03Faf3E zYkaP728r-E)Tc!Z2}xX*kcS=Qv)>WWIU-jCe;^I4gyrMJXVr}SZPkeUZyU9LSIvLz z)k@X3KcmY~f7>-q*r&BL2hAy4(E+k{%fb^tgbV%cl4LZuY!9xaoTmeteJlg|yXxy1xtNCH0Q^`o)Y1vP%E%OBR z@rp*RR+Pl0WqnyKS@;{{*!+WST#vSS+-B1;1HB;idFv4JDY&dCpT%;p7Ik)+I#-<@ zWrme@+1nQ${4SZATE(b`Bl=IB> zF+HRLS+%B`BW$s$M8Q2_w+wokxz-=9PU)V%BXq8FPK`e~G(OHn(->3kX>vH-m|t$% z-5mAm @(gO>(hm#n~jqzcr^M;B-$%CBueu-Dps|THnPPm_zI|nDO<-?X?-~QIs zYIJ<~TdJXsgc~Zte!(YRG`S5la;##Dj4!>qi3@#OWaRD(8PBxb15SB&F^x`^mH&5; zFN*hv^k%74UA9UbQ_YvEkMgJ<*6yL$>-&`Pm_?C?>)dTZ+W9QbXJvU?QZ3FI-0k`1 zRi4=K2_^HgW}$*Nel@{WOS_DUeBw_n47M!7IcdIS6}VSAOmE%8lbdEi*2ErOYcWHP{lAf!7wP z_TI3s>!}Z)iNx%VX$`l_w}6c_Y0+_bGFX@A4r9mOjfg=g*b})Lk~r%h3w?s{zJr$E zQ-M2V$r(A7+=C^(BkNhHKRfr8b2!GS+1F9M#jAS7ci4kOct-@jBD^H=L?w>cCP_cUIghAOIDeBwQD3v??hzS1gYv2IuWedoNy{>)gWFA>emJGZJ8*Ps83b z?xL_KJdnbJKQ~+@dt{aRz(5*+Kq_w0;egB%g)0gh%_jYbbbk+pykjZ7gAIC1?Vam0 z0_h`(6<~}IsC4>hfp-lpum{%LfaqKTx+w0!&5QSyN6r*!1NIw?7Lc6}WUT!%Uynod zqwMFIgUH#RkI+7^9SG{@j#21u*(LuVNB;j2y8pdr)YJGhH{RwrispPGA&yK_FK!_c zDkrEwV+5#ft`$(KE^WjUbwGzCXL7PMoLxlQJSjXbV;KA>u+gG*tKA@T_yGOjuzTr2 z34-aJgPiGcx$dyI@ww(te}8*%=mUL4bcgt$EOjIg!Ia)!i*A~Xp>dIaBWHd^J#E_u z;a53%K%K<06`_iawtg4pqM4K}bEFE&m-r~aff^<3UJCX z4gRwZuG{;y=U9ftQhRwb+B{l4{N&hs+h|Y<3rt-^Khp_bT~p~{dP3e{a|VV$I8WjZKB3xUwnx<~x0~(R zpu+oxIDr4y5fnA_oR0pAK+BHD!I_(lFtieBMX%|SGRLHLlXerPzw9zCZ(3)%$CI#* zTLodg2P|**rVqE|l=OtZ2*V*`T?KBBTw0jMY*HV1o~eocWU5|w+s?bt2X}s3%?})ibr^j9?XAh#wdk`% zpc5bY<_6Nu+a@@!MD|{?Y%P@zEb)LN)~&Q^QxpsN{88bTGP;fdQ_S0r6jrZ#b}qg? zQSlI6=nCql{ardjKLr!=P4)SK?fSq)hRy|D#d*a0T`ZNNU0BCc($45 zuefJ%i=`<}(m7R9dG{*_{!WVIy&G{GJDIbu3-QEil;m|~Uyx*-$Pt*lc*ijPC~3#@ z9#^Z9&ZkPx&jxzag2!V~ZK16>1`h;*Bo>a=!~!nBa8SMXM7Z65vHJ@x-kDoU8k|FB-wpk?0Y$kib#H}7>4Pom( z3S!ZQb)4XxyzJU>a?2qDtI{5#_3Ham1ie7+hWI<*d*IJbRB(WK2DoxkWD{h>EwsGV zGXGf$#kVu0m_}Nr7^|zrl(ZzBnETD>kFyhoyq*-bm%cw*vs)e}(7Ml8QTe~vn$SQ+ z{^6hSA3uzre>pf?Fj!l;o4GicyLuQon=!c98JXC4GW;t@NzvKL-N@DK|D>+T#eVxT zpokbYTdOQRJSbwgKe~ZV6ClOWT8t%EE#S;E*`(zOgg|DG0^O9skm-9mefi-Dl2LeB zcsQVOCP6!u!ZKqfgGB=;ap)$DcAj!C32A)5n?>_jqXByyCTzo2%4xd-n>EK1^@}Ks326XCc-jgoR~8$8lZP?ayvJ-c{xs7 z%%k5}6s|0vnvc#~B$%((f24Sltknv(=tLBhfI_DBjb}kNPZD=TUL(sf>>$!T0@|XR_n@jWHDhhNQK4Fo4aNcBAjA zif2|ADtne3B%Q&jz$A5$Dh)(@PNb};$5LYba1lj*g`q^x&xJ$SY?dnoj3^|(m=0s| zSR-ni3PZ0IMuqnmt$uS#Y~OD(F6_@M`ihpXLd+slx1N0oDrHR+6DTaWyT(=qq`}6B zgR4Dwy5BLIWwhy^ z&y@@%7oB5mHjDNevaRRqng#YRc=PCx>&) z)gH*fJM345w>c%;O_5dX z^9bMN`PNNeXNmr3Nr|AvWUMt)pgyO|yHRbdY1Djy=Fh)WKe>i%#ykm91Dl?PB_9%S~68zgc4Wi#H0Roxs zgVSDnY8M~n5e(&vyvW^-=s-U!Okczy#4L=Xz!676v9B!eJghp zBsvW0$XP4eOIP$+g8;0QJCBv4T!E}8@6zCWMg9;qaMVhu9noW;Z>o3ooo3i^L!z5g8d@US-C!-uKa3tClrO1f!IsQm(9P8RK9$yb&prgc@;5 zB2`ty$tMNXf*><_k^^|Aee1hZun<*+f^@GISrJ=i7F0RUn0D|vV^zN;B6%qRo-0nl(^<^XO zx8h@$=YseV(p%?>@-JQ`HGE-DqFZ`I%i~?`iHExVJy2sVGty|iKsZf^HjTZVA=;Wk z`bQ3JY;nQV*1HO+pZ0EZee8+n+{}2rF8yHERkAP!3?Bm^`V}pIUhDsL(HeAe;k|wJKc@b6SoI%lh$&lqUA`vb zPWG-2&i~g@)wmL}APO%mGFgZs0z@S6mvW_mSPoI|4N_GyVtyXNCafefI61SU8Pct? z%V2D^UET~8|1bC(=LP2e$~>qFhxyjGt@Y!ax0BC@<2U(lA0Bx9s4nFm7{aI>XYm3| z8Xbiv5&7tGz^?jvv*$M$ABr$#7%GfKMjCl$8%?tOv=6QiIzJyn!b{=PDCjE?`a3w$koHOg!>)OsTFLK|PjgMaNZd z_^|3{db12)#AV3=T1-0fW@um~$b?gBvs5Xx(zW;J zm7>;x>!H8;Wl5(Yol!^|CEBz!6Iy=0my7HX^-ls}9pG|@ zzs71bYIAD-mK}aniN5JNNZ!oKVh;8in%=rxXQ2WByjUPk(xNN(A^?g!iwxjS;USV` z7|S;>maxb_78pX4BQ0T>cR&|B358C`8D4*8BU?adoTnP1-!EHdG95#^l@p)IcPHI>FZEHwxiXhHhEz>|AFQ1#2_#Te#}(B%Id1)FfL5+~%23Yk1<;OXu?2 z!;krIngPM6hdN(0Gp2ouT^Uzm*-23Mq^wd(8Y3*}AA?XwLRZ2E=+B!2v`4}vVVa(R*lJXdu(i*4eaLhHU(+`@41;YccgTv&O>h0lMaVuo%v-ThxJL&(2v z8U6<%U;h;@{~k@Pf1w0{H!0)-iD<_OSurFa9@=COI~)iMw1_GX4NY$=)kFe~y|a81 zvRA%-%w4}(DnI@UC(}2=3pu0$3|6T0%$ud1(^=_PFQ0ek?B9?*Z~_4#K_;L;BpHr~ zlwih)EQI++I#;J?CvCGr?d+->iEp-$+lr3rgGDT*C>zQQ)jNE_uM4hj6Flyi1=KB* zn_%NNJXee%&^5}GNwYbdY;G{!L^9IT898|s4ns|{jN=H=W7)G{o(4Tw-d7k~T9wD3haf-J@Y2<_VT*(@Lz(&f z29G)+$`}U*PP#t~=@%lJ-YAk3KN}|iSd!s|Hl-yV%FAukhXL`g<)G8>9Aa>lo7djlM_c*)l z<@B$b z=C3K$*Jblr5_+YSrbLa7NUxBPn%b}vqrEFg2U%YL3I5OD2Nb=K#>sq~bg*Z_(M4}UW6;Ux! zwE;;qLLwE@Tr42pSZ1(|XG6t7yB8PC9aAfEV;`oUbDi=W)mXXBZPdFLH@{O=Z)Ii9 zx(P~NKd*^&y?lxxq|3D*7snXm54y#oGiWWHHo)9rx{eld3d<$S*dxaV%lC*It~R00 zvy%dY%LzcLcDC5%fOpp=nWHg9=inT}4d8j3LM#6g!$jJsLax9Sghd&t2Y^ebHP<-pbEq?YRk(`n)=_?~FypSZtsr zjPpT4(urR(0`rP$f=Tx2Yy>mg56wTJF4Ai}k|ozN{ZM9z*2-hpE+RT9KW5J`V9jcX z3Yo*h*^xBQlO?kktq&P|w(4yF-YwaSk#|f4{3?!+$2jj1XrTg^wUwgw+r1!a$&PEY zG@4*FR>cdOra4N$$^^T&_5dm`Y$+V3G0nob7QwLAF~MgOg&4xi5!2$rB;uQ*UaxAd z2Kl&2`vN=YPn?<1qNHxi84GVnKG=TN`?sBFc(@_0SmABFKydgxkWvBdIN|MVs2F?! zb_#7M>34yXRk~yyu9B;~OGz!M6~VUpxNPemxE5jensN+;YC=-2Qq!WnFRq@%aPtRsOSt zOmg52)CDCV0DBa`F!GF!L+Z)>c8W}!?>d3ngF+IF1}MbtL&0n%5h@j`J6RNTN2v2_9x7+|t`RCn`GzM79knZOM-+^n z@$-;C4|Y!p;mh}3+iM5`!ae5P+?BRko3eV_S%$hf&85aO(4`=0fN>MI&{pN?q=d+v zcQ@U#I>m0qZNUKaJgVu7>6}Dq@)s&mkc7w;d&25gmlpAnl zc0Z6VNh@8s>!>3-AHpPVi@ysA5x21)>Y=bsddF zio9MH8nF|a%{o z-S3yOmkFJUZ@AJtZyxUGywW~I=`1*bs?aO=Sq$@q0O17TkH?TC2B+d0sw!P%5Y>ym zb71%>&eL>>Qg7S&-!P@NOok?_$xO#&Q6w(o4c!tO;Tk4`D{iQ=Gb%Q{YN+syO|a{# z7Y3H(c=;EJOs_4B)8kjOO^&>BuyX^`S*|wIax0dTteR%rF==Acv$X1DtwsqOWvrR1 zIz!l0v3mp$HYQ9-EgQbgRIkrCWie$OzmzENw$!l)GO4!u)~U2+q*{5cp~nnuVgolV4oKJ>m)_4K$jwJdIb@5!dB>LS_omhbx76f}hf(9WfU1{z{^7#}aG59?7*N zvDBAp(_N80$KzV15MsQv#|k&=*=jJ$vnEm`h*HTydf0rm>N7j5E|JYUjW z%8p=u!-2`)&~Pw7(|t62dvB$0gT3^;@oRvqVN~jPGzd3g@cnx?#_(-H(rZD0L?wMfVWTF?QLpGO zX(%U7&Uf03(8m{nMInnc`X+yHs+t)a#{$$=MLr*B=}x0vQ{^&?AAKNAq5YhmoZ~4? zIEBKCENX*&i=48Hts0E_?F|=at}4TQl}=|V${M_t+RQN-8f^eM_7e~RS?191$HvRD z%uI>GHJS4>m2!nyt&~-NUCBz8WBmTY23Rm( zAN_nb+BfvS>UO^siN=nv+kyXY>-PVo5cw~e)IST6Y_)&d5rCtaX@G}k3Xq6xA`sO< zM@NL{5LmRGo(a*#Lt6~29$qk+xS26CONSo@tMXwsH_?oD9u_zKPW;{sqmup)Pvfx$ zZ?gu4Oi|!w)zazH`Hu(p4*A?w|Id#*`fuX5ZYYjLST{6!hr6tJb4(=#W&JGlQ@0mi zjYLHj0#wq;LGTF!wn*u=svW4x+6FJV-mai!&sRW@HPlx09s}CSGc8z0baapn%B68fgyWlBB@= zV~rO=NU2_m@KtS5rpN=I_1>n-gJx4>(KffK&T?)cXK1g-*9x^FMUM;Wd!aEV9^ogL z^|LQI0Mv0Xo)Xb5xK@&^HBPMnp@4^e@N#jI1-B<1GC$)-qFZZ8?9?B0s7!t7i_8-o zsV$8io|^73dSPSXttM?>WGoiGL0hL#c4D37VpA&}A?v5YbYmeazB=g1N7pBnaR=gj z*_5P>AKP7tmh@#agGb~;ZkEe|guPCd&l zDr0geygyy<4<5tTLQsf{>Ph=`vKT}KHMSPZSxm!gTlgy{lbukm5`M?^V55wh#0 z<*2u;Wtkb9E{S~vu9IPN#a!;aSM?i?FHpRA*BJ;1>x9C z7MFcV@fdC~&sM!n8_c-UIqE#smg8Q4wZdFTRNVE(#+LGSF>xJHNNTEB$WJq`gI6 zJgy=-35*rlB+0gxeKPzt#r<31Uy%lAJ!gR@s|^usQ;VY|3qay{nmvsqdi4-B$%NC)pExC)p`V!302Zn!mpF;^FD=GSnz~I z-NDC}CE#NB=(`w_5gXt_0f-GI>#rie@vNv2W0R)y;%3k^LLqpJGjOuF*azmuOg;rB zYfa0%^k0lriO4IE%d1J4WciL;2zk~V`N&?7q<<2yS-8g*UR4%U$@3n8nrAzIKOTae-OA0>A{Dc7WY6QN&bO_20>Vn{u4)gSA{g@H7gJ_>G|98; zhjhXePJe=~xew#m9BdYpac%f4XKx&?yU6Mj{HL(IN19(yC_ zh?92&%QXhlS4j975?Fis_6Xa(wyk8=)9?M9Q{_Kk{tU^#W4_T#@7J@JoCH=e%&{p_ z)4R#w47DnwfP0z*Nb^Oj%?myNYN#!Yw56euwmnWCbUf}b+x-hqu_P&USswQk;i>~p-~e3kA0 z+3k)m@V!UT5vrd`%Rx(&S}f=t3zdoNfOIxT@s>#s@ln-KUpe1cXC(w*G6BPgA>Rm> zO!Z=*ExxfYqageDepaMc(E!z@xR@xh81Tqg2DAZJfX}zkZ&lwSfwJItf-KD5+c18S z-ad4QbX^Q%`{^hm&}c;zuKH-TqS(a9o*qAhn@(sX2r_3&WAb*Ga;ybIEs;(N(G~0K zFxXQt>zirF=0XX@auu7C5eKVnO~@#zn(8X;xZ_gZh)zaZx;jcrpVtA)yR%tRl*OcD z?rSje+8u=5-zF3GG(hsQRvpXk>gEq~S)-v`M4H|uB~adVDUQf#px<{PQWiZ7w5LnN zF4PeTo2?m~$kM{)6_}O~ZF-H3kUYE#LTbxyL$RqTQA22K@TE>-jMD;iC~4o50HidA zElsKE60&7#Wo7i0qSrEgBbsJx!rA1K*kIUd*T2!xvX+{w7S@UzY>MORE$RqJW{TS zMX|8lJ_;g|y+_UrT7Jl5h|6+z=b5z1Kfc_S09tQa0K*OfBl}p7gaw8_9`Owp^j=KHc9{R!fMpDO8uHL6VJj~&~(+!w0BM8*=YpzWm;>TTeC&I)FV zuInv6bC1fRSi$&?TAXhdVWqb)>bH)+9&V9?%8tC4c%shgoY3(I^$2@fklt_WW{`l1 z-Z2H8tRPtz66cTV?UEB8E`_AZy3HnxgdyQ)Cy{=9(F1$p@uu7nx;5eo%laAcf6lK2 zB9^cLkU5M&Y@L3!2^>};e}`;N2q@$*A)mk=0^=V~9_ZnIhvxC`uiQ{Fq7m)VbwJDs zmxf4DSe_zT(~a(kaU|AceFOn^^kZq-EEvb)mgt7&o}dDjT$&-ckhGFr*uw!SwPcqa zrvW;2!0^QO`T@C=2(?3H#p4mn#TjPDo{cp}eDHifqIyimD0XeMsG~O1!D*9dTAj#s z?46GLHDuY`@z9{rW|qDf@Wk`A%L<=tTrZ+(Mbmw;*?nkWyQOQ9xjTGpj4)oDRl&E4txRxT=cAS2){3w+R?OKLy z>=1Q^xNgk!5(_6*u0=~!3GIRnJ?Vvp)Y9p1PPi|@@-6QW?rH8*cC~Xp?i2Ttw}3z9 ze|B)*HB)0xOOSW?mymIk^nyJcZ}lQqgdrCujgKuXmTBC!1KGlO-4VKM)g8;_!Zde@ zlVR2Z0RL?3U%iwVmw#o`b$@&QbN=_|znZY2lL?8iy`9UK!?cjArOp55YQ@NL!u1It z+&PdSz}<$U%+v|J2S`Y$pb)$gVittd33l#!V1vQ$D29V6Dl&!+<7wjY=d^MMKzi|M z@o|OVk&kA~mo226L@MCNvV|C^=E%_8RUweGA!eFn-KG1wK+ewn?wjeq_(|9Dq-`ckQMB4Pa3 z)I&+ueqP{<#>U}z#%23#5tteW44$IW2Z=(LhlhmMAng^&AVHel!Bw+a&4o78w~QgA+tx6uzqr}kWOB5a7lEPgOvcMM>N zOy;zxjtzU|qSG9V2PfO&mXI$)A|j78c^M*oN_Aoi&bZ+{2?u>{uF>B@r?c3WPj@T> zzBHjXjQB(@Y9VC$n-|>(S~Wshki3!ZVaDki`0x<&^dzj8{@w)*3%rMYe+0~zVj-H1 z&2L^r6Gwu?OXdkh&}VzGn>v!Ga z9kOQt(b$y$ac3B2g!li+_2z!w`;XOC(g5t`rmv__|63KS|50Qx{cCac%N6f0sumli ztYol?$PH6?8bqY6|I=Qj%Dd~D4hN*gIgB4L4wxV|Ii45@;I!H&4dKa!P2VN(H# z07}3F-P6RgurkB_V#^C%E6){sRWpan#}JNis}4H%#skLOZ7O!UDJ(P0Y77*7c3M7m zRD7?-Z(l?;9z0PZqaPJuhW%@9?xHAN5!<&48nbY%+dZurB%(IW*^|g$de>fC51Sr= zyRJRXPxA}%)6upJMO1;p#g9um`c+MCY@!;+nR=bizmB%R;dMFX$dnrlz!@f7WJa?J zGQ8UM7d#7*p6hRn!CC1gPpk#0n+6N0olk6Y3rwWDDta!#5bJf(Zq;@$+QQzz>Gm1| zp-))jlZ?LggX8TGW^c_&b$4_qRUS1yXK4L&rVoy{r3HiF|BPW|EmKNa9IpN{9= z>OIa}?~7&SG5f)%URJb6PP^=E60Gy=Ua&w(Y{j`{1GQa_$F^_r*=1hiypE=5GLvn&^p+@c2P4dAdc!n=5!e$>iNZ`|~V~oKW{Ia6yPM?WDpGM+*$J6DQ zME6q=b{&K@Er}N-eu^{$D?$%C^b-gsaS>Grnnf<*iaz=}7?tcXABF5GAB~Ujq2AUv z#U!ID-)E4ukBM(}p9?@hKMV^)Uf+_}vK$%83)TGn@S85um%?#?8z>XWB8UsV0RI$I z0A0{_ylPLO{!1X?Avsx!K6wLLQWcddRkz(P+bK%7m3uhih!UyJ5UJMq-pzUbt&7$l z=)bChD&U7;udgmV&EIz6|3~r7{O|bI{ENW*X@=ZDs7c`D5ztB<;$TDIkq03KDuUc} zpit?9$!4sf12Q0uwmIijB%f$VR+$@Qzeu%GwI{u!PUqT3vTRx3E#!F|>|~ zM)GL6VsC!4J^Ai3-=na-u(4MJnqrIU%?ej$!Z@DVc98bYXfoHgE3>77OgoLa;6t;~ z=;JF3Iyuo!ch4bDLxl`8=s9#Z)LYs@Z~G#4?d34M)7tg;*s55d1|n*mzxkN7QI6LK zSptqvk2bNDo{{f&u!LFgmCh(MVl^u4s-f*eYu5=Smk%DXo@mOK;R_Q;@8+i zF)KL65xN&Cxc+Wb9j6=pwBYy1GfK#>6a>R;m=r3$I!cLjkcwl|5qE3N;akD>KaJGT z1ce7Ry^w=PgHtYMB5SjR+FmAa)C7e3U(I|7nyzsa>+ZXybQt70j$qwj&8Z?qB$D|g zsSk9W^U|VWyw1Z?uwt#4WcO>RC3-yilbk7H`^$b%Bv`V+sem7!Mpze0T8opUBu>K3 z$bH~lu>jqZQQcpQ;%jD;S!Uc*TyCc4>())&&?Qfd&=IA(hxfo%PtRZxTT|#eq?*W% zq1@rn3CKN&>QoG`iI8+mu@sd2ozh_q}?J4z9Pa5te&|9x$sabopT{dU_YU9@v?#dGk>As(N|~zJBU!a5`&g6wi6{LI z{1;NNYuK9xzL0|Rw>GK&Bc!nW6DifI($2`@Uq~@+dbEl*HHJVCg3uF4wIwko=aHEZ zUNN9aCt=%5P>)eZ_MB{}T+`*eQRZ+S;Z$uia?W#_qU9%`gt%c3$Vn)ZXn=1+Drebb z-kg7XXx*&l-{SEFH^AY4B#6n<`fY{TIuoai_GnBLD(REcht84Rhnb~1&WWr{slj2t zCrw&PtMg0r(06pe6d4Se8D`VEuQ5B12opTA(n$7zXII@h%JJlNvAjfAg^EyEzh5s- zmtGx-m5FR0mAzqDR>xE#1)8X818P$vkv{j%7ZZ&KQIyGuLlvga%5G6NN%2Pcy%EBc zu7f_y8{Uak%QR~~?J^aC>eX}Eecuw`WOlsVdNdd4*ETVuIur4Ps;f`8a7{n%AW7q$ z5%~*IPcx)ujUB#Ir3J>|#|9&wcOudmDPEdLGs1KIy)i&UEO15C>pA{FM)=D1yVbdI zhi#jSY26@)xT7czMMc$M9v+v|k}3!7$41gvf>Y)#E`4}-Kw`9d5Y#a1gyYx1h4axM z-kAQ;5vPwa_WTFC;sJ$W?*MFU?M-upJqKF-fFm-f>onU4haIJIN0NQ)Iz?t%za#p# zlTX-nIgFc}w)O$`c;#G#?E5cS`yui`&3ka+rQl6KTc6W2yS2W%Ms+_C5(}IVw@BoAS_?w{=QVLf6WfdKr0xXY8;z zvP+Tz+M{t4lNtp*I#o5j(*4fSwz|N%b)Qh974>UxkJO>kWQP< z_yR~+^HLWQSq@-dar?**Tz@oKuDK`ROvF|Nn~EmZZzIT|AD0OA;=#bLYd8f%^| z$dt|dMfX;wAf4D~m!P~z?ME0G*0ihVC&Ro`J_gU9{BDb@a11vT0H{+U!8ezk#AU`>V?psiLQMQIiq4{bBaG@4&yyZVQyL*~ z=kX^|jYkiZh;YMpq!8Ci!Z=YBpK$)aQZ+<(KEIX>mdF*W@8;f0Rf>59w8=FUwl_A_~H!r-jFpI5R6EWc~j{k_vp?myxKGn zel)*{yu)M&V|I(s*p=kSev4rmwr56iUF@EHu!Q?_RYZL78c1wqvLS~>5pZRg*Qs;$ zb@~cyvPE;v;m8OgDK5NBkDyYr9K+`Q#-H8I=0>ojud~6_<`UGrsly)~&CW9jaF+U~ z)bj3?^xAXIs*B2hfFJXm%GkPAQF=O&m)hxn-e`b-Zi_Wyn!QrNq7tvi;k(kh;~*-+ zquY-4tmzk4PpVG+S+T=W0*i2b{H;)lDqVZtEKk<_gOVtWeb5Y{r&`TIzCG%c&Xfb$ zn!5h_b6-Vg!VA*1I;`Ae{Rf}}O@d8>t9mVoE}GDbxlQcEwIPy4Jv<@z4|wXI*!)`C zTx=Gy(eGFcf-U7XV{XW;d2nkaB^{VsNl{wV2lBs|GO*<1IR;adN#yfeXLp%hih^^J zico@w81i8a1?Rm+pmdpFTi3VT9nyLrBiq7QG?SVV3#@IkmS9})l8&Mz_u>DF-syyw zWR1UWpa1`P8r#34_n&)t{Qw&cGD4y~)LKL#0k(}=J%WIg3Q+uC6mk7m7-(sm3s>L| zja7Y#zkA_t3TeEBU?_J98CBD>`Q|r|?`5XnUqANA11zha0{80!NpeWyPld7MVWW*E z1km=u)7wGGP?*wxF+XI_8J>-t|1b*|50m?mzQi~_qfZ(B%MYC+0S3ck_Rd7XK@?*w z-mv80yXxHtXF~oT!dDVtOTcj7>+@>WECq2RVwR{vbSDnQH2CvX0}7v5WD`HI^`X2Hd7LEvncz)|2K$ z<3OXYAr>`OwaSs_yRGc?xsj=L*gk3M=ue%E4H{d=E~O=zCsBr?6qb2Zy+t2q2NGH; zrm6tcrOn^`Bil; z>!!uqxk0u|F`#S$##mikt0m%LTd(e7%4UqTd{Qf?b@;6`X%*#1rw(dNEu%ZBi%gsoK}E0#|w-2Wjq078X=k}yOZ33@dnm67w)x@pMqQ#yec znf>!0EtfFEQYh=MfR_3HAJFXo4rp6@BtZnfRN)$&Wug3@#ny__(BQ|sYI@n2h(s%y zGCzv^+_cUVJUsV#OOo)j8(W~8i)~>7L_IlNOK5p`X)_ z;~!9B#QJ_p?BJ=-iAl6jDfAevFV7kHayXH3~D`22#Dwf0WUi$hU?& zCmQ`7aJZbfSWH}K^;P{ss-m*P;B2Zkrye203%je3Ob2qA_cfcSZdE~Y?DU|llxK&( z9&kMOq5bhx%uNU4k3M>COvf?QqUO~-K8wxTY@@=D96Gg3SKi_bDP@7=D^^~r#f_7) zqGm1`X;4e|DR$2E>n!qy4;ibnmDhiAV4#;nP~VpwTWHKn95^}YeM@BFxxYca*B8mD z0-I~Gtc{<@I5cKxbczmn0UIk#*hi|SbP6%rV><0vNEk%b3HE_ruICB#6x^CqW8e?= z6-^Y`15J~Q=i&&RGqEd%AB+YL1yGFz3iKl z)En4eXKe3`>IUssNREF^$^PFQwEsW~@&D)o{wu%NfYv}+M*TE5GfXuE#X*e35T=5- z2#SKA$(th*6!k1BK&ZCmq9LZE>ombcv7KY_ExvZ2x5{jiTw7tQ9ug5XO3dJsvCb4< zZz^H*Et+PLtdyMR(VpaF?yrNc9F*N%_nzi`+WN!uW!9Lpxo>{e1OJPMkQOB7IYelZ zy!{1*J=bi@9Hr`)dG~V`dhXL6G?d*hbWUE4sMJM&YkGZ`6&jYe(mWsJHe%d?0@akV&5jv2Te>Vn;m$dgE@9bGWA_ z<-4ELqramr7`39qk9uhIGF?oCM2L4ix1;~O*-K->Q=JLWAAN3)Mg|@Tqyqw*?0#kA zMOY%{4Rm8hi@c}7hY9VBSwR9iJxZMsa7+o{oSfB=&tq?z#0a-zYdvQqW|%4c-U{wo^a*qRoiOQB+8Muf^P3qhT z_B{9~56>=KOorGfQK9?icDM`s<7s|fz+3~QnJmjf1H)vUy9ILTY98(fiCS|#{Wele z9poU~a~>wtcdh$RXCm>56}U6(OFyr@8l$L5@}=t?v$$Z=7s2rlqi~psm`q!u))TX2 z-J~=RgrZt!jKv5GY4ZJeF5n3Z_y-XeX9h8h%5f!N$*VZZ7WDJZPUE3(>F2W%Nb#&* z4j)Icu3qpjl%E%C9bPecmX~QVIg4a+P(RF!t5_)JgnCg4i8o|{Su)qr&S#19vpX;& z#Xv{c8dG4JDHAF88Rz;TNy*>AM95KvkvXx+(RU;EF4jvj&7x5YYlPw9=O8Jx?}6Bd zLSu^jm&^PXDMu0O$Rc#h&uQk%tC#^2omD#=->JM9B*=AnY9o;}9uDRd`v%Q@9Lua= zPL;&8(t(wJha-g@Iqo?$lia}C!@PHui{WJ8lTS4ilcLsU9d|3N6$aPm)e{Y13e>wz z9xhU;8Kp!5>Eshd^P%Eu)D}Qis#f)SjVZ2sP(BFz?n3C|nrg=nrIgGr)9~f)X%YLym%ZY{xYWGTVGq?BLQC_lbt(VJAOg{YV8P%GbSt_1Ea#ZRe zuN7{^OFjo=>EZuGlXEted7OeOzop~*tVPX0!-m1UL4k=T8#(t@W7Vc@j3lH); zMk+}s7Rk0-=o(8oq1SE9f2nQUfhzg0uBiy1F^&8*>B`&N_DIM~qi6$mmFce9Lv@?0 zVdf&`{T7va+{x4j%wxi2r7SjZR~!cvXrcpWGPvN}Ui zBK&n3N=!?X27w2pir&H8%j#x@P)87IB4OHV;udqrM7^0T-ylJ~&C%lMr>Y~S^DB65 zw1A}2Q7i#%s9){QU^cXOXpy#%f%W!B)ZX_fPXhIe9B~~uHBGexcng<(rMRN6) z0YJmrp(euZ0hueNd`e69omG8~=_tnyNhsCw27qUktZ^va6sY<|#qt?NOBuu*X_XKu z{o|Dk+T)-D{DAnzdjzVFFa~vK1qheexI=RWSs%8mnuCrxXGFnd1W`Iu+=KZd!t-Z6 z?$@IjT(!n+&MK!rCx*?>RAK_#P;iDoh|uZkz8I|i2v1qQ3*Z{bpaxT(KvkRML*L&i zq3-7?P;!MMo_Wp&&=u%=!rg93ZIJYb%x+P2XnP{92bXE2eO>NJDe8g(d^3&}Owx?I z#aixW8z0o$m)MmZR@3{G{BG$i_%4;WcD1HZq!V=_m|YO33k0O(GiZ(IoU((n_UBWP zwwQ)0rGGWbNskG%BqN8V>>JIhBYZ!%#F`})uzx>QcU8j?t{cD22V6Ev8o7Q*B zCGHU5r8fwlYc3Ow%DNZhh?oF)Vq~%P`!;{MiS{7a^AYm3 z2YTzE~`a|mm zewTg6c7U>%PbWPGC}}A8^nJhcgMIu|I(zH-zFF?)#3}a0mFr(Qp9C-%eEgRH!!`Qf z<$P5C;Z*#ed0vVZq=(8PD&O%`Mp{}3C@?5+bY#2?QeO`VWpaoJuw*z10udcdQksbY z6S6s(%~f^N5^CC7WM{QfT8jm%pyI5Wpmry{TRmO1R_C=_1cmNm?J-k<4A~ydQ(@n)$xln;Q&bxVI;@Av`9lBj}VA9Ag z)uAyNoqpe}9XM?l3Vw-FA&B~SJsvjCGooK(;`hq7Cq??2MIPuY+W_;Lkhax?FmA?) zZo)6=uEVXm@6*TTGJ(tz-(-i|B`G+9I#D)ayxUgKdwun~1Oj2Zj)c0xz0sLBNjG%H zqUrB;hP$2};q`LD-oDJR?)S(&S5dq6h~WLG;A;meyF8kMmUo(YJhQ*UQy>hSx3>qH zt5J9mZx!v7-kRC*74DedqFv!0lmupK^Lk`{w}0Bht@`4*h}_b_Z(R<0ql9B)`AkLS z9v^q>b;aqrN%Ye1d_X1dfo#lYe)oJP821?o*1z9LLx9RGNC-ibWQh&w^VNb8w2cvI z(op6=h_iMKd7qRG)XunT0O#MVSyXHb%Sawu*bpE0aX1{`&~4}D)N&}S(Sv5{kw5K|=LJZQH z3H@pudFHa4&rhPVNvODOQZ07FN(}HZS~BC}=eNT}o#}KNx1$IzjZ1GKM%hR&kd5g= zY#jHA!C%A{L(iWIv&$XB-@;I9r4PhDo zl#5=Un$zMF(&DM{*3Jp}CM$W(y!nip?gBtcw^q(L8&+q+Kk|FpGGr^*D$Tb4G2Adl zlE?!-2k@k!@cb;=CvLi9x3!tij_o3hK2>OHaTUJH$zz+)a+Y9%qoXa>NRyMATI*r& zH59Y4CCS$!kvMLwb){hV6I&uAF zRJ}$#wJTs0kM}{y2OU}hPRnv6VR42ipOaXZ+RNImbsSlZ;?xp%|KwaY6=fO7*S=Pt zO*{&dRHUdc3?&K>M{@CM`lZnA$Opr_1ilv{9T{%jiwO0{+nT#Tm$V1EwtKZOoNPA?K%X~IYRdtNrPDD zChcubUR)cFwqRJ-nw-a3qL4~Vh)InB8)k_TQ@^HJ#`WN_o~$#vHnW9K_GGcz@4_U7 zJy4~}ft44$6knprcJrEmn+E5CF*>7ZaOhvPHEv7rPJ3W>L>xLTUPwyymX z&mYWivW_%qjJ3&tB@Ih6`^)zP0gjvm8#bG5L4mV$c(M6w{NJeNVlCkM`X>aKlDQ=F zr}tz90AxsY0rs(rm%HOX_>ZLJM$_*o4}CAGy+n8mhht-O<7Aw)Ee*PT!KQ!kwa1GY zM$O7oj+xF4IN^UE8uSJ=&Gt3T7BtQ7HO(eA&CWH=HZ&#B$)85X4g_gM;d!ItzViTT z`heQhLap1{V>2_`+7qx;W-9y4cao?!CMH!kbS5Xs+u9Q|&pmHpyEx*|3d1P*pj#ET zq|!qRsndso_0?_}_+*|YW#r2o;5RDwh@VkW{rVTSVwXxDa4Xj{%RB8{jg9YymRPCY zG5mxySIDl*pD8x>dWThT1{qQLV3+4|E_6Ecy+QhtX@JlT)r8&c&F{t#%-h#+`_}}7 ztG{GPR@Ul0UDu^h<97B@sIjdkBaqtk2gz^BzUQjkQnuwzrLxl2U%^*AvuN+Kdf*zq zN-`-RWfV1c5wdwiXPT?{p#7}aTfX7!pkSLPjI-pM%IT3{+1(E*-Me#$g5nQKliaUq zuCzw;xM_t6s!ve=v)C#RGiftYeSR=|e9}l=tqJs)=RL@Z$vu{YAIH7yD(_&Q ziPf(qP=7+)Rehp-AK3iJE357cV;!X2EhM61Nqmxpk(!cxUc2Z~PUD6E2M;b+qw@u^ zIm&6@{fqZ%Z`ol^S~uR|^50D)CxU;f-@-qOceKWj0ZbCl?{;!k-kHmR|Aamv9vv5q z*+?ghH~cBs(|`H)Av^eUzZ360Eb`BQfBCchwY9W(#D0v z7~&@TFqZN0h)tE#m!Lq1>%HDzH+5*`g}CHjTGnu5W&1C~;9?xw+NANQN@@7pR{|UC zI8j$nv!be~a`$sDa+_2>Bypi&RqaZsbb4&_4KhY+H7~#k7ADsUE+jQj?3#ieD!Zmh z2Za@TpfqZ`ynLTMNu8Y!G9jXzo+NjTB7$04`94zKbcHjrW@eqy7kLIjbsJ`$u`rPU zN;M@OqUgG1?8R{1p_#O1hC6ucd-MTNKoHS#kDzEn9f(Y<^}7+Swm|#k92+ zT*C`CMhx%t1H+&OciLxVCyeW>bl2tZsKEM zM2sFNS)H{hV#8ghoQC%a+5Iol-ZHk5HCYyIGrP^q%*@Qp%x*I?Gc(gNQ`>EZHZwCb zGeeu1{k&(+(K|EJ*_wN=R6j~fs*;wJ6`5aVWCR10iO8C8y%?p6W({3=V7h7+_wX8P z7B6ivA_hL_9Z#5o>a~H=c%ejK8UMI*>A(v+=cc&|fMaqSu9ZMsDYnsvu&>Ai;Hwxd zMZjfrM4AZDO{UI3kybLanUvBPK7-jxamB~}#D~$OU-R07iiwRBR;RrOE1iS9zo{D* z$+X}y_vC|2O2Bfeh^`gG->_?Yz7a&5YQ9krDax)Bg9(kW(XVBqtuEowbl@Q!qo!s~ zqz99cdEG9PU&P+ZTrKb+EUPrSu78zIG`XQ&Awsc(5(Rz}E&rJ!t@2T8sS_YHSbPTk z{->IFQry7SR?^)`469ypGF@=p@85B@UE%Cn9LG+7m5Z5i$g4Xh40(2pBN~waYB-p7&6|lH_E!K3lq{VDJn~u zr=EC=A?s4-rQ5$AgzS4)6hM!dmat|X>`_w;;MU5Hgo z%jzvVo?i+IlNnq09^^{ORCnClJSru3?tGN$^fGTqDmBFkM#8na-(wg6;tk6S56#(U zAhly^F6qcFx$uW7ycXHzkFu||?&=v!K4&(0EwsMafcRR@^#Qs_rLc6d0n#B+GR8XL ziz?MED#iDQAa#ghY1pmygax$;DW&`!(#nWO&>BYYz0;hr$uLmmj(6-EUM<-EFsSn~ z+BEt(5a-!9UMc4SP;(lXygwv)^ee!Tn9wv8*;WuZ114I$6A1_~DYK_1Ay6 zNv1_GBa7c!0rptM3ui_i&J91D()3>^3Bak7#r4os9_p&oc)}dH)MR$CCaAu~q@R9{ zi8|sEaSn{6lm4J!&_t5}tVmpeg}GG)&4ET_FEasT66M8ZkAb|%uwSp3CQEOYnk6?u zG4626j@4SB1g(^>6PPAU+}*IQko*A)%dyZy5Ww;7ZvMMtqL)iW%3J@ZAf{R}M$- zmk0Soa?)wFA|E3{yQmefH$!~?(j8uiM~8DtDQ?iSO|V4|Dn6y(?3$wJn&pm?S!vzj z33vWBMe-wn1}kV_$nsQ2b?AhP8(Ml)C+yGqVYiP=(+d+9k~hubvAl2u7ci(h0_Y|< zsXMpK0CyhFW$@e;-PPX4Z;UUu%qzW;q1PX%zCc)|U4R#xdHIWx($=Xhg4l!lTtC50 zw{8n({SVR!&U@uas;`=3)YUFwmhu2`ldW#frao{3Pwmy5$9Jam#?nCv@=vy}yUZB`M!S;vKl|gfe<1$)z~d z9X6Hb_N=t3P2W@P9Hu%fyF>IgNJmGu)FF%sIDf>hqwo^YLt+~%m>YC^*<&b;%oYDZ znw<;Psi?8g$F9j4hj|;jr_g^3Z`3)Yf1@~SGf7b)mkmwK#RH+|jTaf7@Lk`(<%x)9 z$S$5;FYx|}b~$*fF)M9C354Fc+m7c?s znowV22==OYKSG_N=sk<)ifVjtiNdlS2bPf1tE`;%uw@I_ zudp1f*Lu~$FSHBcF~m5ft9NS{WJI?<;Nx>+zDE4TG%~+HWm112oAG!O*4&RU+^-=1 z)eXAoQVW)IAecc^NCN$_3Z+SPFxpTUC*1-$rJ5~plUVRldH?Mj8RT!!2t#Fs8kGJH zzvBdEQl+a)-%yE)p9nie?5`sMnIi$1v45sd4QOu8s}S<^-bm< z9{7OGQd$PTe2TJsDxw45Ifo1aKLD?1lfn#jllPEWsWJ#_#(~pK7Tx-XI6>!Gv!*?4 zki9KR8!67!;5*;q?0ZpmLLGNPG=%~z^Lv36ze$S_R-g||lS=)_Oam5Fgw9BVMUP@? z){&W$tplj&2<1GXr}uziCC@CrH|Zr`vQIQ@u`KyoR8b<#utx+T-1qsJXERS&U8d)o zB2Uz$jwM1oQGj}_1o;%?T{DhL5E_EJ56H9%jn`TyFx^(5j@6Mpg~IANf|xBNx1ue!jI9?iNKjt{kzItwcE<+& zZXcJuSk^pzNNs`Aa7PJ+@3C;nDL^=veKAS%?nOC5zG9lf=#SOC=oQ9aAM4ZvGZSK8 z8Bj3A1Cv2;en&3u6Jdm)8qm=oeVe8!+m=y;+4u?07UdD2=l0q!q`MMRIB1$CiTC8+ zt_1aG$96whMo(Bo@Q^a-8`s?refXnU)>pUGmcPMsVUGi4|RlgMM4injeP0O*_7Us>c&S!V2m@^1b%^{_t25-^3DoPzzjI*vh79nLidEm9 zB_7ZnP6%I}o_%Rv=bi!duR57!o}chn9Nz=xt`Q1##YGDaB5Q>WQQsh_kPPZXhIIy@ z-cR>9fFcvj&NN-MH00PdsmR7s5)VkK8kTGKH_>qAo9Z;d1BEiE>**+D z=nw{h1)X|Z1xV2MX9(<2=(s3`o>?ZFqH)1NAY{2KU~weD&1nQOg#Q4`(Ai_c=&&5s z(%F-ubHsqjWjJY}b0opEvs`I0TuToysaaIaavX%=GQ_l+DLQXJD-Uoo2xmdS8DdwU ztnJ_+2HysYCDh~7p$6GkLiPaFAYULDG)s$Yr-k>{?RvZG_HUyT35L0$bM@o#sGjw$ z>j$QCK{VYaqWQ_$x_P^WBJo+BwDj8a-dag- zo5o=DlBd74vuiUVnB$VC0kO|b2R4$MdUe5kgge+y?1UHNF`h-wa0v6I2p99*JMNLn zcsZKohIKnR?os_!osCjUmok7jfRRSXD_*rA$)TzXRyJczA}qy=SA}fsay850_zUlP z-t@v<)ixt;qOfZM&#jppUb)7%C3ANmlEV_`0Y_$% zV-aiT zb0p5Okj_fQzNXPOw6pE!(>9d1?Jr)oMRK#v+*i@&k9*~^l=se{y>6z@c<8UQi5PkZ zHk9{n{rX|c=`7-C87c0yv@bLb=|QKX(tj+#ug$4gMM^xHz|#F)9sH& zscL;MLaw`l!*?M;?|!Bj5o8xbSmRR|R$S_W=7wokke@ThpJFh&e&vT5TPwWyofR3f%8lF=Z&yd0oxf)SNDz@MW4 zzkUVTcNfI^vL;FL)HXxclPk9z{hJBHPfZJAcy5HLw)Bl{nHny~LSbW%%4{@~wc%aIm5xSm&P4b(FZF zVB-0gj0%C-?q4_b6h{Yq1U`tvD;fx;xW=4l`#L<~^YFWhv0dLK$bd25VQz@aO#FmT zSJ+ymz-T+bo}qH*<&B}W*ge(>3n&v3QAPt4BppR#P$VfJghh8p39C@*@eCU6-J4c; zfIw(p%>NwsfcMxCg)OCZV~_9B#ysHW?D3X8{VvAkwiFMIxE+pkb^K}i@ehJ!JpyV$ z*%$ez`fvGY|A7FthJ=c&jHvt9a^(O2DWs@qyCHw+P{|>2%{kMs*2jnjlDdyHfIyq) ztC(B=;({`lruScvWRfhBGu<7B0)Hp{0M_&NZ}{Et8?E^`^Ru5n|AJXkI0Jm?#$a;u zD9g_8)$?$wE0+(#9gN%)J*tIwbK~P8k+x8nGG(^KxS?6 z@{eUwCZH@GuS>|ysmSKWBlHK6l_>Ogy)RC`u$H)a>NPBlf{gS48tu> z*y{|*`m)1jRhPAPJ9oK|&yu##(}nxlN7@F#@}7kl>~asAngO^qX57s7ST(p#b4-`M zL$D4xnY{>OZZ_$r@>6Ix*)}PT5PRTlM8y192Q%VoMusFBPe;we&~m3C(x@Lbng(fH zLXFcbm9>Njef=%dl*9W0Yra^L^r=vH{su%2EDT*rqMuw$6lXJ4QCV~KE&A℘wV} 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 -w&s=Q>!$YhOroY^Ow%iP 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 literal 0 HcmV?d00001 diff --git a/jingle/extension/build/merge/jstun-0.6.1.jar b/jingle/extension/build/merge/jstun-0.6.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..f2a5f1faacf53d4e90ab8cdd52839c789910f62d GIT binary patch literal 73886 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 literal 0 HcmV?d00001 diff --git a/jingle/extension/build/projects/Jingle.ipr b/jingle/extension/build/projects/Jingle.ipr new file mode 100644 index 000000000..425e6dc42 --- /dev/null +++ b/jingle/extension/build/projects/Jingle.ipr @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jingle/extension/build/projects/Jingle.iws b/jingle/extension/build/projects/Jingle.iws new file mode 100644 index 000000000..7203abc19 --- /dev/null +++ b/jingle/extension/build/projects/Jingle.iws @@ -0,0 +1,635 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + localhost + 5050 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jingle/extension/build/projects/JingleExtension.iml b/jingle/extension/build/projects/JingleExtension.iml new file mode 100644 index 000000000..8a458a56a --- /dev/null +++ b/jingle/extension/build/projects/JingleExtension.iml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jingle/extension/build/projects/Smack.iws b/jingle/extension/build/projects/Smack.iws new file mode 100644 index 000000000..698d5c636 --- /dev/null +++ b/jingle/extension/build/projects/Smack.iws @@ -0,0 +1,593 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + localhost + 5050 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/IncomingJingleSession.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/IncomingJingleSession.java new file mode 100644 index 000000000..51210ce26 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/IncomingJingleSession.java @@ -0,0 +1,421 @@ +/** + * $RCSfile$ + * $Revision$ + * $Date$ + * + * Copyright (C) 2002-2006 Jive Software. All rights reserved. + * ==================================================================== + * The Jive Software License (based on Apache Software License, Version 1.1) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by + * Jive Software (http://www.jivesoftware.com)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Smack" and "Jive Software" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please + * contact webmaster@jivesoftware.com. + * + * 5. Products derived from this software may not be called "Smack", + * nor may "Smack" appear in their name, without prior written + * permission of Jive Software. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL JIVE SOFTWARE OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + */ + +package org.jivesoftware.smackx.jingle; + +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.packet.IQ; +import org.jivesoftware.smackx.jingle.listeners.JingleMediaListener; +import org.jivesoftware.smackx.jingle.listeners.JingleTransportListener; +import org.jivesoftware.smackx.jingle.media.JingleMediaManager; +import org.jivesoftware.smackx.jingle.media.MediaNegotiator; +import org.jivesoftware.smackx.jingle.media.PayloadType; +import org.jivesoftware.smackx.jingle.nat.TransportCandidate; +import org.jivesoftware.smackx.jingle.nat.TransportNegotiator; +import org.jivesoftware.smackx.jingle.nat.TransportResolver; +import org.jivesoftware.smackx.packet.Jingle; +import org.jivesoftware.smackx.packet.JingleContentDescription; +import org.jivesoftware.smackx.packet.JingleContentDescription.JinglePayloadType; +import org.jivesoftware.smackx.packet.JingleError; + +import java.util.List; + +/** + * An incoming Jingle Session implementation. + * This class has especific bahavior to accept and establish a received Jingle Session Request. + * + * This class is not directly used by users. Instead, users should refer to the + * JingleManager class, that will create the appropiate instance... + * + * @author Alvaro Saurin + */ +public class IncomingJingleSession extends JingleSession { + + // states + private final Accepting accepting; + + private final Pending pending; + + private final Active active; + + private JingleSessionRequest initialSessionRequest; + + /** + * Constructor for a Jingle incoming session + * + * @param conn the XMPP connection + * @param responder the responder + * @param resolver The transport resolver + */ + protected IncomingJingleSession(XMPPConnection conn, String responder, + List payloadTypes, TransportResolver resolver) { + + super(conn, responder, conn.getUser()); + + // Create the states... + + accepting = new Accepting(this); + pending = new Pending(this); + active = new Active(this); + + setMediaNeg(new MediaNegotiator(this, payloadTypes)); + if (resolver.getType().equals(TransportResolver.Type.rawupd)) { + setTransportNeg(new TransportNegotiator.RawUdp(this, resolver)); + } + if (resolver.getType().equals(TransportResolver.Type.ice)) { + setTransportNeg(new TransportNegotiator.Ice(this, resolver)); + } + } + + /** + * Constructor for a Jingle Incoming session with a defined Media Manager + * + * @param conn the XMPP connection + * @param responder the responder + * @param resolver The transport resolver + * @param jingleMediaManager The Media Manager for this Session + */ + protected IncomingJingleSession(XMPPConnection conn, String responder, + List payloadTypes, TransportResolver resolver, JingleMediaManager jingleMediaManager) { + this(conn, responder, payloadTypes, resolver); + this.jingleMediaManager = jingleMediaManager; + } + + /** + * Start the session for a initial Jingle request packet. + * + * @param initialJingleSessionRequest the initial Jingle Session Request + * @throws XMPPException + */ + public void start(JingleSessionRequest initialJingleSessionRequest) throws XMPPException { + if (invalidState()) { + Jingle packet = initialJingleSessionRequest.getJingle(); + System.out.println("invalidState"); + if (packet != null) { + + // Initialize the session information + setSid(packet.getSid()); + + // Establish the default state + setState(accepting); + + updatePacketListener(); + respond(packet); + } else { + throw new IllegalStateException( + "Session request with null Jingle packet."); + } + } else { + throw new IllegalStateException("Starting session without null state."); + } + } + + /** + * Start the session using initial Jingle Session Request used to create this session.. + * + * @throws XMPPException + */ + public void start() throws XMPPException { + start(this.getInitialSessionRequest()); + } + + /** + * Get the initial Jingle packet request + * + * @return + */ + JingleSessionRequest getInitialSessionRequest() { + return initialSessionRequest; + } + + /** + * Get the initial Jingle packet request + * + * @param initialRequest the initial Jingle packet + */ + void setInitialSessionRequest(JingleSessionRequest initialRequest) { + this.initialSessionRequest = initialRequest; + } + + // States + + /** + * First stage when we have received a session request, and we accept the + * request. We start in this stage, as the instance is created when the user + * accepts the connection... + */ + public class Accepting extends JingleNegotiator.State { + + public Accepting(JingleNegotiator neg) { + super(neg); + } + + /** + * Initiate the incoming session. We have already sent the ACK partially + * accepting the session... + * + * @throws XMPPException + */ + public Jingle eventInitiate(Jingle inJingle) throws XMPPException { + // Set the new session state + setState(pending); + return super.eventInitiate(inJingle); + } + + /** + * An error has occurred. + * + * @throws XMPPException + */ + public void eventError(IQ iq) throws XMPPException { + triggerSessionClosedOnError(new JingleException(iq.getError().getMessage())); + super.eventError(iq); + } + } + + /** + * "Pending" state: we are waiting for the transport and content + * negotiators. + */ + private class Pending extends JingleNegotiator.State { + + JingleMediaListener jingleMediaListener; + + JingleTransportListener jingleTransportListener; + + public Pending(JingleNegotiator neg) { + super(neg); + + // Create the listeners that will send a "session-accept" when the + // sub-negotiators are done. + jingleMediaListener = new JingleMediaListener() { + public void mediaClosed(PayloadType cand) { + } + + public void mediaEstablished(PayloadType pt) { + checkFullyEstablished(); + } + }; + + jingleTransportListener = new JingleTransportListener() { + public void transportEstablished(TransportCandidate local, + TransportCandidate remote) { + checkFullyEstablished(); + } + + public void transportClosed(TransportCandidate cand) { + } + + public void transportClosedOnError(XMPPException e) { + } + }; + } + + /** + * Enter in the pending state: wait for the sub-negotiators. + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventEnter() + */ + public void eventEnter() { + // Add the listeners to the sub-negotiators... + System.out.println("Pending eventEnter"); + addMediaListener(jingleMediaListener); + addTransportListener(jingleTransportListener); + super.eventEnter(); + } + + /** + * Exit of the state + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventExit() + */ + public void eventExit() { + removeMediaListener(jingleMediaListener); + removeTransportListener(jingleTransportListener); + super.eventExit(); + } + + /** + * Check if the session has been fully accepted by all the + * sub-negotiators and, in that case, send an "accept" message... + */ + private void checkFullyEstablished() { + if (isFullyEstablished()) { + + PayloadType.Audio bestCommonAudioPt = getMediaNeg() + .getBestCommonAudioPt(); + TransportCandidate bestRemoteCandidate = getTransportNeg() + .getBestRemoteCandidate(); + TransportCandidate acceptedLocalCandidate = getTransportNeg() + .getAcceptedLocalCandidate(); + + if (bestCommonAudioPt != null && bestRemoteCandidate != null + && acceptedLocalCandidate != null) { + // Ok, send a packet saying that we accept this session + Jingle jout = new Jingle(Jingle.Action.SESSIONACCEPT); + + // ... with the audio payload type and the transport + // candidate + jout.addDescription(new JingleContentDescription.Audio( + new JinglePayloadType(bestCommonAudioPt))); + jout.addTransport(getTransportNeg().getJingleTransport( + bestRemoteCandidate)); + + addExpectedId(jout.getPacketID()); + sendFormattedJingle(jout); + } + } + } + + /** + * The other endpoint has accepted the session. + */ + public Jingle eventAccept(Jingle jin) throws XMPPException { + + PayloadType acceptedPayloadType = null; + TransportCandidate acceptedLocalCandidate = null; + + // We process the "accepted" if we have finished the + // sub-negotiators. Maybe this is not needed (ie, the other endpoint + // can take the first valid transport candidate), but otherwise we + // must cancel the negotiators... + // + if (isFullyEstablished()) { + acceptedPayloadType = getAcceptedAudioPayloadType(jin); + acceptedLocalCandidate = getAcceptedLocalCandidate(jin); + + if (acceptedPayloadType != null && acceptedLocalCandidate != null) { + if (acceptedPayloadType.equals(getMediaNeg().getBestCommonAudioPt()) + && acceptedLocalCandidate.equals(getTransportNeg() + .getAcceptedLocalCandidate())) { + setState(active); + } + } else { + throw new JingleException(JingleError.MALFORMED_STANZA); + } + } + + return super.eventAccept(jin); + } + + /** + * We have received a confirmation. + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventAck(org.jivesoftware.smack.packet.IQ) + */ + public Jingle eventAck(IQ iq) throws XMPPException { + setState(active); + return super.eventAck(iq); + } + + /** + * An error has occurred. + * + * @throws XMPPException + */ + public void eventError(IQ iq) throws XMPPException { + if (iq == null) return; + triggerSessionClosedOnError(new XMPPException(iq.getError())); + super.eventError(iq); + } + } + + /** + * "Active" state: we have an agreement about the session. + */ + private class Active extends JingleNegotiator.State { + public Active(JingleNegotiator neg) { + super(neg); + } + + /** + * We have a established session: notify the listeners + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventEnter() + */ + public void eventEnter() { + PayloadType.Audio bestCommonAudioPt = getMediaNeg().getBestCommonAudioPt(); + TransportCandidate bestRemoteCandidate = getTransportNeg() + .getBestRemoteCandidate(); + TransportCandidate acceptedLocalCandidate = getTransportNeg() + .getAcceptedLocalCandidate(); + + // Trigger the session established flag + System.out.println("eventEntered"); + triggerSessionEstablished(bestCommonAudioPt, bestRemoteCandidate, + acceptedLocalCandidate); + + super.eventEnter(); + } + + /** + * Terminate the connection. + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventTerminate(org.jivesoftware.smackx.packet.Jingle) + */ + public Jingle eventTerminate(Jingle jin) throws XMPPException { + triggerSessionClosed("Closed Remotely"); + return super.eventTerminate(jin); + } + + /** + * An error has occurred. + * + * @throws XMPPException + */ + public void eventError(IQ iq) throws XMPPException { + triggerSessionClosedOnError(new XMPPException(iq.getError().getMessage())); + super.eventError(iq); + } + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleManager.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleManager.java new file mode 100644 index 000000000..5ebdf94df --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleManager.java @@ -0,0 +1,703 @@ +/** + * $RCSfile$ + * $Revision$ + * $Date$ + * + * Copyright 2003-2005 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jivesoftware.smackx.jingle; + +import org.jivesoftware.smack.*; +import org.jivesoftware.smack.filter.PacketFilter; +import org.jivesoftware.smack.packet.IQ; +import org.jivesoftware.smack.packet.Packet; +import org.jivesoftware.smack.provider.ProviderManager; +import org.jivesoftware.smack.util.StringUtils; +import org.jivesoftware.smackx.ServiceDiscoveryManager; +import org.jivesoftware.smackx.jingle.listeners.CreatedJingleSessionListener; +import org.jivesoftware.smackx.jingle.listeners.JingleListener; +import org.jivesoftware.smackx.jingle.listeners.JingleSessionListener; +import org.jivesoftware.smackx.jingle.listeners.JingleSessionRequestListener; +import org.jivesoftware.smackx.jingle.media.JingleMediaManager; +import org.jivesoftware.smackx.jingle.media.PayloadType; +import org.jivesoftware.smackx.jingle.nat.BasicResolver; +import org.jivesoftware.smackx.jingle.nat.JingleTransportManager; +import org.jivesoftware.smackx.jingle.nat.TransportCandidate; +import org.jivesoftware.smackx.jingle.nat.TransportResolver; +import org.jivesoftware.smackx.packet.DiscoverInfo; +import org.jivesoftware.smackx.packet.Jingle; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Jingle is a session establishment protocol defined in (XEP-0166). + * It defines a framework for negotiating and managing out-of-band ( data that is send and receive through other connection than XMPP connection) data sessions over XMPP. + * With this protocol you can setup VOIP Calls, Video Streaming, File transfers and whatever out-of-band session based transmission. + * + * To create a Jingle Session you need a Transport method and a Payload type. + * + * A transport method is how it will trasmit and receive network packets. Transport MUST have one or more candidates. + * A transport candidate is an IP Address with a defined port, that other party must send data to. + * + * A supported payload type, is the data encoding format that the jmf will be transmitted. + * For instance an Audio Payload "GSM". + * + * A Jingle session negociates a payload type and a pair of transport candidates. + * Which means that when a Jingle Session is establhished you will have two defined transport candidates with addresses + * and a defined Payload type. + * In other words, you will have two IP address with their respective ports, and a Codec type defined. + * + * The JingleManager is a facade built upon Jabber Jingle (XEP-166) to allow the + * use of Jingle. This implementation allows the user to simply + * use this class for setting the Jingle parameters, create and receive Jingle Sessions. + * + * In order to use the Jingle, the user must provide a + * TransportManager that will handle the resolution of potential IP addresses taht can be used to transport the streaming (jmf). + * This TransportManager can be initialized with several default resolvers, + * including a fixed solver that can be used when the address and port are know + * in advance. + * This API have ready to use Transport Managers, for instance: BasicTransportManager, STUNTransportManager, BridgedTransportManager. + * + * You should also especify a JingleMediaManager if you want that JingleManager assume Media control + * Using a JingleMediaManager implementation is the easier way to implement a Jingle Application. + * + * Otherwise before creating an outgoing connection, the user must create jingle session + * listeners that will be called when different events happen. The most + * important event is sessionEstablished(), that will be called when all + * the negotiations are finished, providing the payload type for the + * transmission as well as the remote and local addresses and ports for the + * communication. See JingleSessionListener for a complete list of events that can be + * observed. + * + * This is an example of how to use the JingleManager: + * This example implements a Jingle VOIP Call between two users. + * + *

+ *
+ *                               To wait for an Incoming Jingle Session:
+ *
+ *                               try {
+ *
+ *                                           // Connect to a XMPP Server
+ *                                           XMPPConnection x1 = new XMPPConnection("xmpp.com");
+ *                                           x1.connect();
+ *                                           x1.login("juliet", "juliet");
+ *
+ *                                           // Create a JingleManager using a BasicResolver
+ *                                           final JingleManager jm1 = new JingleManager(
+ *                                                   x1, new BasicTransportManager());
+ *
+ *                                           // Create a JingleMediaManager. In this case using Jingle Audio Media API
+ *                                           JingleMediaManager jingleMediaManager = new AudioMediaManager();
+ *
+ *                                           // Set the JingleMediaManager
+ *                                           jm1.setMediaManager(jingleMediaManager);
+ *
+ *                                           // Listen for incoming calls
+ *                                           jm1.addJingleSessionRequestListener(new JingleSessionRequestListener() {
+ *                                               public void sessionRequested(JingleSessionRequest request) {
+ *
+ *                                                   try {
+ *                                                      // Accept the call
+ *                                                      IncomingJingleSession session = request.accept();
+ *
+ *
+ *                                                       // Start the call
+ *                                                       session.start();
+ *                                                   } catch (XMPPException e) {
+ *                                                       e.printStackTrace();
+ *                                                   }
+ *
+ *                                               }
+ *                                           });
+ *
+ *                                       Thread.sleep(15000);
+ *
+ *                                       } catch (Exception e) {
+ *                                           e.printStackTrace();
+ *                                       }
+ *
+ *                               To create an Outgoing Jingle Session:
+ *
+ *                                     try {
+ *
+ *                                           // Connect to a XMPP Server
+ *                                           XMPPConnection x0 = new XMPPConnection("xmpp.com");
+ *                                           x0.connect();
+ *                                           x0.login("romeo", "romeo");
+ *
+ *                                           // Create a JingleManager using a BasicResolver
+ *                                           final JingleManager jm0 = new JingleManager(
+ *                                                   x0, new BasicTransportManager());
+ *
+ *                                           // Create a JingleMediaManager. In this case using Jingle Audio Media API
+ *                                           JingleMediaManager jingleMediaManager = new AudioMediaManager(); // Using Jingle Media API
+ *
+ *                                           // Set the JingleMediaManager
+ *                                           jm0.setMediaManager(jingleMediaManager);
+ *
+ *                                           // Create a new Jingle Call with a full JID
+ *                                           OutgoingJingleSession js0 = jm0.createOutgoingJingleSession("juliet@xmpp.com/Smack");
+ *
+ *                                           // Start the call
+ *                                           js0.start();
+ *
+ *                                           Thread.sleep(10000);
+ *                                           js0.terminate();
+ *
+ *                                           Thread.sleep(3000);
+ *
+ *                                       } catch (Exception e) {
+ *                                           e.printStackTrace();
+ *                                       }
+ *                               
+ * + * @author Thiago Camargo + * @author Alvaro Saurin + * @see JingleListener + * @see TransportResolver + * @see org.jivesoftware.smackx.jingle.nat.JingleTransportManager + * @see OutgoingJingleSession + * @see IncomingJingleSession + * @see JingleMediaManager + * @see org.jivesoftware.smackx.jingle.nat.BasicTransportManager , STUNTransportManager, BridgedTransportManager, TransportResolver, BridgedResolver, ICEResolver, STUNResolver and BasicResolver. + */ +public class JingleManager implements JingleSessionListener { + + // non-static + + final List jingleSessions = new ArrayList(); + + // Listeners for manager events (ie, session requests...) + private List jingleSessionRequestListeners; + + // Listeners for created JingleSessions + private List creationListeners = new ArrayList(); + + // The XMPP connection + private XMPPConnection connection; + + // The Media Manager + private JingleMediaManager jingleMediaManager; + + // The Jingle transport manager + private final JingleTransportManager jingleTransportManager; + + static { + + ProviderManager providerManager = ProviderManager.getInstance(); + + providerManager.addIQProvider("jingle", "http://jabber.org/protocol/jingle", + new org.jivesoftware.smackx.provider.JingleProvider()); + + providerManager.addExtensionProvider("description", "http://jabber.org/protocol/jingle/description/audio", + new org.jivesoftware.smackx.provider.JingleContentDescriptionProvider.Audio()); + + providerManager.addExtensionProvider("description", "http://jabber.org/protocol/jingle/description/audio", + new org.jivesoftware.smackx.provider.JingleContentDescriptionProvider.Audio()); + + providerManager.addExtensionProvider("transport", "http://jabber.org/protocol/jingle/transport/ice", + new org.jivesoftware.smackx.provider.JingleTransportProvider.Ice()); + providerManager.addExtensionProvider("transport", "http://jabber.org/protocol/jingle/transport/raw-udp", + new org.jivesoftware.smackx.provider.JingleTransportProvider.RawUdp()); + + providerManager.addExtensionProvider("busy", "http://jabber.org/protocol/jingle/info/audio", + new org.jivesoftware.smackx.provider.JingleContentInfoProvider.Audio.Busy()); + providerManager.addExtensionProvider("hold", "http://jabber.org/protocol/jingle/info/audio", + new org.jivesoftware.smackx.provider.JingleContentInfoProvider.Audio.Hold()); + providerManager.addExtensionProvider("mute", "http://jabber.org/protocol/jingle/info/audio", + new org.jivesoftware.smackx.provider.JingleContentInfoProvider.Audio.Mute()); + providerManager.addExtensionProvider("queued", "http://jabber.org/protocol/jingle/info/audio", + new org.jivesoftware.smackx.provider.JingleContentInfoProvider.Audio.Queued()); + providerManager.addExtensionProvider("ringing", "http://jabber.org/protocol/jingle/info/audio", + new org.jivesoftware.smackx.provider.JingleContentInfoProvider.Audio.Ringing()); + + // Enable the Jingle support on every established connection + // The ServiceDiscoveryManager class should have been already + // initialized + XMPPConnection.addConnectionCreationListener(new ConnectionCreationListener() { + public void connectionCreated(XMPPConnection connection) { + JingleManager.setServiceEnabled(connection, true); + } + }); + } + + /** + * Default constructor with a defined XMPPConnection, Transport Resolver and a Media Manager + * If a fully implemented JingleMediaSession is entered, JingleManager manage Jingle signalling and jmf + * + * @param connection XMPP Connection to be used + * @param jingleTransportManager transport resolver to be used + * @param jingleMediaManager an implemeted JingleMediaManager to be used. + */ + public JingleManager(XMPPConnection connection, JingleTransportManager jingleTransportManager, JingleMediaManager jingleMediaManager) { + this.connection = connection; + this.jingleTransportManager = jingleTransportManager; + this.jingleMediaManager = jingleMediaManager; + + connection.getRoster().addRosterListener(new RosterListener() { + + public void entriesAdded(Collection addresses) { + } + + public void entriesUpdated(Collection addresses) { + } + + public void entriesDeleted(Collection addresses) { + } + + public void presenceChanged(String XMPPAddress) { + JingleSession aux = null; + for (JingleSession jingleSession : jingleSessions) { + if (jingleSession.getInitiator().equals(XMPPAddress) || jingleSession.getResponder().equals(XMPPAddress)) { + aux = jingleSession; + } + } + if (aux != null) + try { + aux.terminate(); + } catch (XMPPException e) { + e.printStackTrace(); + } + } + }); + + } + + /** + * Default constructor with a defined XMPPConnection and a Transport Resolver + * + * @param connection XMPP Connection to be used + * @param jingleTransportManager transport resolver to be used + */ + public JingleManager(XMPPConnection connection, JingleTransportManager jingleTransportManager) { + this(connection, jingleTransportManager, null); + } + + /** + * Default constructor with a defined XMPPConnection. + * A default JingleTransportmanager based on BasicResolver will be used in this JingleManager transport. + * + * @param connection XMPP Connection to be used + */ + public JingleManager(XMPPConnection connection) { + this(connection, new JingleTransportManager() { + protected TransportResolver createResolver() { + return new BasicResolver(); + } + }); + } + + /** + * Default constructor with a defined XMPPConnection and a defined Resolver. + * A default JingleTransportmanager based on BasicResolver will be used in this JingleManager transport. + * + * @param connection XMPP Connection to be used + */ + public JingleManager(XMPPConnection connection, final TransportResolver resolver) { + this(connection, new JingleTransportManager() { + protected TransportResolver createResolver() { + return resolver; + } + }); + } + + /** + * Enables or disables the Jingle support on a given connection. + * + * + * Before starting any Jingle jmf session, check that the user can handle + * it. Enable the Jingle support to indicate that this client handles Jingle + * messages. + * + * @param connection the connection where the service will be enabled or + * disabled + * @param enabled indicates if the service will be enabled or disabled + */ + public synchronized static void setServiceEnabled(XMPPConnection connection, + boolean enabled) { + if (isServiceEnabled(connection) == enabled) { + return; + } + + if (enabled) { + ServiceDiscoveryManager.getInstanceFor(connection).addFeature( + Jingle.NAMESPACE); + } else { + ServiceDiscoveryManager.getInstanceFor(connection).removeFeature( + Jingle.NAMESPACE); + } + } + + /** + * Returns true if the Jingle support is enabled for the given connection. + * + * @param connection the connection to look for Jingle support + * @return a boolean indicating if the Jingle support is enabled for the + * given connection + */ + public static boolean isServiceEnabled(XMPPConnection connection) { + return ServiceDiscoveryManager.getInstanceFor(connection).includesFeature( + Jingle.NAMESPACE); + } + + /** + * Returns true if the specified user handles Jingle messages. + * + * @param connection the connection to use to perform the service discovery + * @param userID the user to check. A fully qualified xmpp ID, e.g. + * jdoe@example.com + * @return a boolean indicating whether the specified user handles Jingle + * messages + */ + public static boolean isServiceEnabled(XMPPConnection connection, String userID) { + try { + DiscoverInfo result = ServiceDiscoveryManager.getInstanceFor(connection) + .discoverInfo(userID); + return result.containsFeature(Jingle.NAMESPACE); + } + catch (XMPPException e) { + e.printStackTrace(); + return false; + } + } + + /** + * Get the JingleTransportManager of this JingleManager + * + * @return + */ + public JingleTransportManager getJingleTransportManager() { + return jingleTransportManager; + } + + /** + * Get the Media Manager of this Jingle Manager + * + * @return + */ + public JingleMediaManager getMediaManager() { + return jingleMediaManager; + } + + /** + * Set the Media Manager of this Jingle Manager + * + * @param jingleMediaManager JingleMediaManager to be used for open, close, start and stop jmf streamings + */ + public void setMediaManager(JingleMediaManager jingleMediaManager) { + this.jingleMediaManager = jingleMediaManager; + } + + /** + * Add a Jingle session request listenerJingle to listen to incoming session + * requests. + * + * @param jingleSessionRequestListener an implemented JingleSessionRequestListener + * @see #removeJingleSessionRequestListener(JingleSessionRequestListener) + * @see JingleListener + */ + public synchronized void addJingleSessionRequestListener( + final JingleSessionRequestListener jingleSessionRequestListener) { + if (jingleSessionRequestListener != null) { + if (jingleSessionRequestListeners == null) { + initJingleSessionRequestListeners(); + } + synchronized (jingleSessionRequestListeners) { + jingleSessionRequestListeners.add(jingleSessionRequestListener); + } + } + } + + /** + * Removes a Jingle session listenerJingle. + * + * @param jingleSessionRequestListener The jingle session jingleSessionRequestListener to be removed + * @see #addJingleSessionRequestListener(JingleSessionRequestListener) + * @see JingleListener + */ + public void removeJingleSessionRequestListener(JingleSessionRequestListener jingleSessionRequestListener) { + if (jingleSessionRequestListeners == null) { + return; + } + synchronized (jingleSessionRequestListeners) { + jingleSessionRequestListeners.remove(jingleSessionRequestListener); + } + } + + /** + * Adds a CreatedJingleSessionListener. + * This listener will be called when a session is created by the JingleManager instance. + * + * @param createdJingleSessionListener + */ + public void addCreationListener(CreatedJingleSessionListener createdJingleSessionListener) { + this.creationListeners.add(createdJingleSessionListener); + } + + /** + * Removes a CreatedJingleSessionListener. + * This listener will be called when a session is created by the JingleManager instance. + * + * @param createdJingleSessionListener + */ + public void removeCreationListener(CreatedJingleSessionListener createdJingleSessionListener) { + this.creationListeners.remove(createdJingleSessionListener); + } + + /** + * Trigger CreatedJingleSessionListeners that a session was created. + * + * @param jingleSession + */ + public void triggerSessionCreated(JingleSession jingleSession) { + jingleSessions.add(jingleSession); + jingleSession.addListener(this); + for (CreatedJingleSessionListener createdJingleSessionListener : creationListeners) { + try { + createdJingleSessionListener.sessionCreated(jingleSession); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public void sessionEstablished(PayloadType pt, TransportCandidate rc, TransportCandidate lc, JingleSession jingleSession) { + } + + public void sessionDeclined(String reason, JingleSession jingleSession) { + jingleSession.removeListener(this); + jingleSessions.remove(jingleSession); + jingleSession.close(); + System.err.println("Declined"); + } + + public void sessionRedirected(String redirection, JingleSession jingleSession) { + jingleSession.removeListener(this); + jingleSessions.remove(jingleSession); + } + + public void sessionClosed(String reason, JingleSession jingleSession) { + jingleSession.removeListener(this); + jingleSessions.remove(jingleSession); + } + + public void sessionClosedOnError(XMPPException e, JingleSession jingleSession) { + jingleSession.removeListener(this); + jingleSessions.remove(jingleSession); + } + + /** + * Register the listenerJingles, waiting for a Jingle packet that tries to + * establish a new session. + */ + private void initJingleSessionRequestListeners() { + PacketFilter initRequestFilter = new PacketFilter() { + // Return true if we accept this packet + public boolean accept(Packet pin) { + if (pin instanceof IQ) { + IQ iq = (IQ) pin; + if (iq.getType().equals(IQ.Type.SET)) { + if (iq instanceof Jingle) { + Jingle jin = (Jingle) pin; + if (jin.getAction().equals(Jingle.Action.SESSIONINITIATE)) { + return true; + } + } + } + } + return false; + } + }; + + jingleSessionRequestListeners = new ArrayList(); + + // Start a packet listener for session initiation requests + connection.addPacketListener(new PacketListener() { + public void processPacket(Packet packet) { + triggerSessionRequested((Jingle) packet); + } + }, initRequestFilter); + } + + /** + * Disconnect all Jingle Sessions + */ + public void disconnectAllSessions() { + + List sessions = jingleSessions.subList(0, jingleSessions.size()); + + for (JingleSession jingleSession : sessions) + try { + jingleSession.terminate(); + } catch (XMPPException e) { + e.printStackTrace(); + } + + sessions.clear(); + } + + /** + * Activates the listenerJingles on a Jingle session request. + * + * @param initJin the packet that must be passed to the jingleSessionRequestListener. + */ + void triggerSessionRequested(Jingle initJin) { + + JingleSessionRequestListener[] jingleSessionRequestListeners = null; + + // Make a synchronized copy of the listenerJingles + synchronized (this.jingleSessionRequestListeners) { + jingleSessionRequestListeners = new JingleSessionRequestListener[this.jingleSessionRequestListeners.size()]; + this.jingleSessionRequestListeners.toArray(jingleSessionRequestListeners); + } + + // ... and let them know of the event + JingleSessionRequest request = new JingleSessionRequest(this, initJin); + for (int i = 0; i < jingleSessionRequestListeners.length; i++) { + jingleSessionRequestListeners[i].sessionRequested(request); + } + } + + // Session creation + + /** + * Creates an Jingle session to start a communication with another user. + * + * @param responder the fully qualified jabber ID with resource of the other + * user. + * @param payloadTypes list of supported payload types + * @return The session on which the negotiation can be run. + */ + public OutgoingJingleSession createOutgoingJingleSession(String responder, + List payloadTypes) throws XMPPException { + + if (responder == null || StringUtils.parseName(responder).length() <= 0 + || StringUtils.parseServer(responder).length() <= 0 + || StringUtils.parseResource(responder).length() <= 0) { + throw new IllegalArgumentException( + "The provided user id was not fully qualified"); + } + + OutgoingJingleSession session; + + TransportResolver resolver = jingleTransportManager.getResolver(); + + if (jingleMediaManager != null) + session = new OutgoingJingleSession(connection, responder, payloadTypes, resolver, jingleMediaManager); + else + session = new OutgoingJingleSession(connection, responder, payloadTypes, jingleTransportManager.getResolver()); + + triggerSessionCreated(session); + + return session; + } + + /** + * Creates an Jingle session to start a communication with another user. + * + * @param responder the fully qualified jabber ID with resource of the other + * user. + * @return the session on which the negotiation can be run. + */ + public OutgoingJingleSession createOutgoingJingleSession(String responder) throws XMPPException { + if (this.getMediaManager() == null) return null; + return createOutgoingJingleSession(responder, this.getMediaManager().getPayloads()); + } + + /** + * When the session request is acceptable, this method should be invoked. It + * will create an JingleSession which allows the negotiation to procede. + * + * @param request the remote request that is being accepted. + * @param payloadTypes the list of supported Payload types that can be accepted + * @return the session which manages the rest of the negotiation. + */ + IncomingJingleSession createIncomingJingleSession( + JingleSessionRequest request, List payloadTypes) throws XMPPException { + if (request == null) { + throw new NullPointerException("Received request cannot be null"); + } + + IncomingJingleSession session; + + TransportResolver resolver = jingleTransportManager.getResolver(); + + if (jingleMediaManager != null) + session = new IncomingJingleSession(connection, request + .getFrom(), payloadTypes, resolver, jingleMediaManager); + else + session = new IncomingJingleSession(connection, request + .getFrom(), payloadTypes, resolver); + + triggerSessionCreated(session); + + return session; + } + + /** + * When the session request is acceptable, this method should be invoked. It + * will create an JingleSession which allows the negotiation to procede. + * This method use JingleMediaManager to select the supported Payload types. + * + * @param request the remote request that is being accepted. + * @return the session which manages the rest of the negotiation. + */ + IncomingJingleSession createIncomingJingleSession(JingleSessionRequest request) throws XMPPException { + if (request == null) { + throw new NullPointerException("JingleMediaManager is not defined"); + } + if (jingleMediaManager == null) return null; + return createIncomingJingleSession(request, jingleMediaManager.getPayloads()); + } + + /** + * Get a session with the informed JID. If no session is found, return null. + * + * @param jid + * @return + */ + public JingleSession getSession(String jid) { + for (JingleSession jingleSession : jingleSessions) { + if (jingleSession instanceof OutgoingJingleSession) { + if (jingleSession.getResponder().equals(jid)) { + return jingleSession; + } + } else if (jingleSession instanceof IncomingJingleSession) { + if (jingleSession.getInitiator().equals(jid)) { + return jingleSession; + } + } + } + return null; + } + + /** + * Reject the session. If we don't want to accept the new session, send an + * appropriate error packet. + * + * @param request the request to be rejected. + */ + protected void rejectIncomingJingleSession(JingleSessionRequest request) { + Jingle initiation = request.getJingle(); + + IQ rejection = JingleSession.createError(initiation.getPacketID(), initiation + .getFrom(), initiation.getTo(), 403, "Declined"); + connection.sendPacket(rejection); + } +} \ No newline at end of file diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleNegotiator.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleNegotiator.java new file mode 100644 index 000000000..ef5580d12 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleNegotiator.java @@ -0,0 +1,354 @@ +package org.jivesoftware.smackx.jingle; + +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.packet.IQ; +import org.jivesoftware.smackx.jingle.listeners.JingleListener; +import org.jivesoftware.smackx.packet.Jingle; +import org.jivesoftware.smackx.packet.JingleError; + +import java.util.ArrayList; + +/** + * Basic Jingle negotiator. + *

+ *

+ *

+ * JingleNegotiator implements some basic behavior for every Jingle negotiation. + * It implements a "state" pattern: each stage should process Jingle packets and + * act depending on the current state in the negotiation... + *

+ *

+ * + * @author Alvaro Saurin + */ +public abstract class JingleNegotiator { + + private State state; // Current negotiation state + + private XMPPConnection connection; // The connection associated + + private final ArrayList listeners = new ArrayList(); + + private String expectedAckId; + + /** + * Default constructor. + */ + public JingleNegotiator() { + this(null); + } + + /** + * Default constructor with a XMPPConnection + * + * @param connection the connection associated + */ + public JingleNegotiator(XMPPConnection connection) { + this.connection = connection; + state = null; + } + + /** + * Get the XMPP connection associated with this negotiation. + * + * @return the connection + */ + public XMPPConnection getConnection() { + return connection; + } + + /** + * Set the XMPP connection associated. + * + * @param connection the connection to set + */ + public void setConnection(XMPPConnection connection) { + this.connection = connection; + } + + /** + * Inform if current state is null + * + * @return true if current state is null + */ + public boolean invalidState() { + return state == null; + } + + /** + * Return the current state + * + * @return the state + */ + public State getState() { + return state; + } + + /** + * Return the current state class + * + * @return the state + */ + public Class getStateClass() { + if (state != null) { + return state.getClass(); + } else { + return Object.class; + } + } + + /** + * Set the new state. + * + * @param newState the state to set + * @throws XMPPException + */ + protected void setState(State newState) { + boolean transition = newState != state; + + if (transition && state != null) { + state.eventExit(); + } + + state = newState; + + if (transition && state != null) { + state.eventEnter(); + } + } + + // Acks management + + /** + * Add expected ID + * @param id + */ + public void addExpectedId(String id) { + expectedAckId = id; + } + + /** + * Check if the passed ID is the expected ID + * @param id + * @return + */ + public boolean isExpectedId(String id) { + if (id != null) { + return id.equals(expectedAckId); + } else { + return false; + } + } + + /** + * Remove and expected ID + * @param id + */ + public void removeExpectedId(String id) { + addExpectedId((String) null); + } + + // Listeners + + /** + * Add a Jingle session listener to listen to incoming session requests. + * + * @param li The listener + * @see org.jivesoftware.smackx.jingle.listeners.JingleListener + */ + public void addListener(JingleListener li) { + synchronized (listeners) { + listeners.add(li); + } + } + + /** + * Removes a Jingle session listener. + * + * @param li The jingle session listener to be removed + * @see org.jivesoftware.smackx.jingle.listeners.JingleListener + */ + public void removeListener(JingleListener li) { + synchronized (listeners) { + listeners.remove(li); + } + } + + /** + * Get a copy of the listeners + * + * @return a copy of the listeners + */ + protected ArrayList getListenersList() { + ArrayList result; + + synchronized (listeners) { + result = new ArrayList(listeners); + } + + return result; + } + + /** + * Dispatch an incomming packet. This method is responsible for recognizing + * the packet type and, depending on the current state, deliverying the + * packet to the right event handler and wait for a response. + * + * @param iq the packet received + * @param id the ID of the response that will be sent + * @return the new packet to send (either a Jingle or an IQ error). + * @throws XMPPException + */ + public abstract IQ dispatchIncomingPacket(IQ iq, String id) + throws XMPPException; + + /** + * Close the negotiation. + */ + public void close() { + setState(null); + } + + /** + * A Jingle exception. + * + * @author Alvaro Saurin + */ + public static class JingleException extends XMPPException { + + private final JingleError error; + + /** + * Default constructor. + */ + public JingleException() { + super(); + error = null; + } + + /** + * Constructor with an error message. + * + * @param msg The message. + */ + public JingleException(String msg) { + super(msg); + error = null; + } + + /** + * Constructor with an error response. + * + * @param error The error message. + */ + public JingleException(JingleError error) { + super(); + this.error = error; + } + + /** + * Return the error message. + * + * @return the error + */ + public JingleError getError() { + return error; + } + } + + /** + * Negotiation state and events. + *

+ *

+ *

+ * Describes the negotiation stage. + */ + public static class State { + + private JingleNegotiator neg; // The negotiator + + /** + * Default constructor, with a reference to the negotiator. + * + * @param neg The negotiator instance. + */ + public State(JingleNegotiator neg) { + this.neg = neg; + } + + /** + * Get the negotiator + * + * @return the negotiator. + */ + public JingleNegotiator getNegotiator() { + return neg; + } + + /** + * Set the negotiator. + * + * @param neg the neg to set + */ + public void setNegotiator(JingleNegotiator neg) { + this.neg = neg; + } + + // State transition events + + public Jingle eventAck(IQ iq) throws XMPPException { + // We have received an Ack + return null; + } + + public void eventError(IQ iq) throws XMPPException { + throw new JingleException(iq.getError().getMessage()); + } + + public Jingle eventInvite() throws XMPPException { + throw new IllegalStateException( + "Negotiation can not be started in this state."); + } + + public Jingle eventInitiate(Jingle jin) throws XMPPException { + return null; + } + + public Jingle eventAccept(Jingle jin) throws XMPPException { + return null; + } + + public Jingle eventRedirect(Jingle jin) throws XMPPException { + return null; + } + + public Jingle eventModify(Jingle jin) throws XMPPException { + return null; + } + + public Jingle eventDecline(Jingle jin) throws XMPPException { + return null; + } + + public Jingle eventInfo(Jingle jin) throws XMPPException { + return null; + } + + public Jingle eventTerminate(Jingle jin) throws XMPPException { + if (neg != null) { + neg.close(); + } + return null; + } + + public void eventEnter() { + } + + public void eventExit() { + if (neg != null) { + neg.removeExpectedId(null); + } + } + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleSession.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleSession.java new file mode 100644 index 000000000..fac9b94d3 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleSession.java @@ -0,0 +1,1129 @@ +/** + * $RCSfile$ + * $Revision$ + * $Date$ + * + * Copyright (C) 2002-2006 Jive Software. All rights reserved. + * ==================================================================== + * The Jive Software License (based on Apache Software License, Version 1.1) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by + * Jive Software (http://www.jivesoftware.com)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Smack" and "Jive Software" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please + * contact webmaster@jivesoftware.com. + * + * 5. Products derived from this software may not be called "Smack", + * nor may "Smack" appear in their name, without prior written + * permission of Jive Software. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL JIVE SOFTWARE OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + */ + +package org.jivesoftware.smackx.jingle; + +import org.jivesoftware.smack.ConnectionListener; +import org.jivesoftware.smack.PacketListener; +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.filter.PacketFilter; +import org.jivesoftware.smack.packet.IQ; +import org.jivesoftware.smack.packet.Packet; +import org.jivesoftware.smack.packet.XMPPError; +import org.jivesoftware.smackx.jingle.listeners.JingleListener; +import org.jivesoftware.smackx.jingle.listeners.JingleMediaListener; +import org.jivesoftware.smackx.jingle.listeners.JingleSessionListener; +import org.jivesoftware.smackx.jingle.listeners.JingleTransportListener; +import org.jivesoftware.smackx.jingle.media.*; +import org.jivesoftware.smackx.jingle.nat.TransportCandidate; +import org.jivesoftware.smackx.jingle.nat.TransportNegotiator; +import org.jivesoftware.smackx.packet.Jingle; +import org.jivesoftware.smackx.packet.JingleContentDescription; +import org.jivesoftware.smackx.packet.JingleContentDescription.JinglePayloadType; +import org.jivesoftware.smackx.packet.JingleContentInfo; +import org.jivesoftware.smackx.packet.JingleError; +import org.jivesoftware.smackx.packet.JingleTransport.JingleTransportCandidate; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Random; + +/** + * An abstract Jingle session. + * + * This class contains some basic properties of every Jingle session. However, + * the concrete implementation can be found in subclasses. + * + * @author Alvaro Saurin + * @see IncomingJingleSession + * @see OutgoingJingleSession + */ +public abstract class JingleSession extends JingleNegotiator { + + // static + private static final HashMap sessions = new HashMap(); + + private static final Random randomGenerator = new Random(); + + // non-static + + private String initiator; // Who started the communication + + private String responder; // The other endpoint + + private String sid; // A unique id that identifies this session + + private MediaNegotiator mediaNeg; // The description... + + private TransportNegotiator transNeg; // and transport negotiators + + PacketListener packetListener; + + PacketFilter packetFilter; + + protected JingleMediaManager jingleMediaManager = null; + + protected JingleMediaSession jingleMediaSession = null; + + static int ccc=0; + + /** + * Full featured JingleSession constructor + * + * @param conn XMPPConnection + * @param initiator the initiator JID + * @param responder the responder JID + * @param sessionid the session ID + * @param jingleMediaManager the jingleMediaManager + */ + protected JingleSession(XMPPConnection conn, String initiator, String responder, + String sessionid, JingleMediaManager jingleMediaManager) { + super(conn); + + this.mediaNeg = null; + this.transNeg = null; + + this.initiator = initiator; + this.responder = responder; + this.sid = sessionid; + + this.jingleMediaManager = jingleMediaManager; + + // Add the session to the list and register the listeneres + registerInstance(); + installConnectionListeners(conn); + } + + /** + * JingleSession constructor + * + * @param conn XMPPConnection + * @param initiator the initiator JID + * @param responder the responder JID + */ + protected JingleSession(XMPPConnection conn, String initiator, String responder) { + this(conn, initiator, responder, null, null); + } + + /** + * JingleSession constructor + * + * @param conn XMPPConnection + * @param initiator the initiator JID + * @param responder the responder JID + * @param jingleMediaManager the jingleMediaManager + */ + protected JingleSession(XMPPConnection conn, String initiator, String responder, JingleMediaManager jingleMediaManager) { + this(conn, initiator, responder, null, jingleMediaManager); + } + + /** + * Get the session initiator + * + * @return the initiator + */ + public String getInitiator() { + return initiator; + } + + /** + * Set the session initiator + * + * @param initiator the initiator to set + */ + public void setInitiator(String initiator) { + this.initiator = initiator; + } + + /** + * Get the Media Manager of this Jingle Session + * + * @return + */ + public JingleMediaManager getMediaManager() { + return jingleMediaManager; + } + + /** + * Set the Media Manager of this Jingle Session + * + * @param jingleMediaManager + */ + public void setMediaManager(JingleMediaManager jingleMediaManager) { + this.jingleMediaManager = jingleMediaManager; + } + + /** + * Get the session responder + * + * @return the responder + */ + public String getResponder() { + return responder; + } + + /** + * Set the session responder. + * + * @param responder the receptor to set + */ + public void setResponder(String responder) { + this.responder = responder; + } + + /** + * Get the session ID + * + * @return the sid + */ + public String getSid() { + return sid; + } + + /** + * Set the session ID + * + * @param sessionId the sid to set + */ + protected void setSid(String sessionId) { + sid = sessionId; + } + + /** + * Generate a unique session ID. + */ + protected String generateSessionId() { + return String.valueOf(Math.abs(randomGenerator.nextLong())); + } + + /** + * Obtain the description negotiator for this session + * + * @return the description negotiator + */ + protected MediaNegotiator getMediaNeg() { + return mediaNeg; + } + + /** + * Set the jmf negotiator. + * + * @param mediaNeg the description negotiator to set + */ + protected void setMediaNeg(MediaNegotiator mediaNeg) { + destroyMediaNeg(); + this.mediaNeg = mediaNeg; + } + + /** + * Destroy the jmf negotiator. + */ + protected void destroyMediaNeg() { + if (mediaNeg != null) { + mediaNeg.close(); + mediaNeg = null; + } + } + + /** + * Obtain the transport negotiator for this session. + * + * @return the transport negotiator instance + */ + protected TransportNegotiator getTransportNeg() { + return transNeg; + } + + /** + * Set TransportNegociator + * + * @param transNeg the transNeg to set + */ + protected void setTransportNeg(TransportNegotiator transNeg) { + destroyTransportNeg(); + this.transNeg = transNeg; + } + + /** + * Destroy the transport negotiator. + */ + protected void destroyTransportNeg() { + if (transNeg != null) { + transNeg.close(); + transNeg = null; + } + } + + /** + * Return true if the transport and content negotiators have finished + */ + public boolean isFullyEstablished() { + if (!isValid()) { + return false; + } + if (!getTransportNeg().isFullyEstablished() + || !getMediaNeg().isFullyEstablished()) { + return false; + } + return true; + } + + /** + * Return true if the session is valid (ie, it has all the required + * elements initialized). + * + * @return true if the session is valid. + */ + public boolean isValid() { + return mediaNeg != null && transNeg != null && sid != null && initiator != null; + } + + /** + * Dispatch an incoming packet. The medthod is responsible for recognizing + * the packet type and, depending on the current state, deliverying the + * packet to the right event handler and wait for a response. + * + * @param iq the packet received + * @return the new Jingle packet to send. + * @throws XMPPException + */ + public IQ dispatchIncomingPacket(IQ iq, String id) throws XMPPException { + IQ jout = null; + + if (invalidState()) { + throw new IllegalStateException( + "Illegal state in dispatch packet in Session manager."); + } else { + if (iq == null) { + // If there is no input packet, then we must be inviting... + jout = getState().eventInvite(); + } else { + if (iq.getType().equals(IQ.Type.ERROR)) { + // Process errors + getState().eventError(iq); + } else if (iq.getType().equals(IQ.Type.RESULT)) { + // Process ACKs + if (isExpectedId(iq.getPacketID())) { + jout = getState().eventAck(iq); + removeExpectedId(iq.getPacketID()); + } + } else if (iq instanceof Jingle) { + // It is not an error: it is a Jingle packet... + Jingle jin = (Jingle) iq; + Jingle.Action action = jin.getAction(); + + if (action != null) { + if (action.equals(Jingle.Action.SESSIONACCEPT)) { + jout = getState().eventAccept(jin); + } else if (action.equals(Jingle.Action.SESSIONINFO)) { + jout = getState().eventInfo(jin); + } else if (action.equals(Jingle.Action.SESSIONINITIATE)) { + jout = getState().eventInitiate(jin); + } else if (action.equals(Jingle.Action.SESSIONREDIRECT)) { + jout = getState().eventRedirect(jin); + } else if (action.equals(Jingle.Action.SESSIONTERMINATE)) { + jout = getState().eventTerminate(jin); + } + } else { + jout = errorMalformedStanza(iq); + } + } + } + + if (jout != null) { + // Save the packet id, for recognizing ACKs... + addExpectedId(jout.getPacketID()); + } + } + + return jout; + } + + /** + * Process and respond to an incomming packet. + *

+ * This method is called from the packet listener dispatcher when a new + * packet has arrived. The medthod is responsible for recognizing the packet + * type and, depending on the current state, deliverying it to the right + * event handler and wait for a response. The response will be another + * Jingle packet that will be sent to the other endpoint. + * + * @param iq the packet received + * @return the new Jingle packet to send. + * @throws XMPPException + */ + public synchronized IQ respond(IQ iq) throws XMPPException { + IQ response = null; + + if (isValid()) { + String responseId = null; + IQ sessionResponse = null; + IQ descriptionResponse = null; + IQ transportResponse = null; + + // Send the packet to the right event handler for the session... + try { + sessionResponse = dispatchIncomingPacket(iq, null); + if (sessionResponse != null) { + responseId = sessionResponse.getPacketID(); + } + + // ... and do the same for the Description and Transport + // parts... + if (mediaNeg != null) { + descriptionResponse = mediaNeg.dispatchIncomingPacket(iq, responseId); + } + + if (transNeg != null) { + transportResponse = transNeg.dispatchIncomingPacket(iq, responseId); + } + + // Acknowledge the IQ reception + sendAck(iq); + + // ... and send all these parts in a Jingle response. + response = sendJingleParts(iq, (Jingle) sessionResponse, + (Jingle) descriptionResponse, (Jingle) transportResponse); + + } + catch (JingleException e) { + // Send an error message, if present + JingleError error = e.getError(); + if (error != null) { + sendFormattedError(iq, error); + } + + // Notify the session end and close everything... + triggerSessionClosedOnError(e); + close(); + } + } + + return response; + } + + // Packet formatting and delivery + + /** + * Put together all the parts ina Jingle packet. + * + * @return the new Jingle packet + */ + private Jingle sendJingleParts(IQ iq, Jingle jSes, Jingle jDesc, + Jingle jTrans) { + Jingle response = null; + + if (jSes != null) { + jSes.addDescriptions(jDesc.getDescriptionsList()); + jSes.addTransports(jTrans.getTransportsList()); + + response = sendFormattedJingle(iq, jSes); + } else { + // If we don't have a valid session message, then we must send + // separated messages for transport and jmf... + if (jDesc != null) { + response = sendFormattedJingle(iq, jDesc); + } + + if (jTrans != null) { + response = sendFormattedJingle(iq, jTrans); + } + } + + return response; + } + + /** + * Complete and send an error. Complete all the null fields in an IQ error + * reponse, using the sesssion information we have or some info from the + * incoming packet. + * + * @param iq The Jingle packet we are responing to + * @param error the IQ packet we want to complete and send + */ + protected IQ sendFormattedError(IQ iq, JingleError error) { + IQ perror = null; + if (error != null) { + perror = createIQ(getSid(), iq.getFrom(), iq.getTo(), IQ.Type.ERROR); + + // Fill in the fields with the info from the Jingle packet + perror.setPacketID(iq.getPacketID()); + perror.addExtension(error); + + getConnection().sendPacket(perror); + } + return perror; + } + + /** + * Complete and send a packet. Complete all the null fields in a Jingle + * reponse, using the session information we have or some info from the + * incoming packet. + * + * @param iq The Jingle packet we are responing to + * @param jout the Jingle packet we want to complete and send + */ + public Jingle sendFormattedJingle(IQ iq, Jingle jout) { + if (jout != null) { + if (jout.getInitiator() == null) { + jout.setInitiator(getInitiator()); + } + + if (jout.getResponder() == null) { + jout.setResponder(getResponder()); + } + + if (jout.getSid() == null) { + jout.setSid(getSid()); + } + + String me = getConnection().getUser(); + String other = getResponder().equals(me) ? getInitiator() : getResponder(); + + if (jout.getTo() == null) { + if (iq != null) { + jout.setTo(iq.getFrom()); + } else { + jout.setTo(other); + } + } + + if (jout.getFrom() == null) { + if (iq != null) { + jout.setFrom(iq.getTo()); + } else { + jout.setFrom(me); + } + } + getConnection().sendPacket(jout); + } + return jout; + } + + /** + * Complete and send a packet. Complete all the null fields in a Jingle + * reponse, using the session information we have. + * + * @param jout the Jingle packet we want to complete and send + */ + public Jingle sendFormattedJingle(Jingle jout) { + return sendFormattedJingle(null, jout); + } + + /** + * Send an error indicating that the stanza is malformed. + * + * @param iq + */ + protected IQ errorMalformedStanza(IQ iq) { + // FIXME: implement with the right message... + return createError(iq.getPacketID(), iq.getFrom(), getConnection().getUser(), + 400, "Bad Request"); + } + + /** + * Check if we have an established session and, in that case, send an Accept + * packet. + */ + protected Jingle sendAcceptIfFullyEstablished() { + Jingle result = null; + if (isFullyEstablished()) { + // Ok, send a packet saying that we accept this session + Jingle jout = new Jingle(Jingle.Action.SESSIONACCEPT); + jout.setType(IQ.Type.SET); + + result = sendFormattedJingle(jout); + } + return result; + } + + /** + * Acknowledge a IQ packet. + * + * @param iq The IQ to acknowledge + */ + private IQ sendAck(IQ iq) { + IQ result = null; + + if (iq != null) { + // Don't acknowledge ACKs, errors... + if (iq.getType().equals(IQ.Type.SET)) { + IQ ack = createIQ(iq.getPacketID(), iq.getFrom(), iq.getTo(), + IQ.Type.RESULT); + + getConnection().sendPacket(ack); + result = ack; + } + } + return result; + } + + /** + * Send a content info message. + */ + public synchronized void sendContentInfo(ContentInfo ci) { + if (isValid()) { + sendFormattedJingle(new Jingle(new JingleContentInfo(ci))); + } + } + + /** + * Get the content description the other part has accepted. + * + * @param jin The Jingle packet where they have accepted the session. + * @return The audio PayloadType they have accepted. + * @throws XMPPException + */ + protected PayloadType.Audio getAcceptedAudioPayloadType(Jingle jin) + throws XMPPException { + PayloadType.Audio acceptedPayloadType = null; + ArrayList jda = jin.getDescriptionsList(); + + if (jin.getAction().equals(Jingle.Action.SESSIONACCEPT)) { + + if (jda.size() > 1) { + throw new XMPPException( + "Unsupported feature: the number of accepted content descriptions is greater than 1."); + } else if (jda.size() == 1) { + JingleContentDescription jd = (JingleContentDescription) jda.get(0); + if (jd.getJinglePayloadTypesCount() > 1) { + throw new XMPPException( + "Unsupported feature: the number of accepted payload types is greater than 1."); + } + if (jd.getJinglePayloadTypesCount() == 1) { + JinglePayloadType jpt = (JinglePayloadType) jd + .getJinglePayloadTypesList().get(0); + acceptedPayloadType = (PayloadType.Audio) jpt.getPayloadType(); + } + } + } + return acceptedPayloadType; + } + + /** + * Get the accepted local candidate we have previously offered. + * + * @param jin The jingle packet where they accept the session + * @return The transport candidate they have accepted. + * @throws XMPPException + */ + protected TransportCandidate getAcceptedLocalCandidate(Jingle jin) + throws XMPPException { + ArrayList jta = jin.getTransportsList(); + TransportCandidate acceptedLocalCandidate = null; + + if (jin.getAction().equals(Jingle.Action.SESSIONACCEPT)) { + if (jta.size() > 1) { + throw new XMPPException( + "Unsupported feature: the number of accepted transports is greater than 1."); + } else if (jta.size() == 1) { + org.jivesoftware.smackx.packet.JingleTransport jt = (org.jivesoftware.smackx.packet.JingleTransport) jta.get(0); + + if (jt.getCandidatesCount() > 1) { + throw new XMPPException( + "Unsupported feature: the number of accepted transport candidates is greater than 1."); + } else if (jt.getCandidatesCount() == 1) { + JingleTransportCandidate jtc = (JingleTransportCandidate) jt + .getCandidatesList().get(0); + acceptedLocalCandidate = jtc.getMediaTransport(); + } + } + } + + return acceptedLocalCandidate; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return Jingle.getSessionHash(getSid(), getInitiator()); + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + System.out.println("NULL"); + return false; + } + if (getClass() != obj.getClass()) { + System.out.println("CLASS DIFF"); + return false; + } + + final JingleSession other = (JingleSession) obj; + + if (initiator == null) { + if (other.initiator != null) { + return false; + } + } else if (!initiator.equals(other.initiator)) { + //Todo check behavior + // return false; + } + + if (responder == null) { + if (other.responder != null) { + return false; + } + } else if (!responder.equals(other.responder)) { + return false; + } + + if (sid == null) { + if (other.sid != null) { + return false; + } + } else if (!sid.equals(other.sid)) { + return false; + } + + return true; + } + + // Instances management + + /** + * Clean a session from the list. + * + * @param connection The connection to clean up + */ + private void unregisterInstanceFor(XMPPConnection connection) { + synchronized (sessions) { + sessions.remove(connection); + } + } + + /** + * Register this instance. + */ + private void registerInstance() { + synchronized (sessions) { + sessions.put(getConnection(), this); + } + } + + /** + * Returns the JingleSession related to a particular connection. + * + * @param con A XMPP connection + * @return a Jingle session + */ + public static JingleSession getInstanceFor(XMPPConnection con) { + if (con == null) { + throw new IllegalArgumentException("Connection cannot be null"); + } + + JingleSession result = null; + synchronized (sessions) { + if (sessions.containsKey(con)) { + result = (JingleSession) sessions.get(con); + } + } + + return result; + } + + + /** + * Configure a session, setting some action listeners... + * + * @param connection The connection to set up + */ + private void installConnectionListeners(final XMPPConnection connection) { + if (connection != null) { + connection.addConnectionListener(new ConnectionListener() { + public void connectionClosed() { + unregisterInstanceFor(connection); + } + + public void connectionClosedOnError(java.lang.Exception e) { + unregisterInstanceFor(connection); + } + + public void reconnectingIn(int i) { + } + + public void reconnectionSuccessful() { + } + + public void reconnectionFailed(Exception exception) { + } + }); + } + } + + /** + * Remove the packet listener used for processing packet. + */ + protected void removePacketListener() { + if (packetListener != null) { + getConnection().removePacketListener(packetListener); + System.out.println("REMOVE PACKET LISTENER"); + } + } + + /** + * Install the packet listener. The listener is responsible for responding + * to any packet that we receive... + */ + protected void updatePacketListener() { + removePacketListener(); + + System.out.println("UpdatePacketListener"); + + packetListener = new PacketListener() { + public void processPacket(Packet packet) { + try { + respond((IQ) packet); + } + catch (XMPPException e) { + e.printStackTrace(); + } + } + }; + + packetFilter = new PacketFilter() { + public boolean accept(Packet packet) { + + final int cc = ccc++; + System.out.println("filter:"+cc); + + if (packet instanceof IQ) { + IQ iq = (IQ) packet; + + String me = getConnection().getUser(); + + if (!iq.getTo().equals(me)) { + return false; + } + + String other = getResponder().equals(me) ? getInitiator() + : getResponder(); + + if (iq.getFrom() == null || !iq.getFrom().equals(other == null ? "" : other)) { + return false; + } + + if (iq instanceof Jingle) { + Jingle jin = (Jingle) iq; + + //System.out.println("Jingle: " + iq.toXML()); + + String sid = jin.getSid(); + if (!sid.equals(getSid())) { + System.out.println("Ignored Jingle(SID) " + sid + "|" + getSid() + " :" + iq.toXML()); + return false; + } + String ini = jin.getInitiator(); + if (!ini.equals(getInitiator())) { + System.out.println("Ignored Jingle(INI): " + iq.toXML()); + return false; + } + } else { + // We accept some non-Jingle IQ packets: ERRORs and ACKs + if (iq.getType().equals(IQ.Type.SET)) { + System.out.println("Ignored Jingle(TYPE): " + iq.toXML()); + return false; + } else if (iq.getType().equals(IQ.Type.GET)) { + System.out.println("Ignored Jingle(TYPE): " + iq.toXML()); + return false; + } + } + return true; + } + return false; + } + }; + + getConnection().addPacketListener(packetListener, packetFilter); + System.out.println("updatePacketListener"); + } + + // Listeners + + /** + * Add a listener for jmf negotiation events + * + * @param li The listener + */ + public void addMediaListener(JingleMediaListener li) { + if (getMediaNeg() != null) { + getMediaNeg().addListener(li); + } + } + + /** + * Remove a listener for jmf negotiation events + * + * @param li The listener + */ + public void removeMediaListener(JingleMediaListener li) { + if (getMediaNeg() != null) { + getMediaNeg().removeListener(li); + } + } + + /** + * Add a listener for transport negotiation events + * + * @param li The listener + */ + public void addTransportListener(JingleTransportListener li) { + if (getTransportNeg() != null) { + getTransportNeg().addListener(li); + } + } + + /** + * Remove a listener for transport negotiation events + * + * @param li The listener + */ + public void removeTransportListener(JingleTransportListener li) { + if (getTransportNeg() != null) { + getTransportNeg().removeListener(li); + } + } + + // Triggers + + /** + * Trigger a session closed event. + */ + protected void triggerSessionClosed(String reason) { + ArrayList listeners = getListenersList(); + Iterator iter = listeners.iterator(); + while (iter.hasNext()) { + JingleListener li = (JingleListener) iter.next(); + if (li instanceof JingleSessionListener) { + JingleSessionListener sli = (JingleSessionListener) li; + sli.sessionClosed(reason, this); + } + } + if (jingleMediaSession != null) { + jingleMediaSession.stopTrasmit(); + jingleMediaSession.stopReceive(); + } + } + + /** + * Trigger a session closed event due to an error. + */ + protected void triggerSessionClosedOnError(XMPPException exc) { + ArrayList listeners = getListenersList(); + Iterator iter = listeners.iterator(); + while (iter.hasNext()) { + JingleListener li = (JingleListener) iter.next(); + if (li instanceof JingleSessionListener) { + JingleSessionListener sli = (JingleSessionListener) li; + sli.sessionClosedOnError(exc,this); + } + } + if (jingleMediaSession != null) { + jingleMediaSession.stopTrasmit(); + jingleMediaSession.stopReceive(); + } + } + + /** + * Trigger a session established event. + */ + protected void triggerSessionEstablished(PayloadType pt, + TransportCandidate rc, TransportCandidate lc) { + ArrayList listeners = getListenersList(); + Iterator iter = listeners.iterator(); + while (iter.hasNext()) { + JingleListener li = (JingleListener) iter.next(); + if (li instanceof JingleSessionListener) { + JingleSessionListener sli = (JingleSessionListener) li; + sli.sessionEstablished(pt, rc, lc,this); + } + } + if (jingleMediaManager != null) { + jingleMediaSession = jingleMediaManager.createMediaSession(pt, rc, lc); + if (jingleMediaSession != null) { + jingleMediaSession.startTrasmit(); + jingleMediaSession.startReceive(); + } + } + + } + + /** + * Trigger a session redirect event. + */ + protected void triggerSessionRedirect(String arg) { + ArrayList listeners = getListenersList(); + Iterator iter = listeners.iterator(); + while (iter.hasNext()) { + JingleListener li = (JingleListener) iter.next(); + if (li instanceof JingleSessionListener) { + JingleSessionListener sli = (JingleSessionListener) li; + sli.sessionRedirected(arg,this); + } + } + } + + /** + * Trigger a session redirect event. + */ + protected void triggerSessionDeclined(String reason) { + ArrayList listeners = getListenersList(); + Iterator iter = listeners.iterator(); + while (iter.hasNext()) { + JingleListener li = (JingleListener) iter.next(); + if (li instanceof JingleSessionListener) { + JingleSessionListener sli = (JingleSessionListener) li; + sli.sessionDeclined(reason,this); + } + } + } + + /** + * Start the negotiation. + * + * @throws JingleException + * @throws XMPPException + */ + public abstract void start(JingleSessionRequest jin) throws XMPPException; + + /** + * Terminate the session. + * + * @throws XMPPException + */ + public void terminate() throws XMPPException { + System.out.println("State: " + this.getState()); + if (!invalidState()) { + Jingle result = null; + Jingle jout = new Jingle(Jingle.Action.SESSIONTERMINATE); + jout.setType(IQ.Type.SET); + sendFormattedJingle(jout); + triggerSessionClosed("Closed Locally"); + close(); + } else { + throw new IllegalStateException("Session Not Started"); + } + } + + /** + * Terminate negotiations. + */ + public void close() { + destroyMediaNeg(); + destroyTransportNeg(); + removePacketListener(); + System.out.println("Negociation Closed"); + super.close(); + } + + // Packet and error creation + + /** + * A convience method to create an IQ packet. + * + * @param ID The packet ID of the + * @param to To whom the packet is addressed. + * @param from From whom the packet is sent. + * @param type The iq type of the packet. + * @return The created IQ packet. + */ + public static IQ createIQ(String ID, String to, String from, + IQ.Type type) { + IQ iqPacket = new IQ() { + public String getChildElementXML() { + return null; + } + }; + + iqPacket.setPacketID(ID); + iqPacket.setTo(to); + iqPacket.setFrom(from); + iqPacket.setType(type); + + return iqPacket; + } + + /** + * A convience method to create an error packet. + * + * @param ID The packet ID of the + * @param to To whom the packet is addressed. + * @param from From whom the packet is sent. + * @param errCode The error code. + * @param errStr The error string. + * @return The created IQ packet. + */ + public static IQ createError(String ID, String to, String from, + int errCode, String errStr) { + + IQ iqError = createIQ(ID, to, from, IQ.Type.ERROR); + XMPPError error = new XMPPError(new XMPPError.Condition(errStr)); + iqError.setError(error); + + System.out.println(iqError.toXML()); + + return iqError; + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleSessionRequest.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleSessionRequest.java new file mode 100644 index 000000000..e1c3c6908 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleSessionRequest.java @@ -0,0 +1,106 @@ +package org.jivesoftware.smackx.jingle; + +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smackx.jingle.media.PayloadType; +import org.jivesoftware.smackx.packet.Jingle; + +import java.util.List; + +/** + * A Jingle session request. + * + * This class is a facade of a received Jingle request. The user can have direct + * access to the Jingle packet (JingleSessionRequest.getJingle() ) of + * the request or can use the convencience methods provided by this class. + * + * @author Alvaro Saurin + */ +public class JingleSessionRequest { + + private final Jingle jingle; // The Jingle packet + + private final JingleManager manager; // The manager associated to this + + // request + + /** + * A recieve request is constructed from the Jingle Initiation request + * received from the initator. + * + * @param manager The manager handling this request + * @param jingle The jingle IQ recieved from the initiator. + */ + public JingleSessionRequest(JingleManager manager, Jingle jingle) { + this.manager = manager; + this.jingle = jingle; + } + + /** + * Returns the fully-qualified jabber ID of the user that requested this + * session. + * + * @return Returns the fully-qualified jabber ID of the user that requested + * this session. + */ + public String getFrom() { + return jingle.getFrom(); + } + + /** + * Returns the session ID that uniquely identifies this session. + * + * @return Returns the session ID that uniquely identifies this session + */ + public String getSessionID() { + return jingle.getSid(); + } + + /** + * Returns the Jingle packet that was sent by the requestor which contains + * the parameters of the session. + */ + public Jingle getJingle() { + return jingle; + } + + /** + * Accepts this request and creates the incoming Jingle session. + * + * @param pts list of supported Payload Types + * @return Returns the IncomingJingleSession on which the + * negotiation can be carried out. + */ + public synchronized IncomingJingleSession accept(List pts) throws XMPPException { + IncomingJingleSession session = null; + synchronized (manager) { + session = manager.createIncomingJingleSession(this, + pts); + session.setInitialSessionRequest(this); + } + return session; + } + + /** + * Accepts this request and creates the incoming Jingle session. + * + * @return Returns the IncomingJingleSession on which the + * negotiation can be carried out. + */ + public synchronized IncomingJingleSession accept() throws XMPPException { + IncomingJingleSession session = null; + synchronized (manager) { + session = manager.createIncomingJingleSession(this); + session.setInitialSessionRequest(this); + } + return session; + } + + /** + * Rejects the session request. + */ + public synchronized void reject() { + synchronized (manager) { + manager.rejectIncomingJingleSession(this); + } + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/OutgoingJingleSession.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/OutgoingJingleSession.java new file mode 100644 index 000000000..44061aed1 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/OutgoingJingleSession.java @@ -0,0 +1,440 @@ +/** + * $RCSfile$ + * $Revision$ + * $Date$ + * + * Copyright (C) 2002-2006 Jive Software. All rights reserved. + * ==================================================================== + * The Jive Software License (based on Apache Software License, Version 1.1) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by + * Jive Software (http://www.jivesoftware.com)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Smack" and "Jive Software" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please + * contact webmaster@jivesoftware.com. + * + * 5. Products derived from this software may not be called "Smack", + * nor may "Smack" appear in their name, without prior written + * permission of Jive Software. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL JIVE SOFTWARE OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + */ + +package org.jivesoftware.smackx.jingle; + +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.packet.IQ; +import org.jivesoftware.smackx.jingle.listeners.JingleMediaListener; +import org.jivesoftware.smackx.jingle.listeners.JingleTransportListener; +import org.jivesoftware.smackx.jingle.media.JingleMediaManager; +import org.jivesoftware.smackx.jingle.media.MediaNegotiator; +import org.jivesoftware.smackx.jingle.media.PayloadType; +import org.jivesoftware.smackx.jingle.nat.TransportCandidate; +import org.jivesoftware.smackx.jingle.nat.TransportNegotiator; +import org.jivesoftware.smackx.jingle.nat.TransportResolver; +import org.jivesoftware.smackx.packet.Jingle; +import org.jivesoftware.smackx.packet.JingleContentDescription; +import org.jivesoftware.smackx.packet.JingleContentDescription.JinglePayloadType; +import org.jivesoftware.smackx.packet.JingleError; + +import java.util.List; + +/** + * An outgoing Jingle session implementation. + * This class has especific bahavior to Request and establish a new Jingle Session. + * + * This class is not directly used by users. Instead, users should refer to the + * JingleManager class, that will create the appropiate instance... + * + * @author Alvaro Saurin + */ +public class OutgoingJingleSession extends JingleSession { + + // states + + private final Inviting inviting; + + private final Pending pending; + + private final Active active; + + /** + * Constructor for a Jingle outgoing session. + * + * @param conn the XMPP connection + * @param responder the other endpoint + * @param payloadTypes A list of payload types, in order of preference. + * @param resolver The transport resolver. + */ + protected OutgoingJingleSession(XMPPConnection conn, String responder, + List payloadTypes, TransportResolver resolver) { + + super(conn, conn.getUser(), responder); + + setSid(generateSessionId()); + + // Initialize the states. + inviting = new Inviting(this); + pending = new Pending(this); + active = new Active(this); + + // Create description and transport negotiatiors... + setMediaNeg(new MediaNegotiator(this, payloadTypes)); + if (resolver.getType().equals(TransportResolver.Type.rawupd)) { + setTransportNeg(new TransportNegotiator.RawUdp(this, resolver)); + } + if (resolver.getType().equals(TransportResolver.Type.ice)) { + setTransportNeg(new TransportNegotiator.Ice(this, resolver)); + } + } + + /** + * Constructor for a Jingle outgoing session with a defined Media Manager + * + * @param conn the XMPP connection + * @param responder the other endpoint + * @param payloadTypes A list of payload types, in order of preference. + * @param resolver The transport resolver. + * @param jingleMediaManager The Media Manager for this Session + */ + protected OutgoingJingleSession(XMPPConnection conn, String responder, + List payloadTypes, TransportResolver resolver, JingleMediaManager jingleMediaManager) { + this(conn, responder, payloadTypes, resolver); + this.jingleMediaManager = jingleMediaManager; + } + + /** + * Initiate the negotiation with an invitation. This method must be invoked + * for starting all negotiations. It is the initial starting point and, + * afterwards, any other packet processing is done with the packet listener + * callback... + * + * @throws IllegalStateException + */ + public void start(JingleSessionRequest req) throws IllegalStateException { + if (invalidState()) { + setState(inviting); + + // Use the standard behavior, using a null Jingle packet + try { + updatePacketListener(); + respond((Jingle) null); + } catch (XMPPException e) { + e.printStackTrace(); + close(); + } + } else { + throw new IllegalStateException("Starting session without null state."); + } + } + + /** + * Initiate the negotiation with an invitation. This method must be invoked + * for starting all negotiations. It is the initial starting point and, + * afterwards, any other packet processing is done with the packet listener + * callback... + * + * @throws IllegalStateException + */ + public void start() throws IllegalStateException { + start(null); + } + + // States + + /** + * Current state when we want to invite the other endpoint. + */ + public class Inviting extends JingleNegotiator.State { + + public Inviting(JingleNegotiator neg) { + super(neg); + } + + /** + * Create an invitation packet. + */ + public Jingle eventInvite() { + // Create an invitation packet, saving the Packet ID, for any ACK + return new Jingle(Jingle.Action.SESSIONINITIATE); + } + + /** + * The receiver has partially accepted our invitation. We go to the + * pending state while the content and transport negotiators work... + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventAck(org.jivesoftware.smack.packet.IQ) + */ + public Jingle eventAck(IQ iq) { + setState(pending); + return null; + } + + /** + * The other endpoint has declined the invitation with an error. + * + * @throws XMPPException + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventError(org.jivesoftware.smack.packet.IQ) + */ + public void eventError(IQ iq) throws XMPPException { + triggerSessionDeclined(null); + super.eventError(iq); + } + + /** + * The other endpoint wants to redirect this connection. + */ + public Jingle eventRedirect(Jingle jin) { + String redirArg = null; + + // TODO: parse the redirection parameters... + + triggerSessionRedirect(redirArg); + return null; + } + } + + /** + * "Pending" state: we are waiting for the transport and content + * negotiators. + *

+ * Note: the transition from/to this state is done with listeners... + */ + public class Pending extends JingleNegotiator.State { + JingleMediaListener jingleMediaListener; + + JingleTransportListener jingleTransportListener; + + public Pending(JingleNegotiator neg) { + super(neg); + + // Create the listeners that will send a "session-accept" when + // the sub-negotiators are done. + jingleMediaListener = new JingleMediaListener() { + public void mediaClosed(PayloadType cand) { + } + + public void mediaEstablished(PayloadType pt) { + checkFullyEstablished(); + } + }; + + jingleTransportListener = new JingleTransportListener() { + public void transportEstablished(TransportCandidate local, + TransportCandidate remote) { + checkFullyEstablished(); + } + + public void transportClosed(TransportCandidate cand) { + } + + public void transportClosedOnError(XMPPException e) { + } + }; + } + + /** + * Enter in the pending state: install the listeners. + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventEnter() + */ + public void eventEnter() { + // Add the listeners to the sub-negotiators... + addMediaListener(jingleMediaListener); + addTransportListener(jingleTransportListener); + } + + /** + * Exit of the state: remove the listeners. + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventExit() + */ + public void eventExit() { + removeMediaListener(jingleMediaListener); + removeTransportListener(jingleTransportListener); + } + + /** + * Check if the session has been fully accepted by all the + * sub-negotiators and, in that case, send an "accept" message... + */ + private void checkFullyEstablished() { + + if (isFullyEstablished()) { + + PayloadType.Audio bestCommonAudioPt = getMediaNeg() + .getBestCommonAudioPt(); + TransportCandidate bestRemoteCandidate = getTransportNeg() + .getBestRemoteCandidate(); + + // Ok, send a packet saying that we accept this session + // with the audio payload type and the transport + // candidate + Jingle jout = new Jingle(Jingle.Action.SESSIONACCEPT); + jout.addDescription(new JingleContentDescription.Audio( + new JinglePayloadType(bestCommonAudioPt))); + jout.addTransport(getTransportNeg().getJingleTransport( + bestRemoteCandidate)); + + // Send the "accept" and wait for the ACK + addExpectedId(jout.getPacketID()); + sendFormattedJingle(jout); + } + } + + /** + * The other endpoint has finally accepted our invitation. + * + * @throws XMPPException + */ + public Jingle eventAccept(Jingle jin) throws XMPPException { + + PayloadType acceptedPayloadType = null; + TransportCandidate acceptedLocalCandidate = null; + + // We process the "accepted" if we have finished the + // sub-negotiators. Maybe this is not needed (ie, the other endpoint + // can take the first valid transport candidate), but otherwise we + // must cancel the negotiators... + // + if (isFullyEstablished()) { + acceptedPayloadType = getAcceptedAudioPayloadType(jin); + acceptedLocalCandidate = getAcceptedLocalCandidate(jin); + + if (acceptedPayloadType != null && acceptedLocalCandidate != null) { + if (acceptedPayloadType.equals(getMediaNeg().getBestCommonAudioPt()) + && acceptedLocalCandidate.equals(getTransportNeg() + .getAcceptedLocalCandidate())) { + setState(active); + } + } else { + throw new JingleException(JingleError.NEGOTIATION_ERROR); + } + } + + return null; + } + + /** + * We have received the Ack of our "accept" + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventAck(org.jivesoftware.smack.packet.IQ) + */ + public Jingle eventAck(IQ iq) { + setState(active); + return null; + } + + /** + * The other endpoint wants to redirect this connection. + */ + public Jingle eventRedirect(Jingle jin) { + String redirArg = null; + + // TODO: parse the redirection parameters... + + triggerSessionRedirect(redirArg); + return null; + } + + /** + * The other endpoint has rejected our invitation. + * + * @throws XMPPException + */ + public Jingle eventTerminate(Jingle jin) throws XMPPException { + triggerSessionDeclined(null); + return super.eventTerminate(jin); + } + + /** + * An error has occurred. + * + * @throws XMPPException + */ + public void eventError(IQ iq) throws XMPPException { + triggerSessionClosedOnError(new XMPPException(iq.getError().getMessage())); + super.eventError(iq); + } + } + + /** + * State when we have an established session. + */ + public class Active extends JingleNegotiator.State { + public Active(JingleNegotiator neg) { + super(neg); + } + + /** + * We have a established session: notify the listeners + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventEnter() + */ + public void eventEnter() { + PayloadType.Audio bestCommonAudioPt = getMediaNeg().getBestCommonAudioPt(); + TransportCandidate bestRemoteCandidate = getTransportNeg() + .getBestRemoteCandidate(); + TransportCandidate acceptedLocalCandidate = getTransportNeg() + .getAcceptedLocalCandidate(); + + // Trigger the session established flag + System.out.println("eventEntered"); + triggerSessionEstablished(bestCommonAudioPt, bestRemoteCandidate, + acceptedLocalCandidate); + + super.eventEnter(); + } + + /** + * Terminate the connection. + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventTerminate(org.jivesoftware.smackx.packet.Jingle) + */ + public Jingle eventTerminate(Jingle jin) throws XMPPException { + triggerSessionClosed("Closed Remotely"); + return super.eventTerminate(jin); + } + + /** + * An error has occurred. + * + * @throws XMPPException + */ + public void eventError(IQ iq) throws XMPPException { + triggerSessionClosedOnError(new XMPPException(iq.getError().getMessage())); + super.eventError(iq); + } + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/CreatedJingleSessionListener.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/CreatedJingleSessionListener.java new file mode 100644 index 000000000..961078527 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/CreatedJingleSessionListener.java @@ -0,0 +1,32 @@ +package org.jivesoftware.smackx.jingle.listeners; + +import org.jivesoftware.smackx.jingle.JingleSession; + +/** + * $RCSfile$ + * $Revision: $ + * $Date: 17/11/2006 + * + * Copyright 2003-2006 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Inteface used to dispatch a event when a Jingle session is created. + */ +public interface CreatedJingleSessionListener { + + public void sessionCreated(JingleSession jingleSession); + +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleListener.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleListener.java new file mode 100644 index 000000000..275fecfe4 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleListener.java @@ -0,0 +1,40 @@ +/** + * $RCSfile$ + * $Revision: $ + * $Date: $11-07-2006 + * + * Copyright 2003-2006 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jivesoftware.smackx.jingle.listeners; + +/** + * Jingle listeners interface. + * + * This is the list of events that can be observed from a JingleSession and some + * sub negotiators. This listeners can be added to different elements of the + * Jingle model. + * + * For example, a JingleManager can notify any SessionRequestListenerListener + * listener when a new session request is received. In this case, the + * sessionRequested() of the listener will be executed, and the listener + * will be able to accept() or decline() the invitation. + * + * @author Alvaro Saurin + */ +public interface JingleListener { + + +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleMediaInfoListener.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleMediaInfoListener.java new file mode 100644 index 000000000..393011584 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleMediaInfoListener.java @@ -0,0 +1,50 @@ +/** + * $RCSfile$ + * $Revision: $ + * $Date: $11-07-2006 + * + * Copyright 2003-2006 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.jingle.listeners; + +/** + * Interface for listening to jmf info events. + */ +public interface JingleMediaInfoListener extends JingleListener { + /** + * The other end is busy. + */ + public void mediaInfoBusy(); + + /** + * We are on hold. + */ + public void mediaInfoHold(); + + /** + * The jmf is muted. + */ + public void mediaInfoMute(); + + /** + * We are queued. + */ + public void mediaInfoQueued(); + + /** + * We are ringing. + */ + public void mediaInfoRinging(); +} \ No newline at end of file diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleMediaListener.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleMediaListener.java new file mode 100644 index 000000000..39efb35e0 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleMediaListener.java @@ -0,0 +1,42 @@ +/** + * $RCSfile$ + * $Revision: $ + * $Date: $11-07-2006 + * + * Copyright 2003-2006 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jivesoftware.smackx.jingle.listeners; + +import org.jivesoftware.smackx.jingle.media.PayloadType; + +/** + * Interface for listening to jmf events. + */ +public interface JingleMediaListener extends JingleListener { + /** + * Notification that the jmf has been negotiated and established. + * + * @param pt The payload type agreed. + */ + public void mediaEstablished(PayloadType pt); + + /** + * Notification that a payload type must be cancelled + * + * @param cand The payload type that must be closed + */ + public void mediaClosed(PayloadType cand); +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleSessionListener.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleSessionListener.java new file mode 100644 index 000000000..f4aece244 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleSessionListener.java @@ -0,0 +1,75 @@ +/** + * $RCSfile$ + * $Revision: $ + * $Date: $11-07-2006 + * + * Copyright 2003-2006 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.jingle.listeners; + +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smackx.jingle.JingleSession; +import org.jivesoftware.smackx.jingle.media.PayloadType; +import org.jivesoftware.smackx.jingle.nat.TransportCandidate; + +/** + * Interface for listening for session events. + */ +public interface JingleSessionListener extends JingleListener { + /** + * Notification that the session has been established. Arguments specify + * the payload type and transport to use. + * + * @param pt the Payload tyep to use + * @param remoteCandidate the remote candidate to use for connecting to the remote + * service. + * @param localCandidate the local candidate where we must listen for connections + * @param jingleSession Session that called the method + */ + public void sessionEstablished(PayloadType pt, TransportCandidate remoteCandidate, + TransportCandidate localCandidate, JingleSession jingleSession); + + /** + * Notification that the session was declined. + * + * @param reason the reason (if any). + * @param jingleSession Session that called the method + */ + public void sessionDeclined(String reason, JingleSession jingleSession); + + /** + * Notification that the session was redirected. + * + * @param redirection + * @param jingleSession session that called the method + */ + public void sessionRedirected(String redirection, JingleSession jingleSession); + + /** + * Notification that the session was closed normally. + * + * @param reason the reason (if any). + * @param jingleSession Session that called the method + */ + public void sessionClosed(String reason, JingleSession jingleSession); + + /** + * Notification that the session was closed due to an exception. + * + * @param e the exception. + * @param jingleSession session that called the method + */ + public void sessionClosedOnError(XMPPException e, JingleSession jingleSession); +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleSessionRequestListener.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleSessionRequestListener.java new file mode 100644 index 000000000..6fb64a470 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleSessionRequestListener.java @@ -0,0 +1,36 @@ +/** + * $RCSfile$ + * $Revision: $ + * $Date: $11-07-2006 + * + * Copyright 2003-2006 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.jingle.listeners; + +import org.jivesoftware.smackx.jingle.JingleSessionRequest; + +/** + * Interface to listener Jingle session requests. + * + * @author Alvaro Saurin + */ +public interface JingleSessionRequestListener extends JingleListener { + /** + * A request to start a session has been recieved from another user. + * + * @param request The request from the other user. + */ + public void sessionRequested(JingleSessionRequest request); +} \ No newline at end of file diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleTransportListener.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleTransportListener.java new file mode 100644 index 000000000..15239bb57 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/listeners/JingleTransportListener.java @@ -0,0 +1,56 @@ +/** + * $RCSfile$ + * $Revision: $ + * $Date: $11-07-2006 + * + * Copyright 2003-2006 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.jingle.listeners; + +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smackx.jingle.nat.TransportCandidate; + +/** + * Interface for listening to transport events. + */ +public interface JingleTransportListener extends JingleListener { + + /** + * Notification that the transport has been established. + * + * @param local The transport candidate that has been used for listening + * in the local machine + * @param remote The transport candidate that has been used for + * transmitting to the remote machine + */ + public void transportEstablished(TransportCandidate local, + TransportCandidate remote); + + /** + * Notification that a transport must be cancelled. + * + * @param cand The transport candidate that must be cancelled. A value + * of "null" means all the transports for this session. + */ + public void transportClosed(TransportCandidate cand); + + /** + * Notification that the transport was closed due to an exception. + * + * @param e the exception. + */ + public void transportClosedOnError(XMPPException e); +} + diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/media/ContentInfo.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/media/ContentInfo.java new file mode 100644 index 000000000..3ecbc315f --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/media/ContentInfo.java @@ -0,0 +1,77 @@ +/** + * $RCSfile$ + * $Revision: $ + * $Date: $11-07-2006 + * + * Copyright 2003-2006 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.jingle.media; + +/** + * Content info. Content info messages are complementary messages that can be + * transmitted for informing of events like "busy", "ringtone", etc. + * + * @author Alvaro Saurin + */ +public abstract class ContentInfo { + + /** + * Audio content info messages. + * + * @author Alvaro Saurin + */ + public static class Audio extends ContentInfo { + + public static final ContentInfo.Audio BUSY = new ContentInfo.Audio("busy"); + + public static final ContentInfo.Audio HOLD = new ContentInfo.Audio("hold"); + + public static final ContentInfo.Audio MUTE = new ContentInfo.Audio("mute"); + + public static final ContentInfo.Audio QUEUED = new ContentInfo.Audio("queued"); + + public static final ContentInfo.Audio RINGING = new ContentInfo.Audio("ringing"); + + private String value; + + public Audio(String value) { + this.value = value; + } + + public String toString() { + return value; + } + + /** + * Returns the MediaInfo constant associated with the String value. + */ + public static ContentInfo fromString(String value) { + value = value.toLowerCase(); + if (value.equals("busy")) { + return BUSY; + } else if (value.equals("hold")) { + return HOLD; + } else if (value.equals("mute")) { + return MUTE; + } else if (value.equals("queued")) { + return QUEUED; + } else if (value.equals("ringing")) { + return RINGING; + } else { + return null; + } + } + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/media/JingleMediaManager.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/media/JingleMediaManager.java new file mode 100644 index 000000000..59ac842f6 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/media/JingleMediaManager.java @@ -0,0 +1,85 @@ +/** + * $RCSfile$ + * $Revision: $ + * $Date: $11-07-2006 + * + * Copyright 2003-2006 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jivesoftware.smackx.jingle.media; + +import org.jivesoftware.smackx.jingle.nat.TransportCandidate; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class provides necessary Jingle Session jmf methods and behavior. + * + * The goal of this class is to provide a flexible way to make JingleManager control jmf streaming APIs without implement them. + * For instance you can implement a file transfer using java sockets or a VOIP Media Manager using JMF. + * You can implement many JingleMediaManager according to you necessity. + * + * @author Thiago Camargo + */ +public abstract class JingleMediaManager { + + private List payloads = new ArrayList(); + + /** + * Return all supported Payloads for this Manager + * + * @return The Payload List + */ + public List getPayloads() { + return payloads; + } + + /** + * Adds a supported Payload type to Manager + * + * @param payloadType + */ + public void addPayloadType(PayloadType payloadType) { + payloads.add(payloadType); + } + + /** + * Removes a supported Payload type from Manager + * + * @param payloadType + */ + public void removePayloadType(PayloadType payloadType) { + payloads.remove(payloadType); + } + + /** + * Get the preferred Payload Type + */ + public PayloadType getPreferredPayloadType() { + //TODO a better way to choose the preferred Payload + return payloads.size() > 0 ? payloads.get(0) : null; + } + + /** + * Create a Media Session Implementation + * + * @param payloadType + * @param remote + * @param local + * @return + */ + public abstract JingleMediaSession createMediaSession(PayloadType payloadType, final TransportCandidate remote, final TransportCandidate local); +} \ No newline at end of file diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/media/JingleMediaSession.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/media/JingleMediaSession.java new file mode 100644 index 000000000..0af97853f --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/media/JingleMediaSession.java @@ -0,0 +1,119 @@ +/** + * $RCSfile$ + * $Revision: $ + * $Date: $11-07-2006 + * + * Copyright 2003-2006 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.jingle.media; + +import org.jivesoftware.smackx.jingle.nat.TransportCandidate; + +/** + * Public Abstract Class provides a clear interface between Media Session and Jingle API. + * + * When a Jingle Session is fully stablished, we will have a Payload Type and two transport candidates defined for it. + * Smack Jingle API donīt implement Media Transmit and Receive methods. + * But provides an interface to let the user implements it using another API. For instance: JMF. + * + * The Class that implements this one, must have the support to transmit and receive the jmf. + * This interface let the user choose his own jmf API. + * + * @author Thiago Camargo + */ +public abstract class JingleMediaSession { + + // Payload Type of the Session + private PayloadType payloadType; + // Local Transport details + private TransportCandidate local; + // Remote Transport details + private TransportCandidate remote; + + /** + * Creates a new JingleMediaSession Instance to handle Media methods. + * + * @param payloadType Payload Type of the transmittion + * @param remote Remote accepted Transport Candidate + * @param local Local accepted Transport Candidate + */ + public JingleMediaSession(PayloadType payloadType, TransportCandidate remote, + TransportCandidate local) { + this.local = local; + this.remote = remote; + this.payloadType = payloadType; + initialize(); + } + + /** + * Returns the PayloadType of the Media Session + * + * @return + */ + public PayloadType getPayloadType() { + return payloadType; + } + + /** + * Returns the Media Session local Candidate + * + * @return + */ + public TransportCandidate getLocal() { + return local; + } + + /** + * Returns the Media Session remote Candidate + * + * @return + */ + public TransportCandidate getRemote() { + return remote; + } + + /** + * Initialize the RTP Channel preparing to transmit and receive. + */ + public abstract void initialize(); + + /** + * Starts a RTP / UDP / TCP Transmission to the remote Candidate + */ + public abstract void startTrasmit(); + + /** + * Starts a RTP / UDP / TCP Receiver from the remote Candidate to local Candidate + */ + public abstract void startReceive(); + + /** + * Set transmit activity. If the active is true, the instance should trasmit. + * If it is set to false, the instance should pause transmit. + * @param active + */ + public abstract void setTrasmit(boolean active); + + /** + * Stops a RTP / UDP / TCP Transmission to the remote Candidate + */ + public abstract void stopTrasmit(); + + /** + * Stops a RTP / UDP / TCP Receiver from the remote Candidate to local Candidate + */ + public abstract void stopReceive(); + +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/media/MediaNegotiator.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/media/MediaNegotiator.java new file mode 100644 index 000000000..8cd234a5e --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/media/MediaNegotiator.java @@ -0,0 +1,555 @@ +package org.jivesoftware.smackx.jingle.media; + +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.packet.IQ; +import org.jivesoftware.smackx.jingle.JingleNegotiator; +import org.jivesoftware.smackx.jingle.JingleSession; +import org.jivesoftware.smackx.jingle.listeners.JingleListener; +import org.jivesoftware.smackx.jingle.listeners.JingleMediaListener; +import org.jivesoftware.smackx.packet.Jingle; +import org.jivesoftware.smackx.packet.JingleContentDescription; +import org.jivesoftware.smackx.packet.JingleContentDescription.JinglePayloadType; +import org.jivesoftware.smackx.packet.JingleError; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * Manager for jmf descriptor negotiation. + * + * + * This class is responsible for managing the descriptor negotiation process, + * handling all the xmpp packets interchange and the stage control. + * + * @author Alvaro Saurin + */ +public class MediaNegotiator extends JingleNegotiator { + + private final JingleSession session; // The session this negotiation + + // Local and remote payload types... + + private final List localAudioPts = new ArrayList(); + + private final List remoteAudioPts = new ArrayList(); + + private PayloadType.Audio bestCommonAudioPt; + + // states + + private final Inviting inviting; + + private final Accepting accepting; + + private final Pending pending; + + private final Active active; + + /** + * Default constructor. The constructor establishes some basic parameters, + * but it does not start the negotiation. For starting the negotiation, call + * startNegotiation. + * + * @param js The jingle session. + */ + public MediaNegotiator(JingleSession js, List pts) { + super(js.getConnection()); + + session = js; + + bestCommonAudioPt = null; + + if (pts != null) { + if (pts.size() > 0) { + localAudioPts.addAll(pts); + } + } + + // Create the states... + inviting = new Inviting(this); + accepting = new Accepting(this); + pending = new Pending(this); + active = new Active(this); + } + + /** + * Dispatch an incomming packet. The medthod is responsible for recognizing + * the packet type and, depending on the current state, deliverying the + * packet to the right event handler and wait for a response. + * + * @param iq the packet received + * @return the new Jingle packet to send. + * @throws XMPPException + */ + public IQ dispatchIncomingPacket(IQ iq, String id) throws XMPPException { + IQ jout = null; + + if (invalidState()) { + if (iq == null) { + // With a null packet, we are just inviting the other end... + setState(inviting); + jout = getState().eventInvite(); + } else { + if (iq instanceof Jingle) { + // If there is no specific jmf action associated, then we + // are being invited to a new session... + setState(accepting); + jout = getState().eventInitiate((Jingle) iq); + } else { + throw new IllegalStateException( + "Invitation IQ received is not a Jingle packet in Media negotiator."); + } + } + } else { + if (iq == null) { + return null; + } else { + if (iq.getType().equals(IQ.Type.ERROR)) { + // Process errors + getState().eventError(iq); + } else if (iq.getType().equals(IQ.Type.RESULT)) { + // Process ACKs + if (isExpectedId(iq.getPacketID())) { + jout = getState().eventAck(iq); + removeExpectedId(iq.getPacketID()); + } + } else if (iq instanceof Jingle) { + // Get the action from the Jingle packet + Jingle jin = (Jingle) iq; + Jingle.Action action = jin.getAction(); + + if (action != null) { + if (action.equals(Jingle.Action.CONTENTACCEPT)) { + jout = getState().eventAccept(jin); + } else if (action.equals(Jingle.Action.CONTENTDECLINE)) { + jout = getState().eventDecline(jin); + } else if (action.equals(Jingle.Action.DESCRIPTIONINFO)) { + jout = getState().eventInfo(jin); + } else if (action.equals(Jingle.Action.CONTENTMODIFY)) { + jout = getState().eventModify(jin); + } + // Any unknown action will be ignored: it is not a msg + // to us... + } + } + } + } + + // Save the Id for any ACK + if (id != null) { + addExpectedId(id); + } else { + if (jout != null) { + addExpectedId(jout.getPacketID()); + } + } + + return jout; + } + + /** + * Return true if the content is negotiated. + * + * @return true if the content is negotiated. + */ + public boolean isEstablished() { + return getBestCommonAudioPt() != null; + } + + /** + * Return true if the content is fully negotiated. + * + * @return true if the content is fully negotiated. + */ + public boolean isFullyEstablished() { + return isEstablished() && getState() == active; + } + + // Payload types + + private PayloadType.Audio calculateBestCommonAudioPt(List remoteAudioPts) { + final ArrayList commonAudioPtsHere = new ArrayList(); + final ArrayList commonAudioPtsThere = new ArrayList(); + PayloadType.Audio result = null; + + if (!remoteAudioPts.isEmpty()) { + commonAudioPtsHere.addAll(localAudioPts); + commonAudioPtsHere.retainAll(remoteAudioPts); + + commonAudioPtsThere.addAll(remoteAudioPts); + commonAudioPtsThere.retainAll(localAudioPts); + + if (!commonAudioPtsHere.isEmpty() && !commonAudioPtsThere.isEmpty()) { + PayloadType.Audio bestPtHere = (PayloadType.Audio) commonAudioPtsHere + .get(0); + PayloadType.Audio bestPtThere = (PayloadType.Audio) commonAudioPtsThere + .get(0); + + // If both match, use it + if (bestPtHere.equals(bestPtThere)) { + result = bestPtHere; + } else { + // Otherwise, use the one of the initiator... + // FIXME: this is an invented behavior!!! + String initiator = session.getInitiator(); + String me = session.getConnection().getUser(); + + if (initiator.equals(me)) { + result = bestPtHere; + } else { + result = bestPtThere; + } + } + } + } + + return result; + } + + private List obtainPayloads(Jingle jin) { + List result = new ArrayList(); + Iterator iDescr = jin.getDescriptions(); + + // Add the list of payloads: iterate over the descriptions... + while (iDescr.hasNext()) { + JingleContentDescription.Audio descr = (JingleContentDescription.Audio) iDescr + .next(); + + if (descr != null) { + // ...and, then, over the payloads. + // Note: we use the last "description" in the packet... + result.clear(); + result.addAll(descr.getAudioPayloadTypesList()); + } + } + + return result; + } + + /** + * Adds a payload type to the list of remote payloads. + * + * @param pt the remote payload type + */ + public void addRemoteAudioPayloadType(PayloadType.Audio pt) { + if (pt != null) { + synchronized (remoteAudioPts) { + remoteAudioPts.add(pt); + } + } + } + + /** + * Create an offer for the list of audio payload types. + * + * @return a new Jingle packet with the list of audio Payload Types + */ + private Jingle getAudioPayloadTypesOffer() { + JingleContentDescription.Audio audioDescr = new JingleContentDescription.Audio(); + + // Add the list of payloads for audio and create a + // JingleContentDescription + // where we announce our payloads... + audioDescr.addAudioPayloadTypes(localAudioPts); + + return new Jingle(audioDescr); + } + + // Predefined messages and Errors + + /** + * Create an IQ "accept" message. + */ + private Jingle createAcceptMessage() { + Jingle jout = null; + + // If we hava a common best codec, send an accept right now... + jout = new Jingle(Jingle.Action.CONTENTACCEPT); + jout.addDescription(new JingleContentDescription.Audio( + new JinglePayloadType.Audio(bestCommonAudioPt))); + + return jout; + } + + // Payloads + + /** + * Get the best common codec between both parts. + * + * @return The best common PayloadType codec. + */ + public PayloadType.Audio getBestCommonAudioPt() { + return bestCommonAudioPt; + } + + // Events + + /** + * Trigger a session established event. + * + * @param bestPt payload type that has been agreed. + */ + protected void triggerMediaEstablished(PayloadType bestPt) { + ArrayList listeners = getListenersList(); + Iterator iter = listeners.iterator(); + while (iter.hasNext()) { + JingleListener li = (JingleListener) iter.next(); + if (li instanceof JingleMediaListener) { + JingleMediaListener mli = (JingleMediaListener) li; + mli.mediaEstablished(bestPt); + } + } + } + + /** + * Trigger a jmf closed event. + * + * @param currPt current payload type that is cancelled. + */ + protected void triggerMediaClosed(PayloadType currPt) { + ArrayList listeners = getListenersList(); + Iterator iter = listeners.iterator(); + while (iter.hasNext()) { + JingleListener li = (JingleListener) iter.next(); + if (li instanceof JingleMediaListener) { + JingleMediaListener mli = (JingleMediaListener) li; + mli.mediaClosed(currPt); + } + } + } + + /** + * Terminate the jmf negotiator + */ + public void close() { + super.close(); + } + + // States + + /** + * First stage when we send a session request. + */ + public class Inviting extends JingleNegotiator.State { + public Inviting(MediaNegotiator neg) { + super(neg); + } + + /** + * Create an initial Jingle packet, with the list of payload types that + * we support. The list is in order of preference. + */ + public Jingle eventInvite() { + return getAudioPayloadTypesOffer(); + } + + /** + * We have received the ACK for our invitation. + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventAck(org.jivesoftware.smack.packet.IQ) + */ + public Jingle eventAck(IQ iq) { + setState(pending); + return null; + } + } + + /** + * We are accepting connections. + */ + public class Accepting extends JingleNegotiator.State { + + public Accepting(MediaNegotiator neg) { + super(neg); + } + + /** + * We have received an invitation! Respond with a list of our payload + * types... + */ + public Jingle eventInitiate(Jingle jin) { + synchronized (remoteAudioPts) { + remoteAudioPts.addAll(obtainPayloads(jin)); + } + + return getAudioPayloadTypesOffer(); + } + + /** + * Process the ACK of our list of codecs (our offer). + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventAck(org.jivesoftware.smack.packet.IQ) + */ + public Jingle eventAck(IQ iq) throws XMPPException { + Jingle response = null; + + if (!remoteAudioPts.isEmpty()) { + // Calculate the best common codec + bestCommonAudioPt = calculateBestCommonAudioPt(remoteAudioPts); + + // and send an accept if we havee an agreement... + if (bestCommonAudioPt != null) { + response = createAcceptMessage(); + } else { + throw new JingleException(JingleError.NO_COMMON_PAYLOAD); + } + + setState(pending); + } + + return response; + } + } + + /** + * Pending class: we are waiting for the other enpoint, that must say if it + * accepts or not... + */ + public class Pending extends JingleNegotiator.State { + public Pending(MediaNegotiator neg) { + super(neg); + } + + /** + * A content info has been received. This is done for publishing the + * list of payload types... + * + * @param jin The input packet + * @return a Jingle packet + * @throws JingleException + */ + public Jingle eventInfo(Jingle jin) throws JingleException { + PayloadType.Audio oldBestCommonAudioPt = bestCommonAudioPt; + List offeredPayloads = new ArrayList(); + Jingle response = null; + boolean ptChange = false; + + offeredPayloads = obtainPayloads(jin); + if (!offeredPayloads.isEmpty()) { + + synchronized (remoteAudioPts) { + remoteAudioPts.clear(); + remoteAudioPts.addAll(offeredPayloads); + } + + // Calculate the best common codec + bestCommonAudioPt = calculateBestCommonAudioPt(remoteAudioPts); + if (bestCommonAudioPt != null) { + // and send an accept if we have an agreement... + ptChange = !bestCommonAudioPt.equals(oldBestCommonAudioPt); + if (oldBestCommonAudioPt == null || ptChange) { + response = createAcceptMessage(); + } + } else { + throw new JingleException(JingleError.NO_COMMON_PAYLOAD); + } + } + + // Parse the Jingle and get the payload accepted + return response; + } + + /** + * A jmf description has been accepted. In this case, we must save the + * accepted payload type and notify any listener... + * + * @param jin The input packet + * @return a Jingle packet + * @throws JingleException + */ + public Jingle eventAccept(Jingle jin) throws JingleException { + PayloadType.Audio agreedCommonAudioPt; + List offeredPayloads = new ArrayList(); + Jingle response = null; + + if (bestCommonAudioPt == null) { + // Update the best common audio PT + bestCommonAudioPt = calculateBestCommonAudioPt(remoteAudioPts); + response = createAcceptMessage(); + } + + offeredPayloads = obtainPayloads(jin); + if (!offeredPayloads.isEmpty()) { + if (offeredPayloads.size() == 1) { + agreedCommonAudioPt = (PayloadType.Audio) offeredPayloads.get(0); + if (bestCommonAudioPt != null) { + // If the accepted PT matches the best payload + // everything is fine + if (!agreedCommonAudioPt.equals(bestCommonAudioPt)) { + throw new JingleException(JingleError.NEGOTIATION_ERROR); + } + } + + } else if (offeredPayloads.size() > 1) { + throw new JingleException(JingleError.MALFORMED_STANZA); + } + } + + return response; + } + + /** + * The other part has declined the our codec... + * + * @throws JingleException + */ + public Jingle eventDecline(Jingle inJingle) throws JingleException { + triggerMediaClosed(getBestCommonAudioPt()); + throw new JingleException(); + } + + /* + * (non-Javadoc) + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventError(org.jivesoftware.smack.packet.IQ) + */ + public void eventError(IQ iq) throws XMPPException { + triggerMediaClosed(getBestCommonAudioPt()); + super.eventError(iq); + } + + /** + * ACK received. + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventAck(org.jivesoftware.smack.packet.IQ) + */ + public Jingle eventAck(IQ iq) { + if (isEstablished()) { + setState(active); + } + + return null; + } + } + + /** + * "Active" state: we have an agreement about the codec... + */ + public class Active extends JingleNegotiator.State { + + public Active(MediaNegotiator neg) { + super(neg); + } + + /** + * We have an agreement. + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventEnter() + */ + public void eventEnter() { + triggerMediaEstablished(getBestCommonAudioPt()); + super.eventEnter(); + } + + /** + * We are breaking the contract... + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventExit() + */ + public void eventExit() { + triggerMediaClosed(getBestCommonAudioPt()); + super.eventExit(); + } + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/media/PayloadType.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/media/PayloadType.java new file mode 100644 index 000000000..0bfa80142 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/media/PayloadType.java @@ -0,0 +1,289 @@ +package org.jivesoftware.smackx.jingle.media; + +/** + * Represents a payload type. + * + * @author Alvaro Saurin + */ +public class PayloadType { + + public static int MAX_FIXED_PT = 95; + + public static int INVALID_PT = 65535; + + private int id; + + private String name; + + private int channels; + + /** + * Constructor with Id, name and number of channels + * + * @param id The identifier + * @param name A name + * @param channels The number of channels + */ + public PayloadType(int id, final String name, int channels) { + super(); + this.id = id; + this.name = name; + this.channels = channels; + } + + /** + * Default constructor. + */ + public PayloadType() { + this(INVALID_PT, null, 1); + } + + /** + * Constructor with Id and name + * + * @param id The identification + * @param name A name + */ + public PayloadType(int id, String name) { + this(id, name, 1); + } + + /** + * Copy constructor + * + * @param pt The other payload type. + */ + public PayloadType(PayloadType pt) { + this(pt.getId(), pt.getName(), pt.getChannels()); + } + + /** + * Get the ID. + * + * @return the ID + */ + public int getId() { + return id; + } + + /** + * Set the ID. + * + * @param id ID + */ + public void setId(int id) { + this.id = id; + } + + /** + * Get the printable name. + * + * @return printable name for the payload type + */ + public String getName() { + return name; + } + + /** + * Set the printable name. + * + * @param name the printable name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Get the number of channels used by this payload type. + * + * @return the number of channels + */ + public int getChannels() { + return channels; + } + + /** + * Set the numer of channels for a payload type. + * + * @param channels The number of channels + */ + public void setChannels(int channels) { + this.channels = channels; + } + + /** + * Return true if the Payload type is not valid + * + * @return true if the payload type is invalid + */ + public boolean isNull() { + if (getId() == INVALID_PT) { + return true; + } else if (getName() == null) { + return true; + } + return false; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + final int PRIME = 31; + int result = 1; + result = PRIME * result + getChannels(); + result = PRIME * result + getId(); + result = PRIME * result + (getName() == null ? 0 : getName().hashCode()); + return result; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final PayloadType other = (PayloadType) obj; + if (getChannels() != other.getChannels()) { + return false; + } + if (getId() != other.getId()) { + return false; + } + + // Compare names only for dynamic payload types + if (getId() > MAX_FIXED_PT) { + if (getName() == null) { + if (other.getName() != null) { + return false; + } + } else if (!getName().equals(other.getName())) { + return false; + } + } + + return true; + } + + /** + * Audio payload type. + */ + public static class Audio extends PayloadType { + private int clockRate; + + /** + * Constructor with all the attributes of an Audio payload type + * + * @param id The identifier + * @param name The name assigned to this payload type + * @param channels The number of channels + * @param rate The clock rate + */ + public Audio(int id, String name, int channels, int rate) { + super(id, name, channels); + clockRate = rate; + } + + /** + * Empty constructor. + */ + public Audio() { + super(); + clockRate = 0; + } + + /** + * Constructor with Id and name + * + * @param id the Id for the payload type + * @param name the name of the payload type + */ + public Audio(int id, String name) { + super(id, name); + clockRate = 0; + } + + /** + * Copy constructor + * + * @param pt the other payload type + */ + public Audio(PayloadType pt) { + super(pt); + clockRate = 0; + } + + /** + * Copy constructor + * + * @param pt the other payload type + */ + public Audio(PayloadType.Audio pt) { + super(pt); + clockRate = pt.getClockRate(); + } + + /** + * Get the sampling clockRate for a payload type + * + * @return The sampling clockRate + */ + public int getClockRate() { + return clockRate; + } + + /** + * Set tha sampling clockRate for a playload type. + * + * @param rate The sampling clockRate + */ + public void setClockRate(int rate) { + clockRate = rate; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + final int PRIME = 31; + int result = super.hashCode(); + result = PRIME * result + getClockRate(); + return result; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!super.equals(obj)) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Audio other = (Audio) obj; + if (getClockRate() != other.getClockRate()) { + return false; + } + return true; + } + } +} \ No newline at end of file diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/BasicResolver.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/BasicResolver.java new file mode 100644 index 000000000..bc4689662 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/BasicResolver.java @@ -0,0 +1,102 @@ +package org.jivesoftware.smackx.jingle.nat; + +import org.jivesoftware.smack.XMPPException; + +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.util.Enumeration; + +/** + * Basic Resolver takes all IP addresses of the interfaces and uses the + * first non-loopback address. + * A very simple and easy to use resolver. + */ +public class BasicResolver extends TransportResolver { + + /** + * Constructor. + */ + public BasicResolver() { + super(); + } + + /** + * Resolve the IP address. + *

+ * The BasicResolver takes the IP addresses of the interfaces and uses the + * first non-loopback, non-linklocal and non-sitelocal address. + */ + public synchronized void resolve() throws XMPPException { + + setResolveInit(); + + clearCandidates(); + + Enumeration ifaces = null; + + try { + ifaces = NetworkInterface.getNetworkInterfaces(); + } catch (SocketException e) { + e.printStackTrace(); + } + + while (ifaces.hasMoreElements()) { + + NetworkInterface iface = (NetworkInterface) ifaces.nextElement(); + Enumeration iaddresses = iface.getInetAddresses(); + + while (iaddresses.hasMoreElements()) { + InetAddress iaddress = (InetAddress) iaddresses.nextElement(); + if (!iaddress.isLoopbackAddress() && !iaddress.isLinkLocalAddress() && !iaddress.isSiteLocalAddress()) { + TransportCandidate tr = new TransportCandidate.Fixed(iaddress.getHostAddress() != null ? iaddress.getHostAddress() : iaddress.getHostName(), getFreePort()); + tr.setLocalIp(iaddress.getHostAddress() != null ? iaddress.getHostAddress() : iaddress.getHostName()); + addCandidate(tr); + setResolveEnd(); + return; + } + } + } + + try { + ifaces = NetworkInterface.getNetworkInterfaces(); + } catch (SocketException e) { + e.printStackTrace(); + } + + while (ifaces.hasMoreElements()) { + + NetworkInterface iface = (NetworkInterface) ifaces.nextElement(); + Enumeration iaddresses = iface.getInetAddresses(); + + while (iaddresses.hasMoreElements()) { + InetAddress iaddress = (InetAddress) iaddresses.nextElement(); + if (!iaddress.isLoopbackAddress() && !iaddress.isLinkLocalAddress()) { + TransportCandidate tr = new TransportCandidate.Fixed(iaddress.getHostAddress() != null ? iaddress.getHostAddress() : iaddress.getHostName(), getFreePort()); + tr.setLocalIp(iaddress.getHostAddress() != null ? iaddress.getHostAddress() : iaddress.getHostName()); + addCandidate(tr); + setResolveEnd(); + return; + } + } + } + + try { + TransportCandidate tr = new TransportCandidate.Fixed(InetAddress.getLocalHost().getHostAddress() != null ? InetAddress.getLocalHost().getHostAddress() : InetAddress.getLocalHost().getHostName(), getFreePort()); + tr.setLocalIp(InetAddress.getLocalHost().getHostAddress() != null ? InetAddress.getLocalHost().getHostAddress() : InetAddress.getLocalHost().getHostName()); + addCandidate(tr); + } catch (Exception e) { + e.printStackTrace(); + } + setResolveEnd(); + + } + + public void initialize() throws XMPPException { + setInitialized(); + } + + public void cancel() throws XMPPException { + // Nothing to do here + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/BasicTransportManager.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/BasicTransportManager.java new file mode 100644 index 000000000..a88837ff2 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/BasicTransportManager.java @@ -0,0 +1,32 @@ +package org.jivesoftware.smackx.jingle.nat; + +/** + * $RCSfile$ + * $Revision: $ + * $Date: 15/11/2006 + * + * Copyright 2003-2006 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * A Basic Jingle Transport Manager implementation. + * + */ +public class BasicTransportManager extends JingleTransportManager{ + + protected TransportResolver createResolver() { + return new BasicResolver(); + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/BridgedResolver.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/BridgedResolver.java new file mode 100644 index 000000000..0c7e95530 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/BridgedResolver.java @@ -0,0 +1,94 @@ +package org.jivesoftware.smackx.jingle.nat; + +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; + +import java.util.Random; + +/** + * Bridged Resolver use a RTPBridge Service to add a relayed candidate. + * A very reliable solution for NAT Traversal. + * + * The resolver verify is the XMPP Server that the client is connected offer this service. + * If the server supports, a candidate is requested from the service. + * The resolver adds this candidate + */ +public class BridgedResolver extends TransportResolver{ + + XMPPConnection connection; + + Random random = new Random(); + + long sid; + + /** + * Constructor. + * A Bridged Resolver need a XMPPConnection to connect to a RTP Bridge. + */ + public BridgedResolver(XMPPConnection connection) { + super(); + this.connection = connection; + } + + /** + * Resolve Bridged Candidate. + *

+ * The BridgedResolver takes the IP addresse and ports of a jmf proxy service. + */ + public synchronized void resolve() throws XMPPException { + + setResolveInit(); + + clearCandidates(); + + sid = Math.abs(random.nextLong()); + + RTPBridge rtpBridge = RTPBridge.getRTPBridge(connection, String.valueOf(sid)); + + BasicResolver basicResolver = new BasicResolver(); + + basicResolver.initializeAndWait(); + basicResolver.resolve(); + + TransportCandidate localCandidate = new TransportCandidate.Fixed( + rtpBridge.getIp(), rtpBridge.getPortA()); + localCandidate.setLocalIp(basicResolver.getCandidate(0).getLocalIp()); + + TransportCandidate remoteCandidate = new TransportCandidate.Fixed( + rtpBridge.getIp(), rtpBridge.getPortB()); + remoteCandidate.setLocalIp(basicResolver.getCandidate(0).getLocalIp()); + + localCandidate.setSymmetric(remoteCandidate); + remoteCandidate.setSymmetric(localCandidate); + + localCandidate.setPassword(rtpBridge.getPass()); + remoteCandidate.setPassword(rtpBridge.getPass()); + + localCandidate.setSessionId(rtpBridge.getSid()); + remoteCandidate.setSessionId(rtpBridge.getSid()); + + localCandidate.setConnection(this.connection); + remoteCandidate.setConnection(this.connection); + + addCandidate(localCandidate); + + setResolveEnd(); + } + + public void initialize() throws XMPPException { + + clearCandidates(); + + if (!RTPBridge.serviceAvailable(connection)) { + setInitialized(); + throw new XMPPException("No RTP Bridge service available"); + } + setInitialized(); + + } + + public void cancel() throws XMPPException { + // Nothing to do here + } + +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/BridgedTransportManager.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/BridgedTransportManager.java new file mode 100644 index 000000000..e9d083397 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/BridgedTransportManager.java @@ -0,0 +1,75 @@ +package org.jivesoftware.smackx.jingle.nat; + +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smackx.jingle.JingleSession; +import org.jivesoftware.smackx.jingle.listeners.CreatedJingleSessionListener; +import org.jivesoftware.smackx.jingle.listeners.JingleSessionListener; +import org.jivesoftware.smackx.jingle.media.PayloadType; + +/** + * $RCSfile$ + * $Revision: $ + * $Date: 15/11/2006 + * + * Copyright 2003-2006 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * A Jingle Transport Manager implementation to be used for NAT Networks. + * This kind of transport needs that the connected XMPP Server provide a Bridge Service. (http://www.jivesoftware.com/protocol/rtpbridge) + * To relay the jmf outside the NAT. + * + * @author Thiago Camargo + */ +public class BridgedTransportManager extends JingleTransportManager implements JingleSessionListener, CreatedJingleSessionListener { + + XMPPConnection xmppConnection; + + public BridgedTransportManager(XMPPConnection xmppConnection) { + super(); + this.xmppConnection = xmppConnection; + } + + // Return the correspondent resolver + protected TransportResolver createResolver() { + BridgedResolver bridgedResolver = new BridgedResolver(this.xmppConnection); + return bridgedResolver; + } + + // Implement a Session Listener to relay candidates after establishment + + public void sessionEstablished(PayloadType pt, TransportCandidate rc, TransportCandidate lc, JingleSession jingleSession) { + RTPBridge rtpBridge = RTPBridge.relaySession(lc.getConnection(), lc.getSessionId(), lc.getPassword(), rc, lc); + } + + public void sessionDeclined(String reason, JingleSession jingleSession) { + } + + public void sessionRedirected(String redirection, JingleSession jingleSession) { + } + + public void sessionClosed(String reason, JingleSession jingleSession) { + } + + public void sessionClosedOnError(XMPPException e, JingleSession jingleSession) { + } + + // Session Created + + public void sessionCreated(JingleSession jingleSession) { + jingleSession.addListener(this); + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/FixedResolver.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/FixedResolver.java new file mode 100644 index 000000000..0bae13aaa --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/FixedResolver.java @@ -0,0 +1,67 @@ +package org.jivesoftware.smackx.jingle.nat; + +import org.jivesoftware.smack.XMPPException; + +/** + * The FixedResolver is a resolver where + * the external address and port are previously known when the object is + * initialized. + * + * @author Alvaro Saurin + */ +public class FixedResolver extends TransportResolver { + + TransportCandidate fixedCandidate; + + /** + * Constructor. + */ + public FixedResolver(String ip, int port) { + super(); + setFixedCandidate(ip, port); + } + + /** + * Create a basic resolver, where we provide the IP and port. + * + * @param ip an IP address + * @param port a port + */ + public void setFixedCandidate(String ip, int port) { + System.out.println("FIXED"); + fixedCandidate = new TransportCandidate.Fixed(ip, port); + } + + /** + * Resolve the IP address. + */ + public synchronized void resolve() throws XMPPException { + if (!isResolving()) { + setResolveInit(); + + clearCandidates(); + + if (fixedCandidate.getLocalIp() == null) + fixedCandidate.setLocalIp(fixedCandidate.getIp()); + + if (fixedCandidate != null) { + addCandidate(fixedCandidate); + } + + setResolveEnd(); + } + } + + /** + * Initialize the resolver. + * + * @throws XMPPException + */ + public void initialize() throws XMPPException { + setInitialized(); + } + + public void cancel() throws XMPPException { + // Nothing to do here + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/ICEResolver.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/ICEResolver.java new file mode 100644 index 000000000..9de788309 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/ICEResolver.java @@ -0,0 +1,85 @@ +/** + * $RCSfile$ + * $Revision$ + * $Date$ + * + * Copyright 2003-2005 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jivesoftware.smackx.jingle.nat; + +import de.javawi.jstun.test.demo.ice.Candidate; +import de.javawi.jstun.test.demo.ice.ICENegociator; +import de.javawi.jstun.util.UtilityException; +import org.jivesoftware.smack.XMPPException; + +import java.net.UnknownHostException; +import java.util.List; + +/** + * ICE Resolver for Jingle transport method that results in sending data between two entities using the Interactive Connectivity Establishment (ICE) methodology. (XEP-0176) + * The goal of this resolver is to make possible to establish and manage out-of-band connections between two XMPP entities, even if they are behind Network Address Translators (NATs) or firewalls. + * To use this resolver you must have a STUN Server and be in a non STUN blocked network. + * + * @author Thiago Camargo + */ +public class ICEResolver extends TransportResolver { + + public ICEResolver() { + super(); + this.setType(Type.ice); + } + + public void initialize() throws XMPPException { + if (!isResolving() && !isResolved()) { + System.out.println("Initialized"); + + ICENegociator cc = new ICENegociator((short) 1); + // gather candidates + cc.gatherCandidateAddresses(); + // priorize candidates + cc.prioritizeCandidates(); + // get SortedCandidates + //List sortedCandidates = cc.getSortedCandidates(); + + for (Candidate candidate : cc.getSortedCandidates()) + try { + TransportCandidate transportCandidate = new TransportCandidate.Ice(candidate.getAddress().getInetAddress().getHostAddress(), 1, candidate.getNetwork(), "1", candidate.getPort(), "1", candidate.getPriority()); + transportCandidate.setLocalIp(candidate.getBase().getAddress().getInetAddress().getHostAddress()); + this.addCandidate(transportCandidate); + System.out.println("C: " + candidate.getAddress().getInetAddress() + "|" + candidate.getBase().getAddress().getInetAddress() + " p:" + candidate.getPriority()); + } catch (UtilityException e) { + e.printStackTrace(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + } + this.setInitialized(); + } + + public void cancel() throws XMPPException { + + } + + /** + * Resolve the IP and obtain a valid transport method. + */ + public synchronized void resolve() throws XMPPException { + this.setResolveInit(); + System.out.println("Resolve"); + this.setResolveEnd(); + } + +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/ICETransportManager.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/ICETransportManager.java new file mode 100644 index 000000000..b21e54f54 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/ICETransportManager.java @@ -0,0 +1,46 @@ +package org.jivesoftware.smackx.jingle.nat; + +import org.jivesoftware.smack.XMPPException; + +/** + * $RCSfile$ + * $Revision: $ + * $Date: 02/01/2007 + * + * Copyright 2003-2006 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +public class ICETransportManager extends JingleTransportManager { + + ICEResolver iceResolver = null; + + public ICETransportManager() { + iceResolver = new ICEResolver(); + try { + iceResolver.initializeAndWait(); + } catch (XMPPException e) { + e.printStackTrace(); + } + } + + protected TransportResolver createResolver() { + try { + iceResolver.resolve(); + } catch (XMPPException e) { + e.printStackTrace(); + } + return iceResolver; + } + +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/JingleTransportManager.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/JingleTransportManager.java new file mode 100644 index 000000000..3eb3d9f68 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/JingleTransportManager.java @@ -0,0 +1,54 @@ +package org.jivesoftware.smackx.jingle.nat; + +import org.jivesoftware.smack.XMPPException; + +/** + * Transport manager for Jingle. + * + * This class makes easier the use of transport resolvers by presenting a simple + * interface for algorithm selection. The transport manager also keeps the match + * between the resolution method and the <transport> element present in + * Jingle packets. + * + * As Jingle have many transport methods (official and unofficial methods), + * this abstract class helps us to extends the transport support of the API. + * + * This class must be used with a JingleManager instance in the following way: + * + * JingleManager jingleManager = new JingleManager(xmppConnection, new BasicTransportManager()); + * + * @author Thiago Camargo + */ +public abstract class JingleTransportManager { + // This class implements the context of a Strategy pattern... + + /** + * Deafult contructor. + */ + public JingleTransportManager() { + + } + + /** + * Get a new Transport Resolver to be used in a Jingle Session + * + * @return + */ + public TransportResolver getResolver() throws XMPPException { + TransportResolver resolver = createResolver(); + if (resolver == null) { + resolver = new BasicResolver(); + } + resolver.initializeAndWait(); + + return resolver; + } + + /** + * Create a Transport Resolver instance according to the implementation. + * + * @return + */ + protected abstract TransportResolver createResolver(); + +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/RTPBridge.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/RTPBridge.java new file mode 100644 index 000000000..fa85f3d6c --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/RTPBridge.java @@ -0,0 +1,462 @@ +/** + * $RCSfile$ + * $Revision$ + * $Date$ + * + * Copyright 2003-2005 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jivesoftware.smackx.jingle.nat; + +import org.jivesoftware.smack.PacketCollector; +import org.jivesoftware.smack.SmackConfiguration; +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.filter.PacketIDFilter; +import org.jivesoftware.smack.packet.IQ; +import org.jivesoftware.smack.provider.IQProvider; +import org.jivesoftware.smack.provider.ProviderManager; +import org.jivesoftware.smackx.ServiceDiscoveryManager; +import org.jivesoftware.smackx.packet.DiscoverItems; +import org.xmlpull.v1.XmlPullParser; + +import java.util.Iterator; + +/** + * RTPBridge IQ Packet used to request and retrieve a RTPBridge Candidates that can be used for a Jingle Media Transmission between two parties that are behind NAT. + * This Jingle Bridge has all the needed information to establish a full UDP Channel (Send and Receive) between two parties. + * This transport method should be used only if other transport methods are not allowed. Or if you want a more reliable transport. + *

+ * High Level Usage Example: + *

+ * RTPBridge rtpBridge = RTPBridge.getRTPBridge(xmppConnection, sessionID); + * + * @author Thiago Camargo + */ +public class RTPBridge extends IQ { + + private String sid; + private String pass; + private String ip; + private String name; + private int portA = -1; + private int portB = -1; + private String hostA; + private String hostB; + private BridgeAction bridgeAction = BridgeAction.create; + + private enum BridgeAction { + create, change + } + + /** + * Element name of the packet extension. + */ + public static final String NAME = "rtpbridge"; + + /** + * Element name of the packet extension. + */ + public static final String ELEMENT_NAME = "rtpbridge"; + + /** + * Namespace of the packet extension. + */ + public static final String NAMESPACE = "http://www.jivesoftware.com/protocol/rtpbridge"; + + static { + ProviderManager.getInstance().addIQProvider(NAME, NAMESPACE, new Provider()); + } + + /** + * Creates a RTPBridge Instance with defined Session ID + * + * @param sid + */ + public RTPBridge(String sid) { + this.sid = sid; + } + + /** + * Creates a RTPBridge Instance with defined Session ID + * + * @param sid + * @param bridgeAction + */ + public RTPBridge(String sid, BridgeAction bridgeAction) { + this.sid = sid; + this.bridgeAction = bridgeAction; + } + + /** + * Creates a RTPBridge Packet without Session ID + */ + public RTPBridge() { + } + + /** + * Get the attributes string + */ + public String getAttributes() { + StringBuilder str = new StringBuilder(); + + if (getSid() != null) + str.append(" sid='").append(getSid()).append("'"); + + if (getPass() != null) + str.append(" pass='").append(getPass()).append("'"); + + if (getPortA() != -1) + str.append(" porta='").append(getPortA()).append("'"); + + if (getPortB() != -1) + str.append(" portb='").append(getPortB()).append("'"); + + if (getHostA() != null) + str.append(" hosta='").append(getHostA()).append("'"); + + if (getHostB() != null) + str.append(" hostb='").append(getHostB()).append("'"); + + return str.toString(); + } + + /** + * Get the Session ID of the Packet (usually same as Jingle Session ID) + * + * @return + */ + public String getSid() { + return sid; + } + + /** + * Set the Session ID of the Packet (usually same as Jingle Session ID) + * + * @param sid + */ + public void setSid(String sid) { + this.sid = sid; + } + + /** + * Get the Host A IP Address + * + * @return + */ + public String getHostA() { + return hostA; + } + + /** + * Set the Host A IP Address + * + * @param hostA + */ + public void setHostA(String hostA) { + this.hostA = hostA; + } + + /** + * Get the Host B IP Address + * + * @return + */ + public String getHostB() { + return hostB; + } + + /** + * Set the Host B IP Address + * + * @param hostB + */ + public void setHostB(String hostB) { + this.hostB = hostB; + } + + /** + * Get Side A receive port + * + * @return + */ + public int getPortA() { + return portA; + } + + /** + * Set Side A receive port + * + * @param portA + */ + public void setPortA(int portA) { + this.portA = portA; + } + + /** + * Get Side B receive port + * + * @return + */ + public int getPortB() { + return portB; + } + + /** + * Set Side B receive port + * + * @param portB + */ + public void setPortB(int portB) { + this.portB = portB; + } + + /** + * Get the RTP Bridge IP + * + * @return + */ + public String getIp() { + return ip; + } + + /** + * Set the RTP Bridge IP + * + * @param ip + */ + public void setIp(String ip) { + this.ip = ip; + } + + /** + * Get the RTP Agent Pass + * + * @return + */ + public String getPass() { + return pass; + } + + /** + * Set the RTP Agent Pass + * + * @param pass + */ + public void setPass(String pass) { + this.pass = pass; + } + + /** + * Get the name of the Candidate + * + * @return + */ + public String getName() { + return name; + } + + /** + * Set the name of the Candidate + * + * @param name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Get the Child Element XML of the Packet + * + * @return + */ + public String getChildElementXML() { + StringBuilder str = new StringBuilder(); + str.append("<" + ELEMENT_NAME + " xmlns='" + NAMESPACE + "' sid='").append(sid).append("'>"); + + if (bridgeAction.equals(BridgeAction.create)) + str.append(""); + else + str.append(""); + + str.append(""); + return str.toString(); + } + + /** + * IQProvider for RTP Bridge packets. + * Parse receive RTPBridge packet to a RTPBridge instance + * + * @author Thiago Rocha + */ + public static class Provider implements IQProvider { + + public Provider() { + super(); + } + + public IQ parseIQ(XmlPullParser parser) throws Exception { + + boolean done = false; + + int eventType; + String elementName; + String namespace; + + if (!parser.getNamespace().equals(RTPBridge.NAMESPACE)) + throw new Exception("Not a RTP Bridge packet"); + + RTPBridge iq = new RTPBridge(); + + for (int i = 0; i < parser.getAttributeCount(); i++) { + if (parser.getAttributeName(i).equals("sid")) + iq.setSid(parser.getAttributeValue(i)); + } + + // Start processing sub-elements + while (!done) { + eventType = parser.next(); + elementName = parser.getName(); + namespace = parser.getNamespace(); + + if (eventType == XmlPullParser.START_TAG) { + if (elementName.equals("candidate")) { + for (int i = 0; i < parser.getAttributeCount(); i++) { + if (parser.getAttributeName(i).equals("ip")) + iq.setIp(parser.getAttributeValue(i)); + else if (parser.getAttributeName(i).equals("pass")) + iq.setPass(parser.getAttributeValue(i)); + else if (parser.getAttributeName(i).equals("name")) + iq.setName(parser.getAttributeValue(i)); + else if (parser.getAttributeName(i).equals("porta")) + iq.setPortA(Integer.parseInt(parser.getAttributeValue(i))); + else if (parser.getAttributeName(i).equals("portb")) + iq.setPortB(Integer.parseInt(parser.getAttributeValue(i))); + } + } + + } else if (eventType == XmlPullParser.END_TAG) { + if (parser.getName().equals(RTPBridge.ELEMENT_NAME)) { + done = true; + } + } + } + return iq; + } + } + + /** + * Get a new RTPBridge Candidate from the server. + * If a error occurs or the server donīt support RTPBridge Service, null is returned. + * + * @param xmppConnection + * @param sessionID + * @return + */ + public static RTPBridge getRTPBridge(XMPPConnection xmppConnection, String sessionID) { + + if (!xmppConnection.isConnected()) { + return null; + } + + RTPBridge rtpPacket = new RTPBridge(sessionID); + rtpPacket.setTo(RTPBridge.NAME + "." + xmppConnection.getServiceName()); + + PacketCollector collector = xmppConnection + .createPacketCollector(new PacketIDFilter(rtpPacket.getPacketID())); + + xmppConnection.sendPacket(rtpPacket); + + RTPBridge response = (RTPBridge) collector + .nextResult(SmackConfiguration.getPacketReplyTimeout()); + + // Cancel the collector. + collector.cancel(); + + return response; + } + + /** + * Check if the server support RTPBridge Service. + * + * @param xmppConnection + * @return + */ + public static boolean serviceAvailable(XMPPConnection xmppConnection) { + + if (!xmppConnection.isConnected()) { + return false; + } + + System.out.println("service listing"); + + ServiceDiscoveryManager disco = ServiceDiscoveryManager + .getInstanceFor(xmppConnection); + try { + DiscoverItems items = disco.discoverItems(xmppConnection.getServiceName()); + Iterator iter = items.getItems(); + while (iter.hasNext()) { + DiscoverItems.Item item = (DiscoverItems.Item) iter.next(); + if (item.getEntityID().startsWith("rtpbridge.")) { + return true; + } + } + } + catch (XMPPException e) { + e.printStackTrace(); + } + + return false; + } + + /** + * Check if the server support RTPBridge Service. + * + * @param xmppConnection + * @return + */ + public static RTPBridge relaySession(XMPPConnection xmppConnection, String sessionID, String pass, TransportCandidate proxyCandidate, TransportCandidate localCandidate) { + + if (!xmppConnection.isConnected()) { + return null; + } + + RTPBridge rtpPacket = new RTPBridge(sessionID, RTPBridge.BridgeAction.change); + rtpPacket.setTo(RTPBridge.NAME + "." + xmppConnection.getServiceName()); + rtpPacket.setType(Type.SET); + + rtpPacket.setPass(pass); + rtpPacket.setPortA(localCandidate.getPort()); + rtpPacket.setPortB(proxyCandidate.getPort()); + rtpPacket.setHostA(localCandidate.getIp()); + rtpPacket.setHostB(proxyCandidate.getIp()); + + // System.out.println("Relayed to: " + candidate.getIp() + ":" + candidate.getPort()); + + PacketCollector collector = xmppConnection + .createPacketCollector(new PacketIDFilter(rtpPacket.getPacketID())); + + xmppConnection.sendPacket(rtpPacket); + + RTPBridge response = (RTPBridge) collector + .nextResult(SmackConfiguration.getPacketReplyTimeout()); + + // Cancel the collector. + collector.cancel(); + + return response; + } + +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/STUNResolver.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/STUNResolver.java new file mode 100644 index 000000000..8e77dfbc1 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/STUNResolver.java @@ -0,0 +1,509 @@ +package org.jivesoftware.smackx.jingle.nat; + +import de.javawi.jstun.test.BindingLifetimeTest; +import de.javawi.jstun.test.DiscoveryInfo; +import de.javawi.jstun.test.DiscoveryTest; +import org.jivesoftware.smack.XMPPException; +import org.xmlpull.mxp1.MXParser; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; + +/** + * Transport resolver using the JSTUN library, to discover public IP and use it as a candidate. + * + * The goal of this resolver is to take possible to establish and manage out-of-band connections between two XMPP entities, even if they are behind Network Address Translators (NATs) or firewalls. + * + * @author Alvaro Saurin + */ +public class STUNResolver extends TransportResolver { + + // The filename where the STUN servers are stored. + public final static String STUNSERVERS_FILENAME = "META-INF/stun-config.xml"; + + // Fallback values when we don't have any STUN server to use... + private final static String FALLBACKHOSTNAME = "stun.xten.net"; + + private final static int FALLBACKHOSTPORT = 3478; + + // Current STUN server we are using + protected STUNService currentServer; + + protected Thread resolverThread; + + protected int defaultPort; + + protected String resolvedPublicIP; + protected String resolvedLocalIP; + + /** + * Constructor with default STUN server. + */ + public STUNResolver() { + super(); + + this.defaultPort = 0; + this.currentServer = new STUNService(); + } + + /** + * Constructor with a default port. + * + * @param defaultPort Port to use by default. + */ + public STUNResolver(int defaultPort) { + this(); + + this.defaultPort = defaultPort; + } + + /** + * Return true if the service is working. + * + * @see TransportResolver#isResolving() + */ + public boolean isResolving() { + return super.isResolving() && resolverThread != null; + } + + /** + * Set the STUN server name and port + * + * @param ip the STUN server name + * @param port the STUN server port + */ + public void setSTUNService(String ip, int port) { + currentServer = new STUNService(ip, port); + } + + /** + * Get the name of the current STUN server. + * + * @return the name of the STUN server + */ + public String getCurrentServerName() { + if (!currentServer.isNull()) { + return currentServer.getHostname(); + } else { + return null; + } + } + + /** + * Get the port of the current STUN server. + * + * @return the port of the STUN server + */ + public int getCurrentServerPort() { + if (!currentServer.isNull()) { + return currentServer.getPort(); + } else { + return 0; + } + } + + /** + * Load the STUN configuration from a stream. + * + * @param stunConfigStream An InputStream with the configuration file. + * @return A list of loaded servers + */ + public ArrayList loadSTUNServers(java.io.InputStream stunConfigStream) { + ArrayList serversList = new ArrayList(); + String serverName; + int serverPort; + + try { + XmlPullParser parser = new MXParser(); + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); + parser.setInput(stunConfigStream, "UTF-8"); + + int eventType = parser.getEventType(); + do { + if (eventType == XmlPullParser.START_TAG) { + + // Parse a STUN server definition + if (parser.getName().equals("stunServer")) { + + serverName = null; + serverPort = -1; + + // Parse the hostname + parser.next(); + parser.next(); + serverName = parser.nextText(); + + // Parse the port + parser.next(); + parser.next(); + try { + serverPort = Integer.parseInt(parser.nextText()); + } + catch (Exception e) { + } + + // If we have a valid hostname and port, add + // it to the list. + if (serverName != null && serverPort != -1) { + STUNService service = new STUNService(serverName, serverPort); + + serversList.add(service); + } + } + } + eventType = parser.next(); + + } + while (eventType != XmlPullParser.END_DOCUMENT); + + } + catch (XmlPullParserException e) { + e.printStackTrace(); + } + catch (IOException e) { + e.printStackTrace(); + } + + currentServer = bestSTUNServer(serversList); + + return serversList; + } + + /** + * Load a list of services: STUN servers and ports. Some public STUN servers + * are: + *

+ *

+     *               iphone-stun.freenet.de:3478
+     *               larry.gloo.net:3478
+     *               stun.xten.net:3478
+     *               stun.fwdnet.net
+     *               stun.fwd.org (no DNS SRV record)
+     *               stun01.sipphone.com (no DNS SRV record)
+     *               stun.softjoys.com (no DNS SRV record)
+     *               stun.voipbuster.com (no DNS SRV record)
+     *               stun.voxgratia.org (no DNS SRV record)
+     *               stun.noc.ams-ix.net
+     * 
+ *

+ * This list should be contained in a file in the "META-INF" directory + * + * @return a list of services + */ + public ArrayList loadSTUNServers() { + ArrayList serversList = new ArrayList(); + + // Load the STUN configuration + try { + // Get an array of class loaders to try loading the config from. + ClassLoader[] classLoaders = new ClassLoader[2]; + classLoaders[0] = new STUNResolver() { + }.getClass().getClassLoader(); + classLoaders[1] = Thread.currentThread().getContextClassLoader(); + + for (int i = 0; i < classLoaders.length; i++) { + Enumeration stunConfigEnum = classLoaders[i] + .getResources(STUNSERVERS_FILENAME); + + while (stunConfigEnum.hasMoreElements() && serversList.isEmpty()) { + URL url = (URL) stunConfigEnum.nextElement(); + java.io.InputStream stunConfigStream = null; + + stunConfigStream = url.openStream(); + serversList.addAll(loadSTUNServers(stunConfigStream)); + stunConfigStream.close(); + } + } + } + catch (Exception e) { + e.printStackTrace(); + } + + // If the list of candidates is empty, add at least one default server + if (serversList.isEmpty()) { + currentServer = new STUNService(FALLBACKHOSTNAME, FALLBACKHOSTPORT); + serversList.add(currentServer); + } + + return serversList; + } + + /** + * Get the best usable STUN server from a list. + * + * @return the best STUN server that can be used. + */ + private STUNService bestSTUNServer(ArrayList listServers) { + if (listServers.isEmpty()) { + return null; + } else { + // TODO: this should use some more advanced criteria... + return (STUNService) listServers.get(0); + } + } + + /** + * Resolve the IP and obtain a valid transport method. + */ + public synchronized void resolve() throws XMPPException { + + setResolveInit(); + + clearCandidates(); + + TransportCandidate candidate = new TransportCandidate.Fixed( + resolvedPublicIP, getFreePort()); + candidate.setLocalIp(resolvedLocalIP); + + System.out.println("RESOLVING : " + resolvedPublicIP + ":" + candidate.getPort()); + + addCandidate(candidate); + + setResolveEnd(); + + } + + /** + * Initialize the resolver. + * + * @throws XMPPException + */ + public void initialize() throws XMPPException { + System.out.println("Initialized"); + if (!isResolving()&&!isResolved()) { + // Get the best STUN server available + if (currentServer.isNull()) { + loadSTUNServers(); + } + // We should have a valid STUN server by now... + if (!currentServer.isNull()) { + + clearCandidates(); + + resolverThread = new Thread(new Runnable() { + public void run() { + // Iterate through the list of interfaces, and ask + // to the STUN server for our address. + try { + Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); + String candAddress; + int candPort; + + while (ifaces.hasMoreElements()) { + + NetworkInterface iface = (NetworkInterface) ifaces + .nextElement(); + Enumeration iaddresses = iface.getInetAddresses(); + + while (iaddresses.hasMoreElements()) { + InetAddress iaddress = (InetAddress) iaddresses + .nextElement(); + if (!iaddress.isLoopbackAddress() + && !iaddress.isLinkLocalAddress()) { + + // Reset the candidate + candAddress = null; + candPort = -1; + + DiscoveryTest test = new DiscoveryTest(iaddress, + currentServer.getHostname(), + currentServer.getPort()); + try { + // Run the tests and get the + // discovery + // information, where all the + // info is stored... + DiscoveryInfo di = test.test(); + + candAddress = di.getPublicIP() != null ? + di.getPublicIP().getHostAddress() : null; + + // Get a valid port + if (defaultPort == 0) { + candPort = getFreePort(); + } else { + candPort = defaultPort; + } + + // If we have a valid candidate, + // add it to the list. + if (candAddress != null && candPort >= 0) { + TransportCandidate candidate = new TransportCandidate.Fixed( + candAddress, candPort); + candidate.setLocalIp(iaddress.getHostAddress() != null ? iaddress.getHostAddress() : iaddress.getHostName()); + addCandidate(candidate); + + resolvedPublicIP = candidate.getIp(); + resolvedLocalIP = candidate.getLocalIp(); + return; + } + } + catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } + catch (SocketException e) { + e.printStackTrace(); + } + finally { + setInitialized(); + } + } + }, "Waiting for all the transport candidates checks..."); + + resolverThread.setName("STUN resolver"); + resolverThread.start(); + } else { + throw new IllegalStateException("No valid STUN server found."); + } + } + } + + /** + * Cancel any operation. + * + * @see TransportResolver#cancel() + */ + public synchronized void cancel() throws XMPPException { + if (isResolving()) { + resolverThread.interrupt(); + setResolveEnd(); + } + } + + /** + * Clear the list of candidates and start the resolution again. + * + * @see TransportResolver#clear() + */ + public synchronized void clear() throws XMPPException { + this.defaultPort = 0; + super.clear(); + } + + /** + * STUN service definition. + */ + protected class STUNService { + + private String hostname; // The hostname of the service + + private int port; // The port number + + /** + * Basic constructor, with the hostname and port + * + * @param hostname The hostname + * @param port The port + */ + public STUNService(String hostname, int port) { + super(); + + this.hostname = hostname; + this.port = port; + } + + /** + * Default constructor, without name and port. + */ + public STUNService() { + this(null, -1); + } + + /** + * Get the host name of the STUN service. + * + * @return The host name + */ + public String getHostname() { + return hostname; + } + + /** + * Set the hostname of the STUN service. + * + * @param hostname The host name of the service. + */ + public void setHostname(String hostname) { + this.hostname = hostname; + } + + /** + * Get the port of the STUN service + * + * @return The port number where the STUN server is waiting. + */ + public int getPort() { + return port; + } + + /** + * Set the port number for the STUN service. + * + * @param port The port number. + */ + public void setPort(int port) { + this.port = port; + } + + /** + * Basic format test: the service is not null. + * + * @return true if the hostname and port are null + */ + public boolean isNull() { + if (hostname == null) { + return true; + } else if (hostname.length() == 0) { + return true; + } else if (port < 0) { + return true; + } else { + return false; + } + } + + /** + * Check a binding with the STUN currentServer. + *

+ * Note: this function blocks for some time, waiting for a response. + * + * @return true if the currentServer is usable. + */ + public boolean checkBinding() { + boolean result = false; + + try { + BindingLifetimeTest binding = new BindingLifetimeTest(hostname, port); + + binding.test(); + + while (true) { + Thread.sleep(5000); + if (binding.getLifetime() != -1) { + if (binding.isCompleted()) { + return true; + } + } else { + break; + } + } + } + catch (Exception e) { + e.printStackTrace(); + } + + return result; + } + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/STUNTransportManager.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/STUNTransportManager.java new file mode 100644 index 000000000..e519beac4 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/STUNTransportManager.java @@ -0,0 +1,51 @@ +package org.jivesoftware.smackx.jingle.nat; + +import org.jivesoftware.smack.XMPPException; + +/** + * $RCSfile$ + * $Revision: $ + * $Date: 15/11/2006 + * + * Copyright 2003-2006 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * A Jingle Transport Manager implementation to be used on NAT networks with STUN Service NOT Blocked. + * + * @author Thiago Camargo + */ +public class STUNTransportManager extends JingleTransportManager { + STUNResolver stunResolver = null; + + public STUNTransportManager() { + stunResolver = new STUNResolver() { + }; + try { + stunResolver.initializeAndWait(); + } catch (XMPPException e) { + e.printStackTrace(); + } + } + + protected TransportResolver createResolver() { + try { + stunResolver.resolve(); + } catch (XMPPException e) { + e.printStackTrace(); + } + return stunResolver; + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportCandidate.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportCandidate.java new file mode 100644 index 000000000..849fb25c6 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportCandidate.java @@ -0,0 +1,855 @@ +/** + * $RCSfile$ + * $Revision$ + * $Date$ + * + * Copyright (C) 2002-2006 Jive Software. All rights reserved. + * ==================================================================== + * The Jive Software License (based on Apache Software License, Version 1.1) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by + * Jive Software (http://www.jivesoftware.com)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Smack" and "Jive Software" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please + * contact webmaster@jivesoftware.com. + * + * 5. Products derived from this software may not be called "Smack", + * nor may "Smack" appear in their name, without prior written + * permission of Jive Software. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL JIVE SOFTWARE OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + */ + +package org.jivesoftware.smackx.jingle.nat; + +import org.jivesoftware.smack.XMPPConnection; + +import java.net.InetAddress; +import java.util.ArrayList; +import java.util.List; + +/** + * Transport candidate. + * + * A candidate represents the possible transport for data interchange between + * the two endpoints. + * + * @author Thiago Camargo + * @author Alvaro Saurin + */ +public abstract class TransportCandidate { + + private String name; + + private String ip; // IP address + + private int port; // Port to use, or 0 for any port + + private String localIp; + + private int generation; + + protected String password; + + private String sessionId; + + private XMPPConnection connection; + + private TransportCandidate symmetric; + + // Listeners for events + private final List listeners = new ArrayList(); + + public String getIp() { + return ip; + } + + /** + * Set the IP address. + * + * @param ip the IP address + */ + public void setIp(String ip) { + this.ip = ip; + } + + /** + * Get local IP to bind to this candidate + * + * @return + */ + public String getLocalIp() { + return localIp == null ? ip : localIp; + } + + /** + * Set local IP to bind to this candidate + * + * @param localIp + */ + public void setLocalIp(String localIp) { + this.localIp = localIp; + } + + /** + * Get the symetric candidate for this candidate if it exists. + * + * @return + */ + public TransportCandidate getSymmetric() { + return symmetric; + } + + /** + * Set the symetric candidate for this candidate. + * + * @param symetric + */ + public void setSymmetric(TransportCandidate symetric) { + this.symmetric = symetric; + } + + /** + * Get the password used by ICE or relayed candidate + * + * @return a password + */ + public String getPassword() { + return password; + } + + /** + * Set the password used by ICE or relayed candidate + * + * @param password a password + */ + public void setPassword(String password) { + this.password = password; + } + + /** + * Get the XMPPConnection use to send or receive this candidate + * + * @return + */ + public XMPPConnection getConnection() { + return connection; + } + + /** + * Set the XMPPConnection use to send or receive this candidate + * + * @param connection + */ + public void setConnection(XMPPConnection connection) { + this.connection = connection; + } + + /** + * Get the jingleīs sessionId that is using this candidate + * + * @return + */ + public String getSessionId() { + return sessionId; + } + + /** + * Set the jingleīs sessionId that is using this candidate + * + * @param sessionId + */ + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + /** + * Empty constructor + */ + public TransportCandidate() { + this(null, 0, 0); + } + + /** + * Constructor with IP address and port + * + * @param ip The IP address. + * @param port The port number. + */ + public TransportCandidate(String ip, int port) { + this(ip, port, 0); + } + + /** + * Constructor with IP address and port + * + * @param ip The IP address. + * @param port The port number. + * @param generation The generation + */ + public TransportCandidate(String ip, int port, int generation) { + this.ip = ip; + this.port = port; + this.generation = generation; + } + + /** + * Return true if the candidate is not valid. + * + * @return true if the candidate is null. + */ + public boolean isNull() { + if (ip == null) { + return true; + } else if (ip.length() == 0) { + return true; + } else if (port < 0) { + return true; + } else { + return false; + } + } + + /** + * Get the port, or 0 for any port. + * + * @return the port or 0 + */ + public int getPort() { + return port; + } + + /** + * Set the port, using 0 for any port + * + * @param port the port + */ + public void setPort(int port) { + this.port = port; + } + + /** + * Get the generation for a transportElement definition + * + * @return the generation + */ + public int getGeneration() { + return generation; + } + + /** + * Set the generation for a transportElement definition. + * + * @param generation the generation number + */ + public void setGeneration(int generation) { + this.generation = generation; + } + + /** + * Get the name used for identifying this transportElement method (optional) + * + * @return a name used for identifying this transportElement (ie, + * "myrtpvoice1") + */ + public String getName() { + return name; + } + + /** + * Set a name for identifying this transportElement. + * + * @param name the name used for the transportElement + */ + public void setName(String name) { + this.name = name; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final TransportCandidate other = (TransportCandidate) obj; + if (generation != other.generation) { + return false; + } + if (getIp() == null) { + if (other.getIp() != null) { + return false; + } + } else if (!getIp().equals(other.getIp())) { + return false; + } + if (getName() == null) { + if (other.getName() != null) { + return false; + } + } else if (!getName().equals(other.getName())) { + return false; + } + if (getPort() != other.getPort()) { + return false; + } + return true; + } + + + /** + * Check if a transport candidate is usable. The transport resolver should + * check if the transport candidate the other endpoint has provided is + * usable. + *

+ * This method provides a basic check where it sends a "ping" to the remote + * address provided in the candidate. If the "ping" succedess, the candidate + * is accepted. Subclasses should provide better methods if they can... + */ + public void check() { + //TODO candidate is being checked trigger + //candidatesChecking.add(cand); + + Thread checkThread = new Thread(new Runnable() { + public void run() { + boolean isUsable; + + InetAddress candAddress; + try { + candAddress = InetAddress.getByName(getIp()); + isUsable = true;//candAddress.isReachable(CHECK_TIMEOUT); + } catch (Exception e) { + isUsable = false; + } + triggerCandidateChecked(isUsable); + + //TODO candidate is being checked trigger + //candidatesChecking.remove(cand); + } + }, "Transport candidate check"); + + checkThread.setName("Transport candidate test"); + checkThread.start(); + } + + /** + * Trigger a new candidate checked event. + * + * @param result The result. + */ + private void triggerCandidateChecked(boolean result) { + + for (TransportResolverListener.Checker trl : getListenersList()) { + trl.candidateChecked(this, result); + } + } + + /** + * Get the list of listeners + * + * @return the list of listeners + */ + public List getListenersList() { + synchronized (listeners) { + return new ArrayList(listeners); + } + } + + /** + * Add a transport resolver listener. + * + * @param li The transport resolver listener to be added. + */ + public void addListener(TransportResolverListener.Checker li) { + synchronized (listeners) { + listeners.add(li); + } + } + + /** + * Fixed transport candidate + */ + public static class Fixed extends TransportCandidate { + + public Fixed() { + super(); + } + + /** + * Constructor with IP address and port + * + * @param ip The IP address. + * @param port The port number. + */ + public Fixed(String ip, int port) { + super(ip, port); + } + + /** + * Constructor with IP address and port + * + * @param ip The IP address. + * @param port The port number. + * @param generation The generation + */ + public Fixed(String ip, int port, int generation) { + super(ip, port, generation); + } + } + + /** + * Ice candidate. + */ + public static class Ice extends TransportCandidate implements Comparable { + + private String id; // An identification + + private String username; + + private int preference; + + private Protocol proto; + + private Channel channel; + + private int network; + + public Ice() { + super(); + } + + /** + * Constructor with the basic elements of a transport definition. + * + * @param ip the IP address to use as a local address + * @param generation used to keep track of the candidates + * @param network used for diagnostics (used when the machine has + * several NICs) + * @param password user name, as it is used in ICE + * @param port the port at the candidate IP address + * @param username user name, as it is used in ICE + * @param preference preference for this transportElement, as it is used + * in ICE + */ + public Ice(String ip, int generation, int network, + String password, int port, String username, + int preference) { + super(ip, port, generation); + + proto = Protocol.UDP; + channel = Channel.MYRTPVOICE; + + this.network = network; + this.password = password; + this.username = username; + this.preference = preference; + } + + /** + * Get the ID + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Set the ID + * + * @param id the id to set + */ + public void setId(String id) { + this.id = id; + } + + /** + * Get the protocol used for the transmission + * + * @return the protocol used for transmission + */ + public Protocol getProto() { + return proto; + } + + /** + * Set the protocol for the transmission + * + * @param proto the protocol to use + */ + public void setProto(Protocol proto) { + this.proto = proto; + } + + /** + * Get the network interface used for this connection + * + * @return the interface number + */ + public int getNetwork() { + return network; + } + + /** + * Set the interface for this connection + * + * @param network the interface number + */ + public void setNetwork(int network) { + this.network = network; + } + + /** + * Get the username for this transportElement in ICE + * + * @return a username string + */ + public String getUsername() { + return username; + } + + /** + * Get the channel + * + * @return the channel associated + */ + public Channel getChannel() { + return channel; + } + + /** + * Set the channel for this transportElement + * + * @param channel the new channel + */ + public void setChannel(Channel channel) { + this.channel = channel; + } + + /** + * Set the username for this transportElement in ICE + * + * @param username the username used in ICE + */ + public void setUsername(String username) { + this.username = username; + } + + /** + * Get the preference number for this transportElement + * + * @return the preference for this transportElement + */ + public int getPreference() { + return preference; + } + + /** + * Set the preference order for this transportElement + * + * @param preference a number identifying the preference (as defined in + * ICE) + */ + public void setPreference(int preference) { + this.preference = preference; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!super.equals(obj)) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + + final Ice other = (Ice) obj; + if (getChannel() == null) { + if (other.getChannel() != null) { + return false; + } + } else if (!getChannel().equals(other.getChannel())) { + return false; + } + if (getId() == null) { + if (other.getId() != null) { + return false; + } + } else if (!getId().equals(other.getId())) { + return false; + } + if (getNetwork() != other.getNetwork()) { + return false; + } + if (getPassword() == null) { + if (other.getPassword() != null) { + return false; + } + } else if (!getPassword().equals(other.password)) { + return false; + } + if (getPreference() != other.getPreference()) { + return false; + } + if (getProto() == null) { + if (other.getProto() != null) { + return false; + } + } else if (!getProto().equals(other.getProto())) { + return false; + } + if (getUsername() == null) { + if (other.getUsername() != null) { + return false; + } + } else if (!getUsername().equals(other.getUsername())) { + return false; + } + return true; + } + + public boolean isNull() { + if (super.isNull()) { + return true; + } else if (getProto().isNull()) { + return true; + } else if (getChannel().isNull()) { + return true; + } + return false; + } + + /** + * Compare the to other Transport candidate. + * + * @param arg another Transport candidate + * @return a negative integer, zero, or a positive integer as this + * object is less than, equal to, or greater than the specified + * object + */ + public int compareTo(Object arg) { + if (arg instanceof TransportCandidate.Ice) { + TransportCandidate.Ice tc = (TransportCandidate.Ice) arg; + if (getPreference() < tc.getPreference()) { + return -1; + } else if (getPreference() > tc.getPreference()) { + return 1; + } + } + return 0; + } + } + + /** + * Type-safe enum for the transportElement protocol + */ + public static class Protocol { + + public static final Protocol UDP = new Protocol("udp"); + + public static final Protocol TCP = new Protocol("tcp"); + + public static final Protocol TCPACT = new Protocol("tcp-act"); + + public static final Protocol TCPPASS = new Protocol("tcp-pass"); + + public static final Protocol SSLTCP = new Protocol("ssltcp"); + + private String value; + + public Protocol(String value) { + this.value = value; + } + + public String toString() { + return value; + } + + /** + * Returns the Protocol constant associated with the String value. + */ + public static Protocol fromString(String value) { + if (value == null) { + return UDP; + } + value = value.toLowerCase(); + if (value.equals("udp")) { + return UDP; + } else if (value.equals("tcp")) { + return TCP; + } else if (value.equals("tcp-act")) { + return TCPACT; + } else if (value.equals("tcp-pass")) { + return TCPPASS; + } else if (value.equals("ssltcp")) { + return SSLTCP; + } else { + return UDP; + } + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Protocol other = (Protocol) obj; + if (value == null) { + if (other.value != null) { + return false; + } + } else if (!value.equals(other.value)) { + return false; + } + return true; + } + + /** + * Return true if the protocol is not valid. + * + * @return true if the protocol is null + */ + public boolean isNull() { + if (value == null) { + return true; + } else if (value.length() == 0) { + return true; + } else { + return false; + } + } + } + + /** + * Type-safe enum for the transportElement channel + */ + public static class Channel { + + public static final Channel MYRTPVOICE = new Channel("myrtpvoice"); + + public static final Channel MYRTCPVOICE = new Channel("myrtcpvoice"); + + private String value; + + public Channel(String value) { + this.value = value; + } + + public String toString() { + return value; + } + + /** + * Returns the MediaChannel constant associated with the String value. + */ + public static Channel fromString(String value) { + if (value == null) { + return MYRTPVOICE; + } + value = value.toLowerCase(); + if (value.equals("myrtpvoice")) { + return MYRTPVOICE; + } else if (value.equals("tcp")) { + return MYRTCPVOICE; + } else { + return MYRTPVOICE; + } + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Channel other = (Channel) obj; + if (value == null) { + if (other.value != null) { + return false; + } + } else if (!value.equals(other.value)) { + return false; + } + return true; + } + + /** + * Return true if the channel is not valid. + * + * @return true if the channel is null + */ + public boolean isNull() { + if (value == null) { + return true; + } else if (value.length() == 0) { + return true; + } else { + return false; + } + } + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportNegotiator.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportNegotiator.java new file mode 100644 index 000000000..a76d0c3ad --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportNegotiator.java @@ -0,0 +1,842 @@ +package org.jivesoftware.smackx.jingle.nat; + +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.packet.IQ; +import org.jivesoftware.smackx.jingle.JingleNegotiator; +import org.jivesoftware.smackx.jingle.JingleSession; +import org.jivesoftware.smackx.jingle.listeners.JingleListener; +import org.jivesoftware.smackx.jingle.listeners.JingleTransportListener; +import org.jivesoftware.smackx.packet.Jingle; +import org.jivesoftware.smackx.packet.JingleTransport.JingleTransportCandidate; + +import java.io.IOException; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +/** + * Transport negotiator. + * + * + * This class is responsible for managing the transport negotiation process, + * handling all the packet interchange and the stage control. + * + * @author Alvaro Saurin + */ +public abstract class TransportNegotiator extends JingleNegotiator { + + // The time we give to the candidates check before we accept or decline the + // transport (in milliseconds) + private final static int CANDIDATES_ACCEPT_PERIOD = 4000; + + // The session this nenotiator belongs to + private final JingleSession session; + + // The transport manager + private final TransportResolver resolver; + + // Transport candidates we have offered + private final List offeredCandidates = new ArrayList(); + + // List of remote transport candidates + private final List remoteCandidates = new ArrayList(); + + // Valid remote candidates + private final List validRemoteCandidates = new ArrayList(); + + // The best local candidate we have offered (and accepted by the other part) + private TransportCandidate acceptedLocalCandidate; + + // The thread that will report the result to the other end + private Thread resultThread; + + // Listener for the resolver + private TransportResolverListener.Resolver resolverListener; + + // states + private final Inviting inviting; + + private final Accepting accepting; + + private final Pending pending; + + private final Active active; + + /** + * Default constructor. + * + * @param js The Jingle session + * @param transResolver The JingleTransportManager to use + */ + public TransportNegotiator(JingleSession js, + TransportResolver transResolver) { + super(js.getConnection()); + + session = js; + resolver = transResolver; + + resultThread = null; + + // Create the states... + inviting = new Inviting(this); + accepting = new Accepting(this); + pending = new Pending(this); + active = new Active(this); + } + + /** + * Get a new instance of the right TransportNegotiator class with this + * candidate. + * + * @return A TransportNegotiator instance + */ + public abstract org.jivesoftware.smackx.packet.JingleTransport getJingleTransport(TransportCandidate cand); + + /** + * Return true if the transport candidate is acceptable for the current + * negotiator. + * + * @return true if the transport candidate is acceptable + */ + public abstract boolean acceptableTransportCandidate(TransportCandidate tc); + + /** + * Obtain the best local candidate we want to offer. + * + * @return the best local candidate + */ + public final TransportCandidate getBestLocalCandidate() { + return resolver.getPreferredCandidate(); + } + + /** + * Set the best local transport candidate we have offered and accepted by + * the other endpoint. + * + * @param bestLocalCandidate the acceptedLocalCandidate to set + */ + private void setAcceptedLocalCandidate(TransportCandidate bestLocalCandidate) + throws XMPPException { + for (int i = 0; i < resolver.getCandidateCount(); i++) { + //TODO FIX The EQUAL Sentence + if (resolver.getCandidate(i).getIp().equals(bestLocalCandidate.getIp())) { + acceptedLocalCandidate = resolver.getCandidate(i); + return; + } + } + //System.out.println("BEST: " + bestLocalCandidate.getIp()); + throw new XMPPException("Local transport candidate has not be offered."); + } + + /** + * Get the best accepted local candidate we have offered. + * + * @return a transport candidate we have offered. + */ + public TransportCandidate getAcceptedLocalCandidate() { + return acceptedLocalCandidate; + } + + /** + * Obtain the best common transport candidate obtained in the negotiation. + * + * @return the bestRemoteCandidate + */ + public abstract TransportCandidate getBestRemoteCandidate(); + + /** + * Get the list of remote candidates. + * + * @return the remoteCandidates + */ + private List getRemoteCandidates() { + return remoteCandidates; + } + + /** + * Add a remote candidate to the list. The candidate will be checked in + * order to verify if it is usable. + * + * @param rc a remote candidate to add and check. + */ + private void addRemoteCandidate(TransportCandidate rc) { + // Add the candidate to the list + if (rc != null) { + if (acceptableTransportCandidate(rc)) { + synchronized (remoteCandidates) { + remoteCandidates.add(rc); + } + + // Check if the new candidate can be used. + checkRemoteCandidate(rc); + } + } + } + + /** + * Add a offered candidate to the list. + * + * @param rc a remote candidate we have offered. + */ + private void addOfferedCandidate(TransportCandidate rc) { + // Add the candidate to the list + if (rc != null) { + synchronized (offeredCandidates) { + offeredCandidates.add(rc); + } + } + } + + /** + * Check asynchronously the new transport candidate. + * + * @param offeredCandidate a transport candidates to check + */ + private void checkRemoteCandidate(final TransportCandidate offeredCandidate) { + System.out.println("CHECK"); + offeredCandidate.addListener(new TransportResolverListener.Checker() { + public void candidateChecked(TransportCandidate cand, + final boolean validCandidate) { + if (validCandidate) { + addValidRemoteCandidate(offeredCandidate); + } + } + + public void candidateChecking(TransportCandidate cand) { + } + + }); + offeredCandidate.check(); + } + + /** + * Return true if the transport is established. + * + * @return true if the transport is established. + */ + private boolean isEstablished() { + return getBestRemoteCandidate() != null && getAcceptedLocalCandidate() != null; + } + + /** + * Return true if the transport is fully established. + * + * @return true if the transport is fully established. + */ + public final boolean isFullyEstablished() { + return isEstablished() && getState() == active; + } + + /** + * Launch a thread that checks, after some time, if any of the candidates + * offered by the other endpoint is usable. The thread does not check the + * candidates: it just checks if we have got a valid one and sends an Accept + * in that case. + */ + private void delayedCheckBestCandidate(final JingleSession js, final Jingle jin) { + // + // If this is the first insertion in the list, start the thread that + // will send the result of our checks... + // + if (resultThread == null && !getRemoteCandidates().isEmpty()) { + resultThread = new Thread(new Runnable() { + + public void run() { + + // Sleep for some time, waiting for the candidates checks + try { + Thread.sleep(CANDIDATES_ACCEPT_PERIOD + + TransportResolver.CHECK_TIMEOUT); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + // Once we are in pending state, look for any valid remote + // candidate, and send an "accept" if we have one... + TransportCandidate bestRemote = getBestRemoteCandidate(); + State state = getState(); + + if (bestRemote != null && (state == pending || state == active)) { + // Accepting the remote candidate + Jingle jout = new Jingle(Jingle.Action.TRANSPORTACCEPT); + jout.addTransport(getJingleTransport(bestRemote)); + + // Send the packet + js.sendFormattedJingle(jin, jout); + + if (isEstablished()) { + setState(active); + } + } + } + }, "Waiting for all the transport candidates checks..."); + + resultThread.setName("Transport Resolver Result"); + resultThread.start(); + } + } + + /** + * Add a valid remote candidate to the list. The remote candidate has been + * checked, and the remote + * + * @param remoteCandidate a remote candidate to add + */ + private void addValidRemoteCandidate(TransportCandidate remoteCandidate) { + // Add the candidate to the list + if (remoteCandidate != null) { + synchronized (validRemoteCandidates) { + System.out.println("ADDED Valid Cand: " + remoteCandidate.getIp()); + validRemoteCandidates.add(remoteCandidate); + } + } + } + + /** + * Get the list of valid (ie, checked) remote candidates. + * + * @return The list of valid (ie, already checked) remote candidates. + */ + final ArrayList getValidRemoteCandidatesList() { + synchronized (validRemoteCandidates) { + return new ArrayList(validRemoteCandidates); + } + } + + /** + * Get an iterator for the list of valid (ie, checked) remote candidates. + * + * @return The iterator for the list of valid (ie, already checked) remote + * candidates. + */ + public final Iterator getValidRemoteCandidates() { + return Collections.unmodifiableList(getRemoteCandidates()).iterator(); + } + + /** + * Add an offered remote candidate. The transport candidate can be unusable: + * we must check if we can use it. + * + * @param rc the remote candidate to add. + */ + private void addRemoteCandidates(List rc) { + if (rc != null) { + System.out.println("SIZE OF LISTA: " + rc.size()); + if (rc.size() > 0) { + for (Object aRc : rc) { + addRemoteCandidate((TransportCandidate) aRc); + } + } + } + } + + /** + * Parse the list of transport candidates from a Jingle packet. + * + * @param jin The input jingle packet + */ + private static ArrayList obtainCandidatesList(Jingle jin) { + ArrayList result = new ArrayList(); + + if (jin != null) { + // Get the list of candidates from the packet + Iterator iTrans = jin.getTransports(); + while (iTrans.hasNext()) { + org.jivesoftware.smackx.packet.JingleTransport trans = (org.jivesoftware.smackx.packet.JingleTransport) iTrans.next(); + + System.out.println("LISTA SIZE: " + trans.getCandidatesCount()); + + Iterator iCand = trans.getCandidates(); + while (iCand.hasNext()) { + JingleTransportCandidate cand = (JingleTransportCandidate) iCand + .next(); + TransportCandidate transCand = cand.getMediaTransport(); + result.add(transCand); + } + } + } + + return result; + } + + private boolean isOfferStarted() { + return resolver.isResolving() || resolver.isResolved(); + } + + /** + * Send an offer for a transport candidate + * + * @param cand + */ + private synchronized void sendTransportCandidateOffer(TransportCandidate cand) { + if (!cand.isNull()) { + // Offer our new candidate... + addOfferedCandidate(cand); + session.sendFormattedJingle(new Jingle(getJingleTransport(cand))); + } + } + + /** + * Create a Jingle packet where we announce our transport candidates. + * + * @throws XMPPException + */ + private void sendTransportCandidatesOffer() throws XMPPException { + List notOffered = resolver.getCandidatesList(); + + notOffered.removeAll(offeredCandidates); + + // Send any unset candidate + for (Object aNotOffered : notOffered) { + sendTransportCandidateOffer((TransportCandidate) aNotOffered); + } + + // .. and start a listener that will send any future candidate + if (resolverListener == null) { + // Add a listener that sends the offer when the resolver finishes... + resolverListener = new TransportResolverListener.Resolver() { + public void candidateAdded(TransportCandidate cand) { + sendTransportCandidateOffer(cand); + } + + public void end() { + } + + public void init() { + } + }; + + resolver.addListener(resolverListener); + } + + if (!(resolver.isResolving() || resolver.isResolved())) { + // Resolve our IP and port + System.out.println("RESOLVER CALLED"); + resolver.resolve(); + } + } + + /** + * Dispatch an incoming packet. The method is responsible for recognizing + * the packet type and, depending on the current state, deliverying the + * packet to the right event handler and wait for a response. + * + * @param iq the packet received + * @return the new Jingle packet to send. + * @throws XMPPException + */ + public final IQ dispatchIncomingPacket(IQ iq, String id) throws XMPPException { + IQ jout = null; + + if (invalidState()) { + if (iq == null) { + // With a null packet, we are just inviting the other end... + setState(inviting); + jout = getState().eventInvite(); + + } else { + if (iq instanceof Jingle) { + // If there is no specific jmf action associated, then we + // are being invited to a new session... + setState(accepting); + jout = getState().eventInitiate((Jingle) iq); + } else { + throw new IllegalStateException( + "Invitation IQ received is not a Jingle packet in Transport negotiator."); + } + } + } else { + if (iq == null) { + return null; + } else { + if (iq.getType().equals(IQ.Type.ERROR)) { + // Process errors + getState().eventError(iq); + } else if (iq.getType().equals(IQ.Type.RESULT)) { + // Process ACKs + if (isExpectedId(iq.getPacketID())) { + jout = getState().eventAck(iq); + removeExpectedId(iq.getPacketID()); + } + } else if (iq instanceof Jingle) { + // Get the action from the Jingle packet + Jingle jin = (Jingle) iq; + Jingle.Action action = jin.getAction(); + + if (action != null) { + if (action.equals(Jingle.Action.TRANSPORTACCEPT)) { + jout = getState().eventAccept(jin); + } else if (action.equals(Jingle.Action.TRANSPORTDECLINE)) { + jout = getState().eventDecline(jin); + } else if (action.equals(Jingle.Action.TRANSPORTINFO)) { + jout = getState().eventInfo(jin); + } else if (action.equals(Jingle.Action.TRANSPORTMODIFY)) { + jout = getState().eventModify(jin); + } + } + } + } + } + + // Save the Id for any ACK + if (id != null) { + addExpectedId(id); + } else { + if (jout != null) { + addExpectedId(jout.getPacketID()); + } + } + + return jout; + } + + /** + * Trigger a Transport session established event. + * + * @param local TransportCandidate that has been agreed. + * @param remote TransportCandidate that has been agreed. + */ + private void triggerTransportEstablished(TransportCandidate local, + TransportCandidate remote) { + ArrayList listeners = getListenersList(); + for (Object listener : listeners) { + JingleListener li = (JingleListener) listener; + if (li instanceof JingleTransportListener) { + JingleTransportListener mli = (JingleTransportListener) li; + System.out.println("triggerTransportEstablished " + local.getLocalIp()); + mli.transportEstablished(local, remote); + } + } + } + + /** + * Trigger a Transport closed event. + * + * @param cand current TransportCandidate that is cancelled. + */ + private void triggerTransportClosed(TransportCandidate cand) { + ArrayList listeners = getListenersList(); + for (Object listener : listeners) { + JingleListener li = (JingleListener) listener; + if (li instanceof JingleTransportListener) { + JingleTransportListener mli = (JingleTransportListener) li; + mli.transportClosed(cand); + } + } + } + + // States + + /** + * First stage when we send a session request. + */ + public final class Inviting extends JingleNegotiator.State { + + public Inviting(TransportNegotiator neg) { + super(neg); + } + + /** + * Create an initial Jingle packet with an empty transport. + */ + public Jingle eventInvite() { + return new Jingle(getJingleTransport(null)); + } + + /** + * We have received some candidates. This can happen _before_ the ACK + * has been recieved... + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventInfo(org.jivesoftware.smackx.packet.Jingle) + */ + public Jingle eventInfo(Jingle jin) throws XMPPException { + // Parse the Jingle and get any proposed transport candidates + addRemoteCandidates(obtainCandidatesList(jin)); + + // Wait for some time and check if we have a valid candidate to + // use... + delayedCheckBestCandidate(session, jin); + + return null;// super.eventInfo(jin); + } + + /** + * The other endpoint has partially accepted our invitation: start + * offering a list of candidates. + * + * @return an IQ packet + * @throws XMPPException + */ + public Jingle eventAck(IQ iq) throws XMPPException { + sendTransportCandidatesOffer(); + setState(pending); + return super.eventAck(iq); + } + } + + /** + * We are accepting connections. This is the starting state when we accept a + * connection... + */ + public final class Accepting extends JingleNegotiator.State { + public Accepting(TransportNegotiator neg) { + super(neg); + } + + /** + * We have received an invitation. The packet will be ACKed by lower + * levels... + */ + public Jingle eventInitiate(Jingle jin) throws XMPPException { + // Parse the Jingle and get any proposed transport candidates + //addRemoteCandidates(obtainCandidatesList(jin)); + + // Start offering candidates + sendTransportCandidatesOffer(); + + // All these candidates will be checked asyncronously. Wait for some + // time and check if we have a valid candidate to use... + delayedCheckBestCandidate(session, jin); + + // Set the next state + setState(pending); + + return super.eventInitiate(jin); + } + } + + /** + * We are still receiving candidates + */ + public final class Pending extends JingleNegotiator.State { + + public Pending(TransportNegotiator neg) { + super(neg); + } + + /** + * One of our transport candidates has been accepted. + * + * @param jin The input packet + * @return a Jingle packet + * @throws XMPPException an exception + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventAccept(org.jivesoftware.smackx.packet.Jingle) + */ + public Jingle eventAccept(Jingle jin) throws XMPPException { + Jingle response = null; + + // Parse the Jingle and get the accepted candidate + ArrayList accepted = obtainCandidatesList(jin); + if (!accepted.isEmpty()) { + + for (TransportCandidate cand : (List) accepted) { + System.out.println("Cand: " + cand.getIp()); + } + + TransportCandidate cand = (TransportCandidate) accepted.get(0); + setAcceptedLocalCandidate(cand); + + if (isEstablished()) { + + System.out.println("SET ACTIVE"); + + setState(active); + } + } + return response; + } + + /** + * We have received another remote transport candidates. + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventInfo(org.jivesoftware.smackx.packet.Jingle) + */ + public Jingle eventInfo(Jingle jin) throws XMPPException { + + sendTransportCandidatesOffer(); + + // Parse the Jingle and get any proposed transport candidates + addRemoteCandidates(obtainCandidatesList(jin)); + + // Wait for some time and check if we have a valid candidate to + // use... + delayedCheckBestCandidate(session, jin); + + return null;//super.eventInfo(jin); + } + + /** + * None of our transport candidates has been accepted... + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventDecline(org.jivesoftware.smackx.packet.Jingle) + */ + public Jingle eventDecline(Jingle inJingle) throws JingleException { + throw new JingleException("No common payload found."); + } + } + + /** + * "Active" state: we have an agreement about the codec... + */ + public final class Active extends JingleNegotiator.State { + + public Active(TransportNegotiator neg) { + super(neg); + } + + /** + * We have an agreement. + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventEnter() + */ + public void eventEnter() { + System.out.println("Transport stabilished"); + triggerTransportEstablished(getAcceptedLocalCandidate(), + getBestRemoteCandidate()); + super.eventEnter(); + } + + /** + * We have finished the transport. + * + * @see org.jivesoftware.smackx.jingle.JingleNegotiator.State#eventEnter() + */ + public void eventExit() { + triggerTransportClosed(null); + super.eventExit(); + } + } + + // Subclasses + + /** + * Raw-UDP transport negotiator + * + * @author Alvaro Saurin + */ + public static final class RawUdp extends TransportNegotiator { + + /** + * Default constructor, with a JingleSession and transport manager. + * + * @param js The Jingle session this negotiation belongs to. + * @param res The transport resolver to use. + */ + public RawUdp(JingleSession js, final TransportResolver res) { + super(js, res); + } + + /** + * Get a TransportNegotiator instance. + */ + public org.jivesoftware.smackx.packet.JingleTransport getJingleTransport(TransportCandidate bestRemote) { + org.jivesoftware.smackx.packet.JingleTransport.RawUdp jt = new org.jivesoftware.smackx.packet.JingleTransport.RawUdp(); + jt.addCandidate(new org.jivesoftware.smackx.packet.JingleTransport.RawUdp.Candidate(bestRemote)); + return jt; + } + + /** + * Obtain the best common transport candidate obtained in the + * negotiation. + * + * @return the bestRemoteCandidate + */ + public TransportCandidate getBestRemoteCandidate() { + // Hopefully, we only have one validRemoteCandidate + ArrayList cands = getValidRemoteCandidatesList(); + if (!cands.isEmpty()) { + return (TransportCandidate) cands.get(0); + } else { + System.out.println("No Remote Candidate"); + return null; + } + } + + /** + * Return true for fixed candidates. + */ + public boolean acceptableTransportCandidate(TransportCandidate tc) { + return tc instanceof TransportCandidate.Fixed; + } + } + + /** + * Ice transport negotiator. + * + * @author Alvaro Saurin + */ + public static final class Ice extends TransportNegotiator { + + /** + * Default constructor, with a JingleSession and transport manager. + * + * @param js The Jingle session this negotiation belongs to. + * @param res The transport manager to use. + */ + public Ice(JingleSession js, final TransportResolver res) { + super(js, res); + } + + /** + * Get a TransportNegotiator instance. + * + * @param candidate + */ + public org.jivesoftware.smackx.packet.JingleTransport getJingleTransport(TransportCandidate candidate) { + org.jivesoftware.smackx.packet.JingleTransport.Ice jt = new org.jivesoftware.smackx.packet.JingleTransport.Ice(); + jt.addCandidate(new org.jivesoftware.smackx.packet.JingleTransport.Ice.Candidate(candidate)); + return jt; + } + + /** + * Obtain the best remote candidate obtained in the negotiation so far. + * + * @return the bestRemoteCandidate + */ + public TransportCandidate getBestRemoteCandidate() { + TransportCandidate.Ice result = null; + + ArrayList cands = getValidRemoteCandidatesList(); + if (!cands.isEmpty()) { + int lowest = 65560; + TransportCandidate.Ice chose = null; + for (TransportCandidate.Ice transportCandidate : cands) { + System.out.println("Pref: " + transportCandidate.getPreference() + " :" + transportCandidate.getIp()); + if (transportCandidate.getPreference() < lowest) { + chose = transportCandidate; + lowest = transportCandidate.getPreference(); + } + } + result = chose; + } + + return result; + } + + /** + * Return true for ICE candidates. + */ + public boolean acceptableTransportCandidate(TransportCandidate tc) { + + try { + InetAddress.getByName(tc.getIp()).isReachable(3000); + DatagramSocket socket = new DatagramSocket(0); + socket.connect(InetAddress.getByName(tc.getIp()), tc.getPort()); + return true; + } catch (SocketException e) { + e.printStackTrace(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + return false; + } + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportResolver.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportResolver.java new file mode 100644 index 000000000..3a99d8e6e --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportResolver.java @@ -0,0 +1,433 @@ +/** + * $RCSfile$ + * $Revision$ + * $Date$ + * + * Copyright (C) 2002-2006 Jive Software. All rights reserved. + * ==================================================================== + * The Jive Software License (based on Apache Software License, Version 1.1) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by + * Jive Software (http://www.jivesoftware.com)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Smack" and "Jive Software" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please + * contact webmaster@jivesoftware.com. + * + * 5. Products derived from this software may not be called "Smack", + * nor may "Smack" appear in their name, without prior written + * permission of Jive Software. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL JIVE SOFTWARE OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + */ + +package org.jivesoftware.smackx.jingle.nat; + +import org.jivesoftware.smack.XMPPException; + +import java.io.IOException; +import java.net.ServerSocket; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +/** + * A TransportResolver is used for obtaining a list of valid transport + * candidates. A transport candidate is composed by an IP address and a port number. + * It is called candidate, because it can be elected or not. + * + * @author Thiago Camargo + * @author Alvaro Saurin + */ +public abstract class TransportResolver { + + public enum Type { + rawupd, ice + } + + ; + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } + + public Type type = Type.rawupd; + + // the time, in milliseconds, before a check aborts + public static final int CHECK_TIMEOUT = 3000; + + // Listeners for events + private final ArrayList listeners = new ArrayList(); + + // TRue if the resolver is working + private boolean resolving; + + // This will be true when all the transport candidates have been gathered... + private boolean resolved; + + // This indicates that a transport resolver is initialized + private boolean initialized = false; + + // We store a list of candidates internally, just in case there are several + // possibilities. When the user asks for a transport, we return the best + // one. + protected final List candidates = new ArrayList(); + + // Remote candidates that are being checked + private final static ArrayList candidatesChecking = new ArrayList(); + + /** + * Default constructor. + */ + protected TransportResolver() { + super(); + + resolving = false; + resolved = false; + } + + /** + * Initialize the Resolver + */ + public abstract void initialize() throws XMPPException; + + /** + * Start a the resolution. + */ + public abstract void resolve() throws XMPPException; + + /** + * Clear the list of candidates and start a new resolution process. + * + * @throws XMPPException + */ + public void clear() throws XMPPException { + cancel(); + candidates.clear(); + //resolve(); + } + + /** + * Cancel any asynchronous resolution operation. + */ + public abstract void cancel() throws XMPPException; + + /** + * Return true if the resolver is working. + * + * @return true if the resolver is working. + */ + public boolean isResolving() { + return resolving; + } + + /** + * Return true if the resolver has finished the search for transport + * candidates. + * + * @return true if the search has finished + */ + public boolean isResolved() { + return resolved; + } + + /** + * Set the Transport Resolver as initialized. + */ + public synchronized void setInitialized() { + initialized = true; + } + + /** + * Chack if the Transport Resolver is initialized + * + * @return + */ + public synchronized boolean isInitialized() { + return initialized; + } + + /** + * Indicate the beggining of the resolution process. This method must be + * used by subclasses at the begining of their resolve() method. + */ + protected synchronized void setResolveInit() { + resolved = false; + resolving = true; + + triggerResolveInit(); + } + + /** + * Indicate the end of the resolution process. This method must be used by + * subclasses at the begining of their resolve() method. + */ + protected synchronized void setResolveEnd() { + resolved = true; + resolving = false; + + triggerResolveEnd(); + } + + // Listeners management + + /** + * Add a transport resolver listener. + * + * @param li The transport resolver listener to be added. + */ + public void addListener(TransportResolverListener li) { + synchronized (listeners) { + listeners.add(li); + } + } + + /** + * Removes a transport resolver listener. + * + * @param li The transport resolver listener to be removed + */ + public void removeListener(TransportResolverListener li) { + synchronized (listeners) { + listeners.remove(li); + } + } + + /** + * Get the list of listeners + * + * @return the list of listeners + */ + public ArrayList getListenersList() { + synchronized (listeners) { + return new ArrayList(listeners); + } + } + + /** + * Trigger a new candidate added event. + * + * @param cand The candidate added to the list of candidates. + */ + protected void triggerCandidateAdded(TransportCandidate cand) { + Iterator iter = getListenersList().iterator(); + while (iter.hasNext()) { + TransportResolverListener trl = (TransportResolverListener) iter.next(); + if (trl instanceof TransportResolverListener.Resolver) { + TransportResolverListener.Resolver li = (TransportResolverListener.Resolver) trl; + System.out.println("triggerCandidateAdded : " + cand.getLocalIp()); + li.candidateAdded(cand); + } + } + } + + /** + * Trigger a event notifying the initialization of the resolution process. + */ + private void triggerResolveInit() { + Iterator iter = getListenersList().iterator(); + while (iter.hasNext()) { + TransportResolverListener trl = (TransportResolverListener) iter.next(); + if (trl instanceof TransportResolverListener.Resolver) { + TransportResolverListener.Resolver li = (TransportResolverListener.Resolver) trl; + li.init(); + } + } + } + + /** + * Trigger a event notifying the obtention of all the candidates. + */ + private void triggerResolveEnd() { + Iterator iter = getListenersList().iterator(); + while (iter.hasNext()) { + TransportResolverListener trl = (TransportResolverListener) iter.next(); + if (trl instanceof TransportResolverListener.Resolver) { + TransportResolverListener.Resolver li = (TransportResolverListener.Resolver) trl; + li.end(); + } + } + } + + // Candidates management + + /** + * Clear the list of candidate + */ + protected void clearCandidates() { + synchronized (candidates) { + candidates.clear(); + } + } + + /** + * Add a new transport candidate + * + * @param cand The candidate to add + */ + protected void addCandidate(TransportCandidate cand) { + synchronized (candidates) { + if (!candidates.contains(cand)) + candidates.add(cand); + } + + // Notify the listeners + triggerCandidateAdded(cand); + } + + /** + * Get an iterator for the list of candidates + * + * @return an iterator + */ + public Iterator getCandidates() { + synchronized (candidates) { + System.out.println("CNUM: " + candidates.size()); + return Collections.unmodifiableList(new ArrayList(candidates)).iterator(); + } + } + + /** + * Get the candididate with the highest preference. + * + * @return The best candidate, according to the preference order. + */ + public TransportCandidate getPreferredCandidate() { + TransportCandidate result = null; + + ArrayList cands = (ArrayList) getCandidatesList(); + if (cands.size() > 0) { + Collections.sort(cands); + // Return the last candidate + result = (TransportCandidate) cands.get(cands.size() - 1); + System.out.println("Result: " + result.getIp()); + } + + return result; + } + + /** + * Get the numer of transport candidates. + * + * @return The length of the transport candidates list. + */ + public int getCandidateCount() { + synchronized (candidates) { + return candidates.size(); + } + } + + /** + * Get the list of candidates + * + * @return the list of transport candidates + */ + public List getCandidatesList() { + ArrayList result = null; + + synchronized (candidates) { + result = new ArrayList(candidates); + } + + return result; + } + + /** + * Get the n-th candidate + * + * @return a transport candidate + */ + public TransportCandidate getCandidate(int i) { + TransportCandidate cand; + + synchronized (candidates) { + cand = (TransportCandidate) candidates.get(i); + } + return cand; + } + + /** + * Initialize Transport Resolver and wait until it is complete unitialized. + */ + public void initializeAndWait() throws XMPPException { + this.initialize(); + try { + System.out.print("Initializing..."); + while (!this.isInitialized()) { + System.out.print("."); + Thread.sleep(1000); + } + System.out.print("Resolved\n"); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Obtain a free port we can use. + * + * @return A free port number. + */ + protected int getFreePort() { + ServerSocket ss; + int freePort = 0; + + for (int i = 0; i < 10; i++) { + freePort = (int) (10000 + Math.round(Math.random() * 10000)); + freePort = freePort % 2 == 0 ? freePort : freePort + 1; + try { + ss = new ServerSocket(freePort); + freePort = ss.getLocalPort(); + ss.close(); + return freePort; + } + catch (IOException e) { + e.printStackTrace(); + } + } + try { + ss = new ServerSocket(0); + freePort = ss.getLocalPort(); + ss.close(); + } + catch (IOException e) { + e.printStackTrace(); + } + return freePort; + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportResolverListener.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportResolverListener.java new file mode 100644 index 000000000..d75ca7a69 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportResolverListener.java @@ -0,0 +1,48 @@ +package org.jivesoftware.smackx.jingle.nat; + +/** + * Transport resolver Interface + */ +public abstract interface TransportResolverListener { + /** + * Resolver listener. + */ + public interface Resolver extends TransportResolverListener { + /** + * The resolution process has been started. + */ + public void init(); + + /** + * A transport candidate has been added + * + * @param cand The transport candidate. + */ + public void candidateAdded(TransportCandidate cand); + + /** + * All the transport candidates have been obtained. + */ + public void end(); + } + + /** + * Resolver checker. + */ + public interface Checker extends TransportResolverListener { + /** + * A transport candidate has been checked. + * + * @param cand The transport candidate that has been checked. + * @param result True if the candidate is usable. + */ + public void candidateChecked(TransportCandidate cand, boolean result); + + /** + * A transport candidate is being checked. + * + * @param cand The transport candidate that is being checked. + */ + public void candidateChecking(TransportCandidate cand); + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/package.html b/jingle/extension/source/org/jivesoftware/smackx/package.html new file mode 100644 index 000000000..d574a2a4d --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/package.html @@ -0,0 +1 @@ +Smack extensions API. \ No newline at end of file diff --git a/jingle/extension/source/org/jivesoftware/smackx/packet/Jingle.java b/jingle/extension/source/org/jivesoftware/smackx/packet/Jingle.java new file mode 100644 index 000000000..63280d9bf --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/packet/Jingle.java @@ -0,0 +1,504 @@ +/** + * $RCSfile$ + * $Revision: 2407 $ + * $Date: 2004-11-02 23:37:00 +0000 (Tue, 02 Nov 2004) $ + * + * Copyright 2003-2004 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jivesoftware.smackx.packet; + +import org.jivesoftware.smack.packet.IQ; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +/** + * An Jingle sub-packet, which is used by XMPP clients to exchange info like + * descriptions and transports.

The following link summarizes the + * requirements of Jingle IM: Valid tags. + *

+ *

Warning: this is an non-standard protocol documented by JEP-166. Because this is + * a non-standard protocol, it is subject to change. + * + * @author Alvaro Saurin + */ +public class Jingle extends IQ { + + // static + + public static final String NAMESPACE = "http://jabber.org/protocol/jingle"; + + public static final String NODENAME = "jingle"; + + // non-static + + private String sid; // The session id + + private Action action; // The action associated to the Jingle + + private String initiator; // The initiator as a "user@host/resource" + + private String responder; // The responder + + // Sub-elements of a Jingle object. + + private final List descriptions = new ArrayList(); + + private final List transports = new ArrayList(); + + private JingleContentInfo contentInfo; + + /** + * A constructor where the main components can be initialized. + */ + public Jingle(final List descs, final List trans, final JingleContentInfo mi, + final String sid) { + super(); + + if (descs != null) { + descriptions.addAll(descs); + } + + if (trans != null) { + transports.addAll(trans); + } + + setContentInfo(mi); + setSid(sid); + + // Set null all other fields in the packet + initiator = null; + responder = null; + action = null; + } + + /** + * Constructor with a description. + * + * @param descr a description + */ + public Jingle(final JingleContentDescription descr) { + super(); + + addDescription(descr); + + // Set null all other fields in the packet + initiator = null; + responder = null; + + // Some default values for the most common situation... + action = Jingle.Action.DESCRIPTIONINFO; + this.setType(IQ.Type.SET); + } + + /** + * Constructor with a transport. + * + * @param trans a transport + */ + public Jingle(final JingleTransport trans) { + super(); + + addTransport(trans); + + // Set null all other fields in the packet + initiator = null; + responder = null; + + // Some default values for the most common situation... + action = Jingle.Action.TRANSPORTINFO; + this.setType(IQ.Type.SET); + } + + /** + * Constructor with a content info. + * + * @param info The content info + */ + public Jingle(final JingleContentInfo info) { + super(); + + setContentInfo(info); + + // Set null all other fields in the packet + initiator = null; + responder = null; + + // Some default values for the most common situation... + action = Jingle.Action.DESCRIPTIONINFO; + this.setType(IQ.Type.SET); + } + + /** + * A constructor where the action can be specified. + * + * @param action The action. + */ + public Jingle(final Jingle.Action action) { + this(null, null, null, null); + this.action = action; + + // In general, a Jingle with an action is used in a SET packet... + this.setType(IQ.Type.SET); + } + + /** + * A constructor where the session ID can be specified. + * + * @param sid The session ID related to the negotiation. + * @see #setSid(String) + */ + public Jingle(final String sid) { + this(null, null, null, sid); + } + + /** + * The default constructor + */ + public Jingle() { + super(); + } + + /** + * Set the session ID related to this session. The session ID is a unique + * identifier generated by the initiator. This should match the XML Nmtoken + * production so that XML character escaping is not needed for characters + * such as &. + * + * @param sid the session ID + */ + public final void setSid(final String sid) { + this.sid = sid; + } + + /** + * Returns the session ID related to the session. The session ID is a unique + * identifier generated by the initiator. This should match the XML Nmtoken + * production so that XML character escaping is not needed for characters + * such as &. + * + * @return Returns the session ID related to the session. + * @see #setSid(String) + */ + public String getSid() { + + return sid; + } + + /** + * Returns the XML element name of the extension sub-packet root element. + * Always returns "jingle" + * + * @return the XML element name of the packet extension. + */ + public static String getElementName() { + return NODENAME; + } + + /** + * Returns the XML namespace of the extension sub-packet root element. + * According the specification the namespace is always + * "http://jabber.org/protocol/jingle" + * + * @return the XML namespace of the packet extension. + */ + public static String getNamespace() { + return NAMESPACE; + } + + /** + * @return the audioInfo + */ + public JingleContentInfo getContentInfo() { + return contentInfo; + } + + /** + * @param contentInfo the audioInfo to set + */ + public void setContentInfo(final JingleContentInfo contentInfo) { + this.contentInfo = contentInfo; + } + + /** + * Get an iterator for the content descriptions + * + * @return the descriptions + */ + public Iterator getDescriptions() { + synchronized (descriptions) { + return Collections.unmodifiableList(new ArrayList(descriptions)).iterator(); + } + } + + /** + * Get an iterator for the content descriptions + * + * @return the descriptions + */ + public ArrayList getDescriptionsList() { + synchronized (descriptions) { + return new ArrayList(descriptions); + } + } + + /** + * Add a new content description. + * + * @param desc the descriptions to add + */ + public void addDescription(final JingleContentDescription desc) { + if (desc != null) { + synchronized (descriptions) { + descriptions.add(desc); + } + } + } + + /** + * Add a list of JingleContentDescription elements + * + * @param descsList the list of transports to add + */ + public void addDescriptions(final List descsList) { + if (descsList != null) { + synchronized (descriptions) { + descriptions.addAll(descsList); + } + } + } + + /** + * Get an iterator for the transport. + * + * @return the transports + */ + public Iterator getTransports() { + synchronized (transports) { + return Collections.unmodifiableList(new ArrayList(transports)).iterator(); + } + } + + /** + * Get the list of transports. + * + * @return the transports list. + */ + public ArrayList getTransportsList() { + synchronized (transports) { + return new ArrayList(transports); + } + } + + /** + * Add a new TransportNegotiator element + * + * @param trans the transports to add + */ + public void addTransport(final JingleTransport trans) { + if (trans != null) { + synchronized (transports) { + transports.add(trans); + } + } + } + + /** + * Add a list of TransportNegotiator elements + * + * @param transList the list of transports to add + */ + public void addTransports(final List transList) { + if (transList != null) { + synchronized (transports) { + transports.addAll(transList); + } + } + } + + /** + * Get the action specified in the packet + * + * @return the action + */ + public Action getAction() { + return action; + } + + /** + * Set the action in the packet + * + * @param action the action to set + */ + public void setAction(final Action action) { + this.action = action; + } + + /** + * Get the initiator. The initiator will be the full JID of the entity that + * has initiated the flow (which may be different to the "from" address in + * the IQ) + * + * @return the initiator + */ + public String getInitiator() { + return initiator; + } + + /** + * Set the initiator. The initiator must be the full JID of the entity that + * has initiated the flow (which may be different to the "from" address in + * the IQ) + * + * @param initiator the initiator to set + */ + public void setInitiator(final String initiator) { + this.initiator = initiator; + } + + /** + * Get the responder. The responder is the full JID of the entity that has + * replied to the initiation (which may be different to the "to" addresss in + * the IQ). + * + * @return the responder + */ + public String getResponder() { + return responder; + } + + /** + * Set the responder. The responder must be the full JID of the entity that + * has replied to the initiation (which may be different to the "to" + * addresss in the IQ). + * + * @param resp the responder to set + */ + public void setResponder(final String resp) { + responder = resp; + } + + /** + * Get a hash key for the session this packet belongs to. + * + * @param sid The session id + * @param initiator The initiator + * @return A hash key + */ + public static int getSessionHash(final String sid, final String initiator) { + final int PRIME = 31; + int result = 1; + result = PRIME * result + (initiator == null ? 0 : initiator.hashCode()); + result = PRIME * result + (sid == null ? 0 : sid.hashCode()); + return result; + } + + /** + * Return the XML representation of the packet. + * + * @return the XML string + */ + public String getChildElementXML() { + StringBuilder buf = new StringBuilder(); + + buf.append("<").append(getElementName()); + buf.append(" xmlns=\"").append(getNamespace()).append("\""); + if (getInitiator() != null) { + buf.append(" initiator=\"").append(getInitiator()).append("\""); + } + if (getResponder() != null) { + buf.append(" responder=\"").append(getResponder()).append("\""); + } + if (getAction() != null) { + buf.append(" action=\"").append(getAction()).append("\""); + } + if (getSid() != null) { + buf.append(" sid=\"").append(getSid()).append("\""); + } + buf.append(">"); + //TODO Update to accept more than one content per session (XEP-0166) + + buf.append(""); + // Look for possible payload types, and dump them. + synchronized (descriptions) { + for (int i = 0; i < descriptions.size(); i++) { + JingleContentDescription desc = (JingleContentDescription) descriptions + .get(i); + buf.append(desc.toXML()); + } + } + + // If the packet has transports, dump them. + synchronized (transports) { + for (int i = 0; i < transports.size(); i++) { + JingleTransport trans = (JingleTransport) transports.get(i); + buf.append(trans.toXML()); + } + } + buf.append(""); + + // and the same for audio jmf info + if (contentInfo != null) { + buf.append(contentInfo.toXML()); + } + + buf.append(""); + return buf.toString(); + } + + /** + * The "action" in the jingle packet, as an enum. + */ + public static enum Action { + + CONTENTACCEPT, CONTENTADD, CONTENTDECLINE, CONTENTMODIFY, + CONTENTREMOVE, DESCRIPTIONADD, DESCRIPTIONDECLINE, + DESCRIPTIONINFO, DESCRIPTIONMODIFY, SESSIONACCEPT, + SESSIONINFO, SESSIONINITIATE, SESSIONREDIRECT, + SESSIONTERMINATE, TRANSPORTACCEPT, TRANSPORTDECLINE, + TRANSPORTINFO, TRANSPORTMODIFY; + + private static String names[] = {"content-accept", "content-add", "content-decline", "content-modify", + "content-remove", "description-accept", "description-decline", "description-info", + "description-modify", "session-accept", "session-info", "session-initiate", + "session-redirect", "session-terminate", "transport-accept", "transport-decline", + "transport-info", "transport-modify"}; + + /** + * Returns the String value for an Action. + */ + + public String toString() { + return names[this.ordinal()]; + } + + /** + * Returns the Action for a String value. + */ + public static Action getAction(String str) { + for (int i = 0; i < names.length; i++) { + if (names[i].equals(str)) return Action.values()[i]; + } + return null; + } + + } + +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/packet/JingleContentDescription.java b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleContentDescription.java new file mode 100644 index 000000000..c82df9017 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleContentDescription.java @@ -0,0 +1,278 @@ +package org.jivesoftware.smackx.packet; + +import org.jivesoftware.smack.packet.PacketExtension; +import org.jivesoftware.smackx.jingle.media.PayloadType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +/** + * Jingle content description. + * + * @author Alvaro Saurin + */ +public abstract class JingleContentDescription implements PacketExtension { + + // static + + public static final String NODENAME = "description"; + + // non-static + + private final List payloads = new ArrayList(); + + /** + * Creates a content description.. + */ + public JingleContentDescription() { + super(); + } + + /** + * Returns the XML element name of the element. + * + * @return the XML element name of the element. + */ + public String getElementName() { + return NODENAME; + } + + /** + * Return the namespace. + * + * @return The namespace + */ + public abstract String getNamespace(); + + /** + * Adds a audio payload type to the packet. + * + * @param pt the audio payload type to add. + */ + public void addJinglePayloadType(final JinglePayloadType pt) { + synchronized (payloads) { + payloads.add(pt); + } + } + + /** + * Adds a list of payloads to the packet. + * + * @param pts the payloads to add. + */ + public void addAudioPayloadTypes(final List pts) { + synchronized (payloads) { + Iterator ptIter = pts.iterator(); + while (ptIter.hasNext()) { + PayloadType.Audio pt = (PayloadType.Audio) ptIter.next(); + addJinglePayloadType(new JinglePayloadType.Audio(pt)); + } + } + } + + /** + * Returns an Iterator for the audio payloads in the packet. + * + * @return an Iterator for the audio payloads in the packet. + */ + public Iterator getJinglePayloadTypes() { + return Collections.unmodifiableList(getJinglePayloadTypesList()).iterator(); + } + + /** + * Returns a list for the audio payloads in the packet. + * + * @return a list for the audio payloads in the packet. + */ + public ArrayList getJinglePayloadTypesList() { + synchronized (payloads) { + return new ArrayList(payloads); + } + } + + /** + * Return the list of Payload types contained in the description. + * + * @return a list of PayloadType.Audio + */ + public ArrayList getAudioPayloadTypesList() { + ArrayList result = new ArrayList(); + Iterator jinglePtsIter = getJinglePayloadTypes(); + + while (jinglePtsIter.hasNext()) { + JinglePayloadType jpt = (JinglePayloadType) jinglePtsIter.next(); + if (jpt instanceof JinglePayloadType.Audio) { + JinglePayloadType.Audio jpta = (JinglePayloadType.Audio) jpt; + result.add(jpta.getPayloadType()); + } + } + + return result; + } + + /** + * Returns a count of the audio payloads in the Jingle packet. + * + * @return the number of audio payloads in the Jingle packet. + */ + public int getJinglePayloadTypesCount() { + synchronized (payloads) { + return payloads.size(); + } + } + + /** + * Convert a Jingle description to XML. + * + * @return a string with the XML representation + */ + public String toXML() { + StringBuilder buf = new StringBuilder(); + + synchronized (payloads) { + if (payloads.size() > 0) { + buf.append("<").append(getElementName()); + buf.append(" xmlns=\"").append(getNamespace()).append("\" >"); + + Iterator pt = payloads.listIterator(); + while (pt.hasNext()) { + JinglePayloadType pte = (JinglePayloadType) pt.next(); + buf.append(pte.toXML()); + } + buf.append(""); + } + } + + return buf.toString(); + } + + /** + * Jingle audio description + */ + public static class Audio extends JingleContentDescription { + + public static final String NAMESPACE = "http://jabber.org/protocol/jingle/description/audio"; + + public Audio() { + super(); + } + + /** + * Utility constructor, with a JinglePayloadType + */ + public Audio(final JinglePayloadType pt) { + super(); + addJinglePayloadType(pt); + } + + public String getNamespace() { + return NAMESPACE; + } + } + + /** + * A payload type, contained in a descriptor. + * + * @author Alvaro Saurin + */ + public static class JinglePayloadType { + + public static final String NODENAME = "payload-type"; + + private PayloadType payload; + + /** + * Create a payload type. + * + * @param payload the payload + */ + public JinglePayloadType(final PayloadType payload) { + super(); + this.payload = payload; + } + + /** + * Create an empty payload type. + */ + public JinglePayloadType() { + this(null); + } + + /** + * Returns the XML element name of the element. + * + * @return the XML element name of the element. + */ + public static String getElementName() { + return NODENAME; + } + + /** + * Get the payload represented. + * + * @return the payload + */ + public PayloadType getPayloadType() { + return payload; + } + + /** + * Set the payload represented. + * + * @param payload the payload to set + */ + public void setPayload(final PayloadType payload) { + this.payload = payload; + } + + protected String getChildAttributes() { + return null; + } + + public String toXML() { + StringBuilder buf = new StringBuilder(); + + if (payload != null) { + buf.append("<").append(getElementName()).append(" "); + + // We covert here the payload type to XML + if (payload.getId() != PayloadType.INVALID_PT) { + buf.append(" id=\"").append(payload.getId()).append("\""); + } + if (payload.getName() != null) { + buf.append(" name=\"").append(payload.getName()).append("\""); + } + if (payload.getChannels() != 0) { + buf.append(" channels=\"").append(payload.getChannels()).append("\""); + } + if (getChildAttributes() != null) { + buf.append(getChildAttributes()); + } + buf.append("/>"); + } + return buf.toString(); + } + + /** + * Audio payload type element + */ + public static class Audio extends JinglePayloadType { + public Audio(final PayloadType.Audio audio) { + super(audio); + } + + protected String getChildAttributes() { + StringBuilder buf = new StringBuilder(); + PayloadType pt = getPayloadType(); + if (pt instanceof PayloadType.Audio) { + PayloadType.Audio pta = (PayloadType.Audio) pt; + + buf.append(" clockrate=\"").append(pta.getClockRate()).append("\" "); + } + return buf.toString(); + } + } + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/packet/JingleContentInfo.java b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleContentInfo.java new file mode 100644 index 000000000..66604f2b7 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleContentInfo.java @@ -0,0 +1,138 @@ +package org.jivesoftware.smackx.packet; + +import org.jivesoftware.smack.packet.PacketExtension; +import org.jivesoftware.smackx.jingle.media.ContentInfo; + +/** + * Jingle content info + * + * @author Alvaro Saurin + */ +public class JingleContentInfo implements PacketExtension { + + protected ContentInfo mediaInfoElement; + + private String namespace; + + /** + * Empty constructor, with no jmf info. + */ + public JingleContentInfo() { + this(null); + } + + /** + * Constructor with a jmf info + * + * @param mediaInfoElement MediaInfo element + */ + public JingleContentInfo(final ContentInfo mediaInfoElement) { + super(); + this.mediaInfoElement = mediaInfoElement; + } + + /** + * Get the jmf info element. + * + * @return the mediaInfoElement + */ + public ContentInfo getMediaInfo() { + return mediaInfoElement; + } + + /** + * Get the element name + */ + public String getElementName() { + // Media info is supposed to be just a single-word command... + return getMediaInfo().toString(); + } + + /** + * Set the name space. + * + * @param ns the namespace + */ + protected void setNamespace(final String ns) { + namespace = ns; + } + + /** + * Get the publilc namespace + */ + public String getNamespace() { + return namespace; + } + + public String toXML() { + StringBuilder buf = new StringBuilder(); + buf.append("<").append(getElementName()).append(" xmlns=\""); + buf.append(getNamespace()).append("\" "); + buf.append("/>"); + return buf.toString(); + } + + /** + * Transport part of a Jingle packet. + */ + public static class Audio extends JingleContentInfo { + + public static final String NAMESPACE = "http://jabber.org/protocol/jingle/info/audio"; + + public Audio(final ContentInfo mi) { + super(mi); + setNamespace(NAMESPACE); + } + + public String getNamespace() { + return NAMESPACE; + } + + // Subclasses: specialize the Audio jmf info... + + /** + * Busy jmf info. + */ + public static class Busy extends Audio { + public Busy() { + super(ContentInfo.Audio.BUSY); + } + } + + /** + * Hold jmf info. + */ + public static class Hold extends Audio { + public Hold() { + super(ContentInfo.Audio.HOLD); + } + } + + /** + * Mute jmf info. + */ + public static class Mute extends Audio { + public Mute() { + super(ContentInfo.Audio.MUTE); + } + } + + /** + * Queued jmf info. + */ + public static class Queued extends Audio { + public Queued() { + super(ContentInfo.Audio.QUEUED); + } + } + + /** + * Ringing jmf info. + */ + public static class Ringing extends Audio { + public Ringing() { + super(ContentInfo.Audio.RINGING); + } + } + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/packet/JingleError.java b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleError.java new file mode 100644 index 000000000..3d9d37e88 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleError.java @@ -0,0 +1,102 @@ +package org.jivesoftware.smackx.packet; + +import org.jivesoftware.smack.packet.PacketExtension; + +public class JingleError implements PacketExtension { + + public static String NAMESPACE = "http://jabber.org/protocol/jingle#error"; + + public static final JingleError OUT_OF_ORDER = new JingleError("out-of-order"); + + public static final JingleError UNKNOWN_SESSION = new JingleError("unknown-session"); + + public static final JingleError UNSUPPORTED_CONTENT = new JingleError( + "unsupported-content"); + + public static final JingleError UNSUPPORTED_TRANSPORTS = new JingleError( + "unsupported-transports"); + + // Non standard error messages + + public static final JingleError NO_COMMON_PAYLOAD = new JingleError( + "no-common-payload"); + + public static final JingleError NEGOTIATION_ERROR = new JingleError( + "negotiation-error"); + + public static final JingleError MALFORMED_STANZA = new JingleError("malformed-stanza"); + + private String message; + + /** + * Creates a new error with the specified code and message. + * + * @param message a message describing the error. + */ + public JingleError(final String message) { + this.message = message; + } + + /** + * Returns the message describing the error, or null if there is no message. + * + * @return the message describing the error, or null if there is no message. + */ + public String getMessage() { + return message; + } + + /** + * Returns the error as XML. + * + * @return the error as XML. + */ + public String toXML() { + StringBuilder buf = new StringBuilder(); + if (message != null) { + buf.append(""); + buf.append("<").append(message).append(" xmlns=\"").append(NAMESPACE).append( + "\"/>"); + buf.append(""); + } + return buf.toString(); + } + + /** + * Returns a Action instance associated with the String value. + */ + public static JingleError fromString(String value) { + if (value != null) { + value = value.toLowerCase(); + if (value.equals("out-of-order")) { + return OUT_OF_ORDER; + } else if (value.equals("unknown-session")) { + return UNKNOWN_SESSION; + } else if (value.equals("unsupported-content")) { + return UNSUPPORTED_CONTENT; + } else if (value.equals("unsupported-transports")) { + return UNSUPPORTED_TRANSPORTS; + } else if (value.equals("no-common-payload")) { + return NO_COMMON_PAYLOAD; + } else if (value.equals("negotiation-error")) { + return NEGOTIATION_ERROR; + } else if (value.equals("malformed-stanza")) { + return MALFORMED_STANZA; + } + + } + return null; + } + + public String toString() { + return getMessage(); + } + + public String getElementName() { + return message; + } + + public String getNamespace() { + return NAMESPACE; + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/packet/JingleTransport.java b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleTransport.java new file mode 100644 index 000000000..6e0c6c520 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleTransport.java @@ -0,0 +1,409 @@ +package org.jivesoftware.smackx.packet; + +import org.jivesoftware.smack.packet.PacketExtension; +import org.jivesoftware.smackx.jingle.nat.TransportCandidate; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +/** + * A jingle transport extension + * + * @author Alvaro Saurin + */ +public class JingleTransport implements PacketExtension { + + // static + + public static final String NODENAME = "transport"; + + // non-static + + protected String namespace; + + protected final List candidates = new ArrayList(); + + /** + * Default constructor. + */ + public JingleTransport() { + super(); + } + + /** + * Utility constructor, with a transport candidate element. + * + * @param candidate A transport candidate element to add. + */ + public JingleTransport(final JingleTransportCandidate candidate) { + super(); + addCandidate(candidate); + } + + /** + * Copy constructor. + * + * @param tr the other jingle transport. + */ + public JingleTransport(final JingleTransport tr) { + if (tr != null) { + namespace = tr.namespace; + + if (tr.candidates.size() > 0) { + candidates.addAll(tr.candidates); + } + } + } + + /** + * Adds a transport candidate. + * + * @param candidate the candidate + */ + public void addCandidate(final JingleTransportCandidate candidate) { + if (candidate != null) { + synchronized (candidates) { + candidates.add(candidate); + } + } + } + + /** + * Get an iterator for the candidates + * + * @return an iterator + */ + public Iterator getCandidates() { + return Collections.unmodifiableList(getCandidatesList()).iterator(); + } + + /** + * Get the list of candidates. + * + * @return The candidates list. + */ + public ArrayList getCandidatesList() { + ArrayList res = null; + synchronized (candidates) { + res = new ArrayList(candidates); + } + return res; + } + + /** + * Get the number of transport candidates. + * + * @return The number of transport candidates contained. + */ + public int getCandidatesCount() { + return getCandidatesList().size(); + } + + /** + * Returns the XML element name of the element. + * + * @return the XML element name of the element. + */ + public String getElementName() { + return NODENAME; + } + + /** + * Set the namespace. + * + * @param ns The namespace + */ + protected void setNamespace(final String ns) { + namespace = ns; + } + + /** + * Get the namespace. + * + * @return The namespace + */ + public String getNamespace() { + return namespace; + } + + /** + * Return the XML representation for this element. + */ + public String toXML() { + StringBuilder buf = new StringBuilder(); + + buf.append("<").append(getElementName()).append(" xmlns=\""); + buf.append(getNamespace()).append("\" "); + + synchronized (candidates) { + if (getCandidatesCount() > 0) { + buf.append(">"); + Iterator iter = getCandidates(); + + while (iter.hasNext()) { + JingleTransportCandidate candidate = (JingleTransportCandidate) iter + .next(); + buf.append(candidate.toXML()); + } + buf.append(""); + } else { + buf.append("/>"); + } + } + + return buf.toString(); + } + + /** + * Candidate element in the transport. This class acts as a view of the + * "TransportCandidate" in the Jingle space. + * + * @author Alvaro Saurin + * @see TransportCandidate + */ + public static abstract class JingleTransportCandidate { + + public static final String NODENAME = "candidate"; + + // The transport candidate contained in the element. + protected TransportCandidate transportCandidate; + + /** + * Creates a new TransportNegotiator child. + */ + public JingleTransportCandidate() { + super(); + } + + /** + * Creates a new TransportNegotiator child. + * + * @param candidate the jmf transport candidate + */ + public JingleTransportCandidate(final TransportCandidate candidate) { + super(); + setMediaTransport(candidate); + } + + /** + * Returns the XML element name of the element. + * + * @return the XML element name of the element. + */ + public static String getElementName() { + return NODENAME; + } + + /** + * Get the current transportElement candidate. + * + * @return the transportElement candidate + */ + public TransportCandidate getMediaTransport() { + return transportCandidate; + } + + /** + * Set the transportElement candidate. + * + * @param cand the transportElement candidate + */ + public void setMediaTransport(final TransportCandidate cand) { + if (cand != null) { + transportCandidate = cand; + } + } + + /** + * Get the list of attributes. + * + * @return a string with the list of attributes. + */ + protected String getChildElements() { + return null; + } + + /** + * Obtain a valid XML representation of a trancport candidate + * + * @return A string containing the XML dump of the transport candidate. + */ + public String toXML() { + StringBuilder buf = new StringBuilder(); + String childElements = getChildElements(); + + if (transportCandidate != null && childElements != null) { + buf.append("<").append(getElementName()).append(" "); + buf.append(childElements); + buf.append("/>"); + } + + return buf.toString(); + } + } + + // Subclasses + + /** + * RTP-ICE profile + */ + public static class Ice extends JingleTransport { + public static final String NAMESPACE = "http://jabber.org/protocol/jingle/transport/ice"; + + public Ice() { + super(); + setNamespace(NAMESPACE); + } + + /** + * Add a transport candidate + * + * @see org.jivesoftware.smackx.packet.JingleTransport#addCandidate(org.jivesoftware.smackx.packet.JingleTransport.JingleTransportCandidate) + */ + public void addCandidate(final JingleTransportCandidate candidate) { + super.addCandidate(candidate); + } + + /** + * Get the list of candidates. As a "raw-udp" transport can only contain + * one candidate, we use the first in the list... + * + * @see org.jivesoftware.smackx.packet.JingleTransport#getCandidates() + */ + public ArrayList getCandidatesList() { + ArrayList copy = new ArrayList(); + ArrayList superCandidatesList = super.getCandidatesList(); + for (int i = 0; i < superCandidatesList.size(); i++) { + copy.add(superCandidatesList.get(i)); + } + + return copy; + } + + public static class Candidate extends JingleTransportCandidate { + /** + * Default constructor + */ + public Candidate() { + super(); + } + + /** + * Constructor with a transport candidate. + */ + public Candidate(final TransportCandidate tc) { + super(tc); + } + + /** + * Get the elements of this candidate. + */ + protected String getChildElements() { + StringBuilder buf = new StringBuilder(); + + if (transportCandidate != null) {// && transportCandidate instanceof TransportCandidate.Ice) { + TransportCandidate.Ice tci = (TransportCandidate.Ice) transportCandidate; + + // We convert the transportElement candidate to XML here... + buf.append(" generation=\"").append(tci.getGeneration()).append("\""); + buf.append(" ip=\"").append(tci.getIp()).append("\""); + buf.append(" port=\"").append(tci.getPort()).append("\""); + buf.append(" network=\"").append(tci.getNetwork()).append("\""); + buf.append(" username=\"").append(tci.getUsername()).append("\""); + buf.append(" password=\"").append(tci.getPassword()).append("\""); + buf.append(" preference=\"").append(tci.getPreference()).append("\""); + + // Optional elements + if (transportCandidate.getName() != null) { + buf.append(" name=\"").append(tci.getName()).append("\""); + } + } + + return buf.toString(); + } + + } + } + + /** + * Raw UDP profile. + */ + public static class RawUdp extends JingleTransport { + public static final String NAMESPACE = "http://jabber.org/protocol/jingle/transport/raw-udp"; + + public RawUdp() { + super(); + setNamespace(NAMESPACE); + } + + /** + * Add a transport candidate + * + * @see org.jivesoftware.smackx.packet.JingleTransport#addCandidate(org.jivesoftware.smackx.packet.JingleTransport.JingleTransportCandidate) + */ + public void addCandidate(final JingleTransportCandidate candidate) { + candidates.clear(); + super.addCandidate(candidate); + } + + /** + * Get the list of candidates. As a "raw-udp" transport can only contain + * one candidate, we use the first in the list... + * + * @see org.jivesoftware.smackx.packet.JingleTransport#getCandidates() + */ + public ArrayList getCandidatesList() { + ArrayList copy = new ArrayList(); + ArrayList superCandidatesList = super.getCandidatesList(); + if (superCandidatesList.size() > 0) { + copy.add(superCandidatesList.get(0)); + } + + return copy; + } + + /** + * Raw-udp transport candidate. + */ + public static class Candidate extends JingleTransportCandidate { + /** + * Default constructor + */ + public Candidate() { + super(); + } + + /** + * Constructor with a transport candidate. + */ + public Candidate(final TransportCandidate tc) { + super(tc); + } + + /** + * Get the elements of this candidate. + */ + protected String getChildElements() { + StringBuilder buf = new StringBuilder(); + + if (transportCandidate != null && transportCandidate instanceof TransportCandidate.Fixed) { + TransportCandidate.Fixed tcf = (TransportCandidate.Fixed) transportCandidate; + + buf.append(" generation=\"").append(tcf.getGeneration()).append("\""); + buf.append(" ip=\"").append(tcf.getIp()).append("\""); + buf.append(" port=\"").append(tcf.getPort()).append("\""); + + // Optional parameters + String name = tcf.getName(); + if (name != null) { + buf.append(" name=\"").append(name).append("\""); + } + } + return buf.toString(); + } + + } + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/packet/package.html b/jingle/extension/source/org/jivesoftware/smackx/packet/package.html new file mode 100644 index 000000000..490d1d72d --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/packet/package.html @@ -0,0 +1 @@ +XML packets that are part of the XMPP extension protocols. \ No newline at end of file diff --git a/jingle/extension/source/org/jivesoftware/smackx/provider/JingleContentDescriptionProvider.java b/jingle/extension/source/org/jivesoftware/smackx/provider/JingleContentDescriptionProvider.java new file mode 100644 index 000000000..6a0d4a174 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/provider/JingleContentDescriptionProvider.java @@ -0,0 +1,125 @@ +package org.jivesoftware.smackx.provider; + +import org.jivesoftware.smack.packet.PacketExtension; +import org.jivesoftware.smack.provider.PacketExtensionProvider; +import org.jivesoftware.smackx.jingle.media.PayloadType; +import org.jivesoftware.smackx.packet.JingleContentDescription; +import org.jivesoftware.smackx.packet.JingleContentDescription.JinglePayloadType; +import org.xmlpull.v1.XmlPullParser; + +/** + * Parser for a Jingle description + * + * @author Alvaro Saurin + */ +public abstract class JingleContentDescriptionProvider implements PacketExtensionProvider { + + /** + * Default constructor + */ + public JingleContentDescriptionProvider() { + super(); + } + + /** + * Parse a iq/jingle/description/payload-type element. + * + * @param parser the input to parse + * @return a payload type element + * @throws Exception + */ + protected JinglePayloadType parsePayload(final XmlPullParser parser) + throws Exception { + int ptId = 0; + String ptName; + int ptChannels = 0; + + try { + ptId = Integer.parseInt(parser.getAttributeValue("", "id")); + } catch (Exception e) { + } + + ptName = parser.getAttributeValue("", "name"); + + try { + ptChannels = Integer.parseInt(parser.getAttributeValue("", "channels")); + } catch (Exception e) { + } + + return new JinglePayloadType(new PayloadType(ptId, ptName, ptChannels)); + } + + /** + * Parse a iq/jingle/description element. + * + * @param parser the input to parse + * @return a description element + * @throws Exception + */ + public PacketExtension parseExtension(final XmlPullParser parser) throws Exception { + boolean done = false; + JingleContentDescription desc = getInstance(); + + while (!done) { + int eventType = parser.next(); + String name = parser.getName(); + + if (eventType == XmlPullParser.START_TAG) { + if (name.equals(JingleContentDescription.JinglePayloadType.NODENAME)) { + desc.addJinglePayloadType(parsePayload(parser)); + } else { + throw new Exception("Unknow element \"" + name + "\" in content."); + } + } else if (eventType == XmlPullParser.END_TAG) { + if (name.equals(JingleContentDescription.NODENAME)) { + done = true; + } + } + } + return desc; + } + + /** + * Return a new instance of this class. Subclasses must overwrite this + * method. + */ + protected abstract JingleContentDescription getInstance(); + + /** + * Jingle audio + */ + public static class Audio extends JingleContentDescriptionProvider { + + /** + * Default constructor + */ + public Audio() { + super(); + } + + /** + * Parse an audio payload type. + */ + public JinglePayloadType parsePayload(final XmlPullParser parser) + throws Exception { + JinglePayloadType pte = super.parsePayload(parser); + PayloadType.Audio pt = new PayloadType.Audio(pte.getPayloadType()); + int ptClockRate = 0; + + try { + ptClockRate = Integer.parseInt(parser.getAttributeValue("", "clockrate")); + } catch (Exception e) { + } + pt.setClockRate(ptClockRate); + + return new JinglePayloadType.Audio(pt); + } + + /** + * Get a new instance of this object. + */ + protected JingleContentDescription getInstance() { + return new JingleContentDescription.Audio(); + } + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/provider/JingleContentInfoProvider.java b/jingle/extension/source/org/jivesoftware/smackx/provider/JingleContentInfoProvider.java new file mode 100644 index 000000000..e6e79ffc0 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/provider/JingleContentInfoProvider.java @@ -0,0 +1,106 @@ +package org.jivesoftware.smackx.provider; + +import org.jivesoftware.smack.packet.PacketExtension; +import org.jivesoftware.smack.provider.PacketExtensionProvider; +import org.jivesoftware.smackx.jingle.media.ContentInfo; +import org.jivesoftware.smackx.packet.JingleContentInfo; +import org.xmlpull.v1.XmlPullParser; + +/** + * Jingle Audio jmf-info provider + * + * @author Alvaro Saurin + */ +public class JingleContentInfoProvider implements PacketExtensionProvider { + + /** + * Creates a new provider. ProviderManager requires that every + * PacketExtensionProvider has a public, no-argument constructor + */ + public JingleContentInfoProvider() { + super(); + } + + public PacketExtension parseExtension(final XmlPullParser parser) throws Exception { + // This method must be overwritten by subclasses... + return null; + } + + /** + * JingleContentDescription.Audio info provider + */ + public static class Audio extends JingleContentInfoProvider { + + private PacketExtension audioInfo; + + /** + * Empty constructor. + */ + public Audio() { + this(null); + } + + /** + * Constructor with an audio info. + * + * @param audioInfo the jmf info + */ + public Audio(final PacketExtension audioInfo) { + super(); + this.audioInfo = audioInfo; + } + + /** + * Parse a JingleContentDescription.Audio extension. + */ + public PacketExtension parseExtension(final XmlPullParser parser) + throws Exception { + PacketExtension result = null; + + if (audioInfo != null) { + result = audioInfo; + } else { + String elementName = parser.getName(); + + // Try to get an Audio content info + ContentInfo mi = ContentInfo.Audio.fromString(elementName); + if (mi != null) { + result = new JingleContentInfo.Audio(mi); + } + } + return result; + } + + // Sub-elements + + public static class Busy extends Audio { + public Busy() { + super(new JingleContentInfo.Audio.Busy()); + } + } + + public static class Hold extends Audio { + public Hold() { + super(new JingleContentInfo.Audio.Hold()); + } + } + + public static class Mute extends Audio { + public Mute() { + super(new JingleContentInfo.Audio.Mute()); + } + } + + public static class Queued extends Audio { + public Queued() { + super(new JingleContentInfo.Audio.Queued()); + } + } + + public static class Ringing extends Audio { + public Ringing() { + super(new JingleContentInfo.Audio.Ringing()); + } + } + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/provider/JingleProvider.java b/jingle/extension/source/org/jivesoftware/smackx/provider/JingleProvider.java new file mode 100644 index 000000000..9abdca003 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/provider/JingleProvider.java @@ -0,0 +1,128 @@ +/** + * $RCSfile$ + * $Revision$ + * $Date$ + * + * Copyright 2003-2005 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jivesoftware.smackx.provider; + +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.packet.IQ; +import org.jivesoftware.smack.provider.IQProvider; +import org.jivesoftware.smackx.packet.Jingle; +import org.jivesoftware.smackx.packet.JingleContentDescription; +import org.jivesoftware.smackx.packet.JingleContentInfo; +import org.jivesoftware.smackx.packet.JingleTransport; +import org.xmlpull.v1.XmlPullParser; + +/** + * The JingleProvider parses Jingle packets. + * + * @author Alvaro Saurin + */ +public class JingleProvider implements IQProvider { + + /** + * Creates a new provider. ProviderManager requires that every + * PacketExtensionProvider has a public, no-argument constructor + */ + public JingleProvider() { + super(); + } + + /** + * Parse a iq/jingle element. + */ + public IQ parseIQ(final XmlPullParser parser) throws Exception { + + Jingle jingle = new Jingle(); + String sid = ""; + Jingle.Action action; + String initiator = ""; + String responder = ""; + boolean done = false; + + // Sub-elements providers + JingleContentDescriptionProvider jdpAudio = new JingleContentDescriptionProvider.Audio(); + JingleTransportProvider jtpRawUdp = new JingleTransportProvider.RawUdp(); + JingleTransportProvider jtpIce = new JingleTransportProvider.Ice(); + JingleContentInfoProvider jmipAudio = new JingleContentInfoProvider.Audio(); + + int eventType; + String elementName; + String namespace; + + // Get some attributes for the element + sid = parser.getAttributeValue("", "sid"); + action = Jingle.Action.getAction(parser.getAttributeValue("", "action")); + initiator = parser.getAttributeValue("", "initiator"); + responder = parser.getAttributeValue("", "responder"); + + jingle.setSid(sid); + jingle.setAction(action); + jingle.setInitiator(initiator); + jingle.setResponder(responder); + + // Start processing sub-elements + while (!done) { + eventType = parser.next(); + elementName = parser.getName(); + namespace = parser.getNamespace(); + + if (eventType == XmlPullParser.START_TAG) { + + // Parse some well know subelements, depending on the namespaces + // and element names... + + if (elementName.equals(JingleContentDescription.NODENAME) + && namespace.equals(JingleContentDescription.Audio.NAMESPACE)) { + jingle.addDescription((JingleContentDescription) jdpAudio + .parseExtension(parser)); + } else if (elementName.equals(JingleTransport.NODENAME)) { + + // Parse the possible transport namespaces + if (namespace.equals(JingleTransport.RawUdp.NAMESPACE)) { + jingle.addTransport((JingleTransport) jtpRawUdp + .parseExtension(parser)); + } else if (namespace.equals(JingleTransport.Ice.NAMESPACE)) { + jingle.addTransport((JingleTransport) jtpIce + .parseExtension(parser)); + } else { + throw new XMPPException("Unknown transport namespace \"" + + namespace + "\" in Jingle packet."); + } + } else if (namespace.equals(JingleContentInfo.Audio.NAMESPACE)) { + jingle.setContentInfo((JingleContentInfo) jmipAudio + .parseExtension(parser)); + } else if (elementName.equals("content")) { + //TODO Separate Contents (XEP-0166) + } else { + throw new XMPPException("Unknown combination of namespace \"" + + namespace + "\" and element name \"" + elementName + + "\" in Jingle packet."); + } + + } else if (eventType == XmlPullParser.END_TAG) { + if (parser.getName().equals(Jingle.getElementName())) { + done = true; + } + } + } + + return jingle; + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/provider/JingleTransportProvider.java b/jingle/extension/source/org/jivesoftware/smackx/provider/JingleTransportProvider.java new file mode 100644 index 000000000..f87d73969 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/provider/JingleTransportProvider.java @@ -0,0 +1,231 @@ +package org.jivesoftware.smackx.provider; + +import org.jivesoftware.smack.packet.PacketExtension; +import org.jivesoftware.smack.provider.PacketExtensionProvider; +import org.jivesoftware.smackx.jingle.nat.TransportCandidate; +import org.jivesoftware.smackx.packet.JingleTransport; +import org.jivesoftware.smackx.packet.JingleTransport.JingleTransportCandidate; +import org.xmlpull.v1.XmlPullParser; + +/** + * Provider for a Jingle transport element + * + * @author Alvaro Saurin + */ +public abstract class JingleTransportProvider implements PacketExtensionProvider { + + /** + * Creates a new provider. ProviderManager requires that every + * PacketExtensionProvider has a public, no-argument constructor + */ + public JingleTransportProvider() { + super(); + } + + /** + * Obtain the corresponding TransportNegotiator instance. + * + * @return a new TransportNegotiator instance + */ + protected JingleTransport getInstance() { + return new JingleTransport(); + } + + /** + * Parse a iq/jingle/transport element. + * + * @param parser the structure to parse + * @return a transport element. + * @throws Exception + */ + public PacketExtension parseExtension(final XmlPullParser parser) throws Exception { + boolean done = false; + JingleTransport trans = getInstance(); + + while (!done) { + int eventType = parser.next(); + String name = parser.getName(); + + if (eventType == XmlPullParser.START_TAG) { + if (name.equals(JingleTransportCandidate.NODENAME)) { + JingleTransportCandidate jtc = parseCandidate(parser); + if (jtc != null) trans.addCandidate(jtc); + } else { + throw new Exception("Unknown tag \"" + name + "\" in transport element."); + } + } else if (eventType == XmlPullParser.END_TAG) { + if (name.equals(JingleTransport.NODENAME)) { + done = true; + } + } + } + + return trans; + } + + protected abstract JingleTransportCandidate parseCandidate(final XmlPullParser parser) + throws Exception; + + /** + * RTP-ICE profile + */ + public static class Ice extends JingleTransportProvider { + + /** + * Defauls constructor. + */ + public Ice() { + super(); + } + + /** + * Obtain the corresponding TransportNegotiator.Ice instance. + * + * @return a new TransportNegotiator.Ice instance + */ + protected JingleTransport getInstance() { + return new JingleTransport.Ice(); + } + + /** + * Parse a iq/jingle/transport/candidate element. + * + * @param parser the structure to parse + * @return a candidate element + * @throws Exception + */ + protected JingleTransportCandidate parseCandidate(XmlPullParser parser) throws Exception { + TransportCandidate.Ice mt = new TransportCandidate.Ice(); + + String channel = parser.getAttributeValue("", "channel"); + String generation = parser.getAttributeValue("", "generation"); + String ip = parser.getAttributeValue("", "ip"); + String name = parser.getAttributeValue("", "name"); + String network = parser.getAttributeValue("", "network"); + String username = parser.getAttributeValue("", "username"); + String password = parser.getAttributeValue("", "password"); + String port = parser.getAttributeValue("", "port"); + String preference = parser.getAttributeValue("", "preference"); + String proto = parser.getAttributeValue("", "proto"); + + if (channel != null) { + mt.setChannel(new TransportCandidate.Channel(channel)); + } + + if (generation != null) { + try { + mt.setGeneration(Integer.parseInt(generation)); + } catch (Exception e) { + } + } + + if (ip != null) { + mt.setIp(ip); + } else { + return null; + } + + if (name != null) { + mt.setName(name); + } + + if (network != null) { + try { + mt.setNetwork(Integer.parseInt(network)); + } catch (Exception e) { + } + } + + if (username != null) { + mt.setUsername(username); + } + + if (password != null) { + mt.setPassword(password); + } + + if (port != null) { + try { + mt.setPort(Integer.parseInt(port)); + } catch (Exception e) { + } + } + + if (preference != null) { + try { + mt.setPreference(Integer.parseInt(preference)); + } catch (Exception e) { + } + } + + if (proto != null) { + mt.setProto(new TransportCandidate.Protocol(proto)); + } + + return new JingleTransport.Ice.Candidate(mt); + } + } + + /** + * Raw UDP profile + */ + public static class RawUdp extends JingleTransportProvider { + + /** + * Defauls constructor. + */ + public RawUdp() { + super(); + } + + /** + * Obtain the corresponding TransportNegotiator.RawUdp instance. + * + * @return a new TransportNegotiator.RawUdp instance + */ + protected JingleTransport getInstance() { + return new JingleTransport.RawUdp(); + } + + /** + * Parse a iq/jingle/transport/candidate element. + * + * @param parser the structure to parse + * @return a candidate element + * @throws Exception + */ + protected JingleTransportCandidate parseCandidate(XmlPullParser parser) throws Exception { + TransportCandidate.Fixed mt = new TransportCandidate.Fixed(); + + String generation = parser.getAttributeValue("", "generation"); + String ip = parser.getAttributeValue("", "ip"); + String name = parser.getAttributeValue("", "name"); + String port = parser.getAttributeValue("", "port"); + + //System.out.println(); + + if (generation != null) { + try { + mt.setGeneration(Integer.parseInt(generation)); + } catch (Exception e) { + } + } + + if (ip != null) { + mt.setIp(ip); + } + + if (name != null) { + mt.setName(name); + } + + if (port != null) { + try { + mt.setPort(Integer.parseInt(port)); + } catch (Exception e) { + } + } + return new JingleTransport.RawUdp.Candidate(mt); + } + } +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/provider/package.html b/jingle/extension/source/org/jivesoftware/smackx/provider/package.html new file mode 100644 index 000000000..962ba6372 --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/provider/package.html @@ -0,0 +1 @@ +Provides pluggable parsing logic for Smack extensions. \ No newline at end of file diff --git a/jingle/extension/source/overview.html b/jingle/extension/source/overview.html new file mode 100644 index 000000000..8ec5b8ff7 --- /dev/null +++ b/jingle/extension/source/overview.html @@ -0,0 +1,4 @@ +API specification for Smack, an Open Source XMPP client library. +

+ The {@link org.jivesoftware.smack.XMPPConnection} class is the main entry point for the API. + diff --git a/jingle/extension/test/config/test-case.xml b/jingle/extension/test/config/test-case.xml new file mode 100644 index 000000000..d477c269e --- /dev/null +++ b/jingle/extension/test/config/test-case.xml @@ -0,0 +1,13 @@ + + + + + + localhost + 5222 + + + chat + conference + + \ No newline at end of file diff --git a/jingle/extension/test/org/jivesoftware/smack/test/SmackTestCase.java b/jingle/extension/test/org/jivesoftware/smack/test/SmackTestCase.java new file mode 100644 index 000000000..2784cf9e5 --- /dev/null +++ b/jingle/extension/test/org/jivesoftware/smack/test/SmackTestCase.java @@ -0,0 +1,368 @@ +/** + * $RCSfile$ + * $Revision: 5367 $ + * $Date: 2006-09-14 16:16:40 -0300 (qui, 14 set 2006) $ + * + * Copyright 2003-2005 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smack.test; + +import junit.framework.TestCase; +import org.jivesoftware.smack.ConnectionConfiguration; +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; +import org.xmlpull.mxp1.MXParser; +import org.xmlpull.v1.XmlPullParser; + +import javax.net.SocketFactory; +import java.io.InputStream; +import java.net.URL; +import java.util.Enumeration; + +/** + * Base class for all the test cases which provides a pre-configured execution context. This + * means that any test case that subclassifies this base class will have access to a pool of + * connections and to the user of each connection. The maximum number of connections in the pool + * can be controlled by the message {@link #getMaxConnections()} which every subclass must + * implement.

+ * + * This base class defines a default execution context (i.e. host, port, chat domain and muc + * domain) which can be found in the file "config/test-case.xml". However, each subclass could + * redefine the default configuration by providing its own configuration file (if desired). The + * name of the configuration file must be of the form .xml (e.g. RosterTest.xml). + * The file must be placed in the folder "config". This folder is where the default configuration + * file is being held. + * + * @author Gaston Dombiak + */ +public abstract class SmackTestCase extends TestCase { + + private String host = "localhost"; + private String serviceName = "localhost"; + private int port = 5222; + + private String chatDomain = "chat"; + private String mucDomain = "conference"; + + private XMPPConnection[] connections = null; + + /** + * Constructor for SmackTestCase. + * @param arg0 + */ + public SmackTestCase(String arg0) { + super(arg0); + } + + /** + * Returns the maximum number of connections to initialize for this test case. All the + * initialized connections will be connected to the server using a new test account for + * each conection. + * + * @return the maximum number of connections to initialize for this test case. + */ + protected abstract int getMaxConnections(); + + /** + * Returns a SocketFactory that will be used to create the socket to the XMPP server. By + * default no SocketFactory is used but subclasses my want to redefine this method.

+ * + * A custom SocketFactory allows fine-grained control of the actual connection to the XMPP + * server. A typical use for a custom SocketFactory is when connecting through a SOCKS proxy. + * + * @return a SocketFactory that will be used to create the socket to the XMPP server. + */ + protected SocketFactory getSocketFactory() { + return null; + } + + /** + * Returns the XMPPConnection located at the requested position. Each test case holds a + * pool of connections which is initialized while setting up the test case. The maximum + * number of connections is controlled by the message {@link #getMaxConnections()} which + * every subclass must implement.

+ * + * If the requested position is greater than the connections size then an + * IllegalArgumentException will be thrown. + * + * @param index the position in the pool of the connection to look for. + * @return the XMPPConnection located at the requested position. + */ + protected XMPPConnection getConnection(int index) { + if (index > getMaxConnections()) { + throw new IllegalArgumentException("Index out of bounds"); + } + return connections[index]; + } + + /** + * Returns the name of the user (e.g. johndoe) that is using the connection + * located at the requested position. + * + * @param index the position in the pool of the connection to look for. + * @return the user of the user (e.g. johndoe). + */ + protected String getUsername(int index) { + if (index > getMaxConnections()) { + throw new IllegalArgumentException("Index out of bounds"); + } + return "user" + index; + } + + /** + * Returns the bare XMPP address of the user (e.g. johndoe@jabber.org) that is + * using the connection located at the requested position. + * + * @param index the position in the pool of the connection to look for. + * @return the bare XMPP address of the user (e.g. johndoe@jabber.org). + */ + protected String getBareJID(int index) { + return getUsername(index) + "@" + getConnection(index).getServiceName(); + } + + /** + * Returns the full XMPP address of the user (e.g. johndoe@jabber.org/Smack) that is + * using the connection located at the requested position. + * + * @param index the position in the pool of the connection to look for. + * @return the full XMPP address of the user (e.g. johndoe@jabber.org/Smack). + */ + protected String getFullJID(int index) { + return getBareJID(index) + "/Smack"; + } + + protected String getHost() { + return host; + } + + protected int getPort() { + return port; + } + + protected String getServiceName() { + return serviceName; + } + + /** + * Returns the default groupchat service domain. + * + * @return the default groupchat service domain. + */ + protected String getChatDomain() { + return chatDomain; + } + + /** + * Returns the default MUC service domain. + * + * @return the default MUC service domain. + */ + protected String getMUCDomain() { + return mucDomain + "." + serviceName; + } + + protected void setUp() throws Exception { + super.setUp(); + init(); + if (getMaxConnections() < 1) { + return; + } + connections = new XMPPConnection[getMaxConnections()]; + try { + // Connect to the server + for (int i = 0; i < getMaxConnections(); i++) { + // Create the configuration for this new connection + ConnectionConfiguration config = new ConnectionConfiguration(host, port); + config.setTLSEnabled(true); + config.setCompressionEnabled(Boolean.getBoolean("test.compressionEnabled")); + config.setSASLAuthenticationEnabled(true); + if (getSocketFactory() == null) { + connections[i] = new XMPPConnection(config); + } + else { + connections[i] = new XMPPConnection(config, getSocketFactory()); + } + connections[i].connect(); + } + // Use the host name that the server reports. This is a good idea in most + // cases, but could fail if the user set a hostname in their XMPP server + // that will not resolve as a network connection. + host = connections[0].getHost(); + serviceName = connections[0].getServiceName(); + // Create the test accounts + if (!getConnection(0).getAccountManager().supportsAccountCreation()) + fail("Server does not support account creation"); + + for (int i = 0; i < getMaxConnections(); i++) { + // Create the test account + try { + getConnection(i).getAccountManager().createAccount("user" + i, "user" + i); + } catch (XMPPException e) { + // Do nothing if the accout already exists + if (e.getXMPPError() == null || e.getXMPPError().getCode() != 409) { + throw e; + } + } + // Login with the new test account + getConnection(i).login("user" + i, "user" + i); + } + // Let the server process the available presences + Thread.sleep(150); + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + protected void tearDown() throws Exception { + super.tearDown(); + + for (int i = 0; i < getMaxConnections(); i++) { + if (getConnection(i).isConnected()) { + // Delete the created account for the test + getConnection(i).getAccountManager().deleteAccount(); + // Close the connection + getConnection(i).disconnect(); + } + } + } + + /** + * Initializes the context of the test case. We will first try to load the configuration from + * a file whose name is conformed by the test case class name plus an .xml extension + * (e.g RosterTest.xml). If no file was found under that name then we will try to load the + * default configuration for all the test cases from the file "config/test-case.xml". + * + */ + private void init() { + try { + boolean found = false; + // Try to load the configutation from an XML file specific for this test case + Enumeration resources = + ClassLoader.getSystemClassLoader().getResources(getConfigurationFilename()); + while (resources.hasMoreElements()) { + found = parseURL((URL) resources.nextElement()); + } + // If none was found then try to load the configuration from the default configuration + // file (i.e. "config/test-case.xml") + if (!found) { + resources = ClassLoader.getSystemClassLoader().getResources("config/test-case.xml"); + while (resources.hasMoreElements()) { + found = parseURL((URL) resources.nextElement()); + } + } + if (!found) { + System.err.println("File config/test-case.xml not found. Using default config."); + } + } + catch (Exception e) { + } + } + + /** + * Returns true if the given URL was found and parsed without problems. The file provided + * by the URL must contain information useful for the test case configuration, such us, + * host and port of the server. + * + * @param url the url of the file to parse. + * @return true if the given URL was found and parsed without problems. + */ + private boolean parseURL(URL url) { + boolean parsedOK = false; + InputStream systemStream = null; + try { + systemStream = url.openStream(); + XmlPullParser parser = new MXParser(); + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); + parser.setInput(systemStream, "UTF-8"); + int eventType = parser.getEventType(); + do { + if (eventType == XmlPullParser.START_TAG) { + if (parser.getName().equals("host")) { + host = parser.nextText(); + } + else if (parser.getName().equals("port")) { + port = parseIntProperty(parser, port); + } + else if (parser.getName().equals("serviceName")) { + serviceName = parser.nextText(); + } + else if (parser.getName().equals("chat")) { + chatDomain = parser.nextText(); + } + else if (parser.getName().equals("muc")) { + mucDomain = parser.nextText(); + } + } + eventType = parser.next(); + } + while (eventType != XmlPullParser.END_DOCUMENT); + parsedOK = true; + } + catch (Exception e) { + e.printStackTrace(); + } + finally { + try { + systemStream.close(); + } + catch (Exception e) { + } + } + return parsedOK; + } + + private static int parseIntProperty(XmlPullParser parser, int defaultValue) throws Exception { + try { + return Integer.parseInt(parser.nextText()); + } + catch (NumberFormatException nfe) { + nfe.printStackTrace(); + return defaultValue; + } + } + + /** + * Returns the name of the configuration file related to this test case. By default all + * the test cases will use the same configuration file. However, it's possible to override the + * default configuration by providing a file of the form .xml + * (e.g. RosterTest.xml). + * + * @return the name of the configuration file related to this test case. + */ + private String getConfigurationFilename() { + String fullClassName = this.getClass().getName(); + int firstChar = fullClassName.lastIndexOf('.') + 1; + return "config/" + fullClassName.substring(firstChar) + ".xml"; + } + + /** + * Compares two contents of two byte arrays to make sure that they are equal + * + * @param message The message to show in the case of failure + * @param byteArray1 The first byte array. + * @param byteArray2 The second byte array. + */ + public static void assertEquals(String message, byte [] byteArray1, byte [] byteArray2) { + if(byteArray1.length != byteArray2.length) { + fail(message); + } + for(int i = 0; i < byteArray1.length; i++) { + assertEquals(message, byteArray1[i], byteArray2[i]); + } + } + +} diff --git a/jingle/extension/test/org/jivesoftware/smackx/jingle/JingleManagerTest.java b/jingle/extension/test/org/jivesoftware/smackx/jingle/JingleManagerTest.java new file mode 100644 index 000000000..5d252ff9f --- /dev/null +++ b/jingle/extension/test/org/jivesoftware/smackx/jingle/JingleManagerTest.java @@ -0,0 +1,1016 @@ +/** + * $RCSfile$ + * $Revision$ + * $Date$ + * + * Copyright (C) 2002-2006 Jive Software. All rights reserved. + * ==================================================================== + * The Jive Software License (based on Apache Software License, Version 1.1) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by + * Jive Software (http://www.jivesoftware.com)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Smack" and "Jive Software" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please + * contact webmaster@jivesoftware.com. + * + * 5. Products derived from this software may not be called "Smack", + * nor may "Smack" appear in their name, without prior written + * permission of Jive Software. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL JIVE SOFTWARE OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + */ + +package org.jivesoftware.smackx.jingle; + +import org.jivesoftware.smack.PacketListener; +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.filter.PacketFilter; +import org.jivesoftware.smack.packet.IQ; +import org.jivesoftware.smack.packet.Packet; +import org.jivesoftware.smack.provider.ProviderManager; +import org.jivesoftware.smack.test.SmackTestCase; +import org.jivesoftware.smackx.jingle.listeners.JingleSessionListener; +import org.jivesoftware.smackx.jingle.listeners.JingleSessionRequestListener; +import org.jivesoftware.smackx.jingle.media.JingleMediaManager; +import org.jivesoftware.smackx.jingle.media.JingleMediaSession; +import org.jivesoftware.smackx.jingle.media.PayloadType; +import org.jivesoftware.smackx.jingle.nat.*; +import org.jivesoftware.smackx.packet.Jingle; +import org.jivesoftware.smackx.provider.JingleProvider; + +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.util.ArrayList; + +/** + * Test the Jingle extension using the high level API + *

+ * + * @author Alvaro Saurin + */ +public class JingleManagerTest extends SmackTestCase { + + private int counter; + + private final Object mutex = new Object(); + + /** + * Constructor for JingleManagerTest. + * + * @param name + */ + public JingleManagerTest(final String name) { + super(name); + + resetCounter(); + } + + // Counter management + + private void resetCounter() { + synchronized (mutex) { + counter = 0; + } + } + + public void incCounter() { + synchronized (mutex) { + counter++; + } + } + + private int valCounter() { + int val; + synchronized (mutex) { + val = counter; + } + return val; + } + + /** + * Generate a list of payload types + * + * @return A testing list + */ + private ArrayList getTestPayloads1() { + ArrayList result = new ArrayList(); + + result.add(new PayloadType.Audio(34, "supercodec-1", 2, 14000)); + result.add(new PayloadType.Audio(56, "supercodec-2", 1, 44000)); + result.add(new PayloadType.Audio(36, "supercodec-3", 2, 28000)); + result.add(new PayloadType.Audio(45, "supercodec-4", 1, 98000)); + + return result; + } + + private ArrayList getTestPayloads2() { + ArrayList result = new ArrayList(); + + result.add(new PayloadType.Audio(27, "supercodec-3", 2, 28000)); + result.add(new PayloadType.Audio(56, "supercodec-2", 1, 44000)); + result.add(new PayloadType.Audio(32, "supercodec-4", 1, 98000)); + result.add(new PayloadType.Audio(34, "supercodec-1", 2, 14000)); + + return result; + } + + private ArrayList getTestPayloads3() { + ArrayList result = new ArrayList(); + + result.add(new PayloadType.Audio(91, "badcodec-1", 2, 28000)); + result.add(new PayloadType.Audio(92, "badcodec-2", 1, 44000)); + result.add(new PayloadType.Audio(93, "badcodec-3", 1, 98000)); + result.add(new PayloadType.Audio(94, "badcodec-4", 2, 14000)); + + return result; + } + + /** + * Test for the session request detection. Here, we use the same filter we + * use in the JingleManager... + */ + public void testInitJingleSessionRequestListeners() { + + resetCounter(); + + ProviderManager.getInstance().addIQProvider("jingle", + "http://jabber.org/protocol/jingle", + new JingleProvider()); + + PacketFilter initRequestFilter = new PacketFilter() { + // Return true if we accept this packet + public boolean accept(Packet pin) { + if (pin instanceof IQ) { + System.out.println("packet: " + pin.toXML()); + IQ iq = (IQ) pin; + if (iq.getType().equals(IQ.Type.SET)) { + System.out.println("packet"); + if (iq instanceof Jingle) { + Jingle jin = (Jingle) pin; + if (jin.getAction().equals(Jingle.Action.SESSIONINITIATE)) { + System.out + .println("Session initiation packet accepted... "); + return true; + } + } + } + } + return false; + } + }; + + // Start a packet listener for session initiation requests + getConnection(0).addPacketListener(new PacketListener() { + public void processPacket(final Packet packet) { + System.out.println("Packet detected... "); + incCounter(); + } + }, initRequestFilter); + + // Create a dummy packet for testing... + IQfake iqSent = new IQfake( + " " + + ""); + + iqSent.setTo(getFullJID(0)); + iqSent.setFrom(getFullJID(0)); + iqSent.setType(IQ.Type.SET); + + System.out.println("Sending packet and waiting... "); + getConnection(1).sendPacket(iqSent); + try { + Thread.sleep(10000); + } + catch (InterruptedException e) { + } + + System.out.println("Awake... " + valCounter()); + assertTrue(valCounter() > 0); + } + + /** + * High level API test. This is a simple test to use with a XMPP client and + * check if the client receives the message 1. User_1 will send an + * invitation to user_2. + */ + public void testSendSimpleMessage() { + + resetCounter(); + + try { + TransportResolver tr1 = new FixedResolver("127.0.0.1", 54222); + TransportResolver tr2 = new FixedResolver("127.0.0.1", 54567); + + JingleManager man0 = new JingleManager(getConnection(0), tr1); + JingleManager man1 = new JingleManager(getConnection(1), tr2); + + // Session 1 waits for connections + man1.addJingleSessionRequestListener(new JingleSessionRequestListener() { + /** + * Called when a new session request is detected + */ + public void sessionRequested(final JingleSessionRequest request) { + incCounter(); + System.out.println("Session request detected, from " + + request.getFrom()); + } + }); + + // Session 0 starts a request + System.out.println("Starting session request, to " + getFullJID(1) + "..."); + OutgoingJingleSession session0 = man0.createOutgoingJingleSession( + getFullJID(1), getTestPayloads1()); + session0.start(null); + + Thread.sleep(5000); + + assertTrue(valCounter() > 0); + + } + catch (Exception e) { + e.printStackTrace(); + fail("An error occured with Jingle"); + } + } + + /** + * High level API test. This is a simple test to use with a XMPP client and + * check if the client receives the message 1. User_1 will send an + * invitation to user_2. + */ + public void testAcceptJingleSession() { + + resetCounter(); + + try { + TransportResolver tr1 = new FixedResolver("127.0.0.1", 54222); + TransportResolver tr2 = new FixedResolver("127.0.0.1", 54567); + + final JingleManager man0 = new JingleManager(getConnection(0), tr1); + final JingleManager man1 = new JingleManager(getConnection(1), tr2); + + man1.addJingleSessionRequestListener(new JingleSessionRequestListener() { + /** + * Called when a new session request is detected + */ + public void sessionRequested(final JingleSessionRequest request) { + incCounter(); + System.out.println("Session request detected, from " + + request.getFrom() + ": accepting."); + + // We accept the request + try { + IncomingJingleSession session1 = request.accept(getTestPayloads2()); + session1.start(request); + } + catch (Exception e) { + e.printStackTrace(); + } + } + }); + + // Session 0 starts a request + System.out.println("Starting session request, to " + getFullJID(1) + "..."); + OutgoingJingleSession session0 = man0.createOutgoingJingleSession( + getFullJID(1), getTestPayloads1()); + session0.start(null); + + Thread.sleep(20000); + + assertTrue(valCounter() > 0); + + } + catch (Exception e) { + e.printStackTrace(); + fail("An error occured with Jingle"); + } + } + + /** + * This is a simple test where both endpoints have exactly the same payloads + * and the session is accepted. + */ + public void testEqualPayloadsSetSession() { + + resetCounter(); + + try { + TransportResolver tr1 = new FixedResolver("127.0.0.1", 54213); + TransportResolver tr2 = new FixedResolver("127.0.0.1", 54531); + + final JingleManager man0 = new JingleManager(getConnection(0), tr1); + final JingleManager man1 = new JingleManager(getConnection(1), tr2); + + man1.addJingleSessionRequestListener(new JingleSessionRequestListener() { + /** + * Called when a new session request is detected + */ + public void sessionRequested(final JingleSessionRequest request) { + System.out.println("Session request detected, from " + + request.getFrom() + ": accepting."); + try { + // We accept the request + IncomingJingleSession session1 = request.accept(getTestPayloads1()); + + session1.addListener(new JingleSessionListener() { + public void sessionClosed(String reason, JingleSession jingleSession) { + System.out.println("sessionClosed()."); + } + + public void sessionClosedOnError(XMPPException e, JingleSession jingleSession) { + System.out.println("sessionClosedOnError()."); + } + + public void sessionDeclined(String reason, JingleSession jingleSession) { + System.out.println("sessionDeclined()."); + } + + public void sessionEstablished(PayloadType pt, + TransportCandidate rc, TransportCandidate lc, JingleSession jingleSession) { + incCounter(); + System.out + .println("Responder: the session is fully established."); + System.out.println("+ Payload Type: " + pt.getId()); + System.out.println("+ Local IP/port: " + lc.getIp() + ":" + + lc.getPort()); + System.out.println("+ Remote IP/port: " + rc.getIp() + ":" + + rc.getPort()); + } + + public void sessionRedirected(String redirection, JingleSession jingleSession) { + } + }); + + session1.start(request); + } + catch (Exception e) { + e.printStackTrace(); + } + } + }); + + // Session 0 starts a request + System.out.println("Starting session request with equal payloads, to " + + getFullJID(1) + "..."); + OutgoingJingleSession session0 = man0.createOutgoingJingleSession( + getFullJID(1), getTestPayloads1()); + session0.start(null); + + Thread.sleep(20000); + + assertTrue(valCounter() == 1); + + } + catch (Exception e) { + e.printStackTrace(); + fail("An error occured with Jingle"); + } + } + + /** + * This is a simple test where the user_2 rejects the Jingle session. + */ + public void testStagesSession() { + + resetCounter(); + + try { + TransportResolver tr1 = new FixedResolver("127.0.0.1", 54222); + TransportResolver tr2 = new FixedResolver("127.0.0.1", 54567); + + final JingleManager man0 = new JingleManager(getConnection(0), tr1); + final JingleManager man1 = new JingleManager(getConnection(1), tr2); + + man1.addJingleSessionRequestListener(new JingleSessionRequestListener() { + /** + * Called when a new session request is detected + */ + public void sessionRequested(final JingleSessionRequest request) { + System.out.println("Session request detected, from " + + request.getFrom() + ": accepting."); + try { + // We accept the request + IncomingJingleSession session1 = request.accept(getTestPayloads2()); + + session1.addListener(new JingleSessionListener() { + public void sessionClosed(String reason, JingleSession jingleSession) { + System.out.println("sessionClosed()."); + } + + public void sessionClosedOnError(XMPPException e, JingleSession jingleSession) { + System.out.println("sessionClosedOnError()."); + } + + public void sessionDeclined(String reason, JingleSession jingleSession) { + System.out.println("sessionDeclined()."); + } + + public void sessionEstablished(PayloadType pt, + TransportCandidate rc, final TransportCandidate lc, JingleSession jingleSession) { + incCounter(); + System.out + .println("Responder: the session is fully established."); + System.out.println("+ Payload Type: " + pt.getId()); + System.out.println("+ Local IP/port: " + lc.getIp() + ":" + + lc.getPort()); + System.out.println("+ Remote IP/port: " + rc.getIp() + ":" + + rc.getPort()); + } + + public void sessionRedirected(String redirection, JingleSession jingleSession) { + } + }); + + + session1.start(request); + } + catch (Exception e) { + e.printStackTrace(); + } + } + }); + + // Session 0 starts a request + System.out.println("Starting session request, to " + getFullJID(1) + "..."); + OutgoingJingleSession session0 = man0.createOutgoingJingleSession( + getFullJID(1), getTestPayloads1()); + + session0.addListener(new JingleSessionListener() { + public void sessionClosed(String reason, JingleSession jingleSession) { + } + + public void sessionClosedOnError(XMPPException e, JingleSession jingleSession) { + } + + public void sessionDeclined(String reason, JingleSession jingleSession) { + } + + public void sessionEstablished(PayloadType pt, + TransportCandidate rc, TransportCandidate lc, JingleSession jingleSession) { + incCounter(); + System.out.println("Initiator: the session is fully established."); + System.out.println("+ Payload Type: " + pt.getId()); + System.out.println("+ Local IP/port: " + lc.getIp() + ":" + + lc.getPort()); + System.out.println("+ Remote IP/port: " + rc.getIp() + ":" + + rc.getPort()); + } + + public void sessionRedirected(String redirection, JingleSession jingleSession) { + } + }); + session0.start(null); + + Thread.sleep(20000); + + assertTrue(valCounter() == 2); + + } + catch (Exception e) { + e.printStackTrace(); + fail("An error occured with Jingle"); + } + } + + /** + * This is a simple test where the user_2 rejects the Jingle session. + */ + public void testRejectSession() { + + resetCounter(); + + try { + TransportResolver tr1 = new FixedResolver("127.0.0.1", 54222); + TransportResolver tr2 = new FixedResolver("127.0.0.1", 54567); + + final JingleManager man0 = new JingleManager(getConnection(0), tr1); + final JingleManager man1 = new JingleManager(getConnection(1), tr2); + + man1.addJingleSessionRequestListener(new JingleSessionRequestListener() { + /** + * Called when a new session request is detected + */ + public void sessionRequested(final JingleSessionRequest request) { + System.out.println("Session request detected, from " + + request.getFrom() + ": rejecting."); + + // We reject the request + request.reject(); + } + }); + + // Session 0 starts a request + System.out.println("Starting session request, to " + getFullJID(1) + "..."); + OutgoingJingleSession session0 = man0.createOutgoingJingleSession( + getFullJID(1), getTestPayloads1()); + + session0.addListener(new JingleSessionListener() { + public void sessionClosed(String reason, JingleSession jingleSession) { + } + + public void sessionClosedOnError(XMPPException e, JingleSession jingleSession) { + } + + public void sessionDeclined(String reason, JingleSession jingleSession) { + incCounter(); + System.out + .println("The session has been detected as rejected with reason: " + + reason); + } + + public void sessionEstablished(PayloadType pt, + TransportCandidate rc, TransportCandidate lc, JingleSession jingleSession) { + } + + public void sessionRedirected(String redirection, JingleSession jingleSession) { + } + }); + + session0.start(null); + + Thread.sleep(20000); + + assertTrue(valCounter() > 0); + + } + catch (Exception e) { + e.printStackTrace(); + fail("An error occured with Jingle"); + } + } + + /** + * RTP Bridge Test + */ + public void testRTPBridge() { + + resetCounter(); + + try { + + ProviderManager.getInstance().addIQProvider(RTPBridge.NAME, + RTPBridge.NAMESPACE, new RTPBridge.Provider()); + + XMPPConnection x2 = new XMPPConnection("thiago"); + x2.connect(); + x2.login("barata6", "barata6"); + + RTPBridge response = RTPBridge.getRTPBridge(x2, "102"); + + class Listener implements Runnable { + private byte[] buf = new byte[5000]; + private DatagramSocket dataSocket; + private DatagramPacket packet; + + public Listener(DatagramSocket dataSocket) { + this.dataSocket = dataSocket; + } + + public void run() { + try { + while (true) { + // Block until a datagram appears: + packet = new DatagramPacket(buf, buf.length); + dataSocket.receive(packet); + incCounter(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + try { + byte packet[] = {0, 0, 1, 1, 1, 1, 1}; + DatagramSocket ds0 = new DatagramSocket(14004, InetAddress.getByName("0.0.0.0")); + DatagramSocket ds1 = new DatagramSocket(14050, InetAddress.getByName("0.0.0.0")); + DatagramPacket echo0 = new DatagramPacket(packet, packet.length, + InetAddress.getLocalHost(), response.getPortA()); + DatagramPacket echo1 = new DatagramPacket(packet, packet.length, + InetAddress.getLocalHost(), response.getPortB()); + + ds1.send(echo1); + ds0.send(echo0); + + Thread.sleep(500); + + Thread t0 = new Thread(new Listener(ds0)); + Thread t1 = new Thread(new Listener(ds1)); + + t0.start(); + t1.start(); + + int repeat = 300; + + for (int i = 0; i < repeat; i++) { + ds0.send(echo0); + ds1.send(echo1); + Thread.sleep(200); + } + + System.out.println(valCounter()); + assertTrue(valCounter() == repeat * 2 + 1); + + t0.stop(); + t1.stop(); + + ds0.close(); + ds1.close(); + + } catch (Exception e) { + e.printStackTrace(); + } finally { + } + + } catch (Exception e) { + e.printStackTrace(); + } finally { + } + + } + + /** + * This is a full test in the Jingle API. + */ + public void testFullTest() { + + resetCounter(); + + try { + + XMPPConnection.DEBUG_ENABLED = true; + + XMPPConnection x0 = new XMPPConnection("thiago"); + XMPPConnection x1 = new XMPPConnection("thiago"); + + x0.connect(); + x0.login("barata7", "barata7"); + x1.connect(); + x1.login("barata6", "barata6"); + + final JingleManager jm0 = new JingleManager( + x0, new STUNResolver() { + }); + final JingleManager jm1 = new JingleManager( + x1, new FixedResolver("127.0.0.1", 20040)); + +// JingleManager jm0 = new JingleSessionManager( +// x0, new ICEResolver()); +// JingleManager jm1 = new JingleSessionManager( +// x1, new ICEResolver()); + + JingleMediaManager jingleMediaManager = new JingleMediaManager() { + // Media Session Implementation + public JingleMediaSession createMediaSession(final PayloadType payloadType, final TransportCandidate remote, final TransportCandidate local) { + return new JingleMediaSession(payloadType, remote, local) { + + public void initialize() { + } + + public void startTrasmit() { + } + + public void startReceive() { + } + + public void setTrasmit(boolean active) { + } + + public void stopTrasmit() { + } + + public void stopReceive() { + } + }; + } + }; + + jingleMediaManager.addPayloadType(new PayloadType.Audio(3, "GSM", 1, 16000)); + + jm0.setMediaManager(jingleMediaManager); + jm1.setMediaManager(jingleMediaManager); + + jm1.addJingleSessionRequestListener(new JingleSessionRequestListener() { + public void sessionRequested(final JingleSessionRequest request) { + + try { + + IncomingJingleSession session = request.accept(jm1.getMediaManager().getPayloads()); + session.addListener(new JingleSessionListener() { + + public void sessionEstablished(PayloadType pt, TransportCandidate rc, TransportCandidate lc, JingleSession jingleSession) { + //To change body of implemented methods use File | Settings | File Templates. + incCounter(); + System.out.println("Establish In"); + } + + public void sessionDeclined(String reason, JingleSession jingleSession) { + //To change body of implemented methods use File | Settings | File Templates. + } + + public void sessionRedirected(String redirection, JingleSession jingleSession) { + //To change body of implemented methods use File | Settings | File Templates. + } + + public void sessionClosed(String reason, JingleSession jingleSession) { + //To change body of implemented methods use File | Settings | File Templates. + } + + public void sessionClosedOnError(XMPPException e, JingleSession jingleSession) { + //To change body of implemented methods use File | Settings | File Templates. + } + }); + + session.start(); + } catch (XMPPException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } + + } + }); + + OutgoingJingleSession js0 = jm0.createOutgoingJingleSession("barata6@thiago/Smack"); + + js0.addListener(new JingleSessionListener() { + + public void sessionEstablished(PayloadType pt, TransportCandidate rc, TransportCandidate lc, JingleSession jingleSession) { + //To change body of implemented methods use File | Settings | File Templates. + incCounter(); + System.out.println("Establish Out"); + } + + public void sessionDeclined(String reason, JingleSession jingleSession) { + //To change body of implemented methods use File | Settings | File Templates. + } + + public void sessionRedirected(String redirection, JingleSession jingleSession) { + //To change body of implemented methods use File | Settings | File Templates. + } + + public void sessionClosed(String reason, JingleSession jingleSession) { + //To change body of implemented methods use File | Settings | File Templates. + } + + public void sessionClosedOnError(XMPPException e, JingleSession jingleSession) { + //To change body of implemented methods use File | Settings | File Templates. + } + }); + + js0.start(); + + Thread.sleep(12000); + js0.terminate(); + + assertTrue(valCounter() == 2); + //Thread.sleep(15000); + + } catch (Exception e) { + e.printStackTrace(); + } + + } + + /** + * This is a full test in the Jingle API. + */ + public void testMediaManager() { + + resetCounter(); + + try { + + //XMPPConnection.DEBUG_ENABLED = true; + + XMPPConnection x0 = new XMPPConnection("thiago"); + XMPPConnection x1 = new XMPPConnection("thiago"); + + x0.connect(); + x0.login("barata7", "barata7"); + x1.connect(); + x1.login("barata6", "barata6"); + + final JingleManager jm0 = new JingleManager( + x0, new FixedResolver("127.0.0.1", 20004)); + final JingleManager jm1 = new JingleManager( + x1, new FixedResolver("127.0.0.1", 20040)); + +// JingleManager jm0 = new JingleSessionManager( +// x0, new ICEResolver()); +// JingleManager jm1 = new JingleSessionManager( +// x1, new ICEResolver()); + + JingleMediaManager jingleMediaManager = new JingleMediaManager() { + // Media Session Implementation + public JingleMediaSession createMediaSession(final PayloadType payloadType, final TransportCandidate remote, final TransportCandidate local) { + return new JingleMediaSession(payloadType, remote, local) { + + public void initialize() { + + } + + public void startTrasmit() { + incCounter(); + System.out.println("Transmit"); + } + + public void startReceive() { + incCounter(); + System.out.println("Receive"); + } + + public void setTrasmit(boolean active) { + } + + public void stopTrasmit() { + incCounter(); + System.out.println("Stop Transmit"); + } + + public void stopReceive() { + incCounter(); + System.out.println("Stop Receive"); + } + }; + } + }; + + jingleMediaManager.addPayloadType(new PayloadType.Audio(3, "GSM", 1, 16000)); + + jm0.setMediaManager(jingleMediaManager); + jm1.setMediaManager(jingleMediaManager); + + jm1.addJingleSessionRequestListener(new JingleSessionRequestListener() { + public void sessionRequested(final JingleSessionRequest request) { + + try { + + IncomingJingleSession session = request.accept(jm1.getMediaManager().getPayloads()); + + session.start(request); + } catch (XMPPException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } + + } + }); + + OutgoingJingleSession js0 = jm0.createOutgoingJingleSession("barata6@thiago/Smack"); + + js0.start(); + + Thread.sleep(10000); + js0.terminate(); + + Thread.sleep(3000); + + System.out.println(valCounter()); + + assertTrue(valCounter() == 8); + //Thread.sleep(15000); + + } catch (Exception e) { + e.printStackTrace(); + } + + } + + /** + * This is a simple test where the user_2 rejects the Jingle session. + */ + public void testIncompatibleCodecs() { + + resetCounter(); + + try { + TransportResolver tr1 = new FixedResolver("127.0.0.1", 54222); + TransportResolver tr2 = new FixedResolver("127.0.0.1", 54567); + + final JingleManager man0 = new JingleManager(getConnection(0), tr1); + final JingleManager man1 = new JingleManager(getConnection(1), tr2); + + man1.addJingleSessionRequestListener(new JingleSessionRequestListener() { + /** + * Called when a new session request is detected + */ + public void sessionRequested + ( + final JingleSessionRequest request) { + System.out.println("Session request detected, from " + + request.getFrom() + ": accepting."); + + try { + // We reject the request + IncomingJingleSession ses = request.accept(getTestPayloads3()); + + ses.start(request); + } + catch (Exception e) { + e.printStackTrace(); + } + } + }); + + // Session 0 starts a request + System.out.println("Starting session request, to " + getFullJID(1) + "..."); + OutgoingJingleSession session0 = man0.createOutgoingJingleSession( + getFullJID(1), getTestPayloads1()); + + session0.addListener(new JingleSessionListener() { + public void sessionClosed(String reason, JingleSession jingleSession) { + } + + public void sessionClosedOnError(XMPPException e, JingleSession jingleSession) { + incCounter(); + System.out + .println("The session has been close on error with reason: " + + e.getMessage()); + } + + public void sessionDeclined(String reason, JingleSession jingleSession) { + incCounter(); + System.out + .println("The session has been detected as rejected with reason: " + + reason); + } + + public void sessionEstablished(PayloadType pt, + TransportCandidate rc, TransportCandidate lc, JingleSession jingleSession) { + } + + public void sessionRedirected(String redirection, JingleSession jingleSession) { + } + }); + + session0.start(null); + + Thread.sleep(20000); + + assertTrue(valCounter() > 0); + + } + catch (Exception e) { + e.printStackTrace(); + fail("An error occured with Jingle"); + } + } + + protected int getMaxConnections() { + return 2; + } + + /** + * Simple class for testing an IQ... + * + * @author Alvaro Saurin + */ + private class IQfake extends IQ { + + private String s; + + public IQfake(final String s) { + super(); + this.s = s; + } + + public String getChildElementXML() { + StringBuffer buf = new StringBuffer(); + buf.append(s); + return buf.toString(); + } + } +} diff --git a/jingle/extension/test/org/jivesoftware/smackx/jingle/JingleSessionTest.java b/jingle/extension/test/org/jivesoftware/smackx/jingle/JingleSessionTest.java new file mode 100644 index 000000000..5292844a1 --- /dev/null +++ b/jingle/extension/test/org/jivesoftware/smackx/jingle/JingleSessionTest.java @@ -0,0 +1,51 @@ +package org.jivesoftware.smackx.jingle; + +import org.jivesoftware.smack.test.SmackTestCase; +import org.jivesoftware.smackx.jingle.nat.BasicResolver; + +public class JingleSessionTest extends SmackTestCase { + + public JingleSessionTest(final String name) { + super(name); + } + + public void testEqualsObject() { + JingleSession js1 = new OutgoingJingleSession(getConnection(0), "res1", null, new BasicResolver()); + JingleSession js2 = new OutgoingJingleSession(getConnection(1), "res1", null, new BasicResolver()); + JingleSession js3 = new OutgoingJingleSession(getConnection(2), "res2", null, new BasicResolver()); + + System.out.println(js1.getSid()); + System.out.println(js2.getSid()); + + js1.setInitiator("js1"); + js2.setInitiator("js1"); + js1.setSid("10"); + js2.setSid("10"); + + assertEquals(js1, js2); + assertEquals(js2, js1); + + assertFalse(js1.equals(js3)); + } + + public void testGetInstanceFor() { + String ini1 = "initiator1"; + String sid1 = "sid1"; + String ini2 = "initiator2"; + String sid2 = "sid2"; + + JingleSession js1 = new OutgoingJingleSession(getConnection(0), sid1, null, new BasicResolver()); + JingleSession js2 = new OutgoingJingleSession(getConnection(1), sid2, null, new BasicResolver()); + + // For a packet, we should be able to get a session that handles that... + assertNotNull(JingleSession.getInstanceFor(getConnection(0))); + assertNotNull(JingleSession.getInstanceFor(getConnection(1))); + + assertEquals(JingleSession.getInstanceFor(getConnection(0)), js1); + assertEquals(JingleSession.getInstanceFor(getConnection(1)), js2); + } + + protected int getMaxConnections() { + return 3; + } +} diff --git a/jingle/extension/test/org/jivesoftware/smackx/jingle/JingleSupportTests.java b/jingle/extension/test/org/jivesoftware/smackx/jingle/JingleSupportTests.java new file mode 100644 index 000000000..03f8e68af --- /dev/null +++ b/jingle/extension/test/org/jivesoftware/smackx/jingle/JingleSupportTests.java @@ -0,0 +1,74 @@ +/** + * $RCSfile$ + * $Revision$ + * $Date$ + * + * Copyright (C) 2002-2006 Jive Software. All rights reserved. + * ==================================================================== + * The Jive Software License (based on Apache Software License, Version 1.1) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by + * Jive Software (http://www.jivesoftware.com)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Smack" and "Jive Software" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please + * contact webmaster@jivesoftware.com. + * + * 5. Products derived from this software may not be called "Smack", + * nor may "Smack" appear in their name, without prior written + * permission of Jive Software. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL JIVE SOFTWARE OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + */ + +package org.jivesoftware.smackx.jingle; + +import junit.framework.Test; +import junit.framework.TestSuite; + +/** + * Test suite that runs all the Jingle support tests + * + * @author Alvaro Saurin + */ +public class JingleSupportTests { + + public static Test suite() { + TestSuite suite = new TestSuite("High and low level API tests for Jingle support"); + + // $JUnit-BEGIN$ + suite.addTest(new TestSuite(JingleManagerTest.class)); + // $JUnit-END$ + + return suite; + } +} diff --git a/jingle/extension/test/org/jivesoftware/smackx/jingle/PayloadTypeTest.java b/jingle/extension/test/org/jivesoftware/smackx/jingle/PayloadTypeTest.java new file mode 100644 index 000000000..647e37bb8 --- /dev/null +++ b/jingle/extension/test/org/jivesoftware/smackx/jingle/PayloadTypeTest.java @@ -0,0 +1,89 @@ +package org.jivesoftware.smackx.jingle; + +import java.util.ArrayList; + +import org.jivesoftware.smack.test.SmackTestCase; +import org.jivesoftware.smackx.jingle.media.PayloadType; + +public class PayloadTypeTest extends SmackTestCase { + + public PayloadTypeTest(final String arg0) { + super(arg0); + } + + public void testEqualsObject() { + PayloadType p1 = new PayloadType(0, "pt1", 2); + PayloadType p2 = new PayloadType(0, "pt1", 2); + assertTrue(p1.equals(p2)); + } + + /** + * Test for the difference of payloads. + */ + public void testDifference() { + ArrayList set1 = new ArrayList(); + ArrayList set2 = new ArrayList(); + + PayloadType.Audio common1 = new PayloadType.Audio(34, "supercodec-1", 2, 14000); + PayloadType.Audio common2 = new PayloadType.Audio(56, "supercodec-2", 1, 44000); + + set1.add(common1); + set1.add(common2); + set1.add(new PayloadType.Audio(36, "supercodec-3", 2, 28000)); + set1.add(new PayloadType.Audio(45, "supercodec-4", 1, 98000)); + + set2.add(new PayloadType.Audio(27, "supercodec-3", 2, 28000)); + set2.add(common2); + set2.add(new PayloadType.Audio(32, "supercodec-4", 1, 98000)); + set2.add(common1); + + // Get the difference + ArrayList commonSet = new ArrayList(); + commonSet.addAll(set1); + commonSet.retainAll(set2); + + assertTrue(commonSet.size() == 2); + System.out.println("Codec " + ((PayloadType.Audio)commonSet.get(0)).getId()); + System.out.println("Codec " + ((PayloadType.Audio)commonSet.get(1)).getId()); + + assertTrue(commonSet.contains(common1)); + assertTrue(commonSet.contains(common2)); + } + + /** + * Test for the difference of payloads when we are handling the same sets. + */ + public void testDifferenceSameSet() { + ArrayList set1 = new ArrayList(); + ArrayList set2 = new ArrayList(); + + PayloadType.Audio common1 = new PayloadType.Audio(34, "supercodec-1", 2, 14000); + PayloadType.Audio common2 = new PayloadType.Audio(56, "supercodec-2", 1, 44000); + PayloadType.Audio common3 = new PayloadType.Audio(0, "supercodec-3", 1, 44000); + PayloadType.Audio common4 = new PayloadType.Audio(120, "supercodec-4", 2, 66060); + + set1.add(common1); + set1.add(common2); + set1.add(common3); + set1.add(common4); + + set2.add(common1); + set2.add(common2); + set2.add(common3); + set2.add(common4); + + // Get the difference + ArrayList commonSet = new ArrayList(); + commonSet.addAll(set1); + commonSet.retainAll(set2); + + assertTrue(commonSet.size() == 4); + assertTrue(commonSet.contains(common1)); + assertTrue(commonSet.contains(common2)); + } + + protected int getMaxConnections() { + return 0; + } + +} diff --git a/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/BasicResolverTest.java b/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/BasicResolverTest.java new file mode 100644 index 000000000..16fc889db --- /dev/null +++ b/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/BasicResolverTest.java @@ -0,0 +1,101 @@ +package org.jivesoftware.smackx.jingle.nat; + +import org.jivesoftware.smack.test.SmackTestCase; + +public class BasicResolverTest extends SmackTestCase { + + private int counter; + + private final Object mutex = new Object(); + + public BasicResolverTest(String arg) { + super(arg); + } + + // Counter management + + private void resetCounter() { + synchronized (mutex) { + counter = 0; + } + } + + private void incCounter() { + synchronized (mutex) { + counter++; + } + } + + private int valCounter() { + int val; + synchronized (mutex) { + val = counter; + } + return val; + } + + public void testCheckValidHostname() { + String validHostname = new String("slashdot.org"); + BasicResolver br = new BasicResolver(); + TransportCandidate tc = new TransportCandidate.Fixed(validHostname, 0); + + resetCounter(); + + tc.addListener(new TransportResolverListener.Checker() { + public void candidateChecked(TransportCandidate cand, boolean result) { + if(result == true) { + System.out.println(cand.getIp() + " is reachable (as expected)"); + incCounter(); + } + } + + public void candidateChecking(TransportCandidate cand) { + + } + }); + + tc.check(); + + try { + Thread.sleep(TransportResolver.CHECK_TIMEOUT); + } catch (Exception e) { + } + + assertTrue(valCounter() > 0); + } + + public void testCheckInvalidHostname() { + String invalidHostname = new String("camupilosupino.org"); + BasicResolver br = new BasicResolver(); + TransportCandidate tc = new TransportCandidate.Fixed(invalidHostname, 0); + + resetCounter(); + + tc.addListener(new TransportResolverListener.Checker() { + public void candidateChecked(TransportCandidate cand, boolean result) { + if(result == false) { + System.out.println(cand.getIp() + " is _not_ reachable (as expected)"); + incCounter(); + } + } + + public void candidateChecking(TransportCandidate cand) { + } + }); + + tc.check(); + + try { + Thread.sleep(TransportResolver.CHECK_TIMEOUT); + } catch (Exception e) { + } + + assertTrue(valCounter() > 0); + } + + + protected int getMaxConnections() { + return 0; + } + +} diff --git a/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/BridgedResolverTest.java b/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/BridgedResolverTest.java new file mode 100644 index 000000000..577fc5d09 --- /dev/null +++ b/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/BridgedResolverTest.java @@ -0,0 +1,172 @@ +package org.jivesoftware.smackx.jingle.nat; + +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.test.SmackTestCase; +import org.jivesoftware.smackx.jingle.IncomingJingleSession; +import org.jivesoftware.smackx.jingle.JingleManager; +import org.jivesoftware.smackx.jingle.JingleSessionRequest; +import org.jivesoftware.smackx.jingle.OutgoingJingleSession; +import org.jivesoftware.smackx.jingle.listeners.JingleSessionRequestListener; +import org.jivesoftware.smackx.jingle.media.JingleMediaManager; +import org.jivesoftware.smackx.jingle.media.JingleMediaSession; +import org.jivesoftware.smackx.jingle.media.PayloadType; + +public class BridgedResolverTest extends SmackTestCase { + + private int counter; + + private final Object mutex = new Object(); + + public BridgedResolverTest(String arg) { + super(arg); + } + + // Counter management + + private void resetCounter() { + synchronized (mutex) { + counter = 0; + } + } + + private void incCounter() { + synchronized (mutex) { + counter++; + } + } + + private int valCounter() { + int val; + synchronized (mutex) { + val = counter; + } + return val; + } + + public void testCheckService() { + assertTrue(RTPBridge.serviceAvailable(getConnection(0))); + } + + public void testGetBridge() { + + resetCounter(); + + RTPBridge rtpBridge = RTPBridge.getRTPBridge(getConnection(0), "001"); + + System.out.println(rtpBridge.getIp() + " portA:" + rtpBridge.getPortA() + " portB:" + rtpBridge.getPortB()); + + if (rtpBridge != null) { + if (rtpBridge.getIp() != null) incCounter(); + if (rtpBridge.getPortA() != -1) incCounter(); + if (rtpBridge.getPortB() != -1) incCounter(); + } + + assertTrue(valCounter() == 3); + } + + public void testFullBridge() { + resetCounter(); + + try { + + //XMPPConnection.DEBUG_ENABLED = true; + + XMPPConnection x0 = new XMPPConnection("thiago"); + XMPPConnection x1 = new XMPPConnection("thiago"); + + x0.connect(); + x0.login("barata7", "barata7"); + x1.connect(); + x1.login("barata6", "barata6"); + + final JingleManager jm0 = new JingleManager( + x0, new BridgedResolver(x0)); + final JingleManager jm1 = new JingleManager( + x1, new BridgedResolver(x1)); + + JingleMediaManager jingleMediaManager = new JingleMediaManager() { + // Media Session Implementation + public JingleMediaSession createMediaSession(final PayloadType payloadType, final TransportCandidate remote, final TransportCandidate local) { + return new JingleMediaSession(payloadType, remote, local) { + + public void initialize() { + + } + + public void startTrasmit() { + incCounter(); + + System.out.print("IPs:"); + System.out.println(local.getSymmetric().getIp()); + System.out.println(local.getIp()); + + System.out.println("Transmit"); + } + + public void startReceive() { + incCounter(); + System.out.println("Receive"); + } + + public void setTrasmit(boolean active) { + } + + public void stopTrasmit() { + incCounter(); + System.out.println("Stop Transmit"); + } + + public void stopReceive() { + incCounter(); + System.out.println("Stop Receive"); + } + }; + } + }; + + jingleMediaManager.addPayloadType(new PayloadType.Audio(3, "GSM", 1, 16000)); + + jm0.setMediaManager(jingleMediaManager); + jm1.setMediaManager(jingleMediaManager); + + jm1.addJingleSessionRequestListener(new JingleSessionRequestListener() { + public void sessionRequested(final JingleSessionRequest request) { + + try { + + IncomingJingleSession session = request.accept(jm1.getMediaManager().getPayloads()); + + session.start(request); + } catch (XMPPException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } + + } + }); + + OutgoingJingleSession js0 = jm0.createOutgoingJingleSession("barata6@thiago/Smack"); + + js0.start(); + + Thread.sleep(10000); + js0.terminate(); + + Thread.sleep(3000); + + System.out.println(valCounter()); + + assertTrue(valCounter() == 8); + //Thread.sleep(15000); + + } catch (Exception e) { + e.printStackTrace(); + } + + } + + protected int getMaxConnections() { + return 1; + } + +} diff --git a/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/STUNResolverTest.java b/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/STUNResolverTest.java new file mode 100644 index 000000000..ec75f5419 --- /dev/null +++ b/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/STUNResolverTest.java @@ -0,0 +1,342 @@ +package org.jivesoftware.smackx.jingle.nat; + +import de.javawi.jstun.test.demo.ice.Candidate; +import de.javawi.jstun.test.demo.ice.ICENegociator; +import de.javawi.jstun.util.UtilityException; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.test.SmackTestCase; +import org.jivesoftware.smackx.jingle.*; +import org.jivesoftware.smackx.jingle.listeners.JingleSessionListener; +import org.jivesoftware.smackx.jingle.listeners.JingleSessionRequestListener; +import org.jivesoftware.smackx.jingle.media.PayloadType; + +import java.net.UnknownHostException; +import java.util.ArrayList; + +/** + * Test the STUN IP resolver. + * + * @author alvaro + */ +public class STUNResolverTest extends SmackTestCase { + + // Counter management + + public STUNResolverTest(final String arg) { + super(arg); + } + + private int counter; + + private final Object mutex = new Object(); + + private void resetCounter() { + synchronized (mutex) { + counter = 0; + } + } + + private void incCounter() { + synchronized (mutex) { + counter++; + } + } + + private int valCounter() { + int val; + synchronized (mutex) { + val = counter; + } + return val; + } + + /** + * Test for getPreferredCandidate() + * + * @throws Exception + */ + public void testGetPreferredCandidate() throws Exception { + int highestPref = 100; + + TransportCandidate cand1 = new TransportCandidate.Ice("192.168.2.1", 3, 2, + "password", 3468, "username1", 1); + TransportCandidate cand2 = new TransportCandidate.Ice("192.168.5.1", 2, 10, + "password", 3469, "username2", 15); + TransportCandidate candH = new TransportCandidate.Ice("192.168.2.11", 1, 2, + "password", 3468, "usernameH", highestPref); + TransportCandidate cand3 = new TransportCandidate.Ice("192.168.2.10", 2, 10, + "password", 3469, "username3", 2); + TransportCandidate cand4 = new TransportCandidate.Ice("192.168.4.1", 3, 2, + "password", 3468, "username4", 78); + + STUNResolver stunResolver = new STUNResolver() { + }; + stunResolver.addCandidate(cand1); + stunResolver.addCandidate(cand2); + stunResolver.addCandidate(candH); + stunResolver.addCandidate(cand3); + stunResolver.addCandidate(cand4); + + assertEquals(stunResolver.getPreferredCandidate(), candH); + } + + /** + * Test for getPreferredCandidate() + * + * @throws Exception + */ + public void testGetPreferredCandidateICE() throws Exception { + int highestPref = 100; + + TransportCandidate cand1 = new TransportCandidate.Ice("192.168.2.1", 3, 2, + "password", 3468, "username1", 1); + TransportCandidate cand2 = new TransportCandidate.Ice("192.168.5.1", 2, 10, + "password", 3469, "username2", 15); + TransportCandidate candH = new TransportCandidate.Ice("192.168.2.11", 1, 2, + "password", 3468, "usernameH", highestPref); + TransportCandidate cand3 = new TransportCandidate.Ice("192.168.2.10", 2, 10, + "password", 3469, "username3", 2); + TransportCandidate cand4 = new TransportCandidate.Ice("192.168.4.1", 3, 2, + "password", 3468, "username4", 78); + + ICEResolver iceResolver = new ICEResolver() { + }; + iceResolver.addCandidate(cand1); + iceResolver.addCandidate(cand2); + iceResolver.addCandidate(candH); + iceResolver.addCandidate(cand3); + iceResolver.addCandidate(cand4); + + assertEquals(iceResolver.getPreferredCandidate(), candH); + } + + /** + * Test priority generated by STUN lib + * + * @throws Exception + */ + public void testICEPriority() throws Exception { + + String first = ""; + + for (int i = 0; i < 100; i++) { + + ICENegociator cc = new ICENegociator((short) 1); + // gather candidates + cc.gatherCandidateAddresses(); + // priorize candidates + cc.prioritizeCandidates(); + // get SortedCandidates + //List sortedCandidates = cc.getSortedCandidates(); + + for (Candidate candidate : cc.getSortedCandidates()) + try { + TransportCandidate transportCandidate = new TransportCandidate.Ice(candidate.getAddress().getInetAddress().getHostAddress(), 1, candidate.getNetwork(), "1", candidate.getPort(), "1", candidate.getPriority()); + transportCandidate.setLocalIp(candidate.getBase().getAddress().getInetAddress().getHostAddress()); + System.out.println("C: " + candidate.getAddress().getInetAddress() + "|" + candidate.getBase().getAddress().getInetAddress() + " p:" + candidate.getPriority()); + } catch (UtilityException e) { + e.printStackTrace(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + Candidate candidate = cc.getSortedCandidates().get(0); + String temp = "C: " + candidate.getAddress().getInetAddress() + "|" + candidate.getBase().getAddress().getInetAddress() + " p:" + candidate.getPriority(); + if (first.equals("")) + first = temp; + assertEquals(first, temp); + first = temp; + } + } + + /** + * Test for loadSTUNServers() + * + * @throws Exception + */ + public void testLoadSTUNServers() throws Exception { + STUNResolver stunResolver = new STUNResolver() { + }; + ArrayList stunServers = stunResolver.loadSTUNServers(); + + assertTrue(stunServers.size() > 0); + System.out.println(stunServers.size() + " servers loaded"); + } + + /** + * Test for resolve() + * + * @throws Exception + */ + public void testResolve() throws Exception { + + final STUNResolver stunResolver = new STUNResolver() { + }; + + stunResolver.addListener(new TransportResolverListener.Resolver() { + + public void candidateAdded(final TransportCandidate cand) { + incCounter(); + + String addr = cand.getIp(); + int port = cand.getPort(); + + System.out.println("Addr: " + addr + " port:" + port); + + } + + public void init() { + System.out.println("Resolution started"); + } + + public void end() { + System.out.println("Resolution finished"); + } + }); + + try { + stunResolver.initialize(); + Thread.sleep(55000); + assertTrue(valCounter() > 0); + stunResolver.resolve(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * Generate a list of payload types + * + * @return A testing list + */ + private ArrayList getTestPayloads1() { + ArrayList result = new ArrayList(); + + result.add(new PayloadType.Audio(34, "supercodec-1", 2, 14000)); + result.add(new PayloadType.Audio(56, "supercodec-2", 1, 44000)); + result.add(new PayloadType.Audio(36, "supercodec-3", 2, 28000)); + result.add(new PayloadType.Audio(45, "supercodec-4", 1, 98000)); + + return result; + } + + private ArrayList getTestPayloads2() { + ArrayList result = new ArrayList(); + + result.add(new PayloadType.Audio(27, "supercodec-3", 2, 28000)); + result.add(new PayloadType.Audio(56, "supercodec-2", 1, 44000)); + result.add(new PayloadType.Audio(32, "supercodec-4", 1, 98000)); + result.add(new PayloadType.Audio(34, "supercodec-1", 2, 14000)); + + return result; + } + + /** + * This is a simple test where the user_2 rejects the Jingle session. + */ + public void testSTUNJingleSession() { + + resetCounter(); + + try { + TransportResolver tr1 = new STUNResolver() { + }; + TransportResolver tr2 = new STUNResolver() { + }; + + // Explicit resolution + tr1.resolve(); + tr2.resolve(); + + final JingleManager man0 = new JingleManager(getConnection(0), tr1); + final JingleManager man1 = new JingleManager(getConnection(1), tr2); + + man1.addJingleSessionRequestListener(new JingleSessionRequestListener() { + /** + * Called when a new session request is detected + */ + public void sessionRequested(final JingleSessionRequest request) { + System.out.println("Session request detected, from " + + request.getFrom() + ": accepting."); + + // We accept the request + IncomingJingleSession session1; + try { + session1 = request.accept(getTestPayloads2()); + session1.addListener(new JingleSessionListener() { + public void sessionClosed(String reason, JingleSession jingleSession) { + } + + public void sessionClosedOnError(XMPPException e, JingleSession jingleSession) { + } + + public void sessionDeclined(String reason, JingleSession jingleSession) { + } + + public void sessionEstablished(PayloadType pt, + TransportCandidate rc, TransportCandidate lc, JingleSession jingleSession) { + incCounter(); + System.out + .println("Responder: the session is fully established."); + System.out.println("+ Payload Type: " + pt.getId()); + System.out.println("+ Local IP/port: " + lc.getIp() + ":" + + lc.getPort()); + System.out.println("+ Remote IP/port: " + rc.getIp() + ":" + + rc.getPort()); + } + + public void sessionRedirected(String redirection, JingleSession jingleSession) { + } + }); + session1.start(request); + } catch (XMPPException e) { + e.printStackTrace(); + } + } + }); + + // Session 0 starts a request + System.out.println("Starting session request, to " + getFullJID(1) + "..."); + OutgoingJingleSession session0 = man0.createOutgoingJingleSession( + getFullJID(1), getTestPayloads1()); + + session0.addListener(new JingleSessionListener() { + public void sessionClosed(String reason, JingleSession jingleSession) { + } + + public void sessionClosedOnError(XMPPException e, JingleSession jingleSession) { + } + + public void sessionDeclined(String reason, JingleSession jingleSession) { + } + + public void sessionEstablished(PayloadType pt, + TransportCandidate rc, TransportCandidate lc, JingleSession jingleSession) { + incCounter(); + System.out.println("Initiator: the session is fully established."); + System.out.println("+ Payload Type: " + pt.getId()); + System.out.println("+ Local IP/port: " + lc.getIp() + ":" + + lc.getPort()); + System.out.println("+ Remote IP/port: " + rc.getIp() + ":" + + rc.getPort()); + } + + public void sessionRedirected(String redirection, JingleSession jingleSession) { + } + }); + session0.start(null); + + Thread.sleep(60000); + + assertTrue(valCounter() == 2); + + } catch (Exception e) { + e.printStackTrace(); + fail("An error occured with Jingle"); + } + } + + protected int getMaxConnections() { + return 2; + } +} diff --git a/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/TransportCandidateTest.java b/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/TransportCandidateTest.java new file mode 100644 index 000000000..2aee30e70 --- /dev/null +++ b/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/TransportCandidateTest.java @@ -0,0 +1,59 @@ +package org.jivesoftware.smackx.jingle.nat; + +import java.util.ArrayList; +import java.util.Collections; +import org.jivesoftware.smack.test.SmackTestCase; + +public class TransportCandidateTest extends SmackTestCase { + + public TransportCandidateTest(final String arg0) { + super(arg0); + } + + /** + * Test for equals() + */ + public void testEqualsObject() { + TransportCandidate cand1 = new TransportCandidate.Ice("192.168.2.1", 1, 2, + "password", 3468, "username", 25); + TransportCandidate cand2 = new TransportCandidate.Ice("192.168.2.1", 1, 2, + "password", 3468, "username", 25); + TransportCandidate cand3 = new TransportCandidate.Ice("192.168.2.1", 1, 2, + "password", 3469, "username", 25); + + assertEquals(cand1, cand2); + assertFalse(cand1.equals(cand3)); + } + + /** + * Test for compareTo() + */ + public void testCompareTo() { + int highestPref = 100; + + TransportCandidate cand1 = new TransportCandidate.Ice("192.168.2.1", 3, 2, + "password", 3468, "username", 1); + TransportCandidate cand2 = new TransportCandidate.Ice("192.168.5.1", 2, 10, + "password", 3469, "username", 15); + TransportCandidate candH = new TransportCandidate.Ice("192.168.2.1", 1, 2, + "password", 3468, "username", highestPref); + TransportCandidate cand3 = new TransportCandidate.Ice("192.168.2.10", 2, 10, + "password", 3469, "username", 2); + TransportCandidate cand4 = new TransportCandidate.Ice("192.168.4.1", 3, 2, + "password", 3468, "username", 78); + + ArrayList candList = new ArrayList(); + candList.add(cand1); + candList.add(cand2); + candList.add(candH); + candList.add(cand3); + candList.add(cand4); + + Collections.sort(candList); + assertEquals(candList.get(candList.size() - 1), candH); + } + + protected int getMaxConnections() { + return 0; + } +} diff --git a/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/TransportResolverTest.java b/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/TransportResolverTest.java new file mode 100644 index 000000000..a7fc45cb4 --- /dev/null +++ b/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/TransportResolverTest.java @@ -0,0 +1,50 @@ +package org.jivesoftware.smackx.jingle.nat; + +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.test.SmackTestCase; + +public class TransportResolverTest extends SmackTestCase { + + public TransportResolverTest(final String arg) { + super(arg); + } + + public void testIsResolving() { + final TransportResolver tr = new BasicResolver(); + + tr.addListener( + new TransportResolverListener.Resolver() { + public void candidateAdded(final TransportCandidate cand) { + System.out.println("candidateAdded() called."); + assertTrue(tr.isResolving() || (!tr.isResolving() && tr.isResolved())); + } + + public void end() { + System.out.println("end() called."); + assertFalse(tr.isResolving()); + assertTrue(tr.isResolved()); + } + + public void init() { + System.out.println("init() called."); + assertTrue(tr.isResolving()); + assertFalse(tr.isResolved()); + } + }); + + assertFalse(tr.isResolving()); + assertFalse(tr.isResolved()); + + try { + tr.resolve(); + } catch (XMPPException e) { + e.printStackTrace(); + fail("Error resolving"); + } + } + + protected int getMaxConnections() { + return 0; + } + +} diff --git a/jingle/extension/test/org/jivesoftware/smackx/provider/JingleProviderTest.java b/jingle/extension/test/org/jivesoftware/smackx/provider/JingleProviderTest.java new file mode 100644 index 000000000..a54732410 --- /dev/null +++ b/jingle/extension/test/org/jivesoftware/smackx/provider/JingleProviderTest.java @@ -0,0 +1,112 @@ +package org.jivesoftware.smackx.provider; + +import org.jivesoftware.smack.PacketCollector; +import org.jivesoftware.smack.SmackConfiguration; +import org.jivesoftware.smack.filter.PacketFilter; +import org.jivesoftware.smack.filter.PacketTypeFilter; +import org.jivesoftware.smack.packet.IQ; +import org.jivesoftware.smack.provider.IQProvider; +import org.jivesoftware.smack.provider.ProviderManager; +import org.jivesoftware.smack.test.SmackTestCase; +import org.jivesoftware.smackx.packet.Jingle; + +public class JingleProviderTest extends SmackTestCase { + + public JingleProviderTest(final String name) { + super(name); + } + + public void testProviderManager() { + IQProvider iqProv; + String elementNamee = Jingle.getElementName(); + String nameSpace = Jingle.getNamespace(); + + System.out.println("Testing if the Jingle IQ provider is registered..."); + + // Verify that the Jingle IQProvider is registered. + iqProv = (IQProvider)ProviderManager.getInstance().getIQProvider(elementNamee, nameSpace); + + assertNotNull(iqProv); + } + + /** + * Test for parsing a Jingle + */ + public void testParseIQSimple() { + + // Create a dummy packet for testing... + IQfake iqSent = new IQfake ( + " " + + " " + + " " + + " " + + ""); + + iqSent.setTo(getFullJID(0)); + iqSent.setFrom(getFullJID(0)); + iqSent.setType(IQ.Type.GET); + + // Create a filter and a collector... + PacketFilter filter = new PacketTypeFilter(IQ.class); + PacketCollector collector = getConnection(0).createPacketCollector(filter); + + System.out.println("Testing if a Jingle IQ can be sent and received..."); + + // Send the iq packet with an invalid namespace + getConnection(0).sendPacket(iqSent); + + // Receive the packet + IQ iqReceived = (IQ)collector.nextResult(SmackConfiguration.getPacketReplyTimeout()); + + // Stop queuing results + collector.cancel(); + + if (iqReceived == null) { + fail("No response from server"); + } + else if (iqReceived.getType() == IQ.Type.ERROR) { + fail("The server did reply with an error packet: " + iqReceived.getError().getCode()); + } + else { + assertTrue(iqReceived instanceof Jingle); + + Jingle jin = (Jingle) iqReceived; + + System.out.println("Sent: " + iqSent.toXML()); + System.out.println("Received: " + jin.toXML()); + } + } + + /** + * Simple class for testing an IQ... + * @author Alvaro Saurin + */ + private class IQfake extends IQ { + private String s; + + public IQfake(final String s) { + super(); + this.s = s; + } + + public String getChildElementXML() { + StringBuffer buf = new StringBuffer(); + buf.append(s); + return buf.toString(); + } + } + + + protected int getMaxConnections() { + return 2; + } + +} diff --git a/jingle/media/build/lib/Speex.jar b/jingle/media/build/lib/Speex.jar new file mode 100644 index 0000000000000000000000000000000000000000..f8abcbb0b954c2fc8ed85854047ad640c3c110f8 GIT binary patch literal 94008 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 ~#cg~NZMb1wdyl5^b2DmvqesEZWz5Z~R)wT$; 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

9o{XbZ|x2L5HkN2kR{h?B%| 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%0AbmijLzlr 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�iUKHLbel!()sg) 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