From db13021be9d837ec9caef0986624aa12dc2d73ce Mon Sep 17 00:00:00 2001 From: rdkartono Date: Mon, 18 Nov 2024 12:09:33 +0700 Subject: [PATCH] adaptation of old eclipse code to Intellij --- .idea/.gitignore | 8 + .idea/compiler.xml | 8 + .idea/inspectionProfiles/Project_Default.xml | 16 + .idea/libraries/google_code_gson.xml | 11 + .idea/libraries/io_javalin.xml | 32 + .idea/libraries/net_java_dev_jna.xml | 10 + .idea/libraries/projectlombok_lombok.xml | 10 + .idea/libraries/tinylog.xml | 10 + .idea/misc.xml | 50 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + SIPIntercom.iml | 17 + libs/linux-aarch64/libbass.so | Bin 0 -> 250784 bytes libs/linux-armhf/libbass.so | Bin 0 -> 258404 bytes libs/linux-x86-64/libbass.so | Bin 0 -> 236688 bytes libs/linux-x86/libbass.so | Bin 0 -> 240524 bytes libs/win32-arm64/bass.dll | Bin 0 -> 265264 bytes libs/win32-x86-64/bass.dll | Bin 0 -> 160320 bytes libs/win32-x86/bass.dll | Bin 0 -> 139128 bytes src/Audio/AudioEvent1.java | 7 + src/Audio/Bass.java | 1092 +++++++++++++++++ src/Audio/BassAAC.java | 45 + src/Audio/BassEnc.java | 173 +++ src/Audio/BassEncAAC.java | 22 + src/Audio/BassEncMP3.java | 23 + src/Audio/BassEncOGG.java | 28 + src/Audio/BassEncOPUS.java | 28 + src/Audio/BassFileReader.java | 140 +++ src/Audio/BassFileReaderListener.java | 14 + src/Audio/BassMix.java | 133 ++ src/Audio/BassOPUS.java | 24 + src/Audio/CompressInputStream.java | 162 +++ src/Audio/ConvertInputStream.java | 118 ++ src/Audio/DecompressInputStream.java | 138 +++ src/Audio/G711.java | 222 ++++ src/Audio/JSIPAudio.java | 873 +++++++++++++ src/Audio/basicfunctions.java | 311 +++++ src/Main.java | 6 + src/peers/Config.java | 53 + src/peers/JavaConfig.java | 156 +++ src/peers/XmlConfig.java | 355 ++++++ src/peers/javaxsound/JavaxSoundManager.java | 214 ++++ src/peers/media/AbstractSoundManager.java | 28 + src/peers/media/Capture.java | 80 ++ src/peers/media/CaptureRtpSender.java | 130 ++ src/peers/media/Decoder.java | 26 + src/peers/media/DtmfFactory.java | 95 ++ src/peers/media/Echo.java | 80 ++ src/peers/media/Encoder.java | 149 +++ src/peers/media/FileReader.java | 96 ++ src/peers/media/IncomingRtpReader.java | 69 ++ src/peers/media/MediaManager.java | 335 +++++ src/peers/media/MediaMode.java | 24 + src/peers/media/PcmaDecoder.java | 71 ++ src/peers/media/PcmaEncoder.java | 98 ++ src/peers/media/PcmuDecoder.java | 103 ++ src/peers/media/PcmuEncoder.java | 130 ++ src/peers/media/RtpSender.java | 201 +++ src/peers/media/SoundSource.java | 30 + src/peers/nat/Client.java | 64 + src/peers/nat/PeerManager.java | 117 ++ src/peers/nat/Server.java | 175 +++ src/peers/nat/UDPReceiver.java | 49 + src/peers/nat/api/DataReceiver.java | 26 + src/peers/nat/api/PeersClient.java | 47 + src/peers/nat/api/TCPTransport.java | 24 + src/peers/nat/api/Transport.java | 25 + src/peers/nat/api/UDPTransport.java | 24 + src/peers/rtp/RFC3551.java | 34 + src/peers/rtp/RFC4733.java | 32 + src/peers/rtp/RtpListener.java | 26 + src/peers/rtp/RtpPacket.java | 124 ++ src/peers/rtp/RtpParser.java | 119 ++ src/peers/rtp/RtpSession.java | 264 ++++ src/peers/sdp/Codec.java | 67 + src/peers/sdp/MediaDescription.java | 118 ++ src/peers/sdp/MediaDestination.java | 52 + src/peers/sdp/NoCodecException.java | 26 + src/peers/sdp/RFC4566.java | 49 + src/peers/sdp/SDPManager.java | 150 +++ src/peers/sdp/SDPMessage.java | 25 + src/peers/sdp/SdpLine.java | 38 + src/peers/sdp/SdpParser.java | 236 ++++ src/peers/sdp/SessionDescription.java | 129 ++ src/peers/sip/AbstractState.java | 43 + src/peers/sip/JavaUtils.java | 29 + src/peers/sip/RFC2617.java | 47 + src/peers/sip/RFC3261.java | 169 +++ src/peers/sip/Utils.java | 128 ++ .../sip/core/useragent/ChallengeManager.java | 300 +++++ .../core/useragent/InitialRequestManager.java | 312 +++++ .../core/useragent/MessageInterceptor.java | 27 + .../useragent/MidDialogRequestManager.java | 251 ++++ .../sip/core/useragent/RequestManager.java | 136 ++ src/peers/sip/core/useragent/SipEvent.java | 46 + src/peers/sip/core/useragent/SipListener.java | 44 + src/peers/sip/core/useragent/UAC.java | 227 ++++ src/peers/sip/core/useragent/UAS.java | 133 ++ src/peers/sip/core/useragent/UserAgent.java | 382 ++++++ .../core/useragent/handlers/ByeHandler.java | 183 +++ .../useragent/handlers/CancelHandler.java | 172 +++ .../handlers/DialogMethodHandler.java | 283 +++++ .../useragent/handlers/InviteHandler.java | 693 +++++++++++ .../useragent/handlers/MethodHandler.java | 86 ++ .../useragent/handlers/OptionsHandler.java | 83 ++ .../useragent/handlers/RegisterHandler.java | 293 +++++ src/peers/sip/syntaxencoding/NameAddress.java | 66 + .../sip/syntaxencoding/RunnableSipParser.java | 29 + src/peers/sip/syntaxencoding/SipHeader.java | 54 + .../SipHeaderFieldMultiValue.java | 49 + .../syntaxencoding/SipHeaderFieldName.java | 63 + .../syntaxencoding/SipHeaderFieldValue.java | 103 ++ .../syntaxencoding/SipHeaderParamName.java | 56 + src/peers/sip/syntaxencoding/SipHeaders.java | 102 ++ .../sip/syntaxencoding/SipHeadersTable.java | 53 + src/peers/sip/syntaxencoding/SipParser.java | 189 +++ .../syntaxencoding/SipParserException.java | 42 + src/peers/sip/syntaxencoding/SipURI.java | 136 ++ .../syntaxencoding/SipUriSyntaxException.java | 43 + .../sip/transaction/ClientTransaction.java | 29 + .../transaction/ClientTransactionUser.java | 31 + .../transaction/InviteClientTransaction.java | 247 ++++ .../InviteClientTransactionState.java | 45 + .../InviteClientTransactionStateCalling.java | 82 ++ ...InviteClientTransactionStateCompleted.java | 59 + .../InviteClientTransactionStateInit.java | 37 + ...nviteClientTransactionStateProceeding.java | 58 + ...nviteClientTransactionStateTerminated.java | 32 + .../transaction/InviteServerTransaction.java | 179 +++ .../InviteServerTransactionState.java | 46 + ...InviteServerTransactionStateCompleted.java | 74 ++ ...InviteServerTransactionStateConfirmed.java | 45 + .../InviteServerTransactionStateInit.java | 37 + ...nviteServerTransactionStateProceeding.java | 74 ++ ...nviteServerTransactionStateTerminated.java | 32 + .../sip/transaction/InviteTransaction.java | 37 + .../NonInviteClientTransaction.java | 202 +++ .../NonInviteClientTransactionState.java | 43 + ...InviteClientTransactionStateCompleted.java | 47 + .../NonInviteClientTransactionStateInit.java | 37 + ...nviteClientTransactionStateProceeding.java | 80 ++ ...nviteClientTransactionStateTerminated.java | 32 + ...NonInviteClientTransactionStateTrying.java | 83 ++ .../NonInviteServerTransaction.java | 126 ++ .../NonInviteServerTransactionState.java | 42 + ...InviteServerTransactionStateCompleted.java | 51 + ...nviteServerTransactionStateProceeding.java | 72 ++ ...nviteServerTransactionStateTerminated.java | 32 + ...NonInviteServerTransactionStateTrying.java | 47 + .../sip/transaction/NonInviteTransaction.java | 35 + .../sip/transaction/ServerTransaction.java | 32 + .../transaction/ServerTransactionUser.java | 25 + .../sip/transaction/SipListeningPoint.java | 64 + src/peers/sip/transaction/Transaction.java | 77 ++ .../sip/transaction/TransactionManager.java | 209 ++++ src/peers/sip/transactionuser/Dialog.java | 259 ++++ .../sip/transactionuser/DialogManager.java | 115 ++ .../sip/transactionuser/DialogState.java | 40 + .../transactionuser/DialogStateConfirmed.java | 55 + .../sip/transactionuser/DialogStateEarly.java | 54 + .../sip/transactionuser/DialogStateInit.java | 54 + .../DialogStateTerminated.java | 55 + src/peers/sip/transport/MessageReceiver.java | 205 ++++ src/peers/sip/transport/MessageSender.java | 102 ++ .../sip/transport/SipClientTransportUser.java | 27 + src/peers/sip/transport/SipMessage.java | 80 ++ src/peers/sip/transport/SipRequest.java | 53 + src/peers/sip/transport/SipResponse.java | 50 + .../sip/transport/SipServerTransportUser.java | 25 + .../sip/transport/SipTransportConnection.java | 123 ++ src/peers/sip/transport/TransportManager.java | 479 ++++++++ .../sip/transport/UdpMessageReceiver.java | 90 ++ src/peers/sip/transport/UdpMessageSender.java | 88 ++ 173 files changed, 17794 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/libraries/google_code_gson.xml create mode 100644 .idea/libraries/io_javalin.xml create mode 100644 .idea/libraries/net_java_dev_jna.xml create mode 100644 .idea/libraries/projectlombok_lombok.xml create mode 100644 .idea/libraries/tinylog.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 SIPIntercom.iml create mode 100644 libs/linux-aarch64/libbass.so create mode 100644 libs/linux-armhf/libbass.so create mode 100644 libs/linux-x86-64/libbass.so create mode 100644 libs/linux-x86/libbass.so create mode 100644 libs/win32-arm64/bass.dll create mode 100644 libs/win32-x86-64/bass.dll create mode 100644 libs/win32-x86/bass.dll create mode 100644 src/Audio/AudioEvent1.java create mode 100644 src/Audio/Bass.java create mode 100644 src/Audio/BassAAC.java create mode 100644 src/Audio/BassEnc.java create mode 100644 src/Audio/BassEncAAC.java create mode 100644 src/Audio/BassEncMP3.java create mode 100644 src/Audio/BassEncOGG.java create mode 100644 src/Audio/BassEncOPUS.java create mode 100644 src/Audio/BassFileReader.java create mode 100644 src/Audio/BassFileReaderListener.java create mode 100644 src/Audio/BassMix.java create mode 100644 src/Audio/BassOPUS.java create mode 100644 src/Audio/CompressInputStream.java create mode 100644 src/Audio/ConvertInputStream.java create mode 100644 src/Audio/DecompressInputStream.java create mode 100644 src/Audio/G711.java create mode 100644 src/Audio/JSIPAudio.java create mode 100644 src/Audio/basicfunctions.java create mode 100644 src/Main.java create mode 100644 src/peers/Config.java create mode 100644 src/peers/JavaConfig.java create mode 100644 src/peers/XmlConfig.java create mode 100644 src/peers/javaxsound/JavaxSoundManager.java create mode 100644 src/peers/media/AbstractSoundManager.java create mode 100644 src/peers/media/Capture.java create mode 100644 src/peers/media/CaptureRtpSender.java create mode 100644 src/peers/media/Decoder.java create mode 100644 src/peers/media/DtmfFactory.java create mode 100644 src/peers/media/Echo.java create mode 100644 src/peers/media/Encoder.java create mode 100644 src/peers/media/FileReader.java create mode 100644 src/peers/media/IncomingRtpReader.java create mode 100644 src/peers/media/MediaManager.java create mode 100644 src/peers/media/MediaMode.java create mode 100644 src/peers/media/PcmaDecoder.java create mode 100644 src/peers/media/PcmaEncoder.java create mode 100644 src/peers/media/PcmuDecoder.java create mode 100644 src/peers/media/PcmuEncoder.java create mode 100644 src/peers/media/RtpSender.java create mode 100644 src/peers/media/SoundSource.java create mode 100644 src/peers/nat/Client.java create mode 100644 src/peers/nat/PeerManager.java create mode 100644 src/peers/nat/Server.java create mode 100644 src/peers/nat/UDPReceiver.java create mode 100644 src/peers/nat/api/DataReceiver.java create mode 100644 src/peers/nat/api/PeersClient.java create mode 100644 src/peers/nat/api/TCPTransport.java create mode 100644 src/peers/nat/api/Transport.java create mode 100644 src/peers/nat/api/UDPTransport.java create mode 100644 src/peers/rtp/RFC3551.java create mode 100644 src/peers/rtp/RFC4733.java create mode 100644 src/peers/rtp/RtpListener.java create mode 100644 src/peers/rtp/RtpPacket.java create mode 100644 src/peers/rtp/RtpParser.java create mode 100644 src/peers/rtp/RtpSession.java create mode 100644 src/peers/sdp/Codec.java create mode 100644 src/peers/sdp/MediaDescription.java create mode 100644 src/peers/sdp/MediaDestination.java create mode 100644 src/peers/sdp/NoCodecException.java create mode 100644 src/peers/sdp/RFC4566.java create mode 100644 src/peers/sdp/SDPManager.java create mode 100644 src/peers/sdp/SDPMessage.java create mode 100644 src/peers/sdp/SdpLine.java create mode 100644 src/peers/sdp/SdpParser.java create mode 100644 src/peers/sdp/SessionDescription.java create mode 100644 src/peers/sip/AbstractState.java create mode 100644 src/peers/sip/JavaUtils.java create mode 100644 src/peers/sip/RFC2617.java create mode 100644 src/peers/sip/RFC3261.java create mode 100644 src/peers/sip/Utils.java create mode 100644 src/peers/sip/core/useragent/ChallengeManager.java create mode 100644 src/peers/sip/core/useragent/InitialRequestManager.java create mode 100644 src/peers/sip/core/useragent/MessageInterceptor.java create mode 100644 src/peers/sip/core/useragent/MidDialogRequestManager.java create mode 100644 src/peers/sip/core/useragent/RequestManager.java create mode 100644 src/peers/sip/core/useragent/SipEvent.java create mode 100644 src/peers/sip/core/useragent/SipListener.java create mode 100644 src/peers/sip/core/useragent/UAC.java create mode 100644 src/peers/sip/core/useragent/UAS.java create mode 100644 src/peers/sip/core/useragent/UserAgent.java create mode 100644 src/peers/sip/core/useragent/handlers/ByeHandler.java create mode 100644 src/peers/sip/core/useragent/handlers/CancelHandler.java create mode 100644 src/peers/sip/core/useragent/handlers/DialogMethodHandler.java create mode 100644 src/peers/sip/core/useragent/handlers/InviteHandler.java create mode 100644 src/peers/sip/core/useragent/handlers/MethodHandler.java create mode 100644 src/peers/sip/core/useragent/handlers/OptionsHandler.java create mode 100644 src/peers/sip/core/useragent/handlers/RegisterHandler.java create mode 100644 src/peers/sip/syntaxencoding/NameAddress.java create mode 100644 src/peers/sip/syntaxencoding/RunnableSipParser.java create mode 100644 src/peers/sip/syntaxencoding/SipHeader.java create mode 100644 src/peers/sip/syntaxencoding/SipHeaderFieldMultiValue.java create mode 100644 src/peers/sip/syntaxencoding/SipHeaderFieldName.java create mode 100644 src/peers/sip/syntaxencoding/SipHeaderFieldValue.java create mode 100644 src/peers/sip/syntaxencoding/SipHeaderParamName.java create mode 100644 src/peers/sip/syntaxencoding/SipHeaders.java create mode 100644 src/peers/sip/syntaxencoding/SipHeadersTable.java create mode 100644 src/peers/sip/syntaxencoding/SipParser.java create mode 100644 src/peers/sip/syntaxencoding/SipParserException.java create mode 100644 src/peers/sip/syntaxencoding/SipURI.java create mode 100644 src/peers/sip/syntaxencoding/SipUriSyntaxException.java create mode 100644 src/peers/sip/transaction/ClientTransaction.java create mode 100644 src/peers/sip/transaction/ClientTransactionUser.java create mode 100644 src/peers/sip/transaction/InviteClientTransaction.java create mode 100644 src/peers/sip/transaction/InviteClientTransactionState.java create mode 100644 src/peers/sip/transaction/InviteClientTransactionStateCalling.java create mode 100644 src/peers/sip/transaction/InviteClientTransactionStateCompleted.java create mode 100644 src/peers/sip/transaction/InviteClientTransactionStateInit.java create mode 100644 src/peers/sip/transaction/InviteClientTransactionStateProceeding.java create mode 100644 src/peers/sip/transaction/InviteClientTransactionStateTerminated.java create mode 100644 src/peers/sip/transaction/InviteServerTransaction.java create mode 100644 src/peers/sip/transaction/InviteServerTransactionState.java create mode 100644 src/peers/sip/transaction/InviteServerTransactionStateCompleted.java create mode 100644 src/peers/sip/transaction/InviteServerTransactionStateConfirmed.java create mode 100644 src/peers/sip/transaction/InviteServerTransactionStateInit.java create mode 100644 src/peers/sip/transaction/InviteServerTransactionStateProceeding.java create mode 100644 src/peers/sip/transaction/InviteServerTransactionStateTerminated.java create mode 100644 src/peers/sip/transaction/InviteTransaction.java create mode 100644 src/peers/sip/transaction/NonInviteClientTransaction.java create mode 100644 src/peers/sip/transaction/NonInviteClientTransactionState.java create mode 100644 src/peers/sip/transaction/NonInviteClientTransactionStateCompleted.java create mode 100644 src/peers/sip/transaction/NonInviteClientTransactionStateInit.java create mode 100644 src/peers/sip/transaction/NonInviteClientTransactionStateProceeding.java create mode 100644 src/peers/sip/transaction/NonInviteClientTransactionStateTerminated.java create mode 100644 src/peers/sip/transaction/NonInviteClientTransactionStateTrying.java create mode 100644 src/peers/sip/transaction/NonInviteServerTransaction.java create mode 100644 src/peers/sip/transaction/NonInviteServerTransactionState.java create mode 100644 src/peers/sip/transaction/NonInviteServerTransactionStateCompleted.java create mode 100644 src/peers/sip/transaction/NonInviteServerTransactionStateProceeding.java create mode 100644 src/peers/sip/transaction/NonInviteServerTransactionStateTerminated.java create mode 100644 src/peers/sip/transaction/NonInviteServerTransactionStateTrying.java create mode 100644 src/peers/sip/transaction/NonInviteTransaction.java create mode 100644 src/peers/sip/transaction/ServerTransaction.java create mode 100644 src/peers/sip/transaction/ServerTransactionUser.java create mode 100644 src/peers/sip/transaction/SipListeningPoint.java create mode 100644 src/peers/sip/transaction/Transaction.java create mode 100644 src/peers/sip/transaction/TransactionManager.java create mode 100644 src/peers/sip/transactionuser/Dialog.java create mode 100644 src/peers/sip/transactionuser/DialogManager.java create mode 100644 src/peers/sip/transactionuser/DialogState.java create mode 100644 src/peers/sip/transactionuser/DialogStateConfirmed.java create mode 100644 src/peers/sip/transactionuser/DialogStateEarly.java create mode 100644 src/peers/sip/transactionuser/DialogStateInit.java create mode 100644 src/peers/sip/transactionuser/DialogStateTerminated.java create mode 100644 src/peers/sip/transport/MessageReceiver.java create mode 100644 src/peers/sip/transport/MessageSender.java create mode 100644 src/peers/sip/transport/SipClientTransportUser.java create mode 100644 src/peers/sip/transport/SipMessage.java create mode 100644 src/peers/sip/transport/SipRequest.java create mode 100644 src/peers/sip/transport/SipResponse.java create mode 100644 src/peers/sip/transport/SipServerTransportUser.java create mode 100644 src/peers/sip/transport/SipTransportConnection.java create mode 100644 src/peers/sip/transport/TransportManager.java create mode 100644 src/peers/sip/transport/UdpMessageReceiver.java create mode 100644 src/peers/sip/transport/UdpMessageSender.java diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..a1757ae --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..93d2ad4 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/.idea/libraries/google_code_gson.xml b/.idea/libraries/google_code_gson.xml new file mode 100644 index 0000000..f62abb1 --- /dev/null +++ b/.idea/libraries/google_code_gson.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/io_javalin.xml b/.idea/libraries/io_javalin.xml new file mode 100644 index 0000000..d7ab6e0 --- /dev/null +++ b/.idea/libraries/io_javalin.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/net_java_dev_jna.xml b/.idea/libraries/net_java_dev_jna.xml new file mode 100644 index 0000000..8705a10 --- /dev/null +++ b/.idea/libraries/net_java_dev_jna.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/projectlombok_lombok.xml b/.idea/libraries/projectlombok_lombok.xml new file mode 100644 index 0000000..8fe179f --- /dev/null +++ b/.idea/libraries/projectlombok_lombok.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/tinylog.xml b/.idea/libraries/tinylog.xml new file mode 100644 index 0000000..6f50db9 --- /dev/null +++ b/.idea/libraries/tinylog.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..af89096 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,50 @@ + + + + + + + + + Android + + + CodePlugin DevKit + + + ComplianceLintAndroid + + + CorrectnessLintAndroid + + + Java + + + Java language level migration aidsJava + + + LintAndroid + + + PerformanceLintAndroid + + + Plugin DevKit + + + UsabilityLintAndroid + + + + + Android + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..f8dd09c --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SIPIntercom.iml b/SIPIntercom.iml new file mode 100644 index 0000000..dc9b352 --- /dev/null +++ b/SIPIntercom.iml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libs/linux-aarch64/libbass.so b/libs/linux-aarch64/libbass.so new file mode 100644 index 0000000000000000000000000000000000000000..ab2a5170672ac3cf21fa000be38e263d92b3bf99 GIT binary patch literal 250784 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�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 literal 0 HcmV?d00001 diff --git a/libs/linux-armhf/libbass.so b/libs/linux-armhf/libbass.so new file mode 100644 index 0000000000000000000000000000000000000000..ec90dc005535352e30fd8d5a6c75894932238927 GIT binary patch literal 258404 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 z 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%0D0^9ns~QszDko(N!U-Mg{{QPDV%1X}VK3;ESJWVx zBI3Gg4Qs2y2^t6{hj2m(fV893n$YG)IN=o=Ps{h11~fI)TETYxVGL}yTn&_j@83e} zgqAIOI}eBavJ79uyf4M3tf4RshzAvrDD>&@V=d+A>F$^)eAt7W$8?mx-GiKzp#$yg zTIe8@uGH?Y3nx6kmX%eT0f!S>KSu*A%1UabZofoGjpRwc%F3Z)Ox8G@+rN zSKWur#1Q_t>iIj+5+|Mo2c$?WSa=YTaU?~~=+rym1&dk1{C06BX*TUDh)0rK)2M4v z@EornCP-xi*mKPbx1lRYy#t+VU`#yW{zUzJ5B~f@!hy$OdYfE32#egIOYnn-h}~fG z{hzdVki=@tz5yrzc-#WDz9vm(oy&Ek@oDPf)EEsq;8u3Fo;N;93T;Bmg-3_~O`d`y z;)%GF6DM$@ACKLPS;d|ElJiXNeB>`okAD-Ki@0+%IgjGb!-em4aL(e+C%3|R2zUO9 z`<83&4pXl+<{D1XiSqjvX6PP+GL=)#=9D&~e8wsF7?e~_Ier8DLFvya z)Q*7i8d2&vCC;E6JjHBzic?-B%3@AA`WTC>T+_@cm7MZ4Q6_N8P(#bJoN_y-tRc!3 zoKj5?WeZkNDbgc3<$j`AIc0=Fxr0*@IHiav-}3w&Y*0pV%He)2M!7`U!YQ8mlFgFbH}9cPOe`8nk(PKhDPF={N;n0kY9E2qSANc#8w4`#%QwHTB zPH}O{Po$+kr`&B&7I4Z%oU)rJ2j66oo@h|qobm_B!4XYFY33BWLAiuec5}+ViSjI` zB#>fCx>LWiNWaD@PY`7}rwlYG{7o!l9^sVLM7e`g9)DP9*~GOJamp&9jN+6h49a7i z;^mZwh?2-DcNvrtPDwFQe%r(%eYruI%qe|1MI|k5oN_xs6r-y-<-5KtT>?aTnNyMt z%2}LJ&nZr9|1rDW|N0axtfT z#wq6#1YIH7N-P_fL`a6#hkL6C=O1U zXHXvHlnI>DM3h0Ca-%^h=9DWqlu2@p2h-=! z=fBeGNy^8||2TkYqWr*cfQpu|2NX5t#g(M8tqi-}BL+baM$YGvx)%H$bwJS^vJ#XD zsN*_Ju-eH|ywU{!F>^Vq*~tz~;EhRI6aoDN0QU~es>dRPw7sVN4;fvx@M%l?b0bQ|_;H)1yB^>u|4o@U(grinrK7}!n@N4>#{7Zo*QZ8*UX*XE2D zDg4miFuU=p2cc~+v<0xAnlKyAc!Fk=H#jB%80~V@?!lxcbO5tpZTgD{eJOOVg`b1< zG_%qFcm-4FvKL`*I3fHHO%2)Yk3F|v;FjC*LpWh81k8`q*_4GbH=CWGW6rYr22A6A zPK6UTG0LBwKkN(VVSgJ(4?|Fd0;Yftc5Y6K;Z_Xw&OF zfgRYNsQ0Qn*r}_-FL^OpI<`wuKLm96B|P8c#X*c?t$6IG&-sXFAH=hJRZ9udJ00*M z2L-Q<(8K?ss!~x$CRE|%R_JodR&C4z3pcA8=cA31LS}_h;La?2O*L7z9>V{PWrbMx z?!~fvlVuf{rG{Qcf_YUW=2Zv`yPGhp4Ch5@7i<)*V}2L$|@DH#-772VC6)gs~(j!Es2Z-p2AKEm&b#rT9 zL|XkCM@MweNK}}vsLHtN`=YP$@0Yhk2lUiH*I9RCB^Kvgo9bNC6qGaUw5y-6M~2j6 zt}H5Chp4FGeG&Qx(10YV?3aV+0LKy3jx{sW>ggzIpejl7C*u^BKX%3APa!!w`pU1f z8|-%g4)(L9v^r~!%I*erd@eiE>tYXM&;dv7d7W}AxY$nd?YA);rpJNY^0@r?3>@nn zLWhoIt<2_Dzs1wsh|o7jo^@ODZSIu(_&`OxRCZo<1sx`)w=5lUEq@=%s`U#lgt z1z;wQNAhKLoSEf2ed=d8R;+$toSMd|S^14?m!G7QLuJw0l0jjkTNE~&$eTD{n>t{A;JE$na|0)%%SPkY>5s)uZ0I`VI4sof8-w(wXJQV@ zZ>0B=-oF7_03qaL`GoGppldf>9{CxGRhwlI2l(~KRAMHcdT@z>62IY{51NHes&Z*>Mhj-ARM+J294aW?b^-A8>>HIqa}u8>Do& z{DwDa$R<0?Wj3&+h?dqdyX?}j-?5~L{h^!&;XzkNM@i0_pZxJ;D0Y>w$)rE|0zY7w zMTQK?Pz#gn4PDW62+>9eP9b6=i;ljYe)@qGK&>iEFZv(WUZv{u>4u(!nvEN=Eu!Cb zEgh06>)V_@99E)wN2j&Xi*br$tG~7Q`)GCTKm!Laz|ooIH%(r!U~1XTIQi%pI{;l{ z`fye?Z&b7ieH1*E;2)|Xn_k8f&sR;v!6yZ$F9Y`tmvG?8k!~-=$;EVg2i}|UnLkDe z@9fx!C-(SZ+vjnv5S^K#r@zNc9jU+doG|qj+{hoP#~Th=@qV4<2V{Jf@9V_ptj~cS zh-x?(wfw;Q_$=RdJw9h0S6eM@yY%Jzp2z31>G+)0+C)VZC){l~;V!S545K~jVeKBA z^Y`L(uvh(DzmLYFXvS6?W@#|hsrAEyJ1uxJLG2`@;dlA6a25G`&y%v%wfs90(DlNr z6J7%+EtQwT|I*9(^CW?vuvYjv`iG%h@6rKaRE1awte+u*cHz)vzrmxdtK~-;@CGR*cvo0C_JwlEXUZizJt?1fEJu3$R_(%B)R8Vci{#OU zjg_}p6CHY0Meu4Hd+tls1N-}~bE$X6vKK>HIz4I>_^A_o*0ofh*?YS1q(JCe7-Z~U zlR|cY%^S=K%Uk@hVOMlXEPwrzOD%~#Mo-6BFdo`b_Fwk=EPwA($4g@W*YatvVRw9t z_tTud7`psN+B@@VmuusliaH&~MJra&Il)-G0SWJnS?fhljz_|9>Y&kel{E?3wCZvU zOcXp8LJ!5@d8gkL-wwRAsRbuC6>Zo$ypicxSbePkF;Z&_@r#F?J~)r^kzTlzvQ=Xs z8>9u@sbLzZt;73$FuobG4J@e+-TMl(`T91T6T~j;DSC>?JF22(*$*ylIvy^PS3O5f zl#eTKW^Yv?k9dy_ts-;%Wam7h@z=w+*x%kH3!B-CrihOr2U;|YR5mJF#tPTR-(gQ4 zM-ehMD1mqAc{dDlGkHK17iiC-3n~7ELepNO&=kjO<+#YfuL$#H)GOjeK;UPSyZkbL zvz3~$9>G+n?ezxZYbp5d^9~-(`Zc!4N1{;JGHPel*y(`qbUR+X1jDS2c#xI0J^iTY z8F=_)`g*TAeUm3TK1s{OV|BB)f`f7Fa3tIG4WQJ8Tix31tzNt`hCS1_3?mMUGHQ0q zGQ7EnJ)&+=w+Iy|RsZ z@c_#Ki^rFNrw4+RatfaDS?wpc$VY?I_I9MYaQGsz@_WQF6}gTW;ym5gcr(^bNL&90 zhPf08IamcH9y||9@2H{3>Mvt)3FoTHHg`PZq2XlO4j0a1o$m^aUM~6j_e`-}JxnS4aNd!zv#98THdRV$Me?%YWQ}%+xZR zigq)dh8XFRU#`ci%%;quf-NL_NByZ*6_m`8e%FKG6=NArLR{6VJ)d zNYtuqcwbothIiW8>r`yhfQeeQl5HBH8^J!y8bCpJY?!}uE;yW39=(nlaoUA}tH-xp zLHGr%%-(^i8IH%s&99@QC(0<`at#$-tzQ6%gy&oFET@*m>epP#Lmv-9!M0E}l+lN@ zrDDgFf~I;9jY*$^t)6Pgn^09~2!!_rVyhhYlKMMdVuV+g;TBE6NrFg0E*_v_=8;fN z@5{n2P&K*YK^sztfN5)tobf;~f_Z?oH#lpq;PgVQ9K4&!@T@djlgJ}Y7s1Bs2KjbB z3B}#@3lFH`qyjnP1VgfdrdQ)zrnR${+vS=tYbEfAAvwdi+w2O;q*ogri${~?nszwj zp#WqDJ?%*5d?-8=lhR~<@*7?YP}Pqq(W%C}WNCmCwBAUM7}84t;oatOph&NVcRW(y z#lv+3(uq%;J{clE=}t;VSAdfPLueE^AEQVLZpBy3fEiAW-c!;ElhnP;fLSo7;gr!c z;`I1F>J}BeEECN#UR8Jq2mW-s(4u|=KR6qnjzs9TCqpbgN%8zWvBM^8|U?sZBua!$a zS1viMq|T z6Q^$Iji1@pY8=Pu>zJ10F6-k7Y_(tlPfxs#%1g2>+oA-lNqBjMHAxAe?Bb4|8$b=o zs=#XmP~_>o94lX=4Gg%KV|<1usTBuE^2%En%Bu)Gvge_Bab{0bIlAQ4)O>^n;79b& zEKqsnxoFxtYT5hZkd+x}ZJ~4^kSUc|5AF@lK>xoiH5^@GQ@a8O@bmZ($~d7_5yWgby`@K`M7(-;IL>XWfrMdwy) zX0ug%G+d7Hi5RvqX)0^5m!aZOzl2v!qI~{;l)VjnljYU;pEM~1EZnJ7t%_1z+)_mc z6Zeo&W^bCbiKc*p0*?8zDxxsQBoUm@rlytNjRE$kQ}?FNPdA+Eug%s zfT&bZxkE%y6v}IU-*eq*LAU4k`TzNRXs-Kue>vAV=Q`Ip=V}bg@V+lqH7?_C+9Sas zr}=--Co#AlMYH2K80+AEw{Qu|mg4Gq+G0NnN()6FSC>s1NX+zv4fKm(+GJ1kO^m?6 zVyAf{2UP`^KPRU!D5r6WcN103DBQiQV*N)J!?+q)jk*{CLP|>_Q8)vIhXcqgK%=J zY=h86o7e`S(k<2Y4X29MZBWJ;!Nira4MyT@z%Lr{n*{pV2H#q-iX7+2Hn@__$-;D! zF~p=`V^*W9Z*#?-!i}s;!ua=Af zKy0469kK|Eel1_|mH4SXjV3KtGYjjKez^xeu}H}=sP|h8s$+JJKQ(46_B3dBq{l); z0Kq>0j{!+rsJW6cds>6RcpbL5{n9JhS_0RK^qvM!-{fE8pMkimfTbu*BMg#YXl~gd zBPpCFVD=RP*q+4qCv3C0SQK{F=rjUv2~G~gK+&rdbE+JQ;z$%np~;B|oWz+Z>Quq_ zF1&?)g8j3$P?Ux&%v~D{8$VwLyWA?+JMgUVUD{KDXX2(E7kiz1D%oD&!TaGP)c@hC6G*@!W7Y0|bI&5jH3ytaxtVI)%%q#nGb&eZfhTECv zwZ^5u9+S*0#h@Tfjjg)&R7$)XLNbQ~CeS0_&iOjj;ScN&iyH|vtciSo+G3E!s%|!c z|DogPE>CvmC5!s{wou#`cuRXq)HF$v9nr8Uy2Ua7tq=@z7}uD-pT1OwedxEG+f0)_ zJR#emMs0_3g|EN49rWJ)pyxJ3$nKDVGipquz?3%Ouq?>`mh20B$bzRsRL<^keq;Bj zY0M#Tt1vT}X%WB9ksiO!Hw#!JXJWH}B&rLz9BWlT+H<478pNjmr!&!09=m^ql|gSZ$)yFk`37)G(MPoEKK~X7tu0&JEE?w;e^VHhr$;_zOS`~uaFet z4E+PK%ae`#7!irr8>JkFnIUzWZXDCMWC9{1Zy`-L%6=VAjsaXidr8UWPYnLGeyH6Z z0j!SNqpqwvwPh|$Jgl6<+1D5kt8SnMh|z;F_}2(SqLvv$cS#)&$Jj@Gn-MJ4rV*TMq9c<^^K;^h_9GPI4{~aQ>HX)mE@^~D2_oZ zq;EKeFb-mFxFzFn9Q-(^6=Q=r?oly^U6c8t7^20GUKD*#tk{%yPg#~BdUHV@V0@-- zbmOgo-nQwbtNli5%Xejg-e=2vaN5~AET}64%BmJ$4}W2C5Qip<>O)3R8~J@|W$X4K z9>GrI_NRL7H1O-1^wPtgwKM2dC|Pw5c8WW4$9D6vCrB5RC`O20!HH^V#S<_#=GfU< zHRP6bO~}4gtR#ntktkTAXl=N3Z4f`S=o#xq7?g3v_QlT|P#_WRBe%hwXt9uF%}!+!u-=~j*np+s$o`8z}g1kjZ(Y*awl ztRng-vl@w%K|(9Hai*0fAp7R%-^gz}gNY98tvmg5s)XL=MZMLDn~{sI8IJlSNaXSl zQBFk4s0Pcg0^qbscSJruZk?>=W-I3_A|R^{AkG+sDiBQ zK}4>%k4sKvLX=60HtAzFi|?P(-`XIEvAX66^}Ub6_j_WIl2vvpf{XE-GD2CzI5%n& zv5FB>1*DriqoAx28qgKPpK@1v1-~J{Et|^3dYilu*UBqc$r0;hZlzItkyz_+E_&l+ z4m;F(g?-!Stq~MZl3`sdQFXWaa;o)V|F(5+uJsarb=EK}?SKe&gnX5*+6p|wxN*52 z^Vw>DfRho?pdOZO57pou-f;e=ym`1-7LP1%8iCF0jcz!nJROVUaBaR0l!aw8ER7$t zN5|+W3x@5{A4wBpeQHx{ugn$9>jkWV-f{)G&4QGaTu8D74cytMQv{V*%X|)n4jepV zcUO0Ysw)(;O zIxAbNTcNf1^Du1dm_JIa#Bc%RYp>h;>JS>UEcO5=f9V(cYtRGECj|Qhvj^ zF!PQoTj?u{&Eb}(jZTDo+ve>J``)a>>(n;916G%=#za;fF15t*XP{ z4`RM?03C`Mef4ZxKzR9AgmxKQRWn)hwKSNo6-@F_{AyctN9MOyg9&F-;G%5-U-z6R zLjd9;x$F9bD>O9JGd~X1#Lk?}RH1)i`>Rd1hjR2(Pjj*GTdf zP9xu}k}(PYiV_%4ZV}9D zyOkNl6y3MdG9tvsz27qwv&Js-f20tg?gmnZ4nKrk>5^#hGGR{BPS=c`W0Pgi(`EB3&aT|)v>QJ~ zFWo)B|4%I3Sc~jxEVVWfDlh`hr1N}q*2O-iRe*cGYg2dFxWgTMq8cZz!$Fugb0vh` zju^0EXCwq~q{ym=iJ^}-SXOg$;|Nfl+M-**2*x&U zqv)A4SkoTDGcAxlhQ|y*vAvyS6f#<68|2oro#sqhVt(?&^h3oC6QIJwX39lFt?VPc zThd4Lq>t>0KJG^V=dAk!*>akIquC7}C zBgn#(%fkE!X{h-m2YbtwchT>Ki#e=Zys!=s_TjC|#S%qSJNBDn<12W3!Bj7P%%L@$#omb@%hwu4F`-ZwtuaPwNY1BPLsSLlyKGwH-2|%> zKOI&LU)u0QQEW7o^Aw0TG|+v1QBwXdw)lFB@0PT^ZlN$kP&d1>reY~o2{pP z6`TK%FZeC6PN2kmmM=CWdigb5cB^Qi561asqBr3hMQOHlg>c_v6K4n&uG$~s%g1S} z#r4Rb;Ak7Y;3R}#TKhdWuF-ShL9ebIWNEioNIlurTEo-yT4a)+{1y2QH8BM;?uL6+ zkV_!uU>f1xVfRx#XlK+-V~MxqVt5XVn;6J$)E4@P#HLR*Be$%tJ`5=1o_@a&OgFD^ znLnlmRh_wlbA(isPZ=S(Fk|po`vRksEchX2qqo`rBr7W}xwj&?H-E-=n2o_{f}J&4 zwy--~x|%03v_(tEAf7(-WaNT8wuM+KU(e16)vU|)#OdK$#T7`-ynyos5O2O9)lm^Q zBz%S(1)gbRI>q`w{R@D{8Vs{kAia=jyGt$)#!5TZbXBM(e~L3vz@(Co_yZ+2ZP8Fd z78#)Mh9{}2mAhI7v9L)9Ddx%L3{uf4c`2#bOeAQnm^d|IE6v|gCOCRb#f>Zjd)B6$ zq?wJx=A08bJ?0#~WOBjpt#U7Ywt4B@sxaQx}Q`|iG1pOrKBFll% z$MUJVA|iMZ>AAD5W15`jW%>(?;2zWAEQW5hXO`w%1nf8e-dp6YZx$h&YHi-z)<$3^ z8_6s1Qp`*?2%DE(&G|uF@Sg-N$f_ZS3dz7q%!%@8?Jl9-sBT#!7itM6H%H_u9Fb)+ z|5-*ZvJPu3#iW6)Ifr5aLM)>f0ii4G+o>(QizW4!?v&dhmpSeLIk~{;Fh730cl@%J zjNirXE72CorMGaqu5jsgb(OYL(otL)8sxPZTrmW=0OUoivRc<8);baBJ5<@tQdAOvaxeQUEco~{6{e}Jdbt}8D4Ud*| zv_vs3)&(hN6#&P4v>6V86d4;4Bf~7O8%J2w&jmOnQicW7!sR*VE7%k>Pew?;N`#l8 zUkG+GYj|+VDx-E$Fh0-4b>4;2{-Ec{j@4-~cTVl%RZ9M)!bAX37nyT4?_v(%B=euqv4pBuBbD`yChqk zEUsJL+rgucSuG8gmR=?co0^s$dGoZE-X)J}2{b3BZwnItz9oo=YH4O~OM_2qX>qQl zB55hq)6(sp@}Bt+4B|HL>S>IvE0Z&XoGncSIV@vdx*!MoOaYJ-62Hj`1cp$WL}e1#1?GxzoVGRf`4E+l z=2H8Il)DaVjoWD%pY#nPZ`Z;b^-(uCwd6`ZIN|EPgmgt)bUz(KK~7NM9fm zNCciE?X|;(Z&qU`RW>!YV!4*ZJJ};n-RG!{LY99i(i-0l&brOyml5~oPt#{>4t5ff zt;5hp$H>BY5IQp5MHOw0czlSo~B`rz7uWa_V)8C3WC47+Hjd7_>g*+od! z*+qykiC6uobLa|NkVy- z6no-Vr%}|pfVv@={Ka&oeTBkYN7XR!hoa{TBwx7Z)`7UlG46x|*^g^L@mg8Vo{&Fy zvwVVDY|OivU^?Cq%UyJ;rgKO%f2ATyBtkj33>mA;X~f9|@}nsfCW&86VcaIVHbwIR zrf7e`E}1{ke;#prMlP8_TFT{iIQgP@By1VR=@PX+@Ju-QauYEJUsS7s`yvscn2iXM zb8PP6VDe=d0L{esp%lHR{{7tkq8A0n^l>`K!lR8U(GwR-^xQAR?~yvmn7{r?#cb`l zy3b|2%*u!#OA(ZP_OfJ({6jhBlzJ9Zedg^`wOmUrDU%(y(tq*o9#^zU*=khkV7?Qo@dHBXpMu3zc%r@%4lwV8fB@@2K7OQ*yF1L zzI#gQ{+Ygm&5^@a99ad^fLq;WrJ#u(#KUYjHz_o-wQdWVjOuON>Y8cAbZ~I+NmSGO zuDV$EKr20$e*{7SW56N3@8*)a?dezK5??CSU$L9J;dp_hZbkwmd1SE4Q7CK< zlAriw_7S)SpXE7?T;=p#pM=e_c;Kl{F11lox%?GNW3L&5tKnM29D^pQ{QikuBfoON z-T-SVHrJtqg@BA~V)B`0oE&VBv!xkwo;nhzPjaspN<1ztBrEL0cZ?cyW@KnEaT5xl z$Ff{`pl5tRC|Nh1ZEb$ZVNKeZO&NIp()LW=@Ezhz?RA^2q^CusT9ob1hP8kx&uGGl z-!~$ZxZ2$Bz%6iM(nS5TNwN{u4g^zj3rU?pM+69Z?m5*>m%iz)Z>vJ~suH5gc?1@>w)y5CV=Na9qE9oa+z$~Q95Sj#ChsM6SANir z2x3lo7zIo}dIbgk%VrAvpQnrOWxsJvG5Vxo<7aN^`u{;KoenkL%AreU{?xRi!3reo zqNC!5PF}KHEI@z+0)P-gfmS}4P1L-UY|w4~JueTafp=PI?ozNdO4RD7iT*iwb0jT^ zM)G)bBOob9Q?IzcDeut&=Jcl(R*XbJOxlrt&;x1tI`f3E$l&6VBj6}wWkYM^0ufOr zmTeO_S_*(|XG8g}$>kK@A1rY*#PM-6K-h(-WQ`G z!Sq4t8Ht=H@?T)}$Ci#W=7=lJ6GCw}hIOW%cw(0w0j59PBjlg>dLP*7*njSuN=k=7s= z1Po42-|&JbTy^L0H(y)y3*zy&dLrI+LTiZg5uab+4Ap$CHSCj|$x0*#Q^iq(^M^?E zxh`#llVE!2&$Wpni0Fqr4fP}S%{(CCY;#(g?n7IRl=en<>d263^Gfto3CJ ztYAx~Uk*A2YOKBbC>)!PbJM^v(bY3vFlsB~EzA=ik-pW@&oC2USgo+qC+ar*%di%t zJ-`~%Et=4Y0^a_ZxDr`&5$kE%aikdiT-?hRD=C7=6`&||N3J8?>D%eEu?>~$&j`qp z6Fg23tz(<{-ab1^4WI;szE-15hF&O+ z?D3cy8-3vo-(i^>KOk2ynO}I_cM!R{^FR8dh+f?Tz$*4vNRl8iM*>=J~&We*^8!M;BzvGS$32D^D1wM@l#8h%>1 z2b`S0PSV6Vlyav=)%m}mW%J&7((aU2iMUxJZX<$LUf6gs?IQ}VKzRK>ij~-3_Yb*& zh0<0hBM;$jP>(WaGeiF+EE)@OkH zY3}BpTsqWF5!coAyQTIsF6h^Bu`Q~uD=p&?)NJ;cx5}9bELLs^qNRP|NA9LBx&Mf|>=RZnKVh5xk&H^pr*J<{^Z+3<@@O zK}>%6NAPJCP{HR<1z9ikuXBMY&dNWsZaWneaFgXG_Q0vw?p!dG{Hv$inlrNmkQTUl zT74fj?}tO~WijC+7;st0c*P?u<|VX~#|(KR7Yjg5ly=eOAUIiq61Y_YX*ak6agr?X zL|f!Pz6~4EOTvliec-g@4HksG=NtvYff8Ztc>TxX>_T|X27$|DL;X3S(2){(_WST5 z3vLt@iKxd#6yXacxE13zP@a3@QqeVsw^pKfJ(s15uPO;bTZ%IuB?85w>hF%6ub@3^ z-uDL!)F%?^wHz%6KQ4lL$pJql4lSQCsl7j8*#G%r^gKCz%1OGe(CX`do)q z@eoAGYtbuSCej+7p%!txKBW3G_`mQd7`NH3uyLZ=*e?!9XL{V##z~RMK|f1P1-&u{ zu5f9$e5{raE)Gy4!}d%f1ez5P2koXz(Foi97l}@0;>YE&J@!cd#KJC`ga&z;S1&F@ zF`wxOUhe*$U?io;-i}YtZJ7b0EU!j^H`g8NedRsoxZew03)c~up>9<7_?xK7ocSyS ztC;kdH}< z{+B?P0x8Cy7BVH87hs&u>cn3?pmSTm@mG(F-%#n{U}=Z2{w~cBe5ERgyn&Wo^g7FD zI%74LfS5&t0svDw^)h}gl6m$Bk#zE*)}PX!(dECf+q4BMsU%o`vI}2#+M+YrLVm;K zoPuWa{UfWAGk*@Ec~9T8FI>7egyOcBj)$~rSy_398f5%C@Y>()=^fBsI-xbpp$b{% z^AytV!Qf^Orn?*PI}NFXWt`mm+E1cZen4A(yQl2@d%wfhDDjtmnH-ZHO|`Z;XIj{D zHB{#ks@FpBUB-d*Z>8&~Dx`lc0p18dHw4ePa1>c&f$^OwuJOfiHA8ka7?v_vx{dMt z|ADV?sR{DGzYpUS@?igffh%YLu2IayN`!KCQ^C6f}+77b2ip|UFqzN2VUn1aJ!VHi{ zcHp<0ZIC3=(8)(K8LW9(ylo3tXr`YKSqB#a6idVlh~^0|J_^k5Z&gUb=rC8-vR;Pc zo5}9p;kAUp?+_>Y1O<`_2L2!Lnxc7gT6T@L#H~MM~{{{Hvs*3(o><+wkI>JIoXrgC??&A&d!N8lujBJrvh%b}*&C?c& zvp;cbii$02TA`YTzY9lM&94*E5=cDyke^=+f5s%7@v20F`m}V8m4*rj@P;LlB~ZE% zAH{VxTj>UW=|)k$OdT8IH{Kh5)L;6Z_P4et^~2r9+R`?AD&c$?b-dtOVbz2s))T*$ zRW&v+!3CvjaVb9bs6FfJ)E0@N8?MItlx{q{(GF^5b`^vu6HmkW4~%$TmhRSj9#lF< zd`ho-K4r8#0&4fYB!kWQwvACI8s9NtDV3=@oIcZAATxbxif6A3T4X^s7u ztMmvqP4D?c!E$U}%qVy%v-o*?WFUvcP2Hs_W3|$0-_)HBFzu)Br*N{4(*=79ZCgYM zy~3a3aAF$r3-FA27@4&|)^l`J&|^u^Sfy^}be2fu94_;!w*~UEK>k`X0|$}$LO)At z?+Yb(Zr};F5I$KOuw^Jw+!@q&mALyiE*euO%1nGbO<6RNq< zDOx+7A!DU1ggi51mdzB%n(wv&AqBO=mHZZ|&VF;kdbO{!(F+vD5TRZC+w7Itr_|Is z@zK0y_!{2r2-bW7bRT{a} z+2@4}%#Jol*__m0bf239L=twtwsZ=@_lX#>FzasoiU25+m74XFvJ8h&WCF4i zS}<8PD4e{Y`ZZ2+G%;P|=+m_&XKPC;9q6LGvyii(_C~>tgxAbRbu>A2EWtk#)Rv4m zoBsGk8vG-6x*YP|%S&WHNq=9o6JQ37jl3e~_XNehk8vqmBzJZ48W)|)ZZx$e2N*y( zwS=*i8rvb6ih&~TuVqhxK01#_K(Z)00^@|WEy^L$-LX{V_{VlTi>!bff zra1RM{KlTJ(ZO*zzM)&eg|-BdW``Y6O1t{C`;J6EM+%lQ9Y(4e$K&?H+XKnl-|7yb z?iA+X7ml gU6EG8pd8sXKySfX?#mh zUgtKp=Ky4FpmB|Ykw*Xu?J=rz3fO7d67hweqC)%IWKE8D3pfcqQs9F?2`%ixDtVLL z?R-RmkwPlO9S5G~jtm$dA(aA-^!OS8iPQ2D5ySPsk>9r_x-SPvZ5ANC2Oz!O&2s@- zqYDu73+xEk1dQysYJ0v(a~1Z!q`BFy1gGak;fDT{${a=@bd z^K6%4+@^VPX}?QfQNjjcMJE%jdG}g)k2WSFFpSN;khu^Kl>faQgCQ%#^l#cJIjy>tsybJ$A@^x1t5iyXl_E%j4I~)C zg3sRl*RLH6asPpTj~&|FX|-NV_FQHoVhlqbFEr#d8K6kd@k)NHY5a`k6z3i>0??e7 z>=qA@m{h!B?$Hwi#nZ>xD9`_!w|m0L_;Jecl+BNf z83nW6LR!_^W?o4iPY)Gj3VDo& z(TjD${vjyDRuptrxTut;sAq8E|3m9fFw)9dptsX?%U*~>L831mO^6`EEn>RBx%>3` zPi(E4O|M^NE4SGWReADwbEvMUC+UEd#J#vbQR8LWwZ;oUo;WPwz}g?x!_ErQxY>pl zLIHQ0Ti6c`txj<N$m+o#qtPa^#_4%>ynjOj_kp4*SmX z=2x_n6iIdUMHwXiXdGSQ>&iv~o$=!(NZP3q*DSsY*Zd1)hW5O8U zDaHox8_6^o9eGen5oQAjc03B(#P>5;#Ik ze**X=A=#ld;*2QEN$jyyJnNu_hLqMI{(j>}A^aZ^@EbMWM1?2bm1m^RxR%S6XP7Bq z1$Q_@3BlYvFwFd)dCcDIp~>mTdBQ4R!H!+*dCkW_p-fVVyd|*hQxU{s4aCGT)s7i1 z-zsgKY0PkEu8%)36dy*sr{xOPyc4ut3MYka+G<2TnFoSMMgW-c7S!GLZMWxwx|)SH*LdmWa#Y(r@fz zpi?rJbS@B_BL9rNJdn`J{FSaUUX;kl+ZtPrSUC96asE zgLB65(w;hl_D3Y17sHY-J4Z2@`yyuv|G(3`nAwu4rH1I4nPRp4kc~D|iy`HG$x2&3`g6!OdfDz@2Y)aWMIcL*`J&K~5Mxug!e= zPFcBVm2}WeO-5R)yml5nHP#$_q1uPu)zjopTszCRPK%3GUuhcKLt$}VlMWjRnH2oU z9DE_2AVi7iy;9dz6p;=^FEsXU+Ur|)uhUq&X|GaGQ0KhE=8r$*YGI&n9c_uew^q6C z;IoMdvwVB+8?FkT*_)lC*6L>qcTEDbmi0RYXwUPuL~qwXO#lIrb!dI zrft|9y&7fw6GQHE!-|{vxNzZ4`qp4##76V;bMttjZm5)re=;QU9U4?#%r(6ARL24hA4mHn;xRHvpfdrh#zr82k7y-VfI(cAsSj>(_L##2hwq#IQ#hU7o1|8nE@~*P6YpR0nx`+ zhLTmoI-MTsmpc~Wc`;=H_{;&^c?jBAO+Ae}*uv%7qpRWv?Byk^w1%%~HB?jOs!l%J zR{?uHoZO9Lt`9};)}ejQ=-6o@NdN9bUusLyGFT9!`f2q?pVsbktKLQWZR*ZN>j{;5 zc_Ho0?U#$pa8IM6rC++SkNa7zaRH5rMBobT&GelTmT{u)5R4XPS1a~@Ss~eZ86=~j zfDLQAq!kPHe#CJ}!lit|=@~uwu6yo`4AL<_ggl1snf42<@p9@yQ%-T2qJ&X{#XO1> z0mR9D^+PEPWpRqZRcPi+bVOLJzS0So_9n3fq~}E@>4_qbwib7u;y%Nfsp4!hSR|3> z`w119dq1+g3GPQKOLs|Qy50D$#p2J+$woOiE+0k$J=#d z63RQC6!LE8oaW3AvhA`OgVe3Q`AigM!s$Wn+Bv%zE0nohEQ_t3>20#xLWeWUHP%Z`~0&LS+zyhAWlj|qJw5z31*r;9x zJBYfAyfL!J{0Iaa#;Jjow%)u=k^(EmEZP+SO>y-!)8mylMx@_#u_%;$)MIsoKG9vY z&z}7klg6B2%TOf2QZ?B9S5`WD1JAQw`j?BrbRSpq%!xeJvND*+Ur?K8n-j3+&s;=XJMtfmqdxf zQ(dz!RQgURIWgZBv|m>uxOIfs_6{yTv??!(NE+dmR9l?sCwErGR7PQB@gb!2WvEl4 z?^3P=@>li0o73`AXQgB>S*FOxQF~-ic1@)JGNBpqqmD@aG9f1Fez}+jV#zrxegbuZ zPpMX0{)ub$0Ak}|kB2=;8d3db_fZiXd3Tye-_L0qEFr&s$nU`-uTd_8!igEvMX{|x z?U&JGo|8p+pe5wL6703#T)xB3Y3iQ)?lM|gp8mYY>~U5nXXgJ|kNxpy zav0&sfd7LH5x@DrQNM_HQEB;4E3VnrS7n#DW*Z_PRTMfU+~5zV`S%qWITU9ECSQrL5VK82l> zaL;s_knUhSEpN)X2ixWE2wU**PHc0ff12BqN2RJ_em~$peVr;j*hp0cB)S>8=GKcf z?{?Mn6uLHLFaKBapDs?NkebKA2!NG7ng7Q{FcAe>V-$idb2U!p_Ntb-)~t#UtIowp zWp=Ad_!=V3B6!oh`z7wI;|tVuPL*lAGAn^=->Q=wz zeM_pQyHf_FtSY7)C6=61zN899>At0i7N&B$A!Q0Dx#bH9tCyE2r>>L6#|`H1rS zk=MIMQs0tKpp}#of@=A;t1K?7FH_&QvT22YIT_YVb#JO1MVRU)Z#>~^tLule)2`#e zCo2ARfjB&0};|l5~8Jki^9dBf*5TzQVt6_WFmaKg}LS$aP&bD3D zJv@uFv2ji9fGu5o_v_S_jLBv`!^PXHl(D7uI%aI{<_Iu$le&wtzgzmn7PDV>JN_h; z8xViu7Pr3Tqr|u(J-f#D#q8TeKu14#9yeGDC%Tzey?+8>s~wPV>*~pMW0E^l;@6hQ z19Oo<+mXPVYB7T46_1uj{hu6C`Z zsvucpYnoKRx%NBo*Bobuw;GdNXb+zw1BX=(8s}&&w&X;cootw$v@;WCJNtZ0vY^}) z79BTKLG$kfU_?GK(R0gI!XjkXM-R$iB>SVeI1`In$@RI3O4c`W>FSEooY9jJ`L4<+ zH7rJH0xJ<-3Zrz(&K<7By74C0`dW3(jxpLBLvP`a z|CT%={q|JO*K#T1r@ytQx;3<&VCA{^4`_ee?zdma0=n=-9B*?4eIG`bSV9Z>5EGCV z{fOku4wtbSKjlY7&OcyOgmbY&jNdVQDDvDn7= zT4k20S?Ny-dIlNu=S{HZra;4vNIrE<-N@H_(gf)39reyJ4L~<89n&pd9O#db%@3s@ z6lZ9wWHrVJGSm4Z^k!(v(7O{0WVn9E<4^O0+OzZne@r^=U9xpm_qh>e+hPMGY*;xp z@B1j7YmMiTjeZn9F6Dm$T76EYq-Wh_J=8kzyKh>6#gPSJmfZPkVtJep(HN&I+xac& zSrjsSK?ZAOdKbj6T{=Ad zuMDsrvCqF7pXPmAk7tl#%Om5g;%=EYYZbTo5w%kF`)nRYGi4L9N?^EPENeKHjkn3t zp7EEi#_hU-WhVL58p?94Wzn_=u-H&bxJ~nJk?PetQ6IVCaD<0L;Xh9V6r*L5wJGaV zE>?1{T4>f7E-bf%V~(fg?mD;MWJR9(=871b5;u-Nv_Nj|+>s%P%DMV7EPQOK?mqU7 zqPvrP&`$X$hjaALoPpuDwxpr&S1_n}9J|PPXgXPwbdx3uMMeh`dSD5CA78Xp?RKdY?f^>Nw&cx@XcoX z+MEwtwB$fBY9r|Q5Mf3^HyizS45C0cmB+*2n&q55vgE>Mm%5-`?UDCa0BXS?)-CWF2lzTv&~34&4Gf?ooN!>&^!?3NKeXVHh5xN?R(Fb=P7WMoX`dcPgf>nJG|fag(y{N}o? z6_U`qbk0ev4s?OV+0?T*iWbQFZ0@B6$T0WX$0l!o_tg5Y4OrC0o|f7y;lgjdW*=~0Ry?wodSUExIy_MF~@b;9E>cw z6<6bX7yrgJYvm$lgYo6T7w{vwx%NywF{{AX6moE9zTx1rx_x{BkW+q||J7hk#|@=z z6S!<%AUeG@dy_?CHvqoUt6%JZH&54#W5+;@94_k~=TawG{#4Vw3=+kVbD z&E22H@u+^$ECq^syIiEc2W#%zu{~8q6MIgN=}d-X~g*6&q^`4z{%O~K@%68ImubF^_TnkhiKu^KRsx4A>{RKXa{{d@Z|M*??!rFHCJ3fr}gef+#5;*6

CJ8&OKMXQfk2n0ZYEnBS+#icSvBB4(DvOjg>++8`Yd#z&$rXx@p4-3Fbbc^lLt*P8cXPq!*U9pi$U z_jVpb7_?xUL=AdQF2&PL61I9mpZ-l}a=j?D`b1}PZ5IAZp9=M5TA}J!t~1~2gzB8? z0<{!cy(l~f#$Gz26^;wyI-Em&CocQn)fOoyi)ceJAwS{n*Sd?SHdb;U^YsK=ZClE= zJdxf?X*Ll0?FjO@8bNO?GJ-umpzIEL$&Qde-^QM9$QJ<*J6xooM2S=fi#g(=J9^aj z{k}|Xapq)E^h= zI;f+eus6z*jJrirT3GKCakZe9LiK4$uifGEXR3FNU@)tBJ(2bl9CDLUlWbgHOvbcXhMgF}HLL#OMSx z3S&i9xBbJN@>QHm^N$djQc$7>=Q8+I2DjTP>@QQFMe<2iK2=yIMJg@}#`jxgmDJyT z)7#|v8Fa-xrd2qOF)IoFN`##5d*4#Xx8q~Qirg({clXag&9{5TL&H?$Oj~r_7&gzB$6s2Z^+(*ZplH+4xvrUWc;}-n3Lup-gRxnkcPfGliyL9RqU?LIA<1*VMf6$mS)JmKb= zC|Ad_T)3Thn3-I+xfA01L{F_;vrv>n@|4A5gwzwwtqLVL1Wti#oYLfG^Y_+Zg`qQ3 zj)VDId*fjP5M66tMkE7b$YeQ|i()v|OhCgWmC?u)(R-N=dLhH2RT+Y0p`s~krBkX_ zCT{WuA#+n#D&h`tZPPm1ZcrDeql5%@q^yrCNs-v1k)&tCjxrA`_kzR}3=3mKH&PY3 z%qo&)(O-~l>by*q@rE5kJ@Q@P4LY#3#7a)kp4Qk3wi8DJ=zDW+6JbxNJ|$OVVTX7Z zaIlr-VUk<5#)ZdFg#+m-WR}|1C;KKGc=S6MX7GFpK;;BMDnU%4(*e45fo=iA=qDMs zAW>AjMl9|@p8rbVyJia;T_EZln=OqEt%5~hfUcx(Iq+;d@Oz#Bktyj`M7af z9pjh;TxDMXiR~?ly6A}(2 z=rzvKS5!`@j=B$3^sz^V>h*Vk(NAVG7mwC&m>7(nuXCMiH=o%nzvC4Tqur@ z=E_jRsE!r~@7gSxaBC7Y9*Hpsrf))V?d81F31!J1a=0Sr3|}+Nc+_<-SOM^G2J4S> z5sYT=_nj|gGwab#MpDe{f5Z1FeKJ&dZM>inm5D0j<#m5N*`857rHQ&6-qXiT_OvJb#ACkTDu6lzq=8s0js(>bOb|7xwi zRNX;ZN573jyeJ#1Rq`k9EC@Tkr`MNx##K-DYmFTYEEsR;;sm0sMC``j&g;_I1F_k@F{u3=jw0=J6U15P=Ci~!ZiN1IWaLqpd&_iNE${UY- zo-w=j<4`jPYYS^qb{GPbXz}&|oK6q}E@-0OYKV8K~9?0~!0{7+; z&yvJzt+<;d_YjHrk%USJnK#ovQZr-7-vTvOJxW{oujr}ll3ZoyONpVB$PAL~5J1Up zo<|Hjw!C?^Lt8SzX&i8E)EYLDn5;ZdHb`4w5JXMkwwpMcEolwbIO~J<)!D9=vx!eX z!=Dy;og)3Dgo-63gKIfgLX8qSk3X5(mcjBfr$t<;WoETpDL;2RK+4 z$ccEyj82r#3*|G=a)tc-xaIru^B?80lYJw7_&YG#U$38Us|-&Z5&16P+ME*pI-&zb z{N4}$NHV-kUv3}Ev28N1`WPL$vpGuR9~88opBA4@=2l28!i8a{z%O^u!4q}M7%G6i zC}&WU!LO!99m_$l%*IuB!sIIEc$FDr4*_&e2#?az(Ha*E{!Y$!wqTK;HUELAVfbcs zZ7g08Mh2Hj*XHwI`MS`S28y*M(Tl`OCU*CtiBzO5sXiZ9m7Jvtv?YP_Ebp{#f)`4% zc%a0Y&ys+8qZT0YpLOw!*22*O%-Xn4y{Vx{#QKm}@iiOWDXLW7auRhkWZ`#g^+#g- zt#gVJC=Vih#MTg{t_|FoFnO4t>@lmY@JAGt61cv8#S`OKc{SxyO%4?5kwU^ zgg^4W7{ar;89@b>^I-)fq7(JshXGWhcI0yM(T_?mZ8H8o)bm~4-YK>O;Wpi7~T)czC_5JKxoil0fS+3&ehZ>nTo{GK07BNqPxsV?TDbwn&~ z#whJVX=?-*-S~Tb(mJUc@8Cc zZ?UfV4?(K)%bR|Ata-d0=x)01WOI35la4Q*2G4j|E?+A8-=bzX9p9be-N4CwE-$Ak zyeM^xos`S`5Jf}FrLJL5%YAhJUB|RU_26mpp3Hw!4chP8(l6`>Mpd}*&cQyBRXvk2;-)}b zn$lzQ^0Otzs{8JL)k|*PrcBPu#|Kx|ypg$-`3ef*nWit7W;1r?J4+m^{)TA}+0)~||0uK;C zjyY*KQ^kfUr!R^qd8NR}98nr3NkK^p_>K!v@@fm8q=tVbI>t^&(I6<%U~WF!Vn67Kqv;@P&Hj7x@Ne*qvwRz~WBz25&v<6`+^muo9-2llXv?={8f0FfeKnd}4hUA{4 zT_#vUkqX}XAgGPQN@;WER}`LJHz2-uOv^BdCF)M1?v<#!TZZSNCK5GIq9QFn$VKT~ zCASi;9Zg^@fx7eS({23X3hTQV)>`&hHEXmbMXpQ{dES;h?s(gX7EW7=06qC3Fv-BrDU$W2BTloW7k$joHIr?IL_<<}0&0Z{7 zUg3}W62OlgE!P%2C((cCi7u5dp^hpOr&3$GzUS*w0-5_%!gnP&Lj^gj+A_DQ;AIlL zK?Mc*#f}b{Q`It5BFk0e_au0g3JPV;T&jYXOK^w^3VV=&w9s2cQv0c(kX7>>hGBMp zEz}Y9J*eXpp^mQ-kAq)K!%YoI!vn5}kfEw^cUD~2gElQd*7RmX` zTz)H+=Z*k5<`}u*TxLfev2urvcg<^IJ|LXfU6f6zxV{?N$tk@BLaXjy=5YU_EyeA) z*k6~!D2^0dKf;(@02_(2jOPc&wO%+&qXKg1_uwL=M1IE@6&^_)Iobxh0RxYn7Zz&+ z*iyWyu1I0VoiYnVv)0w=P?OxJ(;-VR4Fvqd=gXr`@;c&YIG=aR5A5rH^Cmijg%rI2 zGjxI^vHcwstXWOpw5)H_yi0f%17pljqk}PsYj_dBvNmhi<$^&gCWE=M6WnL9Z6J(xYLw+vdjsq%uTR8DdjA;Q^i#GKvKL%>r!od{g{2f5r z>y#0WVuZ^rvaNg|@5e?Yn0(#yG$j@LX?|}%_J6N?1X%)Y6GDd56Ddfq=@) z&wOp^L{Dw1%iV7y6$`I5QfrVpa%4uaFg*+l`~cAnq$+YfGIlbULJnwz*J^D6gDsY9s*eoPKsTNcsQWHY6HyCIY0Pf1zY0|n?TeLIDz4x zcRLyi_6o5=P?OY zVFoen*MTX&u^!!s)TezaoBajj{q}do-B@zOlCb>{u%QDIb4U6ahh`3>eEHG>Bh_j; zwZC;58}JTLHdQ*z$JDPg&1o_#u${hw08dYZE1PsD5uBrdoK|E=~lra z1^(pByyNCsw6C&FtDpO$Jo}t8Ob0RkYjvWq$n_iYMl~ zbo(k`6V<^21b~5C*=Wb7`3-p?8>laP!*q5kb1hT>Is_pJjD~7f^0I@)&-hVJ@V#F< z3xEnVhl6cpUYGV`ob13dc&=5UC z604=FO?Kk|=xI}T<|Dl+FNAwurJ`z1-^n~uYuGUn!;YuutH2z~fYoykxXpsH0Gxiu ze3x1B9c!?2AUjyZXPut(-&us0?8p`o?tH^KNJvMWYZN<6d+0Stv-rI_Y*8G%(PJl6Pk<`8HffEIGWgMQj?^0Ds5`pCKXSO%P)=M4O5+N zS^ZS^5TkAQUd-BXty|?X+c<9oj9=hiuId|ST}%;;Ukt{z42(xydY$P@UHg*tG zbr#)|&$LUcwH))R3M7PI!*j^El#FGybISBlRR!~ZNReR~*n;?0Dw3$$;HYs;uco%PHW?O1;C%4gMN`cxqfn_M`k#@Z?Q z`15k;nX&%DX^HR|mrhHqacN7BOv60&zWijt)x2?;?a+N+)P0aT+MkzN;zyVv>O`V$| zEAHeU<>gDt%a^v|ZcLGr#5l{1lHT-aUojc=rE1Rw%l-q2^G6QI3-+?cms(&eYnIs| zRuv6h37VkVo~)29bn{LZ61t%>{wO5pSWV(PRVOsKHx zl{)^AAS^aAMGmA&QYuzlE-rI@8}B>&RhAD3M6F27x(YD$79n-dLmF~9Tw<=?EcY9P znmI8C^WwYQsUyyQYjw`c&3t~O=}jR=^LPgloaI^Lx%T0$sZU+?pUUk;zmt)1C{kiK z;vR4}=ZmI^p6_F#dPUBel=&b7X(kTCRN|)OUqc?%TJEjP{6c(9^Im5D@GAKo+RCY~ z$*ys*--ZWi-nN8R_auIut*M+&0(@m+NpSL}!uy&Rc=%t(e;(@$n27sigpBIm}AxS~a| zql@kX1lA+jd=}P0F`eLBH@8ORbOMC#W`ppK{a7JoagP4^S=a@wakzYAnuinRs_BXc z08|7c2NOje^8=6+)nFDo$3-23?Oe4}k6U}#WOwMO*!R`zS&$fKU`!&Dvy04W7XU;# zBWxC!gZZKu^Oh3=9Trzxu+JjM_#zeJ?)uJKDANXn}{%hz76J%zlSsR?4|&~&K3H$A zJhw^b0(MDd@w84ImJ80uZ-h92AYC$a7gn5;0^(b0_ISUsK{-GQaRI3O*&rXhb^ z1o=a7G@fmUwCX|@pjdnOMcKvi6ZXhie#4A+agK3f^~hS=($Dc{IM%9FxE^zMiyY?8 zW*4fyx3RB=Z!T|+U{vAT#M319HHcJPc4##fMZb>_#u@F~;U8~zWQOsPALaZQ8J|~v zs6&gWcxR><$yRw2k(q(<&)sCQ&&ih(1LQLASsswpeRV~3@$|g_4umCh;R+YM$rP-B zn%FY=ihk)Ugp{Ryh!-K{BTr+g@PEHtFpDDEsAk;GT_+Cp+u*`R3s#R_yh6_5B5-k~ zx?CzR8H{%GDYEq2mR%R!O_gq`lKTuL*1@U5>oP4$X+>-`5txmj8q?Hp$#aqoJK6Xud?g<*jBW_lx63`OGM?{fe4b?Cv4sID zSJmKgrT!?@*rJ7Sr30qr+w9YL@97d*8aQ(lXWL7#y0!5cUDGr4Uga8LSVXx7p2aJ# z9u})dXw~a2d(7{=YYA2VNLhAc@o06Y*>|+M$h-iFZA&*@FwG7@-}nsOWA5PelNOit zfZbq3L`^k>#pEB}bLhDN-%M^r9vnwp$T8S+C}49%CykEWF*g$RCGSU4y1{I^5NV!$ zCy#oFJWp#FNZzpT*zCgQL9wI#Bl%5S;|Bobbf`%hMf?qNfN7gfM#LrAMcA(e|glN_1x$;Hd@S2*o(TlQq6 z&$Q9hQaQXe_P~+JV$|(k&WQ#WF0BaD97lrjjMIE<2w=svF+xCh^tRDQNXPQV>dr5B z!*t0#pWT+J99=P1uZ~{r7dCoEXAz>;EA?cVWH4AWUGToIa$ znZ$(S9pzb@G5#2i>*{s}#LKX@U?KwzVBuYmzJ}1ZI8=So@>Uu>#gnQfuK#R0fFz^1 z)ePbjQux?;o?AoJ;}L-zK~nR7NqZOYsH$`EdnTE{fPp>1AOWL94K_g(qNqfpX2VRF z(FCI06%`vBL99}l0jx?UP6FB44sa?`drt4iwtlTvkG0&Ckc3MDDkh;SUaA4D?r~IZ zHVL52|M#vv1L*1bpYQp;JWpn?z4p4VcfIRf?|Lu7AiTSYJE?^AAQ~ImhPC;16vO>= zU4EDVjhrCi6%xrw%)nQ|`nvp|@M_G+HGJ?v>hhnEH($O4*Qj8D1clx;d}BCW%88N_ zDJXPp{$mom)0mMXFG6%gK5hc>Yzxp~ynoMego6Db9@_$a0 zBM4&{GghBkUw)|OVYWFV6M1EBs&~U>aVM^=@H{dovD=uD8UKfUqDeK~Usb_Q1#lzE z>D-+@!xPPZLYzmtm)^x~m4Nsr4;3iC47m}1v@TzeK%39zws4LDJ%d<;(Lc#_Jt6Qe zY&&=-x>&!~R?1Ocj`*33dfQ^>x9CUq&T%nW!iaJ|srVG<`!D>lUOd6nQ23L-e z12+`UaM$#U-sm(c+;!Zc9eGHTG($<#P&Zzh(r7<8QDx|IT7qqm47gGOckmCYjG_td4c?D_V88F=y~l<@tV^8(ZWl-)Q@Q!W zW$-QhMsB{h_)+*g$E74TKode=&4o$UYWO$;rU|9HpQ)`BUmi`PB|igucRTWEBUIm) z<%#>QOaIP{wfVBc#Cc604rF}Lsci3DCPv;!RO`k|zD1OPA;j{2x(_J^mmYmc;$QLE zau&^LetRF<4Q((&Z}5$Q_f(dHq#+(&Gl@HwxJ&h(vMiaxaK+_L3Ck=J#(qgzmP{n! zG}301c0A9aJg?+Agy&T}&*pixYS&9;eKf~tW1CF`FQOg6`Uy1mrLtp0tJiA;{YLtR zhdQ?or&oHzqgTX4kh1C0kd@#+{mklo|U7F2wD+ozm9dhG{J$E5_ z2xQZoYiQ0`p4ajmXFi&%T2{`8?U9jr{EQLPi;u~O{m354e=%ZN6ro0pO6?KTnwFfS z8_>a8Q`s;o%u9~LrO9!)Ojtsa@-__e0X-V6AQYr~V*N-C(X7=UQ@Er_8bp2!MeTyI-s~=I+5|uTN z?rO_&ty+)N)j!Q^o*b&aAicN-2t>E^<6*tEo%G=*9OX{RvRQ&gJJp zp*~(On`WdXuVsIR448VA@;=nV%S#+VETmSro%FXP(a!iFG3nw8i|fDI9U{jQ`}>fmGXfQ9Tj#lMBng*h=sU|UO*Bp{r`WNL z6M=}bEOTOsx~H8u#2LKEoQPf-SHKf73R0G1PMp9a*PK|&BhQ?O?bWjU#))SGeB@-i zn>dy+EgRA}aV(6fvk}&55^R@3VcL{K=0ra!mJE>#W4?gD%O*5VysRXlZj*_E=Xy&? zY0y;?Rx#O=ANTtv?_@0>QC)VRx6}>o3E~G*?HG}Ly4*YTv|K(Xt$v^q&L)M%DN|8 zT5zPaXFWM2{SbfE9=%}_s>+!Li7v1cxq=r+qJK*!g2>ndLRCdgN+a2Yb~1OcP?FtC zGRjD|?y>`TW8cXNzX`L>u5h*Sxa%T2IW|hA$}B$1m&Q7mYEwfx&B_Z7OExF8clTR`)J)4BgPzR2`5KrTU zDll5Bu^@T~TWyZY;Gjr%xca&WCp%le$p>9^+KOX0%+rbF3g7w8PlE2)bZp_S1zl2X*>HZ(Et` z{8)||qTs#AWyIQ+QuiLM{!zXmo1m@cnv-fD&lkF(csE=gqhg#iW0@*`Mh%04NFYcfsZs>Bvf935tHQVCzX5tV4}w1lPPiKpw%7P$})CR&QyYr1r&FZXo&m;47eb&~f_ z*tv?Y@^YX5AgrzsC!K?qZ?8QFUF`cXjPfVI|CPEB2n#JMdXG1?X;zq9!m0(ZCTM#B zBM;#&#DY@MQC*iR<_a;wIF%@#p!L&EAxQfnK1}DPIkY+pcoy}~Ih#b>0yP?JV3%W@ zKkw)t*)Aq*lvv6skKX)Yp!T>*qfN$`NtcyI$<#c7uhB&xilo!~aBrp4(?pm)569?x zIGZ28bLkMsw34%pW5sQc_Ge4Yj*c$|lfJZ05v@vQZdqurz{dBOUd*88vr-+KX?Z=-fZf*6sswQ+5}jn8LZPViiE>kTu<6I2(~4KuGID6%NTUfuY3 z{&0dX$~~|I9GVvn_>?PDJx71XXTkoFU17apl~AZeoUgL3`lbCQ6cyioZNKH&Z@;nM z#M&$6%0p~t>J96JuBCRhM>Wj!5X@IOW@Zr-nwd5YA$YMJJe%Bw1a11pEsY#|`ZbM& zqwR!6XMoW_@4}7(^Y%=yb8pcuHSp~9V~X3gRejWc3PN{bwnfdpKg!0;PLOA9e4NEOP)jLmMowIhTx_Iw|Lvv@g6e*>Vz!S{UBU6zH?5sf^um-t6 z6`d}G+vF7CwiH@zFb?e$;Wil^`a36tf1LFkEb#&}O_+s{ZxE54R&;Kt##EPgeFBgEa2i+uchqF>cR{U(8*8T|WUjIu)p6jr90yL9wRGH>sODbwb}+}KpxS_0A7*HL#XrbhJ`71XCGy%_8E2zG3hiTm^kNB)f5xUr}At=JrRaco8`>hB8mM6X<2 zf;=oTb4fve*%9Zv?G5KT?nr%&_vNSSVZ3Oryo^_z55TvRD>rUtMUGD5xvpMKH;cm3TczB?x#w~4`P4{#zrGIet2f8aPAL8 zab7|s1Lfj|Vm>D=XG1?7n+HWbL{BJ(3F^^Sd`VvGha1#hei2tA6SRiqvPm)%<3s~7 zDu#&g%hSjz@g?HBtXD}JvC@~_Vkf>?B_;uEX+Jz3Ay>J!y1Z!DfJ4_MK+)Q-T8g@^ zOFY7jWQX>vR&R7}78F#6w90S1h5sjQB?1uZpLURo!ftGWVW9)iyk5`SGp2`ZeOp@vT+0XHqo#5^tkR%q)2uN)z~(Jgg^P z#q`hA=zZroWBnl)Ro9>w$_qjKa8kXj(uPJ#K(;eK-L>Q_FRU}X87!53*;B!w($Xl} z_+Iop1;v8*)sTz*w^B94)((hBz98u|!P-Q)>Gy!M9pShBMqjk`Fd8eJ#!YTxTBgV> z4ySavea@0vHdKo8&9VX5!xy%cKf34~(N~B@p5e`y202iPH*ti%D*JnlhjR=}dvB;b z%b14Xmw%9P6Z}s9VB@BI)2|uawffISFpNjGanl&B$v@OEg&nmikC_&f{elp)o4ou` z$I;)x%nhX*sNTTI-~F1s;XT5<$-6iCejo4VV%UoZIe}YKUKJ@0kM_J+vzI>O_j>Un zXP5PG6CY4_Fc;6`0}{B_0%8bSU;LF>-6;|`$n#qEk)}VzsACK_U<%y(Q41i4-Tv&F z-Ev7=+`Dv$7nMsyZF;;&-Fae&;X48g-coxjRi{r|hFXj@8PuRyJ8A;8m4e8du95v0 z5$42BYZ|pzMC*mFQ)bZ^U*wB%nd`e;4G3neWh^$`%b1W(wj8lY`oa`yJ0o7$94cN7 zrzDmEeA+~8y~5qta3K}y4HcfohKuY_R%1iH9U9WuFv<>{t!-$ySb|1HW@AHv9a*HU zZx~}oW@}p;F13R>jSXY%@62MuI6E?zV38fnYizjO{(fm=!xeVuGKwE>e}+VDxXKO| zG&W4IzmIJU7pstOTCpBU!QV zWMz5!%VGL$y@@O~`<1<7w3S`NH5KwBbN!FMP%eAYEO$?O1EL=X`XsD1RkAzG%51F6 z&>LoXs?ExN+6I3%Th^>0W+g*7E8DEhbR!(?2dJrn{^kgUtqR%d}Dl#zDEg~0)xslhp5Nkn zrDX5zM$9QzMGe~Ki?ScYnCgA`1xnXMdh+Irii|!7#Ufl{G58MaB{}>U5i2%rpc{z1NavX@=LhJHI4(ZKt-{`yh58t`qgwm^PQGHj>-%qG zW~N%ZuLCJkEH~ZOrOg@o(UoZqZO8$my;^%<8~<@-MdzsYK>6h3Mmx5FMs?S)=$#$a z+Ff|=S`gE2Yu0YV>;uZQs61neWC$h-__C|QU)t;xhfQv6XR}kiC5;H} z2|cMS&rG95|INNzhcq2IkBlYbZToKTq)dq=t%%_?=Re=Sko$(wAV$@fgCC2IcGA?_ zXa)nZ`PDMn5}h>h=EcODvOeNjEvHoZGIWg8V4D}Scpg%~&j|C;wzuU?8hpc$fo+Wq z;}RcH@kHAi8_LJ;@kyCuL(lv>=Gah2-iHR^m~G!R$YyM-Wy-Nu2G{mqSt~0q#>2@A zG@qH+UhUN$_=N;rVy@d0*I3 zbsvEwsrdxo=JxTEwN=^@dy{CfBy`(%> ztiIf~9LMeVpjY2zUir{%uKu}9lIBr{yUF>UM2l|!RyplcwP&T6?jtaIx|;8#t+>;( zJ7@|8GpjPQ-TW(CeI4-!{-^ns(UiGOqo&zvHjOl)yXrp?q=JzQ+u~gM>R(gu|2BnU z8B42s-=0Gm-3MrC!G5Ftj434Ipj6uZ?I|?c&z!;b|8FxWCR)@CesJatLRmWjyniu+ zN14IuHMDWg`wVuo48Z~V%#snSbf+O1yLA6llO3jOj@yvAs9tj#AI-qau5Gtn$zh<% zsZSTH;y7m;HqDO{8fyk$a4Bu-4M*;J%-4s71 znt4^gd%Amysf{7Z&EW#Y(~KRg*5P)w9u2Bkw-dA z*J@E89ocexaP^gm8g1(lY_E7**_~Ze5&NOpuPuEqVCv{fR5W88yr`$b)ZJ!9dl3q} z6R_T-iWgU{&H=Q5yrkJA;pP)cyd za%pGE{+WD>ouwkej36WWFUKXmBWdqX?LYX2WB>8U{?j2p$7G8Ehv%sEZf`lb=!>@)U0B)i9%dl9$%_Ud3CDtEG7{cl^* zQEmAYYz)bMR1F@i)=siZy;as%Uc58(6zGasKMlYC|N1ldRDaf9ruu``!0-0wU-d=x z&*=NKIG-f2v*jce-uru@`a`=(B_$(L9$l-RZT2OA%)PNz31*W!C%VJG5S8I|8llUvY=g}c}&u4~Pg5w;tx ztPucjB#Mtpb5uCrU_`}MRw;6da!Sp^2V0Ial-}|Yho85bgr{d^Q-f*|i%yqXkwApz zw7&kGqLTH2)!Zg)D{q3AE_sAgVRiEjwZX{sPQ5`NEDp2y6b-I-Sv&dC#I_)pGdd(9 zt>F_3EbE+rA!4RO9M*41BfO1QNT%cfNnu5aq%ci5&L1MGq6(1@LHQ7VNK50ZhXT&& z&(E+#=$hJ(G`aWWh*L6@8C^q=gkmvG7```FyZ%KT64>*d_#499E9B zmcx+rjB9yght)3?L%QKo{Xd^hCLv;kM0`vH;dA4ql&PsPp&1TdJXkM~)GoU~O51ow zW{&f3TYs=K4@wrqFJ7d-~BK2yuQVsL|YXwmCgQ+`_3OiNMr z3EK_KlLo5mU;#v~SIh8*&eoez9(~277Dbf1Bht#^C@4qOooA(jrs6Uf_;NUBfTTuk z!!&m^GYuRvfumw(vK_I{*v$m|DzOl-K`q7bxErJi;fIHa0~vG?9?lX!YhtdFi?m#% zv80kxtSX#`uqD0V&97~klo={UnU1A9k76L(tI%4^c0=kOPs28Q!&)V+#v@9X8tltT z9;u0@) zd^~>w8@VSYHmuDSVYonIcOY^+5&ApEIRPD4;jxF>)Qkl&ocf9gMEe;qNhwkokLN#2 zNP06*hM?5jIHmv}JX+lrqJ7%>H}#(F?jT$D8_GE&e%xZxcu6}CF{2CzI*HjzSiT&~ z!+(U6qMq@EdgRpvC(ws7b&=Hv`o&Z^S#CUCN;PUImR#2e1|4Aj4x0uru*{e)@;F&Nrkhc!r2Kv_DAr& zTMuOct8Us5*wa+bLQO;GHh7!1{^8-;`o$wQ3A$i2;KH&}&W?jYY~F%%+iD``KG0#35jCtT2%r@q+NfxsG5rQYG|` z`!C@5%KQt{9F3X%9GPjhc*(%f;doOa_B}lr#>Htkk{@H8_iO0aqOS7j&($KPdDtO)V?Yso0qnnaww@_Vt}aNneF&p_(mOsANurC9-U ztTwCpWf?EtXW`JBvOx)c_Es4yic1iDDH+s_qt3U`AQ+AYNo4;?22nST7oS{yt+syp zbu6fW(TS5#WTD2o!l6t?HI1M*{B=-{dOzzuf$1l&v39MLJT>ZSKpZ>XB-X^QW&um2 zxmHzGT$e8gO0B|v!a6Q*1-VEoc*rLnlHO+yW=g8Cf_*YI#^{*{&hZz%?eBe;?vx1X zh?Wc}Jjq61l!)eDuNx@t=f3=?+t;|(GYdpOGkgteBoqKu9jkc{rp_2$RJEY($CgK* zRTzs~aU>c6s> zn^U;nIT6{PW^{Rr?QzhePgB~pkD%k}m6jEoFMtF@6lsoiV@{tKcMA&G({9cY=!j&SS9$SYL8Gt6EAU3jBqKk3OvxocH|sGR+o}y4tD; zt;EH(AG5+@F~ScRY6YX7BZc^^5rejK2K`Fj#5V3;vCk?-c}M+RqF`@%;CW?vw1S}v zCBn9Udx)|~oXY*9RPKz)5+XbKvMMnTXj{vT1!*U{#bm9*IDl5krLYAJu+C6F$x(2S z15<(ZN2pY00sj&7L%?F;wgDB<>^lABJQ?RgJTYT7=U%iM)Z#^|WRqA42$&O*O7x5t z*pWpYh~AO|zaMFFe>5cb9a`289oE91%1Gf7npA=T{E;1gYo>~PMPUZf)Gy;b5NXY4 zD+>KOKB}mT8WDcV_|18u>GBRhL@L_uU)beG%);t}k_<%a9laRMVa*B)$F&9@M0eqd z4#tyf4fDq4aQy7hKl~YMNKlSpsW%0~a(9ZF#12^~f!ggt%ET^_%O!z!nNV2-dgW&6 zAIRB7GEv*Es+1isPqyVnz^3K@6XVKg>2o$pN&2najNIl34b~Tw<;V(3!XMD$i9N@% zKn7jtoMRhNO-TrPlsAy3kX@1H{y3M%e@kI2Rx{|$^1;zMkCTPDS>EED?J))Llz{p; zEV)NtatVdVMTs=oSR<5S?BWa>Vb1ih4#YRvFnx0#9f;r*5x-|sva!|@B@ZIo5-kTC z#udv*T3wiTMG|ikgGhY&6<Otc58rl5hhB$J94Hft1$8!_jlOv#^f0kjP+KNQj4 zK6u}Gk-n>I@(>e=oJ=GCH1g{#@v>-URE{(83pO_Mi1gjLWME>CuBt(iY?IiFB6$wU zeZ`&L2Iw6SE=KQB0!IN^N;JV$ow)g7==F&9N)wV9Qb`j_1jv->Qbat zlf#iGHg!Z(a;|e<# zb`4qBJj9RH+|%f~6fAp=LgW5u-8qU1B7LQ-!P^MT_nA{%K*n6@tw4w@Ha)V-8NiZG zaswy`RAJq{u1;36l$6Iyz6`3o%qwRZ0j*!iT#wUMy)I2=A6uP23f38-aN!;XUb|Y2?GPU|H z)!j!pQE~a^he7!#Nnd*OX)&_@xQ+aZzgk`fJ{`jUja*4{YI zdB%iZIr^uK4nXqS^f@#9z4?_>uVI=YtvHe}uim3A1?D;Jj^iFPB$E6A4p&iq}JT7hhEzVkQy_}9v6>K_eSeCg!kijuv z-Psu&2Vwb&kn~x;Yi6gRaeRXVVJK~Vsf%Im@SQm>cfrEq>?G4C8*6 znD1)lCG??jhicZfQg?>Ya&4I_G!|o>ss+Vm?o=!FYyAIXE4}7S)J`Tki#tFmp{(#= zgx2YR8}ltjnI}Fc5X}z51K)5XSM9eBM8f1&cj2q`?=2ssZJ3zpE!;;s&Q9hXZuAa} zclDN!JcYZN2d{GQy2CF}Py;4h=^U-V$YP%twtGdjR zRp$70g;-&J{tz0w&Xcl-7>AO2rs^ujHjH6i9~S7{(m+ccA$W)N!nkk}BOEbqHU6Dn z-DJBdu9psKQG;Kk%j68^H=mMxekj(tk%uz}hHgf*B?qxoYzS2+GlZ_=s>h?7(Y2&h zpE9b8+e6 zk&XADRd$q?g||q19l@Ex4YPZp)%WI06Q676gKqxfZ}LdL-5q{3&k^(}I#dZDKuV6F(0Ct$3QSwU_nh$cd$ zNf4_egt6HJnGfQ3e8pP2CV!NAE)4T7ynYvb%!aI1Fi*tupwP|rQb^$1^)j1U1n;S! z*s`=!h4*N6ONbM&fV8XXNtRYOmuLKEFh{2A#tIRHO`4sn|1auO%FPG84Tx5-NoQL#kSNkc7nyxI+uKNV z=*oaO#q9^DjL~~m5f>ycn4wz>LfZnj;1#-sS+!Uw~ z3qd`RA|zGjVg!RylR7|ms_BgPC#}q@x8afeb7MD9sK^3v5tCt?b5NFETLD-0bf4oH zw^ny9X==Gn2~*cIVXgiw-Xo|jhhuVlk-<*W>VzSFx*)Od03Kmy^7T_YQ>7Fb>m-`H zq6=kVI7CeLNm&E>Sx*WC2M3BVVlDD4iJozXLxHprm~Le6mtQ~;*m%}!myZ|6ep>wv zBnOVhpX4o8&S8%P0~X^peYrbI`Ya-mE5mZH0UsHnZ8wo( z?v`;-AatBw+3UpGy@0M`@ePwMJzzoIm@<7cG?K%5cp)Elu6RW<#deVaTI^g0OU7I; z&;rmLco#P)Igy46MlF0G8lU2B}p7^r+GV((A)CB)}CyXc`ux=Nj*_Po{;mfLR93CbIQw zq&?OveGHjVcDG&QKgpw;_k${pKDDJ5`W6mf6_FESo1)3gA0~SIL$uK7B`*&6Q2o@_ukq9P(w1 zM`i8^(XXYf#=IvHaBhxxwK2G`q!y!kk-{(`W0o$Hp)Q+UcF#rW9Hoq zn@r;(pCP3^${v5mY#Y+7dxXU)Gkk5?yzh*t*EkVR7fyv>vEW?xd>ez+D-2eycAk(= z5C+yp1gD%;HeIU=(+Y-*#ltCHik`0Qn#Hx$ZW6rfj2X8MG9&S+lHo>d9R__W*BQN) z0<7I6q8@i5ILbbN%~Z|T)9H>;M#~;`Sik(I>WJ#+8DQ{hnj?b>zRg^G7xjeZ+Ve4k zZsj>bGg8a4T-)&7C23X`U~VaJ?G$(L9K=!jMV8UibaOsR5q}m$5g&Lew#bI6k@jfx zS3Qhpf!cFq^iE-f=0HZ)LP1uo)saTUz}OpxBaQJC^-d+D2#cab?{SIp(RE zANfpEOr%0CgpR>lgfxCHay%_GJMIHq1}q+R3XXy!1eKsU4E1_yQOYmREXAKJMIxmXC#8)4PAP&S z2QJ2h*7AHuXmn~4enSqaU!IcFD4QQ2Bp-1~{4w5ptLG=d?d{v?U$+n@XZBBkYVhf9 zio>>NwBV45(d^$*pd)gi1P!bvLeCrmv$lMlrbj+5VGQK-k}SCS7Z6}OV)frG+J3NfI# zU!8xm^u`tPg-iXCv`~7u2Vv9oE2P{&ba?@1Z`dcpxkK*1w-4DNwNR~}P)M>@yYHa9 z#uchk$BJEKi%k{EE44=Iba_kSNA0mIc>90S9AO8ihT5+co*&9pw{rYIM1uTYZR!CL zvVIK}v1%{>{@6ESMIlvU{XyPN4W#uo4T!xj2?U6=`c4(Jk8#1X)YgJ%kBa=dbaN>c z*e#c8D7=LK0?Q@6NUojO>Ti|*+9Jw-gs9X~d4?k5Zovu?lCy5pO9ULtxaPCRCpk3F ztD&xM;9II}4n)OjlY3+^$H`wyHi%AXoVh{@!Gtkpc|X=j*ZVhYOG4WGUgBdX&~5-! zF-EbSOG+)U9ek`l9N>fR+Uk6*exD>sonPyB^OkJK>bW)@erf8Un!=(jOGY$$!pAvq z{G8O`<5<{xf&g60wD^8SerR=%NvX+`o>m`}w|{w5vs$Pn)y-JBol9Z=;3Z)1FrC2A z*^-f^jhACWC2fh=E6c@1-;Y7e_2;QtThrq2OCR$UXs?i?M+zfsB8**V;>|}d zTqyaHQeB(e2Hvs3{gc~-)Y_gFe^o!Jii_O`?ROd=?~pf{9CJzu#weVx#ocg$3NhdE znm`!qsKmPS)>I>8tFxY<$k@eamQt7V|Du%P-!7#>O6eA=J+(OMy5!AXZtlf{SW?ng zZS~7U7j;1cT#T^_uW{U0eEsrs0}FaLvZvEwadD8YSS!{ss)+wxiWsF%8-2Uxo5OJI zJJsg82US|m&~kMB0Wa|FFUJ~|G(%PC>zIyrru9 zl~lvXswZ3d8GB{y>2Kv)cSf#XCv&MMTlbl{?kAn>%MB~GkSZo-=%uoOcAV_2NzC)m zIvQmtQY2PuY1qZQrVM0@gf?MN7k>gsawst3! z(O{0_sSkSm+S0m22y`jQGKF+;h2*>*{GRTdSrWg1<9mOJO;dM@q*3IJ3sdqKM}VfW z*JazxRBP3`JTZ$7t%A~L9ua0z*ua`Poydpm$TLn3*3}Y!mx@1tC3K_LD!hQ1pK8Y> zg(Z8fY>B*vNNLUgjn-6@m~1Miw-?!}+3RFaNNy2~kG6ULS&PRREts}wIfe<#8m(42 zIOh(a`0(;ezkLkL%HO2FFq&HtTo(10x`9)PVFPZ z<*l9l2Zc9#XX!5m^!_ci1C8btDcSl9dB);{`35&Ym@Zo6c`6V9IFET$+w|zr^8dORYe<^PMhe>sLv` zMdM}xr6e1DhXn1lN7F0i4U!#r&4gkH49||0NL*@fuDeWSRYc!^?}+t>8UL-t-(X1v zC=j9#MMFiq+K@evo8bSIm_7OvA!bzut?osNYWW7v5l{LWQiRNN^hx?`PRUo?%S^6% z1mcQc(^l7#FuAY018rq)k~(7d5sA1?{oOpFRY)7@8?3FI!7JA#*B|Dxpvq-?3OPlo zMRt#~YB*=d#**rc*ivhO#18*<>>_KL#HJI=90&-a2K2*7bma4Nn)sD8ak`5A zyg%imT3^N+!?Ey?({W>!>$l2riXQ&GY!xQ~oeQ9RE|LtVc$P!uEyc5R%S(8bq;|$m zAnZ!k36eGTrFvN)+fLtKNrV*~F`gl@f z-Kb|s$Ep-IVyr~6p4y!*lMF`nxFmXAc?&5luy>~5g!ovvGs%}rsQ0**YRq|ZPGuX9(>SVz)|Wl1 zf7G=mwP$~8Ti2AmKe4dR3{c;xO+Dj`CjH@5lO&`{)apL|l5q_;Nz6!XRyqPw-r4hoTsgMg_t6>T~QFQWth?&LeN6Z=^Qm)Q8o4NDYLLWA;Eu$Szzk;CII2 zy7-9GV=+!_V$^0k72<1Ga)&0_r3u`Mh(xW-oO@yK{6S%G8 zme*46FvJeZd(~htY=fw+bn}Y98DfZ!r0w%ZYH-t8_Zo4+Mn_w6PR5Bor=#}ETC!Vf z7Sg)s`KU*>hgql9lgzpw$Z%@w{{~|!I9x>G@)EnX`bH8(x@+irFBvf|s=|E|_Ee8L zB-h7CGOk^5j2Lmj#oa3PPM4w~>?BWebsq^(WeM?{1`=s+h+MX<`%fwAEEzxv0Srm{ zKxB_2Uk|A1$8GNA@$(6vU4t9T&j+GebACLJ_w#B76F!HyY}R*4Jd-y!Z|D08lZUM% z<*DiwQFk$u726c2Y4*X$^B`>Sne#Xejj8XV@V2sf3<1uVFpAX=k(ErWzRF^p=j2VV zt)7=)RmLwPb~Ncdax(gZ&92Z-3=wB#e3CeRxv=Pe!z(2Uh1HRDCFG`!m0-d#k(v0ka( zl2QlQ{Q`qn11o5-{UuMUds3Po-Xhb+*1S^Q%*iEOa!#Et?uS}1q=kG_FRe9Qch zN(-9LyXEZ1g>FcSVU(LMG?1^Nz9)Dioy&BFu7|OkqiyIY=J*>b5&?|Uk{8@YD#?qa ztOY9u#gS|!aM1@ya;D9$Ft3XLS3p*Ea5;}0M{sGf!D+$icF!LihG;k>PU`AM^=w=@ zLq~giO5JIpOOoBa<_C01D5%WEh&pV2T*jAyGFQsoqi(ERBM&Jnq)tw5Vce_I#@{6q zp-#k!S3wTK#+5rIEEf6~yeISHcgB&z5K0VpvbX5Q=ZV+D57VeCZI8NcE;k-#R)#3r z95E9a{l{;TMQ2W$XTOulm=v_y=TTbiHYpUbi;cd*-$|+Z!unUZGJ7<6PG?WpN38tm z3!{(oxE#Tqq2Z75lx#k!2*UIkZm>;Kg2X;utO-;ylglKN%Y# zd}_?)mBxx+OZ^G0;VG#ivZa~C;Oj#aY;!;#~FtZZB-U`1~_K12W6I=L8HyTx2F zpWH@k;qK!0<%7_eDr~83m7P6)Rw~qTEUmUhMS1;IZHO%*vzqZ0m28BxauoIr!AzE9cT&q&X2W|?}+|6MUst)ZVI}jxW1U3p_Zg}yH3#7lL{;GcT z6rrU#u9beX%$v#w5@nHSyX&Z_y9)E?Raj?w}@bn+?a3aCSWv4y81-$ic3^8 z&?3W!+KLy5MEdIz)ga;q5cd*sq2Xr~JjhU4yoO4J<3<4~zm0Ejs)ko=c<=Z*x(b}8 zIDyG6?XAglP~Glok?;S5rI4^s%rhlypPmt-L=oa!4i#)?0>+7(1&f$BL>D=cJS?$p z-g*-G*k-x-xyTgrMd?UH;r~|*S1s%+!93F@O`3(mp4di8I`Xb=o6IzD*EJbuEJ%_o zMW5#7W09zvyAn^ZN3ocU+6R6;wZNWgqkN?sS&QKL$a;*xiO$NjYG?V%emFR5^RA>E zdAO+~X~6nLC7Tv7PA2u1@$+2!xtr0$;HKBC&NezGM@#ZYIamdHv_`D*U~Ly1KX7rH z6M>3^Faxc3ww%Ns&kp*<6&`hPap_V#K!0?8KdmkdP@9W60`yvw?}KbLZ=&d`>;P^D zU{MTQoX)L)gt!3_?~&r5Fb^Tu2@FMf)gnN_1YVz-gD11t^PTZ zNY25F@6a|pJieUPpz{ZcCaKG7J9;mnaquHuqN2bq(&E>)PP(d`7z|p$^?5^?7{yJh zv(*fyPY9%6C90ob!WMaov@nH^!wifx0|&Jsoo&fzlQ|sDEI}qShgSdVg#`~p?6mp~ zLAGX6VX0Pk4=^j@&IMNc2F_Hoc|BduQ+K7x(dw?}3u>6-5fp>9L@6u7bj~t8sTl;{4u<7i~0z9 z8jMaJqg22>{L8?CNT?xJtw&C{miMi(snsl*G-{yy3rLk?S6~YpX&P2`Tt|rb*Jia=W!u~J7adIJNvYzPNS1LTlTxD zw%Vw0Xie?K?Lmw%jEo$r0fbX^z6%UUoj>&zf2FN@jkiG6PS}}#=MHb-VK5Cc;(v_2 zL_AA2ON%_l@FYzM^ja^|FwhCg^e@Za5-`vr>b1Thb`$+#OOvCx*5pca?u?ua>stBI z$jKUQ>S4H&q8)Ka=4O)Nt>`C-hByylbGlEGZHx5PU;+Ge0-Qa!AjNxAcFiwi;`PLk zIi^8Fv`7}O$Z-3Hb4vNNPmi>rUeedu*V_SjdN`PBtIj8d!W^^flr8BcR@0aE8^FIfMP%ws1Psc!8F+1{PI_2Rb||Asy;zdlg)nwl#-10DS%tcK>$ zc{Y!E5gn6Z#vXF0ABuLxi?eG!jSrSKitXZFYbBa?=ClI#=FpJv0hdbPQD#w=XH2h-ud1LyIpc zY)4JiZg6W%oLz(l*B=TFEINc`#@IEy3pN)~_z?2(2p>(w&|YC@{jTNir}lPhTMz9$ zscr4Se-*;*oA;j$mFrrZiE@RDD7W0>_@llwfpC_PAI4>(U90~XiZkZm2NRjH6Jc8M z3{?c>_3@i&ezRt_^`jS0awqfXd`B=3aSEIpV!3M{bgDI*55>1<*Tntiqw}pB?PSZ4 zLiL-!2s1+P7QAAj6Yq@=mvRY&VsWK)kt8!8?z2YNffuYS0`a$`=tq}f3V8WY|AKAG z_#dROS<>G+jB~{J0qZj!B=KAO?Leuu&kjtm-cW%pGAq_LJF?Q+Y)9tMH|x(5j%?{B zfg@NZRn<$_@7(7%mvQry2rkN|nkd7a71LjsShZD`LCn;CkBJlplHgv<~l@x7}&r?D3 z2?bRVA+^&dx!WE~QGWi~Rw3QnCVnni(2+oo{pD^62P>6cn%|7btKVs*dUJ{0n*uW; z?MT+1O2*1HrxyrIUQ~hq2%4jV->44$RX|{yxw4Pqg!&(1i3h==9>V9{vd`&=SR4vQ zL(t9{l=xJRvZGu7tA;ly{<+%}SqoL`>;N^@^oLCG?*xk)9Sx5U6FR)NQ#`Ho?rV6w z|532GzxH^TYC@ZP`ny9n_N)}@7O$yN?H^Rxo6)Rj1#v&A4cb=%URp<0&HgFE9y#*h<3i1>vPb{h*e;U zvlmX}v-uy>Qu_(=q-a7!nzQShHcl7!^@wbhLs6P+ z(JQ6s&fgK|9dVop5sD? zacC4*5$w62cpkjCzM0rIs6EnjJkLY(qGxjDn~4j^HRuC*Xx=^ks=vqxOX7@sUm%rP zez?zXJRwXfGG6^6QHI%OgfQ{V z$W#2X=Xw_Z&@_b^z#h7)f+tLy&{;bt z$jf37&JnyLk&KQ{w+oiSZNpiCG#@ zhu^Hk#vAwOJ4^GNn6=e=>+%J%)v`F-jNC_8xH2B#MDs%#M^KEMPpv07H>>lWR(FX@ zv{AIWi+GymugOqe^%t3Eq_g{(_vO3d4;Z`6h`?jZ@sUNHg`J=T&*HS+cMO%RiS*Kw^CGfm-Oc+HoeNq*2s^a5csB20t$AmfdqX72!Q7!wSy z-+Xx)v0#NTj|yjxw=vSgpp-j%1J0f^$4IN2ErmQGf{46O(u%AkxhEHxCb<6??qO9O4 zLzLL91~kkk8AW;`3>M?V%3J7(8p^J6Qw@sU9KWeXv1pe)jylS*Qk?Wajc0NM(H2n! z(A0v;|2B}4HZ_o{?3i#RrEa57XMujG@{+GBzQpdiG*`ytj3HE4&~#d_WE>g9)5F(g zj~SCdU+ny%6)b~CdvYr8rMbPSQI2DJrG2KFgfC~LrmoA32;7q;k2POxJ|O_EJ^!Zj z2?2id34wI=DvO}dGF0kNR^;JQ*pQHZDJGx4Dxzk*>diuyub-PQJUn7PFI{a4wFl%d zm9AE;(P_W69McRHk=i*@BaANYUX-)H0Czm+h;2mXBDDlIZ=j!Y zURu18Pj`hnR=l~e7iwhj6lHrrO+7O!haO+ z&?Z}0ESvlpaO^I$7){;zx$a!|F=fCQlqOJt5D|#dVmE&o7ChRV6$_M#HNHLLXD979 zCi&mE_Y96yY;>#_e;~endXrzQZ;%$`b7((0MfNECGZ1O&rf4n#NM{5w-JkI+gcJe# zEC*4T!%eb31PAH8{U8?^gLJ#kGJy0|$V73)TPH|X?9M2io=x=D5xqZA*cmY593eBR z*I>fHbp3R1pMjm)rao`9GTd@vq+Zr`E^&pp4isMv3aNt;pGuW?); zZiSq8B(Uy~1hlyy#RrKUOi}EQeBlfRpzJZrd=S0h(Qd-%Cy6o0F&zds|27DP_7cBW z(vXQXqy1O{PzgIp*kx3HO+ldzRFajdElbrFyPI)I_Rr|tNIS!n!db#IDD5h4Cy&9RTOZ=1Mp@;yqUPEg=*JD%V3&L9wavJj*tVv!C}Ev{30EILo#R&C>0^IP zBuviNJX7;<;GQ+uIyw6E_v$r1voe?CpwV8`C9~t!dyiBYooH1g=M&3VX~7?B>#vpp ziR=tBAb2QOhpRp{cebZEZtn>iO$5I zCDz}st;`JGN~x~U)6zH++r?$|SD9*Fm63L1w$z3vZR;?5u9W=(8zMTfCfjmsWOeOf z;1cifoz=#$xMACI)y>K=dRwVLH*3|7}erwwRwKnT%jR>y^UOBj_{NJi`ZlCblXthdDzx z8=jVgT@}#=$)Qj88gJ3j^X_@y>6o$i6N00@Zg)C*dr%;pohvSZ4q+YxOd<6k04_2M- z$B8%r1XZw_=WwSz7wcizXW@l&|7_MrRzE4hMG146ovbp9A0HoQ+Xkkt^87>cxpI1- zYEgN>tSr?ENHteXip(ix4ND20>G@yro>e+s#R9Xl0kJICiqfi}fe428OY=wX5YMtG_2vqZfB+ zzPHE?mvh!hhNh0QJ0-Fk{3|38yY|%jR(Qv*n2xNznh&Wh@>}-4b+a_TB3fCho68C? zRLE+Bh<{5A%1y_U<6}nqjNaa9FOOs#Z2S{Ru#_jurk`LW?_7)u|+>I>2d9q(RyNnpyoL0AuD(kx* zItXFNMZ593@s7fi0FR$_<(bLPoGC7EVQlX|yhd#AX9GSnI(s{7WyZq7`u77>%Cyg% zQVhnhb|q(~Rv-rb-X%iVdhN_j83ln3w5%yE`WC!Xpp3o+mk59zPXgH6Hh}33p!#J{ z`a3g?;{j)9p!jG&^B%E*W%Yh`Nqda9owi2}%fQg-L2NuftP`4%<&1Cn7CkW_)<#x) zd}UrgqgEUFzbVLHH?rc7r}hhOm9o@+yyj*`VX!uK(2=*Cj->%@Ru`yzsZL~>OBAX~w?0^lbT*$)^|PQwC8>1}ko$wdo?^>c(qG zF!X19G^ggUfr=?a+enc(F&I?G2L^7ktGM&Q3vl^y)NgY#!GLqT>loKD&3n5I?@u#f zW5(YDy$_2lhxM3cPR=x^;)4r$ZJeqYlRcW}VlC^QJoFlk$>Z4Kuch|n7C%ilXJ;Gj z0nT)$A4r;=Thzr_%=sSHoA!QG)D?T431?inegqzs=$^KIV5CL15P`>C?9FID?vm-R zbaC*xT zZ8_lz-b&Zl)lQ@Z7a5145l$w-q*wDDhDOjEE|-RKs?xCpA8_vW75njLF>$v7l;vps zp1@qIT!%=d17lpx0vdv&6@JZ1i*G*#AI$f_*f^CSEZ?~*+A7uA@F5ifAD73UNaeo` z$_cyS5KPa$}RM?y81N?dQaPWxw7SzqL+_oTZP1{R)+woQH|$MQt9!BF+F2tv(q6( zco~%$0*rgXlN>FfaAw0z^FU;d2Rz3yESDy*RLpbe37$4-G^&rFR`AW;zqAsbfz8G+S^a-xoUtzHNGS4?~Mj zHF`R`ouPic=nFl(Yy$h1A0dhN(O^Lyk5y1E+wbfgVIbWuyD4wwR-TNR*UH78L?`|x zls}Tae46_iF>eycy3fkx0nvm9kxq%2Zsmc{Gf90w8p$oS*kKTA$ES^cou=HeC4^eZ)t3`WZ??WyJqLmCz(}n{FgOiJ01hX=wh&h65XE&>jxbAfT+J-VAKSdDtUoYG% zWGZFkWICBXC{E1ZE%OANM~h4h zmIg1;jbnae4}&eo+qte4a*8c(tvRYkVjR_W!oaP83dMs23!$eq9HPIo;Wc3B@j#x} zgc|)FE_enbM}ndiq-K`?eGX1 z^1HERNrpVa^ZVLLKUM=MmW^k(w3U7(Z;Ti;k;i`s6hQRryuT@!K+Bq~emEG-ju9!R zpUTg*S$Octs^ox_HNTsm(nDC@ulct?)egUT-JQcOa%^!?rtJxfJ!ZQ&HhjIpI8tsL zKjbd@Pa+CJo;mH6wlxr zqplHH45v*rR<&se-c@KwKNzS2=b8t9RjqD+#NvOaYDZ+Km-^s{kI(r)p;la?)-K{#5C0k}zxm%hnd#383 zlwZjU@tOFV)ar9t&NoG~VJ6@l+%=H2Hv&mA*Z+sGbAgYlx)%OSG6Mr7oCySsiW+dx z1VNxhO(bXznIRLINDz?lEGw9A6E!#uWz!S#aCc$1^**G!O0o^qpphiE`_|Ht-{isU};-i zPCIAzFX!ia@#osT67D{IzL3b*B6l_K@^As%UOt!ziTKtxnbeN*F<-4fgdE5U#eO_E z7~7W5PBa?liqpPllov_t(Rcn1fFvjvRU`ysPZp8KY9YP8uAd`ZT3^@S5x%xv=@U5D z1-wnsH>r7DpkGr|&V}m&{hOk~zcfV;@K@V9EyvjKzPxXEhrfxQc1g$a=x$zJ5#Hs@ z!25IRJ*Pb?9Fe0V+AKf(>xe#OKPaD;ZE#VY>u{s`rI4Q9(L+0$2F70?1MYXUM#(w4 z`FJY_7-39B>$R$W{de4o@0oFg_DKEuVOe8gIgfyZX!t-le@dCMYRT!aL64D0LuGE9EAu70-vs zGLKn?^GMu3qLMy!eUD-;A}@k#sKVP~T`r8&;AiA^G=w;wKza-QhE%o8+j7D)3yGR} zuXLZOY34^RLr@m#X5nU_-!a}t8bYFu@g?%mF@CE3bBFp_-5@{w>sYK=AC8WvmrA8?+cm=LPdXD-@c-i7*1yUfV%q50r9c4n%$iSBU3m%LXwf#|`Ps_<1j`cUb zq`ZZ0nV1)?%W@bKS@FXPfBdC*z(UwW+FZEonW%es-Jju9%<72%_n0=bIYD29X3lNxC{ws25PCH4txE7W zKi_H{kQysnq|Q3V2eKLxSa&&X?ykLthq-iUA$c=BJI^S)0epPdQRr zR6X3csFyZ!#I1Zv57!TAfZ>uL)DWBO8~GG8-Q@tuz)|EDfj)lDNIJnZ8_gWX&nMnhb>@b&A(siCy-9jZr&1N!(Lv@;^{IKXI zH9Hbx&g*XNP^a2HwEQ|+Gy|TXIfiT}wXn(NOp&SO)`*A{!$OzR-5F@5(T6D6(m?F7 z?#DBZYL>Va{!4L;zB8|4)wk=B;yRInRkul@`i8 z)>XM@Cqwama2=DI+iX?q$#?``tnJ_qQ|_&-UgS-TH@b{d261fO)V6eR(;h2n9K(0( zsVf=Y*j0nuoen~|84Jf*J6OHFnZavUX{0llUGvOstY^Km~X{6toMjpXO zcD$V$b>rI|&HNf)8gE)RQ#-rEFk-}A)t4reTJxq&d{)gETQ>7ZV}ylR`-nanVw3(vTjUe*q*Ht{adP#sK z;?{Ql&)8_3!In=lg3d1LSeePM)X|bB)o|U-HgeUEFeI|X9ldNb1Gqs$!esNQQjNSKkm!$hSY7{Z@g7Q>?b6N@+kzINe7fPlR4b%Pw#PUC!kL z^)k&k=C$UZ{gzUgM-_w7xDkm>_Aub99nE@Uk=GWIDk3iL(EcRD5o;q4)#ma(m$mg_ zt?c^~yxPcv>2=kMnpsyIG(nzWwfXjH!YT+>h#+mWN*gyy8+**uY6h&itZAv6@B$fplgvWW+`6iJ4j69(H$Vz@##F(f zo4AiA6TP#+nvs1m*|h>V)9UQ=RLR*aYa&1fwc)U?b32XO^Nb_iuy{FBJl0Q+scN$K zAq5jgC(CD)4H8<}Oi|qcY7E)lz;a26pb#z^z%J*e{fG2eWpe*P=V8XUS@dcs<<#Kk5w!!Oti%dJk5zkT@3q@* zZ_flxBm(0!*hOcyu-R@BZB$d}}c1Q`+#kcxUHBHApYpLQWaJZ$)WvJNJ!_V9P<&V9Hpv zW$;;f*c*fkY6qePalYslML@GVeMjOp8SfoZFfmug0X&xV zA{Jw`LBrwlAX)0U+^CmqgY5bvy*kSBRRsmLIW%-3im(^kN!KR^(1x%NgUA5uY9~X> zmz5}*qXdy!FgrsxnRpzag82Keo_mbaA0hh^mst zYQ9;G1!}u^0%D@@YWUghBJ9ITMr{|PWbeRxoZlDXM3Piej#*Gt^lbGx`dl~%OYY5u zRMV;c?WIM8?YwFQb+SKLzfffOAUe6=-RpvP1q@ja_^O%-W;uE||B<=h&6HuP{Nr=c_6r6QmG-m;^(+m(Q&K3QB}fcii^C3?k(p7zXyc=l-kw6nMf7Z zL6%rj<(tzzrsH^PsmuF zbF619hBIc4mW0P>kACRfciQ=-+}E}C)N`_Qw%c=Y} z{v?Bu9;nzLNBl$H*}(;wk$lF+-Eee>!wN7O92&0V*&Hy6zr>g53}U5){vV8Mv!}TF zMC6Fy{E>?ic~YW3#KRBg`uY7blY}Z0b=&U;&DC(3pk~hM?(4B)XF8 zL|Ze_mnz=uqKZz4*yv`N&$h|dqf!sWvb&N^k}c@Y8Bdo+G*OY^k1Kpr^rR;| zLPZG2bVQ&dC;UOMgd6 zOxta^9ysUYXVk$Ju-4!MFuCMed!c&BwC|m9du}1i@1xRqc!Jg>%v}Rvs&MOGnj~P@ z-#KR!<7*o~pgwb}6=XllO9er!ZTS~B4Lv0|*biE@IfNCS)eN2?Ky1cYb93YnQa0qr zgapzWIH4&Z8jq!V)r@HPbzPZ(3r6gC#z{CS^xYuM-jq%ivSD04u-`{|Y9nz0Qr2nY zt_jAf7^0TQn`#_wK(jxlv<=}6v8-JbNy|T}t6VNpRN&*=Y4a@wo=0l+@t9o}qkA+w`7eW55ZQv)q(E>Xz~p$PU` z>fS3hUe)#vJgW4YfK_W<3EzVC^lQ1iX}E8vrT-7yFACh~f7no?L)JuiBj6UTlQi7v z`u%8-GWjv7bq^MW&Kpw_rWBqsCii}4oaZyvE1IvW=bz!~%URM@0bU{{!k5CvQ*6i|zcAo9@@ z-$p)C_zJu;fY&GR?j!em3g$ESVg8sdfG7C>*m%=L!08q>C+NO0LGvs+^0hXr9XMo% zSfj(S*X~sd_6W$7g6498Mg}-{jkdL?-H#(q5axgD$~$e)>r+$os_1FwV(8~Zk<&vQ z(bJiWdnLlW^*jvOp5htZT->_&+MwAd6f0!{hPQ;>A)`5QnCKeLa47i_b{xg6;j+S3 zvEYxD5Y~3gQTD{l8MEfZ$JBEeAz#E7TSO51u}Cj6t-DsTD+npK&HH0FI1&2>jp3bQ zQYEZVzMN{1h_Y{EoSGFfTt4gldqq3n<-;B_i^8&5!3B^l;zEPtB9tZI!GZ+o{%yCz z(Umk6v8RzkW+^u$JM+cbhdXR_UZP@`Wl|yegVEgp^IkZQ3K4K|XhJpJ8iUnOx)QmP zY?GtuWNZ3&%bbroPjAUS8uFZ=bXhP}Xr}Ow)A8F0k7vB96Zz;(9nb09_~}*FmS5U? z((+(zv+#8S1>QfZ8LQ}DM2tk#$s?9gCwu2#nt118A&g6yEX*-I;cQIZSG@#*aTK>k zh9a@O+;1EW8HZs81(Z&94;{W(nbTaLO7sYtcRCW!Mx(0kG=$g?pTqN{EN1fI=CZ85 z0EkJx8fUnzyznLI-4iw;FIfCw7uAPl+(%-mn4c(YOfEg9juh5Oymrdmekc=^m)e_y z#nlCoePl(uL1scOKi`0!>6# z4FtGGeI~4!FbLM(6?khPKTg<}3o3q*tiqII=Xdgax(v%!LSv*ec+(luqXp(*rl~lQ z=r=1P+4V1;pj8Jhs`v{9Z(4Jlhx#2m`ODo2lggb5n~wX=6GPy)yaRssd*Q#l8-INw zlMGuQkm6cFf+XL1Q)o>BzaR1cVRd4fEeEI%dEKebQgRVkO-Z?m zn=9AE?<3eq3?YGwLe5Sz>}+xwDjM681*HU%A$)5b3<>FEIadE7%D3{C^IzYp-`QO} zZ*`F)%qeR&a*dn^=)SY{NrugDLY)2p?ugi1DEDxTzB(I;q5nx}2covdR}MX0~` zF`;Wa-ZMYkAFYobO~3d%h4CvXKM6_lH2vaXdG1M~JYdRUyoNtX0-L+=lBz5JcFb=< z%q168go`ApZv;=V_9?>OkR(WhQC)^?@ z`pc;Uv!9gk!!~ov!*>@3=nXRJ^(*ecl^k!sZ%MW^-FQcIna>gK72UCsZm=~s;@cN%xrCdqb%&(tSvWPB z=N~)&mhfc1c|8;4WfguNj7^;F7ZUcW-{43NMZnD6XxEdwtfCDtONAdxj6n}kbqWs| zZ=p6i`WS|VU&zDPgEF;`2wz{6e1l5YU z`my>vHRDG(V8z>3eUic4g!^hQ;`#29?#`jIXxeNmY30M{SqEH{R@sUbeI3yQW)4k~ zVT8&Bs6v3HI@|vQPrYg`TBia^MGv|OU*%0X#pGhlj^T4W`ZLNCLLnGk23ErEd|+L% zi#twbI~X)4<_&!f=kkVnH765TV^ptBqkYvU;=2-euf!s?zhOAo&(!k_Wl3o2DJ#wP zvcXu$n!lDcq;0tw$M-jnF*P}jWMj4LsqvZSy5UyFk7qsBn6VmBgyu%doW)oBj~ z7r>SCEWP`H1aKVhqG7yO9`rV4_>J*iZL99q2(H${7*AO32dWqxIS_?_+KY5`x=S}Y z^%e`&%MaDNy-IZ{Q4sJ6I z5gBu`OF|X2F0Yj@zy*;|vE4iXM3Pru=hQp&T!9gX&gY3U+i(uzwf)?tYx?BF|s@9`Ry^ctw8q~PlUPO0$0IQAj@-HP$oCXf;9GBwRirtP6Y1rUIb&OizMBfsbxfn>NWR7_u^QZXU zx)JAh#C+^&dm7BwVYB_lvFIW9V?xsK1IXC>*S#Q&QP7;@4KyT)##H=I++D(P&+&-x z;&N6%N26e>{1b-yVsqNm=r^@12P$gnilY9pSI)mKkKMYOII4URkW!mr}`8&4>a*+wPthe~`ZWLHmZn;ohvC&tnZ z%rgRa!zkw#H;PgD^6|Ju@cH`GWOb-_s>5p~e$xuP;Zzb>nM|Z%k&WoP;3VeQU}os` zbyqsVL4HO$!UUoeV4eE9!0@KVH+kgg%BIG*?Wd7Vjc@VPq`ar`Wkg5g`@GA)rp9;p zi*kmj$ICZ})1A-^!Cfj6Y{#1J;#|#5%nfo<^G*In?kz>dgBI-s_i*U~**t z7K2{_NoHazzZJyyJ?r$j!6!6Bd3~-Sa8q$nbC$Zir(gwJbp4w@Ozq{K`o7($6t|4ZLP{NrVZ!EYfLLJ zrs2fW9%mCg(d$2{k5rm9NI$pUorB@_7-NjjdS?-?Mwa=^F}{b0)Z2aX8DVAEHM*Rg zs6`{O)?X|orTZv+g^^8b?yMSvE*kBWvM`Dfw)a`%V~v zP;^;=BRnfw=XWfbX8lasnON{pY)r52(-;;CVBVUG<;wI-@V`jb*}#9bnfOo4oaTqK z3HSkkCPh`YJuIjEZ1+tIj_2lLp8>ujt z1bx*Ug~@k9*{U6RX!>TXA&USP?Rz; zSk-(aJxnQjm7>{kkyNJ%Qq^MCI~NeoEUHTu0&-3i=0?p03fZGz_VoqGm*K+2f`e3NiTt!=AUlX(suAOx~E zF5 zwFiq&YD(1<-DeK|DuS}Y?f)i^uvF`M)t}4>SJa=pf{1e`Ga?;;oJ1xcliJ6Yoz_t+Ps6$egkS!tPD{meYPOZL9KZnds4^evMYR`RF&Bj3Q{e+4F(N^GmB1|V%cVWLhoRWhA5jIa z#Z-UCsK65>fI3)^*H&rip7A$_{q&Y$E9OtrW_J6C4cTI z`5wMd89PH0a3`EcP&Wc<AnO%ggM7N-H2`?NBnc%&hdZN{d&`e=Si>s zll*nYU*+=xGxiBDHeP~+KR2I~)??G13lQsMC-;nQX1*m$;!-na@k{j!j7CWjUiW12 z+mYTaaW7J&qXYwG#^j45e2KO#CNq+3hVSi#KOh+j8Mq#XDLuwzDN4k>jv4n$o$)dO z#ZYrdyISM-dGAo(!oXj`BD8}CL}^b<|R5$O{yTzQf5BO&S06Fs!X zN6G7aQcyAe8y=Bdg%`!w^As|U9nT~XJEC3Fl$FhtR4p*aXF%LIwcbsi7V&&Me1Wzt zqeD$5nH<>)VbqW$dc<_+0wcqobfTFP*9 zHvH;Ibx^zZwYzx0{YdyHDT!1hWS)m>D$kQc3h1Po!^R1m3h%>G1f( zKT{|j?vYdr1*b%IWgbq!>N#m{BBetyDm*yi$EdGE>1E1m>AELnzReAr<%NjGCC8(3 z-{}c|UruNXiZ=+J)?N_t*;Sj*$@mv5rPVs(3q`Wpqatd|i2p|L#BMSwdCoRT->x~U zQm<{>ja>|J1htsejZZO8;UnbL(BV| zvxrSK`yw8UOSKA4)-{JVd+PDKMLI&gEJO9gPW2b>u0!Ze1M_j)x-~b)?C%#3HFDykAFKA-C2;d@P|Zp7iMRK0#v# z5f_Cw(i+|+l`Tt(6b9xcCY)Q3=;fvBdE!hxB4PT!>-m*kj}&nR=AC6t;!FA9Z<=st z{BHHIM(jM|x7g3S<++;YGch>0^+3$cUIOUX^GuIi9TP(2L(_7CpZ|k#ku{sYmTrIq zJ^aNJeBq&htu^$O4*?12lr0i1kRm%S3IM{6%Q`xH+yr=%nl29WaAl~^Cgg$XZ6| zO_{;@D5)X065)(d=8b>A2PG$(prl!{6qHkaKejCat_`po<4eduf`n^883+kbzg!8J z5V20q#PsEtJ&Idb{78qq;H4tS6&`GCNN%md=+`}gdXzZW#vwV9vD>1{avhQRB2LF= zD&K_{OYSZ%bJg9ru0KZ>JSFS(hfp+G#=alNabi-M(i-mIN#M*#X!y_#|EjnwYh_Fl z2*KG*v(^o?ljtws+DwP)+aGE zB?b!*GRwvYZ|%6EtO#)=o^xQxjj}OT4U>k#9tewYwwi=yi|YAa{M}WS7oK1s4%(12imEbP)nUBo-^ykK?lH`425QU`vOc z;mgks!INqTjDNwJe$Tq*C7HA>61+|I_E|?hphRU+-Dd6I{I{1}Y&*;clZP z1(I8V#Dq#4Or@!e=$LGX+W9ms@;X!;RI2e>;oF#;a0{_+!vWHb=t2HEHpoyAme8CM z#>I2Er?XQg>w0xda(QDj^UQ5h_Dmw)FYUu6!Gm0`x>hB6%EJuTDlxlCWT-OHWyF3# z`#B7-&{tekhY7KB$7WBsgi5%S^=4Ob%;%C-Ax@BIL7WroQ;5@ZRtj;nVP&(^h?AJS z-7yS)`t`!y&p0@;bRPwn&tJj+>g#6iFQ4g4Q-#Es^cbD{Pb7vm?s--k$5QJY)}-h5 zYnLD35^wwZ+IQ6*OxY53r!9hGBo^l6QqG@R!=04$+riQOWA$7uHk$-A<$CCoO}!v! zJg|iKkXaEl*2orB*|?`7Ho1o`H%1N|9f+Sx=+*=Ed^0EK8V@w_P%}7s@HLKhhdI^A z^_41V>iLGcOf_|1B1^8WQg4HdHH-zD=80tFf{ryCc@~u|Q>DT{+7a8oPkf69`DAC1 z)}f4jY6cxwm3zbe{bN-Dxt^7L^3UEkGs5`&Q};iT)~;^v*+ttYnnB((dQQg~nkYKD97TO%oUQJ4!Jg@8I zZ{`giWA!~euvE?Q1wr!(VG(SLM%GI*c$>PlGgfbxJVv(|C90o})ruI9YH+-{C!+w^ zjY*^AaiMzj8i>z>%mOZ!@(k}FG_w#gQ$Jv+ox(?5E0Wu$LMx%jb2c9aKITXIX) zv7G|N<2@@k+m>IVm!uR#ibCdHDEh4QgkrZSJ0BF>xiHd`)3~Pyuo&?Elr?VnhU<=K z4SwpVy=>gVjBnR!4WIKeZha_+^ldah&iFiw6M2l(_ziG)<9;>nr6b`{<2L^2lOtMV z5hNhecBaq2lL<4N=J=&FAld&;_PCt! z<>j5_EK&JvpjsT?n@YWxEG%aC6v-->rpifHF=Hu+|A{1N&!w$JyHS98=sWFEbh*ks z!yS|=hNh~xUe#Oe-f?fLDxc#0q;_BG(<6L3lV3|E-YbbRp{Yhk*^L%`x6v8yA4@(# z45@LZytJiW_V9w9i2LJZB(|p#pGqZmN}_OmLh=|0U%Zu<=zp9@8t^f5<>+SOd^HN& zD)p{Tm0H1X;zmhXl1gc!p2Sp1`H4!I?Y=LUBV+m>0IHM)6ht*6#))Mh>IY@7DtNct8uKDM!nrGrPZGBW{>%u7X_mSyMl!~ zt-B}?LJ>-8hE&$)VK6NAz1LcttxFe$~Wn*c`G)jZ1qFD3d`dFfBJ0-7YG^s6vK ztOw_XaySz6&;YBlb~ zW?A7^fscno|E}b{Ua~4JG3!DaVV_f~Yf9TJuQ9o#ul+5FEF2WO6*&JU0Ij>cGomW?@J4D2|%ZN$VGN0Z;l@~dffC)0{*bn>^fp*m^HliP3y<$fm> zFD3q;1IVsLAxK3h5;a3xRq?M2Qs4uMrWA7-lIW>k+FF$R9MN$E=WQ_zj5~<>*pMdweqY1R>5*u47Q&O_gAa59e9Su3_QdoJ!h(-LAv> zDFhhVdZILFMhdWM)I|o%qOx$!Ap(Qtuc#%KDnlP4*{q`EG{+8wMmwy_sZ(O<5m-v8 z?#U`h`FaqiLPDQVjPebACr>1TeZp1E*e7^d zC3Nw8p3MOl^4B(sXbJbn;6aQc{A1^xhnB6fs{$VX!gyFVbiUrtR~u_9$dEFTh_8ZLD6B?F5?PM2_fJ%De#AOZ zbZj|9daSv(&_ksh%hi%sRRRbcBFWSi9wKg|Ss{>si(Xd4a?bGfRRe3iHCQbakJW)a zk{J-4Trsk;k@fFVJzdH+*Kd-sG*BK)T%ejs%nq8Sh!KOR7Z(p-748)@x{6zCYQTBZAD}FC((&WZWWxC<))a;#CyfAlBKZ+BbF6Fyb zEOb7yo+BS%?!P2G2Ny~DudM$%TbGTO{~(8=w6-IFa}*s#Q&_G>9|C;c_!|A;3gguf z>fSqln5J{7#R#cEOW=sU3OP-Zcx>hWiJs_Pdo|osv_Y|Ss})P9ulktp|BC-Zh9wnS zhRYb<^i_}u$GrFrGE$}rZ7Ab1i@6Ot!c&8>7wj>V0epm6i~dbU263e%?4Km-v@X9w ze6=4<6^HcrMT0mPZB$u>cx81ZV}exi-u%&{$t(deI|~pca8X*?h{}t$r4oksAlpUv z(Tc)1;!mCdu{5p-k7f{pto)~>eoRoUlv49Cd1>=p`N#3Y*tmGKT-5P z3Tsj>ujYzGj|#$vFTOO@7n^pZduG$)4=z$je7W`7Xhxrle0yXtqLnd$EFo&MNo@S0 zFJvmdqr-`x^G=&xQY320P&$|&L_I_H>u_(?U_8l5$LIv1(ZqVg*e`jy>~3mgE3zK` zfnq!4@)+hSGQwJ%-W%;0by~v<)Ib-#!Pt_8Rwq~~l=~u1%ZaHZv#Oi1NIBuGMF>CK zH~KyOd1)hFN-54DRUpR@^pr+9BE95$JfHOB?iGC{Jk=4a0}%o_K4yoLT2E%kQRu@# zHRo}~tTkLn-ikBmcfifoyxdph(2Og|cf1WvhQ}oBLoFB`_sPpc;FR(e2RD&tNS!Mb z8TzfO70;KbwnQ0V-rpzqsYGDZnj(J@nGzZT^`X9`YG5M7p=tD zL=X10D2{$CvP|8$GC2QKu;tTCYkf$#Ok#E#&CICQ@CcbCIFN`mpUdZE^l|Cs(Wui= zxEJf>-3n|ker1gA5PboEFdI>cqpXJ?mR|5KCI|V(JNxNB0FKfPR~Hd}2@#<>kD070 zkY^pMunXi%fdVpL^x$1e4nyk<9gaGVX|u6&o~b;Z`MX>ak?iZ04T*jde61Srz%-EL z1F$OuAk}{37T+zRZqP%xjs$^o%k%u^yb|5)A)n@n{7&MDjF06$s!GR7Rzvv3 zaGDWZrBd6f5BWS#Di2?+>JyWZL{F*DEG?yRuM`){p}zWy#S@{M*1agk~e8CT}-u96@r=co25md&(zJhtd#9v zFMKP$jo%70Fshnrcgr7t=gCe>)or!Fx^`)*rW^F#COSruwmf6Z$DW`#8 zw1m*>LjuL0kQ~s;zrx=6d#HDH*XHZS^ikH2B%?=KkFG3oM25@CU36JM7{OYKQ%>C% zB&8_au{FF@d~3AFXDZ;Q=Ld{WjP?q1WuCwI5K3al{DsFE@u^FPVzXnsRY*jlV_^4G z5tw2r9UF5V1o6v93?eJn<|VSkJ798A z@j7C?QKTRd9$mJxfElS$U^nv;4+!kg@vL+`?+Y@q=%-520f>0%gd+4RvWbk_m4Xz# zyL5ZkN@UY17I?=(>)%Mwtz%a>iJ0xz0%2cP{GZYuC&noZj|_}L#tO4?RD#$Llk!+? zQ_ZFRps7Pzju|Hl@nYSs7r(l=r{8(3@S6k*bVun^vkZ!ihHSn#1bhjl!!I9EPzaE_ z>Bu=y%mNB1Cw_M?B`%KAF24e_W-uP267N@=3N1_0c0wBlw&i(1!QI!w56^`isJqO8@3fr;hW^)^}#Se?~(J zeuSk*tPSIBd+FMNP6vxA3&NR9WXr5$WS5M;&L26^vaKqaZTc{S8ZdmW;t(P1S=I`c z4g8B(e1!u6=Rx+ZVoOto2DD zhq5tN4!drOhdzIY?3aQ?xz=vJa`?^*&7T)aqz=)~4xpOo%gXzwxGNHlfU6>Q^R%L} zS3!AzF-b#tfsN|GL?hN}YE40rsIeZHOVjjZPS9L}LuWQM@W7l@qHUQ}D$`r|7Tk|F z;xV>00av1cw;XvBfoS3a!TX*H;>2LQJQ5wuM|+N zZ@D237$3#u%0?7kSMz&LV_f8#o1~+OIg$$8szW_O=Da0|8`AJf_{Q@kLj6*=weTV7 zhuwE_l8)fHz;?B7Oyk3Qochi6e^np)oApoeV3c`4wEtrN z)9phY_HkkpAy%YcOZ&1aUJ*mmKi;Z3AOO4<{;ALz&?!I@N?U@>(_<(V7y)fah3SIG zDLo%D2q>arOb$7cSRaErDKJ$90+A{&5OuAZSX9ri;6Gp~s5mm)%M?#0-4co@Wn1tv zj`ep<2^o9!n?mLtzEbNHhvw86)v&RLdztH>r!L)q0X`niMu1;0m?54wdkCO?B?T#h zN&#egHBkDOW3F!|RSn-xdFU@47GF&D3hkffuT&ylU95#U>Cr=sgE33`jDflDX9ZAi z3013XifA*aN6s^=yxciTJm2sD zVg;yx01k9&IVm3yfmUiiv3^Q%L{l@x1lA_tY(~}{Q?A>JluZB?3tMuh4w#g;@0RTI?GNEIvb4(B3o@))1L7<> zv&rSs!*JE|*jsCqAf}aOqhL0cS6X9;T)YdW%6r3pzT>pMRE~ri&yrRLpQ)r$X{JDF z6X@MLQK(DWPFF>&k8#0AAuaH=pns1FvktaO_BomT#`j`3!#dyKQcJ-*Q2aK319Ip3 z^i@fkt|#buZ-AcO{0vpD#1WNWD?1rKK$_}g4Fz@c1zG$8SUnq`u;P>W1@lXMsc*t5 zj)L1LA|D@emitCo&yMBPOh@meGuA7-L{Id`?3UxL)ZDlmM#L5fypqi|P+#eO^jnX% zb~7JX-RD(wG_Gfi|q|^ zvbD7cVA1B@*^@!%DSFr&ibcE?=8}2hM*#b3g4$Vkl-STpWYrLakp&epm%C3?m_^o~ zT4=VoLyKnfk!jAOIq@^Jy_D#{&_oVJfh;{X)z?L=w*WWVE?>*x%nGA)i2#MKgt5lH z!j|p>D6K8>tN*AIWCtPgt$<}JY$~?>2X-m%r74y z*3v@s-Z|@*RtpT_ad?x;XI$U_daGS7{u)YbYHa?U8h}ReTzuyA2Ky7;MfXdWRG4?q zgZt5OCfOA<0$rq`TNpUO^850U_`m6;-;4-psWiGPT0U`C#BRnJbEnqmroPe5L^IRY ze4~^I%h0MEBp05v_;8WzYl$WMDe|p+{Bt_1dixSkQdv){tk>CDWuJ)4AxpKd-gZmY z^C7i%odfKQO_EWFlFF#w{va6(bd%`QJb~=zV|UR^OgLF&YyU}JU=b{hUz{$d-hNDO z&hzQC1CnD3Y4!xrr*TQ%Y6q%LExyD~7E(L5G;dJ~A@8HKo>}UFp%`20sW}WTT)GM= z2ocq^wLjuxg}Gj!0_6tzAnt=!#~*?KoK1DDj{l2>&!T#G9DDvkA!TFyO}Vh_bqLZ> zUl&wQcFLwuO$D+sX8G6U`n1OPPm0~y>*1Vu2JNX2;Un=m3>TG3M-{R7ghHmb{*W`= z+pHf>=b(92ItGlRq2I+K1MEO3%l7mF86{mwGp(GfgiP0g^N3A$Sx;P(Qi{UU;w}V^ z?xWyk+GkCAlU*ciiy#H}Js=$VjIjon80NYTC zsxo3R^pxXI@h834j*EtciTA`!S9bJ@#O74&a3MTWw13Z~))v}d~ z7FF|Cq(Sbqh6E2ngMLLJkmBQl@=hauAJ0p85=B8a_aUiEl%uo`#kZBTq@e9n3zYE$au*apr9;3hx59x5RoMe-LYb$4n0X+LvkcHKh z<%?fMiXN?-Ei26ZTs5xS8t$d4_~#T+^?fcaB4WLe)o_qRwHl-gu=HFFG`zwi!`x5m zZ+e`UfKhi#{3{j}y}w0ViZ;i`QKK5lO?Kv9eq-e=@lNuX<+mh6CWW^|KApLHXsop} zUSW^-4Bmhb#*w8Y!#r&X%Bii^pT-E92A0PgsY(sRlK4I*T2(lPLJG^SkeY4oR{?(^ z?{e^v9`Bh>kDGo+8Q9SH{pqqNsE;C6y1y3hXF9o;7r(K@6W4gap_4*f{dsmO6qZQR zpZCh+MLa5MqBVM%iufb)&hE8#JP$0`8*e*j!2)r(KLh5H0XxXlppdj)7996Lrf6#o z!xawB-Q&wh1aRSg14Uz9K5b*O3`kv(8s9p;O4#ZMzcN7{9DYB*J7 z`50~?+G-$1ts1OGwz33@!NBkl+>venVH1Ta(ov+%DGhwH5P@g5q)_T@7#y&~AAgmHXF z^%ZMHwxCXZUZxIe&{rEt>BW605+-o($gbJ} zJaP@JKAl*cC*NIZFTHQDtI|s@=b(q5zQ9SwVco~ET{g}MM3(p1PA=Jz)-~|W9ME$m z2qCK(jbXHZXSg5W;+X`r=XN0~=m~E=q0@LXdaCz!sZ1Mh!Mt~OGLu=>)F*}09vA-2 z5NJv=TrRADKDIo!c3k9Y9pA&F4?HI05-C*Ut*l05|T|Dn770?5aL$+X5u~ClWi63~a+mP(Q*uD}l?i#~L5DZ!kjc4Cs z-MFi$uv0h6N6Ff`OCdvTftblR(4?G5wUOi@KCFYX_7Mk;9VPe z6eH4tPJw5-;OcC?>Dt_KpY_40lm}xn&uz0Njbt?NML(O#lmsbJj!$znX1(=}@_c%L zy@?#q#GR6uujkMVfP-t|&GZ%Ui(!2o22zc;$b`;8ei3zlJ8iNxkcPOQ!)}!N;CAw@ zKXigDX1*LZ8fBbzM0LaNEYk7brK+^nK&4QY z2M?-7=*WBFTam(6a~g9-P$p1*TjN2=l+qEradtsqTpY@YvH{EkjQb z22UF3o;!r4OauTT+zW1bUNeu+D`fNp$-{%Q7u*dKfWFdBZPT@}uqsNh+LP{rXA*Db=%%PKer2Ol*3g!M89 zd_Z=o2XFFH)d!$pgStVn{z;j1fD3&pGWq{Zw%#Po%%s?VQ_ReMjK9h=W$v-02xQI= znM1Hj@JLNx7@244QkZJpV^^r8t5m358DH}2A&$w`Qe;ITbLb7cNYQK^kISBLk4n?$ zOMGG7aZWk>gHAI}3}p(MMcWrqWrf;`WR;7=w%V9>AM_^h)HuNat?^TStSw*%GKx*9 zy9!ZUMU!kgGMebY^TC>M2xG~|S%~=0F7=xm+nRX};CuiL)4-;#=w^{dIu(6L^jL4t z+>hAc5o5=0J&@Ao)qj9nr%U`)LK(B#W0qzabM7$$+r?QZSOtq0c*@#APlZR|ni2Qh z<*nwlr;NbkDQ;oSDxeh!#bW{s)yVdBo`RNWw#XyC15PfPmHuJM&#Uwp273;bTfeh= zT(3C9iPD@|m1mAG!tz*am__a8_!4{oY@&$62;5_iF9p!}O=MiK-kft^^ur8ePLtLs zf-58N6e-UNvw**DA|_0`M@;ch1r!~eZtIoHAsErRO^&dpdR|&BnhAHgX`}8wGxAjQ zQ&)_rtaTg1u9*LWp0OoFTS<;9-N?pt?@4NfbkfC7(XReBg!oLWi2l1v@1S9}z-SA1 zM$tK?-J&&#pDVu^*p3o{vqSIhGTMy}t}y&q|E)Htk#DpG!#SDeiJK6czs;8M~%bi_Ou4lU=_^#G4(0@uzR#ev7QwIi4Wb-MW-2S;<-eP(4- z^pHpN^L{Ik{KpxQlcZN-iW5p4Y-wC7qnN@LPa0csgViPHt<%&3O?tAMJRqyuBEN&N zOaPNt(a}Tt!enz#nW~TVAyfH?z!A9TIamjSQ(q@bf*2QYg@J8{C47+t%=xOibob7Uc zAwtEMVm&1;G!RFrX|r3?GtPm3eyg@^bVaOWjke9XpyjkSx~s4YWB%fvwAho$EPj_3 z_cM_hA-te<(&D&-GgOOp>*ENTQ*kaq4L#!wYLq%O+u!m3f)pA56Dg$Lt8(q0MApYe zLSy?)mi}l8Ywh0bVj}F`1PEjlTfPcsv9b;@H7ADs17?mL@49#(;19%MdGP_jNBOx0 z7t1Fj@5Jw+X2}n{t6U-DrP0lT%2Ix}kSa<*sxpX+^a=<&qq!J`t7@m_MAwN@LtA+d_d@z)^G%PVV({Meo?FxZ8dN9y)_u8%F!&_ z;0Xr2Me_4rUCJ8X&cc}UlyyiLrMi1ESi#%vK#2jE&z!)^wbut4J_<|xvcTh%fv%1t zD*HZW1dW*H*tk(>xCN2OJJOCPOR%yK*Xbt7VWFVAE@*8SdncimajgceAi& zgx092_xu#M)qW8FJs8YnG)Nbe=%E2s1s3NEt@gwCFuN*0+tQ^&Q=)qjz;%c%C8i}oZ@d@hYt{>N!FX3_Y~^OCZDu8AC_O8p z2Tx!fQiTC-(k`px5=2%a17dLSPAuVrj|ilD zv@Ls??#lJuM+H%_eL<ltm2gv_f%rD~(L&OZbcTI<%YJ z6K27+;bdQ%vzx6nau~>Z3E^_Y57Kor@HnJQ3BqEotE27WvHSIw)0y~w)$V%toK`CS z->t}aeyQE%AopHrWr22>QTd{kcY?^@MVy7s$iJk{9RlJ4?IeEE5942~uvdHogTf%x zgG{CQ{Hf;rGsFGcy9Ybs;;#{{Mt7^yCWFsp3T1l@+!sBVVFa2G%E=(vq&U8mc@=}N zuh1xy1)?xNKAt-4?KVq>Iz8b#WX$3VIREQY)%CKjbbdY)2;A*ZE0J~PS@V#2!&A)V zWI0HG-cb+5=kPiXnZ@-h<+`62f%Z{pGNcVZC_)Iyu?hjRWZEu8&ds?@a>}t;Z~4fp z_u6Us-7+sb^WkVkuOjUo5pe-70QISrTq@h@^QgVzc2+JftZG(+A{86xgfMBb(tIT} z=}NMixmZL+z_aQUtE4`HQp2!l1No#?Yt>AX)F3z-?Ru5j@pb@F~f%xzF8k1QLMSrQZSzp%8FlZee@ zOR0Jsfv2zWpJ&`0wu*Pqe5jchQSvs+JlvUjkOn}kcSTR+5MNLC?27ckw*dQQ4Hs#U za6ARjxqNQCJi#lZYR<;NIQY$F*pZ@UTKs8Puep-brAvjdfvMT4 zZ6UvS`#i39cXQEa4bO+{sX5Ua925q}_|C=RPBKX4fd(WOL6`kSurIo7o-19b0%T`ijJ{wTY#hG0A^3kvF zs0QZvHH-#jt;RpfiAZaBgIc4@f&^8J@8L0IP8@~*AEmGjkqlrhjU$HH{TD6>6u-N8 zz@(V#p@6oddLVyFF<-gFZF?s7?BY^pNuiuCirq2DKYI zE1Yi<>pCE7t_ph~Y{2fyOk`<0$}=mXyIiE+lKwo^Xq5~kXC$&EF(Z{@Aun|fbTO)p z6BV(#3{mruqzsboAi=f3AW(p~1p|5cn1xjF4iZRTnz6v}QfnUwni`n=L=F?X5XF2V zVu6DTj4HNTG{{91i7R^Kk=hz{S-SPSV6p>|Aq)o|T`(9wDBAx8mGiC2+fU_AFvBHN zCz!KKg5ynpN%eSUyd)IRwtV1s9>CgPH`#I(QFIru@@ojx{R|Q5)Q(aX^E9Ou273j+PJ}zd_oGV=MK|F|%)f>D5A}0a^ z6>dT)tOtw3q-*0_L)^3FS2)|_+%VAU4*!OQ3;c#_vbHt6;U|8>|3(lm-ql)pw-J6L z#C#Wb*1i*~O74&)$1AZEVq^LRH9z5R4`nnqV^J_#nFV4UdJMKBR?<&FRpI=atjxhE zEzl_{^!aS~@>SA`LdAE;OvI&5Xi^ZKfK3e@k>RrW1k9;VJBa5z%5P4>*zgjuEX%8y zzb_PXkH1;2o!`d#B)1ALv^`1ENFoE|>>FKsG1sd*_dP4?LXV!T_G^<~QsY3hbH5gR zsVp}2dZ)I9+~{Bs_1qKA=zdps?q@Rg2aJE|#rwru&wnoAnMosNyoyT@VoXQrAPIBx zuaJ|mO@@5K8MSM*##?2~lW4e3B7R2)61*RrDDJY4JfX}xh&q)S_7%lN(KbY2Oau2x zg}Xb-g20F7-aIPKDlVIctVWx_k6BaA5E}cwe58;!=alL~zGK_2HNMOi>}TdY{wug9 zO;kY>DvWjrSynJsvyk#Zqvgv-6j38=Ml9@h_zRC&kG~-&2HgpGUEMXg#uV}Vmy3dX zFjltE*e9ZGZbhA_DJW&{QD6jwE;AA!zo@l;h2x9d3QVWagF&x?NTP>>&VAwgTIeIzk-)13-fa0IQz8W{#&lw) zM6H4uT}{P_&-8s?NI<4L*e{iiwsEB8aEA37_1PNU6R}(PLY#`bB12Tml8e?=)7|Kf z(E8+u;5X=M;xZxm5jOo}qnoM557sX*LyZ`2jqxoovL?_X5j8%;iJ7-X=~iDeKy<6S zf=)IS^rv||XLk*n&xo`y{=MIxPU6S$nccjIO6cmX>>TC>d0qAM;VZ9mI98;0JN7r^ zN!(s^tmP^|{p(n(oPF?YjsF7`m?Qp-%uICB5atY}Qzge$~(iWdCW#*Ql+f;P{60V7$$E6V43FcPQT&Mv(4$LAGM*7?#8wV2DtkV&Z!=C#-KBPf>RwND)6oUZK zW?8kesuGl;G+Z+afHmkos2;=e)hm_{*7Rm-5GM!4flb5I`>Ar*8Ex-o12$x{k;@3iO9{M#u2t=Fax zFjPCO5V2I_W4_!jSl@-*`xc{<6% z|1;^$;l&)nW)r)GLljX|bjDt?(|bboN~CiM%QE8t(=Q`~4%Xcs3Ao~&re?1>5vqu7 zeV-3Z4&7@~-L~RzkfeWQr*qrIK-2>!Uy(fSbFP)Jdj8LDv(;mb}d#1LACBZ~l z5=|o->`J-;6`tt6z7c)Hnkd2$NmFN$8l#A5miV%hc)9`7?aH zUn}@Dz%8F$eg^6?)gNmGU(n6!f0OnZ*;_wy>RQ1^x;E{gu1)<+yZJM|=KR&+5i%5Q zmS|eu$lrj>t*sG}IT2Cc-2G>#zOLd70)HitqsI%WBb0~J_cBW8pfq7jo zs(k$)R`Vv$l=J?gnQvg}U-_Y0&?KjlIi*>_V zLQ52sfTPV8#GYG8xoSpcZVQ2r7hNq^rS1#)N%a&K#F40?r}DtR(nML1TI#Qt{~31y zT4rf+ZbgThnpC>X2L}Z(YjIDq$()?2r2cwED7dP$i7CAb&Px;Fv!rz{Lo*ZCu|Pgk zHP3AAKBmpdE}=Ut#Q~{bw+nFjMx?coyV-Y^L0*rEE_8%z+tR9Wv+vDttnfb6u0A-s z>o)0y9jwca(kkhYoy_$ZBJLG~LD~h7`_k%~Og-6wz-d?qHM`#pDID3I=w(OS;$E7n zvD&Qi2h4?4%#>_2# z_4km6W2~pJ)lRN|L3%(?=EfrVkT4KA%3L@KT@Lr_@~CsAJBPNl81*ovi9@8wrpwO&^gNm!Cd zsp5vXR0A%YaX_Ldp$eJ*_c`xOKyUB8|Ih#a{(LlZ-m^Yud(Ly7^DG!f@PRftq9xI6 z3GtU2=b*G)9bM>km@VUo!BX0KIesDCES;sgJ{YnVFRRWB7Qe1=&4lOYC#sfJEDxUt z`Mb4Z*;(i(zUpj`?6a!Y`pYUp3-G8>5fV^^;a<;CWUZ8A{jbil8I56)FxJ+&vqa9v zSlL!x-%({AuC9MOU_B!cK{iNk%=@qL_q>JVwEnc!v>niSh>51I8JkhZ*WC;lfv+H1 zwdA_f`29u^ti)Ju$hfGhy6tcQ`lwaTuTw)q-s_pg9Rc&vIx;a0EcUe{x9btW@Sar> z9J&1t7lMxgI0unskSgM&1Q|2f6ppeMDP;WoW5QNt-CCcab?U2QwWa1WMIV8%-b2X<3`hfg->!?LtFX&dDk^B05VgwPp-){I70rOv!u*C4}Z=^8oX2hJNt z0XFqo^`N1T6}=LKl6gpMP)~zXMw8OiGA?Yo;hM(ors2tt5aQwFb66Vgk=<5g8O)@T z_l+mIRU%7lt?W_NR7vACjmvdeK$42$yCEb{U;X(Pw2&IR@Kl^T92Y1%xWps+sgcG+ zzvVGmaH*je6ai|!up`+S7^%dCZ#{$_FI?iY_km!~dOfj>s5N5^Yhm#PR2MS0kFIKr z9vZr|C}^z~g3)Y|AvB&yS({ibBoA+yQ5J>-6NPDLa_z?B2t>jog?ei2&_#g)9(JR{ z`1x7Do~o72(n!3XZ%ejT?6%%e{VO;zY&h*;w226B$RTvMp$HqNF z;-}R%rcjrrHh_$bPjoG#$>3Wi!?`ct&d^k~m;p-RRVS#OreD znoTh}PfYU88STh0Ume+A*1Mp%U3l6=(5#% zjyv>v<69s{se?eOo2jujTAn5jc`4(bH3Z6PRv68{k(k9Rvf$xuC0xOg+i>JshzW&VT-al>)e~M@rsZgd z=!agBtB%fuoRjm<)U@3x_rVV5dqk99I3!UUhZ;p=|0ogWGd?PPUD-G^D6XJdJj7g( z@;N6D`y2wq77;5(_f4%4!*Qo0FegmRcGe_T5!hMs_2`@>XD3R2$9k8xm z5wNa@h8XpvtQu+3_+lRCyXARObj z^qmqia|fj4kKcjSeVsfSN++LAQF}AH1?rJRUG=oSyb+rD6*Q8*+YVSS^G{Un)2%{B zCyw`bH0ux_LMsu!laO55+8h2o{s)PzVh9(}=&SG@jmzIBS6w%enuO~HkeQuEQEzm; z%tD4y)E)7`JoF=?P-UFCb6$VMH}Dr%)RV{-K@Jzx@0b6#Ak-7Tw1r{l*B#CFCWdg^ zLc%WMjXwzEiTmtAhtd2Cf&sP-wAVGIuz=Rf)^LP}1h|7+`lF;ZWIdzLMz$5o@m$5N zisCdmVqtP4JpfTZh(4{;Wo!h*`vk=Mg2}eB zR~y>?KZ9u8Ew)-xN6vm0j9|Q=Q%|hCTHFk}Nq8hQg;2nZ6_6e>58ysMQy=+#Yo+;8 zmdWy%kf{M!e97E5_XMq2sZ>`Fjga#Kv0}~%h7D_pKK0O(uZ{MDj>y>oYqgM@gqiEhd-KdMLvwbBjX}i<`!$clta{lg64V!LcJh1 zu>k)0j~KyGhY8$}!B!r%*>B_>k}sG3l2AVhZL2c!+Wf}xho%@sfd^=IX8RP@=>yf# zO`hmqq&_zE%tJIC`L{&9-HzSDv*{L|y}@}*3(uz7<1Ocg%>UHFyI!O2NV<`CX(U~H zpiB=yCdxi^<>kx$FviE(CDq0#e1@4O@>P zZY9J2JTEc`$IQzQcSfh|j91wiuQ>YVMT+QokqKd5qzor=$XYE;${2&;d@@UKO);J= zEMS)EWMV+MdGF{X`8b+H#t)b!Ch_=pn5FJ2qi(ysQDl~+5t*fLW#9acS^8hkj&Mo- zFV4>Q5Azg4ivo500inm`L|;Kb#$${5x{yXOO^6E0Vf5ru03In5**Ja!Cmz$a4;ezz# zz-a!44yW#W*7M8w;1(X~udU5TlUWIm7OIIR-3^(ssko&54#A1oHO|yY%wAtj5h~Ev z@L=1=8E62=bywCr)%y5hnLAk9PB4Z;f9CS3NtQZ4dmvYc7q6?}z+}iRr1@7L(pw}~ z$9P>nJD$I}E+1S2+bod)X-F+Rnbi6DlUtFKCPOo0a-Fu1v&h|4D6pjZA2OcU8FH=` zumVoa$P0|DX*62ab_+Xhlx827Km7)%p38i!S4}#KHbBnvZ;uOuj4+j`0#)<@`WwU+kS|`#&ksG@q(_k4)Hf?v%G! zqZvkpW5V2Gty}LmR&U13E}Dvd&*sPof@rE(JY#c3%MRAR9kRx4$IGiVzZ4rhk-@h9 z{kW~nWoI(}nVz4!ijw(DLL%z5FMOlu$`y!oo|iKunSUYiXllSQ@Vf8B{s|8N$UPv9 zgQUvh&rxY1J5qDx9HVnC+#ymINM9j11shiDwAm%>k4|}OkR4ftMXF?YEV?{F(M2q@ zt13XRXPUGa@gQYVAcDJ9#X2Sg3ab~{kS+#sr<4(yac#)u4W@3ao)K2>C`xGl{X+;M{p+9u&mld=&(DPUuKuH zdNv_@<_K4bdB_ZSftYs2qkFE7;ynxWjYGf{%xRfP^QV%IQYpG0!(5&Nx_8?0hv$65Fu zR0EPD{scs5{-n$xnct~u+Qxvk%+wpFiTzUg{vGHO zXnrHz9u!^ZquotQ2ibLf)Gm{q$X9Q#A^?DOUiCNPQf;RNAoZqh+AHW(1*nf21fWq` zWL91DAu-k|S->Fsqd!l8L+wndcHa-@t4a!M(VXMe7=pHW>uYrL@f-+@j!HpdSnwiI z_Ka-seLkvG*ti%-=%jo0EW@^TSi=Bg8l0^aj=3~Ohl{o7SOi2KbikHIY@ywN6H`_HBDE9 z94VT_R5%Jpc7ReL3S#xx-1#h1y?&71)=w)&TC;*@v7kAoGr7^6&NnsQPx1JV8Acnu z*u3q#ia|6n0oCr*@5j=qhnMn=z-LM*=k{d2gR&^@wl2Beq|y3A>ZS* z2MW>)UhJ%cU{TV$^iCPBu`h*(vs6Uh>3rm!f@N3NV(QcUocT|DF8i!s(3~8^SCZ-e zB{|h#DFtAoZLy}KTBRxEvQAk}Ig!38D7&j5G6*ao?N)kA zl2<0XFpi)2*e-OgE_CIli-VT?a$Te~d}`Ukf=C{ZW%pMMp|!lDt%*^#f7k_kH|o|l zX?tX%-Krg&;g{SQKCaq4%rO?3<$q};fN9-QtZud(yu+h@9hIJJk&dgIig2h{iQ@mku)EqkRi@{Z)1>-X`Tf+XUITfkuD4mi*4zTb?p_*A zeWDQS6(e>s6w=L^w23yHNWiaaV=c1w(?>DjUKwCuL%$H%?PHnq)SX8SA~na#y*OI_48x+h&8TYNN+45Dn@5s)j4?NDl?o0uh(b4gucmq%2s)*Cc`uxaHfpl{<^`MW1G z@Dnon_U@_ac4R}9pk=y!>G-9qO(&77ccno3l zKBmRpWn7BVzP!ap9O?k80j1_)F`rj1E0?Fh^Y!_7{rz1SR;l!pR(%bNG z(KAAZ^-hTAV4RSn32hW2P9~xvE@CbOO7-=QK%H&`T?Dc$m=as*NcJWt)E3Mi82srQ zwV8mIS-UWCD(M-dpGrEW;3m`#nSWYv?i;ni%oUBgzTxrT@JlWy;$a^87Z-tBa`#GZ z&-{I~R4dv-pUmBtA8T>!_&kZWf8rK#F*G!KWKj6b=#h-bL^{8naapEL!%kw%0J?Og_Zk#IZxQcs)xtVs2W_bx$uQxy(2!6&M zE(3$lt7!@FbaWLTsf~Bcbz}64wB%N&z9!pU+dSBGvARlh+JNsw%=PMt8nB{^3co+; zX+?i%oHtb`E$eBQVh~Mh1%V8fxk;^IZh0!AAjedthW|+0LLbrSrfe^N*{-3Oj;5xH9v{a!w3652Aa}BK4HK z5puR1BH-NF6LFck?!;KTl8{zW(AoMj!Mi8(geq4=6EojnwZyiG$RK#jb}n$k12eY- z%)fM#O?Of~^LHj@XPOvID}`xSR?|gXUR1%N*wC59caL<>JmUhlO$@vC%J-XqDzy9(Io zvoP;46tczkX)I|6U3_UO1HKdKxuOa`Y}1`^v{nZVXSZ?ZH){O0B58DWOy8^o&_f=mWdmJW~MnE zBk*EMty$iL08wmRW4sdO2So3JnVI0{1CIop^?ClbeM1Aw=5obfJks;V+=_nw~(s=p4m1eqmiB%`D=Nc9w9(4d&m(vEdf6~6+S`F$jQ>-dC##N=x}_wWVZ1F zwWvdLH9in)fe~-t0#TJ@Ph2O2DPCT*#)e!uPO&EE0D|ATz%#NfdS{XI#5c^&o;RYq zT_d;S#KZcPjj8Z?ZB4ElJ^9k$D#2(Z^dY8x2pd+9#F#t7@-9rZW6XyibIRe6GydBb zQ>Ppn1?J%wc-Uuy_h_T{2ObkEFP|NfvsHKjw(BFSQMMvvMX_1M4Ca|Q(n5ypWPD_G zNdodMS;6QXxT^3BbU1tt((xmW4BAdoF_OwkGOJuneMeP}oEoN31qZ{6Fflve9@&vn zV32lQn@tuM9HYe4gKZgM`O1*5vV(1nctBpaD`&pDaa%>g)40nM>DRc;M@d~NdGd+V zC7e1?HVE)eq9`p(PfFvEELdkTQ8hmBOhIdQl_vp}w@0Bfu8#=#m$hE2 zzllrW3x-H}3Ys-8>w*Ha#%oImZ0nNJ=x$$ht0#Lq4a$x76kw7m(?cX1M))$dMQK7Zsp_fI<}+#IOQLJ5 zodiNty_I5fmWE(Az^d(4-+p|AXW3TH8EswU5r77{q3ulo1G%&_Nt{P*lK^(z!5uxS z2RY1=L}1v*CI1Mf7U>QFC}l_?e6|$qeZ>*34#n0MP>~Rlx9<_k^hH^a@EzHm&lStl zE$D0F4f>?ygKGq9;fwxS4}4cp5h1xN-wKJCTj#-GUiVxd#0 zO{PhJsNK!=x~Uz&MKQF`-)PE9p*}Iu$jniH`Wie>0DzgD@a^e+hRGDh&fF}vpfHU| zb89`%L-C@FIb~Igt~vt}FGo?ad}4LpH*X7&%>gVo*v`5jH~xt)*sJxDGCXC$vQtr+r3o zwKNa;FQrW;-qAY!;&S*{s~tV)`qictXYM@#6A_1 z-HJN*8CW@hm(%u@n0c5tNGsh)u-aI6coMp^&^%pm4|@*c7f;=~Nlz|BoEUYGEAs(O zJknZ@%Ap-MUm#O;jBqNa@^|BwPVeFP3z483X7&2T!+18NKn zX~1Mc@#hNbGVPe6jz)p>T5FoC<&}jAYr4laz+)TrTKb-OTb_k`8#Cy#f;pzwn$Am- z7e6Fhn|2rSdZZsJOSa+$((q0z<2fIN`K2f6YP%BD5Q6NVi{ZRigVo=m5*{cP)~Ts8^~9Z%u1_Xga~VOR9(6r0 zu^>^YFg!55wXKTcM4>9?^pj|Nujbh!kI4a#`uxwb;R)%wE>@4H_Hcem@s)QiVeqSs zRH&A+-J2_I&E!Zp>1tr`kC?so3ge6qi%rundCID@qFLfMgvvZD_@?8k9^Nf z4W43t3k2*^0T(AM_=({b3zFdSB;IJ`Q1|1GMjFCy-wGkIY!^0iI`p})8KaRc>0c9z zx(g-cjwOCgBXDZyQ(kTaPL5Pk1Wws8H%J$*?8qA_8PkfnJUoP;M^2C!svy?xXjFc5GtynP?x)bNmT;vT z`J|uU{VBcp(+q4G{==G##|)i1h2EtGzf$1S9&W(ZTBsb$F~F_e;JhSJ@(3>DEE}+~ z)sD%ekzdn@J(zIHwLc(P_BO+szZjq4@1=z<^#oWT)!Iy(i7kTZhL<${lFvAE(*nud zC?LQOH_q&wC*RAYef_;%f3J|%ZT5R3Az&EX2LmAJwJp?!Pfesr>UQ4(&z&WPBNX!U z$m?O1Y~t{-o?pRe$x}$muU26)fB2YTjBr}40J2VaG0FT*qvfIRj={V_tB0Y^q}mgx zHo?P8AT46BTehw)pd}5G`73p)gq`USp5KCQKrG+2%&u%A~|Bq3+mu`BQ zc&ZOx{jk3`{ji_v;lF;|59taPZeUUtuT8DKRDaatLUpBj5gwo}XIky653gHFME*Ih zWTz!@Xm(IN5Qm0Os&mt|TtTLrj?I*-0vmLeyrWsWy|CF(((?u1S8q7c!J$niE?T%-|4sNp9-M--W5rFSqaku3_8PnyJ>eL^-RAwY-pAex~ni5Z>CBF($%_W^*FQO zBWF?LpI#QdiX%xpn^^7#N3y!Dg2VvH_zOE@`mNq*<`oaDx(}IW=ru=puojSjjVm9= z#RrnQf#(VCU$h3#8Z!+nCioPvOc~*DrJBY!!Avbc#eRMMUHKRKY(dejX{B)_^yz~y3#r;HQhFQ5#eFbeR4PAWnZ9(4BKkDdv zU{G@q#Mfr2juxmlO2Ft z&9ri$8o7T6&v1Vm(F5Ivmw-OF#Zd>bIjfZYj2Be<9*>f zUl>F&#_zymR?7-q`KXxghAkLm8xNleA3{As)v%C7M2II`pW6Ck0coatq9op{+fAhv zSuKrJWmb-{T9)ZRv8AthX5~1QeGF(wz)aN8q$JV8L)9lR*0}Ke=JbDg;Sn^{5s@6V z9_awmG|@XzM|wyTaa3E_yjgJy1mN9vW5FW4c=6arw6jB5NeY7=`W@>(MY zs=hgYj2ZdV&6#I}$VF-poP`v9C%m}u4N#;I6W?`Lg?pVBiaSmYEr_tOu7_RH;>KkAj=Pb!L4_^>q>T?}QY z9pa^PO2r-;NW3n@#rYyoh2fYv9^08?4I({rguU|5w|S;y{C-yhaYyfJq$u&K?-p0Ixx}($T zxC7o*tnRMURUtI+&?9i{SA7?|j)Agc@21@olfzl@yGNtD#_r>~w7W51{Sj)&Pcw zhKori^9_G;>q6L%i*_8M?a9fAJ7jK5>@o9q(?cY*Fbj#eP1*Kv?#PYW0T(8?#cb$(8;siTgrs7pbd(hJ3$%dbxZD{B?mq#PU2 zy`&{RkFJ;3GDo;rt+>kJ7~LXY(L>n{K5O+Vf@ztDBreFxHii3d@cxME|4Pv-!7(XX zIR5(Tqk=~9v4H5myvFR1Q?}atyS(on=AgBOE=yJO6O4_F**CN+uevUI?b4^Aey=p+ z=6k4qLf zzAO5z3mGyDpkW7X_-r0y#t5xb8y8O)8gQ_iMuYc4w5VKjd`khVY02xNb3u3kfW`6bm;ri8P~FPU=AxJXXZ`d5jA z>0T8cQ9k9OOKOak6QSy?l@i_btzYuy=-*1CCCMOnv^-A=O*?e<$RMj_D-lMgsegm9 zmY4X1VOjFN$PIS1tm0E(M#>8T`W1Wyt!E@sUhWp(V}pN~l6q}@nb^pMAB z`G~}(_0l&1P+DvyEG^2fr5h}-yr`xI88ard;neb3^UoOD%2`h@|bc^^oueD=*@ zU--KCwNzC;>)PXvOH8z&Me zxK?6;%kEc(FPWX}3~SHwnUZf8H=x=0qNh=^&&Ze!jWYy! zD3^F%HJ+;)6m8AYFS{GdWx|)}lCQK=a0eT8#3n<$KPX`^ho6bt6Xgv{Wqv?oeUAxg<=6QU*FYTW44Qh=ASgn zQW$Ksj0I-g`jHjLp*Lo?b$S33Th6on=9EDoT)m!Iwk+2bR7S;mz8GJC#_{Vv|!WoKB^+l{d@%h z-E87V<@0ZC2!~HBzwn|9tM~~w+&Vuz*#FWPa>Q3`V_%yb@`MKF5%YZnS8geBQ6kXzBFVAPVpm<5KR?6^eKbFZ@(5VdA zH;jM0k?JkI=VEmpd!xt=E0Z^okf}o1T}E>}`#%p$@7=P+WarABiJWW?kZ(;hr5LiIV`sHUttUaemsB$>A-PeM*1glW4U%^C!M)^Cv#2Muf`Nw~`%y$25#> zj`9nthjZ|ciO;4KL*#RWeX??Mtd(z(&)90dfo9OgKv`GV9V+XZkNeZjA?L?bCt{(t zGD;tIt%GjOWIe~+Icw#Pyu|B7$N`%?5niTkw0(aYr}}`HjJ$gFxAqy$f@fp&sBr@D zr7W|M`D81TAiO}fT(Xn>Ae%|fW^9-&@nlBw!N}NxkO=HDA(!E03+mPR>NF7#^$r}J z$;whK~@LjVL_)t>Kdx7W^cTAL_F`SoZ1ye78=)4eFGlD(hyC*2uKQ$>MFS zUjIwXsw4ia1g)%qHKIO$n1e&=G|PQ8A?kLsz7oh}9L{)NE5(%q2+|9{O)t3}9IFd%op)X2BJ-|jwx-IvdFt@t%NHKP;*_(dy8f-; z$Tra9{Qjs+ON@WyW;9}6wh!4JUOJqe7-MOayynybb-_=>Zl*rP{7o;5d3FC~)vV8{ z7%p+rGLdp`KB?-XhmGcLlI`=4D9*oqBE*4f550k_GpFiuwvftSsMle$RydOjPvG*}<5>;p>^0;8@1-_2q|L+08}Y75N$i_FX78YI$ue&n?T=1)pl7}hgF zzJfTaqwT)6&d86dtp^KR1ppWci2TA9Q;|h%mC9>~UUiHpTTucj?JK((ORPQNv= zQ2iN|Mg;N(#Y;gj)z(Xe(zskC2Z%C{`scM6p+8>YWq>3;TgMxq4=Gk@zEsOb zZtm7!1XIB*J=1wUmqU)YUrJ${b{FaOrHFG3e2DzKKoQ_XzL1E!5 zZDcv;F1a#F*Zs*IM3N^~cb%OA1dPF^WCxmWmd$U_8h13|IT5a9y1*Q}Yz*m9& zC0G|OI*!#Pvy9nMoLPfd-tsC3!r0jphc0zjC$}W_uj3SA2FCZ$ciA83wjGhj`H;Rh z5WgoCKh%yNm(IU46`y6t4_VjWuBS5m!5H&T!bpj4=K(-=ET!qma8 z)M{(VN*@OBWE?Om&UMMApi~u&C8zn2dtw(%RmbB=m`Q~nc?gU8Rb6tSKAoY7UnS`E zB@eBOh{>7qo6=;F{!FlBRqas+elBNGt0?aBK6Z=)BjHRT1qnG`#ASVmFa^-V;3-aJ z>;_En9AQ5KwX|~CAAe#xN8wq&+IETkfFc{_4;lIDQt(ay|grV6pIv<<((iWD1)-N4WFhiR|jT zirCHzSRicl1DfAfK8GkadYmuyAlnHHt{I?^a_nhj^9ODv313?AQ>k9Iwb3H7bU2%N zasyk!!S=?F&Xd5YXS%~^fm`6%z~WCQrQ)04CaR|8mB?)zL3jLUwmb?8+pfRAX=33( zM}J4;%i7vL$6nk>XeCk2!deN*AuO`L$fBaad7+VAA@eiXhS1)tuBAl3L{Cd` z?^lrxg3m{MHIaFRxrgA)e)Wf!;OA@3VFRg&ooEH_ko1y$BAbZx8Uz@Zbxykoe(A#l z%dRd6LsRbyncpOK%MR^VV@8lN4VmK~qFkSP3LEqD`|LqHIfckMe#KYB&kK7FiBi z8P!3q?-zyym0s^dt;iY9Q)lz3-vUIGZkB*_T1S>qA`@_4 z0k>9b8&Ob%wQu}~ZY1TKlZHO!{zO9yk-0mf8#_(46UA#phIV7N;S8q8s1l`Cl`ugG z@>thVC9LnHdXSvb=67o#4Xb=d*~~2<+{8WzL^3KV7QBtIG&KWQT`Iooms) z>~J3>TK=gQFVKVe)iQ*=`({0@$RH2NqD;mn;LU}7re)tM)TS#0nn0niqoP32nH9Ya zyhB6*2SP#9E_qbpkQjoy8{$SZl12C&rq0$wl-BDHsZY>q6Ii-MlukW-nj6V821DRaybUJQ)&V*FqAxxvS4ToAarWALJT z)a_Cw(1)xS*AP8IUd+fA!cDQ!ycgt+zCn&NavYSS5TGFapEEk~t*Mj@vBqzwgh$7p zwqu7l!bAIF^YP4EI)E0|Hlm&5Z@Q>dMv_`X*c^cVx(yL=JDLOC)<&$cZuRIv(O!%B)AyLK^4Fftr-U>aK^hDC8w%3ylsJ7K^ds1}<;0C#e(G zMX0bMcCpiZC%StmDp&>4Jwrpz&&|7ANj0C^%wH+U(pvt!j_H&bbG;PyTbGMwpRMIs zrsglDE47aB4HO9aM>mARMRr@&^(!U2)K1mTbfrPR*$^_H(iL`8)sllQCSh;Z$@FO0 ze>IU-aD3}xVvECLWObd-GoySZPOXkzRNCE??cjEW<5KmAY! zoN31g@GJ1Gc}8!D9InEl*qBY#*7~)S6dX650UT2{)g#`dQx3(%tHe~q&Z|3GB$xcN zCaEtWBabPEq2UeEx+5&klY+WmINnvQkED0kKskhDCgVSaBP70*N>u@Hh>(?d(kcQc zNdu;JE@W3YRiZzeX^12KONyF0jw7nB5ASI~^c5l^WFtMF@%UAR zLz=*3txyWaQd*arE3j3NG9T(DJE z2&1m3Q-olM5mC05QL?pd$)A+0%qis3+r>j(T;83D0Mf~SQ>AOEdvOk1c;ZQux@cAe@SvHBempSa?8VW6NcMWuy> zcH;y;CzSuj7gC@uhv=Cf@c-Mu&`HFb;`IS(kY7nzd;lPa|AwU0B+(akMl+UwtoQ}vswNLQ+)ILuP-8R zT&Oj%GZW#CMCaI}Q*y9V^l>3CW&XxbG9q`1O&W(`v*c*e*0o1fJS8gmYDN?1XIaTkc(p_P);ZiZ%(iN4N*!FI`)S*LPevlxQ}V8w)+`&a zHG)=`)X)no9A@z&peJy-7v;RQY)h@a&nS^`ihiUcrK>p>_D_oQn(Spx?TvDEnPK z3Xd^v@o&g$?$pCpF38R%lL=-LUxOHY=+ks%@}Qc!Kx z6rd+n=J(VXlRr&lF`;>kc#UO`CW_7mcNm+s)ahi1b2aTv8U`ZT`H9s z3)AGK0*<;W&ht+qI04<8*hMq0#QSM27<@Ye5E8r|A%KgJm|C?NVENUKVfbCUO@HTt zH5k8HBDb1*Qz6p8E&AMuu78Pi-q|5W{8r0@d=M-SpF>fiFpn3|1$CI1F*-&n(P3hW zbqtPWh++DW4B4+XFj_J~KQhkb*`R?L_0Gbh*_mDNX#d4H4UnGo(=FolP>)r3fUeLR zpU%|DPFp-))+$rTjW*BOFfdxa@Q6HAMa;)>5SXnhOHg3yK!g9(!z%d7&WUU&_ax&L&o9U=1B^73mjl%uby)tao z(GG+#lTn54O>?23Jhg{qEt1qkSDUWF8uNOGIu7w+*%j3csjtSIUALiFvewa#?gbJR z@YFgGKrfIi1!9iikB5CgnZF)b9rS4IfivjQmZrb+NtbTrlIqSoX*h6Zb%%_$KE_W(3JJbE-cRrotLXX5tI={N6C9rb*eUpev8zjs=5-VhDUc%GBHa@1 z(Cd{DZxymi<)3ICJVweI`QTqLwtfvi>C?P%5(o1{xE+(!bSMisj*H;y{h2HTi%o4_ zzq@HbBN2EU(VZ;fh+E+ETNlDtzl`O)pND`#Nx7_4{$4mnEuuyW$+DBBtdSazy0g@X zzktTiVKF2|=&C%Lo?#hRE$WUA@FZSW_d^%yiH$$OG03@rrsMY%e6eiF&;#C9x&`HZLENrA0iXt3@0J#L5n7 zX`+ml!BasP!3c2gCo7dcPDx6HXQe94wk!Nis={WwLKLXX{7TK89y^hr#26{#gUuBg zJ)8~jDEHG@gao9HOEpL{o^6d!Ck<#<9P&BhH`6@f5Mg~Fk0VX3Whvv2Fp{hO zRK;3%k0Mq6CC>F@ps}I95ToQ1=4!Ne)&h@w&*GcKnq#^h&V_R!=uPFBMC=_cFwR^!PKFvm+-X*o+3({jR4zv!#yL8&LhuIF8;rH4b)q}OJAA|JAoVq>#lWE;&F@Ew1M?L$mNsvAcH;p-(_ zWQV_$CguHz_}eAkOISR0w)6nAZsQ9AeSO%)2U#ae)=%y5SrUHtXuK};D&N4G-7rv! z_LuHID^X3o%Z>x1-t&L>kQDifiy#Oo4w^RZS;mL1VreRiM91gZvEehww}+W;$dgUv zjwVltoGkUoi&P?)#EQvAYM)358ynHXaTqc?C@2_H%Agwy>^?b=ap(`P)y@&4DF9LlE5(l|4rafHLCtLQmEb?p?R zI!nU#Nj&ymsqS$*ev&l#N5W`%8ZGDQX>#9_%YKQikaID!4rRSoWXCr~zE;nTrY_4p zl=8BbAYdwj$xVp^>X#(=&8r=8w3MZ_VYHUGh=7Nzi75n*lbCV>TP46)jExT>X*7Xu z2@EH2HrzRMA!B1Nkvv`kOO}#7V9*P&R&^ zmrW1<-hC~Bkomd!Ax}_~lX=|&FuZD%N3hP8Y{%oLaL}tby*0k)2u}%6>wCIz=51Fv zP%a)d7JCzEi-|n$oDAh8G)PL3F=&3Jo%5)EWTTxN7|6Y-Q0R)U&`OiARjDXPeS%6r zpE-eWwtD^E6dI*@Tf0&uY9y=HB~ee4KUL$O(=`gH+FT&G_jkr{$HnUHKWaSN&WCL^ z5YuB-j09~U#K1dG027L zHgbqH5ySzmzXf86o#9X?1F~FyZx|$4=CCs&P8COKWe}~}BSvssRo3;3xQ#VZ0RE9L zU_MeP;b>Pz({2z_arSoG=w`CDvD|&ya5@<%EaWBvWOBax2nv~w<24Xa$@|Fk2bnxH zur~?QZc*QHKofW_t#HTc~id@1FTDwIG zUjfHxOzULR^&eEwlCD7giXz%gWF;)B=h$!6O}$RAVmGv-D296HY-iL;%M(}kr(vHTzD#kh%pL>jWY)hwyR3) z?CTO8Ir2~nDlRwaF=_;s2r@F|-bJY8yq_M~D|Bn#eEF3D1igF7Ny}G>bJF~~H%r*- zo=m!N`98Q;ZxanCs?L3bPT~%Yoh0~F#4(ZuY7Lu|5(J6diT?b1__?**x0722ofxj* zj4=26VqK(&%39R}8fI!kC{Hq|WjbP}yU2zBt^*AZ-1xqRN0+S|C>DfuTT(~$G zJ?e|>PHy57?Q8l@#LoBRjy#qd#o#0Zm`_fiU+w* z+TFRn;SMK!(}ndLKrfuU^QdKmkA0}V*I(AX;2eMQmBio4cRqT5U58_Vep$g)70btEAnuA#DYCc=zYNy5 z`A2pJof`%HER=`i+gLi^eB$HSyQ=UuR>>k+C7OBikw1BYR%W zb!Z1oFXYJ^i{I?-y0Zdhiwl@K|B+i_~2j(G7c(j`tL z@6@{z*R)BD+a+GW-*{Ed5{TrQx}dYoc(#PIZ9>Gmcu>%aTr)d5@iIpwv)$Rta3pph z{sX`RTK=s6KB@mct^W!lkBn&7>CTeYSY8VaIvQWim~GzgmP8g$26lvekxvdb7cM6a zTPc!<@e|y@{H|`~havEkRSj8kvzQKh!)U&r#9)18F_+e5e{zvtSvrAfFwjrocE?ek z9BSOVm$29dzAb2e$RsV2w}eZjk7i{BEE+Jm(ef5~Wc(AK_9pG6)y{Kp$-ekQ0LRg3 zT`jiZvi;_V^K%2%_&;9Tg zeBP0WB!v?PH@PiJKAa!v=YY@76Uc2BgTmc9hfdf0^q>st3nwzh!TOa_wxi{1syj=n zbmF=vc8E|2iN;vY3Mowv9{qWhG-H~|o8jqjHBovJ6I-@%=~p3ZeHSH!57jazi*32? zdPhE}wM9BaCkM)clq=DH@GDyJ-hnH1jCX`{gFY6z1(oLVa71T!(TQ1dmT1(hrFz^~ zyml;Np7nsn@fs0n-@@)^UzTcen^zx_?XFL=Mj(o;(}!@^Y$AnzTLi^b9jo%mAw35* zKwI4Lk8q-3$I6RMVbiXG&caD3LtU@1VzJzPk-m;lioEAFK0>r^kZ2dAK)UKi6&iX^jStc;-7a^14Nkmb_ z1x$1>)>1%e>>WX?ApR(mfvgBmK%MU+dHM_tE60RLjuAVXT+#K9@ac%mTfTA&zl~^S zY0gvQx6bgHK})Y7xT1mB6zA;d^PfrH@W6oa+%iR|s;n(s7Svlc`C8;709eN9ul&Hb zoIs}L;00GDw^Ccf0Dt2|7npxN1(EM@Ig#*{>LNLT%x7ek#~8fl@Et&mec`VIV8Z+(&}^ zOH8gR`@*=phtnt3bED;R;l}*?W=(OP#{O+3pDZ7->-FpRdXwoPta5%6f0?|f5dbYf z$;85`Mqa($Z1K{9s-#_e)?{MTZ_Djj`3$$QGT+t&W?a3>Dptw61UZ~0_R8m|L*wcF zRCc!6*7I(eyv+S>RQ>3R#Ui_)lRY3&c1}?U)awn!g4m|RqTT6iq=J%H5D*LB=b3GWgZ*@n zzh?NNe&Sqa>(bqcLDOP6=OENo9Sa-%4m^UwYefh_xm9-k6^YZSb0Los7+}z| zpyn6e)u`ESevULhEw60akOi6Mv>^ecyaLwzAys8x&2vTTi(Z>Bt#CdGg;u3cV7Dp@ z`6-}I@4T$0`l6&f+Sa2pk<`9Kk<Ux9qq^BZktLyPD*ed9v?gA??fx&N$pdIbL z`viTdHJXb7jS=uzks+}=oXPF+p%O8@$RGVSGZd@nS7AKVjCs)!(*TifZVJ%9Z4OE4v zoL*OCcY^dx7SQ~CwU zI+lJKhq6F=R#*X>YPDYg} zo9B@7Z<(QnLCH>bdr@_CQ5No$v(Wz{mMYqdLTE%h9bd>%7i`)r2=hO^H6V9#8JcS; zfm*R+7!*t0h_wZ)Gk;_}`klb6k9pY52l z)HYfoiYbS$1u3s2qp|K|&-@(i|4Dl%Pvn~K=~v6>Zs$nbyZh__n8PQ6ou{^SW%BSS zy3?pi^D;}r!`1TBsOGs);V5PvKkZ-o&9|{bcz-ZO`Cz;iwiwdYUt&5^lL!0NqjLmA zZI&Th-58Mxom(qo;8oYbX{Ya{xE44@&Dno>m92kXCHm)@?Sjw)a6u`BZJvv|@oAae zAFx~IAO+!%O|?g2LCX8jg$T*QXKCufPIjZesng+ryAs`3pqfkocr2H2W5O9=T%_4qYH0DKZp%4xjkk5GMP8&eTZSaWi){zq3d z;)Ji_x2j!YOYe*jXI_C3cvI#a1)w9MnvNM+V$X^N98MYHVj1EyVy=BO<&f}1Es3aj zibZ~Hie9Qd1~=7ZFP##(CG($Z$_<>W`pMtiQWN{D5D9XW3=)+O5qe+nGW@Q~{Fa{u z`5G)sL<6eotlEGWYEu_AQoS{!&TKPV%?kq3e?K-*(`C=2Y|zqdsmRHGYjLgmWCg;& zG9K#ReqxV0w|d=s=TDAq;*&33URep%4@el?nUNu2e1 ztHh&ewR2~{x%KsLXPbF<;EAoQx8W1xi7nOE)pc{fnI!fu=I$G6RtA9Gn>jzAUIzro zgd*ujFmn#iuXBnM*D|V+Gll%`_a6)ZZp*k>mmt66&4PzC6HJ8`B1R z{lRPNil$yS6VNaTW;kQe&_CLnyTBJ`(K(vF5PJynoCfzf|Ib?~UhjGeT`GA=9QY*P z=2v}hi?|;QUzV7M2<nfHelkP6uU=w`V;PLr3jWO=C&3DGw*#~ z%3CLtw2B*oYofhIcvORz9)(Ba?LB-(v^O)HyD8dxTzE9v$i4KoF+5V*6|q_Q6~aS) z52e1lQ@P*TE}pOsmUm3L!vT!_LYEL=qZJ;*D}nnO1jx#C7ohC0|CI2 z=mw#doL1I}uUO|scQux5Z)#fsQ(;(VNq6IJpP3atExOd@h@4_&MLYSV7O}Z8Z=iLq zl~uAM`kAk!-8`3A{E1229hCV<&hV`2+>gM<>`)Ync zqL9fc#fG;aJFHT$>TLO@WfCgeY5YdKB7rceYlW^IB!VrJ=`>LxwzE&MqKfKd%z~Lw zsW}0Nm28np?$}pus%T7}*x-sy^-Jh%2~Cwyxr7c&=zO6WVFB=r;@ISea{$L`Zn7wt zSw3JO23#7uoMCso_C6Hat)Cr9t_WH$2<=#Hc3Xdyn`pK93Ij5-TU+K}T4*(`zx4~9$1pD2SAlVnKUV2Z&C~O(N?l z_~si*A!_O+_ys|K5w>-ml0s*S2MZ67hg>DV2YHMjhayy|9nav5xX6$%p98mvyID>zo#2cfVolC z_LoYo?@VOYpiyKk_0(8X(M{MDGQYCU_9rj*8joMSt*K_4EuA@ITf)UqIFV4*ToG}N zNSDJSYs$U|7h2PD^vR0~T~FKR849PC@b#8-BT|iuXt#3RgZ2Ey9gc8m$a+}thNy9% z`C=6o%9ut@Oet(!@6dFMt70MP`S~(}%z7Q_njYGcG$R z7c^H1!bs^%*t<&9t~N2tM}l-yY!Cfe2$|?&pTpGC%sB51oW>u-vItRkpD_6Q5zIaG+F>91$iN z^d?#wLTkQ~qzVj5A@pzdXg)07G(+`WjT3NMWZRw;`frCROwP!l3u3O*8cThM8^Ufp z2otFBuB0Q~YO76-`Dfuzb3+s`-sb7LAm=lE_^?Edw7n+%7g{u$7~mGR=3|k{Rl3 z?w1@~8{2lfmi05=378w(zI8?S6lcGq3P@Tu#rb48)r3#-w{>NhuT`|}@8^$pP4s8u z&ids;>T8}?mrcodvYg9Ye;CkvCaGQW;u>vtEt`^z-$Y;9`*FeVymC|gZdOcfwJ;Ii zF~5>)bQ=-8CE71xLGv@^W0eS#xHxqw*d*CG@y#B|{>$ZLXWY;?0C{a%0anM3DF%%% z2RXnM$5C8EHt((dlKD6A8(ek8CSd4*v+J?qDDsw24 zW?taxC+upkEO4L{wg;V?_`~;t=k!8}Z4lm%`Xv!5dtw?3Tfdi0qOmN!!tdb!!`GRB zH&vw%KcOuIDBQ9Xsv<_MVQQ8T`R!K=gG@J015uk-;)?4FSs$@WvzhUeU}_ z42soh_p>&RILl<5X8Ki7?-xdhOk;{UZmY1 z==SvY3laoKAGWdY_-ib!*ze)-5d=U@!T<>fIEPIO8BXxS02PL7h!@BUWK9b;LT9$| zV-c5ptmAnOjRAv`W+&kRLjKgk+lMuf_bo>PyKtXRaN)6_^EqN3DNoEJ6{wwnGKiQj zeS5A$S*)Rz^)x}GwjSUI*Ca-C*nVDH6P#f%)!m7&;NK33X-Qt~7;rURl36*EI_{7< zek;RCQ}V&t@nC6YjUXkN<<}Kw4dKTpk3@=iB?`yzSXZ9pFv~Jkfz-z~!ffy9uM-R# zv8!fk>3KHEwW@?ujzPI{;Fefh2)mF`R-d&ZW15mX6&M7^UuAH{68LwS#grc^PtExV zV4F;_wr;2X%+ZT3nuhQg{T8FxOvv>x;sHkM%WVjA#wjhdm2#0rK0y)f_ZX>5?1hP5 zuKo<=DiB*VQ+Z^M(|sDBdPBTxwcOWoSq7|eke7ep(vG-L&cHN&7&~io{2a>2RX8{p zFs{J2x|$^gQFNMZKEq!Rv@SUEyfvc4x*EgbTN@5!K_aLa;U}#vkTHVln$5N&&o>4u zN|?!Eg~1HA@9{7O;H&Zwk4-@49Z?|WCa}06UQDE^PXd-81|#5+QRmeqV&(w)$APRP z&o-v)lLy(%1Fjy_(3%zSHY|Ln@gcJfqyjHS^@0x?W<$gGeTUvBSn#~NtZ~EIn+S<= z>-WycjjTggfr@#ti9JsyGDQ(8y_&7is{VULr2mTDj zRk{q4te@TJ!_CGnv#==E^kj`-1?{0-fhu#Bhimk?_-9|pgsE~=C@_}(_ z?qiMcO<~=9E!@z_e9WDW2fbPeOy!Al!CXQ}LeK4k+;rBRdvsmV@biwEvtg5^^%uV@Qg!q8-!0n2?g`&VYc*4FSk+$+tl*q1Q! zP-+U?woe|PfsE_(3t&YA%)Qsd`qgDJoj!9@5MNv#;A9J2)0~py!Ki}x+@J;0ea9s( zTgz`djDnqkDR5S``y>a1hn!Xqa-5KIsugEvY@DXedfu4H3Lu0V5iMLH-3 zey3^ziEW3_`)%aR!d>@;`gUw+1)<**J+P$nR?QJfMC-diClJyBRDgljvR0`IT#c8( zR*W)1Mi?-MD$>1 zc5t>$Tj_u(N__{Lw$Z!tOrfS=9>9A2I2~88OtH4b-QFhj2HxBQM!Or;E^H9UjQ6wp zil?8-99^i3^|;U|u%h0mvqevKF_!I+elNrpqgMF2Qr4)2w&&2K zo8FbZs ztYvM4rwdJ+!KW$>U(IxtJHjKazSRd^kztUq*aN90sE-VUlc=*Yy#AH_tz|MWk!^Kk zENkU2D`NyU$(qr}#)qI>JucBuo_bfF#WZ=KMl8w57@axb=aLj?WT}~*hpc6vO72z5 zM1tat>HLx2naiZpJgnBEp6Y3mC$_@~w3)9<{~LYdd3*WHZ`z{c%2|qyk}LuQ>?50^ zm8Jg5WR&vo>&5#^>zfOE$5$SI@V;cSoL0wi(Rz1=&x>XD2tf@qzul>PX2a+Ky|iP#+mH9?vo~16hpTjWxr9Hl<3IeA@O5^$MZ#SKRognM~gq`RqLIB_)SM+T%DH_m`E||4!B@?FHQ+`mbMUHaGGUjh`CKe4+ zV%#YZ)4YCl3$3?BZ!JHFsKOqpyQ?kp(p8(w;j7+`lSD1pQRSDQv>bKHg} zbA8f;HFRq70)voE!_&rt-_=Yec`e=AqF>O_FR=$Rm#bq)&uUrPc6GE;cFK^emdhv9 zg+o|6!DjR;OeIeX+<*>db+yeKTmM%-ER(r?w!0y6&Og)Kv>MzI3!`mD-IXl->Pz^F z4keE+yq6kHkJ88emYB@TZnpn6E+hH6yotE2wtJGN4s*Q`LBfYwrsyF%8 z6C<_c4z?p-Ba(-$ON@$sep^<@EpCU+zioc7oAv?E%_Jp!}KAPU=!;#bD4KB3^){L5rENVTaLFQO}W@ zh^xQoOpR{z>|_eLMvuI}b5|hR{e1Ikc)V7A#mu9n)$k>_6|8O(|9JsT?pE@o zh=rdCEf{|f&>nIEW<;_6Oa^j*>i@UCN1kVqletHl+-xn8xk~04Wf=t7$2;7_YH7HYCS1ic;HtYbF-1{ zkgbl*hE7?O8CjUv8@`7vao=ELY%JeEU^9GMY`n9i`eYZ3$XD!=W!8lce+mE4^CeVa zkp9|3&3nUy-8KSM{pQg8U2i%t>bALQ~u44*Uk~O?=Tl_s1s=D|>q8yQ+5Fp%4 z%9HDv6v%p>IT{Gz+^JvwhD#Z+phK_7(gIDuHqKVi&q1sX@Y9rakiSmwMm)9<_ZDBm ztNF^AKa&gkJ2s){Oz{ z{!Uwo6zH4jGqdwOZ_dxixY4gocdW}5`75fDt5yj)6kSe4I<&0<;DHBA@}m3X zG~n-vEFx&m7xV3KE;xmwzGgd9i4pd+*1}Yy0Pce1sd^^#l zxmx#|+MGvZV1vN$23bCEZC{Bs-VY(gv&p-AaYxT?&&TF&k%;iLA*7!_zf*<}{%U6a zl(d^)#5AgIM_!;UO});Y%TAmN37ZCl!dWq~>9y2CcuYr0;4G@P`Dm9_Om+ zcD7FfpR7wXB_XA$*B6uA_kC&!`7e7I8z!% zIedIQSq%Hl*MnbOfjj_vNKLx1{pFGtrce!9{`?swsn<$l#7~wt8sMde^gtBZqyqwK z_7IPtzOHNX2+92${^+bId*AhQPtJ`Nuiwi_3Fnom^&E6^W_ec1l9gvY`iKS@(c&N5 z$bngl@a@>app~ozq(Jl7AwQ5jG?h;lcb_gfxmz=uO0mGp)_Kv@GkKKG3hG(Ytw% zD<4zL3`AQ8&J>4JA!skDBdgk?V~Si7KZ&O(o&620#bo`A=)#dF9g!om zk{#D~q+qgHSS#IG9*BvyWQNVFL!cC?xv3q3Sa9WqGs71>z67ng)R6JcWqqebQHmzd}cKWQ>SPLH0(l@~~>V z9Z1kUVB*nDf49&oSI9OhNscL(Dz9QYN=x$}6RUIR^#62M#IkLZByu#P{yotJ*>8?4 zPwbFw&xL8q@u>gXzzup;f#%G7ItxZ%JE0PhLO}yJvBH*i z_9HtZhc9F!&Iwp+m$S2zxm`B6VKjCKcRLl6N6d!lQd2t5$6TQr>3$~d^eVIPSmH5I z!u(W3`0%OBXHeX1@@huT;(YLk|D=*sXWTqUj}kQev-_dMI<;3M@a)D!z^FhIi z4tyNZ2gFD*1WDcrv?ZOB11fTMZio^_ZLa_TCB+!&vpU;Pra7?0!+UD4BcDIuK~RtkL7p6zX+VM(uP~-JV@v%~5}Xq{Xmus~^z#1*Vd?dMq(>#LdFq0oBM_XR`&kf6BQvrfdTQ>m2c6 z^dP;5PxFa&npvatAvmyxgYq`^S~HBgC&U(qZ3QZf_G0QNbz%-|7hU9wi*rAFGlCLn z0nqfTfQwYHB5k8dTYTDkRF43hP;N!R3GaAbdOz@+x?_u1#I=`E08igrIsMViB`Gew zFlp4ocR;d4a4fb6@>&g2R}QxT7;{p2WheC<1rk{*`CEY+$Q?X)o8ZU$A@SSl6_>{a z)qRI=XX0O4j$tFP*D>K*^(S)j3P59rXPN3i|4fuLtgL^K7gj-A!1&kMD+ostJcJT2 z2*gt36LNC0ez!{#CK1Up&%Tv#q71?Fp@H6W`=G}P4RQi>0r4Pjo;_Mpb0hugw#|pZ zJR3hyl?9dEF_CGWNgLvH4Oh4L*W&(xKhcs{gBu;5crLXM8tBxxQ0XQWeucSD6m^NA z?V~$&+u>hXWxc(7D?7s3a3#(NyI@^+XG?WSaXd<1bqbaAUG)cw35(pt6C;kwK~kP| z!Uqe*{++`H5@z@F+>0=~LlvL1s`8TDeM(jU8izb)wCv|}2)En<#XMN!8=1speHcZ9 zhvoERlr3nC0t|*>`tbZYteW@JUCbG75h8BO; z?V$G%n_2i(V*DCeCELRE%Pf>_6OF_N69)h%zqV_kGf?F0vcdkcfUFhh%qnfhy|2KYbElkY&{X3jc9@$q%jyCQaIac+(}IZT;huNC)K8MUQ06tstZ-uXcLXqGD`z))-Xq1M#b%= zu=vr&+l6mh5eRRHx`!P_0cl@vBKURSi%MXZ`i*%Z*0B6-Q& z8z@4|LqAv2>oqriD^EDzSV7zwNIjKQAF8Tp)@uN}&BGo<)@r}G?a1>QW{CAc=sDJ< z9HHf0Hmu{1s4khR&G=VeqmHKmlmR5t!i8*W0EWw!`MD$CgL}`(?l~FlQLMQQ^teu zovs&FcV8U^a0Oy`@I&;ivxI5+0A2J||Addv3uvkSV*ZqX=$>i{+IUc$6@$E=s`O6E zP}Z(AM^}WzAM#DiiPZVgP5go<+q==i6QN5mWn^F`nQw_%Z1dX*=#s^RL#B9OTJHjxJD=MQQDT&=~8rVP?3* z=63sdQ{fR=ENc|n;1`+=H3w+D1c^SOq(pAy3OIYt*c9hM9wynxM)o4-9r;LZejY$^ zPWC8-_HbshCD9?-0x1ce9LZvtlRS9XoWm&1`j?y{M{|2(F%QQxYz9eBiOCVx--7H8 z=y=s9utr|Lv4kGTYc2$dM_tTR%McmJB_T*aBL3tzr{TM^qySg(5SdL8Y8LgF(IDO; zJv_QdT@C1#YI7X(yVs1#ro!rIY$ZQJ^vkoaJum?+JLVJFG3`8XthrgRE?ay|CPl4c z-a(XP@x&Hg)^A%`a>j?kVFjj*|0-Ze3yPtq22v0*7a)Ii2qcD=34?Ewcc8q|PsC;~ILUc9MfG|}ldm@lTuim| z0+@ry&c&(&}7@U2Yca@z^6Q=>N;?TV!;5gk)^r(#^EIzjt;Y2*LZ{)W@rj}|Z9 zdakt1CW#H{@jkB+@{6>v3RzA6{K`RGIPH+BbqLuTDH{S#Zxk9tglvAUNC z!<3Vsl%7rP^F1hU=_oqg1xl#eW@la@ndN2v9*ZG&vwX*fJoXe{v9k|8ihLJaAvPQ3 zrFIn&m}Nd)WtRyf#5)`|^X=p%Q@|+Qjl}{d8FVG)qmpk!3H3_ZZBwLd-4m&@IZ^^a z4)axs5ly4&s}K@xkM!Jd10~c`I=enr!#7+hG0TauC5gfvDU6?rpGTBI7u4U%HQa@H zsYg*=gzobHc9K!)fvf9CU)`Ik;(ydQVR|~Y!yHk!>%vCecfd*(^hc=S>NO4ai{B;; znUdJgB)0W>Q5k-mUOVIaGRYk+p8g>@jJn&UtW`XYFK)%iIU7Vpg<^M01M?|{yyTTS z5qaIj?K)ZAY{#Ex$44e6wxx@WkYXe32tgNxs5PUM0y#xP6$F9jP98G%tocz3e=XNS=4> zJUOX6>*JFI+GI(RM_CQ?;-jr^FN7KlRKHK zqz1D&xtnqRBw^;H?n0n(e44H;4GuD8Vx~^iL{(@8HtaZy@706k2;4;GkX3y9rgOC! z4J}QR0&>9PA64OR7#0^9x{Bpa6d;V+RTM+@Q?=U=aJ3BqF%*-kd*cM^22wcU8M-5N zItPxL1TcE{hkJxPKjPXMxGFJCBa<}z6^`VDVa}2(k65%-k>rrWnw@=9Yh6ZCpCUZxrsj`_YJwc(0!`lc5gv7F4n;&q&tYuHzjZ~rFX{+&r27R5)yE#~pUA-&FPFq87+G}vL%LUeEsabt z0*f5vB~uT{6dMw=Bhh*e8^WDUE0D%~OLWW<_&(%7oQTpmi0yYYwgOT22 zV{@JQL<#be%}$WL9*fnJ51eP;Lo#2Y7N&9-35xU_2T0F0wD@WqlaShT2MBAe@Hl4c z@STvE4>)6;UzC~(_t9gcmb+Md{qzq;7hyC3XjUhQK5J~IH;@_Wv{rya;x0sD#EGa2 z&EZTnMYjsUy9&;owo=I2{k7~waswy{th4s&9WGNg_V0Q z!L@$#l`UIoYDRPImL2>e;P{8N@;ps+#>#g={6>98u9x1ZJropgbX&7T_wEkJdB;K( zM+C*b8r@d;{UR=!cQ48s`7>UWJ)=hN7h2aBNPkH)sOfn&t)_ZJ>{`_O8ph7gQQes$ zw9OfK0xJcz%EL(! zBaoeaJWmioK=qn8hNe1*6@&B?-Ah~gTc)Y{({?>acM_S}HId@@)g+bih?o%eKp?H8J6- zXBp*j>@*(~G%*brU@K|BV1wyr=?J*6z}7R^Z(`4~2OBo`LD4LPz+j`#cyps)?81v= zBO@|Uzo7*@S3O4QkT~?v?M>6|WrVw|Eo7+i>txx)G%%(H-+@&@@uPYZQyfrg*D&$F zYUpqGII@9CIpQrk`ytgSJ&-drzH8qL7tn_K>>BnKeZP^nnA28KEZk*m*k$e@z*{<+SsQfG1PpWP0}S{X7-Jt_~yUX|5mj<)G?NW*=r zTK^Z)c%xqNHV*KH0e_VjkeRfD1+hJR&1lv?9q7e+`Bs17#7~(VJ>Jo%6U%c}oz#_@Gd)joLC12h zpo-;nAChL(Nh{0iKGI=nVR_xhIxLMYuiLM~(y`@rdv#d)yS#26e}ORP$birRm3@Tv zCx=`}2XgI?PpTbzX&X%If#1`WHJoHy+feIws7C>-`d~stM|!qieLCh806UxpU@gSK zgwRX}KTxKcgKj;#oVHU?MN`N8=8JMznG73_srdr;1S~J^e5_6&NnZFYim#PrP(Ot< zut2y8U>83oy=ed7;aB;YfeqggqOi}i#aDAeK77X5qw2OMF^;8gr!eMwif?@f>P_wy{I$s< zpmA1~n@>4ZU`?@=GUK~8TtQ#KZ=sdz%PN`s9Ykqym8#`ller)9nF?+vD16Z+xXpy@ zo6P+e5wa<@T$hIR@nQ4_FjOs5s@IWve*?#8{aWU|0VvW$Dy|}8SnLBBwDf1jX z1+&%UMmla2=!9ZZL84k1(4+$GGrLOQIajX6F=h`0MB;B@!44tL98%4jCC$Fo`%)-< zt9K=gOwS~}ozfYOjs7{q7lfsPTNJp-p2R>NGJg{;!vC^k()pXnv$_j2km#0t)2I!> z!iyL1=NCHRT5=LYKtd8arSpmjAX{~zK7#3v>&k@Ki7SNUbtP<-F5;>EOxyA`GXEvv z?(qj?jfZM+{>VE)TdqIo9i3w=y+d{*dJ)Sx3dPm*#;BVtQORXu1Y&ILb)n3MxbUGI zwyQtjz%*$6Wwulo8`9t62fokMn;0d8JarxGmyz|mC&A4i5(cf;UDP2Y(XrNp4uZan z$B)xQfLYEATJy>aw~f`NS5zi)pFXQ^%|R((Xkl;$a*paqh3Ftr`70r6$=t%pEzB(i>L>@Cg7TwA-)J1!6k%Ngk<)*Obmx~Yq z5s|6SN%WD`=#2evyNDpeZ}$>}90Ka;c8X4EKx$r2k*FAGGHqBi_-r%k)-pGZ264u9 zL|TSz{h&;z`K|b?^t_GPi@BL*qvuWBcHxxf@mA8nmM^6zn7mx+j&!g2G0DoUmZdO8 z?ZJkFD>k^7dh2R7CG|ayuW(nQi>JlgXpG(?7zeVjm(scjvfwdpnWC_e5?-capS9{s z`9urwS@}ehLN*0l=A1PII6g@=LYTVbFDAloyf&T6YCjEEG39b4`WimX^uZW*st_Fr zn#&~8jBASvNe}j|-wtNHE^*>KHcuTD%Bl6Zj$ljVF|y80nOz)lc{n<^_`F}v+tieK z5yyVx9%3|ON^4|*oZ;27TsGL_y34!5ncm&=I+%NX*6Xb#($!$bJePWy7KEK^)B+@^ z$M!SK#JGdejn#C-5$@x&HcAmXlE);PUk5XmxZo;S%Ouu`Zif!|hK|mRUqV%rp z>TA}qcgEqQcga6p09n*uRICt&oAyO8whvswa{(I+eTr!(%0`* zScUf}IbcGGr=%pYnSN>bNwaz}89o}Zg&$>oy9K;$mF%WZ%t2A_M2?7+e3gTzW^bdWZg}Aw{p+lBD>UPZAAV(eqDw!zNtmod9#et!- z+;g6T&#t%Q&VWY+yjv?DwJfR3(=b0Hmfa<~Rv1n!=9q%{SHKuu&R2XjF*bKTfb;hI z<2MN~_RcB@=fYkt;q^w%ImWVpMAIKziY>lON@WO!kfD3fAEP?4wL(NuPPUTGz-Pdi ze)%FW;Nezj*1Ksg4>WQ1csMyBV4JHtt64MbNv2yb=xnDNp?)s^bp67~)%70$LJ*d5 zs_#FP*Nv8)YZNOqaZ{E`yNH1|p@mcR4(M!8`aR$n0C1F?M5&7mWM+ic_p1;baeM6sj1(V+bJ5;0 zYJ0L&%r5gn(+u-43N&PIpy^(L3~fE903$--^DTQ_;Lmw*oiMnQslQd5OmOo^!PDTQ z>n&rL!v)sbTSi6qaZg@Cgs72qKm#CUF^Imuhvv6v&UwF)zW;~5+q-BWBzJ3zq1s6>#|a`Bs9mY#Hc+$KboUo@|S^$U$l@dv=Lw?{kEWq zKjY@1?{n4!*$WOWtKFFJoBN!%8Z%^f;i)1)Seu+C1aO;5m(RN;B~PPwx(e7EBv|p* z=-Bijjw8<^-D=c61I(7amfBf?p(AtVvJ*z;B)Us_T_vN7FD8?)D^rIxrOe^G4#P+q zt+Is;YQEG{_-o0`wd7xuO&6up9%A4q`)f{I8yqz%d^x|PE*~7e1n?WEIWcP7wPTIC zdJZ?s8LIigCwa2*-J~|n zr~XB9^f;#5BcxNgU(0aS{2(nxy3qPWUGqdjWyL}NW$tjN;@hTQ=8jad?Pr2Uea9&g z)NPvWqh5%nU#qFq3KqVB0uJ>w2(A`kGHRR2j3LO0#=Ywaq1M!g>zkRJ$<<-h{+&44 zuhRmt*%(8~Avkk}S?2P^CLN2fXS3D(Ad_R%Rg8sQZ+`V9ah}rm^&PDIQ&0 zO$`0Ip071>Ez9h_`9m^U1Ispe&8TrkoxI3oWU;EBz;o0ed}*$qQTr>B@Mo{L8as(% ze(!Okt`pHA^989IGts4}XvKUkNr@h%TYhu9AM_!o)C%Wj`kif(ubExIQk$QIlk!UCw(!02j}QmsLU_^=8ym}@U-*RhJ zI5LQemfICwMuBAW>ZuH|CMkad#)#wU4ZEo1k)lJ2D{h_>js()G)<)e=q)^PsZo+#O ze|52Y?P3qv#lXQa{7RVdO_X&QDesR>L}00`xFT|^J5nA^W*AFXN&e{C75p%?|KTt6 zaW#a>Y*vC%8zauH1t73r{QxZlojE&7Y~6`V0q>?cH?vAB$eNf|TzTj0J0g>#$@Ax; zhqiVlk&ejKQtihdrK=5Jd0Lf!v#Z3D?dN;>A-jkT(8R7Y}*-!-O)mG`1QTIKw zZoCCDjFTC`g!RGgPJiT7?2;wn;0{Y4Ty=tnvp%!0lSEgC8Qa-S!=gWQGL}9|6f`(U zn)W^@;Woiq;oJAHbMa>5&HNvuPLK=$SLD*zh$GSCbBtxL5E124%>F)Yk4rwTUj0HU-3J$boogE~Nyxy0y+ve`V&q^h|} zza@-X*@NtFnMHliK`-IOc-|sDokHtbIh>5v%Q_uTKe2^bvLa<6=gG0=iC9^idKuck z#00E|B@?Z6YHP~uApO=o3f}>~sZ*j~cD_0`tO!L1=e$B+>^gM#=4BYKW#{nb$Q%R# zHL#FYV?!S0rxp|bn*z2v>;-f|o3Ac=!%YhyX0ah>lgHSO0g-Ah4o^d2{q8T+2^o{! z3w!LecBQs+MyI+#Yv>?cwL~{OiwC1W<-%4xsk>fMeCOSF&kbKveCMr9^P`)JBh%%# z;oR-Tx7|@0CRDpU>@L2Te^?V1E2YjYiC^0Rt~;&6lgQI~BVGKwtcC@hUne^0>cUtt z+v37NKy(X|(K;(zE1VVb9<3ZM$bMH4YU5tW4atO8_P%<|Q7f2N&r>S*b zO`n-0LdJ*m-4!&yQlpCHKHBe(%{Gvr!Qyw&vqdhnUb-*g3w_j;gJmeuS$a(BHb+*; zWg(Lxcm;>&CXrfT)t}xXd2})*Vt+>r%dpLKR*ocItS!H&NDXD?+BV-QZ-tJvUW}1*bDm}soYv&Cg8LA?6R-i ze9Z<6mAgJru~3Trq>ivqY}A)@A7rMX!;r2~Z3ZGR=SzC5@fO_{(5hoA*3cv^hdnZz z-+tP#4Sr;JCWyj}*j6#3S4catQ7(Zsf!JcM;Hz|nxUTu9U0?v!19w8Po0B7B*%$g_ zw>g9C`3FzX8;u(t)B%KEJ|JL?%8a&l6xvva@NeSH(qoZ`*R*{x9$cX2vLaxJV`9TD z;kqxt=RwEf!d*dn>}=}9nQ5Ner{umts2@iJo9Cp;M~e4!6_|xOBKR}G7RU}NnDN_b>i@V7GyY=Y{gl%0WEAoRx=^{c-Zy;)b>m-$cEOMaobM6wA55PVDFES8NNtq2)ZxTqAo# zlqe3X*X2Zs+N$~iHXum0EzxT>3h}yBON&DwYo50|;9P`!;T6)2Qb8%h4Klut_NM3g zl{16S?y~D+6OO6Zs7!Z-#-*9(_{PB+#qMK2cae)aTn*23%BfE6egonSMCI^kTBa>T zIA=Q|m#8wk$=TAR`~TPENSY8P+hH|`P@<-=UOT`rd4gk~gQfO)>z8~PsMr*6mb(4C zj_&`7xh~unp9nyNR0E!VK6_S6z}9@(%EXF!To*Pth;^8q=JQC?g5s(Hk(TCY8?o{) zx>hKO&bfmvtT^x+l4r$#?w6Q;>D!iuoT1+45=t>TcUOA9IfuWY_O(tyZ?Yw{bQ$DyiA*&H>S zTM1*iSHHK$r>J9NQ0fp`kOpt;EUoHymiijy7=b5$rHGaBccBZ1Kh(sE)27Z=g!nCd z6j%=*Bo-EaWsS`A>X&il-Fi}bRgRI0KYm^C%6cm*Z<3(5e$Ei}LOpFYATf}$+EIO# zSc7@FfJR~iUFO%Gw|U6-Oj8^>+4bip`fbqaB-B@?dxt5DuhM;6D$N|_PUSWhuqzV< zhvs1+6BZsTOeR}w?NfcWuC+Q<@92=Sw|uACKrzgy$UYIBf%P&S>g;!@E4IE`!WYiw z+@Pqg{&1-T)(a6-Ew#hPC47$^7Q(K&%MQzosax#uY{~N*!ih?VPlKdy*J6;OEZG8{ zE*e{vQ)x-jskXJA$%ECWu`uukeS zk`w#YKz>9s1huSl38w7nKuX=%N)Z|29kx2fWQ=RM)KGRUiy~>!jncehJ`&{3Woio2 zKCqS~0Zwl~O}h)Oko8yjPO;;zjk?pp>r%ly_2R{PktLh$dJ`);(rA`4R_d1ONs)+7 zs^c;`d;^Wk=S6tgYO@Ds@Q@GEj=AH_N4FX02Pux=;n}o+iF# zf9J{m4zSRKOC&tZ4$qYEAi`6rQFM}eQwW7W)xHzZk%u+f@geI$J*U>Vz*y*~7x=82 zPdm^IH?$Wu#Zhh1A9ytsVbj7-1Vheu{MNF8_7q)OLz0QYR*23)bSe^0YdXfW9buXWv|w(Ch9p<7wM|0g{0&)mM|+WeJ7AQ&{f<}C-gefT8Ndw;cT1^F*tO6tiGAi8>Z!K}Nk zk(jNgVkA~#e%pJM&bz+!5)VFgD8hPZZYtxa6@XaHhPGZI4r8Si6UK z(#~r`f(%^A?O-$m60X>9Eh#fVCT+lB*iwA z5UXys!?MrRB*JtL?aIcWc~`*&SSkZuh;-X1G?SUfQu8hs4u`mSLD5Rh8QFZe zu@^Mo?eH~^8YY{OynbKv(wAryGuR z!8syuK-vRLwt9glXu!gSP_xWlbg`?$yo=IPd#-jD)U0m6ejGNbdy3e>0`hOXh(5=) z5}LJmkXVEHsLJh7`D>})8Z{_n&d$+uiyl<*O)nrx(_DkFLUMS`JCv*TnOCW0!(^9m z)un7cC*I+XX?axq!>ZdjA6C|^$K_@!zMdbmUp_{%bMRS{vXafd+ntEhqjOHPlKqDP z+!}(W3W!It{5(n~v+{K{S-J8P8~71PJfjEi3B=Cs@EAARYPN%woo@#Em0FjSnqR_( zHO6v*0o@TF4pxljA-sw0g3loHo8;S72yYIz7Ir!=Ph_9>#GEgVZ89PwVsj*(m#a(L z>vq{a!7~A9C6Nh;3Rw@+9F{o>qzCFRtAsAmt}cOs7{}TWAFb#wa@_k z!ftYSwkI0^*BS8T3IJJK)f8$E!mnq|Le5VD83WAHOuu=jBZ)rzXk9O|+M5HXKP80^ zn$k;+E~#=X>7fs!TE|jyvMyoa0o)q}xcJQXHNyj+OmH04-e%bx0H)>=-~-Mpar-ce{jD-Web0WluF9NDN-d$Vz+-kY*3>rI>h zO&_IqW#nUZ$v7rp)JiwHS zDNYD8k*|1=x+90oBj$VR<^%FP3hxbCwfX6nN#7veP339gvtG$>r7Jc*+Tt_+ls}MY z)f@O@m0&;xaj2|6MSv3lK#@R(iW?<2c2ZIXB`_Eq(C(>g^FO5`E9*vb%e^75DJ$#x z)Yo^U`Pe>MBBCnD#pBj(!iNyF=@H!v&$m9)4q-3Wc~X5+z_vq8x`)!D$D{V0Fl#6s*d?1?aFt1<0d{>N6^bSN(0q7ox z-h&=D`mgu!#_zJRH-nF#Npn8)gn0y)F{NhH#v;ZF7dUb@=GXiCv<-yHPJXL+U8Ngi zYdpl8TPY#8uuI(m2T(j-@p7vNAvraEjBdo`mN0Tk$@vbZj|Yj_@sJrPGkOF{l9RZ3 zWxx|`J9F9Ck=OaFVs_$5nGmQJI%>3#d zwwyM8tipo8tHlU`C2sbKU#qE-A-c6h1i2G|V2qWg$GBYUUy6qV^p{zbO7IlGk$I>a z-PAeNIrdy@jOSsfI5x%;ghnM8Pe)(%=g!EZ!U+cS{SsD*eF-6Ym9sUOb7n;2D#ATP zHX@mx>t|^!V4l!(Z0=SU)1r;XrDtv*gxL7YSx61&oeBHlY{bko(j=CAVp(UdlOiB( z8sf4D6N*DbT(cL`_sxO%a%3ioIXsyfFq=!TO1!JUd>LWtZw|Du4 z4HUnbYgw`hRf3KiwRbW$3=a%+hWiA--Pqq4!4x7CQ{lqZKubEe2>2Pbby7|X`5o3Y zLWqwST_8e!O&1R&DSEuZSSGAiD53>M?G!@k^320OWgh%b$`aUS=|!wUUBD^uV+02I ziU=oV$UkSh9m)jo4q)(jtDOfLa!8eY&6W~a6#p|@{M1NKoGs%!ta9muER_tuy695y zRHIJrH$A1=N+~v-?{ndT1{+{+CFA0uqx$PoU!q>}%Sd`|p z2}N#@5C47b@51DO=>~_R>O8r!h?lFfh_(d5tk{0!Sp+140CnjEAL-SYOdrRZc653+ zlwWro2wSVyg04dIS^taeV3*N5K^A`s8=ggv8+0D7D9e`Tid^KYIVt?X#plX2oxwTY zC|U=r>4SqL5&p*8UwkG=N4jyA;^LcWulp1K6?b5o>?r^{MdVkc;?x(9%K>65%Elde zS`Ej^t>)=ett)&XwH}eUFV5G{9C`x*Xe7=VbuPC&d3eoswoPNoa{F0YKTBrTD z*j>)*VcolgL)e(lEcM!V>>L*cNlVSI6Z^QI>UvN%-H?DAH;dd)wIh-v_@qeb$cYpS z{BHdkN^CNf4E;Fe0u^70R91LU2N8|#cCOuZo#MpTA3el??1=j^i%_LpUaF6wYee<1 z;pfadh_THX&85^H9Pkfa*L|6tl3RwIGZ$vU7g`u-Shq+f1L#1`>S3L_L?EARNng;x zilf}ie$N-_dpgK{eVp1NZshE zg`TgkfxXaHh2n7~f+|4#zLot`K%vj6`UN;ZtCxW$Tl8Xb{n+;oeyh_BhfiHWz0+6F zZn=VF&pN}sQnyFy8d45k3tSE5zq}g!yiCm>Vgbu0UM+h(ix zxFh_Q_^OdxxjB8eEa7CuZ(>rZ8dxd%SRx`KtRM_l<-~LK$Dz8fxF^m7dT~!wyJd5X z=9*Yi4z5wJ?&gN@nVXSH#>O$d&jm^8!4i%FmL1-vnB+FZ^*ZcHN*iX~UJ5C{ zNp4^BN37@a%BlV#CxR^EvNq}#P$ty1$XV7H4A73j07onGg6-b~J$R|8m>K`1E18gh zB(Ed#@9H0V{6BKej*GcWAwispmGPmxo>eGMW*7B8+#|5ce>?3ghtp;Z z9b9HaH}e($AJVMq9D>q;e@SWS>`F=>nGCFZV>_n@&< zp3rdEj`_ShMC9=uE*A*IS%HkIBBYUBi9=#466)|YEF=z8 zVzqfrcWqEtKB4!W7;Xi6ixjL%alP5!0nfWgQK_r$*B4#g)wGnDL9#t^7NLd~qDuxl z7EehPQtSRCc_TxyT3gPXhGH+|(P2TkdiE16NS9SxpOmnk!H{>F+t40TCDX-ch|__J z^8Fiy7a89{*$6_kr{!!UD)FIu|4tA&Z|l5I5?m^_T$7-ukCAGPn_akzBf1{wp2V+~ z3`9sYU%L?|QnLH|`^>NAWPuVThI#LvS;_4*t~@<}s~7+dK`IaE5%^w1>2IwJL0t=! zOEtxu{CS-o!B%?72&(4grm~fCSZc4N;rJl_1i&5r-kCFvsA#UGo7ne9Qfzsu>J2}V zz!qQ1-y^Ki4&LqE{&Ec;JmN=H*~Xs-ZVOcGG+tZR=LvGHksT2I{+1=(c}XKVZoKx0 zj)yw9)AIv=G4_1D7CoPZci{{G6;XJWAI zlpQHEnwZ|E>@`)k>C~KVORu#Je(OE-%l(rYp6raV<>^e7ctf{6>F5^4l+k{*w=___JkA1=!~K{UqPo|PAzXB z;G-oa+Ew1)PbN#PrS(MktWnuMukM2())OFW>)feh=$o}v*c*#{vmUsg#9u$z{=JEV zpjAts;LGoH)ZC0z|L@rO58|vE- z)XEf?kzmkRbA0$Igr+`)gSCXrQ6+KV57OV%)fDb!U*W3D9|bq9k3-;+WH~M}oQgp7 z1YCNq$;ha}dO=FMa&4sXI(uQe;TKtph8v?=u#bwL83Aq9zfJ*uzg04u%X&-vX=>Hz zvShfO3}ac`>$$e%)XIIl5SVldsVJg98k>e=u>i|>L-GG5>w`S0jb7?;rAh}qEnuET zU0iC4Rt3P;J|-9xY}}LB5QvQ|7YHR@!4C3&e;S~E+C$V{0)%jlQ4x1%gO!Ybcsepv)(eE#@W-cQsZ!Jlx&f z8FX&NL`Ig+^PkAS0u|8}betjqA+reE!+Spt!vKtZVNYMN>a|%nxoZ>O#Zcj?UfX6+W@A`bi4+JvtQlshP<c2V8A18d z^Z7^)^O;nC-=BI^@a&Lx#A$Di|I#KyB!xE`rz~5HPW%aGCWJ^adMKlond;ZA{x5Wq z53z0-3dEKPOoKKg#FGN`S@-PR*k;Uq)w@@8vSTm8FV}+BoFhAQ7DGNrEyzA1}>0z~-!_PBTC=+?+ zUbMkNm@xHjpL1czdpvR`7NpUX#gg@;fKbr2z+d}|+Bm;E{RvEjaF%yAlK({#agjy`h*z6SZmS3*mX`@xZo&p-n~9^{~MAj zq#D05>WAo}Y^ULG2xKt5APX>zFuZrmjyt(IJ#Y&0s`S2Y9~Nt+JwZgot!=D~H{uV@xi`o>mIEMNfee9?vd?i@ z^#x9=x?!bI%>19k>4+PbTIOD~OwDF*i2>kh2eS$YpFVM zHlyVJkL1RC@zxMtMi!oe!F4uDa;f=~W{)L@`@A2{?F^yVj^_&>Mn3nJGi>DEe%@S!3?-LdX?B_)I<|-h)=uqwc*X=dfe+&S0u}7MGOC$>}1drnE>Pn9$*|=26u*3yAcpbl{`Tf~_p%M%hh> zN$D4D6$IA4b!3wG$mTa&=&7gQX4qbC^O-wEMjAg-^9EVhxdqA2n3sowGQtOQ^UR${ zAbT1-E%;+P@~p(73!0a}zY8}5&aUMV-UPycRb{_(YkQ^JoG=I-KeZdN0+9Cr8ZA}$ zQ|o~n@5fxy&5Y&}z5Re-w*BFs^|MVe*bI2MRQ=@<#M|9~NuC54XB~+Q%gDigz;637 zromVh$(9Y-Ag1841J8@cB|sZgx3_AOR@kx_gn=`5IWN)CtR2iHtOCjHD`@r|UAcIN z(uO~yVlYUIr)ho`?GzqEL6_HEj$@}nGryArohEuE?cDQuYA!Xi1-UL3l&L5jE3UTX z2W6$H@(ijZ!KDU2C<8|_e*Og#@1sz&HiRy;pii=kd=u0UEd+66F{jvPOdicyAGn8S)rX0Z(r9LUGrNdNBQW^Wblyl#;uZBxl`LQ+ z9)CtMSS2EX5`G%0yj#pv0^}{?eU>j&YK@1oWR|W(k`p@&nZAtQ`5}ly*^@39wQJ}j zbt`^+xFM5jdRXPX;Wb36aS-n_N#*6AZ7;WW6rpu>H|(X{!lGNz_F_Zo+LV2 z)$$P4WE^tO^sVLM<^B7v&vVqb`x8JIBp)I746OG%WrUkCI)P!3&>p(sgoEk*$cVj9 z89qDcW<*jfXY{m4hB)iOzxrr#|D`LC()dby-w6HSIVqmp4{$Ji*0|{;>|kGYH}{A$ zR)icfoo{+}dyg2`AS-Z`lx}8QDka0`c^4^(Cw=Wd5fUBu2mYvQ8Sf8TzCoqtZgY3g z+35G|4w*N+MDOP2`aHYL8&;P(Q9duN_nVW@b4%QX)Y9reb7?(;d7J^;Lsb;Ald-Px(EKEUXJW=&TJ#maLM=OE{eN6bTQ0nbk%v053# zYNfB4rIhDXBMcSnvEiqQ9eu+S>JkJItQ)pc=@Vw@3emgX7ar#=U2QfPqsFc#BLMd$ zG2jrWh^&U`+!qylYf*j3`LVVEXf{v^V@K)E6z-E+q6^v_NPWc?w5f3NC-(Ic_&1T4 z)D25OJ}Mez0P@z!xIXJ8b_9U4Y_?Em*rdC7pN?>8zKon^Sz_~G`(DU@&OP^K_d+Os z`Iw}4Pvl52wy}gF0dvs`wW6c&`NjpV=V_L-Am^IQt)a8>k_$nEHdHVtgxQH9s~o_2;4zc9rllCAApvNdIi>BNNb>WgQ9 zTh>e{AB`e&gClGa)!@QD1^(}3BWbjwPF_;gi$GO*$J;XfS6dN3x+Z4=$nd7o8JZyQ zs%vEz&TDC=It1n+IgxN^;z<>VJt{19Jb~6zk>-SfHu0RTlS$_dT3*srIuRT4;@-C~ zy6AdvVzgpAL@p4<4M3@W-$({XMSK}lRHp8=Y_??>X3Nc zkcU}j7z-PvOkbeL0f^O?icFFedcKDS^=gMx1UqKsoqpHB2AZJrs~0d{$*wQL0y zpr4JJZC|OXK_P<39z_Kag){9_HfRpZ7c-NtL`R-3JWt@z`MqnUps`eh^dMzC!OsY5 z*lP7p)+=Qp_V^84gMxY$ zL%2X{5_9xnPQh49?6Q%42oLX&_Xyrp(q*EXU1PnUMLvR#Qve((P_+)Z)NkFB@*V5D zNxaAM#z%g-@YuDw*Q)9S9L;^h{CXzjZg<0wofdg&#L^pH)X8rj<5FlrJ4 z66J`xem3)5XbbTX|EIVwfs3l@|32s5d#;Fxi2FXEs2L&%?!YjBTke8pD-JLS2@K8* zZj}ycrny_$W~Ek^)>CR_i;B2prB>Qv<|9Ri{^S<}+ z<9n9h?`-#+-}&7$cY!54C2i6r+^6c+?tNYNu-Jd#pAeW>5=Mrw%=|F)v-Zrv@;2iT z!0yuWNPHRVch}c^T)93+L5ogzz#cF5;D-CU_C0P*9DFsr_{~e+hk3`8--66XiDxXb zv84OtLY5CG=jCgbeh-*$d_U0ePWe3!h+qi+ zxPE9pUK47`9z`7Q%KivzE!c#J@+6p|HD~45mTn!1Q$}?9$zYe zQpSA5y9W~PgV-|m%YzWU3!|#M5SAQ1(8X4bF%kahY<3G6hJ3hSXv`Pd$4Ri^Yey&Y ztA#JYkDuU8+7q$d++yWHRkixB=zPHafvVx&rvu9wi@)se=Put3b*c=qN6u)wm z*Fo{iUC!QSBFlcfy>~INw!@}1+a1o1dkQU>DZcgw07rVi( zf-f4;LHtz|{G2cQ?v~4zVH4t5Rn)#P<#Re1dD9))-jW(l1|y zvxm!CcyU$T8pE4^Q4SwDXO<8grq{^B9%W(%*N1MiRf-8Ini(a30?!vzx$ z_R=yL(gkN0d>vq7L^Q)fwWzXbagZqLJb!yWq(ZoqQ9LiYIEbsAgIq9-U!!P`jg>NR zaovA3P`h&%-}_n4RT&CvvG_RBv;s$6tJPnZQXY*=^wp=uVtz?6Zn?cT7Z1cB8ohG8 zwmk4R6_jIfSa9Fy<>RAaoWmq9?m9Ya)pm>|{$w|9S_{2eA|G9WMRI2dq1Ds-f|f) zfL_qUEn)o3LIuHmj;CCR#e^(2p+7H;ZLuTb zsr$nS-WIojceCPVibV-YJn=pLj)WG&%kdfT-*IufGGWnNG`t zRPDl3kl7C&eq49;+oBu4gyVzrPdqw-x{>oOF$}@@8@B5Y1sv2;37IfsMjFYTGn8Z( zOy?yP6C7ugDZNkv%&84dF15xfc+*|ynvS-O<&)e6hVaoB7b zxp{?p9sN^yeQucGi$o9D92r)Z%bJy|)j*HP@>Nd{+wyIC9sGE5^3Xp{p3)%F;dEs* zip;eZX6M^7Y_n~JE~g)JzTKMb7xeXlUZ$3{)}>k2B3H4)mf@U}=W0;R>se;o^NU6Q z-z*oMCBtDYoT2w+V@6wHG0uRiLA&Zp@}<_F>6>QY-`M&bd?Tc>Tv5JtUZyo`X2##N zq7lzcnvrXDVxazQuU*fQVVj$kU+m1AeSNoR%=Ur;d*RLM#yJ|*&F|FejnCub#cziA zx1XogPmu;G&J1go>qfP5*kEwjJ1%%UgQhp&dDgUI;;iyNaD%9m<(%Sy-G*1-GbLAD-pct+C`M;h`)bM}C=KQ;y9RBC7zN>j%c+yQp z>jyNi9ariNmk3`h&&f}_H;8w-95$=2V;ja7XWmexVW9;D)}o9|OcZ^A;W=ngS(wdv z^&MPjFU-uhXU+7TN}n?35=9OhMq&L}LWQ#Pe5?+e)6lt`+3CXj_I!y5`Hg$$b;H>g zlaW>IaA1L`mo#`arJ?1T;mSo}x%Pa0+0aU>=W5vSIaa^s&2d1V*Vp(4rx5vC@!CBb z$+qQKi}PJ1RUiz7h-`wQNF*@AIn=~W2FtkNq_7w|C3SdO3K>0NbSjxp>?$gDkGtWu#(u)hz#!XBn5pzx2A2&h5ry_-DP^48N)N!^5DBH*FT`%gr6 z9=oEcI7&S~UR-eRbI%pvQ>&b%_P6hk?RkB}iU;!V9vdIoIjEuZ^&u+BiW(5uTw!XH zfTqowU(fO1#k7=l7b5G9N(~*hk^a_EZx{<@61y%RnQHFur3nqECTirNOHjF`)X;@U z4IPmhI-ZB@J>c2oS?l@Vtw*ffU+yk-ms(NX#YoYTEQL#9G!(g`Q@m$9F{~8}XC@Y= zgejqL5}eU*4Qt#|GTMTtb~P7^{QA@Wv^x?MZ9B=o<@dt(~1{G>~}@)pf5sP`jyiZSDWg z`JtZ6b!X~aY$UU>sm#d+v21ptZXk0g4y6~|2v)?JC{2`}aOo_KO;@HX16V4XCF^bu zolR%ZVtPBxp;K@s+sW>+w(22CI)K+REr(k5atmET34lUws)W(j~A2YVQ6oWad%~p&Z#p}e}`m%0a zowF{cF03xJPM@{LxaRG|=Du>X@l)cNp%g2(D>;fw8L3QFY_d&u!VOZUD7-cN-1L&O zp@x3wlb^Mcu7v9UqC>DAdNDG4A-t>w(#6kz&Qz zQ@GB-_*1ymclE_9nO7`VVyOZT# zsM=Yzw(6m(%&O$7u&U6i%auP@9;n=0*+ng>oKjQVC zHn!GL>s35TopMpBReo1$lzqx?%BPB@_A~i2`3Ja3wLeKe(jVy`^mAHGpQo2=F36>F zmHdMIhWt-?uly$co>nTWm1Byvrd*j+vrt|r{{!xna#Y!)*p&*oLjE^BPp{E`(N*$Q z`8)YJIYV9`ACY&Pyl&`U%}2|0;ig7u9?t zKPdkq{UWW93*@uXS?O80_vLN!W!jClfO}24R~j#UES;1Rr6?Ljf0j;5XJ}U%EPXBA zBYh-2AblmhCoPx8Nn537q{C7^{gNg~?@C|LFKAzSg5D4Jp>((OwDgJ;Pvhx)X`b{p zeVZPq&FQQ3QF@4urMu`%dKZ0)E~9014BbNSqfgSM^ksS{T~8mObLkvtf=#R=+g}mL zc2o>un<~~;tYf#Zl8QxaFq>6jt(a7?R#~fbfLp_wvc+r^>%}Y;4=E2Rz2QpWHqs?D zmp)D(qYu+*7{9t^anX^~MyJw2G@Fi~PUc{ z+)4nP6|OBD*Ig>yjw?6P{mDuX=zk0J{Q&6w20C9`gBq@}s@GQYb=6muag}dhi@kQX z;<1XfiqMKbub#Mi;OeHU;fz}v4fGVB6L7{FE7kp6d!Tl6ZAtB{T5Ij3T1#zAZCGu~ zT3UO#=1k2OHG5RMx}#=OO@{g}b%AI(I&dQvS=6V>rX$9QBrAtydT}7|b@91;%TY3&-@-z*m*6K;sf zTa`Px9#A?d&DeUD$6jK$u}9ck_97dq3{{>`?oc)>eUwc~M`cpw5+zr8Tp6uArVLRm zl@BY^FeU>rw%5>g%4}tZa*NVI?jWyKnktKxQJVf;qzu+{@I&%La&Nd2I6eYLYU9ra z&CJ)EZ0O`(nl7FKZG5>ROVh;zWv-1g<(^n4H&vv`)2XVhBLkqJCrgv12)Idb+!mOK zl|{D)bW5N$bg@NBg00q_a(x^_`Rc-Lg2lBJ*A891a>WUa9QNPqWX&cxQCAI{Z%17v zyT%r>3T9_sS$9`i2D_qMQ6|8d;ab4`#a^oGC+p4wO<6~OqP5VMH5gBCYU5`$4X^vN z_M&p4_JZ=gvcLA<(3d-4x4f>bt^HN`Cp77A60Q54{!TxmKVW=4Pv4N9gWfI0_}i<57=w$UiKjSMfpV;&pu`=loiTZxRY=N?0r^J-BlT<%&LA@u~sL_ ziSlVBSovDHNBKy3K>12}PkEMZ!+3lK8nZdwsvK7Gl`oYKmAjSW@^Sf9$5fq=PDt~hNyo~&zabuC-V zI>0qm7ptSx+to$tU^Pd5NbSvfGnYD2Eny|BJzM~sTeYc9%}yM|rmESh1G=~u+z54w zS_ECp^)h#NXnK4OG29jILgWKur< zx!tYXTQd_w=+3%}nr?+wg)PA?hwtT2 z<$nv?;h210eqKHWYvHK8M=qCFY1YBNH0$6*&HkF5HHB<#%?9?XHfBp|9%R~xWwUC| zvXiWUC1Sij%eJv7c7}CjU$cAIN9+Oi6?=~@XRp)U(8Me0X(?Db4xP#Ei4QP;exX0p zacnDlh8<@4>`RuwzJO*n^zw&H*UL})G_$qZ(98!|By=*@x6Pq@4V^ow>Mdre+Qh~v zW0Wn>-cPc5ET*cdrh}I%OO*yXnCo99Pq___>+WWhYu7b&Q{`OcML%8KQQ>-cj!zT6 z1Pg=fVnYXWE25$P>0tdzY*U4H4JOCQ6Dgy**43|3Z)Ve*a6NeQT@4dSBAG~DOx`A^NDr)L z+h|8=sq}9Nw-+dHWBu}X{hKs&M!rS?+U;zJlyIhz4-yuG5~5B z0JRK&S_VKZ1E7`xP|E3Wz-4lb6HWFk3Wq^#sZFv097iW}fq_yvxnqCvuGzsCP&hz%7Op+8E+lPlu z4_}}hiFevX8k=II>w>3GTf&+L0Mx&>V{>-kifr)bAj!H4}de8RQq%XQu`P#;ht zXadLzDg?~|tpU9TdIuD?MW=o6f8rPB@n4GYDS>DF(#zrh1Jnw99YLSGR_FZ*^gAf~ z^*V12uqm(|C;}7k+`1G57>-ff^upbbqu-iwHv80hgn z0@?~%+{ELp07f?Rcr!t>Ks?VUfyqH0@9m)VpzP)-C)neCyrsvx3p6;?U(@d|KelWENn-unN*wL_7;RC`6RRTgxNz>gv zDR*>T>g~~(57CzfwT~W98gGv4FveU`e!ICxt1NAf9PQ~cFS|I;JmvET%^UYGG~fSM zr1{7DrG&N7W@3%xghdNh0oj7gtJ&CWr$`a$Z^~XKb`oZ(!^Nh=K8P3ajjP%Ah zBCxyV;a^?NwJgj=IdFZe<=Fx{9F+cy)RCD3o-ON4beQ&<_bfP(-EYiFo{>3DehZ{L2 z4kctR?vFV>jF3~qhHJ8Bx&s)LLP#=D}js(OeF6ODkWuwi6ki^k$4xG$+sK#kvK!XH{_p! z{2|Dn0kwksrahzx@*DFL$fddjQl4B&PCt-HmIf!1_4CZc^U6MQu%#%!J>*}4d?{ql zg02iBWjpqeiI6YLN+4_g1^IEMWcy>9A`bxidtRPauB?^4o>{)4;FxkTvK( z_c+vHcLEulRZ5PnN+cT>B#>Xmn~A!2pF67s0PYmz{IOEQ!14(@YXf`$BX$d^NY6J$?=LLh%_4>94~l|`cu*CvqY zIq1J9(EgxdBs|tkRvy{sz7izlw?n=b^3Oo_2hf_KgfKk1T8#5&LLSH`)m=)aJ(Wn@ zReQ*z5oXf$#6Gg1nULQI`GDPoJOfB6ug(5wxj==qYu&&$m@$sN#|$K{>6Jq zWP3At^qYO;C$9I)(Ec@$4~6`4$nr6m`vFO6x0jUVLH5shjHd*0Y-uTpe-`ckY%d9J zW+q2|*ynB+AmrVU?+W?Fko_3+%Lin-X)iJ1+`A9QlhXkS<ek76P{ekxL_05FxlTdy# z?47EEziZd`Wkc27O#!1 zfH3fkOC+<_naOHCza|bNr&AJ0?URY5RkfLX|7@u~*4H6l)BCD%1Ox;G1_lNN1qBBO zhlYl>Z{NOa*RH*L_l6&RM38_h1u(%A5)#t7b!%{R?%cUYj~q37%WbA8&e(LJG z@bCHRyU@o6kFVStbYLUCn|5F$K2*`y@CF@-3~&Sl1_g(-Zr|C|Gb%1Vb?87o+&Djv z>K#2eY3!Za7!#x6I&QyALfdvkCIb^kjO}qVZoO)Jcm`@Eg!kz`aP0HGk-;ky656(N zc<-oz1Iv8TI&;^aQG-*{b2<`=Lz3{L6|OS;55^P)L=~A*rm7T$X?`CMe!vaFZ?{bY zn>7z^5!y;+jOo-wZWf5^jwVfbz2$%aMgp3uK`MSXR+|Q?Eien!7C}S}YO1QCO$lOy z^q-W2R6aw|TLckcY3eJg-s3i}uuV&R?%Zhe8#8t%-ZD0v+s7JlKab;SoCms_$NP>~ z7vE+6_I<1QhmKBj$p`nFEvFWk>pos+wpA@Ouk@e*Y@D)eFLullxjk*(~;vwk(&v>#Z9MfT%DI8=f>q4TuI>Isf|mlPuJR@$RSFA zNe=2QHHlQPwS}?6k9b9il$%6Kt;Q-Q9)4}xwz%=dkHj5SZ;y)@9UAxf!1CB@^m0C&Hw z@nib+oe9PNA8h)sRnSmev1$Mk)F zcvxTmI)8d>Y}}z0;c=}L8aHIs+1T6-Z^wRr$Ld(#HtlFB>$gG#HVeXp3Lz~+Enncbz;gmGJLMfR+w$eHjT4q7w6lCn#i~byb4%%xjo0% zS-$4-wV1ENd=2L7?|)c(zj^B(^Ul>p<_9~an!h?8lX!RM2h6Em-b~!RvIifhgZaGR z^M{a=!(k&>o_BthM2LIPU&=c?efW@7S&8T?^O`w#jzfAX&R0CbdvkJnCgFU+2Ar0{ zuj~Ek%{Rv+`V*fQ{&cNGGW*k4%LC2+wD)ocvp;>4on!W=;)GYs{`9%pBgvmo?`VJW zJansVWSeW|^Vc?e| zJqP*;6d}?$&nQqAr^nj|lb=(EO#>|ey#o3P)a@~k*9s~I4R{>a?|50@9qVyTjBqD}&7cIx{*HK#Pb0ih_yfTA z1c=9XT;cJq1WsO!{&*5?1^tRV2zZ-<=SBDrg8l&g4xZ-_&vCRUll$L8+;H%6|B>Z- zzWRCO{|)_Z#8hiz+X&%~?__8{3+#Byr^i;9p$c)hEwYb+r+*9@bpY{+dOAsx8l-cc z>J*)P3Bt2xKOsfPzb(q;#LK_YF+bHFx@c&#ugAqNDs{!b^MjHwKW$P%a$whl06GtL zxj6WJSXj$LTEXzRHOUq^0%i9~Ebam_g0D=#-=+#3i1Y|2X`nB=C(V)lCrrYkO%S!0$oCSS#s^dVZ$#z z!1awg*&ZtMdLfVbsR(1vx(5e-^CHii@A>%?FV~-V9sKEYgnfklzw!QrG&?*ZHn`V!>! z%liu6E@1HA2wR9c?C{H%^KBDyw*m)&CW!D7ft;sK_<5PC$cM*wL;O0C7LBxPjq+|> zkLSUA7x;L5dtkiqryySIutxu|_U!Xte?-`b+vmk0;f}^eV!mJ#SYS;_AZbQ|@T%Kj zSYs_oE7FFvBOOR*?8=9e2yzSQOZt;R82HI#H0-!(#7bt8+2kRznmkATfmctTAm>OO zX@`4Y^=uOg8X&vt1=q%^sH^m;xDn(+8SO|XcpV}le;B>&jrh5aAH}eLK z4gR3T*p^LNU2LtkOYiV~r!Yo&hs13@%aPsj3f;; zy~lk;&?Wph&CA1aX`eoiChGj;jwBw7eRqq#ul}@%FVf;szK+D;4=4jWj^ms!>CF7M zIc^+z=9GCIUUBgZXftRVXeTHWGy_!8h_)d7hF{z)KYwH1e57?4h4BZv9dtLy3hD$} z3)%zP0m=mp0`c12=rD;$3RG{z@E_v%^B-IBZ>wc;`qnuP*H&wO=GJWMysa*~eQQ>M zYwHZ$2JM(xn4RaGIit{Fa}^ZXvx*!pEBLc*&a9cXd2_O?t{GcrIEuFB&vQ6jg)_Ly z!m`oNO!~)=xVTs{IGR{-Q}?_Ad$E(`xNsKmPgiC9IVYzxpRYDPUsOy~jDINFKM)li z6;0C8#%83XPs6?Lb2NXJ9S;y>xpcqFk*|69qez;E-_Y*Lck-u}a-kaaXJvR6{OJOl z!(n%5Y({29Hrq@sg5O#0%OFR1bBkTs_Bn-GymluyNgtbrXDIT}PZ{`nbgo@voZUb6 z`p674(P4GW!`=6|A3SC99TU?hXqDi1yXO_oz;hz``I&g=#z^B2|L`=Y5y6{s9W!4W z$jIU8xEb6uDm{H-KlESoz)@%_zdyWrAerc}&z;xTQjE$u^5$DzdG^Agrev!#FH29? zWp5@u#c6Z&weWE;l=%5|(aHSDrJ<(Gc`lnXAtJjkO0(cmiy~Lw;e}cDY&2@9DK8tc zd9Ha#8=W<;?>Ky7I~89uA8JA^Ns4~zv?^&&q9ATc+VIJu<}f{UU-}&rhnq$tF>Umn z!$sM{)6nK@#7(rMO$9_0M>hN;lZU5^oV1Q1E<9=F#N#M^ZAR@#R&H_OOj|a=7{W!8 ztFQJfmS~a57n^S@oZ-UdQABaSh+-HCJUS(BFa9dm&afk8s5XV9zQ`$)$))@f_H2s5GFSao8n77wEog5y9GR&C=2RmX2@Obj%QVe3Kr&+5i6}Kkffee$9W7 zub8jbEKZ!qqd9u`u)sB6>EY;!H*P_%0zJNmQ^&1FyM_GeZ}j*l-8zzG-8E0yQXSm_ zMJjQN^dx~BGSB_N)4te)lZs=W_AD&_wM7rdYfs1Hm#??QekvfqQSJ4;BMIB&-JbBp%eE!uxkwEqkKmR2061?Eb%kMMBEcN_L!*LU== zx=F{7M*U|J@kV(eZ|i)eFX;G&z^4SB7Rbx;KfXGm^SA$4$IcO46A`jagu_JowF7$k zDiL;lqK7R46@g=V%bI+2xQ@F`I&KKnv9tVac(yqKjz=8!O^jgj;%ZBs73nyt6rj) zGyD-9iNGcTn+psT*iK+Kfe`|4Z4@6Z!UF{+2^=eMnn0_-`vf`#&KGFZdby~x5x%QY zSg0#vq|a`YULwNUk8WfoL^@xi_+g}9#jPPc zJWW)D@c@qAB4bq#lJ+7&Yo-BA*0rG*JAY1f%*%6WBqI*`1wnkv;%L_ z=7$lV+glGC7phN*h8w@OwAYgf?sC!U|7tHi0&BSzHrjDXgexNSbbO;xOJ5=6|9^pL zmEJ#%%bzOFbB@5-0+$F}FK~;%T>=jaJSp&;zzTtCie6G%fjtEd6v%h0_%T&rj=PS((z@7pJ3LGJDs=yq9vjr{@xL)8Efx84A z7I;$NIe`@d)ls5+fjtEd6gWcQRDn4HXA4{+aJ|4S0(S{KEbyeja{?;_s-s2u0(%M^ zC~$yYZd3} zxi=_KZ-(#x@fzKGx?0EMV}v3X7~;|6r`PG2t%32IfZHs%5zBoc#Dv{$?&CBDw6v8@ z{B<=(yn#r@F9Q5OHlaYrn_#0lC1t3o_sH>6ZZQps8i1`266MUrQ}`}xCW)F+SR93S zUF4Fe?0JRGc?CMU9D2%Zo5RU31vNGi$UvF{Z+PGW!dHan%cHani70rZX4nyQVXuTl z;iW2hV6x+F5mpjq%f-uGuv?Uon~hA2kS>~GbvW?W2u;H9b17aHGSKQ}Ey&A4UF;k?jUW8n`yUYq@HN*c-&ki2d|e0_>5Z{JMx>+1s(-t$QyQpfri~+q#N=^`}r8>^2s3W5OxR=XxJ@Wp7(WQ`6-Cw zO;kbrFzhq~gY{_Ne_odV!7p?D<͂Ak}#`~(cU%|LEf`pXv?dPAU5Un7ggVXhDS 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®@w@>Pvo~s5cJCl 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 z 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

h)Q1n4 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

JwRrc8IT!Apu_#zOb?%<> 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 wcPx# literal 0 HcmV?d00001 diff --git a/libs/win32-x86/bass.dll b/libs/win32-x86/bass.dll new file mode 100644 index 0000000000000000000000000000000000000000..10114b668cfdfd2275dbc4e9280879b67c7efdc0 GIT binary patch literal 139128 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 z zKn<2Y<5z0$cdX(vz3U=shOuc|#mCeU-0Ynna-|NsejH^NEHBh#>NH{aja|gz&Uc2K zA(|YRUUe|A%1#iQGB8D&Z(M-gK|mVhpVK4vU?n$DB#Ih!GBxmhQ$BbONKWl`BMo~j zK_<)-|KWr0KA;N*6GjD2Z5f=URoGVL=u-Xb05bahzx1)H6@gBv*l@D}y{ZK%;W64@ z`w{-@Pd6v4Mc@b-t@{fEWCVZSB;=?r>77J<4bqVcqrbNAMR<3Jhe^khY)QHD+Mb$i^Z?QAQqFsZe)j&!^%;@zk{y)1A%7&$9**h?Ct`7 z`)CgtW&%zcG^zHte7LQ<1LF!X?{iggP#A@Yf5xuL;`9pS`PlqLY<;m( z>Q2gPWfAF>7Az0&Z!O?H_fqd^S9wnBoG=+Rde*b5AgJG;X^KstUt(#lI`WG`W(2Z&LIq*<=SeX3x5FrA z--d}7d3~zwU0JCvz5V-wlzEsvoHt8V@0vYhx^TE_m-gI+;4LI>9D4c$#gDhUn(ZqR z4j~HARUvicb*DfK?S3Ijx8P%6`;I6F3(9&vy>3MueNq@hQI;(oFtk|Ied$_D>a`;$ zUXnkE$fm2A6(^f0yq0D}c-1J%5cC@mKq9PingZH_hyc_V{&9$sxPE&@klA&N3hXKZ zQF4HwyI{oaV=yIswQi8OTwgsZ`(Az6&&7?bFaK^>T^>{mka>hu_VR5nkonb$2qPJD z$_2>W8S3Ups$)8W0C83rz=E*x@?`6}Out-oc;#Cs-OrzYH&=!uK>SK{aa;7--L z#MD87*0f9vv_;`QwMG$47SDXY@AhEfs}fUhyZ*pfcZL;m`r1CHyI2t4&5CRW0}yYN zbx;9fe)cV4eworA75Ia`I|X64ca&l1*kyzD{fE!>-a`KQnuk-l!b*3azfaCtlCF7ak<{tL_zK5pa`U zaSy9rUsMHn>#hewbn$%#^HPY9o&1OOi3P4&;27u~nZ^8i^xYU+v@%e-}}t$ zYaiXny^2cv%2`?(Spg=ys?l4_r9-QZpe9d~AvSs_NYBleYG) zjU4oonT^zh6-kQB%Xxdmr(m-1v~{ECF-X=Fg{fn0VIB1z4D|W?5*tF!8$}zCUX9bW z(i<{SNwn3tRQ`>;DJxK*1xotzGe0fbAMh2DFzGL@A5$t{Jlkzm0M_6yE5PcUTsHPD z%1QSp3j^T-+vg4407F9H8-fefBjV&F9{%78)?TzI6vFv}$GkAoaN9S`kF%jumB--M zRiZ%&CH;_twG03>#k#G7J%3-;F^I9-q{p�fir*|4#DW5-7F#;+Cb{HK2noaJWYl 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 UA#rm0(Y@T-Qn~jZg4dt|0Ix4w-~a#s literal 0 HcmV?d00001 diff --git a/src/Audio/AudioEvent1.java b/src/Audio/AudioEvent1.java new file mode 100644 index 0000000..5df85d2 --- /dev/null +++ b/src/Audio/AudioEvent1.java @@ -0,0 +1,7 @@ +package Audio; + +public interface AudioEvent1 { + void fileconvertfinish(String source, String destination); + void filestreaming(String filename, int handle, byte[] data); + void inputstreaming(String inputname, int handle, byte[] data); +} diff --git a/src/Audio/Bass.java b/src/Audio/Bass.java new file mode 100644 index 0000000..15e318c --- /dev/null +++ b/src/Audio/Bass.java @@ -0,0 +1,1092 @@ +package Audio; + +import com.sun.jna.*; + + +@SuppressWarnings("unused") +public interface Bass extends Library { + + Bass Instance = (Bass) Native.load("bass", Bass.class); + int BASSVERSION = 0x204; // API version + String BASSVERSIONTEXT = "2.4"; + + // Error codes returned by BASS_ErrorGetCode + int BASS_OK = 0; // all is OK + int BASS_ERROR_MEM = 1; // memory error + int BASS_ERROR_FILEOPEN = 2; // can't open the file + int BASS_ERROR_DRIVER = 3; // can't find a free/valid driver + int BASS_ERROR_BUFLOST = 4; // the sample buffer was lost + int BASS_ERROR_HANDLE = 5; // invalid handle + int BASS_ERROR_FORMAT = 6; // unsupported sample format + int BASS_ERROR_POSITION = 7; // invalid position + int BASS_ERROR_INIT = 8; // BASS_Init has not been successfully called + int BASS_ERROR_START = 9; // BASS_Start has not been successfully called + int BASS_ERROR_SSL = 10; // SSL/HTTPS support isn't available + int BASS_ERROR_REINIT = 11; // device needs to be reinitialized + int BASS_ERROR_ALREADY = 14; // already initialized/paused/whatever + int BASS_ERROR_NOTAUDIO = 17; // file does not contain audio + int BASS_ERROR_NOCHAN = 18; // can't get a free channel + int BASS_ERROR_ILLTYPE = 19; // an illegal type was specified + int BASS_ERROR_ILLPARAM = 20; // an illegal parameter was specified + int BASS_ERROR_NO3D = 21; // no 3D support + int BASS_ERROR_NOEAX = 22; // no EAX support + int BASS_ERROR_DEVICE = 23; // illegal device number + int BASS_ERROR_NOPLAY = 24; // not playing + int BASS_ERROR_FREQ = 25; // illegal sample rate + int BASS_ERROR_NOTFILE = 27; // the stream is not a file stream + int BASS_ERROR_NOHW = 29; // no hardware voices available + int BASS_ERROR_EMPTY = 31; // the file has no sample data + int BASS_ERROR_NONET = 32; // no internet connection could be opened + int BASS_ERROR_CREATE = 33; // couldn't create the file + int BASS_ERROR_NOFX = 34; // effects are not available + int BASS_ERROR_NOTAVAIL = 37; // requested data/action is not available + int BASS_ERROR_DECODE = 38; // the channel is a "decoding channel" + int BASS_ERROR_DX = 39; // a sufficient DirectX version is not installed + int BASS_ERROR_TIMEOUT = 40; // connection timedout + int BASS_ERROR_FILEFORM = 41; // unsupported file format + int BASS_ERROR_SPEAKER = 42; // unavailable speaker + int BASS_ERROR_VERSION = 43; // invalid BASS version (used by add-ons) + int BASS_ERROR_CODEC = 44; // codec is not available/supported + int BASS_ERROR_ENDED = 45; // the channel/file has ended + int BASS_ERROR_BUSY = 46; // the device is busy + int BASS_ERROR_UNSTREAMABLE = 47; // unstreamable file + int BASS_ERROR_PROTOCOL = 48; // unsupported protocol + int BASS_ERROR_DENIED = 49; // access denied + int BASS_ERROR_UNKNOWN = -1; // some other mystery problem + + int BASS_ERROR_JAVA_CLASS = 500; // object class problem + + // BASS_SetConfig options + int BASS_CONFIG_BUFFER = 0; + int BASS_CONFIG_UPDATEPERIOD = 1; + int BASS_CONFIG_GVOL_SAMPLE = 4; + int BASS_CONFIG_GVOL_STREAM = 5; + int BASS_CONFIG_GVOL_MUSIC = 6; + int BASS_CONFIG_CURVE_VOL = 7; + int BASS_CONFIG_CURVE_PAN = 8; + int BASS_CONFIG_FLOATDSP = 9; + int BASS_CONFIG_3DALGORITHM = 10; + int BASS_CONFIG_NET_TIMEOUT = 11; + int BASS_CONFIG_NET_BUFFER = 12; + int BASS_CONFIG_PAUSE_NOPLAY = 13; + int BASS_CONFIG_NET_PREBUF = 15; + int BASS_CONFIG_NET_PASSIVE = 18; + int BASS_CONFIG_REC_BUFFER = 19; + int BASS_CONFIG_NET_PLAYLIST = 21; + int BASS_CONFIG_MUSIC_VIRTUAL = 22; + int BASS_CONFIG_VERIFY = 23; + int BASS_CONFIG_UPDATETHREADS = 24; + int BASS_CONFIG_DEV_BUFFER = 27; + int BASS_CONFIG_DEV_DEFAULT = 36; + int BASS_CONFIG_NET_READTIMEOUT = 37; + int BASS_CONFIG_HANDLES = 41; + int BASS_CONFIG_SRC = 43; + int BASS_CONFIG_SRC_SAMPLE = 44; + int BASS_CONFIG_ASYNCFILE_BUFFER = 45; + int BASS_CONFIG_OGG_PRESCAN = 47; + int BASS_CONFIG_DEV_NONSTOP = 50; + int BASS_CONFIG_VERIFY_NET = 52; + int BASS_CONFIG_DEV_PERIOD = 53; + int BASS_CONFIG_FLOAT = 54; + int BASS_CONFIG_NET_SEEK = 56; + int BASS_CONFIG_AM_DISABLE = 58; + int BASS_CONFIG_NET_PLAYLIST_DEPTH = 59; + int BASS_CONFIG_NET_PREBUF_WAIT = 60; + int BASS_CONFIG_ANDROID_SESSIONID = 62; + int BASS_CONFIG_ANDROID_AAUDIO = 67; + int BASS_CONFIG_SAMPLE_ONEHANDLE = 69; + int BASS_CONFIG_DEV_TIMEOUT = 70; + int BASS_CONFIG_NET_META = 71; + int BASS_CONFIG_NET_RESTRATE = 72; + int BASS_CONFIG_REC_DEFAULT = 73; + int BASS_CONFIG_NORAMP = 74; + + // BASS_SetConfigPtr options + int BASS_CONFIG_NET_AGENT = 16; + int BASS_CONFIG_NET_PROXY = 17; + int BASS_CONFIG_LIBSSL = 64; + int BASS_CONFIG_FILENAME = 75; + + int BASS_CONFIG_THREAD = 0x40000000; // flag: thread-specific setting + + // BASS_Init flags + int BASS_DEVICE_8BITS = 1; // unused + int BASS_DEVICE_MONO = 2; // mono + int BASS_DEVICE_3D = 4; // unused + int BASS_DEVICE_16BITS = 8; // limit output to 16-bit + int BASS_DEVICE_REINIT = 128; // reinitialize + int BASS_DEVICE_LATENCY = 0x100; // unused + int BASS_DEVICE_SPEAKERS = 0x800; // force enabling of speaker assignment + int BASS_DEVICE_NOSPEAKER = 0x1000; // ignore speaker arrangement + int BASS_DEVICE_DMIX = 0x2000; // use ALSA "dmix" plugin + int BASS_DEVICE_FREQ = 0x4000; // set device sample rate + int BASS_DEVICE_STEREO = 0x8000; // limit output to stereo + int BASS_DEVICE_AUDIOTRACK = 0x20000; // use AudioTrack output + int BASS_DEVICE_DSOUND = 0x40000; // use DirectSound output + int BASS_DEVICE_SOFTWARE = 0x80000; // disable hardware/fastpath output + + @Structure.FieldOrder({"name", "driver", "flags"}) + class BASS_DEVICEINFO extends Structure { + public String name; // description + public String driver; // driver + public int flags; + } + + // BASS_DEVICEINFO flags + int BASS_DEVICE_ENABLED = 1; + int BASS_DEVICE_DEFAULT = 2; + int BASS_DEVICE_INIT = 4; + + @Structure.FieldOrder({"flags", "hwsize", "hwfree", "freesam", "free3d", "minrate", "maxrate", "eax", "minbuf", "dsver", "latency", "initflags", "speakers", "freq"}) + class BASS_INFO extends Structure{ + public int flags; // device capabilities (DSCAPS_xxx flags) + public int hwsize; // unused + public int hwfree; // unused + public int freesam; // unused + public int free3d; // unused + public int minrate; // unused + public int maxrate; // unused + public int eax; // unused + public int minbuf; // recommended minimum buffer length in ms + public int dsver; // DirectSound version + public int latency; // average delay (in ms) before start of playback + public int initflags; // BASS_Init "flags" parameter + public int speakers; // number of speakers available + public int freq; // current output rate + } + + // Recording device info structure + @Structure.FieldOrder({"flags", "formats", "inputs", "singlein", "freq"}) + class BASS_RECORDINFO extends Structure { + public int flags; // device capabilities (DSCCAPS_xxx flags) + public int formats; // supported standard formats (WAVE_FORMAT_xxx flags) + public int inputs; // number of inputs + public boolean singlein; // TRUE = only 1 input can be set at a time + public int freq; // current input rate + } + + // Sample info structure + @Structure.FieldOrder({"freq", "chans", "flags", "length", "max", "origres", "chans", "mingap", "mode3d", "mindist", "maxdist", "iangle", "oangle", "outvol", "vam", "priority"}) + class BASS_SAMPLE extends Structure { + public int freq; // default playback rate + public float volume; // default volume (0-1) + public float pan; // default pan (-1=left, 0=middle, 1=right) + public int flags; // BASS_SAMPLE_xxx flags + public int length; // length (in bytes) + public int max; // maximum simultaneous playbacks + public int origres; // original resolution bits + public int chans; // number of channels + public int mingap; // minimum gap (ms) between creating channels + public int mode3d; // BASS_3DMODE_xxx mode + public float mindist; // minimum distance + public float maxdist; // maximum distance + public int iangle; // angle of inside projection cone + public int oangle; // angle of outside projection cone + public float outvol; // delta-volume outside the projection cone + public int vam; // unused + public int priority; // unused + } + + int BASS_SAMPLE_8BITS = 1; // 8 bit + int BASS_SAMPLE_FLOAT = 256; // 32-bit floating-point + int BASS_SAMPLE_MONO = 2; // mono + int BASS_SAMPLE_LOOP = 4; // looped + int BASS_SAMPLE_3D = 8; // 3D functionality + int BASS_SAMPLE_SOFTWARE = 16; // unused + int BASS_SAMPLE_MUTEMAX = 32; // mute at max distance (3D only) + int BASS_SAMPLE_VAM = 64; // unused + int BASS_SAMPLE_FX = 128; // unused + int BASS_SAMPLE_OVER_VOL = 0x10000; // override lowest volume + int BASS_SAMPLE_OVER_POS = 0x20000; // override longest playing + int BASS_SAMPLE_OVER_DIST = 0x30000; // override furthest from listener (3D only) + + int BASS_STREAM_PRESCAN = 0x20000; // scan file for accurate seeking and length + int BASS_STREAM_AUTOFREE = 0x40000; // automatically free the stream when it stops/ends + int BASS_STREAM_RESTRATE = 0x80000; // restrict the download rate of internet file streams + int BASS_STREAM_BLOCK = 0x100000; // download/play internet file stream in small blocks + int BASS_STREAM_DECODE = 0x200000; // don't play the stream, only decode (BASS_ChannelGetData) + int BASS_STREAM_STATUS = 0x800000; // give server status info (HTTP/ICY tags) in DOWNLOADPROC + + int BASS_MP3_IGNOREDELAY = 0x200; // ignore LAME/Xing/VBRI/iTunes delay & padding info + int BASS_MP3_SETPOS = BASS_STREAM_PRESCAN; + + int BASS_MUSIC_FLOAT = BASS_SAMPLE_FLOAT; + int BASS_MUSIC_MONO = BASS_SAMPLE_MONO; + int BASS_MUSIC_LOOP = BASS_SAMPLE_LOOP; + int BASS_MUSIC_3D = BASS_SAMPLE_3D; + int BASS_MUSIC_FX = BASS_SAMPLE_FX; + int BASS_MUSIC_AUTOFREE = BASS_STREAM_AUTOFREE; + int BASS_MUSIC_DECODE = BASS_STREAM_DECODE; + int BASS_MUSIC_PRESCAN = BASS_STREAM_PRESCAN; // calculate playback length + int BASS_MUSIC_CALCLEN = BASS_MUSIC_PRESCAN; + int BASS_MUSIC_RAMP = 0x200; // normal ramping + int BASS_MUSIC_RAMPS = 0x400; // sensitive ramping + int BASS_MUSIC_SURROUND = 0x800; // surround sound + int BASS_MUSIC_SURROUND2 = 0x1000; // surround sound (mode 2) + int BASS_MUSIC_FT2PAN = 0x2000; // apply FastTracker 2 panning to XM files + int BASS_MUSIC_FT2MOD = 0x2000; // play .MOD as FastTracker 2 does + int BASS_MUSIC_PT1MOD = 0x4000; // play .MOD as ProTracker 1 does + int BASS_MUSIC_NONINTER = 0x10000; // non-interpolated sample mixing + int BASS_MUSIC_SINCINTER = 0x800000; // sinc interpolated sample mixing + int BASS_MUSIC_POSRESET = 0x8000; // stop all notes when moving position + int BASS_MUSIC_POSRESETEX = 0x400000; // stop all notes and reset bmp/etc when moving position + int BASS_MUSIC_STOPBACK = 0x80000; // stop the music on a backwards jump effect + int BASS_MUSIC_NOSAMPLE = 0x100000; // don't load the samples + + // Speaker assignment flags + int BASS_SPEAKER_FRONT = 0x1000000; // front speakers + int BASS_SPEAKER_REAR = 0x2000000; // rear speakers + int BASS_SPEAKER_CENLFE = 0x3000000; // center & LFE speakers (5.1) + int BASS_SPEAKER_SIDE = 0x4000000; // side speakers (7.1) + static int BASS_SPEAKER_N(int n) { return n<<24; } // n'th pair of speakers (max 15) + int BASS_SPEAKER_LEFT = 0x10000000; // modifier: left + int BASS_SPEAKER_RIGHT = 0x20000000; // modifier: right + int BASS_SPEAKER_FRONTLEFT = BASS_SPEAKER_FRONT | BASS_SPEAKER_LEFT; + int BASS_SPEAKER_FRONTRIGHT = BASS_SPEAKER_FRONT | BASS_SPEAKER_RIGHT; + int BASS_SPEAKER_REARLEFT = BASS_SPEAKER_REAR | BASS_SPEAKER_LEFT; + int BASS_SPEAKER_REARRIGHT = BASS_SPEAKER_REAR | BASS_SPEAKER_RIGHT; + int BASS_SPEAKER_CENTER = BASS_SPEAKER_CENLFE | BASS_SPEAKER_LEFT; + int BASS_SPEAKER_LFE = BASS_SPEAKER_CENLFE | BASS_SPEAKER_RIGHT; + int BASS_SPEAKER_SIDELEFT = BASS_SPEAKER_SIDE | BASS_SPEAKER_LEFT; + int BASS_SPEAKER_SIDERIGHT = BASS_SPEAKER_SIDE | BASS_SPEAKER_RIGHT; + int BASS_SPEAKER_REAR2 = BASS_SPEAKER_SIDE; + int BASS_SPEAKER_REAR2LEFT = BASS_SPEAKER_SIDELEFT; + int BASS_SPEAKER_REAR2RIGHT = BASS_SPEAKER_SIDERIGHT; + + int BASS_ASYNCFILE = 0x40000000; // read file asynchronously + + int BASS_RECORD_PAUSE = 0x8000; // start recording paused + + // Channel info structure + @Structure.FieldOrder({"freq", "chans", "flags", "ctype", "origres", "plugin", "sample", "filename"}) + class BASS_CHANNELINFO extends Structure { + public int freq; // default playback rate + public int chans; // channels + public int flags; + public int ctype; // type of channel + public int origres; // original resolution + public int plugin; + public int sample; + public String filename; + } + + int BASS_ORIGRES_FLOAT = 0x10000; + + // BASS_CHANNELINFO types + int BASS_CTYPE_SAMPLE = 1; + int BASS_CTYPE_RECORD = 2; + int BASS_CTYPE_STREAM = 0x10000; + int BASS_CTYPE_STREAM_VORBIS = 0x10002; + int BASS_CTYPE_STREAM_OGG = 0x10002; + int BASS_CTYPE_STREAM_MP1 = 0x10003; + int BASS_CTYPE_STREAM_MP2 = 0x10004; + int BASS_CTYPE_STREAM_MP3 = 0x10005; + int BASS_CTYPE_STREAM_AIFF = 0x10006; + int BASS_CTYPE_STREAM_CA = 0x10007; + int BASS_CTYPE_STREAM_MF = 0x10008; + int BASS_CTYPE_STREAM_AM = 0x10009; + int BASS_CTYPE_STREAM_SAMPLE = 0x1000a; + int BASS_CTYPE_STREAM_DUMMY = 0x18000; + int BASS_CTYPE_STREAM_DEVICE = 0x18001; + int BASS_CTYPE_STREAM_WAV = 0x40000; // WAVE flag (LOWORD=codec) + int BASS_CTYPE_STREAM_WAV_PCM = 0x50001; + int BASS_CTYPE_STREAM_WAV_FLOAT = 0x50003; + int BASS_CTYPE_MUSIC_MOD = 0x20000; + int BASS_CTYPE_MUSIC_MTM = 0x20001; + int BASS_CTYPE_MUSIC_S3M = 0x20002; + int BASS_CTYPE_MUSIC_XM = 0x20003; + int BASS_CTYPE_MUSIC_IT = 0x20004; + int BASS_CTYPE_MUSIC_MO3 = 0x00100; // MO3 flag + + @Structure.FieldOrder({"ctype", "name", "exts"}) + class BASS_PLUGINFORM extends Structure { + int ctype; // channel type + String name; // format description + String exts; // file extension filter (*.ext1;*.ext2;etc...) + } + + @Structure.FieldOrder({"version", "formatc", "formats"}) + class BASS_PLUGININFO extends Structure { + int version; // version (same form as BASS_GetVersion) + int formatc; // number of formats + BASS_PLUGINFORM[] formats; // the array of formats + } + + // 3D vector (for 3D positions/velocities/orientations) + class BASS_3DVECTOR { + BASS_3DVECTOR() {} + BASS_3DVECTOR(float _x, float _y, float _z) { x=_x; y=_y; z=_z; } + float x; // +=right, -=left + float y; // +=up, -=down + float z; // +=front, -=behind + } + + // 3D channel modes + int BASS_3DMODE_NORMAL = 0; // normal 3D processing + int BASS_3DMODE_RELATIVE = 1; // position is relative to the listener + int BASS_3DMODE_OFF = 2; // no 3D processing + + // software 3D mixing algorithms (used with BASS_CONFIG_3DALGORITHM) + int BASS_3DALG_DEFAULT = 0; + int BASS_3DALG_OFF = 1; + int BASS_3DALG_FULL = 2; + int BASS_3DALG_LIGHT = 3; + + // BASS_SampleGetChannel flags + int BASS_SAMCHAN_NEW = 1; // get a new playback channel + int BASS_SAMCHAN_STREAM = 2; // create a stream + + interface STREAMPROC extends Callback + { + int STREAMPROC(int handle, Pointer buffer, int length, Pointer user); + /* User stream callback function. + handle : The stream that needs writing + buffer : Buffer to write the samples in + length : Number of bytes to write + user : The 'user' parameter value given when calling BASS_StreamCreate + RETURN : Number of bytes written. Set the BASS_STREAMPROC_END flag to end + the stream. */ + } + + int BASS_STREAMPROC_END = 0x80000000; // end of user stream flag + + // Special STREAMPROCs + int STREAMPROC_DUMMY = 0; // "dummy" stream + int STREAMPROC_PUSH = -1; // push stream + int STREAMPROC_DEVICE = -2; // device mix stream + int STREAMPROC_DEVICE_3D = -3; // device 3D mix stream + + // BASS_StreamCreateFileUser file systems + int STREAMFILE_NOBUFFER = 0; + int STREAMFILE_BUFFER = 1; + int STREAMFILE_BUFFERPUSH = 2; + + interface BASS_FILEPROCS extends Callback + { + // User file stream callback functions + void FILECLOSEPROC(Pointer user); + long FILELENPROC(Pointer user) ; + int FILEREADPROC(Pointer buffer, int length, Pointer user); + boolean FILESEEKPROC(long offset, Pointer user); + } + + // BASS_StreamPutFileData options + int BASS_FILEDATA_END = 0; // end & close the file + + // BASS_StreamGetFilePosition modes + int BASS_FILEPOS_CURRENT = 0; + int BASS_FILEPOS_DECODE = BASS_FILEPOS_CURRENT; + int BASS_FILEPOS_DOWNLOAD = 1; + int BASS_FILEPOS_END = 2; + int BASS_FILEPOS_START = 3; + int BASS_FILEPOS_CONNECTED = 4; + int BASS_FILEPOS_BUFFER = 5; + int BASS_FILEPOS_SOCKET = 6; + int BASS_FILEPOS_ASYNCBUF = 7; + int BASS_FILEPOS_SIZE = 8; + int BASS_FILEPOS_BUFFERING = 9; + int BASS_FILEPOS_AVAILABLE = 10; + + interface DOWNLOADPROC extends Callback + { + void DOWNLOADPROC(Pointer buffer, int length, Pointer user); + /* Internet stream download callback function. + buffer : Buffer containing the downloaded data... NULL=end of download + length : Number of bytes in the buffer + user : The 'user' parameter value given when calling BASS_StreamCreateURL */ + } + + // BASS_ChannelSetSync types + int BASS_SYNC_POS = 0; + int BASS_SYNC_END = 2; + int BASS_SYNC_META = 4; + int BASS_SYNC_SLIDE = 5; + int BASS_SYNC_STALL = 6; + int BASS_SYNC_DOWNLOAD = 7; + int BASS_SYNC_FREE = 8; + int BASS_SYNC_SETPOS = 11; + int BASS_SYNC_MUSICPOS = 10; + int BASS_SYNC_MUSICINST = 1; + int BASS_SYNC_MUSICFX = 3; + int BASS_SYNC_OGG_CHANGE = 12; + int BASS_SYNC_DEV_FAIL = 14; + int BASS_SYNC_DEV_FORMAT = 15; + int BASS_SYNC_THREAD = 0x20000000; // flag: call sync in other thread + int BASS_SYNC_MIXTIME = 0x40000000; // flag: sync at mixtime, else at playtime + int BASS_SYNC_ONETIME = 0x80000000; // flag: sync only once, else continuously + + interface SYNCPROC extends Callback + { + void SYNCPROC(int handle, int channel, int data, Pointer user); + /* Sync callback function. + handle : The sync that has occured + channel: Channel that the sync occured in + data : Additional data associated with the sync's occurance + user : The 'user' parameter given when calling BASS_ChannelSetSync */ + } + + interface DSPPROC extends Callback + { + void DSPPROC(int handle, int channel, Pointer buffer, int length, Pointer user); + /* DSP callback function. + handle : The DSP handle + channel: Channel that the DSP is being applied to + buffer : Buffer to apply the DSP to + length : Number of bytes in the buffer + user : The 'user' parameter given when calling BASS_ChannelSetDSP */ + } + + interface RECORDPROC extends Callback + { + boolean RECORDPROC(int handle, Pointer buffer, int length, Pointer user); + /* Recording callback function. + handle : The recording handle + buffer : Buffer containing the recorded sample data + length : Number of bytes + user : The 'user' parameter value given when calling BASS_RecordStart + RETURN : true = continue recording, false = stop */ + } + + // BASS_ChannelIsActive return values + int BASS_ACTIVE_STOPPED = 0; + int BASS_ACTIVE_PLAYING =1; + int BASS_ACTIVE_STALLED = 2; + int BASS_ACTIVE_PAUSED = 3; + int BASS_ACTIVE_PAUSED_DEVICE = 4; + + // Channel attributes + int BASS_ATTRIB_FREQ = 1; + int BASS_ATTRIB_VOL = 2; + int BASS_ATTRIB_PAN = 3; + int BASS_ATTRIB_EAXMIX = 4; + int BASS_ATTRIB_NOBUFFER = 5; + int BASS_ATTRIB_VBR = 6; + int BASS_ATTRIB_CPU = 7; + int BASS_ATTRIB_SRC = 8; + int BASS_ATTRIB_NET_RESUME = 9; + int BASS_ATTRIB_SCANINFO = 10; + int BASS_ATTRIB_NORAMP = 11; + int BASS_ATTRIB_BITRATE = 12; + int BASS_ATTRIB_BUFFER = 13; + int BASS_ATTRIB_GRANULE = 14; + int BASS_ATTRIB_USER = 15; + int BASS_ATTRIB_TAIL = 16; + int BASS_ATTRIB_PUSH_LIMIT = 17; + int BASS_ATTRIB_DOWNLOADPROC = 18; + int BASS_ATTRIB_VOLDSP = 19; + int BASS_ATTRIB_VOLDSP_PRIORITY = 20; + int BASS_ATTRIB_MUSIC_AMPLIFY = 0x100; + int BASS_ATTRIB_MUSIC_PANSEP = 0x101; + int BASS_ATTRIB_MUSIC_PSCALER = 0x102; + int BASS_ATTRIB_MUSIC_BPM = 0x103; + int BASS_ATTRIB_MUSIC_SPEED = 0x104; + int BASS_ATTRIB_MUSIC_VOL_GLOBAL = 0x105; + int BASS_ATTRIB_MUSIC_VOL_CHAN = 0x200; // + channel # + int BASS_ATTRIB_MUSIC_VOL_INST = 0x300; // + instrument # + + // BASS_ChannelSlideAttribute flags + int BASS_SLIDE_LOG = 0x1000000; + + // BASS_ChannelGetData flags + int BASS_DATA_AVAILABLE = 0; // query how much data is buffered + int BASS_DATA_NOREMOVE = 0x10000000; // flag: don't remove data from recording buffer + int BASS_DATA_FIXED = 0x20000000; // unused + int BASS_DATA_FLOAT = 0x40000000; // flag: return floating-point sample data + int BASS_DATA_FFT256 = 0x80000000; // 256 sample FFT + int BASS_DATA_FFT512 = 0x80000001; // 512 FFT + int BASS_DATA_FFT1024 = 0x80000002; // 1024 FFT + int BASS_DATA_FFT2048 = 0x80000003; // 2048 FFT + int BASS_DATA_FFT4096 = 0x80000004; // 4096 FFT + int BASS_DATA_FFT8192 = 0x80000005; // 8192 FFT + int BASS_DATA_FFT16384 = 0x80000006; // 16384 FFT + int BASS_DATA_FFT32768 = 0x80000007; // 32768 FFT + int BASS_DATA_FFT_INDIVIDUAL = 0x10; // FFT flag: FFT for each channel, else all combined + int BASS_DATA_FFT_NOWINDOW = 0x20; // FFT flag: no Hanning window + int BASS_DATA_FFT_REMOVEDC = 0x40; // FFT flag: pre-remove DC bias + int BASS_DATA_FFT_COMPLEX = 0x80; // FFT flag: return complex data + int BASS_DATA_FFT_NYQUIST = 0x100; // FFT flag: return extra Nyquist value + + // BASS_ChannelGetLevelEx flags + int BASS_LEVEL_MONO = 1; // get mono level + int BASS_LEVEL_STEREO = 2; // get stereo level + int BASS_LEVEL_RMS = 4; // get RMS levels + int BASS_LEVEL_VOLPAN = 8; // apply VOL/PAN attributes to the levels + int BASS_LEVEL_NOREMOVE = 16; // don't remove data from recording buffer + + // BASS_ChannelGetTags types : what's returned + int BASS_TAG_ID3 = 0; // ID3v1 tags : TAG_ID3 + int BASS_TAG_ID3V2 = 1; // ID3v2 tags : ByteBuffer + int BASS_TAG_OGG = 2; // OGG comments : String array + int BASS_TAG_HTTP = 3; // HTTP headers : String array + int BASS_TAG_ICY = 4; // ICY headers : String array + int BASS_TAG_META = 5; // ICY metadata : String + int BASS_TAG_APE = 6; // APE tags : String array + int BASS_TAG_MP4 = 7; // MP4/iTunes metadata : String array + int BASS_TAG_VENDOR = 9; // OGG encoder : String + int BASS_TAG_LYRICS3 = 10; // Lyric3v2 tag : String + int BASS_TAG_WAVEFORMAT = 14; // WAVE format : ByteBuffer containing WAVEFORMATEEX structure + int BASS_TAG_AM_NAME = 16; // Android Media codec name : String + int BASS_TAG_ID3V2_2 = 17; // ID3v2 tags (2nd block) : ByteBuffer + int BASS_TAG_AM_MIME = 18; // Android Media MIME type : String + int BASS_TAG_LOCATION = 19; // redirected URL : String + int BASS_TAG_RIFF_INFO = 0x100; // RIFF "INFO" tags : String array + int BASS_TAG_RIFF_BEXT = 0x101; // RIFF/BWF "bext" tags : TAG_BEXT + int BASS_TAG_RIFF_CART = 0x102; // RIFF/BWF "cart" tags : TAG_CART + int BASS_TAG_RIFF_DISP = 0x103; // RIFF "DISP" text tag : String + int BASS_TAG_RIFF_CUE = 0x104; // RIFF "cue " chunk : TAG_CUE structure + int BASS_TAG_RIFF_SMPL = 0x105; // RIFF "smpl" chunk : TAG_SMPL structure + int BASS_TAG_APE_BINARY = 0x1000; // + index #, binary APE tag : TAG_APE_BINARY + int BASS_TAG_MUSIC_NAME = 0x10000; // MOD music name : String + int BASS_TAG_MUSIC_MESSAGE = 0x10001; // MOD message : String + int BASS_TAG_MUSIC_ORDERS = 0x10002; // MOD order list : ByteBuffer + int BASS_TAG_MUSIC_AUTH = 0x10003; // MOD author : UTF-8 string + int BASS_TAG_MUSIC_INST = 0x10100; // + instrument #, MOD instrument name : String + int BASS_TAG_MUSIC_CHAN = 0x10200; // + channel #, MOD channel name : String + int BASS_TAG_MUSIC_SAMPLE = 0x10300; // + sample #, MOD sample name : String + int BASS_TAG_BYTEBUFFER = 0x10000000; // flag: return a ByteBuffer instead of a String or TAG_ID3 + + // ID3v1 tag structure + @Structure.FieldOrder({"id", "title", "artist", "album", "year", "comment", "genre", "track"}) + class TAG_ID3 extends Structure { + String id; + String title; + String artist; + String album; + String year; + String comment; + byte genre; + byte track; + } + + // Binary APE tag structure + @Structure.FieldOrder({"key", "data", "length"}) + class TAG_APE_BINARY extends Structure { + String key; + Pointer data; + int length; + } + + // BASS_ChannelGetLength/GetPosition/SetPosition modes + int BASS_POS_BYTE = 0; // byte position + int BASS_POS_MUSIC_ORDER = 1; // order.row position, MAKELONG(order,row) + int BASS_POS_OGG = 3; // OGG bitstream number + int BASS_POS_END = 0x10; // trimmed end position + int BASS_POS_LOOP = 0x11; // loop start positiom + int BASS_POS_FLUSH = 0x1000000; // flag: flush decoder/FX buffers + int BASS_POS_RESET = 0x2000000; // flag: reset user file buffers + int BASS_POS_RELATIVE = 0x4000000; // flag: seek relative to the current position + int BASS_POS_INEXACT = 0x8000000; // flag: allow seeking to inexact position + int BASS_POS_DECODE = 0x10000000; // flag: get the decoding (not playing) position + int BASS_POS_DECODETO = 0x20000000; // flag: decode to the position instead of seeking + int BASS_POS_SCAN = 0x40000000; // flag: scan to the position + + // BASS_ChannelSetDevice/GetDevice option + int BASS_NODEVICE = 0x20000; + + // BASS_RecordSetInput flags + int BASS_INPUT_OFF = 0x10000; + int BASS_INPUT_ON = 0x20000; + int BASS_INPUT_TYPE_MASK = 0xff000000; + int BASS_INPUT_TYPE_UNDEF=0x00000000; + int BASS_INPUT_TYPE_DIGITAL=0x01000000; + int BASS_INPUT_TYPE_LINE=0x02000000; + int BASS_INPUT_TYPE_MIC=0x03000000; + int BASS_INPUT_TYPE_SYNTH=0x04000000; + int BASS_INPUT_TYPE_CD=0x05000000; + int BASS_INPUT_TYPE_PHONE=0x06000000; + int BASS_INPUT_TYPE_SPEAKER=0x07000000; + int BASS_INPUT_TYPE_WAVE=0x08000000; + int BASS_INPUT_TYPE_AUX=0x09000000; + int BASS_INPUT_TYPE_ANALOG=0x0a000000; + + + // DX8 effect types, use with BASS_ChannelSetFX + int BASS_FX_DX8_CHORUS = 0; + int BASS_FX_DX8_COMPRESSOR = 1; + int BASS_FX_DX8_DISTORTION = 2; + int BASS_FX_DX8_ECHO = 3; + int BASS_FX_DX8_FLANGER = 4; + int BASS_FX_DX8_GARGLE = 5; + int BASS_FX_DX8_I3DL2REVERB = 6; + int BASS_FX_DX8_PARAMEQ = 7; + int BASS_FX_DX8_REVERB = 8; + int BASS_FX_VOLUME = 9; + + @Structure.FieldOrder({"fWetDryMix", "fDepth", "fFeedback", "fFrequency", "lWaveform", "fDelay", "lPhase"}) + class BASS_DX8_CHORUS extends Structure { + float fWetDryMix; + float fDepth; + float fFeedback; + float fFrequency; + int lWaveform; // 0=triangle, 1=sine + float fDelay; + int lPhase; // BASS_DX8_PHASE_xxx + } + + @Structure.FieldOrder({"fGain","fEdge","fPostEQCenterFrequency","fPostEQBandwidth","fPreLowpassCutoff"}) + class BASS_DX8_DISTORTION extends Structure { + float fGain; + float fEdge; + float fPostEQCenterFrequency; + float fPostEQBandwidth; + float fPreLowpassCutoff; + } + + @Structure.FieldOrder({"fWetDryMix","fFeedback","fLeftDelay","fRightDelay","lPanDelay"}) + class BASS_DX8_ECHO extends Structure { + float fWetDryMix; + float fFeedback; + float fLeftDelay; + float fRightDelay; + boolean lPanDelay; + } + + @Structure.FieldOrder({"fWetDryMix","fDepth","fFeedback","fFrequency","lWaveform","fDelay","lPhase"}) + class BASS_DX8_FLANGER extends Structure { + float fWetDryMix; + float fDepth; + float fFeedback; + float fFrequency; + int lWaveform; // 0=triangle, 1=sine + float fDelay; + int lPhase; // BASS_DX8_PHASE_xxx + } + + @Structure.FieldOrder({"fCenter","fBandwidth","fGain"}) + class BASS_DX8_PARAMEQ extends Structure { + float fCenter; + float fBandwidth; + float fGain; + } + + @Structure.FieldOrder({"fInGain","fReverbMix","fReverbTime","fHighFreqRTRatio"}) + class BASS_DX8_REVERB extends Structure { + float fInGain; + float fReverbMix; + float fReverbTime; + float fHighFreqRTRatio; + } + + int BASS_DX8_PHASE_NEG_180 = 0; + int BASS_DX8_PHASE_NEG_90 = 1; + int BASS_DX8_PHASE_ZERO = 2; + int BASS_DX8_PHASE_90 = 3; + int BASS_DX8_PHASE_180 = 4; + + @Structure.FieldOrder({"fTarget","fCurrent","fTime","lCurve"}) + class BASS_FX_VOLUME_PARAM extends Structure { + float fTarget; + float fCurrent; + float fTime; + int lCurve; + } + + class FloatValue { + public float value; + } + + boolean BASS_SetConfig(int option, int value); + int BASS_GetConfig(int option); + boolean BASS_SetConfigPtr(int option, Pointer value); + Object BASS_GetConfigPtr(int option); + int BASS_GetVersion(); + int BASS_ErrorGetCode(); + boolean BASS_GetDeviceInfo(int device, BASS_DEVICEINFO info); + boolean BASS_Init(int device, int freq, int flags); + boolean BASS_Free(); + boolean BASS_SetDevice(int device); + int BASS_GetDevice(); + boolean BASS_GetInfo(BASS_INFO info); + boolean BASS_Start(); + boolean BASS_Stop(); + boolean BASS_Pause(); + int BASS_IsStarted(); + boolean BASS_Update(int length); + float BASS_GetCPU(); + boolean BASS_SetVolume(float volume); + float BASS_GetVolume(); + + boolean BASS_Set3DFactors(float distf, float rollf, float doppf); + boolean BASS_Get3DFactors(FloatValue distf, FloatValue rollf, FloatValue doppf); + boolean BASS_Set3DPosition(BASS_3DVECTOR pos, BASS_3DVECTOR vel, BASS_3DVECTOR front, BASS_3DVECTOR top); + boolean BASS_Get3DPosition(BASS_3DVECTOR pos, BASS_3DVECTOR vel, BASS_3DVECTOR front, BASS_3DVECTOR top); + void BASS_Apply3D(); + + int BASS_PluginLoad(String file, int flags); + boolean BASS_PluginFree(int handle); + boolean BASS_PluginEnable(int handle, boolean enable); + BASS_PLUGININFO BASS_PluginGetInfo(int handle); + + int BASS_SampleLoad(String file, long offset, int length, int max, int flags); + int BASS_SampleLoad(Pointer file, long offset, int length, int max, int flags); + int BASS_SampleCreate(int length, int freq, int chans, int max, int flags); + boolean BASS_SampleFree(int handle); + boolean BASS_SampleSetData(int handle, Pointer buffer); + boolean BASS_SampleGetData(int handle, Pointer buffer); + boolean BASS_SampleGetInfo(int handle, BASS_SAMPLE info); + boolean BASS_SampleSetInfo(int handle, BASS_SAMPLE info); + int BASS_SampleGetChannel(int handle, boolean onlynew); + int BASS_SampleGetChannels(int handle, int[] channels); + boolean BASS_SampleStop(int handle); + + int BASS_StreamCreate(int freq, int chans, int flags, STREAMPROC proc, Pointer user); + int BASS_StreamCreateFile(boolean mem, String file, long offset, long length, int flags); + int BASS_StreamCreateFile(Pointer file, long offset, long length, int flags); + int BASS_StreamCreateURL(String url, int offset, int flags, DOWNLOADPROC proc, Pointer user); + int BASS_StreamCreateFileUser(int system, int flags, BASS_FILEPROCS procs, Pointer user); + boolean BASS_StreamFree(int handle); + long BASS_StreamGetFilePosition(int handle, int mode); + int BASS_StreamPutData(int handle, Pointer buffer, int length); + int BASS_StreamPutFileData(int handle, Pointer buffer, int length); + + int BASS_MusicLoad(String file, long offset, int length, int flags, int freq); + int BASS_MusicLoad(Pointer file, long offset, int length, int flags, int freq); + boolean BASS_MusicFree(int handle); + + boolean BASS_RecordGetDeviceInfo(int device, BASS_DEVICEINFO info); + boolean BASS_RecordInit(int device); + boolean BASS_RecordFree(); + boolean BASS_RecordSetDevice(int device); + int BASS_RecordGetDevice(); + boolean BASS_RecordGetInfo(BASS_RECORDINFO info); + String BASS_RecordGetInputName(int input); + boolean BASS_RecordSetInput(int input, int flags, float volume); + int BASS_RecordGetInput(int input, FloatValue volume); + int BASS_RecordStart(int freq, int chans, int flags, RECORDPROC proc, Pointer user); + + double BASS_ChannelBytes2Seconds(int handle, long pos); + long BASS_ChannelSeconds2Bytes(int handle, double pos); + int BASS_ChannelGetDevice(int handle); + boolean BASS_ChannelSetDevice(int handle, int device); + int BASS_ChannelIsActive(int handle); + boolean BASS_ChannelGetInfo(int handle, BASS_CHANNELINFO info); + Object BASS_ChannelGetTags(int handle, int tags); + long BASS_ChannelFlags(int handle, int flags, int mask); + boolean BASS_ChannelLock(int handle, boolean lock); + boolean BASS_ChannelFree(int handle); + boolean BASS_ChannelPlay(int handle, boolean restart); + boolean BASS_ChannelStart(int handle); + boolean BASS_ChannelStop(int handle); + boolean BASS_ChannelPause(int handle); + boolean BASS_ChannelUpdate(int handle, int length); + boolean BASS_ChannelSetAttribute(int handle, int attrib, float value); + boolean BASS_ChannelGetAttribute(int handle, int attrib, FloatValue value); + boolean BASS_ChannelSlideAttribute(int handle, int attrib, float value, int time); + boolean BASS_ChannelIsSliding(int handle, int attrib); + boolean BASS_ChannelSetAttributeEx(int handle, int attrib, Pointer value, int size); + boolean BASS_ChannelSetAttributeDOWNLOADPROC(int handle, DOWNLOADPROC proc, Pointer user); + int BASS_ChannelGetAttributeEx(int handle, int attrib, Pointer value, int size); + boolean BASS_ChannelSet3DAttributes(int handle, int mode, float min, float max, int iangle, int oangle, float outvol); + boolean BASS_ChannelGet3DAttributes(int handle, Integer mode, FloatValue min, FloatValue max, Integer iangle, Integer oangle, FloatValue outvol); + boolean BASS_ChannelSet3DPosition(int handle, BASS_3DVECTOR pos, BASS_3DVECTOR orient, BASS_3DVECTOR vel); + boolean BASS_ChannelGet3DPosition(int handle, BASS_3DVECTOR pos, BASS_3DVECTOR orient, BASS_3DVECTOR vel); + long BASS_ChannelGetLength(int handle, int mode); + boolean BASS_ChannelSetPosition(int handle, long pos, int mode); + long BASS_ChannelGetPosition(int handle, int mode); + int BASS_ChannelGetLevel(int handle); + boolean BASS_ChannelGetLevelEx(int handle, float[] levels, float length, int flags); + int BASS_ChannelGetData(int handle, Pointer buffer, int length); + int BASS_ChannelSetSync(int handle, int type, long param, SYNCPROC proc, Pointer user); + boolean BASS_ChannelRemoveSync(int handle, int sync); + boolean BASS_ChannelSetLink(int handle, int chan); + boolean BASS_ChannelRemoveLink(int handle, int chan); + int BASS_ChannelSetDSP(int handle, DSPPROC proc, Pointer user, int priority); + boolean BASS_ChannelRemoveDSP(int handle, int dsp); + int BASS_ChannelSetFX(int handle, int type, int priority); + boolean BASS_ChannelRemoveFX(int handle, int fx); + + boolean BASS_FXSetParameters(int handle, Object params); + boolean BASS_FXGetParameters(int handle, Object params); + boolean BASS_FXSetPriority(int handle, int priority); + boolean BASS_FXReset(int handle); + // gak bisa + int BASS_StreamCreate(int freq, int chans, int flags, int proc, Pointer user); + + default String GetBassError(String function, int err) { + if (err==0) + return function+": SUCCESS"; + else if (err==BASS_ERROR_DEVICE) + return function+": Device Is Invalid"; + else if (err==BASS_ERROR_INIT) + return function+": BASS_Init/BASS_RecordInit has not been called"; + else if (err==BASS_ERROR_MEM) + return function+": Insufficient Memory"; + else if (err==BASS_ERROR_HANDLE) + return function+": Invalid Handle"; + else if (err==BASS_ERROR_NO3D) + return function+": Couldnt initialize 3D support"; + else if (err==BASS_ERROR_SPEAKER) + return function+": Specified SPEAKERS flags are invalid"; + else if (err==BASS_ERROR_UNKNOWN) { + return function+": Unknown Error "; + } + else { + StringBuilder str = new StringBuilder(); + str.append(function).append(": "); + String funct = function.trim().toLowerCase(); + switch(funct) { + case "bass_free": + if (err == BASS_ERROR_BUSY) { + return str.append("Device curently being reinitialized").toString(); + } + return str.append("Unknown error code=").append(err).toString(); + case "bass_init": + case "bass_recordinit": + switch(err) { + case BASS_ERROR_NOTAVAIL : + str.append("BASS_DEVICE_REINIT cannot be used when Device is -1. Use Real Device Number instead"); + return str.toString(); + case BASS_ERROR_ALREADY : + str.append("Device already Initialized"); + return str.toString(); + case BASS_ERROR_DRIVER : + str.append("Device Driver not available"); + return str.toString(); + case BASS_ERROR_BUSY : + str.append("Device has exclusive use from other"); + return str.toString(); + case BASS_ERROR_FORMAT : + str.append("Format invalid, Try changing Frequency parameter"); + return str.toString(); + default : + str.append("Unknown error code=").append(err); + return str.toString(); + + } + case "bass_streamcreate": + case "bass_streamcreateconst": + switch(err) { + case BASS_ERROR_NOTAVAIL : + str.append("BASS_STREAM_FREE cannot be combined with BASS_STREAM_DECODE"); + return str.toString(); + case BASS_ERROR_FORMAT : + str.append("Sample format is not supported"); + return str.toString(); + case BASS_ERROR_SPEAKER : + str.append("Specified Speaker Flag are invalid"); + return str.toString(); + default : + str.append("Unknown error code=").append(err); + return str.toString(); + } + case "bass_streamcreatefile" : + switch(err) { + case BASS_ERROR_NOTAVAIL : + str.append("BASS_STREAM_AUTOFREE cannot be combined with BASS_STREAM_DECODE"); + return str.toString(); + case BASS_ERROR_ILLPARAM : + str.append("Length must be specified when streaming from memory"); + return str.toString(); + case BASS_ERROR_FILEOPEN: + str.append("File Cant be opened"); + return str.toString(); + case BASS_ERROR_FILEFORM: + str.append("File Format not recognized"); + return str.toString(); + case BASS_ERROR_NOTAUDIO: + str.append("File doesnt contain audio, or contain video but video is disabled"); + return str.toString(); + case BASS_ERROR_CODEC: + str.append("File use a codec that is not supported"); + return str.toString(); + case BASS_ERROR_FORMAT: + str.append("Sample Format is not supported"); + return str.toString(); + case BASS_ERROR_SPEAKER: + str.append("Specified SPEAKER flag is invalid"); + return str.toString(); + default: + str.append("Unknown error code=").append(err); + return str.toString(); + } + case "bass_channelgetdata": + switch(err) { + case BASS_ERROR_ENDED : + return str.append("Channel has reached the end").toString(); + + case BASS_ERROR_NOTAVAIL: + return str.append("BASS_DATA_AVAILABLE cant be use with decoding channel, or Not Possible to get Data from final output mix stream using STREAMPROC_DEVICE").toString(); + + case BASS_ERROR_ILLPARAM: + return str.append("invalid flags were used").toString(); + + default: + return str.append("Unknown error code=").append(err).toString(); + + } + case "bass_mixer_streamcreate": + switch(err) { + case BASS_ERROR_NOTAVAIL: + return str.append("BASS_STREAM_AUTOFREE cannot be combined with BASS_STREAM_DECODE").toString(); + + case BASS_ERROR_FORMAT: + return str.append("Sample format is not supported").toString(); + + default: + return str.append("Unknown error code=").append(err).toString(); + + } + case "bass_mixer_streamaddchannel": + switch(err) { + case BASS_ERROR_DECODE: + return str.append("Source is not decoding channel").toString(); + + case BASS_ERROR_ALREADY: + return str.append("Source already added to a mixer").toString(); + + default: + return str.append("Unknown error code=").append(err).toString(); + + } + case "bass_streamfree": + case "bass_channelfree": + if (err == BASS_ERROR_NOTAVAIL) { + return str.append("Device Streams STREAMPROC_DEVICE cannot be freed").toString(); + } + return str.append("Unknown error code=").append(err).toString(); + case "bass_channelstart": + case "bass_channelplay": + switch(err) { + case BASS_ERROR_DECODE: + return str.append("Handle is Decoding Channel, cant be played").toString(); + + case BASS_ERROR_START: + return str.append("Output is paused/stopped").toString(); + default: + return str.append("Unknown error code=").append(err).toString(); + } + case "bass_channelsetdsp": + if (err == BASS_ERROR_ILLPARAM) { + return str.append("DSPPROC cant NULL").toString(); + } + return str.append("Unknown error code=").append(err).toString(); + case "bass_channelsetattribute": + switch(err) { + case BASS_ERROR_ILLTYPE: + return str.append("Attribute Not Valid").toString(); + case BASS_ERROR_ILLPARAM : + return str.append("Valud not valid").toString(); + default: + return str.append("Unknown error code=").append(err).toString(); + } + case "bass_channelgetattribute": + switch(err) { + case BASS_ERROR_NOTAVAIL: + return str.append("Attribute Not Available").toString(); + case BASS_ERROR_ILLTYPE: + return str.append("Attribute Not Valid").toString(); + default: + return str.append("Unknown error code=").append(err).toString(); + } + case "bass_setvolume": + case "bass_getvolume": + switch(err) { + case BASS_ERROR_NOTAVAIL: + return str.append("No Volume Control for No-Sound device").toString(); + case BASS_ERROR_ILLPARAM: + return str.append("Volume is invalid").toString(); + default: + return str.append("Unknown error code=").append(err).toString(); + } + case "bass_recordgetdeviceinfo": + if (err == BASS_ERROR_DX) { + return str.append("DirectX not installed").toString(); + } + return str.append("Unknown error code=").append(err).toString(); + case "bass_recordgetinputname": + switch(err) { + case BASS_ERROR_ILLPARAM: + return str.append("Input is Invalid").toString(); + case BASS_ERROR_NOTAVAIL: + return str.append("Master Input is not available").toString(); + default: + return str.append("Unknown error code=").append(err).toString(); + } + case "bass_recordstart": + switch(err) { + case BASS_ERROR_BUSY: + return str.append("Device is Busy. Another Recording need to be stopped before starting another one").toString(); + case BASS_ERROR_DENIED: + return str.append("Recording permission denied").toString(); + case BASS_ERROR_FORMAT: + return str.append("Sample format is not supported").toString(); + default: + return str.append("Unknown error code=").append(err).toString(); + } + case "bass_recordsetinput": + case "bass_recordgetinput": + switch(err) { + case BASS_ERROR_ILLPARAM : + return str.append("Input or Volume is invalid").toString(); + case BASS_ERROR_NOTAVAIL: + return str.append("Input doesnt have volume control").toString(); + default: + return str.append("Unknown error code=").append(err).toString(); + } + case "bass_pluginload": + switch(err) { + case BASS_ERROR_FILEOPEN: + return str.append("Plugin could not be opened").toString(); + case BASS_ERROR_FILEFORM: + return str.append("File is not plugin").toString(); + case BASS_ERROR_VERSION: + return str.append("Plugin version mismatch").toString(); + case BASS_ERROR_ALREADY: + return str.append("Plugin already loaded").toString(); + } + case "bass_encode_aac_start": + case "bass_encode_mp3_start": + case "bass_encode_ogg_start": + case "bass_encode_flac_start": + case "bass_encode_aac_startfile": + case "bass_encode_mp3_startfile": + case "bass_encode_ogg_startfile": + case "bass_encode_flac_startfile": + switch(err) { + case BASS_ERROR_FORMAT: + return str.append("Format not supported").toString(); + case BASS_ERROR_ILLPARAM: + return str.append("options contains invalid setting").toString(); + case BASS_ERROR_FILEOPEN: + return str.append("File could not be opened").toString(); + case BASS_ERROR_FILEFORM: + return str.append("File Format invalid").toString(); + case BASS_ERROR_NOTAVAIL: + return str.append("Function not available without FPU").toString(); + case BASS_ERROR_CREATE: + return str.append("Target file could not be created").toString(); + default : + return str.append("Unknown error code=").append(err).toString(); + } + case "bass_streamputdata": + switch(err) { + case BASS_ERROR_NOTAVAIL : + str.append("Stream is not using push system"); + return str.toString(); + case BASS_ERROR_ILLPARAM: + str.append("Length is not valid"); + return str.toString(); + case BASS_ERROR_ENDED: + str.append("Stream has ended"); + return str.toString(); + default: + str.append("Unknown error code = ").append(err); + return str.toString(); + } + default : + return "GetBassError not implemented at "+function; + } + } + } + + /** + * Get Bass error in String + * @param function function name + * @return reason of error in string + */ + default String GetBassError(String function) { + return GetBassError(function, Instance.BASS_ErrorGetCode()); + + } + +} diff --git a/src/Audio/BassAAC.java b/src/Audio/BassAAC.java new file mode 100644 index 0000000..ba0f003 --- /dev/null +++ b/src/Audio/BassAAC.java @@ -0,0 +1,45 @@ +package Audio; + +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.Pointer; + +import Audio.Bass.BASS_FILEPROCS; +import Audio.Bass.DOWNLOADPROC; + +/** + * BASS AAC Library + * @author rdkartono + * + */ +@SuppressWarnings("unused") +public interface BassAAC extends Library { + + BassAAC Instance = (BassAAC) Native.load("bass_aac",BassAAC.class); + interface Constant{ + // additional error codes returned by BASS_ErrorGetCode + int BASS_ERROR_MP4_NOSTREAM = 6000; // non-streamable due to MP4 atom order ("mdat" before "moov") + + // Additional BASS_SetConfig options + int BASS_CONFIG_MP4_VIDEO = 0x10700; // play the audio from MP4 videos + int BASS_CONFIG_AAC_MP4 = 0x10701; // support MP4 in BASS_AAC_StreamCreateXXX functions (no need for BASS_MP4_StreamCreateXXX) + int BASS_CONFIG_AAC_PRESCAN = 0x10702; // pre-scan ADTS AAC files for seek points and accurate length + + // Additional BASS_AAC_StreamCreateFile/etc flags + int BASS_AAC_FRAME960 = 0x1000; // 960 samples per frame + int BASS_AAC_STEREO = 0x400000; // downmatrix to stereo + + // BASS_CHANNELINFO type + int BASS_CTYPE_STREAM_AAC = 0x10b00; // AAC + int BASS_CTYPE_STREAM_MP4 = 0x10b01; // AAC in MP4 + } + + + int BASS_AAC_StreamCreateFile(String file, long offset, long length, int flags); + int BASS_AAC_StreamCreateFile(Pointer file, long offset, long length, int flags); + int BASS_AAC_StreamCreateURL(String url, int offset, int flags, DOWNLOADPROC proc, Pointer user); + int BASS_AAC_StreamCreateFileUser(int system, int flags, BASS_FILEPROCS procs, Pointer user); + int BASS_MP4_StreamCreateFile(String file, long offset, long length, int flags); + int BASS_MP4_StreamCreateFile(Pointer file, long offset, long length, int flags); + int BASS_MP4_StreamCreateFileUser(int system, int flags, BASS_FILEPROCS procs, Pointer user); +} diff --git a/src/Audio/BassEnc.java b/src/Audio/BassEnc.java new file mode 100644 index 0000000..e745b4c --- /dev/null +++ b/src/Audio/BassEnc.java @@ -0,0 +1,173 @@ +package Audio; +import com.sun.jna.Callback; +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.Pointer; + +/** + * BASS Encoder Library + * @author rdkartono + * + */ +@SuppressWarnings("unused") +interface BassEnc extends Library { + BassEnc Instance = (BassEnc) Native.load("bassenc", BassEnc.class); + + interface ENCODEPROC extends Callback + { + void ENCODEPROC(int handle, int channel, Pointer buffer, int length, Pointer user); + /* Encoding callback function. + handle : The encoder + channel: The channel handle + buffer : Buffer containing the encoded data + length : Number of bytes + user : The 'user' parameter value given when starting the encoder */ + } + + interface ENCODEPROCEX extends Callback + { + void ENCODEPROCEX(int handle, int channel, Pointer buffer, int length, long offset, Pointer user); + /* Encoding callback function. + handle : The encoder + channel: The channel handle + buffer : Buffer containing the encoded data + length : Number of bytes + offset : File offset of the data + user : The 'user' parameter value given when starting the encoder */ + } + + interface ENCODERPROC extends Callback + { + int ENCODERPROC(int handle, int channel, Pointer buffer, int length, int maxout, Pointer user); + /* Encoder callback function. + handle : The encoder + channel: The channel handle + buffer : Buffer containing the PCM data (input) and receiving the encoded data (output) + length : Number of bytes in (-1=closing) + maxout : Maximum number of bytes out + user : The 'user' parameter value given when calling BASS_Encode_StartUser + RETURN : The amount of encoded data (-1=stop) */ + } + + interface ENCODECLIENTPROC extends Callback + { + boolean ENCODECLIENTPROC(int handle, boolean connect, String client, StringBuffer headers, Pointer user); + /* Client connection notification callback function. + handle : The encoder + connect: true/false=client is connecting/disconnecting + client : The client's address (xxx.xxx.xxx.xxx:port) + headers: Request headers (optionally response headers on return) + user : The 'user' parameter value given when calling BASS_Encode_ServerInit + RETURN : true/false=accept/reject connection (ignored if connect=false) */ + } + + interface ENCODENOTIFYPROC extends Callback + { + void ENCODENOTIFYPROC(int handle, int status, Pointer user); + /* Encoder death notification callback function. + handle : The encoder + status : Notification (BASS_ENCODE_NOTIFY_xxx) + user : The 'user' parameter value given when calling BASS_Encode_SetNotify */ + } + + + int BASS_Encode_GetVersion(); + + int BASS_Encode_Start(int handle, String cmdline, int flags, ENCODEPROC proc, Pointer user); + int BASS_Encode_StartLimit(int handle, String cmdline, int flags, ENCODEPROC proc, Pointer user, int limit); + int BASS_Encode_StartUser(int handle, String file, int flags, ENCODERPROC proc, Pointer user); + boolean BASS_Encode_AddChunk(int handle, String id, Pointer buffer, int length); + boolean BASS_Encode_Write(int handle, Pointer buffer, int length); + boolean BASS_Encode_Stop(int handle); + boolean BASS_Encode_StopEx(int handle, boolean queue); + boolean BASS_Encode_SetPaused(int handle, boolean paused); + int BASS_Encode_IsActive(int handle); + boolean BASS_Encode_SetNotify(int handle, ENCODENOTIFYPROC proc, Pointer user); + long BASS_Encode_GetCount(int handle, int count); + boolean BASS_Encode_SetChannel(int handle, int channel); + int BASS_Encode_GetChannel(int handle); + boolean BASS_Encode_UserOutput(int handle, long offset, Pointer buffer, int length); + + boolean BASS_Encode_CastInit(int handle, String server, String pass, String content, String name, String url, String genre, String desc, String headers, int bitrate, int flags); + boolean BASS_Encode_CastSetTitle(int handle, String title, String url); + boolean BASS_Encode_CastSendMeta(int handle, int type, Pointer data, int length); + String BASS_Encode_CastGetStats(int handle, int type, String pass); + + int BASS_Encode_ServerInit(int handle, String port, int buffer, int burst, int flags, ENCODECLIENTPROC proc, Pointer user); + boolean BASS_Encode_ServerKick(int handle, String client); + + interface Constant{ + // Additional error codes returned by BASS_ErrorGetCode + int BASS_ERROR_CAST_DENIED = 2100; // access denied (invalid password) + int BASS_ERROR_SERVER_CERT = 2101; // missing/invalid certificate + + // Additional BASS_SetConfig options + int BASS_CONFIG_ENCODE_PRIORITY = 0x10300; + int BASS_CONFIG_ENCODE_QUEUE = 0x10301; + int BASS_CONFIG_ENCODE_CAST_TIMEOUT = 0x10310; + + // Additional BASS_SetConfigPtr options + int BASS_CONFIG_ENCODE_CAST_PROXY = 0x10311; + int BASS_CONFIG_ENCODE_CAST_BIND = 0x10312; + int BASS_CONFIG_ENCODE_SERVER_CERT = 0x10320; + int BASS_CONFIG_ENCODE_SERVER_KEY = 0x10321; + + // BASS_Encode_Start flags + int BASS_ENCODE_NOHEAD = 1; // don't send a WAV header to the encoder + int BASS_ENCODE_FP_8BIT = 2; // convert floating-point sample data to 8-bit integer + int BASS_ENCODE_FP_16BIT = 4; // convert floating-point sample data to 16-bit integer + int BASS_ENCODE_FP_24BIT = 6; // convert floating-point sample data to 24-bit integer + int BASS_ENCODE_FP_32BIT = 8; // convert floating-point sample data to 32-bit integer + int BASS_ENCODE_FP_AUTO = 14; // convert floating-point sample data back to channel's format + int BASS_ENCODE_BIGEND = 16; // big-endian sample data + int BASS_ENCODE_PAUSE = 32; // start encording paused + int BASS_ENCODE_PCM = 64; // write PCM sample data (no encoder) + int BASS_ENCODE_RF64 = 128; // send an RF64 header + int BASS_ENCODE_QUEUE = 0x200; // queue data to feed encoder asynchronously + int BASS_ENCODE_WFEXT = 0x400; // WAVEFORMATEXTENSIBLE "fmt" chunk + int BASS_ENCODE_CAST_NOLIMIT = 0x1000; // don't limit casting data rate + int BASS_ENCODE_LIMIT = 0x2000; // limit data rate to real-time + int BASS_ENCODE_AIFF = 0x4000; // send an AIFF header rather than WAV + int BASS_ENCODE_DITHER = 0x8000; // apply dither when converting floating-point sample data to integer + int BASS_ENCODE_AUTOFREE = 0x40000; // free the encoder when the channel is freed + + // BASS_Encode_GetCount counts + int BASS_ENCODE_COUNT_IN = 0; // sent to encoder + int BASS_ENCODE_COUNT_OUT = 1; // received from encoder + int BASS_ENCODE_COUNT_CAST = 2; // sent to cast server + int BASS_ENCODE_COUNT_QUEUE = 3; // queued + int BASS_ENCODE_COUNT_QUEUE_LIMIT = 4; // queue limit + int BASS_ENCODE_COUNT_QUEUE_FAIL = 5; // failed to queue + int BASS_ENCODE_COUNT_IN_FP = 6; // sent to encoder before floating-point conversion + + // BASS_Encode_CastInit content MIME types + String BASS_ENCODE_TYPE_MP3 = "audio/mpeg"; + String BASS_ENCODE_TYPE_OGG = "audio/ogg"; + String BASS_ENCODE_TYPE_AAC = "audio/aacp"; + + // BASS_Encode_CastInit flags + int BASS_ENCODE_CAST_PUBLIC = 1; // add to public directory + int BASS_ENCODE_CAST_PUT = 2; // use PUT method + int BASS_ENCODE_CAST_SSL = 4; // use SSL/TLS encryption + + // BASS_Encode_CastGetStats types + int BASS_ENCODE_STATS_SHOUT = 0; // Shoutcast stats + int BASS_ENCODE_STATS_ICE = 1; // Icecast mount-point stats + int BASS_ENCODE_STATS_ICESERV = 2; // Icecast server stats + + // BASS_Encode_ServerInit flags + int BASS_ENCODE_SERVER_NOHTTP = 1; // no HTTP headers + int BASS_ENCODE_SERVER_META = 2; // Shoutcast metadata + int BASS_ENCODE_SERVER_SSL = 4; // support SSL/TLS encryption + int BASS_ENCODE_SERVER_SSLONLY = 8; // require SSL/TLS encryption + + // Encoder notifications + int BASS_ENCODE_NOTIFY_ENCODER = 1; // encoder died + int BASS_ENCODE_NOTIFY_CAST = 2; // cast server connection died + int BASS_ENCODE_NOTIFY_SERVER = 3; // server died + int BASS_ENCODE_NOTIFY_CAST_TIMEOUT = 0x10000; // cast timeout + int BASS_ENCODE_NOTIFY_QUEUE_FULL = 0x10001; // queue is out of space + int BASS_ENCODE_NOTIFY_FREE = 0x10002; // encoder has been freed + + } +} diff --git a/src/Audio/BassEncAAC.java b/src/Audio/BassEncAAC.java new file mode 100644 index 0000000..2b25a8c --- /dev/null +++ b/src/Audio/BassEncAAC.java @@ -0,0 +1,22 @@ +package Audio; +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.Pointer; + +import Audio.BassEnc.ENCODEPROCEX; + +/** + * Bass Encoder AAC Plugin + * Must load together with BassEncLibrary + * @author rdkartono + * + */ +@SuppressWarnings("unused") +public interface BassEncAAC extends Library { + + BassEncAAC Instance = (BassEncAAC) Native.load("bassenc_aac",BassEncAAC.class); + int BASS_Encode_AAC_GetVersion(); + + int BASS_Encode_AAC_Start(int handle, String options, int flags, ENCODEPROCEX proc, Pointer user); + int BASS_Encode_AAC_StartFile(int handle, String options, int flags, String filename); +} diff --git a/src/Audio/BassEncMP3.java b/src/Audio/BassEncMP3.java new file mode 100644 index 0000000..4075fc4 --- /dev/null +++ b/src/Audio/BassEncMP3.java @@ -0,0 +1,23 @@ +package Audio; + +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.Pointer; + +import Audio.BassEnc.ENCODEPROCEX; + +/** + * BASS Encoder MP3 plugin + * Must load together with BassEncLibrary + * @author rdkartono + * + */ +@SuppressWarnings("unused") +public interface BassEncMP3 extends Library{ + BassEncMP3 Instance = (BassEncMP3) Native.load("bassenc_mp3",BassEncMP3.class); + + int BASS_Encode_MP3_GetVersion(); + + int BASS_Encode_MP3_Start(int handle, String options, int flags, ENCODEPROCEX proc, Pointer user); + int BASS_Encode_MP3_StartFile(int handle, String options, int flags, String filename); +} diff --git a/src/Audio/BassEncOGG.java b/src/Audio/BassEncOGG.java new file mode 100644 index 0000000..292a00a --- /dev/null +++ b/src/Audio/BassEncOGG.java @@ -0,0 +1,28 @@ +package Audio; + +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.Pointer; + +import Audio.BassEnc.ENCODEPROC; + +/** + * Bass Encoder OGG Plugin + * Must load together with BassEncLibrary + * @author rdkartono + * + */ +@SuppressWarnings("unused") +public interface BassEncOGG extends Library { + BassEncOGG Instance = (BassEncOGG) Native.load("bassenc_ogg",BassEncOGG.class); + int BASS_Encode_OGG_GetVersion(); + + int BASS_Encode_OGG_Start(int handle, String options, int flags, ENCODEPROC proc, Pointer user); + int BASS_Encode_OGG_StartFile(int handle, String options, int flags, String filename); + boolean BASS_Encode_OGG_NewStream(int handle, String options, int flags); + + interface Constant{ + // BASS_Encode_OGG_NewStream flags + int BASS_ENCODE_OGG_RESET = 0x1000000; + } +} diff --git a/src/Audio/BassEncOPUS.java b/src/Audio/BassEncOPUS.java new file mode 100644 index 0000000..e0992db --- /dev/null +++ b/src/Audio/BassEncOPUS.java @@ -0,0 +1,28 @@ +package Audio; + +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.Pointer; + +import Audio.BassEnc.ENCODEPROC; + +/** + * Bass Encoder OPUS Plugin + * Must load together with BassEncLibrary + * @author rdkartono + * + */ +@SuppressWarnings("unused") +public interface BassEncOPUS extends Library{ + BassEncOPUS BASSENC_OPUS = (BassEncOPUS) Native.load("bassenc_opus",BassEncOPUS.class); + interface Constant{ + // BASS_Encode_OPUS_NewStream flags + int BASS_ENCODE_OPUS_RESET = 0x1000000; + int BASS_ENCODE_OPUS_CTLONLY = 0x2000000; + } + int BASS_Encode_OPUS_GetVersion(); + + int BASS_Encode_OPUS_Start(int handle, String options, int flags, ENCODEPROC proc, Pointer user); + int BASS_Encode_OPUS_StartFile(int handle, String options, int flags, String filename); + boolean BASS_Encode_OPUS_NewStream(int handle, String options, int flags); +} diff --git a/src/Audio/BassFileReader.java b/src/Audio/BassFileReader.java new file mode 100644 index 0000000..1ef757b --- /dev/null +++ b/src/Audio/BassFileReader.java @@ -0,0 +1,140 @@ +package Audio; + +import com.sun.jna.Memory; +import com.sun.jna.Pointer; + +import org.pmw.tinylog.Logger; +import peers.media.SoundSource; + +/** + * Pengganti /AxisAudio/src/net/sourceforge/peers/media/FileReader.java + * karena terbatas codec nya + * @author rdkartono + * + */ +@SuppressWarnings("FieldCanBeLocal") +public class BassFileReader implements SoundSource { + // Device = 0 --> no sound + private final int bassdev = 0; + // Device BassInit normal 48khz + private final int initfreq = 48000; + // Device BassInit set ke mono, 16 bit + private final int initflag = Bass.BASS_DEVICE_MONO | Bass.BASS_DEVICE_16BITS; + // flag ketika open file, BASS_STREAM_DECODE karena akan plug ke mixer + private final int openflag = Bass.BASS_STREAM_DECODE; + // Mixer frequency untuk convert ke 8khz + private final int mixerfreq = 8000; + // Mixer channel untuk convert ke Mono + private final int mixerchannel = 1; + // Mixer create flag BASS_STREAM_DECODE karena untuk ambil data aja, bukan playback + private final int mixerflag = Bass.BASS_STREAM_DECODE; + // Mixer_AddChannel flag BAS_STREAM_AUTOFREE , supaya kalau channel habis & selesai, channel free sendiri + //private final int addchannelflag = BassLibrary.Constant.BASS_STREAM_AUTOFREE; + private final int addchannelflag = 0; + + // sekali baca data, 256 bytes + private final int BUFFER_SIZE = 256; + + private final String filename; + private int filehandle = 0; + private int mixerhandle = 0; + private long filesize = 0; + private double duration = 0; + // indicator if file opened, mixer created, and file plugged to mixer + private boolean channeladded = false; + + private final BassFileReaderListener listener; // belum kepake + private final Bass BASS = Bass.Instance; + private final BassMix BASSMIX = BassMix.Instance; + + public BassFileReader(final String filename, BassFileReaderListener listener) { + this.filename = filename; + this.listener = listener; + if (BASS.BASS_GetVersion()!=0) { + if (BASSMIX.BASS_Mixer_GetVersion()!=0) { + boolean initresult = BASS.BASS_Init(bassdev, initfreq, initflag); + if (initresult) { + System.out.println("BassFileReader Bass_Init device = "+bassdev+" success"); + } else System.out.println("BassFileReader BASS_Init error = "+BASS.GetBassError("BASS_Init")); + + filehandle = BASS.BASS_StreamCreateFile(false, filename, 0, 0, openflag); + if (filehandle!=0){ + filesize = BASS.BASS_ChannelGetLength(filehandle, Bass.BASS_POS_BYTE); + duration = BASS.BASS_ChannelBytes2Seconds(filehandle, filesize); + if (listener!=null) listener.fileopened(filename, filesize, duration); + + mixerhandle = BASSMIX.BASS_Mixer_StreamCreate(mixerfreq, mixerchannel, mixerflag); + if (mixerhandle!=0) { + if (BASSMIX.BASS_Mixer_StreamAddChannel(mixerhandle, filehandle, addchannelflag)) { + // sequence pertama sukses + if (listener!=null) listener.filereadstart(filename); + channeladded = true; + } else { + logger_error("BassFileReader BASS_Mixer_StreamAddChannel error = "+BASS.GetBassError("BASS_Mixer_StreamAddChannel")); + close(); + } + } else { + logger_error("BassFileReader BASS_Mixer_StreamCreate error = "+BASS.GetBassError("BASS_Mixer_StreamCreate")); + close(); + } + } else logger_error("BassFileReader BASS_StreamCreateFile error = "+BASS.GetBassError("BASS_StreamCreateFile")); + } else logger_error("BassFileReader BASS_Mixer_GetVersion invalid"); + } else logger_error("BassFileReader BASS_GetVersion invalid"); + } + + public synchronized void close() { + if (mixerhandle!=0) { + if (BASS.BASS_StreamFree(mixerhandle)) { + logger_info("mixer closed in BassFileReader"); + } else logger_error("BassFileReader mixerhandle BASS_StreamFree error = "+BASS.GetBassError("BASS_StreamFree")); + mixerhandle = 0; + } + if (filehandle!=0) { + if (BASS.BASS_StreamFree(filehandle)) { + logger_info(filename+" closed in BassFileReader"); + } else logger_error("BassFileReader filehandle BASS_StreamFree error = "+BASS.GetBassError("BASS_StreamFree")); + filehandle = 0; + } + + if (listener!=null) listener.fileclosed(filename); + channeladded = false; + } + + @Override + public synchronized byte[] readData() { + if (channeladded) { + Pointer pbuf = new Memory(BUFFER_SIZE); + int readsize = BASS.BASS_ChannelGetData(mixerhandle, pbuf, BUFFER_SIZE); + if (readsize>0) { + byte[] rr = pbuf.getByteArray(0, readsize); + if (listener!=null) listener.filereadresult(filename, readsize, rr); + try { + Thread.sleep(15); + return rr; + } catch (InterruptedException e) { + logger_error("BassFileReader interrupted"); + } + } else if (readsize==-1) { + // ada error + logger_error("BassFileReader BASS_ChannelGetData error = "+BASS.GetBassError("BASS_ChannelGetData")); + } else { + // selesai + if (listener!=null) listener.filereadfinish(filename); + logger_info("BassFileReader BASS_ChannelGetData readsize = "+readsize+", closing it"); + close(); + } + } + return null; + } + + + private void logger_error(String msg) { + Logger.error(msg); + + } + + private void logger_info(String msg) { + Logger.info(msg); + } + +} diff --git a/src/Audio/BassFileReaderListener.java b/src/Audio/BassFileReaderListener.java new file mode 100644 index 0000000..917acfd --- /dev/null +++ b/src/Audio/BassFileReaderListener.java @@ -0,0 +1,14 @@ +package Audio; + +/** + * Java Event untuk BassFileReader + * @author rdkartono + * + */ +public interface BassFileReaderListener { + void fileopened(String filename, long filesize, double duration); + void fileclosed(String filename); + void filereadresult(String filename, int readlength, byte[] pcmdata); + void filereadstart(String filename); + void filereadfinish(String filename); +} diff --git a/src/Audio/BassMix.java b/src/Audio/BassMix.java new file mode 100644 index 0000000..709122a --- /dev/null +++ b/src/Audio/BassMix.java @@ -0,0 +1,133 @@ +package Audio; + +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; + +import Audio.Bass.SYNCPROC; + +/** + * Bass Mixer Library + * @author rdkartono + * + */ +@SuppressWarnings("unused") +public interface BassMix extends Library { + BassMix Instance = (BassMix) Native.load("bassmix",BassMix.class); + + interface Constant{ + // Additional BASS_SetConfig options + int BASS_CONFIG_MIXER_BUFFER = 0x10601; + int BASS_CONFIG_MIXER_POSEX = 0x10602; + int BASS_CONFIG_SPLIT_BUFFER = 0x10610; + + // BASS_Mixer_StreamCreate flags + int BASS_MIXER_RESUME = 0x1000; // resume stalled immediately upon new/unpaused source + int BASS_MIXER_POSEX = 0x2000; // enable BASS_Mixer_ChannelGetPositionEx support + int BASS_MIXER_NOSPEAKER = 0x4000; // ignore speaker arrangement + int BASS_MIXER_QUEUE = 0x8000; // queue sources + int BASS_MIXER_END = 0x10000; // end the stream when there are no sources + int BASS_MIXER_NONSTOP = 0x20000; // don't stall when there are no sources + + // BASS_Mixer_StreamAddChannel/Ex flags + int BASS_MIXER_CHAN_ABSOLUTE = 0x1000; // start is an absolute position + int BASS_MIXER_CHAN_BUFFER = 0x2000; // buffer data for BASS_Mixer_ChannelGetData/Level + int BASS_MIXER_CHAN_LIMIT = 0x4000; // limit mixer processing to the amount available from this source + int BASS_MIXER_CHAN_MATRIX = 0x10000; // matrix mixing + int BASS_MIXER_CHAN_PAUSE = 0x20000; // don't process the source + int BASS_MIXER_CHAN_DOWNMIX = 0x400000; // downmix to stereo/mono + int BASS_MIXER_CHAN_NORAMPIN = 0x800000; // don't ramp-in the start + int BASS_MIXER_BUFFER = BASS_MIXER_CHAN_BUFFER; + int BASS_MIXER_LIMIT = BASS_MIXER_CHAN_LIMIT; + int BASS_MIXER_MATRIX = BASS_MIXER_CHAN_MATRIX; + int BASS_MIXER_PAUSE = BASS_MIXER_CHAN_PAUSE; + int BASS_MIXER_DOWNMIX = BASS_MIXER_CHAN_DOWNMIX; + int BASS_MIXER_NORAMPIN = BASS_MIXER_CHAN_NORAMPIN; + + // Mixer attributes + int BASS_ATTRIB_MIXER_LATENCY = 0x15000; + int BASS_ATTRIB_MIXER_THREADS = 0x15001; + int BASS_ATTRIB_MIXER_VOL = 0x15002; + + // Additional BASS_Mixer_ChannelIsActive return values + int BASS_ACTIVE_WAITING = 5; + int BASS_ACTIVE_QUEUED = 6; + + // BASS_Split_StreamCreate flags + int BASS_SPLIT_SLAVE = 0x1000; // only read buffered data + int BASS_SPLIT_POS = 0x2000; + + // Splitter attributes + int BASS_ATTRIB_SPLIT_ASYNCBUFFER = 0x15010; + int BASS_ATTRIB_SPLIT_ASYNCPERIOD = 0x15011; + + // Envelope types + int BASS_MIXER_ENV_FREQ = 1; + int BASS_MIXER_ENV_VOL = 2; + int BASS_MIXER_ENV_PAN = 3; + int BASS_MIXER_ENV_LOOP = 0x10000; // flag: loop + int BASS_MIXER_ENV_REMOVE = 0x20000; // flag: remove at end + + // Additional sync types + int BASS_SYNC_MIXER_ENVELOPE = 0x10200; + int BASS_SYNC_MIXER_ENVELOPE_NODE = 0x10201; + int BASS_SYNC_MIXER_QUEUE = 0x10202; + + // Additional BASS_Mixer_ChannelSetPosition flag + int BASS_POS_MIXER_RESET = 0x10000; // flag: clear mixer's playback buffer + + // Additional BASS_Mixer_ChannelGetPosition mode + int BASS_POS_MIXER_DELAY = 5; + + // BASS_CHANNELINFO types + int BASS_CTYPE_STREAM_MIXER = 0x10800; + int BASS_CTYPE_STREAM_SPLIT = 0x10801; + } + + + // Envelope node + @Structure.FieldOrder({"pos, value"}) + class BASS_MIXER_NODE extends Structure { + public BASS_MIXER_NODE() {} + public BASS_MIXER_NODE(long _pos, float _value) { pos=_pos; value=_value; } + public long pos; + public float value; + } + + + + int BASS_Mixer_GetVersion(); + + int BASS_Mixer_StreamCreate(int freq, int chans, int flags); + boolean BASS_Mixer_StreamAddChannel(int handle, int channel, int flags); + boolean BASS_Mixer_StreamAddChannelEx(int handle, int channel, int flags, long start, long length); + int BASS_Mixer_StreamGetChannels(int handle, int[] channels, int count); + + int BASS_Mixer_ChannelGetMixer(int handle); + int BASS_Mixer_ChannelIsActive(int handle); + int BASS_Mixer_ChannelFlags(int handle, int flags, int mask); + boolean BASS_Mixer_ChannelRemove(int handle); + boolean BASS_Mixer_ChannelSetPosition(int handle, long pos, int mode); + long BASS_Mixer_ChannelGetPosition(int handle, int mode); + long BASS_Mixer_ChannelGetPositionEx(int channel, int mode, int delay); + int BASS_Mixer_ChannelGetLevel(int handle); + boolean BASS_Mixer_ChannelGetLevelEx(int handle, float[] levels, float length, int flags); + int BASS_Mixer_ChannelGetData(int handle, Pointer buffer, int length); + int BASS_Mixer_ChannelSetSync(int handle, int type, long param, SYNCPROC proc, Pointer user); + boolean BASS_Mixer_ChannelRemoveSync(int channel, int sync); + boolean BASS_Mixer_ChannelSetMatrix(int handle, float[][] matrix); + boolean BASS_Mixer_ChannelSetMatrixEx(int handle, float[][] matrix, float time); + boolean BASS_Mixer_ChannelGetMatrix(int handle, float[][] matrix); + boolean BASS_Mixer_ChannelSetEnvelope(int handle, int type, BASS_MIXER_NODE[] nodes, int count); + boolean BASS_Mixer_ChannelSetEnvelopePos(int handle, int type, long pos); + long BASS_Mixer_ChannelGetEnvelopePos(int handle, int type, Float value); + + int BASS_Split_StreamCreate(int channel, int flags, int[] chanmap); + int BASS_Split_StreamGetSource(int handle); + int BASS_Split_StreamGetSplits(int handle, int[] splits, int count); + boolean BASS_Split_StreamReset(int handle); + boolean BASS_Split_StreamResetEx(int handle, int offset); + int BASS_Split_StreamGetAvailable(int handle); + +} diff --git a/src/Audio/BassOPUS.java b/src/Audio/BassOPUS.java new file mode 100644 index 0000000..d70d4c3 --- /dev/null +++ b/src/Audio/BassOPUS.java @@ -0,0 +1,24 @@ +package Audio; + +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.Pointer; + +import Audio.Bass.BASS_FILEPROCS; +import Audio.Bass.DOWNLOADPROC; + +@SuppressWarnings("unused") +public interface BassOPUS extends Library { + BassOPUS Instance = (BassOPUS) Native.load("bassopus",BassOPUS.class); + interface Constant{ + // BASS_CHANNELINFO type + int BASS_CTYPE_STREAM_OPUS = 0x11200; + + // Additional attributes + int BASS_ATTRIB_OPUS_ORIGFREQ = 0x13000; + } + int BASS_OPUS_StreamCreateFile(String file, long offset, long length, int flags); + int BASS_OPUS_StreamCreateFile(Pointer file, long offset, long length, int flags); + int BASS_OPUS_StreamCreateURL(String url, int offset, int flags, DOWNLOADPROC proc, Pointer user); + int BASS_OPUS_StreamCreateFileUser(int system, int flags, BASS_FILEPROCS procs, Pointer user); +} diff --git a/src/Audio/CompressInputStream.java b/src/Audio/CompressInputStream.java new file mode 100644 index 0000000..93c28ed --- /dev/null +++ b/src/Audio/CompressInputStream.java @@ -0,0 +1,162 @@ +package Audio; + +import org.jetbrains.annotations.NotNull; + +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * Converts a PCM byte stream into an A-Law or u-Law byte stream + * Source : ... + * The PCM-Format is : + * PCM 8000.0 Hz, 16 bit, mono, SIGNED, little-endian + * static AudioFormat pcmformat = new AudioFormat(8000,16,1,true,false); + * @author rdkartono + * + */ +@SuppressWarnings("unused") +public class CompressInputStream extends FilterInputStream{ + + /* + Convert mono PCM byte stream into A-Law u-Law byte stream + + static AudioFormat alawformat= new AudioFormat(AudioFormat.Encoding.ALAW,8000,8,1,1,8000,false); + static AudioFormat ulawformat= new AudioFormat(AudioFormat.Encoding.ULAW,8000,8,1,1,8000,false); + + PCM 8000.0 Hz, 16 bit, mono, SIGNED, little-endian + static AudioFormat pcmformat = new AudioFormat(8000,16,1,true,false); + + */ + + static private final Compressor alawcompressor=new ALawCompressor(); + static private final Compressor ulawcompressor=new uLawCompressor(); + + private final Compressor compressor; + + public CompressInputStream(InputStream in, boolean useALaw) { + super(in); + compressor=(useALaw)?alawcompressor:ulawcompressor; + } + + public int read()throws IOException{ + throw new IOException(getClass().getName()+".read() :\n\tDo not support simple read()."); + } + + public int read(@NotNull byte[] b)throws IOException{ + return read(b,0,b.length); + } + + public int read(@NotNull byte[] b, int off, int len)throws IOException{ + int i,sample; + byte[] inb; + + inb=new byte[len<<1]; // get 16bit PCM data + len=in.read(inb); + if(len==-1){return -1;} + + i=0; + while(i>1; + } + } + + abstract class Compressor{ + protected abstract int compress(short sample); + } + + /* + Mathematical Tools in Signal Processing with C++ and Java Simulations + by Willi-Hans Steeb + International School for Scientific Computing + */ + + class ALawCompressor extends Compressor{ + + static final int cClip = 32635; + + static final int[] ALawCompressTable ={ + 1,1,2,2,3,3,3,3, + 4,4,4,4,4,4,4,4, + 5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5, + 6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6, + 7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7 + }; + + protected int compress(short sample){ + int sign; + int exponent; + int mantissa; + int compressedByte; + + sign = ((~sample) >> 8) & 0x80; + if(sign==0){ sample *= -1;} + if(sample > cClip){ sample = cClip; } + if(sample >= 256){ + exponent = ALawCompressTable[(sample >> 8) & 0x007F]; + mantissa = (sample >> (exponent + 3) ) & 0x0F; + compressedByte = 0x007F & ((exponent << 4) | mantissa); + }else{ + compressedByte = 0x007F & (sample >> 4); + } + compressedByte ^= (sign ^ 0x55); + return compressedByte; + } + } + + class uLawCompressor extends Compressor{ + + static final int cClip = 32635; + static final int cBias = 0x84; + + int[] uLawCompressTable ={ + 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 + }; + + protected int compress(short sample){ + int sign; + int exponent; + int mantissa; + int compressedByte; + + sign = (sample >> 8) & 0x80; + if(sign!=0){ sample *= -1;} + if(sample > cClip){ sample = cClip; } + sample += cBias; + + exponent = uLawCompressTable[(sample >> 7) & 0x00FF]; + mantissa = (sample >> (exponent + 3)) & 0x0F; + compressedByte = ~(sign | (exponent << 4) | mantissa); + return compressedByte&0x000000FF; + } + } diff --git a/src/Audio/ConvertInputStream.java b/src/Audio/ConvertInputStream.java new file mode 100644 index 0000000..b43f99e --- /dev/null +++ b/src/Audio/ConvertInputStream.java @@ -0,0 +1,118 @@ +package Audio; + +import org.jetbrains.annotations.NotNull; + +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * Converts an A-Law into u-Law byte stream or vice versa + * Source : ... + * @author rdkartono + * + */ +@SuppressWarnings("unused") +public class ConvertInputStream extends FilterInputStream{ + + /* + Convert A-Law or u-Law byte stream into u-Law or A-Law byte stream + + static AudioFormat alawformat= new AudioFormat(AudioFormat.Encoding.ALAW,8000,8,1,1,8000,false); + static AudioFormat ulawformat= new AudioFormat(AudioFormat.Encoding.ULAW,8000,8,1,1,8000,false); + + */ + + static private final byte[] alaw2ulawtable={ + 41, 42, 39, 40, 45, 46, 43, 44, + 33, 34, 31, 32, 37, 38, 35, 36, + 57, 58, 55, 56, 61, 62, 59, 60, + 49, 50, 47, 48, 53, 54, 51, 52, + 10, 11, 8, 9, 14, 15, 12, 13, + 2, 3, 0, 1, 6, 7, 4, 5, + 26, 27, 24, 25, 30, 31, 28, 29, + 18, 19, 16, 17, 22, 23, 20, 21, + 98, 99, 96, 97, 102, 103, 100, 101, + 93, 93, 92, 92, 95, 95, 94, 94, + 116, 118, 112, 114, 124, 126, 120, 122, + 106, 107, 104, 105, 110, 111, 108, 109, + 72, 73, 70, 71, 76, 77, 74, 75, + 64, 65, 63, 63, 68, 69, 66, 67, + 86, 87, 84, 85, 90, 91, 88, 89, + 79, 79, 78, 78, 82, 83, 80, 81, + -87, -86, -89, -88, -83, -82, -85, -84, + -95, -94, -97, -96, -91, -90, -93, -92, + -71, -70, -73, -72, -67, -66, -69, -68, + -79, -78, -81, -80, -75, -74, -77, -76, + -118, -117, -120, -119, -114, -113, -116, -115, + -126, -125, -128, -127, -122, -121, -124, -123, + -102, -101, -104, -103, -98, -97, -100, -99, + -110, -109, -112, -111, -106, -105, -108, -107, + -30, -29, -32, -31, -26, -25, -28, -27, + -35, -35, -36, -36, -33, -33, -34, -34, + -12, -10, -16, -14, -4, -2, -8, -6, + -22, -21, -24, -23, -18, -17, -20, -19, + -56, -55, -58, -57, -52, -51, -54, -53, + -64, -63, -65, -65, -60, -59, -62, -61, + -42, -41, -44, -43, -38, -37, -40, -39, + -49, -49, -50, -50, -46, -45, -48, -47, + }; + + static private final byte[] ulaw2alawtable={ + 42, 43, 40, 41, 46, 47, 44, 45, + 34, 35, 32, 33, 38, 39, 36, 37, + 58, 59, 56, 57, 62, 63, 60, 61, + 50, 51, 48, 49, 54, 55, 52, 53, + 11, 8, 9, 14, 15, 12, 13, 2, + 3, 0, 1, 6, 7, 4, 5, 26, + 27, 24, 25, 30, 31, 28, 29, 18, + 19, 16, 17, 22, 23, 20, 21, 107, + 104, 105, 110, 111, 108, 109, 98, 99, + 96, 97, 102, 103, 100, 101, 123, 121, + 126, 127, 124, 125, 114, 115, 112, 113, + 118, 119, 116, 117, 75, 73, 79, 77, + 66, 67, 64, 65, 70, 71, 68, 69, + 90, 91, 88, 89, 94, 95, 92, 93, + 82, 82, 83, 83, 80, 80, 81, 81, + 86, 86, 87, 87, 84, 84, 85, -43, + -86, -85, -88, -87, -82, -81, -84, -83, + -94, -93, -96, -95, -90, -89, -92, -91, + -70, -69, -72, -71, -66, -65, -68, -67, + -78, -77, -80, -79, -74, -73, -76, -75, + -117, -120, -119, -114, -113, -116, -115, -126, + -125, -128, -127, -122, -121, -124, -123, -102, + -101, -104, -103, -98, -97, -100, -99, -110, + -109, -112, -111, -106, -105, -108, -107, -21, + -24, -23, -18, -17, -20, -19, -30, -29, + -32, -31, -26, -25, -28, -27, -5, -7, + -2, -1, -4, -3, -14, -13, -16, -15, + -10, -9, -12, -11, -53, -55, -49, -51, + -62, -61, -64, -63, -58, -57, -60, -59, + -38, -37, -40, -39, -34, -33, -36, -35, + -46, -46, -45, -45, -48, -48, -47, -47, + -42, -42, -41, -41, -44, -44, -43, -43, + }; + + private final byte[] table; + + public ConvertInputStream(InputStream in, boolean useALaw2uLaw){ + super(in); + table=(useALaw2uLaw)?alaw2ulawtable:ulaw2alawtable; + } + + public int read()throws IOException{ + int b=in.read(); + if(b==-1){return -1;} + return table[b]; + } + + public int read(@NotNull byte[] b, int off, int len)throws IOException{ + byte[] inb=new byte[len]; + len=in.read(inb); + if(len==-1){return -1;} + for(int i=0;i... + * The PCM-Format is : + * PCM 8000.0 Hz, 16 bit, mono, SIGNED, little-endian + * static AudioFormat pcmformat = new AudioFormat(8000,16,1,true,false); + * @author rdkartono + * + */ +@SuppressWarnings("unused") +public class DecompressInputStream extends FilterInputStream{ + + /* + Convert A-Law or u-Law byte stream into mono PCM byte stream + + static AudioFormat alawformat= new AudioFormat(AudioFormat.Encoding.ALAW,8000,8,1,1,8000,false); + static AudioFormat ulawformat= new AudioFormat(AudioFormat.Encoding.ULAW,8000,8,1,1,8000,false); + + PCM 8000.0 Hz, 16 bit, mono, SIGNED, little-endian + static AudioFormat pcmformat = new AudioFormat(8000,16,1,true,false); + + */ + + /* + Mathematical Tools in Signal Processing with C++ and Java Simulations + by Willi-Hans Steeb + International School for Scientific Computing + */ + + static private final int[] alawtable={ + 0x80ea,0x80eb,0x80e8,0x80e9,0x80ee,0x80ef,0x80ec,0x80ed, + 0x80e2,0x80e3,0x80e0,0x80e1,0x80e6,0x80e7,0x80e4,0x80e5, + 0x40f5,0xc0f5,0x40f4,0xc0f4,0x40f7,0xc0f7,0x40f6,0xc0f6, + 0x40f1,0xc0f1,0x40f0,0xc0f0,0x40f3,0xc0f3,0x40f2,0xc0f2, + 0x00aa,0x00ae,0x00a2,0x00a6,0x00ba,0x00be,0x00b2,0x00b6, + 0x008a,0x008e,0x0082,0x0086,0x009a,0x009e,0x0092,0x0096, + 0x00d5,0x00d7,0x00d1,0x00d3,0x00dd,0x00df,0x00d9,0x00db, + 0x00c5,0x00c7,0x00c1,0x00c3,0x00cd,0x00cf,0x00c9,0x00cb, + 0xa8fe,0xb8fe,0x88fe,0x98fe,0xe8fe,0xf8fe,0xc8fe,0xd8fe, + 0x28fe,0x38fe,0x08fe,0x18fe,0x68fe,0x78fe,0x48fe,0x58fe, + 0xa8ff,0xb8ff,0x88ff,0x98ff,0xe8ff,0xf8ff,0xc8ff,0xd8ff, + 0x28ff,0x38ff,0x08ff,0x18ff,0x68ff,0x78ff,0x48ff,0x58ff, + 0xa0fa,0xe0fa,0x20fa,0x60fa,0xa0fb,0xe0fb,0x20fb,0x60fb, + 0xa0f8,0xe0f8,0x20f8,0x60f8,0xa0f9,0xe0f9,0x20f9,0x60f9, + 0x50fd,0x70fd,0x10fd,0x30fd,0xd0fd,0xf0fd,0x90fd,0xb0fd, + 0x50fc,0x70fc,0x10fc,0x30fc,0xd0fc,0xf0fc,0x90fc,0xb0fc, + 0x8015,0x8014,0x8017,0x8016,0x8011,0x8010,0x8013,0x8012, + 0x801d,0x801c,0x801f,0x801e,0x8019,0x8018,0x801b,0x801a, + 0xc00a,0x400a,0xc00b,0x400b,0xc008,0x4008,0xc009,0x4009, + 0xc00e,0x400e,0xc00f,0x400f,0xc00c,0x400c,0xc00d,0x400d, + 0x0056,0x0052,0x005e,0x005a,0x0046,0x0042,0x004e,0x004a, + 0x0076,0x0072,0x007e,0x007a,0x0066,0x0062,0x006e,0x006a, + 0x002b,0x0029,0x002f,0x002d,0x0023,0x0021,0x0027,0x0025, + 0x003b,0x0039,0x003f,0x003d,0x0033,0x0031,0x0037,0x0035, + 0x5801,0x4801,0x7801,0x6801,0x1801,0x0801,0x3801,0x2801, + 0xd801,0xc801,0xf801,0xe801,0x9801,0x8801,0xb801,0xa801, + 0x5800,0x4800,0x7800,0x6800,0x1800,0x0800,0x3800,0x2800, + 0xd800,0xc800,0xf800,0xe800,0x9800,0x8800,0xb800,0xa800, + 0x6005,0x2005,0xe005,0xa005,0x6004,0x2004,0xe004,0xa004, + 0x6007,0x2007,0xe007,0xa007,0x6006,0x2006,0xe006,0xa006, + 0xb002,0x9002,0xf002,0xd002,0x3002,0x1002,0x7002,0x5002, + 0xb003,0x9003,0xf003,0xd003,0x3003,0x1003,0x7003,0x5003, + }; + + static private final int[] ulawtable={ + 0x8482,0x8486,0x848a,0x848e,0x8492,0x8496,0x849a,0x849e, + 0x84a2,0x84a6,0x84aa,0x84ae,0x84b2,0x84b6,0x84ba,0x84be, + 0x84c1,0x84c3,0x84c5,0x84c7,0x84c9,0x84cb,0x84cd,0x84cf, + 0x84d1,0x84d3,0x84d5,0x84d7,0x84d9,0x84db,0x84dd,0x84df, + 0x04e1,0x04e2,0x04e3,0x04e4,0x04e5,0x04e6,0x04e7,0x04e8, + 0x04e9,0x04ea,0x04eb,0x04ec,0x04ed,0x04ee,0x04ef,0x04f0, + 0xc4f0,0x44f1,0xc4f1,0x44f2,0xc4f2,0x44f3,0xc4f3,0x44f4, + 0xc4f4,0x44f5,0xc4f5,0x44f6,0xc4f6,0x44f7,0xc4f7,0x44f8, + 0xa4f8,0xe4f8,0x24f9,0x64f9,0xa4f9,0xe4f9,0x24fa,0x64fa, + 0xa4fa,0xe4fa,0x24fb,0x64fb,0xa4fb,0xe4fb,0x24fc,0x64fc, + 0x94fc,0xb4fc,0xd4fc,0xf4fc,0x14fd,0x34fd,0x54fd,0x74fd, + 0x94fd,0xb4fd,0xd4fd,0xf4fd,0x14fe,0x34fe,0x54fe,0x74fe, + 0x8cfe,0x9cfe,0xacfe,0xbcfe,0xccfe,0xdcfe,0xecfe,0xfcfe, + 0x0cff,0x1cff,0x2cff,0x3cff,0x4cff,0x5cff,0x6cff,0x7cff, + 0x88ff,0x90ff,0x98ff,0xa0ff,0xa8ff,0xb0ff,0xb8ff,0xc0ff, + 0xc8ff,0xd0ff,0xd8ff,0xe0ff,0xe8ff,0xf0ff,0xf8ff,0x0000, + 0x7c7d,0x7c79,0x7c75,0x7c71,0x7c6d,0x7c69,0x7c65,0x7c61, + 0x7c5d,0x7c59,0x7c55,0x7c51,0x7c4d,0x7c49,0x7c45,0x7c41, + 0x7c3e,0x7c3c,0x7c3a,0x7c38,0x7c36,0x7c34,0x7c32,0x7c30, + 0x7c2e,0x7c2c,0x7c2a,0x7c28,0x7c26,0x7c24,0x7c22,0x7c20, + 0xfc1e,0xfc1d,0xfc1c,0xfc1b,0xfc1a,0xfc19,0xfc18,0xfc17, + 0xfc16,0xfc15,0xfc14,0xfc13,0xfc12,0xfc11,0xfc10,0xfc0f, + 0x3c0f,0xbc0e,0x3c0e,0xbc0d,0x3c0d,0xbc0c,0x3c0c,0xbc0b, + 0x3c0b,0xbc0a,0x3c0a,0xbc09,0x3c09,0xbc08,0x3c08,0xbc07, + 0x5c07,0x1c07,0xdc06,0x9c06,0x5c06,0x1c06,0xdc05,0x9c05, + 0x5c05,0x1c05,0xdc04,0x9c04,0x5c04,0x1c04,0xdc03,0x9c03, + 0x6c03,0x4c03,0x2c03,0x0c03,0xec02,0xcc02,0xac02,0x8c02, + 0x6c02,0x4c02,0x2c02,0x0c02,0xec01,0xcc01,0xac01,0x8c01, + 0x7401,0x6401,0x5401,0x4401,0x3401,0x2401,0x1401,0x0401, + 0xf400,0xe400,0xd400,0xc400,0xb400,0xa400,0x9400,0x8400, + 0x7800,0x7000,0x6800,0x6000,0x5800,0x5000,0x4800,0x4000, + 0x3800,0x3000,0x2800,0x2000,0x1800,0x1000,0x0800,0x0000, + }; + + private final int[] table; + + public DecompressInputStream(InputStream in, boolean useALaw){ + super(in); + table=(useALaw)?alawtable:ulawtable; + } + + public int read()throws IOException{ + throw new IOException(getClass().getName()+".read() :\n\tDo not support simple read()."); + } + + public int read(@NotNull byte[] b)throws IOException{ + return read(b,0,b.length); + } + + public int read(@NotNull byte[] b, int off, int len)throws IOException{ + byte[] inb; + int value; + + inb=new byte[len>>1]; // get A-Law or u-Law bytes + len=in.read(inb); + if(len==-1){return -1;} + + for(int i=0;i>8)&0x00FF); // little-endian + b[off++]=(byte)(value&0x00FF); + } + return len<<1; + } +} diff --git a/src/Audio/G711.java b/src/Audio/G711.java new file mode 100644 index 0000000..9607a30 --- /dev/null +++ b/src/Audio/G711.java @@ -0,0 +1,222 @@ +package Audio; + +/** G.711 codec. + * This class provides methods for u-law, A-law and linear PCM conversions. + */ +@SuppressWarnings("unused") +public class G711 { + static final int SIGN_BIT=0x80; // Sign bit for a A-law byte. + static final int QUANT_MASK=0xf; // Quantization field mask. + static final int NSEGS=8; // Number of A-law segments. + static final int SEG_SHIFT=4; // Left shift for segment number. + static final int SEG_MASK=0x70; // Segment field mask. + + static final int[] seg_end={ 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF }; + + // copy from CCITT G.711 specifications + + /** u- to A-law conversions */ + static final int[] _u2a={ + 1, 1, 2, 2, 3, 3, 4, 4, + 5, 5, 6, 6, 7, 7, 8, 8, + 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, + 25, 27, 29, 31, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, + 46, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128 }; + + /** A- to u-law conversions */ + static final int[] _a2u={ + 1, 3, 5, 7, 9, 11, 13, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 32, 33, 33, 34, 34, 35, 35, + 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 48, 49, 49, + 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 64, + 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127 }; + + + static int search(int val, int[] table) + { for (int i=0; i=0) + { mask=0xD5; // sign (7th) bit = 1 + } + else + { mask=0x55; // sign bit = 0 + pcm_val=-pcm_val-8; + } + + // Convert the scaled magnitude to segment number. + seg=search(pcm_val,seg_end); + + // Combine the sign, segment, and quantization bits. + if (seg>=8) // out of range, return maximum value. + return (0x7F^mask); + else + { aval=seg<>4)&QUANT_MASK; + else aval|=(pcm_val>>(seg+3))&QUANT_MASK; + return (aval^mask); + } + } + + /** Converts an A-law value to 16-bit linear PCM + */ + //public static int alaw2linear(unsigned char a_val) + public static int alaw2linear(int a_val) + { int t; + int seg; + a_val^=0x55; + t=(a_val&QUANT_MASK)<<4; + //seg=((unsigned)a_val&SEG_MASK)>>SEG_SHIFT; + seg=(a_val&SEG_MASK)>>SEG_SHIFT; + switch (seg) + { case 0: + t+=8; + break; + case 1: + t+=0x108; + break; + default: + t+=0x108; + t<<=seg-1; + } + return ((a_val&SIGN_BIT)!=0)? t : -t; + } + + + /** Bias for linear code. */ + public static final int BIAS=0x84; + + + /** Converts a linear PCM value to u-law + * In order to simplify the encoding process, the original linear magnitude + * is biased by adding 33 which shifts the encoding range from (0 - 8158) to + * (33 - 8191). The result can be seen in the following encoding table: + * Biased Linear Input Code Compressed Code + * ------------------------ --------------- + * 00000001wxyza 000wxyz + * 0000001wxyzab 001wxyz + * 000001wxyzabc 010wxyz + * 00001wxyzabcd 011wxyz + * 0001wxyzabcde 100wxyz + * 001wxyzabcdef 101wxyz + * 01wxyzabcdefg 110wxyz + * 1wxyzabcdefgh 111wxyz + * Each biased linear code has a leading 1 which identifies the segment + * number. The value of the segment number is equal to 7 minus the number + * of leading 0's. The quantization interval is directly available as the + * four bits wxyz. The trailing bits (a - h) are ignored. + * Ordinarily the complement of the resulting code word is used for + * transmission, and so the code word is complemented before it is returned. + * For further information see John C. Bellamy's Digital Telephony, 1982, + * John Wiley & Sons, pps 98-111 and 472-476. + */ + public static int linear2ulaw(int pcm_val) // 2's complement (16-bit range) + { int mask; + int seg; + //unsigned char uval; + int uval; + + // Get the sign and the magnitude of the value. + if (pcm_val<0) + { pcm_val=BIAS-pcm_val; + mask=0x7F; + } + else + { pcm_val+=BIAS; + mask=0xFF; + } + // Convert the scaled magnitude to segment number. + seg=search(pcm_val,seg_end); + + // Combine the sign, segment, quantization bits; and complement the code word. + + if (seg>=8) return (0x7F^mask); // out of range, return maximum value. + else + { uval=(seg<<4) | ((pcm_val>>(seg+3)) & 0xF); + return (uval^mask); + } + } + + /** ConvertS a u-law value to 16-bit linear PCM. + * First, a biased linear code is derived from the code word. An unbiased + * output can then be obtained by subtracting 33 from the biased code. + * Note that this function expects to be passed the complement of the + * original code word. This is in keeping with ISDN conventions. + */ + //public static int ulaw2linear(unsigned char u_val) + public static int ulaw2linear(int u_val) + { int t; + // Complement to obtain normal u-law value. + u_val=~u_val; + // Extract and bias the quantization bits. Then shift up by the segment number and subtract out the bias. + t=((u_val&QUANT_MASK)<<3) + BIAS; + //t<<=((unsigned)u_val&SEG_MASK)>>SEG_SHIFT; + t<<=(u_val&SEG_MASK)>>SEG_SHIFT; + + return ((u_val&SIGN_BIT)!=0)? (BIAS-t) : (t-BIAS); + } + + + /** A-law to u-law conversion. + */ + //public static int alaw2ulaw(unsigned char aval) + public static int alaw2ulaw(int aval) + { aval&=0xff; + return ((aval & 0x80)!=0)? (0xFF^_a2u[aval^0xD5]) : (0x7F^_a2u[aval^0x55]); + } + + + /** u-law to A-law conversion. + */ + //public static int ulaw2alaw(unsigned char uval) + public static int ulaw2alaw(int uval) + { uval&=0xff; + return ((uval&0x80)!=0)? (0xD5^(_u2a[0xFF^uval]-1)) : (0x55^(_u2a[0x7F^uval]-1)); + } +} + diff --git a/src/Audio/JSIPAudio.java b/src/Audio/JSIPAudio.java new file mode 100644 index 0000000..987dbc8 --- /dev/null +++ b/src/Audio/JSIPAudio.java @@ -0,0 +1,873 @@ +package Audio; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ShortBuffer; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.stream.Stream; + +import com.sun.jna.Memory; +import com.sun.jna.Pointer; +import com.sun.jna.Native; + +import Audio.Bass.BASS_DEVICEINFO; +import org.pmw.tinylog.Logger; + + +/** + * SIP Audio Converter + * @author rdkartono + * + */ +@SuppressWarnings({"unused", "ResultOfMethodCallIgnored"}) +public class JSIPAudio { + private final Bass BASS = Bass.Instance; + private final BassMix BASSMIX = BassMix.Instance; + private final BassEnc BASSENC = BassEnc.Instance; + private final BassEncAAC BASSENC_AAC = BassEncAAC.Instance; + private final String currentfolder ; + + private boolean inited = false; + + private final ExecutorService exec = Executors.newCachedThreadPool(); + private final Set inited_playback ; + private final Set inited_recorder ; + private final Set loaded_plugin; + + public ULaw ULaw; + public PCM PCM16; + public AAC AAC; + + public JSIPAudio(AudioEvent1 ulaw_event, AudioEvent1 pcm16_event, AudioEvent1 aac_event) { + currentfolder = new File("").getAbsolutePath(); + + inited_playback = new HashSet<>(); + inited_recorder = new HashSet<>(); + loaded_plugin = new HashSet<>(); + + extract_libraries(); + + ULaw = new ULaw(16,1,ulaw_event); + PCM16 = new PCM(16,1, pcm16_event); + AAC = new AAC(16,1, aac_event); + + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + Logger.info("JSIPAudio ShutdownHook called"); + inited_recorder.forEach(recdev->{ + if (BASS.BASS_RecordSetDevice(recdev)) { + if (BASS.BASS_RecordFree()) { + Logger.info("Recorder Device="+recdev+" freed"); + } else Logger.error(BASS.GetBassError("BASS_RecordFree")); + } else Logger.error(BASS.GetBassError("BASS_RecordSetDevice")); + + }); + inited_recorder.clear(); + + inited_playback.forEach(playdev ->{ + if (BASS.BASS_SetDevice(playdev)) { + if (BASS.BASS_Free()) { + Logger.info("Playback Device="+playdev+" freed"); + } else Logger.error(BASS.GetBassError("BASS_Free")); + } else Logger.error(BASS.GetBassError("BASS_SetDevice")); + + }); + inited_playback.clear(); + + loaded_plugin.forEach(ph ->{ + if (BASS.BASS_PluginFree(ph)) { + Logger.info("Plugin freed"); + } else Logger.error(BASS.GetBassError("BASS_PluginFree")); + }); + loaded_plugin.clear(); + })); + inited = true; + } + + private String extract_library(String folder, String libname){ + try { + File existinglib = new File(folder, System.mapLibraryName(libname)); + File xx = Native.extractFromResourcePath(libname); + + if (existinglib.exists() && existinglib.isFile() && existinglib.length()==xx.length()) { + xx.delete(); // gak perlu + return existinglib.getAbsolutePath(); + } else { + if (xx.renameTo(existinglib)) { + return existinglib.getAbsolutePath(); + } else return xx.getAbsolutePath(); + + } + } catch (IOException e) { + return MessageFormat.format("IOException Libname={0} Message={1}", libname, e.getMessage()); + } + } + + private String ToHexString(int value) { + return "0x"+Integer.toHexString(value).toUpperCase(); + } + + + private void extract_libraries() { + raise_log(extract_library(currentfolder, "bass")); + raise_log(extract_library(currentfolder, "bassmix")); + raise_log(extract_library(currentfolder, "bass_aac")); + raise_log(extract_library(currentfolder, "bassenc")); + raise_log(extract_library(currentfolder, "bassenc_aac")); + + raise_log("Bass Version = "+ToHexString(BASS.BASS_GetVersion())); + raise_log("BassMix Version = "+ToHexString(BASSMIX.BASS_Mixer_GetVersion())); + raise_log("BassEnc Version = "+ToHexString(BASSENC.BASS_Encode_GetVersion())); + raise_log("BassEnc_AAC Version = "+ToHexString(BASSENC_AAC.BASS_Encode_AAC_GetVersion())); + + int pluginhandle = BASS.BASS_PluginLoad("bass_aac", 0); + if (pluginhandle!=0) { + loaded_plugin.add(pluginhandle); + raise_log("Plugin AAC Loaded"); + } else raise_log(BASS.GetBassError("BASS_PluginLoad")); + } + + + + /** + * Set Channel Volume + * @param handle handle value + * @param value 0 - 100 + */ + public void SetChannelVolume(int handle, int value) { + if (value<0) value = 0; + if (value>100) value = 100; + if (handle!=0) { + if (!BASS.BASS_ChannelSetAttribute(handle, Bass.BASS_ATTRIB_VOL, value/100.0f)) { + raise_log(BASS.GetBassError("BASS_ChannelSetAttribute")); + } + + } + } + + /** + * Get Channel Volume + * @param handle handle value + * @return -1 if failed, 0 - 100 if success + */ + public int GetChannelVolume(int handle) { + if (handle!=0) { + Bass.FloatValue val = new Bass.FloatValue(); + if (BASS.BASS_ChannelGetAttribute(handle, Bass.BASS_ATTRIB_VOL, val)) { + int intval = (int)(val.value*100); + if (intval<0) intval = 0; + if (intval>100) intval = 100; + return intval; + } + } + return -1; + } + + /** + * Set Master Volume for specific Playback Device + * @param devid start from 1. No-sound cant be controlled + * @param value 0 - 100 + * @return true if SetVolume success + */ + public boolean SetMasterVolume(int devid, int value) { + if (value<0) value = 0; + if (value>100) value = 100; + if (devid>0) { + if (BASS.BASS_SetDevice(devid)) { + if (BASS.BASS_SetVolume(value/100.0f)) { + return true; + } else raise_log(BASS.GetBassError("BASS_SetVolume")); + } else raise_log(BASS.GetBassError("BASS_SetDevice")); + } + return false; + } + + /** + * Get Master Volume for specific Playback Device + * @param devid start from 1 + * @return -1 if GetVolume failed + */ + public int GetMasterVolume(int devid) { + if (devid>0) { + if (BASS.BASS_SetDevice(devid)) { + float val = BASS.BASS_GetVolume(); + if (val>=0) { + int result = (int)(val * 100); + if (result>100) result = 100; + return result; + } else raise_log(BASS.GetBassError("BASS_GetVolume")); + } else raise_log(BASS.GetBassError("BASS_SetDevice")); + } + return -1; + } + + /** + * Set Record Volume + * @param devid start from 0 + * @param value 0 - 100 + * @return true if success + */ + public boolean SetRecordVolume(int devid, int value) { + // value negative = leave current + // value = 0 = silent + // value = 100 = max + if (value<-1) value = -1; + if (value>100) value = 100; + if (BASS.BASS_RecordSetInput(devid, Bass.BASS_INPUT_ON, value/100.0f)) { + return true; + } else { + raise_log(BASS.GetBassError("BASS_RecordSetInput")); + return false; + } + } + + /** + * Get Record Volume + * @param devid start from 0 + * @return -1 if failed, 0 - 100 if success + */ + public int GetRecordVolume(int devid) { + Bass.FloatValue val = new Bass.FloatValue(); + int result = BASS.BASS_RecordGetInput(devid, val); + if (result==-1) { + // error + raise_log(BASS.GetBassError("BASS_RecordGetInput")); + return -1; + } else { + return (int)(val.value * 100); + } + } + + /** + * Check if already initialized + * @return true if initialized + */ + public boolean IsInitialized() { + return inited; + } + + /** + * Get all Playback Devices + * @return array of BASS_DEVICEINFO + */ + public BASS_DEVICEINFO[] GetPlaybackDevices() { + int ii = 0; + boolean success; + List result = new ArrayList<>(); + do { + BASS_DEVICEINFO dev = new BASS_DEVICEINFO(); + success = BASS.BASS_GetDeviceInfo(ii, dev); + if (success) { + ii++; + result.add(dev); + } + } while(success); + return result.toArray(new BASS_DEVICEINFO[0]); + } + + /** + * Get All Recorder Devices + * @return array of BASS_DEVICEINFO + */ + public BASS_DEVICEINFO[] GetRecorderDevices() { + int ii = 0; + boolean success; + List result = new ArrayList<>(); + do { + BASS_DEVICEINFO dev = new BASS_DEVICEINFO(); + success = BASS.BASS_RecordGetDeviceInfo(ii, dev); + if (success) { + ii++; + result.add(dev); + } + + } while(success); + return result.toArray(new BASS_DEVICEINFO[0]); + } + + /** + * Get Playback Device Info + * @param devid 0 = no sound, 1 = first device + * @return BASS_DEVICEINFO object, or null if failed + */ + public BASS_DEVICEINFO GetPlaybackDeviceInformation(int devid) { + BASS_DEVICEINFO dev = new BASS_DEVICEINFO(); + if (BASS.BASS_GetDeviceInfo(devid, dev)) { + return dev; + } else raise_log(BASS.GetBassError("BASS_GetDeviceInfo")); + return null; + } + + /** + * Get Recorder Device Info + * @param devid 0 = first device + * @return BASS_DEVICEINFO object, or null if failed + */ + public BASS_DEVICEINFO GetRecorderDeviceInformation(int devid) { + BASS_DEVICEINFO dev = new BASS_DEVICEINFO(); + if (BASS.BASS_RecordGetDeviceInfo(devid, dev)) { + return dev; + } else raise_log(BASS.GetBassError("BASS_RecordGetDeviceInfo")); + return null; + } + + private void raise_log(String msg) { + Logger.info(msg); + } + + @SuppressWarnings("BusyWait") + public class ULaw extends basicfunctions{ + public final int[] samplingrate = {8000}; + public final int channel; + public final int bits; + public final AudioEvent1 event; + public ULaw(int bits, int channel, AudioEvent1 event) { + super(48000, Bass.BASS_DEVICE_MONO | Bass.BASS_DEVICE_FREQ); + this.channel = channel; + this.bits = bits; + this.event = event; + } + + /** + * Convert PCM 16bit Bytes to ULaw + * @param pcm PCM Data + * @return ULaw data + */ + private byte[] ConvertPCMToULaw(byte[] pcm) { + //TODO check di sini, harusnya readcount = pcm.length / 2 + // karena PCM 16 bit, ULaw = 8 bit + // tapi gak tau juga, belum cek + int readcount = pcm.length; + byte[] cc = new byte[readcount]; + + ShortBuffer sb = ByteBuffer.wrap(pcm).asShortBuffer(); + ShortBuffer sc = ByteBuffer.wrap(cc).asShortBuffer(); + + // sampe sini dapat PCM nya , convert ke ULaw + + // convert dari PCM to ULaw + while(sb.hasRemaining()) { + sc.put((short)G711.linear2ulaw(sb.get())); + } + return cc; + } + + /** + * Convert file from source to target, in G711 U-Law format + * will raise event ulaw_fileconvertfinish(sourcefile , targetfile) when finished + * @param sourcefilename Source File + * @param targetsamplingrate target sampling rate, only 8000 is supported + * @param targetfilename Target File + * @return true if convesion can be started + */ + @Override + public boolean FileConvert(final String sourcefilename, int targetsamplingrate, final String targetfilename) { + targetsamplingrate = samplingrate[0]; + OpenFile op = new OpenFile(sourcefilename, 0, targetsamplingrate, true); + + if (op.isSuccess()) { + // sampe sini sudah plugged ke Mixer + inited_playback.add(0); + + try(FileOutputStream fos = new FileOutputStream(targetfilename)){ + exec.submit(()->{ + long timestamp = System.currentTimeMillis(); + int totalread = 0; + int readcount; + + try { + do { + Pointer ptr = new Memory(1024); + readcount = BASS.BASS_ChannelGetData(op.getMixerhandle(), ptr, 1024); + if (readcount>0) { + byte[] bb = ptr.getByteArray(0, readcount); + byte[] cc = ConvertPCMToULaw(bb); + + totalread+=readcount; + fos.write(cc); + + } + } while(readcount>0); + + fos.close(); + } catch(IOException e) { + raise_log(MessageFormat.format("FileOutputStream {0} IOException={1}", targetfilename, e.getMessage())); + } + + // sampe sini selesai + long delta = System.currentTimeMillis() - timestamp; + raise_log(MessageFormat.format("ULaw FileConvert from {0} to {1} finished, Bytes Read={2}, Conversion took {3} ms", sourcefilename, targetfilename, totalread, delta)); + if (event!=null) event.fileconvertfinish(sourcefilename, targetfilename); + }); + return true; + } catch(IOException e) { + raise_log("FileOutputStream create exception="+e.getMessage()); + return false; + } finally { + String[] closeerror = op.CloseHandles(); + Stream.of(closeerror).forEach(JSIPAudio.this::raise_log); + } + + + } else { + Stream.of(op.getErrorlist()).forEach(JSIPAudio.this::raise_log); + Stream.of(op.CloseHandles()).forEach(JSIPAudio.this::raise_log); + return false; + } + + + + + } + + /** + * Open File for streaming + * will raise event ulaw_filestreaming + * @param playdevice 0 = no sound, 1 = first audio + * @param sourcefilename Source File to stream + * @param targetsamplingrate target sampling rate, only 8000 is supported + * @return 0 if failed, or other value if success + */ + @Override + public int OpenFileForStreaming(final int playdevice, final String sourcefilename, int targetsamplingrate) { + targetsamplingrate = samplingrate[0]; + + OpenFile op = new OpenFile(sourcefilename, playdevice, targetsamplingrate); + if (op.isSuccess()) { + inited_playback.add(playdevice); + // sampe sini , channel sudah di add + if (op.StartPlayback()) { + exec.submit(()->{ + + int dsphandle = BASS.BASS_ChannelSetDSP(op.getMixerhandle(), (dsp_handle, channel_handle, buffer, length, user)->{ + // di sini dapat PCM dari Mixer + if (length>0) { + byte[] data = buffer.getByteArray(0, length); + byte[] ulaw = ConvertPCMToULaw(data); + if (event!=null) event.filestreaming(sourcefilename, op.getFilehandle(), ulaw); + } + + }, null, 0); + + if (dsphandle!=0) { + // sampe sini , DSP sudah created + long timestamp = System.currentTimeMillis(); + raise_log("Mixer Playback for "+sourcefilename+" started"); + // tinggal loop aja sampe selesai + do { + try { + Thread.sleep(100); + //Thread.yield(); + } catch (InterruptedException e) { + raise_log("Interrupt Exception="+e.getMessage()); + } + } while(BASS.BASS_ChannelIsActive(op.getFilehandle())== Bass.BASS_ACTIVE_PLAYING); + + // finish playback !! + long delta = System.currentTimeMillis() - timestamp; + raise_log("Mixer Playback for "+sourcefilename+" finished, duration="+delta+" ms"); + } else raise_log(BASS.GetBassError("BASS_ChannelSetDSP")); + + // sampe sini selesai semua + Stream.of(op.CloseHandles()).forEach(JSIPAudio.this::raise_log); + }); + + return op.getFilehandle(); + } else { + raise_log(BASS.GetBassError("BASS_ChannelStart")); + Stream.of(op.CloseHandles()).forEach(JSIPAudio.this::raise_log); + return 0; + } + + } else { + Stream.of(op.getErrorlist()).forEach(JSIPAudio.this::raise_log); + Stream.of(op.CloseHandles()).forEach(JSIPAudio.this::raise_log); + return 0; + } + + + + + + } + + /** + * Open Input for streaming + * will raise event ulaw_inputstreaming + * @param recdevice 0 = first recording device + * @param targetsamplingrate target sampling rate, only 8000 is supported + * @return 0 if failed, other value if success + */ + @Override + public int OpenInputForStreaming(final int recdevice, int targetsamplingrate) { + // default ke 8000 + targetsamplingrate = samplingrate[0]; + + OpenInput oi = new OpenInput(recdevice, targetsamplingrate, (handle, buffer, length, user) -> { + + byte[] data = buffer.getByteArray(0,length); + byte[] ulaw = ConvertPCMToULaw(data); + // inputname ada di Pointer user + if (event!=null) event.inputstreaming(user==null ? "": user.getString(0), handle, ulaw); + + return true; // terusin RecordProc + }); + + if (oi.isSuccess()) { + inited_recorder.add(oi.getRecorderdev()); + String[] errorstart = oi.StartRecord(); + if (errorstart.length>0) { + // ada error + Stream.of(oi.getErrorlist()).forEach(JSIPAudio.this::raise_log); + Stream.of(oi.StopRecord()).forEach(JSIPAudio.this::raise_log); + return 0; + } else return oi.getRecordhandle(); // aman + } else { + Stream.of(oi.getErrorlist()).forEach(JSIPAudio.this::raise_log); + Stream.of(oi.StopRecord()).forEach(JSIPAudio.this::raise_log); + return 0; + } + + + + } + + } + + public class PCM extends basicfunctions{ + public PCM(int bits, int channel, AudioEvent1 event) { + super(48000, Bass.BASS_DEVICE_MONO | Bass.BASS_DEVICE_FREQ); + + this.channel = channel; + this.bits = bits; + this.MIME = bits==24 ? "audio/L24" : "audio/L16"; + this.event = event; + + } + + public final int[] samplingrate = {16000, 32000, 44100, 48000}; + public final int channel; + public final int bits; + public final String MIME; + public final AudioEvent1 event; + + private byte[] Convert_PCM16_to_PCM24(byte[] data) { + int length16 = data.length; // length data dalam 16 bit + int length = length16 / 2; // jumlah samples nya, yaitu 16bit dibagi 2 + int length24 = length * 3; // jumlah data dengan samples yang sama, tapi 24 bit + + byte[] result = new byte[length24]; + int jj = 0; + for (int ii=0;ii xx==targetsamplingrate).findAny().orElse(samplingrate[0]); + + OpenFile op = new OpenFile(sourcefilename, 0, samplingfreq, true); + if (op.isSuccess()) { + inited_playback.add(0); + // sampe sini sudah plugged ke Mixer + + try(FileOutputStream fos = new FileOutputStream(targetfilename)){ + + exec.submit(()->{ + long timestamp = System.currentTimeMillis(); + int totalread = 0; + int readcount; + do { + Pointer ptr = new Memory(1024); + readcount = BASS.BASS_ChannelGetData(op.getMixerhandle(), ptr, 1024); + if (readcount>0) { + // ada data + byte[] bb = ptr.getByteArray(0, readcount); + + // tulis ke FileOutputStream + try { + if (bits==24) { + byte[] cc = Convert_PCM16_to_PCM24(bb); + fos.write(cc); + totalread+=cc.length; + } else { + fos.write(bb); + totalread+=bb.length; + } + + } catch (IOException e) { + raise_log("FileOutputStream write exception="+e.getMessage()); + break; + } + } + } while(readcount>0); + + + // close FileOutputStream + try { + fos.close(); + } catch (IOException e) { + raise_log("FileOutputStream close exception="+e.getMessage()); + } + + Stream.of(op.CloseHandles()).forEach(JSIPAudio.this::raise_log); + + long delta = System.currentTimeMillis() - timestamp; + raise_log(MessageFormat.format("FileConvert from {0} to {1} finished, Bytes Read={2}, Conversion took {3} ms", sourcefilename, targetfilename, totalread, delta)); + if (event!=null) event.fileconvertfinish(sourcefilename, targetfilename); + }); + return true; + + + } catch(IOException e) { + raise_log(MessageFormat.format("FileOutputStream {0} Exception={1}", targetfilename, e.getMessage())); + return false; + } finally { + Stream.of(op.CloseHandles()).forEach(JSIPAudio.this::raise_log); + } + } else { + Stream.of(op.getErrorlist()).forEach(JSIPAudio.this::raise_log); + Stream.of(op.CloseHandles()).forEach(JSIPAudio.this::raise_log); + return false; + } + + } + + @Override + public int OpenFileForStreaming(int playdevice, final String sourcefilename, int targetsamplingrate) { + final int samplingfreq = Arrays.stream(samplingrate).filter(xx -> xx==targetsamplingrate).findAny().orElse(samplingrate[0]); + + OpenFile op = new OpenFile(sourcefilename, playdevice, samplingfreq); + if (op.isSuccess()) { + inited_playback.add(playdevice); + if (op.StartPlayback()) { + final int dsphandle = BASS.BASS_ChannelSetDSP(op.getMixerhandle(), (dsp_h, ch_h, buffer,length, user)->{ + // dsp nya disini + byte[] data = buffer.getByteArray(0, length); + byte[] cc = Convert_PCM16_to_PCM24(data); + if (event!=null) event.filestreaming(sourcefilename, op.getFilehandle(),cc); + }, null, 0); + + if (dsphandle==0) { + raise_log(BASS.GetBassError("BASS_ChannelSetDSP")); + Stream.of(op.CloseHandles()).forEach(JSIPAudio.this::raise_log); + return 0; + } + + // sampe sini berhasil + return op.getFilehandle(); + } + else { + raise_log(BASS.GetBassError("BASS_ChannelStart")); + Stream.of(op.CloseHandles()).forEach(JSIPAudio.this::raise_log); + return 0; + } + + } else { + Stream.of(op.getErrorlist()).forEach(JSIPAudio.this::raise_log); + Stream.of(op.CloseHandles()).forEach(JSIPAudio.this::raise_log); + return 0; + } + } + + @Override + public int OpenInputForStreaming(final int recdevice, final int targetsamplingrate) { + final int samplingfreq = Arrays.stream(samplingrate).filter(xx -> xx==targetsamplingrate).findAny().orElse(samplingrate[0]); + + OpenInput oi = new OpenInput(recdevice, samplingfreq, (handle, buffer, length, user) -> { + byte[] data = buffer.getByteArray(0, length); + String recdevname = user==null ? "" : user.getString(0); + if (bits==24) { + if (event!=null) event.inputstreaming(recdevname, handle, Convert_PCM16_to_PCM24(data)); + } else { + if (event!=null) event.inputstreaming(recdevname, handle, data); + } + return true; + }); + + if (oi.isSuccess()) { + inited_recorder.add(oi.getRecorderdev()); + return oi.getRecordhandle(); + } else { + Stream.of(oi.getErrorlist()).forEach(JSIPAudio.this::raise_log); + Stream.of(oi.StopRecord()).forEach(JSIPAudio.this::raise_log); + return 0; + } + + } + + } + + @SuppressWarnings("BusyWait") + public class AAC extends basicfunctions{ + public AAC(int bits, int channel, AudioEvent1 event) { + super(48000, Bass.BASS_DEVICE_MONO | Bass.BASS_DEVICE_FREQ); + + this.bits = bits; + this.channel = channel; + + this.event = event; + } + public final int[] samplingrate = {8000, 16000, 32000, 44100, 48000}; + public final int bits; + public final int channel; + public final String MIME = "audio/mpeg4-generic"; + private final AudioEvent1 event; + + + @Override + public boolean FileConvert(String sourcefilename, final int targetsamplingrate, String targetfilename) { + final int samplingfreq = Arrays.stream(samplingrate).filter(xx->xx==targetsamplingrate).findAny().orElse(samplingrate[0]); + OpenFile op = new OpenFile(sourcefilename, 0, samplingfreq); + if (op.isSuccess()) { + inited_playback.add(0); + // sampe sini sudah plugged ke Mixer + + // create encoder handle dari mixer handle + final int encodehandle = BASSENC_AAC.BASS_Encode_AAC_StartFile(op.getMixerhandle(), null, 0, targetfilename); + if (encodehandle==0) { + // gak bisa create encoder + raise_log(BASS.GetBassError("BASS_Encode_AAC_StartFile")); + // free handle + Stream.of(op.CloseHandles()).forEach(JSIPAudio.this::raise_log); + return false; + } + + // sampe sini encoder jalan + exec.submit(()->{ + do { + try { + Thread.sleep(100); + //Thread.yield(); + } catch (InterruptedException e) { + raise_log("InterruptException"); + } + } while (BASS.BASS_ChannelIsActive(op.getMixerhandle())== Bass.BASS_ACTIVE_PLAYING); + + // free encoder + BASSENC.BASS_Encode_Stop(encodehandle); + // free handle + Stream.of(op.CloseHandles()).forEach(JSIPAudio.this::raise_log); + + if (event!=null) event.fileconvertfinish(sourcefilename, targetfilename); + + }); + return true; + } else { + Stream.of(op.getErrorlist()).forEach(JSIPAudio.this::raise_log); + Stream.of(op.CloseHandles()).forEach(JSIPAudio.this::raise_log); + return false; + } + + } + + + + @Override + public int OpenFileForStreaming(int playdevice, final String sourcefilename, int targetsamplingrate) { + // cari sampling rate yang supported. kalau gak ketemu, pilih default + final int samplingfreq = Arrays.stream(samplingrate) + .filter(xx -> xx == targetsamplingrate) + .findFirst() + .orElse(samplingrate[0]); + + OpenFile op = new OpenFile(sourcefilename, playdevice, samplingfreq); + if (op.isSuccess()) { + inited_playback.add(playdevice); + // sampe sini sudah plugged ke Mixer + if (op.StartPlayback()) { + + final int encodehandle = BASSENC_AAC.BASS_Encode_AAC_Start(op.getMixerhandle(), null, 0, + (encode_handle, source_handle, buffer, length, offset, user)->{ + if (event!=null) event.filestreaming(sourcefilename, op.getFilehandle(), buffer.getByteArray(0,length)); + } + , null); + + if (encodehandle==0) { + raise_log(BASS.GetBassError("BASS_Encode_AAC_Start")); + + // free handle + Stream.of(op.CloseHandles()).forEach(JSIPAudio.this::raise_log); + return 0; + } + + exec.submit(()->{ + do { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + raise_log("InterruptException"); + } + } while(BASS.BASS_ChannelIsActive(op.getMixerhandle())== Bass.BASS_ACTIVE_PLAYING); + + BASSENC.BASS_Encode_Stop(encodehandle); + + // free handle + Stream.of(op.CloseHandles()).forEach(JSIPAudio.this::raise_log); + + }); + + return op.getFilehandle(); + } else { + raise_log(BASS.GetBassError("BASS_ChannelStart")); + Stream.of(op.CloseHandles()).forEach(JSIPAudio.this::raise_log); + return 0; + } + + + } else { + Stream.of(op.getErrorlist()).forEach(JSIPAudio.this::raise_log); + Stream.of(op.CloseHandles()).forEach(JSIPAudio.this::raise_log); + return 0; + } + + + } + + @Override + public int OpenInputForStreaming(int recdevice, final int targetsamplingrate) { + final int samplingfreq = Arrays.stream(samplingrate).filter(xx -> xx==targetsamplingrate).findAny().orElse(samplingrate[0]); + + OpenInput oi = new OpenInput(recdevice, samplingfreq,null); + if (oi.isSuccess()) { + inited_recorder.add(oi.getRecorderdev()); + // sampe sini bisa recording + final int encodehandle = BASSENC_AAC.BASS_Encode_AAC_Start(oi.getRecordhandle(), null, 0, (encode_handle, source_handle, buffer, length, offset, user)->{ + byte[] data = buffer.getByteArray(0, length); + if (event!=null) event.inputstreaming(oi.getDeviceName(), source_handle, data); + }, null); + + if (encodehandle!=0) { + return oi.getRecordhandle(); + } else { + raise_log(BASS.GetBassError("BASS_Encode_AAC_Start")); + Stream.of(oi.StopRecord()).forEach(JSIPAudio.this::raise_log); + } + + } else { + Stream.of(oi.getErrorlist()).forEach(JSIPAudio.this::raise_log); + Stream.of(oi.StopRecord()).forEach(JSIPAudio.this::raise_log); + + } + + return 0; + + + } + + } +} diff --git a/src/Audio/basicfunctions.java b/src/Audio/basicfunctions.java new file mode 100644 index 0000000..4b89495 --- /dev/null +++ b/src/Audio/basicfunctions.java @@ -0,0 +1,311 @@ +package Audio; + +import java.util.ArrayList; +import java.util.List; + +import com.sun.jna.Memory; +import com.sun.jna.Pointer; + +import Audio.Bass.BASS_DEVICEINFO; +import Audio.Bass.RECORDPROC; +import lombok.Getter; + +@SuppressWarnings("unused") +public abstract class basicfunctions { + + abstract public boolean FileConvert(String sourcefilename, int targetsamplingrate, String targetfilename); + abstract public int OpenFileForStreaming(int playdevice, String sourcefilename, int targetsamplingrate); + abstract public int OpenInputForStreaming(int recdevice, int targetsamplingrate); + //used in BASS_Init + protected final int devinit_freq; + protected final int devinit_flag; + private final Bass BASS = Bass.Instance; + private final BassMix BASSMIX = BassMix.Instance; + + public basicfunctions(int init_freq, int init_flag) { + this.devinit_freq = init_freq; + this.devinit_flag = init_flag; + } + + /** + * Stop/Close Input For Streaming + * @param rechandle Recording Handle + * @return true if Input can be stopped + */ + public boolean CloseInputForStreaming(int rechandle) { + return BASS.BASS_ChannelFree(rechandle); + } + + /** + * BASS_Init dengan devinit_freq dan devinit_flag + * @param device playback device start from 0=no sound, 1=first real device + * @return true if playback device inited or already inited + */ + private boolean BassInit(int device) { + if (!BASS.BASS_Init(device, devinit_freq, devinit_flag)) { + // ada gagal init, cek dulu + int err = BASS.BASS_ErrorGetCode(); + // gak boleh gagal + //raise_log(BASS.GetBassError("BASS_Init", err)); + return err == Bass.BASS_ERROR_ALREADY; + } + // sampe sini sukses + return true; + } + + + /** + * BASS_RecordInit + * @param device recorder device, start from 0=first real device + * @return true if recording device inited or already inited + */ + private boolean RecordInit(int device) { + if (!BASS.BASS_RecordInit(device)) { + // ada gagal init, cek dulu + int err = BASS.BASS_ErrorGetCode(); + // gak boleh gagal + //raise_log(BASS.GetBassError("BASS_RecordInit", err)); + return err == Bass.BASS_ERROR_ALREADY; + } + return true; + } + + /** + * OpenInput helper + * @author rdkartono + * + */ + protected class OpenInput{ + @Getter private final int recorderdev; + @Getter private final int samplingrate; + @Getter private boolean success = false; + @Getter private final String[] errorlist; + @Getter private int recordhandle=0; + private final RECORDPROC recproc; + private @Getter BASS_DEVICEINFO devinfo; + + /** + * Open Input + * @param dev 0 = real device + * @param samplingrate sampling rate + * @param proc RECORDPROC to receive PCM data + */ + public OpenInput(int dev, int samplingrate, RECORDPROC proc) { + this.recorderdev = dev; + this.samplingrate = samplingrate; + this.recproc = proc; + errorlist = OpenSequence(); + + } + + private String[] OpenSequence() { + + List error = new ArrayList<>(); + if (RecordInit(recorderdev)) { + devinfo = new BASS_DEVICEINFO(); + if (!BASS.BASS_RecordGetDeviceInfo(recorderdev, devinfo)) devinfo = null; + Pointer user = null; + if (devinfo!=null) { + user = new Memory(devinfo.name.length()+1); + user.setString(0, devinfo.name); + } + + recordhandle = BASS.BASS_RecordStart(samplingrate, 1, Bass.BASS_RECORD_PAUSE, recproc, user); + if (recordhandle!=0) { + success = true; + } else error.add(BASS.GetBassError("BASS_RecordStart")); + } else error.add(BASS.GetBassError("BASS_RecordInit")); + + return error.toArray(new String[0]); + } + + public Pointer PointerToDeviceName() { + if (devinfo==null) + return null; + else { + Pointer pp = new Memory(devinfo.name.length()+1); + pp.setString(0, devinfo.name); + return pp; + } + } + + public String getDeviceName() { + return devinfo==null ? "" : devinfo.name; + } + + /** + * Start Recording + * @return error messages if available + */ + public String[] StartRecord() { + List error = new ArrayList<>(); + if (recordhandle!=0) { + if (BASS.BASS_ChannelStart(recordhandle)) { + // nothing... + } else error.add(BASS.GetBassError("BASS_ChannelStart")); + } else error.add("RecordHandle is zero"); + + return error.toArray(new String[0]); + } + + /** + * Stop Recording + * @return error messages if available + */ + public String[] StopRecord() { + List error = new ArrayList<>(); + if (recordhandle!=0) { + if (BASS.BASS_ChannelFree(recordhandle)) { + // nothing... + } else error.add(BASS.GetBassError("BASS_ChannelStop")); + recordhandle = 0; + } else error.add("RecordHandle is zero"); + + return error.toArray(new String[0]); + } + } + + /** + * OpenFile helper + * @author rdkartono + * + */ + @Getter + protected class OpenFile{ + private final int playbackdev; + private final int samplingrate; + private final String filename; + private final boolean decodingonly; + private boolean success = false; + private int filehandle; + private int mixerhandle; + private int mixerflag; + private final String[] errorlist; + private long ByteSize; + private double Duration; + private BASS_DEVICEINFO devinfo; + + /** + * Create OpenFile object + * @param filename source file name + * @param playbackdev 0 =no sound, 1 = real device + * @param samplingrate sampling rate + * @param decodingonly if true, mixer will have Decoded flag + */ + public OpenFile(String filename, int playbackdev, int samplingrate, boolean decodingonly) { + this.playbackdev = playbackdev; + this.samplingrate = samplingrate; + this.filename = filename; + this.decodingonly = decodingonly; + this.errorlist = OpenSequence(); + if (success) { + ByteSize = BASS.BASS_ChannelGetLength(filehandle, Bass.BASS_POS_BYTE); + Duration = BASS.BASS_ChannelBytes2Seconds(filehandle, ByteSize); + + } + devinfo = new BASS_DEVICEINFO(); + if (!BASS.BASS_GetDeviceInfo(playbackdev, devinfo)) { + devinfo = null; + } + + } + + public Pointer PointerToDeviceName() { + if (devinfo==null) + return null; + else { + Pointer pp = new Memory(devinfo.name.length()+1); + pp.setString(0, devinfo.name); + return pp; + } + } + + public String getDeviceName() { + return devinfo==null ? "" : devinfo.name; + } + + /** + * Create OpenFile Object + * @param filename source file anme + * @param playbackdev 0 = no sound, 1 = real device + * @param samplingrate samplingrate + */ + public OpenFile(String filename, int playbackdev, int samplingrate) { + this(filename, playbackdev, samplingrate, false); + } + + private String[] OpenSequence() { + + List error = new ArrayList<>(); + + if (BassInit(playbackdev)) { + + filehandle = BASS.BASS_StreamCreateFile(false,filename, 0, 0, Bass.BASS_STREAM_DECODE); + if (filehandle!=0) { + mixerflag = decodingonly ? Bass.BASS_STREAM_DECODE : 0; + + mixerhandle = BASSMIX.BASS_Mixer_StreamCreate(samplingrate, 1, mixerflag); + if (mixerhandle!=0) { + if (BASSMIX.BASS_Mixer_StreamAddChannel(mixerhandle, filehandle, Bass.BASS_STREAM_AUTOFREE)) { + success = true; + } else error.add(BASS.GetBassError("BASS_Mixer_StreamAddChannel")); + } else error.add(BASS.GetBassError("BASS_Mixer_StreamCreate")); + } else error.add(BASS.GetBassError("BASS_StreamCreateFile")); + } else error.add(BASS.GetBassError("Bass_Init")); + + return error.toArray(new String[0]); + } + + /** + * Start Playback + * @return true if it can be started + */ + public boolean StartPlayback() { + if (filehandle!=0) { + // file sudah kebuka + if (mixerhandle!=0) { + // mixer sudah kebuka + if (success) { + // sudah plugged in + if (!decodingonly) { + // bukan channel decoding + return BASS.BASS_ChannelStart(filehandle); + } + } + + } + } + return false; + } + + /** + * Close Opened handles + * @return array of string containing error messages + */ + public String[] CloseHandles() { + List error = new ArrayList<>(); + + if (filehandle!=0) { + if (success) { + // sudah plug ke mixer + if (!BASSMIX.BASS_Mixer_ChannelRemove(filehandle)) { + error.add(BASS.GetBassError("BASS_Mixer_ChannelRemove")); + } + } + if (!BASS.BASS_ChannelFree(filehandle)) { + error.add(BASS.GetBassError("BASS_ChannelFree")); + } + + filehandle = 0; + } + if (mixerhandle!=0) { + if (!BASS.BASS_ChannelFree(mixerhandle)) { + error.add(BASS.GetBassError("BASS_ChannelFree")); + } + mixerhandle = 0; + } + + return error.toArray(new String[0]); + } + } +} diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..f5620f8 --- /dev/null +++ b/src/Main.java @@ -0,0 +1,6 @@ +public class Main { + public static void main(String[] args) { + + System.out.println("Hello, World!"); + } +} \ No newline at end of file diff --git a/src/peers/Config.java b/src/peers/Config.java new file mode 100644 index 0000000..165e060 --- /dev/null +++ b/src/peers/Config.java @@ -0,0 +1,53 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010 Yohann Martineau +*/ + +package peers; + +import java.net.InetAddress; + +import peers.media.MediaMode; +import peers.sip.syntaxencoding.SipURI; + +public interface Config { + + public void save(); + public InetAddress getLocalInetAddress(); + public InetAddress getPublicInetAddress(); + public String getUserPart(); + public String getDomain(); + public String getPassword(); + public SipURI getOutboundProxy(); + public int getSipPort(); + public MediaMode getMediaMode(); + public boolean isMediaDebug(); + public String getMediaFile(); + public int getRtpPort(); + public void setLocalInetAddress(InetAddress inetAddress); + public void setPublicInetAddress(InetAddress inetAddress); + public void setUserPart(String userPart); + public void setDomain(String domain); + public void setPassword(String password); + public void setOutboundProxy(SipURI outboundProxy); + public void setSipPort(int sipPort); + public void setMediaMode(MediaMode mediaMode); + public void setMediaDebug(boolean mediaDebug); + public void setMediaFile(String mediaFile); + public void setRtpPort(int rtpPort); + +} diff --git a/src/peers/JavaConfig.java b/src/peers/JavaConfig.java new file mode 100644 index 0000000..c83939f --- /dev/null +++ b/src/peers/JavaConfig.java @@ -0,0 +1,156 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2012 Yohann Martineau +*/ + +package peers; + +import java.net.InetAddress; + +import peers.media.MediaMode; +import peers.sip.syntaxencoding.SipURI; + +public class JavaConfig implements Config { + + private InetAddress localInetAddress; + private InetAddress publicInetAddress; + private String userPart; + private String domain; + private String password; + private SipURI outboundProxy; + private int sipPort; + private MediaMode mediaMode; + private boolean mediaDebug; + private String mediaFile; + private int rtpPort; + + @Override + public void save() { + throw new RuntimeException("not implemented"); + } + + @Override + public InetAddress getLocalInetAddress() { + return localInetAddress; + } + + @Override + public InetAddress getPublicInetAddress() { + return publicInetAddress; + } + + @Override + public String getUserPart() { + return userPart; + } + + @Override + public String getDomain() { + return domain; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public SipURI getOutboundProxy() { + return outboundProxy; + } + + @Override + public int getSipPort() { + return sipPort; + } + + @Override + public MediaMode getMediaMode() { + return mediaMode; + } + + @Override + public boolean isMediaDebug() { + return mediaDebug; + } + + @Override + public int getRtpPort() { + return rtpPort; + } + + @Override + public void setLocalInetAddress(InetAddress inetAddress) { + localInetAddress = inetAddress; + } + + @Override + public void setPublicInetAddress(InetAddress inetAddress) { + publicInetAddress = inetAddress; + } + + @Override + public void setUserPart(String userPart) { + this.userPart = userPart; + } + + @Override + public void setDomain(String domain) { + this.domain = domain; + } + + @Override + public void setPassword(String password) { + this.password = password; + } + + @Override + public void setOutboundProxy(SipURI outboundProxy) { + this.outboundProxy = outboundProxy; + } + + @Override + public void setSipPort(int sipPort) { + this.sipPort = sipPort; + } + + @Override + public void setMediaMode(MediaMode mediaMode) { + this.mediaMode = mediaMode; + } + + @Override + public void setMediaDebug(boolean mediaDebug) { + this.mediaDebug = mediaDebug; + } + + @Override + public void setRtpPort(int rtpPort) { + this.rtpPort = rtpPort; + } + + @Override + public String getMediaFile() { + return mediaFile; + } + + @Override + public void setMediaFile(String mediaFile) { + this.mediaFile = mediaFile; + } + +} diff --git a/src/peers/XmlConfig.java b/src/peers/XmlConfig.java new file mode 100644 index 0000000..059b892 --- /dev/null +++ b/src/peers/XmlConfig.java @@ -0,0 +1,355 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010-2013 Yohann Martineau +*/ + +package peers; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.pmw.tinylog.Logger; +import peers.media.MediaMode; +import peers.sip.RFC3261; +import peers.sip.syntaxencoding.SipURI; +import peers.sip.syntaxencoding.SipUriSyntaxException; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; +public class XmlConfig implements Config { + public final static int RTP_DEFAULT_PORT = 8000; + private File file; + private Document document; + + // persistent variables + + private InetAddress localInetAddress; + private String userPart; + private String domain; + private String password; + private SipURI outboundProxy; + private int sipPort; + private MediaMode mediaMode; + private boolean mediaDebug; + private String mediaFile; + private int rtpPort; + + // corresponding DOM nodes + + private Node ipAddressNode; + private Node userPartNode; + private Node domainNode; + private Node passwordNode; + private Node outboundProxyNode; + private Node sipPortNode; + private Node mediaModeNode; + private Node mediaDebugNode; + private Node mediaFileNode; + private Node rtpPortNode; + + // non-persistent variables + + private InetAddress publicInetAddress; + + //private InetAddress + public XmlConfig(String fileName) { + file = new File(fileName); + if (!file.exists()) { + Logger.debug("config file " + fileName + " not found"); + return; + } + DocumentBuilderFactory documentBuilderFactory = + DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder; + try { + documentBuilder = documentBuilderFactory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + Logger.error("parser configuration exception", e); + return; + } + try { + document = documentBuilder.parse(file); + } catch (SAXException e) { + Logger.error("cannot parse " + fileName,e ); + return; + } catch (IOException e) { + Logger.error("IOException", e); + return; + } + Element documentElement = document.getDocumentElement(); + ipAddressNode = getFirstChild(documentElement, "ipAddress"); + String address = ipAddressNode.getTextContent(); + try { + if (isNullOrEmpty(ipAddressNode)) { + localInetAddress = InetAddress.getLocalHost(); + } else { + localInetAddress = InetAddress.getByName(address); + } + } catch (UnknownHostException e) { + Logger.error("unknown host: " + address, e); + } + userPartNode = getFirstChild(documentElement, "userPart"); + if (isNullOrEmpty(userPartNode)) { + Logger.error("userpart not found in configuration file"); + } else { + userPart = userPartNode.getTextContent(); + } + domainNode = getFirstChild(documentElement, "domain"); + if (isNullOrEmpty(domainNode)) { + Logger.error("domain not found in configuration file"); + } else { + domain = domainNode.getTextContent(); + } + passwordNode = getFirstChild(documentElement, "password"); + if (!isNullOrEmpty(passwordNode)) { + password = passwordNode.getTextContent(); + } + outboundProxyNode = getFirstChild(documentElement, "outboundProxy"); + if (!isNullOrEmpty(outboundProxyNode)) { + String uri = outboundProxyNode.getTextContent(); + try { + outboundProxy = new SipURI(uri); + } catch (SipUriSyntaxException e) { + Logger.error("sip uri syntax exception: " + uri, e); + } + } + sipPortNode = getFirstChild(documentElement, "sipPort"); + if (isNullOrEmpty(sipPortNode)) { + sipPort = RFC3261.TRANSPORT_DEFAULT_PORT; + } else { + sipPort = Integer.parseInt(sipPortNode.getTextContent()); + } + mediaModeNode = getFirstChild(documentElement, "mediaMode"); + if (isNullOrEmpty(mediaModeNode)) { + mediaMode = MediaMode.captureAndPlayback; + } else { + mediaMode = MediaMode.valueOf(mediaModeNode.getTextContent()); + } + mediaDebugNode = getFirstChild(documentElement, "mediaDebug"); + if (isNullOrEmpty(mediaDebugNode)) { + mediaDebug = false; + } else { + mediaDebug = Boolean.parseBoolean(mediaDebugNode.getTextContent()); + } + mediaFileNode = getFirstChild(documentElement, "mediaFile"); + if (!isNullOrEmpty(mediaFileNode)) { + mediaFile = mediaFileNode.getTextContent(); + } + if (mediaMode == MediaMode.file) { + if (mediaFile == null || "".equals(mediaFile.trim())) { + Logger.error("streaming from file but no file provided"); + } + } + rtpPortNode = getFirstChild(documentElement, "rtpPort"); + if (isNullOrEmpty(rtpPortNode)) { + rtpPort = RTP_DEFAULT_PORT; + } else { + rtpPort = Integer.parseInt(rtpPortNode.getTextContent()); + if (rtpPort % 2 != 0) { + Logger.error("rtp port provided is " + rtpPort + + " rtp port must be even"); + } + } + } + + private boolean isNullOrEmpty(Node node) { + return node == null || "".equals(node.getTextContent().trim()); + } + + private Node getFirstChild(Node parent, String childName) { + if (parent == null || childName == null) { + return null; + } + NodeList nodeList = parent.getChildNodes(); + for (int i = 0; i < nodeList.getLength(); ++i) { + Node node = nodeList.item(i); + if (childName.equals(node.getNodeName())) { + return node; + } + } + return null; + } + + @Override + public void save() { + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Transformer transformer; + try { + transformer = transformerFactory.newTransformer(); + } catch (TransformerConfigurationException e) { + Logger.error("cannot create transformer", e); + return; + } + FileWriter fileWriter; + try { + fileWriter = new FileWriter(file); + } catch (IOException e) { + Logger.error("cannot create file writer", e); + return; + } + StreamResult streamResult = new StreamResult(fileWriter); + DOMSource domSource = new DOMSource(document); + try { + transformer.transform(domSource, streamResult); + } catch (TransformerException e) { + Logger.error("cannot save config file", e); + return; + } + Logger.debug("config file saved"); + } + + @Override + public InetAddress getLocalInetAddress() { + return localInetAddress; + } + + @Override + public InetAddress getPublicInetAddress() { + return publicInetAddress; + } + + @Override + public String getUserPart() { + return userPart; + } + + @Override + public String getDomain() { + return domain; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public SipURI getOutboundProxy() { + return outboundProxy; + } + + @Override + public int getSipPort() { + return sipPort; + } + + @Override + public MediaMode getMediaMode() { + return mediaMode; + } + + @Override + public boolean isMediaDebug() { + return mediaDebug; + } + + @Override + public int getRtpPort() { + return rtpPort; + } + + @Override + public void setLocalInetAddress(InetAddress inetAddress) { + this.localInetAddress = inetAddress; + ipAddressNode.setTextContent(inetAddress.getHostAddress()); + } + + @Override + public void setPublicInetAddress(InetAddress inetAddress) { + this.publicInetAddress = inetAddress; + } + + @Override + public void setUserPart(String userPart) { + this.userPart = userPart; + userPartNode.setTextContent(userPart); + } + + @Override + public void setDomain(String domain) { + this.domain = domain; + domainNode.setTextContent(domain); + } + + @Override + public void setPassword(String password) { + this.password = password; + passwordNode.setTextContent(password); + } + + @Override + public void setOutboundProxy(SipURI outboundProxy) { + this.outboundProxy = outboundProxy; + if (outboundProxy == null) { + outboundProxyNode.setTextContent(""); + } else { + outboundProxyNode.setTextContent(outboundProxy.toString()); + } + + } + + @Override + public void setSipPort(int sipPort) { + this.sipPort = sipPort; + sipPortNode.setTextContent(Integer.toString(sipPort)); + } + + @Override + public void setMediaMode(MediaMode mediaMode) { + this.mediaMode = mediaMode; + mediaModeNode.setTextContent(mediaMode.toString()); + } + + @Override + public void setMediaDebug(boolean mediaDebug) { + this.mediaDebug = mediaDebug; + mediaDebugNode.setTextContent(Boolean.toString(mediaDebug)); + } + + @Override + public void setRtpPort(int rtpPort) { + this.rtpPort = rtpPort; + rtpPortNode.setTextContent(Integer.toString(rtpPort)); + } + + @Override + public String getMediaFile() { + return mediaFile; + } + + @Override + public void setMediaFile(String mediaFile) { + this.mediaFile = mediaFile; + } + +} diff --git a/src/peers/javaxsound/JavaxSoundManager.java b/src/peers/javaxsound/JavaxSoundManager.java new file mode 100644 index 0000000..09c406a --- /dev/null +++ b/src/peers/javaxsound/JavaxSoundManager.java @@ -0,0 +1,214 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010, 2011, 2012 Yohann Martineau +*/ + +package peers.javaxsound; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.text.SimpleDateFormat; +import java.util.Date; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.SourceDataLine; +import javax.sound.sampled.TargetDataLine; + + +import org.pmw.tinylog.Logger; +import peers.media.AbstractSoundManager; +import peers.sip.Utils; + +public class JavaxSoundManager extends AbstractSoundManager { + + private AudioFormat audioFormat; + private TargetDataLine targetDataLine; + private SourceDataLine sourceDataLine; + private DataLine.Info targetInfo; + private DataLine.Info sourceInfo; + private FileOutputStream microphoneOutput; + private FileOutputStream speakerInput; + private boolean mediaDebug; + + private String peersHome; + + public JavaxSoundManager(boolean mediaDebug, String peersHome) { + this.mediaDebug = mediaDebug; + this.peersHome = peersHome; + if (peersHome == null) { + this.peersHome = Utils.DEFAULT_PEERS_HOME; + } + // linear PCM 8kHz, 16 bits signed, mono-channel, little endian + audioFormat = new AudioFormat(8000, 16, 1, true, false); + targetInfo = new DataLine.Info(TargetDataLine.class, audioFormat); + sourceInfo = new DataLine.Info(SourceDataLine.class, audioFormat); + + } + + @Override + public void init() { + Logger.debug("openAndStartLines"); + if (mediaDebug) { + SimpleDateFormat simpleDateFormat = + new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); + String date = simpleDateFormat.format(new Date()); + StringBuffer buf = new StringBuffer(); + buf.append(peersHome).append(File.separator); + buf.append(MEDIA_DIR).append(File.separator); + buf.append(date).append("_"); + buf.append(audioFormat.getEncoding()).append("_"); + buf.append(audioFormat.getSampleRate()).append("_"); + buf.append(audioFormat.getSampleSizeInBits()).append("_"); + buf.append(audioFormat.getChannels()).append("_"); + buf.append(audioFormat.isBigEndian() ? "be" : "le"); + try { + microphoneOutput = new FileOutputStream(buf.toString() + + "_microphone.output"); + speakerInput = new FileOutputStream(buf.toString() + + "_speaker.input"); + } catch (FileNotFoundException e) { + Logger.error("cannot create file", e); + return; + } + } + // AccessController.doPrivileged added for plugin compatibility + AccessController.doPrivileged( + new PrivilegedAction() { + + @Override + public Void run() { + try { + targetDataLine = (TargetDataLine) AudioSystem.getLine(targetInfo); + targetDataLine.open(audioFormat); + + } catch (LineUnavailableException e) { + Logger.error("target line unavailable", e); + return null; + } catch (SecurityException e) { + Logger.error("security exception", e); + return null; + } catch (Throwable t) { + Logger.error("throwable " + t.getMessage()); + return null; + } + targetDataLine.start(); + try { + sourceDataLine = (SourceDataLine) AudioSystem.getLine(sourceInfo); + sourceDataLine.open(audioFormat); + + } catch (LineUnavailableException e) { + Logger.error("source line unavailable", e); + return null; + } + sourceDataLine.start(); + return null; + } + }); + + } + + @Override + public synchronized void close() { + Logger.debug("closeLines"); + if (microphoneOutput != null) { + try { + microphoneOutput.close(); + } catch (IOException e) { + Logger.error("cannot close file", e); + } + microphoneOutput = null; + } + if (speakerInput != null) { + try { + speakerInput.close(); + } catch (IOException e) { + Logger.error("cannot close file", e); + } + speakerInput = null; + } + // AccessController.doPrivileged added for plugin compatibility + AccessController.doPrivileged(new PrivilegedAction() { + + @Override + public Void run() { + if (targetDataLine != null) { + targetDataLine.close(); + targetDataLine = null; + } + if (sourceDataLine != null) { + sourceDataLine.drain(); + sourceDataLine.stop(); + sourceDataLine.close(); + sourceDataLine = null; + } + return null; + } + }); + } + + @Override + public synchronized byte[] readData() { + if (targetDataLine == null) { + return null; + } + int ready = targetDataLine.available(); + while (ready == 0) { + try { + Thread.sleep(2); + ready = targetDataLine.available(); + } catch (InterruptedException e) { + return null; + } + } + if (ready <= 0) { + return null; + } + byte[] buffer = new byte[ready]; + targetDataLine.read(buffer, 0, buffer.length); + if (mediaDebug) { + try { + microphoneOutput.write(buffer, 0, buffer.length); + } catch (IOException e) { + Logger.error("cannot write to file", e); + return null; + } + } + return buffer; + } + + @Override + public int writeData(byte[] buffer, int offset, int length) { + int numberOfBytesWritten = sourceDataLine.write(buffer, offset, length); + if (mediaDebug) { + try { + speakerInput.write(buffer, offset, numberOfBytesWritten); + } catch (IOException e) { + Logger.error("cannot write to file", e); + return -1; + } + } + return numberOfBytesWritten; + } + +} diff --git a/src/peers/media/AbstractSoundManager.java b/src/peers/media/AbstractSoundManager.java new file mode 100644 index 0000000..236a476 --- /dev/null +++ b/src/peers/media/AbstractSoundManager.java @@ -0,0 +1,28 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2013 Yohann Martineau +*/ +package peers.media; + +public abstract class AbstractSoundManager implements SoundSource { + + public final static String MEDIA_DIR = "media"; + + public abstract void init(); + public abstract void close(); + public abstract int writeData(byte[] buffer, int offset, int length); +} diff --git a/src/peers/media/Capture.java b/src/peers/media/Capture.java new file mode 100644 index 0000000..1fa23a0 --- /dev/null +++ b/src/peers/media/Capture.java @@ -0,0 +1,80 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2008, 2009, 2010, 2011 Yohann Martineau +*/ + +package peers.media; + +import org.pmw.tinylog.Logger; + +import java.io.IOException; +import java.io.PipedOutputStream; +import java.util.concurrent.CountDownLatch; + + + + +public class Capture implements Runnable { + + public static final int SAMPLE_SIZE = 16; + public static final int BUFFER_SIZE = SAMPLE_SIZE * 20; + + private PipedOutputStream rawData; + private boolean isStopped; + private SoundSource soundSource; + + private CountDownLatch latch; + + public Capture(PipedOutputStream rawData, SoundSource soundSource, + CountDownLatch latch) { + this.rawData = rawData; + this.soundSource = soundSource; + this.latch = latch; + isStopped = false; + } + + public void run() { + byte[] buffer; + + while (!isStopped) { + buffer = soundSource.readData(); + try { + if (buffer == null) { + break; + } + rawData.write(buffer); + rawData.flush(); + } catch (IOException e) { + Logger.error("input/output error", e); + return; + } + } + latch.countDown(); + if (latch.getCount() != 0) { + try { + latch.await(); + } catch (InterruptedException e) { + Logger.error("interrupt exception", e); + } + } + } + + public synchronized void setStopped(boolean isStopped) { + this.isStopped = isStopped; + } + +} diff --git a/src/peers/media/CaptureRtpSender.java b/src/peers/media/CaptureRtpSender.java new file mode 100644 index 0000000..4f8d794 --- /dev/null +++ b/src/peers/media/CaptureRtpSender.java @@ -0,0 +1,130 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007-2013 Yohann Martineau +*/ + +package peers.media; + +import java.io.IOException; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.util.concurrent.CountDownLatch; + + +import org.pmw.tinylog.Logger; +import peers.rtp.RFC3551; +import peers.rtp.RtpSession; +import peers.sdp.Codec; + + + +public class CaptureRtpSender { + + public static final int PIPE_SIZE = 4096; + + private RtpSession rtpSession; + private Capture capture; + private Encoder encoder; + private RtpSender rtpSender; + + public CaptureRtpSender(RtpSession rtpSession, SoundSource soundSource, + boolean mediaDebug, Codec codec, String peersHome) + throws IOException { + super(); + this.rtpSession = rtpSession; + // the use of PipedInputStream and PipedOutputStream in Capture, + // Encoder and RtpSender imposes a synchronization point at the + // end of life of those threads to a void read end dead exceptions + CountDownLatch latch = new CountDownLatch(3); + PipedOutputStream rawDataOutput = new PipedOutputStream(); + PipedInputStream rawDataInput; + try { + rawDataInput = new PipedInputStream(rawDataOutput, PIPE_SIZE); + } catch (IOException e) { + Logger.error("input/output error", e); + return; + } + + PipedOutputStream encodedDataOutput = new PipedOutputStream(); + PipedInputStream encodedDataInput; + try { + encodedDataInput = new PipedInputStream(encodedDataOutput, + PIPE_SIZE); + } catch (IOException e) { + Logger.error("input/output error"); + rawDataInput.close(); + return; + } + capture = new Capture(rawDataOutput, soundSource, latch); + switch (codec.getPayloadType()) { + case RFC3551.PAYLOAD_TYPE_PCMU: + encoder = new PcmuEncoder(rawDataInput, encodedDataOutput, + mediaDebug, peersHome, latch); + break; + case RFC3551.PAYLOAD_TYPE_PCMA: + encoder = new PcmaEncoder(rawDataInput, encodedDataOutput, + mediaDebug, peersHome, latch); + break; + default: + encodedDataInput.close(); + rawDataInput.close(); + throw new RuntimeException("unknown payload type"); + } + rtpSender = new RtpSender(encodedDataInput, rtpSession, mediaDebug, + codec, peersHome, latch); + } + + public void start() throws IOException { + + capture.setStopped(false); + encoder.setStopped(false); + rtpSender.setStopped(false); + + Thread captureThread = new Thread(capture, + Capture.class.getSimpleName()); + Thread encoderThread = new Thread(encoder, + Encoder.class.getSimpleName()); + Thread rtpSenderThread = new Thread(rtpSender, + RtpSender.class.getSimpleName()); + + captureThread.start(); + encoderThread.start(); + rtpSenderThread.start(); + + } + + public void stop() { + if (capture != null) { + capture.setStopped(true); + } + if (encoder != null) { + encoder.setStopped(true); + } + if (rtpSender != null) { + rtpSender.setStopped(true); + } + } + + public synchronized RtpSession getRtpSession() { + return rtpSession; + } + + public RtpSender getRtpSender() { + return rtpSender; + } + +} diff --git a/src/peers/media/Decoder.java b/src/peers/media/Decoder.java new file mode 100644 index 0000000..c9e2793 --- /dev/null +++ b/src/peers/media/Decoder.java @@ -0,0 +1,26 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010 Yohann Martineau +*/ + +package peers.media; + +public abstract class Decoder { + + public abstract byte[] process(byte[] media); + +} diff --git a/src/peers/media/DtmfFactory.java b/src/peers/media/DtmfFactory.java new file mode 100644 index 0000000..d209306 --- /dev/null +++ b/src/peers/media/DtmfFactory.java @@ -0,0 +1,95 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010 Yohann Martineau +*/ + +package peers.media; + +import java.util.ArrayList; +import java.util.List; + +import peers.rtp.RFC4733; +import peers.rtp.RtpPacket; + +public class DtmfFactory { + + public List createDtmfPackets(char digit) { + List packets = new ArrayList(); + byte[] data = new byte[4]; + // RFC4733 + if (digit == '*') { + data[0] = 10; + } else if (digit == '#') { + data[0] = 11; + } else if (digit >= 'A' && digit <= 'D') { + data[0] = (byte) (digit - 53); + } else { + data[0] = (byte) (digit - 48); + } + data[1] = 10; // volume 10 + // Set Duration to 160 + // duration 8 bits + data[2] = 0; + // duration 8 bits + data[3] = -96; + + RtpPacket rtpPacket = new RtpPacket(); + rtpPacket.setData(data); + rtpPacket.setPayloadType(RFC4733.PAYLOAD_TYPE_TELEPHONE_EVENT); + rtpPacket.setMarker(true); + packets.add(rtpPacket); + + // two classical packets + + rtpPacket = new RtpPacket(); + // set duration to 320 + data = data.clone(); + data[2] = 1; + data[3] = 64; + rtpPacket.setData(data); + rtpPacket.setMarker(false); + rtpPacket.setPayloadType(RFC4733.PAYLOAD_TYPE_TELEPHONE_EVENT); + packets.add(rtpPacket); + + rtpPacket = new RtpPacket(); + // set duration to 320 + data = data.clone(); + data[2] = 1; + data[3] = -32; + rtpPacket.setData(data); + rtpPacket.setMarker(false); + rtpPacket.setPayloadType(RFC4733.PAYLOAD_TYPE_TELEPHONE_EVENT); + packets.add(rtpPacket); + + data = data.clone(); + // create three end event packets + data[1] = -0x76; // end event flag + volume set to 10 + // set Duration to 640 + data[2] = 2; // duration 8 bits + data[3] = -128; // duration 8 bits + for (int r = 0; r < 3; r++) { + rtpPacket = new RtpPacket(); + rtpPacket.setData(data); + rtpPacket.setMarker(false); + rtpPacket.setPayloadType(RFC4733.PAYLOAD_TYPE_TELEPHONE_EVENT); + packets.add(rtpPacket); + } + + return packets; + } + +} diff --git a/src/peers/media/Echo.java b/src/peers/media/Echo.java new file mode 100644 index 0000000..370b9f5 --- /dev/null +++ b/src/peers/media/Echo.java @@ -0,0 +1,80 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2009, 2010, 2012 Yohann Martineau +*/ + +package peers.media; + +import org.pmw.tinylog.Logger; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketTimeoutException; +import java.net.UnknownHostException; + + + +public class Echo implements Runnable { + + public static final int BUFFER_SIZE = 2048; + + private DatagramSocket datagramSocket; + private InetAddress remoteAddress; + private int remotePort; + private boolean isRunning; + + + public Echo(DatagramSocket datagramSocket, + String remoteAddress, int remotePort) + throws UnknownHostException { + this.datagramSocket = datagramSocket; + this.remoteAddress = InetAddress.getByName(remoteAddress); + this.remotePort = remotePort; + isRunning = true; + } + + @Override + public void run() { + try { + while (isRunning) { + byte[] buf = new byte[BUFFER_SIZE]; + DatagramPacket datagramPacket = new DatagramPacket(buf, + buf.length); + try { + datagramSocket.receive(datagramPacket); + } catch (SocketTimeoutException e) { + Logger.debug("echo socket timeout"); + continue; + } + datagramPacket = new DatagramPacket(buf, + datagramPacket.getLength(), remoteAddress, remotePort); + datagramSocket.send(datagramPacket); + } + } catch (IOException e) { + Logger.error("input/output error", e); + } finally { + datagramSocket.close(); + } + + } + + public synchronized void stop() { + isRunning = false; + } +} diff --git a/src/peers/media/Encoder.java b/src/peers/media/Encoder.java new file mode 100644 index 0000000..24e594d --- /dev/null +++ b/src/peers/media/Encoder.java @@ -0,0 +1,149 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2008, 2009, 2010, 2011 Yohann Martineau +*/ + +package peers.media; + +import org.pmw.tinylog.Logger; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.concurrent.CountDownLatch; + + + + +public abstract class Encoder implements Runnable { + + private PipedInputStream rawData; + private PipedOutputStream encodedData; + private boolean isStopped; + private FileOutputStream encoderOutput; + private FileOutputStream encoderInput; + private boolean mediaDebug; + + private String peersHome; + private CountDownLatch latch; + + public Encoder(PipedInputStream rawData, PipedOutputStream encodedData, + boolean mediaDebug, String peersHome, + CountDownLatch latch) { + this.rawData = rawData; + this.encodedData = encodedData; + this.mediaDebug = mediaDebug; + this.peersHome = peersHome; + this.latch = latch; + isStopped = false; + } + + public void run() { + byte[] buffer; + if (mediaDebug) { + SimpleDateFormat simpleDateFormat = + new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); + String date = simpleDateFormat.format(new Date()); + String dir = peersHome + File.separator + + AbstractSoundManager.MEDIA_DIR + File.separator; + String fileName = dir + date + "_g711_encoder.output"; + try { + encoderOutput = new FileOutputStream(fileName); + fileName = dir + date + "_g711_encoder.input"; + encoderInput = new FileOutputStream(fileName); + } catch (FileNotFoundException e) { + Logger.error("cannot create file", e); + return; + } + } + int ready; + while (!isStopped) { + try { + ready = rawData.available(); + while (ready == 0 && !isStopped) { + try { + Thread.sleep(2); + ready = rawData.available(); + } catch (InterruptedException e) { + Logger.error("interrupt exception", e); + } + } + if (isStopped) { + break; + } + buffer = new byte[ready]; + rawData.read(buffer); + if (mediaDebug) { + try { + encoderInput.write(buffer); + } catch (IOException e) { + Logger.error("cannot write to file", e); + } + } + } catch (IOException e) { + Logger.error("input/output error", e); + return; + } + + byte[] ulawData = process(buffer); + if (mediaDebug) { + try { + encoderOutput.write(ulawData); + } catch (IOException e) { + Logger.error("cannot write to file", e); + break; + } + } + try { + encodedData.write(ulawData); + encodedData.flush(); + } catch (IOException e) { + Logger.error("input/output error", e); + return; + } + } + if (mediaDebug) { + try { + encoderOutput.close(); + encoderInput.close(); + } catch (IOException e) { + Logger.error("cannot close file", e); + return; + } + } + latch.countDown(); + if (latch.getCount() != 0) { + try { + latch.await(); + } catch (InterruptedException e) { + Logger.error("interrupt exception", e); + } + } + } + + public synchronized void setStopped(boolean isStopped) { + this.isStopped = isStopped; + } + + public abstract byte[] process(byte[] media); + +} diff --git a/src/peers/media/FileReader.java b/src/peers/media/FileReader.java new file mode 100644 index 0000000..0aacbb9 --- /dev/null +++ b/src/peers/media/FileReader.java @@ -0,0 +1,96 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2012 Yohann Martineau +*/ +package peers.media; + +import org.pmw.tinylog.Logger; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; + + + +// To create an audio file for peers, you can use audacity: +// +// Edit > Preferences +// +// - Peripherals +// - Channels: 1 (Mono) +// - Quality +// - Sampling frequency of default: 8000 Hz +// - Default Sample Format: 16 bits +// +// Validate +// +// Record audio +// +// File > Export +// +// - File name: test.raw +// +// Validate + +public class FileReader implements SoundSource { + + public final static int BUFFER_SIZE = 256; + + private FileInputStream fileInputStream; + + public FileReader(String fileName) { + try { + fileInputStream = new FileInputStream(fileName); + } catch (FileNotFoundException e) { + Logger.error("file not found: {}, exceptin : {}" , fileName, e); + } + } + + public synchronized void close() { + if (fileInputStream != null) { + try { + fileInputStream.close(); + } catch (IOException e) { + Logger.error("io exception {}", e); + } + fileInputStream = null; + } + } + + @Override + public synchronized byte[] readData() { + if (fileInputStream == null) { + return null; + } + byte buffer[] = new byte[BUFFER_SIZE]; + try { + if (fileInputStream.read(buffer) >= 0) { + Thread.sleep(15); + return buffer; + } else { + fileInputStream.close(); + fileInputStream = null; + } + } catch (IOException e) { + Logger.error("io exception {}", e); + } catch (InterruptedException e) { + Logger.error("file reader interrupted {}", e); + } + return null; + } + +} diff --git a/src/peers/media/IncomingRtpReader.java b/src/peers/media/IncomingRtpReader.java new file mode 100644 index 0000000..5e967a0 --- /dev/null +++ b/src/peers/media/IncomingRtpReader.java @@ -0,0 +1,69 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.media; + +import java.io.IOException; + + +import org.pmw.tinylog.Logger; +import peers.rtp.RFC3551; +import peers.rtp.RtpListener; +import peers.rtp.RtpPacket; +import peers.rtp.RtpSession; +import peers.sdp.Codec; + +public class IncomingRtpReader implements RtpListener { + + private RtpSession rtpSession; + private AbstractSoundManager soundManager; + private Decoder decoder; + + public IncomingRtpReader(RtpSession rtpSession, + AbstractSoundManager soundManager, Codec codec) + throws IOException { + Logger.debug("playback codec:" + codec.toString().trim()); + this.rtpSession = rtpSession; + this.soundManager = soundManager; + switch (codec.getPayloadType()) { + case RFC3551.PAYLOAD_TYPE_PCMU: + decoder = new PcmuDecoder(); + break; + case RFC3551.PAYLOAD_TYPE_PCMA: + decoder = new PcmaDecoder(); + break; + default: + throw new RuntimeException("unsupported payload type"); + } + rtpSession.addRtpListener(this); + } + + public void start() { + rtpSession.start(); + } + + @Override + public void receivedRtpPacket(RtpPacket rtpPacket) { + byte[] rawBuf = decoder.process(rtpPacket.getData()); + if (soundManager != null) { + soundManager.writeData(rawBuf, 0, rawBuf.length); + } + } + +} diff --git a/src/peers/media/MediaManager.java b/src/peers/media/MediaManager.java new file mode 100644 index 0000000..7fc2dc5 --- /dev/null +++ b/src/peers/media/MediaManager.java @@ -0,0 +1,335 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010-2013 Yohann Martineau +*/ + +package peers.media; + +import java.io.IOException; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.List; + +import Audio.BassFileReader; + +import org.pmw.tinylog.Logger; +import peers.rtp.RtpPacket; +import peers.rtp.RtpSession; +import peers.sdp.Codec; +import peers.sip.core.useragent.UserAgent; + +public class MediaManager { + + public static final int DEFAULT_CLOCK = 8000; // Hz + + private UserAgent userAgent; + private CaptureRtpSender captureRtpSender; + private IncomingRtpReader incomingRtpReader; + private RtpSession rtpSession; + private DtmfFactory dtmfFactory; + + private DatagramSocket datagramSocket; + //private FileReader fileReader; + private BassFileReader fileReader; + + public MediaManager(UserAgent userAgent) { + this.userAgent = userAgent; + dtmfFactory = new DtmfFactory(); + } + + private void startRtpSessionOnSuccessResponse(String localAddress, + String remoteAddress, int remotePort, Codec codec, + SoundSource soundSource) { + InetAddress inetAddress; + try { + inetAddress = InetAddress.getByName(localAddress); + } catch (UnknownHostException e) { + Logger.error("unknown host: " + localAddress, e); + return; + } + + rtpSession = new RtpSession(inetAddress, datagramSocket, + userAgent.isMediaDebug(), userAgent.getPeersHome()); + + try { + inetAddress = InetAddress.getByName(remoteAddress); + rtpSession.setRemoteAddress(inetAddress); + } catch (UnknownHostException e) { + Logger.error("unknown host: " + remoteAddress, e); + } + rtpSession.setRemotePort(remotePort); + + + try { + captureRtpSender = new CaptureRtpSender(rtpSession, + soundSource, userAgent.isMediaDebug(), codec, userAgent.getPeersHome()); + } catch (IOException e) { + Logger.error("input/output error", e); + return; + } + + try { + captureRtpSender.start(); + } catch (IOException e) { + Logger.error("input/output error", e); + } + } + + public void successResponseReceived(String localAddress, + String remoteAddress, int remotePort, Codec codec) { + switch (userAgent.getMediaMode()) { + case captureAndPlayback: + AbstractSoundManager soundManager = userAgent.getSoundManager(); + soundManager.init(); + startRtpSessionOnSuccessResponse(localAddress, remoteAddress, + remotePort, codec, soundManager); + + try { + incomingRtpReader = new IncomingRtpReader( + captureRtpSender.getRtpSession(), soundManager, codec); + } catch (IOException e) { + Logger.error("input/output error", e); + return; + } + + incomingRtpReader.start(); + break; + + case echo: + Echo echo; + try { + echo = new Echo(datagramSocket, remoteAddress, remotePort); + } catch (UnknownHostException e) { + Logger.error("unknown host amongst " + + localAddress + " or " + remoteAddress); + return; + } + userAgent.setEcho(echo); + Thread echoThread = new Thread(echo, Echo.class.getSimpleName()); + echoThread.start(); + break; + case file: + String fileName = userAgent.getConfig().getMediaFile(); + //fileReader = new FileReader(fileName); + fileReader = new BassFileReader(fileName,null); + + startRtpSessionOnSuccessResponse(localAddress, remoteAddress, + remotePort, codec, fileReader); + try { + incomingRtpReader = new IncomingRtpReader( + captureRtpSender.getRtpSession(), null, codec); + } catch (IOException e) { + Logger.error("input/output error", e); + return; + } + + incomingRtpReader.start(); + break; + case none: + default: + break; + } + } + + private void startRtpSession(String destAddress, int destPort, + Codec codec, SoundSource soundSource) { + rtpSession = new RtpSession(userAgent.getConfig() + .getLocalInetAddress(), datagramSocket, + userAgent.isMediaDebug(), userAgent.getPeersHome()); + + try { + InetAddress inetAddress = InetAddress.getByName(destAddress); + rtpSession.setRemoteAddress(inetAddress); + } catch (UnknownHostException e) { + Logger.error("unknown host: " + destAddress, e); + } + rtpSession.setRemotePort(destPort); + + try { + captureRtpSender = new CaptureRtpSender(rtpSession, + soundSource, userAgent.isMediaDebug(), codec, userAgent.getPeersHome()); + } catch (IOException e) { + Logger.error("input/output error", e); + return; + } + try { + captureRtpSender.start(); + } catch (IOException e) { + Logger.error("input/output error", e); + } + + } + + public void handleAck(String destAddress, int destPort, Codec codec) { + switch (userAgent.getMediaMode()) { + case captureAndPlayback: + + AbstractSoundManager soundManager = userAgent.getSoundManager(); + soundManager.init(); + + startRtpSession(destAddress, destPort, codec, soundManager); + + try { + //FIXME RTP sessions can be different ! + incomingRtpReader = new IncomingRtpReader(rtpSession, + soundManager, codec); + } catch (IOException e) { + Logger.error("input/output error", e); + return; + } + + incomingRtpReader.start(); + + break; + case echo: + Echo echo; + try { + echo = new Echo(datagramSocket, destAddress, destPort); + } catch (UnknownHostException e) { + Logger.error("unknown host amongst " + + userAgent.getConfig().getLocalInetAddress() + .getHostAddress() + " or " + destAddress); + return; + } + userAgent.setEcho(echo); + Thread echoThread = new Thread(echo, Echo.class.getSimpleName()); + echoThread.start(); + break; + case file: + if (fileReader != null) { + fileReader.close(); + } + String fileName = userAgent.getConfig().getMediaFile(); + //fileReader = new FileReader(fileName); + fileReader = new BassFileReader(fileName, null); + + startRtpSession(destAddress, destPort, codec, fileReader); + try { + incomingRtpReader = new IncomingRtpReader(rtpSession, + null, codec); + } catch (IOException e) { + Logger.error("input/output error", e); + return; + } + incomingRtpReader.start(); + break; + case none: + default: + break; + } + } + + public void updateRemote(String destAddress, int destPort, Codec codec) { + switch (userAgent.getMediaMode()) { + case captureAndPlayback: + try { + InetAddress inetAddress = InetAddress.getByName(destAddress); + rtpSession.setRemoteAddress(inetAddress); + } catch (UnknownHostException e) { + Logger.error("unknown host: " + destAddress, e); + } + rtpSession.setRemotePort(destPort); + break; + case echo: + //TODO update echo socket + break; + case file: + try { + InetAddress inetAddress = InetAddress.getByName(destAddress); + rtpSession.setRemoteAddress(inetAddress); + } catch (UnknownHostException e) { + Logger.error("unknown host: " + destAddress, e); + } + rtpSession.setRemotePort(destPort); + break; + + default: + break; + } + + } + + public void sendDtmf(char digit) { + if (captureRtpSender != null) { + List rtpPackets = dtmfFactory.createDtmfPackets(digit); + RtpSender rtpSender = captureRtpSender.getRtpSender(); + rtpSender.pushPackets(rtpPackets); + } + } + + public void stopSession() { + if (rtpSession != null) { + rtpSession.stop(); + while (!rtpSession.isSocketClosed()) { + try { + Thread.sleep(15); + } catch (InterruptedException e) { + Logger.debug("sleep interrupted"); + } + } + rtpSession = null; + } + if (incomingRtpReader != null) { + incomingRtpReader = null; + } + if (captureRtpSender != null) { + captureRtpSender.stop(); + captureRtpSender = null; + } + if (datagramSocket != null) { + datagramSocket = null; + } + + switch (userAgent.getMediaMode()) { + case captureAndPlayback: + AbstractSoundManager soundManager = userAgent.getSoundManager(); + if (soundManager != null) { + soundManager.close(); + } + break; + case echo: + Echo echo = userAgent.getEcho(); + if (echo != null) { + echo.stop(); + userAgent.setEcho(null); + } + break; + case file: + fileReader.close(); + break; + default: + break; + } + } + + public void setDatagramSocket(DatagramSocket datagramSocket) { + this.datagramSocket = datagramSocket; + } + + public DatagramSocket getDatagramSocket() { + return datagramSocket; + } + +// public FileReader getFileReader() { +// return fileReader; +// } + + public BassFileReader getFileReader() { + return fileReader; + } +} diff --git a/src/peers/media/MediaMode.java b/src/peers/media/MediaMode.java new file mode 100644 index 0000000..d92f9b5 --- /dev/null +++ b/src/peers/media/MediaMode.java @@ -0,0 +1,24 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010 Yohann Martineau +*/ + +package peers.media; + +public enum MediaMode { + none, captureAndPlayback, echo, file +} diff --git a/src/peers/media/PcmaDecoder.java b/src/peers/media/PcmaDecoder.java new file mode 100644 index 0000000..9afdeb7 --- /dev/null +++ b/src/peers/media/PcmaDecoder.java @@ -0,0 +1,71 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010 Oleg Kulikov, Yohann Martineau +*/ + +package peers.media; + +public class PcmaDecoder extends Decoder { + + private static short aLawDecompressTable[] = new short[]{ + -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736, + -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784, + -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368, + -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392, + -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944, + -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136, + -11008, -10496, -12032, -11520, -8960, -8448, -9984, -9472, + -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568, + -344, -328, -376, -360, -280, -264, -312, -296, + -472, -456, -504, -488, -408, -392, -440, -424, + -88, -72, -120, -104, -24, -8, -56, -40, + -216, -200, -248, -232, -152, -136, -184, -168, + -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184, + -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696, + -688, -656, -752, -720, -560, -528, -624, -592, + -944, -912, -1008, -976, -816, -784, -880, -848, + 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, + 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, + 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, + 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, + 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, + 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, + 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, + 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, + 344, 328, 376, 360, 280, 264, 312, 296, + 472, 456, 504, 488, 408, 392, 440, 424, + 88, 72, 120, 104, 24, 8, 56, 40, + 216, 200, 248, 232, 152, 136, 184, 168, + 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, + 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, + 688, 656, 752, 720, 560, 528, 624, 592, + 944, 912, 1008, 976, 816, 784, 880, 848 + }; + + @Override + public byte[] process(byte[] media) { + byte[] res = new byte[media.length * 2]; + int j = 0; + for (int i = 0; i < media.length; i++) { + short s = aLawDecompressTable[media[i] & 0xff]; + res[j++] = (byte) s; + res[j++] = (byte) (s >> 8); + } + return res; + } + +} diff --git a/src/peers/media/PcmaEncoder.java b/src/peers/media/PcmaEncoder.java new file mode 100644 index 0000000..4511646 --- /dev/null +++ b/src/peers/media/PcmaEncoder.java @@ -0,0 +1,98 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010, 2011 Oleg Kulikov, Yohann Martineau +*/ + +package peers.media; + +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.util.concurrent.CountDownLatch; + + + +public class PcmaEncoder extends Encoder { + + private final static int cClip = 32635; + private static byte aLawCompressTable[] = new byte[]{ + 1, 1, 2, 2, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7 + }; + + public PcmaEncoder(PipedInputStream rawData, PipedOutputStream encodedData, + boolean mediaDebug, String peersHome, + CountDownLatch latch) { + super(rawData, encodedData, mediaDebug, peersHome, latch); + } + + @Override + public byte[] process(byte[] media) { + byte[] compressed = new byte[media.length / 2]; + + int j = 0; + for (int i = 0; i < compressed.length; i++) { + short sample = (short) (((media[j++] & 0xff) | (media[j++]) << 8)); + compressed[i] = linearToALawSample(sample); + } + return compressed; + } + + /** + * Compress 16bit value to 8bit value + * + * @param sample 16-bit sample + * @return compressed 8-bit value. + */ + private byte linearToALawSample(short sample) { + int sign; + int exponent; + int mantissa; + int s; + + sign = ((~sample) >> 8) & 0x80; + if (!(sign == 0x80)) { + sample = (short) -sample; + } + if (sample > cClip) { + sample = cClip; + } + if (sample >= 256) { + exponent = (int) aLawCompressTable[(sample >> 8) & 0x7F]; + mantissa = (sample >> (exponent + 3)) & 0x0F; + s = (exponent << 4) | mantissa; + } else { + s = sample >> 4; + } + s ^= (sign ^ 0x55); + return (byte) s; + } + +} diff --git a/src/peers/media/PcmuDecoder.java b/src/peers/media/PcmuDecoder.java new file mode 100644 index 0000000..8d98465 --- /dev/null +++ b/src/peers/media/PcmuDecoder.java @@ -0,0 +1,103 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010 Oleg Kulikov, Yohann Martineau +*/ + +package peers.media; + +public class PcmuDecoder extends Decoder { + +// private final static int cBias = 0x84; +// private int QUANT_MASK = 0xf; +// private final static int SEG_SHIFT = 4; +// private final static int SEG_MASK = 0x70; +// private final static int SIGN_BIT = 0x80; + private static short muLawDecompressTable[] = new short[]{ + -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956, + -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764, + -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412, + -11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316, + -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140, + -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092, + -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004, + -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980, + -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436, + -1372, -1308, -1244, -1180, -1116, -1052, -988, -924, + -876, -844, -812, -780, -748, -716, -684, -652, + -620, -588, -556, -524, -492, -460, -428, -396, + -372, -356, -340, -324, -308, -292, -276, -260, + -244, -228, -212, -196, -180, -164, -148, -132, + -120, -112, -104, -96, -88, -80, -72, -64, + -56, -48, -40, -32, -24, -16, -8, 0, + 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956, + 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764, + 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412, + 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316, + 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140, + 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092, + 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004, + 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980, + 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436, + 1372, 1308, 1244, 1180, 1116, 1052, 988, 924, + 876, 844, 812, 780, 748, 716, 684, 652, + 620, 588, 556, 524, 492, 460, 428, 396, + 372, 356, 340, 324, 308, 292, 276, 260, + 244, 228, 212, 196, 180, 164, 148, 132, + 120, 112, 104, 96, 88, 80, 72, 64, + 56, 48, 40, 32, 24, 16, 8, 0 + }; + + @Override + public byte[] process(byte[] media) { + byte[] res = new byte[media.length * 2]; + int j = 0; + for (int i = 0; i < media.length; i++) { + short s = muLawDecompressTable[media[i] & 0xff]; + res[j++] = (byte) s; + res[j++] = (byte) (s >> 8); + } + return res; + } + + //TODO compare what's the fastest: table lookup or real conversion + /* + * ulaw2linear() - Convert a u-law value to 16-bit linear PCM + * + * First, a biased linear code is derived from the code word. An unbiased + * output can then be obtained by subtracting 33 from the biased code. + * + * Note that this function expects to be passed the complement of the + * original code word. This is in keeping with ISDN conventions. + */ +// private short ulaw2linear(byte u_val) { +// int t; +// +// /* Complement to obtain normal u-law value. */ +// u_val = (byte) ~u_val; +// +// /* +// * Extract and bias the quantization bits. Then +// * shift up by the segment number and subtract out the bias. +// */ +// t = ((u_val & QUANT_MASK) << 3) + cBias; +// t <<= (u_val & SEG_MASK) >> SEG_SHIFT; +// +// boolean s = (u_val & SIGN_BIT) == SIGN_BIT; +// return (short) (s ? (cBias - t) : (t - cBias)); +// } + +} diff --git a/src/peers/media/PcmuEncoder.java b/src/peers/media/PcmuEncoder.java new file mode 100644 index 0000000..e9f7fd9 --- /dev/null +++ b/src/peers/media/PcmuEncoder.java @@ -0,0 +1,130 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010, 2011 Oleg Kulikov, Yohann Martineau +*/ + +package peers.media; + +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.util.concurrent.CountDownLatch; + + + +public class PcmuEncoder extends Encoder { + + private final static int cBias = 0x84; + private final static short seg_end[] = new short[]{0xFF, 0x1FF, 0x3FF, 0x7FF, + 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF + }; + + /* + * linear2ulaw() - Convert a linear PCM value to u-law + * + * In order to simplify the encoding process, the original linear magnitude + * is biased by adding 33 which shifts the encoding range from (0 - 8158) to + * (33 - 8191). The result can be seen in the following encoding table: + * + * Biased Linear Input Code Compressed Code + * ------------------------ --------------- + * 00000001wxyza 000wxyz + * 0000001wxyzab 001wxyz + * 000001wxyzabc 010wxyz + * 00001wxyzabcd 011wxyz + * 0001wxyzabcde 100wxyz + * 001wxyzabcdef 101wxyz + * 01wxyzabcdefg 110wxyz + * 1wxyzabcdefgh 111wxyz + * + * Each biased linear code has a leading 1 which identifies the segment + * number. The value of the segment number is equal to 7 minus the number + * of leading 0's. The quantization interval is directly available as the + * four bits wxyz. * The trailing bits (a - h) are ignored. + * + * Ordinarily the complement of the resulting code word is used for + * transmission, and so the code word is complemented before it is returned. + * + * For further information see John C. Bellamy's Digital Telephony, 1982, + * John Wiley & Sons, pps 98-111 and 472-476. + */ + private static byte linear2ulaw(short pcm_val) { + int mask; + int seg; + byte uval; + + /* Get the sign and the magnitude of the value. */ + if (pcm_val < 0) { + pcm_val = (short) (cBias - pcm_val); + mask = 0x7F; + } else { + pcm_val += cBias; + mask = 0xFF; + } + + /* Convert the scaled magnitude to segment number. */ + seg = search(pcm_val, seg_end, 8); + + /* + * Combine the sign, segment, quantization bits; + * and complement the code word. + */ + if (seg >= 8) /* out of range, return maximum value. */ { + return (byte)(0x7F ^ mask); + } else { + uval = (byte)((seg << 4) | ((pcm_val >> (seg + 3)) & 0xF)); + return (byte)(uval ^ mask); + } + + } + + private static int search(int val, short[] table, int size) { + int i; + + for (i = 0; i < size; i++) { + if (val <= table[i]) { + return (i); + } + } + return (size); + } + + public PcmuEncoder(PipedInputStream rawData, PipedOutputStream encodedData, + boolean mediaDebug, String peersHome, + CountDownLatch latch) { + super(rawData, encodedData, mediaDebug, peersHome, latch); + } + + /** + * Perform compression using U-law. Retrieved from Mobicents media server + * code. + * + * @param media the input uncompressed media + * @return the output compressed media. + */ + public byte[] process(byte[] media) { + byte[] compressed = new byte[media.length / 2]; + + int j = 0; + for (int i = 0; i < compressed.length; i++) { + short sample = (short) ((media[j++] & 0xff) | ((media[j++]) << 8)); + compressed[i] = linear2ulaw(sample); + } + return compressed; + } + + +} diff --git a/src/peers/media/RtpSender.java b/src/peers/media/RtpSender.java new file mode 100644 index 0000000..0abd55b --- /dev/null +++ b/src/peers/media/RtpSender.java @@ -0,0 +1,201 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2008, 2009, 2010, 2011 Yohann Martineau +*/ + +package peers.media; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PipedInputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Random; +import java.util.concurrent.CountDownLatch; + + +import org.pmw.tinylog.Logger; +import peers.rtp.RtpPacket; +import peers.rtp.RtpSession; +import peers.sdp.Codec; + +public class RtpSender implements Runnable { + + private PipedInputStream encodedData; + private RtpSession rtpSession; + private boolean isStopped; + private FileOutputStream rtpSenderInput; + private boolean mediaDebug; + private Codec codec; + private List pushedPackets; + + private String peersHome; + private CountDownLatch latch; + + public RtpSender(PipedInputStream encodedData, RtpSession rtpSession, + boolean mediaDebug, Codec codec, String peersHome, + CountDownLatch latch) { + this.encodedData = encodedData; + this.rtpSession = rtpSession; + this.mediaDebug = mediaDebug; + this.codec = codec; + this.peersHome = peersHome; + this.latch = latch; + isStopped = false; + pushedPackets = Collections.synchronizedList( + new ArrayList()); + } + + public void run() { + if (mediaDebug) { + SimpleDateFormat simpleDateFormat = + new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); + String date = simpleDateFormat.format(new Date()); + String fileName = peersHome + File.separator + + AbstractSoundManager.MEDIA_DIR + File.separator + date + + "_rtp_sender.input"; + try { + rtpSenderInput = new FileOutputStream(fileName); + } catch (FileNotFoundException e) { + Logger.error("cannot create file", e); + return; + } + } + RtpPacket rtpPacket = new RtpPacket(); + rtpPacket.setVersion(2); + rtpPacket.setPadding(false); + rtpPacket.setExtension(false); + rtpPacket.setCsrcCount(0); + rtpPacket.setMarker(false); + rtpPacket.setPayloadType(codec.getPayloadType()); + Random random = new Random(); + int sequenceNumber = random.nextInt(); + rtpPacket.setSequenceNumber(sequenceNumber); + rtpPacket.setSsrc(random.nextInt()); + int buf_size = Capture.BUFFER_SIZE / 2; + byte[] buffer = new byte[buf_size]; + int timestamp = 0; + int numBytesRead; + int tempBytesRead; + long sleepTime = 0; + long offset = 0; + long lastSentTime = System.nanoTime(); + // indicate if its the first time that we send a packet (dont wait) + boolean firstTime = true; + + while (!isStopped) { + numBytesRead = 0; + try { + while (!isStopped && numBytesRead < buf_size) { + // expect that the buffer is full + tempBytesRead = encodedData.read(buffer, numBytesRead, + buf_size - numBytesRead); + numBytesRead += tempBytesRead; + } + } catch (IOException e) { + Logger.error("input/output error", e); + return; + } + byte[] trimmedBuffer; + if (numBytesRead < buffer.length) { + trimmedBuffer = new byte[numBytesRead]; + System.arraycopy(buffer, 0, trimmedBuffer, 0, numBytesRead); + } else { + trimmedBuffer = buffer; + } + if (mediaDebug) { + try { + rtpSenderInput.write(trimmedBuffer); // TODO use classpath + } catch (IOException e) { + Logger.error("cannot write to file", e); + break; + } + } + if (pushedPackets.size() > 0) { + RtpPacket pushedPacket = pushedPackets.remove(0); + rtpPacket.setMarker(pushedPacket.isMarker()); + rtpPacket.setPayloadType(pushedPacket.getPayloadType()); + byte[] data = pushedPacket.getData(); + rtpPacket.setData(data); + } else { + if (rtpPacket.getPayloadType() != codec.getPayloadType()) { + rtpPacket.setPayloadType(codec.getPayloadType()); + rtpPacket.setMarker(false); + } + rtpPacket.setData(trimmedBuffer); + } + + rtpPacket.setSequenceNumber(sequenceNumber++); + timestamp += buf_size; + rtpPacket.setTimestamp(timestamp); + if (firstTime) { + rtpSession.send(rtpPacket); + lastSentTime = System.nanoTime(); + firstTime = false; + continue; + } + sleepTime = 19500000 - (System.nanoTime() - lastSentTime) + offset; + if (sleepTime > 0) { + try { + Thread.sleep(Math.round(sleepTime / 1000000f)); + } catch (InterruptedException e) { + Logger.error("Thread interrupted", e); + return; + } + rtpSession.send(rtpPacket); + lastSentTime = System.nanoTime(); + offset = 0; + } else { + rtpSession.send(rtpPacket); + lastSentTime = System.nanoTime(); + if (sleepTime < -20000000) { + offset = sleepTime + 20000000; + } + } + } + if (mediaDebug) { + try { + rtpSenderInput.close(); + } catch (IOException e) { + Logger.error("cannot close file", e); + return; + } + } + latch.countDown(); + if (latch.getCount() != 0) { + try { + latch.await(); + } catch (InterruptedException e) { + Logger.error("interrupt exception", e); + } + } + } + + public synchronized void setStopped(boolean isStopped) { + this.isStopped = isStopped; + } + + public void pushPackets(List rtpPackets) { + this.pushedPackets.addAll(rtpPackets); + } + +} diff --git a/src/peers/media/SoundSource.java b/src/peers/media/SoundSource.java new file mode 100644 index 0000000..c8deede --- /dev/null +++ b/src/peers/media/SoundSource.java @@ -0,0 +1,30 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2012 Yohann Martineau +*/ + +package peers.media; + +public interface SoundSource { + + /** + * read raw data linear PCM 8kHz, 16 bits signed, mono-channel, little endian + * @return + */ + public byte[] readData(); + +} diff --git a/src/peers/nat/Client.java b/src/peers/nat/Client.java new file mode 100644 index 0000000..427669a --- /dev/null +++ b/src/peers/nat/Client.java @@ -0,0 +1,64 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.nat; + +import java.io.IOException; +import java.net.InetAddress; + +import org.w3c.dom.Document; + +public class Client { + + private Server server; + //private String email; + private PeerManager peerManager; + + public Client(String email, String localInetAddress, int localPort) { + //this.email = email; + // TODO automatic global access interface discovery + try { + InetAddress localAddress = InetAddress.getByName(localInetAddress); + server = new Server(localAddress, localPort); + peerManager = new PeerManager(localAddress, localPort); + } catch (IOException e) { + e.printStackTrace(); + return; + } + server.update(email); + Document document = server.getPeers(email); + peerManager.setDocument(document); + peerManager.start(); + } + + /** + * @param args + */ + public static void main(String[] args) { + if (args.length != 3) { + System.err.println("usage: java ... " + + " "); + System.exit(1); + } + + new Client(args[0], args[1], Integer.parseInt(args[2])); + + } + +} diff --git a/src/peers/nat/PeerManager.java b/src/peers/nat/PeerManager.java new file mode 100644 index 0000000..e188bf2 --- /dev/null +++ b/src/peers/nat/PeerManager.java @@ -0,0 +1,117 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.nat; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketException; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public class PeerManager extends Thread { + + private InetAddress localAddress; + private int localPort; + private Document document; + + public PeerManager(InetAddress localAddress, int localPort) { + this.localAddress = localAddress; + this.localPort = localPort; + } + + public void setDocument(Document document) { + this.document = document; + } + + public void run() { + DatagramSocket datagramSocket; + try { + datagramSocket = new DatagramSocket(localPort, localAddress); + } catch (SocketException e) { + e.printStackTrace(); + return; + } +// UDPReceiver udpReceiver = new UDPReceiver(datagramSocket); +// udpReceiver.start(); + while (true) { + Element root = document.getDocumentElement(); + NodeList peers = root.getChildNodes(); + for (int i = 0; i < peers.getLength(); ++i) { + Node node = peers.item(i); + if (node.getNodeName().equals("peer")) { + createConnection(node, datagramSocket); + } + } + try { + Thread.sleep(30000); + } catch (InterruptedException e) { + e.printStackTrace(); + return; + } + } + } + + private void createConnection(Node peer, DatagramSocket datagramSocket) { + NodeList childNodes = peer.getChildNodes(); + String ipAddress = null; + String port = null; + for (int i = 0; i < childNodes.getLength(); ++i) { + Node node = childNodes.item(i); + String nodeName = node.getNodeName(); + if (nodeName.equals("ipaddress")) { + ipAddress = node.getTextContent(); + } else if (nodeName.equals("port")) { + port = node.getTextContent(); + } + } + if (ipAddress == null || port == null) { + return; + } + int remotePort = Integer.parseInt(port); + try { + InetAddress remoteAddress = InetAddress.getByName(ipAddress); + // DatagramSocket datagramSocket = new DatagramSocket(localPort, localAddress); + for (int i = 0; i < 5; ++i) { + String message = "hello world " + System.currentTimeMillis(); + byte[] buf = message.getBytes(); + DatagramPacket datagramPacket = + new DatagramPacket(buf, buf.length, remoteAddress, remotePort); + datagramSocket.send(datagramPacket); + System.out.println("> sent:\n" + message); + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + return; + } + } + + //datagramSocket.close(); + } catch (IOException e) { + e.printStackTrace(); + return; + } + } +} diff --git a/src/peers/nat/Server.java b/src/peers/nat/Server.java new file mode 100644 index 0000000..2fe7c6f --- /dev/null +++ b/src/peers/nat/Server.java @@ -0,0 +1,175 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.nat; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.InetAddress; +import java.net.MalformedURLException; +import java.net.Socket; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLEncoder; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +public class Server { + + public static final String SERVER_HOST = "peers.sourceforge.net"; + public static final String PREFIX = "/peers"; + //public static final int SOCKET_TIMEOUT = 30000;//millis + + //private InetAddress localAddress; + //private int localPort; + private InetAddress remoteAddress; + private int remotePort; + + private Socket socket; + + //TODO constructor without parameters + public Server(InetAddress localAddress, int localPort) throws IOException { + super(); + //this.localAddress = localAddress; + //this.localPort = localPort; + this.remoteAddress = InetAddress.getByName(SERVER_HOST); + this.remotePort = 80; + socket = new Socket(remoteAddress, remotePort, localAddress, localPort); + //socket.setSoTimeout(SOCKET_TIMEOUT); + } + + /** + * This method will update public address on the web server. + * @param email user identifier + */ + public void update(String email) { + String encodedEmail; + try { + encodedEmail = URLEncoder.encode(email, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + return; + } + StringBuffer urlEnd = new StringBuffer(); + urlEnd.append("update2.php?email="); + urlEnd.append(encodedEmail); + get(urlEnd.toString()); + close(); + } + + public Document getPeers(String email) { + String encodedEmail; + try { + encodedEmail = URLEncoder.encode(email, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + return null; + } + StringBuffer urlBuf = new StringBuffer(); + urlBuf.append("http://"); + urlBuf.append(SERVER_HOST); + urlBuf.append(PREFIX); + urlBuf.append("/getassocasxml.php?email="); + urlBuf.append(encodedEmail); + URL url; + try { + url = new URL(urlBuf.toString()); + } catch (MalformedURLException e) { + e.printStackTrace(); + return null; + } + System.out.println("retrieved peers"); + DocumentBuilderFactory documentBuilderFactory + = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder; + try { + documentBuilder = documentBuilderFactory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + e.printStackTrace(); + return null; + } + try { + URLConnection urlConnection = url.openConnection(); + InputStream inputStream = urlConnection.getInputStream(); + return documentBuilder.parse(inputStream); + } catch (IOException e) { + e.printStackTrace(); + } catch (SAXException e) { + e.printStackTrace(); + } + return null; + } + + private String get(String urlEnd) { + StringBuffer get = new StringBuffer(); + get.append("GET "); + get.append(PREFIX); + get.append('/'); + get.append(urlEnd); + get.append(" HTTP/1.1\r\n"); + get.append("Host: "); + get.append(SERVER_HOST); + get.append("\r\n"); + get.append("\r\n"); + + try { + socket.getOutputStream().write(get.toString().getBytes()); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + System.out.println("> sent:\n" + get.toString()); + + StringBuffer result = new StringBuffer(); + try { + byte[] buf = new byte[256]; + int read = 0; + while ((read = socket.getInputStream().read(buf)) > -1) { + byte[] exactBuf = new byte[read]; + System.arraycopy(buf, 0, exactBuf, 0, read); + result.append(new String(exactBuf)); + } + } catch (SocketTimeoutException e) { + System.out.println("socket timeout"); + return null; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + System.out.println("< received:\n" + result.toString()); + return result.toString(); + } + + public void close() { + if (socket != null) { + try { + socket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/peers/nat/UDPReceiver.java b/src/peers/nat/UDPReceiver.java new file mode 100644 index 0000000..efae8e3 --- /dev/null +++ b/src/peers/nat/UDPReceiver.java @@ -0,0 +1,49 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.nat; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; + +public class UDPReceiver extends Thread { + + private DatagramSocket datagramSocket; + + public UDPReceiver(DatagramSocket datagramSocket) { + super(); + this.datagramSocket = datagramSocket; + } + + @Override + public void run() { + try { + while (true) { + byte[] buf = new byte[1024]; + DatagramPacket packet = new DatagramPacket(buf, buf.length); + datagramSocket.receive(packet); + System.out.println("< received:\n" + + new String(packet.getData())); + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/peers/nat/api/DataReceiver.java b/src/peers/nat/api/DataReceiver.java new file mode 100644 index 0000000..7206c68 --- /dev/null +++ b/src/peers/nat/api/DataReceiver.java @@ -0,0 +1,26 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.nat.api; + + +public interface DataReceiver { + + public void dataReceived(byte[] data, String peerId); +} diff --git a/src/peers/nat/api/PeersClient.java b/src/peers/nat/api/PeersClient.java new file mode 100644 index 0000000..6f7a9eb --- /dev/null +++ b/src/peers/nat/api/PeersClient.java @@ -0,0 +1,47 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.nat.api; + +public abstract class PeersClient { + + /** + * creates a new peers client + * @param myId the string identifier corresponding + * to the computer or to a person (email). + * @param dataReceiver object that will receive incoming traffic. + */ + public PeersClient(String myId, DataReceiver dataReceiver) { + + } + + /** + * creates a UDP connection to a peer. + * @param peerId unique peer identifier (email for example). + * @return an object that allows to send data to the peer. + */ + public abstract UDPTransport createUDPTransport(String peerId); + + /** + * creates a TCP connection to a peer. + * @param peerId unique peer identifier (email for example). + * @return an object that allows to send data to the peer. + */ + public abstract TCPTransport createTCPTransport(String peerId); +} diff --git a/src/peers/nat/api/TCPTransport.java b/src/peers/nat/api/TCPTransport.java new file mode 100644 index 0000000..37bf299 --- /dev/null +++ b/src/peers/nat/api/TCPTransport.java @@ -0,0 +1,24 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.nat.api; + +public interface TCPTransport extends Transport { + +} diff --git a/src/peers/nat/api/Transport.java b/src/peers/nat/api/Transport.java new file mode 100644 index 0000000..7769c63 --- /dev/null +++ b/src/peers/nat/api/Transport.java @@ -0,0 +1,25 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.nat.api; + +public interface Transport { + + public void sendData(byte[] data); +} diff --git a/src/peers/nat/api/UDPTransport.java b/src/peers/nat/api/UDPTransport.java new file mode 100644 index 0000000..8aee6f1 --- /dev/null +++ b/src/peers/nat/api/UDPTransport.java @@ -0,0 +1,24 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.nat.api; + +public interface UDPTransport extends Transport { + +} diff --git a/src/peers/rtp/RFC3551.java b/src/peers/rtp/RFC3551.java new file mode 100644 index 0000000..a9bbef4 --- /dev/null +++ b/src/peers/rtp/RFC3551.java @@ -0,0 +1,34 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010 Yohann Martineau +*/ + +package peers.rtp; + +public class RFC3551 { + + // payload types + + public static final int PAYLOAD_TYPE_PCMU = 0; + public static final int PAYLOAD_TYPE_PCMA = 8; + + // encoding names + + public static final String PCMU = "PCMU"; + public static final String PCMA = "PCMA"; + +} diff --git a/src/peers/rtp/RFC4733.java b/src/peers/rtp/RFC4733.java new file mode 100644 index 0000000..e8af36b --- /dev/null +++ b/src/peers/rtp/RFC4733.java @@ -0,0 +1,32 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010 Yohann Martineau +*/ + +package peers.rtp; + +public class RFC4733 { + + // payload types + + public static final int PAYLOAD_TYPE_TELEPHONE_EVENT = 101; + + // encoding names + + public static final String TELEPHONE_EVENT = "telephone-event"; + +} diff --git a/src/peers/rtp/RtpListener.java b/src/peers/rtp/RtpListener.java new file mode 100644 index 0000000..25f710d --- /dev/null +++ b/src/peers/rtp/RtpListener.java @@ -0,0 +1,26 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010 Yohann Martineau +*/ + +package peers.rtp; + +public interface RtpListener { + + void receivedRtpPacket(RtpPacket rtpPacket); + +} diff --git a/src/peers/rtp/RtpPacket.java b/src/peers/rtp/RtpPacket.java new file mode 100644 index 0000000..d862e9d --- /dev/null +++ b/src/peers/rtp/RtpPacket.java @@ -0,0 +1,124 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010 Yohann Martineau +*/ + +package peers.rtp; + +public class RtpPacket { + + private int version; + private boolean padding; + private boolean extension; + private int csrcCount; + private boolean marker; + private int payloadType; + private int sequenceNumber; + private long timestamp; + private long ssrc; + private long[] csrcList; + private byte[] data; + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + + public boolean isPadding() { + return padding; + } + + public void setPadding(boolean padding) { + this.padding = padding; + } + + public boolean isExtension() { + return extension; + } + + public void setExtension(boolean extension) { + this.extension = extension; + } + + public int getCsrcCount() { + return csrcCount; + } + + public void setCsrcCount(int csrcCount) { + this.csrcCount = csrcCount; + } + + public boolean isMarker() { + return marker; + } + + public void setMarker(boolean marker) { + this.marker = marker; + } + + public int getPayloadType() { + return payloadType; + } + + public void setPayloadType(int payloadType) { + this.payloadType = payloadType; + } + + public int getSequenceNumber() { + return sequenceNumber; + } + + public void setSequenceNumber(int sequenceNumber) { + this.sequenceNumber = sequenceNumber; + } + + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + public long getSsrc() { + return ssrc; + } + + public void setSsrc(long ssrc) { + this.ssrc = ssrc; + } + + public long[] getCsrcList() { + return csrcList; + } + + public void setCsrcList(long[] csrcList) { + this.csrcList = csrcList; + } + + public byte[] getData() { + return data; + } + + public void setData(byte[] data) { + this.data = data; + } + +} diff --git a/src/peers/rtp/RtpParser.java b/src/peers/rtp/RtpParser.java new file mode 100644 index 0000000..e5b4c60 --- /dev/null +++ b/src/peers/rtp/RtpParser.java @@ -0,0 +1,119 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010 Yohann Martineau +*/ + +package peers.rtp; + + +import org.pmw.tinylog.Logger; + +// RFC 3550 +public class RtpParser { + + + + + public RtpPacket decode(byte[] packet) { + if (packet.length < 12) { + Logger.error("RTP packet too short"); + return null; + } + RtpPacket rtpPacket = new RtpPacket(); + int b = (int)(packet[0] & 0xff); + rtpPacket.setVersion((b & 0xc0) >> 6); + rtpPacket.setPadding((b & 0x20) != 0); + rtpPacket.setExtension((b & 0x10) != 0); + rtpPacket.setCsrcCount(b & 0x0f); + b = (int)(packet[1] & 0xff); + rtpPacket.setMarker((b & 0x80) != 0); + rtpPacket.setPayloadType(b & 0x7f); + b = (int)(packet[2] & 0xff); + rtpPacket.setSequenceNumber(b * 256 + (int)(packet[3] & 0xff)); + b = (int)(packet[4] & 0xff); + rtpPacket.setTimestamp(b * 256 * 256 * 256 + + (int)(packet[5] & 0xff) * 256 * 256 + + (int)(packet[6] & 0xff) * 256 + + (int)(packet[7] & 0xff)); + b = (int)(packet[8] & 0xff); + rtpPacket.setSsrc(b * 256 * 256 * 256 + + (int)(packet[9] & 0xff) * 256 * 256 + + (int)(packet[10] & 0xff) * 256 + + (int)(packet[11] & 0xff)); + long[] csrcList = new long[rtpPacket.getCsrcCount()]; + for (int i = 0; i < csrcList.length; ++i) + csrcList[i] = (int)(packet[12 + i] & 0xff) << 24 + + (int)(packet[12 + i + 1] & 0xff) << 16 + + (int)(packet[12 + i + 2] & 0xff) << 8 + + (int)(packet[12 + i + 3] & 0xff); + rtpPacket.setCsrcList(csrcList); + int dataOffset = 12 + csrcList.length * 4; + int dataLength = packet.length - dataOffset; + byte[] data = new byte[dataLength]; + System.arraycopy(packet, dataOffset, data, 0, dataLength); + rtpPacket.setData(data); + return rtpPacket; + } + + public byte[] encode(RtpPacket rtpPacket) { + byte[] data = rtpPacket.getData(); + int packetLength = 12 + rtpPacket.getCsrcCount() * 4 + data.length; + byte[] packet = new byte[packetLength]; + int b = (rtpPacket.getVersion() << 6) + + ((rtpPacket.isPadding() ? 1 : 0) << 5) + + ((rtpPacket.isExtension() ? 1 : 0) << 4) + + (rtpPacket.getCsrcCount()); + packet[0] = new Integer(b).byteValue(); + b = ((rtpPacket.isMarker() ? 1 : 0) << 7) + + rtpPacket.getPayloadType(); + packet[1] = new Integer(b).byteValue(); + b = rtpPacket.getSequenceNumber() >> 8; + packet[2] = new Integer(b).byteValue(); + b = rtpPacket.getSequenceNumber() & 0xff; + packet[3] = new Integer(b).byteValue(); + b = (int)(rtpPacket.getTimestamp() >> 24); + packet[4] = new Integer(b).byteValue(); + b = (int)(rtpPacket.getTimestamp() >> 16); + packet[5] = new Integer(b).byteValue(); + b = (int)(rtpPacket.getTimestamp() >> 8); + packet[6] = new Integer(b).byteValue(); + b = (int)(rtpPacket.getTimestamp() & 0xff); + packet[7] = new Integer(b).byteValue(); + b = (int)(rtpPacket.getSsrc() >> 24); + packet[8] = new Integer(b).byteValue(); + b = (int)(rtpPacket.getSsrc() >> 16); + packet[9] = new Integer(b).byteValue(); + b = (int)(rtpPacket.getSsrc() >> 8); + packet[10] = new Integer(b).byteValue(); + b = (int)(rtpPacket.getSsrc() & 0xff); + packet[11] = new Integer(b).byteValue(); + for (int i = 0; i < rtpPacket.getCsrcCount(); ++i) { + b = (int)(rtpPacket.getCsrcList()[i] >> 24); + packet[12 + i * 4] = new Integer(b).byteValue(); + b = (int)(rtpPacket.getCsrcList()[i] >> 16); + packet[12 + i * 4 + 1] = new Integer(b).byteValue(); + b = (int)(rtpPacket.getCsrcList()[i] >> 8); + packet[12 + i * 4 + 2] = new Integer(b).byteValue(); + b = (int)(rtpPacket.getCsrcList()[i] & 0xff); + packet[12 + i * 4 + 3] = new Integer(b).byteValue(); + } + System.arraycopy(data, 0, packet, 12 + rtpPacket.getCsrcCount() * 4, + data.length); + return packet; + } + +} diff --git a/src/peers/rtp/RtpSession.java b/src/peers/rtp/RtpSession.java new file mode 100644 index 0000000..b928b93 --- /dev/null +++ b/src/peers/rtp/RtpSession.java @@ -0,0 +1,264 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010-2013 Yohann Martineau +*/ + +package peers.rtp; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketException; +import java.net.SocketTimeoutException; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.RejectedExecutionException; + + +import org.pmw.tinylog.Logger; +import peers.media.AbstractSoundManager; + +/** + * can be instantiated on UAC INVITE sending or on UAS 200 OK sending + */ +public class RtpSession { + + private InetAddress remoteAddress; + private int remotePort; + private DatagramSocket datagramSocket; + private ExecutorService executorService; + private List rtpListeners; + private RtpParser rtpParser; + private FileOutputStream rtpSessionOutput; + private FileOutputStream rtpSessionInput; + private boolean mediaDebug; + private String peersHome; + + public RtpSession(InetAddress localAddress, DatagramSocket datagramSocket, + boolean mediaDebug, String peersHome) { + this.mediaDebug = mediaDebug; + this.peersHome = peersHome; + this.datagramSocket = datagramSocket; + rtpListeners = new ArrayList(); + rtpParser = new RtpParser(); + executorService = Executors.newSingleThreadExecutor(); + } + + public synchronized void start() { + if (mediaDebug) { + SimpleDateFormat simpleDateFormat = + new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); + String date = simpleDateFormat.format(new Date()); + String dir = peersHome + File.separator + + AbstractSoundManager.MEDIA_DIR + File.separator; + String fileName = dir + date + "_rtp_session.output"; + try { + rtpSessionOutput = new FileOutputStream(fileName); + fileName = dir + date + "_rtp_session.input"; + rtpSessionInput = new FileOutputStream(fileName); + } catch (FileNotFoundException e) { + Logger.error("cannot create file", e); + return; + } + } + executorService.submit(new Receiver()); + } + + public void stop() { + // AccessController.doPrivileged added for plugin compatibility + AccessController.doPrivileged( + new PrivilegedAction() { + public Void run() { + executorService.shutdown(); + return null; + } + } + ); + } + + public void addRtpListener(RtpListener rtpListener) { + rtpListeners.add(rtpListener); + } + + public synchronized void send(RtpPacket rtpPacket) { + if (datagramSocket == null) { + return; + } + byte[] buf = rtpParser.encode(rtpPacket); + final DatagramPacket datagramPacket = + new DatagramPacket(buf, buf.length, + remoteAddress, remotePort); + + if (!datagramSocket.isClosed()) { + // AccessController.doPrivileged added for plugin compatibility + AccessController.doPrivileged( + new PrivilegedAction() { + + @Override + public Void run() { + try { + datagramSocket.send(datagramPacket); + } catch (IOException e) { + Logger.error("cannot send rtp packet", e); + } catch (SecurityException e) { + Logger.error("security exception", e); + } + return null; + } + } + ); + + if (mediaDebug) { + try { + rtpSessionOutput.write(buf); + } catch (IOException e) { + Logger.error("cannot write to file", e); + } + } + } + } + + public void setRemoteAddress(InetAddress remoteAddress) { + this.remoteAddress = remoteAddress; + } + + public void setRemotePort(int remotePort) { + this.remotePort = remotePort; + } + + private void closeFileAndDatagramSocket() { + if (mediaDebug) { + try { + rtpSessionOutput.close(); + rtpSessionInput.close(); + } catch (IOException e) { + Logger.error("cannot close file", e); + } + } + // AccessController.doPrivileged added for plugin compatibility + AccessController.doPrivileged( + new PrivilegedAction() { + @Override + public Void run() { + datagramSocket.close(); + return null; + } + } + ); + + } + + class Receiver implements Runnable { + + @Override + public void run() { + int receiveBufferSize; + try { + receiveBufferSize = datagramSocket.getReceiveBufferSize(); + } catch (SocketException e) { + Logger.error("cannot get datagram socket receive buffer size", + e); + return; + } + byte[] buf = new byte[receiveBufferSize]; + final DatagramPacket datagramPacket = new DatagramPacket(buf, + buf.length); + final int noException = 0; + final int socketTimeoutException = 1; + final int ioException = 2; + int result = AccessController.doPrivileged( + new PrivilegedAction() { + public Integer run() { + try { + datagramSocket.receive(datagramPacket); + } catch (SocketTimeoutException e) { + return socketTimeoutException; + } catch (IOException e) { + Logger.error("cannot receive packet", e); + return ioException; + } + return noException; + } + }); + switch (result) { + case socketTimeoutException: + try { + executorService.execute(this); + } catch (RejectedExecutionException rej) { + closeFileAndDatagramSocket(); + } + return; + case ioException: + return; + case noException: + break; + default: + break; + } + InetAddress remoteAddress = datagramPacket.getAddress(); + if (remoteAddress != null && + !remoteAddress.equals(RtpSession.this.remoteAddress)) { + RtpSession.this.remoteAddress = remoteAddress; + } + int remotePort = datagramPacket.getPort(); + if (remotePort != RtpSession.this.remotePort) { + RtpSession.this.remotePort = remotePort; + } + byte[] data = datagramPacket.getData(); + int offset = datagramPacket.getOffset(); + int length = datagramPacket.getLength(); + byte[] trimmedData = new byte[length]; + System.arraycopy(data, offset, trimmedData, 0, length); + if (mediaDebug) { + try { + rtpSessionInput.write(trimmedData); + } catch (IOException e) { + Logger.error("cannot write to file", e); + return; + } + } + RtpPacket rtpPacket = rtpParser.decode(trimmedData); + for (RtpListener rtpListener: rtpListeners) { + rtpListener.receivedRtpPacket(rtpPacket); + } + try { + executorService.execute(this); + } catch (RejectedExecutionException rej) { + closeFileAndDatagramSocket(); + } + } + + } + + public boolean isSocketClosed() { + if (datagramSocket == null) { + return true; + } + return datagramSocket.isClosed(); + } + +} diff --git a/src/peers/sdp/Codec.java b/src/peers/sdp/Codec.java new file mode 100644 index 0000000..5462403 --- /dev/null +++ b/src/peers/sdp/Codec.java @@ -0,0 +1,67 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010 Yohann Martineau +*/ + +package peers.sdp; + +import peers.media.MediaManager; + +public class Codec { + + private int payloadType; + private String name; + + public int getPayloadType() { + return payloadType; + } + + public void setPayloadType(int payloadType) { + this.payloadType = payloadType; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof Codec)) { + return false; + } + Codec codec = (Codec)obj; + if (codec.getName() == null) { + return name == null; + } + return codec.getName().equalsIgnoreCase(name); + } + + @Override + public String toString() { + StringBuffer buf = new StringBuffer(); + buf.append(RFC4566.TYPE_ATTRIBUTE).append(RFC4566.SEPARATOR); + buf.append(RFC4566.ATTR_RTPMAP).append(RFC4566.ATTR_SEPARATOR); + buf.append(payloadType).append(" ").append(name).append("/"); + buf.append(MediaManager.DEFAULT_CLOCK).append("\r\n"); + return buf.toString(); + } + +} diff --git a/src/peers/sdp/MediaDescription.java b/src/peers/sdp/MediaDescription.java new file mode 100644 index 0000000..cf950cb --- /dev/null +++ b/src/peers/sdp/MediaDescription.java @@ -0,0 +1,118 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau + */ + +package peers.sdp; + +import java.net.Inet4Address; +import java.net.Inet6Address; +import java.net.InetAddress; +import java.util.Hashtable; +import java.util.List; + +public class MediaDescription { + + private String type; + private InetAddress ipAddress; + // attributes not codec-related + private Hashtable attributes; + private int port; + private List codecs; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Hashtable getAttributes() { + return attributes; + } + + public void setAttributes(Hashtable attributes) { + this.attributes = attributes; + } + + public InetAddress getIpAddress() { + return ipAddress; + } + + public void setIpAddress(InetAddress ipAddress) { + this.ipAddress = ipAddress; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public List getCodecs() { + return codecs; + } + + public void setCodecs(List codecs) { + this.codecs = codecs; + } + + @Override + public String toString() { + StringBuffer buf = new StringBuffer(); + buf.append(RFC4566.TYPE_MEDIA).append(RFC4566.SEPARATOR); + buf.append(type).append(" ").append(port); + buf.append(" RTP/AVP"); + for (Codec codec: codecs) { + buf.append(" "); + buf.append(codec.getPayloadType()); + } + buf.append("\r\n"); + if (ipAddress != null) { + int ipVersion; + if (ipAddress instanceof Inet4Address) { + ipVersion = 4; + } else if (ipAddress instanceof Inet6Address) { + ipVersion = 6; + } else { + throw new RuntimeException("unknown ip version: " + ipAddress); + } + buf.append(RFC4566.TYPE_CONNECTION).append(RFC4566.SEPARATOR); + buf.append("IN IP").append(ipVersion).append(" "); + buf.append(ipAddress.getHostAddress()).append("\r\n"); + } + for (Codec codec: codecs) { + buf.append(codec.toString()); + } + if (attributes != null) { + for (String attributeName: attributes.keySet()) { + buf.append(RFC4566.TYPE_ATTRIBUTE).append(RFC4566.SEPARATOR); + buf.append(attributeName); + String attributeValue = attributes.get(attributeName); + if (attributeValue != null && !"".equals(attributeValue.trim())) { + buf.append(":").append(attributeValue); + } + buf.append("\r\n"); + } + } + return buf.toString(); + } + +} diff --git a/src/peers/sdp/MediaDestination.java b/src/peers/sdp/MediaDestination.java new file mode 100644 index 0000000..e272d45 --- /dev/null +++ b/src/peers/sdp/MediaDestination.java @@ -0,0 +1,52 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2010 Yohann Martineau +*/ + +package peers.sdp; + +public class MediaDestination { + + private String destination; + private int port; + private Codec codec; + + public String getDestination() { + return destination; + } + + public void setDestination(String destination) { + this.destination = destination; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public Codec getCodec() { + return codec; + } + + public void setCodec(Codec codec) { + this.codec = codec; + } + +} diff --git a/src/peers/sdp/NoCodecException.java b/src/peers/sdp/NoCodecException.java new file mode 100644 index 0000000..d7b8f4d --- /dev/null +++ b/src/peers/sdp/NoCodecException.java @@ -0,0 +1,26 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sdp; + +public class NoCodecException extends Exception { + + private static final long serialVersionUID = 1L; + +} diff --git a/src/peers/sdp/RFC4566.java b/src/peers/sdp/RFC4566.java new file mode 100644 index 0000000..519cc6e --- /dev/null +++ b/src/peers/sdp/RFC4566.java @@ -0,0 +1,49 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sdp; + +public class RFC4566 { + + public static final char VERSION = '0'; + + public static final char TYPE_VERSION = 'v'; + public static final char TYPE_ORIGIN = 'o'; + public static final char TYPE_SUBJECT = 's'; + public static final char TYPE_INFO = 'i'; + public static final char TYPE_URI = 'u'; + public static final char TYPE_EMAIL = 'e'; + public static final char TYPE_PHONE = 'p'; + public static final char TYPE_CONNECTION = 'c'; + public static final char TYPE_BANDWITH = 'b'; + public static final char TYPE_TIME = 't'; + public static final char TYPE_REPEAT = 'r'; + public static final char TYPE_ZONE = 'z'; + public static final char TYPE_KEY = 'k'; + public static final char TYPE_ATTRIBUTE = 'a'; + public static final char TYPE_MEDIA = 'm'; + + public static final char SEPARATOR = '='; + public static final char ATTR_SEPARATOR = ':'; + + public static final String MEDIA_AUDIO = "audio"; + + public static final String ATTR_RTPMAP = "rtpmap"; + public static final String ATTR_SENDRECV = "sendrecv"; +} diff --git a/src/peers/sdp/SDPManager.java b/src/peers/sdp/SDPManager.java new file mode 100644 index 0000000..c8f466f --- /dev/null +++ b/src/peers/sdp/SDPManager.java @@ -0,0 +1,150 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010, 2012 Yohann Martineau +*/ + +package peers.sdp; + +import java.io.IOException; +import java.net.InetAddress; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.List; +import java.util.Random; + +import org.pmw.tinylog.Logger; +import peers.Config; + +import peers.rtp.RFC3551; +import peers.rtp.RFC4733; +import peers.sip.core.useragent.UserAgent; + +public class SDPManager { + + private SdpParser sdpParser; + private UserAgent userAgent; + private List supportedCodecs; + private Random random; + + + + public SDPManager(UserAgent userAgent) { + this.userAgent = userAgent; + sdpParser = new SdpParser(); + supportedCodecs = new ArrayList(); + random = new Random(); + //TODO retrieve codecs from configuration file + Codec codec = new Codec(); + codec.setPayloadType(RFC3551.PAYLOAD_TYPE_PCMU); + codec.setName(RFC3551.PCMU); + supportedCodecs.add(codec); + codec = new Codec(); + codec.setPayloadType(RFC3551.PAYLOAD_TYPE_PCMA); + codec.setName(RFC3551.PCMA); + supportedCodecs.add(codec); + codec = new Codec(); + codec.setPayloadType(RFC4733.PAYLOAD_TYPE_TELEPHONE_EVENT); + codec.setName(RFC4733.TELEPHONE_EVENT); + //TODO add fmtp:101 0-15 attribute + supportedCodecs.add(codec); + } + + public SessionDescription parse(byte[] sdp) { + try { + return sdpParser.parse(sdp); + } catch (IOException e) { + Logger.error(e.getMessage(), e); + } + return null; + } + + public MediaDestination getMediaDestination( + SessionDescription sessionDescription) throws NoCodecException { + InetAddress destAddress = sessionDescription.getIpAddress(); + List mediaDescriptions = sessionDescription.getMediaDescriptions(); + for (MediaDescription mediaDescription: mediaDescriptions) { + if (RFC4566.MEDIA_AUDIO.equals(mediaDescription.getType())) { + for (Codec offerCodec: mediaDescription.getCodecs()) { + if (supportedCodecs.contains(offerCodec)) { + String offerCodecName = offerCodec.getName(); + if (offerCodecName.equalsIgnoreCase(RFC3551.PCMU) || + offerCodecName.equalsIgnoreCase(RFC3551.PCMA)) { + int destPort = mediaDescription.getPort(); + if (mediaDescription.getIpAddress() != null) { + destAddress = mediaDescription.getIpAddress(); + } + MediaDestination mediaDestination = + new MediaDestination(); + mediaDestination.setDestination( + destAddress.getHostAddress()); + mediaDestination.setPort(destPort); + mediaDestination.setCodec(offerCodec); + return mediaDestination; + } + } + } + } + } + throw new NoCodecException(); + } + + public SessionDescription createSessionDescription(SessionDescription offer, + int localRtpPort) + throws IOException { + SessionDescription sessionDescription = new SessionDescription(); + sessionDescription.setUsername("user1"); + sessionDescription.setId(random.nextInt(Integer.MAX_VALUE)); + sessionDescription.setVersion(random.nextInt(Integer.MAX_VALUE)); + Config config = userAgent.getConfig(); + InetAddress inetAddress = config.getPublicInetAddress(); + if (inetAddress == null) { + inetAddress = config.getLocalInetAddress(); + } + sessionDescription.setIpAddress(inetAddress); + sessionDescription.setName("-"); + sessionDescription.setAttributes(new Hashtable()); + List codecs; + if (offer == null) { + codecs = supportedCodecs; + } else { + codecs = new ArrayList(); + for (MediaDescription mediaDescription: + offer.getMediaDescriptions()) { + if (RFC4566.MEDIA_AUDIO.equals(mediaDescription.getType())) { + for (Codec codec: mediaDescription.getCodecs()) { + if (supportedCodecs.contains(codec)) { + codecs.add(codec); + } + } + } + } + } + MediaDescription mediaDescription = new MediaDescription(); + Hashtable attributes = new Hashtable(); + attributes.put(RFC4566.ATTR_SENDRECV, ""); + mediaDescription.setAttributes(attributes); + mediaDescription.setType(RFC4566.MEDIA_AUDIO); + mediaDescription.setPort(localRtpPort); + mediaDescription.setCodecs(codecs); + List mediaDescriptions = + new ArrayList(); + mediaDescriptions.add(mediaDescription); + sessionDescription.setMediaDescriptions(mediaDescriptions); + return sessionDescription; + } + +} diff --git a/src/peers/sdp/SDPMessage.java b/src/peers/sdp/SDPMessage.java new file mode 100644 index 0000000..5b07ca4 --- /dev/null +++ b/src/peers/sdp/SDPMessage.java @@ -0,0 +1,25 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sdp; + +public class SDPMessage { + + +} diff --git a/src/peers/sdp/SdpLine.java b/src/peers/sdp/SdpLine.java new file mode 100644 index 0000000..6e32d4e --- /dev/null +++ b/src/peers/sdp/SdpLine.java @@ -0,0 +1,38 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sdp; + +public class SdpLine { + private char type; + private String value; + public char getType() { + return type; + } + public void setType(char type) { + this.type = type; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/peers/sdp/SdpParser.java b/src/peers/sdp/SdpParser.java new file mode 100644 index 0000000..42ae60d --- /dev/null +++ b/src/peers/sdp/SdpParser.java @@ -0,0 +1,236 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sdp; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.InetAddress; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.List; + +import peers.rtp.RFC3551; + +public class SdpParser { + + public SessionDescription parse(byte[] body) throws IOException { + if (body == null || body.length == 0) { + return null; + } + ByteArrayInputStream in = new ByteArrayInputStream(body); + InputStreamReader inputStreamReader = new InputStreamReader(in); + BufferedReader reader = new BufferedReader(inputStreamReader); + SessionDescription sessionDescription = new SessionDescription(); + + //version + + String line = reader.readLine(); + if (line.length() < 3) { + return null; + } + if (line.charAt(0) != RFC4566.TYPE_VERSION + || line.charAt(1) != RFC4566.SEPARATOR + || line.charAt(2) != RFC4566.VERSION) { + return null; + } + + //origin + + line = reader.readLine(); + if (line.length() < 3) { + return null; + } + if (line.charAt(0) != RFC4566.TYPE_ORIGIN + || line.charAt(1) != RFC4566.SEPARATOR) { + return null; + } + line = line.substring(2); + String[] originArr = line.split(" "); + if (originArr == null || originArr.length != 6) { + return null; + } + sessionDescription.setUsername(originArr[0]); + sessionDescription.setId(Long.parseLong(originArr[1])); + sessionDescription.setVersion(Long.parseLong(originArr[2])); + sessionDescription.setIpAddress(InetAddress.getByName(originArr[5])); + + //name + + line = reader.readLine(); + if (line.length() < 3) { + return null; + } + if (line.charAt(0) != RFC4566.TYPE_SUBJECT + || line.charAt(1) != RFC4566.SEPARATOR) { + return null; + } + sessionDescription.setName(line.substring(2)); + + //session connection and attributes + Hashtable sessionAttributes = new Hashtable(); + sessionDescription.setAttributes(sessionAttributes); + + while ((line = reader.readLine()) != null + && line.charAt(0) != RFC4566.TYPE_MEDIA) { + if (line.length() > 3 + && line.charAt(0) == RFC4566.TYPE_CONNECTION + && line.charAt(1) == RFC4566.SEPARATOR) { + String connection = parseConnection(line.substring(2)); + if (connection == null) { + continue; + } + sessionDescription.setIpAddress(InetAddress.getByName(connection)); + } else if (line.length() > 3 + && line.charAt(0) == RFC4566.TYPE_ATTRIBUTE + && line.charAt(1) == RFC4566.SEPARATOR) { + String value = line.substring(2); + int pos = value.indexOf(RFC4566.ATTR_SEPARATOR); + if (pos > -1) { + sessionAttributes.put(value.substring(0, pos), + value.substring(pos + 1)); + } else { + sessionAttributes.put(value, ""); + } + } + } + if (line == null) { + return null; + } + //we are at the first media line + + ArrayList mediaLines = new ArrayList(); + do { + if (line.length() < 3) { + return null; + } + if (line.charAt(1) != RFC4566.SEPARATOR) { + return null; + } + SdpLine mediaLine = new SdpLine(); + mediaLine.setType(line.charAt(0)); + mediaLine.setValue(line.substring(2)); + mediaLines.add(mediaLine); + } + while ((line = reader.readLine()) != null); + + ArrayList mediaDescriptions = new ArrayList(); + sessionDescription.setMediaDescriptions(mediaDescriptions); + + for (SdpLine sdpLine : mediaLines) { + MediaDescription mediaDescription; + if (sdpLine.getType() == RFC4566.TYPE_MEDIA) { + String[] mediaArr = sdpLine.getValue().split(" "); + if (mediaArr == null || mediaArr.length < 4) { + return null; + } + mediaDescription = new MediaDescription(); + mediaDescription.setType(mediaArr[0]); + //TODO manage port range + mediaDescription.setPort(Integer.parseInt(mediaArr[1])); + mediaDescription.setAttributes(new Hashtable()); + List codecs = new ArrayList(); + for (int i = 3; i < mediaArr.length; ++i) { + int payloadType = Integer.parseInt(mediaArr[i]); + Codec codec = new Codec(); + codec.setPayloadType(payloadType); + String name; + switch (payloadType) { + case RFC3551.PAYLOAD_TYPE_PCMU: + name = RFC3551.PCMU; + break; + case RFC3551.PAYLOAD_TYPE_PCMA: + name = RFC3551.PCMA; + break; + default: + name = "unsupported"; + break; + } + codec.setName(name); + codecs.add(codec); + //TODO check that sdp offer without rtpmap works + } + mediaDescription.setCodecs(codecs); + mediaDescriptions.add(mediaDescription); + } else { + mediaDescription = mediaDescriptions.get(mediaDescriptions.size() - 1); + String sdpLineValue = sdpLine.getValue(); + if (sdpLine.getType() == RFC4566.TYPE_CONNECTION) { + String ipAddress = parseConnection(sdpLineValue); + mediaDescription.setIpAddress(InetAddress.getByName(ipAddress)); + } else if (sdpLine.getType() == RFC4566.TYPE_ATTRIBUTE) { + Hashtable attributes = mediaDescription.getAttributes(); + int pos = sdpLineValue.indexOf(RFC4566.ATTR_SEPARATOR); + if (pos > -1) { + String name = sdpLineValue.substring(0, pos); + String value = sdpLineValue.substring(pos + 1); + pos = value.indexOf(" "); + if (pos > -1) { + int payloadType; + try { + payloadType = Integer.parseInt(value.substring(0, pos)); + List codecs = mediaDescription.getCodecs(); + for (Codec codec: codecs) { + if (codec.getPayloadType() == payloadType) { + value = value.substring(pos + 1); + pos = value.indexOf("/"); + if (pos > -1) { + value = value.substring(0, pos); + codec.setName(value); + } + break; + } + } + } catch (NumberFormatException e) { + attributes.put(name, value); + } + } else { + attributes.put(name, value); + } + } else { + attributes.put(sdpLineValue, ""); + } + } + } + } + sessionDescription.setMediaDescriptions(mediaDescriptions); + + for (MediaDescription description : mediaDescriptions) { + if (description.getIpAddress() == null) { + InetAddress sessionAddress = sessionDescription.getIpAddress(); + if (sessionAddress == null) { + return null; + } + description.setIpAddress(sessionAddress); + } + } + return sessionDescription; + } + + private String parseConnection(String line) { + String[] connectionArr = line.split(" "); + if (connectionArr == null || connectionArr.length != 3) { + return null; + } + return connectionArr[2]; + } + +} diff --git a/src/peers/sdp/SessionDescription.java b/src/peers/sdp/SessionDescription.java new file mode 100644 index 0000000..bb167be --- /dev/null +++ b/src/peers/sdp/SessionDescription.java @@ -0,0 +1,129 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sdp; + +import java.net.Inet4Address; +import java.net.Inet6Address; +import java.net.InetAddress; +import java.util.Hashtable; +import java.util.List; + +public class SessionDescription { + + private long id; + private long version; + private String name; + private String username; + private InetAddress ipAddress; + private List mediaDescriptions; + private Hashtable attributes; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public InetAddress getIpAddress() { + return ipAddress; + } + + public void setIpAddress(InetAddress ipAddress) { + this.ipAddress = ipAddress; + } + + public List getMediaDescriptions() { + return mediaDescriptions; + } + + public void setMediaDescriptions(List mediaDescriptions) { + this.mediaDescriptions = mediaDescriptions; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public long getVersion() { + return version; + } + + public void setVersion(long version) { + this.version = version; + } + + public Hashtable getAttributes() { + return attributes; + } + + public void setAttributes(Hashtable attributes) { + this.attributes = attributes; + } + + @Override + public String toString() { + StringBuffer buf = new StringBuffer(); + buf.append("v=0\r\n"); + buf.append("o=").append(username).append(" ").append(id); + buf.append(" ").append(version); + int ipVersion; + if (ipAddress instanceof Inet4Address) { + ipVersion = 4; + } else if (ipAddress instanceof Inet6Address) { + ipVersion = 6; + } else { + throw new RuntimeException("unknown ip version: " + ipAddress); + } + buf.append(" IN IP").append(ipVersion).append(" "); + String hostAddress = ipAddress.getHostAddress(); + buf.append(hostAddress).append("\r\n"); + buf.append("s=").append(name).append("\r\n"); + buf.append("c=IN IP").append(ipVersion).append(" "); + buf.append(hostAddress).append("\r\n"); + buf.append("t=0 0\r\n"); + for (String attributeName: attributes.keySet()) { + String attributeValue = attributes.get(attributeName); + buf.append("a=").append(attributeName); + if (attributeValue != null && !"".equals(attributeValue.trim())) { + buf.append(":"); + buf.append(attributeValue); + buf.append("\r\n"); + } + } + for (MediaDescription mediaDescription: mediaDescriptions) { + buf.append(mediaDescription.toString()); + } + return buf.toString(); + } +} diff --git a/src/peers/sip/AbstractState.java b/src/peers/sip/AbstractState.java new file mode 100644 index 0000000..7d51c6a --- /dev/null +++ b/src/peers/sip/AbstractState.java @@ -0,0 +1,43 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip; + + +import org.pmw.tinylog.Logger; + +public abstract class AbstractState { + + protected String id; + + + public AbstractState(String id) { + this.id = id; + } + + public void log(AbstractState state) { + StringBuffer buf = new StringBuffer(); + buf.append("SM ").append(id).append(" ["); + buf.append(JavaUtils.getShortClassName(this.getClass())).append(" -> "); + buf.append(JavaUtils.getShortClassName(state.getClass())).append("] "); + buf.append(new Exception().getStackTrace()[1].getMethodName()); + Logger.debug(buf.toString()); + } + +} diff --git a/src/peers/sip/JavaUtils.java b/src/peers/sip/JavaUtils.java new file mode 100644 index 0000000..ab462a9 --- /dev/null +++ b/src/peers/sip/JavaUtils.java @@ -0,0 +1,29 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip; + +public class JavaUtils { + + public static String getShortClassName(Class c) { + String name = c.getName(); + return name.substring(name.lastIndexOf('.') + 1); + } + +} diff --git a/src/peers/sip/RFC2617.java b/src/peers/sip/RFC2617.java new file mode 100644 index 0000000..40148ec --- /dev/null +++ b/src/peers/sip/RFC2617.java @@ -0,0 +1,47 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2008, 2009, 2010, 2011 Yohann Martineau +*/ + +package peers.sip; + +public class RFC2617 { + + // SCHEMES + + public static final String SCHEME_DIGEST = "Digest"; + + // PARAMETERS + + public static final String PARAM_NONCE = "nonce"; + public static final String PARAM_OPAQUE = "opaque"; + public static final String PARAM_REALM = "realm"; + public static final String PARAM_RESPONSE = "response"; + public static final String PARAM_URI = "uri"; + public static final String PARAM_USERNAME = "username"; + public static final String PARAM_QOP = "qop"; + public static final String PARAM_CNONCE = "cnonce"; + public static final String PARAM_NC = "nc"; + public static final String PARAM_ALGORITHM= "algorithm"; + + // MISCELLANEOUS + + public static final char PARAM_SEPARATOR = ','; + public static final char PARAM_VALUE_SEPARATOR = '='; + public static final char PARAM_VALUE_DELIMITER = '"'; + public static final char DIGEST_SEPARATOR = ':'; +} diff --git a/src/peers/sip/RFC3261.java b/src/peers/sip/RFC3261.java new file mode 100644 index 0000000..c35cfaa --- /dev/null +++ b/src/peers/sip/RFC3261.java @@ -0,0 +1,169 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip; + +public final class RFC3261 { + + //SYNTAX ENCODING + + //HEADERS + + //Methods + + public static final String METHOD_INVITE = "INVITE"; + public static final String METHOD_ACK = "ACK"; + public static final String METHOD_REGISTER = "REGISTER"; + public static final String METHOD_BYE = "BYE"; + public static final String METHOD_OPTIONS = "OPTIONS"; + public static final String METHOD_CANCEL = "CANCEL"; + + //Classical form + + public static final String HDR_ALLOW = "Allow"; + public static final String HDR_AUTHORIZATION = "Authorization"; + public static final String HDR_CALLID = "Call-ID"; + public static final String HDR_CONTACT = "Contact"; + public static final String HDR_CONTENT_ENCODING = "Content-Encoding"; + public static final String HDR_CONTENT_LENGTH = "Content-Length"; + public static final String HDR_CONTENT_TYPE = "Content-Type"; + public static final String HDR_CSEQ = "CSeq"; + public static final String HDR_FROM = "From"; + public static final String HDR_MAX_FORWARDS = "Max-Forwards"; + public static final String HDR_RECORD_ROUTE = "Record-Route"; + public static final String HDR_PROXY_AUTHENTICATE = "Proxy-Authenticate"; + public static final String HDR_PROXY_AUTHORIZATION = "Proxy-Authorization"; + public static final String HDR_ROUTE = "Route"; + public static final String HDR_SUBJECT = "Subject"; + public static final String HDR_SUPPORTED = "Supported"; + public static final String HDR_TO = "To"; + public static final String HDR_VIA = "Via"; + public static final String HDR_WWW_AUTHENTICATE = "WWW-Authenticate"; + + //Compact form + + public static final char COMPACT_HDR_CALLID = 'i'; + public static final char COMPACT_HDR_CONTACT = 'm'; + public static final char COMPACT_HDR_CONTENT_ENCODING = 'e'; + public static final char COMPACT_HDR_CONTENT_LENGTH = 'l'; + public static final char COMPACT_HDR_CONTENT_TYPE = 'c'; + public static final char COMPACT_HDR_FROM = 'f'; + public static final char COMPACT_HDR_SUBJECT = 's'; + public static final char COMPACT_HDR_SUPPORTED = 'k'; + public static final char COMPACT_HDR_TO = 't'; + public static final char COMPACT_HDR_VIA = 'v'; + + //Parameters + + public static final String PARAM_BRANCH = "branch"; + public static final String PARAM_EXPIRES = "expires"; + public static final String PARAM_MADDR = "maddr"; + public static final String PARAM_RECEIVED = "received"; + public static final String PARAM_RPORT = "rport"; + public static final String PARAM_SENTBY = "sent-by"; + public static final String PARAM_TAG = "tag"; + public static final String PARAM_TRANSPORT = "transport"; + public static final String PARAM_TTL = "ttl"; + + public static final String PARAM_SEPARATOR = ";"; + public static final String PARAM_ASSIGNMENT = "="; + + //Miscellaneous + + public static final char FIELD_NAME_SEPARATOR = ':'; + public static final String DEFAULT_SIP_VERSION = "SIP/2.0"; + public static final String CRLF = "\r\n"; + public static final String IPV4_TTL = "1"; + public static final char AT = '@'; + public static final String LOOSE_ROUTING = "lr"; + public static final char LEFT_ANGLE_BRACKET = '<'; + public static final char RIGHT_ANGLE_BRACKET = '>'; + public static final String HEADER_SEPARATOR = ","; + + //STATUS CODES + public static final int CODE_MIN_PROV = 100; + public static final int CODE_MIN_SUCCESS = 200; + public static final int CODE_MIN_REDIR = 300; + public static final int CODE_MAX = 699; + + public static final int CODE_100_TRYING = 100; + public static final int CODE_180_RINGING = 180; + public static final int CODE_200_OK = 200; + public static final int CODE_401_UNAUTHORIZED = 401; + public static final int CODE_405_METHOD_NOT_ALLOWED = 405; + public static final int CODE_407_PROXY_AUTHENTICATION_REQUIRED = 407; + public static final int CODE_481_CALL_TRANSACTION_DOES_NOT_EXIST = 481; + public static final int CODE_486_BUSYHERE = 486; + public static final int CODE_487_REQUEST_TERMINATED = 487; + public static final int CODE_500_SERVER_INTERNAL_ERROR = 500; + + //REASON PHRASES + public static final String REASON_180_RINGING = "Ringing"; + public static final String REASON_200_OK = "OK"; + public static final String REASON_405_METHOD_NOT_ALLOWED = + "Method Not Allowed"; + public static final String REASON_481_CALL_TRANSACTION_DOES_NOT_EXIST = + "Call/Transaction Does Not Exist"; + public static final String REASON_486_BUSYHERE = "Busy Here"; + public static final String REASON_487_REQUEST_TERMINATED = + "Request Terminated"; + public static final String REASON_500_SERVER_INTERNAL_ERROR = + "Server Internal Error"; + + //TRANSPORT + + public static final String TRANSPORT_UDP = "UDP"; + public static final String TRANSPORT_TCP = "TCP"; + public static final String TRANSPORT_SCTP = "SCTP"; + public static final String TRANSPORT_TLS = "TLS"; + public static final int TRANSPORT_UDP_USUAL_MAX_SIZE = 1300; + public static final int TRANSPORT_UDP_MAX_SIZE = 65535; + public static final char TRANSPORT_VIA_SEP = '/'; + public static final char TRANSPORT_VIA_SEP2 = ' '; + public static final int TRANSPORT_DEFAULT_PORT = 5060; + public static final int TRANSPORT_TLS_PORT = 5061; + public static final char TRANSPORT_PORT_SEP = ':'; + + + //TRANSACTION + + + //TRANSACTION USER + + public static final int DEFAULT_MAXFORWARDS = 70; + public static final String BRANCHID_MAGIC_COOKIE = "z9hG4bK"; + public static final String SIP_SCHEME = "sip"; + public static final char SCHEME_SEPARATOR = ':'; + + //TIMERS (in milliseconds) + + public static final int TIMER_T1 = 500; + public static final int TIMER_T2 = 4000; + public static final int TIMER_T4 = 5000; + public static final int TIMER_INVITE_CLIENT_TRANSACTION = 32000; + + + //TRANSACTION USER + + + //CORE + + public static final String CONTENT_TYPE_SDP = "application/sdp"; + +} diff --git a/src/peers/sip/Utils.java b/src/peers/sip/Utils.java new file mode 100644 index 0000000..1cd046a --- /dev/null +++ b/src/peers/sip/Utils.java @@ -0,0 +1,128 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip; + + +import java.net.InetAddress; + +import peers.sip.core.useragent.UAS; +import peers.sip.syntaxencoding.SipHeaderFieldMultiValue; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaders; +import peers.sip.transport.SipMessage; + + +public class Utils { + + public static final String PEERSHOME_SYSTEM_PROPERTY = "peers.home"; + public static final String DEFAULT_PEERS_HOME = "."; + + public final static SipHeaderFieldValue getTopVia(SipMessage sipMessage) { + SipHeaders sipHeaders = sipMessage.getSipHeaders(); + SipHeaderFieldName viaName = new SipHeaderFieldName(RFC3261.HDR_VIA); + SipHeaderFieldValue via = sipHeaders.get(viaName); + if (via instanceof SipHeaderFieldMultiValue) { + via = ((SipHeaderFieldMultiValue)via).getValues().get(0); + } + return via; + } + + public final static String generateTag() { + return randomString(8); + } + + public final static String generateCallID(InetAddress inetAddress) { + //TODO make a hash using current time millis, public ip @, private @, and a random string + StringBuffer buf = new StringBuffer(); + buf.append(randomString(8)); + buf.append('-'); + buf.append(String.valueOf(System.currentTimeMillis())); + buf.append('@'); + buf.append(inetAddress.getHostName()); + return buf.toString(); + } + + public final static String generateBranchId() { + StringBuffer buf = new StringBuffer(); + buf.append(RFC3261.BRANCHID_MAGIC_COOKIE); + //TODO must be unique across space and time... + buf.append(randomString(9)); + return buf.toString(); + } + + public final static String getMessageCallId(SipMessage sipMessage) { + SipHeaderFieldValue callId = sipMessage.getSipHeaders().get( + new SipHeaderFieldName(RFC3261.HDR_CALLID)); + return callId.getValue(); + } + + public final static String randomString(int length) { + String chars = "abcdefghijklmnopqrstuvwxyz" + + "ABCDEFGHIFKLMNOPRSTUVWXYZ" + + "0123456789"; + StringBuffer buf = new StringBuffer(length); + for (int i = 0; i < length; ++i) { + int pos = (int)Math.round(Math.random() * (chars.length() - 1)); + buf.append(chars.charAt(pos)); + } + return buf.toString(); + } + + public final static void copyHeader(SipMessage src, SipMessage dst, String name) { + SipHeaderFieldName sipHeaderFieldName = new SipHeaderFieldName(name); + SipHeaderFieldValue sipHeaderFieldValue = src.getSipHeaders().get(sipHeaderFieldName); + if (sipHeaderFieldValue != null) { + dst.getSipHeaders().add(sipHeaderFieldName, sipHeaderFieldValue); + } + } + + public final static String getUserPart(String sipUri) { + int start = sipUri.indexOf(RFC3261.SCHEME_SEPARATOR); + int end = sipUri.indexOf(RFC3261.AT); + return sipUri.substring(start + 1, end); + } + + /** + * adds Max-Forwards Supported and Require headers + * @param headers + */ + public final static void addCommonHeaders(SipHeaders headers) { + //Max-Forwards + + headers.add(new SipHeaderFieldName(RFC3261.HDR_MAX_FORWARDS), + new SipHeaderFieldValue( + String.valueOf(RFC3261.DEFAULT_MAXFORWARDS))); + + //TODO Supported and Require + } + + public final static String generateAllowHeader() { + StringBuffer buf = new StringBuffer(); + for (String supportedMethod: UAS.SUPPORTED_METHODS) { + buf.append(supportedMethod); + buf.append(", "); + } + int bufLength = buf.length(); + buf.delete(bufLength - 2, bufLength); + return buf.toString(); + } + +} diff --git a/src/peers/sip/core/useragent/ChallengeManager.java b/src/peers/sip/core/useragent/ChallengeManager.java new file mode 100644 index 0000000..7a3e554 --- /dev/null +++ b/src/peers/sip/core/useragent/ChallengeManager.java @@ -0,0 +1,300 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2008-2013 Yohann Martineau +*/ + +package peers.sip.core.useragent; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import java.util.UUID; + +import org.pmw.tinylog.Logger; +import peers.Config; + +import peers.sip.RFC2617; +import peers.sip.RFC3261; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaderParamName; +import peers.sip.syntaxencoding.SipHeaders; +import peers.sip.syntaxencoding.SipUriSyntaxException; +import peers.sip.transactionuser.Dialog; +import peers.sip.transactionuser.DialogManager; +import peers.sip.transport.SipMessage; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; + +public class ChallengeManager implements MessageInterceptor { + + public static final String ALGORITHM_MD5 = "MD5"; + + private String username; + private String password; + private String realm; + private String nonce; + private String opaque; + private String requestUri; + private String digest; + private String profileUri; + private String qop; + private String cnonce; + + private static volatile int nonceCount = 1; + private String nonceCountHex; + + private Config config; + + + // FIXME what happens if a challenge is received for a register-refresh + // and another challenge is received in the mean time for an invite? + private int statusCode; + private SipHeaderFieldValue contact; + + private InitialRequestManager initialRequestManager; + private MidDialogRequestManager midDialogRequestManager; + private DialogManager dialogManager; + + public ChallengeManager(Config config, + InitialRequestManager initialRequestManager, + MidDialogRequestManager midDialogRequestManager, + DialogManager dialogManager) { + this.config = config; + this.initialRequestManager = initialRequestManager; + this.midDialogRequestManager = midDialogRequestManager; + this.dialogManager = dialogManager; + init(); + } + + private void init() { + username = config.getUserPart(); + password = config.getPassword(); + profileUri = RFC3261.SIP_SCHEME + RFC3261.SCHEME_SEPARATOR + + username + RFC3261.AT + config.getDomain(); + } + + private String md5hash(String message) { + MessageDigest messageDigest; + try { + messageDigest = MessageDigest.getInstance(ALGORITHM_MD5); + } catch (NoSuchAlgorithmException e) { + Logger.error("no such algorithm " + ALGORITHM_MD5, e); + return null; + } + byte[] messageBytes = message.getBytes(); + byte[] messageMd5 = messageDigest.digest(messageBytes); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + PrintStream printStream = new PrintStream(out); + for (byte b : messageMd5) { + int u_b = (b < 0) ? 256 + b : b; + printStream.printf("%02x", u_b); + } + return out.toString(); + } + + public void handleChallenge(SipRequest sipRequest, + SipResponse sipResponse) { + init(); + statusCode = sipResponse.getStatusCode(); + SipHeaders responseHeaders = sipResponse.getSipHeaders(); + SipHeaders requestHeaders = sipRequest.getSipHeaders(); + contact = requestHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_CONTACT)); + SipHeaderFieldValue authenticate; + SipHeaderFieldName authenticateHeaderName; + if (statusCode == RFC3261.CODE_401_UNAUTHORIZED) { + authenticateHeaderName = new SipHeaderFieldName( + RFC3261.HDR_WWW_AUTHENTICATE); + } else if (statusCode == RFC3261.CODE_407_PROXY_AUTHENTICATION_REQUIRED) { + authenticateHeaderName = new SipHeaderFieldName( + RFC3261.HDR_PROXY_AUTHENTICATE); + } else { + return; + } + authenticate = responseHeaders.get(authenticateHeaderName); + if (authenticate == null) { + return; + } + if (!authenticate.getValue().startsWith(RFC2617.SCHEME_DIGEST)) { + Logger.info("unsupported challenge scheme in header: " + + authenticate); + return; + } + String headerValue = authenticate.getValue(); + realm = getParameter(RFC2617.PARAM_REALM, headerValue); + nonce = getParameter(RFC2617.PARAM_NONCE, headerValue); + opaque = getParameter(RFC2617.PARAM_OPAQUE, headerValue); + qop = getParameter(RFC2617.PARAM_QOP, headerValue); + if( "auth".equals(qop)) { + nonceCountHex = String.format("%08X", nonceCount++); + } + String method = sipRequest.getMethod(); + requestUri = sipRequest.getRequestUri().toString(); + cnonce = UUID.randomUUID().toString(); + digest = getRequestDigest(method); + + // FIXME message should be copied "as is" not created anew from scratch + // and this technique is not clean + String callId = responseHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_CALLID)).getValue(); + Dialog dialog = dialogManager.getDialog(callId); + if (dialog != null) { + midDialogRequestManager.generateMidDialogRequest( + dialog, RFC3261.METHOD_BYE, this); + } else { + SipHeaderFieldValue from = requestHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_FROM)); + String fromTag = from.getParam(new SipHeaderParamName( + RFC3261.PARAM_TAG)); + try { + initialRequestManager.createInitialRequest( + requestUri, method, profileUri, callId, fromTag, this); + } catch (SipUriSyntaxException e) { + Logger.error("syntax error", e); + } + } + } + + private String getRequestDigest(String method) { + StringBuffer buf = new StringBuffer(); + buf.append(username); + buf.append(RFC2617.DIGEST_SEPARATOR); + buf.append(realm); + buf.append(RFC2617.DIGEST_SEPARATOR); + buf.append(password); + String ha1 = md5hash(buf.toString()); + buf = new StringBuffer(); + buf.append(method); + buf.append(RFC2617.DIGEST_SEPARATOR); + buf.append(requestUri); + String ha2 = md5hash(buf.toString()); + buf = new StringBuffer(); + buf.append(ha1); + buf.append(RFC2617.DIGEST_SEPARATOR); + buf.append(nonce); + buf.append(RFC2617.DIGEST_SEPARATOR); + if("auth".equals(qop)) { + buf.append(nonceCountHex); + buf.append(RFC2617.DIGEST_SEPARATOR); + buf.append(cnonce); + buf.append(RFC2617.DIGEST_SEPARATOR); + buf.append(qop); + buf.append(RFC2617.DIGEST_SEPARATOR); + } + buf.append(ha2); + return md5hash(buf.toString()); + } + + private String getParameter(String paramName, String header) { + int paramPos = header.indexOf(paramName); + if (paramPos < 0) { + return null; + } + int paramNameLength = paramName.length(); + if (paramPos + paramNameLength + 3 > header.length()) { + Logger.info("Malformed " + RFC3261.HDR_WWW_AUTHENTICATE + " header"); + return null; + } + if (header.charAt(paramPos + paramNameLength) != + RFC2617.PARAM_VALUE_SEPARATOR) { + Logger.info("Malformed " + RFC3261.HDR_WWW_AUTHENTICATE + " header"); + return null; + } + if (header.charAt(paramPos + paramNameLength + 1) != + RFC2617.PARAM_VALUE_DELIMITER) { + Logger.info("Malformed " + RFC3261.HDR_WWW_AUTHENTICATE + " header"); + return null; + } + header = header.substring(paramPos + paramNameLength + 2); + int endDelimiter = header.indexOf(RFC2617.PARAM_VALUE_DELIMITER); + if (endDelimiter < 0) { + Logger.info("Malformed " + RFC3261.HDR_WWW_AUTHENTICATE + " header"); + return null; + } + return header.substring(0, endDelimiter); + } + + /** add xxxAuthorization header */ + public void postProcess(SipMessage sipMessage) { + if (realm == null || nonce == null || digest == null) { + return; + } + SipHeaders sipHeaders = sipMessage.getSipHeaders(); + String cseq = sipHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_CSEQ)).getValue(); + String method = cseq.substring(cseq.trim().lastIndexOf(' ') + 1); + digest = getRequestDigest(method); + StringBuffer buf = new StringBuffer(); + buf.append(RFC2617.SCHEME_DIGEST).append(" "); + appendParameter(buf, RFC2617.PARAM_USERNAME, username); + buf.append(RFC2617.PARAM_SEPARATOR).append(" "); + appendParameter(buf, RFC2617.PARAM_REALM, realm); + buf.append(RFC2617.PARAM_SEPARATOR).append(" "); + appendParameter(buf, RFC2617.PARAM_NONCE, nonce); + buf.append(RFC2617.PARAM_SEPARATOR).append(" "); + appendParameter(buf, RFC2617.PARAM_URI, requestUri); + buf.append(RFC2617.PARAM_SEPARATOR).append(" "); + appendParameter(buf, RFC2617.PARAM_RESPONSE, digest); + if("auth".equals(qop)) { + buf.append(RFC2617.PARAM_SEPARATOR).append(" "); + appendParameter(buf, RFC2617.PARAM_NC, nonceCountHex); + buf.append(RFC2617.PARAM_SEPARATOR).append(" "); + appendParameter(buf, RFC2617.PARAM_CNONCE, cnonce); + buf.append(RFC2617.PARAM_SEPARATOR).append(" "); + appendParameter(buf, RFC2617.PARAM_QOP, qop); + } + if (opaque != null) { + buf.append(RFC2617.PARAM_SEPARATOR).append(" "); + appendParameter(buf, RFC2617.PARAM_OPAQUE, opaque); + } + SipHeaderFieldName authorizationName; + if (statusCode == RFC3261.CODE_401_UNAUTHORIZED) { + authorizationName = new SipHeaderFieldName( + RFC3261.HDR_AUTHORIZATION); + } else if (statusCode == RFC3261.CODE_407_PROXY_AUTHENTICATION_REQUIRED) { + authorizationName = new SipHeaderFieldName( + RFC3261.HDR_PROXY_AUTHORIZATION); + } else { + return; + } + sipHeaders.add(authorizationName, + new SipHeaderFieldValue(buf.toString())); + // manage authentication on unregister challenge... + if (contact != null) { + SipHeaderParamName expiresName = + new SipHeaderParamName(RFC3261.PARAM_EXPIRES); + String expiresString = contact.getParam(expiresName); + if (expiresString != null && Integer.parseInt(expiresString) == 0) { + SipHeaderFieldValue requestContact = + sipHeaders.get(new SipHeaderFieldName(RFC3261.HDR_CONTACT)); + requestContact.addParam(expiresName, expiresString); + } + } + } + + private void appendParameter(StringBuffer buf, String name, String value) { + buf.append(name); + buf.append(RFC2617.PARAM_VALUE_SEPARATOR); + buf.append(RFC2617.PARAM_VALUE_DELIMITER); + buf.append(value); + buf.append(RFC2617.PARAM_VALUE_DELIMITER); + } + + } diff --git a/src/peers/sip/core/useragent/InitialRequestManager.java b/src/peers/sip/core/useragent/InitialRequestManager.java new file mode 100644 index 0000000..078990d --- /dev/null +++ b/src/peers/sip/core/useragent/InitialRequestManager.java @@ -0,0 +1,312 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010, 2011 Yohann Martineau +*/ + +package peers.sip.core.useragent; + + +import org.pmw.tinylog.Logger; +import peers.sip.RFC3261; +import peers.sip.Utils; +import peers.sip.core.useragent.handlers.ByeHandler; +import peers.sip.core.useragent.handlers.CancelHandler; +import peers.sip.core.useragent.handlers.InviteHandler; +import peers.sip.core.useragent.handlers.OptionsHandler; +import peers.sip.core.useragent.handlers.RegisterHandler; +import peers.sip.syntaxencoding.NameAddress; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaderParamName; +import peers.sip.syntaxencoding.SipHeaders; +import peers.sip.syntaxencoding.SipURI; +import peers.sip.syntaxencoding.SipUriSyntaxException; +import peers.sip.transaction.ClientTransaction; +import peers.sip.transaction.ServerTransaction; +import peers.sip.transaction.ServerTransactionUser; +import peers.sip.transaction.TransactionManager; +import peers.sip.transactionuser.DialogManager; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.TransportManager; + +public class InitialRequestManager extends RequestManager + implements ServerTransactionUser { + + public InitialRequestManager(UserAgent userAgent, + InviteHandler inviteHandler, + CancelHandler cancelHandler, + ByeHandler byeHandler, + OptionsHandler optionsHandler, + RegisterHandler registerHandler, + DialogManager dialogManager, + TransactionManager transactionManager, + TransportManager transportManager + ) { + super(userAgent, + inviteHandler, + cancelHandler, + byeHandler, + optionsHandler, + registerHandler, + dialogManager, + transactionManager, + transportManager); + registerHandler.setInitialRequestManager(this); + } + + /** + * gives a new request outside of a dialog + * + * @param requestUri + * @param method + * @return + * @throws SipUriSyntaxException + */ + public SipRequest getGenericRequest(String requestUri, String method, + String profileUri, String callId, String fromTag) + throws SipUriSyntaxException { + //8.1.1 + SipRequest request = new SipRequest(method, new SipURI(requestUri)); + SipHeaders headers = request.getSipHeaders(); + //String hostAddress = utils.getMyAddress().getHostAddress(); + + //Via + + //TODO no Via should be added directly by UAC, Via is normally added by Transaction layer + +// StringBuffer viaBuf = new StringBuffer(); +// viaBuf.append(RFC3261.DEFAULT_SIP_VERSION); +// // TODO choose real transport +// viaBuf.append("/UDP "); +// viaBuf.append(hostAddress); +// SipHeaderFieldValue via = new SipHeaderFieldValue(viaBuf.toString()); +// via.addParam(new SipHeaderParamName(RFC3261.PARAM_BRANCHID), +// utils.generateBranchId()); +// headers.add(new SipHeaderFieldName(RFC3261.HDR_VIA), via); + + Utils.addCommonHeaders(headers); + + //To + + NameAddress to = new NameAddress(requestUri); + headers.add(new SipHeaderFieldName(RFC3261.HDR_TO), + new SipHeaderFieldValue(to.toString())); + + //From + + NameAddress fromNA = new NameAddress(profileUri); + SipHeaderFieldValue from = new SipHeaderFieldValue(fromNA.toString()); + String localFromTag; + if (fromTag != null) { + localFromTag = fromTag; + } else { + localFromTag = Utils.generateTag(); + } + from.addParam(new SipHeaderParamName(RFC3261.PARAM_TAG), localFromTag); + headers.add(new SipHeaderFieldName(RFC3261.HDR_FROM), from); + + //Call-ID + + SipHeaderFieldName callIdName = + new SipHeaderFieldName(RFC3261.HDR_CALLID); + String localCallId; + if (callId != null) { + localCallId = callId; + } else { + localCallId = Utils.generateCallID( + userAgent.getConfig().getLocalInetAddress()); + } + headers.add(callIdName, new SipHeaderFieldValue(localCallId)); + + //CSeq + + headers.add(new SipHeaderFieldName(RFC3261.HDR_CSEQ), + new SipHeaderFieldValue(userAgent.generateCSeq(method))); + + return request; + } + + public SipRequest createInitialRequest(String requestUri, String method, + String profileUri) throws SipUriSyntaxException { + return createInitialRequest(requestUri, method, profileUri, null); + } + + public SipRequest createInitialRequest(String requestUri, String method, + String profileUri, String callId) throws SipUriSyntaxException { + + return createInitialRequest(requestUri, method, profileUri, callId, + null, null); + } + + public SipRequest createInitialRequest(String requestUri, String method, + String profileUri, String callId, String fromTag, + MessageInterceptor messageInterceptor) + throws SipUriSyntaxException { + + SipRequest sipRequest = getGenericRequest(requestUri, method, + profileUri, callId, fromTag); + + // TODO add route header for outbound proxy give it to xxxHandler to create + // clientTransaction + SipURI outboundProxy = userAgent.getOutboundProxy(); + if (outboundProxy != null) { + NameAddress outboundProxyNameAddress = + new NameAddress(outboundProxy.toString()); + sipRequest.getSipHeaders().add(new SipHeaderFieldName(RFC3261.HDR_ROUTE), + new SipHeaderFieldValue(outboundProxyNameAddress.toString()), 0); + } + ClientTransaction clientTransaction = null; + if (RFC3261.METHOD_INVITE.equals(method)) { + clientTransaction = inviteHandler.preProcessInvite(sipRequest); + } else if (RFC3261.METHOD_REGISTER.equals(method)) { + clientTransaction = registerHandler.preProcessRegister(sipRequest); + } + createInitialRequestEnd(sipRequest, clientTransaction, profileUri, + messageInterceptor, true); + return sipRequest; + } + + private void createInitialRequestEnd(SipRequest sipRequest, + ClientTransaction clientTransaction, String profileUri, + MessageInterceptor messageInterceptor, boolean addContact) { + if (clientTransaction == null) { + Logger.error("method not supported"); + return; + } + if (addContact) { + addContact(sipRequest, clientTransaction.getContact(), profileUri); + } + if (messageInterceptor != null) { + messageInterceptor.postProcess(sipRequest); + } + // TODO create message receiver on client transport port + clientTransaction.start(); + } + + public void createCancel(SipRequest inviteRequest, + MidDialogRequestManager midDialogRequestManager, String profileUri) { + SipHeaders inviteHeaders = inviteRequest.getSipHeaders(); + SipHeaderFieldValue callId = inviteHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_CALLID)); + SipRequest sipRequest; + try { + sipRequest = getGenericRequest( + inviteRequest.getRequestUri().toString(), RFC3261.METHOD_CANCEL, + profileUri, callId.getValue(), null); + } catch (SipUriSyntaxException e) { + Logger.error("syntax error", e); + return; + } + + ClientTransaction clientTransaction = null; + clientTransaction = cancelHandler.preProcessCancel(sipRequest, + inviteRequest, midDialogRequestManager); + if (clientTransaction != null) { + createInitialRequestEnd(sipRequest, clientTransaction, profileUri, + null, false); + } + + + } + + public void manageInitialRequest(SipRequest sipRequest) { + SipHeaders headers = sipRequest.getSipHeaders(); + + // TODO authentication + + //method inspection + SipResponse sipResponse = null; + if (!UAS.SUPPORTED_METHODS.contains(sipRequest.getMethod())) { + //TODO generate 405 (using 8.2.6 &) with Allow header + //(20.5) and send it + sipResponse = generateResponse(sipRequest, null, + RFC3261.CODE_405_METHOD_NOT_ALLOWED, + RFC3261.REASON_405_METHOD_NOT_ALLOWED); + SipHeaders sipHeaders = sipResponse.getSipHeaders(); + sipHeaders.add(new SipHeaderFieldName(RFC3261.HDR_ALLOW), + new SipHeaderFieldValue(Utils.generateAllowHeader())); + } + + + SipHeaderFieldValue contentType = + headers.get(new SipHeaderFieldName(RFC3261.HDR_CONTENT_TYPE)); + if (contentType != null) { + if (!RFC3261.CONTENT_TYPE_SDP.equals(contentType.getValue())) { + //TODO generate 415 with a Accept header listing supported content types + //8.2.3 + } + } + + + //etc. + + if (sipResponse != null) { + ServerTransaction serverTransaction = + transactionManager.createServerTransaction( + sipResponse, userAgent.getSipPort(), RFC3261.TRANSPORT_UDP, + this, sipRequest); + serverTransaction.start(); + serverTransaction.receivedRequest(sipRequest); + serverTransaction.sendReponse(sipResponse); + } + + //TODO create server transaction + String method = sipRequest.getMethod(); + if (RFC3261.METHOD_INVITE.equals(method)) { + inviteHandler.handleInitialInvite(sipRequest); + } else if (RFC3261.METHOD_CANCEL.equals(method)) { + cancelHandler.handleCancel(sipRequest); + } else if (RFC3261.METHOD_OPTIONS.equals(method)) { + optionsHandler.handleOptions(sipRequest); + } + } + + public void addContact(SipRequest sipRequest, String contactEnd, + String profileUri) { + SipHeaders sipHeaders = sipRequest.getSipHeaders(); + + + + //Contact + + StringBuffer contactBuf = new StringBuffer(); + contactBuf.append(RFC3261.SIP_SCHEME); + contactBuf.append(RFC3261.SCHEME_SEPARATOR); + String userPart = Utils.getUserPart(profileUri); + contactBuf.append(userPart); + contactBuf.append(RFC3261.AT); + contactBuf.append(contactEnd); + + NameAddress contactNA = new NameAddress(contactBuf.toString()); + SipHeaderFieldValue contact = + new SipHeaderFieldValue(contactNA.toString()); + sipHeaders.add(new SipHeaderFieldName(RFC3261.HDR_CONTACT), + new SipHeaderFieldValue(contact.toString())); + } + + /////////////////////////////////////////////////////////// + // ServerTransactionUser methods + /////////////////////////////////////////////////////////// + + @Override + public void transactionFailure() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/peers/sip/core/useragent/MessageInterceptor.java b/src/peers/sip/core/useragent/MessageInterceptor.java new file mode 100644 index 0000000..31f0041 --- /dev/null +++ b/src/peers/sip/core/useragent/MessageInterceptor.java @@ -0,0 +1,27 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.core.useragent; + +import peers.sip.transport.SipMessage; + +public interface MessageInterceptor { + + public void postProcess(SipMessage sipMessage); +} diff --git a/src/peers/sip/core/useragent/MidDialogRequestManager.java b/src/peers/sip/core/useragent/MidDialogRequestManager.java new file mode 100644 index 0000000..e7b6509 --- /dev/null +++ b/src/peers/sip/core/useragent/MidDialogRequestManager.java @@ -0,0 +1,251 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.core.useragent; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Hashtable; + + +import org.pmw.tinylog.Logger; +import peers.sip.RFC3261; +import peers.sip.core.useragent.handlers.ByeHandler; +import peers.sip.core.useragent.handlers.CancelHandler; +import peers.sip.core.useragent.handlers.InviteHandler; +import peers.sip.core.useragent.handlers.OptionsHandler; +import peers.sip.core.useragent.handlers.RegisterHandler; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaders; +import peers.sip.syntaxencoding.SipURI; +import peers.sip.transaction.ClientTransaction; +import peers.sip.transaction.ClientTransactionUser; +import peers.sip.transaction.ServerTransaction; +import peers.sip.transaction.ServerTransactionUser; +import peers.sip.transaction.Transaction; +import peers.sip.transaction.TransactionManager; +import peers.sip.transactionuser.Dialog; +import peers.sip.transactionuser.DialogManager; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.TransportManager; + + +public class MidDialogRequestManager extends RequestManager + implements ClientTransactionUser, ServerTransactionUser { + + public MidDialogRequestManager(UserAgent userAgent, + InviteHandler inviteHandler, + CancelHandler cancelHandler, + ByeHandler byeHandler, + OptionsHandler optionsHandler, + RegisterHandler registerHandler, + DialogManager dialogManager, + TransactionManager transactionManager, + TransportManager transportManager) { + super(userAgent, + inviteHandler, + cancelHandler, + byeHandler, + optionsHandler, + registerHandler, + dialogManager, + transactionManager, + transportManager); + } + + + //////////////////////////////////////////////// + // methods for UAC + //////////////////////////////////////////////// + + public void generateMidDialogRequest(Dialog dialog, + String method, MessageInterceptor messageInterceptor) { + + + SipRequest sipRequest = dialog.buildSubsequentRequest(RFC3261.METHOD_BYE); + + if (RFC3261.METHOD_BYE.equals(method)) { + byeHandler.preprocessBye(sipRequest, dialog); + } + //TODO check that subsequent request is supported before client + //transaction creation + if (!RFC3261.METHOD_INVITE.equals(method)) { + ClientTransaction clientTransaction = createNonInviteClientTransaction( + sipRequest, null, byeHandler); + if (messageInterceptor != null) { + messageInterceptor.postProcess(sipRequest); + } + if (clientTransaction != null) { + clientTransaction.start(); + } + } else { + //TODO client transaction user is managed by invite handler directly + } + + + } + + + public ClientTransaction createNonInviteClientTransaction( + SipRequest sipRequest, String branchId, + ClientTransactionUser clientTransactionUser) { + //8.1.2 + SipURI destinationUri = RequestManager.getDestinationUri(sipRequest); + + //TODO if header route is present, addrspec = toproute.nameaddress.addrspec + String transport = RFC3261.TRANSPORT_UDP; + Hashtable params = destinationUri.getUriParameters(); + if (params != null) { + String reqUriTransport = params.get(RFC3261.PARAM_TRANSPORT); + if (reqUriTransport != null) { + transport = reqUriTransport; + } + } + int port = destinationUri.getPort(); + if (port == SipURI.DEFAULT_PORT) { + port = RFC3261.TRANSPORT_DEFAULT_PORT; + } + SipURI sipUri = userAgent.getConfig().getOutboundProxy(); + if (sipUri == null) { + sipUri = destinationUri; + } + InetAddress inetAddress; + try { + inetAddress = InetAddress.getByName(sipUri.getHost()); + } catch (UnknownHostException e) { + Logger.error("unknown host: " + sipUri.getHost(), e); + return null; + } + ClientTransaction clientTransaction = transactionManager + .createClientTransaction(sipRequest, inetAddress, port, transport, + branchId, clientTransactionUser); + return clientTransaction; + } + + + + + + + + + + + + //////////////////////////////////////////////// + // methods for UAS + //////////////////////////////////////////////// + + public void manageMidDialogRequest(SipRequest sipRequest, Dialog dialog) { + SipHeaders sipHeaders = sipRequest.getSipHeaders(); + SipHeaderFieldValue cseq = + sipHeaders.get(new SipHeaderFieldName(RFC3261.HDR_CSEQ)); + String cseqStr = cseq.getValue(); + int pos = cseqStr.indexOf(' '); + if (pos < 0) { + pos = cseqStr.indexOf('\t'); + } + int newCseq = Integer.parseInt(cseqStr.substring(0, pos)); + int oldCseq = dialog.getRemoteCSeq(); + if (oldCseq == Dialog.EMPTY_CSEQ) { + dialog.setRemoteCSeq(newCseq); + } else if (newCseq < oldCseq) { + // out of order + // RFC3261 12.2.2 p77 + // TODO test out of order in-dialog-requests + SipResponse sipResponse = generateResponse(sipRequest, dialog, + RFC3261.CODE_500_SERVER_INTERNAL_ERROR, + RFC3261.REASON_500_SERVER_INTERNAL_ERROR); + ServerTransaction serverTransaction = + transactionManager.createServerTransaction( + sipResponse, + userAgent.getSipPort(), + RFC3261.TRANSPORT_UDP, + this, sipRequest); + serverTransaction.start(); + serverTransaction.receivedRequest(sipRequest); + serverTransaction.sendReponse(sipResponse); + } else { + dialog.setRemoteCSeq(newCseq); + } + + String method = sipRequest.getMethod(); + if (RFC3261.METHOD_BYE.equals(method)) { + byeHandler.handleBye(sipRequest, dialog); + } else if (RFC3261.METHOD_INVITE.equals(method)) { + inviteHandler.handleReInvite(sipRequest, dialog); + } else if (RFC3261.METHOD_ACK.equals(method)) { + inviteHandler.handleAck(sipRequest, dialog); + } else if (RFC3261.METHOD_OPTIONS.equals(method)) { + optionsHandler.handleOptions(sipRequest); + } + } + + /////////////////////////////////////// + // ServerTransactionUser methods + /////////////////////////////////////// + @Override + public void transactionFailure() { + // TODO Auto-generated method stub + + } + + + /////////////////////////////////////// + // ClientTransactionUser methods + /////////////////////////////////////// + // callbacks employed for cancel responses (ignored) + @Override + public void transactionTimeout(ClientTransaction clientTransaction) { + // TODO Auto-generated method stub + + } + + + @Override + public void provResponseReceived(SipResponse sipResponse, + Transaction transaction) { + // TODO Auto-generated method stub + + } + + + @Override + public void errResponseReceived(SipResponse sipResponse) { + // TODO Auto-generated method stub + + } + + + @Override + public void successResponseReceived(SipResponse sipResponse, + Transaction transaction) { + // TODO Auto-generated method stub + + } + + + @Override + public void transactionTransportError() { + // TODO Auto-generated method stub + + } +} diff --git a/src/peers/sip/core/useragent/RequestManager.java b/src/peers/sip/core/useragent/RequestManager.java new file mode 100644 index 0000000..f2d3fcc --- /dev/null +++ b/src/peers/sip/core/useragent/RequestManager.java @@ -0,0 +1,136 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.core.useragent; + + +import org.pmw.tinylog.Logger; +import peers.sip.RFC3261; +import peers.sip.core.useragent.handlers.ByeHandler; +import peers.sip.core.useragent.handlers.CancelHandler; +import peers.sip.core.useragent.handlers.InviteHandler; +import peers.sip.core.useragent.handlers.OptionsHandler; +import peers.sip.core.useragent.handlers.RegisterHandler; +import peers.sip.syntaxencoding.NameAddress; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaderParamName; +import peers.sip.syntaxencoding.SipHeaders; +import peers.sip.syntaxencoding.SipURI; +import peers.sip.syntaxencoding.SipUriSyntaxException; +import peers.sip.transaction.TransactionManager; +import peers.sip.transactionuser.Dialog; +import peers.sip.transactionuser.DialogManager; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.TransportManager; + + +public abstract class RequestManager { + + public static SipURI getDestinationUri(SipRequest sipRequest + ) { + SipHeaders requestHeaders = sipRequest.getSipHeaders(); + SipURI destinationUri = null; + SipHeaderFieldValue route = requestHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_ROUTE)); + if (route != null) { + try { + destinationUri = new SipURI( + NameAddress.nameAddressToUri(route.toString())); + } catch (SipUriSyntaxException e) { + Logger.error("syntax error", e); + } + } + if (destinationUri == null) { + destinationUri = sipRequest.getRequestUri(); + } + return destinationUri; + } + + public static SipResponse generateResponse(SipRequest sipRequest, + Dialog dialog, int statusCode, String reasonPhrase) { + //8.2.6.2 + SipResponse sipResponse = new SipResponse(statusCode, reasonPhrase); + SipHeaders requestHeaders = sipRequest.getSipHeaders(); + SipHeaders responseHeaders = sipResponse.getSipHeaders(); + SipHeaderFieldName fromName = new SipHeaderFieldName(RFC3261.HDR_FROM); + responseHeaders.add(fromName, requestHeaders.get(fromName)); + SipHeaderFieldName callIdName = new SipHeaderFieldName(RFC3261.HDR_CALLID); + responseHeaders.add(callIdName, requestHeaders.get(callIdName)); + SipHeaderFieldName cseqName = new SipHeaderFieldName(RFC3261.HDR_CSEQ); + responseHeaders.add(cseqName, requestHeaders.get(cseqName)); + SipHeaderFieldName viaName = new SipHeaderFieldName(RFC3261.HDR_VIA); + responseHeaders.add(viaName, requestHeaders.get(viaName));//TODO check ordering + SipHeaderFieldName toName = new SipHeaderFieldName(RFC3261.HDR_TO); + SipHeaderFieldValue toValue = requestHeaders.get(toName); + SipHeaderParamName toTagParamName = new SipHeaderParamName(RFC3261.PARAM_TAG); + String toTag = toValue.getParam(toTagParamName); + if (toTag == null) { + if (dialog != null) { + toTag = dialog.getLocalTag(); + toValue.addParam(toTagParamName, toTag); + } + } + responseHeaders.add(toName, toValue); + return sipResponse; + } + + protected InviteHandler inviteHandler; + protected CancelHandler cancelHandler; + protected ByeHandler byeHandler; + protected OptionsHandler optionsHandler; + protected RegisterHandler registerHandler; + + protected UserAgent userAgent; + protected TransactionManager transactionManager; + protected TransportManager transportManager; + + public RequestManager(UserAgent userAgent, + InviteHandler inviteHandler, + CancelHandler cancelHandler, + ByeHandler byeHandler, + OptionsHandler optionsHandler, + RegisterHandler registerHandler, + DialogManager dialogManager, + TransactionManager transactionManager, + TransportManager transportManager) { + this.userAgent = userAgent; + this.inviteHandler = inviteHandler; + this.cancelHandler = cancelHandler; + this.byeHandler = byeHandler; + this.optionsHandler = optionsHandler; + this.registerHandler = registerHandler; + this.transactionManager = transactionManager; + this.transportManager = transportManager; + } + + public InviteHandler getInviteHandler() { + return inviteHandler; + } + + public ByeHandler getByeHandler() { + return byeHandler; + } + + public RegisterHandler getRegisterHandler() { + return registerHandler; + } + +} diff --git a/src/peers/sip/core/useragent/SipEvent.java b/src/peers/sip/core/useragent/SipEvent.java new file mode 100644 index 0000000..2692cac --- /dev/null +++ b/src/peers/sip/core/useragent/SipEvent.java @@ -0,0 +1,46 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010, 2011 Yohann Martineau +*/ + +package peers.sip.core.useragent; + +import peers.sip.transport.SipMessage; + +public class SipEvent { + + public enum EventType { + ERROR, RINGING, INCOMING_CALL, CALLEE_PICKUP; + } + + private EventType eventType; + private SipMessage sipMessage; + + public SipEvent(EventType type, SipMessage sipMessage) { + this.eventType = type; + this.sipMessage = sipMessage; + } + + public SipMessage getSipMessage() { + return sipMessage; + } + + public EventType getEventType() { + return eventType; + } + +} diff --git a/src/peers/sip/core/useragent/SipListener.java b/src/peers/sip/core/useragent/SipListener.java new file mode 100644 index 0000000..da87b4e --- /dev/null +++ b/src/peers/sip/core/useragent/SipListener.java @@ -0,0 +1,44 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + + +package peers.sip.core.useragent; + +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; + +public interface SipListener { + + public void registering(SipRequest sipRequest); + + public void registerSuccessful(SipResponse sipResponse); + + public void registerFailed(SipResponse sipResponse); + + public void incomingCall(SipRequest sipRequest, SipResponse provResponse); + + public void remoteHangup(SipRequest sipRequest); + + public void ringing(SipResponse sipResponse); + + public void calleePickup(SipResponse sipResponse); + + public void error(SipResponse sipResponse); + +} diff --git a/src/peers/sip/core/useragent/UAC.java b/src/peers/sip/core/useragent/UAC.java new file mode 100644 index 0000000..09c5edd --- /dev/null +++ b/src/peers/sip/core/useragent/UAC.java @@ -0,0 +1,227 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007-2013 Yohann Martineau +*/ + +package peers.sip.core.useragent; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + + +import org.pmw.tinylog.Logger; +import peers.sip.RFC3261; +import peers.sip.Utils; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaderParamName; +import peers.sip.syntaxencoding.SipHeaders; +import peers.sip.syntaxencoding.SipUriSyntaxException; +import peers.sip.transaction.ClientTransaction; +import peers.sip.transaction.InviteClientTransaction; +import peers.sip.transaction.TransactionManager; +import peers.sip.transactionuser.Dialog; +import peers.sip.transactionuser.DialogManager; +import peers.sip.transactionuser.DialogState; +import peers.sip.transport.SipMessage; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.TransportManager; + +public class UAC { + + private InitialRequestManager initialRequestManager; + private MidDialogRequestManager midDialogRequestManager; + + private String registerCallID; + private String profileUri; + + //FIXME + private UserAgent userAgent; + private TransactionManager transactionManager; + private DialogManager dialogManager; + private List guiClosedCallIds; + + + /** + * should be instanciated only once, it was a singleton. + */ + public UAC(UserAgent userAgent, + InitialRequestManager initialRequestManager, + MidDialogRequestManager midDialogRequestManager, + DialogManager dialogManager, + TransactionManager transactionManager, + TransportManager transportManager) { + this.userAgent = userAgent; + this.initialRequestManager = initialRequestManager; + this.midDialogRequestManager = midDialogRequestManager; + this.dialogManager = dialogManager; + this.transactionManager = transactionManager; + guiClosedCallIds = Collections.synchronizedList(new ArrayList()); + profileUri = RFC3261.SIP_SCHEME + RFC3261.SCHEME_SEPARATOR + + userAgent.getUserpart() + RFC3261.AT + userAgent.getDomain(); + } + + /** + * For the moment we consider that only one profile uri is used at a time. + * @throws SipUriSyntaxException + */ + SipRequest register() throws SipUriSyntaxException { + String domain = userAgent.getDomain(); + String requestUri = RFC3261.SIP_SCHEME + RFC3261.SCHEME_SEPARATOR + + domain; + SipListener sipListener = userAgent.getSipListener(); + profileUri = RFC3261.SIP_SCHEME + RFC3261.SCHEME_SEPARATOR + + userAgent.getUserpart() + RFC3261.AT + domain; + registerCallID = Utils.generateCallID( + userAgent.getConfig().getLocalInetAddress()); + SipRequest sipRequest = initialRequestManager.createInitialRequest( + requestUri, RFC3261.METHOD_REGISTER, profileUri, + registerCallID); + if (sipListener != null) { + sipListener.registering(sipRequest); + } + return sipRequest; + } + + void unregister() throws SipUriSyntaxException { + if (getInitialRequestManager().getRegisterHandler().isRegistered()) { + String requestUri = RFC3261.SIP_SCHEME + RFC3261.SCHEME_SEPARATOR + + userAgent.getDomain(); + MessageInterceptor messageInterceptor = new MessageInterceptor() { + + @Override + public void postProcess(SipMessage sipMessage) { + initialRequestManager.registerHandler.unregister(); + SipHeaders sipHeaders = sipMessage.getSipHeaders(); + SipHeaderFieldValue contact = sipHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_CONTACT)); + contact.addParam(new SipHeaderParamName(RFC3261.PARAM_EXPIRES), + "0"); + } + + }; + // for any reason, asterisk requires a new Call-ID to unregister + registerCallID = Utils.generateCallID( + userAgent.getConfig().getLocalInetAddress()); + initialRequestManager.createInitialRequest(requestUri, + RFC3261.METHOD_REGISTER, profileUri, registerCallID, null, + messageInterceptor); + } + } + + SipRequest invite(String requestUri, String callId) + throws SipUriSyntaxException { + return initialRequestManager.createInitialRequest(requestUri, + RFC3261.METHOD_INVITE, profileUri, callId); + + } + + private SipRequest getInviteWithAuth(String callId) { + List clientTransactions = + transactionManager.getClientTransactionsFromCallId(callId, + RFC3261.METHOD_INVITE); + SipRequest sipRequestNoAuth = null; + for (ClientTransaction clientTransaction: clientTransactions) { + InviteClientTransaction inviteClientTransaction = + (InviteClientTransaction)clientTransaction; + SipRequest sipRequest = inviteClientTransaction.getRequest(); + SipHeaders sipHeaders = sipRequest.getSipHeaders(); + SipHeaderFieldName authorization = new SipHeaderFieldName( + RFC3261.HDR_AUTHORIZATION); + SipHeaderFieldValue value = sipHeaders.get(authorization); + if (value == null) { + SipHeaderFieldName proxyAuthorization = new SipHeaderFieldName( + RFC3261.HDR_PROXY_AUTHORIZATION); + value = sipHeaders.get(proxyAuthorization); + } + if (value != null) { + return sipRequest; + } + sipRequestNoAuth = sipRequest; + } + return sipRequestNoAuth; + } + + void terminate(SipRequest sipRequest) { + String callId = Utils.getMessageCallId(sipRequest); + if (!guiClosedCallIds.contains(callId)) { + guiClosedCallIds.add(callId); + } + Dialog dialog = dialogManager.getDialog(callId); + SipRequest inviteWithAuth = getInviteWithAuth(callId); + if (dialog != null) { + SipRequest originatingRequest; + if (inviteWithAuth != null) { + originatingRequest = inviteWithAuth; + } else { + originatingRequest = sipRequest; + } + ClientTransaction clientTransaction = + transactionManager.getClientTransaction(originatingRequest); + if (clientTransaction != null) { + synchronized (clientTransaction) { + DialogState dialogState = dialog.getState(); + if (dialog.EARLY.equals(dialogState)) { + initialRequestManager.createCancel(inviteWithAuth, + midDialogRequestManager, profileUri); + } else if (dialog.CONFIRMED.equals(dialogState)) { + // clientTransaction not yet removed + midDialogRequestManager.generateMidDialogRequest( + dialog, RFC3261.METHOD_BYE, null); + guiClosedCallIds.remove(callId); + } + } + } else { + // clientTransaction Terminated and removed + Logger.debug("clientTransaction null"); + midDialogRequestManager.generateMidDialogRequest( + dialog, RFC3261.METHOD_BYE, null); + guiClosedCallIds.remove(callId); + } + } else { + InviteClientTransaction inviteClientTransaction = + (InviteClientTransaction)transactionManager + .getClientTransaction(inviteWithAuth); + if (inviteClientTransaction == null) { + Logger.error("cannot find invite client transaction" + + " for call " + callId); + } else { + SipResponse sipResponse = + inviteClientTransaction.getLastResponse(); + if (sipResponse != null) { + int statusCode = sipResponse.getStatusCode(); + if (statusCode < RFC3261.CODE_200_OK) { + initialRequestManager.createCancel(inviteWithAuth, + midDialogRequestManager, profileUri); + } + } + } + } + userAgent.getMediaManager().stopSession(); + } + + public InitialRequestManager getInitialRequestManager() { + return initialRequestManager; + } + + public List getGuiClosedCallIds() { + return guiClosedCallIds; + } + +} diff --git a/src/peers/sip/core/useragent/UAS.java b/src/peers/sip/core/useragent/UAS.java new file mode 100644 index 0000000..9accbe6 --- /dev/null +++ b/src/peers/sip/core/useragent/UAS.java @@ -0,0 +1,133 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.core.useragent; + +import java.net.SocketException; +import java.util.ArrayList; + +import peers.sip.RFC3261; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaderParamName; +import peers.sip.syntaxencoding.SipHeaders; +import peers.sip.transaction.TransactionManager; +import peers.sip.transactionuser.Dialog; +import peers.sip.transactionuser.DialogManager; +import peers.sip.transport.SipMessage; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.SipServerTransportUser; +import peers.sip.transport.TransportManager; + +public class UAS implements SipServerTransportUser { + + public final static ArrayList SUPPORTED_METHODS; + + static { + SUPPORTED_METHODS = new ArrayList(); + SUPPORTED_METHODS.add(RFC3261.METHOD_INVITE); + SUPPORTED_METHODS.add(RFC3261.METHOD_ACK); + SUPPORTED_METHODS.add(RFC3261.METHOD_CANCEL); + SUPPORTED_METHODS.add(RFC3261.METHOD_OPTIONS); + SUPPORTED_METHODS.add(RFC3261.METHOD_BYE); + }; + + private InitialRequestManager initialRequestManager; + private MidDialogRequestManager midDialogRequestManager; + + private DialogManager dialogManager; + + /** + * should be instanciated only once, it was a singleton. + */ + public UAS(UserAgent userAgent, + InitialRequestManager initialRequestManager, + MidDialogRequestManager midDialogRequestManager, + DialogManager dialogManager, + TransactionManager transactionManager, + TransportManager transportManager) throws SocketException { + this.initialRequestManager = initialRequestManager; + this.midDialogRequestManager = midDialogRequestManager; + this.dialogManager = dialogManager; + transportManager.setSipServerTransportUser(this); + transportManager.createServerTransport( + RFC3261.TRANSPORT_UDP, userAgent.getConfig().getSipPort()); + } + + public void messageReceived(SipMessage sipMessage) { + if (sipMessage instanceof SipRequest) { + requestReceived((SipRequest) sipMessage); + } else if (sipMessage instanceof SipResponse) { + responseReceived((SipResponse) sipMessage); + } else { + throw new RuntimeException("unknown message type"); + } + } + + private void responseReceived(SipResponse sipResponse) { + + } + + private void requestReceived(SipRequest sipRequest) { + //TODO 8.2 + + //TODO JTA to make request processing atomic + + SipHeaders headers = sipRequest.getSipHeaders(); + + //TODO find whether the request is within an existing dialog or not + SipHeaderFieldValue to = + headers.get(new SipHeaderFieldName(RFC3261.HDR_TO)); + String toTag = to.getParam(new SipHeaderParamName(RFC3261.PARAM_TAG)); + if (toTag != null) { + Dialog dialog = dialogManager.getDialog(sipRequest); + if (dialog != null) { + //this is a mid-dialog request + midDialogRequestManager.manageMidDialogRequest(sipRequest, dialog); + //TODO continue processing + } else { + //TODO reject the request with a 481 Call/Transaction Does Not Exist + + } + } else { + + initialRequestManager.manageInitialRequest(sipRequest); + + } + } + + void acceptCall(SipRequest sipRequest, Dialog dialog) { + initialRequestManager.getInviteHandler().acceptCall(sipRequest, + dialog); + } + + void rejectCall(SipRequest sipRequest) { + initialRequestManager.getInviteHandler().rejectCall(sipRequest); + } + + public InitialRequestManager getInitialRequestManager() { + return initialRequestManager; + } + + public MidDialogRequestManager getMidDialogRequestManager() { + return midDialogRequestManager; + } + +} diff --git a/src/peers/sip/core/useragent/UserAgent.java b/src/peers/sip/core/useragent/UserAgent.java new file mode 100644 index 0000000..3fa19c6 --- /dev/null +++ b/src/peers/sip/core/useragent/UserAgent.java @@ -0,0 +1,382 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.core.useragent; + +import java.io.File; +import java.net.SocketException; +import java.util.ArrayList; +import java.util.List; + +import org.pmw.tinylog.Logger; +import peers.Config; + +import peers.XmlConfig; +import peers.media.AbstractSoundManager; +import peers.media.Echo; +import peers.media.MediaManager; +import peers.media.MediaMode; +import peers.sdp.SDPManager; +import peers.sip.Utils; +import peers.sip.core.useragent.handlers.ByeHandler; +import peers.sip.core.useragent.handlers.CancelHandler; +import peers.sip.core.useragent.handlers.InviteHandler; +import peers.sip.core.useragent.handlers.OptionsHandler; +import peers.sip.core.useragent.handlers.RegisterHandler; +import peers.sip.syntaxencoding.SipURI; +import peers.sip.syntaxencoding.SipUriSyntaxException; +import peers.sip.transaction.Transaction; +import peers.sip.transaction.TransactionManager; +import peers.sip.transactionuser.Dialog; +import peers.sip.transactionuser.DialogManager; +import peers.sip.transport.SipMessage; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.TransportManager; + + +@SuppressWarnings("unused") +public class UserAgent { + + public final static String CONFIG_FILE = "conf" + File.separator + "peers.xml"; + public final static int RTP_DEFAULT_PORT = 8000; + + private String peersHome; + private Config config; + + private List peers; + //private List

dialogs; + + //TODO factorize echo and captureRtpSender + private Echo echo; + + private UAC uac; + private UAS uas; + + private ChallengeManager challengeManager; + + private DialogManager dialogManager; + private TransactionManager transactionManager; + private TransportManager transportManager; + + private int cseqCounter; + private SipListener sipListener; + + private SDPManager sdpManager; + private AbstractSoundManager soundManager; + private MediaManager mediaManager; + + public UserAgent(SipListener sipListener, String peersHome, + AbstractSoundManager soundManager) + throws SocketException { + this(sipListener, null, peersHome, soundManager); + } + + public UserAgent(SipListener sipListener, Config config, + AbstractSoundManager soundManager) + throws SocketException { + this(sipListener, config, null, soundManager); + } + + private UserAgent(SipListener sipListener, Config config, String peersHome, + AbstractSoundManager soundManager) + throws SocketException { + this.sipListener = sipListener; + if (peersHome == null) { + peersHome = Utils.DEFAULT_PEERS_HOME; + } + this.peersHome = peersHome; + + if (config == null) { + config = new XmlConfig(this.peersHome + File.separator + + CONFIG_FILE); + } + this.config = config; + + cseqCounter = 1; + + StringBuffer buf = new StringBuffer(); + buf.append("starting user agent ["); + buf.append("myAddress: "); + buf.append(config.getLocalInetAddress().getHostAddress()).append(", "); + buf.append("sipPort: "); + buf.append(config.getSipPort()).append(", "); + buf.append("userpart: "); + buf.append(config.getUserPart()).append(", "); + buf.append("domain: "); + buf.append(config.getDomain()).append("]"); + Logger.info(buf.toString()); + + //transaction user + + dialogManager = new DialogManager(); + + //transaction + + transactionManager = new TransactionManager(); + + //transport + + transportManager = new TransportManager(transactionManager, + config); + + transactionManager.setTransportManager(transportManager); + + //core + + InviteHandler inviteHandler = new InviteHandler(this, + dialogManager, + transactionManager, + transportManager); + CancelHandler cancelHandler = new CancelHandler(this, + dialogManager, + transactionManager, + transportManager); + ByeHandler byeHandler = new ByeHandler(this, + dialogManager, + transactionManager, + transportManager); + OptionsHandler optionsHandler = new OptionsHandler(this, + transactionManager, + transportManager); + RegisterHandler registerHandler = new RegisterHandler(this, + transactionManager, + transportManager); + + InitialRequestManager initialRequestManager = + new InitialRequestManager( + this, + inviteHandler, + cancelHandler, + byeHandler, + optionsHandler, + registerHandler, + dialogManager, + transactionManager, + transportManager); + MidDialogRequestManager midDialogRequestManager = + new MidDialogRequestManager( + this, + inviteHandler, + cancelHandler, + byeHandler, + optionsHandler, + registerHandler, + dialogManager, + transactionManager, + transportManager); + + uas = new UAS(this, + initialRequestManager, + midDialogRequestManager, + dialogManager, + transactionManager, + transportManager); + + uac = new UAC(this, + initialRequestManager, + midDialogRequestManager, + dialogManager, + transactionManager, + transportManager); + + challengeManager = new ChallengeManager(config, + initialRequestManager, + midDialogRequestManager, + dialogManager); + registerHandler.setChallengeManager(challengeManager); + inviteHandler.setChallengeManager(challengeManager); + byeHandler.setChallengeManager(challengeManager); + + peers = new ArrayList(); + //dialogs = new ArrayList(); + + sdpManager = new SDPManager(this); + inviteHandler.setSdpManager(sdpManager); + optionsHandler.setSdpManager(sdpManager); + + this.soundManager = soundManager; + mediaManager = new MediaManager(this); + } + + // client methods + + public void close() { + transportManager.closeTransports(); + config.setPublicInetAddress(null); + } + + public SipRequest register() throws SipUriSyntaxException { + return uac.register(); + } + + public void unregister() throws SipUriSyntaxException { + uac.unregister(); + } + + public SipRequest invite(String requestUri, String callId) + throws SipUriSyntaxException { + return uac.invite(requestUri, callId); + } + + public void terminate(SipRequest sipRequest) { + uac.terminate(sipRequest); + } + + public void acceptCall(SipRequest sipRequest, Dialog dialog) { + uas.acceptCall(sipRequest, dialog); + } + + public void rejectCall(SipRequest sipRequest) { + uas.rejectCall(sipRequest); + } + + + /** + * Gives the sipMessage if sipMessage is a SipRequest or + * the SipRequest corresponding to the SipResponse + * if sipMessage is a SipResponse + * @param sipMessage + * @return null if sipMessage is neither a SipRequest neither a SipResponse + */ + public SipRequest getSipRequest(SipMessage sipMessage) { + if (sipMessage instanceof SipRequest) { + return (SipRequest) sipMessage; + } else if (sipMessage instanceof SipResponse) { + SipResponse sipResponse = (SipResponse) sipMessage; + Transaction transaction = (Transaction)transactionManager + .getClientTransaction(sipResponse); + if (transaction == null) { + transaction = (Transaction)transactionManager + .getServerTransaction(sipResponse); + } + if (transaction == null) { + return null; + } + return transaction.getRequest(); + } else { + return null; + } + } + +// public List getDialogs() { +// return dialogs; +// } + + public List getPeers() { + return peers; + } + +// public Dialog getDialog(String peer) { +// for (Dialog dialog : dialogs) { +// String remoteUri = dialog.getRemoteUri(); +// if (remoteUri != null) { +// if (remoteUri.contains(peer)) { +// return dialog; +// } +// } +// } +// return null; +// } + + public String generateCSeq(String method) { + StringBuffer buf = new StringBuffer(); + buf.append(cseqCounter++); + buf.append(' '); + buf.append(method); + return buf.toString(); + } + + public boolean isRegistered() { + return uac.getInitialRequestManager().getRegisterHandler() + .isRegistered(); + } + + public UAS getUas() { + return uas; + } + + public UAC getUac() { + return uac; + } + + public DialogManager getDialogManager() { + return dialogManager; + } + + public int getSipPort() { + return transportManager.getSipPort(); + } + + public int getRtpPort() { + return config.getRtpPort(); + } + + public String getDomain() { + return config.getDomain(); + } + + public String getUserpart() { + return config.getUserPart(); + } + + public MediaMode getMediaMode() { + return config.getMediaMode(); + } + + public boolean isMediaDebug() { + return config.isMediaDebug(); + } + + public SipURI getOutboundProxy() { + return config.getOutboundProxy(); + } + + public Echo getEcho() { + return echo; + } + + public void setEcho(Echo echo) { + this.echo = echo; + } + + public SipListener getSipListener() { + return sipListener; + } + + public AbstractSoundManager getSoundManager() { + return soundManager; + } + + public MediaManager getMediaManager() { + return mediaManager; + } + + public Config getConfig() { + return config; + } + + public String getPeersHome() { + return peersHome; + } + + public TransportManager getTransportManager() { + return transportManager; + } +} diff --git a/src/peers/sip/core/useragent/handlers/ByeHandler.java b/src/peers/sip/core/useragent/handlers/ByeHandler.java new file mode 100644 index 0000000..5807b04 --- /dev/null +++ b/src/peers/sip/core/useragent/handlers/ByeHandler.java @@ -0,0 +1,183 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007-2013 Yohann Martineau +*/ + +package peers.sip.core.useragent.handlers; + + +import org.pmw.tinylog.Logger; +import peers.sip.RFC3261; +import peers.sip.core.useragent.RequestManager; +import peers.sip.core.useragent.SipListener; +import peers.sip.core.useragent.UserAgent; +import peers.sip.transaction.ClientTransaction; +import peers.sip.transaction.ClientTransactionUser; +import peers.sip.transaction.NonInviteClientTransaction; +import peers.sip.transaction.ServerTransaction; +import peers.sip.transaction.ServerTransactionUser; +import peers.sip.transaction.Transaction; +import peers.sip.transaction.TransactionManager; +import peers.sip.transactionuser.Dialog; +import peers.sip.transactionuser.DialogManager; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.TransportManager; + +public class ByeHandler extends DialogMethodHandler + implements ServerTransactionUser, ClientTransactionUser { + + public ByeHandler(UserAgent userAgent, DialogManager dialogManager, + TransactionManager transactionManager, + TransportManager transportManager) { + super(userAgent, dialogManager, transactionManager, transportManager); + } + + //////////////////////////////////////////////// + // methods for UAC + //////////////////////////////////////////////// + + public void preprocessBye(SipRequest sipRequest, Dialog dialog) { + + // 15.1.1 + + String addrSpec = sipRequest.getRequestUri().toString(); + userAgent.getPeers().remove(addrSpec); + challengeManager.postProcess(sipRequest); + } + + + + + + + //////////////////////////////////////////////// + // methods for UAS + //////////////////////////////////////////////// + + public void handleBye(SipRequest sipRequest, Dialog dialog) { + dialog.receivedOrSentBye(); + //String remoteUri = dialog.getRemoteUri(); + + String addrSpec = sipRequest.getRequestUri().toString(); + userAgent.getPeers().remove(addrSpec); + dialogManager.removeDialog(dialog.getId()); + Logger.debug("removed dialog " + dialog.getId()); + userAgent.getMediaManager().stopSession(); + + SipResponse sipResponse = + RequestManager.generateResponse( + sipRequest, + dialog, + RFC3261.CODE_200_OK, + RFC3261.REASON_200_OK); + + // TODO determine port and transport for server transaction>transport + // from initial invite + // FIXME determine port and transport for server transaction>transport + ServerTransaction serverTransaction = transactionManager + .createServerTransaction( + sipResponse, + userAgent.getSipPort(), + RFC3261.TRANSPORT_UDP, + this, + sipRequest); + + serverTransaction.start(); + + serverTransaction.receivedRequest(sipRequest); + + serverTransaction.sendReponse(sipResponse); + + dialogManager.removeDialog(dialog.getId()); + + SipListener sipListener = userAgent.getSipListener(); + if (sipListener != null) { + sipListener.remoteHangup(sipRequest); + } + +// setChanged(); +// notifyObservers(sipRequest); + } + + /////////////////////////////////////// + //ServerTransactionUser methods + /////////////////////////////////////// + public void transactionFailure() { + // TODO Auto-generated method stub + + } + + /////////////////////////////////////// + //ClientTransactionUser methods + /////////////////////////////////////// + @Override + public void transactionTimeout(ClientTransaction clientTransaction) { + // TODO Auto-generated method stub + + } + + @Override + public void provResponseReceived(SipResponse sipResponse, + Transaction transaction) { + // TODO Auto-generated method stub + + } + + @Override + public void errResponseReceived(SipResponse sipResponse) { + int statusCode = sipResponse.getStatusCode(); + if (statusCode == RFC3261.CODE_401_UNAUTHORIZED + || statusCode == RFC3261.CODE_407_PROXY_AUTHENTICATION_REQUIRED + && !challenged) { + NonInviteClientTransaction nonInviteClientTransaction = + (NonInviteClientTransaction) + transactionManager.getClientTransaction(sipResponse); + SipRequest sipRequest = nonInviteClientTransaction.getRequest(); + String password = userAgent.getConfig().getPassword(); + if (password != null && !"".equals(password.trim())) { + challengeManager.handleChallenge(sipRequest, + sipResponse); + } + challenged = true; + } else { + challenged = false; + } + } + + @Override + public void successResponseReceived(SipResponse sipResponse, + Transaction transaction) { + Dialog dialog = dialogManager.getDialog(sipResponse); + if (dialog == null) { + return; + } + dialog.receivedOrSentBye(); + dialogManager.removeDialog(dialog.getId()); + Logger.debug("removed dialog " + dialog.getId()); + } + + @Override + public void transactionTransportError() { + // TODO Auto-generated method stub + + } + + + + +} diff --git a/src/peers/sip/core/useragent/handlers/CancelHandler.java b/src/peers/sip/core/useragent/handlers/CancelHandler.java new file mode 100644 index 0000000..3acc7a6 --- /dev/null +++ b/src/peers/sip/core/useragent/handlers/CancelHandler.java @@ -0,0 +1,172 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.core.useragent.handlers; + + +import org.pmw.tinylog.Logger; +import peers.sip.RFC3261; +import peers.sip.Utils; +import peers.sip.core.useragent.MidDialogRequestManager; +import peers.sip.core.useragent.SipListener; +import peers.sip.core.useragent.UserAgent; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaderParamName; +import peers.sip.syntaxencoding.SipHeaders; +import peers.sip.transaction.ClientTransaction; +import peers.sip.transaction.InviteClientTransaction; +import peers.sip.transaction.InviteServerTransaction; +import peers.sip.transaction.ServerTransaction; +import peers.sip.transaction.ServerTransactionUser; +import peers.sip.transaction.TransactionManager; +import peers.sip.transactionuser.Dialog; +import peers.sip.transactionuser.DialogManager; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.TransportManager; + +public class CancelHandler extends DialogMethodHandler + implements ServerTransactionUser { + + public CancelHandler(UserAgent userAgent, DialogManager dialogManager, + TransactionManager transactionManager, + TransportManager transportManager) { + super(userAgent, dialogManager, transactionManager, transportManager); + } + + ////////////////////////////////////////////////////////// + // UAS methods + ////////////////////////////////////////////////////////// + + public void handleCancel(SipRequest sipRequest) { + SipHeaderFieldValue topVia = Utils.getTopVia(sipRequest); + String branchId = topVia.getParam(new SipHeaderParamName( + RFC3261.PARAM_BRANCH)); + InviteServerTransaction inviteServerTransaction = + (InviteServerTransaction)transactionManager + .getServerTransaction(branchId,RFC3261.METHOD_INVITE); + SipResponse cancelResponse; + if (inviteServerTransaction == null) { + //TODO generate CANCEL 481 Call Leg/Transaction Does Not Exist + cancelResponse = buildGenericResponse(sipRequest, + RFC3261.CODE_481_CALL_TRANSACTION_DOES_NOT_EXIST, + RFC3261.REASON_481_CALL_TRANSACTION_DOES_NOT_EXIST); + } else { + cancelResponse = buildGenericResponse(sipRequest, + RFC3261.CODE_200_OK, RFC3261.REASON_200_OK); + } + ServerTransaction cancelServerTransaction = transactionManager + .createServerTransaction(cancelResponse, + userAgent.getSipPort(), + RFC3261.TRANSPORT_UDP, this, sipRequest); + cancelServerTransaction.start(); + cancelServerTransaction.receivedRequest(sipRequest); + cancelServerTransaction.sendReponse(cancelResponse); + if (cancelResponse.getStatusCode() != RFC3261.CODE_200_OK) { + return; + } + + SipResponse lastResponse = inviteServerTransaction.getLastResponse(); + if (lastResponse != null && + lastResponse.getStatusCode() >= RFC3261.CODE_200_OK) { + return; + } + + SipResponse inviteResponse = buildGenericResponse( + inviteServerTransaction.getRequest(), + RFC3261.CODE_487_REQUEST_TERMINATED, + RFC3261.REASON_487_REQUEST_TERMINATED); + inviteServerTransaction.sendReponse(inviteResponse); + + Dialog dialog = dialogManager.getDialog(lastResponse); + dialog.receivedOrSent300To699(); + + SipListener sipListener = userAgent.getSipListener(); + if (sipListener != null) { + sipListener.remoteHangup(sipRequest); + } + } + + ////////////////////////////////////////////////////////// + // UAC methods + ////////////////////////////////////////////////////////// + + public ClientTransaction preProcessCancel(SipRequest cancelGenericRequest, + SipRequest inviteRequest, + MidDialogRequestManager midDialogRequestManager) { + //TODO + //p. 54 §9.1 + + SipHeaders cancelHeaders = cancelGenericRequest.getSipHeaders(); + SipHeaders inviteHeaders = inviteRequest.getSipHeaders(); + + //cseq + SipHeaderFieldName cseqName = new SipHeaderFieldName(RFC3261.HDR_CSEQ); + SipHeaderFieldValue cancelCseq = cancelHeaders.get(cseqName); + SipHeaderFieldValue inviteCseq = inviteHeaders.get(cseqName); + cancelCseq.setValue(inviteCseq.getValue().replace(RFC3261.METHOD_INVITE, + RFC3261.METHOD_CANCEL)); + + + //from + SipHeaderFieldName fromName = new SipHeaderFieldName(RFC3261.HDR_FROM); + SipHeaderFieldValue cancelFrom = cancelHeaders.get(fromName); + SipHeaderFieldValue inviteFrom = inviteHeaders.get(fromName); + cancelFrom.setValue(inviteFrom.getValue()); + SipHeaderParamName tagParam = new SipHeaderParamName(RFC3261.PARAM_TAG); + cancelFrom.removeParam(tagParam); + cancelFrom.addParam(tagParam, inviteFrom.getParam(tagParam)); + + //top-via +// cancelHeaders.add(new SipHeaderFieldName(RFC3261.HDR_VIA), +// Utils.getInstance().getTopVia(inviteRequest)); + SipHeaderFieldValue topVia = Utils.getTopVia(inviteRequest); + String branchId = topVia.getParam(new SipHeaderParamName(RFC3261.PARAM_BRANCH)); + + //route + SipHeaderFieldName routeName = new SipHeaderFieldName(RFC3261.HDR_ROUTE); + SipHeaderFieldValue inviteRoute = inviteHeaders.get(routeName); + if (inviteRoute != null) { + cancelHeaders.add(routeName, inviteRoute); + } + + InviteClientTransaction inviteClientTransaction = + (InviteClientTransaction)transactionManager.getClientTransaction( + inviteRequest); + if (inviteClientTransaction != null) { + SipResponse lastResponse = inviteClientTransaction.getLastResponse(); + if (lastResponse != null && + lastResponse.getStatusCode() >= RFC3261.CODE_200_OK) { + return null; + } + } else { + Logger.error("cannot retrieve invite client transaction for" + + " request " + inviteRequest); + } + + return midDialogRequestManager.createNonInviteClientTransaction( + cancelGenericRequest, branchId, midDialogRequestManager); + } + + public void transactionFailure() { + // TODO Auto-generated method stub + + } +} diff --git a/src/peers/sip/core/useragent/handlers/DialogMethodHandler.java b/src/peers/sip/core/useragent/handlers/DialogMethodHandler.java new file mode 100644 index 0000000..907e5e7 --- /dev/null +++ b/src/peers/sip/core/useragent/handlers/DialogMethodHandler.java @@ -0,0 +1,283 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007-2013 Yohann Martineau +*/ + +package peers.sip.core.useragent.handlers; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.TimerTask; + + +import org.pmw.tinylog.Logger; +import peers.sip.RFC3261; +import peers.sip.core.useragent.UserAgent; +import peers.sip.syntaxencoding.NameAddress; +import peers.sip.syntaxencoding.SipHeaderFieldMultiValue; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaderParamName; +import peers.sip.syntaxencoding.SipHeaders; +import peers.sip.transaction.Transaction; +import peers.sip.transaction.TransactionManager; +import peers.sip.transactionuser.Dialog; +import peers.sip.transactionuser.DialogManager; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.TransportManager; + + +public abstract class DialogMethodHandler extends MethodHandler { + + protected DialogManager dialogManager; + + public DialogMethodHandler(UserAgent userAgent, + DialogManager dialogManager, + TransactionManager transactionManager, + TransportManager transportManager) { + super(userAgent, transactionManager, transportManager); + this.dialogManager = dialogManager; + } + + protected Dialog buildDialogForUas(SipResponse sipResponse, + SipRequest sipRequest) { + //12.1.1 + + //prepare response + + SipHeaders reqHeaders = sipRequest.getSipHeaders(); + SipHeaders respHeaders = sipResponse.getSipHeaders(); + + //copy record-route + SipHeaderFieldName recordRouteName = + new SipHeaderFieldName(RFC3261.HDR_RECORD_ROUTE); + SipHeaderFieldValue reqRecRoute = reqHeaders.get(recordRouteName); + if (reqRecRoute != null) { + respHeaders.add(recordRouteName, reqRecRoute); + } + + //FIXME Contact header should probably added in response here. + + SipHeaderFieldName contactName = new SipHeaderFieldName(RFC3261.HDR_CONTACT); + + Dialog dialog = dialogManager.createDialog(sipResponse); + + //build dialog state + + //route set + SipHeaderFieldValue recordRoute = + respHeaders.get(new SipHeaderFieldName(RFC3261.HDR_RECORD_ROUTE)); + ArrayList routeSet = new ArrayList(); + if (recordRoute != null) { + if (recordRoute instanceof SipHeaderFieldMultiValue) { + SipHeaderFieldMultiValue multiRecordRoute = + (SipHeaderFieldMultiValue) recordRoute; + for (SipHeaderFieldValue routeValue : multiRecordRoute.getValues()) { + routeSet.add(routeValue.getValue()); + } + } else { + routeSet.add(recordRoute.getValue()); + } + } + dialog.setRouteSet(routeSet); + + //remote target + SipHeaderFieldValue reqContact = reqHeaders.get(contactName); + String remoteTarget = reqContact.getValue(); + if (remoteTarget.indexOf(RFC3261.LEFT_ANGLE_BRACKET) > -1) { + remoteTarget = NameAddress.nameAddressToUri(remoteTarget); + } + dialog.setRemoteTarget(remoteTarget); + + //remote cseq + SipHeaderFieldName cseqName = new SipHeaderFieldName(RFC3261.HDR_CSEQ); + SipHeaderFieldValue cseq = reqHeaders.get(cseqName); + String remoteCseq = cseq.getValue().substring(0, cseq.getValue().indexOf(' ')); + dialog.setRemoteCSeq(Integer.parseInt(remoteCseq)); + + //callid + SipHeaderFieldName callidName = new SipHeaderFieldName(RFC3261.HDR_CALLID); + SipHeaderFieldValue callid = reqHeaders.get(callidName); + dialog.setCallId(callid.getValue()); + + //local tag + SipHeaderFieldName toName = new SipHeaderFieldName(RFC3261.HDR_TO); + SipHeaderFieldValue to = respHeaders.get(toName); + SipHeaderParamName tagName = new SipHeaderParamName(RFC3261.PARAM_TAG); + String toTag = to.getParam(tagName); + dialog.setLocalTag(toTag); + + //remote tag + SipHeaderFieldName fromName = new SipHeaderFieldName(RFC3261.HDR_FROM); + SipHeaderFieldValue from = reqHeaders.get(fromName); + String fromTag = from.getParam(tagName); + dialog.setRemoteTag(fromTag); + + //remote uri + + String remoteUri = from.getValue(); + if (remoteUri.indexOf(RFC3261.LEFT_ANGLE_BRACKET) > -1) { + remoteUri = NameAddress.nameAddressToUri(remoteUri); + } + dialog.setRemoteUri(remoteUri); + + //local uri + + String localUri = to.getValue(); + if (localUri.indexOf(RFC3261.LEFT_ANGLE_BRACKET) > -1) { + localUri = NameAddress.nameAddressToUri(localUri); + } + dialog.setLocalUri(localUri); + + return dialog; + } + + //TODO throw an exception if dialog elements are lacking when dialog is built from 200 + protected Dialog buildOrUpdateDialogForUac(SipResponse sipResponse, + Transaction transaction) { + SipHeaders headers = sipResponse.getSipHeaders(); + + Dialog dialog = dialogManager.getDialog(sipResponse); + if (dialog == null) { + dialog = dialogManager.createDialog(sipResponse); + } + + //12.1.2 + + //TODO if request uri contains sips scheme or if sent over tls => dialog.setSecure(true) + + //route set + + ArrayList routeSet = computeRouteSet(headers); + if (routeSet != null) { + dialog.setRouteSet(routeSet); + } + + //remote target + + SipHeaderFieldValue contact = headers.get(new SipHeaderFieldName(RFC3261.HDR_CONTACT)); + Logger.debug("Contact: " + contact); + if (contact != null) { + String remoteTarget = NameAddress.nameAddressToUri(contact.toString()); + dialog.setRemoteTarget(remoteTarget); + } + + SipHeaders requestSipHeaders = transaction.getRequest().getSipHeaders(); + + //local cseq + + String requestCSeq = requestSipHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_CSEQ)).toString(); + requestCSeq = requestCSeq.substring(0, requestCSeq.indexOf(' ')); + dialog.setLocalCSeq(Integer.parseInt(requestCSeq)); + + //callID + + //already done in createDialog() +// String requestCallID = requestSipHeaders.get( +// new SipHeaderFieldName(RFC3261.HDR_CALLID)).toString(); +// dialog.setCallId(requestCallID); + + //local tag + + //already done in createDialog() +// SipHeaderFieldValue requestFrom = requestSipHeaders.get( +// new SipHeaderFieldName(RFC3261.HDR_FROM)); +// String requestFromTag = +// requestFrom.getParam(new SipHeaderParamName(RFC3261.PARAM_TAG)); +// dialog.setLocalTag(requestFromTag); + + //remote tag + + //already done in createDialog() +// dialog.setRemoteTag(toTag); + + //remote uri + + SipHeaderFieldValue to = headers.get(new SipHeaderFieldName(RFC3261.HDR_TO)); + if (to != null) { + String remoteUri = to.getValue(); + if (remoteUri.indexOf(RFC3261.LEFT_ANGLE_BRACKET) > -1) { + remoteUri = NameAddress.nameAddressToUri(remoteUri); + } + dialog.setRemoteUri(remoteUri); + } + + //local uri + SipHeaderFieldValue requestFrom = requestSipHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_FROM)); + String localUri = requestFrom.getValue(); + if (localUri.indexOf(RFC3261.LEFT_ANGLE_BRACKET) > -1) { + localUri = NameAddress.nameAddressToUri(localUri); + } + dialog.setLocalUri(localUri); + + return dialog; + } + + protected ArrayList computeRouteSet(SipHeaders headers) { + SipHeaderFieldValue recordRoute = + headers.get(new SipHeaderFieldName(RFC3261.HDR_RECORD_ROUTE)); + ArrayList routeSet = new ArrayList(); + if (recordRoute != null) { + if (recordRoute instanceof SipHeaderFieldMultiValue) { + List values = + ((SipHeaderFieldMultiValue)recordRoute).getValues(); + for (SipHeaderFieldValue value : values) { + //reverse order + routeSet.add(0, value.toString()); + } + } else { + routeSet.add(recordRoute.toString()); + } + } + return routeSet; + } + + //TODO see if AckHandler is usable + class AckTimerTask extends TimerTask { + + private String toUri; + + public AckTimerTask(String toUri) { + super(); + this.toUri = toUri; + } + + @Override + public void run() { + ArrayList purgedDialogs = new ArrayList(); + Collection dialogs = dialogManager.getDialogCollection(); + for (Dialog dialog : dialogs) { + String remoteUri = dialog.getRemoteUri(); + if (remoteUri.equals(toUri) && + !dialog.CONFIRMED.equals(dialog.getState())) { + dialog.receivedOrSentBye(); + purgedDialogs.add(dialog); + } + } + for (Dialog dialog : purgedDialogs) { + dialogs.remove(dialog); + } + } + + } + + +} diff --git a/src/peers/sip/core/useragent/handlers/InviteHandler.java b/src/peers/sip/core/useragent/handlers/InviteHandler.java new file mode 100644 index 0000000..f890fc5 --- /dev/null +++ b/src/peers/sip/core/useragent/handlers/InviteHandler.java @@ -0,0 +1,693 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007-2013 Yohann Martineau +*/ + +package peers.sip.core.useragent.handlers; + +import java.io.IOException; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.List; +import java.util.Timer; + + +import org.pmw.tinylog.Logger; +import peers.media.MediaManager; +import peers.sdp.Codec; +import peers.sdp.MediaDestination; +import peers.sdp.NoCodecException; +import peers.sdp.SessionDescription; +import peers.sip.RFC3261; +import peers.sip.Utils; +import peers.sip.core.useragent.RequestManager; +import peers.sip.core.useragent.SipListener; +import peers.sip.core.useragent.UserAgent; +import peers.sip.syntaxencoding.NameAddress; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaderParamName; +import peers.sip.syntaxencoding.SipHeaders; +import peers.sip.syntaxencoding.SipURI; +import peers.sip.syntaxencoding.SipUriSyntaxException; +import peers.sip.transaction.ClientTransaction; +import peers.sip.transaction.ClientTransactionUser; +import peers.sip.transaction.InviteClientTransaction; +import peers.sip.transaction.InviteServerTransaction; +import peers.sip.transaction.ServerTransaction; +import peers.sip.transaction.ServerTransactionUser; +import peers.sip.transaction.Transaction; +import peers.sip.transaction.TransactionManager; +import peers.sip.transactionuser.Dialog; +import peers.sip.transactionuser.DialogManager; +import peers.sip.transport.MessageSender; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.TransportManager; + +public class InviteHandler extends DialogMethodHandler + implements ServerTransactionUser, ClientTransactionUser { + + public static final int TIMEOUT = 100; + + private MediaDestination mediaDestination; + private Timer ackTimer; + private boolean initialIncomingInvite; + + public InviteHandler(UserAgent userAgent, + DialogManager dialogManager, + TransactionManager transactionManager, + TransportManager transportManager) { + super(userAgent, dialogManager, transactionManager, transportManager); + ackTimer = new Timer(getClass().getSimpleName() + " Ack " + + Timer.class.getSimpleName()); + } + + + ////////////////////////////////////////////////////////// + // UAS methods + ////////////////////////////////////////////////////////// + + public void handleInitialInvite(SipRequest sipRequest) { + initialIncomingInvite = true; + //generate 180 Ringing + SipResponse sipResponse = buildGenericResponse(sipRequest, + RFC3261.CODE_180_RINGING, RFC3261.REASON_180_RINGING); + Dialog dialog = buildDialogForUas(sipResponse, sipRequest); + //here dialog is already stored in dialogs in DialogManager + + InviteServerTransaction inviteServerTransaction = (InviteServerTransaction) + transactionManager.createServerTransaction(sipResponse, + userAgent.getSipPort(), RFC3261.TRANSPORT_UDP, this, + sipRequest); + + inviteServerTransaction.start(); + + inviteServerTransaction.receivedRequest(sipRequest); + + //TODO send 180 more than once + inviteServerTransaction.sendReponse(sipResponse); + + dialog.receivedOrSent1xx(); + + SipListener sipListener = userAgent.getSipListener(); + if (sipListener != null) { + sipListener.incomingCall(sipRequest, sipResponse); + } + + List peers = userAgent.getPeers(); + String responseTo = sipRequest.getSipHeaders().get( + new SipHeaderFieldName(RFC3261.HDR_FROM)).getValue(); + if (!peers.contains(responseTo)) { + peers.add(responseTo); + } + + } + + public void handleReInvite(SipRequest sipRequest, Dialog dialog) { + Logger.debug("handleReInvite"); + initialIncomingInvite = false; + SipHeaders sipHeaders = sipRequest.getSipHeaders(); + + // 12.2.2 update dialog + SipHeaderFieldValue contact = + sipHeaders.get(new SipHeaderFieldName(RFC3261.HDR_CONTACT)); + if (contact != null) { + String contactStr = contact.getValue(); + if (contactStr.indexOf(RFC3261.LEFT_ANGLE_BRACKET) > -1) { + contactStr = NameAddress.nameAddressToUri(contactStr); + } + dialog.setRemoteTarget(contactStr); + } + + + // update session + sendSuccessfulResponse(sipRequest, dialog); + + } + + private DatagramSocket getDatagramSocket() { + DatagramSocket datagramSocket = userAgent.getMediaManager() + .getDatagramSocket(); + if (datagramSocket == null) { // initial invite success response + // AccessController.doPrivileged added for plugin compatibility + datagramSocket = AccessController.doPrivileged( + new PrivilegedAction() { + + @Override + public DatagramSocket run() { + DatagramSocket datagramSocket = null; + int rtpPort = userAgent.getConfig().getRtpPort(); + try { + if (rtpPort == 0) { + int localPort = -1; + while (localPort % 2 != 0) { + datagramSocket = new DatagramSocket(); + localPort = datagramSocket.getLocalPort(); + if (localPort % 2 != 0) { + datagramSocket.close(); + } + } + } else { + datagramSocket = new DatagramSocket(rtpPort); + } + } catch (SocketException e) { + Logger.error("cannot create datagram socket ", e); + } + + return datagramSocket; + } + } + ); + Logger.debug("new rtp DatagramSocket " + datagramSocket.hashCode()); + try { + datagramSocket.setSoTimeout(TIMEOUT); + } catch (SocketException e) { + Logger.error("cannot set timeout on datagram socket ", e); + } + userAgent.getMediaManager().setDatagramSocket(datagramSocket); + } + return datagramSocket; + } + + @SuppressWarnings("unlikely-arg-type") + private synchronized void sendSuccessfulResponse(SipRequest sipRequest, Dialog dialog) { + SipHeaders reqHeaders = sipRequest.getSipHeaders(); + SipHeaderFieldValue contentType = + reqHeaders.get(new SipHeaderFieldName(RFC3261.HDR_CONTENT_TYPE)); + + + if (RFC3261.CONTENT_TYPE_SDP.equals(contentType)) { + //TODO +// String sdpResponse; +// try { +// sdpResponse = sdpManager.handleOffer( +// new String(sipRequest.getBody())); +// } catch (NoCodecException e) { +// sdpResponse = sdpManager.generateErrorResponse(); +// } + } else { + // TODO manage empty bodies and non-application/sdp content type + } + + + //TODO if mode autoanswer just send 200 without asking any question + SipResponse sipResponse = + RequestManager.generateResponse( + sipRequest, + dialog, + RFC3261.CODE_200_OK, + RFC3261.REASON_200_OK); + + // TODO 13.3 dialog invite-specific processing + + // TODO timer if there is an Expires header in INVITE + + // TODO 3xx + + // TODO 486 or 600 + + byte[] offerBytes = sipRequest.getBody(); + SessionDescription answer; + try { + DatagramSocket datagramSocket = getDatagramSocket(); + + if (offerBytes != null && contentType != null && + RFC3261.CONTENT_TYPE_SDP.equals(contentType.getValue())) { + // create response in 200 + try { + SessionDescription offer = sdpManager.parse(offerBytes); + answer = sdpManager.createSessionDescription(offer, + datagramSocket.getLocalPort()); + mediaDestination = sdpManager.getMediaDestination(offer); + } catch (NoCodecException e) { + answer = sdpManager.createSessionDescription(null, + datagramSocket.getLocalPort()); + } + } else { + // create offer in 200 (never tested...) + answer = sdpManager.createSessionDescription(null, + datagramSocket.getLocalPort()); + } + sipResponse.setBody(answer.toString().getBytes()); + } catch (IOException e) { + Logger.error(e.getMessage(), e); + } + + SipHeaders respHeaders = sipResponse.getSipHeaders(); + respHeaders.add(new SipHeaderFieldName(RFC3261.HDR_CONTENT_TYPE), + new SipHeaderFieldValue(RFC3261.CONTENT_TYPE_SDP)); + + ArrayList routeSet = dialog.getRouteSet(); + if (routeSet != null) { + SipHeaderFieldName recordRoute = new SipHeaderFieldName(RFC3261.HDR_RECORD_ROUTE); + for (String route : routeSet) { + respHeaders.add(recordRoute, new SipHeaderFieldValue(route)); + } + } + + // TODO determine port and transport for server transaction>transport + // from initial invite + // FIXME determine port and transport for server transaction>transport + ServerTransaction serverTransaction = transactionManager + .getServerTransaction(sipRequest); + if (serverTransaction == null) { + // in re-INVITE case, no serverTransaction has been created + serverTransaction = (InviteServerTransaction) + transactionManager.createServerTransaction(sipResponse, + userAgent.getSipPort(), RFC3261.TRANSPORT_UDP, this, + sipRequest); + } + serverTransaction.start(); + + serverTransaction.receivedRequest(sipRequest); + + serverTransaction.sendReponse(sipResponse); + // TODO manage retransmission of the response (send to the transport) + // until ACK arrives, if no ACK is received within 64*T1, confirm dialog + // and terminate it with a BYE + +// logger.getInstance().debug("before dialog.receivedOrSent2xx();"); +// logger.getInstance().debug("dialog state: " + dialog.getState()); + } + + public void acceptCall(SipRequest sipRequest, Dialog dialog) { + sendSuccessfulResponse(sipRequest, dialog); + + dialog.receivedOrSent2xx(); +// logger.getInstance().debug("dialog state: " + dialog.getState()); +// logger.getInstance().debug("after dialog.receivedOrSent2xx();"); + +// setChanged(); +// notifyObservers(sipRequest); + } + + public void rejectCall(SipRequest sipRequest) { + //TODO generate 486, etc. + SipHeaders reqHeaders = sipRequest.getSipHeaders(); + SipHeaderFieldValue callId = reqHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_CALLID)); + + Dialog dialog = dialogManager.getDialog(callId.getValue()); + + //TODO manage auto reject Do not disturb (DND) + SipResponse sipResponse = + RequestManager.generateResponse( + sipRequest, + dialog, + RFC3261.CODE_486_BUSYHERE, + RFC3261.REASON_486_BUSYHERE); + + // TODO determine port and transport for server transaction>transport + // from initial invite + // FIXME determine port and transport for server transaction>transport + ServerTransaction serverTransaction = transactionManager + .getServerTransaction(sipRequest); + + serverTransaction.start(); + + serverTransaction.receivedRequest(sipRequest); + + serverTransaction.sendReponse(sipResponse); + + dialog.receivedOrSent300To699(); + + userAgent.getMediaManager().setDatagramSocket(null); +// setChanged(); +// notifyObservers(sipRequest); + } + + ////////////////////////////////////////////////////////// + // UAC methods + ////////////////////////////////////////////////////////// + + public ClientTransaction preProcessInvite(SipRequest sipRequest) + throws SipUriSyntaxException { + + //8.1.2 + SipHeaders requestHeaders = sipRequest.getSipHeaders(); + SipURI destinationUri = RequestManager.getDestinationUri(sipRequest); + + //TODO if header route is present, addrspec = toproute.nameaddress.addrspec + + String transport = RFC3261.TRANSPORT_UDP; + Hashtable params = destinationUri.getUriParameters(); + if (params != null) { + String reqUriTransport = params.get(RFC3261.PARAM_TRANSPORT); + if (reqUriTransport != null) { + transport = reqUriTransport; + } + } + int port = destinationUri.getPort(); + if (port == SipURI.DEFAULT_PORT) { + port = RFC3261.TRANSPORT_DEFAULT_PORT; + } + SipURI sipUri = userAgent.getConfig().getOutboundProxy(); + if (sipUri == null) { + sipUri = destinationUri; + } + InetAddress inetAddress; + try { + inetAddress = InetAddress.getByName(sipUri.getHost()); + } catch (UnknownHostException e) { + throw new SipUriSyntaxException("unknown host: " + + sipUri.getHost(), e); + } + ClientTransaction clientTransaction = transactionManager + .createClientTransaction(sipRequest, inetAddress, + port, transport, null, this); + DatagramSocket datagramSocket; + synchronized (this) { + datagramSocket = getDatagramSocket(); + } + try { + SessionDescription sessionDescription = + sdpManager.createSessionDescription(null, + datagramSocket.getLocalPort()); + sipRequest.setBody(sessionDescription.toString().getBytes()); + } catch (IOException e) { + Logger.error(e.getMessage(), e); + } + requestHeaders.add(new SipHeaderFieldName(RFC3261.HDR_CONTENT_TYPE), + new SipHeaderFieldValue(RFC3261.CONTENT_TYPE_SDP)); + return clientTransaction; + } + + public void preProcessReInvite(SipRequest sipRequest) { + //TODO + } + + ////////////////////////////////////////////////////////// + // ClientTransactionUser methods + ////////////////////////////////////////////////////////// + + public void errResponseReceived(final SipResponse sipResponse) { + Dialog dialog = dialogManager.getDialog(sipResponse); + if (dialog != null) { + dialog.receivedOrSent300To699(); + dialogManager.removeDialog(dialog.getId()); + } + int statusCode = sipResponse.getStatusCode(); + if (statusCode == RFC3261.CODE_401_UNAUTHORIZED + || statusCode == RFC3261.CODE_407_PROXY_AUTHENTICATION_REQUIRED + && !challenged) { + InviteClientTransaction inviteClientTransaction = + (InviteClientTransaction) + transactionManager.getClientTransaction(sipResponse); + SipRequest sipRequest = inviteClientTransaction.getRequest(); + String password = userAgent.getConfig().getPassword(); + if (password != null && !"".equals(password.trim())) { + challengeManager.handleChallenge(sipRequest, + sipResponse); + } + challenged = true; + return; + } else { + challenged = false; + } + SipListener sipListener = userAgent.getSipListener(); + if (sipListener != null) { + sipListener.error(sipResponse); + } + List guiClosedCallIds = userAgent.getUac().getGuiClosedCallIds(); + String callId = Utils.getMessageCallId(sipResponse); + if (guiClosedCallIds.contains(callId)) { + guiClosedCallIds.remove(callId); + } + userAgent.getMediaManager().setDatagramSocket(null); + } + + public void provResponseReceived(SipResponse sipResponse, Transaction transaction) { + // dialog may have already been created if a previous 1xx has + // already been received + Dialog dialog = dialogManager.getDialog(sipResponse); + boolean isFirstProvRespWithToTag = false; + if (dialog == null) { + SipHeaderFieldValue to = sipResponse.getSipHeaders().get( + new SipHeaderFieldName(RFC3261.HDR_TO)); + String toTag = to.getParam(new SipHeaderParamName(RFC3261.PARAM_TAG)); + if (toTag != null) { + dialog = dialogManager.createDialog(sipResponse); + isFirstProvRespWithToTag = true; + } else { + //TODO maybe stop retransmissions + } + } + + if (dialog != null) { + buildOrUpdateDialogForUac(sipResponse, transaction); + } + +// +// if (dialog == null && sipResponse.getStatusCode() != RFC3261.CODE_100_TRYING) { +// Logger.debug("dialog not found for prov response"); +// isFirstProvRespWithToTag = true; +// SipHeaderFieldValue to = sipResponse.getSipHeaders() +// .get(new SipHeaderFieldName(RFC3261.HDR_TO)); +// String toTag = to.getParam(new SipHeaderParamName(RFC3261.PARAM_TAG)); +// if (toTag != null) { +// dialog = buildOrUpdateDialogForUac(sipResponse, transaction); +// } +// } + //TODO this notification is probably useless because dialog state modification + // thereafter always notify dialog observers + if (isFirstProvRespWithToTag) { + SipListener sipListener = userAgent.getSipListener(); + if (sipListener != null) { + sipListener.ringing(sipResponse); + } + dialog.receivedOrSent1xx(); + } + List guiClosedCallIds = userAgent.getUac().getGuiClosedCallIds(); + String callId = Utils.getMessageCallId(sipResponse); + if (guiClosedCallIds.contains(callId)) { + SipRequest sipRequest = transaction.getRequest(); + Logger.debug("cancel after prov response: sipRequest " + sipRequest + + ", sipResponse " + sipResponse); + userAgent.terminate(sipRequest); + } + } + + public void successResponseReceived(SipResponse sipResponse, Transaction transaction) { + SipHeaders responseHeaders = sipResponse.getSipHeaders(); + String cseq = responseHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_CSEQ)).getValue(); + String method = cseq.substring(cseq.trim().lastIndexOf(' ') + 1); + if (!RFC3261.METHOD_INVITE.equals(method)) { + return; + } + + challenged = false; + + + + + + + //13.2.2.4 + + List peers = userAgent.getPeers(); + String responseTo = responseHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_TO)).getValue(); + if (!peers.contains(responseTo)) { + peers.add(responseTo); + //timer used to purge dialogs which are not confirmed + //after a given time + ackTimer.schedule(new AckTimerTask(responseTo), + 64 * RFC3261.TIMER_T1); + } + + Dialog dialog = dialogManager.getDialog(sipResponse); + + if (dialog != null) { + //dialog already created with a 180 for example + dialog.setRouteSet(computeRouteSet(sipResponse.getSipHeaders())); + } + dialog = buildOrUpdateDialogForUac(sipResponse, transaction); + + SipListener sipListener = userAgent.getSipListener(); + if (sipListener != null) { + sipListener.calleePickup(sipResponse); + } + + //added for media + SessionDescription sessionDescription = + sdpManager.parse(sipResponse.getBody()); + try { + mediaDestination = sdpManager.getMediaDestination(sessionDescription); + } catch (NoCodecException e) { + Logger.error(e.getMessage(), e); + } + String remoteAddress = mediaDestination.getDestination(); + int remotePort = mediaDestination.getPort(); + Codec codec = mediaDestination.getCodec(); + String localAddress = userAgent.getConfig() + .getLocalInetAddress().getHostAddress(); + + userAgent.getMediaManager().successResponseReceived(localAddress, + remoteAddress, remotePort, codec); + + //switch to confirmed state + dialog.receivedOrSent2xx(); + + //generate ack + //p. 82 §3 + SipRequest ack = dialog.buildSubsequentRequest(RFC3261.METHOD_ACK); + + + //update CSeq + + SipHeaders ackHeaders = ack.getSipHeaders(); + SipHeaderFieldName cseqName = new SipHeaderFieldName(RFC3261.HDR_CSEQ); + SipHeaderFieldValue ackCseq = ackHeaders.get(cseqName); + + SipRequest request = transaction.getRequest(); + SipHeaders requestHeaders = request.getSipHeaders(); + SipHeaderFieldValue requestCseq = requestHeaders.get(cseqName); + + ackCseq.setValue(requestCseq.toString().replace(RFC3261.METHOD_INVITE, RFC3261.METHOD_ACK)); + + //add Via with only the branchid parameter + + SipHeaderFieldValue via = new SipHeaderFieldValue(""); + SipHeaderParamName branchIdName = new SipHeaderParamName(RFC3261.PARAM_BRANCH); + via.addParam(branchIdName, Utils.generateBranchId()); + + ackHeaders.add(new SipHeaderFieldName(RFC3261.HDR_VIA), via, 0); + + //TODO authentication headers + + if (request.getBody() == null && sipResponse.getBody() != null) { + //TODO add a real SDP answer + ack.setBody(sipResponse.getBody()); + } + + //TODO check if sdp is acceptable + + SipURI destinationUri = RequestManager.getDestinationUri(ack); + challengeManager.postProcess(ack); + + //TODO if header route is present, addrspec = toproute.nameaddress.addrspec + + String transport = RFC3261.TRANSPORT_UDP; + Hashtable params = destinationUri.getUriParameters(); + if (params != null) { + String reqUriTransport = params.get(RFC3261.PARAM_TRANSPORT); + if (reqUriTransport != null) { + transport = reqUriTransport; + } + } + int port = destinationUri.getPort(); + if (port == SipURI.DEFAULT_PORT) { + port = RFC3261.TRANSPORT_DEFAULT_PORT; + } + + SipURI sipUri = userAgent.getConfig().getOutboundProxy(); + if (sipUri == null) { + sipUri = destinationUri; + } + InetAddress inetAddress; + try { + inetAddress = InetAddress.getByName(sipUri.getHost()); + } catch (UnknownHostException e) { + Logger.error("unknown host: " + sipUri.getHost(), e); + return; + } + try { + MessageSender sender = transportManager.createClientTransport( + ack, inetAddress, port, transport); + sender.sendMessage(ack); + } catch (IOException e) { + Logger.error("input/output error", e); + } + + + + List guiClosedCallIds = userAgent.getUac().getGuiClosedCallIds(); + String callId = Utils.getMessageCallId(sipResponse); + if (guiClosedCallIds.contains(callId)) { + userAgent.terminate(request); + } + + + } + + public void handleAck(SipRequest ack, Dialog dialog) { + // TODO determine if ACK is ACK of an initial INVITE or a re-INVITE + // in first case, captureRtpSender and incomingRtpReader must be + // created, in the second case, they must be updated. + + Logger.debug("handleAck"); + + if (mediaDestination == null) { + SipHeaders reqHeaders = ack.getSipHeaders(); + SipHeaderFieldValue contentType = + reqHeaders.get(new SipHeaderFieldName(RFC3261.HDR_CONTENT_TYPE)); + byte[] offerBytes = ack.getBody(); + + if (offerBytes != null && contentType != null && + RFC3261.CONTENT_TYPE_SDP.equals(contentType.getValue())) { + // create response in 200 + try { + SessionDescription answer = sdpManager.parse(offerBytes); + mediaDestination = sdpManager.getMediaDestination(answer); + } catch (NoCodecException e) { + Logger.error(e.getMessage(), e); + return; + } + } + } + String destAddress = mediaDestination.getDestination(); + int destPort = mediaDestination.getPort(); + Codec codec = mediaDestination.getCodec(); + + MediaManager mediaManager = userAgent.getMediaManager(); + if (initialIncomingInvite) { + mediaManager.handleAck(destAddress, destPort, codec); + } else { + mediaManager.updateRemote(destAddress, destPort, codec); + } + + } + + public void transactionTimeout(ClientTransaction clientTransaction) { + // TODO Auto-generated method stub + + } + + public void transactionTransportError() { + // TODO Auto-generated method stub + + } + + ////////////////////////////////////////////////////////// + // ServerTransactionUser methods + ////////////////////////////////////////////////////////// + + public void transactionFailure() { + // TODO manage transaction failure (ACK was not received) + + } + + +} diff --git a/src/peers/sip/core/useragent/handlers/MethodHandler.java b/src/peers/sip/core/useragent/handlers/MethodHandler.java new file mode 100644 index 0000000..bb6354c --- /dev/null +++ b/src/peers/sip/core/useragent/handlers/MethodHandler.java @@ -0,0 +1,86 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.core.useragent.handlers; + + +import peers.sdp.SDPManager; +import peers.sip.RFC3261; +import peers.sip.Utils; +import peers.sip.core.useragent.ChallengeManager; +import peers.sip.core.useragent.UserAgent; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaderParamName; +import peers.sip.syntaxencoding.SipHeaders; +import peers.sip.transaction.TransactionManager; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.TransportManager; + +public abstract class MethodHandler { + + protected UserAgent userAgent; + protected TransactionManager transactionManager; + protected TransportManager transportManager; + protected ChallengeManager challengeManager; + protected SDPManager sdpManager; + protected boolean challenged; + + public MethodHandler(UserAgent userAgent, + TransactionManager transactionManager, + TransportManager transportManager) { + this.userAgent = userAgent; + this.transactionManager = transactionManager; + this.transportManager = transportManager; + challenged = false; + } + + protected SipResponse buildGenericResponse(SipRequest sipRequest, + int statusCode, String reasonPhrase) { + //8.2.6 + SipResponse sipResponse = new SipResponse(statusCode, reasonPhrase); + SipHeaders respHeaders = sipResponse.getSipHeaders(); + SipHeaders reqHeaders = sipRequest.getSipHeaders(); + SipHeaderFieldName fromName = new SipHeaderFieldName(RFC3261.HDR_FROM); + respHeaders.add(fromName, reqHeaders.get(fromName)); + SipHeaderFieldName callIdName = new SipHeaderFieldName(RFC3261.HDR_CALLID); + respHeaders.add(callIdName, reqHeaders.get(callIdName)); + SipHeaderFieldName cseqName = new SipHeaderFieldName(RFC3261.HDR_CSEQ); + respHeaders.add(cseqName, reqHeaders.get(cseqName)); + SipHeaderFieldName viaName = new SipHeaderFieldName(RFC3261.HDR_VIA); + respHeaders.add(viaName, reqHeaders.get(viaName)); + SipHeaderFieldName toName = new SipHeaderFieldName(RFC3261.HDR_TO); + String to = reqHeaders.get(toName).getValue(); + SipHeaderFieldValue toValue = new SipHeaderFieldValue(to); + toValue.addParam(new SipHeaderParamName(RFC3261.PARAM_TAG), + Utils.randomString(10));// TODO 19.3 + respHeaders.add(toName, toValue); + return sipResponse; + } + + public void setChallengeManager(ChallengeManager challengeManager) { + this.challengeManager = challengeManager; + } + + public void setSdpManager(SDPManager sdpManager) { + this.sdpManager = sdpManager; + } + +} diff --git a/src/peers/sip/core/useragent/handlers/OptionsHandler.java b/src/peers/sip/core/useragent/handlers/OptionsHandler.java new file mode 100644 index 0000000..3c2aa05 --- /dev/null +++ b/src/peers/sip/core/useragent/handlers/OptionsHandler.java @@ -0,0 +1,83 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010, 2012 Yohann Martineau +*/ + +package peers.sip.core.useragent.handlers; + +import java.io.IOException; +import java.util.Random; + + +import org.pmw.tinylog.Logger; +import peers.sdp.SessionDescription; +import peers.sip.RFC3261; +import peers.sip.Utils; +import peers.sip.core.useragent.UserAgent; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaders; +import peers.sip.transaction.ServerTransaction; +import peers.sip.transaction.ServerTransactionUser; +import peers.sip.transaction.TransactionManager; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.TransportManager; + +public class OptionsHandler extends MethodHandler + implements ServerTransactionUser { + + public static final int MAX_PORTS = 65536; + + public OptionsHandler(UserAgent userAgent, + TransactionManager transactionManager, + TransportManager transportManager) { + super(userAgent, transactionManager, transportManager); + } + + public void handleOptions(SipRequest sipRequest) { + SipResponse sipResponse = buildGenericResponse(sipRequest, + RFC3261.CODE_200_OK, RFC3261.REASON_200_OK); + int localPort = new Random().nextInt(MAX_PORTS); + try { + SessionDescription sessionDescription = + sdpManager.createSessionDescription(null, localPort); + sipResponse.setBody(sessionDescription.toString().getBytes()); + } catch (IOException e) { + Logger.error(e.getMessage(), e); + } + SipHeaders sipHeaders = sipResponse.getSipHeaders(); + sipHeaders.add(new SipHeaderFieldName(RFC3261.HDR_CONTENT_TYPE), + new SipHeaderFieldValue(RFC3261.CONTENT_TYPE_SDP)); + sipHeaders.add(new SipHeaderFieldName(RFC3261.HDR_ALLOW), + new SipHeaderFieldValue(Utils.generateAllowHeader())); + ServerTransaction serverTransaction = + transactionManager.createServerTransaction( + sipResponse, userAgent.getSipPort(), RFC3261.TRANSPORT_UDP, + this, sipRequest); + serverTransaction.start(); + serverTransaction.receivedRequest(sipRequest); + serverTransaction.sendReponse(sipResponse); + } + + @Override + public void transactionFailure() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/peers/sip/core/useragent/handlers/RegisterHandler.java b/src/peers/sip/core/useragent/handlers/RegisterHandler.java new file mode 100644 index 0000000..be67137 --- /dev/null +++ b/src/peers/sip/core/useragent/handlers/RegisterHandler.java @@ -0,0 +1,293 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007-2013 Yohann Martineau +*/ + +package peers.sip.core.useragent.handlers; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Hashtable; +import java.util.Timer; +import java.util.TimerTask; + +import org.pmw.tinylog.Logger; +import peers.Config; + +import peers.sip.RFC3261; +import peers.sip.core.useragent.InitialRequestManager; +import peers.sip.core.useragent.RequestManager; +import peers.sip.core.useragent.SipListener; +import peers.sip.core.useragent.UserAgent; +import peers.sip.syntaxencoding.NameAddress; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaderParamName; +import peers.sip.syntaxencoding.SipHeaders; +import peers.sip.syntaxencoding.SipURI; +import peers.sip.syntaxencoding.SipUriSyntaxException; +import peers.sip.transaction.ClientTransaction; +import peers.sip.transaction.ClientTransactionUser; +import peers.sip.transaction.NonInviteClientTransaction; +import peers.sip.transaction.Transaction; +import peers.sip.transaction.TransactionManager; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.TransportManager; + +public class RegisterHandler extends MethodHandler + implements ClientTransactionUser { + + public static final int REFRESH_MARGIN = 10; // seconds + + private InitialRequestManager initialRequestManager; + + private Timer timer; + + private String requestUriStr; + private String profileUriStr; + private String callIDStr; + + //FIXME should be on a profile based context + private boolean unregisterInvoked; + private boolean registered; + + public RegisterHandler(UserAgent userAgent, + TransactionManager transactionManager, + TransportManager transportManager) { + super(userAgent, transactionManager, transportManager); + } + + //TODO factorize common code here and in invitehandler + public synchronized ClientTransaction preProcessRegister(SipRequest sipRequest) + throws SipUriSyntaxException { + registered = false; + unregisterInvoked = false; + SipHeaders sipHeaders = sipRequest.getSipHeaders(); + SipURI destinationUri = RequestManager.getDestinationUri(sipRequest); + int port = destinationUri.getPort(); + if (port == SipURI.DEFAULT_PORT) { + port = RFC3261.TRANSPORT_DEFAULT_PORT; + } + //TODO if header route is present, addrspec = toproute.nameaddress.addrspec + String transport = RFC3261.TRANSPORT_UDP; + Hashtable params = destinationUri.getUriParameters(); + if (params != null) { + String reqUriTransport = params.get(RFC3261.PARAM_TRANSPORT); + if (reqUriTransport != null) { + transport = reqUriTransport; + } + } + SipURI sipUri = userAgent.getConfig().getOutboundProxy(); + if (sipUri == null) { + sipUri = destinationUri; + } + InetAddress inetAddress; + try { + inetAddress = InetAddress.getByName(sipUri.getHost()); + } catch (UnknownHostException e) { + throw new SipUriSyntaxException("unknown host: " + + sipUri.getHost(), e); + } + ClientTransaction clientTransaction = transactionManager + .createClientTransaction(sipRequest, inetAddress, port, + transport, null, this); + //TODO 10.2 + SipHeaderFieldValue to = sipHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_TO)); + SipHeaderFieldValue from = sipHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_FROM)); + String fromValue = from.getValue(); + to.setValue(fromValue); + requestUriStr = destinationUri.toString(); + profileUriStr = NameAddress.nameAddressToUri(fromValue); + callIDStr = sipHeaders.get(new SipHeaderFieldName(RFC3261.HDR_CALLID)) + .toString(); + return clientTransaction; + } + + public void unregister() { + timer.cancel(); + unregisterInvoked = true; + challenged = false; + } + + ////////////////////////////////////////////////////////// + // ClientTransactionUser methods + ////////////////////////////////////////////////////////// + + public void errResponseReceived(SipResponse sipResponse) { + String password = userAgent.getConfig().getPassword(); + if (password != null && !"".equals(password.trim())) { + int statusCode = sipResponse.getStatusCode(); + if (statusCode == RFC3261.CODE_401_UNAUTHORIZED + || statusCode == + RFC3261.CODE_407_PROXY_AUTHENTICATION_REQUIRED) { + if (challenged) { + notifyListener(sipResponse); + } else { + challenged = true; + NonInviteClientTransaction nonInviteClientTransaction = + (NonInviteClientTransaction) + transactionManager.getClientTransaction(sipResponse); + SipRequest sipRequest = + nonInviteClientTransaction.getRequest(); + challengeManager.handleChallenge(sipRequest, sipResponse); + } + } else { // not 401 nor 407 + SipHeaders sipHeaders = sipResponse.getSipHeaders(); + SipHeaderFieldName viaName = new SipHeaderFieldName( + RFC3261.HDR_VIA); + SipHeaderFieldValue via = sipHeaders.get(viaName); + SipHeaderParamName receivedName = new SipHeaderParamName( + RFC3261.PARAM_RECEIVED); + String viaValue = via.getValue(); + int pos = viaValue.indexOf(" "); + if (pos > -1) { + viaValue = viaValue.substring(pos + 1); + pos = viaValue.indexOf(RFC3261.TRANSPORT_PORT_SEP); + if (pos > -1) { + viaValue = viaValue.substring(0, pos); + } else { + pos = viaValue.indexOf(RFC3261.PARAM_SEPARATOR); + if (pos > -1) { + viaValue = viaValue.substring(0, pos); + } + } + } + String received = via.getParam(receivedName); + if (received != null && !"".equals(received.trim())) { + if (viaValue.equals(received)) { + notifyListener(sipResponse); + } else { // received != via ip address + try { + InetAddress receivedInetAddress = + InetAddress.getByName(received); + Config config = userAgent.getConfig(); + config.setPublicInetAddress(receivedInetAddress); + userAgent.register(); + } catch (UnknownHostException e) { + notifyListener(sipResponse); + Logger.error(e.getMessage(), e); + } catch (SipUriSyntaxException e) { + notifyListener(sipResponse); + Logger.error(e.getMessage(), e); + } + } + } else { // received not provided + notifyListener(sipResponse); + } + } + } else { // no password configured + notifyListener(sipResponse); + } + } + + private void notifyListener(SipResponse sipResponse) { + SipListener sipListener = userAgent.getSipListener(); + if (sipListener != null) { + sipListener.registerFailed(sipResponse); + } + challenged = false; + } + + public void provResponseReceived(SipResponse sipResponse, + Transaction transaction) { + //meaningless + } + + public synchronized void successResponseReceived(SipResponse sipResponse, + Transaction transaction) { + // 1. retrieve request corresponding to response + // 2. if request was not an unregister, extract contact and expires, + // and start register refresh timer + // 3. notify sip listener of register success event. + SipRequest sipRequest = transaction.getRequest(); + SipHeaderFieldName contactName = new SipHeaderFieldName( + RFC3261.HDR_CONTACT); + SipHeaderFieldValue requestContact = sipRequest.getSipHeaders() + .get(contactName); + SipHeaderParamName expiresParam = new SipHeaderParamName( + RFC3261.PARAM_EXPIRES); + String expires = requestContact.getParam(expiresParam); + challenged = false; + if (!"0".equals(expires)) { + // each contact contains an expires parameter giving the expiration + // in seconds. Thus the binding must be refreshed before it expires. + SipHeaders sipHeaders = sipResponse.getSipHeaders(); + SipHeaderFieldValue responseContact = sipHeaders.get(contactName); + if (responseContact == null) { + return; + } + expires = responseContact.getParam(expiresParam); + // patch mobicents simple application + registered = true; + int delay = -1; + if (expires == null || "".equals(expires.trim())) { + delay = 3600; + } + if (!unregisterInvoked) { + if (delay == -1) { + delay = Integer.parseInt(expires) - REFRESH_MARGIN; + } + timer = new Timer(getClass().getSimpleName() + + " refresh timer"); + timer.schedule(new RefreshTimerTask(), delay * 1000); + } + } + SipListener sipListener = userAgent.getSipListener(); + if (sipListener != null) { + sipListener.registerSuccessful(sipResponse); + } + } + + public void transactionTimeout(ClientTransaction clientTransaction) { + SipListener sipListener = userAgent.getSipListener(); + if (sipListener != null) { + sipListener.registerFailed(null); + } + } + + public void transactionTransportError() { + //TODO alert user + } + + public boolean isRegistered() { + return registered; + } + + ////////////////////////////////////////////////////////// + // TimerTask + ////////////////////////////////////////////////////////// + + class RefreshTimerTask extends TimerTask { + @Override + public void run() { + try { + initialRequestManager.createInitialRequest(requestUriStr, + RFC3261.METHOD_REGISTER, profileUriStr, callIDStr); + } catch (SipUriSyntaxException e) { + Logger.error("syntax error", e); + } + } + } + + public void setInitialRequestManager(InitialRequestManager initialRequestManager) { + this.initialRequestManager = initialRequestManager; + } + +} diff --git a/src/peers/sip/syntaxencoding/NameAddress.java b/src/peers/sip/syntaxencoding/NameAddress.java new file mode 100644 index 0000000..ca646c9 --- /dev/null +++ b/src/peers/sip/syntaxencoding/NameAddress.java @@ -0,0 +1,66 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.syntaxencoding; + +import peers.sip.RFC3261; + +public class NameAddress { + + public static String nameAddressToUri(String nameAddress) { + int leftPos = nameAddress.indexOf(RFC3261.LEFT_ANGLE_BRACKET); + int rightPos = nameAddress.indexOf(RFC3261.RIGHT_ANGLE_BRACKET); + if (leftPos < 0 || rightPos < 0) { + return nameAddress; + } + return nameAddress.substring(leftPos + 1, rightPos); + } + + protected String addrSpec; + protected String displayName; + + public NameAddress(String addrSpec) { + super(); + this.addrSpec = addrSpec; + } + + public NameAddress(String addrSpec, String displayName) { + super(); + this.addrSpec = addrSpec; + this.displayName = displayName; + } + + @Override + public String toString() { + StringBuffer buf = new StringBuffer(); + if (displayName != null) { + buf.append(displayName); + buf.append(' '); + } + buf.append(RFC3261.LEFT_ANGLE_BRACKET); + buf.append(addrSpec); + buf.append(RFC3261.RIGHT_ANGLE_BRACKET); + return buf.toString(); + } + + public String getAddrSpec() { + return addrSpec; + } + +} diff --git a/src/peers/sip/syntaxencoding/RunnableSipParser.java b/src/peers/sip/syntaxencoding/RunnableSipParser.java new file mode 100644 index 0000000..f262ec0 --- /dev/null +++ b/src/peers/sip/syntaxencoding/RunnableSipParser.java @@ -0,0 +1,29 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.syntaxencoding; + +public class RunnableSipParser implements Runnable { + + public void run() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/peers/sip/syntaxencoding/SipHeader.java b/src/peers/sip/syntaxencoding/SipHeader.java new file mode 100644 index 0000000..693b621 --- /dev/null +++ b/src/peers/sip/syntaxencoding/SipHeader.java @@ -0,0 +1,54 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.syntaxencoding; + +public class SipHeader { + + private SipHeaderFieldName name; + private SipHeaderFieldValue value; + + SipHeader(SipHeaderFieldName name, SipHeaderFieldValue value) { + super(); + this.name = name; + this.value = value; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SipHeader) { + SipHeader objHdr = (SipHeader) obj; + return name.equals(objHdr.name); + } + return false; + } + + public SipHeaderFieldName getName() { + return name; + } + + public SipHeaderFieldValue getValue() { + return value; + } + + public void setValue(SipHeaderFieldValue value) { + this.value = value; + } + +} diff --git a/src/peers/sip/syntaxencoding/SipHeaderFieldMultiValue.java b/src/peers/sip/syntaxencoding/SipHeaderFieldMultiValue.java new file mode 100644 index 0000000..16aedda --- /dev/null +++ b/src/peers/sip/syntaxencoding/SipHeaderFieldMultiValue.java @@ -0,0 +1,49 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.syntaxencoding; + +import java.util.List; + +public class SipHeaderFieldMultiValue extends SipHeaderFieldValue { + + private List values; + + private static String toString(List list) { + if (list == null) { + return null; + } + String arrToString = list.toString(); + return arrToString.substring(1, arrToString.length() - 1); + } + + public SipHeaderFieldMultiValue(List values) { + super(toString(values)); + this.values = values; + } + + public List getValues() { + return values; + } + + @Override + public String toString() { + return toString(values); + } +} diff --git a/src/peers/sip/syntaxencoding/SipHeaderFieldName.java b/src/peers/sip/syntaxencoding/SipHeaderFieldName.java new file mode 100644 index 0000000..7414fce --- /dev/null +++ b/src/peers/sip/syntaxencoding/SipHeaderFieldName.java @@ -0,0 +1,63 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.syntaxencoding; + +public class SipHeaderFieldName { + + private final static SipHeadersTable SIP_HEADER_TABLE = + new SipHeadersTable(); + + private String name; + + public SipHeaderFieldName(String name) { + super(); + if (name.length() == 1) { + this.name = SIP_HEADER_TABLE.getLongForm(name.charAt(0)); + } else { + this.name = name; + } + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + String objName = ((SipHeaderFieldName)obj).getName(); + if (name.equalsIgnoreCase(objName)) { + return true; + } + return false; + } + + @Override + public int hashCode() { + return name.hashCode(); + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/src/peers/sip/syntaxencoding/SipHeaderFieldValue.java b/src/peers/sip/syntaxencoding/SipHeaderFieldValue.java new file mode 100644 index 0000000..535a961 --- /dev/null +++ b/src/peers/sip/syntaxencoding/SipHeaderFieldValue.java @@ -0,0 +1,103 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.syntaxencoding; + +import java.util.HashMap; + +import peers.sip.RFC3261; + + +public class SipHeaderFieldValue { + + private String value; + + private HashMap params; + + public SipHeaderFieldValue(String value) { + int startPos = value.indexOf(RFC3261.RIGHT_ANGLE_BRACKET); + int pos; + if (startPos > -1) { + pos = value.indexOf(RFC3261.PARAM_SEPARATOR, startPos); + } else { + pos = value.indexOf(RFC3261.PARAM_SEPARATOR); + } + String paramsString; + if (pos > -1) { + this.value = value.substring(0,pos); + paramsString = value.substring(pos); + } else { + this.value = value; + paramsString = ""; + } + params = new HashMap(); + if (paramsString.contains(RFC3261.PARAM_SEPARATOR)) { + String[] arr = paramsString.split(RFC3261.PARAM_SEPARATOR); + if (arr.length > 1) { + for (int i = 1; i < arr.length; ++i) { + String paramName = arr[i]; + String paramValue = ""; + pos = paramName.indexOf(RFC3261.PARAM_ASSIGNMENT); + if (pos > -1) { + paramName = arr[i].substring(0, pos); + paramValue = arr[i].substring(pos + 1); + } + params.put(new SipHeaderParamName(paramName), paramValue); + } + } + } + } + + public String getParam(SipHeaderParamName name) { + return params.get(name); + } + + public void addParam(SipHeaderParamName name, String value) { + params.put(name, value); + } + + public void removeParam(SipHeaderParamName name) { + params.remove(name); + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + if (params == null || params.isEmpty()) { + return value; + } + StringBuffer buf = new StringBuffer(value); + for (SipHeaderParamName name: params.keySet()) { + buf.append(RFC3261.PARAM_SEPARATOR).append(name); + String value = params.get(name); + if (!"".equals(value.trim())) { + buf.append(RFC3261.PARAM_ASSIGNMENT).append(value); + } + } + return buf.toString(); + } + +} diff --git a/src/peers/sip/syntaxencoding/SipHeaderParamName.java b/src/peers/sip/syntaxencoding/SipHeaderParamName.java new file mode 100644 index 0000000..ae56918 --- /dev/null +++ b/src/peers/sip/syntaxencoding/SipHeaderParamName.java @@ -0,0 +1,56 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.syntaxencoding; + +public class SipHeaderParamName { + + private String name; + + public SipHeaderParamName(String name) { + this.name = name; + } + + + public String getName() { + return name; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + String objName = ((SipHeaderParamName)obj).getName(); + if (name.equalsIgnoreCase(objName)) { + return true; + } + return false; + } + + @Override + public int hashCode() { + return name.toLowerCase().hashCode(); + } + + @Override + public String toString() { + return name; + } +} diff --git a/src/peers/sip/syntaxencoding/SipHeaders.java b/src/peers/sip/syntaxencoding/SipHeaders.java new file mode 100644 index 0000000..550128e --- /dev/null +++ b/src/peers/sip/syntaxencoding/SipHeaders.java @@ -0,0 +1,102 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.syntaxencoding; + +import java.util.ArrayList; + +import peers.sip.RFC3261; + + + +public class SipHeaders { + + private ArrayList headers; + + public SipHeaders() { + headers = new ArrayList(); + } + + /** + * + * @param name + * @param value + * @param index -1 to add at the end + */ + public void add(SipHeaderFieldName name, SipHeaderFieldValue value, int index) { + SipHeader header = new SipHeader(name, value); + if (headers.contains(header)) { + header = headers.get(headers.indexOf(header)); + SipHeaderFieldValue oldValue = header.getValue(); + //TODO check is header can be multi valued + if (oldValue instanceof SipHeaderFieldMultiValue) { + SipHeaderFieldMultiValue oldMultiVal = (SipHeaderFieldMultiValue) oldValue; + oldMultiVal.getValues().add(value); + } else { + ArrayList arr = new ArrayList(); + arr.add(oldValue); + arr.add(value); + header.setValue(new SipHeaderFieldMultiValue(arr)); + } + } else { + if (index == -1) { + headers.add(header); + } else { + headers.add(index, header); + } + } + } + + public void add(SipHeaderFieldName name, SipHeaderFieldValue value) { + add(name, value, -1); + } + + @SuppressWarnings("unlikely-arg-type") + public void remove(SipHeaderFieldName name) { + headers.remove(name); + } + + public boolean contains(SipHeaderFieldName name) { + return headers.contains(new SipHeader(name, null)); + } + + public SipHeaderFieldValue get(SipHeaderFieldName name) { + int index = headers.indexOf(new SipHeader(name, null)); + if (index < 0) { + return null; + } + return headers.get(index).getValue(); + } + + public int getCount() { + return headers.size(); + } + + @Override + public String toString() { + StringBuffer buf = new StringBuffer(); + for (SipHeader header : headers) { + buf.append(header.getName().toString()); + buf.append(": "); + buf.append(header.getValue()); + buf.append(RFC3261.CRLF); + } + return buf.toString(); + } +} diff --git a/src/peers/sip/syntaxencoding/SipHeadersTable.java b/src/peers/sip/syntaxencoding/SipHeadersTable.java new file mode 100644 index 0000000..790de82 --- /dev/null +++ b/src/peers/sip/syntaxencoding/SipHeadersTable.java @@ -0,0 +1,53 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.syntaxencoding; + +import java.util.HashMap; + +import peers.sip.RFC3261; + + +public class SipHeadersTable { + + private HashMap headers; + + /** + * should be instanciated only once, it was a singleton. + */ + public SipHeadersTable() { + headers = new HashMap(); + //RFC 3261 Section 10 + headers.put(RFC3261.COMPACT_HDR_CALLID, RFC3261.HDR_CALLID); + headers.put(RFC3261.COMPACT_HDR_CONTACT, RFC3261.HDR_CONTACT); + headers.put(RFC3261.COMPACT_HDR_CONTENT_ENCODING, RFC3261.HDR_CONTENT_ENCODING); + headers.put(RFC3261.COMPACT_HDR_CONTENT_LENGTH, RFC3261.HDR_CONTENT_LENGTH); + headers.put(RFC3261.COMPACT_HDR_CONTENT_TYPE, RFC3261.HDR_CONTENT_TYPE); + headers.put(RFC3261.COMPACT_HDR_FROM, RFC3261.HDR_FROM); + headers.put(RFC3261.COMPACT_HDR_SUBJECT, RFC3261.HDR_SUBJECT); + headers.put(RFC3261.COMPACT_HDR_SUPPORTED, RFC3261.HDR_SUPPORTED); + headers.put(RFC3261.COMPACT_HDR_TO, RFC3261.HDR_TO); + headers.put(RFC3261.COMPACT_HDR_VIA, RFC3261.HDR_VIA); + } + + public String getLongForm(char compactForm) { + return headers.get(compactForm); + } + +} diff --git a/src/peers/sip/syntaxencoding/SipParser.java b/src/peers/sip/syntaxencoding/SipParser.java new file mode 100644 index 0000000..474971d --- /dev/null +++ b/src/peers/sip/syntaxencoding/SipParser.java @@ -0,0 +1,189 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.syntaxencoding; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +import peers.sip.RFC3261; +import peers.sip.transport.SipMessage; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; + + +public class SipParser { + + private BufferedReader reader; + + private final static int BUFF_SIZE = 1024; + + private List singleValueHeaders; + + public SipParser() { + singleValueHeaders = new ArrayList(); + singleValueHeaders.add(new SipHeaderFieldName( + RFC3261.HDR_WWW_AUTHENTICATE)); + singleValueHeaders.add(new SipHeaderFieldName( + RFC3261.HDR_AUTHORIZATION)); + singleValueHeaders.add(new SipHeaderFieldName( + RFC3261.HDR_PROXY_AUTHENTICATE)); + singleValueHeaders.add(new SipHeaderFieldName( + RFC3261.HDR_PROXY_AUTHORIZATION)); + singleValueHeaders.add(new SipHeaderFieldName( + RFC3261.HDR_SUPPORTED)); + singleValueHeaders.add(new SipHeaderFieldName( + RFC3261.HDR_SUBJECT)); + } + + public synchronized SipMessage parse(InputStream in) + throws IOException, SipParserException { + + InputStreamReader inputStreamReader = new InputStreamReader(in); + reader = new BufferedReader(inputStreamReader); + + String startLine = reader.readLine(); + while (startLine == null || startLine.equals("")) { + startLine = reader.readLine(); + } + SipMessage sipMessage; + if (startLine.toUpperCase().startsWith(RFC3261.DEFAULT_SIP_VERSION)) { + sipMessage = parseSipResponse(startLine); + } + else { + sipMessage = parseSipRequest(startLine); + } + parseHeaders(sipMessage); + parseBody(sipMessage); + return sipMessage; + } + + private SipRequest parseSipRequest(String startLine) throws SipParserException { + String[] params = startLine.split(" "); + if (params.length != 3) { + throw new SipParserException("invalid request line"); + } + if (!RFC3261.DEFAULT_SIP_VERSION.equals(params[2].toUpperCase())) { + throw new SipParserException("unsupported SIP version"); + } + SipURI requestUri; + try { + requestUri = new SipURI(params[1]); + } catch (SipUriSyntaxException e) { + throw new SipParserException(e); + } + return new SipRequest(params[0], requestUri); + } + + private SipResponse parseSipResponse(String startLine) throws SipParserException { + String[] params = startLine.split(" "); + if (params.length < 3) { + throw new SipParserException("incorrect status line"); + } + if (!RFC3261.DEFAULT_SIP_VERSION.equals(params[0].toUpperCase())) { + throw new SipParserException("unsupported SIP version"); + } + StringBuffer buf = new StringBuffer(); + for (int i = 2; i < params.length; ++i) { + buf.append(params[i]).append(" "); + } + buf.deleteCharAt(buf.length() - 1); + return new SipResponse(Integer.parseInt(params[1]), buf.toString()); + } + + private void parseHeaders(SipMessage sipMessage) throws IOException, SipParserException { + SipHeaders sipHeaders = new SipHeaders(); + String headerLine = reader.readLine(); + if (headerLine == null) { + throw new SipParserException(sipMessage.toString()); + } + while (!"".equals(headerLine)) { + String nextLine = reader.readLine(); + if (nextLine != null && + (nextLine.startsWith(" ") || nextLine.startsWith("\t"))) { + StringBuffer buf = new StringBuffer(headerLine); + while (nextLine != null && + (nextLine.startsWith(" ") || nextLine.startsWith("\t"))) { + buf.append(' '); + buf.append(nextLine.trim()); + nextLine = reader.readLine(); + } + headerLine = buf.toString(); + } + if (headerLine == null) { + throw new SipParserException(sipMessage.toString()); + } + int columnPos = headerLine.indexOf(RFC3261.FIELD_NAME_SEPARATOR); + if (columnPos < 0) { + throw new SipParserException("Invalid header line"); + } + SipHeaderFieldName sipHeaderName = new SipHeaderFieldName( + headerLine.substring(0, columnPos).trim()); + String value = headerLine.substring(columnPos + 1).trim(); + SipHeaderFieldValue sipHeaderValue; + if (!singleValueHeaders.contains(sipHeaderName) && + value.indexOf(RFC3261.HEADER_SEPARATOR) > -1) { + String[] values = value.split(RFC3261.HEADER_SEPARATOR); + List list = + new ArrayList(); + for (String s: values) { + list.add(new SipHeaderFieldValue(s)); + } + sipHeaderValue = new SipHeaderFieldMultiValue(list); + } else { + sipHeaderValue = new SipHeaderFieldValue(value); + } + sipHeaders.add(sipHeaderName, sipHeaderValue); + headerLine = nextLine; + } + sipMessage.setSipHeaders(sipHeaders); + } + + public void parseBody(SipMessage sipMessage) throws IOException, SipParserException { + SipHeaderFieldValue contentLengthValue = + sipMessage.getSipHeaders().get(new SipHeaderFieldName( + RFC3261.HDR_CONTENT_LENGTH)); + if (contentLengthValue == null) { + return; + } + int length = Integer.parseInt(contentLengthValue.toString()); + byte[] buff = new byte[BUFF_SIZE]; + int i; + int count = 0; + while (count < length && (i = reader.read()) != -1) { + if (count >= buff.length) { + byte[] aux = new byte[buff.length + BUFF_SIZE]; + System.arraycopy(buff, 0, aux, 0, buff.length); + buff = aux; + + } + buff[count++] = (byte)i; + } + if (count != buff.length) { + byte[] aux = new byte[count]; + System.arraycopy(buff, 0, aux, 0, count); + buff = aux; + } + sipMessage.setBody(buff); + } +} diff --git a/src/peers/sip/syntaxencoding/SipParserException.java b/src/peers/sip/syntaxencoding/SipParserException.java new file mode 100644 index 0000000..3d38b63 --- /dev/null +++ b/src/peers/sip/syntaxencoding/SipParserException.java @@ -0,0 +1,42 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.syntaxencoding; + +public class SipParserException extends Exception { + + private static final long serialVersionUID = 1L; + + public SipParserException() { + super(); + } + + public SipParserException(String message, Throwable cause) { + super(message, cause); + } + + public SipParserException(String message) { + super(message); + } + + public SipParserException(Throwable cause) { + super(cause); + } + +} diff --git a/src/peers/sip/syntaxencoding/SipURI.java b/src/peers/sip/syntaxencoding/SipURI.java new file mode 100644 index 0000000..196b651 --- /dev/null +++ b/src/peers/sip/syntaxencoding/SipURI.java @@ -0,0 +1,136 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.syntaxencoding; + +import java.util.Hashtable; + +import peers.sip.RFC3261; + + + +public class SipURI { + + public final static int DEFAULT_PORT = -1; + + private String stringRepresentation; + /** + * telephone-subscriber and optional port are not managed + */ + private String userinfo; + private String host; + private int port = DEFAULT_PORT; + /** + * Use empty strings in value if the parameter has no value + */ + private Hashtable uriParameters; + //headers not implemented + //private Hashtable headers; + + public SipURI(String sipUri) + throws SipUriSyntaxException { + stringRepresentation = sipUri; + StringBuffer buf = new StringBuffer(sipUri); + String scheme = RFC3261.SIP_SCHEME + RFC3261.SCHEME_SEPARATOR; + if (!sipUri.startsWith(scheme)) { + throw new SipUriSyntaxException("SIP URI must start with " + scheme); + } + buf.delete(0, scheme.length()); + int atPos = buf.indexOf("@"); + if (atPos == 0) { + throw new SipUriSyntaxException("userinfo cannot start with a '@'"); + } + if (atPos > 0) { + userinfo = buf.substring(0, atPos); + buf.delete(0, atPos + 1); + } + int endHostport = buf.indexOf(";"); + if (endHostport == 0) { + throw new SipUriSyntaxException("hostport not present or it cannot start with ';'"); + } + if (endHostport < 0) { + endHostport = buf.length(); + } + String hostport = buf.substring(0, endHostport); + buf.delete(0, endHostport); + int colonPos = hostport.indexOf(':'); + if (colonPos > -1) { + if (colonPos == hostport.length() - 1) { + throw new SipUriSyntaxException("hostport cannot terminate with a ':'"); + } + port = Integer.parseInt(hostport.substring(colonPos + 1)); + } else { + colonPos = hostport.length(); + } + host = hostport.substring(0, colonPos); + if (buf.length() == 1) { + //if there is only one ';' at the end of the uri => do not + //parse uri-parameters and headers + buf.deleteCharAt(0); + } + if (buf.length() <= 0) { + return; + } + uriParameters = new Hashtable(); + while (buf.length() > 0) { + buf.deleteCharAt(0);//delete the first ';' + int nextSemicolon = buf.indexOf(";"); + if (nextSemicolon < 0) { + nextSemicolon = buf.length(); + } + int nextEquals = buf.indexOf("="); + if (nextEquals < 0) { + nextEquals = nextSemicolon; + } + if (nextEquals > nextSemicolon) { + nextEquals = nextSemicolon; + } + int afterEquals; + if (nextEquals + 1 > nextSemicolon) { + afterEquals = nextSemicolon; + } else { + afterEquals = nextEquals + 1; + } + uriParameters.put(buf.substring(0, nextEquals), buf.substring(afterEquals, nextSemicolon)); + buf.delete(0, nextSemicolon); + } + } + + @Override + public String toString() { + return stringRepresentation; + } + + public String getHost() { + return host; + } + + public int getPort() { + return port; + } + + public Hashtable getUriParameters() { + return uriParameters; + } + + public String getUserinfo() { + return userinfo; + } + +} diff --git a/src/peers/sip/syntaxencoding/SipUriSyntaxException.java b/src/peers/sip/syntaxencoding/SipUriSyntaxException.java new file mode 100644 index 0000000..429bdcb --- /dev/null +++ b/src/peers/sip/syntaxencoding/SipUriSyntaxException.java @@ -0,0 +1,43 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.syntaxencoding; + +public class SipUriSyntaxException extends Exception { + + private static final long serialVersionUID = 1L; + + public SipUriSyntaxException() { + super(); + } + + public SipUriSyntaxException(String message, Throwable cause) { + super(message, cause); + } + + public SipUriSyntaxException(String message) { + super(message); + } + + public SipUriSyntaxException(Throwable cause) { + super(cause); + } + + +} diff --git a/src/peers/sip/transaction/ClientTransaction.java b/src/peers/sip/transaction/ClientTransaction.java new file mode 100644 index 0000000..e56d944 --- /dev/null +++ b/src/peers/sip/transaction/ClientTransaction.java @@ -0,0 +1,29 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + +import peers.sip.transport.SipResponse; + +public interface ClientTransaction { + + void receivedResponse(SipResponse sipResponse); + void start(); + String getContact(); +} diff --git a/src/peers/sip/transaction/ClientTransactionUser.java b/src/peers/sip/transaction/ClientTransactionUser.java new file mode 100644 index 0000000..91f707b --- /dev/null +++ b/src/peers/sip/transaction/ClientTransactionUser.java @@ -0,0 +1,31 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + +import peers.sip.transport.SipResponse; + +public interface ClientTransactionUser { + public void transactionTimeout(ClientTransaction clientTransaction); + public void provResponseReceived(SipResponse sipResponse, Transaction transaction); + //TODO eventually pass transaction to the transaction user + public void errResponseReceived(SipResponse sipResponse);//3XX is considered as an error response + public void successResponseReceived(SipResponse sipResponse, Transaction transaction); + public void transactionTransportError(); +} diff --git a/src/peers/sip/transaction/InviteClientTransaction.java b/src/peers/sip/transaction/InviteClientTransaction.java new file mode 100644 index 0000000..2fb34eb --- /dev/null +++ b/src/peers/sip/transaction/InviteClientTransaction.java @@ -0,0 +1,247 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + +import java.io.IOException; +import java.net.InetAddress; +import java.util.Timer; +import java.util.TimerTask; + + +import org.pmw.tinylog.Logger; +import peers.sip.RFC3261; +import peers.sip.Utils; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaderParamName; +import peers.sip.syntaxencoding.SipHeaders; +import peers.sip.transport.MessageSender; +import peers.sip.transport.SipClientTransportUser; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.TransportManager; + + +public class InviteClientTransaction extends InviteTransaction + implements ClientTransaction, SipClientTransportUser { + + public final InviteClientTransactionState INIT; + public final InviteClientTransactionState CALLING; + public final InviteClientTransactionState PROCEEDING; + public final InviteClientTransactionState COMPLETED; + public final InviteClientTransactionState TERMINATED; + + protected ClientTransactionUser transactionUser; + protected String transport; + + private InviteClientTransactionState state; + //private SipClientTransport sipClientTransport; + private MessageSender messageSender; + private int nbRetrans; + private SipRequest ack; + private int remotePort; + private InetAddress remoteInetAddress; + + InviteClientTransaction(String branchId, InetAddress inetAddress, + int port, String transport, SipRequest sipRequest, + ClientTransactionUser transactionUser, Timer timer, + TransportManager transportManager, + TransactionManager transactionManager) { + super(branchId, timer, transportManager, transactionManager); + + this.transport = transport; + + SipHeaderFieldValue via = new SipHeaderFieldValue(""); + via.addParam(new SipHeaderParamName(RFC3261.PARAM_BRANCH), branchId); + sipRequest.getSipHeaders().add(new SipHeaderFieldName(RFC3261.HDR_VIA), via, 0); + + nbRetrans = 0; + + INIT = new InviteClientTransactionStateInit(getId(), this); + state = INIT; + CALLING = new InviteClientTransactionStateCalling(getId(), this); + PROCEEDING = new InviteClientTransactionStateProceeding(getId(), this); + COMPLETED = new InviteClientTransactionStateCompleted(getId(), this); + TERMINATED = new InviteClientTransactionStateTerminated(getId(), this); + + //17.1.1.2 + + request = sipRequest; + this.transactionUser = transactionUser; + + remotePort = port; + remoteInetAddress = inetAddress; + + try { + messageSender = transportManager.createClientTransport( + request, remoteInetAddress, remotePort, transport); + } catch (IOException e) { + Logger.error("input/output error", e); + transportError(); + } + + } + + public void setState(InviteClientTransactionState state) { + this.state.log(state); + this.state = state; + if(TERMINATED.equals(state)) { + //transactionManager.removeClientTransaction(branchId, method); + transactionManager = null; + } + } + + public void start() { + state.start(); + //send request using transport information and sipRequest +// try { +// sipClientTransport = SipTransportFactory.getInstance() +// .createClientTransport(this, request, remoteInetAddress, +// remotePort, transport); +// sipClientTransport.send(request); +// } catch (IOException e) { +// //e.printStackTrace(); +// transportError(); +// } + + try { + messageSender.sendMessage(request); + } catch (IOException e) { + Logger.error("input/output error", e); + transportError(); + } + Logger.debug("InviteClientTransaction.start"); + + if (RFC3261.TRANSPORT_UDP.equals(transport)) { + //start timer A with value T1 for retransmission + timer.schedule(new TimerA(), RFC3261.TIMER_T1); + } + + //TODO start timer B with value 64*T1 for transaction timeout + timer.schedule(new TimerB(), 64 * RFC3261.TIMER_T1); + } + + public synchronized void receivedResponse(SipResponse sipResponse) { + responses.add(sipResponse); + // 17.1.1 + int statusCode = sipResponse.getStatusCode(); + if (statusCode < RFC3261.CODE_MIN_PROV) { + Logger.error("invalid response code"); + } else if (statusCode < RFC3261.CODE_MIN_SUCCESS) { + state.received1xx(); + } else if (statusCode < RFC3261.CODE_MIN_REDIR) { + state.received2xx(); + } else if (statusCode <= RFC3261.CODE_MAX) { + state.received300To699(); + } else { + Logger.error("invalid response code"); + } + } + + public void transportError() { + state.transportError(); + } + + void createAndSendAck() { + + //p.126 last paragraph + + //17.1.1.3 + ack = new SipRequest(RFC3261.METHOD_ACK, request.getRequestUri()); + SipHeaderFieldValue topVia = Utils.getTopVia(request); + SipHeaders ackSipHeaders = ack.getSipHeaders(); + ackSipHeaders.add(new SipHeaderFieldName(RFC3261.HDR_VIA), topVia); + Utils.copyHeader(request, ack, RFC3261.HDR_CALLID); + Utils.copyHeader(request, ack, RFC3261.HDR_FROM); + Utils.copyHeader(getLastResponse(), ack, RFC3261.HDR_TO); + //TODO what happens if a prov response is received after a 200+ ... + SipHeaders requestSipHeaders = request.getSipHeaders(); + SipHeaderFieldName cseqName = new SipHeaderFieldName(RFC3261.HDR_CSEQ); + SipHeaderFieldValue cseq = requestSipHeaders.get(cseqName); + cseq.setValue(cseq.toString().replace(RFC3261.METHOD_INVITE, RFC3261.METHOD_ACK)); + ackSipHeaders.add(cseqName, cseq); + Utils.copyHeader(request, ack, RFC3261.HDR_ROUTE); + + sendAck(); + } + + void sendAck() { + //ack is passed to the transport layer... + //TODO manage ACK retrans + //sipClientTransport.send(ack); + try { + messageSender.sendMessage(ack); + } catch (IOException e) { + Logger.error("input/output error", e); + transportError(); + } + } + + void sendRetrans() { + ++nbRetrans; + //sipClientTransport.send(request); + try { + messageSender.sendMessage(request); + } catch (IOException e) { + Logger.error("input/output error", e); + transportError(); + } + timer.schedule(new TimerA(), (long)Math.pow(2, nbRetrans) * RFC3261.TIMER_T1); + } + + public void requestTransportError(SipRequest sipRequest, Exception e) { + // TODO Auto-generated method stub + + } + + public void responseTransportError(Exception e) { + // TODO Auto-generated method stub + + } + + class TimerA extends TimerTask { + @Override + public void run() { + state.timerAFires(); + } + } + + class TimerB extends TimerTask { + @Override + public void run() { + state.timerBFires(); + } + } + + class TimerD extends TimerTask { + @Override + public void run() { + state.timerDFires(); + } + } + + public String getContact() { + if (messageSender != null) { + return messageSender.getContact(); + } + return null; + } + +} diff --git a/src/peers/sip/transaction/InviteClientTransactionState.java b/src/peers/sip/transaction/InviteClientTransactionState.java new file mode 100644 index 0000000..84e1552 --- /dev/null +++ b/src/peers/sip/transaction/InviteClientTransactionState.java @@ -0,0 +1,45 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + +import peers.sip.AbstractState; + + +public abstract class InviteClientTransactionState extends AbstractState { + + protected InviteClientTransaction inviteClientTransaction; + + public InviteClientTransactionState(String id, + InviteClientTransaction inviteClientTransaction) { + super(id); + this.inviteClientTransaction = inviteClientTransaction; + } + + public void start() {} + public void timerAFires() {} + public void timerBFires() {} + public void received2xx() {} + public void received1xx() {} + public void received300To699() {} + public void transportError() {} + public void timerDFires() {} + +} diff --git a/src/peers/sip/transaction/InviteClientTransactionStateCalling.java b/src/peers/sip/transaction/InviteClientTransactionStateCalling.java new file mode 100644 index 0000000..1c6c345 --- /dev/null +++ b/src/peers/sip/transaction/InviteClientTransactionStateCalling.java @@ -0,0 +1,82 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + + + +public class InviteClientTransactionStateCalling extends InviteClientTransactionState { + + public InviteClientTransactionStateCalling(String id, + InviteClientTransaction inviteClientTransaction) { + super(id, inviteClientTransaction); + } + + @Override + public void timerAFires() { + InviteClientTransactionState nextState = inviteClientTransaction.CALLING; + inviteClientTransaction.setState(nextState); + inviteClientTransaction.sendRetrans(); + } + + @Override + public void timerBFires() { + timerBFiresOrTransportError(); + } + + @Override + public void transportError() { + timerBFiresOrTransportError(); + } + + private void timerBFiresOrTransportError() { + InviteClientTransactionState nextState = inviteClientTransaction.TERMINATED; + inviteClientTransaction.setState(nextState); + inviteClientTransaction.transactionUser.transactionTimeout( + inviteClientTransaction); + } + + @Override + public void received2xx() { + InviteClientTransactionState nextState = inviteClientTransaction.TERMINATED; + inviteClientTransaction.setState(nextState); + inviteClientTransaction.transactionUser.successResponseReceived( + inviteClientTransaction.getLastResponse(), inviteClientTransaction); + } + + @Override + public void received1xx() { + InviteClientTransactionState nextState = inviteClientTransaction.PROCEEDING; + inviteClientTransaction.setState(nextState); + inviteClientTransaction.transactionUser.provResponseReceived( + inviteClientTransaction.getLastResponse(), inviteClientTransaction); + } + + @Override + public void received300To699() { + InviteClientTransactionState nextState = inviteClientTransaction.COMPLETED; + inviteClientTransaction.setState(nextState); + inviteClientTransaction.createAndSendAck(); + inviteClientTransaction.transactionUser.errResponseReceived( + inviteClientTransaction.getLastResponse()); + } + + +} diff --git a/src/peers/sip/transaction/InviteClientTransactionStateCompleted.java b/src/peers/sip/transaction/InviteClientTransactionStateCompleted.java new file mode 100644 index 0000000..791cad1 --- /dev/null +++ b/src/peers/sip/transaction/InviteClientTransactionStateCompleted.java @@ -0,0 +1,59 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + +import peers.sip.RFC3261; + +public class InviteClientTransactionStateCompleted extends + InviteClientTransactionState { + + public InviteClientTransactionStateCompleted(String id, + InviteClientTransaction inviteClientTransaction) { + super(id, inviteClientTransaction); + int delay = 0; + if (RFC3261.TRANSPORT_UDP.equals(inviteClientTransaction.transport)) { + delay = RFC3261.TIMER_INVITE_CLIENT_TRANSACTION; + } + inviteClientTransaction.timer.schedule(inviteClientTransaction.new TimerD(), delay); + } + + @Override + public void received300To699() { + InviteClientTransactionState nextState = inviteClientTransaction.COMPLETED; + inviteClientTransaction.setState(nextState); + inviteClientTransaction.sendAck(); + } + + @Override + public void transportError() { + InviteClientTransactionState nextState = inviteClientTransaction.TERMINATED; + inviteClientTransaction.setState(nextState); + inviteClientTransaction.transactionUser.transactionTransportError(); + } + + @Override + public void timerDFires() { + InviteClientTransactionState nextState = inviteClientTransaction.TERMINATED; + inviteClientTransaction.setState(nextState); + } + + +} diff --git a/src/peers/sip/transaction/InviteClientTransactionStateInit.java b/src/peers/sip/transaction/InviteClientTransactionStateInit.java new file mode 100644 index 0000000..3114c6f --- /dev/null +++ b/src/peers/sip/transaction/InviteClientTransactionStateInit.java @@ -0,0 +1,37 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + + +public class InviteClientTransactionStateInit extends InviteClientTransactionState { + + public InviteClientTransactionStateInit(String id, + InviteClientTransaction inviteClientTransaction) { + super(id, inviteClientTransaction); + } + + @Override + public void start() { + InviteClientTransactionState nextState = inviteClientTransaction.CALLING; + inviteClientTransaction.setState(nextState); + } + +} diff --git a/src/peers/sip/transaction/InviteClientTransactionStateProceeding.java b/src/peers/sip/transaction/InviteClientTransactionStateProceeding.java new file mode 100644 index 0000000..4bf4b6f --- /dev/null +++ b/src/peers/sip/transaction/InviteClientTransactionStateProceeding.java @@ -0,0 +1,58 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + + +public class InviteClientTransactionStateProceeding extends + InviteClientTransactionState { + + public InviteClientTransactionStateProceeding(String id, + InviteClientTransaction inviteClientTransaction) { + super(id, inviteClientTransaction); + } + + @Override + public void received1xx() { + InviteClientTransactionState nextState = inviteClientTransaction.PROCEEDING; + inviteClientTransaction.setState(nextState); + inviteClientTransaction.transactionUser.provResponseReceived( + inviteClientTransaction.getLastResponse(), inviteClientTransaction); + } + + @Override + public void received2xx() { + InviteClientTransactionState nextState = inviteClientTransaction.TERMINATED; + inviteClientTransaction.setState(nextState); + inviteClientTransaction.transactionUser.successResponseReceived( + inviteClientTransaction.getLastResponse(), inviteClientTransaction); + } + + @Override + public void received300To699() { + InviteClientTransactionState nextState = inviteClientTransaction.COMPLETED; + inviteClientTransaction.setState(nextState); + inviteClientTransaction.createAndSendAck(); + inviteClientTransaction.transactionUser.errResponseReceived( + inviteClientTransaction.getLastResponse()); + } + + +} diff --git a/src/peers/sip/transaction/InviteClientTransactionStateTerminated.java b/src/peers/sip/transaction/InviteClientTransactionStateTerminated.java new file mode 100644 index 0000000..e9daad0 --- /dev/null +++ b/src/peers/sip/transaction/InviteClientTransactionStateTerminated.java @@ -0,0 +1,32 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + + +public class InviteClientTransactionStateTerminated extends + InviteClientTransactionState { + + public InviteClientTransactionStateTerminated(String id, + InviteClientTransaction inviteClientTransaction) { + super(id, inviteClientTransaction); + } + +} diff --git a/src/peers/sip/transaction/InviteServerTransaction.java b/src/peers/sip/transaction/InviteServerTransaction.java new file mode 100644 index 0000000..7e426a8 --- /dev/null +++ b/src/peers/sip/transaction/InviteServerTransaction.java @@ -0,0 +1,179 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + +import java.io.IOException; +import java.util.Timer; +import java.util.TimerTask; + + +import org.pmw.tinylog.Logger; +import peers.sip.RFC3261; +import peers.sip.transport.SipMessage; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.SipServerTransportUser; +import peers.sip.transport.TransportManager; + + +public class InviteServerTransaction extends InviteTransaction + implements ServerTransaction, SipServerTransportUser { + + public final InviteServerTransactionState INIT; + public final InviteServerTransactionState PROCEEDING; + public final InviteServerTransactionState COMPLETED; + public final InviteServerTransactionState CONFIRMED; + public final InviteServerTransactionState TERMINATED; + + protected String transport; + protected int nbRetrans; + protected ServerTransactionUser serverTransactionUser; + + private InviteServerTransactionState state; + //private SipServerTransport sipServerTransport; + private int port; + + InviteServerTransaction(String branchId, int port, String transport, + SipResponse sipResponse, ServerTransactionUser serverTransactionUser, + SipRequest sipRequest, Timer timer, TransactionManager transactionManager, + TransportManager transportManager) { + super(branchId, timer, transportManager, transactionManager); + + INIT = new InviteServerTransactionStateInit(getId(), this); + state = INIT; + PROCEEDING = new InviteServerTransactionStateProceeding(getId(), this); + COMPLETED = new InviteServerTransactionStateCompleted(getId(), this); + CONFIRMED = new InviteServerTransactionStateConfirmed(getId(), this); + TERMINATED = new InviteServerTransactionStateTerminated(getId(), this); + + this.request = sipRequest; + this.port = port; + this.transport = transport; + responses.add(sipResponse); + nbRetrans = 0; + this.serverTransactionUser = serverTransactionUser; + //TODO pass INV to TU, send 100 if TU won't in 200ms + } + + public void start() { + state.start(); + +// sipServerTransport = SipTransportFactory.getInstance() +// .createServerTransport(this, port, transport); + try { + transportManager.createServerTransport(transport, port); + } catch (IOException e) { + Logger.error("input/output error", e); + } + } + + public void receivedRequest(SipRequest sipRequest) { + String method = sipRequest.getMethod(); + if (RFC3261.METHOD_INVITE.equals(method)) { + state.receivedInvite(); + } else { + // if not INVITE, we consider that a ACK is received + // in the case the call was not successful + state.receivedAck(); + } + + } + + public void sendReponse(SipResponse sipResponse) { + //TODO check that a retransmission response will be considered as + //equal (for contains) to the first response + if (!responses.contains(sipResponse)) { + responses.add(sipResponse); + } + int statusCode = sipResponse.getStatusCode(); + if (statusCode == RFC3261.CODE_MIN_PROV) { + // TODO 100 trying + } else if (statusCode < RFC3261.CODE_MIN_SUCCESS) { + state.received101To199(); + } else if (statusCode < RFC3261.CODE_MIN_REDIR) { + state.received2xx(); + } else if (statusCode <= RFC3261.CODE_MAX) { + state.received300To699(); + } else { + Logger.error("invalid response code"); + } + } + + public void setState(InviteServerTransactionState state) { + this.state.log(state); + this.state = state; + } + + public void messageReceived(SipMessage sipMessage) { + // TODO Auto-generated method stub + + } + + void sendLastResponse() { + //sipServerTransport.sendResponse(responses.get(responses.size() - 1)); + int nbOfResponses = responses.size(); + if (nbOfResponses > 0) { + try { + transportManager.sendResponse(responses.get(nbOfResponses - 1)); + } catch (IOException e) { + Logger.error("input/output error", e); + } + } + } + + public SipResponse getLastResponse() { + int nbOfResponses = responses.size(); + if (nbOfResponses > 0) { + return responses.get(nbOfResponses - 1); + } + return null; + } + + // TODO send provional response + /* + * maybe the 200 response mechanism could be retrieved for 1xx responses. + */ + +// void stopSipServerTransport() { +// sipServerTransport.stop(); +// } + + class TimerG extends TimerTask { + @Override + public void run() { + state.timerGFires(); + } + } + + class TimerH extends TimerTask { + @Override + public void run() { + state.timerHFiresOrTransportError(); + } + } + + class TimerI extends TimerTask { + @Override + public void run() { + state.timerIFires(); + } + } + +} diff --git a/src/peers/sip/transaction/InviteServerTransactionState.java b/src/peers/sip/transaction/InviteServerTransactionState.java new file mode 100644 index 0000000..58f75d6 --- /dev/null +++ b/src/peers/sip/transaction/InviteServerTransactionState.java @@ -0,0 +1,46 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + +import peers.sip.AbstractState; + +public abstract class InviteServerTransactionState extends AbstractState { + + protected InviteServerTransaction inviteServerTransaction; + + public InviteServerTransactionState(String id, + InviteServerTransaction inviteServerTransaction) { + super(id); + this.inviteServerTransaction = inviteServerTransaction; + } + + public void start() {} + public void receivedInvite() {} + public void received101To199() {} + public void transportError() {} + public void received2xx() {} + public void received300To699() {} + public void timerGFires() {} + public void timerHFiresOrTransportError() {} + public void receivedAck() {} + public void timerIFires() {} + +} diff --git a/src/peers/sip/transaction/InviteServerTransactionStateCompleted.java b/src/peers/sip/transaction/InviteServerTransactionStateCompleted.java new file mode 100644 index 0000000..f776ddc --- /dev/null +++ b/src/peers/sip/transaction/InviteServerTransactionStateCompleted.java @@ -0,0 +1,74 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + +import peers.sip.RFC3261; + +public class InviteServerTransactionStateCompleted extends + InviteServerTransactionState { + + public InviteServerTransactionStateCompleted(String id, + InviteServerTransaction inviteServerTransaction) { + super(id, inviteServerTransaction); + } + + @Override + public void timerGFires() { + InviteServerTransactionState nextState = inviteServerTransaction.COMPLETED; + inviteServerTransaction.setState(nextState); + inviteServerTransaction.sendLastResponse(); + long delay = (long)Math.pow(2, + ++inviteServerTransaction.nbRetrans) * RFC3261.TIMER_T1; + inviteServerTransaction.timer.schedule( + inviteServerTransaction.new TimerG(), + Math.min(delay, RFC3261.TIMER_T2)); + } + + @Override + public void timerHFiresOrTransportError() { + InviteServerTransactionState nextState = inviteServerTransaction.TERMINATED; + inviteServerTransaction.setState(nextState); + inviteServerTransaction.serverTransactionUser.transactionFailure(); + } + + @Override + public void receivedAck() { + InviteServerTransactionState nextState = inviteServerTransaction.CONFIRMED; + inviteServerTransaction.setState(nextState); + int delay; + if (RFC3261.TRANSPORT_UDP.equals(inviteServerTransaction.transport)) { + delay = RFC3261.TIMER_T4; + } else { + delay = 0; + } + inviteServerTransaction.timer.schedule( + inviteServerTransaction.new TimerI(), delay); + } + + @Override + public void receivedInvite() { + InviteServerTransactionState nextState = inviteServerTransaction.COMPLETED; + inviteServerTransaction.setState(nextState); + // retransmission + inviteServerTransaction.sendLastResponse(); + } + +} diff --git a/src/peers/sip/transaction/InviteServerTransactionStateConfirmed.java b/src/peers/sip/transaction/InviteServerTransactionStateConfirmed.java new file mode 100644 index 0000000..7cf2c33 --- /dev/null +++ b/src/peers/sip/transaction/InviteServerTransactionStateConfirmed.java @@ -0,0 +1,45 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + + +public class InviteServerTransactionStateConfirmed extends + InviteServerTransactionState { + + public InviteServerTransactionStateConfirmed(String id, + InviteServerTransaction inviteServerTransaction) { + super(id, inviteServerTransaction); + } + + @Override + public void timerIFires() { + InviteServerTransactionState nextState = + inviteServerTransaction.TERMINATED; + inviteServerTransaction.setState(nextState); + // TODO destroy invite server transaction immediately + // (dereference it in transaction manager serverTransactions hashtable) + + inviteServerTransaction.transactionManager.removeServerTransaction( + inviteServerTransaction.branchId, + inviteServerTransaction.method); + } + +} diff --git a/src/peers/sip/transaction/InviteServerTransactionStateInit.java b/src/peers/sip/transaction/InviteServerTransactionStateInit.java new file mode 100644 index 0000000..6ff34a5 --- /dev/null +++ b/src/peers/sip/transaction/InviteServerTransactionStateInit.java @@ -0,0 +1,37 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + + +public class InviteServerTransactionStateInit extends + InviteServerTransactionState { + + public InviteServerTransactionStateInit(String id, + InviteServerTransaction inviteServerTransaction) { + super(id, inviteServerTransaction); + } + + @Override + public void start() { + InviteServerTransactionState nextState = inviteServerTransaction.PROCEEDING; + inviteServerTransaction.setState(nextState); + } +} diff --git a/src/peers/sip/transaction/InviteServerTransactionStateProceeding.java b/src/peers/sip/transaction/InviteServerTransactionStateProceeding.java new file mode 100644 index 0000000..dd4ea34 --- /dev/null +++ b/src/peers/sip/transaction/InviteServerTransactionStateProceeding.java @@ -0,0 +1,74 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + +import peers.sip.RFC3261; + +public class InviteServerTransactionStateProceeding extends + InviteServerTransactionState { + + public InviteServerTransactionStateProceeding(String id, + InviteServerTransaction inviteServerTransaction) { + super(id, inviteServerTransaction); + } + + @Override + public void received101To199() { + InviteServerTransactionState nextState = inviteServerTransaction.PROCEEDING; + inviteServerTransaction.setState(nextState); + //TODO inviteServerTransaction.sendProvisionalResponse(); + inviteServerTransaction.sendLastResponse(); + } + + @Override + public void transportError() { + InviteServerTransactionState nextState = inviteServerTransaction.TERMINATED; + inviteServerTransaction.setState(nextState); + } + + @Override + public void received2xx() { + InviteServerTransactionState nextState = inviteServerTransaction.TERMINATED; + inviteServerTransaction.setState(nextState); + inviteServerTransaction.sendLastResponse(); + } + + @Override + public void received300To699() { + InviteServerTransactionState nextState = inviteServerTransaction.COMPLETED; + inviteServerTransaction.setState(nextState); + inviteServerTransaction.sendLastResponse(); + if (RFC3261.TRANSPORT_UDP.equals(inviteServerTransaction.transport)) { + inviteServerTransaction.timer.schedule( + inviteServerTransaction.new TimerG(), RFC3261.TIMER_T1); + } + inviteServerTransaction.timer.schedule( + inviteServerTransaction.new TimerH(), 64 * RFC3261.TIMER_T1); + } + + @Override + public void receivedInvite() { + InviteServerTransactionState nextState = inviteServerTransaction.PROCEEDING; + inviteServerTransaction.setState(nextState); + } + + +} diff --git a/src/peers/sip/transaction/InviteServerTransactionStateTerminated.java b/src/peers/sip/transaction/InviteServerTransactionStateTerminated.java new file mode 100644 index 0000000..9ff9125 --- /dev/null +++ b/src/peers/sip/transaction/InviteServerTransactionStateTerminated.java @@ -0,0 +1,32 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + + +public class InviteServerTransactionStateTerminated extends + InviteServerTransactionState { + + public InviteServerTransactionStateTerminated(String id, + InviteServerTransaction inviteServerTransaction) { + super(id, inviteServerTransaction); + } + +} diff --git a/src/peers/sip/transaction/InviteTransaction.java b/src/peers/sip/transaction/InviteTransaction.java new file mode 100644 index 0000000..c5087eb --- /dev/null +++ b/src/peers/sip/transaction/InviteTransaction.java @@ -0,0 +1,37 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + +import java.util.Timer; + + +import peers.sip.RFC3261; +import peers.sip.transport.TransportManager; + +public abstract class InviteTransaction extends Transaction { + + protected InviteTransaction(String branchId, Timer timer, + TransportManager transportManager, + TransactionManager transactionManager) { + super(branchId, RFC3261.METHOD_INVITE, timer, transportManager, + transactionManager); + } + +} diff --git a/src/peers/sip/transaction/NonInviteClientTransaction.java b/src/peers/sip/transaction/NonInviteClientTransaction.java new file mode 100644 index 0000000..9cd26cd --- /dev/null +++ b/src/peers/sip/transaction/NonInviteClientTransaction.java @@ -0,0 +1,202 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + +import java.io.IOException; +import java.net.InetAddress; +import java.util.Timer; +import java.util.TimerTask; + + +import org.pmw.tinylog.Logger; +import peers.sip.RFC3261; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaderParamName; +import peers.sip.transport.MessageSender; +import peers.sip.transport.SipClientTransportUser; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.TransportManager; + + +public class NonInviteClientTransaction extends NonInviteTransaction + implements ClientTransaction, SipClientTransportUser { + + public final NonInviteClientTransactionState INIT; + public final NonInviteClientTransactionState TRYING; + public final NonInviteClientTransactionState PROCEEDING; + public final NonInviteClientTransactionState COMPLETED; + public final NonInviteClientTransactionState TERMINATED; + + protected ClientTransactionUser transactionUser; + protected String transport; + protected int nbRetrans; + + private NonInviteClientTransactionState state; + //private SipClientTransport sipClientTransport; + private MessageSender messageSender; + private int remotePort; + private InetAddress remoteInetAddress; + + NonInviteClientTransaction(String branchId, InetAddress inetAddress, + int port, String transport, SipRequest sipRequest, + ClientTransactionUser transactionUser, Timer timer, + TransportManager transportManager, + TransactionManager transactionManager) { + super(branchId, sipRequest.getMethod(), timer, transportManager, + transactionManager); + + this.transport = transport; + + SipHeaderFieldValue via = new SipHeaderFieldValue(""); + via.addParam(new SipHeaderParamName(RFC3261.PARAM_BRANCH), branchId); + sipRequest.getSipHeaders().add(new SipHeaderFieldName(RFC3261.HDR_VIA), via, 0); + + nbRetrans = 0; + + INIT = new NonInviteClientTransactionStateInit(getId(), this); + state = INIT; + TRYING = new NonInviteClientTransactionStateTrying(getId(), this); + PROCEEDING = new NonInviteClientTransactionStateProceeding(getId(), + this); + COMPLETED = new NonInviteClientTransactionStateCompleted(getId(), + this); + TERMINATED = new NonInviteClientTransactionStateTerminated(getId(), + this); + + request = sipRequest; + this.transactionUser = transactionUser; + + remotePort = port; + remoteInetAddress = inetAddress; + + try { + messageSender = transportManager.createClientTransport( + request, remoteInetAddress, remotePort, transport); + } catch (IOException e) { + Logger.error("input/output error", e); + transportError(); + } + //TODO send request + } + + public void setState(NonInviteClientTransactionState state) { + this.state.log(state); + this.state = state; + } + + public void start() { + state.start(); + + //17.1.2.2 + +// try { +// sipClientTransport = SipTransportFactory.getInstance() +// .createClientTransport(this, request, remoteInetAddress, +// remotePort, transport); +// sipClientTransport.send(request); +// } catch (IOException e) { +// //e.printStackTrace(); +// transportError(); +// } + try { + messageSender.sendMessage(request); + } catch (IOException e) { + Logger.error("input/output error", e); + transportError(); + } + + if (RFC3261.TRANSPORT_UDP.equals(transport)) { + //start timer E with value T1 for retransmission + timer.schedule(new TimerE(), RFC3261.TIMER_T1); + } + + timer.schedule(new TimerF(), 64 * RFC3261.TIMER_T1); + } + + void sendRetrans(long delay) { + //sipClientTransport.send(request); + try { + messageSender.sendMessage(request); + } catch (IOException e) { + Logger.error("input/output error", e); + transportError(); + } + timer.schedule(new TimerE(), delay); + } + + public void transportError() { + state.transportError(); + } + + public synchronized void receivedResponse(SipResponse sipResponse) { + responses.add(sipResponse); + // 17.1.1 + int statusCode = sipResponse.getStatusCode(); + if (statusCode < RFC3261.CODE_MIN_PROV) { + Logger.error("invalid response code"); + } else if (statusCode < RFC3261.CODE_MIN_SUCCESS) { + state.received1xx(); + } else if (statusCode <= RFC3261.CODE_MAX) { + state.received200To699(); + } else { + Logger.error("invalid response code"); + } + } + + public void requestTransportError(SipRequest sipRequest, Exception e) { + // TODO Auto-generated method stub + + } + + public void responseTransportError(Exception e) { + // TODO Auto-generated method stub + + } + + class TimerE extends TimerTask { + @Override + public void run() { + state.timerEFires(); + } + } + + class TimerF extends TimerTask { + @Override + public void run() { + state.timerFFires(); + } + } + + class TimerK extends TimerTask { + @Override + public void run() { + state.timerKFires(); + } + } + + public String getContact() { + if (messageSender != null) { + return messageSender.getContact(); + } + return null; + } +} diff --git a/src/peers/sip/transaction/NonInviteClientTransactionState.java b/src/peers/sip/transaction/NonInviteClientTransactionState.java new file mode 100644 index 0000000..695bcd0 --- /dev/null +++ b/src/peers/sip/transaction/NonInviteClientTransactionState.java @@ -0,0 +1,43 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + +import peers.sip.AbstractState; + +public abstract class NonInviteClientTransactionState extends AbstractState { + + protected NonInviteClientTransaction nonInviteClientTransaction; + + public NonInviteClientTransactionState(String id, + NonInviteClientTransaction nonInviteClientTransaction) { + super(id); + this.nonInviteClientTransaction = nonInviteClientTransaction; + } + + public void start() {} + public void timerEFires() {} + public void timerFFires() {} + public void transportError() {} + public void received1xx() {} + public void received200To699() {} + public void timerKFires() {} + +} diff --git a/src/peers/sip/transaction/NonInviteClientTransactionStateCompleted.java b/src/peers/sip/transaction/NonInviteClientTransactionStateCompleted.java new file mode 100644 index 0000000..c9d7b0a --- /dev/null +++ b/src/peers/sip/transaction/NonInviteClientTransactionStateCompleted.java @@ -0,0 +1,47 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + +import peers.sip.RFC3261; + +public class NonInviteClientTransactionStateCompleted extends + NonInviteClientTransactionState { + + public NonInviteClientTransactionStateCompleted(String id, + NonInviteClientTransaction nonInviteClientTransaction) { + super(id, nonInviteClientTransaction); + int delay = 0; + if (RFC3261.TRANSPORT_UDP.equals( + nonInviteClientTransaction.transport)) { + delay = RFC3261.TIMER_T4; + } + nonInviteClientTransaction.timer.schedule( + nonInviteClientTransaction.new TimerK(), delay); + } + + @Override + public void timerKFires() { + NonInviteClientTransactionState nextState = + nonInviteClientTransaction.TERMINATED; + nonInviteClientTransaction.setState(nextState); + } + +} diff --git a/src/peers/sip/transaction/NonInviteClientTransactionStateInit.java b/src/peers/sip/transaction/NonInviteClientTransactionStateInit.java new file mode 100644 index 0000000..12e9f14 --- /dev/null +++ b/src/peers/sip/transaction/NonInviteClientTransactionStateInit.java @@ -0,0 +1,37 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + + +public class NonInviteClientTransactionStateInit extends + NonInviteClientTransactionState { + + public NonInviteClientTransactionStateInit(String id, + NonInviteClientTransaction nonInviteClientTransaction) { + super(id, nonInviteClientTransaction); + } + + @Override + public void start() { + NonInviteClientTransactionState nextState = nonInviteClientTransaction.TRYING; + nonInviteClientTransaction.setState(nextState); + } +} diff --git a/src/peers/sip/transaction/NonInviteClientTransactionStateProceeding.java b/src/peers/sip/transaction/NonInviteClientTransactionStateProceeding.java new file mode 100644 index 0000000..9b5d9b5 --- /dev/null +++ b/src/peers/sip/transaction/NonInviteClientTransactionStateProceeding.java @@ -0,0 +1,80 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + +import peers.sip.RFC3261; +import peers.sip.transport.SipResponse; + +public class NonInviteClientTransactionStateProceeding extends + NonInviteClientTransactionState { + + public NonInviteClientTransactionStateProceeding(String id, + NonInviteClientTransaction nonInviteClientTransaction) { + super(id, nonInviteClientTransaction); + } + + @Override + public void timerEFires() { + NonInviteClientTransactionState nextState = nonInviteClientTransaction.PROCEEDING; + nonInviteClientTransaction.setState(nextState); + ++nonInviteClientTransaction.nbRetrans; + nonInviteClientTransaction.sendRetrans(RFC3261.TIMER_T2); + } + + @Override + public void timerFFires() { + timerFFiresOrTransportError(); + } + + @Override + public void transportError() { + timerFFiresOrTransportError(); + } + + private void timerFFiresOrTransportError() { + NonInviteClientTransactionState nextState = nonInviteClientTransaction.TERMINATED; + nonInviteClientTransaction.setState(nextState); + nonInviteClientTransaction.transactionUser.transactionTimeout( + nonInviteClientTransaction); + } + + @Override + public void received1xx() { + NonInviteClientTransactionState nextState = nonInviteClientTransaction.PROCEEDING; + nonInviteClientTransaction.setState(nextState); + } + + @Override + public void received200To699() { + NonInviteClientTransactionState nextState = nonInviteClientTransaction.COMPLETED; + nonInviteClientTransaction.setState(nextState); + SipResponse response = nonInviteClientTransaction.getLastResponse(); + int code = response.getStatusCode(); + if (code < RFC3261.CODE_MIN_REDIR) { + nonInviteClientTransaction.transactionUser.successResponseReceived( + response, nonInviteClientTransaction); + } else { + nonInviteClientTransaction.transactionUser.errResponseReceived( + response); + } + } + +} diff --git a/src/peers/sip/transaction/NonInviteClientTransactionStateTerminated.java b/src/peers/sip/transaction/NonInviteClientTransactionStateTerminated.java new file mode 100644 index 0000000..4dcd862 --- /dev/null +++ b/src/peers/sip/transaction/NonInviteClientTransactionStateTerminated.java @@ -0,0 +1,32 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + + +public class NonInviteClientTransactionStateTerminated extends + NonInviteClientTransactionState { + + public NonInviteClientTransactionStateTerminated(String id, + NonInviteClientTransaction nonInviteClientTransaction) { + super(id, nonInviteClientTransaction); + } + +} diff --git a/src/peers/sip/transaction/NonInviteClientTransactionStateTrying.java b/src/peers/sip/transaction/NonInviteClientTransactionStateTrying.java new file mode 100644 index 0000000..8aba1c5 --- /dev/null +++ b/src/peers/sip/transaction/NonInviteClientTransactionStateTrying.java @@ -0,0 +1,83 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + +import peers.sip.RFC3261; +import peers.sip.transport.SipResponse; + +public class NonInviteClientTransactionStateTrying extends + NonInviteClientTransactionState { + + public NonInviteClientTransactionStateTrying(String id, + NonInviteClientTransaction nonInviteClientTransaction) { + super(id, nonInviteClientTransaction); + } + + @Override + public void timerEFires() { + NonInviteClientTransactionState nextState = nonInviteClientTransaction.TRYING; + nonInviteClientTransaction.setState(nextState); + long delay = (long)Math.pow(2, + ++nonInviteClientTransaction.nbRetrans) * RFC3261.TIMER_T1; + nonInviteClientTransaction.sendRetrans(Math.min(delay, RFC3261.TIMER_T2)); + } + + @Override + public void timerFFires() { + timerFFiresOrTransportError(); + } + + @Override + public void transportError() { + timerFFiresOrTransportError(); + } + + private void timerFFiresOrTransportError() { + NonInviteClientTransactionState nextState = nonInviteClientTransaction.TERMINATED; + nonInviteClientTransaction.setState(nextState); + nonInviteClientTransaction.transactionUser.transactionTimeout( + nonInviteClientTransaction); + } + + @Override + public void received1xx() { + NonInviteClientTransactionState nextState = nonInviteClientTransaction.PROCEEDING; + nonInviteClientTransaction.setState(nextState); + nonInviteClientTransaction.transactionUser.provResponseReceived( + nonInviteClientTransaction.getLastResponse(), nonInviteClientTransaction); + } + + @Override + public void received200To699() { + NonInviteClientTransactionState nextState = nonInviteClientTransaction.COMPLETED; + nonInviteClientTransaction.setState(nextState); + SipResponse response = nonInviteClientTransaction.getLastResponse(); + int code = response.getStatusCode(); + if (code < RFC3261.CODE_MIN_REDIR) { + nonInviteClientTransaction.transactionUser.successResponseReceived( + response, nonInviteClientTransaction); + } else { + nonInviteClientTransaction.transactionUser.errResponseReceived( + response); + } + } + +} diff --git a/src/peers/sip/transaction/NonInviteServerTransaction.java b/src/peers/sip/transaction/NonInviteServerTransaction.java new file mode 100644 index 0000000..2c34b7e --- /dev/null +++ b/src/peers/sip/transaction/NonInviteServerTransaction.java @@ -0,0 +1,126 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + +import java.io.IOException; +import java.util.Timer; +import java.util.TimerTask; + + +import org.pmw.tinylog.Logger; +import peers.sip.RFC3261; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.TransportManager; + + +public class NonInviteServerTransaction extends NonInviteTransaction + implements ServerTransaction/*, SipServerTransportUser*/ { + + public final NonInviteServerTransactionState TRYING; + public final NonInviteServerTransactionState PROCEEDING; + public final NonInviteServerTransactionState COMPLETED; + public final NonInviteServerTransactionState TERMINATED; + + protected ServerTransactionUser serverTransactionUser; + protected Timer timer; + protected String transport; + + private NonInviteServerTransactionState state; + //private int port; + + NonInviteServerTransaction(String branchId, int port, String transport, + String method, ServerTransactionUser serverTransactionUser, + SipRequest sipRequest, Timer timer, TransportManager transportManager, + TransactionManager transactionManager) { + super(branchId, method, timer, transportManager, transactionManager); + + TRYING = new NonInviteServerTransactionStateTrying(getId(), this); + state = TRYING; + PROCEEDING = new NonInviteServerTransactionStateProceeding(getId(), + this); + COMPLETED = new NonInviteServerTransactionStateCompleted(getId(), this); + TERMINATED = new NonInviteServerTransactionStateTerminated(getId(), + this); + + //this.port = port; + this.transport = transport; + this.serverTransactionUser = serverTransactionUser; + request = sipRequest; +// sipServerTransport = SipTransportFactory.getInstance() +// .createServerTransport(this, port, transport); + try { + transportManager.createServerTransport(transport, port); + } catch (IOException e) { + Logger.error("input/output error", e); + } + + //TODO pass request to TU + } + + public void setState(NonInviteServerTransactionState state) { + this.state.log(state); + this.state = state; + } + + public void receivedRequest(SipRequest sipRequest) { + state.receivedRequest(); + } + + public void sendReponse(SipResponse sipResponse) { + responses.add(sipResponse); + int statusCode = sipResponse.getStatusCode(); + if (statusCode < RFC3261.CODE_200_OK) { + state.received1xx(); + } else if (statusCode <= RFC3261.CODE_MAX) { + state.received200To699(); + } + } + + void sendLastResponse() { + //sipServerTransport.sendResponse(responses.get(responses.size() - 1)); + int nbOfResponses = responses.size(); + if (nbOfResponses > 0) { + try { + transportManager.sendResponse(responses.get(nbOfResponses - 1)); + } catch (IOException e) { + Logger.error("input/output error", e); + } + } + } + + public void start() { + // TODO Auto-generated method stub + + } + +// public void messageReceived(SipMessage sipMessage) { +// // TODO Auto-generated method stub +// +// } + + class TimerJ extends TimerTask { + @Override + public void run() { + state.timerJFires(); + } + } + +} diff --git a/src/peers/sip/transaction/NonInviteServerTransactionState.java b/src/peers/sip/transaction/NonInviteServerTransactionState.java new file mode 100644 index 0000000..5c6e0a1 --- /dev/null +++ b/src/peers/sip/transaction/NonInviteServerTransactionState.java @@ -0,0 +1,42 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + +import peers.sip.AbstractState; + +//17.2.2 +public abstract class NonInviteServerTransactionState extends AbstractState { + + protected NonInviteServerTransaction nonInviteServerTransaction; + + public NonInviteServerTransactionState(String id, + NonInviteServerTransaction nonInviteServerTransaction) { + super(id); + this.nonInviteServerTransaction = nonInviteServerTransaction; + } + + public void received200To699() {} + public void received1xx() {} + public void receivedRequest() {} + public void transportError() {} + public void timerJFires() {} +} + diff --git a/src/peers/sip/transaction/NonInviteServerTransactionStateCompleted.java b/src/peers/sip/transaction/NonInviteServerTransactionStateCompleted.java new file mode 100644 index 0000000..ec3c767 --- /dev/null +++ b/src/peers/sip/transaction/NonInviteServerTransactionStateCompleted.java @@ -0,0 +1,51 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + + +public class NonInviteServerTransactionStateCompleted extends + NonInviteServerTransactionState { + + public NonInviteServerTransactionStateCompleted(String id, + NonInviteServerTransaction nonInviteServerTransaction) { + super(id, nonInviteServerTransaction); + } + + @Override + public void timerJFires() { + NonInviteServerTransactionState nextState = nonInviteServerTransaction.TERMINATED; + nonInviteServerTransaction.setState(nextState); + } + + @Override + public void transportError() { + NonInviteServerTransactionState nextState = nonInviteServerTransaction.TERMINATED; + nonInviteServerTransaction.setState(nextState); + } + + @Override + public void receivedRequest() { + NonInviteServerTransactionState nextState = nonInviteServerTransaction.COMPLETED; + nonInviteServerTransaction.setState(nextState); + nonInviteServerTransaction.sendLastResponse(); + } + +} diff --git a/src/peers/sip/transaction/NonInviteServerTransactionStateProceeding.java b/src/peers/sip/transaction/NonInviteServerTransactionStateProceeding.java new file mode 100644 index 0000000..11370dc --- /dev/null +++ b/src/peers/sip/transaction/NonInviteServerTransactionStateProceeding.java @@ -0,0 +1,72 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + +import peers.sip.RFC3261; + +public class NonInviteServerTransactionStateProceeding extends + NonInviteServerTransactionState { + + public NonInviteServerTransactionStateProceeding(String id, + NonInviteServerTransaction nonInviteServerTransaction) { + super(id, nonInviteServerTransaction); + } + + @Override + public void received1xx() { + NonInviteServerTransactionState nextState = + nonInviteServerTransaction.PROCEEDING; + nonInviteServerTransaction.setState(nextState); + nonInviteServerTransaction.sendLastResponse(); + } + + @Override + public void received200To699() { + NonInviteServerTransactionState nextState = + nonInviteServerTransaction.COMPLETED; + nonInviteServerTransaction.setState(nextState); + nonInviteServerTransaction.sendLastResponse(); + int timeout; + if (RFC3261.TRANSPORT_UDP.equals( + nonInviteServerTransaction.transport)) { + timeout = 64 * RFC3261.TIMER_T1; + } else { + timeout = 0; + } + nonInviteServerTransaction.timer.schedule( + nonInviteServerTransaction.new TimerJ(), timeout); + } + + @Override + public void transportError() { + NonInviteServerTransactionState nextState = + nonInviteServerTransaction.TERMINATED; + nonInviteServerTransaction.setState(nextState); + } + + @Override + public void receivedRequest() { + NonInviteServerTransactionState nextState = + nonInviteServerTransaction.PROCEEDING; + nonInviteServerTransaction.setState(nextState); + } + +} diff --git a/src/peers/sip/transaction/NonInviteServerTransactionStateTerminated.java b/src/peers/sip/transaction/NonInviteServerTransactionStateTerminated.java new file mode 100644 index 0000000..67c0462 --- /dev/null +++ b/src/peers/sip/transaction/NonInviteServerTransactionStateTerminated.java @@ -0,0 +1,32 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + + +public class NonInviteServerTransactionStateTerminated extends + NonInviteServerTransactionState { + + public NonInviteServerTransactionStateTerminated(String id, + NonInviteServerTransaction nonInviteServerTransaction) { + super(id, nonInviteServerTransaction); + } + +} diff --git a/src/peers/sip/transaction/NonInviteServerTransactionStateTrying.java b/src/peers/sip/transaction/NonInviteServerTransactionStateTrying.java new file mode 100644 index 0000000..8b02e4f --- /dev/null +++ b/src/peers/sip/transaction/NonInviteServerTransactionStateTrying.java @@ -0,0 +1,47 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + + +public class NonInviteServerTransactionStateTrying extends + NonInviteServerTransactionState { + + public NonInviteServerTransactionStateTrying(String id, + NonInviteServerTransaction nonInviteServerTransaction) { + super(id, nonInviteServerTransaction); + } + + @Override + public void received1xx() { + NonInviteServerTransactionState nextState = + nonInviteServerTransaction.PROCEEDING; + nonInviteServerTransaction.setState(nextState); + nonInviteServerTransaction.sendLastResponse(); + } + + @Override + public void received200To699() { + NonInviteServerTransactionState nextState = + nonInviteServerTransaction.COMPLETED; + nonInviteServerTransaction.setState(nextState); + } + +} diff --git a/src/peers/sip/transaction/NonInviteTransaction.java b/src/peers/sip/transaction/NonInviteTransaction.java new file mode 100644 index 0000000..85a2f25 --- /dev/null +++ b/src/peers/sip/transaction/NonInviteTransaction.java @@ -0,0 +1,35 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + +import java.util.Timer; + + +import peers.sip.transport.TransportManager; + +public abstract class NonInviteTransaction extends Transaction { + + protected NonInviteTransaction(String branchId, String method, Timer timer, + TransportManager transportManager, + TransactionManager transactionManager) { + super(branchId, method, timer, transportManager, transactionManager); + } + +} diff --git a/src/peers/sip/transaction/ServerTransaction.java b/src/peers/sip/transaction/ServerTransaction.java new file mode 100644 index 0000000..8165b93 --- /dev/null +++ b/src/peers/sip/transaction/ServerTransaction.java @@ -0,0 +1,32 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; + +public interface ServerTransaction { + + public void start(); + + public void receivedRequest(SipRequest sipRequest); + + public void sendReponse(SipResponse sipResponse); +} diff --git a/src/peers/sip/transaction/ServerTransactionUser.java b/src/peers/sip/transaction/ServerTransactionUser.java new file mode 100644 index 0000000..3e47659 --- /dev/null +++ b/src/peers/sip/transaction/ServerTransactionUser.java @@ -0,0 +1,25 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + +public interface ServerTransactionUser { + + public void transactionFailure(); +} diff --git a/src/peers/sip/transaction/SipListeningPoint.java b/src/peers/sip/transaction/SipListeningPoint.java new file mode 100644 index 0000000..14a653b --- /dev/null +++ b/src/peers/sip/transaction/SipListeningPoint.java @@ -0,0 +1,64 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transaction; + + +public class SipListeningPoint { + + private int localPort; + private String localTransport; + + public SipListeningPoint(int localPort, String localTransport) { + super(); + this.localPort = localPort; + this.localTransport = localTransport; + } + + @Override + public boolean equals(Object obj) { + if (obj.getClass() != SipListeningPoint.class) { + return false; + } + SipListeningPoint other = (SipListeningPoint)obj; + return localPort == other.localPort && + localTransport.equals(other.localTransport); + } + + @Override + public String toString() { + StringBuffer buf = new StringBuffer(); + buf.append(':').append(localPort).append('/').append(localTransport); + return buf.toString(); + } + + @Override + public int hashCode() { + return toString().hashCode(); + } + + public int getlocalPort() { + return localPort; + } + + public String getlocalTransport() { + return localTransport; + } + +} diff --git a/src/peers/sip/transaction/Transaction.java b/src/peers/sip/transaction/Transaction.java new file mode 100644 index 0000000..fd54c52 --- /dev/null +++ b/src/peers/sip/transaction/Transaction.java @@ -0,0 +1,77 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007-2013 Yohann Martineau +*/ + +package peers.sip.transaction; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Timer; + + +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.TransportManager; + + +public abstract class Transaction { + + public static final char ID_SEPARATOR = '|'; + + protected String branchId; + protected String method; + + protected SipRequest request; + protected List responses; + + protected Timer timer; + protected TransportManager transportManager; + protected TransactionManager transactionManager; + + + protected Transaction(String branchId, String method, Timer timer, + TransportManager transportManager, + TransactionManager transactionManager) { + this.branchId = branchId; + this.method = method; + this.timer = timer; + this.transportManager = transportManager; + this.transactionManager = transactionManager; + responses = Collections.synchronizedList(new ArrayList()); + } + + protected String getId() { + StringBuffer buf = new StringBuffer(); + buf.append(branchId).append(ID_SEPARATOR); + buf.append(method); + return buf.toString(); + } + + public SipResponse getLastResponse() { + if (responses.isEmpty()) { + return null; + } + return responses.get(responses.size() - 1); + } + + public SipRequest getRequest() { + return request; + } + +} diff --git a/src/peers/sip/transaction/TransactionManager.java b/src/peers/sip/transaction/TransactionManager.java new file mode 100644 index 0000000..70b29e6 --- /dev/null +++ b/src/peers/sip/transaction/TransactionManager.java @@ -0,0 +1,209 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007-2013 Yohann Martineau +*/ + +package peers.sip.transaction; + +import java.net.InetAddress; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.List; +import java.util.Timer; + + +import peers.sip.RFC3261; +import peers.sip.Utils; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaderParamName; +import peers.sip.transport.SipMessage; +import peers.sip.transport.SipRequest; +import peers.sip.transport.SipResponse; +import peers.sip.transport.TransportManager; + + +public class TransactionManager { + + protected Timer timer; + + // TODO remove client transactions when they reach terminated state + // TODO check that server transactions are removed in all transitions to terminated + private Hashtable clientTransactions; + private Hashtable serverTransactions; + + private TransportManager transportManager; + + public TransactionManager() { + clientTransactions = new Hashtable(); + serverTransactions = new Hashtable(); + timer = new Timer(TransactionManager.class.getSimpleName() + + " " + Timer.class.getSimpleName()); + } + + public ClientTransaction createClientTransaction(SipRequest sipRequest, + InetAddress inetAddress, int port, String transport, + String pBranchId, ClientTransactionUser clientTransactionUser) { + String branchId; + if (pBranchId == null || "".equals(pBranchId.trim()) + || !pBranchId.startsWith(RFC3261.BRANCHID_MAGIC_COOKIE)) { + branchId = Utils.generateBranchId(); + } else { + branchId = pBranchId; + } + String method = sipRequest.getMethod(); + ClientTransaction clientTransaction; + if (RFC3261.METHOD_INVITE.equals(method)) { + clientTransaction = new InviteClientTransaction(branchId, + inetAddress, port, transport, sipRequest, clientTransactionUser, + timer, transportManager, this); + } else { + clientTransaction = new NonInviteClientTransaction(branchId, + inetAddress, port, transport, sipRequest, clientTransactionUser, + timer, transportManager, this); + } + clientTransactions.put(getTransactionId(branchId, method), + clientTransaction); + return clientTransaction; + } + + public ServerTransaction createServerTransaction(SipResponse sipResponse, + int port, String transport, + ServerTransactionUser serverTransactionUser, + SipRequest sipRequest) { + SipHeaderFieldValue via = Utils.getTopVia(sipResponse); + String branchId = via.getParam(new SipHeaderParamName( + RFC3261.PARAM_BRANCH)); + String cseq = sipResponse.getSipHeaders().get( + new SipHeaderFieldName(RFC3261.HDR_CSEQ)).toString(); + String method = cseq.substring(cseq.lastIndexOf(' ') + 1); + ServerTransaction serverTransaction; + // TODO create server transport user and pass it to server transaction + if (RFC3261.METHOD_INVITE.equals(method)) { + serverTransaction = new InviteServerTransaction(branchId, port, + transport, sipResponse, serverTransactionUser, sipRequest, + timer, this, transportManager); + // serverTransaction = new InviteServerTransaction(branchId); + } else { + serverTransaction = new NonInviteServerTransaction(branchId, port, + transport, method, serverTransactionUser, sipRequest, timer, + transportManager, this); + } + serverTransactions.put(getTransactionId(branchId, method), + serverTransaction); + return serverTransaction; + } + + public ClientTransaction getClientTransaction(SipMessage sipMessage) { + SipHeaderFieldValue via = Utils.getTopVia(sipMessage); + String branchId = via.getParam(new SipHeaderParamName( + RFC3261.PARAM_BRANCH)); + String cseq = sipMessage.getSipHeaders().get( + new SipHeaderFieldName(RFC3261.HDR_CSEQ)).toString(); + String method = cseq.substring(cseq.lastIndexOf(' ') + 1); + return clientTransactions.get(getTransactionId(branchId, method)); + } + + public List getClientTransactionsFromCallId(String callId, + String method) { + ArrayList clientTransactionsFromCallId = + new ArrayList(); + for (ClientTransaction clientTransaction: clientTransactions.values()) { + Transaction transaction = (Transaction)clientTransaction; + SipRequest sipRequest = transaction.getRequest(); + String reqCallId = Utils.getMessageCallId(sipRequest); + String reqMethod = sipRequest.getMethod(); + if (callId.equals(reqCallId) && method.equals(reqMethod)) { + clientTransactionsFromCallId.add(clientTransaction); + } + } + return clientTransactionsFromCallId; + } + + public ServerTransaction getServerTransaction(SipMessage sipMessage) { + SipHeaderFieldValue via = Utils.getTopVia(sipMessage); + String branchId = via.getParam(new SipHeaderParamName( + RFC3261.PARAM_BRANCH)); + String method; + if (sipMessage instanceof SipRequest) { + method = ((SipRequest)sipMessage).getMethod(); + } else { + String cseq = sipMessage.getSipHeaders().get( + new SipHeaderFieldName(RFC3261.HDR_CSEQ)).toString(); + method = cseq.substring(cseq.lastIndexOf(' ') + 1); + } + if (RFC3261.METHOD_ACK.equals(method)) { + method = RFC3261.METHOD_INVITE; +// InviteServerTransaction inviteServerTransaction = +// (InviteServerTransaction) +// serverTransactions.get(getTransactionId(branchId, method)); +// if (inviteServerTransaction == null) { +// Logger.debug("received ACK for unknown transaction" + +// " branchId = " + branchId + ", method = " + method); +// } else { +// SipResponse sipResponse = +// inviteServerTransaction.getLastResponse(); +// if (sipResponse == null) { +// Logger.debug("received ACK but no response sent " + +// "branchId = " + branchId + ", method = " + method); +// } else { +// int statusCode = sipResponse.getStatusCode(); +// if (statusCode >= RFC3261.CODE_MIN_SUCCESS && +// statusCode < RFC3261.CODE_MIN_REDIR) { +// // success response => ACK is not in INVITE server +// // transaction +// return null; +// } else { +// // error => ACK belongs to INVITE server transaction +// return inviteServerTransaction; +// } +// } +// } + // TODO if positive response, ACK does not belong to transaction + // retrieve transaction and take responses from transaction + // and check if a positive response has been received + // if it is the case, a new standalone transaction must be created + // for the ACK + } + return serverTransactions.get(getTransactionId(branchId, method)); + } + + public ServerTransaction getServerTransaction(String branchId, String method) { + return serverTransactions.get(getTransactionId(branchId, method)); + } + + void removeServerTransaction(String branchId, String method) { + serverTransactions.remove(getTransactionId(branchId, method)); + } + + void removeClientTransaction(String branchId, String method) { + clientTransactions.remove(getTransactionId(branchId, method)); + } + + private String getTransactionId(String branchId, String method) { + StringBuffer buf = new StringBuffer(); + buf.append(branchId); + buf.append(Transaction.ID_SEPARATOR); + buf.append(method); + return buf.toString(); + } + + public void setTransportManager(TransportManager transportManager) { + this.transportManager = transportManager; + } + +} diff --git a/src/peers/sip/transactionuser/Dialog.java b/src/peers/sip/transactionuser/Dialog.java new file mode 100644 index 0000000..92f8041 --- /dev/null +++ b/src/peers/sip/transactionuser/Dialog.java @@ -0,0 +1,259 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transactionuser; + +import java.util.ArrayList; + + +import org.pmw.tinylog.Logger; +import peers.sip.RFC3261; +import peers.sip.Utils; +import peers.sip.syntaxencoding.NameAddress; +import peers.sip.syntaxencoding.SipHeaderFieldMultiValue; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaderParamName; +import peers.sip.syntaxencoding.SipHeaders; +import peers.sip.syntaxencoding.SipURI; +import peers.sip.syntaxencoding.SipUriSyntaxException; +import peers.sip.transport.SipRequest; + + +public class Dialog { + + public static final char ID_SEPARATOR = '|'; + public static final int EMPTY_CSEQ = -1; + + public final DialogState INIT; + public final DialogState EARLY; + public final DialogState CONFIRMED; + public final DialogState TERMINATED; + + private DialogState state; + + private String callId; + private String localTag; + private String remoteTag; + + private int localCSeq; + private int remoteCSeq; + private String localUri; + private String remoteUri; + private String remoteTarget; + private boolean secure; + private ArrayList routeSet; + + + Dialog(String callId, String localTag, String remoteTag) { + super(); + this.callId = callId; + this.localTag = localTag; + this.remoteTag = remoteTag; + + INIT = new DialogStateInit(getId(), this); + state = INIT; + EARLY = new DialogStateEarly(getId(), this); + CONFIRMED = new DialogStateConfirmed(getId(), this); + TERMINATED = new DialogStateTerminated(getId(), this); + + localCSeq = EMPTY_CSEQ; + remoteCSeq = EMPTY_CSEQ; + } + + public void receivedOrSent1xx() { + state.receivedOrSent101To199(); + } + + public void receivedOrSent2xx() { + state.receivedOrSent2xx(); + } + + public void receivedOrSent300To699() { + state.receivedOrSent300To699(); + } + + public void receivedOrSentBye() { + state.receivedOrSentBye(); + } + + public void setState(DialogState state) { + this.state.log(state); + this.state = state; + } + + public SipRequest buildSubsequentRequest(String method) { + //12.2.1.1 + SipURI sipUri; + try { + sipUri = new SipURI(remoteTarget); + } catch (SipUriSyntaxException e) { + throw new RuntimeException(e); + //TODO check remote target when message is received + } + SipRequest subsequentRequest = new SipRequest(method, sipUri); + SipHeaders headers = subsequentRequest.getSipHeaders(); + + //To + + SipHeaderFieldValue to = new SipHeaderFieldValue( + new NameAddress(remoteUri).toString()); + if (remoteTag != null) { + to.addParam(new SipHeaderParamName(RFC3261.PARAM_TAG), remoteTag); + } + headers.add(new SipHeaderFieldName(RFC3261.HDR_TO), to); + + //From + + SipHeaderFieldValue from = new SipHeaderFieldValue( + new NameAddress(localUri).toString()); + if (localTag != null) { + from.addParam(new SipHeaderParamName(RFC3261.PARAM_TAG), localTag); + } + headers.add(new SipHeaderFieldName(RFC3261.HDR_FROM), from); + + //Call-ID + + SipHeaderFieldValue callIdValue = new SipHeaderFieldValue(callId); + headers.add(new SipHeaderFieldName(RFC3261.HDR_CALLID), callIdValue); + + //CSeq + + if (localCSeq == Dialog.EMPTY_CSEQ) { + localCSeq = ((int)(System.currentTimeMillis() / 1000) & 0xFFFFFFFE) >> 1; + } else { + localCSeq++; + } + headers.add(new SipHeaderFieldName(RFC3261.HDR_CSEQ), + new SipHeaderFieldValue(localCSeq + " " + method)); + + //Route + + if (!routeSet.isEmpty()) { + if (routeSet.get(0).contains(RFC3261.LOOSE_ROUTING)) { + ArrayList routes = new ArrayList(); + for (String route : routeSet) { + routes.add(new SipHeaderFieldValue(route)); + } + headers.add(new SipHeaderFieldName(RFC3261.HDR_ROUTE), + new SipHeaderFieldMultiValue(routes)); + } else { + Logger.error("Trying to forward to a strict router, forbidden in this implementation"); + } + } + + Utils.addCommonHeaders(headers); + + return subsequentRequest; + } + + public String getId() { + StringBuffer buf = new StringBuffer(); + buf.append(callId).append(ID_SEPARATOR); + buf.append(localTag).append(ID_SEPARATOR); + buf.append(remoteTag); + return buf.toString(); + } + + public String getCallId() { + return callId; + } + + public void setCallId(String callId) { + this.callId = callId; + } + + public int getLocalCSeq() { + return localCSeq; + } + + public void setLocalCSeq(int localCSeq) { + this.localCSeq = localCSeq; + } + + public String getLocalUri() { + return localUri; + } + + public void setLocalUri(String localUri) { + this.localUri = localUri; + } + + public int getRemoteCSeq() { + return remoteCSeq; + } + + public void setRemoteCSeq(int remoteCSeq) { + this.remoteCSeq = remoteCSeq; + } + + public String getRemoteTarget() { + return remoteTarget; + } + + public void setRemoteTarget(String remoteTarget) { + this.remoteTarget = remoteTarget; + } + + public String getRemoteUri() { + return remoteUri; + } + + public void setRemoteUri(String remoteUri) { + this.remoteUri = remoteUri; + } + + public ArrayList getRouteSet() { + return routeSet; + } + + public void setRouteSet(ArrayList routeSet) { + this.routeSet = routeSet; + } + + public boolean isSecure() { + return secure; + } + + public void setSecure(boolean secure) { + this.secure = secure; + } + + public String getLocalTag() { + return localTag; + } + + public void setLocalTag(String localTag) { + this.localTag = localTag; + } + + public String getRemoteTag() { + return remoteTag; + } + + public void setRemoteTag(String remoteTag) { + this.remoteTag = remoteTag; + } + + public DialogState getState() { + return state; + } + + +} diff --git a/src/peers/sip/transactionuser/DialogManager.java b/src/peers/sip/transactionuser/DialogManager.java new file mode 100644 index 0000000..d61b573 --- /dev/null +++ b/src/peers/sip/transactionuser/DialogManager.java @@ -0,0 +1,115 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transactionuser; + +import java.util.Collection; +import java.util.Hashtable; + + +import peers.sip.RFC3261; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaderParamName; +import peers.sip.syntaxencoding.SipHeaders; +import peers.sip.transport.SipMessage; +import peers.sip.transport.SipResponse; + + +public class DialogManager { + + private Hashtable dialogs; + + + public DialogManager() { + dialogs = new Hashtable(); + } + + /** + * @param sipResponse sip response must contain a To tag, a + * From tag and a Call-ID + * @return the new Dialog created + */ + public synchronized Dialog createDialog(SipResponse sipResponse) { + SipHeaders sipHeaders = sipResponse.getSipHeaders(); + String callID = sipHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_CALLID)).toString(); + SipHeaderFieldValue from = sipHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_FROM)); + SipHeaderFieldValue to = sipHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_TO)); + String fromTag = from.getParam(new SipHeaderParamName(RFC3261.PARAM_TAG)); + String toTag = to.getParam(new SipHeaderParamName(RFC3261.PARAM_TAG)); + Dialog dialog; + if (sipHeaders.get(new SipHeaderFieldName(RFC3261.HDR_VIA)) == null) { + //createDialog is called from UAS side, in layer Transaction User + dialog = new Dialog(callID, toTag, fromTag); + } else { + //createDialog is called from UAC side, in syntax encoding layer + dialog = new Dialog(callID, fromTag, toTag); + } + dialogs.put(dialog.getId(), dialog); + return dialog; + } + + public void removeDialog(String dialogId) { + dialogs.remove(dialogId); + } + + public synchronized Dialog getDialog(SipMessage sipMessage) { + SipHeaders sipHeaders = sipMessage.getSipHeaders(); + String callID = sipHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_CALLID)).toString(); + SipHeaderFieldValue from = sipHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_FROM)); + SipHeaderFieldValue to = sipHeaders.get( + new SipHeaderFieldName(RFC3261.HDR_TO)); + SipHeaderParamName tagName = new SipHeaderParamName(RFC3261.PARAM_TAG); + String fromTag = from.getParam(tagName); + String toTag = to.getParam(tagName); + Dialog dialog = dialogs.get(getDialogId(callID, fromTag, toTag)); + if (dialog != null) { + return dialog; + } + return dialogs.get(getDialogId(callID, toTag, fromTag)); + } + + public synchronized Dialog getDialog(String callId) { + for (Dialog dialog : dialogs.values()) { + if (dialog.getCallId().equals(callId)) { + return dialog; + } + } + return null; + } + + private String getDialogId(String callID, String localTag, String remoteTag) { + StringBuffer buf = new StringBuffer(); + buf.append(callID); + buf.append(Dialog.ID_SEPARATOR); + buf.append(localTag); + buf.append(Dialog.ID_SEPARATOR); + buf.append(remoteTag); + return buf.toString(); + } + + public Collection getDialogCollection() { + return dialogs.values(); + } +} diff --git a/src/peers/sip/transactionuser/DialogState.java b/src/peers/sip/transactionuser/DialogState.java new file mode 100644 index 0000000..c1ba8ca --- /dev/null +++ b/src/peers/sip/transactionuser/DialogState.java @@ -0,0 +1,40 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transactionuser; + + +import peers.sip.AbstractState; + +public abstract class DialogState extends AbstractState { + + protected Dialog dialog; + + public DialogState(String id, Dialog dialog) { + super(id); + this.dialog = dialog; + } + + public void receivedOrSent101To199() {} + public void receivedOrSent2xx() {} + public void receivedOrSent300To699() {} + //sent or received a BYE for RFC3261 + public void receivedOrSentBye() {} + +} diff --git a/src/peers/sip/transactionuser/DialogStateConfirmed.java b/src/peers/sip/transactionuser/DialogStateConfirmed.java new file mode 100644 index 0000000..30a8b18 --- /dev/null +++ b/src/peers/sip/transactionuser/DialogStateConfirmed.java @@ -0,0 +1,55 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transactionuser; + + +import org.pmw.tinylog.Logger; + +public class DialogStateConfirmed extends DialogState { + + public DialogStateConfirmed(String id, Dialog dialog) { + super(id, dialog); + } + + @Override + public void receivedOrSent101To199() { + Logger.error(id + " invalid transition"); + throw new IllegalStateException(); + } + + @Override + public void receivedOrSent2xx() { + Logger.error(id + " invalid transition"); + throw new IllegalStateException(); + } + + @Override + public void receivedOrSent300To699() { + Logger.error(id + " invalid transition"); + throw new IllegalStateException(); + } + + @Override + public void receivedOrSentBye() { + DialogState nextState = dialog.TERMINATED; + dialog.setState(nextState); + } + +} diff --git a/src/peers/sip/transactionuser/DialogStateEarly.java b/src/peers/sip/transactionuser/DialogStateEarly.java new file mode 100644 index 0000000..292d27c --- /dev/null +++ b/src/peers/sip/transactionuser/DialogStateEarly.java @@ -0,0 +1,54 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transactionuser; + + +import org.pmw.tinylog.Logger; + +public class DialogStateEarly extends DialogState { + + public DialogStateEarly(String id, Dialog dialog) { + super(id, dialog); + } + + @Override + public void receivedOrSent101To199() { + DialogState nextState = dialog.EARLY; + dialog.setState(nextState); + } + + @Override + public void receivedOrSent2xx() { + DialogState nextState = dialog.CONFIRMED; + dialog.setState(nextState); + } + + @Override + public void receivedOrSent300To699() { + DialogState nextState = dialog.TERMINATED; + dialog.setState(nextState); + } + + @Override + public void receivedOrSentBye() { + Logger.error(id + " invalid transition"); + throw new IllegalStateException(); + } +} diff --git a/src/peers/sip/transactionuser/DialogStateInit.java b/src/peers/sip/transactionuser/DialogStateInit.java new file mode 100644 index 0000000..e3b4c4c --- /dev/null +++ b/src/peers/sip/transactionuser/DialogStateInit.java @@ -0,0 +1,54 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transactionuser; + + +import org.pmw.tinylog.Logger; + +public class DialogStateInit extends DialogState { + + public DialogStateInit(String id, Dialog dialog) { + super(id, dialog); + } + + @Override + public void receivedOrSent101To199() { + DialogState nextState = dialog.EARLY; + dialog.setState(nextState); + } + + @Override + public void receivedOrSent2xx() { + DialogState nextState = dialog.CONFIRMED; + dialog.setState(nextState); + } + + @Override + public void receivedOrSent300To699() { + DialogState nextState = dialog.TERMINATED; + dialog.setState(nextState); + } + + @Override + public void receivedOrSentBye() { + Logger.error(id + " invalid transition"); + throw new IllegalStateException(); + } +} diff --git a/src/peers/sip/transactionuser/DialogStateTerminated.java b/src/peers/sip/transactionuser/DialogStateTerminated.java new file mode 100644 index 0000000..2b38e58 --- /dev/null +++ b/src/peers/sip/transactionuser/DialogStateTerminated.java @@ -0,0 +1,55 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007-2013 Yohann Martineau +*/ + +package peers.sip.transactionuser; + + +import org.pmw.tinylog.Logger; + +public class DialogStateTerminated extends DialogState { + + public DialogStateTerminated(String id, Dialog dialog) { + super(id, dialog); + } + + @Override + public void receivedOrSent101To199() { + Logger.error(id + " invalid transition"); + throw new IllegalStateException(); + } + + @Override + public void receivedOrSent2xx() { + Logger.error(id + " invalid transition"); + throw new IllegalStateException(); + } + + @Override + public void receivedOrSent300To699() { + Logger.error(id + " invalid transition"); + throw new IllegalStateException(); + } + + @Override + public void receivedOrSentBye() { + //ignore bye retransmissions +// Logger.error(id + " invalid transition"); +// throw new IllegalStateException(); + } +} diff --git a/src/peers/sip/transport/MessageReceiver.java b/src/peers/sip/transport/MessageReceiver.java new file mode 100644 index 0000000..0c1dbcf --- /dev/null +++ b/src/peers/sip/transport/MessageReceiver.java @@ -0,0 +1,205 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transport; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.net.InetAddress; + +import org.pmw.tinylog.Logger; +import peers.Config; + +import peers.sip.RFC3261; +import peers.sip.Utils; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaderParamName; +import peers.sip.syntaxencoding.SipParserException; +import peers.sip.transaction.ClientTransaction; +import peers.sip.transaction.ServerTransaction; +import peers.sip.transaction.TransactionManager; + +public abstract class MessageReceiver implements Runnable { + + public static final int BUFFER_SIZE = 2048;//FIXME should correspond to MTU 1024; + public static final String CHARACTER_ENCODING = "US-ASCII"; + + protected int port; + private boolean isListening; + + //private UAS uas; + private SipServerTransportUser sipServerTransportUser; + private TransactionManager transactionManager; + private TransportManager transportManager; + private Config config; + + + public MessageReceiver(int port, TransactionManager transactionManager, + TransportManager transportManager, Config config) { + super(); + this.port = port; + this.transactionManager = transactionManager; + this.transportManager = transportManager; + this.config = config; + isListening = true; + } + + public void run() { + while (isListening) { + try { + listen(); + } catch (IOException e) { + Logger.error("input/output error", e); + } + } + } + + protected abstract void listen() throws IOException; + + protected boolean isRequest(byte[] message) { + String beginning = null; + try { + beginning = new String(message, 0, + RFC3261.DEFAULT_SIP_VERSION.length(), CHARACTER_ENCODING); + } catch (UnsupportedEncodingException e) { + Logger.error("unsupported encoding", e); + } + if (RFC3261.DEFAULT_SIP_VERSION.equals(beginning)) { + return false; + } + return true; + } + + protected void processMessage(byte[] message, InetAddress sourceIp, + int sourcePort, String transport) throws IOException { + ByteArrayInputStream byteArrayInputStream = + new ByteArrayInputStream(message); + InputStreamReader inputStreamReader = new InputStreamReader( + byteArrayInputStream); + BufferedReader reader = new BufferedReader(inputStreamReader); + String startLine = reader.readLine(); + while ("".equals(startLine)) { + startLine = reader.readLine(); + } + if (startLine == null) { + return; + } + if (!startLine.contains(RFC3261.DEFAULT_SIP_VERSION)) { + // keep-alive, send back to sender + SipTransportConnection sipTransportConnection = + new SipTransportConnection(config.getLocalInetAddress(), + port, sourceIp, sourcePort, transport); + MessageSender messageSender = transportManager.getMessageSender( + sipTransportConnection); + if (messageSender != null) { + messageSender.sendBytes(message); + } + return; + } + StringBuffer direction = new StringBuffer(); + direction.append("RECEIVED from ").append(sourceIp.getHostAddress()); + direction.append("/").append(sourcePort); + Logger.info(new String(message),direction.toString()); + SipMessage sipMessage = null; + try { + sipMessage = transportManager.sipParser.parse( + new ByteArrayInputStream(message)); + } catch (IOException e) { + Logger.error("input/output error", e); + } catch (SipParserException e) { + Logger.error("SIP parser error", e); + } + if (sipMessage == null) { + return; + } + + // RFC3261 18.2 + + if (sipMessage instanceof SipRequest) { + SipRequest sipRequest = (SipRequest)sipMessage; + + + SipHeaderFieldValue topVia = Utils.getTopVia(sipRequest); + String sentBy = + topVia.getParam(new SipHeaderParamName(RFC3261.PARAM_SENTBY)); + if (sentBy != null) { + int colonPos = sentBy.indexOf(RFC3261.TRANSPORT_PORT_SEP); + if (colonPos < 0) { + colonPos = sentBy.length(); + } + sentBy = sentBy.substring(0, colonPos); + if (!InetAddress.getByName(sentBy).equals(sourceIp)) { + topVia.addParam(new SipHeaderParamName( + RFC3261.PARAM_RECEIVED), + sourceIp.getHostAddress()); + } + } + //RFC3581 + //TODO check rport configuration + SipHeaderParamName rportName = new SipHeaderParamName( + RFC3261.PARAM_RPORT); + String rport = topVia.getParam(rportName); + if (rport != null && "".equals(rport)) { + topVia.removeParam(rportName); + topVia.addParam(rportName, String.valueOf(sourcePort)); + } + + ServerTransaction serverTransaction = + transactionManager.getServerTransaction(sipRequest); + if (serverTransaction == null) { + //uas.messageReceived(sipMessage); + sipServerTransportUser.messageReceived(sipMessage); + } else { + serverTransaction.receivedRequest(sipRequest); + } + } else { + SipResponse sipResponse = (SipResponse)sipMessage; + ClientTransaction clientTransaction = + transactionManager.getClientTransaction(sipResponse); + Logger.debug("ClientTransaction = " + clientTransaction); + if (clientTransaction == null) { + //uas.messageReceived(sipMessage); + sipServerTransportUser.messageReceived(sipMessage); + } else { + clientTransaction.receivedResponse(sipResponse); + } + } + } + + public synchronized void setListening(boolean isListening) { + this.isListening = isListening; + } + + public synchronized boolean isListening() { + return isListening; + } + + public void setSipServerTransportUser( + SipServerTransportUser sipServerTransportUser) { + this.sipServerTransportUser = sipServerTransportUser; + } + +// public void setUas(UAS uas) { +// this.uas = uas; +// } + +} diff --git a/src/peers/sip/transport/MessageSender.java b/src/peers/sip/transport/MessageSender.java new file mode 100644 index 0000000..64496ca --- /dev/null +++ b/src/peers/sip/transport/MessageSender.java @@ -0,0 +1,102 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007-2013 Yohann Martineau +*/ + +package peers.sip.transport; + +import java.io.IOException; +import java.net.InetAddress; +import java.util.Timer; +import java.util.TimerTask; + +import org.pmw.tinylog.Logger; +import peers.Config; + +import peers.sip.RFC3261; + + +public abstract class MessageSender { + + public static final int KEEY_ALIVE_INTERVAL = 25; // seconds + + protected InetAddress inetAddress; + protected int port; + protected int localPort; + private Config config; + private String transportName; + private Timer timer; + + public MessageSender(int localPort, InetAddress inetAddress, + int port, Config config, + String transportName) { + super(); + this.localPort = localPort; + this.inetAddress = inetAddress; + this.port = port; + this.config = config; + this.transportName = transportName; + timer = new Timer(getClass().getSimpleName() + " " + + Timer.class.getSimpleName()); + //TODO check config + timer.scheduleAtFixedRate(new KeepAlive(), 0, + 1000 * KEEY_ALIVE_INTERVAL); + } + + public abstract void sendMessage(SipMessage sipMessage) throws IOException; + public abstract void sendBytes(byte[] bytes) throws IOException; + + public String getContact() { + StringBuffer buf = new StringBuffer(); + InetAddress myAddress = config.getPublicInetAddress(); + if (myAddress == null) { + myAddress = config.getLocalInetAddress(); + } + buf.append(myAddress.getHostAddress()); + buf.append(RFC3261.TRANSPORT_PORT_SEP); + //buf.append(config.getSipPort()); + buf.append(localPort); + buf.append(RFC3261.PARAM_SEPARATOR); + buf.append(RFC3261.PARAM_TRANSPORT); + buf.append(RFC3261.PARAM_ASSIGNMENT); + buf.append(transportName); + return buf.toString(); + } + + public int getLocalPort() { + return localPort; + } + + public void stopKeepAlives() { + timer.cancel(); + } + + class KeepAlive extends TimerTask { + + @Override + public void run() { + byte[] bytes = (RFC3261.CRLF + RFC3261.CRLF).getBytes(); + try { + sendBytes(bytes); + } catch (IOException e) { + Logger.error(e.getMessage(), e); + } + } + + } + +} diff --git a/src/peers/sip/transport/SipClientTransportUser.java b/src/peers/sip/transport/SipClientTransportUser.java new file mode 100644 index 0000000..94d570e --- /dev/null +++ b/src/peers/sip/transport/SipClientTransportUser.java @@ -0,0 +1,27 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transport; + + +public interface SipClientTransportUser { + + public void requestTransportError(SipRequest sipRequest, Exception e); + public void responseTransportError(Exception e); +} diff --git a/src/peers/sip/transport/SipMessage.java b/src/peers/sip/transport/SipMessage.java new file mode 100644 index 0000000..1c4679d --- /dev/null +++ b/src/peers/sip/transport/SipMessage.java @@ -0,0 +1,80 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transport; + +import peers.sip.RFC3261; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaders; + +public abstract class SipMessage { + + protected String sipVersion; + protected SipHeaders sipHeaders; + protected byte[] body; + + public SipMessage() { + sipVersion = RFC3261.DEFAULT_SIP_VERSION; + sipHeaders = new SipHeaders(); + } + + public String getSipVersion() { + return sipVersion; + } + + public void setSipHeaders(SipHeaders sipHeaders) { + this.sipHeaders = sipHeaders; + } + + public SipHeaders getSipHeaders() { + return sipHeaders; + } + + public byte[] getBody() { + return body; + } + + public void setBody(byte[] body) { + SipHeaderFieldName contentLengthName = + new SipHeaderFieldName(RFC3261.HDR_CONTENT_LENGTH); + SipHeaderFieldValue contentLengthValue = + sipHeaders.get(contentLengthName); + if (contentLengthValue == null) { + contentLengthValue = new SipHeaderFieldValue( + String.valueOf(body.length)); + sipHeaders.add(contentLengthName, contentLengthValue); + } else { + contentLengthValue.setValue(String.valueOf(body.length)); + } + this.body = body; + } + + @Override + public String toString() { + StringBuffer buf = new StringBuffer(); + buf.append(sipHeaders.toString()); + buf.append(RFC3261.CRLF); + if (body != null) { + buf.append(new String(body)); + } + return buf.toString(); + } + +} diff --git a/src/peers/sip/transport/SipRequest.java b/src/peers/sip/transport/SipRequest.java new file mode 100644 index 0000000..69167f8 --- /dev/null +++ b/src/peers/sip/transport/SipRequest.java @@ -0,0 +1,53 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transport; + +import peers.sip.RFC3261; +import peers.sip.syntaxencoding.SipURI; + +public class SipRequest extends SipMessage { + protected String method; + protected SipURI requestUri; + //protected String requestUri; + + public SipRequest(String method, SipURI requestUri) { + super(); + this.method = method; + this.requestUri = requestUri; + } + + @Override + public String toString() { + StringBuffer buf = new StringBuffer(); + buf.append(method).append(' ').append(requestUri).append( + ' ').append(RFC3261.DEFAULT_SIP_VERSION).append(RFC3261.CRLF); + buf.append(super.toString()); + return buf.toString(); + } + + public String getMethod() { + return method; + } + + public SipURI getRequestUri() { + return requestUri; + } + +} diff --git a/src/peers/sip/transport/SipResponse.java b/src/peers/sip/transport/SipResponse.java new file mode 100644 index 0000000..95a52c5 --- /dev/null +++ b/src/peers/sip/transport/SipResponse.java @@ -0,0 +1,50 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transport; + +import peers.sip.RFC3261; + +public class SipResponse extends SipMessage { + protected int statusCode; + protected String reasonPhrase; + + public SipResponse(int statusCode, String reasonPhrase) { + this.statusCode = statusCode; + this.reasonPhrase = reasonPhrase; + } + + @Override + public String toString() { + StringBuffer buf = new StringBuffer(); + buf.append(RFC3261.DEFAULT_SIP_VERSION).append(' ').append(statusCode + ).append(' ').append(reasonPhrase).append(RFC3261.CRLF); + buf.append(super.toString()); + return buf.toString(); + } + + public int getStatusCode() { + return statusCode; + } + + public String getReasonPhrase() { + return reasonPhrase; + } + +} diff --git a/src/peers/sip/transport/SipServerTransportUser.java b/src/peers/sip/transport/SipServerTransportUser.java new file mode 100644 index 0000000..27f10f8 --- /dev/null +++ b/src/peers/sip/transport/SipServerTransportUser.java @@ -0,0 +1,25 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transport; + +public interface SipServerTransportUser { + + public void messageReceived(SipMessage sipMessage); +} diff --git a/src/peers/sip/transport/SipTransportConnection.java b/src/peers/sip/transport/SipTransportConnection.java new file mode 100644 index 0000000..167b99b --- /dev/null +++ b/src/peers/sip/transport/SipTransportConnection.java @@ -0,0 +1,123 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007-2013 Yohann Martineau +*/ + +package peers.sip.transport; + +import java.net.InetAddress; + +import peers.sip.RFC3261; + +public class SipTransportConnection { + + public static final int EMPTY_PORT = -1; + + private InetAddress localInetAddress; + private int localPort = EMPTY_PORT; + + private InetAddress remoteInetAddress; + private int remotePort = EMPTY_PORT; + + private String transport;// UDP, TCP or SCTP + + public SipTransportConnection(InetAddress localInetAddress, + int localPort, InetAddress remoteInetAddress, int remotePort, + String transport) { + this.localInetAddress = localInetAddress; + this.localPort = localPort; + this.remoteInetAddress = remoteInetAddress; + this.remotePort = remotePort; + this.transport = transport; + } + + @Override + public boolean equals(Object obj) { + if (obj.getClass() != SipTransportConnection.class) { + return false; + } + SipTransportConnection other = (SipTransportConnection)obj; + if (!transport.equalsIgnoreCase(other.transport)) { + return false; + } + if (RFC3261.TRANSPORT_UDP.equalsIgnoreCase(transport)) { + return localInetAddress.equals(other.localInetAddress) && + localPort == other.localPort; + } + return false; + } + + @Override + public String toString() { + StringBuffer buf = new StringBuffer(); + appendInetAddress(buf, localInetAddress); + buf.append(':'); + appendPort(buf, localPort); + buf.append('/'); + if (!RFC3261.TRANSPORT_UDP.equalsIgnoreCase(transport)) { + appendInetAddress(buf, remoteInetAddress); + buf.append(':'); + appendPort(buf, remotePort); + buf.append('/'); + } + buf.append(transport.toUpperCase()); + return buf.toString(); + } + + private void appendInetAddress(StringBuffer buf, InetAddress inetAddress) { + if (inetAddress != null) { + buf.append(inetAddress.getHostAddress()); + } else { + buf.append("-"); + } + } + + private void appendPort(StringBuffer buf, int port) { + if (port != EMPTY_PORT) { + buf.append(port); + } else { + buf.append("-"); + } + } + + @Override + public int hashCode() { + return toString().hashCode(); + } + + public InetAddress getLocalInetAddress() { + return localInetAddress; + } + + public int getLocalPort() { + return localPort; + } + + public InetAddress getRemoteInetAddress() { + return remoteInetAddress; + } + + public int getRemotePort() { + return remotePort; + } + + public String getTransport() { + return transport; + } + + +} diff --git a/src/peers/sip/transport/TransportManager.java b/src/peers/sip/transport/TransportManager.java new file mode 100644 index 0000000..7d302d1 --- /dev/null +++ b/src/peers/sip/transport/TransportManager.java @@ -0,0 +1,479 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007-2013 Yohann Martineau +*/ + +package peers.sip.transport; + +import static peers.sip.RFC3261.DEFAULT_SIP_VERSION; +import static peers.sip.RFC3261.IPV4_TTL; +import static peers.sip.RFC3261.PARAM_MADDR; +import static peers.sip.RFC3261.PARAM_TTL; +import static peers.sip.RFC3261.TRANSPORT_DEFAULT_PORT; +import static peers.sip.RFC3261.TRANSPORT_PORT_SEP; +import static peers.sip.RFC3261.TRANSPORT_SCTP; +import static peers.sip.RFC3261.TRANSPORT_TCP; +import static peers.sip.RFC3261.TRANSPORT_TLS_PORT; +import static peers.sip.RFC3261.TRANSPORT_UDP; +import static peers.sip.RFC3261.TRANSPORT_UDP_USUAL_MAX_SIZE; +import static peers.sip.RFC3261.TRANSPORT_VIA_SEP; +import static peers.sip.RFC3261.TRANSPORT_VIA_SEP2; + +import java.io.IOException; +import java.net.DatagramSocket; +import java.net.Inet4Address; +import java.net.InetAddress; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.Hashtable; + +import org.pmw.tinylog.Logger; +import peers.Config; + +import peers.sip.RFC3261; +import peers.sip.Utils; +import peers.sip.syntaxencoding.SipHeaderFieldName; +import peers.sip.syntaxencoding.SipHeaderFieldValue; +import peers.sip.syntaxencoding.SipHeaderParamName; +import peers.sip.syntaxencoding.SipHeaders; +import peers.sip.syntaxencoding.SipParser; +import peers.sip.transaction.TransactionManager; + + +public class TransportManager { + + public static final int SOCKET_TIMEOUT = RFC3261.TIMER_T1; + + private static int NO_TTL = -1; + + + //private UAS uas; + private SipServerTransportUser sipServerTransportUser; + + protected SipParser sipParser; + + private Hashtable datagramSockets; + private Hashtable messageSenders; + private Hashtable messageReceivers; + + private TransactionManager transactionManager; + + private Config config; + private int sipPort; + + public TransportManager(TransactionManager transactionManager, + Config config ) { + sipParser = new SipParser(); + datagramSockets = new Hashtable(); + messageSenders = new Hashtable(); + messageReceivers = new Hashtable(); + this.transactionManager = transactionManager; + this.config = config; + } + + public MessageSender createClientTransport(SipRequest sipRequest, + InetAddress inetAddress, int port, String transport) + throws IOException { + return createClientTransport(sipRequest, inetAddress, port, transport, + NO_TTL); + } + + public MessageSender createClientTransport(SipRequest sipRequest, + InetAddress inetAddress, int port, String transport, int ttl) + throws IOException { + //18.1 + + //via created by transaction layer to add branchid + SipHeaderFieldValue via = Utils.getTopVia(sipRequest); + StringBuffer buf = new StringBuffer(DEFAULT_SIP_VERSION); + buf.append(TRANSPORT_VIA_SEP); + if (sipRequest.toString().getBytes().length > TRANSPORT_UDP_USUAL_MAX_SIZE) { + transport = TRANSPORT_TCP; + } + buf.append(transport); + if (inetAddress.isMulticastAddress()) { + SipHeaderParamName maddrName = new SipHeaderParamName(PARAM_MADDR); + via.addParam(maddrName, inetAddress.getHostAddress()); + if (inetAddress instanceof Inet4Address) { + SipHeaderParamName ttlName = new SipHeaderParamName(PARAM_TTL); + via.addParam(ttlName, IPV4_TTL); + } + } + //RFC3581 + //TODO check config + via.addParam(new SipHeaderParamName(RFC3261.PARAM_RPORT), ""); + + buf.append(TRANSPORT_VIA_SEP2);//space + + //TODO user server connection + + InetAddress myAddress = config.getPublicInetAddress(); + if (myAddress == null) { + myAddress = config.getLocalInetAddress(); + } + + buf.append(myAddress.getHostAddress()); //TODO use getHostName if real DNS + buf.append(TRANSPORT_PORT_SEP); + + + if (sipPort < 1) { + //use default port + if (TRANSPORT_TCP.equals(transport) || TRANSPORT_UDP.equals(transport) + || TRANSPORT_SCTP.equals(transport)) { + sipPort = TRANSPORT_DEFAULT_PORT; + } else if (TRANSPORT_SCTP.equals(transport)) { + sipPort = TRANSPORT_TLS_PORT; + } else { + throw new RuntimeException("unknown transport type"); + } + } + buf.append(sipPort); + //TODO add sent-by (p. 143) Before... + + via.setValue(buf.toString()); + + SipTransportConnection connection = new SipTransportConnection( + config.getLocalInetAddress(), sipPort, inetAddress, port, + transport); + + MessageSender messageSender = messageSenders.get(connection); + if (messageSender == null) { + messageSender = createMessageSender(connection); + } + return messageSender; + } + + private String threadName(int port) { + return getClass().getSimpleName() + " " + port; + } + + public void createServerTransport(String transportType, int port) + throws SocketException { + SipTransportConnection conn = new SipTransportConnection( + config.getLocalInetAddress(), port, null, + SipTransportConnection.EMPTY_PORT, transportType); + + MessageReceiver messageReceiver = messageReceivers.get(conn); + if (messageReceiver == null) { + messageReceiver = createMessageReceiver(conn); + new Thread(messageReceiver, threadName(port)).start(); + } + if (!messageReceiver.isListening()) { + new Thread(messageReceiver, threadName(port)).start(); + } + } + + public void sendResponse(SipResponse sipResponse) throws IOException { + //18.2.2 + SipHeaderFieldValue topVia = Utils.getTopVia(sipResponse); + String topViaValue = topVia.getValue(); + StringBuffer buf = new StringBuffer(topViaValue); + String hostport = null; + int i = topViaValue.length() - 1; + while (i > 0) { + char c = buf.charAt(i); + if (c == ' ' || c == '\t') { + hostport = buf.substring(i + 1); + break; + } + --i; + } + if (hostport == null) { + throw new RuntimeException("host or ip address not found in top via"); + } + String host; + int port; + int colonPos = hostport.indexOf(RFC3261.TRANSPORT_PORT_SEP); + if (colonPos > -1) { + host = hostport.substring(0, colonPos); + port = Integer.parseInt( + hostport.substring(colonPos + 1, hostport.length())); + } else { + host = hostport; + port = RFC3261.TRANSPORT_DEFAULT_PORT; + } + + String transport; + if (buf.indexOf(RFC3261.TRANSPORT_TCP) > -1) { + transport = RFC3261.TRANSPORT_TCP; + } else if (buf.indexOf(RFC3261.TRANSPORT_UDP) > -1) { + transport = RFC3261.TRANSPORT_UDP; + } else { + Logger.error("no transport found in top via header, discarding response"); + + return; + } + + String received = + topVia.getParam(new SipHeaderParamName(RFC3261.PARAM_RECEIVED)); + if (received != null) { + host = received; + } + //RFC3581 + //TODO check config + String rport = topVia.getParam(new SipHeaderParamName( + RFC3261.PARAM_RPORT)); + if (rport != null && !"".equals(rport.trim())) { + port = Integer.parseInt(rport); + } + SipTransportConnection connection; + try { + connection = new SipTransportConnection(config.getLocalInetAddress(), + sipPort, InetAddress.getByName(host), + port, transport); + } catch (UnknownHostException e) { + Logger.error("unknwon host {}", e); + return; + } + + //actual sending + + //TODO manage maddr parameter in top via for multicast + if (buf.indexOf(RFC3261.TRANSPORT_TCP) > -1) { +// Socket socket = (Socket)factory.connections.get(connection); +// if (!socket.isClosed()) { +// try { +// socket.getOutputStream().write(data); +// } catch (IOException e) { +// e.printStackTrace(); +// return; +// //TODO +// } +// } else { +// try { +// socket = new Socket(host, port); +// factory.connections.put(connection, socket); +// socket.getOutputStream().write(data); +// } catch (IOException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// /* +// * TODO +// * If connection attempt fails, use the procedures in RFC3263 +// * for servers in order to determine the IP address and +// * port to open the connection and send the response to. +// */ +// return; +// } +// } + } else { + MessageSender messageSender = messageSenders.get(connection); + if (messageSender == null) { + messageSender = createMessageSender(connection); + } + //add contact header + SipHeaderFieldName contactName = new SipHeaderFieldName(RFC3261.HDR_CONTACT); + SipHeaders respHeaders = sipResponse.getSipHeaders(); + StringBuffer contactBuf = new StringBuffer(); + contactBuf.append(RFC3261.LEFT_ANGLE_BRACKET); + contactBuf.append(RFC3261.SIP_SCHEME); + contactBuf.append(RFC3261.SCHEME_SEPARATOR); + contactBuf.append(messageSender.getContact()); + contactBuf.append(RFC3261.RIGHT_ANGLE_BRACKET); + respHeaders.add(contactName, new SipHeaderFieldValue(contactBuf.toString())); + messageSender.sendMessage(sipResponse); + + } + + + } + + private MessageSender createMessageSender(final SipTransportConnection conn) + throws IOException { + MessageSender messageSender = null; + Object socket = null; + if (RFC3261.TRANSPORT_UDP.equalsIgnoreCase(conn.getTransport())) { + //TODO use Utils.getMyAddress to create socket on appropriate NIC + DatagramSocket datagramSocket = datagramSockets.get(conn); + if (datagramSocket == null) { + Logger.debug("new DatagramSocket(" + conn.getLocalPort() + + ", " + conn.getLocalInetAddress()); + + // AccessController.doPrivileged added for plugin compatibility + datagramSocket = AccessController.doPrivileged( + new PrivilegedAction() { + + @Override + public DatagramSocket run() { + try { + return new DatagramSocket(conn.getLocalPort(), + conn.getLocalInetAddress()); + } catch (SocketException e) { + + Logger.error("cannot create socket", e); + } catch (SecurityException e) { + Logger.error("security exception", e); + } + return null; + } + } + ); + if (datagramSocket == null) { + throw new SocketException(); + } + datagramSocket.setSoTimeout(SOCKET_TIMEOUT); + datagramSockets.put(conn, datagramSocket); + Logger.info("added datagram socket " + conn); + } + socket = datagramSocket; + messageSender = new UdpMessageSender(conn.getRemoteInetAddress(), + conn.getRemotePort(), datagramSocket, config); + } else { + // TODO + // messageReceiver = new TcpMessageReceiver(port); + } + messageSenders.put(conn, messageSender); + //when a mesage is sent over a transport, the transport layer + //must also be able to receive messages on this transport + +// MessageReceiver messageReceiver = +// createMessageReceiver(conn, socket); + MessageReceiver messageReceiver = messageReceivers.get(conn); + if (messageReceiver == null) { + messageReceiver = createMessageReceiver(conn, socket); + new Thread(messageReceiver, threadName(conn.getLocalPort())).start(); + } +// if (RFC3261.TRANSPORT_UDP.equalsIgnoreCase(conn.getTransport())) { +// messageSender = new UdpMessageSender(conn.getRemoteInetAddress(), +// conn.getRemotePort(), (DatagramSocket)socket, config); +// messageSenders.put(conn, messageSender); +// } + return messageSender; + } + + private MessageReceiver createMessageReceiver(SipTransportConnection conn, + Object socket) throws IOException { + MessageReceiver messageReceiver = null; + if (RFC3261.TRANSPORT_UDP.equalsIgnoreCase(conn.getTransport())) { + DatagramSocket datagramSocket = (DatagramSocket)socket; + messageReceiver = new UdpMessageReceiver(datagramSocket, + transactionManager, this, config); + messageReceiver.setSipServerTransportUser(sipServerTransportUser); + } + messageReceivers.put(conn, messageReceiver); + return messageReceiver; + } + + private MessageReceiver createMessageReceiver(final SipTransportConnection conn) + throws SocketException { + MessageReceiver messageReceiver = null; + SipTransportConnection sipTransportConnection = conn; + if (RFC3261.TRANSPORT_UDP.equals(conn.getTransport())) { + DatagramSocket datagramSocket = datagramSockets.get(conn); + if (datagramSocket == null) { + Logger.debug("new DatagramSocket(" + conn.getLocalPort() + + ", " + conn.getLocalInetAddress()); + // AccessController.doPrivileged added for plugin compatibility + datagramSocket = AccessController.doPrivileged( + new PrivilegedAction() { + + @Override + public DatagramSocket run() { + try { + return new DatagramSocket(conn.getLocalPort(), + conn.getLocalInetAddress()); + } catch (SocketException e) { + Logger.error("cannot create socket", e); + } catch (SecurityException e) { + Logger.error("security exception", e); + } + return null; + } + } + ); + datagramSocket.setSoTimeout(SOCKET_TIMEOUT); + if (conn.getLocalPort() == 0) { + sipTransportConnection = new SipTransportConnection( + conn.getLocalInetAddress(), + datagramSocket.getLocalPort(), + conn.getRemoteInetAddress(), + conn.getRemotePort(), + conn.getTransport()); + //config.setSipPort(datagramSocket.getLocalPort()); + } + sipPort = datagramSocket.getLocalPort(); + datagramSockets.put(sipTransportConnection, datagramSocket); + Logger.info("added datagram socket " + sipTransportConnection); + } + messageReceiver = new UdpMessageReceiver(datagramSocket, + transactionManager, this, config); + messageReceiver.setSipServerTransportUser(sipServerTransportUser); + //TODO create also tcp receiver using a recursive call + } else { + //TODO + //messageReceiver = new TcpMessageReceiver(port); + } + messageReceivers.put(sipTransportConnection, messageReceiver); + Logger.info("added " + sipTransportConnection + ": " + messageReceiver + + " to message receivers"); + return messageReceiver; + } + + public void setSipServerTransportUser( + SipServerTransportUser sipServerTransportUser) { + this.sipServerTransportUser = sipServerTransportUser; + } + + public void closeTransports() { + for (MessageReceiver messageReceiver: messageReceivers.values()) { + messageReceiver.setListening(false); + } + for (MessageSender messageSender: messageSenders.values()) { + messageSender.stopKeepAlives(); + } + try + { + Thread.sleep(SOCKET_TIMEOUT); + } + catch (InterruptedException e) + { + return; + } + // AccessController.doPrivileged added for plugin compatibility + AccessController.doPrivileged( + new PrivilegedAction() { + @Override + public Void run() { + for (DatagramSocket datagramSocket: datagramSockets.values()) { + datagramSocket.close(); + } + return null; + } + } + ); + + datagramSockets.clear(); + messageReceivers.clear(); + messageSenders.clear(); + } + + public MessageSender getMessageSender( + SipTransportConnection sipTransportConnection) { + return messageSenders.get(sipTransportConnection); + } + + public int getSipPort() { + return sipPort; + } + + public void setSipPort(int sipPort) { + this.sipPort = sipPort; + } + +} diff --git a/src/peers/sip/transport/UdpMessageReceiver.java b/src/peers/sip/transport/UdpMessageReceiver.java new file mode 100644 index 0000000..6607764 --- /dev/null +++ b/src/peers/sip/transport/UdpMessageReceiver.java @@ -0,0 +1,90 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transport; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.SocketException; +import java.net.SocketTimeoutException; +import java.security.AccessController; +import java.security.PrivilegedAction; + +import org.pmw.tinylog.Logger; +import peers.Config; + +import peers.sip.RFC3261; +import peers.sip.transaction.TransactionManager; + + +public class UdpMessageReceiver extends MessageReceiver { + + private DatagramSocket datagramSocket; + + public UdpMessageReceiver(DatagramSocket datagramSocket, + TransactionManager transactionManager, + TransportManager transportManager, Config config) + throws SocketException { + super(datagramSocket.getLocalPort(), transactionManager, + transportManager, config); + this.datagramSocket = datagramSocket; + } + + @Override + protected void listen() throws IOException { + byte[] buf = new byte[BUFFER_SIZE]; + final DatagramPacket packet = new DatagramPacket(buf, buf.length); + final int noException = 0; + final int socketTimeoutException = 1; + final int ioException = 2; + // AccessController.doPrivileged added for plugin compatibility + int result = AccessController.doPrivileged( + new PrivilegedAction() { + public Integer run() { + try { + datagramSocket.receive(packet); + } catch (SocketTimeoutException e) { + return socketTimeoutException; + } catch (IOException e) { + Logger.error("cannot receive packet", e); + return ioException; + } + return noException; + } + }); + switch (result) { + case socketTimeoutException: + return; + case ioException: + throw new IOException(); + case noException: + break; + default: + break; + } + byte[] trimmedPacket = new byte[packet.getLength()]; + System.arraycopy(packet.getData(), 0, + trimmedPacket, 0, trimmedPacket.length); + processMessage(trimmedPacket, packet.getAddress(), + packet.getPort(), RFC3261.TRANSPORT_UDP); + } + + +} diff --git a/src/peers/sip/transport/UdpMessageSender.java b/src/peers/sip/transport/UdpMessageSender.java new file mode 100644 index 0000000..96fa560 --- /dev/null +++ b/src/peers/sip/transport/UdpMessageSender.java @@ -0,0 +1,88 @@ +/* + This file is part of Peers, a java SIP softphone. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Copyright 2007, 2008, 2009, 2010 Yohann Martineau +*/ + +package peers.sip.transport; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketException; +import java.security.AccessController; +import java.security.PrivilegedAction; + +import org.pmw.tinylog.Logger; +import peers.Config; + +import peers.sip.RFC3261; + + +public class UdpMessageSender extends MessageSender { + + private DatagramSocket datagramSocket; + + public UdpMessageSender(InetAddress inetAddress, int port, + DatagramSocket datagramSocket, Config config) throws SocketException { + super(datagramSocket.getLocalPort(), inetAddress, port, + config, RFC3261.TRANSPORT_UDP); + this.datagramSocket = datagramSocket; + } + + @Override + public synchronized void sendMessage(SipMessage sipMessage) throws IOException { + Logger.debug("UdpMessageSender.sendMessage"); + if (sipMessage == null) { + return; + } + byte[] buf = sipMessage.toString().getBytes(); + sendBytes(buf); + StringBuffer direction = new StringBuffer(); + direction.append("SENT to ").append(inetAddress.getHostAddress()); + direction.append("/").append(port); + Logger.info(new String(buf), direction.toString()); + } + + @Override + public synchronized void sendBytes(byte[] bytes) throws IOException { + Logger.debug("UdpMessageSender.sendBytes"); + final DatagramPacket packet = new DatagramPacket(bytes, bytes.length, + inetAddress, port); + Logger.debug("UdpMessageSender.sendBytes " + bytes.length + + " " + inetAddress + ":" + port); + // AccessController.doPrivileged added for plugin compatibility + AccessController.doPrivileged( + new PrivilegedAction() { + + @Override + public Void run() { + try { + Logger.debug(datagramSocket.getLocalAddress().toString()); + datagramSocket.send(packet); + } catch (Throwable t) { + Logger.error("throwable", new Exception(t)); + } + return null; + } + } + ); + + Logger.debug("UdpMessageSender.sendBytes packet sent"); + } + +}