Continue working on Jingle.

git-svn-id: http://svn.igniterealtime.org/svn/repos/spark/trunk@7708 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
Derek DeMoro
2007-03-26 22:49:29 +00:00
committed by derek
parent 4bd0aa2e6b
commit e851bafa95
3 changed files with 79 additions and 126 deletions

View File

@ -22,6 +22,7 @@ import org.jivesoftware.smackx.jingle.media.PayloadType;
import org.jivesoftware.smackx.jingle.nat.TransportCandidate; import org.jivesoftware.smackx.jingle.nat.TransportCandidate;
import org.jivesoftware.spark.SparkManager; import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.ui.ChatRoom; import org.jivesoftware.spark.ui.ChatRoom;
import org.jivesoftware.spark.ui.ChatRoomClosingListener;
import org.jivesoftware.spark.util.TaskEngine; import org.jivesoftware.spark.util.TaskEngine;
import org.jivesoftware.spark.util.log.Log; import org.jivesoftware.spark.util.log.Log;
import org.jivesoftware.sparkimpl.plugin.alerts.SparkToaster; import org.jivesoftware.sparkimpl.plugin.alerts.SparkToaster;
@ -40,7 +41,7 @@ import java.util.Map;
/** /**
* Incoming call handles a single incoming Jingle call. * Incoming call handles a single incoming Jingle call.
*/ */
public class IncomingCall implements JingleSessionListener { public class IncomingCall implements JingleSessionListener, ChatRoomClosingListener {
private SparkToaster toasterManager; private SparkToaster toasterManager;
@ -273,4 +274,19 @@ public class IncomingCall implements JingleSessionListener {
public void sessionClosedOnError(XMPPException xmppException, JingleSession jingleSession) { public void sessionClosedOnError(XMPPException xmppException, JingleSession jingleSession) {
showCallEndedState(); showCallEndedState();
} }
public void closing() {
if (session != null) {
try {
session.terminate();
}
catch (XMPPException e) {
Log.error(e);
}
}
JingleStateManager.getInstance().removeJingleSession(chatRoom);
}
} }

View File

@ -16,12 +16,9 @@ import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smackx.ServiceDiscoveryManager; import org.jivesoftware.smackx.ServiceDiscoveryManager;
import org.jivesoftware.smackx.jingle.JingleManager; import org.jivesoftware.smackx.jingle.JingleManager;
import org.jivesoftware.smackx.jingle.JingleSession;
import org.jivesoftware.smackx.jingle.JingleSessionRequest; import org.jivesoftware.smackx.jingle.JingleSessionRequest;
import org.jivesoftware.smackx.jingle.OutgoingJingleSession; import org.jivesoftware.smackx.jingle.OutgoingJingleSession;
import org.jivesoftware.smackx.jingle.listeners.JingleSessionListener;
import org.jivesoftware.smackx.jingle.listeners.JingleSessionRequestListener; import org.jivesoftware.smackx.jingle.listeners.JingleSessionRequestListener;
import org.jivesoftware.smackx.jingle.media.PayloadType;
import org.jivesoftware.smackx.jingle.mediaimpl.jmf.JmfMediaManager; import org.jivesoftware.smackx.jingle.mediaimpl.jmf.JmfMediaManager;
import org.jivesoftware.smackx.jingle.mediaimpl.jspeex.SpeexMediaManager; import org.jivesoftware.smackx.jingle.mediaimpl.jspeex.SpeexMediaManager;
import org.jivesoftware.smackx.jingle.mediaimpl.multi.MultiMediaManager; import org.jivesoftware.smackx.jingle.mediaimpl.multi.MultiMediaManager;
@ -29,7 +26,6 @@ import org.jivesoftware.smackx.jingle.nat.BridgedTransportManager;
import org.jivesoftware.smackx.jingle.nat.ICETransportManager; import org.jivesoftware.smackx.jingle.nat.ICETransportManager;
import org.jivesoftware.smackx.jingle.nat.JingleTransportManager; import org.jivesoftware.smackx.jingle.nat.JingleTransportManager;
import org.jivesoftware.smackx.jingle.nat.STUN; import org.jivesoftware.smackx.jingle.nat.STUN;
import org.jivesoftware.smackx.jingle.nat.TransportCandidate;
import org.jivesoftware.smackx.packet.DiscoverInfo; import org.jivesoftware.smackx.packet.DiscoverInfo;
import org.jivesoftware.spark.PresenceManager; import org.jivesoftware.spark.PresenceManager;
import org.jivesoftware.spark.SparkManager; import org.jivesoftware.spark.SparkManager;
@ -37,13 +33,9 @@ import org.jivesoftware.spark.phone.Phone;
import org.jivesoftware.spark.phone.PhoneManager; import org.jivesoftware.spark.phone.PhoneManager;
import org.jivesoftware.spark.plugin.Plugin; import org.jivesoftware.spark.plugin.Plugin;
import org.jivesoftware.spark.ui.ChatRoom; import org.jivesoftware.spark.ui.ChatRoom;
import org.jivesoftware.spark.ui.ChatRoomListenerAdapter;
import org.jivesoftware.spark.ui.ChatRoomNotFoundException;
import org.jivesoftware.spark.ui.TranscriptWindow; import org.jivesoftware.spark.ui.TranscriptWindow;
import org.jivesoftware.spark.ui.rooms.ChatRoomImpl;
import org.jivesoftware.spark.util.SwingWorker; import org.jivesoftware.spark.util.SwingWorker;
import org.jivesoftware.spark.util.log.Log; import org.jivesoftware.spark.util.log.Log;
import org.jivesoftware.sparkplugin.JingleStateManager.JingleRoomState;
import javax.swing.AbstractAction; import javax.swing.AbstractAction;
import javax.swing.Action; import javax.swing.Action;
@ -65,14 +57,10 @@ import java.util.Map;
/** /**
* A simple Jingle Plugin for Spark that uses server Media Proxy for the transport and NAT Traversal * A simple Jingle Plugin for Spark that uses server Media Proxy for the transport and NAT Traversal
*/ */
public class JinglePlugin implements Plugin, JingleSessionListener, Phone { public class JinglePlugin implements Plugin, Phone {
private final Map<String, JingleSession> sessions = new HashMap<String, JingleSession>();
private JingleManager jingleManager; private JingleManager jingleManager;
private JingleStateManager stateManager;
private static final String JINGLE_NAMESPACE = "http://www.xmpp.org/extensions/xep-0166.html#ns"; private static final String JINGLE_NAMESPACE = "http://www.xmpp.org/extensions/xep-0166.html#ns";
private Map<String, Boolean> jingleFeature = new HashMap<String, Boolean>(); private Map<String, Boolean> jingleFeature = new HashMap<String, Boolean>();
@ -82,9 +70,6 @@ public class JinglePlugin implements Plugin, JingleSessionListener, Phone {
// Add to PhoneManager // Add to PhoneManager
PhoneManager.getInstance().addPhone(this); PhoneManager.getInstance().addPhone(this);
// Initialize state manager.
stateManager = JingleStateManager.getInstance();
// Adds a tab handler. // Adds a tab handler.
SparkManager.getChatManager().addSparkTabHandler(new JingleTabHandler()); SparkManager.getChatManager().addSparkTabHandler(new JingleTabHandler());
@ -161,18 +146,6 @@ public class JinglePlugin implements Plugin, JingleSessionListener, Phone {
}); });
} }
}); });
// If a ChatRoom containing a JingleSession is closed, end the jingle session.
SparkManager.getChatManager().addChatRoomListener(new ChatRoomListenerAdapter() {
public void chatRoomClosed(ChatRoom room) {
if (room instanceof ChatRoomImpl) {
final ChatRoomImpl roomImpl = (ChatRoomImpl)room;
if (sessions.containsKey(roomImpl.getJID())) {
endCall(roomImpl);
}
}
}
});
} }
@ -221,32 +194,15 @@ public class JinglePlugin implements Plugin, JingleSessionListener, Phone {
return actions; return actions;
} }
public void endCall(ChatRoomImpl room) {
JingleSession session = sessions.get(room.getJID());
if (session == null) return;
try {
session.terminate();
}
catch (XMPPException e) {
Log.error(e);
}
sessions.remove(room.getJID());
// Update state
stateManager.removeJingleSession(room);
// Notify state changed.
SparkManager.getChatManager().notifySparkTabHandlers(room);
}
public void placeCall(String jid) { public void placeCall(String jid) {
jid = SparkManager.getUserManager().getFullJID(jid); jid = SparkManager.getUserManager().getFullJID(jid);
if (sessions.containsKey(jid)) { ChatRoom room = SparkManager.getChatManager().getChatRoom(StringUtils.parseBareAddress(jid));
if (JingleStateManager.getInstance().getJingleRoomState(room) != null) {
return; return;
} }
ChatRoom room = SparkManager.getChatManager().getChatRoom(StringUtils.parseBareAddress(jid));
SparkManager.getChatManager().getChatContainer().activateChatRoom(room); SparkManager.getChatManager().getChatContainer().activateChatRoom(room);
// Create a new Jingle Call with a full JID // Create a new Jingle Call with a full JID
@ -260,12 +216,9 @@ public class JinglePlugin implements Plugin, JingleSessionListener, Phone {
// Start the call // Start the call
if (session != null) { if (session != null) {
session.addListener(this);
session.start(); session.start();
sessions.put(jid, session);
} }
TranscriptWindow transcriptWindow = room.getTranscriptWindow(); TranscriptWindow transcriptWindow = room.getTranscriptWindow();
StyledDocument doc = (StyledDocument)transcriptWindow.getDocument(); StyledDocument doc = (StyledDocument)transcriptWindow.getDocument();
Style style = doc.addStyle("StyleName", null); Style style = doc.addStyle("StyleName", null);
@ -283,12 +236,6 @@ public class JinglePlugin implements Plugin, JingleSessionListener, Phone {
Log.error(e); Log.error(e);
} }
// Update state
stateManager.addJingleSession(room, JingleRoomState.ringing);
// Notify state change
SparkManager.getChatManager().notifySparkTabHandlers(room);
room.scrollToBottom(); room.scrollToBottom();
} }
@ -302,66 +249,6 @@ public class JinglePlugin implements Plugin, JingleSessionListener, Phone {
public void uninstall() { public void uninstall() {
} }
public void sessionEstablished(PayloadType payloadType, TransportCandidate transportCandidate, TransportCandidate transportCandidate1, JingleSession jingleSession) {
}
public void sessionDeclined(String string, JingleSession jingleSession) {
removeJingleSession(jingleSession);
}
public void sessionRedirected(String string, JingleSession jingleSession) {
}
public void sessionClosed(String string, JingleSession jingleSession) {
if (jingleSession instanceof OutgoingJingleSession) {
OutgoingJingleSession session = (OutgoingJingleSession)jingleSession;
if (session.getState() instanceof OutgoingJingleSession.Active) {
}
else if (session.getState() instanceof OutgoingJingleSession.Pending) {
}
}
removeJingleSession(jingleSession);
}
public void sessionClosedOnError(XMPPException xmppException, JingleSession jingleSession) {
removeJingleSession(jingleSession);
}
private void removeJingleSession(JingleSession jingleSession) {
try {
if (sessions.containsValue(jingleSession)) {
String found = null;
for (String key : sessions.keySet()) {
System.err.println("D:" + key);
if (jingleSession.equals(sessions.get(key))) {
found = key;
}
}
System.err.println("REMOVED:" + found);
if (found != null)
sessions.remove(found);
}
}
catch (Exception e) {
// Do Nothing
}
// Remove from room
String jid = jingleSession.getResponder();
ChatRoom chatRoom = null;
try {
chatRoom = SparkManager.getChatManager().getChatContainer().getChatRoom(StringUtils.parseBareAddress(jid));
// Update state
stateManager.removeJingleSession(chatRoom);
// Notify state changed.
SparkManager.getChatManager().notifySparkTabHandlers(chatRoom);
}
catch (ChatRoomNotFoundException e) {
// Ignore
}
}
/** /**
* Notify user that a new incoming jingle request has been receieved. * Notify user that a new incoming jingle request has been receieved.
@ -369,7 +256,7 @@ public class JinglePlugin implements Plugin, JingleSessionListener, Phone {
* @param request the <code>JingleSessionRequest</code>. * @param request the <code>JingleSessionRequest</code>.
*/ */
private void incomingJingleSession(JingleSessionRequest request) { private void incomingJingleSession(JingleSessionRequest request) {
final IncomingCall incomingCall = new IncomingCall(request); new IncomingCall(request);
} }

View File

@ -15,10 +15,14 @@ import org.jivesoftware.smackx.jingle.IncomingJingleSession;
import org.jivesoftware.smackx.jingle.JingleNegotiator; import org.jivesoftware.smackx.jingle.JingleNegotiator;
import org.jivesoftware.smackx.jingle.JingleSession; import org.jivesoftware.smackx.jingle.JingleSession;
import org.jivesoftware.smackx.jingle.OutgoingJingleSession; import org.jivesoftware.smackx.jingle.OutgoingJingleSession;
import org.jivesoftware.smackx.jingle.listeners.JingleSessionListener;
import org.jivesoftware.smackx.jingle.listeners.JingleSessionStateListener; import org.jivesoftware.smackx.jingle.listeners.JingleSessionStateListener;
import org.jivesoftware.smackx.jingle.media.PayloadType;
import org.jivesoftware.smackx.jingle.nat.TransportCandidate;
import org.jivesoftware.spark.SparkManager; import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.component.FileDragLabel; import org.jivesoftware.spark.component.FileDragLabel;
import org.jivesoftware.spark.ui.ChatRoom; import org.jivesoftware.spark.ui.ChatRoom;
import org.jivesoftware.spark.ui.ChatRoomClosingListener;
import org.jivesoftware.spark.ui.ContactItem; import org.jivesoftware.spark.ui.ContactItem;
import org.jivesoftware.spark.ui.ContactList; import org.jivesoftware.spark.ui.ContactList;
import org.jivesoftware.spark.util.log.Log; import org.jivesoftware.spark.util.log.Log;
@ -49,7 +53,7 @@ import java.util.Map;
/** /**
* Handles UI controls for outgoing jingle calls. * Handles UI controls for outgoing jingle calls.
*/ */
public class OutgoingCall extends JPanel implements JingleSessionStateListener { public class OutgoingCall extends JPanel implements JingleSessionStateListener, JingleSessionListener, ChatRoomClosingListener {
private FileDragLabel imageLabel = new FileDragLabel(); private FileDragLabel imageLabel = new FileDragLabel();
private JLabel titleLabel = new JLabel(); private JLabel titleLabel = new JLabel();
@ -113,7 +117,6 @@ public class OutgoingCall extends JPanel implements JingleSessionStateListener {
answerButton.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, new Color(73, 113, 196))); answerButton.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, new Color(73, 113, 196)));
setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.white)); setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.white));
} }
/** /**
@ -125,6 +128,11 @@ public class OutgoingCall extends JPanel implements JingleSessionStateListener {
*/ */
public void handleOutgoingCall(final JingleSession session, ChatRoom chatRoom, final String jid) { public void handleOutgoingCall(final JingleSession session, ChatRoom chatRoom, final String jid) {
this.chatRoom = chatRoom; this.chatRoom = chatRoom;
JingleStateManager.getInstance().addJingleSession(chatRoom, JingleStateManager.JingleRoomState.ringing);
chatRoom.addClosingListener(this);
session.addListener(this);
cancelButton.setVisible(true); cancelButton.setVisible(true);
this.session = session; this.session = session;
@ -157,15 +165,17 @@ public class OutgoingCall extends JPanel implements JingleSessionStateListener {
makeClickable(imageLabel); makeClickable(imageLabel);
makeClickable(titleLabel); makeClickable(titleLabel);
makeClickable(answerButton); makeClickable(answerButton);
// Notify state change
SparkManager.getChatManager().notifySparkTabHandlers(chatRoom);
} }
/** /**
* Updates the UI to reflect the current state. * Updates the UI to reflect the current state.
*/ */
private void updateOutgoingCallPanel() { private void updateOutgoingCallPanel() {
if (session == null || session.isClosed()) { if (session == null || session.isClosed()) {
showCallEndedState(); return;
} }
else if (session instanceof OutgoingJingleSession) { else if (session instanceof OutgoingJingleSession) {
answerButton.setVisible(false); answerButton.setVisible(false);
@ -212,10 +222,14 @@ public class OutgoingCall extends JPanel implements JingleSessionStateListener {
/** /**
* Called when the call has ended. * Called when the call has ended.
*/ */
private void showCallEndedState() { private void showCallEndedState(boolean answered) {
final SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy h:mm a"); if (answered) {
titleLabel.setText("Voice chat ended on " + formatter.format(new Date())); final SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy h:mm a");
titleLabel.setText("Voice chat ended on " + formatter.format(new Date()));
}
else {
titleLabel.setText("Voice chat was rejected.");
}
showAlert(true); showAlert(true);
cancelButton.setVisible(false); cancelButton.setVisible(false);
@ -357,4 +371,40 @@ public class OutgoingCall extends JPanel implements JingleSessionStateListener {
} }
public void closing() {
try {
session.terminate();
}
catch (XMPPException e) {
Log.error(e);
}
JingleStateManager.getInstance().removeJingleSession(chatRoom);
}
public void sessionEstablished(PayloadType payloadType, TransportCandidate transportCandidate, TransportCandidate transportCandidate1, JingleSession jingleSession) {
}
public void sessionDeclined(String string, JingleSession jingleSession) {
}
public void sessionRedirected(String string, JingleSession jingleSession) {
}
public void sessionClosed(String string, JingleSession jingleSession) {
if (jingleSession instanceof OutgoingJingleSession) {
OutgoingJingleSession session = (OutgoingJingleSession)jingleSession;
if (session.getState() instanceof OutgoingJingleSession.Active) {
showCallEndedState(true);
}
else if (session.getState() instanceof OutgoingJingleSession.Pending) {
showCallEndedState(false);
}
}
}
public void sessionClosedOnError(XMPPException xmppException, JingleSession jingleSession) {
}
} }