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