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