Browse Source

buffered read and write

1.0.0
Georg Hopp 11 years ago
parent
commit
a2bef3917a
  1. 2
      include/tr/comm_end_point.h
  2. 42
      include/tr/io_handler.h
  3. 2
      src/Makefile.am
  4. 41
      src/cep_buffer_read.c
  5. 44
      src/cep_write_buffered.c
  6. 102
      src/io_handler.c

2
include/tr/comm_end_point.h

@ -66,6 +66,8 @@ TR_CLASSVARS_DECL(TR_CommEndPoint) {
void TR_cepAppendReadData(TR_CommEndPoint, TR_RemoteData); void TR_cepAppendReadData(TR_CommEndPoint, TR_RemoteData);
void TR_cepAppendWriteData(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__ #endif // __TR_COMM_END_POINT_H__

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

2
src/Makefile.am

@ -6,6 +6,8 @@ AM_CFLAGS += -I../include/
TRCOMM = cep_append_read_data.c \ TRCOMM = cep_append_read_data.c \
cep_append_write_data.c \ cep_append_write_data.c \
cet_accept.c \ cet_accept.c \
cep_buffer_read.c \
cep_write_buffered.c \
comm_end_point.c \ comm_end_point.c \
comm_manager.c \ comm_manager.c \
comm_manager_poll.c \ comm_manager_poll.c \

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

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

102
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 <http://www.gnu.org/licenses/>.
*/
#include <unistd.h>
#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:
Loading…
Cancel
Save