From e278630c4dbf83ec86c3faa161f9dd38bd44531e Mon Sep 17 00:00:00 2001 From: hristoterezov Date: Wed, 10 Jul 2013 16:33:15 +0300 Subject: [PATCH] Fixes issue with error COIN packets. If error COIN packet is recieved it isn't handled as normal COIN packet anymore, jitsi only displays systray popup message with the error, logs the error and displays error text in the peer panel. --- resources/languages/resources.properties | 2 + .../conference/BasicConferenceCallPanel.java | 36 ++++++++++++ .../call/conference/ConferenceFocusPanel.java | 10 ++++ ...ionSetTelephonyConferencingJabberImpl.java | 26 ++++++++- .../NotificationManager.java | 7 +++ .../service/protocol/AbstractCallPeer.java | 32 ++++++++++- .../service/protocol/CallConference.java | 17 ++++++ .../event/CallPeerConferenceAdapter.java | 8 +++ .../event/CallPeerConferenceEvent.java | 56 ++++++++++++++++++- .../event/CallPeerConferenceListener.java | 11 ++++ .../protocol/media/MediaAwareCallPeer.java | 8 +++ 11 files changed, 210 insertions(+), 3 deletions(-) diff --git a/resources/languages/resources.properties b/resources/languages/resources.properties index 4a393ae79..f3baae0bd 100644 --- a/resources/languages/resources.properties +++ b/resources/languages/resources.properties @@ -190,6 +190,7 @@ service.gui.ENTER_PHONE_NUMBER=Enter phone number service.gui.ENTER_NAME_OR_NUMBER=Enter name or number service.gui.ERROR=Error service.gui.ERROR_WAS=Error was: {0} +service.gui.ERROR_RECEIVED_FROM=Error received from service.gui.ESTIMATED_TIME=Estimated time: service.gui.EVENTS=Events service.gui.EXIT=E&xit @@ -393,6 +394,7 @@ service.gui.PREVIOUS=Previous service.gui.PREVIOUS_TOOLTIP=Browse older conversations service.gui.PRINT=&Print service.gui.PROACTIVE_NOTIFICATION=is writing a message +service.gui.PROBLEMS_ENCOUNTERED=Problems encountered service.gui.PROTOCOL=Protocol service.gui.PUT_OFF_HOLD=Put off hold service.gui.PUT_ON_HOLD=Put on hold diff --git a/src/net/java/sip/communicator/impl/gui/main/call/conference/BasicConferenceCallPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/conference/BasicConferenceCallPanel.java index df534a4d2..c32c6c384 100644 --- a/src/net/java/sip/communicator/impl/gui/main/call/conference/BasicConferenceCallPanel.java +++ b/src/net/java/sip/communicator/impl/gui/main/call/conference/BasicConferenceCallPanel.java @@ -14,6 +14,7 @@ import javax.swing.*; import javax.swing.Timer; +import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.event.*; import net.java.sip.communicator.impl.gui.main.call.*; import net.java.sip.communicator.service.protocol.*; @@ -24,6 +25,7 @@ * CallConference and is contained in a CallPanel. * * @author Lyubomir Marinov + * @author Hristo Terezov */ public abstract class BasicConferenceCallPanel extends JPanel @@ -243,6 +245,29 @@ protected void conferenceMemberAdded(CallPeerConferenceEvent ev) { updateViewFromModel(); } + + /** + * Notifies this instance that a CallPeer associated with a + * Call participating in the telephony conference received a error + * packet. + * + * @param ev a CallPeerConferenceEvent which specifies the + * CallPeer which sent the error packet and an error message. + */ + protected void conferenceMemberErrorReceived(CallPeerConferenceEvent ev) + { + CallPeer callPeer = ev.getSourceCallPeer(); + + callPeerPanels.get(callPeer).setErrorReason( + GuiActivator.getResources().getI18NString( + "service.gui.PROBLEMS_ENCOUNTERED")); + + GuiActivator.getAlertUIService().showAlertPopup( + GuiActivator.getResources().getI18NString( + "service.gui.ERROR_RECEIVED_FROM") + + callPeer.getDisplayName(), + ev.getErrorString()); + } /** * Notifies this instance that a CallPeer associated with a @@ -669,6 +694,17 @@ public void callStateChanged(CallChangeEvent ev) BasicConferenceCallPanel.this.callStateChanged(ev); } + /** + * Invokes + * {@link BasicConferenceCallPanel#conferenceMemberErrorReceived( + * CallPeerConferenceEvent)}. + */ + public void conferenceMemberErrorReceived( + CallPeerConferenceEvent ev) + { + BasicConferenceCallPanel.this.conferenceMemberErrorReceived(ev); + } + /** * {@inheritDoc} * diff --git a/src/net/java/sip/communicator/impl/gui/main/call/conference/ConferenceFocusPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/conference/ConferenceFocusPanel.java index 9da566007..8d6c72ca9 100644 --- a/src/net/java/sip/communicator/impl/gui/main/call/conference/ConferenceFocusPanel.java +++ b/src/net/java/sip/communicator/impl/gui/main/call/conference/ConferenceFocusPanel.java @@ -15,6 +15,7 @@ import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.event.*; +import net.java.sip.communicator.util.Logger; import net.java.sip.communicator.util.skin.*; import org.jitsi.service.protocol.event.*; @@ -127,6 +128,12 @@ public ConferenceFocusPanel( */ private void addConferenceMemberPanel(ConferenceMember conferenceMember) { + Logger.getLogger(ConferenceFocusPanel.class).info("AAAAAAAAAAAAAAA" , + new Exception("addd!!")); + for(ConferenceMember c: conferenceMemberPanels.keySet()) + { + Logger.getLogger(ConferenceFocusPanel.class).info("CCC/" + c.getDisplayName()); + } /* * The local user/peer should not be depicted by a ConferenceMemberPanel * because it is not the responsibility of ConferenceFocusPanel and @@ -159,6 +166,9 @@ private void addConferenceMemberPanel(ConferenceMember conferenceMember) */ conferenceMemberPanels.put(conferenceMember, conferenceMemberPanel); + Logger.getLogger(ConferenceFocusPanel.class).info("AAAAAAAAAAAAAAA11111" + + conferenceMember.getDisplayName(), + new Exception("addd111!!")); /* * Add the newly-initialized ConferenceMemberPanel to the user interface * hierarchy of this view. diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetTelephonyConferencingJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetTelephonyConferencingJabberImpl.java index 12e7ab9bf..82e2f4918 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetTelephonyConferencingJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetTelephonyConferencingJabberImpl.java @@ -370,6 +370,7 @@ public boolean accept(Packet packet) public void processPacket(Packet packet) { CoinIQ coinIQ = (CoinIQ) packet; + String errorMessage = null; //first ack all "set" requests. if (coinIQ.getType() == IQ.Type.SET) @@ -378,7 +379,22 @@ public void processPacket(Packet packet) parentProvider.getConnection().sendPacket(ack); } + + if(coinIQ.getType() == IQ.Type.ERROR) + { + logger.error("Received error in COIN packet."); + + XMPPError error = coinIQ.getError(); + if(error != null) + { + String msg = error.getMessage(); + errorMessage = ((msg != null)? (msg + " ") : "") + + "Error code: " + error.getCode(); + logger.error(errorMessage); + } + } + String sid = coinIQ.getSID(); if (sid != null) @@ -386,12 +402,20 @@ public void processPacket(Packet packet) CallPeerJabberImpl callPeer = getBasicTelephony().getActiveCallsRepository().findCallPeer( sid); - + + if (callPeer != null) { if (logger.isDebugEnabled()) logger.debug("Processing COIN from " + coinIQ.getFrom() + " (version=" + coinIQ.getVersion() + ")"); + + if(coinIQ.getType() == IQ.Type.ERROR) + { + callPeer.fireConferenceMemberErrorEvent(errorMessage); + return; + } + handleCoin(callPeer, coinIQ); } } diff --git a/src/net/java/sip/communicator/plugin/notificationwiring/NotificationManager.java b/src/net/java/sip/communicator/plugin/notificationwiring/NotificationManager.java index a2cd6e8b3..1df714a45 100644 --- a/src/net/java/sip/communicator/plugin/notificationwiring/NotificationManager.java +++ b/src/net/java/sip/communicator/plugin/notificationwiring/NotificationManager.java @@ -646,6 +646,13 @@ public void conferenceMemberAdded(CallPeerConferenceEvent conferenceEvent) } } + /** + * {@inheritDoc} + * + * Not used. + */ + public void conferenceMemberErrorReceived(CallPeerConferenceEvent ev) {} + /** * {@inheritDoc} * diff --git a/src/net/java/sip/communicator/service/protocol/AbstractCallPeer.java b/src/net/java/sip/communicator/service/protocol/AbstractCallPeer.java index 7a44d2009..790c10409 100644 --- a/src/net/java/sip/communicator/service/protocol/AbstractCallPeer.java +++ b/src/net/java/sip/communicator/service/protocol/AbstractCallPeer.java @@ -266,7 +266,31 @@ public void addConferenceMember(ConferenceMember conferenceMember) conferenceMember)); } } - + + /** + * Fires + * CallPeerConferenceEvent#CONFERENCE_MEMBER_ERROR_RECEIVED to + * the currently registered CallPeerConferenceListeners. + * + * @param errorMessage error message that can be displayed. + */ + public void fireConferenceMemberErrorEvent(String errorMessge) + { + if(errorMessge == null || errorMessge.length() == 0) + { + logger.warn("The error message for " + this.getDisplayName() + + " null or empty string."); + return; + } + + fireCallPeerConferenceEvent( + new CallPeerConferenceEvent( + this, + CallPeerConferenceEvent + .CONFERENCE_MEMBER_ERROR_RECEIVED, + null, + errorMessge)); + } /** * Finds the first ConferenceMember whose audioSsrc is * equals to a specific value. The method is meant for very frequent use so @@ -436,6 +460,9 @@ protected void fireCallPeerConferenceEvent( case CallPeerConferenceEvent.CONFERENCE_MEMBER_REMOVED: eventIDString = "CONFERENCE_MEMBER_REMOVED"; break; + case CallPeerConferenceEvent.CONFERENCE_MEMBER_ERROR_RECEIVED: + eventIDString = "CONFERENCE_MEMBER_ERROR_RECEIVED"; + break; default: eventIDString = "UNKNOWN"; break; @@ -461,6 +488,9 @@ protected void fireCallPeerConferenceEvent( case CallPeerConferenceEvent.CONFERENCE_MEMBER_REMOVED: listener.conferenceMemberRemoved(conferenceEvent); break; + case CallPeerConferenceEvent.CONFERENCE_MEMBER_ERROR_RECEIVED: + listener.conferenceMemberErrorReceived(conferenceEvent); + break; } } diff --git a/src/net/java/sip/communicator/service/protocol/CallConference.java b/src/net/java/sip/communicator/service/protocol/CallConference.java index 695750db0..ef193f2a2 100644 --- a/src/net/java/sip/communicator/service/protocol/CallConference.java +++ b/src/net/java/sip/communicator/service/protocol/CallConference.java @@ -193,6 +193,20 @@ protected void onCallPeerConferenceEvent(CallPeerConferenceEvent ev) { CallConference.this.onCallPeerConferenceEvent(ev); } + + /** + * {@inheritDoc} + * + * Invokes + * {@link CallConference#onCallPeerConferenceEvent( + * CallPeerConferenceEvent)}. + */ + @Override + public void conferenceMemberErrorReceived( + CallPeerConferenceEvent ev) + { + CallConference.this.onCallPeerConferenceEvent(ev); + } }; /** @@ -692,6 +706,9 @@ private void onCallPeerConferenceEvent(CallPeerConferenceEvent ev) case CallPeerConferenceEvent.CONFERENCE_MEMBER_REMOVED: l.conferenceMemberRemoved(ev); break; + case CallPeerConferenceEvent.CONFERENCE_MEMBER_ERROR_RECEIVED: + l.conferenceMemberErrorReceived(ev); + break; default: throw new UnsupportedOperationException( "Unsupported CallPeerConferenceEvent eventID."); diff --git a/src/net/java/sip/communicator/service/protocol/event/CallPeerConferenceAdapter.java b/src/net/java/sip/communicator/service/protocol/event/CallPeerConferenceAdapter.java index 5c8ed5326..25f6d2eb7 100644 --- a/src/net/java/sip/communicator/service/protocol/event/CallPeerConferenceAdapter.java +++ b/src/net/java/sip/communicator/service/protocol/event/CallPeerConferenceAdapter.java @@ -38,6 +38,14 @@ public void conferenceMemberAdded(CallPeerConferenceEvent ev) onCallPeerConferenceEvent(ev); } + /** + * {@inheritDoc} + * + * Dummy implementation of + * {@link #conferenceMemberErrorReceived(CallPeerConferenceEvent)}. + */ + public void conferenceMemberErrorReceived(CallPeerConferenceEvent ev) {} + /** * {@inheritDoc} * diff --git a/src/net/java/sip/communicator/service/protocol/event/CallPeerConferenceEvent.java b/src/net/java/sip/communicator/service/protocol/event/CallPeerConferenceEvent.java index 60711ed77..b558498fd 100644 --- a/src/net/java/sip/communicator/service/protocol/event/CallPeerConferenceEvent.java +++ b/src/net/java/sip/communicator/service/protocol/event/CallPeerConferenceEvent.java @@ -55,6 +55,12 @@ public class CallPeerConferenceEvent */ public static final int CONFERENCE_MEMBER_REMOVED = 3; + /** + * The ID of CallPeerConferenceEvent which notifies + * about an error packet received from a CallPeer. + */ + public static final int CONFERENCE_MEMBER_ERROR_RECEIVED = 4; + /** * The ConferenceMember which has been changed (e.g. added to * or removed from the conference) if this event has been fired because of @@ -64,12 +70,21 @@ public class CallPeerConferenceEvent /** * The ID of this event which may be one of - * {@link #CONFERENCE_FOCUS_CHANGED}, {@link #CONFERENCE_MEMBER_ADDED} and + * {@link #CONFERENCE_FOCUS_CHANGED}, {@link #CONFERENCE_MEMBER_ADDED}, + * {@link #CONFERENCE_MEMBER_ERROR_RECEIVED} and * {@link #CONFERENCE_MEMBER_REMOVED} and indicates the specifics of the * change in the conference-related information and the details this event * carries. */ private final int eventID; + + + /** + * The error message associated with the error packet that was received. If + * the eventID is not {@link #CONFERENCE_MEMBER_ERROR_RECEIVED} the value + * should should be null. + */ + private final String errorString; /** * Initializes a new CallPeerConferenceEvent which is to @@ -112,11 +127,41 @@ public CallPeerConferenceEvent( CallPeer sourceCallPeer, int eventID, ConferenceMember conferenceMember) + { + this(sourceCallPeer, eventID, conferenceMember, null); + } + + /** + * Initializes a new CallPeerConferenceEvent which is to + * be fired by a specific CallPeer and which notifies + * about a change in its conference-related information pertaining to a + * specific ConferenceMember. + * + * @param sourceCallPeer the CallPeer which is to fire the new + * event + * @param eventID + * the ID of this event which may be + * {@link #CONFERENCE_MEMBER_ADDED} and + * {@link #CONFERENCE_MEMBER_REMOVED} and indicates the specifics + * of the change in the conference-related information and the + * details this event carries + * @param conferenceMember + * the ConferenceMember which caused the new event + * to be fired + * @param errorString the error string associated with the error packet that + * is received + */ + public CallPeerConferenceEvent( + CallPeer sourceCallPeer, + int eventID, + ConferenceMember conferenceMember, + String errorString) { super(sourceCallPeer); this.eventID = eventID; this.conferenceMember = conferenceMember; + this.errorString = errorString; } /** @@ -163,4 +208,13 @@ public CallPeer getSourceCallPeer() { return (CallPeer) getSource(); } + + /** + * Gets the value of {@link #errorString}. + * @return the error string. + */ + public String getErrorString() + { + return errorString; + } } diff --git a/src/net/java/sip/communicator/service/protocol/event/CallPeerConferenceListener.java b/src/net/java/sip/communicator/service/protocol/event/CallPeerConferenceListener.java index a8fd13675..97e7f4d0e 100644 --- a/src/net/java/sip/communicator/service/protocol/event/CallPeerConferenceListener.java +++ b/src/net/java/sip/communicator/service/protocol/event/CallPeerConferenceListener.java @@ -45,6 +45,17 @@ public void conferenceFocusChanged( */ public void conferenceMemberAdded( CallPeerConferenceEvent conferenceEvent); + + /** + * Notifies this listener about an error packet received from specific + * CallPeer. + * + * @param conferenceEvent a CallPeerConferenceEvent with ID + * CallPeerConferenceEvent#CONFERENCE_MEMBER_ERROR_RECEIVED + * and the error message associated with the packet. + */ + public void conferenceMemberErrorReceived( + CallPeerConferenceEvent conferenceEvent); /** * Notifies this listener about the removal of a specific diff --git a/src/net/java/sip/communicator/service/protocol/media/MediaAwareCallPeer.java b/src/net/java/sip/communicator/service/protocol/media/MediaAwareCallPeer.java index 5efa7caf2..9eba8f6b0 100644 --- a/src/net/java/sip/communicator/service/protocol/media/MediaAwareCallPeer.java +++ b/src/net/java/sip/communicator/service/protocol/media/MediaAwareCallPeer.java @@ -471,6 +471,14 @@ public void conferenceMemberAdded(CallPeerConferenceEvent conferenceEvent) mediaHandler.setCsrcAudioLevelListener(this); } } + + /** + * Dummy implementation of {@link CallPeerConferenceListener + * #conferenceMemberErrorReceived(CallPeerConferenceEvent)}. + * + * @param ev the event + */ + public void conferenceMemberErrorReceived(CallPeerConferenceEvent ev) {}; /** * Called when this peer stops being a mixer. The method add removes this