diff --git a/build/build.xml b/build/build.xml index fd44fa384..d0bad0552 100644 --- a/build/build.xml +++ b/build/build.xml @@ -199,7 +199,7 @@ - + diff --git a/jingle/extension/build/build.xml b/jingle/extension/build/build.xml index f7e950a54..c6539e935 100644 --- a/jingle/extension/build/build.xml +++ b/jingle/extension/build/build.xml @@ -85,7 +85,7 @@ - + diff --git a/jingle/extension/build/merge/jstun-0.7.2.jar b/jingle/extension/build/merge/jstun-0.7.2.jar new file mode 100644 index 000000000..df7e883fd Binary files /dev/null and b/jingle/extension/build/merge/jstun-0.7.2.jar differ diff --git a/jingle/extension/build/merge/jstun.jar b/jingle/extension/build/merge/jstun.jar deleted file mode 100644 index 1b8ac7519..000000000 Binary files a/jingle/extension/build/merge/jstun.jar and /dev/null differ diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleManager.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleManager.java index 724580d89..7ff46a719 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleManager.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleManager.java @@ -20,7 +20,15 @@ package org.jivesoftware.smackx.jingle; -import org.jivesoftware.smack.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.jivesoftware.smack.ConnectionCreationListener; +import org.jivesoftware.smack.PacketListener; +import org.jivesoftware.smack.RosterListener; +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.filter.PacketFilter; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.packet.Packet; @@ -34,16 +42,13 @@ import org.jivesoftware.smackx.jingle.listeners.JingleSessionListener; import org.jivesoftware.smackx.jingle.listeners.JingleSessionRequestListener; import org.jivesoftware.smackx.jingle.media.JingleMediaManager; import org.jivesoftware.smackx.jingle.media.PayloadType; +import org.jivesoftware.smackx.jingle.nat.BasicTransportManager; import org.jivesoftware.smackx.jingle.nat.TransportCandidate; import org.jivesoftware.smackx.jingle.nat.TransportResolver; import org.jivesoftware.smackx.packet.DiscoverInfo; import org.jivesoftware.smackx.packet.Jingle; import org.jivesoftware.smackx.provider.JingleProvider; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - /** * Jingle is a session establishment protocol defined in (XEP-0166). * It defines a framework for negotiating and managing out-of-band ( data that is send and receive through other connection than XMPP connection) data sessions over XMPP. @@ -179,7 +184,9 @@ import java.util.List; */ public class JingleManager implements JingleSessionListener { - // non-static + private static final SmackLogger LOGGER = SmackLogger.getLogger(JingleManager.class); + + // non-static final List jingleSessions = new ArrayList(); @@ -195,21 +202,7 @@ public class JingleManager implements JingleSessionListener { // The Media Managers private List jingleMediaManagers; - static { - ProviderManager providerManager = ProviderManager.getInstance(); - providerManager.addIQProvider("jingle", "http://www.xmpp.org/extensions/xep-0166.html#ns", new JingleProvider()); - - // Enable the Jingle support on every established connection - // The ServiceDiscoveryManager class should have been already - // initialized - XMPPConnection.addConnectionCreationListener(new ConnectionCreationListener() { - public void connectionCreated(XMPPConnection connection) { - JingleManager.setServiceEnabled(connection, true); - } - }); - } - - /** + /** * Default constructor with a defined XMPPConnection, Transport Resolver and a Media Manager * If a fully implemented JingleMediaSession is entered, JingleManager manage Jingle signalling and jmf * @@ -252,32 +245,28 @@ public class JingleManager implements JingleSessionListener { } + /** - * Default constructor with a defined XMPPConnection. - * A default JingleTransportmanager based on BasicResolver will be used in this JingleManager transport. - * - * @param connection XMPP Connection to be used - */ - // public JingleManager(XMPPConnection connection) { - // this(connection, new JingleTransportManager() { - // protected TransportResolver createResolver(JingleSession session) { - // return new BasicResolver(); - // } - // }); - // } - /** - * Default constructor with a defined XMPPConnection and a defined Resolver. - * A default JingleTransportmanager based on BasicResolver will be used in this JingleManager transport. - * - * @param connection XMPP Connection to be used + * Setup the jingle system to let the remote clients know we support Jingle. + * (This used to be a static part of construction. The problem is a remote client might + * attempt a Jingle connection to us after we've created an XMPPConnection, but before we've + * setup an instance of a JingleManager. We will appear to not support Jingle. With the new + * method you just call it once and all new connections will report Jingle support.) */ - // public JingleManager(XMPPConnection connection, final TransportResolver resolver) { - // this(connection, new JingleTransportManager() { - // protected TransportResolver createResolver(JingleSession session) { - // return resolver; - // } - // }); - // } + public static void setJingleServiceEnabled() { + ProviderManager providerManager = ProviderManager.getInstance(); + providerManager.addIQProvider("jingle", "urn:xmpp:tmp:jingle", new JingleProvider()); + + // Enable the Jingle support on every established connection + // The ServiceDiscoveryManager class should have been already + // initialized + XMPPConnection.addConnectionCreationListener(new ConnectionCreationListener() { + public void connectionCreated(XMPPConnection connection) { + JingleManager.setServiceEnabled(connection, true); + } + }); + } + /** * Enables or disables the Jingle support on a given connection. *

@@ -429,7 +418,7 @@ public class JingleManager implements JingleSessionListener { jingleSession.removeListener(this); jingleSessions.remove(jingleSession); jingleSession.close(); - System.err.println("Declined:" + reason); + LOGGER.error("Declined:" + reason); } public void sessionRedirected(String redirection, JingleSession jingleSession) { diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleNegotiator.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleNegotiator.java index 88f020227..ee8c98cb1 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleNegotiator.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleNegotiator.java @@ -19,14 +19,14 @@ */ package org.jivesoftware.smackx.jingle; +import java.util.ArrayList; +import java.util.List; + import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smackx.jingle.listeners.JingleListener; -import java.util.ArrayList; -import java.util.List; - /** * Basic Jingle negotiator. *

@@ -43,7 +43,9 @@ import java.util.List; */ public abstract class JingleNegotiator { - //private XMPPConnection connection; // The connection associated + private static final SmackLogger LOGGER = SmackLogger.getLogger(JingleNegotiator.class); + + //private XMPPConnection connection; // The connection associated protected JingleSession session; @@ -78,7 +80,7 @@ public abstract class JingleNegotiator { JingleNegotiatorState stateWas = state; - System.out.println("Negotiator state change: " + stateWas + "->" + stateIs + "(" + this.getClass().getSimpleName() + ")"); + LOGGER.debug("Negotiator state change: " + stateWas + "->" + stateIs + "(" + this.getClass().getSimpleName() + ")"); switch (stateIs) { case PENDING: diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleSession.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleSession.java index 9bbeb158b..5efae61e5 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleSession.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleSession.java @@ -52,6 +52,12 @@ package org.jivesoftware.smackx.jingle; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + import org.jivesoftware.smack.ConnectionListener; import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.XMPPConnection; @@ -65,7 +71,11 @@ import org.jivesoftware.smackx.jingle.listeners.JingleListener; import org.jivesoftware.smackx.jingle.listeners.JingleMediaListener; import org.jivesoftware.smackx.jingle.listeners.JingleSessionListener; import org.jivesoftware.smackx.jingle.listeners.JingleTransportListener; -import org.jivesoftware.smackx.jingle.media.*; +import org.jivesoftware.smackx.jingle.media.JingleMediaManager; +import org.jivesoftware.smackx.jingle.media.JingleMediaSession; +import org.jivesoftware.smackx.jingle.media.MediaNegotiator; +import org.jivesoftware.smackx.jingle.media.MediaReceivedListener; +import org.jivesoftware.smackx.jingle.media.PayloadType; import org.jivesoftware.smackx.jingle.nat.JingleTransportManager; import org.jivesoftware.smackx.jingle.nat.TransportCandidate; import org.jivesoftware.smackx.jingle.nat.TransportNegotiator; @@ -73,8 +83,6 @@ import org.jivesoftware.smackx.jingle.nat.TransportResolver; import org.jivesoftware.smackx.packet.Jingle; import org.jivesoftware.smackx.packet.JingleError; -import java.util.*; - /** * An abstract Jingle session.

This class contains some basic properties of * every Jingle session. However, the concrete implementation can be found in @@ -85,7 +93,9 @@ import java.util.*; */ public class JingleSession extends JingleNegotiator implements MediaReceivedListener { - // static + private static final SmackLogger LOGGER = SmackLogger.getLogger(JingleSession.class); + + // static private static final HashMap sessions = new HashMap(); private static final Random randomGenerator = new Random(); @@ -98,6 +108,8 @@ public class JingleSession extends JingleNegotiator implements MediaReceivedList private String sid; // A unique id that identifies this session + ConnectionListener connectionListener; + PacketListener packetListener; PacketFilter packetFilter; @@ -264,7 +276,7 @@ public class JingleSession extends JingleNegotiator implements MediaReceivedList public void setSessionState(JingleSessionState stateIs) { - System.out.println("Session state change: " + sessionState + "->" + stateIs); + LOGGER.debug("Session state change: " + sessionState + "->" + stateIs); stateIs.enter(); sessionState = stateIs; } @@ -307,7 +319,7 @@ public class JingleSession extends JingleNegotiator implements MediaReceivedList String responseId = null; - System.out.println("Packet: " + iq.toXML()); + LOGGER.debug("Packet: " + iq.toXML()); try { @@ -505,7 +517,8 @@ public class JingleSession extends JingleNegotiator implements MediaReceivedList } // The the packet. - getConnection().sendPacket(jout); + if ((getConnection() != null) && (getConnection().isConnected())) + getConnection().sendPacket(jout); } return jout; } @@ -689,7 +702,7 @@ public class JingleSession extends JingleNegotiator implements MediaReceivedList */ private void installConnectionListeners(final XMPPConnection connection) { if (connection != null) { - connection.addConnectionListener(new ConnectionListener() { + connectionListener = new ConnectionListener() { public void connectionClosed() { unregisterInstanceFor(connection); } @@ -706,9 +719,18 @@ public class JingleSession extends JingleNegotiator implements MediaReceivedList public void reconnectionFailed(Exception exception) { } - }); + }; + connection.addConnectionListener(connectionListener); } } + + private void removeConnectionListener() { + if (connectionListener != null) { + getConnection().removeConnectionListener(connectionListener); + + LOGGER.debug("JINGLE SESSION: REMOVE CONNECTION LISTENER"); + } + } /** * Remove the packet listener used for processing packet. @@ -717,7 +739,7 @@ public class JingleSession extends JingleNegotiator implements MediaReceivedList if (packetListener != null) { getConnection().removePacketListener(packetListener); - System.out.println("REMOVE PACKET LISTENER"); + LOGGER.debug("JINGLE SESSION: REMOVE PACKET LISTENER"); } } @@ -728,7 +750,7 @@ public class JingleSession extends JingleNegotiator implements MediaReceivedList protected void updatePacketListener() { removePacketListener(); - System.out.println("UpdatePacketListener"); + LOGGER.debug("UpdatePacketListener"); packetListener = new PacketListener() { public void processPacket(Packet packet) { @@ -763,21 +785,21 @@ public class JingleSession extends JingleNegotiator implements MediaReceivedList String sid = jin.getSid(); if (sid == null || !sid.equals(getSid())) { - System.out.println("Ignored Jingle(SID) " + sid + "|" + getSid() + " :" + iq.toXML()); + LOGGER.debug("Ignored Jingle(SID) " + sid + "|" + getSid() + " :" + iq.toXML()); return false; } String ini = jin.getInitiator(); if (!ini.equals(getInitiator())) { - System.out.println("Ignored Jingle(INI): " + iq.toXML()); + LOGGER.debug("Ignored Jingle(INI): " + iq.toXML()); return false; } } else { // We accept some non-Jingle IQ packets: ERRORs and ACKs if (iq.getType().equals(IQ.Type.SET)) { - System.out.println("Ignored Jingle(TYPE): " + iq.toXML()); + LOGGER.debug("Ignored Jingle(TYPE): " + iq.toXML()); return false; } else if (iq.getType().equals(IQ.Type.GET)) { - System.out.println("Ignored Jingle(TYPE): " + iq.toXML()); + LOGGER.debug("Ignored Jingle(TYPE): " + iq.toXML()); return false; } } @@ -882,12 +904,17 @@ public class JingleSession extends JingleNegotiator implements MediaReceivedList public void transportEstablished(TransportCandidate local, TransportCandidate remote) { if (isFullyEstablished()) { - for (ContentNegotiator contentNegotiator : contentNegotiators) { + + // Indicate that this session is active. + setSessionState(JingleSessionStateActive.getInstance()); + + for (ContentNegotiator contentNegotiator : contentNegotiators) { if (contentNegotiator.getNegotiatorState() == JingleNegotiatorState.SUCCEEDED) contentNegotiator.triggerContentEstablished(); } if (getSessionState().equals(JingleSessionStatePending.getInstance())) { + Jingle jout = new Jingle(JingleActionEnum.SESSION_ACCEPT); // Build up a response packet from each media manager. @@ -1028,7 +1055,7 @@ public class JingleSession extends JingleNegotiator implements MediaReceivedList public void terminate(String reason) throws XMPPException { if (isClosed()) return; - System.out.println("Terminate " + reason); + LOGGER.debug("Terminate " + reason); Jingle jout = new Jingle(JingleActionEnum.SESSION_TERMINATE); jout.setType(IQ.Type.SET); sendPacket(jout); @@ -1055,7 +1082,9 @@ public class JingleSession extends JingleNegotiator implements MediaReceivedList contentNegotiator.close(); } removePacketListener(); - System.out.println("Negotiation Closed: " + getConnection().getUser() + " " + sid); + removeConnectionListener(); + getConnection().removeConnectionListener(connectionListener); + LOGGER.debug("Negotiation Closed: " + getConnection().getUser() + " " + sid); super.close(); } @@ -1114,7 +1143,7 @@ public class JingleSession extends JingleNegotiator implements MediaReceivedList IQ iqError = createIQ(ID, to, from, IQ.Type.ERROR); iqError.setError(error); - System.out.println("Created Error Packet:" + iqError.toXML()); + LOGGER.debug("Created Error Packet:" + iqError.toXML()); return iqError; } @@ -1145,7 +1174,7 @@ public class JingleSession extends JingleNegotiator implements MediaReceivedList // NO! Let the normal state machinery do all of the sending. // getConnection().sendPacket(perror); - System.err.println("Error sent: " + errorPacket.toXML()); + LOGGER.error("Error sent: " + errorPacket.toXML()); } return errorPacket; } diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleSessionStateEnded.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleSessionStateEnded.java index 0c34b13c2..3fd1f0850 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleSessionStateEnded.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/JingleSessionStateEnded.java @@ -9,7 +9,10 @@ import org.jivesoftware.smackx.packet.JingleError; * @see JingleSessionState */ public class JingleSessionStateEnded extends JingleSessionState { - private static JingleSessionStateEnded INSTANCE = null; + + private static final SmackLogger LOGGER = SmackLogger.getLogger(JingleSessionStateEnded.class); + + private static JingleSessionStateEnded INSTANCE = null; protected JingleSessionStateEnded() { // Prevent instantiation of the class. @@ -28,8 +31,8 @@ public class JingleSessionStateEnded extends JingleSessionState { } public void enter() { - System.out.println("Session Ended"); - System.out.println("-------------------------------------------------------------------"); + LOGGER.debug("Session Ended"); + LOGGER.debug("-------------------------------------------------------------------"); } diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/SmackLogger.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/SmackLogger.java new file mode 100644 index 000000000..4ef16946f --- /dev/null +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/SmackLogger.java @@ -0,0 +1,192 @@ +/** + * $RCSfile$ + * $Revision: 7071 $ + * $Date: 2007-02-11 16:59:05 -0800 (Sun, 11 Feb 2007) $ + * + * Copyright 2003-2007 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.jingle; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import org.apache.commons.logging.Log; + +// -------------------------------------------------------------------------- +/** + * SmackLogger attempts to use Apache commons-logging if it's available. + * + * When you request an instance of SmackLogger we make an attempt to create an instance of org.apache.commons.logging.Log. + * If we are able to make an instance of Log then we dispatch all log requests to commons-logging. + * If we are not able to make an instance of Log then we dispatch all log requests to System.out/err. + * + * @author jeffw + */ +public class SmackLogger { + + private Log commonsLogger; + + // -------------------------------------------------------------------------- + /** + * This static method is the only way to get an instance of a SmackLogger. + * @param classToLog This is the class that wants to log. (This gives commons-logging a means to control log-level by class.) + * @return An instance of a SmackLogger for the class that wants logging. + */ + public static SmackLogger getLogger(Class classToLog) { + return new SmackLogger(classToLog); + } + + // -------------------------------------------------------------------------- + /** + * This is private to make it impossible to instantiate a new SmackLogger outside of the getLogger() static method. + * @param classToLog This is the class that wants to log. (This gives commons-logging a means to control log-level by class.) + */ + public SmackLogger(Class classToLog) { + setupSmackLogger(classToLog); + } + + // -------------------------------------------------------------------------- + /** + * The actual attempt to create an instance of commons-logging Log. + * @param classToLog + * @return + */ + private void setupSmackLogger(Class classToLog) { + try { + Class logFactoryClass = SmackLogger.class.getClassLoader().loadClass("org.apache.commons.logging.LogFactory"); + Method method = logFactoryClass.getMethod("getLog", Class.class); + //Constructor constructor = Log.class.getConstructor(new Class[] { Object.class }); + commonsLogger = (Log) method.invoke(null, classToLog); + + // We don't care to do anything about exceptions. + // If we can't create a commons-logger then just use our simple one. + } catch (ClassNotFoundException e) { + } catch (SecurityException e) { + } catch (NoSuchMethodException e) { + } catch (IllegalArgumentException e) { + } catch (IllegalAccessException e) { + } catch (InvocationTargetException e) { + } + } + + // -------------------------------------------------------------------------- + /** + * Wrapper for commons-logging error(Object msg, Exception exception) + * @param inDebugMsg + */ + public void error(String inErrorMsg, Exception inException) { + if (commonsLogger != null) { + commonsLogger.error(inErrorMsg, inException); + } else { + System.err.println(inErrorMsg); + inException.printStackTrace(System.err); + } + } + + // -------------------------------------------------------------------------- + /** + * Wrapper for commons-logging error(Object msg) + * @param inDebugMsg + */ + public void error(String inErrorMsg) { + if (commonsLogger != null) { + commonsLogger.error(inErrorMsg); + } else { + System.err.println(inErrorMsg); + } + } + + // -------------------------------------------------------------------------- + /** + * Wrapper for commons-logging debug(Object msg) + * @param inDebugMsg + */ + public void debug(String inDebugMsg, Exception inException) { + if (commonsLogger != null) { + commonsLogger.debug(inDebugMsg, inException); + } else { + System.out.println(inDebugMsg); + inException.printStackTrace(System.out); + } + } + + // -------------------------------------------------------------------------- + /** + * Wrapper for commons-logging debug(Object msg) + * @param inDebugMsg + */ + public void debug(String inDebugMsg) { + if (commonsLogger != null) { + commonsLogger.debug(inDebugMsg); + } else { + System.out.println(inDebugMsg); + } + } + + // -------------------------------------------------------------------------- + /** + * Wrapper for commons-logging warn(Object msg) + * @param inDebugMsg + */ + public void warn(String inDebugMsg, Exception inException) { + if (commonsLogger != null) { + commonsLogger.warn(inDebugMsg, inException); + } else { + System.out.println(inDebugMsg); + inException.printStackTrace(System.out); + } + } + + // -------------------------------------------------------------------------- + /** + * Wrapper for commons-logging warn(Object msg) + * @param inDebugMsg + */ + public void warn(String inDebugMsg) { + if (commonsLogger != null) { + commonsLogger.warn(inDebugMsg); + } else { + System.out.println(inDebugMsg); + } + } + + // -------------------------------------------------------------------------- + /** + * Wrapper for commons-logging info(Object msg) + * @param inDebugMsg + */ + public void info(String inDebugMsg, Exception inException) { + if (commonsLogger != null) { + commonsLogger.info(inDebugMsg, inException); + } else { + System.out.println(inDebugMsg); + inException.printStackTrace(System.out); + } + } + + // -------------------------------------------------------------------------- + /** + * Wrapper for commons-logging info(Object msg) + * @param inDebugMsg + */ + public void info(String inDebugMsg) { + if (commonsLogger != null) { + commonsLogger.info(inDebugMsg); + } else { + System.out.println(inDebugMsg); + } + } + +} diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/media/MediaNegotiator.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/media/MediaNegotiator.java index e4bed6e98..7bcbb50b2 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/media/MediaNegotiator.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/media/MediaNegotiator.java @@ -19,9 +19,18 @@ */ package org.jivesoftware.smackx.jingle.media; +import java.util.ArrayList; +import java.util.List; + import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.packet.IQ; -import org.jivesoftware.smackx.jingle.*; +import org.jivesoftware.smackx.jingle.ContentNegotiator; +import org.jivesoftware.smackx.jingle.JingleActionEnum; +import org.jivesoftware.smackx.jingle.JingleException; +import org.jivesoftware.smackx.jingle.JingleNegotiator; +import org.jivesoftware.smackx.jingle.JingleNegotiatorState; +import org.jivesoftware.smackx.jingle.JingleSession; +import org.jivesoftware.smackx.jingle.SmackLogger; import org.jivesoftware.smackx.jingle.listeners.JingleListener; import org.jivesoftware.smackx.jingle.listeners.JingleMediaListener; import org.jivesoftware.smackx.packet.Jingle; @@ -29,9 +38,6 @@ import org.jivesoftware.smackx.packet.JingleContent; import org.jivesoftware.smackx.packet.JingleDescription; import org.jivesoftware.smackx.packet.JingleError; -import java.util.ArrayList; -import java.util.List; - /** * Manager for jmf descriptor negotiation.

This class is responsible * for managing the descriptor negotiation process, handling all the xmpp @@ -42,7 +48,9 @@ import java.util.List; */ public class MediaNegotiator extends JingleNegotiator { - //private JingleSession session; // The session this negotiation + private static final SmackLogger LOGGER = SmackLogger.getLogger(MediaNegotiator.class); + + //private JingleSession session; // The session this negotiation private final JingleMediaManager mediaManager; @@ -211,7 +219,7 @@ public class MediaNegotiator extends JingleNegotiator { setNegotiatorState(JingleNegotiatorState.SUCCEEDED); triggerMediaEstablished(getBestCommonAudioPt()); - System.err.println("Media choice:" + getBestCommonAudioPt().getName()); + LOGGER.error("Media choice:" + getBestCommonAudioPt().getName()); response = session.createAck(jingle); } diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/JMFInit.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/JMFInit.java index bdc3545fa..5a7571af3 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/JMFInit.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/JMFInit.java @@ -1,18 +1,25 @@ package org.jivesoftware.smackx.jingle.mediaimpl; -import com.sun.media.util.Registry; -import com.sun.media.ExclusiveUse; - -import javax.media.format.AudioFormat; -import javax.media.Renderer; -import javax.media.PlugInManager; -import javax.media.Format; -import java.awt.*; +import java.awt.Frame; +import java.awt.TextArea; +import java.awt.Toolkit; import java.util.Vector; +import javax.media.Format; +import javax.media.PlugInManager; +import javax.media.Renderer; +import javax.media.format.AudioFormat; + +import org.jivesoftware.smackx.jingle.SmackLogger; + +import com.sun.media.ExclusiveUse; +import com.sun.media.util.Registry; + public class JMFInit extends Frame implements Runnable { - private String tempDir = "/tmp"; + private static final SmackLogger LOGGER = SmackLogger.getLogger(JMFInit.class); + + private String tempDir = "/tmp"; private boolean done = false; @@ -248,7 +255,7 @@ public class JMFInit extends Frame implements Runnable { } private void message(String mesg) { - System.out.println(mesg); + LOGGER.debug(mesg); } private void createGUI() { diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jmf/AudioChannel.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jmf/AudioChannel.java index 963e39ddb..74ca63ede 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jmf/AudioChannel.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jmf/AudioChannel.java @@ -19,9 +19,22 @@ */ package org.jivesoftware.smackx.jingle.mediaimpl.jmf; -import org.jivesoftware.smackx.jingle.media.JingleMediaSession; +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.List; -import javax.media.*; +import javax.media.Codec; +import javax.media.Controller; +import javax.media.ControllerClosedEvent; +import javax.media.ControllerEvent; +import javax.media.ControllerListener; +import javax.media.Format; +import javax.media.MediaLocator; +import javax.media.NoProcessorException; +import javax.media.Processor; +import javax.media.UnsupportedPlugInException; import javax.media.control.BufferControl; import javax.media.control.PacketSizeControl; import javax.media.control.TrackControl; @@ -34,11 +47,9 @@ import javax.media.rtp.InvalidSessionAddressException; import javax.media.rtp.RTPManager; import javax.media.rtp.SendStream; import javax.media.rtp.SessionAddress; -import java.io.IOException; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.List; + +import org.jivesoftware.smackx.jingle.SmackLogger; +import org.jivesoftware.smackx.jingle.media.JingleMediaSession; /** * An Easy to use Audio Channel implemented using JMF. @@ -60,7 +71,9 @@ import java.util.List; */ public class AudioChannel { - private MediaLocator locator; + private static final SmackLogger LOGGER = SmackLogger.getLogger(AudioChannel.class); + + private MediaLocator locator; private String localIpAddress; private String remoteIpAddress; private int localPort; @@ -239,8 +252,8 @@ public class AudioChannel { } if (chosen != null) { tracks[i].setFormat(chosen); - System.err.println("Track " + i + " is set to transmit as:"); - System.err.println(" " + chosen); + LOGGER.error("Track " + i + " is set to transmit as:"); + LOGGER.error(" " + chosen); if (tracks[i].getFormat() instanceof AudioFormat) { int packetRate = 20; @@ -375,7 +388,7 @@ public class AudioChannel { rtpMgrs[i].addTarget(destAddr); - System.err.println("Created RTP session at " + localPort + " to: " + remoteIpAddress + " " + port); + LOGGER.error("Created RTP session at " + localPort + " to: " + remoteIpAddress + " " + port); sendStream = rtpMgrs[i].createSendStream(dataOutput, i); @@ -404,11 +417,11 @@ public class AudioChannel { try { if (active) { sendStream.start(); - System.out.println("START"); + LOGGER.debug("START"); } else { sendStream.stop(); - System.out.println("STOP"); + LOGGER.debug("STOP"); } } catch (IOException e) { diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jmf/AudioMediaSession.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jmf/AudioMediaSession.java index 5238f51ec..33453b735 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jmf/AudioMediaSession.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jmf/AudioMediaSession.java @@ -20,15 +20,17 @@ package org.jivesoftware.smackx.jingle.mediaimpl.jmf; +import java.io.IOException; +import java.net.ServerSocket; + +import javax.media.MediaLocator; + import org.jivesoftware.smackx.jingle.JingleSession; +import org.jivesoftware.smackx.jingle.SmackLogger; import org.jivesoftware.smackx.jingle.media.JingleMediaSession; import org.jivesoftware.smackx.jingle.media.PayloadType; import org.jivesoftware.smackx.jingle.nat.TransportCandidate; -import javax.media.MediaLocator; -import java.io.IOException; -import java.net.ServerSocket; - /** * This Class implements a complete JingleMediaSession. * It sould be used to transmit and receive audio captured from the Mic. @@ -41,7 +43,9 @@ import java.net.ServerSocket; */ public class AudioMediaSession extends JingleMediaSession { - private AudioChannel audioChannel; + private static final SmackLogger LOGGER = SmackLogger.getLogger(AudioMediaSession.class); + + private AudioChannel audioChannel; /** * Creates a org.jivesoftware.jingleaudio.jmf.AudioMediaSession with defined payload type, remote and local candidates @@ -73,7 +77,7 @@ public class AudioMediaSession extends JingleMediaSession { localPort = getFreePort(); remotePort = this.getLocal().getSymmetric().getPort(); - System.out.println(this.getLocal().getConnection() + " " + ip + ": " + localPort + "->" + remotePort); + LOGGER.debug(this.getLocal().getConnection() + " " + ip + ": " + localPort + "->" + remotePort); } else { diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jmf/AudioReceiver.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jmf/AudioReceiver.java index b8b7c0618..e62455b7c 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jmf/AudioReceiver.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jmf/AudioReceiver.java @@ -20,12 +20,27 @@ package org.jivesoftware.smackx.jingle.mediaimpl.jmf; -import org.jivesoftware.smackx.jingle.media.JingleMediaSession; - -import javax.media.*; +import javax.media.ControllerErrorEvent; +import javax.media.ControllerEvent; +import javax.media.ControllerListener; +import javax.media.Player; +import javax.media.RealizeCompleteEvent; import javax.media.protocol.DataSource; -import javax.media.rtp.*; -import javax.media.rtp.event.*; +import javax.media.rtp.Participant; +import javax.media.rtp.RTPControl; +import javax.media.rtp.ReceiveStream; +import javax.media.rtp.ReceiveStreamListener; +import javax.media.rtp.SessionListener; +import javax.media.rtp.event.ByeEvent; +import javax.media.rtp.event.NewParticipantEvent; +import javax.media.rtp.event.NewReceiveStreamEvent; +import javax.media.rtp.event.ReceiveStreamEvent; +import javax.media.rtp.event.RemotePayloadChangeEvent; +import javax.media.rtp.event.SessionEvent; +import javax.media.rtp.event.StreamMappedEvent; + +import org.jivesoftware.smackx.jingle.SmackLogger; +import org.jivesoftware.smackx.jingle.media.JingleMediaSession; /** * This class implements receive methods and listeners to be used in AudioChannel @@ -35,7 +50,9 @@ import javax.media.rtp.event.*; public class AudioReceiver implements ReceiveStreamListener, SessionListener, ControllerListener { - boolean dataReceived = false; + private static final SmackLogger LOGGER = SmackLogger.getLogger(AudioReceiver.class); + + boolean dataReceived = false; Object dataSync; JingleMediaSession jingleMediaSession; @@ -51,7 +68,7 @@ public class AudioReceiver implements ReceiveStreamListener, SessionListener, public synchronized void update(SessionEvent evt) { if (evt instanceof NewParticipantEvent) { Participant p = ((NewParticipantEvent) evt).getParticipant(); - System.err.println(" - A new participant had just joined: " + p.getCNAME()); + LOGGER.error(" - A new participant had just joined: " + p.getCNAME()); } } @@ -64,8 +81,8 @@ public class AudioReceiver implements ReceiveStreamListener, SessionListener, ReceiveStream stream = evt.getReceiveStream(); // could be null. if (evt instanceof RemotePayloadChangeEvent) { - System.err.println(" - Received an RTP PayloadChangeEvent."); - System.err.println("Sorry, cannot handle payload change."); + LOGGER.error(" - Received an RTP PayloadChangeEvent."); + LOGGER.error("Sorry, cannot handle payload change."); } else if (evt instanceof NewReceiveStreamEvent) { @@ -77,15 +94,15 @@ public class AudioReceiver implements ReceiveStreamListener, SessionListener, // Find out the formats. RTPControl ctl = (RTPControl) ds.getControl("javax.jmf.rtp.RTPControl"); if (ctl != null) { - System.err.println(" - Recevied new RTP stream: " + ctl.getFormat()); + LOGGER.error(" - Recevied new RTP stream: " + ctl.getFormat()); } else - System.err.println(" - Recevied new RTP stream"); + LOGGER.error(" - Recevied new RTP stream"); if (participant == null) - System.err.println(" The sender of this stream had yet to be identified."); + LOGGER.error(" The sender of this stream had yet to be identified."); else { - System.err.println(" The stream comes from: " + participant.getCNAME()); + LOGGER.error(" The stream comes from: " + participant.getCNAME()); } // create a player by passing datasource to the Media Manager @@ -105,7 +122,7 @@ public class AudioReceiver implements ReceiveStreamListener, SessionListener, } catch (Exception e) { - System.err.println("NewReceiveStreamEvent exception " + e.getMessage()); + LOGGER.error("NewReceiveStreamEvent exception " + e.getMessage()); return; } @@ -116,15 +133,15 @@ public class AudioReceiver implements ReceiveStreamListener, SessionListener, DataSource ds = stream.getDataSource(); // Find out the formats. RTPControl ctl = (RTPControl) ds.getControl("javax.jmf.rtp.RTPControl"); - System.err.println(" - The previously unidentified stream "); + LOGGER.error(" - The previously unidentified stream "); if (ctl != null) - System.err.println(" " + ctl.getFormat()); - System.err.println(" had now been identified as sent by: " + participant.getCNAME()); + LOGGER.error(" " + ctl.getFormat()); + LOGGER.error(" had now been identified as sent by: " + participant.getCNAME()); } } else if (evt instanceof ByeEvent) { - System.err.println(" - Got \"bye\" from: " + participant.getCNAME()); + LOGGER.error(" - Got \"bye\" from: " + participant.getCNAME()); } @@ -147,7 +164,7 @@ public class AudioReceiver implements ReceiveStreamListener, SessionListener, if (ce instanceof ControllerErrorEvent) { p.removeControllerListener(this); - System.err.println("Receiver internal error: " + ce); + LOGGER.error("Receiver internal error: " + ce); } } diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jmf/JmfMediaManager.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jmf/JmfMediaManager.java index 762c17ea5..38f1ce60b 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jmf/JmfMediaManager.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jmf/JmfMediaManager.java @@ -20,7 +20,13 @@ package org.jivesoftware.smackx.jingle.mediaimpl.jmf; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + import org.jivesoftware.smackx.jingle.JingleSession; +import org.jivesoftware.smackx.jingle.SmackLogger; import org.jivesoftware.smackx.jingle.media.JingleMediaManager; import org.jivesoftware.smackx.jingle.media.JingleMediaSession; import org.jivesoftware.smackx.jingle.media.PayloadType; @@ -28,11 +34,6 @@ import org.jivesoftware.smackx.jingle.mediaimpl.JMFInit; import org.jivesoftware.smackx.jingle.nat.JingleTransportManager; import org.jivesoftware.smackx.jingle.nat.TransportCandidate; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - /** * Implements a jingleMediaManager using JMF based API. * It supports GSM and G723 codecs. @@ -42,7 +43,9 @@ import java.util.List; */ public class JmfMediaManager extends JingleMediaManager { - public static final String MEDIA_NAME = "JMF"; + private static final SmackLogger LOGGER = SmackLogger.getLogger(JmfMediaManager.class); + + public static final String MEDIA_NAME = "JMF"; private List payloads = new ArrayList(); @@ -142,7 +145,7 @@ public class JmfMediaManager extends JingleMediaManager { jmfProperties.createNewFile(); } catch (IOException ex) { - System.out.println("Failed to create jmf.properties"); + LOGGER.debug("Failed to create jmf.properties"); ex.printStackTrace(); } } diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jspeex/AudioMediaSession.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jspeex/AudioMediaSession.java index 28e43ca9c..af4fe7092 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jspeex/AudioMediaSession.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jspeex/AudioMediaSession.java @@ -20,25 +20,28 @@ package org.jivesoftware.smackx.jingle.mediaimpl.jspeex; -import mil.jfcom.cie.media.session.MediaSession; -import mil.jfcom.cie.media.session.MediaSessionListener; -import mil.jfcom.cie.media.session.StreamPlayer; -import mil.jfcom.cie.media.srtp.packetizer.SpeexFormat; -import org.jivesoftware.smackx.jingle.JingleSession; -import org.jivesoftware.smackx.jingle.media.JingleMediaSession; -import org.jivesoftware.smackx.jingle.media.PayloadType; -import org.jivesoftware.smackx.jingle.nat.TransportCandidate; - -import javax.media.NoProcessorException; -import javax.media.format.UnsupportedFormatException; -import javax.media.rtp.rtcp.SenderReport; -import javax.media.rtp.rtcp.SourceDescription; import java.io.IOException; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.ServerSocket; import java.security.GeneralSecurityException; +import javax.media.NoProcessorException; +import javax.media.format.UnsupportedFormatException; +import javax.media.rtp.rtcp.SenderReport; +import javax.media.rtp.rtcp.SourceDescription; + +import mil.jfcom.cie.media.session.MediaSession; +import mil.jfcom.cie.media.session.MediaSessionListener; +import mil.jfcom.cie.media.session.StreamPlayer; +import mil.jfcom.cie.media.srtp.packetizer.SpeexFormat; + +import org.jivesoftware.smackx.jingle.JingleSession; +import org.jivesoftware.smackx.jingle.SmackLogger; +import org.jivesoftware.smackx.jingle.media.JingleMediaSession; +import org.jivesoftware.smackx.jingle.media.PayloadType; +import org.jivesoftware.smackx.jingle.nat.TransportCandidate; + /** * This Class implements a complete JingleMediaSession. * It sould be used to transmit and receive audio captured from the Mic. @@ -52,7 +55,9 @@ import java.security.GeneralSecurityException; public class AudioMediaSession extends JingleMediaSession implements MediaSessionListener { - private MediaSession mediaSession; + private static final SmackLogger LOGGER = SmackLogger.getLogger(AudioMediaSession.class); + + private MediaSession mediaSession; /** * Create a Session using Speex Codec @@ -123,7 +128,7 @@ public class AudioMediaSession extends JingleMediaSession implements MediaSessio localPort = getFreePort(); remotePort = this.getLocal().getSymmetric().getPort(); - System.out.println(this.getLocal().getConnection() + " " + ip + ": " + localPort + "->" + remotePort); + LOGGER.debug(this.getLocal().getConnection() + " " + ip + ": " + localPort + "->" + remotePort); } else { @@ -155,7 +160,7 @@ public class AudioMediaSession extends JingleMediaSession implements MediaSessio */ public void startTrasmit() { try { - System.out.println("start"); + LOGGER.debug("start"); mediaSession.start(true); this.mediaReceived(""); } diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jspeex/SpeexMediaManager.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jspeex/SpeexMediaManager.java index 527cbf750..49b3a3abf 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jspeex/SpeexMediaManager.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/jspeex/SpeexMediaManager.java @@ -19,7 +19,13 @@ */ package org.jivesoftware.smackx.jingle.mediaimpl.jspeex; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + import org.jivesoftware.smackx.jingle.JingleSession; +import org.jivesoftware.smackx.jingle.SmackLogger; import org.jivesoftware.smackx.jingle.media.JingleMediaManager; import org.jivesoftware.smackx.jingle.media.JingleMediaSession; import org.jivesoftware.smackx.jingle.media.PayloadType; @@ -27,11 +33,6 @@ import org.jivesoftware.smackx.jingle.mediaimpl.JMFInit; import org.jivesoftware.smackx.jingle.nat.JingleTransportManager; import org.jivesoftware.smackx.jingle.nat.TransportCandidate; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - /** * Implements a jingleMediaManager using JMF based API and JSpeex. * It supports Speex codec. @@ -41,7 +42,9 @@ import java.util.List; */ public class SpeexMediaManager extends JingleMediaManager { - public static final String MEDIA_NAME = "Speex"; + private static final SmackLogger LOGGER = SmackLogger.getLogger(SpeexMediaManager.class); + + public static final String MEDIA_NAME = "Speex"; private List payloads = new ArrayList(); @@ -106,7 +109,7 @@ public class SpeexMediaManager extends JingleMediaManager { jmfProperties.createNewFile(); } catch (IOException ex) { - System.out.println("Failed to create jmf.properties"); + LOGGER.debug("Failed to create jmf.properties"); ex.printStackTrace(); } } diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/sshare/ScreenShareSession.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/sshare/ScreenShareSession.java index 7fadac11c..3b253c842 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/sshare/ScreenShareSession.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/sshare/ScreenShareSession.java @@ -19,17 +19,7 @@ */ package org.jivesoftware.smackx.jingle.mediaimpl.sshare; -import org.jivesoftware.smackx.jingle.JingleSession; -import org.jivesoftware.smackx.jingle.media.JingleMediaSession; -import org.jivesoftware.smackx.jingle.media.PayloadType; -import org.jivesoftware.smackx.jingle.mediaimpl.sshare.api.ImageDecoder; -import org.jivesoftware.smackx.jingle.mediaimpl.sshare.api.ImageEncoder; -import org.jivesoftware.smackx.jingle.mediaimpl.sshare.api.ImageReceiver; -import org.jivesoftware.smackx.jingle.mediaimpl.sshare.api.ImageTransmitter; -import org.jivesoftware.smackx.jingle.nat.TransportCandidate; - -import javax.swing.*; -import java.awt.*; +import java.awt.Rectangle; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; @@ -38,6 +28,19 @@ import java.net.InetAddress; import java.net.ServerSocket; import java.net.UnknownHostException; +import javax.swing.JFrame; +import javax.swing.JPanel; + +import org.jivesoftware.smackx.jingle.JingleSession; +import org.jivesoftware.smackx.jingle.SmackLogger; +import org.jivesoftware.smackx.jingle.media.JingleMediaSession; +import org.jivesoftware.smackx.jingle.media.PayloadType; +import org.jivesoftware.smackx.jingle.mediaimpl.sshare.api.ImageDecoder; +import org.jivesoftware.smackx.jingle.mediaimpl.sshare.api.ImageEncoder; +import org.jivesoftware.smackx.jingle.mediaimpl.sshare.api.ImageReceiver; +import org.jivesoftware.smackx.jingle.mediaimpl.sshare.api.ImageTransmitter; +import org.jivesoftware.smackx.jingle.nat.TransportCandidate; + /** * This Class implements a complete JingleMediaSession. * It sould be used to transmit and receive captured images from the Display. @@ -49,7 +52,9 @@ import java.net.UnknownHostException; */ public class ScreenShareSession extends JingleMediaSession { - private ImageTransmitter transmitter = null; + private static final SmackLogger LOGGER = SmackLogger.getLogger(ScreenShareSession.class); + + private ImageTransmitter transmitter = null; private ImageReceiver receiver = null; private int width = 600; private int height = 600; @@ -102,7 +107,7 @@ public class ScreenShareSession extends JingleMediaSession { try { receiver = new ImageReceiver(InetAddress.getByName("0.0.0.0"), getRemote().getPort(), getLocal().getPort(), width, height); - System.out.println("Receiving on:" + receiver.getLocalPort()); + LOGGER.debug("Receiving on:" + receiver.getLocalPort()); } catch (UnknownHostException e) { e.printStackTrace(); } diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/sshare/api/ImageTransmitter.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/sshare/api/ImageTransmitter.java index b7884a58e..a4cf8374f 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/sshare/api/ImageTransmitter.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/sshare/api/ImageTransmitter.java @@ -1,6 +1,8 @@ package org.jivesoftware.smackx.jingle.mediaimpl.sshare.api; -import java.awt.*; +import java.awt.AWTException; +import java.awt.Rectangle; +import java.awt.Robot; import java.awt.image.BufferedImage; import java.awt.image.PixelGrabber; import java.io.ByteArrayOutputStream; @@ -10,6 +12,8 @@ import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Arrays; +import org.jivesoftware.smackx.jingle.SmackLogger; + /** * UDP Image Receiver. * It uses PNG Tiles into UDP packets. @@ -18,7 +22,9 @@ import java.util.Arrays; */ public class ImageTransmitter implements Runnable { - private Robot robot; + private static final SmackLogger LOGGER = SmackLogger.getLogger(ImageTransmitter.class); + + private Robot robot; private InetAddress localHost; private InetAddress remoteHost; private int localPort; @@ -80,7 +86,7 @@ public class ImageTransmitter implements Runnable { if (++keyframe > KEYFRAME) { keyframe = 0; } - System.out.println("KEYFRAME:" + keyframe); + LOGGER.debug("KEYFRAME:" + keyframe); for (int i = 0; i < maxI; i++) { for (int j = 0; j < maxJ; j++) { @@ -110,7 +116,7 @@ public class ImageTransmitter implements Runnable { byte[] bytesOut = baos.toByteArray(); if (bytesOut.length > 1000) - System.err.println(bytesOut.length); + LOGGER.error("Bytes out > 1000. Equals " + bytesOut.length); p.setData(bytesOut); p.setAddress(remoteHost); @@ -142,7 +148,7 @@ public class ImageTransmitter implements Runnable { } trace = (System.currentTimeMillis() - trace); - System.out.println("Loop Time:" + trace); + LOGGER.debug("Loop Time:" + trace); if (trace < 500) { try { diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/sshare/api/OctTreeQuantizer.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/sshare/api/OctTreeQuantizer.java index 9d33eb187..1b8fa9d3c 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/sshare/api/OctTreeQuantizer.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/sshare/api/OctTreeQuantizer.java @@ -19,6 +19,8 @@ package org.jivesoftware.smackx.jingle.mediaimpl.sshare.api; import java.io.PrintStream; import java.util.Vector; +import org.jivesoftware.smackx.jingle.SmackLogger; + /** * An image Quantizer based on the Octree algorithm. This is a very basic implementation * at present and could be much improved by picking the nodes to reduce more carefully @@ -26,6 +28,8 @@ import java.util.Vector; */ public class OctTreeQuantizer implements Quantizer { + private static final SmackLogger LOGGER = SmackLogger.getLogger(OctTreeQuantizer.class); + /** * The greatest depth the tree is allowed to reach */ @@ -50,12 +54,13 @@ public class OctTreeQuantizer implements Quantizer { * A debugging method which prints the tree out. */ public void list(PrintStream s, int level) { + String indentStr = ""; for (int i = 0; i < level; i++) - System.out.print(' '); + indentStr += " "; if (count == 0) - System.out.println(index+": count="+count); + LOGGER.debug(indentStr + index + ": count=" + count); else - System.out.println(index+": count="+count+" red="+(totalRed/count)+" green="+(totalGreen/count)+" blue="+(totalBlue/count)); + LOGGER.debug(indentStr + index + ": count=" + count + " red=" + (totalRed/count) + " green=" + (totalGreen / count) + " blue=" + (totalBlue / count)); for (int i = 0; i < 8; i++) if (leaf[i] != null) leaf[i].list(s, level+2); @@ -133,7 +138,7 @@ public class OctTreeQuantizer implements Quantizer { else node = child; } - System.out.println("getIndexForColor failed"); + LOGGER.debug("getIndexForColor failed"); return 0; } @@ -144,7 +149,7 @@ public class OctTreeQuantizer implements Quantizer { OctTreeNode node = root; -// System.out.println("insertColor="+Integer.toHexString(rgb)); +// LOGGER.debug("insertColor="+Integer.toHexString(rgb)); for (int level = 0; level <= MAX_LEVEL; level++) { OctTreeNode child; int bit = 0x80 >> level; @@ -190,7 +195,7 @@ public class OctTreeQuantizer implements Quantizer { } else node = child; } - System.out.println("insertColor failed"); + LOGGER.debug("insertColor failed"); } private void reduceTree(int numColors) { @@ -204,7 +209,7 @@ public class OctTreeQuantizer implements Quantizer { OctTreeNode child = node.leaf[i]; if (child != null) { if (!child.isLeaf) - System.out.println("not a leaf!"); + LOGGER.debug("not a leaf!"); node.count += child.count; node.totalRed += child.totalRed; node.totalGreen += child.totalGreen; @@ -225,7 +230,7 @@ public class OctTreeQuantizer implements Quantizer { } } - System.out.println("Unable to reduce the OctTree"); + LOGGER.debug("Unable to reduce the OctTree"); } /** diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/HttpServer.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/HttpServer.java index 24b1f785c..4d57a7c9d 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/HttpServer.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/HttpServer.java @@ -52,28 +52,36 @@ package org.jivesoftware.smackx.jingle.nat; -import java.io.*; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.StringTokenizer; +import org.jivesoftware.smackx.jingle.SmackLogger; + /** * A very Simple HTTP Server */ public class HttpServer { - public HttpServer(int port) { + private static final SmackLogger LOGGER = SmackLogger.getLogger(HttpServer.class); + + public HttpServer(int port) { ServerSocket server_socket; try { server_socket = new ServerSocket(port); - System.out.println("httpServer running on port " + + LOGGER.debug("httpServer running on port " + server_socket.getLocalPort()); while (true) { Socket socket = server_socket.accept(); - System.out.println("New connection accepted " + + LOGGER.debug("New connection accepted " + socket.getInetAddress() + ":" + socket.getPort()); @@ -86,13 +94,13 @@ public class HttpServer { thread.start(); } catch (Exception e) { - System.out.println(e); + LOGGER.debug("", e); } } } catch (IOException e) { - System.out.println(e); + LOGGER.debug("", e); } } @@ -129,7 +137,7 @@ public class HttpServer { while (true) { String headerLine = br.readLine(); - System.out.println(headerLine); + LOGGER.debug(headerLine); if (headerLine.equals(CRLF) || headerLine.equals("")) break; StringTokenizer s = new StringTokenizer(headerLine); diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/ICECandidate.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/ICECandidate.java index d916f58b4..432fe00d5 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/ICECandidate.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/ICECandidate.java @@ -55,6 +55,8 @@ import java.net.InetAddress; import java.net.UnknownHostException; import java.util.List; +import org.jivesoftware.smackx.jingle.SmackLogger; + /** * ICE Transport candidate. *

@@ -65,7 +67,9 @@ import java.util.List; */ public class ICECandidate extends TransportCandidate implements Comparable { - private String id; // An identification + private static final SmackLogger LOGGER = SmackLogger.getLogger(ICECandidate.class); + + private String id; // An identification private String username; @@ -273,7 +277,7 @@ public class ICECandidate extends TransportCandidate implements Comparable { public void testFinished(TestResult testResult, TransportCandidate candidate) { if (testResult.isReachable() && checkingCandidate.equals(candidate)) { result.setResult(true); - System.out.println("RESULT>>>OK:" + candidate.getIp() + ":" + candidate.getPort()); + LOGGER.debug("Candidate reachable: " + candidate.getIp() + ":" + candidate.getPort() + " from " + getIp() +":" + getPort()); } } }; @@ -299,7 +303,7 @@ public class ICECandidate extends TransportCandidate implements Comparable { for (int i = 0; i < 10 && !result.isReachable(); i++) try { - System.err.println("ICE Candidate retry #" + i); + LOGGER.error("ICE Candidate retry #" + i); Thread.sleep(400); } catch (InterruptedException e) { diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/ICEResolver.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/ICEResolver.java index a08fcbca6..2624e7173 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/ICEResolver.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/ICEResolver.java @@ -20,20 +20,24 @@ package org.jivesoftware.smackx.jingle.nat; -import de.javawi.jstun.test.demo.ice.Candidate; -import de.javawi.jstun.test.demo.ice.ICENegociator; -import de.javawi.jstun.util.UtilityException; -import org.jivesoftware.smack.XMPPConnection; -import org.jivesoftware.smack.XMPPException; -import org.jivesoftware.smackx.jingle.JingleSession; - import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; import java.util.Random; +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smackx.jingle.JingleSession; +import org.jivesoftware.smackx.jingle.SmackLogger; + +import de.javawi.jstun.test.demo.ice.Candidate; +import de.javawi.jstun.test.demo.ice.ICENegociator; +import de.javawi.jstun.util.UtilityException; + /** * ICE Resolver for Jingle transport method that results in sending data between two entities using the Interactive Connectivity Establishment (ICE) methodology. (XEP-0176) * The goal of this resolver is to make possible to establish and manage out-of-band connections between two XMPP entities, even if they are behind Network Address Translators (NATs) or firewalls. @@ -43,12 +47,15 @@ import java.util.Random; */ public class ICEResolver extends TransportResolver { - XMPPConnection connection; + private static final SmackLogger LOGGER = SmackLogger.getLogger(ICEResolver.class); + + XMPPConnection connection; Random random = new Random(); long sid; - String server = "stun.xten.net"; - int port = 3478; - ICENegociator iceNegociator = null; + String server; + int port; + static Map negociatorsMap = new HashMap(); + //ICENegociator iceNegociator = null; public ICEResolver(XMPPConnection connection, String server, int port) { super(); @@ -60,13 +67,21 @@ public class ICEResolver extends TransportResolver { public void initialize() throws XMPPException { if (!isResolving() && !isResolved()) { - System.out.println("Initialized"); + LOGGER.debug("Initialized"); - iceNegociator = new ICENegociator((short) 1, server, port); - // gather candidates - iceNegociator.gatherCandidateAddresses(); - // priorize candidates - iceNegociator.prioritizeCandidates(); + // Negotiation with a STUN server for a set of interfaces is quite slow, but the results + // never change over then instance of a JVM. To increase connection performance considerably + // we now cache established/initialized negotiators for each STUN server, so that subsequent uses + // of the STUN server are much, much faster. + if (negociatorsMap.get(server) == null) { + ICENegociator iceNegociator = new ICENegociator(server, port, (short) 1); + negociatorsMap.put(server, iceNegociator); + + // gather candidates + iceNegociator.gatherCandidateAddresses(); + // priorize candidates + iceNegociator.prioritizeCandidates(); + } } this.setInitialized(); @@ -91,6 +106,8 @@ public class ICEResolver extends TransportResolver { this.clear(); + // Create a transport candidate for each ICE negotiator candidate we have. + ICENegociator iceNegociator = negociatorsMap.get(server); for (Candidate candidate : iceNegociator.getSortedCandidates()) try { Candidate.CandidateType type = candidate.getCandidateType(); @@ -104,7 +121,26 @@ public class ICEResolver extends TransportResolver { else iceType = ICECandidate.Type.host; - TransportCandidate transportCandidate = new ICECandidate(candidate.getAddress().getInetAddress().getHostAddress(), 1, candidate.getNetwork(), String.valueOf(Math.abs(random.nextLong())), candidate.getPort(), "1", candidate.getPriority(), iceType); + // JBW/GW - 17JUL08: Figure out the zero-based NIC number for this candidate. + short nicNum = 0; + try { + Enumeration nics = NetworkInterface.getNetworkInterfaces(); + short i = 0; + NetworkInterface nic = NetworkInterface.getByInetAddress(candidate.getAddress().getInetAddress()); + while(nics.hasMoreElements()) { + NetworkInterface checkNIC = nics.nextElement(); + if (checkNIC.equals(nic)) { + nicNum = i; + break; + } + i++; + } + } catch (SocketException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + TransportCandidate transportCandidate = new ICECandidate(candidate.getAddress().getInetAddress().getHostAddress(), 1, nicNum, String.valueOf(Math.abs(random.nextLong())), candidate.getPort(), "1", candidate.getPriority(), iceType); transportCandidate.setLocalIp(candidate.getBase().getAddress().getInetAddress().getHostAddress()); transportCandidate.setPort(getFreePort()); try { @@ -115,7 +151,7 @@ public class ICEResolver extends TransportResolver { } this.addCandidate(transportCandidate); - System.out.println("C: " + candidate.getAddress().getInetAddress() + "|" + candidate.getBase().getAddress().getInetAddress() + " p:" + candidate.getPriority()); + LOGGER.debug("Candidate addr: " + candidate.getAddress().getInetAddress() + "|" + candidate.getBase().getAddress().getInetAddress() + " Priority:" + candidate.getPriority()); } catch (UtilityException e) { @@ -128,16 +164,19 @@ public class ICEResolver extends TransportResolver { // Get a Relay Candidate from XMPP Server if (RTPBridge.serviceAvailable(connection)) { - try { +// try { String localIp; int network; - - if (iceNegociator.getPublicCandidate() != null) { - localIp = iceNegociator.getPublicCandidate().getBase().getAddress().getInetAddress().getHostAddress(); - network = iceNegociator.getPublicCandidate().getNetwork(); - } - else { + + + // JBW/GW - 17JUL08: ICENegotiator.getPublicCandidate() always returned null in JSTUN 1.7.0, and now the API doesn't exist in JSTUN 1.7.1 +// if (iceNegociator.getPublicCandidate() != null) { +// localIp = iceNegociator.getPublicCandidate().getBase().getAddress().getInetAddress().getHostAddress(); +// network = iceNegociator.getPublicCandidate().getNetwork(); +// } +// else { + { localIp = BridgedResolver.getLocalHost(); network = 0; } @@ -168,17 +207,19 @@ public class ICEResolver extends TransportResolver { addCandidate(localCandidate); - } - catch (UtilityException e) { - e.printStackTrace(); - } - catch (UnknownHostException e) { - e.printStackTrace(); - } +// } +// catch (UtilityException e) { +// e.printStackTrace(); +// } +// catch (UnknownHostException e) { +// e.printStackTrace(); +// } // Get Public Candidate From XMPP Server - if (iceNegociator.getPublicCandidate() == null) { + // JBW/GW - 17JUL08 - ICENegotiator.getPublicCandidate() always returned null in JSTUN 1.7.0, and now it doesn't exist in JSTUN 1.7.1 + // if (iceNegociator.getPublicCandidate() == null) { + if (true) { String publicIp = RTPBridge.getPublicIP(connection); diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/RTPBridge.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/RTPBridge.java index 144a54551..8edd3abf7 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/RTPBridge.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/RTPBridge.java @@ -20,6 +20,12 @@ package org.jivesoftware.smackx.jingle.nat; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.util.Enumeration; +import java.util.Iterator; + import org.jivesoftware.smack.PacketCollector; import org.jivesoftware.smack.SmackConfiguration; import org.jivesoftware.smack.XMPPConnection; @@ -29,15 +35,10 @@ import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.provider.IQProvider; import org.jivesoftware.smack.provider.ProviderManager; import org.jivesoftware.smackx.ServiceDiscoveryManager; -import org.jivesoftware.smackx.packet.DiscoverItems; +import org.jivesoftware.smackx.jingle.SmackLogger; +import org.jivesoftware.smackx.packet.DiscoverInfo; import org.xmlpull.v1.XmlPullParser; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.util.Enumeration; -import java.util.Iterator; - /** * RTPBridge IQ Packet used to request and retrieve a RTPBridge Candidates that can be used for a Jingle Media Transmission between two parties that are behind NAT. * This Jingle Bridge has all the needed information to establish a full UDP Channel (Send and Receive) between two parties. @@ -51,7 +52,9 @@ import java.util.Iterator; */ public class RTPBridge extends IQ { - private String sid; + private static final SmackLogger LOGGER = SmackLogger.getLogger(RTPBridge.class); + + private String sid; private String pass; private String ip; private String name; @@ -424,20 +427,29 @@ public class RTPBridge extends IQ { return false; } - System.out.println("Service listing"); + LOGGER.debug("Service listing"); ServiceDiscoveryManager disco = ServiceDiscoveryManager .getInstanceFor(xmppConnection); try { - DiscoverItems items = disco.discoverItems(xmppConnection.getServiceName()); - Iterator iter = items.getItems(); +// DiscoverItems items = disco.discoverItems(xmppConnection.getServiceName()); +// Iterator iter = items.getItems(); +// while (iter.hasNext()) { +// DiscoverItems.Item item = (DiscoverItems.Item) iter.next(); +// if (item.getEntityID().startsWith("rtpbridge.")) { +// return true; +// } +// } + + DiscoverInfo discoInfo = disco.discoverInfo(xmppConnection.getServiceName()); + Iterator iter = discoInfo.getIdentities(); while (iter.hasNext()) { - DiscoverItems.Item item = (DiscoverItems.Item) iter.next(); - if (item.getEntityID().startsWith("rtpbridge.")) { - return true; - } + DiscoverInfo.Identity identity = (DiscoverInfo.Identity) iter.next(); + if ((identity.getName() != null) && (identity.getName().startsWith("rtpbridge"))) { + return true; + } } - } + } catch (XMPPException e) { e.printStackTrace(); } @@ -467,7 +479,7 @@ public class RTPBridge extends IQ { rtpPacket.setHostA(localCandidate.getIp()); rtpPacket.setHostB(proxyCandidate.getIp()); - // System.out.println("Relayed to: " + candidate.getIp() + ":" + candidate.getPort()); + // LOGGER.debug("Relayed to: " + candidate.getIp() + ":" + candidate.getPort()); PacketCollector collector = xmppConnection .createPacketCollector(new PacketIDFilter(rtpPacket.getPacketID())); @@ -499,7 +511,7 @@ public class RTPBridge extends IQ { rtpPacket.setTo(RTPBridge.NAME + "." + xmppConnection.getServiceName()); rtpPacket.setType(Type.SET); - // System.out.println("Relayed to: " + candidate.getIp() + ":" + candidate.getPort()); + // LOGGER.debug("Relayed to: " + candidate.getIp() + ":" + candidate.getPort()); PacketCollector collector = xmppConnection .createPacketCollector(new PacketIDFilter(rtpPacket.getPacketID())); diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/STUN.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/STUN.java index caab19c1a..e0d24a70c 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/STUN.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/STUN.java @@ -19,6 +19,10 @@ */ package org.jivesoftware.smackx.jingle.nat; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + import org.jivesoftware.smack.PacketCollector; import org.jivesoftware.smack.SmackConfiguration; import org.jivesoftware.smack.XMPPConnection; @@ -28,14 +32,11 @@ import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.provider.IQProvider; import org.jivesoftware.smack.provider.ProviderManager; import org.jivesoftware.smackx.ServiceDiscoveryManager; +import org.jivesoftware.smackx.jingle.SmackLogger; import org.jivesoftware.smackx.packet.DiscoverInfo; import org.jivesoftware.smackx.packet.DiscoverItems; import org.xmlpull.v1.XmlPullParser; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - /** * STUN IQ Packet used to request and retrieve a STUN server and port to make p2p connections easier. STUN is usually used by Jingle Media Transmission between two parties that are behind NAT. *

@@ -47,7 +48,9 @@ import java.util.List; */ public class STUN extends IQ { - private List servers = new ArrayList(); + private static final SmackLogger LOGGER = SmackLogger.getLogger(STUN.class); + + private List servers = new ArrayList(); private String publicIp = null; @@ -220,7 +223,7 @@ public class STUN extends IQ { return false; } - System.out.println("Service listing"); + LOGGER.debug("Service listing"); ServiceDiscoveryManager disco = ServiceDiscoveryManager .getInstanceFor(xmppConnection); @@ -240,7 +243,7 @@ public class STUN extends IQ { return true; } - System.out.println(item.getName()+"-"+info.getType()); + LOGGER.debug(item.getName()+"-"+info.getType()); } } diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/STUNResolver.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/STUNResolver.java index f4e4d90a2..a3d2c24b7 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/STUNResolver.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/STUNResolver.java @@ -19,15 +19,6 @@ */ package org.jivesoftware.smackx.jingle.nat; -import de.javawi.jstun.test.BindingLifetimeTest; -import de.javawi.jstun.test.DiscoveryInfo; -import de.javawi.jstun.test.DiscoveryTest; -import org.jivesoftware.smack.XMPPException; -import org.jivesoftware.smackx.jingle.JingleSession; -import org.xmlpull.mxp1.MXParser; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - import java.io.IOException; import java.net.InetAddress; import java.net.NetworkInterface; @@ -36,6 +27,17 @@ import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smackx.jingle.JingleSession; +import org.jivesoftware.smackx.jingle.SmackLogger; +import org.xmlpull.mxp1.MXParser; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import de.javawi.jstun.test.BindingLifetimeTest; +import de.javawi.jstun.test.DiscoveryInfo; +import de.javawi.jstun.test.DiscoveryTest; + /** * Transport resolver using the JSTUN library, to discover public IP and use it as a candidate. * @@ -45,7 +47,9 @@ import java.util.Enumeration; */ public class STUNResolver extends TransportResolver { - // The filename where the STUN servers are stored. + private static final SmackLogger LOGGER = SmackLogger.getLogger(STUNResolver.class); + + // The filename where the STUN servers are stored. public final static String STUNSERVERS_FILENAME = "META-INF/stun-config.xml"; // Fallback values when we don't have any STUN server to use... @@ -282,7 +286,7 @@ public class STUNResolver extends TransportResolver { resolvedPublicIP, getFreePort()); candidate.setLocalIp(resolvedLocalIP); - System.out.println("RESOLVING : " + resolvedPublicIP + ":" + candidate.getPort()); + LOGGER.debug("RESOLVING : " + resolvedPublicIP + ":" + candidate.getPort()); addCandidate(candidate); @@ -296,7 +300,7 @@ public class STUNResolver extends TransportResolver { * @throws XMPPException */ public void initialize() throws XMPPException { - System.out.println("Initialized"); + LOGGER.debug("Initialized"); if (!isResolving()&&!isResolved()) { // Get the best STUN server available if (currentServer.isNull()) { diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TcpUdpBridgeClient.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TcpUdpBridgeClient.java index 0ede283c2..85576f423 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TcpUdpBridgeClient.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TcpUdpBridgeClient.java @@ -59,6 +59,8 @@ import java.net.DatagramSocket; import java.net.InetAddress; import java.net.Socket; +import org.jivesoftware.smackx.jingle.SmackLogger; + /** * A Simple and Experimental Bridge. * It Creates a TCP Socket That Connects to another TCP Socket Listener and forwards every packets received to an UDP Listener. @@ -66,7 +68,9 @@ import java.net.Socket; */ public class TcpUdpBridgeClient { - private String remoteTcpHost = null; + private static final SmackLogger LOGGER = SmackLogger.getLogger(TcpUdpBridgeClient.class); + + private String remoteTcpHost = null; private String remoteUdpHost = null; private int remoteTcpPort = -1; private int remoteUdpPort = -1; @@ -85,7 +89,7 @@ public class TcpUdpBridgeClient { localTcpSocket = new Socket(remoteTcpHost, remoteTcpPort); localUdpSocket = new DatagramSocket(0); localUdpPort = localUdpSocket.getLocalPort(); - System.out.println("UDP: " + localUdpSocket.getLocalPort()); + LOGGER.debug("UDP: " + localUdpSocket.getLocalPort()); } catch (IOException e) { e.printStackTrace(); @@ -110,11 +114,11 @@ public class TcpUdpBridgeClient { localUdpSocket.receive(p); if (p.getLength() == 0) continue; - System.out.println("UDP Client Received and Sending to TCP Server:"+new String(p.getData(),0,p.getLength(),"UTF-8")); + LOGGER.debug("UDP Client Received and Sending to TCP Server:"+new String(p.getData(),0,p.getLength(),"UTF-8")); out.write(p.getData(), 0, p.getLength()); out.flush(); - System.out.println("Client Flush"); + LOGGER.debug("Client Flush"); } @@ -141,7 +145,7 @@ public class TcpUdpBridgeClient { int s = in.read(b); //if (s == -1) continue; - System.out.println("TCP Client:" +new String(b,0,s,"UTF-8")); + LOGGER.debug("TCP Client:" +new String(b,0,s,"UTF-8")); DatagramPacket udpPacket = new DatagramPacket(b, s); diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TcpUdpBridgeServer.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TcpUdpBridgeServer.java index 3f32b6fce..651208be8 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TcpUdpBridgeServer.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TcpUdpBridgeServer.java @@ -1,9 +1,15 @@ package org.jivesoftware.smackx.jingle.nat; -import java.net.*; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; + +import org.jivesoftware.smackx.jingle.SmackLogger; /** * A Simple and Experimental Bridge. @@ -12,7 +18,9 @@ import java.io.OutputStream; */ public class TcpUdpBridgeServer { - private String remoteTcpHost = null; + private static final SmackLogger LOGGER = SmackLogger.getLogger(TcpUdpBridgeServer.class); + + private String remoteTcpHost = null; private String remoteUdpHost = null; private int remoteTcpPort = -1; private int remoteUdpPort = -1; @@ -32,7 +40,7 @@ public class TcpUdpBridgeServer { serverTcpSocket = new ServerSocket(remoteTcpPort); localUdpSocket = new DatagramSocket(0); localUdpPort = localUdpSocket.getLocalPort(); - System.out.println("UDP: " + localUdpSocket.getLocalPort()); + LOGGER.debug("UDP: " + localUdpSocket.getLocalPort()); } catch (IOException e) { e.printStackTrace(); @@ -56,11 +64,11 @@ public class TcpUdpBridgeServer { localUdpSocket.receive(p); if (p.getLength() == 0) continue; - System.out.println("UDP Server Received and Sending to TCP Client:" + new String(p.getData(), 0, p.getLength(), "UTF-8")); + LOGGER.debug("UDP Server Received and Sending to TCP Client:" + new String(p.getData(), 0, p.getLength(), "UTF-8")); out.write(p.getData(), 0, p.getLength()); out.flush(); - System.out.println("Server Flush"); + LOGGER.debug("Server Flush"); } } @@ -87,7 +95,7 @@ public class TcpUdpBridgeServer { int s = in.read(b); //if (s == -1) continue; - System.out.println("TCP Server:" + new String(b, 0, s, "UTF-8")); + LOGGER.debug("TCP Server:" + new String(b, 0, s, "UTF-8")); DatagramPacket udpPacket = new DatagramPacket(b, s); diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportCandidate.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportCandidate.java index 352da084e..ffefed860 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportCandidate.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportCandidate.java @@ -52,16 +52,21 @@ package org.jivesoftware.smackx.jingle.nat; -import org.jivesoftware.smack.XMPPConnection; -import org.jivesoftware.smackx.jingle.JingleSession; - import java.io.IOException; import java.io.UnsupportedEncodingException; -import java.net.*; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketException; +import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smackx.jingle.JingleSession; +import org.jivesoftware.smackx.jingle.SmackLogger; + /** * Transport candidate. *

@@ -73,7 +78,9 @@ import java.util.List; */ public abstract class TransportCandidate { - private String name; + private static final SmackLogger LOGGER = SmackLogger.getLogger(TransportCandidate.class); + + private String name; private String ip; // IP address @@ -680,14 +687,14 @@ public abstract class TransportCandidate { public void run() { try { - System.out.println("Listening for ECHO: " + socket.getLocalAddress().getHostAddress() + ":" + socket.getLocalPort()); + LOGGER.debug("Listening for ECHO: " + socket.getLocalAddress().getHostAddress() + ":" + socket.getLocalPort()); while (true) { DatagramPacket packet = new DatagramPacket(new byte[150], 150); socket.receive(packet); - //System.out.println("ECHO Packet Received in: " + socket.getLocalAddress().getHostAddress() + ":" + socket.getLocalPort() + " From: " + packet.getAddress().getHostAddress() + ":" + packet.getPort()); + //LOGGER.debug("ECHO Packet Received in: " + socket.getLocalAddress().getHostAddress() + ":" + socket.getLocalPort() + " From: " + packet.getAddress().getHostAddress() + ":" + packet.getPort()); boolean accept = false; @@ -766,7 +773,7 @@ public abstract class TransportCandidate { resultListener.testFinished(testResult, candidate); } - public void testASync(final TransportCandidate candidate, final String password) { + public void testASync(final TransportCandidate transportCandidate, final String password) { Thread thread = new Thread(new Runnable() { @@ -776,19 +783,21 @@ public abstract class TransportCandidate { public boolean datagramReceived(DatagramPacket datagramPacket) { try { - System.out.println("Content Received: " + new String(datagramPacket.getData(), "UTF-8")); + LOGGER.debug("ECHO Received to: " + candidate.getIp() + ":" + candidate.getPort() + " data: " + new String(datagramPacket.getData(), "UTF-8")); String str[] = new String(datagramPacket.getData(), "UTF-8").split(";"); String pass = str[0]; String addr[] = str[1].split(":"); String ip = addr[0]; String pt = addr[1]; - if (pass.equals(password) && candidate.getIp().indexOf(ip) != -1 && candidate.getPort() == Integer.parseInt(pt)) { - System.out.println("Result OK:" + candidate.getIp() + ":" + candidate.getPort()); + if (pass.equals(password) + && transportCandidate.getIp().indexOf(ip) != -1 + && transportCandidate.getPort() == Integer.parseInt(pt)) { + LOGGER.debug("ECHO OK: " + candidate.getIp() + ":" + candidate.getPort() + " <-> " + transportCandidate.getIp() + ":" + transportCandidate.getPort()); TestResult testResult = new TestResult(); testResult.setResult(true); ended = true; - fireTestResult(testResult, candidate); + fireTestResult(testResult, transportCandidate); return true; } @@ -797,7 +806,7 @@ public abstract class TransportCandidate { e.printStackTrace(); } - System.out.println("Result Wrong Data:" + datagramPacket.getAddress().getHostAddress() + ":" + datagramPacket.getPort()); + LOGGER.debug("ECHO Wrong Data: " + datagramPacket.getAddress().getHostAddress() + ":" + datagramPacket.getPort()); return false; } }; @@ -815,12 +824,12 @@ public abstract class TransportCandidate { DatagramPacket packet = new DatagramPacket(content, content.length); try { - packet.setAddress(InetAddress.getByName(candidate.getIp())); + packet.setAddress(InetAddress.getByName(transportCandidate.getIp())); } catch (UnknownHostException e) { e.printStackTrace(); } - packet.setPort(candidate.getPort()); + packet.setPort(transportCandidate.getPort()); long delay = 200; diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportNegotiator.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportNegotiator.java index 03cf90b2c..25c207d43 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportNegotiator.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportNegotiator.java @@ -20,9 +20,20 @@ package org.jivesoftware.smackx.jingle.nat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.packet.IQ; -import org.jivesoftware.smackx.jingle.*; +import org.jivesoftware.smackx.jingle.ContentNegotiator; +import org.jivesoftware.smackx.jingle.JingleActionEnum; +import org.jivesoftware.smackx.jingle.JingleException; +import org.jivesoftware.smackx.jingle.JingleNegotiator; +import org.jivesoftware.smackx.jingle.JingleNegotiatorState; +import org.jivesoftware.smackx.jingle.JingleSession; +import org.jivesoftware.smackx.jingle.SmackLogger; import org.jivesoftware.smackx.jingle.listeners.JingleListener; import org.jivesoftware.smackx.jingle.listeners.JingleTransportListener; import org.jivesoftware.smackx.packet.Jingle; @@ -30,11 +41,6 @@ import org.jivesoftware.smackx.packet.JingleContent; import org.jivesoftware.smackx.packet.JingleTransport; import org.jivesoftware.smackx.packet.JingleTransport.JingleTransportCandidate; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - /** * Transport negotiator. *

@@ -46,7 +52,9 @@ import java.util.List; */ public abstract class TransportNegotiator extends JingleNegotiator { - // The time we give to the candidates check before we accept or decline the + private static final SmackLogger LOGGER = SmackLogger.getLogger(TransportNegotiator.class); + + // The time we give to the candidates check before we accept or decline the // transport (in milliseconds) public final static int CANDIDATES_ACCEPT_PERIOD = 4000; @@ -134,7 +142,7 @@ public abstract class TransportNegotiator extends JingleNegotiator { return; } } - //System.out.println("BEST: " + bestLocalCandidate.getIp()); + //LOGGER.debug("BEST: " + bestLocalCandidate.getIp()); throw new XMPPException("Local transport candidate has not be offered."); } @@ -434,7 +442,7 @@ public abstract class TransportNegotiator extends JingleNegotiator { // Add the candidate to the list if (remoteCandidate != null) { synchronized (validRemoteCandidates) { - System.out.println("ADDED Valid Cand: " + remoteCandidate.getIp() + ":" + remoteCandidate.getPort()); + LOGGER.debug("Added valid candidate: " + remoteCandidate.getIp() + ":" + remoteCandidate.getPort()); validRemoteCandidates.add(remoteCandidate); } } @@ -562,7 +570,7 @@ public abstract class TransportNegotiator extends JingleNegotiator { if (!(resolver.isResolving() || resolver.isResolved())) { // Resolve our IP and port - System.out.println("RESOLVER CALLED"); + LOGGER.debug("RESOLVER CALLED"); resolver.resolve(session); } } @@ -727,14 +735,14 @@ public abstract class TransportNegotiator extends JingleNegotiator { if (!accepted.isEmpty()) { for (TransportCandidate cand : accepted) { - System.out.println("Cand: " + cand.getIp()); + LOGGER.debug("Remote acccepted candidate addr: " + cand.getIp()); } TransportCandidate cand = (TransportCandidate) accepted.get(0); setAcceptedLocalCandidate(cand); if (isEstablished()) { - System.out.println("SET ACTIVE"); + LOGGER.debug(cand.getIp() + " is set active"); //setNegotiatorState(JingleNegotiatorState.SUCCEEDED); } } @@ -748,7 +756,7 @@ public abstract class TransportNegotiator extends JingleNegotiator { private IQ receiveSessionAcceptAction(Jingle jingle) { IQ response = null; - System.out.println("Transport stabilished"); + LOGGER.debug("Transport stabilished"); //triggerTransportEstablished(getAcceptedLocalCandidate(), getBestRemoteCandidate()); //setNegotiatorState(JingleNegotiatorState.SUCCEEDED); @@ -767,7 +775,7 @@ public abstract class TransportNegotiator extends JingleNegotiator { for (JingleListener li : listeners) { if (li instanceof JingleTransportListener) { JingleTransportListener mli = (JingleTransportListener) li; - System.out.println("triggerTransportEstablished " + local.getLocalIp() + ":" + local.getPort() + "|" + LOGGER.debug("triggerTransportEstablished " + local.getLocalIp() + ":" + local.getPort() + " <-> " + remote.getIp() + ":" + remote.getPort()); mli.transportEstablished(local, remote); } @@ -827,10 +835,10 @@ public abstract class TransportNegotiator extends JingleNegotiator { // Hopefully, we only have one validRemoteCandidate ArrayList cands = getValidRemoteCandidatesList(); if (!cands.isEmpty()) { - System.out.println("RAW CAND"); + LOGGER.debug("RAW CAND"); return (TransportCandidate) cands.get(0); } else { - System.out.println("No Remote Candidate"); + LOGGER.debug("No Remote Candidate"); return null; } } @@ -893,7 +901,7 @@ public abstract class TransportNegotiator extends JingleNegotiator { } if (result != null && result.getType().equals("relay")) - System.out.println("Relay Type"); + LOGGER.debug("Relay Type"); return result; } diff --git a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportResolver.java b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportResolver.java index 6937bcb6f..747675a9b 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportResolver.java +++ b/jingle/extension/source/org/jivesoftware/smackx/jingle/nat/TransportResolver.java @@ -52,9 +52,6 @@ package org.jivesoftware.smackx.jingle.nat; -import org.jivesoftware.smack.XMPPException; -import org.jivesoftware.smackx.jingle.JingleSession; - import java.io.IOException; import java.net.ServerSocket; import java.util.ArrayList; @@ -62,6 +59,10 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smackx.jingle.JingleSession; +import org.jivesoftware.smackx.jingle.SmackLogger; + /** * A TransportResolver is used for obtaining a list of valid transport * candidates. A transport candidate is composed by an IP address and a port number. @@ -72,7 +73,9 @@ import java.util.List; */ public abstract class TransportResolver { - public enum Type { + private static final SmackLogger LOGGER = SmackLogger.getLogger(TransportResolver.class); + + public enum Type { rawupd, ice } @@ -247,7 +250,7 @@ public abstract class TransportResolver { TransportResolverListener trl = (TransportResolverListener) iter.next(); if (trl instanceof TransportResolverListener.Resolver) { TransportResolverListener.Resolver li = (TransportResolverListener.Resolver) trl; - System.out.println("triggerCandidateAdded : " + cand.getLocalIp()); + LOGGER.debug("triggerCandidateAdded : " + cand.getLocalIp()); li.candidateAdded(cand); } } @@ -331,7 +334,7 @@ public abstract class TransportResolver { Collections.sort(cands); // Return the last candidate result = (TransportCandidate) cands.get(cands.size() - 1); - System.out.println("Result: " + result.getIp()); + LOGGER.debug("Result: " + result.getIp()); } return result; @@ -383,12 +386,12 @@ public abstract class TransportResolver { public void initializeAndWait() throws XMPPException { this.initialize(); try { - System.out.print("Initializing..."); + LOGGER.debug("Initializing transport resolver..."); while (!this.isInitialized()) { - System.out.print("."); + LOGGER.debug("Resolver init still pending"); Thread.sleep(1000); } - System.out.print("Resolved\n"); + LOGGER.debug("Transport resolved\n"); } catch (Exception e) { e.printStackTrace(); diff --git a/jingle/extension/source/org/jivesoftware/smackx/packet/Jingle.java b/jingle/extension/source/org/jivesoftware/smackx/packet/Jingle.java index d731847ca..b20fcaa8b 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/packet/Jingle.java +++ b/jingle/extension/source/org/jivesoftware/smackx/packet/Jingle.java @@ -44,7 +44,7 @@ public class Jingle extends IQ { // static - public static final String NAMESPACE = "http://www.xmpp.org/extensions/xep-0166.html#ns"; + public static final String NAMESPACE = "urn:xmpp:tmp:jingle"; public static final String NODENAME = "jingle"; @@ -190,8 +190,6 @@ public class Jingle extends IQ { /** * Returns the XML namespace of the extension sub-packet root element. - * According the specification the namespace is always - * "http://www.xmpp.org/extensions/xep-0166.html#ns" * * @return the XML namespace of the packet extension. */ diff --git a/jingle/extension/source/org/jivesoftware/smackx/packet/JingleContentDescription.java b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleContentDescription.java index 86020117c..5c58f9cb5 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/packet/JingleContentDescription.java +++ b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleContentDescription.java @@ -172,7 +172,7 @@ public abstract class JingleContentDescription implements PacketExtension { */ public static class Audio extends JingleContentDescription { - public static final String NAMESPACE = "http://jabber.org/protocol/jingle/description/audio"; + public static final String NAMESPACE = "urn:xmpp:tmp:jingle:apps:rtp"; public Audio() { super(); diff --git a/jingle/extension/source/org/jivesoftware/smackx/packet/JingleContentInfo.java b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleContentInfo.java index 60ca87660..af3241d38 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/packet/JingleContentInfo.java +++ b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleContentInfo.java @@ -96,7 +96,7 @@ public class JingleContentInfo implements PacketExtension { */ public static class Audio extends JingleContentInfo { - public static final String NAMESPACE = "http://www.xmpp.org/extensions/xep-0167.html#ns-info"; + public static final String NAMESPACE = "urn:xmpp:tmp:jingle:apps:rtp"; public Audio(final ContentInfo mi) { super(mi); diff --git a/jingle/extension/source/org/jivesoftware/smackx/packet/JingleDescription.java b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleDescription.java index 5c82d9480..212cd503d 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/packet/JingleDescription.java +++ b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleDescription.java @@ -19,14 +19,15 @@ */ package org.jivesoftware.smackx.packet; -import org.jivesoftware.smack.packet.PacketExtension; -import org.jivesoftware.smackx.jingle.media.PayloadType; - import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; +import org.jivesoftware.smack.packet.PacketExtension; +import org.jivesoftware.smackx.jingle.SmackLogger; +import org.jivesoftware.smackx.jingle.media.PayloadType; + /** * Jingle content description. * @@ -34,7 +35,9 @@ import java.util.List; */ public abstract class JingleDescription implements PacketExtension { - // static + private static final SmackLogger LOGGER = SmackLogger.getLogger(JingleDescription.class); + + // static public static final String NODENAME = "description"; @@ -73,7 +76,7 @@ public abstract class JingleDescription implements PacketExtension { public void addPayloadType(final PayloadType pt) { synchronized (payloads) { if (pt == null) { - System.err.println("Null payload type"); + LOGGER.error("Null payload type"); } else { payloads.add(pt); } @@ -176,7 +179,7 @@ public abstract class JingleDescription implements PacketExtension { */ public static class Audio extends JingleDescription { - public static final String NAMESPACE = "http://www.xmpp.org/extensions/xep-0167.html#ns"; + public static final String NAMESPACE = "urn:xmpp:tmp:jingle:apps:rtp"; public Audio() { super(); diff --git a/jingle/extension/source/org/jivesoftware/smackx/packet/JingleError.java b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleError.java index 9067a7ea5..79ab27d59 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/packet/JingleError.java +++ b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleError.java @@ -27,7 +27,7 @@ import org.xmlpull.v1.XmlPullParser; public class JingleError implements PacketExtension { - public static String NAMESPACE = "http://www.xmpp.org/extensions/xep-0166.html#ns-errors"; + public static String NAMESPACE = "urn:xmpp:tmp:jingle:errors"; public static final JingleError OUT_OF_ORDER = new JingleError("out-of-order"); diff --git a/jingle/extension/source/org/jivesoftware/smackx/packet/JingleTransport.java b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleTransport.java index f80d1f83f..38eca2b94 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/packet/JingleTransport.java +++ b/jingle/extension/source/org/jivesoftware/smackx/packet/JingleTransport.java @@ -270,7 +270,7 @@ public class JingleTransport implements PacketExtension { * RTP-ICE profile */ public static class Ice extends JingleTransport { - public static final String NAMESPACE = "http://www.xmpp.org/extensions/xep-0176.html#ns-udp"; + public static final String NAMESPACE = "urn:xmpp:tmp:jingle:transports:ice-udp"; public Ice() { super(); diff --git a/jingle/extension/source/org/jivesoftware/smackx/provider/JingleTransportProvider.java b/jingle/extension/source/org/jivesoftware/smackx/provider/JingleTransportProvider.java index 52029eda9..ea1048f7f 100644 --- a/jingle/extension/source/org/jivesoftware/smackx/provider/JingleTransportProvider.java +++ b/jingle/extension/source/org/jivesoftware/smackx/provider/JingleTransportProvider.java @@ -234,7 +234,7 @@ public abstract class JingleTransportProvider implements PacketExtensionProvider String name = parser.getAttributeValue("", "name"); String port = parser.getAttributeValue("", "port"); - //System.out.println(); + //LOGGER.debug(); if (generation != null) { try { diff --git a/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/STUNResolverTest.java b/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/STUNResolverTest.java index 72f95b03c..65e7c7331 100644 --- a/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/STUNResolverTest.java +++ b/jingle/extension/test/org/jivesoftware/smackx/jingle/nat/STUNResolverTest.java @@ -14,8 +14,11 @@ import org.jivesoftware.smackx.jingle.media.JingleMediaManager; import org.jivesoftware.smackx.jingle.media.PayloadType; import org.jivesoftware.smackx.jingle.mediaimpl.test.TestMediaManager; +import java.net.NetworkInterface; +import java.net.SocketException; import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Enumeration; import java.util.List; /** @@ -129,10 +132,28 @@ public class STUNResolverTest extends SmackTestCase { cc.prioritizeCandidates(); // get SortedCandidates - for (Candidate candidate : cc.getSortedCandidates()) + for (Candidate candidate : cc.getSortedCandidates()) { + short nicNum = 0; + try { + Enumeration nics = NetworkInterface.getNetworkInterfaces(); + short tempNic = 0; + NetworkInterface nic = NetworkInterface.getByInetAddress(candidate.getAddress().getInetAddress()); + while(nics.hasMoreElements()) { + NetworkInterface checkNIC = nics.nextElement(); + if (checkNIC.equals(nic)) { + nicNum = tempNic; + break; + } + i++; + } + } catch (SocketException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + try { TransportCandidate transportCandidate = new ICECandidate(candidate.getAddress().getInetAddress() - .getHostAddress(), 1, candidate.getNetwork(), "1", candidate.getPort(), "1", candidate.getPriority(), + .getHostAddress(), 1, nicNum, "1", candidate.getPort(), "1", candidate.getPriority(), ICECandidate.Type.prflx); transportCandidate.setLocalIp(candidate.getBase().getAddress().getInetAddress().getHostAddress()); System.out.println("C: " + candidate.getAddress().getInetAddress() + "|" @@ -142,6 +163,7 @@ public class STUNResolverTest extends SmackTestCase { } catch (UnknownHostException e) { e.printStackTrace(); } + } Candidate candidate = cc.getSortedCandidates().get(0); String temp = "C: " + candidate.getAddress().getInetAddress() + "|" + candidate.getBase().getAddress().getInetAddress() + " p:" + candidate.getPriority(); diff --git a/jingle/extension/test/org/jivesoftware/smackx/provider/JingleProviderTest.java b/jingle/extension/test/org/jivesoftware/smackx/provider/JingleProviderTest.java index a54732410..64a7267dc 100644 --- a/jingle/extension/test/org/jivesoftware/smackx/provider/JingleProviderTest.java +++ b/jingle/extension/test/org/jivesoftware/smackx/provider/JingleProviderTest.java @@ -36,11 +36,11 @@ public class JingleProviderTest extends SmackTestCase { // Create a dummy packet for testing... IQfake iqSent = new IQfake ( - " " + - " " + + " " + "