/**
   * Constructor for a Jingle incoming session
   *
   * @param conn the XMPP connection
   * @param responder the responder
   * @param transportManager The transport manager
   * @param initialJingleSessionRequest the initial Jingle Session Request
   */
  protected IncomingJingleSession(
      XMPPConnection conn,
      String responder,
      List payloadTypes,
      JingleTransportManager transportManager,
      JingleSessionRequest initialJingleSessionRequest)
      throws XMPPException {

    super(conn, responder, conn.getUser());

    setSid(initialJingleSessionRequest.getSessionID());

    // Create the states...

    accepting = new Accepting(this);
    pending = new Pending(this);
    active = new Active(this);

    TransportResolver resolver = null;
    try {
      resolver = transportManager.getResolver(this);
    } catch (XMPPException e) {
      e.printStackTrace();
    }

    setMediaNeg(new MediaNegotiator(this, payloadTypes));
    if (resolver.getType().equals(TransportResolver.Type.rawupd)) {
      setTransportNeg(new TransportNegotiator.RawUdp(this, resolver));
    }
    if (resolver.getType().equals(TransportResolver.Type.ice)) {
      setTransportNeg(new TransportNegotiator.Ice(this, resolver));
    }
  }
  /**
   * Start the session for a initial Jingle request packet.
   *
   * @param initialJingleSessionRequest the initial Jingle Session Request
   * @throws XMPPException
   */
  public void start(JingleSessionRequest initialJingleSessionRequest) throws XMPPException {
    // Establish the default state
    setState(accepting);

    updatePacketListener();

    Jingle packet = initialJingleSessionRequest.getJingle();
    if (packet != null) {

      // Initialize the session information
      setSid(packet.getSid());

      respond(packet);
    } else {
      throw new XMPPException("Session request with null Jingle packet.");
    }
  }