int Method::GenerateMethodImpl()

in graveyard/src/wcg/Method.cpp [98:187]


int Method::GenerateMethodImpl(string& sClassName, File &file)
{
    file << "int " << sClassName << "::" << m_Name << "(IMessageData* mc)" 
        << endl;     
    file << "{" << endl;
    file << "\tIWrapperSoapSerializer* pIWSSZ = NULL;" << endl;
    file << "\tmc->getSoapSerializer(&pIWSSZ);" << endl;
    file << "\tif (!pIWSSZ) return AXIS_FAIL;" << endl;
    file << "\tIWrapperSoapDeSerializer* pIWSDZ = NULL;" << endl;
    file << "\tmc->getSoapDeSerializer(&pIWSDZ);" << endl;
    file << "\tif (!pIWSDZ) return AXIS_FAIL;" << endl;
    file << "\tSetResponseMethod(mc, \"" << m_Name << "Response\");" << endl;
    int nParam = 0;
    for (list<Variable*>::iterator it = m_Params.begin(); 
    it != m_Params.end(); it++)
    {
        file << endl;
        file << "\tIParam *param" << nParam << " = pIWSDZ->GetParam();" 
            << endl;
        if ((*it)->IsComplexType())
        {
            file << "\t" << (*it)->GetTypeName() << "* v" << nParam << 
                " = new " << (*it)->GetTypeName() << "();" << endl;
            file << "\tparam" << nParam << "->" << "SetUserType(" << "v" 
                << nParam <<
                ", (AXIS_DESERIALIZE_FUNCT)Axis_DeSerialize_" << 
                (*it)->GetTypeName() <<
                ", (AXIS_OBJECT_DELETE_FUNCT)Axis_Delete_" << 
                (*it)->GetTypeName() << ");" << endl; 
            file <<    "\tpIWSDZ->Deserialize(param" << nParam << ",0);" 
                << endl; /* 0 should be changed to 1 if multiref to be used */
        }
        else if ((*it)->IsArrayType())
        {
            
        }
        else /* basic types */
        {
            file << "\t" << (*it)->GetTypeName() << " v" << nParam << " = " << 
                "param" << nParam << "->" << 
                Variable::GetParamGetMethod((*it)->GetType()) << "();" << endl;
        }
        nParam++;
    }
    file << endl;
    file << "\t//Call actual web service method with appropriate parameters" 
        << endl;
    file << "\t" << m_pReturnType->GetTypeName();
    if (m_pReturnType->IsComplexType()) 
    {
        file << "*";
        /* this is because of the convention that all user types return by 
         * reference (pointer)
         */
    }
    file << " ret = pWs->" << m_Name << "(";
    for (int n=0; n<nParam;)
    {
        file << "v" << n++;
        if (n<nParam) file << ", ";
    }
    file << ");" << endl;
    file << endl;
    if (m_pReturnType->IsComplexType()) 
    {
        file << "\tIParam* pRetParam = pIWSSZ->AddOutputParam(ret,\
            (void*)Axis_Serialize_" <<
        m_pReturnType->GetTypeName() << ",\
        (void*)Axis_Delete_" << m_pReturnType->GetTypeName()
        << ");" << endl;        
    }
    else
    {
        file << "\tuParamValue value;" << endl;
        file << "\tvalue." << m_pReturnType->GetCorrespondingUnionMemberName() 
            << " = ret";
        if (m_pReturnType->GetType() == VAR_STRING)
        {
            file << ".c_str()";
        }
        file <<    ";" << endl;
        file << "\tIParam* pRetParam = pIWSSZ->AddOutputParam(" << 
            m_pReturnType->GetTypeEnumStr() << ", value);" << endl;
    }
    file << "\tpRetParam->SetName(\"" << m_Name << "Return\");" << endl;
    file << "\treturn AXIS_SUCCESS;" << endl; 
    file << "}" << endl;
    file << endl;
    return 0;
}