public void writeMethodInWrapper()

in src/wsdl/org/apache/axis/wsdl/wsdl2ws/cpp/ClientStubWriter.java [175:726]


    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");
    }