/*
 *   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.
 *
 */

#if !defined(__GDEFINEC_H_OF_AXIS_INCLUDED__)
#define __GDEFINEC_H_OF_AXIS_INCLUDED__

/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE   */
/* ----------------------------------------------------------------   */
/* THIS HEADER FILE PATTERNED AFTER CORRESPONDING hpp HEADER FILE.    */
/* CHANGES TO hpp HEADER FILE MAY NEED TO BE PROPAGATED HERE AND IN   */
/* THE IMPLEMEMTATION OF THE APIS.                                    */
/* ----------------------------------------------------------------   */
/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE   */
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */

#ifdef __cplusplus
  extern "C" {
#endif

/*
 * @file GDefine.h
 *  
 * This file contains all global definitions that are valid across whole
 * Axis C++ project.
 */
typedef enum 
{ 
    /**
     * Success
     */
    AXISC_SUCCESS=0,
    
    /**
     * Failure
     */
    AXISC_FAIL = -1, 
    
    /**
     * Failure - only for C binding, not in C++
     */
    AXISC_EXCEPTION = -2, 
    
    /**
     * Object already exists
     */
    AXISC_OBJECT_ALREADY_EXISTS=1,
    
    /**
     * A matching handler does not exist
     */
    AXISC_NO_SUCH_HANDLER,
    
    /**
     * A matching service does not exist
     */
    AXISC_NO_SUCH_SERVICE,
    
    /**
     * No SOAP header blocks remaining
     */
    AXISC_NO_REMAINING_SOAP_HEADERS
} AXISC_GLOBAL_ERROR;

/**
 * @enum AXIS_PROTOCOL_TYPE
 * Enumeration of transport protocols.
 */
typedef enum 
{ 
    /**
     * Unknown
     */
    AXISC_APT_UNKNOWN = -1,
    
    /**
     * HTTP 1.0
     */
    AXISC_APTHTTP1_0=0,
    
    /**
     * HTTP 1.1
     */
    AXISC_APTHTTP1_1,
    
    /**
     * FTP
     */
    AXISC_APTFTP,
    
    /**
     * SMTP
     */
    AXISC_APTSMTP,
    
    /**
     * HTTPS
     */
    AXISC_APTHTTPS,
    
    /**
     * Other
     */
    AXISC_APTOTHER
} AXISC_PROTOCOL_TYPE;

/**
 * @enum AXIS_TRANSPORT_INFORMATION_TYPE
 * Enumeration of the different information types used by the transport.
 */
typedef enum 
{
    /**
     * SoapAction header field
     */
    AXISC_SOAPACTION_HEADER,
    
    /**
     * URI to service
     */
    AXISC_SERVICE_URI,
    
    /**
     * Name of operation on service
     */
    AXISC_OPERATION_NAME,
    
    /**
     * Length of SOAP message
     */
    AXISC_SOAP_MESSAGE_LENGTH,
    
    /**
     * Generic transport properties
     */
    AXISC_TRANSPORT_PROPERTIES,
    
    /**
     * Properties for secure transport
     */
    AXISC_SECURE_PROPERTIES,
    
    /**
     * Name of transport library
     */
    AXISC_DLL_NAME,
    
    /**
     * Name of SSL channel library
     */
    AXISC_CHANNEL_HTTP_SSL_DLL_NAME = AXISC_DLL_NAME,
    
    /**
     * Name of non-SSL channel library
     */
    AXISC_CHANNEL_HTTP_DLL_NAME,
   
    /**
     * Content type
     */
    AXISC_CONTENT_TYPE,

    /**
     * Whether redirect should be handled implicitly. Values can be "true" or "false".
     * The default is true. Redirects will only be implicitly be handled if going from
     * http:// to http:// or https:// to https://.
     */
    AXISC_ENABLE_AUTOMATIC_REDIRECT,

    /**
     * Maximum number of automatic redirects to follow.  Property should be a string representing a numeric value.
     * Default is 1. If "0" is specified, it will be as if AXISC_ENABLE_AUTOMATIC_REDIRECT is set to
     * false.
     */
    AXISC_MAX_AUTOMATIC_REDIRECT,

    /**
     * I/O timeout in seconds.  Property should be a string representing a numeric value.
     */
    AXISC_IO_TIMEOUT,

    /**
     * Connect timeout in seconds.  Property should be a string representing a numeric value.
     */
    AXISC_CONNECT_TIMEOUT

} AXISC_TRANSPORT_INFORMATION_TYPE;

#define AXISC_SOAPACTIONHEADER "SOAPAction"

#define AxiscChar char
#define AxiscXMLCh char

#if defined(WIN32) 
#define AXISC_STORAGE_CLASS_INFO __declspec(dllexport)
#else
#define AXISC_STORAGE_CLASS_INFO 
#endif

#if defined(__GNUC__)
#define AXISCCALL __attribute__((cdecl))
#else /* unix or win32 */
#if defined(__unix)
#define AXISCCALL
#else
#define AXISCCALL __stdcall
#endif
#endif

typedef int AxiscBool;
typedef void* AXISCHANDLE;

#ifdef __cplusplus
  }
#endif

#endif 


