diff options
author | mksh <mkulish@atlassian.com> | 2015-11-10 17:51:35 +0200 |
---|---|---|
committer | mksh <mkulish@atlassian.com> | 2015-11-10 18:38:23 +0200 |
commit | 89528e58b6fb14ed59584c049f1ba81b5e319c3b (patch) | |
tree | 69c4392629b4e4cb1004b3614e5ef341ce4dab1f /src/net/java/sip/communicator | |
parent | 6d0a49965098e6cb67b4751d5079cbc22003f27a (diff) | |
download | jitsi-89528e58b6fb14ed59584c049f1ba81b5e319c3b.zip jitsi-89528e58b6fb14ed59584c049f1ba81b5e319c3b.tar.gz jitsi-89528e58b6fb14ed59584c049f1ba81b5e319c3b.tar.bz2 |
Introduce SmackProxy for abstracting different Smack implementations (3 and 4)
Diffstat (limited to 'src/net/java/sip/communicator')
8 files changed, 413 insertions, 142 deletions
diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderFactoryJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderFactoryJabberImpl.java index 4f9fc5f..a2b5fd0 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderFactoryJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderFactoryJabberImpl.java @@ -21,6 +21,7 @@ import java.util.*; import net.java.sip.communicator.service.protocol.*; +import net.java.sip.communicator.service.protocol.jabber.*; import org.jivesoftware.smack.provider.*; import org.jivesoftware.smack.util.*; import org.osgi.framework.*; @@ -46,7 +47,14 @@ public class ProtocolProviderFactoryJabberImpl { try { + + // Set the extension provider manager for classes that use + // it directly ProviderManager.setInstance(new ProviderManagerExt()); + // Set the Smack interop implementation for the classes that need + // to support Smackv4 interoperation + AbstractSmackInteroperabilityLayer.setImplementationClass( + SmackV3InteroperabilityLayer.class); } catch(Throwable t) { diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/SmackV3InteroperabilityLayer.java b/src/net/java/sip/communicator/impl/protocol/jabber/SmackV3InteroperabilityLayer.java new file mode 100644 index 0000000..d5af26f --- /dev/null +++ b/src/net/java/sip/communicator/impl/protocol/jabber/SmackV3InteroperabilityLayer.java @@ -0,0 +1,91 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Copyright @ 2015 Atlassian Pty Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.java.sip.communicator.impl.protocol.jabber; + +import net.java.sip.communicator.service.protocol.jabber.*; +import org.jivesoftware.smack.provider.*; + +/** + * Smack v3 interoperation layer + * + * @author Maksym Kulish + */ +public class SmackV3InteroperabilityLayer + extends AbstractSmackInteroperabilityLayer +{ + + /** + * A SmackV3 ProviderManager instance + */ + private ProviderManager providerManager = ProviderManager.getInstance(); + + /** + * A default constructor + */ + public SmackV3InteroperabilityLayer() {} + + /** + * Add <tt>PacketExtensionProvider</tt> to the list of known + * providers + * + * @param elementName The element name where the matching is happening + * @param namespace The XML namespace used in that element + * @param provider <tt>PacketExtensionProvider</tt> implementation to be + * used + */ + @Override + public void addExtensionProvider( + String elementName, String namespace, Object provider) + { + providerManager.addExtensionProvider(elementName, namespace, provider); + } + + /** + * Add <tt>IQProvider</tt> to the list of known + * providers + * + * @param elementName The element name where the matching is happening + * @param namespace The XML namespace used in that element + * @param provider <tt>IQProvider</tt> implementation to be + * used + */ + @Override + public void addIQProvider( + String elementName, String namespace, Object provider) + { + providerManager.addIQProvider(elementName, namespace, provider); + } + + /** + * Get the <tt>PacketExtensionProvider</tt> for given element name and XML + * namespace + * + * @param elementName The element name where the matching is happening + * @param namespace The XML namespace used in that element + * @return <tt>PacketExtensionProvider</tt> implementation to be + * used + */ + @Override + public PacketExtensionProvider getExtensionProvider( + String elementName, String namespace) + { + return (PacketExtensionProvider)providerManager + .getExtensionProvider(elementName, namespace); + } + +} diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/AbstractPacketExtension.java b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/AbstractPacketExtension.java index e2da8bb..07e5211 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/AbstractPacketExtension.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/AbstractPacketExtension.java @@ -32,6 +32,7 @@ import org.jivesoftware.smack.packet.*; * * @author Emil Ivov * @author Lyubomir Marinov + * */ public abstract class AbstractPacketExtension implements PacketExtension diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/DefaultPacketExtensionProvider.java b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/DefaultPacketExtensionProvider.java index 1285581..778d086 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/DefaultPacketExtensionProvider.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/DefaultPacketExtensionProvider.java @@ -19,6 +19,7 @@ package net.java.sip.communicator.impl.protocol.jabber.extensions; import java.util.logging.*; +import net.java.sip.communicator.service.protocol.jabber.*; import org.jivesoftware.smack.packet.*; import org.jivesoftware.smack.provider.*; import org.xmlpull.v1.*; @@ -41,6 +42,13 @@ public class DefaultPacketExtensionProvider<C extends AbstractPacketExtension> .getLogger(DefaultPacketExtensionProvider.class.getName()); /** + * The <tt>AbstractSmackInteroperabilityLayer</tt> instance implementing + * necessary methods + */ + private AbstractSmackInteroperabilityLayer smackInteroperabilityLayer = + AbstractSmackInteroperabilityLayer.getInstance(); + + /** * The {@link Class} that the packets we will be parsing here belong to. */ private final Class<C> packetClass; @@ -100,8 +108,7 @@ public class DefaultPacketExtensionProvider<C extends AbstractPacketExtension> if (eventType == XmlPullParser.START_TAG) { - PacketExtensionProvider provider - = (PacketExtensionProvider)ProviderManager.getInstance() + PacketExtensionProvider provider = smackInteroperabilityLayer .getExtensionProvider( elementName, namespace ); if(provider == null) diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/colibri/ColibriIQProvider.java b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/colibri/ColibriIQProvider.java index 39e299f..0b1b14a 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/colibri/ColibriIQProvider.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/colibri/ColibriIQProvider.java @@ -20,6 +20,7 @@ package net.java.sip.communicator.impl.protocol.jabber.extensions.colibri; import net.java.sip.communicator.impl.protocol.jabber.extensions.*; import net.java.sip.communicator.impl.protocol.jabber.extensions.jingle.*; +import net.java.sip.communicator.service.protocol.jabber.*; import org.jitsi.service.neomedia.*; import org.jitsi.util.*; import org.jivesoftware.smack.packet.*; @@ -36,89 +37,97 @@ import org.xmlpull.v1.*; public class ColibriIQProvider implements IQProvider { + + /** + * Smack interoperation layer + */ + AbstractSmackInteroperabilityLayer smackInteroperabilityLayer = + AbstractSmackInteroperabilityLayer.getInstance(); + /** Initializes a new <tt>ColibriIQProvider</tt> instance. */ public ColibriIQProvider() { - ProviderManager providerManager = ProviderManager.getInstance(); - - providerManager.addExtensionProvider( + smackInteroperabilityLayer.addExtensionProvider( PayloadTypePacketExtension.ELEMENT_NAME, ColibriConferenceIQ.NAMESPACE, new DefaultPacketExtensionProvider<PayloadTypePacketExtension>( PayloadTypePacketExtension.class)); - providerManager.addExtensionProvider( + smackInteroperabilityLayer.addExtensionProvider( RtcpFbPacketExtension.ELEMENT_NAME, RtcpFbPacketExtension.NAMESPACE, new DefaultPacketExtensionProvider<RtcpFbPacketExtension>( RtcpFbPacketExtension.class)); - providerManager.addExtensionProvider( + smackInteroperabilityLayer.addExtensionProvider( RTPHdrExtPacketExtension.ELEMENT_NAME, ColibriConferenceIQ.NAMESPACE, new DefaultPacketExtensionProvider<RTPHdrExtPacketExtension>( RTPHdrExtPacketExtension.class)); - providerManager.addExtensionProvider( + smackInteroperabilityLayer.addExtensionProvider( SourcePacketExtension.ELEMENT_NAME, SourcePacketExtension.NAMESPACE, new DefaultPacketExtensionProvider<SourcePacketExtension>( SourcePacketExtension.class)); - providerManager.addExtensionProvider( + smackInteroperabilityLayer.addExtensionProvider( SourceGroupPacketExtension.ELEMENT_NAME, SourceGroupPacketExtension.NAMESPACE, new DefaultPacketExtensionProvider<SourceGroupPacketExtension>( SourceGroupPacketExtension.class)); PacketExtensionProvider parameterProvider - = new DefaultPacketExtensionProvider<ParameterPacketExtension>( - ParameterPacketExtension.class); + = new DefaultPacketExtensionProvider<ParameterPacketExtension>( + ParameterPacketExtension.class); - providerManager.addExtensionProvider( + smackInteroperabilityLayer.addExtensionProvider( ParameterPacketExtension.ELEMENT_NAME, ColibriConferenceIQ.NAMESPACE, parameterProvider); - providerManager.addExtensionProvider( + smackInteroperabilityLayer.addExtensionProvider( ParameterPacketExtension.ELEMENT_NAME, SourcePacketExtension.NAMESPACE, parameterProvider); // Shutdown IQ - providerManager.addIQProvider( + smackInteroperabilityLayer.addIQProvider( GracefulShutdownIQ.ELEMENT_NAME, GracefulShutdownIQ.NAMESPACE, this); // Shutdown extension PacketExtensionProvider shutdownProvider - = new DefaultPacketExtensionProvider - <ColibriConferenceIQ.GracefulShutdown>( - ColibriConferenceIQ.GracefulShutdown.class); + = new DefaultPacketExtensionProvider + <ColibriConferenceIQ.GracefulShutdown>( + ColibriConferenceIQ.GracefulShutdown.class); - providerManager.addExtensionProvider( - ColibriConferenceIQ.GracefulShutdown.ELEMENT_NAME, - ColibriConferenceIQ.GracefulShutdown.NAMESPACE, - shutdownProvider); + smackInteroperabilityLayer.addExtensionProvider( + ColibriConferenceIQ.GracefulShutdown.ELEMENT_NAME, + ColibriConferenceIQ.GracefulShutdown.NAMESPACE, + shutdownProvider); // ColibriStatsIQ - providerManager.addIQProvider( - ColibriStatsIQ.ELEMENT_NAME, - ColibriStatsIQ.NAMESPACE, - this); + smackInteroperabilityLayer.addIQProvider( + ColibriStatsIQ.ELEMENT_NAME, + ColibriStatsIQ.NAMESPACE, + this); // ColibriStatsExtension PacketExtensionProvider statsProvider - = new DefaultPacketExtensionProvider<ColibriStatsExtension>( - ColibriStatsExtension.class); + = new DefaultPacketExtensionProvider<ColibriStatsExtension>( + ColibriStatsExtension.class); - providerManager.addExtensionProvider( - ColibriStatsExtension.ELEMENT_NAME, - ColibriStatsExtension.NAMESPACE, - statsProvider); + smackInteroperabilityLayer.addExtensionProvider( + ColibriStatsExtension.ELEMENT_NAME, + ColibriStatsExtension.NAMESPACE, + statsProvider); // ColibriStatsExtension.Stat PacketExtensionProvider statProvider - = new DefaultPacketExtensionProvider<ColibriStatsExtension.Stat>( - ColibriStatsExtension.Stat.class); - - providerManager.addExtensionProvider( - ColibriStatsExtension.Stat.ELEMENT_NAME, - ColibriStatsExtension.NAMESPACE, - statProvider); + = new DefaultPacketExtensionProvider + <ColibriStatsExtension.Stat>( + ColibriStatsExtension.Stat.class); + + smackInteroperabilityLayer.addExtensionProvider( + ColibriStatsExtension.Stat.ELEMENT_NAME, + ColibriStatsExtension.NAMESPACE, + statProvider); + + } private void addChildExtension( @@ -199,8 +208,7 @@ public class ColibriIQProvider throws Exception { PacketExtensionProvider extensionProvider - = (PacketExtensionProvider) - ProviderManager.getInstance().getExtensionProvider( + = smackInteroperabilityLayer.getExtensionProvider( name, namespace); PacketExtension extension; diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/JingleIQ.java b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/JingleIQ.java index 9183fa0..65b0849 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/JingleIQ.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/JingleIQ.java @@ -21,6 +21,7 @@ import java.math.*; import java.security.*; import java.util.*; +import net.java.sip.communicator.service.protocol.jabber.*; import org.jivesoftware.smack.packet.*; /** @@ -62,7 +63,8 @@ public class JingleIQ extends IQ * The name of the argument that contains the session id. */ public static final String SID_ATTR_NAME = "sid"; - + + /** * The <tt>JingleAction</tt> that describes the purpose of this * <tt>jingle</tt> element. @@ -104,8 +106,8 @@ public class JingleIQ extends IQ * The list of "content" elements included in this IQ. */ private final List<ContentPacketExtension> contentList - = new ArrayList<ContentPacketExtension>(); - + = new ArrayList<ContentPacketExtension>(); + /** * Returns the XML string of this Jingle IQ's "section" sub-element. * @@ -124,17 +126,18 @@ public class JingleIQ extends IQ if( initiator != null) bldr.append(" " + INITIATOR_ATTR_NAME - + "='" + getInitiator() + "'"); + + "='" + getInitiator() + "'"); if( responder != null) bldr.append(" " + RESPONDER_ATTR_NAME - + "='" + getResponder() + "'"); + + "='" + getResponder() + "'"); bldr.append(" " + SID_ATTR_NAME - + "='" + getSID() + "'"); - - String extensionsXML = getExtensionsXML(); + + "='" + getSID() + "'"); + CharSequence extensionsXMLSeq = getExtensionsXML(); + String extensionsXML = extensionsXMLSeq.toString(); + if ((contentList.size() == 0) && (reason == null) && (sessionInfo == null) @@ -348,7 +351,7 @@ public class JingleIQ extends IQ * otherwise. */ public boolean containsContentChildOfType( - Class<? extends PacketExtension> contentType) + Class<? extends PacketExtension> contentType) { if(getContentForType(contentType) != null) return true; @@ -369,14 +372,14 @@ public class JingleIQ extends IQ * found. */ public ContentPacketExtension getContentForType( - Class<? extends PacketExtension> contentType) + Class<? extends PacketExtension> contentType) { synchronized(contentList) { for(ContentPacketExtension content : contentList) { PacketExtension child - = content.getFirstChildOfType(contentType); + = content.getFirstChildOfType(contentType); if(child != null) return content; } diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/JingleIQProvider.java b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/JingleIQProvider.java index 11f909a..49934e5 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/JingleIQProvider.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/JingleIQProvider.java @@ -20,6 +20,7 @@ package net.java.sip.communicator.impl.protocol.jabber.extensions.jingle; import net.java.sip.communicator.impl.protocol.jabber.extensions.*; import net.java.sip.communicator.impl.protocol.jabber.extensions.jitsimeet.*; +import net.java.sip.communicator.service.protocol.jabber.*; import org.jivesoftware.smack.provider.*; import org.xmlpull.v1.*; @@ -37,174 +38,187 @@ public class JingleIQProvider implements IQProvider */ public JingleIQProvider() { - ProviderManager providerManager = ProviderManager.getInstance(); + + AbstractSmackInteroperabilityLayer smackInteroperabilityLayer = + AbstractSmackInteroperabilityLayer.getInstance(); //<description/> provider - providerManager.addExtensionProvider( - RtpDescriptionPacketExtension.ELEMENT_NAME, - RtpDescriptionPacketExtension.NAMESPACE, - new DefaultPacketExtensionProvider - <RtpDescriptionPacketExtension>( - RtpDescriptionPacketExtension.class)); + smackInteroperabilityLayer.addExtensionProvider( + RtpDescriptionPacketExtension.ELEMENT_NAME, + RtpDescriptionPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider + <RtpDescriptionPacketExtension>( + RtpDescriptionPacketExtension.class)); //<payload-type/> provider - providerManager.addExtensionProvider( - PayloadTypePacketExtension.ELEMENT_NAME, - RtpDescriptionPacketExtension.NAMESPACE, - new DefaultPacketExtensionProvider - <PayloadTypePacketExtension>( - PayloadTypePacketExtension.class)); + smackInteroperabilityLayer.addExtensionProvider( + PayloadTypePacketExtension.ELEMENT_NAME, + RtpDescriptionPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider + <PayloadTypePacketExtension>( + PayloadTypePacketExtension.class)); //<parameter/> provider - providerManager.addExtensionProvider( - ParameterPacketExtension.ELEMENT_NAME, - RtpDescriptionPacketExtension.NAMESPACE, - new DefaultPacketExtensionProvider - <ParameterPacketExtension>(ParameterPacketExtension.class)); + smackInteroperabilityLayer.addExtensionProvider( + ParameterPacketExtension.ELEMENT_NAME, + RtpDescriptionPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider + <ParameterPacketExtension> + (ParameterPacketExtension.class)); //<rtp-hdrext/> provider - providerManager.addExtensionProvider( - RTPHdrExtPacketExtension.ELEMENT_NAME, - RTPHdrExtPacketExtension.NAMESPACE, - new DefaultPacketExtensionProvider - <RTPHdrExtPacketExtension>(RTPHdrExtPacketExtension.class)); + smackInteroperabilityLayer.addExtensionProvider( + RTPHdrExtPacketExtension.ELEMENT_NAME, + RTPHdrExtPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider + <RTPHdrExtPacketExtension> + (RTPHdrExtPacketExtension.class)); // <sctpmap/> provider - providerManager.addExtensionProvider( - SctpMapExtension.ELEMENT_NAME, - SctpMapExtension.NAMESPACE, - new SctpMapExtensionProvider()); + smackInteroperabilityLayer.addExtensionProvider( + SctpMapExtension.ELEMENT_NAME, + SctpMapExtension.NAMESPACE, + new SctpMapExtensionProvider()); //<encryption/> provider - providerManager.addExtensionProvider( - EncryptionPacketExtension.ELEMENT_NAME, - RtpDescriptionPacketExtension.NAMESPACE, - new DefaultPacketExtensionProvider - <EncryptionPacketExtension>(EncryptionPacketExtension.class)); + smackInteroperabilityLayer.addExtensionProvider( + EncryptionPacketExtension.ELEMENT_NAME, + RtpDescriptionPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider + <EncryptionPacketExtension> + (EncryptionPacketExtension.class)); //<zrtp-hash/> provider - providerManager.addExtensionProvider( - ZrtpHashPacketExtension.ELEMENT_NAME, - ZrtpHashPacketExtension.NAMESPACE, - new DefaultPacketExtensionProvider - <ZrtpHashPacketExtension>(ZrtpHashPacketExtension.class)); + smackInteroperabilityLayer.addExtensionProvider( + ZrtpHashPacketExtension.ELEMENT_NAME, + ZrtpHashPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider + <ZrtpHashPacketExtension> + (ZrtpHashPacketExtension.class)); //<crypto/> provider - providerManager.addExtensionProvider( - CryptoPacketExtension.ELEMENT_NAME, - RtpDescriptionPacketExtension.NAMESPACE, - new DefaultPacketExtensionProvider - <CryptoPacketExtension>(CryptoPacketExtension.class)); + smackInteroperabilityLayer.addExtensionProvider( + CryptoPacketExtension.ELEMENT_NAME, + RtpDescriptionPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider + <CryptoPacketExtension> + (CryptoPacketExtension.class)); // <bundle/> provider - providerManager.addExtensionProvider( - BundlePacketExtension.ELEMENT_NAME, - BundlePacketExtension.NAMESPACE, - new DefaultPacketExtensionProvider - <BundlePacketExtension>(BundlePacketExtension.class)); + smackInteroperabilityLayer.addExtensionProvider( + BundlePacketExtension.ELEMENT_NAME, + BundlePacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider + <BundlePacketExtension> + (BundlePacketExtension.class)); // <group/> provider - providerManager.addExtensionProvider( - GroupPacketExtension.ELEMENT_NAME, - GroupPacketExtension.NAMESPACE, - new DefaultPacketExtensionProvider - <GroupPacketExtension>(GroupPacketExtension.class)); + smackInteroperabilityLayer.addExtensionProvider( + GroupPacketExtension.ELEMENT_NAME, + GroupPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider + <GroupPacketExtension>(GroupPacketExtension.class)); //ice-udp transport - providerManager.addExtensionProvider( - IceUdpTransportPacketExtension.ELEMENT_NAME, - IceUdpTransportPacketExtension.NAMESPACE, - new DefaultPacketExtensionProvider<IceUdpTransportPacketExtension>( - IceUdpTransportPacketExtension.class)); + smackInteroperabilityLayer.addExtensionProvider( + IceUdpTransportPacketExtension.ELEMENT_NAME, + IceUdpTransportPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider + <IceUdpTransportPacketExtension>( + IceUdpTransportPacketExtension.class)); //<raw-udp/> provider - providerManager.addExtensionProvider( - RawUdpTransportPacketExtension.ELEMENT_NAME, - RawUdpTransportPacketExtension.NAMESPACE, - new DefaultPacketExtensionProvider<RawUdpTransportPacketExtension>( - RawUdpTransportPacketExtension.class)); + smackInteroperabilityLayer.addExtensionProvider( + RawUdpTransportPacketExtension.ELEMENT_NAME, + RawUdpTransportPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider + <RawUdpTransportPacketExtension>( + RawUdpTransportPacketExtension.class)); //ice-udp <candidate/> provider - providerManager.addExtensionProvider( - CandidatePacketExtension.ELEMENT_NAME, - IceUdpTransportPacketExtension.NAMESPACE, - new DefaultPacketExtensionProvider<CandidatePacketExtension>( - CandidatePacketExtension.class)); + smackInteroperabilityLayer.addExtensionProvider( + CandidatePacketExtension.ELEMENT_NAME, + IceUdpTransportPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider + <CandidatePacketExtension>( + CandidatePacketExtension.class)); //raw-udp <candidate/> provider - providerManager.addExtensionProvider( - CandidatePacketExtension.ELEMENT_NAME, - RawUdpTransportPacketExtension.NAMESPACE, - new DefaultPacketExtensionProvider<CandidatePacketExtension>( - CandidatePacketExtension.class)); + smackInteroperabilityLayer.addExtensionProvider( + CandidatePacketExtension.ELEMENT_NAME, + RawUdpTransportPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider + <CandidatePacketExtension>( + CandidatePacketExtension.class)); //ice-udp <remote-candidate/> provider - providerManager.addExtensionProvider( - RemoteCandidatePacketExtension.ELEMENT_NAME, - IceUdpTransportPacketExtension.NAMESPACE, - new DefaultPacketExtensionProvider<RemoteCandidatePacketExtension>( - RemoteCandidatePacketExtension.class)); + smackInteroperabilityLayer.addExtensionProvider( + RemoteCandidatePacketExtension.ELEMENT_NAME, + IceUdpTransportPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider + <RemoteCandidatePacketExtension>( + RemoteCandidatePacketExtension.class)); //inputevt <inputevt/> provider - providerManager.addExtensionProvider( + smackInteroperabilityLayer.addExtensionProvider( InputEvtPacketExtension.ELEMENT_NAME, InputEvtPacketExtension.NAMESPACE, new DefaultPacketExtensionProvider<InputEvtPacketExtension>( InputEvtPacketExtension.class)); //coin <conference-info/> provider - providerManager.addExtensionProvider( + smackInteroperabilityLayer.addExtensionProvider( CoinPacketExtension.ELEMENT_NAME, CoinPacketExtension.NAMESPACE, new DefaultPacketExtensionProvider<CoinPacketExtension>( CoinPacketExtension.class)); // DTLS-SRTP - providerManager.addExtensionProvider( + smackInteroperabilityLayer.addExtensionProvider( DtlsFingerprintPacketExtension.ELEMENT_NAME, DtlsFingerprintPacketExtension.NAMESPACE, new DefaultPacketExtensionProvider - <DtlsFingerprintPacketExtension>( + <DtlsFingerprintPacketExtension>( DtlsFingerprintPacketExtension.class)); /* * XEP-0251: Jingle Session Transfer <transfer/> and <transferred> * providers */ - providerManager.addExtensionProvider( + smackInteroperabilityLayer.addExtensionProvider( TransferPacketExtension.ELEMENT_NAME, TransferPacketExtension.NAMESPACE, new DefaultPacketExtensionProvider<TransferPacketExtension>( TransferPacketExtension.class)); - providerManager.addExtensionProvider( + smackInteroperabilityLayer.addExtensionProvider( TransferredPacketExtension.ELEMENT_NAME, TransferredPacketExtension.NAMESPACE, new DefaultPacketExtensionProvider<TransferredPacketExtension>( TransferredPacketExtension.class)); //conference description <callid/> provider - providerManager.addExtensionProvider( + smackInteroperabilityLayer.addExtensionProvider( ConferenceDescriptionPacketExtension.CALLID_ELEM_NAME, ConferenceDescriptionPacketExtension.NAMESPACE, new DefaultPacketExtensionProvider<CallIdPacketExtension>( CallIdPacketExtension.class)); //rtcp-fb - providerManager.addExtensionProvider( - RtcpFbPacketExtension.ELEMENT_NAME, - RtcpFbPacketExtension.NAMESPACE, - new DefaultPacketExtensionProvider<RtcpFbPacketExtension>( - RtcpFbPacketExtension.class)); + smackInteroperabilityLayer.addExtensionProvider( + RtcpFbPacketExtension.ELEMENT_NAME, + RtcpFbPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider<RtcpFbPacketExtension>( + RtcpFbPacketExtension.class)); //rtcp-mux - providerManager.addExtensionProvider( + smackInteroperabilityLayer.addExtensionProvider( RtcpmuxPacketExtension.ELEMENT_NAME, IceUdpTransportPacketExtension.NAMESPACE, new DefaultPacketExtensionProvider<RtcpmuxPacketExtension>( RtcpmuxPacketExtension.class)); //ssrcInfo - providerManager.addExtensionProvider( + smackInteroperabilityLayer.addExtensionProvider( SSRCInfoPacketExtension.ELEMENT_NAME, SSRCInfoPacketExtension.NAMESPACE, new DefaultPacketExtensionProvider<SSRCInfoPacketExtension>( diff --git a/src/net/java/sip/communicator/service/protocol/jabber/AbstractSmackInteroperabilityLayer.java b/src/net/java/sip/communicator/service/protocol/jabber/AbstractSmackInteroperabilityLayer.java new file mode 100644 index 0000000..051ce70 --- /dev/null +++ b/src/net/java/sip/communicator/service/protocol/jabber/AbstractSmackInteroperabilityLayer.java @@ -0,0 +1,139 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Copyright @ 2015 Atlassian Pty Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.java.sip.communicator.service.protocol.jabber; + +import net.java.sip.communicator.util.*; +import org.jivesoftware.smack.provider.*; + + +/** + * + * This class abstracts interactions within Smack XMPP library (mostly with + * its <tt>ProviderManager</tt> class). + * This exists because <tt>JingleIQProvider</tt> and <tt>ColibriIQProvider</tt> + * are in need to be used with Smack v4, where <tt>ProviderManager</tt> + * has a different interface. + * + * @author Maksym Kulish + */ +abstract public class AbstractSmackInteroperabilityLayer { + + /** + * The <tt>Logger</tt> used by the + * <tt>AbstractSmackInteroperabilityLayer</tt> class for + * reporting on improper implementations instantiation + */ + private static final Logger logger = Logger.getLogger( + AbstractSmackInteroperabilityLayer.class); + + /** + * The implementation class to be used within its Jitsi application + */ + private static Class<AbstractSmackInteroperabilityLayer> + implementationClass; + + /** + * The instance of + */ + private static AbstractSmackInteroperabilityLayer proxyInstance; + + /** + * Get the instance of Smack interoperation layer implementation class + * + * @return Smack interoperation layer implementation class + */ + public static AbstractSmackInteroperabilityLayer getInstance() + { + if (proxyInstance == null) + { + try + { + proxyInstance = implementationClass.newInstance(); + } + catch (IllegalAccessException e) + { + // Never thrown within proper implementation + logger.fatal("Your AbstractSmackInteroperabilityLayer " + + "implementation " + + "cannot be accessed properly. " + + "Please fix the implementation"); + } + catch (InstantiationException e) + { + // Never thrown within proper implementation + logger.fatal("Your AbstractSmackInteroperabilityLayer " + + "implementation " + + "cannot be instantiated properly. " + + "Please fix the implementation"); + } + } + return proxyInstance; + } + + /** + * Set the Smack interoperation layer + * implementation class to be used within this Jitsi application + * @param implementationClass Smack interoperation layer + * implementation class + */ + public static void setImplementationClass( + Class implementationClass) + { + AbstractSmackInteroperabilityLayer.implementationClass + = implementationClass; + } + + + /** + * Add <tt>PacketExtensionProvider</tt> to the list of known + * providers + * + * @param elementName The element name where the matching is happening + * @param namespace The XML namespace used in that element + * @param provider <tt>PacketExtensionProvider</tt> implementation to be + * used + */ + abstract public void addExtensionProvider( + String elementName, String namespace, Object provider); + + /** + * Add <tt>IQProvider</tt> to the list of known + * providers + * + * @param elementName The element name where the matching is happening + * @param namespace The XML namespace used in that element + * @param provider <tt>IQProvider</tt> implementation to be + * used + */ + abstract public void addIQProvider( + String elementName, String namespace, Object provider); + + /** + * Get the <tt>PacketExtensionProvider</tt> for given element name and XML + * namespace + * + * @param elementName The element name where the matching is happening + * @param namespace The XML namespace used in that element + * @return <tt>PacketExtensionProvider</tt> implementation to be + * used + */ + abstract public PacketExtensionProvider getExtensionProvider( + String elementName, String namespace); + + +} |