From a2bef3917aee3080e072caa9d91602c7992f12cb Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Mon, 11 Aug 2014 19:32:21 +0100 Subject: [PATCH] buffered read and write --- include/tr/comm_end_point.h | 2 + include/tr/io_handler.h | 42 +++++++++++++++ src/Makefile.am | 2 + src/cep_buffer_read.c | 41 +++++++++++++++ src/cep_write_buffered.c | 44 ++++++++++++++++ src/io_handler.c | 102 ++++++++++++++++++++++++++++++++++++ 6 files changed, 233 insertions(+) create mode 100644 include/tr/io_handler.h create mode 100644 src/cep_buffer_read.c create mode 100644 src/cep_write_buffered.c create mode 100644 src/io_handler.c diff --git a/include/tr/comm_end_point.h b/include/tr/comm_end_point.h index 76752c6..27bce0e 100644 --- a/include/tr/comm_end_point.h +++ b/include/tr/comm_end_point.h @@ -66,6 +66,8 @@ TR_CLASSVARS_DECL(TR_CommEndPoint) { void TR_cepAppendReadData(TR_CommEndPoint, TR_RemoteData); void TR_cepAppendWriteData(TR_CommEndPoint, TR_RemoteData); +int TR_cepBufferRead(TR_CommEndPoint); +int TR_cepWriteBuffered(TR_CommEndPoint); #endif // __TR_COMM_END_POINT_H__ diff --git a/include/tr/io_handler.h b/include/tr/io_handler.h new file mode 100644 index 0000000..97aa8cc --- /dev/null +++ b/include/tr/io_handler.h @@ -0,0 +1,42 @@ +/** + * \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 . + */ + +#ifndef __TR_IO_HANDLER_H__ +#define __TR_IO_HANDLER_H__ + +#include + +#include "trbase.h" +#include "trevent.h" + +TR_CLASS(TR_IoHandler) { + TR_EXTENDS(TR_EventHandler); +}; +TR_INSTANCE_INIT(TR_IoHandler); +TR_CLASSVARS_DECL(TR_IoHandler) { + TR_CV_EXTENDS(TR_EventHandler); +}; + +#endif // __TR_IO_HANDLER_H__ + +// vim: set ts=4 sw=4: + diff --git a/src/Makefile.am b/src/Makefile.am index f188b10..fabb1aa 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -6,6 +6,8 @@ AM_CFLAGS += -I../include/ TRCOMM = cep_append_read_data.c \ cep_append_write_data.c \ cet_accept.c \ + cep_buffer_read.c \ + cep_write_buffered.c \ comm_end_point.c \ comm_manager.c \ comm_manager_poll.c \ diff --git a/src/cep_buffer_read.c b/src/cep_buffer_read.c new file mode 100644 index 0000000..7b46698 --- /dev/null +++ b/src/cep_buffer_read.c @@ -0,0 +1,41 @@ +/** + * \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 "trbase.h" +#include "trio.h" + +#include "tr/comm_end_point.h" + +int +cepBufferedRead(TR_CommEndPoint this) +{ + TR_RemoteData data = TR_socketRecv(this->transport); + + if (! data) return FALSE; + + while (data) { + TR_cepAppendReadData(data); + data = TR_socketRecv(this->transport); + } +} + +// vim: set ts=4 sw=4: diff --git a/src/cep_write_buffered.c b/src/cep_write_buffered.c new file mode 100644 index 0000000..734ee7c --- /dev/null +++ b/src/cep_write_buffered.c @@ -0,0 +1,44 @@ +/** + * \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 "trbase.h" +#include "trio.h" + +#include "tr/comm_end_point.h" + +int +cepBufferedRead(TR_CommEndPoint this) +{ + TR_RemoteData data = TR_cepNextWriteData(this); + int send = 0; + + while (data) { + int current_send = TR_socketSend(this->transport, data); + + // TODO if nothing was send put it back into the queue.. + // and stop loop. (This was a close.) + + data = TR_socketRecv(this->transport); + } +} + +// vim: set ts=4 sw=4: diff --git a/src/io_handler.c b/src/io_handler.c new file mode 100644 index 0000000..8385479 --- /dev/null +++ b/src/io_handler.c @@ -0,0 +1,102 @@ +/** + * \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 +ioHandlerCtor(void * _this, va_list * params) +{ + TR_PARENTCALL(_this, TR_Class, ctor, params); + + return 0; +} + +static void ioHandlerDtor(void * _this) {} + +static +int +ioHandlerRead(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); + + return TRUE; +} + +static +int +ioHandlerWrite(void * _this, TR_Event event) +{ + TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject; + TR_ProtoMessage message = (TR_ProtoMessage)event->data; + + 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; +} + +static +void +protocolHandlerCvInit(TR_class_ptr cls) +{ + TR_EVENT_HANDLER_SET_METHOD( + cls, + TR_Connection, + TR_CEP_EVENT_READ_READY, + ioHandlerRead); + + TR_EVENT_HANDLER_SET_METHOD( + cls, + TR_Connection, + TR_CEP_EVENT_WRITE_READY, + ioHandlerWrite); +} + +TR_INSTANCE(TR_Hash, ioHandlerEventMethods); +TR_INIT_IFACE(TR_Class, ioHandlerCtor, ioHandlerDtor, NULL); +TR_CREATE_CLASS( + TR_ProtocolHandler, + TR_EventHandler, + ioHandlerCvInit, + TR_IF(TR_Class)) = { + { &(_ioHandlerEventMethods.data) } +}; + +// vim: set ts=4 sw=4: