diff --git a/include/tr/comm_end_point.h b/include/tr/comm_end_point.h
index e5e4a2e..76752c6 100644
--- a/include/tr/comm_end_point.h
+++ b/include/tr/comm_end_point.h
@@ -27,6 +27,7 @@
#include "trbase.h"
#include "trevent.h"
+#include "trdata.h"
TR_CLASS(TR_CommEndPoint) {
TR_EXTENDS(TR_EventSubject);
@@ -60,6 +61,11 @@ TR_CLASSVARS_DECL(TR_CommEndPoint) {
#define TR_cepHasProto(ep, proto) (TR_INSTANCE_OF(proto, TR_cepGetProto(ep)))
#define TR_cepGetProto(ep) ((ep)->protocol)
#define TR_cepGetHandle(ep) ((ep)->transport->handle)
+#define TR_cepHasPendingData(ep) (! TR_queueEmpty((ep)->write_buffer))
+#define TR_cepNextWriteData(ep) (TR_queueGet(this->write_buffer))
+
+void TR_cepAppendReadData(TR_CommEndPoint, TR_RemoteData);
+void TR_cepAppendWriteData(TR_CommEndPoint, TR_RemoteData);
#endif // __TR_COMM_END_POINT_H__
diff --git a/include/tr/connect_entry_point.h b/include/tr/connect_entry_point.h
new file mode 100644
index 0000000..7ff019f
--- /dev/null
+++ b/include/tr/connect_entry_point.h
@@ -0,0 +1,49 @@
+/**
+ * \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_CONNECT_ENTRY_POINT_H__
+#define __TR_CONNECT_ENTRY_POINT_H__
+
+#include
+
+#include "trbase.h"
+#include "trio.h"
+
+#include "tr/comm_end_point.h"
+
+TR_CLASS(TR_ConnEntryPoint) {
+ TR_EXTENDS(TR_CommEndPoint);
+};
+TR_INSTANCE_INIT(TR_ConnEntryPoint);
+TR_CLASSVARS_DECL(TR_ConnEntryPoint) {
+ TR_CV_EXTENDS(TR_CommEndPoint);
+};
+
+#define TR_CET_EVENT_ACC_READY (TR_CEP_EVENT_MAX + 1)
+#define TR_CET_EVENT_MAX ((size_t)TR_CET_EVENT_ACC_READY)
+
+TR_TcpSocket TR_cetAccept(TR_ConnEntryPoint);
+
+#endif // __TR_CONNECT_ENTRY_POINT_H__
+
+// vim: set ts=4 sw=4:
+
diff --git a/include/tr/connector.h b/include/tr/connector.h
new file mode 100644
index 0000000..6346b2b
--- /dev/null
+++ b/include/tr/connector.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_CONNECTOR_H__
+#define __TR_CONNECTOR_H__
+
+#include
+
+#include "trbase.h"
+#include "trevent.h"
+
+TR_CLASS(TR_Connector) {
+ TR_EXTENDS(TR_EventHandler);
+};
+TR_INSTANCE_INIT(TR_Connector);
+TR_CLASSVARS_DECL(TR_Connector) {
+ TR_CV_EXTENDS(TR_EventHandler);
+};
+
+#endif // __TR_CONNECTOR_H__
+
+// vim: set ts=4 sw=4:
+
diff --git a/include/tr/interface/comm_end_point.h b/include/tr/interface/comm_end_point.h
index bb590ed..4ce0006 100644
--- a/include/tr/interface/comm_end_point.h
+++ b/include/tr/interface/comm_end_point.h
@@ -31,29 +31,17 @@
#include "tr/comm_end_point.h"
#include "tr/proto_message.h"
-typedef int (* fptr_TR_cepHasPendingData)(void *);
typedef TR_ProtoMessage (* fptr_TR_cepNextMessage)(void *);
typedef int (* fptr_TR_cepCompose)(void *, TR_ProtoMessage);
-typedef void (* fptr_TR_cepAppendReadData)(void *, TR_RemoteData);
-typedef TR_RemoteData (* fptr_TR_cepNextWriteData)(void *);
-typedef void (* fptr_TR_cepAppendWriteData)(void *, TR_RemoteData);
TR_INTERFACE(TR_CommEndPoint) {
TR_IFID;
- fptr_TR_cepHasPendingData hasPendingData;
fptr_TR_cepNextMessage nextMessage;
fptr_TR_cepCompose compose;
- fptr_TR_cepAppendReadData appendReadData;
- fptr_TR_cepNextWriteData nextWriteData;
- fptr_TR_cepAppendWriteData appendWriteData;
};
-int TR_cepHasPendingData(void *);
TR_ProtoMessage TR_cepNextMessage(void *);
int TR_cepCompose(void *, TR_ProtoMessage);
-void TR_cepAppendReadData(void *, TR_RemoteData);
-TR_RemoteData TR_cepNextWriteData(void *);
-void TR_cepAppendWriteData(void *, TR_RemoteData);
#endif // __TR_INTERFACE_COMM_END_POINT_H__
diff --git a/src/Makefile.am b/src/Makefile.am
index 259eaf1..79edbcd 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -3,13 +3,19 @@ AUTOMAKE_OPTIONS = subdir-objects
AM_CFLAGS += -I../include/
-TRCOMM = comm_end_point.c \
+TRCOMM = cep_append_read_data.c \
+ cep_append_write_data.c \
+ cet_accept.c \
+ comm_end_point.c \
+ con_compose.c \
connection.c \
connector.c \
+ conn_entry_point.c \
+ con_next_message.c \
protocol.c \
- proto_message.c \
- protocol_raw.c \
protocol_message_raw.c \
+ protocol_raw.c \
+ proto_message.c \
i_comm_end_point.c \
i_protocol.c
diff --git a/src/cep_append_read_data.c b/src/cep_append_read_data.c
new file mode 100644
index 0000000..db2a071
--- /dev/null
+++ b/src/cep_append_read_data.c
@@ -0,0 +1,34 @@
+/**
+ * \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"
+
+void
+cepAppendReadData(TR_CommEndPoint this, TR_RemoteData data)
+{
+ TR_queuePut(this->read_buffer, data);
+}
+
+// vim: set ts=4 sw=4:
diff --git a/src/cep_append_write_data.c b/src/cep_append_write_data.c
new file mode 100644
index 0000000..839329a
--- /dev/null
+++ b/src/cep_append_write_data.c
@@ -0,0 +1,34 @@
+/**
+ * \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"
+
+void
+cepAppendWriteData(TR_CommEndPoint this, TR_RemoteData data)
+{
+ TR_queuePut(this->write_buffer, data);
+}
+
+// vim: set ts=4 sw=4:
diff --git a/src/cet_accept.c b/src/cet_accept.c
new file mode 100644
index 0000000..bfa19ae
--- /dev/null
+++ b/src/cet_accept.c
@@ -0,0 +1,34 @@
+/**
+ * \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 "trio.h"
+
+#include "tr/comm_end_point.h"
+#include "tr/connect_entry_point.h"
+
+TR_TcpSocket
+TR_cetAccept(TR_ConnEntryPoint cet)
+{
+ return TR_socketAccept((TR_TcpSocket)((TR_CommEndPoint)cet)->transport);
+}
+
+// vim: set ts=4 sw=4:
diff --git a/src/comm_end_point.c b/src/comm_end_point.c
index b016675..9c83dfe 100644
--- a/src/comm_end_point.c
+++ b/src/comm_end_point.c
@@ -58,34 +58,6 @@ commEndPointDtor(void * _this)
TR_delete(this->write_buffer);
}
-static
-int
-commEndPointHasPendingData(void * _this)
-{
- return ! TR_queueEmpty(((TR_CommEndPoint)_this)->write_buffer);
-}
-
-static
-void
-commEndPointAppendReadData(void * _this, TR_RemoteData data)
-{
- TR_queuePut(((TR_CommEndPoint)_this)->read_buffer, data);
-}
-
-static
-TR_RemoteData
-commEndPointNextWriteData(void * _this)
-{
- return TR_queueGet(((TR_CommEndPoint)_this)->write_buffer);
-}
-
-static
-void
-commEndPointAppendWriteData(void * _this, TR_RemoteData data)
-{
- TR_queuePut(((TR_CommEndPoint)_this)->write_buffer, data);
-}
-
static
void
commEndPointCvInit(TR_class_ptr cls)
@@ -105,14 +77,7 @@ commEndPointCvInit(TR_class_ptr cls)
intptr_t comm_end_point_events[TR_CEP_EVENT_MAX + 1];
TR_INIT_IFACE(TR_Class, commEndPointCtor, commEndPointDtor, NULL);
-TR_INIT_IFACE(
- TR_CommEndPoint,
- commEndPointHasPendingData,
- NULL,
- NULL,
- commEndPointAppendReadData,
- commEndPointNextWriteData,
- commEndPointAppendWriteData);
+TR_INIT_IFACE(TR_CommEndPoint, NULL, NULL);
TR_CREATE_CLASS(
TR_CommEndPoint,
TR_EventSubject,
diff --git a/src/con_compose.c b/src/con_compose.c
new file mode 100644
index 0000000..d05e417
--- /dev/null
+++ b/src/con_compose.c
@@ -0,0 +1,24 @@
+/**
+ * \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 .
+ */
+
+
+// vim: set ts=4 sw=4:
diff --git a/src/con_next_message.c b/src/con_next_message.c
new file mode 100644
index 0000000..d05e417
--- /dev/null
+++ b/src/con_next_message.c
@@ -0,0 +1,24 @@
+/**
+ * \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 .
+ */
+
+
+// vim: set ts=4 sw=4:
diff --git a/src/conn_entry_point.c b/src/conn_entry_point.c
new file mode 100644
index 0000000..f2f4367
--- /dev/null
+++ b/src/conn_entry_point.c
@@ -0,0 +1,72 @@
+/**
+ * \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 "trevent.h"
+
+#include "tr/connect_entry_point.h"
+#include "tr/interface/comm_end_point.h"
+
+static
+int
+connEntryPointCtor(void * _this, va_list * params)
+{
+ TR_PARENTCALL(_this, TR_Class, ctor, params);
+ return 0;
+}
+
+static
+void
+connEntryPointDtor(void * _this)
+{
+ TR_PARENTCALL(_this, TR_Class, dtor);
+}
+
+static
+void
+connEntryPointCvInit(TR_class_ptr cls)
+{
+ TR_EVENT_CREATE(cls, TR_CET_EVENT_ACC_READY);
+}
+
+intptr_t connEntryPoint_events[TR_CET_EVENT_MAX + 1];
+TR_INIT_IFACE(TR_Class, connEntryPointCtor, connEntryPointDtor, NULL);
+TR_INIT_IFACE(TR_CommEndPoint, NULL, NULL);
+TR_CREATE_CLASS(
+ TR_ConnEntryPoint,
+ TR_CommEndPoint,
+ connEntryPointCvInit,
+ TR_IF(TR_Class),
+ TR_IF(TR_CommEndPoint)) = {
+ {{
+ TR_CET_EVENT_MAX + 1,
+ connEntryPoint_events
+ }}
+};
+
+// vim: set ts=4 sw=4:
diff --git a/src/connection.c b/src/connection.c
index 6a8d10e..589621c 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -131,15 +131,11 @@ intptr_t connection_events[TR_CON_EVENT_MAX + 1];
TR_INIT_IFACE(TR_Class, connectionCtor, connectionDtor, NULL);
TR_INIT_IFACE(
TR_CommEndPoint,
- NULL,
connectionNextMessage,
- connectionCompose,
- NULL,
- NULL,
- NULL);
+ connectionCompose);
TR_CREATE_CLASS(
TR_Connection,
- TR_EventSubject,
+ TR_CommEndPoint,
connectionCvInit,
TR_IF(TR_Class),
TR_IF(TR_CommEndPoint)) = {
diff --git a/src/connector.c b/src/connector.c
new file mode 100644
index 0000000..8e0a273
--- /dev/null
+++ b/src/connector.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
+
+#include
+
+#include "trbase.h"
+#include "trio.h"
+#include "trevent.h"
+
+#include "tr/connector.h"
+#include "tr/connection.h"
+#include "tr/protocol.h"
+
+static
+int
+connectorCtor(void * _this, va_list * params)
+{
+ TR_PARENTCALL(_this, TR_Class, ctor, params);
+ return 0;
+}
+
+static
+void
+connectorDtor(void * _this)
+{
+ TR_PARENTCALL(_this, TR_Class, dtor);
+}
+
+static
+int
+connectorAccept(void * _this, TR_Event event)
+{
+ TR_Connector this = _this;
+ TR_CommEndPoint connection = (TR_CommEndPoint)event->subject;
+ TR_TcpSocket socket = TR_socketAccept(
+ (TR_TcpSocket)connection->transport);
+
+ while (socket) {
+ TR_Connection new_con = TR_new(
+ TR_Connection,
+ socket,
+ connection->protocol,
+ 8192);
+ TR_eventHandlerIssueEvent(
+ (TR_EventHandler)this,
+ (TR_EventSubject)new_con,
+ TR_CON_EVENT_NEW_CON,
+ NULL);
+ socket = TR_socketAccept((TR_TcpSocket)connection->transport);
+ }
+
+ /**
+ * TODO we need to identify socket failures and close socket then.
+ */
+
+ return 1;
+}
+
+static
+void
+connectorCvInit(TR_class_ptr cls)
+{
+ TR_EVENT_HANDLER_SET_METHOD(
+ cls,
+ TR_CommEndPoint,
+ TR_CEP_EVENT_READ_READY,
+ connectorAccept);
+}
+
+TR_INSTANCE(TR_Hash, _event_methods);
+TR_INIT_IFACE(TR_Class, connectorCtor, connectorDtor, NULL);
+TR_CREATE_CLASS(
+ TR_Connector,
+ TR_EventHandler,
+ connectorCvInit,
+ TR_IF(TR_Class)) = {
+ { &(__event_methods.data) }
+};
+
+// vim: set ts=4 sw=4:
diff --git a/src/i_comm_end_point.c b/src/i_comm_end_point.c
index 359796a..8a18571 100644
--- a/src/i_comm_end_point.c
+++ b/src/i_comm_end_point.c
@@ -28,48 +28,22 @@
#include "tr/interface/comm_end_point.h"
#include "tr/proto_message.h"
-TR_CREATE_INTERFACE(TR_CommEndPoint, 4);
-
-int
-TR_cepHasPendingData(void * _this)
-{
- int callret;
-
- TR_RETCALL(_this, TR_CommEndPoint, hasPendingData, callret);
-
- return callret;
-}
+TR_CREATE_INTERFACE(TR_CommEndPoint, 2);
TR_ProtoMessage
TR_cepNextMessage(void * _this)
{
TR_ProtoMessage callret;
-
TR_RETCALL(_this, TR_CommEndPoint, nextMessage, callret);
-
return callret;
}
-void
-TR_cepAppendReadData(void * _this, TR_RemoteData data)
-{
- TR_CALL(_this, TR_CommEndPoint, appendReadData, data);
-}
-
-TR_RemoteData
-TR_cepNextWriteData(void * _this)
+int
+TR_cepCompose(void * _this, TR_ProtoMessage message)
{
- TR_RemoteData callret;
-
- TR_RETCALL(_this, TR_CommEndPoint, nextWriteData, callret);
-
+ int callret;
+ TR_RETCALL(_this, TR_CommEndPoint, compose, callret, message);
return callret;
}
-void
-TR_cepAppendWriteData(void * _this, TR_RemoteData data)
-{
- TR_CALL(_this, TR_CommEndPoint, appendWriteData, data);
-}
-
// vim: set ts=4 sw=4: