blob: 93196e75c9575fa1b038e0bb672decd5c3e385b0 [file] [log] [blame]
/*
* Copyright 2003-2004 The Apache Software Foundation.
*
* 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.
*/
/*
* @author Roshan Weerasuriya (roshan@opensource.lk, roshanw@jkcsworld.com)
* @author Damitha Kumarage (damitha@opensource.lk, damitha@jkcsworld.com)
*/
/*
* Revision 1.1 2004/June/02 roshan
* The following changes were done during correcting a Runtime error in the
* windows platform.
* Added deletion of pointers to the Destrutor
* Added "pParam->m_Value.pStrValue = strdup((char*)(pValue));" to the setParam
* method and removed the line
* "pParam->m_Value.pStrValue = *((char**)(pValue));".
* Changed setFaultcode, setFaultstring, setFaultactor, setFaultDetail methods
* to send a char pointer to the setParam method.
* eg: In the setFaultcode method, changed passing of &sFaultcode to
* sFaultcode.c_str()
* i.e Before change:
* setParam(m_pFaultcodeParam, "faultcode", &sFaultcode, XSD_STRING);
* After change:
* setParam(m_pFaultcodeParam, "faultcode", sFaultcode.c_str(), XSD_STRING);
*
* Changed. The "SOAP-ENV" prefix was hard-coded in the "serialize" method.
* Corrected it to serialize the correct prefix.
*/
#include "SoapFault.h"
#include "SoapSerializer.h"
#include "SoapDeSerializer.h"
#include <axis/server/SoapEnvVersions.h>
#include <axis/server/GDefine.h>
#include "../common/AxisTrace.h"
#include "../common/AxisConfig.h"
extern AxisTrace* g_pAT;
extern AxisConfig* g_pConfig;
volatile bool SoapFault::m_bInit = false;
SoapFault::SoapFault()
{
m_bIsSimpleDetail = false;
}
SoapFault::~SoapFault()
{
delete m_pFaultcodeParam;
delete m_pFaultstringParam;
delete m_pFaultactorParam;
delete m_pFaultDetail;
m_pFaultcodeParam = NULL;
m_pFaultstringParam = NULL;
m_pFaultactorParam = NULL;
m_pFaultDetail = NULL;
}
int SoapFault::serialize(SoapSerializer& pSZ, SOAP_VERSION eSoapVersion)
{
/* written according to SOAP Version 1.1 */
int iStatus= AXIS_SUCCESS;
if(m_bIsSimpleDetail)
{
pSZ.setStyle(DOC_LITERAL);
pSZ.serialize("<", gs_SoapEnvVersionsStruct[eSoapVersion].pchPrefix, ":",
gs_SoapEnvVersionsStruct[eSoapVersion].pchWords[SKW_FAULT], ">", NULL);
m_pFaultcodeParam->serialize(pSZ);
//pSZ.serialize("<faultcode>", m_sFaultcode.c_str(), "</faultcode>", NULL);
m_pFaultstringParam->serialize(pSZ);
//pSZ.serialize("<faultstring>", m_sFaultstring.c_str(), "</faultstring>", NULL);
if(m_pFaultactorParam)
{
m_pFaultactorParam->serialize(pSZ);
//pSZ.serialize("<faultactor>", m_sFaultactor.c_str(), "</faultactor>", NULL);
}
/*if(!m_sFaultDetail.empty())
{
pSZ.serialize("<detail>", m_sFaultDetail.c_str(), "</detail>", NULL);
}*/
if(m_pFaultDetail)
{
/*if(m_bIsSimpleDetail)
{*/
m_pFaultDetail->serialize(pSZ);
/*}
else
{
pSZ.serialize("<faultdetail>", NULL);
m_pFaultDetail->serialize(pSZ);
pSZ.serialize("</faultdetail>", NULL);
}*/
}
pSZ.serialize("</", gs_SoapEnvVersionsStruct[eSoapVersion].pchPrefix, ":",
gs_SoapEnvVersionsStruct[eSoapVersion].pchWords[SKW_FAULT], ">", NULL);
}
else
{
pSZ.serialize("<", gs_SoapEnvVersionsStruct[eSoapVersion].pchPrefix, ":",
gs_SoapEnvVersionsStruct[eSoapVersion].pchWords[SKW_FAULT], ">", NULL);
m_pFaultcodeParam->serialize(pSZ);
//pSZ.serialize("<faultcode>", m_sFaultcode.c_str(), "</faultcode>", NULL);
m_pFaultstringParam->serialize(pSZ);
//pSZ.serialize("<faultstring>", m_sFaultstring.c_str(), "</faultstring>", NULL);
if(m_pFaultactorParam)
{
m_pFaultactorParam->serialize(pSZ);
//pSZ.serialize("<faultactor>", m_sFaultactor.c_str(), "</faultactor>", NULL);
}
/*if(!m_sFaultDetail.empty())
{
pSZ.serialize("<detail>", m_sFaultDetail.c_str(), "</detail>", NULL);
}*/
if(m_pFaultDetail)
{
/*if(m_bIsSimpleDetail)
{
m_pFaultDetail->serialize(pSZ);
}
else
{*/
pSZ.serialize("<faultdetail>", NULL);
m_pFaultDetail->serialize(pSZ);
pSZ.serialize("</faultdetail>", NULL);
//}
}
pSZ.serialize("</", gs_SoapEnvVersionsStruct[eSoapVersion].pchPrefix, ":",
gs_SoapEnvVersionsStruct[eSoapVersion].pchWords[SKW_FAULT], ">", NULL);
}
return iStatus;
}
void SoapFault::initialize()
{
if (!m_bInit)
{
static SoapFaultStruct s_arrLocalFaultStruct[FAULT_LAST] =
{
/*VersionMismatch faults */
{"VersionMismatch", "Soap Version Mismatch error", "", ""},
/*MustUnderstand faults */
{"MustUnderstand", "Soap Must Understand error", "", ""},
/*Client faults */
{"Client", "Soap message is incorrect or incomplete", "", ""},
{"Client", "Soap Action header empty", "", ""},
{"Client", "Soap content is not valid", "", ""},
{"Client", "No method to invoke", "", ""},
{"Client", "Content is not Soap", "", ""},
{"Client", "Requested service is not registerd at the server", "", ""},
{"Client", "Soap method is not allowed to invoke", "", ""},
{"Client", "Parameter type mismatch", "", ""},
{"Client", "A client handler failed", "", ""},
/*Server faults */
{"Server", "Unknown Engine Exception", "", ""},
{"Server", "Cannot load web service", "", ""},
{"Server", "Cannot load service handlers", "", ""},
{"Server", "DLOPEN FAILED in loading transport library", "", ""},
{"Server", "DLOPEN FAILED in loading parser library", "", ""},
{"Server", "A service handler failed", "", ""},
{"Server", "Webservice failed", "", ""},
{"Server", "Handler initialization failed", "", ""},
{"Server", "Handler creation failed", "", ""},
{"Server", "Library loading failed", "", ""},
{"Server", "Handler not loaded", "", ""},
{"Server", "Handler is being used", "", ""},
{"Server", "Get hander failed", "", ""},
{"Server", "Wrong handler type", "", ""},
{"Server", "Unknown Axis Configuration Exception", "", ""},
{"Server", "Transport configuration error", "", ""},
{"Server", "Library path is empty", "", ""},
{"Server", "Unknown Wsdd Exception", "", ""},
{"Server", "No handlers configured", "", ""},
{"Server", "Unknown Soap Exception", "", ""},
{"Server", "Unknown Transport Exception", "", ""},
{"Server", "Receive from transport failed", "", ""},
{"Server", "Send to transport failed", "", ""},
{"Server", "HTTP Error, cannot process response message", "", ""},
{"Server", "nknow HTTP response, cannot process response message", "", ""},
{"Server", "Http transport exception", "", ""},
{"Server", "Unexpected string", "", ""},
{"Server", "Cannot initialize a channel to the remote end", "", ""},
{"Server", "Sockets error Couldn't create socket", "", ""},
{"Server", "Cannot open a channel to the remote end, shutting down the channel", "", ""},
{"Server", "Invalid socket. Socket may not be open", "", ""},
{"Server", "Output streaming error on Channel while writing data", "", ""},
{"Server", "Input streaming error while getting data", "", ""},
{"Server", "Channel error while waiting for timeout", "", ""},
{"Server", "Channel error connection timeout before receving", "", ""},
{"Server", "Transport buffer is empty", "", ""},
{"Server", "Buffer received from the parser is empty", "", ""},
{"Server", "XML_STATUS_ERROR thrown from parser", "", ""},
{"Server", "Error when getting the byte stream from the transport", "", ""},
{"Server", "Test exception", "", ""},
{"Server", "Unknown exception", "", ""}
};
s_parrSoapFaultStruct = s_arrLocalFaultStruct;
m_bInit = true;
}
}
/*the caller of the SoapFault::getSoapFault(int) has to delete the
* returned SoapFault pointer
*/
SoapFault* SoapFault::getSoapFault(int iFaultCode)
{
SoapFault* pSoapFault= NULL;
/* fill the soap fault object */
pSoapFault= new SoapFault();
/* TODO *********************************************** */
/* the soap envelope namespace prefix to be obtained from
* gs_SoapEnvVersionsStruct should depend on the relevant SOAP VERSION
*/
string strFaultcode = s_parrSoapFaultStruct[iFaultCode].pcFaultcode;
string strSoapEnvVerStruct = gs_SoapEnvVersionsStruct[SOAP_VER_1_1].pchPrefix;
pSoapFault->setFaultcode(strSoapEnvVerStruct + ":" + strFaultcode);
//pSoapFault->setFaultcode(string(gs_SoapEnvVersionsStruct[SOAP_VER_1_1].pchPrefix) +
// ":" + s_parrSoapFaultStruct[iFaultCode].pcFaultcode);
pSoapFault->setFaultstring(s_parrSoapFaultStruct[iFaultCode].pcFaultstring);
//pSoapFault->setFaultactor(s_parrSoapFaultStruct[iFaultCode].pcFaultactor);
/* Fault actor should be set to the node url in which Axis C++ running.
* Currently it is hardcoded to localhost
*/
char* pcNodeName = g_pConfig->getAxisConfProperty(AXCONF_NODENAME);
char* pcPort = g_pConfig->getAxisConfProperty(AXCONF_LISTENPORT);
string strUrl = pcNodeName;
strUrl += ":";
strUrl += string(pcPort);
pSoapFault->setFaultactor(strUrl);
pSoapFault->setFaultDetail(s_parrSoapFaultStruct[iFaultCode].pcFaultDetail);
return pSoapFault;
}
SoapFault::SoapFault(string sFaultcode, string sFaultstring, string sFaultactor, string sDetail)
{
m_sFaultcode= sFaultcode;
m_sFaultstring= sFaultstring;
m_sFaultactor= sFaultactor;
m_sFaultDetail= sDetail;
}
int SoapFault::setParam(Param* pParam, const AxisChar* pchName, const void* pValue, XSDTYPE type)
{
if (!pParam) return AXIS_FAIL;
pParam->m_Type = type;
pParam->m_sName = pchName;
//pParam->m_Value.pStrValue = *((char**)(pValue));
pParam->m_Value.pStrValue = strdup((char*)(pValue));
return AXIS_SUCCESS;
}
int SoapFault::setFaultcode(const string& sFaultcode)
{
m_pFaultcodeParam = new Param();
//setParam(m_pFaultcodeParam, "faultcode", &sFaultcode, XSD_STRING);
setParam(m_pFaultcodeParam, "faultcode", sFaultcode.c_str(), XSD_STRING);
m_sFaultcode= sFaultcode;
return AXIS_SUCCESS;
}
int SoapFault::setFaultstring(const string& sFaultstring)
{
m_pFaultstringParam = new Param();
setParam(m_pFaultstringParam, "faultstring", sFaultstring.c_str(), XSD_STRING);
m_sFaultstring= sFaultstring;
return AXIS_SUCCESS;
}
int SoapFault::setFaultactor(const string& sFaultactor)
{
m_pFaultactorParam = new Param();
setParam(m_pFaultactorParam, "faultactor", sFaultactor.c_str(), XSD_STRING);
m_sFaultactor = sFaultactor;
return AXIS_SUCCESS;
}
int SoapFault::setFaultDetail(const string& sFaultDetail)
{
m_pFaultDetail = new Param();
setParam(m_pFaultDetail, "faultdetail", sFaultDetail.c_str(), XSD_STRING);
m_sFaultDetail = sFaultDetail;
m_bIsSimpleDetail = true;
return AXIS_SUCCESS;
}
int SoapFault::setFaultDetail(const Param* pFaultDetail)
{
m_pFaultDetail = (Param*) pFaultDetail;
return AXIS_SUCCESS;
}
int SoapFault::setCmplxFaultObjectName(const string& sCmplxFaultObjectName)
{
m_sCmplxFaultObjectName = sCmplxFaultObjectName;
return AXIS_SUCCESS;
}
int SoapFault::setCmplxFaultObject(const void* pCmplxFaultObject)
{
m_pCmplxFaultObject = pCmplxFaultObject;
return AXIS_SUCCESS;
}
void SoapFault::setPrefix(const AxisChar* prefix)
{
m_strPrefix = prefix;
}
void SoapFault::setLocalName(const AxisChar* localname)
{
m_strLocalname = localname;
}
void SoapFault::setUri(const AxisChar* uri)
{
m_strUri = uri;
}
void SoapFault::setDeSerializer(SoapDeSerializer* pDZ)
{
m_pDZ = pDZ;
}
const char* SoapFault::getSoapString()
{
return m_sFaultstring.c_str();
}
string SoapFault::getFaultcode()
{
return m_sFaultcode;
}
string SoapFault::getFaultstring()
{
return m_sFaultstring;
}
string SoapFault::getFaultactor()
{
return m_sFaultactor;
}
string SoapFault::getSimpleFaultDetail()
{
return m_sFaultDetail;
}
string SoapFault::getCmplxFaultObjectName()
{
return m_sCmplxFaultObjectName;
}
void* SoapFault::getCmplxFaultObject(void* pDZFunct, void* pCreFunct, void* pDelFunct,
const AxisChar* pName, const AxisChar* pNamespace)
{
return m_pDZ->getCmplxFaultObject (pDZFunct, pCreFunct, pDelFunct, pName,
pNamespace);
}
const void* SoapFault::getCmplxFaultObject()
{
return m_pCmplxFaultObject;
}
bool SoapFault::operator ==(const SoapFault &objSoapFault)
{
if ((m_sFaultcode == objSoapFault.m_sFaultcode) &&
(m_sFaultstring == objSoapFault.m_sFaultstring) &&
(m_sFaultactor == objSoapFault.m_sFaultactor) &&
(m_sFaultDetail == objSoapFault.m_sFaultDetail))
{
return true;
}
return false;
}