/* $Id$
 *
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to you under the Apache License, Version
 * 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __ETCHAUTHENTICATIONEXCEPTION_H__
#define __ETCHAUTHENTICATIONEXCEPTION_H__
#include "common/EtchException.h"

class EtchAuthenticationException : public EtchException {
public:

  static const EtchObjectType* TYPE();

  /**
   * Constructs a EtchAuthenticationException object.
   */
  EtchAuthenticationException(EtchString &msg);

  /**
   * Constructs a copy of EtchAuthenticationException.
   */
  EtchAuthenticationException(const EtchAuthenticationException& other);

  /**
   * Destructor
   */
  virtual ~EtchAuthenticationException();

  //Overridden
  capu::bool_t equals(const EtchObject* other) const;

};

#endif /* ETCHAUTHENTICATIONEXCEPTION_H */

