/*
 *   Copyright 2003-2004 The Apache Software Foundation.
 * (c) Copyright IBM Corp. 2004, 2006 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.
 *
 *
 *
 */
#ifndef AXIS_INCLUDED
#define 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   */
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */


#include <axis/GDefine.h>
#include <axis/TypeMapping.h>

#ifdef __cplusplus
  extern "C" {
#endif

/**
 * @file Axis.h
 */

  /**
   * @enum AXISC_TRACE_TYPE
   * Trace types 
   */
  typedef enum 
  { 
	  AXISC_TRACE_TYPE_ENTRY=0,
	  
	  AXISC_TRACE_TYPE_EXIT=1,
	  
	  AXISC_TRACE_TYPE_EXCEPTION=2,
	  
	  AXISC_TRACE_TYPE_DEBUG=3
	  
  }  AXISC_TRACE_TYPE;
	  
/**
 *
 * Contains methods to initialize and terminate the Axis runtime. Creating a stub also initializes
 * the Axis runtime and deleting the stub terminates it. So simple applications that only ever
 * use one stub at a time do not need to call these methods. More complicated applications that 
 * initialize multiple stubs, use them and delete them later, should initialize Axis at the start
 * of their application using axiscInitializeAxis and terminate Axis at the very end of their 
 * application with axiscTerminate. Applications that use Axis in multiple threads should also 
 * call axiscInitializeAxis and axiscTerminate.
 */
 
/**
 * Initializes the Axis runtime.
 * @param bIsServer should be set to false for client applications.
 * @return AXISC_SUCCESS or AXISC_FAIL to indicate success or fail
 */
AXISC_STORAGE_CLASS_INFO 
int axiscAxisInitialize(AxiscBool bIsServer);

/** 
 * Terminates the Axis runtime. 
 * @return AXISC_SUCCESS or AXISC_FAIL to indicate success or fail
 */
AXISC_STORAGE_CLASS_INFO 
int axiscAxisTerminate();

/**
 * Deletes storage allocated by the Axis engine, that is no longer required
 * by the customer application.
 * 
 * @param pValue Pointer to storage to be reclaimed
 * @param type The XSDTYPE of the storage item to be deleted.
 * @return AXISC_SUCCESS or AXISC_FAIL to indicate success or fail
 */
AXISC_STORAGE_CLASS_INFO 
int axiscAxisDelete(void * pValue, 
                    AXISC_XSDTYPE type);

/**
 * Allocates storage to be used by Axis engine.  All proxy code and allocated
 * storage required by the client for basic types must use this 
 * function in order that it may be freed by proxy code or the Axis engine.
 * 
 * @param type The XSDTYPE of the storage to be allocated.
 * @param size - size of storage to be allocated
 * @return pointer to allocated storage
 */
AXISC_STORAGE_CLASS_INFO 
void * axiscAxisNew(AXISC_XSDTYPE type, 
                    int size);

/**
 * Deletes storage allocated by the Axis engine representing a C-type array. 
 * This is an internal API used by the generated stubs. The elements in array are
 * the responsibility of the stubs to clean up.
 * 
 * @param pValue Pointer to storage to be reclaimed
 * @return AXISC_SUCCESS or AXISC_FAIL to indicate success or fail
 */
AXISC_STORAGE_CLASS_INFO 
int axiscAxisDeleteCArray(void ** pValue);

/**
 * Allocates storage to be used by stubs.  The storage is a C-type array.
 * This is an internal API used by the generated stubs.
 * 
 * @param size - size of array to be allocated
 * @return pointer to allocated storage
 */
AXISC_STORAGE_CLASS_INFO 
void ** axiscAxisNewCArray(int size);

/**
 * Registers a function that will be invoked to handle Axis engine
 * exceptions.  The function will be called with two parameters, 
 * the error code and the error message, if any. 
 * 
 * @param fp - pointer to exception handler function.
 */
  
typedef void (* AXIS_EXCEPTION_HANDLER_FUNCT)(int exceptionCode, const char *exceptionString, AXISCHANDLE pSoapFault, void *faultDetail);


AXISC_STORAGE_CLASS_INFO 
void axiscAxisRegisterExceptionHandler(AXIS_EXCEPTION_HANDLER_FUNCT);

/**
 * Invokes the registered exception handler. If an exception handler was not
 * registered, the errorCode and errorString are printed to stderr. 
 * 
 * @param errorCode - error code.
 * @param errorString - error string.
 * @param pSoapFault - pointer to soap fault object.  If no fault, param will be set to NULL.
 * @param faultDetail - pointer to fault detail.  If no fault detail, param will be set to NULL. 
 */

AXISC_STORAGE_CLASS_INFO 
void axiscAxisInvokeExceptionHandler(int exceptionCode, 
                                     const char *exceptionString, 
                                     AXISCHANDLE pSoapFault, 
                                     void *faultDetail);

AXISC_STORAGE_CLASS_INFO 
void axiscAxisGenerateElementMissingException(const char *s);

AXISC_STORAGE_CLASS_INFO 
void axiscAxisGenerateRedundantElementException(const char *s);

AXISC_STORAGE_CLASS_INFO 
void axiscAxisGenerateUnknownElementException(const char *s);

/**
 * Start Axis logging. This must be done prior to any activiy in order to propagate 
 * logging attributes to parser and transport.  If there are active transports and 
 * parsers, you will not get trace records other than those associated with the  
 * the engine and newly instantiated transports and parsers.
 * 
 * @param logFilePath  Path to where trace records are written to.
 * @param filter       Trace filter.  The string filter is a semicolon delimited string
 *                     of possible filters.  Possible filters include:
 * 
 *                     stub         - show trace records generated by stubs
 *                     engine       - show trace records generated by engine
 *                     parser       - show trace records generated by parser
 *                     transport    - show trace records generated by transport
 *                     noEntryExit  - do not show entry/exit trace records
 *                     
 *                     The default filter is "stub;engine;parser;transport".
 *                     Specifying a NULL pointer or NULL string is equivalent to 
 *                     requesting the defailt filter.
 */
AXISC_STORAGE_CLASS_INFO
int axiscAxisStartTrace(const char* logFilePath, const char *logFilter);

/**
 * Stop Axis logging. This should be done as the last step when everything has been cleaned
 * up. Otherwise, active transports and parsers will continue to trace.
 */
AXISC_STORAGE_CLASS_INFO
void axiscAxisStopTrace();

/**
 * Log trace. 
 * 
 * @param  functionName  - function for which trace record is being written.
 * @param  fmt           - format as defined in printf and related functions.
 * @param  ...           - variable nuumber of parameters.
 */
AXISC_STORAGE_CLASS_INFO
void  axiscAxisWriteTrace(AXISC_TRACE_TYPE type, const char* functionName, const char * fmt, ...);

#ifdef __cplusplus
  }
#endif


#endif
