content: package gov2.nist.javax2.sip;
  
  import gov2.nist.core.net.AddressResolver;
  import gov2.nist.javax2.sip.clientauthutils.AccountManager;
  import gov2.nist.javax2.sip.clientauthutils.AuthenticationHelper;
  import gov2.nist.javax2.sip.clientauthutils.SecureAccountManager;
  import gov2.nist.javax2.sip.header.extensions.JoinHeader;
  import gov2.nist.javax2.sip.header.extensions.ReplacesHeader;
  
  import java.io.IOException;
  import java.net.InetAddress;
  import java.net.SocketAddress;
  import java.util.Collection;
  
  import javax2.sip.Dialog;
  import javax2.sip.SipStack;
  import javax2.sip.header.HeaderFactory;
  
  /**
   * SIP Stack extensions to be added to the next spec revision. Only these may be safely used in
   * the interim between now and the next release. SipStackImpl implements this interface.
   * 
   * The following new stack initialization flags are defined (not the gov2.nist prefix will be
   * dropped when the spec is updated):
   * 
   * <ul>
   *<li>gov2.nist.javax2.sip.AUTOMATIC_DIALOG_ERROR_HANDLING
   *<li>gov2.nist.javax2.sip.IS_BACK_TO_BACK_USER_AGENT
   *<li>gov2.nist.javax2.sip.DELIVER_TERMINATED_EVENT_FOR_NULL_DIALOG
   *<li>gov2.nist.javax2.sip.MAX_FORK_TIME_SECONDS 
   * </ul>
   * @author M. Ranganathan
   * 
   */
  public interface SipStackExt extends SipStack {
  
      /**
       * Get the collection of dialogs currently in the Dialog table. This is useful for debugging
       * purposes.
       *
       */
      public Collection<Dialog> getDialogs();
  
      /**
       * Get the ReferedTo dialog in the Replaces header.
       *
       * @return Dialog object matching the Replaces header, provided it is in an appropriate state
       *         to be replaced, <code>null</code> otherwise
       *
       * @since 2.0
       */
      public Dialog getReplacesDialog(ReplacesHeader replacesHeader);
  
      /**
       * Get the authentication helper.
       *
       *
       * @param accountManager -- account manager (for fetching credentials).
       * @param headerFactory -- header factory.
       *
       * @return - the authentication helper which can be used for generating the appropriate
       *         headers for handling authentication challenges for user agents.
       *
       * @since 2.0
       */
      public AuthenticationHelper getAuthenticationHelper(AccountManager accountManager,
              HeaderFactory headerFactory);
      
      /**
       * Get the authentication helper.
       *
       *
       * @param accountManager -- account manager (for fetching credentials).
       * @param headerFactory -- header factory.
       *
       * @return - the authentication helper which can be used for generating the appropriate
       *         headers for handling authentication challenges for user agents.
       *
       * @since 2.0
       */
      public AuthenticationHelper getSecureAuthenticationHelper(SecureAccountManager accountManager,
              HeaderFactory headerFactory);
  
      /**
       * Set the address resolution interface. The address resolver allows you to register custom
       * lookup schemes ( for example DNS SRV lookup ) that are not directly supported by the JDK.
       *
       * @param addressResolver -- the address resolver to set.
       *
       * @since 2.0
       */
      public void setAddressResolver(AddressResolver addressResolver);
  
      /**
       * Get the dialog in the Join header.
       *
       * @return Dialog object matching the Join header, provided it is in an appropriate state to
       *         be replaced, <code>null</code> otherwise
       *
       * @since 2.0
       */
      public Dialog getJoinDialog(JoinHeader joinHeader);
  
      /**
       * Set the list of cipher suites supported by the stack. A stack can have only one set of
       * suites. These are not validated against the supported cipher suites of the java runtime, so
       * specifying a cipher here does not guarantee that it will work.<br>
       * The stack has a default cipher suite of:
       * <ul>
       * <li> TLS_RSA_WITH_AES_128_CBC_SHA </li>
       * <li> SSL_RSA_WITH_3DES_EDE_CBC_SHA </li>
       * <li> TLS_DH_anon_WITH_AES_128_CBC_SHA </li>
       * <li> SSL_DH_anon_WITH_3DES_EDE_CBC_SHA </li>
       * </ul>
       *
       * <b>NOTE: This function must be called before adding a TLS listener</b>
       *
       * @since 2.0
       * @param newCipherSuites -- The new set of ciphers to support.
       *
       */
      public void setEnabledCipherSuites(String[] newCipherSuites);
  
      /**
       * Creates and binds, if necessary, a TCP socket connected to the specified
       * destination address and port and then returns its local address.
       *
       * @param dst the destination address that the socket would need to connect
       *            to.
       * @param dstPort the port number that the connection would be established
       * with.
       * @param localAddress the address that we would like to bind on
       * (null for the "any" address).
       * @param localPort the port that we'd like our socket to bind to (0 for a
       * random port).
       *
       * @return the SocketAddress that this handler would use when connecting to
       * the specified destination address and port.
       *
       * @throws IOException
       */
      public SocketAddress obtainLocalAddress(InetAddress dst, int dstPort,
                      InetAddress localAddress, int localPort)
          throws IOException;
  
  }
  