test_handler.c 2.48 KB
#include <stdio.h>
#include <string.h>
#include <inttypes.h>

#include "trbase.h"
#include "trcomm.h"
#include "trevent.h"
#include "test_handler.h"

static
TR_EventDone
testHandlerHeartbeat(TR_EventHandler this, TR_Event event)
{   
    printf("handled: %llu/s\n", ((TestHandler)this)->handled);
	((TestHandler)this)->handled = 0;

	return TR_EVENT_DONE;
}   

static
TR_EventDone
testHandlerNewMessage(TR_EventHandler this, TR_Event event)
{   
	TR_ProtoMessageRaw msg  = event->data;
	TR_SizedData       data = (TR_SizedData)msg->data;
	char               buf[data->size + 1];
	int                i;

	((TestHandler)this)->handled++;

	memcpy(buf, data->data, data->size);
	buf[data->size] = 0;
	for (i = 0; buf[i]; i++) {
		if (! isprint(buf[i])) buf[i] = '.';
	}
//    printf("echo message: %s(%zd)\n", buf, data->size);

	TR_eventHandlerIssueEvent(
			(TR_EventHandler)this,
			TR_eventSubjectEmit(
				event->subject,
				TR_CEP_EVENT_SEND_MSG,
				event->data));

	return TR_EVENT_DONE;
}   

static
TR_EventDone
testHandlerClose(TR_EventHandler this, TR_Event event)
{   
    puts("close");

	return TR_EVENT_PENDING;
}   

static
TR_EventDone
testHandlerUpgrade(TR_EventHandler this, TR_Event event)
{
    printf("upgrade: %"PRIdPTR"\n", event->id);

	return TR_EVENT_PENDING;
}

static
int
testHandlerCtor(void * _this, va_list * params)
{
	TR_PARENTCALL(TestHandler, _this, TR_Class, ctor, params);
	((TestHandler)_this)->handled = 0;

	return 0;
}

static
void
testHandlerDtor(void * _this, va_list * params)
{
	TR_PARENTCALL(TestHandler, _this, TR_Class, dtor);
}

static
void
testHandlerCvInit(TR_class_ptr class)
{
    TR_EVENT_HANDLER_SET_METHOD(
            class,
            TR_EventDispatcher,
            TR_DISPATCHER_EVENT_HEARTBEAT,
            testHandlerHeartbeat);
    TR_EVENT_HANDLER_SET_METHOD(
            class,
            TR_CommEndPoint,
            TR_CEP_EVENT_NEW_MSG,
            testHandlerNewMessage);
    TR_EVENT_HANDLER_SET_METHOD(
            class,
            TR_CommEndPoint,
            TR_CEP_EVENT_CLOSE,
            testHandlerClose);
    TR_EVENT_HANDLER_SET_METHOD(
            class,
            TR_CommEndPoint,
            TR_CEP_EVENT_UPGRADE,
            testHandlerUpgrade);
}

TR_INSTANCE(TR_Hash, testHandlerEventMethods);
TR_INIT_IFACE(TR_Class, testHandlerCtor, testHandlerDtor, NULL);
TR_CREATE_CLASS(
        TestHandler,
        TR_EventHandler,
        testHandlerCvInit,
        TR_IF(TR_Class)) = {
    { &(_testHandlerEventMethods.data) }
};

// vim: set ts=4 sw=4: