diff options
author | Damian Minkov <damencho@jitsi.org> | 2011-08-04 14:46:04 +0000 |
---|---|---|
committer | Damian Minkov <damencho@jitsi.org> | 2011-08-04 14:46:04 +0000 |
commit | 43ba2e126321f74c255ac33a7953aa9a013c8051 (patch) | |
tree | f510fce62bf190858b01fc3a131e304076f439ce /src/net/java/sip/communicator/service | |
parent | e787d8b538da43b57d33e8e93cdf28d106b62822 (diff) | |
download | jitsi-43ba2e126321f74c255ac33a7953aa9a013c8051.zip jitsi-43ba2e126321f74c255ac33a7953aa9a013c8051.tar.gz jitsi-43ba2e126321f74c255ac33a7953aa9a013c8051.tar.bz2 |
Fixes possible NPE calling getDisplayName on sip call peers that are already disconnected. Make sure media is closed even if any of call peer listeners throw an exception.
Diffstat (limited to 'src/net/java/sip/communicator/service')
-rw-r--r-- | src/net/java/sip/communicator/service/protocol/AbstractCallPeer.java | 38 | ||||
-rw-r--r-- | src/net/java/sip/communicator/service/protocol/media/MediaAwareCallPeer.java | 16 |
2 files changed, 35 insertions, 19 deletions
diff --git a/src/net/java/sip/communicator/service/protocol/AbstractCallPeer.java b/src/net/java/sip/communicator/service/protocol/AbstractCallPeer.java index 7fd3e52..5cd6885 100644 --- a/src/net/java/sip/communicator/service/protocol/AbstractCallPeer.java +++ b/src/net/java/sip/communicator/service/protocol/AbstractCallPeer.java @@ -245,22 +245,32 @@ public abstract class AbstractCallPeer<T extends Call, { CallPeerListener listener = listeners.next(); - if(eventType.equals(CallPeerChangeEvent - .CALL_PEER_ADDRESS_CHANGE)) + // catch any possible errors, so we are sure we dispatch events + // to all listeners + try { - listener.peerAddressChanged(evt); - } else if(eventType.equals(CallPeerChangeEvent - .CALL_PEER_DISPLAY_NAME_CHANGE)) - { - listener.peerDisplayNameChanged(evt); - } else if(eventType.equals(CallPeerChangeEvent - .CALL_PEER_IMAGE_CHANGE)) - { - listener.peerImageChanged(evt); - } else if(eventType.equals(CallPeerChangeEvent - .CALL_PEER_STATE_CHANGE)) + if(eventType.equals(CallPeerChangeEvent + .CALL_PEER_ADDRESS_CHANGE)) + { + listener.peerAddressChanged(evt); + } else if(eventType.equals(CallPeerChangeEvent + .CALL_PEER_DISPLAY_NAME_CHANGE)) + { + listener.peerDisplayNameChanged(evt); + } else if(eventType.equals(CallPeerChangeEvent + .CALL_PEER_IMAGE_CHANGE)) + { + listener.peerImageChanged(evt); + } else if(eventType.equals(CallPeerChangeEvent + .CALL_PEER_STATE_CHANGE)) + { + listener.peerStateChanged(evt); + } + } + catch(Throwable t) { - listener.peerStateChanged(evt); + logger.error("Error dispatching event of type" + + eventType + " in " + listener, t); } } } 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 efcf238..23f43be 100644 --- a/src/net/java/sip/communicator/service/protocol/media/MediaAwareCallPeer.java +++ b/src/net/java/sip/communicator/service/protocol/media/MediaAwareCallPeer.java @@ -515,12 +515,18 @@ public abstract class MediaAwareCallPeer synchronized(mediaHandler) { - super.setState(newState, reason, reasonCode); - - if (CallPeerState.DISCONNECTED.equals(newState) - || CallPeerState.FAILED.equals(newState)) + try + { + super.setState(newState, reason, reasonCode); + } + finally { - mediaHandler.close(); + // make sure whatever happens to close the media + if (CallPeerState.DISCONNECTED.equals(newState) + || CallPeerState.FAILED.equals(newState)) + { + mediaHandler.close(); + } } } } |