/*
 *   Copyright 2003-2004 The Apache Software Foundation.
// (c) Copyright IBM Corp. 2004, 2005 All Rights Reserved
 *
 *   Licensed 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.
 *
 *
 */

/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE   */
/* ----------------------------------------------------------------   */
/* CHANGES TO hpp HEADER FILE MAY NEED TO BE PROPAGATED TO THE        */
/* C-EQUIVALENT HEADER FILE IN SUPPORT OF THE C-BINDING INTERFACES.   */
/* ----------------------------------------------------------------   */
/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE   */
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */


/**
 * @file SoapEnvVersions.hpp
 */



#include <axis/GDefine.hpp>

#ifdef WIN32
#pragma warning (disable : 4786)
#endif

#ifndef __SOAPENVVERSIONS_H_OF_AXIS_INCLUDED___
#define __SOAPENVVERSIONS_H_OF_AXIS_INCLUDED___

AXIS_CPP_NAMESPACE_START

/*
 * Here SKW stands for SoapKeyWord. This is a internal naming convension
 * for Axis C++.
 */

/**
 * @enum SOAP_WORDS
 * Enumeration of SOAP key words
 */
typedef enum SOAP_WORDSTag 
{
    /**
     * SOAP Envelope
     */
    SKW_ENVELOPE=0, /* this should always be 0 */
    
    /**
     * SOAP Header
     */
    SKW_HEADER,
    
    /**
     * SOAP Body
     */
    SKW_BODY,
    
    /**
     * SOAP mustUnderstand attribute
     */
    SKW_MUSTUNDERSTAND,
    
    /**
     * SOAP actor attribute
     */
    SKW_ACTOR,
    
    /**
     * SOAP encodingStyle attribute
     */
    SKW_ENCODING_STYLE,
    
    /**
     * SOAP Fault
     */
    SKW_FAULT,
    
    /**
     * SOAP Fault code
     */
    SKW_FAULT_CODE,
    
    /**
     * SOAP Fault string
     */
    SKW_FAULT_STRING,
    
    /**
     * SOAP Fault actor
     */
    SKW_FAULT_ACTOR,
    
    /**
     * SOAP Fault detail
     */
    SKW_DETAIL,
    
    /**
     * Multi-Ref
     */
    SKW_MULTIREF,
    
    /**
     * type attribute
     */
    SKW_TYPE,
    
    /**
     * arrayType attribute
     */
    SKW_ARRAYTYPE,
    
    /**
     * href attribute
     */
    SKW_HREF,
    
    /**
     * id attribute
     */
    SKW_ID,

    SOAP_WORDS_LAST /*this should be the number of entries in this enum */
} SOAP_WORDS;

/**
 * @enum SOAP_VERSION
 * Enumeration to indicate SOAP version being used
 */
typedef enum SOAP_VERSIONTag 
{
    /**
     * SOAP 1.1
     */
    SOAP_VER_1_1=0,
    
    /**
     * SOAP 1.2
     */
    SOAP_VER_1_2,

    VERSION_LAST
} SOAP_VERSION;

/**
 * @struct SoapEnvVersionsStruct
 * Structure to provide mapping between SOAP namespace, and prefix, and the various
 * SOAP keywords.
 */
struct SoapEnvVersionsStruct 
{
    /**
     * Namespace URI of SOAP version
     */
    const AxisChar* pchNamespaceUri;
    
    /**
     * Namespace prefix to use for this SOAP version
     */
    const AxisChar* pchPrefix;
    
    /**
     * Array of SOAP keywords
     */
    const AxisChar* pchWords[SOAP_WORDS_LAST];
};

AXIS_CPP_NAMESPACE_END
#endif

