Browse Source

add protocol handler

1.0.0
Georg Hopp 11 years ago
parent
commit
3b4c855a59
  1. 1
      include/Makefile.am
  2. 1
      include/tr/proto_message.h
  3. 44
      include/tr/protocol_handler.h
  4. 1
      include/trcomm.h
  5. 1
      src/Makefile.am
  6. 4
      src/comm_manager.c
  7. 138
      src/protocol_handler.c

1
include/Makefile.am

@ -6,6 +6,7 @@ nobase_include_HEADERS = tr/comm_end_point.h \
tr/connector.h \ tr/connector.h \
tr/proto_message.h \ tr/proto_message.h \
tr/protocol.h \ tr/protocol.h \
tr/protocol_handler.h \
tr/interface/comm_end_point.h \ tr/interface/comm_end_point.h \
tr/interface/comm_manager.h \ tr/interface/comm_manager.h \
tr/interface/protocol.h tr/interface/protocol.h

1
include/tr/proto_message.h

@ -31,6 +31,7 @@
TR_CLASS(TR_ProtoMessage) { TR_CLASS(TR_ProtoMessage) {
TR_Socket remote; TR_Socket remote;
int ready; int ready;
int close;
}; };
TR_INSTANCE_INIT(TR_ProtoMessage); TR_INSTANCE_INIT(TR_ProtoMessage);
TR_CLASSVARS_DECL(TR_ProtoMessage) {}; TR_CLASSVARS_DECL(TR_ProtoMessage) {};

44
include/tr/protocol_handler.h

@ -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/>.
*/
#ifndef __TR_PROTOCOL_HANDLER_H__
#define __TR_PROTOCOL_HANDLER_H__
#include <sys/types.h>
#include "trbase.h"
#include "trevent.h"
#include "tr/comm_end_point.h"
TR_CLASS(TR_ProtocolHandler) {
TR_EXTENDS(TR_EventHandler);
};
TR_INSTANCE_INIT(TR_ProtocolHandler);
TR_CLASSVARS_DECL(TR_ProtocolHandler) {
TR_CV_EXTENDS(TR_EventHandler);
};
#endif // __TR_PROTOCOL_HANDLER_H__
// vim: set ts=4 sw=4:

1
include/trcomm.h

@ -9,6 +9,7 @@
#include "tr/connector.h" #include "tr/connector.h"
#include "tr/proto_message.h" #include "tr/proto_message.h"
#include "tr/protocol.h" #include "tr/protocol.h"
#include "tr/protocol_handler.h"
#include "tr/interface/comm_end_point.h" #include "tr/interface/comm_end_point.h"
#include "tr/interface/comm_manager.h" #include "tr/interface/comm_manager.h"
#include "tr/interface/protocol.h" #include "tr/interface/protocol.h"

1
src/Makefile.am

@ -17,6 +17,7 @@ TRCOMM = cep_append_read_data.c \
connector.c \ connector.c \
proto_message.c \ proto_message.c \
protocol.c \ protocol.c \
protocol_handler.c \
protocol_message_raw.c \ protocol_message_raw.c \
protocol_raw.c \ protocol_raw.c \
i_comm_end_point.c \ i_comm_end_point.c \

4
src/comm_manager.c

@ -37,6 +37,8 @@ commManagerCtor(void * _this, va_list * params)
{ {
TR_CommManager this = _this; TR_CommManager this = _this;
TR_PARENTCALL(_this, TR_Class, ctor, params);
this->n_endpoints = sysconf(_SC_OPEN_MAX); this->n_endpoints = sysconf(_SC_OPEN_MAX);
this->endpoints = TR_calloc(sizeof(TR_CommEndPoint), this->n_endpoints); this->endpoints = TR_calloc(sizeof(TR_CommEndPoint), this->n_endpoints);
@ -53,8 +55,6 @@ commManagerDtor(void * _this)
for (i = 0; i < this->n_endpoints; i++) { for (i = 0; i < this->n_endpoints; i++) {
TR_delete(this->endpoints[i]); TR_delete(this->endpoints[i]);
} }
TR_PARENTCALL(_this, TR_Class, dtor);
} }
static static

138
src/protocol_handler.c

@ -0,0 +1,138 @@
/**
* \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
protocolHandlerCtor(void * _this, va_list * params)
{
TR_PARENTCALL(_this, TR_Class, ctor, params);
return 0;
}
static void protocolHandlerDtor(void * _this) {}
static
int
protocolHandlerParse(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);
while (message) {
TR_eventHandlerIssueEvent(
(TR_EventHandler)_this,
event->subject,
TR_CEP_EVENT_NEW_MSG,
message);
if (message->close) {
// also check that we are a response. Well this is how it is done
// in the python code...
TR_cepSetClose(endpoint);
}
message = TR_cepNextMessage(endpoint);
}
return TRUE;
}
static
int
protocolHandlerCompose(void * _this, TR_Event event)
{
TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject;
TR_ProtoMessage message = (TR_ProtoMessage)event->data;
if (TR_cepCompose(endpoint, message)) {
TR_eventHandlerIssueEvent(
(TR_EventHandler)_this,
event->subject,
TR_CEP_EVENT_WRITE_READY,
NULL);
}
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;
}
int
protocolHandlerUpgrade(void * _this, TR_Event event)
{
return TRUE;
}
static
void
protocolHandlerCvInit(TR_class_ptr cls)
{
TR_EVENT_HANDLER_SET_METHOD(
cls,
TR_Connection,
TR_CEP_EVENT_NEW_DATA,
protocolHandlerParse);
TR_EVENT_HANDLER_SET_METHOD(
cls,
TR_Connection,
TR_CEP_EVENT_SEND_MSG,
protocolHandlerCompose);
TR_EVENT_HANDLER_SET_METHOD(
cls,
TR_Connection,
TR_CEP_EVENT_UPGRADE,
protocolHandlerUpgrade);
}
TR_INSTANCE(TR_Hash, protocolHandlerEventMethods);
TR_INIT_IFACE(TR_Class, protocolHandlerCtor, protocolHandlerDtor, NULL);
TR_CREATE_CLASS(
TR_ProtocolHandler,
TR_EventHandler,
protocolHandlerCvInit,
TR_IF(TR_Class)) = {
{ &(_protocolHandlerEventMethods.data) }
};
// vim: set ts=4 sw=4:
Loading…
Cancel
Save