All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.joynr.generator.cpp.provider.InterfaceRequestInterpreterCppTemplate.xtend Maven / Gradle / Ivy

package io.joynr.generator.cpp.provider
/*
 * !!!
 *
 * Copyright (C) 2011 - 2013 BMW Car IT GmbH
 *
 * 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.
 */

import com.google.inject.Inject
import org.franca.core.franca.FInterface
import org.franca.core.franca.FType
import io.joynr.generator.cpp.util.TemplateBase
import io.joynr.generator.cpp.util.JoynrCppGeneratorExtensions

class InterfaceRequestInterpreterCppTemplate {

	@Inject
	private extension TemplateBase
	
	@Inject
	private extension JoynrCppGeneratorExtensions

	def generate(FInterface serviceInterface){
		val interfaceName = serviceInterface.joynrName
		'''
		«warning()»
		
		#include "«getPackagePathWithJoynrPrefix(serviceInterface, "/")»/«interfaceName»RequestInterpreter.h"
		
		#include "joynr/Request.h"
		#include "«getPackagePathWithJoynrPrefix(serviceInterface, "/")»/«interfaceName»RequestCaller.h"
		#include "joynr/DeclareMetatypeUtil.h"
		#include "joynr/Util.h"
		#include "joynr/RequestStatus.h"
		#include 
		
		«FOR parameterType: getRequiredIncludesFor(serviceInterface)»
			#include "«parameterType»"
		«ENDFOR»
		
		«getNamespaceStarter(serviceInterface)» 
		
		joynr::joynr_logging::Logger* «interfaceName»RequestInterpreter::logger = joynr::joynr_logging::Logging::getInstance()->getLogger("SDMO", "«interfaceName»JsonRequestInterpreter");
		
		«interfaceName»RequestInterpreter::«interfaceName»RequestInterpreter()
		{
			«FOR datatype: getAllComplexAndEnumTypes(serviceInterface)»
				«IF datatype instanceof FType»
					qRegisterMetaType<«getMappedDatatype(datatype as FType)»>("«getMappedDatatype(datatype as FType)»");
				«ENDIF»
			«ENDFOR»
		}
		
		QVariant «interfaceName»RequestInterpreter::execute(
		        QSharedPointer requestCaller,
		        const QString& methodName,
		        const QList& paramValues,
		        const QList& paramTypes)
		{
			Q_UNUSED(paramValues);//if all methods of the interface are empty, the paramValues would not be used and give a warning.
			Q_UNUSED(paramTypes);//if all methods of the interface are empty, the paramTypes would not be used and give a warning.
			// cast generic RequestCaller to «interfaceName»Requestcaller
			QSharedPointer<«interfaceName»RequestCaller> «serviceInterface.requestCaller» =
					requestCaller.dynamicCast<«interfaceName»RequestCaller>();
			
			joynr::RequestStatus status;
			// execute operation
			// TODO need to put the status code into the reply
			«val attributes = getAttributes(serviceInterface)»
			«val methods = getMethods(serviceInterface)»
			«IF attributes.size>0»
				«FOR attribute: attributes SEPARATOR "\n} else"»
					«val attributeName = attribute.joynrName»
					if (methodName == "get«attributeName.toFirstUpper»"){
						«getMappedDatatypeOrList(attribute)» returnValue;
						«serviceInterface.requestCaller»->get«attributeName.toFirstUpper»(status, returnValue);
						// convert typed return value into variant
						«IF isArray(attribute)»
							return joynr::Util::convertListToVariantList(returnValue);
						«ELSE»
							return QVariant::fromValue(returnValue);
						«ENDIF»
					} else if (methodName == "set«attributeName.toFirstUpper»" && paramTypes.size() == 1){
						QVariant «attributeName»QVar = paramValues.at(0);
						«IF isEnum(attribute.type)»
							«getMappedDatatypeOrList(attribute)» typedInput«attributeName.toFirstUpper» = joynr::Util::convertVariantToEnum<«getEnumContainer(attribute.type)»>(«attributeName»QVar);
						«ELSEIF isEnum(attribute.type) && isArray(attribute)»
							«getMappedDatatypeOrList(attribute)» typedInput«attributeName.toFirstUpper» =
								joynr::Util::convertVariantListToEnumList<«getEnumContainer(attribute.type)»>(«attributeName»QVar.toList());
						«ELSEIF isArray(attribute)»
							assert(«attributeName»QVar.canConvert >());
							QList paramQList = «attributeName»QVar.value >();
							«getMappedDatatypeOrList(attribute)» typedInput«attributeName.toFirstUpper» = joynr::Util::convertVariantListToList<«getMappedDatatype(attribute)»>(paramQList);
						«ELSE»
							assert(«attributeName»QVar.canConvert<«getMappedDatatypeOrList(attribute)»>());
							«getMappedDatatypeOrList(attribute)» typedInput«attributeName.toFirstUpper» = «attributeName»QVar.value<«getMappedDatatypeOrList(attribute)»>();
						«ENDIF»
						«serviceInterface.requestCaller»->set«attributeName.toFirstUpper»(status, typedInput«attributeName.toFirstUpper»);
						QVariant returnValue("void");
						return returnValue;

				«ENDFOR»
				}«IF methods.size>0» else«ENDIF»
			«ENDIF»
			«IF methods.size>0»
				«FOR method: getMethods(serviceInterface) SEPARATOR "\n} else"»
					«val outputParameterType = getMappedOutputParameter(method).head»
					«val inputParameterList = getCommaSeperatedTypedParameterList(method)»
					  
					«val methodName = method.joynrName»
					«val inputParams = getInputParameters(method)»
					«var iterator = -1»
					if(methodName == "«methodName»" && paramTypes.size() == «inputParams.size»
						«FOR input : inputParams»
						&& paramTypes.at(«iterator=iterator+1») == "«getJoynrTypeName(input)»"
						«ENDFOR»
					) {
						«IF outputParameterType != "void" && inputParameterList == ""»
							«getMappedOutputParameter(method).head» typedReturnValue;
							«serviceInterface.requestCaller»->«methodName»(status, typedReturnValue);
							«IF isArray(getOutputParameters(method).head)»
								QList returnValue = joynr::Util::convertListToVariantList<«getMappedDatatype( getOutputParameters(method).head)»>(typedReturnValue);
								return returnValue;
							«ELSE»
								return QVariant::fromValue(typedReturnValue);
							«ENDIF»
							
						«ELSE»
							«var iterator2 = -1»
							«FOR input : inputParams»
								«val inputName = input.joynrName»
								QVariant «inputName»QVar = paramValues.at(«iterator2=iterator2+1»);
								«IF isEnum(input.type) && isArray(input)»
									//isEnumArray
									«getMappedDatatypeOrList(input)» typedInput«inputName.toFirstUpper» = 
										joynr::Util::convertVariantListToEnumList<«getEnumContainer(input.type)»> («inputName»QVar.toList());
								«ELSEIF isEnum(input.type)»
									//isEnum
									«getMappedDatatypeOrList(input)» typedInput«inputName.toFirstUpper» = joynr::Util::convertVariantToEnum<«getEnumContainer(input.type)»>(«inputName»QVar);
								«ELSEIF isArray(input)»
									//isArray
									assert(«inputName»QVar.canConvert >());
									QList «inputName»QVarList = «inputName»QVar.value >();
									QList<«getMappedDatatype(input)»> typedInput«inputName.toFirstUpper» = joynr::Util::convertVariantListToList<«getMappedDatatype(input)»>(«inputName»QVarList);
								«ELSE»
									//«getMappedDatatypeOrList(input)»
									assert(«inputName»QVar.canConvert<«getMappedDatatypeOrList(input)»>());
									«getMappedDatatypeOrList(input)» typedInput«inputName.toFirstUpper» = «inputName»QVar.value<«getMappedDatatypeOrList(input)»>();
								«ENDIF»
							«ENDFOR»
							«IF outputParameterType != "void"»
								«getMappedOutputParameter(method).head» typedReturnValue;
								«serviceInterface.requestCaller»->«methodName»(
									status, 
									typedReturnValue«IF inputParams.size>0»,«ENDIF» 
							«ELSE»
								«serviceInterface.requestCaller»->«methodName»(
									status«IF inputParams.size>0»,«ENDIF» 
							«ENDIF»		
								«FOR input : inputParams SEPARATOR ','»
									typedInput«input.joynrName.toFirstUpper»
								«ENDFOR» 
							);

							«IF outputParameterType == "void"»
								QVariant returnValue("void");
								return returnValue;
							«ELSEIF isArray(getOutputParameters(method).head) && isEnum(getOutputParameters(method).head.type)»
								QList returnValue = joynr::Util::convertListToVariantList<«getMappedDatatype( getOutputParameters(method).head)»>(typedReturnValue);
								return returnValue;
							«ELSEIF isArray(getOutputParameters(method).head)»
								QList returnValue = joynr::Util::convertListToVariantList<«getMappedDatatype( getOutputParameters(method).head)»>(typedReturnValue);
								return returnValue;
							«ELSEIF isEnum(getOutputParameters(method).head.type)»
								return QVariant::fromValue(typedReturnValue);
							«ELSE»
								return QVariant::fromValue(typedReturnValue);
							«ENDIF»		
						«ENDIF»
				«ENDFOR»
				}
			«ENDIF»
			LOG_FATAL(logger, "unknown method name for interface «interfaceName»: " + methodName);
			assert(false);
			return QVariant();
		}
		
		«getNamespaceEnder(serviceInterface)» 
		'''
	}
	
	def getRequestCaller(FInterface serviceInterface){
	    serviceInterface.joynrName.toFirstLower+"RequestCaller"
	}
	
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy