/** * \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 "trbase.h" #include "trevent.h" #include "tr/protocol.h" #include "tr/connection.h" #include "tr/protocol_handler.h" #include "tr/proto_message.h" #include "tr/comm_end_point.h" #include "tr/interface/comm_end_point.h" static int protocolHandlerCtor(void * _this, va_list * params) { TR_PARENTCALL(_this, TR_Class, ctor, params); return 0; } static void protocolHandlerDtor(void * _this) {} static int protocolHandlerParse(void * _this, TR_Event event) { /** * TODO No upgrade for now. Add it later on. */ TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject; TR_ProtoMessage message = TR_cepNextMessage(endpoint); while (message) { TR_eventHandlerIssueEvent( (TR_EventHandler)_this, event->subject, TR_CEP_EVENT_NEW_MSG, message); if (message->close) { // also check that we are a response. Well this is how it is done // in the python code... TR_cepSetClose(endpoint); } message = TR_cepNextMessage(endpoint); } return TRUE; } static int protocolHandlerCompose(void * _this, TR_Event event) { TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject; TR_ProtoMessage message = (TR_ProtoMessage)event->data; if (TR_cepCompose(endpoint, message)) { TR_eventHandlerIssueEvent( (TR_EventHandler)_this, event->subject, TR_CEP_EVENT_WRITE_READY, NULL); } if (message->close) { // also check that we are a response. Well this is how it is done // in the python code... TR_cepSetClose(endpoint); } return TRUE; } int protocolHandlerUpgrade(void * _this, TR_Event event) { return TRUE; } static void protocolHandlerCvInit(TR_class_ptr cls) { TR_EVENT_HANDLER_SET_METHOD( cls, TR_CommEndPoint, TR_CEP_EVENT_NEW_DATA, protocolHandlerParse); TR_EVENT_HANDLER_SET_METHOD( cls, TR_CommEndPoint, TR_CEP_EVENT_SEND_MSG, protocolHandlerCompose); TR_EVENT_HANDLER_SET_METHOD( cls, TR_CommEndPoint, TR_CEP_EVENT_UPGRADE, protocolHandlerUpgrade); } TR_INSTANCE(TR_Hash, protocolHandlerEventMethods); TR_INIT_IFACE(TR_Class, protocolHandlerCtor, protocolHandlerDtor, NULL); TR_CREATE_CLASS( TR_ProtocolHandler, TR_EventHandler, protocolHandlerCvInit, TR_IF(TR_Class)) = { { &(_protocolHandlerEventMethods.data) } }; // vim: set ts=4 sw=4: