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

io.joynr.generator.cpp.inprocess.InterfaceInProcessConnectorCPPTemplate.xtend Maven / Gradle / Ivy

package io.joynr.generator.cpp.inprocess
/*
 * !!!
 *
 * Copyright (C) 2011 - 2015 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 io.joynr.generator.cpp.util.CppStdTypeUtil
import io.joynr.generator.cpp.util.JoynrCppGeneratorExtensions
import io.joynr.generator.cpp.util.TemplateBase
import io.joynr.generator.util.InterfaceTemplate
import org.franca.core.franca.FInterface
import org.franca.core.franca.FType
import io.joynr.generator.cpp.util.QtTypeUtil

class InterfaceInProcessConnectorCPPTemplate implements InterfaceTemplate{

	@Inject
	private extension TemplateBase

	@Inject
	private extension CppStdTypeUtil cppStdTypeUtil

	@Inject
	private QtTypeUtil qtTypeUtil

	@Inject
	private extension JoynrCppGeneratorExtensions

	override  generate(FInterface serviceInterface)
'''
«var interfaceName = serviceInterface.joynrName»
«warning()»
#include 

#include "«getPackagePathWithJoynrPrefix(serviceInterface, "/")»/«interfaceName»InProcessConnector.h"
#include "«getPackagePathWithJoynrPrefix(serviceInterface, "/")»/«interfaceName»RequestCaller.h"
#include "joynr/DeclareMetatypeUtil.h"
«FOR datatype: getAllComplexAndEnumTypes(serviceInterface)»
«IF datatype instanceof FType»
	«IF isComplex(datatype)»
		#include "«getIncludeOf(datatype)»"
	«ENDIF»
«ENDIF»
«ENDFOR»

#include "joynr/InProcessAddress.h"
#include "joynr/ISubscriptionManager.h"
#include "joynr/PublicationManager.h"
#include "joynr/SubscriptionCallback.h"
#include "joynr/BroadcastSubscriptionRequest.h"
#include "joynr/Future.h"
#include "joynr/TypeUtil.h"
#include "joynr/RequestStatus.h"
#include "joynr/RequestStatusCode.h"

«getNamespaceStarter(serviceInterface)»

using namespace joynr::joynr_logging;
Logger* «interfaceName»InProcessConnector::logger = Logging::getInstance()->getLogger("MSG", "«interfaceName»InProcessConnector");

«interfaceName»InProcessConnector::«interfaceName»InProcessConnector(
			joynr::ISubscriptionManager* subscriptionManager,
			joynr::PublicationManager* publicationManager,
			joynr::InProcessPublicationSender* inProcessPublicationSender,
			const std::string& proxyParticipantId,
			const std::string& providerParticipantId,
			QSharedPointer address
) :
	proxyParticipantId(proxyParticipantId),
	providerParticipantId(providerParticipantId),
	address(address),
	subscriptionManager(subscriptionManager),
	publicationManager(publicationManager),
	inProcessPublicationSender(inProcessPublicationSender)
{
}

bool «interfaceName»InProcessConnector::usesClusterController() const{
	return false;
}

«FOR attribute : getAttributes(serviceInterface)»
	«val returnType = cppStdTypeUtil.getTypeName(attribute)»
	«val returnTypeQt = qtTypeUtil.getTypeName(attribute)»
	«val attributeName = attribute.joynrName»
	«val setAttributeName = "set" + attribute.joynrName.toFirstUpper»
	«IF attribute.readable»
		«val getAttributeName = "get" + attribute.joynrName.toFirstUpper»
		joynr::RequestStatus «interfaceName»InProcessConnector::«getAttributeName»(
					«returnType»& attributeValue
		) {
			assert(!address.isNull());
			QSharedPointer caller = address->getRequestCaller();
			assert(!caller.isNull());
			QSharedPointer<«interfaceName»RequestCaller> «serviceInterface.interfaceCaller» = caller.dynamicCast<«interfaceName»RequestCaller>();
			assert(!«serviceInterface.interfaceCaller».isNull());

			QSharedPointer > future(new joynr::Future<«returnType»>());

			std::function onSuccess =
					[future] (const «returnType»& «attributeName») {
						future->onSuccess(«attributeName»);
					};

			//see header for more information
			«serviceInterface.interfaceCaller»->«getAttributeName»(onSuccess);
			joynr::RequestStatus status(future->waitForFinished());
			if (status.successful()) {
				future->getValues(attributeValue);
			}
			return status;
		}

		std::shared_ptr> «interfaceName»InProcessConnector::«getAttributeName»Async(
				std::function onSuccess,
				std::function onError
		) {
			std::ignore = onError; // not used yet
			assert(!address.isNull());
			QSharedPointer caller = address->getRequestCaller();
			assert(!caller.isNull());
			QSharedPointer<«interfaceName»RequestCaller> «serviceInterface.interfaceCaller» = caller.dynamicCast<«interfaceName»RequestCaller>();
			assert(!«serviceInterface.interfaceCaller».isNull());

			std::shared_ptr > future(new joynr::Future<«returnType»>());

			std::function onSuccessWrapper =
					[future, onSuccess] (const «returnType»& «attributeName») {
						future->onSuccess(«attributeName»);
						if (onSuccess) {
							onSuccess(«attributeName»);
						}
					};

			//see header for more information
			«serviceInterface.interfaceCaller»->«getAttributeName»(onSuccessWrapper);
			return future;
		}

	«ENDIF»
	«IF attribute.writable»
		std::shared_ptr> «interfaceName»InProcessConnector::«setAttributeName»Async(
				«returnType» input,
				std::function onSuccess,
				std::function onError
		) {
			std::ignore = onError; // not used yet
			assert(!address.isNull());
			QSharedPointer caller = address->getRequestCaller();
			assert(!caller.isNull());
			QSharedPointer<«interfaceName»RequestCaller> «serviceInterface.interfaceCaller» = caller.dynamicCast<«interfaceName»RequestCaller>();
			assert(!«serviceInterface.interfaceCaller».isNull());

			std::shared_ptr> future(new joynr::Future());
			std::function onSuccessWrapper =
					[future, onSuccess] () {
						future->onSuccess();
						if (onSuccess) {
							onSuccess();
						}
					};

			//see header for more information
			LOG_ERROR(logger,"#### WARNING ##### «interfaceName»InProcessConnector::«setAttributeName»(Future) is synchronous.");
			«serviceInterface.interfaceCaller»->«setAttributeName»(input, onSuccessWrapper);
			return future;
		}

		joynr::RequestStatus «interfaceName»InProcessConnector::«setAttributeName»(
				const «returnType»& input
		) {
			assert(!address.isNull());
			QSharedPointer caller = address->getRequestCaller();
			assert(!caller.isNull());
			QSharedPointer<«interfaceName»RequestCaller> «serviceInterface.interfaceCaller» = caller.dynamicCast<«interfaceName»RequestCaller>();
			assert(!«serviceInterface.interfaceCaller».isNull());

			QSharedPointer> future(new joynr::Future());
			std::function onSuccess =
					[future] () {
						future->onSuccess();
					};

			//see header for more information
			«serviceInterface.interfaceCaller»->«setAttributeName»(input, onSuccess);
			return future->waitForFinished();
		}

	«ENDIF»
	«IF attribute.notifiable»
		std::string «interfaceName»InProcessConnector::subscribeTo«attributeName.toFirstUpper»(
				std::shared_ptr > subscriptionListener,
				const joynr::SubscriptionQos& subscriptionQos,
				std::string& subscriptionId)
		{
			joynr::SubscriptionRequest subscriptionRequest;
			subscriptionRequest.setSubscriptionId(QString::fromStdString(subscriptionId));
			return subscribeTo«attributeName.toFirstUpper»(subscriptionListener, subscriptionQos, subscriptionRequest);
		}

		std::string «interfaceName»InProcessConnector::subscribeTo«attributeName.toFirstUpper»(
				std::shared_ptr > subscriptionListener,
				const joynr::SubscriptionQos& subscriptionQos)
		{
			joynr::SubscriptionRequest subscriptionRequest;
			return subscribeTo«attributeName.toFirstUpper»(subscriptionListener, subscriptionQos, subscriptionRequest);
		}

		std::string «interfaceName»InProcessConnector::subscribeTo«attributeName.toFirstUpper»(
				std::shared_ptr > subscriptionListener,
				const joynr::SubscriptionQos& subscriptionQos,
				joynr::SubscriptionRequest& subscriptionRequest)
		{
			«IF isEnum(attribute.type)»
				Q_UNUSED(subscriptionListener);
				Q_UNUSED(subscriptionQos);
				// TODO support enum return values in C++ client
				LOG_FATAL(logger, "enum return values are currently not supported in C++ client (attribute name: «interfaceName».«attributeName»)");
				assert(false);
				// Visual C++ requires a return value
				return std::string();
			«ELSE»
				LOG_DEBUG(logger, "Subscribing to «attributeName».");
				assert(subscriptionManager != NULL);
				QString attributeName("«attributeName»");
				QSharedPointer> subscriptionCallback(
						«IF qtTypeUtil.needsDatatypeConversion(attribute)»
							new «attribute.joynrName.toFirstUpper»AttributeSubscriptionCallbackWrapper(
						«ELSE»
							new joynr::SubscriptionCallback<«returnTypeQt»>(
						«ENDIF»
								subscriptionListener
						)
				);
				subscriptionManager->registerSubscription(
						attributeName,
						subscriptionCallback,
						QSharedPointer(QtSubscriptionQos::createQt(subscriptionQos)),
						subscriptionRequest);
				LOG_DEBUG(logger, "Registered subscription: " + subscriptionRequest.toQString());
				assert(!address.isNull());
				QSharedPointer caller = address->getRequestCaller();
				assert(!caller.isNull());
				QSharedPointer<«interfaceName»RequestCaller> requestCaller = caller.dynamicCast<«interfaceName»RequestCaller>();
				std::string subscriptionId(subscriptionRequest.getSubscriptionId().toStdString());

				if(caller.isNull()) {
					assert(publicationManager != NULL);
					/**
					* Provider not registered yet
					* Dispatcher will call publicationManger->restore when a new provider is added to activate
					* subscriptions for that provider
					*/
					publicationManager->add(QString::fromStdString(proxyParticipantId), QString::fromStdString(providerParticipantId), subscriptionRequest);
				} else {
					publicationManager->add(QString::fromStdString(proxyParticipantId), QString::fromStdString(providerParticipantId), caller, subscriptionRequest, inProcessPublicationSender);
				}
				return subscriptionId;
			«ENDIF»
		}

		void «interfaceName»InProcessConnector::unsubscribeFrom«attributeName.toFirstUpper»(
				std::string& subscriptionId
		) {
			«IF isEnum(attribute.type)»
				Q_UNUSED(subscriptionId);
				// TODO support enum return values in C++ client
				LOG_FATAL(logger, "enum return values are currently not supported in C++ client (attribute name: «interfaceName».«attributeName»)");
				assert(false);
			«ELSE»
				QString subscriptionIdQT(QString::fromStdString(subscriptionId));
				LOG_DEBUG(logger, "Unsubscribing. Id=" +subscriptionIdQT);
				assert(publicationManager != NULL);
				LOG_DEBUG(logger, "Stopping publications by publication manager.");
				publicationManager->stopPublication(subscriptionIdQT);
				assert(subscriptionManager != NULL);
				LOG_DEBUG(logger, "Unregistering attribute subscription.");
				subscriptionManager->unregisterSubscription(subscriptionIdQT);
			«ENDIF»
		}

	«ENDIF»
«ENDFOR»

«FOR method: getMethods(serviceInterface)»
«var methodname = method.joynrName»
«var inputTypedParamList = cppStdTypeUtil.getCommaSeperatedTypedConstInputParameterList(method)»
«var outputParameters = cppStdTypeUtil.getCommaSeparatedOutputParameterTypes(method)»
«var inputParamList = cppStdTypeUtil.getCommaSeperatedUntypedInputParameterList(method)»
«var outputTypedConstParamList = cppStdTypeUtil.getCommaSeperatedTypedConstOutputParameterList(method)»
«var outputTypedParamList = cppStdTypeUtil.getCommaSeperatedTypedOutputParameterList(method)»
«var outputUntypedParamList = cppStdTypeUtil.getCommaSeperatedUntypedOutputParameterList(method)»

joynr::RequestStatus «interfaceName»InProcessConnector::«methodname»(
		«outputTypedParamList»«IF method.outputParameters.size > 0 && method.inputParameters.size > 0», «ENDIF»«inputTypedParamList»
) {
	assert(!address.isNull());
	QSharedPointer caller = address->getRequestCaller();
	assert(!caller.isNull());
	QSharedPointer<«interfaceName»RequestCaller> «serviceInterface.interfaceCaller» = caller.dynamicCast<«interfaceName»RequestCaller>();
	assert(!«serviceInterface.interfaceCaller».isNull());
	QSharedPointer > future(
			new joynr::Future<«outputParameters»>());

	std::function onSuccess =
			[future] («outputTypedConstParamList») {
				future->onSuccess(
						«outputUntypedParamList»
				);
			};

	«serviceInterface.interfaceCaller»->«methodname»(«IF !method.inputParameters.empty»«inputParamList», «ENDIF»onSuccess);
	«IF method.outputParameters.empty»
		return future->waitForFinished();
	«ELSE»
		joynr::RequestStatus status = future->waitForFinished();
		if (status.successful()) {
			future->getValues(«cppStdTypeUtil.getCommaSeperatedUntypedOutputParameterList(method)»);
		}
		return status;
	«ENDIF»
}

