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: