void CGenerateNetInterop::codeGenerate()

in src/codegen/tool/GenerateNetInterop.cpp [214:417]


void CGenerateNetInterop::codeGenerate(const schema::CObservableObjectInfo *pPropertyModelInfo)
{
    const schema::CObservableObjectInfo *pSourceType = nullptr;
    bool isViewModelInherited = false;
    if(pPropertyModelInfo->getModelType() == schema::ModelTypeInfoType_ViewModel)
    {
       pSourceType = ((const schema::CPropertyViewModelInfo *)pPropertyModelInfo)->getSourceType();
       isViewModelInherited = ((const schema::CPropertyViewModelInfo *)pPropertyModelInfo)->getIsInherited();
    }

    std::wstring typeInfoName = toTypeInfoName(pPropertyModelInfo->getName());
    std::wstring baseClass;

    std::wostringstream osEnumProperties;
    std::wostringstream osEnumMethods;

    std::wostringstream osSrcProperties;
    std::wostringstream osSrcMethods;

    // add factory type
    _osFactoryTypeEntrySrc << FormatW(
            _factoryTypeEntry_Template,
            FormatW(L"{0}.IIdType",typeInfoName.data(),nullptr).data(),
            toCSharpModelTypeName(pPropertyModelInfo,true).data(),
            nullptr);

    const schema::CObservableObjectInfo *pBaseModelTypeInfo = nullptr;
    if(pPropertyModelInfo->getBaseType())
    {
        pBaseModelTypeInfo = (const schema::CObservableObjectInfo *)pPropertyModelInfo->getBaseType();

        //if(isViewModelInherited && 
        //    (pBaseModelTypeInfo->getModelType() == schema::ModelTypeInfoType_ViewModel) &&
        //    (pSourceType != ((const schema::CPropertyViewModelInfo *)pPropertyModelInfo)->getSourceType()))
        //{
        //    pBaseModelTypeInfo = pSourceType;
        //}
    }
    else if(pSourceType && !pSourceType->getParent().isFactorySchema() && isViewModelInherited)
    {
        pBaseModelTypeInfo = pSourceType;
    }

    if(pBaseModelTypeInfo != nullptr)
    {
        baseClass = this->getNamespaceLookup(pBaseModelTypeInfo->getParent().getNamespace());
        baseClass += L".";
        baseClass += toTypeInfoName(pBaseModelTypeInfo->getName());
    }
    else
    {
        baseClass = L"ObservableObject";
    }

    // Iterate Properties
    for(schema::_PropertyIteratorType::const_iterator iter = pPropertyModelInfo->getProperties().begin();
        iter != pPropertyModelInfo->getProperties().end();
        ++iter)
    {
        std::wstring propertyName = (*iter)->getName();
        osEnumProperties << "\t\t\t" << propertyName << " = 0x" << std::hex << (*iter)->getId() << std::dec;
        if(pSourceType != nullptr)
        {
            osEnumProperties << " + 0x1000";
        }
        osEnumProperties << "," << std::endl;

        std::wstring propertyTypeInfoName = toCSharpPropertyTypeInfo(*iter,false);
        std::wstring getProperty = L"";
        if((*iter)->getFlags() & PropertyFlagType_CanRead)
        {
            getProperty = FormatW(_property_get_Template,propertyName.data(),propertyTypeInfoName.data(),nullptr);
        }
        std::wstring setProperty = L"";
        if((*iter)->getFlags() & PropertyFlagType_CanWrite)
        {
            setProperty = FormatW(_property_set_Template,propertyName.data(),nullptr);
        }
        osSrcProperties << FormatW(
                    _property_Declare_Template,
                    propertyName.data(),
                    propertyTypeInfoName.data(),
                    getProperty.data(),
                    setProperty.data(),
                    nullptr);
    }

    if(pSourceType && !pSourceType->getParent().isFactorySchema() &&
        (pBaseModelTypeInfo==nullptr || pBaseModelTypeInfo->getModelType() != schema::ModelTypeInfoType_ViewModel))
    {
        osSrcProperties << FormatW(_property_Source_Template,
            toCSharpModelTypeName(pSourceType,false).data(),
            nullptr);
    }

    // Iterate Methods
    for(schema::_MethodIteratorType::const_iterator iter = pPropertyModelInfo->getMethods().begin();
        iter != pPropertyModelInfo->getMethods().end();
        ++iter)
    {
        std::wstring methodName = (*iter)->getName();
        osEnumMethods << "\t\t\t" << methodName << " = 0x" << std::hex << (*iter)->getId() << std::dec;
        if(pSourceType != nullptr)
        {
            osEnumMethods << " + 0x1000";
        }
        osEnumMethods << "," << std::endl;

        bool hasResultType;
        bool isAsync = (*iter)->getIsAsync();

        std::wstring returnTypeInfo;
        if( isAsync ||
            ((*iter)->getResultType() && (*iter)->getResultType()->getPropertyType() != foundation::PropertyType_Empty))
        {
            hasResultType = true;
            if(isAsync)
            {
                returnTypeInfo = toAsyncOperationTypeInfo((*iter)->getResultType(),false);
            }
            else
            {
                returnTypeInfo = toCSharpPropertyTypeInfo((*iter)->getResultType(),false);
            }
        }
        else
        {
            hasResultType = false;
            returnTypeInfo = L"void";
        }

        osSrcMethods << "\t\tpublic " << ((*iter)->getIsAsync() ? toTaskTypeInfo((*iter)->getResultType(),false):returnTypeInfo) << " " << (*iter)->getName() << "(";

        for(schema::_MethodParamIteratorType::const_iterator iterParam = (*iter)->getParameters().begin();
            iterParam != (*iter)->getParameters().end();
            ++iterParam)
        {
            if(iterParam != (*iter)->getParameters().begin())
            {
                osSrcMethods << ",";
            }
            osSrcMethods << toCSharpPropertyTypeInfo(*iterParam,false) << " " << (*iterParam)->getParameterName();
        }
        osSrcMethods << ")" << std::endl;
        osSrcMethods << "\t\t{" << std::endl;
        osSrcMethods << "\t\t\t";
        if(hasResultType)
        {
            osSrcMethods << "return ";
        }
        osSrcMethods << "Invoke";
        if(hasResultType)
        {
            osSrcMethods << "<" << returnTypeInfo << ">";
        }
        osSrcMethods << "((uint)Methods." << (*iter)->getName();
        for(schema::_MethodParamIteratorType::const_iterator iterParam = (*iter)->getParameters().begin();
            iterParam != (*iter)->getParameters().end();
            ++iterParam)
        {
            osSrcMethods << ",";
            osSrcMethods << (*iterParam)->getParameterName();
        }
        osSrcMethods << ")" << (isAsync ? ".GetTask();" : ";") << std::endl;

        osSrcMethods << "\t\t}" << std::endl;
    }

    std::wstring propertiesRegion = L"";
    if(pPropertyModelInfo->getProperties().size() > 0)
    {
        propertiesRegion = FormatW(
            _propertiesEnum_Template,
            pBaseModelTypeInfo != nullptr && 
            pBaseModelTypeInfo->getProperties().size()>0 ? L"new" : L"",
            osEnumProperties.str().data(),
            nullptr);
        propertiesRegion += osSrcProperties.str();
    }

    std::wstring methodsRegion = L"";
    if(pPropertyModelInfo->getMethods().size() > 0)
    {
        methodsRegion = FormatW(
            _methodsEnum_Template,
            pBaseModelTypeInfo != nullptr && 
            pBaseModelTypeInfo->getMethods().size()>0 ? L"new" : L"",
            osEnumMethods.str().data(),
            nullptr);
        methodsRegion += osSrcMethods.str();
    }

    // Emit C# Class implementation
    _osCSharpInteropSrc << FormatW(
        _interopPropertyModelClass_Template,
        typeInfoName.data(),
        baseClass.data(),
        toCSharpIIDType(pPropertyModelInfo->getType()).data(),
        pBaseModelTypeInfo != nullptr ? L"new" : L"",
        propertiesRegion.data(),
        methodsRegion.data(),
        nullptr
        );
}