114 lines
2.5 KiB
C++
114 lines
2.5 KiB
C++
|
|
/*
|
||
|
|
* Copyright (c) 2014, Freescale Semiconductor, Inc.
|
||
|
|
* Copyright 2016-2021 NXP
|
||
|
|
* Copyright 2021 ACRIOS Systems s.r.o.
|
||
|
|
* All rights reserved.
|
||
|
|
*
|
||
|
|
*
|
||
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
||
|
|
*/
|
||
|
|
|
||
|
|
#include "erpc_server.hpp"
|
||
|
|
|
||
|
|
using namespace erpc;
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
|
// Code
|
||
|
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
#if ERPC_NESTED_CALLS_DETECTION
|
||
|
|
extern bool nestingDetection;
|
||
|
|
bool nestingDetection = false;
|
||
|
|
#endif
|
||
|
|
|
||
|
|
void Server::addService(Service *service)
|
||
|
|
{
|
||
|
|
if (m_firstService == NULL)
|
||
|
|
{
|
||
|
|
m_firstService = service;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
|
||
|
|
Service *link = m_firstService;
|
||
|
|
while (link->getNext() != NULL)
|
||
|
|
{
|
||
|
|
link = link->getNext();
|
||
|
|
}
|
||
|
|
|
||
|
|
link->setNext(service);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void Server::removeService(Service *service)
|
||
|
|
{
|
||
|
|
Service *link = m_firstService;
|
||
|
|
|
||
|
|
if (link == service)
|
||
|
|
{
|
||
|
|
m_firstService = link->getNext();
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
while (link != NULL)
|
||
|
|
{
|
||
|
|
if (link->getNext() == service)
|
||
|
|
{
|
||
|
|
link->setNext(link->getNext()->getNext());
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
link = link->getNext();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
erpc_status_t Server::readHeadOfMessage(Codec *codec, message_type_t &msgType, uint32_t &serviceId, uint32_t &methodId,
|
||
|
|
uint32_t &sequence)
|
||
|
|
{
|
||
|
|
codec->startReadMessage(msgType, serviceId, methodId, sequence);
|
||
|
|
return codec->getStatus();
|
||
|
|
}
|
||
|
|
|
||
|
|
erpc_status_t Server::processMessage(Codec *codec, message_type_t msgType, uint32_t serviceId, uint32_t methodId,
|
||
|
|
uint32_t sequence)
|
||
|
|
{
|
||
|
|
erpc_status_t err = kErpcStatus_Success;
|
||
|
|
Service *service;
|
||
|
|
|
||
|
|
if ((msgType != message_type_t::kInvocationMessage) && (msgType != message_type_t::kOnewayMessage))
|
||
|
|
{
|
||
|
|
err = kErpcStatus_InvalidArgument;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (err == kErpcStatus_Success)
|
||
|
|
{
|
||
|
|
service = findServiceWithId(serviceId);
|
||
|
|
if (service == NULL)
|
||
|
|
{
|
||
|
|
err = kErpcStatus_InvalidArgument;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (err == kErpcStatus_Success)
|
||
|
|
{
|
||
|
|
err = service->handleInvocation(methodId, sequence, codec, m_messageFactory, m_transport);
|
||
|
|
}
|
||
|
|
|
||
|
|
return err;
|
||
|
|
}
|
||
|
|
|
||
|
|
Service *Server::findServiceWithId(uint32_t serviceId)
|
||
|
|
{
|
||
|
|
Service *service = m_firstService;
|
||
|
|
while (service != NULL)
|
||
|
|
{
|
||
|
|
if (service->getServiceId() == serviceId)
|
||
|
|
{
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
service = service->getNext();
|
||
|
|
}
|
||
|
|
return service;
|
||
|
|
}
|