/** * Processes the session initiation {@link SessionIQ} that we were created with, passing its * content to the media handler. * * @param sessionInitIQ The {@link SessionIQ} that created the session that we are handling here. */ public void processSessionAccept(SessionIQ sessionInitIQ) { this.sessionInitIQ = sessionInitIQ; CallPeerMediaHandlerGTalkImpl mediaHandler = getMediaHandler(); Collection<PacketExtension> extensions = sessionInitIQ.getExtensions(); RtpDescriptionPacketExtension answer = null; for (PacketExtension ext : extensions) { if (ext.getElementName().equalsIgnoreCase(RtpDescriptionPacketExtension.ELEMENT_NAME)) { answer = (RtpDescriptionPacketExtension) ext; break; } } try { mediaHandler.getTransportManager().wrapupConnectivityEstablishment(); mediaHandler.processAnswer(answer); } catch (IllegalArgumentException e) { // HACK for FreeSwitch that send accept message before sending // candidates sessAcceptedWithNoCands = sessionInitIQ; return; } catch (Exception exc) { if (logger.isInfoEnabled()) logger.info("Failed to process a session-accept", exc); // send an error response String reasonText = "Error: " + exc.getMessage(); SessionIQ errResp = GTalkPacketFactory.createSessionTerminate( sessionInitIQ.getTo(), sessionInitIQ.getFrom(), sessionInitIQ.getID(), Reason.GENERAL_ERROR, reasonText); getMediaHandler().getTransportManager().close(); setState(CallPeerState.FAILED, reasonText); getProtocolProvider().getConnection().sendPacket(errResp); return; } // tell everyone we are connecting so that the audio notifications would // stop setState(CallPeerState.CONNECTED); mediaHandler.start(); }