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

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

package io.joynr.generator.cpp.provider;

import com.google.common.base.Objects;
import com.google.inject.Inject;
import io.joynr.generator.cpp.util.JoynrCppGeneratorExtensions;
import io.joynr.generator.cpp.util.TemplateBase;
import java.util.HashSet;
import org.eclipse.emf.common.util.EList;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.xbase.lib.Extension;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.StringExtensions;
import org.franca.core.franca.FArgument;
import org.franca.core.franca.FAttribute;
import org.franca.core.franca.FInterface;
import org.franca.core.franca.FMethod;
import org.franca.core.franca.FType;
import org.franca.core.franca.FTypeRef;

@SuppressWarnings("all")
public class InterfaceRequestInterpreterCppTemplate {
  @Inject
  @Extension
  private TemplateBase _templateBase;
  
  @Inject
  @Extension
  private JoynrCppGeneratorExtensions _joynrCppGeneratorExtensions;
  
  public CharSequence generate(final FInterface serviceInterface) {
    CharSequence _xblockexpression = null;
    {
      final String interfaceName = this._joynrCppGeneratorExtensions.joynrName(serviceInterface);
      StringConcatenation _builder = new StringConcatenation();
      CharSequence _warning = this._templateBase.warning();
      _builder.append(_warning, "");
      _builder.newLineIfNotEmpty();
      _builder.newLine();
      _builder.append("#include \"");
      String _packagePathWithJoynrPrefix = this._joynrCppGeneratorExtensions.getPackagePathWithJoynrPrefix(serviceInterface, "/");
      _builder.append(_packagePathWithJoynrPrefix, "");
      _builder.append("/");
      _builder.append(interfaceName, "");
      _builder.append("RequestInterpreter.h\"");
      _builder.newLineIfNotEmpty();
      _builder.newLine();
      _builder.append("#include \"joynr/Request.h\"");
      _builder.newLine();
      _builder.append("#include \"");
      String _packagePathWithJoynrPrefix_1 = this._joynrCppGeneratorExtensions.getPackagePathWithJoynrPrefix(serviceInterface, "/");
      _builder.append(_packagePathWithJoynrPrefix_1, "");
      _builder.append("/");
      _builder.append(interfaceName, "");
      _builder.append("RequestCaller.h\"");
      _builder.newLineIfNotEmpty();
      _builder.append("#include \"joynr/DeclareMetatypeUtil.h\"");
      _builder.newLine();
      _builder.append("#include \"joynr/Util.h\"");
      _builder.newLine();
      _builder.append("#include \"joynr/RequestStatus.h\"");
      _builder.newLine();
      _builder.append("#include ");
      _builder.newLine();
      _builder.newLine();
      {
        Iterable _requiredIncludesFor = this._joynrCppGeneratorExtensions.getRequiredIncludesFor(serviceInterface);
        for(final String parameterType : _requiredIncludesFor) {
          _builder.append("#include \"");
          _builder.append(parameterType, "");
          _builder.append("\"");
          _builder.newLineIfNotEmpty();
        }
      }
      _builder.newLine();
      String _namespaceStarter = this._joynrCppGeneratorExtensions.getNamespaceStarter(serviceInterface);
      _builder.append(_namespaceStarter, "");
      _builder.append(" ");
      _builder.newLineIfNotEmpty();
      _builder.newLine();
      _builder.append("joynr::joynr_logging::Logger* ");
      _builder.append(interfaceName, "");
      _builder.append("RequestInterpreter::logger = joynr::joynr_logging::Logging::getInstance()->getLogger(\"SDMO\", \"");
      _builder.append(interfaceName, "");
      _builder.append("JsonRequestInterpreter\");");
      _builder.newLineIfNotEmpty();
      _builder.newLine();
      _builder.append(interfaceName, "");
      _builder.append("RequestInterpreter::");
      _builder.append(interfaceName, "");
      _builder.append("RequestInterpreter()");
      _builder.newLineIfNotEmpty();
      _builder.append("{");
      _builder.newLine();
      {
        HashSet _allComplexAndEnumTypes = this._joynrCppGeneratorExtensions.getAllComplexAndEnumTypes(serviceInterface);
        for(final Object datatype : _allComplexAndEnumTypes) {
          {
            if ((datatype instanceof FType)) {
              _builder.append("\t");
              _builder.append("qRegisterMetaType<");
              String _mappedDatatype = this._joynrCppGeneratorExtensions.getMappedDatatype(((FType) datatype));
              _builder.append(_mappedDatatype, "	");
              _builder.append(">(\"");
              String _mappedDatatype_1 = this._joynrCppGeneratorExtensions.getMappedDatatype(((FType) datatype));
              _builder.append(_mappedDatatype_1, "	");
              _builder.append("\");");
              _builder.newLineIfNotEmpty();
            }
          }
        }
      }
      _builder.append("}");
      _builder.newLine();
      _builder.newLine();
      _builder.append("QVariant ");
      _builder.append(interfaceName, "");
      _builder.append("RequestInterpreter::execute(");
      _builder.newLineIfNotEmpty();
      _builder.append("        ");
      _builder.append("QSharedPointer requestCaller,");
      _builder.newLine();
      _builder.append("        ");
      _builder.append("const QString& methodName,");
      _builder.newLine();
      _builder.append("        ");
      _builder.append("const QList& paramValues,");
      _builder.newLine();
      _builder.append("        ");
      _builder.append("const QList& paramTypes)");
      _builder.newLine();
      _builder.append("{");
      _builder.newLine();
      _builder.append("\t");
      _builder.append("Q_UNUSED(paramValues);//if all methods of the interface are empty, the paramValues would not be used and give a warning.");
      _builder.newLine();
      _builder.append("\t");
      _builder.append("Q_UNUSED(paramTypes);//if all methods of the interface are empty, the paramTypes would not be used and give a warning.");
      _builder.newLine();
      _builder.append("\t");
      _builder.append("// cast generic RequestCaller to ");
      _builder.append(interfaceName, "	");
      _builder.append("Requestcaller");
      _builder.newLineIfNotEmpty();
      _builder.append("\t");
      _builder.append("QSharedPointer<");
      _builder.append(interfaceName, "	");
      _builder.append("RequestCaller> ");
      String _requestCaller = this.getRequestCaller(serviceInterface);
      _builder.append(_requestCaller, "	");
      _builder.append(" =");
      _builder.newLineIfNotEmpty();
      _builder.append("\t\t\t");
      _builder.append("requestCaller.dynamicCast<");
      _builder.append(interfaceName, "			");
      _builder.append("RequestCaller>();");
      _builder.newLineIfNotEmpty();
      _builder.append("\t");
      _builder.newLine();
      _builder.append("\t");
      _builder.append("joynr::RequestStatus status;");
      _builder.newLine();
      _builder.append("\t");
      _builder.append("// execute operation");
      _builder.newLine();
      _builder.append("\t");
      _builder.append("// TODO need to put the status code into the reply");
      _builder.newLine();
      _builder.append("\t");
      final EList attributes = this._joynrCppGeneratorExtensions.getAttributes(serviceInterface);
      _builder.newLineIfNotEmpty();
      _builder.append("\t");
      final EList methods = this._joynrCppGeneratorExtensions.getMethods(serviceInterface);
      _builder.newLineIfNotEmpty();
      {
        int _size = attributes.size();
        boolean _greaterThan = (_size > 0);
        if (_greaterThan) {
          {
            boolean _hasElements = false;
            for(final FAttribute attribute : attributes) {
              if (!_hasElements) {
                _hasElements = true;
              } else {
                _builder.appendImmediate("\n} else", "	");
              }
              _builder.append("\t");
              final String attributeName = this._joynrCppGeneratorExtensions.joynrName(attribute);
              _builder.newLineIfNotEmpty();
              _builder.append("\t");
              _builder.append("if (methodName == \"get");
              String _firstUpper = StringExtensions.toFirstUpper(attributeName);
              _builder.append(_firstUpper, "	");
              _builder.append("\"){");
              _builder.newLineIfNotEmpty();
              _builder.append("\t");
              _builder.append("\t");
              String _mappedDatatypeOrList = this._joynrCppGeneratorExtensions.getMappedDatatypeOrList(attribute);
              _builder.append(_mappedDatatypeOrList, "		");
              _builder.append(" returnValue;");
              _builder.newLineIfNotEmpty();
              _builder.append("\t");
              _builder.append("\t");
              String _requestCaller_1 = this.getRequestCaller(serviceInterface);
              _builder.append(_requestCaller_1, "		");
              _builder.append("->get");
              String _firstUpper_1 = StringExtensions.toFirstUpper(attributeName);
              _builder.append(_firstUpper_1, "		");
              _builder.append("(status, returnValue);");
              _builder.newLineIfNotEmpty();
              _builder.append("\t");
              _builder.append("\t");
              _builder.append("// convert typed return value into variant");
              _builder.newLine();
              {
                boolean _isArray = this._joynrCppGeneratorExtensions.isArray(attribute);
                if (_isArray) {
                  _builder.append("\t");
                  _builder.append("\t");
                  _builder.append("return joynr::Util::convertListToVariantList(returnValue);");
                  _builder.newLine();
                } else {
                  _builder.append("\t");
                  _builder.append("\t");
                  _builder.append("return QVariant::fromValue(returnValue);");
                  _builder.newLine();
                }
              }
              _builder.append("\t");
              _builder.append("} else if (methodName == \"set");
              String _firstUpper_2 = StringExtensions.toFirstUpper(attributeName);
              _builder.append(_firstUpper_2, "	");
              _builder.append("\" && paramTypes.size() == 1){");
              _builder.newLineIfNotEmpty();
              _builder.append("\t");
              _builder.append("\t");
              _builder.append("QVariant ");
              _builder.append(attributeName, "		");
              _builder.append("QVar = paramValues.at(0);");
              _builder.newLineIfNotEmpty();
              {
                FTypeRef _type = attribute.getType();
                boolean _isEnum = this._joynrCppGeneratorExtensions.isEnum(_type);
                if (_isEnum) {
                  _builder.append("\t");
                  _builder.append("\t");
                  String _mappedDatatypeOrList_1 = this._joynrCppGeneratorExtensions.getMappedDatatypeOrList(attribute);
                  _builder.append(_mappedDatatypeOrList_1, "		");
                  _builder.append(" typedInput");
                  String _firstUpper_3 = StringExtensions.toFirstUpper(attributeName);
                  _builder.append(_firstUpper_3, "		");
                  _builder.append(" = joynr::Util::convertVariantToEnum<");
                  FTypeRef _type_1 = attribute.getType();
                  String _enumContainer = this._joynrCppGeneratorExtensions.getEnumContainer(_type_1);
                  _builder.append(_enumContainer, "		");
                  _builder.append(">(");
                  _builder.append(attributeName, "		");
                  _builder.append("QVar);");
                  _builder.newLineIfNotEmpty();
                } else {
                  boolean _and = false;
                  FTypeRef _type_2 = attribute.getType();
                  boolean _isEnum_1 = this._joynrCppGeneratorExtensions.isEnum(_type_2);
                  if (!_isEnum_1) {
                    _and = false;
                  } else {
                    boolean _isArray_1 = this._joynrCppGeneratorExtensions.isArray(attribute);
                    _and = (_isEnum_1 && _isArray_1);
                  }
                  if (_and) {
                    _builder.append("\t");
                    _builder.append("\t");
                    String _mappedDatatypeOrList_2 = this._joynrCppGeneratorExtensions.getMappedDatatypeOrList(attribute);
                    _builder.append(_mappedDatatypeOrList_2, "		");
                    _builder.append(" typedInput");
                    String _firstUpper_4 = StringExtensions.toFirstUpper(attributeName);
                    _builder.append(_firstUpper_4, "		");
                    _builder.append(" =");
                    _builder.newLineIfNotEmpty();
                    _builder.append("\t");
                    _builder.append("\t");
                    _builder.append("\t");
                    _builder.append("joynr::Util::convertVariantListToEnumList<");
                    FTypeRef _type_3 = attribute.getType();
                    String _enumContainer_1 = this._joynrCppGeneratorExtensions.getEnumContainer(_type_3);
                    _builder.append(_enumContainer_1, "			");
                    _builder.append(">(");
                    _builder.append(attributeName, "			");
                    _builder.append("QVar.toList());");
                    _builder.newLineIfNotEmpty();
                  } else {
                    boolean _isArray_2 = this._joynrCppGeneratorExtensions.isArray(attribute);
                    if (_isArray_2) {
                      _builder.append("\t");
                      _builder.append("\t");
                      _builder.append("assert(");
                      _builder.append(attributeName, "		");
                      _builder.append("QVar.canConvert >());");
                      _builder.newLineIfNotEmpty();
                      _builder.append("\t");
                      _builder.append("\t");
                      _builder.append("QList paramQList = ");
                      _builder.append(attributeName, "		");
                      _builder.append("QVar.value >();");
                      _builder.newLineIfNotEmpty();
                      _builder.append("\t");
                      _builder.append("\t");
                      String _mappedDatatypeOrList_3 = this._joynrCppGeneratorExtensions.getMappedDatatypeOrList(attribute);
                      _builder.append(_mappedDatatypeOrList_3, "		");
                      _builder.append(" typedInput");
                      String _firstUpper_5 = StringExtensions.toFirstUpper(attributeName);
                      _builder.append(_firstUpper_5, "		");
                      _builder.append(" = joynr::Util::convertVariantListToList<");
                      String _mappedDatatype_2 = this._joynrCppGeneratorExtensions.getMappedDatatype(attribute);
                      _builder.append(_mappedDatatype_2, "		");
                      _builder.append(">(paramQList);");
                      _builder.newLineIfNotEmpty();
                    } else {
                      _builder.append("\t");
                      _builder.append("\t");
                      _builder.append("assert(");
                      _builder.append(attributeName, "		");
                      _builder.append("QVar.canConvert<");
                      String _mappedDatatypeOrList_4 = this._joynrCppGeneratorExtensions.getMappedDatatypeOrList(attribute);
                      _builder.append(_mappedDatatypeOrList_4, "		");
                      _builder.append(">());");
                      _builder.newLineIfNotEmpty();
                      _builder.append("\t");
                      _builder.append("\t");
                      String _mappedDatatypeOrList_5 = this._joynrCppGeneratorExtensions.getMappedDatatypeOrList(attribute);
                      _builder.append(_mappedDatatypeOrList_5, "		");
                      _builder.append(" typedInput");
                      String _firstUpper_6 = StringExtensions.toFirstUpper(attributeName);
                      _builder.append(_firstUpper_6, "		");
                      _builder.append(" = ");
                      _builder.append(attributeName, "		");
                      _builder.append("QVar.value<");
                      String _mappedDatatypeOrList_6 = this._joynrCppGeneratorExtensions.getMappedDatatypeOrList(attribute);
                      _builder.append(_mappedDatatypeOrList_6, "		");
                      _builder.append(">();");
                      _builder.newLineIfNotEmpty();
                    }
                  }
                }
              }
              _builder.append("\t");
              _builder.append("\t");
              String _requestCaller_2 = this.getRequestCaller(serviceInterface);
              _builder.append(_requestCaller_2, "		");
              _builder.append("->set");
              String _firstUpper_7 = StringExtensions.toFirstUpper(attributeName);
              _builder.append(_firstUpper_7, "		");
              _builder.append("(status, typedInput");
              String _firstUpper_8 = StringExtensions.toFirstUpper(attributeName);
              _builder.append(_firstUpper_8, "		");
              _builder.append(");");
              _builder.newLineIfNotEmpty();
              _builder.append("\t");
              _builder.append("\t");
              _builder.append("QVariant returnValue(\"void\");");
              _builder.newLine();
              _builder.append("\t");
              _builder.append("\t");
              _builder.append("return returnValue;");
              _builder.newLine();
              _builder.newLine();
            }
          }
          _builder.append("\t");
          _builder.append("}");
          {
            int _size_1 = methods.size();
            boolean _greaterThan_1 = (_size_1 > 0);
            if (_greaterThan_1) {
              _builder.append(" else");
            }
          }
          _builder.newLineIfNotEmpty();
        }
      }
      {
        int _size_2 = methods.size();
        boolean _greaterThan_2 = (_size_2 > 0);
        if (_greaterThan_2) {
          {
            EList _methods = this._joynrCppGeneratorExtensions.getMethods(serviceInterface);
            boolean _hasElements_1 = false;
            for(final FMethod method : _methods) {
              if (!_hasElements_1) {
                _hasElements_1 = true;
              } else {
                _builder.appendImmediate("\n} else", "	");
              }
              _builder.append("\t");
              Iterable _mappedOutputParameter = this._joynrCppGeneratorExtensions.getMappedOutputParameter(method);
              final String outputParameterType = IterableExtensions.head(_mappedOutputParameter);
              _builder.newLineIfNotEmpty();
              _builder.append("\t");
              final String inputParameterList = this._joynrCppGeneratorExtensions.getCommaSeperatedTypedParameterList(method);
              _builder.newLineIfNotEmpty();
              _builder.append("\t");
              _builder.append("  ");
              _builder.newLine();
              _builder.append("\t");
              final String methodName = this._joynrCppGeneratorExtensions.joynrName(method);
              _builder.newLineIfNotEmpty();
              _builder.append("\t");
              final Iterable inputParams = this._joynrCppGeneratorExtensions.getInputParameters(method);
              _builder.newLineIfNotEmpty();
              _builder.append("\t");
              int iterator = (-1);
              _builder.newLineIfNotEmpty();
              _builder.append("\t");
              _builder.append("if(methodName == \"");
              _builder.append(methodName, "	");
              _builder.append("\" && paramTypes.size() == ");
              int _size_3 = IterableExtensions.size(inputParams);
              _builder.append(_size_3, "	");
              _builder.newLineIfNotEmpty();
              {
                for(final FArgument input : inputParams) {
                  _builder.append("\t");
                  _builder.append("\t");
                  _builder.append("&& paramTypes.at(");
                  int _plus = (iterator + 1);
                  int _iterator = iterator = _plus;
                  _builder.append(_iterator, "		");
                  _builder.append(") == \"");
                  String _joynrTypeName = this._joynrCppGeneratorExtensions.getJoynrTypeName(input);
                  _builder.append(_joynrTypeName, "		");
                  _builder.append("\"");
                  _builder.newLineIfNotEmpty();
                }
              }
              _builder.append("\t");
              _builder.append(") {");
              _builder.newLine();
              {
                boolean _and_1 = false;
                boolean _notEquals = (!Objects.equal(outputParameterType, "void"));
                if (!_notEquals) {
                  _and_1 = false;
                } else {
                  boolean _equals = Objects.equal(inputParameterList, "");
                  _and_1 = (_notEquals && _equals);
                }
                if (_and_1) {
                  _builder.append("\t");
                  _builder.append("\t");
                  Iterable _mappedOutputParameter_1 = this._joynrCppGeneratorExtensions.getMappedOutputParameter(method);
                  String _head = IterableExtensions.head(_mappedOutputParameter_1);
                  _builder.append(_head, "		");
                  _builder.append(" typedReturnValue;");
                  _builder.newLineIfNotEmpty();
                  _builder.append("\t");
                  _builder.append("\t");
                  String _requestCaller_3 = this.getRequestCaller(serviceInterface);
                  _builder.append(_requestCaller_3, "		");
                  _builder.append("->");
                  _builder.append(methodName, "		");
                  _builder.append("(status, typedReturnValue);");
                  _builder.newLineIfNotEmpty();
                  {
                    Iterable _outputParameters = this._joynrCppGeneratorExtensions.getOutputParameters(method);
                    FArgument _head_1 = IterableExtensions.head(_outputParameters);
                    boolean _isArray_3 = this._joynrCppGeneratorExtensions.isArray(_head_1);
                    if (_isArray_3) {
                      _builder.append("\t");
                      _builder.append("\t");
                      _builder.append("QList returnValue = joynr::Util::convertListToVariantList<");
                      Iterable _outputParameters_1 = this._joynrCppGeneratorExtensions.getOutputParameters(method);
                      FArgument _head_2 = IterableExtensions.head(_outputParameters_1);
                      String _mappedDatatype_3 = this._joynrCppGeneratorExtensions.getMappedDatatype(_head_2);
                      _builder.append(_mappedDatatype_3, "		");
                      _builder.append(">(typedReturnValue);");
                      _builder.newLineIfNotEmpty();
                      _builder.append("\t");
                      _builder.append("\t");
                      _builder.append("return returnValue;");
                      _builder.newLine();
                    } else {
                      _builder.append("\t");
                      _builder.append("\t");
                      _builder.append("return QVariant::fromValue(typedReturnValue);");
                      _builder.newLine();
                    }
                  }
                  _builder.append("\t");
                  _builder.append("\t");
                  _builder.newLine();
                } else {
                  _builder.append("\t");
                  _builder.append("\t");
                  int iterator2 = (-1);
                  _builder.newLineIfNotEmpty();
                  {
                    for(final FArgument input_1 : inputParams) {
                      _builder.append("\t");
                      _builder.append("\t");
                      final String inputName = this._joynrCppGeneratorExtensions.joynrName(input_1);
                      _builder.newLineIfNotEmpty();
                      _builder.append("\t");
                      _builder.append("\t");
                      _builder.append("QVariant ");
                      _builder.append(inputName, "		");
                      _builder.append("QVar = paramValues.at(");
                      int _plus_1 = (iterator2 + 1);
                      int _iterator2 = iterator2 = _plus_1;
                      _builder.append(_iterator2, "		");
                      _builder.append(");");
                      _builder.newLineIfNotEmpty();
                      {
                        boolean _and_2 = false;
                        FTypeRef _type_4 = input_1.getType();
                        boolean _isEnum_2 = this._joynrCppGeneratorExtensions.isEnum(_type_4);
                        if (!_isEnum_2) {
                          _and_2 = false;
                        } else {
                          boolean _isArray_4 = this._joynrCppGeneratorExtensions.isArray(input_1);
                          _and_2 = (_isEnum_2 && _isArray_4);
                        }
                        if (_and_2) {
                          _builder.append("\t");
                          _builder.append("\t");
                          _builder.append("//isEnumArray");
                          _builder.newLine();
                          _builder.append("\t");
                          _builder.append("\t");
                          String _mappedDatatypeOrList_7 = this._joynrCppGeneratorExtensions.getMappedDatatypeOrList(input_1);
                          _builder.append(_mappedDatatypeOrList_7, "		");
                          _builder.append(" typedInput");
                          String _firstUpper_9 = StringExtensions.toFirstUpper(inputName);
                          _builder.append(_firstUpper_9, "		");
                          _builder.append(" = ");
                          _builder.newLineIfNotEmpty();
                          _builder.append("\t");
                          _builder.append("\t");
                          _builder.append("\t");
                          _builder.append("joynr::Util::convertVariantListToEnumList<");
                          FTypeRef _type_5 = input_1.getType();
                          String _enumContainer_2 = this._joynrCppGeneratorExtensions.getEnumContainer(_type_5);
                          _builder.append(_enumContainer_2, "			");
                          _builder.append("> (");
                          _builder.append(inputName, "			");
                          _builder.append("QVar.toList());");
                          _builder.newLineIfNotEmpty();
                        } else {
                          FTypeRef _type_6 = input_1.getType();
                          boolean _isEnum_3 = this._joynrCppGeneratorExtensions.isEnum(_type_6);
                          if (_isEnum_3) {
                            _builder.append("\t");
                            _builder.append("\t");
                            _builder.append("//isEnum");
                            _builder.newLine();
                            _builder.append("\t");
                            _builder.append("\t");
                            String _mappedDatatypeOrList_8 = this._joynrCppGeneratorExtensions.getMappedDatatypeOrList(input_1);
                            _builder.append(_mappedDatatypeOrList_8, "		");
                            _builder.append(" typedInput");
                            String _firstUpper_10 = StringExtensions.toFirstUpper(inputName);
                            _builder.append(_firstUpper_10, "		");
                            _builder.append(" = joynr::Util::convertVariantToEnum<");
                            FTypeRef _type_7 = input_1.getType();
                            String _enumContainer_3 = this._joynrCppGeneratorExtensions.getEnumContainer(_type_7);
                            _builder.append(_enumContainer_3, "		");
                            _builder.append(">(");
                            _builder.append(inputName, "		");
                            _builder.append("QVar);");
                            _builder.newLineIfNotEmpty();
                          } else {
                            boolean _isArray_5 = this._joynrCppGeneratorExtensions.isArray(input_1);
                            if (_isArray_5) {
                              _builder.append("\t");
                              _builder.append("\t");
                              _builder.append("//isArray");
                              _builder.newLine();
                              _builder.append("\t");
                              _builder.append("\t");
                              _builder.append("assert(");
                              _builder.append(inputName, "		");
                              _builder.append("QVar.canConvert >());");
                              _builder.newLineIfNotEmpty();
                              _builder.append("\t");
                              _builder.append("\t");
                              _builder.append("QList ");
                              _builder.append(inputName, "		");
                              _builder.append("QVarList = ");
                              _builder.append(inputName, "		");
                              _builder.append("QVar.value >();");
                              _builder.newLineIfNotEmpty();
                              _builder.append("\t");
                              _builder.append("\t");
                              _builder.append("QList<");
                              String _mappedDatatype_4 = this._joynrCppGeneratorExtensions.getMappedDatatype(input_1);
                              _builder.append(_mappedDatatype_4, "		");
                              _builder.append("> typedInput");
                              String _firstUpper_11 = StringExtensions.toFirstUpper(inputName);
                              _builder.append(_firstUpper_11, "		");
                              _builder.append(" = joynr::Util::convertVariantListToList<");
                              String _mappedDatatype_5 = this._joynrCppGeneratorExtensions.getMappedDatatype(input_1);
                              _builder.append(_mappedDatatype_5, "		");
                              _builder.append(">(");
                              _builder.append(inputName, "		");
                              _builder.append("QVarList);");
                              _builder.newLineIfNotEmpty();
                            } else {
                              _builder.append("\t");
                              _builder.append("\t");
                              _builder.append("//");
                              String _mappedDatatypeOrList_9 = this._joynrCppGeneratorExtensions.getMappedDatatypeOrList(input_1);
                              _builder.append(_mappedDatatypeOrList_9, "		");
                              _builder.newLineIfNotEmpty();
                              _builder.append("\t");
                              _builder.append("\t");
                              _builder.append("assert(");
                              _builder.append(inputName, "		");
                              _builder.append("QVar.canConvert<");
                              String _mappedDatatypeOrList_10 = this._joynrCppGeneratorExtensions.getMappedDatatypeOrList(input_1);
                              _builder.append(_mappedDatatypeOrList_10, "		");
                              _builder.append(">());");
                              _builder.newLineIfNotEmpty();
                              _builder.append("\t");
                              _builder.append("\t");
                              String _mappedDatatypeOrList_11 = this._joynrCppGeneratorExtensions.getMappedDatatypeOrList(input_1);
                              _builder.append(_mappedDatatypeOrList_11, "		");
                              _builder.append(" typedInput");
                              String _firstUpper_12 = StringExtensions.toFirstUpper(inputName);
                              _builder.append(_firstUpper_12, "		");
                              _builder.append(" = ");
                              _builder.append(inputName, "		");
                              _builder.append("QVar.value<");
                              String _mappedDatatypeOrList_12 = this._joynrCppGeneratorExtensions.getMappedDatatypeOrList(input_1);
                              _builder.append(_mappedDatatypeOrList_12, "		");
                              _builder.append(">();");
                              _builder.newLineIfNotEmpty();
                            }
                          }
                        }
                      }
                    }
                  }
                  {
                    boolean _notEquals_1 = (!Objects.equal(outputParameterType, "void"));
                    if (_notEquals_1) {
                      _builder.append("\t");
                      _builder.append("\t");
                      Iterable _mappedOutputParameter_2 = this._joynrCppGeneratorExtensions.getMappedOutputParameter(method);
                      String _head_3 = IterableExtensions.head(_mappedOutputParameter_2);
                      _builder.append(_head_3, "		");
                      _builder.append(" typedReturnValue;");
                      _builder.newLineIfNotEmpty();
                      _builder.append("\t");
                      _builder.append("\t");
                      String _requestCaller_4 = this.getRequestCaller(serviceInterface);
                      _builder.append(_requestCaller_4, "		");
                      _builder.append("->");
                      _builder.append(methodName, "		");
                      _builder.append("(");
                      _builder.newLineIfNotEmpty();
                      _builder.append("\t");
                      _builder.append("\t");
                      _builder.append("\t");
                      _builder.append("status, ");
                      _builder.newLine();
                      _builder.append("\t");
                      _builder.append("\t");
                      _builder.append("\t");
                      _builder.append("typedReturnValue");
                      {
                        int _size_4 = IterableExtensions.size(inputParams);
                        boolean _greaterThan_3 = (_size_4 > 0);
                        if (_greaterThan_3) {
                          _builder.append(",");
                        }
                      }
                      _builder.append(" ");
                      _builder.newLineIfNotEmpty();
                    } else {
                      _builder.append("\t");
                      _builder.append("\t");
                      String _requestCaller_5 = this.getRequestCaller(serviceInterface);
                      _builder.append(_requestCaller_5, "		");
                      _builder.append("->");
                      _builder.append(methodName, "		");
                      _builder.append("(");
                      _builder.newLineIfNotEmpty();
                      _builder.append("\t");
                      _builder.append("\t");
                      _builder.append("\t");
                      _builder.append("status");
                      {
                        int _size_5 = IterableExtensions.size(inputParams);
                        boolean _greaterThan_4 = (_size_5 > 0);
                        if (_greaterThan_4) {
                          _builder.append(",");
                        }
                      }
                      _builder.append(" ");
                      _builder.newLineIfNotEmpty();
                    }
                  }
                  {
                    boolean _hasElements_2 = false;
                    for(final FArgument input_2 : inputParams) {
                      if (!_hasElements_2) {
                        _hasElements_2 = true;
                      } else {
                        _builder.appendImmediate(",", "			");
                      }
                      _builder.append("\t");
                      _builder.append("\t");
                      _builder.append("\t");
                      _builder.append("typedInput");
                      String _joynrName = this._joynrCppGeneratorExtensions.joynrName(input_2);
                      String _firstUpper_13 = StringExtensions.toFirstUpper(_joynrName);
                      _builder.append(_firstUpper_13, "			");
                      _builder.newLineIfNotEmpty();
                    }
                  }
                  _builder.append("\t");
                  _builder.append("\t");
                  _builder.append(");");
                  _builder.newLine();
                  _builder.newLine();
                  {
                    boolean _equals_1 = Objects.equal(outputParameterType, "void");
                    if (_equals_1) {
                      _builder.append("\t");
                      _builder.append("\t");
                      _builder.append("QVariant returnValue(\"void\");");
                      _builder.newLine();
                      _builder.append("\t");
                      _builder.append("\t");
                      _builder.append("return returnValue;");
                      _builder.newLine();
                    } else {
                      boolean _and_3 = false;
                      Iterable _outputParameters_2 = this._joynrCppGeneratorExtensions.getOutputParameters(method);
                      FArgument _head_4 = IterableExtensions.head(_outputParameters_2);
                      boolean _isArray_6 = this._joynrCppGeneratorExtensions.isArray(_head_4);
                      if (!_isArray_6) {
                        _and_3 = false;
                      } else {
                        Iterable _outputParameters_3 = this._joynrCppGeneratorExtensions.getOutputParameters(method);
                        FArgument _head_5 = IterableExtensions.head(_outputParameters_3);
                        FTypeRef _type_8 = _head_5.getType();
                        boolean _isEnum_4 = this._joynrCppGeneratorExtensions.isEnum(_type_8);
                        _and_3 = (_isArray_6 && _isEnum_4);
                      }
                      if (_and_3) {
                        _builder.append("\t");
                        _builder.append("\t");
                        _builder.append("QList returnValue = joynr::Util::convertListToVariantList<");
                        Iterable _outputParameters_4 = this._joynrCppGeneratorExtensions.getOutputParameters(method);
                        FArgument _head_6 = IterableExtensions.head(_outputParameters_4);
                        String _mappedDatatype_6 = this._joynrCppGeneratorExtensions.getMappedDatatype(_head_6);
                        _builder.append(_mappedDatatype_6, "		");
                        _builder.append(">(typedReturnValue);");
                        _builder.newLineIfNotEmpty();
                        _builder.append("\t");
                        _builder.append("\t");
                        _builder.append("return returnValue;");
                        _builder.newLine();
                      } else {
                        Iterable _outputParameters_5 = this._joynrCppGeneratorExtensions.getOutputParameters(method);
                        FArgument _head_7 = IterableExtensions.head(_outputParameters_5);
                        boolean _isArray_7 = this._joynrCppGeneratorExtensions.isArray(_head_7);
                        if (_isArray_7) {
                          _builder.append("\t");
                          _builder.append("\t");
                          _builder.append("QList returnValue = joynr::Util::convertListToVariantList<");
                          Iterable _outputParameters_6 = this._joynrCppGeneratorExtensions.getOutputParameters(method);
                          FArgument _head_8 = IterableExtensions.head(_outputParameters_6);
                          String _mappedDatatype_7 = this._joynrCppGeneratorExtensions.getMappedDatatype(_head_8);
                          _builder.append(_mappedDatatype_7, "		");
                          _builder.append(">(typedReturnValue);");
                          _builder.newLineIfNotEmpty();
                          _builder.append("\t");
                          _builder.append("\t");
                          _builder.append("return returnValue;");
                          _builder.newLine();
                        } else {
                          Iterable _outputParameters_7 = this._joynrCppGeneratorExtensions.getOutputParameters(method);
                          FArgument _head_9 = IterableExtensions.head(_outputParameters_7);
                          FTypeRef _type_9 = _head_9.getType();
                          boolean _isEnum_5 = this._joynrCppGeneratorExtensions.isEnum(_type_9);
                          if (_isEnum_5) {
                            _builder.append("\t");
                            _builder.append("\t");
                            _builder.append("return QVariant::fromValue(typedReturnValue);");
                            _builder.newLine();
                          } else {
                            _builder.append("\t");
                            _builder.append("\t");
                            _builder.append("return QVariant::fromValue(typedReturnValue);");
                            _builder.newLine();
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
          _builder.append("\t");
          _builder.append("}");
          _builder.newLine();
        }
      }
      _builder.append("\t");
      _builder.append("LOG_FATAL(logger, \"unknown method name for interface ");
      _builder.append(interfaceName, "	");
      _builder.append(": \" + methodName);");
      _builder.newLineIfNotEmpty();
      _builder.append("\t");
      _builder.append("assert(false);");
      _builder.newLine();
      _builder.append("\t");
      _builder.append("return QVariant();");
      _builder.newLine();
      _builder.append("}");
      _builder.newLine();
      _builder.newLine();
      String _namespaceEnder = this._joynrCppGeneratorExtensions.getNamespaceEnder(serviceInterface);
      _builder.append(_namespaceEnder, "");
      _builder.append(" ");
      _builder.newLineIfNotEmpty();
      _xblockexpression = (_builder);
    }
    return _xblockexpression;
  }
  
  public String getRequestCaller(final FInterface serviceInterface) {
    String _joynrName = this._joynrCppGeneratorExtensions.joynrName(serviceInterface);
    String _firstLower = StringExtensions.toFirstLower(_joynrName);
    String _plus = (_firstLower + "RequestCaller");
    return _plus;
  }
}