diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetBasicTelephonyJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetBasicTelephonyJabberImpl.java index 292769d10..3362b4be0 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetBasicTelephonyJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetBasicTelephonyJabberImpl.java @@ -329,8 +329,6 @@ public void shutdown() */ private void subscribeForJinglePackets() { - ProviderManager providerManager = ProviderManager.getInstance(); - protocolProvider.getConnection().addPacketListener( new JingleListener(), new PacketTypeFilter( JingleIQ.class)); } diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java index e24f33561..b4b521362 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java @@ -57,7 +57,7 @@ public class ProtocolProviderServiceJabberImpl * Jingle's Discovery Info URN for RTP support. */ public static final String URN_XMPP_JINGLE_RTP - = "urn:xmpp:jingle:apps:rtp:1"; + = RtpDescriptionPacketExtension.NAMESPACE; /** * Jingle's Discovery Info URN for RTP support with audio. @@ -74,14 +74,14 @@ public class ProtocolProviderServiceJabberImpl /** * Jingle's Discovery Info URN for ICE_UDP transport support. */ - public static final String URN_XMPP_JINGLE_ICE_UDP_0 - = "urn:xmpp:jingle:transports:ice-udp:0"; + public static final String URN_XMPP_JINGLE_RAW_UDP_0 + = RawUdpTransportPacketExtension.NAMESPACE; /** * Jingle's Discovery Info URN for ICE_UDP transport support. */ public static final String URN_XMPP_JINGLE_ICE_UDP_1 - = "urn:xmpp:jingle:transports:ice-udp:1"; + = IceUdpTransportPacketExtension.NAMESPACE; /** * Used to connect to a XMPP server. @@ -911,7 +911,7 @@ protected void initialize(String screenname, // Add Jingle features to supported features. supportedFeatures.add(URN_XMPP_JINGLE); supportedFeatures.add(URN_XMPP_JINGLE_RTP); - supportedFeatures.add(URN_XMPP_JINGLE_ICE_UDP_0); + supportedFeatures.add(URN_XMPP_JINGLE_RAW_UDP_0); supportedFeatures.add(URN_XMPP_JINGLE_ICE_UDP_1); supportedFeatures.add(URN_XMPP_JINGLE_RTP_AUDIO); supportedFeatures.add(URN_XMPP_JINGLE_RTP_VIDEO); 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 bd1013554..be08ca5f4 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 @@ -83,6 +83,11 @@ public C parseExtension(XmlPullParser parser) throws Exception elementName = parser.getName(); namespace = parser.getNamespace(); + if (logger.isLoggable(Level.FINEST)) + logger.finest("Will parse " + elementName + + " ns=" + namespace + + " class=" + packetExtension.getClass().getSimpleName()); + if (eventType == XmlPullParser.START_TAG) { PacketExtensionProvider provider @@ -108,6 +113,9 @@ public C parseExtension(XmlPullParser parser) throws Exception done = true; } } + + if (logger.isLoggable(Level.FINEST)) + logger.finest("Done parsing " + elementName); } return packetExtension; diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/CandidatePacketExtension.java b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/CandidatePacketExtension.java index f8a46fd4d..6ceff44d2 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/CandidatePacketExtension.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/CandidatePacketExtension.java @@ -361,5 +361,4 @@ public CandidateType getType() { return CandidateType.valueOf(getAttributeAsString(TYPE_ATTR_NAME)); } - } diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/IceUdpTransportPacketExtension.java b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/IceUdpTransportPacketExtension.java index eb70e9f54..9c9f663e8 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/IceUdpTransportPacketExtension.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/IceUdpTransportPacketExtension.java @@ -24,6 +24,7 @@ public class IceUdpTransportPacketExtension extends AbstractPacketExtension */ public static final String NAMESPACE = "urn:xmpp:jingle:transports:ice-udp:1"; + /** * The name of the "transport" element. */ @@ -63,6 +64,21 @@ public IceUdpTransportPacketExtension() super(NAMESPACE, ELEMENT_NAME); } + /** + * Creates a new {@link IceUdpTransportPacketExtension} instance with the + * specified namespace and elementName. The purpose of + * this method is to allow {@link RawUdpTransportPacketExtension} to + * extend this class. + * + * @param namespace the XML namespace that the instance should belong to. + * @param elementName the name of the element that we would be representing. + */ + protected IceUdpTransportPacketExtension(String namespace, + String elementName) + { + super(namespace, elementName); + } + /** * Sets the ICE defined password attribute. * @@ -111,15 +127,20 @@ public String getUfrag() @Override public List getChildExtensions() { - if(candidateList.size() > 0) - return candidateList; - else if (remoteCandidate != null) + synchronized (candidateList) { - List list - = new ArrayList(); - list.add(remoteCandidate); - - return list; + if(candidateList.size() > 0) + { + return candidateList; + } + else if (remoteCandidate != null) + { + List list + = new ArrayList(); + list.add(remoteCandidate); + + return list; + } } //there are apparently no child elements. @@ -135,7 +156,10 @@ else if (remoteCandidate != null) */ public void addCandidate(CandidatePacketExtension candidate) { - this.candidateList.add(candidate); + synchronized(candidateList) + { + this.candidateList.add(candidate); + } } /** @@ -174,4 +198,24 @@ public RemoteCandidatePacketExtension getRemoteCandidate() return remoteCandidate; } + /** + * Tries to determine whether childExtension is a {@link + * CandidatePacketExtension}, a {@link RemoteCandidatePacketExtension} or + * something else and then adds it as such. + * + * @param childExtension the extension we'd like to add here. + */ + @Override + public void addChildExtension(PacketExtension childExtension) + { + //first check for RemoteCandidate because they extend Candidate. + if(childExtension instanceof RemoteCandidatePacketExtension) + setRemoteCandidate((RemoteCandidatePacketExtension) childExtension); + + else if(childExtension instanceof CandidatePacketExtension) + addCandidate((CandidatePacketExtension) childExtension); + } + + + } 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 7522542b8..e15db6ffd 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 @@ -7,11 +7,10 @@ package net.java.sip.communicator.impl.protocol.jabber.extensions.jingle; import java.util.*; +import java.util.logging.*; import org.jivesoftware.smack.packet.*; -import net.java.sip.communicator.util.*; - /** * A straightforward extension of the IQ. A JingleIQ object is created * by smack via the {@link JingleIQProvider}. It contains all the information @@ -22,10 +21,11 @@ public class JingleIQ extends IQ { /** - * Logger for this class + * The Logger used by the JingleIQ + * class and its instances for logging output. */ - private static final Logger logger = - Logger.getLogger(JingleIQ.class); + private static final Logger logger = Logger.getLogger(JingleIQ.class + .getName()); /** * The name space that jingle belongs to. @@ -105,7 +105,27 @@ public class JingleIQ extends IQ @Override public String getChildElementXML() { - StringBuilder bldr = new StringBuilder(); + StringBuilder bldr = new StringBuilder("<" + ELEMENT_NAME); + + bldr.append(" xmlns='" + NAMESPACE + "'"); + + bldr.append(" " + ACTION_ATTR_NAME + "='" + getAction() + "'"); + + if( initiator != null) + bldr.append(" " + INITIATOR_ATTR_NAME + + "='" + getInitiator() + "'"); + + if( responder != null) + bldr.append(" " + RESPONDER_ATTR_NAME + + "='" + getResponder() + "'"); + + bldr.append(" " + SID_ATTR_NAME + + "='" + getSID() + "'"); + + if (contentList.size() == 0 && reason == null) + bldr.append("/>"); + else + bldr.append(">");//it is possible to have empty jingle elements //content for(ContentPacketExtension cpe : contentList) @@ -117,6 +137,8 @@ public String getChildElementXML() if (reason != null) bldr.append(reason.toXML()); + bldr.append(""); + return bldr.toString(); } @@ -140,7 +162,7 @@ public void setSid(String sid) * * @return this element's session ID. */ - public String getSid() + public String getSID() { return sid; } 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 2f8ad716d..736cdde5e 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 @@ -58,6 +58,41 @@ public JingleIQProvider() RtpDescriptionPacketExtension.NAMESPACE, new DefaultPacketExtensionProvider (ParameterPacketExtension.class)); + + //ice-udp transport + providerManager.addExtensionProvider( + IceUdpTransportPacketExtension.ELEMENT_NAME, + IceUdpTransportPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider( + IceUdpTransportPacketExtension.class)); + + // provider + providerManager.addExtensionProvider( + RawUdpTransportPacketExtension.ELEMENT_NAME, + RawUdpTransportPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider( + RawUdpTransportPacketExtension.class)); + + //ice-udp provider + providerManager.addExtensionProvider( + CandidatePacketExtension.ELEMENT_NAME, + IceUdpTransportPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider( + CandidatePacketExtension.class)); + + //raw-udp provider + providerManager.addExtensionProvider( + CandidatePacketExtension.ELEMENT_NAME, + RawUdpTransportPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider( + CandidatePacketExtension.class)); + + //ice-udp provider + providerManager.addExtensionProvider( + RemoteCandidatePacketExtension.ELEMENT_NAME, + IceUdpTransportPacketExtension.NAMESPACE, + new DefaultPacketExtensionProvider( + RemoteCandidatePacketExtension.class)); } /** @@ -78,9 +113,9 @@ public JingleIQ parseIQ(XmlPullParser parser) JingleAction action = JingleAction.parseString(parser .getAttributeValue("", JingleIQ.ACTION_ATTR_NAME)); String initiator = parser - .getAttributeValue("", JingleIQ.RESPONDER_ATTR_NAME); + .getAttributeValue("", JingleIQ.INITIATOR_ATTR_NAME); String responder = parser - .getAttributeValue("", JingleIQ.INITIATOR_ATTR_NAME); + .getAttributeValue("", JingleIQ.RESPONDER_ATTR_NAME); String sid = parser .getAttributeValue("", JingleIQ.SID_ATTR_NAME); diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/RawUdpTransportPacketExtension.java b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/RawUdpTransportPacketExtension.java index ba286c5ba..9ffd35b28 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/RawUdpTransportPacketExtension.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/RawUdpTransportPacketExtension.java @@ -17,7 +17,8 @@ * * @author Emil Ivov */ -public class RawUdpTransportPacketExtension extends AbstractPacketExtension +public class RawUdpTransportPacketExtension + extends IceUdpTransportPacketExtension { /** * The name of the "transport" element. diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/ReasonPacketExtension.java b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/ReasonPacketExtension.java index f61cb94d0..1352a2a9a 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/ReasonPacketExtension.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/ReasonPacketExtension.java @@ -37,7 +37,7 @@ public class ReasonPacketExtension /** * The reason that this packet extension is transporting. */ - private final String reason; + private final Reason reason; /** * The content of the text element (if any) providing human-readable @@ -65,7 +65,7 @@ public class ReasonPacketExtension * @param packetExtension any other element that MAY be providing further * information or null if no such element has been specified. */ - public ReasonPacketExtension(String reason, + public ReasonPacketExtension(Reason reason, String text, PacketExtension packetExtension) { @@ -79,7 +79,7 @@ public ReasonPacketExtension(String reason, * * @return the reason string that this packet extension is transporting. */ - public String getReason() + public Reason getReason() { return reason; } @@ -141,7 +141,7 @@ public String toXML() { StringBuilder bldr = new StringBuilder("<" + getElementName() + ">"); - bldr.append("<" + getReason() + "/>"); + bldr.append("<" + getReason().toString() + "/>"); //add reason "text" if we have it if(getText() != null) diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/ReasonProvider.java b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/ReasonProvider.java index e5c7fa796..6c3f1a91d 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/ReasonProvider.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/ReasonProvider.java @@ -6,6 +6,7 @@ */ package net.java.sip.communicator.impl.protocol.jabber.extensions.jingle; +import org.jivesoftware.smack.packet.*; import org.jivesoftware.smack.provider.*; import org.jivesoftware.smackx.packet.*; import org.xmlpull.v1.*; @@ -38,8 +39,6 @@ public ReasonPacketExtension parseExtension(XmlPullParser parser) { String text = null; Reason reason = null; - //ReasonPacketException reason - // = new ReasonPacketExtension(reason, text, packetExtension); boolean done = false; @@ -63,9 +62,8 @@ public ReasonPacketExtension parseExtension(XmlPullParser parser) else if (elementName.equals( ReasonPacketExtension.TEXT_ELEMENT_NAME)) { - text = parser.getText(); + text = parseText(parser); } - // else { //this is an element that we don't currently support. @@ -73,15 +71,17 @@ else if (elementName.equals( } else if (eventType == XmlPullParser.END_TAG) { - if (parser.getName().equals(JingleIQ.ELEMENT_NAME)) + if (parser.getName().equals(ReasonPacketExtension.ELEMENT_NAME)) { done = true; } } } + ReasonPacketExtension reasonExt + = new ReasonPacketExtension(reason, text, (PacketExtension)null); + + return reasonExt; - //return reason; - return null; } /** diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/RemoteCandidatePacketExtension.java b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/RemoteCandidatePacketExtension.java index d2a0be499..8544870e5 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/RemoteCandidatePacketExtension.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/jingle/RemoteCandidatePacketExtension.java @@ -7,6 +7,8 @@ package net.java.sip.communicator.impl.protocol.jabber.extensions.jingle; /** + * A representation of the remote-candidate ICE transport element. + * * @author Emil Ivov */ public class RemoteCandidatePacketExtension extends CandidatePacketExtension