#include #include #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 ep; TR_TcpSocket 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); ep_sock = TR_new(TR_TcpSocket, TR_logger, "0.0.0.0", 5678, 0); ep = TR_new(TR_ConnEntryPoint, ep_sock, protocol); TR_commManagerAddEndpoint(cmgr, (TR_CommEndPoint)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: