Browse Source

add connector and conn_entry_point and do some modifications

1.0.0
Georg Hopp 11 years ago
parent
commit
5cfb6cd293
  1. 6
      include/tr/comm_end_point.h
  2. 49
      include/tr/connect_entry_point.h
  3. 42
      include/tr/connector.h
  4. 12
      include/tr/interface/comm_end_point.h
  5. 12
      src/Makefile.am
  6. 34
      src/cep_append_read_data.c
  7. 34
      src/cep_append_write_data.c
  8. 34
      src/cet_accept.c
  9. 37
      src/comm_end_point.c
  10. 24
      src/con_compose.c
  11. 24
      src/con_next_message.c
  12. 72
      src/conn_entry_point.c
  13. 8
      src/connection.c
  14. 102
      src/connector.c
  15. 36
      src/i_comm_end_point.c

6
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__

49
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 <http://www.gnu.org/licenses/>.
*/
#ifndef __TR_CONNECT_ENTRY_POINT_H__
#define __TR_CONNECT_ENTRY_POINT_H__
#include <sys/types.h>
#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:

42
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 <http://www.gnu.org/licenses/>.
*/
#ifndef __TR_CONNECTOR_H__
#define __TR_CONNECTOR_H__
#include <sys/types.h>
#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:

12
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__

12
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

34
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 <http://www.gnu.org/licenses/>.
*/
#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:

34
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 <http://www.gnu.org/licenses/>.
*/
#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:

34
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 <http://www.gnu.org/licenses/>.
*/
#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:

37
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,

24
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 <http://www.gnu.org/licenses/>.
*/
// vim: set ts=4 sw=4:

24
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 <http://www.gnu.org/licenses/>.
*/
// vim: set ts=4 sw=4:

72
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 <http://www.gnu.org/licenses/>.
*/
#include <stdarg.h>
#include <stdint.h>
#include <sys/types.h>
#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:

8
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)) = {

102
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 <http://www.gnu.org/licenses/>.
*/
#include <stdarg.h>
#include <stdint.h>
#include <sys/types.h>
#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:

36
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:
Loading…
Cancel
Save