testserver.c 4.6 KB
#include <stdio.h>
#include <string.h>

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

TR_CLASS(TestHandler) {
	TR_EXTENDS(TR_EventHandler);
	unsigned long long handled;
};
TR_INSTANCE_INIT(TestHandler);
TR_CLASSVARS_DECL(TestHandler) {
	TR_CV_EXTENDS(TR_EventHandler);
};

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

static
int
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,
			event->subject,
			TR_CEP_EVENT_SEND_MSG,
			event->data);

	return FALSE;
}   

static
int
testHandlerClose(TR_EventHandler this, TR_Event event)
{   
    puts("close");
	return FALSE;
}   

static
int
testHandlerUpgrade(TR_EventHandler this, TR_Event event)
{
    puts("upgrade");
	return FALSE;
}

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_EventDispatcher,
            TR_CEP_EVENT_CLOSE,
            testHandlerClose);
    TR_EVENT_HANDLER_SET_METHOD(
            class,
            TR_EventDispatcher,
            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) }
};

TR_INSTANCE(TR_LoggerSyslog, mylogger, {TR_LOGGER_DEBUG});

int
main (int argc, char * argv[])
{
	TR_CommManager     cmgr       = (TR_CommManager)TR_new(TR_CommManagerPoll);
	TR_EventDispatcher dispatcher = TR_new(TR_EventDispatcher);
	TR_Connector       connector        = TR_new(TR_Connector);
	TR_IoHandler       io_handler       = TR_new(TR_IoHandler);
	TR_ProtocolHandler protocol_handler = TR_new(TR_ProtocolHandler);
	TestHandler        test_handler     = TR_new(TestHandler);
	TR_ConnEntryPoint  tcp_ep;
	TR_TcpSocket       tcp_ep_sock;
	TR_DatagramService udp_ep;
	TR_UdpSocket       udp_ep_sock;
	TR_Protocol        protocol;

	TR_logger = TR_INSTANCE_CAST(TR_Logger, mylogger);

	TR_eventDispatcherRegisterHandler(dispatcher, (TR_EventHandler)cmgr);
	TR_eventDispatcherRegisterHandler(dispatcher, (TR_EventHandler)connector);
	TR_eventDispatcherRegisterHandler(dispatcher, (TR_EventHandler)io_handler);
	TR_eventDispatcherRegisterHandler(
			dispatcher,
			(TR_EventHandler)protocol_handler);
	TR_eventDispatcherRegisterHandler(
			dispatcher,
			(TR_EventHandler)test_handler);

	protocol = TR_new(TR_ProtocolRaw);
	tcp_ep_sock  = TR_new(TR_TcpSocket, TR_logger, "0.0.0.0", 5678, 0);
	tcp_ep       = TR_new(TR_ConnEntryPoint, tcp_ep_sock, protocol);
	udp_ep_sock  = TR_new(TR_UdpSocket, TR_logger, "0.0.0.0", 5678, 0);
	TR_socketBind((TR_Socket)udp_ep_sock);
	TR_socketNonblock((TR_Socket)udp_ep_sock);
	udp_ep       = TR_new(TR_DatagramService, udp_ep_sock, protocol);

	TR_commManagerAddEndpoint(cmgr, (TR_CommEndPoint)tcp_ep);
	TR_commManagerAddEndpoint(cmgr, (TR_CommEndPoint)udp_ep);

	TR_eventDispatcherSetHeartbeat(dispatcher, 1000);
	TR_eventDispatcherStart(dispatcher);

	puts("cleanup...");

	TR_delete(cmgr);
	TR_delete(dispatcher);
	TR_delete(connector);
	TR_delete(io_handler);
	TR_delete(protocol_handler);
	TR_delete(test_handler);
	TR_delete(protocol);
	//TR_delete(ep);

	TR_eventHandlerClassCleanup(TestHandler);
	TR_eventHandlerClassCleanup(TR_ProtocolHandler);
	TR_eventHandlerClassCleanup(TR_IoHandler);
	TR_eventHandlerClassCleanup(TR_Connector);
	TR_eventHandlerClassCleanup(TR_CommManagerPoll);

	TR_cleanup();

	return 0;
}

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