diff --git a/src/net/java/sip/communicator/impl/gui/main/call/CallManager.java b/src/net/java/sip/communicator/impl/gui/main/call/CallManager.java index 47c63ab88..d938d1531 100644 --- a/src/net/java/sip/communicator/impl/gui/main/call/CallManager.java +++ b/src/net/java/sip/communicator/impl/gui/main/call/CallManager.java @@ -69,8 +69,20 @@ public static class GuiCallListener implements CallListener * ring phone sound to the user. * @param event the CallEvent */ - public void incomingCallReceived(CallEvent event) + public void incomingCallReceived(final CallEvent event) { + if(!SwingUtilities.isEventDispatchThread()) + { + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + incomingCallReceived(event); + } + }); + return; + } + Call sourceCall = event.getSourceCall(); final ReceivedCallDialog receivedCallDialog = new ReceivedCallDialog(sourceCall, event.isVideoCall()); diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ChatPanel.java b/src/net/java/sip/communicator/impl/gui/main/chat/ChatPanel.java index ee5b22f23..c55cf3737 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chat/ChatPanel.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/ChatPanel.java @@ -1947,10 +1947,22 @@ else if (subject.equals(oldSubject)) * @param date the date on which the request has been received */ public void addIncomingFileTransferRequest( - OperationSetFileTransfer fileTransferOpSet, - IncomingFileTransferRequest request, - Date date) + final OperationSetFileTransfer fileTransferOpSet, + final IncomingFileTransferRequest request, + final Date date) { + if(!SwingUtilities.isEventDispatchThread()) + { + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + addIncomingFileTransferRequest( + fileTransferOpSet, request, date); + } + }); + } + this.addActiveFileTransfer(request.getID(), request); ReceiveFileConversationComponent component diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPane.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPane.java index e64e0e5b5..2f9e23bee 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPane.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPane.java @@ -233,69 +233,97 @@ public void messageReceived(MessageReceivedEvent evt) Contact protocolContact = evt.getSourceContact(); Message message = evt.getSourceMessage(); int eventType = evt.getEventType(); - MetaContact metaContact = GuiActivator.getContactListService() .findMetaContactByContact(protocolContact); if(metaContact != null) { - // Obtain the corresponding chat panel. - final ChatPanel chatPanel - = chatWindowManager.getContactChat( metaContact, - protocolContact, - message.getMessageUID()); - - // Show an envelope on the sender contact in the contact list and - // in the systray. - if (!chatPanel.isChatFocused()) - contactList.setActiveContact(metaContact, true); - - // Distinguish the message type, depending on the type of event that - // we have received. - String messageType = null; - - if(eventType == MessageReceivedEvent.CONVERSATION_MESSAGE_RECEIVED) - { - messageType = Chat.INCOMING_MESSAGE; - } - else if(eventType == MessageReceivedEvent.SYSTEM_MESSAGE_RECEIVED) - { - messageType = Chat.SYSTEM_MESSAGE; - } - else if(eventType == MessageReceivedEvent.SMS_MESSAGE_RECEIVED) - { - messageType = Chat.SMS_MESSAGE; - } - - chatPanel.addMessage( - protocolContact.getAddress(), - protocolContact.getDisplayName(), - evt.getTimestamp(), - messageType, - message.getContent(), - message.getContentType()); + messageReceived(protocolContact, + metaContact, message, eventType, evt.getTimestamp()); + } + else + { + if (logger.isTraceEnabled()) + logger.trace("MetaContact not found for protocol contact: " + + protocolContact + "."); + } + } - // Opens the chat panel with the new message in the UI thread. + /** + * When a message is received determines whether to open a new chat window + * or chat window tab, or to indicate that a message is received from a + * contact which already has an open chat. When the chat is found checks if + * in mode "Auto popup enabled" and if this is the case shows the message in + * the appropriate chat panel. + * + * @param protocolContact the source contact of the event + * @param metaContact the metacontact containing protocolContact + * @param message the message to deliver + * @param eventType the event type + * @param timestamp the timestamp of the event + */ + private void messageReceived(final Contact protocolContact, + final MetaContact metaContact, + final Message message, + final int eventType, + final long timestamp) + { + if(!SwingUtilities.isEventDispatchThread()) + { SwingUtilities.invokeLater(new Runnable() { public void run() { - chatWindowManager.openChat(chatPanel, false); + messageReceived(protocolContact, + metaContact, message, eventType, timestamp); } }); + return; + } + + // Obtain the corresponding chat panel. + final ChatPanel chatPanel + = chatWindowManager.getContactChat( metaContact, + protocolContact, + message.getMessageUID()); + + // Show an envelope on the sender contact in the contact list and + // in the systray. + if (!chatPanel.isChatFocused()) + contactList.setActiveContact(metaContact, true); - ChatTransport chatTransport - = chatPanel.getChatSession() - .findChatTransportForDescriptor(protocolContact); + // Distinguish the message type, depending on the type of event that + // we have received. + String messageType = null; - chatPanel.setSelectedChatTransport(chatTransport); + if(eventType == MessageReceivedEvent.CONVERSATION_MESSAGE_RECEIVED) + { + messageType = Chat.INCOMING_MESSAGE; } - else + else if(eventType == MessageReceivedEvent.SYSTEM_MESSAGE_RECEIVED) { - if (logger.isTraceEnabled()) - logger.trace("MetaContact not found for protocol contact: " - + protocolContact + "."); + messageType = Chat.SYSTEM_MESSAGE; + } + else if(eventType == MessageReceivedEvent.SMS_MESSAGE_RECEIVED) + { + messageType = Chat.SMS_MESSAGE; } + + chatPanel.addMessage( + protocolContact.getAddress(), + protocolContact.getDisplayName(), + timestamp, + messageType, + message.getContent(), + message.getContentType()); + + chatWindowManager.openChat(chatPanel, false); + + ChatTransport chatTransport + = chatPanel.getChatSession() + .findChatTransportForDescriptor(protocolContact); + + chatPanel.setSelectedChatTransport(chatTransport); } /** diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java index f0bb1f7d1..009314221 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java @@ -1130,7 +1130,25 @@ else if (tlsRequired) throw new XMPPException("TLS is required by client"); } - connection.addConnectionListener(connectionListener); + if(!connection.isConnected()) + { + // connection is not connected, lets set state to our connection + // as failed seems there is some lag/problem with network + // and this way we will inform for it and later reconnect if needed + // as IllegalStateException that is thrown within + // addConnectionListener is not handled properly + disconnectAndCleanConnection(); + + fireRegistrationStateChanged(getRegistrationState(), + RegistrationState.CONNECTION_FAILED, + RegistrationStateChangeEvent.REASON_SERVER_NOT_FOUND, null); + + return ConnectState.ABORT_CONNECTING; + } + else + { + connection.addConnectionListener(connectionListener); + } if(abortConnecting) {