event_handler.h 2.75 KB
/**
 * \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_EVENT_HANDLER_H__
#define __TR_EVENT_HANDLER_H__

#include <sys/types.h>
#include <pthread.h>

#include "trbase.h"
#include "trdata.h"

#include "tr/event.h"
#include "tr/event_subject.h"

TR_CLASS(TR_EventHandler);

#include "tr/event_dispatcher.h"

typedef TR_EventDone (* TR_EventMethod_fptr)(TR_EventHandler, TR_Event);

TR_CLASS(TR_EventHandler) {
	TR_EventDispatcher dispatcher[10];
	size_t             ndispatcher;
};
TR_INSTANCE_INIT(TR_EventHandler);
TR_CLASSVARS_DECL(TR_EventHandler) {
	TR_Hash event_methods;
};

void         TR_eventHandlerSetDispatcher(TR_EventHandler, TR_EventDispatcher);
int          TR_eventHandlerIssueEvent(TR_EventHandler, TR_Event);
TR_EventDone TR_eventHandlerHandleEvent(TR_EventHandler, TR_Event);

#define TR_eventHandlerClassCleanup(cname) \
	(TR__eventHandlerClassCleanup(TR_CLASS_BY_NAME(cname)))
void TR__eventHandlerClassCleanup(TR_class_ptr);

#define TR_EVENT_HANDLER_SET_METHOD(cls, subject, id, method)            \
	do {                                                                 \
		intptr_t            key        = TR_eventSubjectId(subject, id); \
		TR_EventMethod_fptr event_func = (method);                       \
		TR_hashAdd(                                                      \
				TR_CLASSVARS(TR_EventHandler, cls)->event_methods,       \
				TR_new(                                                  \
					TR_HashValue,                                        \
					&key,                                                \
					sizeof(intptr_t),                                    \
					&event_func,                                         \
					sizeof(TR_EventMethod_fptr)));                       \
	} while(0)

#define TR_INIT_HANDLER(cname)                                                      \
	TR_INSTANCE(TR_Tree, cname##EventMethodsTree, NULL, PTHREAD_MUTEX_INITIALIZER); \
	TR_INSTANCE(TR_Hash, cname##EventMethods, &(_##cname##EventMethodsTree.data), 0)

#define TR_HANDLER_CVARS(cname) &(_##cname##EventMethods.data)

#endif // __TR_EVENT_HANDLER_H__

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