Introduce SmackProxy for abstracting different Smack implementations (3 and 4)

smack4
mksh 10 years ago
parent 6d0a499650
commit 89528e58b6

@ -21,6 +21,7 @@
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)
{

@ -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);
}
}

@ -32,6 +32,7 @@
*
* @author Emil Ivov
* @author Lyubomir Marinov
*
*/
public abstract class AbstractPacketExtension
implements PacketExtension

@ -19,6 +19,7 @@
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.*;
@ -40,6 +41,13 @@ public class DefaultPacketExtensionProvider<C extends AbstractPacketExtension>
private static final Logger logger = Logger
.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.
*/
@ -100,8 +108,7 @@ public C parseExtension(XmlPullParser parser) throws Exception
if (eventType == XmlPullParser.START_TAG)
{
PacketExtensionProvider provider
= (PacketExtensionProvider)ProviderManager.getInstance()
PacketExtensionProvider provider = smackInteroperabilityLayer
.getExtensionProvider( elementName, namespace );
if(provider == null)

@ -20,6 +20,7 @@
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 @@
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 @@ private PacketExtension parseExtension(
throws Exception
{
PacketExtensionProvider extensionProvider
= (PacketExtensionProvider)
ProviderManager.getInstance().getExtensionProvider(
= smackInteroperabilityLayer.getExtensionProvider(
name,
namespace);
PacketExtension extension;

@ -21,6 +21,7 @@
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 String getChildElementXML()
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 void addContent(ContentPacketExtension contentPacket)
* otherwise.
*/
public boolean containsContentChildOfType(
Class<? extends PacketExtension> contentType)
Class<? extends PacketExtension> contentType)
{
if(getContentForType(contentType) != null)
return true;
@ -369,14 +372,14 @@ public boolean containsContentChildOfType(
* 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;
}

@ -20,6 +20,7 @@
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>(

@ -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);
}
Loading…
Cancel
Save