/** * \file * * \author Georg Hopp * * \copyright * Copyright © 2014 Georg Hopp * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "trbase.h" #include "trio.h" #include "trdata.h" #include "tr/datagram_service.h" #include "tr/interface/protocol.h" #include "tr/interface/comm_end_point.h" static int datagramServiceCtor(void * _this, va_list * params) { TR_PARENTCALL(TR_DatagramService, _this, TR_Class, ctor, params); return 0; } static void datagramServiceDtor(void * _this) { TR_PARENTCALL(TR_DatagramService, _this, TR_Class, dtor); } static TR_ProtoMessage datagramServiceNextMessage(void * _this, TR_RemoteData * data) { TR_CommEndPoint comm = _this; TR_ProtoMessage ret_message = NULL; if (*data) { ret_message = TR_protoCreateMessage(comm->protocol, (*data)->remote); TR_protoParse(comm->protocol, ret_message, *data); /* * In UDP I don't care about remaining data. UDP is an all or nothing * approach. If the parser is unable to create a message from the data I * drop the data. * Here the protocol must not free the data if it does not create a * complete message from it. If a message was created the original data * might or might not traval with the created message. In any case the * protocol is then responsible for freeing the data. */ if (! ret_message->ready) { TR_delete(*data); TR_delete(ret_message); } *data = NULL; } return ret_message; } static int datagramServiceCompose(void * _this, TR_ProtoMessage message) { TR_RemoteData data = TR_protoCompose(((TR_CommEndPoint)_this)->protocol, message); if (! data) { return FALSE; } TR_queuePut(((TR_CommEndPoint)_this)->write_buffer, data); return ((TR_SizedData)data)->size; } intptr_t datagramService_events[TR_CEP_EVENT_MAX + 1]; TR_INIT_IFACE(TR_Class, datagramServiceCtor, datagramServiceDtor, NULL); TR_INIT_IFACE( TR_CommEndPoint, datagramServiceNextMessage, datagramServiceCompose); TR_CREATE_CLASS( TR_DatagramService, TR_CommEndPoint, NULL, TR_IF(TR_Class), TR_IF(TR_CommEndPoint)) = { {{ NULL, TR_CEP_EVENT_MAX + 1, datagramService_events }} }; // vim: set ts=4 sw=4: