/**
* \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 "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_CommEndPoint,
TR_CEP_EVENT_NEW_DATA,
protocolHandlerParse);
TR_EVENT_HANDLER_SET_METHOD(
cls,
TR_CommEndPoint,
TR_CEP_EVENT_SEND_MSG,
protocolHandlerCompose);
TR_EVENT_HANDLER_SET_METHOD(
cls,
TR_CommEndPoint,
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: