public void startOutgoing ( ) throws IllegalStateException , SmackException , InterruptedException { updatePacketListener ( ) ; setSessionState ( JingleSessionStatePending . getInstance ( ) ) ; Jingle jingle = new Jingle ( JingleActionEnum . SESSION_INITIATE ) ; // Create a content negotiator for each media manager on the session. for ( JingleMediaManager mediaManager : getMediaManagers ( ) ) { ContentNegotiator contentNeg = new ContentNegotiator ( this , ContentNegotiator . INITIATOR , mediaManager . getName ( ) ) ; // Create the media negotiator for this content description. contentNeg . setMediaNegotiator ( new MediaNegotiator ( this , mediaManager , mediaManager . getPayloads ( ) , contentNeg ) ) ; JingleTransportManager transportManager = mediaManager . getTransportManager ( ) ; TransportResolver resolver = null ; try { resolver = transportManager . getResolver ( this ) ; } catch ( XMPPException e ) { LOGGER . log ( Level . WARNING , "exception" , e ) ; } if ( resolver . getType ( ) . equals ( TransportResolver . Type . rawupd ) ) { contentNeg . setTransportNegotiator ( new TransportNegotiator . RawUdp ( this , resolver , contentNeg ) ) ; } if ( resolver . getType ( ) . equals ( TransportResolver . Type . ice ) ) { contentNeg . setTransportNegotiator ( new TransportNegotiator . Ice ( this , resolver , contentNeg ) ) ; } addContentNegotiator ( contentNeg ) ; } // Give each of the content negotiators a chance to return a portion of the structure to make the Jingle packet. for ( ContentNegotiator contentNegotiator : contentNegotiators ) { jingle . addContent ( contentNegotiator . getJingleContent ( ) ) ; } // Save the session-initiate packet ID, so that we can respond to it. sessionInitPacketID = jingle . getStanzaId ( ) ; sendStanza ( jingle ) ; // Now setup to track the media negotiators, so that we know when (if) to send a session-accept. setupListeners ( ) ; // Give each of the content negotiators a chance to start // and return a portion of the structure to make the Jingle packet. // Don't do this anymore. The problem is that the other side might not be ready. // Later when we receive our first jingle packet from the other side we'll fire-up the negotiators // before processing it. (See receivePacketAndRespond() above. // for (ContentNegotiator contentNegotiator : contentNegotiators) { // contentNegotiator.start(); // } }
This is the starting point for intitiating a new session .