std::shared_ptr > «interfaceName»InProcessConnector::«methodname»Async(«cppStdTypeUtil.getCommaSeperatedTypedConstInputParameterList(method)»«IF !method.inputParameters.empty»,«ENDIF»
			std::function onSuccess,
			std::function onError)
{
	std::ignore = onError; // not used yet
	assert(!address.isNull());
	QSharedPointer caller = address->getRequestCaller();
	assert(!caller.isNull());
	QSharedPointer<«interfaceName»RequestCaller> «serviceInterface.interfaceCaller» = caller.dynamicCast<«interfaceName»RequestCaller>();
	assert(!«serviceInterface.interfaceCaller».isNull());
	std::shared_ptr > future(
			new joynr::Future<«outputParameters»>());

	std::function onSuccessWrapper =
			[future, onSuccess] («outputTypedConstParamList») {
				future->onSuccess(«outputUntypedParamList»);
				if (onSuccess)
				{
					onSuccess(«outputUntypedParamList»);
				}
			};
	«serviceInterface.interfaceCaller»->«methodname»(«IF !method.inputParameters.empty»«inputParamList», «ENDIF»onSuccessWrapper);
	return future;
}

«ENDFOR»

«FOR broadcast: serviceInterface.broadcasts»
	«val returnTypes = cppStdTypeUtil.getCommaSeparatedOutputParameterTypes(broadcast)»
	«val returnTypesQt = qtTypeUtil.getCommaSeparatedOutputParameterTypes(broadcast)»
	«val broadcastName = broadcast.joynrName»

	«IF isSelective(broadcast)»
		std::string «interfaceName»InProcessConnector::subscribeTo«broadcastName.toFirstUpper»Broadcast(
				const «interfaceName.toFirstUpper»«broadcastName.toFirstUpper»BroadcastFilterParameters& filterParameters,
				std::shared_ptr > subscriptionListener,
				const joynr::OnChangeSubscriptionQos& subscriptionQos
	«ELSE»
		std::string «interfaceName»InProcessConnector::subscribeTo«broadcastName.toFirstUpper»Broadcast(
				std::shared_ptr > subscriptionListener,
				const joynr::OnChangeSubscriptionQos& subscriptionQos
	«ENDIF»
	) {
		LOG_DEBUG(logger, "Subscribing to «broadcastName».");
		assert(subscriptionManager != NULL);
		QString broadcastName("«broadcastName»");
		joynr::BroadcastSubscriptionRequest subscriptionRequest;
		«IF isSelective(broadcast)»
			subscriptionRequest.setFilterParameters(QtBroadcastFilterParameters::createQt(filterParameters));
		«ENDIF»
		return subscribeTo«broadcastName.toFirstUpper»Broadcast(
					subscriptionListener,
					subscriptionQos,
					subscriptionRequest);
	}

	«IF isSelective(broadcast)»
		std::string «interfaceName»InProcessConnector::subscribeTo«broadcastName.toFirstUpper»Broadcast(
				const «interfaceName.toFirstUpper»«broadcastName.toFirstUpper»BroadcastFilterParameters& filterParameters,
				std::shared_ptr > subscriptionListener,
				const joynr::OnChangeSubscriptionQos& subscriptionQos,
				std::string& subscriptionId
	«ELSE»
		std::string «interfaceName»InProcessConnector::subscribeTo«broadcastName.toFirstUpper»Broadcast(
				std::shared_ptr > subscriptionListener,
				const joynr::OnChangeSubscriptionQos& subscriptionQos,
				std::string& subscriptionId
	«ENDIF»
	) {
		joynr::BroadcastSubscriptionRequest subscriptionRequest;
		«IF isSelective(broadcast)»
			subscriptionRequest.setFilterParameters(QtBroadcastFilterParameters::createQt(filterParameters));
		«ENDIF»
		subscriptionRequest.setSubscriptionId(QString::fromStdString(subscriptionId));
		return subscribeTo«broadcastName.toFirstUpper»Broadcast(
					subscriptionListener,
					subscriptionQos,
					subscriptionRequest);
	}

	std::string «interfaceName»InProcessConnector::subscribeTo«broadcastName.toFirstUpper»Broadcast(
			std::shared_ptr > subscriptionListener,
			const joynr::OnChangeSubscriptionQos& subscriptionQos,
			joynr::BroadcastSubscriptionRequest& subscriptionRequest
	) {
		LOG_DEBUG(logger, "Subscribing to «broadcastName».");
		assert(subscriptionManager != NULL);
		QString broadcastName("«broadcastName»");

		QSharedPointer> subscriptionCallback(
					new «broadcastName.toFirstUpper»BroadcastSubscriptionCallbackWrapper(subscriptionListener));
		subscriptionManager->registerSubscription(
					broadcastName,
					subscriptionCallback,
					QSharedPointer(QtSubscriptionQos::createQt(subscriptionQos)),
					subscriptionRequest);
		LOG_DEBUG(logger, "Registered broadcast subscription: " + subscriptionRequest.toQString());
		assert(!address.isNull());
		QSharedPointer caller = address->getRequestCaller();
		assert(!caller.isNull());
		QSharedPointer<«interfaceName»RequestCaller> requestCaller = caller.dynamicCast<«interfaceName»RequestCaller>();
		std::string subscriptionId(subscriptionRequest.getSubscriptionId().toStdString());

		if(caller.isNull()) {
			assert(publicationManager != NULL);
			/**
			* Provider not registered yet
			* Dispatcher will call publicationManger->restore when a new provider is added to activate
			* subscriptions for that provider
			*/
			publicationManager->add(QString::fromStdString(proxyParticipantId), QString::fromStdString(providerParticipantId), subscriptionRequest);
		} else {
			publicationManager->add(
						QString::fromStdString(proxyParticipantId),
						QString::fromStdString(providerParticipantId),
						caller,
						subscriptionRequest,
						inProcessPublicationSender);
		}
		return subscriptionId;
	}

	void «interfaceName»InProcessConnector::unsubscribeFrom«broadcastName.toFirstUpper»Broadcast(
			std::string& subscriptionId
	) {
		QString subscriptionIdQT(QString::fromStdString(subscriptionId));
		LOG_DEBUG(logger, "Unsubscribing broadcast. Id=" + subscriptionIdQT);
		assert(publicationManager != NULL);
		LOG_DEBUG(logger, "Stopping publications by publication manager.");
		publicationManager->stopPublication(subscriptionIdQT);
		assert(subscriptionManager != NULL);
		LOG_DEBUG(logger, "Unregistering broadcast subscription.");
		subscriptionManager->unregisterSubscription(subscriptionIdQT);
	}
«ENDFOR»
«getNamespaceEnder(serviceInterface)»
'''

	def getInterfaceCaller(FInterface serviceInterface){
		serviceInterface.joynrName.toFirstLower + "Caller"
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy