content: /*
  * Conditions Of Use
  *
  * This software was developed by employees of the National Institute of
  * Standards and Technology (NIST), an agency of the Federal Government.
  * Pursuant to title 15 Untied States Code Section 105, works of NIST
  * employees are not subject to copyright protection in the United States
  * and are considered to be in the public domain.  As a result, a formal
  * license is not needed to use the software.
  *
  * This software is provided by NIST as a service and is expressly
  * provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
  * OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
  * AND DATA ACCURACY.  NIST does not warrant or make any representations
  * regarding the use of the software or the results thereof, including but
  * not limited to the correctness, accuracy, reliability or usefulness of
  * the software.
  *
  * Permission to use this software is contingent upon your acceptance
  * of the terms of this agreement.
  *
  */
  package gov2.nist.javax2.sip.header;
  
  import gov2.nist.core.*;
  
  import java.text.ParseException;
  
  /**
   * Authentication info SIP Header.
   *
   * @author M. Ranganathan   NIST/ITL/ANTD
   * @since 1.1
   * @version 1.2 $Revision: 1.9 $ $Date: 2009/07/17 18:57:27 $
   *
   *
   */
  public final class AuthenticationInfo
      extends ParametersHeader
      implements javax2.sip.header.AuthenticationInfoHeader {
  
      /**
       * Comment for <code>serialVersionUID</code>
       */
      private static final long serialVersionUID = -4371927900917127057L;
  
      /** Default contstructor.
       */
      public AuthenticationInfo() {
          super(NAME);
          parameters.setSeparator(COMMA); // Odd ball.
      }
  
      public void add(NameValue nv) {
          parameters.set(nv);
      }
  
      /** Value of header encoded in canonical form.
       */
  
      protected String encodeBody() {
          return parameters.encode();
  
      }
  
      /** Get the name value pair for a given authentication info parameter.
       *
       *@param name is the name for which we want to retrieve the name value
       *  list.
       */
  
      public NameValue getAuthInfo(String name) {
          return parameters.getNameValue(name);
      }
  
      /**
       * Returns the AuthenticationInfo value of this AuthenticationInfoHeader.
       *
       *
       *
       * @return the String representing the AuthenticationInfo
       *
       *
       *
       */
      public String getAuthenticationInfo() {
          return this.encodeBody();
      }
  
      /** Returns the CNonce value of this AuthenticationInfoHeader.
       *
       * @return the String representing the cNonce information, null if value is
       * not set.
       * @since v1.1
       */
      public String getCNonce() {
          return this.getParameter(ParameterNames.CNONCE);
      }
  
      /** Returns the nextNonce value of this AuthenticationInfoHeader.
       *
       * @return the String representing the nextNonce
       * information, null if value is not set.
       * @since v1.1
       */
      public String getNextNonce() {
          return this.getParameter(ParameterNames.NEXT_NONCE);
      }
  
      /** Returns the Nonce Count value of this AuthenticationInfoHeader.
       *
       * @return the integer representing the nonceCount information, -1 if value is
       * not set.
       * @since v1.1
       */
      public int getNonceCount() {
          return this.getParameterAsInt(ParameterNames.NONCE_COUNT);
      }
  
      /** Returns the messageQop value of this AuthenticationInfoHeader.
       *
       * @return the string representing the messageQop information, null if the
       * value is not set.
       * @since v1.1
       */
      public String getQop() {
          return this.getParameter(ParameterNames.QOP);
      }
  
      /** Returns the Response value of this AuthenticationInfoHeader.
       *
       * @return the String representing the Response information.
       * @since v1.1
       */
      public String getResponse() {
          return this.getParameter(ParameterNames.RESPONSE_AUTH);
      }
  
      /** Sets the CNonce of the AuthenticationInfoHeader to the <var>cNonce</var>
       * parameter value.
       *
       * @param cNonce - the new cNonce String of this AuthenticationInfoHeader.
       * @throws ParseException which signals that an error has been reached
       * unexpectedly while parsing the cNonce value.
       * @since v1.1
       */
      public void setCNonce(String cNonce) throws ParseException {
          this.setParameter(ParameterNames.CNONCE, cNonce);
      }
  
      /** Sets the NextNonce of the AuthenticationInfoHeader to the <var>nextNonce</var>
       * parameter value.
       *
       * @param nextNonce - the new nextNonce String of this AuthenticationInfoHeader.
       * @throws ParseException which signals that an error has been reached
       * unexpectedly while parsing the nextNonce value.
       * @since v1.1
       */
      public void setNextNonce(String nextNonce) throws ParseException {
          this.setParameter(ParameterNames.NEXT_NONCE, nextNonce);
      }
  
      /** Sets the Nonce Count of the AuthenticationInfoHeader to the <var>nonceCount</var>
       * parameter value.
       *
       * @param nonceCount - the new nonceCount integer of this AuthenticationInfoHeader.
       * @throws ParseException which signals that an error has been reached
       * unexpectedly while parsing the nonceCount value.
       * @since v1.1
       */
      public void setNonceCount(int nonceCount) throws ParseException {
          if (nonceCount < 0)
              throw new ParseException("bad value", 0);
          String nc = Integer.toHexString(nonceCount);
  
          String base = "00000000";
          nc = base.substring(0, 8 - nc.length()) + nc;
          this.setParameter(ParameterNames.NC, nc);
      }
  
      /** Sets the Qop value of the AuthenticationInfoHeader to the new
       * <var>qop</var> parameter value.
       *
       * @param qop - the new Qop string of this AuthenticationInfoHeader.
       * @throws ParseException which signals that an error has been reached
       * unexpectedly while parsing the Qop value.
       * @since v1.1
       */
      public void setQop(String qop) throws ParseException {
          this.setParameter(ParameterNames.QOP, qop);
      }
  
      /** Sets the Response of the
       * AuthenticationInfoHeader to the new <var>response</var>
       * parameter value.
       *
       * @param response - the new response String of this
       * AuthenticationInfoHeader.
       * @throws ParseException which signals that an error has been reached
       * unexpectedly while parsing the Response.
       * @since v1.1
       */
      public void setResponse(String response) throws ParseException {
          this.setParameter(ParameterNames.RESPONSE_AUTH, response);
      }
  
      public void setParameter(String name, String value) throws ParseException {
          if (name == null)
              throw new NullPointerException("null name");
          NameValue nv = super.parameters.getNameValue(name.toLowerCase());
          if (nv == null) {
              nv = new NameValue(name, value);
              if (name.equalsIgnoreCase(ParameterNames.QOP)
                  || name.equalsIgnoreCase(ParameterNames.NEXT_NONCE)
                  || name.equalsIgnoreCase(ParameterNames.REALM)
                  || name.equalsIgnoreCase(ParameterNames.CNONCE)
                  || name.equalsIgnoreCase(ParameterNames.NONCE)
                  || name.equalsIgnoreCase(ParameterNames.OPAQUE)
                  || name.equalsIgnoreCase(ParameterNames.USERNAME)
                  || name.equalsIgnoreCase(ParameterNames.DOMAIN)
                  || name.equalsIgnoreCase(ParameterNames.NEXT_NONCE)
                  || name.equalsIgnoreCase(ParameterNames.RESPONSE_AUTH)) {
                  if (value == null)
                      throw new NullPointerException("null value");
                  if (value.startsWith(Separators.DOUBLE_QUOTE))
                      throw new ParseException(
                          value + " : Unexpected DOUBLE_QUOTE",
                          0);
                  nv.setQuotedValue();
              }
              super.setParameter(nv);
          } else
              nv.setValueAsObject(value);
      }
  }
  