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