blob: 005981951090c55420f6ba72e7ac1465af36c627 [file] [log] [blame]
/*
* 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.
*/
// !!! This include file must be first thing in file !!!
#include "../platforms/PlatformAutoSense.hpp"
#include <stdarg.h>
#include <string>
#include <iostream>
#include <axis/ElementMissingException.hpp>
#include <axis/RedundantElementException.hpp>
#include <axis/UnknownElementException.hpp>
#include <axis/Axis.hpp>
#include <axis/AxisException.hpp>
#include <axis/AxisUserAPI.hpp>
#include <axis/Axis.h>
#include <axis/GDefine.h>
#include <axis/AxisUserAPI.h>
#include <axis/TypeMapping.h>
#include "../common/AxisTrace.h"
AXIS_CPP_NAMESPACE_USE
extern "C" {
static AXIS_EXCEPTION_HANDLER_FUNCT global_exceptionHandler = NULL;
STORAGE_CLASS_INFO
int axiscAxisInitialize(AxiscBool bIsServer)
{
int rc = AXISC_SUCCESS;
try
{
Axis::initialize(0==bIsServer);
}
catch ( AxisException& e )
{
axiscAxisInvokeExceptionHandler(e.getExceptionCode(), e.what(), NULL, NULL);
rc = AXISC_FAIL;
}
catch ( ... )
{
axiscAxisInvokeExceptionHandler(-1, "Unrecognized exception thrown.", NULL, NULL);
rc = AXISC_FAIL;
}
return rc;
}
STORAGE_CLASS_INFO
int axiscAxisTerminate()
{
int rc = AXISC_SUCCESS;
try
{
Axis::terminate();
}
catch ( AxisException& e )
{
axiscAxisInvokeExceptionHandler(e.getExceptionCode(), e.what(), NULL, NULL);
rc = AXISC_FAIL;
}
catch ( ... )
{
axiscAxisInvokeExceptionHandler(-1, "Unrecognized exception thrown.", NULL, NULL);
rc = AXISC_FAIL;
}
return rc;
}
AXISC_STORAGE_CLASS_INFO
int axiscAxisDelete(void * pValue,
AXISC_XSDTYPE type)
{
int rc = AXISC_SUCCESS;
try
{
if (pValue == NULL)
return rc;
// There are some types we cannot pass to C++ engine
switch (type)
{
case XSDC_DURATION:
case XSDC_DATETIME:
case XSDC_TIME:
case XSDC_DATE:
case XSDC_GYEARMONTH:
case XSDC_GYEAR:
case XSDC_GMONTHDAY:
case XSDC_GDAY:
case XSDC_GMONTH:
case XSDC_STRING:
case XSDC_NORMALIZEDSTRING:
case XSDC_TOKEN:
case XSDC_LANGUAGE:
case XSDC_NAME:
case XSDC_NCNAME:
case XSDC_ID:
case XSDC_IDREF:
case XSDC_IDREFS:
case XSDC_ENTITY:
case XSDC_ENTITIES:
case XSDC_NMTOKEN:
case XSDC_NMTOKENS:
case XSDC_BOOLEAN:
case XSDC_FLOAT:
case XSDC_DECIMAL:
case XSDC_NONPOSITIVEINTEGER:
case XSDC_NEGATIVEINTEGER:
case XSDC_INTEGER:
case XSDC_LONG:
case XSDC_INT:
case XSDC_SHORT:
case XSDC_BYTE:
case XSDC_NONNEGATIVEINTEGER:
case XSDC_UNSIGNEDLONG:
case XSDC_UNSIGNEDINT:
case XSDC_UNSIGNEDSHORT:
case XSDC_UNSIGNEDBYTE:
case XSDC_POSITIVEINTEGER:
case XSDC_DOUBLE:
case XSDC_ANYURI:
case XSDC_QNAME:
case XSDC_NOTATION:
case C_USER_TYPE:
case C_ATTACHMENT:
case XSDC_UNKNOWN:
case XSDC_ANYTYPE:
{
Axis::AxisDelete(pValue, (XSDTYPE) type);
break;
}
case XSDC_ARRAY:
{
Axisc_Array *array = (Axisc_Array*)pValue;
// Delete array elements via recursion
if (array->m_Array)
{
for (int i=0; i<array->m_Size; ++i)
if (array->m_Array[i])
axiscAxisDelete(array->m_Array[i], array->m_Type);
delete [] array->m_Array;
}
// Delete array
delete array;
break;
}
case XSDC_BASE64BINARY:
{
xsdc__base64Binary* b64 = (xsdc__base64Binary*) pValue;
if (b64->__ptr)
delete [] b64->__ptr;
delete b64;
break;
}
case XSDC_HEXBINARY:
{
xsdc__hexBinary* hb = (xsdc__hexBinary*) pValue;
if (hb->__ptr)
delete [] hb->__ptr;
delete hb;
break;
}
case XSDC_ANY:
{
AxiscAnyType *anytype = (AxiscAnyType *)pValue;
if (anytype->_size > 0 && anytype->_array)
{
for (int i=0; i<anytype->_size; i++)
if (anytype->_array[i])
delete [] anytype->_array[i];
delete [] anytype->_array;
}
delete anytype;
break;
}
default:
;
}
}
catch ( AxisException& e )
{
axiscAxisInvokeExceptionHandler(e.getExceptionCode(), e.what(), NULL, NULL);
rc = AXISC_FAIL;
}
catch ( ... )
{
axiscAxisInvokeExceptionHandler(-1, "Unrecognized exception thrown.", NULL, NULL);
rc = AXISC_FAIL;
}
return rc;
}
AXISC_STORAGE_CLASS_INFO
void *axiscAxisNew(AXISC_XSDTYPE type, int size)
{
void *retVal=NULL;
try
{
switch (type)
{
case XSDC_DURATION:
{
retVal = new xsd__duration();
break;
}
case XSDC_DATETIME:
{
retVal = new xsd__dateTime();
break;
}
case XSDC_TIME:
{
retVal = new xsd__time();
break;
}
case XSDC_DATE:
{
retVal = new xsd__date();
break;
}
case XSDC_GYEARMONTH:
{
retVal = new xsd__gYearMonth();
break;
}
case XSDC_GYEAR:
{
retVal = new xsd__gYear();
break;
}
case XSDC_GMONTHDAY:
{
retVal = new xsd__gMonthDay();
break;
}
case XSDC_GDAY:
{
retVal = new xsd__gDay();
break;
}
case XSDC_GMONTH:
{
retVal = new xsd__gMonth();
break;
}
case XSDC_STRING:
case XSDC_NORMALIZEDSTRING:
case XSDC_TOKEN:
case XSDC_LANGUAGE:
case XSDC_NAME:
case XSDC_NCNAME:
case XSDC_ID:
case XSDC_IDREF:
case XSDC_IDREFS:
case XSDC_ENTITY:
case XSDC_ENTITIES:
case XSDC_NMTOKEN:
case XSDC_NMTOKENS:
case XSDC_ANYURI:
case XSDC_QNAME:
case XSDC_NOTATION:
case XSDC_ANYTYPE:
{
retVal = new char[size+1];
break;
}
case XSDC_BOOLEAN:
{
retVal = new xsd__boolean();
break;
}
case XSDC_BASE64BINARY:
{
xsdc__base64Binary *b64bin = new xsdc__base64Binary();
b64bin->__size=size;
if (size > 0)
b64bin->__ptr = new xsdc__unsignedByte[size+1];
else
b64bin->__ptr=NULL;
retVal = b64bin;
break;
}
case XSDC_HEXBINARY:
{
xsdc__hexBinary *hexbin = new xsdc__hexBinary();
hexbin->__size=size;
if (size > 0)
hexbin->__ptr = new xsdc__unsignedByte[size+1];
else
hexbin->__ptr=NULL;
retVal = hexbin;
break;
}
case XSDC_FLOAT:
{
retVal = new xsd__float();
break;
}
case XSDC_DECIMAL:
{
retVal = new xsd__decimal();
break;
}
case XSDC_INTEGER:
{
retVal = new xsd__integer();
break;
}
case XSDC_NONPOSITIVEINTEGER:
{
retVal = new xsd__nonPositiveInteger();
break;
}
case XSDC_NEGATIVEINTEGER:
{
retVal = new xsd__negativeInteger();
break;
}
case XSDC_LONG:
{
retVal = new xsd__long();
break;
}
case XSDC_INT:
{
retVal = new xsd__int();
break;
}
case XSDC_SHORT:
{
retVal = new xsd__short();
break;
}
case XSDC_BYTE:
{
retVal = new xsd__byte();
break;
}
case XSDC_NONNEGATIVEINTEGER:
{
retVal = new xsd__nonNegativeInteger();
break;
}
case XSDC_UNSIGNEDLONG:
{
retVal = new xsd__unsignedLong();
break;
}
case XSDC_UNSIGNEDINT:
{
retVal = new xsd__unsignedInt();
break;
}
case XSDC_UNSIGNEDSHORT:
{
retVal = new xsd__unsignedShort();
break;
}
case XSDC_UNSIGNEDBYTE:
{
retVal = new xsd__unsignedByte();
break;
}
case XSDC_POSITIVEINTEGER:
{
retVal = new xsd__positiveInteger();
break;
}
case XSDC_DOUBLE:
{
retVal = new xsd__double();
break;
}
case XSDC_ARRAY:
{
Axisc_Array * array = new Axisc_Array();
array->m_Array = NULL;
array->m_Size = 0;
array->m_Type = XSDC_UNKNOWN;
retVal = array;
break;
}
case XSDC_ANY:
{
AxiscAnyType * anytype= new AxiscAnyType();
anytype->_array = NULL;
anytype->_size = 0;
retVal = anytype;
break;
}
case C_USER_TYPE:
case XSDC_UNKNOWN:
case C_ATTACHMENT:
default:
break;
}
}
catch ( ... )
{
axiscAxisInvokeExceptionHandler(-1, "Unrecognized exception thrown.", NULL, NULL);
}
return retVal;
}
AXISC_STORAGE_CLASS_INFO
int axiscAxisDeleteCArray(void ** pValue)
{
delete [] pValue;
}
AXISC_STORAGE_CLASS_INFO
void ** axiscAxisNewCArray(int size)
{
if (size > 0)
return new void *[size];
else
return (void **)NULL;
}
AXISC_STORAGE_CLASS_INFO
void axiscAxisRegisterExceptionHandler( AXIS_EXCEPTION_HANDLER_FUNCT fp )
{
global_exceptionHandler = fp;
}
AXISC_STORAGE_CLASS_INFO
void axiscAxisInvokeExceptionHandler(int errorCode,
const char *errorString,
AXISCHANDLE pSoapFault,
void *faultDetail)
{
if (global_exceptionHandler)
global_exceptionHandler(errorCode, errorString, pSoapFault, faultDetail);
else
std::cerr << "AXIS EXCEPTION: (" << errorCode << ") " << errorString << std::endl;
}
AXISC_STORAGE_CLASS_INFO
void axiscAxisGenerateElementMissingException(const char *s)
{
throw ElementMissingException(s);
}
AXISC_STORAGE_CLASS_INFO
void axiscAxisGenerateRedundantElementException(const char *s)
{
throw RedundantElementException(s);
}
AXISC_STORAGE_CLASS_INFO
void axiscAxisGenerateUnknownElementException(const char *s)
{
throw UnknownElementException(s);
}
AXISC_STORAGE_CLASS_INFO
int axiscAxisStartTrace(const char* logFilePath, const char *logFilter)
{
return Axis::startTrace(logFilePath, logFilter);
}
AXISC_STORAGE_CLASS_INFO
void axiscAxisStopTrace()
{
Axis::stopTrace();
}
AXISC_STORAGE_CLASS_INFO
void axiscAxisWriteTrace(AXISC_TRACE_TYPE type, const char* functionName, const char * fmt, ...)
{
// If logging is not enabled, just return.
if (!AxisTrace::isLoggingEnabled() || !AxisTrace::isStubLoggingEnabled())
return;
// Construct final formatter
std::string myfmt;
std::string blank = " ";
char *traceType = TRACE_TYPE_DEBUG;
if (type == AXISC_TRACE_TYPE_ENTRY)
traceType = TRACE_TYPE_ENTRY;
else if (type == AXISC_TRACE_TYPE_EXIT)
traceType = TRACE_TYPE_EXIT;
else if (type == AXISC_TRACE_TYPE_EXCEPTION)
traceType = TRACE_TYPE_EXCEPT;
if (NULL == fmt)
fmt = "";
myfmt += TRACE_COMPONENT_STUB + blank;
myfmt += traceType + blank;
myfmt += functionName;
myfmt += "(): ";
myfmt += fmt;
va_list vargs;
va_start(vargs,fmt);
AxisTrace::writeTrace(myfmt.c_str(), vargs);
va_end(vargs);
}
}