/*
 *   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 FILE MAY NEED TO BE PROPAGATED TO THE                   */
/* C-EQUIVALENT FILE IN SUPPORT OF THE C-BINDING INTERFACES.          */
/* ----------------------------------------------------------------   */
/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE   */
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */

package org.apache.axis.wsdl.wsdl2ws.cpp;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import javax.xml.namespace.QName;

import org.apache.axis.wsdl.wsdl2ws.CUtils;
import org.apache.axis.wsdl.wsdl2ws.WrapperFault;
import org.apache.axis.wsdl.wsdl2ws.info.FaultInfo;
import org.apache.axis.wsdl.wsdl2ws.info.MethodInfo;
import org.apache.axis.wsdl.wsdl2ws.info.ParameterInfo;
import org.apache.axis.wsdl.wsdl2ws.info.Type;
import org.apache.axis.wsdl.wsdl2ws.info.WebServiceContext;

public class ClientStubWriter extends CPPClassWriter
{
    protected ArrayList methods;

    public ClientStubWriter(WebServiceContext wscontext) throws WrapperFault
    {
        super(wscontext.getServiceInfo().getServicename());
        this.wscontext = wscontext;
        this.methods = wscontext.getServiceInfo().getMethods();
    }

    protected void writeClassComment() throws WrapperFault
    {
        try
        {
            c_writer.write("/*\n");
            c_writer.write(" * This file was auto-generated by the Axis C++ Web Service "
                            + "Generator (WSDL2Ws)\n");
            c_writer.write(" * This file contains Client Stub implementation for remote web service.\n");
            c_writer.write(" */\n\n");
        } 
        catch (IOException e)
        {
            throw new WrapperFault(e);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.apache.axis.wsdl.wsdl2ws.cpp.HeaderFileWriter#writeConstructors()
     */
    protected void writeConstructors() throws WrapperFault
    {
        try
        {
            CUtils.printMethodComment(c_writer, "Constructor for service " + c_classname + ".");
            
            c_writer.write(c_classname + "::\n" + c_classname
                    + "(const char* pcEndpointUri, AXIS_PROTOCOL_TYPE eProtocol)\n:Stub(pcEndpointUri, eProtocol)\n{\n");
            c_writer.write("}\n");
        
            CUtils.printMethodComment(c_writer, "Constructor for service " + c_classname + ".");            
            c_writer.write(c_classname + "::\n" + c_classname + "()\n:Stub(\" \", APTHTTP1_1)\n{\n");
            //TODO get TransportURI from WrapInfo and check what the transport is and do the following line accordingly
            c_writer.write("\tm_pCall->setEndpointURI(\""
                            + wscontext.getServiceInfo().getTargetEndpointURI() + "\");\n");
            c_writer.write("}\n");
        } 
        catch (IOException e)
        {
            throw new WrapperFault(e);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.apache.axis.wsdl.wsdl2ws.cpp.HeaderFileWriter#writeDistructors()
     */
    protected void writeDestructors() throws WrapperFault
    {
        try
        {
            CUtils.printMethodComment(c_writer, "Destructor for service " + c_classname + ".");
            
            c_writer.write(c_classname + "::\n~" + c_classname + "()\n{\n}\n");
        } 
        catch (IOException e)
        {
            throw new WrapperFault(e);
        }
    }

    /*
     * @see org.apache.axis.wsdl.wsdl2ws.cpp.HeaderFileWriter#writeMethods()
     * Used by literal code too!
     */
    protected void writeMethods() throws WrapperFault
    {
        try
        {
            MethodInfo minfo;
            for (int i = 0; i < methods.size(); i++)
            {
                minfo = (MethodInfo) methods.get(i);
                this.writeMethodInWrapper(minfo);
            }
        } 
        catch (IOException e)
        {
            throw new WrapperFault(e);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.apache.axis.wsdl.wsdl2ws.cpp.HeaderFileWriter#writePreprocssorStatements()
     */
    protected void writePreprocessorStatements() throws WrapperFault
    {
        try
        {
            if ("AxisClientException".equals(c_classname))
            {
                c_writer.write("#include \"" + wscontext.getServiceInfo().getServicename() + "_" + c_classname
                        + CUtils.getHeaderFileExtension() + "\"\n\n");
            }
            else
                c_writer.write("#include \"" + CUtils.resolveWSDL2LanguageNameClashes(c_classname) + CUtils.getHeaderFileExtension() + "\"\n\n");

            c_writer.write("#include <axis/AxisWrapperAPI.hpp>\n");
            c_writer.write ("#include <axis/Axis.hpp>\n");
            c_writer.write ("#include <axis/IWrapperSoapSerializer.hpp>\n\n");
        } 
        catch (IOException e)
        {
            throw new WrapperFault(e);
        }
    }

    /**
     * This method genarate methods that wraps the each method of the service
     * @param methodName
     * @param params
     * @param outparam
     * @throws IOException
     */

    public void writeMethodInWrapper(MethodInfo minfo) throws WrapperFault, IOException
    {
        /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
        /* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE   */
        /* ----------------------------------------------------------------   */
        /* CHANGES TO FILE MAY NEED TO BE PROPAGATED TO THE                   */
        /* C-EQUIVALENT FILE IN SUPPORT OF THE C-BINDING INTERFACES.          */
        /* ----------------------------------------------------------------   */
        /* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE   */
        /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */   
        
        boolean isAllTreatedAsOutParams = false;
        ParameterInfo returntype = null;
        int noOfOutParams = minfo.getOutputParameterTypes().size();
        if (0 == noOfOutParams)
            returntype = null;
        else if (1 == noOfOutParams)
            returntype = (ParameterInfo) minfo.getOutputParameterTypes().iterator().next();
        else
            isAllTreatedAsOutParams = true;
        
        Collection params = minfo.getInputParameterTypes();

        Type retType = null;
        boolean returntypeissimple = false;
        boolean returntypeisarray = false;
        String outparamType = null;

        if (returntype != null)
        {
            retType = wscontext.getTypemap().getType(returntype.getSchemaName());
            if (retType != null)
            {
                outparamType = CUtils.getClassNameFromParamInfoConsideringArrays(returntype, wscontext);
                if (retType.isSimpleType())
                   returntypeissimple = true;
                else
                {
                    returntypeissimple = CUtils.isSimpleType (outparamType);
                    returntypeisarray = CUtils.isArrayType(outparamType);
                }
            
                returntypeisarray |= retType.isArray();
            }
            else
            {
                outparamType = returntype.getLangName ();
                returntypeissimple = CUtils.isSimpleType (outparamType);
            } 
        }

        //=============================================================================
        // Generate method prototype
        //=============================================================================        

        CUtils.printMethodComment(c_writer, "This method wraps the service method " + minfo.getMethodname() + ".");

        //method signature
        String paramTypeName;
        boolean typeisarray = false;
        boolean typeissimple = false;
        Type type;

        if (returntype == null)
            c_writer.write("void");
        else if (returntypeissimple
                    && (!(returntype.isNillable() || returntype.isOptional()) 
                            || CUtils.isPointerType(outparamType)))
                c_writer.write (outparamType);
            else if (outparamType.lastIndexOf ("*") > 0)
                c_writer.write (outparamType);
            else
                c_writer.write (outparamType + "*");

        c_writer.write(" " + c_classname + "::\n" + minfo.getSanitizedMethodName() + "(");
        ArrayList paramsB = (ArrayList) params;
        for (int i = 0; i < paramsB.size(); i++)
        {
            paramTypeName = 
                CUtils.getClassNameFromParamInfoConsideringArrays((ParameterInfo) paramsB.get(i), wscontext);
            
            if (i > 0)
                c_writer.write(", ");
            
            typeissimple = CUtils.isSimpleType(paramTypeName);
            if (typeissimple
                    && (!(((ParameterInfo) paramsB.get (i)).isNillable () 
                            || ((ParameterInfo) paramsB.get (i)).isOptional())
                    || CUtils.isPointerType(paramTypeName)))
                c_writer.write (paramTypeName + " Value" + i);
            else if (paramTypeName.lastIndexOf ("*") > 0)
                c_writer.write (paramTypeName + " Value" + i);
            else
                c_writer.write (paramTypeName + "* Value" + i);
        }
        
        // Multiples parameters so fill the methods prototype
        ArrayList paramsC = (ArrayList) minfo.getOutputParameterTypes();
        if (isAllTreatedAsOutParams)
        {
            for (int i = 0; i < paramsC.size(); i++)
            {
                type = wscontext.getTypemap().getType(((ParameterInfo) paramsC.get(i)).getSchemaName());
                c_writer.write(", AXIS_OUT_PARAM  "
                    + CUtils.getClassNameFromParamInfoConsideringArrays(
                                (ParameterInfo) paramsC.get(i),wscontext) + " *OutValue" + i);
            }
        }
        
        c_writer.write(")\n{\n");
        
        //=============================================================================
        // Generate global variables (outside of try block)
        //=============================================================================
        
        if (returntype != null)
        {
            c_writer.write("\t");
            
            if (returntypeisarray)
                c_writer.write(outparamType + " * RetArray = new " + outparamType + "();\n");
            else if (!returntypeissimple)
                c_writer.write(outparamType + "\tpReturn = NULL;\n");
            else if (returntype.isNillable() || returntype.isOptional()
                        || CUtils.isPointerType(outparamType))
            {
                c_writer.write(outparamType);
                if (!CUtils.isPointerType(outparamType))
                    c_writer.write(" *");

                c_writer.write("\tRet = NULL;\n");
            }
            else
            {
                String initValue = CUtils.getInitValueForType (outparamType);
                if (initValue != null)
                    c_writer.write (outparamType + " Ret = " + initValue + ";\n");
                else if (CUtils.getXSDEnumeratorForType( outparamType).equals("XSD_DATETIME")
                        || CUtils.getXSDEnumeratorForType( outparamType).equals("XSD_DATE")
                        || CUtils.getXSDEnumeratorForType( outparamType).equals("XSD_TIME"))
                {
                    c_writer.write (outparamType + " Ret;\n");
                    c_writer.write ("\tmemset(&Ret,0,sizeof(" + outparamType + "));\n");
                }
                else
                    c_writer.write (outparamType + " Ret;\n");
            }
        }

        c_writer.write("\tconst char* pcCmplxFaultName = NULL;\n\n");
        
        //=============================================================================
        // Generate try block and method logic
        //=============================================================================        
        
        c_writer.write("\ttry\n\t{\n");
        
        c_writer.write("\t\tif (AXIS_SUCCESS != m_pCall->initialize(CPP_RPC_PROVIDER" + "))\n");
        c_writer.write("\t\t\treturn ");
        if (returntype != null)
        {
            if (returntypeisarray)
                c_writer.write("RetArray;\n");
            else if (CUtils.isPointerType(outparamType) || 
                       (returntypeissimple && !(returntype.isNillable() || returntype.isOptional())))
                c_writer.write("Ret;\n");
            else if (returntypeissimple)
                c_writer.write("*Ret;\n");
            else
                c_writer.write("pReturn;\n");
        }
        else
            c_writer.write(";\n");
        c_writer.write("\n");

        c_writer.write("\t\tif( NULL == m_pCall->getTransportProperty( \"SOAPAction\", false))\n");
        c_writer.write("\t\t\tm_pCall->setTransportProperty( SOAPACTION_HEADER,\"" 
               + minfo.getSoapAction() + "\");\n");
        c_writer.write("\n");
        
        c_writer.write("\t\tm_pCall->setSOAPVersion( SOAP_VER_1_1);\n");
        //TODO check which version is it really.
        
        // Use namespace specified in input binding if one exists
        // For rpc/literal operations the namespace must be set, but if not, use
        // the target namespace.  
        String namespaceURI = minfo.getInputNamespaceURI();
        if (namespaceURI == null)
            namespaceURI = wscontext.getWrapperInfo().getTargetNameSpaceOfWSDL();
        
        c_writer.write("\t\tm_pCall->setOperation( \"" 
                + minfo.getMethodname() + "\", \"" 
                + namespaceURI + "\");\n"); 

        //=============================================================================
        // Apply user specified properties
        //=============================================================================        
        
        c_writer.write("\n");
        c_writer.write ("\t\tincludeSecure();\n");
        c_writer.write ("\t\tapplyUserPreferences();\n");
        c_writer.write("\n");        

        //=============================================================================
        // Process elements
        //=============================================================================        
        
        for (int i = 0; i < paramsB.size(); i++)
        {
            type = wscontext.getTypemap().getType( ((ParameterInfo) paramsB.get(i)).getSchemaName());
            
            if (type != null)
            {
                paramTypeName = type.getLanguageSpecificName();
                typeisarray = type.isArray();
            }
            else
            {
                paramTypeName = ((ParameterInfo) paramsB.get(i)).getLangName();
                typeisarray = false;
            }
            
            typeissimple = CUtils.isSimpleType(paramTypeName);
            
            if (typeisarray)
            {
                //arrays
                QName qname = CUtils.getArrayType(type).getName();
                String containedType = null;
                if (CUtils.isSimpleType(qname))
                {
                    containedType = CUtils.getSimpleType(qname);
                    c_writer.write("\t\tm_pCall->addBasicArrayParameter( ");
                    c_writer.write("Value" + i + ", "
                            + CUtils.getXSDEnumeratorForType(containedType)
                            + ", \""
                            + ((ParameterInfo) paramsB.get(i)).getParamNameAsSOAPString()
                            + "\"");
                }
                else
                {
                    containedType = qname.getLocalPart();
                    c_writer.write("\t\tm_pCall->addCmplxArrayParameter( ");
                    c_writer.write("Value" + i
                            + ",(void *) Axis_Serialize_" + containedType
                            + ",(void *) Axis_Delete_" + containedType
                            + ",\"" + ((ParameterInfo) paramsB.get(i)).getParamNameAsSOAPString() + "\""
                            + ",Axis_URI_" + containedType);
                }
            }
            else if (typeissimple)
            {
                if (((ParameterInfo) paramsB.get(i)).isNillable()
                        || CUtils.isPointerType(paramTypeName))
                {
                    c_writer.write("\t\tm_pCall->addParameter( ");
                    c_writer.write("(void *) Value" + i + ", \""
                            + ((ParameterInfo) paramsB.get(i)).getParamNameAsSOAPString() + "\", "
                            + CUtils.getXSDEnumeratorForType(paramTypeName));
                }
                else
                {
                    c_writer.write("\t\tm_pCall->addParameter( ");
                    c_writer.write("(void *) &Value" + i + ", \""
                            + ((ParameterInfo) paramsB.get(i)).getParamNameAsSOAPString() + "\", "
                            + CUtils.getXSDEnumeratorForType(paramTypeName));
                }
            }
            else
            {
                //for complex types
                c_writer.write("\t\tm_pCall->addCmplxParameter( ");
                c_writer.write("Value" + i 
                        + ",(void *) Axis_Serialize_" + paramTypeName 
                        + ",(void *) Axis_Delete_" + paramTypeName 
                        + ",\""  + ((ParameterInfo) paramsB.get(i)).getParamNameAsSOAPString()
                        + "\",Axis_URI_" + paramTypeName);
            }

            c_writer.write(");\n");
        }
        
        //=============================================================================
        // Invoke web service - two-way message processing
        //=============================================================================        
        
        c_writer.write("\n\t\tif( AXIS_SUCCESS == m_pCall->sendAndReceive())\n\t\t{\n");
        c_writer.write("\t\t\tif( AXIS_SUCCESS == m_pCall->checkMessage( \""
                + minfo.getOutputMessage().getLocalPart() + "\",\""
                + namespaceURI
                + "\"))\n\t\t\t{\n");
        
        String paramTagName = "";
        
        if( returntype != null)
            paramTagName = returntype.getParamNameAsSOAPString();
  
        //=============================================================================
        // Process output parameters
        //=============================================================================        
        
        if (isAllTreatedAsOutParams)
        {
            String currentParamName;
            String currentParaType;
            for (int i = 0; i < paramsC.size(); i++)
            {
                ParameterInfo currentType = (ParameterInfo) paramsC.get(i);
                paramTagName = currentType.getParamNameAsSOAPString();
                    
                type = wscontext.getTypemap().getType(currentType.getSchemaName());
                if (type != null)
                {
                    currentParaType = type.getLanguageSpecificName();
                    typeisarray = type.isArray();
                }
                else
                {
                    currentParaType = ((ParameterInfo) paramsC.get(i)).getLangName();
                    typeisarray = false;
                }
                typeissimple = CUtils.isSimpleType(currentParaType);

                currentParamName = "*OutValue" + i;
                    
                // Some code need to be merged as we have some duplicated in coding here.
                if (typeisarray)
                {
                    QName qname = CUtils.getArrayType(type).getName();
                    
                    String containedType = null;
                    String containedTypeArrayName = null;

                    if (CUtils.isSimpleType(qname))
                    {
                        containedType = CUtils.getSimpleType(qname);
                        c_writer.write("\n\t\t\tAxis_Array * pReturn" + i + " = m_pCall->getBasicArray( " + CUtils.getXSDEnumeratorForType (containedType) 
                                + ",\"" + paramTagName
                                + "\", 0);\n\n");
                        c_writer.write("\t\t\tif( pReturn" + i + " != NULL && OutValue" + i + " != NULL)\n");
                        c_writer.write("\t\t\t{\n");
                        c_writer.write("\t\t\t\tif( *OutValue" + i + " == NULL)\n");
                        c_writer.write("\t\t\t\t\t*OutValue" + i + " = new " + currentParaType + "();\n");
                        c_writer.write("\t\t\t\telse\n");
                        c_writer.write("\t\t\t\t\t(*OutValue" + i + ")->clear();\n");
                        c_writer.write("\t\t\t\t(*OutValue" + i + ")->clone( *pReturn" + i + ");\n");
                        c_writer.write("\t\t\t}\n\n");
                        c_writer.write("\t\t\tAxis::AxisDelete( (void *) pReturn" + i + ", XSD_ARRAY);\n");
                    }
                    else
                    {
                        containedType          = qname.getLocalPart();
                        containedTypeArrayName = CUtils.getArrayNameForComplexType(qname);

                        c_writer.write("\n\t\t\tif( OutValue" + i + " != NULL)\n" );
                        c_writer.write("\t\t\t{\n");
                        c_writer.write("\t\t\t\tif( " + currentParamName + " == NULL)\n");
                        c_writer.write("\t\t\t\t\t" + currentParamName + " = new " + containedTypeArrayName + "();\n");
                        c_writer.write("\t\t\t\telse\n");
                        c_writer.write("\t\t\t\t\t(" + currentParamName + ")->clear();\n");
                        c_writer.write("\t\t\t\tm_pCall->getCmplxArray( " + currentParamName 
                              + ",(void *) Axis_DeSerialize_" + containedType
                              + ",(void *) Axis_Create_" + containedType
                              + ",(void *) Axis_Delete_" + containedType
                              + ",\"" +currentType.getElementNameAsSOAPString() 
                              + "\",Axis_URI_" + containedType + ");\n");
                        c_writer.write("\t\t\t}\n");
                        c_writer.write("\t\t\telse\n");
                        c_writer.write("\t\t\t{\n");
                        c_writer.write("\t\t\t\t// Unable to return value, but will deserialize to ensure subsequent elements can be correctly processed.\n");
                        c_writer.write("\t\t\t\t" + containedTypeArrayName + " * pTemp" + i 
                                + " = new " + containedTypeArrayName + "();\n");
                        c_writer.write("\t\t\t\tm_pCall->getCmplxArray( pTemp" + i 
                              + ",(void *) Axis_DeSerialize_" + containedType
                              + ",(void *) Axis_Create_" + containedType
                              + ",(void *) Axis_Delete_" + containedType
                              + ",\"" + currentType.getElementNameAsSOAPString()
                              + "\",Axis_URI_" + containedType + ");\n");
                        c_writer.write("\t\t\t\tdelete pTemp" + i + ";\n");
                        c_writer.write("\t\t\t}\n");
                    }
                }
                else if (typeissimple)
                {
                    if( i > 0)
                        c_writer.write( "\n");
                    
                    if (CUtils.isPointerType(currentParaType))
                    {
                        String xsdType =  CUtils.getClassNameFromParamInfoConsideringArrays ((ParameterInfo) paramsC.get (i), wscontext);
                        
                        if( !CUtils.isPointerType(xsdType))
                            xsdType += " *";
                        
                        c_writer.write( "\t\t\t" + currentParaType + " pReturn" + i 
                                + " = m_pCall->" + CUtils.getDeserializerMethodName( currentParaType, false) 
                                + "( \"" + paramTagName + "\", 0);\n");
                        c_writer.write( "\n");
                        c_writer.write( "\t\t\tif( pReturn" + i + " != NULL && OutValue" + i + " != NULL)\n");
                        c_writer.write( "\t\t\t\t{\n");
                        c_writer.write( "\t\t\t\tif( *OutValue" + i + " != NULL)\n");
                        c_writer.write( "\t\t\t\t{\n");
                        c_writer.write( "\t\t\t\t\tint\tiStringSize" + i + " = strlen( (char *) *OutValue" + i + ");\n");
                        c_writer.write( "\t\t\t\t\tint\tiStrLenValue" + i + " = strlen( pReturn" + i + ");\n");
                        c_writer.write( "\n");
                        c_writer.write( "\t\t\t\t\tif( iStrLenValue" + i + " > iStringSize" + i + ")\n");
                        c_writer.write( "\t\t\t\t\t{\n");
                        c_writer.write( "\t\t\t\t\t\t*OutValue" + i + " =(" + xsdType + ") new char[iStrLenValue" + i + " + 1];\n");
                        c_writer.write( "\t\t\t\t\t\tstrcpy( (char *) *OutValue" + i + ", pReturn" + i + ");\n");
                        c_writer.write( "\t\t\t\t\t}\n");
                        c_writer.write( "\t\t\t\t\telse\n");
                        c_writer.write( "\t\t\t\t\t\tstrcpy( (char *) *OutValue" + i + ", pReturn" + i + ");\n");
                        c_writer.write( "\t\t\t\t}\n");
                        c_writer.write( "\t\t\t\telse\n");
                        c_writer.write( "\t\t\t\t{\n");
                        c_writer.write( "\t\t\t\t\t*OutValue" + i + " = (" + xsdType + ") new char[strlen( pReturn" + i + ") + 1];\n");
                        c_writer.write( "\t\t\t\t\tstrcpy( (char *) *OutValue" + i + ", pReturn" + i + ");\n");
                        c_writer.write( "\t\t\t\t}\n");
                        c_writer.write( "\t\t\t}\n");
                        c_writer.write( "\n");
                        c_writer.write( "\t\t\tAxis::AxisDelete( (void *) pReturn" + i + ", " 
                                + CUtils.getXSDEnumeratorForType( currentParaType) + ");\n");
                    }
                    else 
                    {
                        c_writer.write( "\t\t\t" + currentParaType + " * pReturn" + i + " = m_pCall->" 
                               + CUtils.getDeserializerMethodName( currentParaType, false) 
                                + "( \"" + paramTagName + "\", 0);\n");
                        c_writer.write( "\n");
                        c_writer.write( "\t\t\tif( pReturn" + i + " != NULL && OutValue" + i + " != NULL)\n");
                        c_writer.write( "\t\t\t{\n");
                        c_writer.write( "// OutValue" + i + " is not nillable.\n");
                        c_writer.write( "\t\t\t\tOutValue" + i + " = new " + currentParaType + "();\n");
                        c_writer.write( "\n");
                        c_writer.write( "\t\t\t\t*OutValue" + i + " = *pReturn" + i + ";\n");
                        c_writer.write( "\t\t\t}\n");
                        c_writer.write( "\n");
                        c_writer.write( "\t\t\tAxis::AxisDelete( (void *) pReturn" + i + ", " 
                                + CUtils.getXSDEnumeratorForType( currentParaType) + ");\n");
                    }
                }
                else
                {
                    c_writer.write("\t\t\t\t"
                                    + currentParamName + " = (" + currentParaType
                                    + " *) m_pCall->getCmplxObject( (void *) Axis_DeSerialize_" + currentParaType
                                    + ",(void *) Axis_Create_" + currentParaType
                                    + ",(void *) Axis_Delete_" + currentParaType
                                    + ",\"" + paramTagName + "\",0);\n");
                }
            } // end for-loop for paramsC
            
            c_writer.write("\t\t\t}\n");
            c_writer.write("\t\t}\n\n");
            c_writer.write("\t\tm_pCall->unInitialize();\n");
        }
        else if (returntype == null)
        {
            c_writer.write("\t\t\t\t/*not successful*/\n\t\t\t}\n");
            c_writer.write("\t\t}\n\n");
            c_writer.write("\t\tm_pCall->unInitialize();\n");
        }
        else if (returntypeisarray)
        {
            QName qname = CUtils.getArrayType(retType).getName();
            
            String containedType = null;
            String containedTypeArrayName = null;
            
            if (CUtils.isSimpleType(qname))
            {
                containedType = CUtils.getSimpleType(qname);
                c_writer.write("\t\t\t\tAxis_Array * RetAxisArray = m_pCall->getBasicArray( "
                        + CUtils.getXSDEnumeratorForType(containedType) + ",\""
                        + paramTagName + "\",0);\n");
                c_writer.write ("\t\t\t\tRetArray->clone( *RetAxisArray);\n");
                c_writer.write ("\t\t\t\tAxis::AxisDelete( (void *) RetAxisArray, XSD_ARRAY);\n");
            }
            else
            {
                containedType          = qname.getLocalPart();
                containedTypeArrayName = CUtils.getArrayNameForComplexType(qname);

                c_writer.write("\t\t\t\tRetArray = (" + containedTypeArrayName 
                        + " *) m_pCall->getCmplxArray( RetArray,(void *) Axis_DeSerialize_"
                        + containedType);
                c_writer.write(",(void *) Axis_Create_" + containedType
                        + ",(void *) Axis_Delete_" + containedType
                        + ",\"" + paramTagName
                        + "\",Axis_URI_" + containedType + ");\n");            
            }
            c_writer.write("\t\t\t}\n\t\t}\n\n");
            c_writer.write("\t\tm_pCall->unInitialize();\n\n");
            c_writer.write("\t\treturn RetArray;\n");
        }
        else if (returntypeissimple)
        {
            if (returntype.isNillable () || CUtils.isPointerType(outparamType))
            {
                c_writer.write( "\t\t\t\tRet = m_pCall->" 
                        + CUtils.getDeserializerMethodName( outparamType, false) 
                        + "(\"" + returntype.getParamNameAsSOAPString() + "\", 0);\n");
            }
            else
            {
                c_writer.write ("\t\t\t\t" + outparamType + " * pReturn = m_pCall->" +
                          CUtils.getDeserializerMethodName(outparamType, false) + "(\"" +
                          returntype.getElementNameAsSOAPString() + "\", 0);\n");
                c_writer.write ("\t\t\t\tif(pReturn)\n");
                c_writer.write ("\t\t\t\t{\n");
                c_writer.write ("\t\t\t\t\tRet = *pReturn;\n");
                c_writer.write ("\t\t\t\t\tAxis::AxisDelete( (void *) pReturn, " + CUtils.getXSDEnumeratorForType( outparamType) + ");\n");
                c_writer.write ("\t\t\t\t}\n");
                
                // TODO If we unexpectedly receive a nill value, when nillable="false" we should do something appropriate, perhaps as below:
//                              writer.write("\t\t\telse");
//                              writer.write("\t\t\t\tthrow new Exception(\"Unexpected use of nill\");");
            }
            c_writer.write("\t\t\t}\n");
            c_writer.write("\t\t}\n\n");
            c_writer.write("\t\tm_pCall->unInitialize();\n");
            c_writer.write("\t\treturn Ret;\n");
        }
        else
        {
            outparamType = returntype.getLangName();
            //need to have complex type name without *
            c_writer.write("\t\t\t\tpReturn = (" + outparamType
                    + " *) m_pCall->getCmplxObject( (void *) Axis_DeSerialize_"
                    + outparamType + ",(void *) Axis_Create_"
                    + outparamType + ",(void *) Axis_Delete_"
                    + outparamType + ",\"" + paramTagName
                    + "\",0);\n\t\t\t}\n");
            c_writer.write("\t\t}\n\n");
            c_writer.write("\t\tm_pCall->unInitialize();\n\n");
            c_writer.write("\t\treturn pReturn;\n");
        }

        c_writer.write("\t}\n");
        
        //=============================================================================
        // End of try block, beginning of catch block
        //=============================================================================        
                
        writeCatchBlock(minfo);

        //=============================================================================
        // End of method
        //=============================================================================        
                
        c_writer.write("}\n");
    }
    
    /**
     * Used to write out the catch blocks
     * Used by literal code too!
     */
    protected void writeCatchBlock(MethodInfo minfo) throws WrapperFault, IOException
    {
        c_writer.write ("\tcatch(AxisException& e)\n\t{\n");
        
        c_writer.write ("\t\tint iExceptionCode = e.getExceptionCode();\n\n");
        c_writer.write ("\t\tif(AXISC_NODE_VALUE_MISMATCH_EXCEPTION != iExceptionCode)\n");
        c_writer.write ("\t\t{\n");
        c_writer.write ("\t\t\tm_pCall->unInitialize();\n");
        c_writer.write ("\t\t\tthrow;\n");
        c_writer.write ("\t\t}\n\n");
        c_writer.write ("\t\tISoapFault* pSoapFault = (ISoapFault*)\n");
        c_writer.write ("\t\t\tm_pCall->checkFault(\"Fault\",\""
                  + wscontext.getServiceInfo().getTargetEndpointURI () + "\" );\n\n");
        c_writer.write ("\t\tif(pSoapFault)\n");
        c_writer.write ("\t\t{\n");
    
        //to get fault info             
        Iterator paramsFault = minfo.getFaultType ().iterator ();
        String faultInfoName = null;
        boolean flag = false;
        if (!paramsFault.hasNext ())
            writeOtherFaultException("");
        else
        {
            flag = true;
            c_writer.write ("\t\t\tpcCmplxFaultName = pSoapFault->getCmplxFaultObjectName();\n");
        }
        
        boolean printedIF = false;
        while (paramsFault.hasNext ())
        {
            FaultInfo info = (FaultInfo) paramsFault.next ();
            faultInfoName = info.getFaultInfo ();
    
            // Looking through the list of attributes for the 'error' part of
            // the fault message.  If found, update the faultInfoName with the
            // 'localname' of the qname of the attribute.                         
            Iterator infoArrayListIterator = info.getParams ().iterator ();
            while (infoArrayListIterator.hasNext ())
            {
                ParameterInfo paramInfo = (ParameterInfo) infoArrayListIterator.next ();
        
                if (paramInfo != null)
                    if ("error".equals (paramInfo.getParamName ()))
                    {
                        faultInfoName = paramInfo.getElementName ().getLocalPart ();
                        break;
                    }
            }                          
    
            ArrayList paramInfo = info.getParams ();
            for (int i = 0; i < paramInfo.size (); i++)
            {
                ParameterInfo par = (ParameterInfo) paramInfo.get (i);
                String langName   = par.getLangName ();
                String faultType  = CUtils.getClassNameFromParamInfoConsideringArrays (par,wscontext);
                String faultTypeName = faultType;
                if (faultType.lastIndexOf('*') != -1)
                    faultTypeName = faultType.substring(0, faultType.lastIndexOf('*'));
                
                // TODO Currently we do not create exception classes for simple types!
                if (CUtils.isSimpleType (faultTypeName))
                    continue;

                if (printedIF)
                    c_writer.write ("\t\t\telse if");
                else
                {
                    c_writer.write ("\t\t\tif");
                    printedIF = true;
                }
                writeExceptions (faultTypeName, faultType, faultInfoName, langName);
            }
        }
        
        if (flag == true)
        {
            String tab = "";
            if (printedIF)
            {
                c_writer.write ("\t\t\telse\n");
                c_writer.write ("\t\t\t{\n");
                tab = "\t";
            }
            
            writeOtherFaultException(tab);

            if (printedIF)
                c_writer.write ("\t\t\t}\n");
        }
        
        c_writer.write ("\t\t}\n");
        c_writer.write ("\t\telse\n");
        c_writer.write ("\t\t{\n");
        c_writer.write ("\t\t\tm_pCall->unInitialize();\n");
        c_writer.write ("\t\t\tdelete pSoapFault;\n");
        c_writer.write ("\t\t\tthrow;\n");
        c_writer.write ("\t\t}\n");
        
        c_writer.write ("\t}\n");
    }

    /**
     * Used by literal code too!
     */
    private void writeExceptions(String faultTypeName,
                                 String faulttype, 
                                 String faultInfoName,
                                 String langName) throws IOException
    {
        c_writer.write("(0 == strcmp(\"" + faultInfoName + "\", pcCmplxFaultName))\n");
        c_writer.write("\t\t\t{\n");
        
        // TODO Simple types we will let it fall through....reason being that this "fix" is being done 
        // after the fact - that is, we never handled simple types as SOAP fault correctly.
        // And thus we generated invalid code that does not compile.
        if (CUtils.isSimpleType (faultTypeName))
        {
            // TODO use simple exception class....
        }
        else
        {
            c_writer.write("\t\t\t\t" + faulttype + " pFaultDetail = \n");
            c_writer.write("\t\t\t\t\t(" + faulttype + ")pSoapFault->getCmplxFaultObject(\n");
            c_writer.write("\t\t\t\t\t\t(void*) Axis_DeSerialize_" + langName + ",\n");
            c_writer.write("\t\t\t\t\t\t(void*) Axis_Create_" + langName + ",\n");
            c_writer.write("\t\t\t\t\t\t(void*) Axis_Delete_" + langName + ",\n");
            c_writer.write("\t\t\t\t\t\t\"" + faultInfoName + "\",\n");
            c_writer.write("\t\t\t\t\t\t0);\n\n");
            c_writer.write("\t\t\t\tpFaultDetail->setFaultCode(pSoapFault->getFaultcode());\n");
            c_writer.write("\t\t\t\tpFaultDetail->setFaultString(pSoapFault->getFaultstring());\n");
            c_writer.write("\t\t\t\tpFaultDetail->setFaultActor(pSoapFault->getFaultactor());\n");
            c_writer.write("\t\t\t\tpFaultDetail->setExceptionCode(e.getExceptionCode());\n");
            c_writer.write("\t\t\t\tm_pCall->unInitialize();\n");
            c_writer.write ("\t\t\t\tdelete pSoapFault;\n");
            c_writer.write ("\t\t\t\t" + faultTypeName + " fault = *pFaultDetail;\n");
            c_writer.write ("\t\t\t\tdelete pFaultDetail;\n");
            c_writer.write ("\t\t\t\tthrow fault;\n");            
        }
        
        c_writer.write("\t\t\t}\n");
    }
    
    private void writeOtherFaultException(String tabs) throws IOException
    {
        c_writer.write (tabs + "\t\t\tconst char *detail = pSoapFault->getSimpleFaultDetail();\n");
        c_writer.write (tabs + "\t\t\tbool deleteDetail=false;\n\n");
        c_writer.write (tabs + "\t\t\tif (NULL==detail || 0==strlen(detail))\n");
        c_writer.write (tabs + "\t\t\t{\n");
        c_writer.write (tabs + "\t\t\t\tdetail=m_pCall->getFaultAsXMLString();\n");
        c_writer.write (tabs + "\t\t\t\tif (NULL==detail)\n");
        c_writer.write (tabs + "\t\t\t\t\tdetail=\"\";\n");
        c_writer.write (tabs + "\t\t\t\telse\n");
        c_writer.write (tabs + "\t\t\t\t\tdeleteDetail=true;\n");
        c_writer.write (tabs + "\t\t\t}\n\n");
        c_writer.write (tabs + "\t\t\tOtherFaultException ofe(pSoapFault->getFaultcode(),\n");
        c_writer.write (tabs + "\t\t\t\tpSoapFault->getFaultstring(), pSoapFault->getFaultactor(),\n");
        c_writer.write (tabs + "\t\t\t\tdetail, iExceptionCode);\n\n");
        c_writer.write (tabs + "\t\t\tif (deleteDetail && NULL!=detail)\n");
        c_writer.write (tabs + "\t\t\t\tAxis::AxisDelete( (void *) const_cast<char*>(detail), XSD_STRING);\n");
        c_writer.write (tabs + "\n");
        c_writer.write (tabs + "\t\t\tm_pCall->unInitialize();\n");
        c_writer.write (tabs + "\t\t\tdelete pSoapFault;\n");
        c_writer.write (tabs + "\t\t\tthrow ofe;\n");
    }
}
