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: