event_dispatcher_register_handler.c 1.96 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/>.
 */

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

#include "tr/event_dispatcher.h"
#include "tr/event_handler.h"

static
void
doRegister(const void * _node, const void * data)
{
	TR_HashValue       node            = (TR_HashValue)_node;
	TR_EventDispatcher dispatcher      = ((void **)data)[0];
	TR_EventHandler    current_handler = ((void **)data)[1];
	TR_HashValue       handler_list_hv;
	TR_List            handler_list;

	handler_list_hv = TR_hashGetByVal(dispatcher->handler, node->hash);

	if (handler_list_hv) {
		handler_list = *(TR_List *)handler_list_hv->value;
	} else {
		handler_list            = TR_new(TR_Queue);
		handler_list->free_msgs = 0;
		// TODO change TR_Queue to TR_Dynarray as this is no queue.
		handler_list_hv         = TR_new(
				TR_HashValue,
				node->key,
				node->nkey,
				&handler_list,
				sizeof(TR_List));
		TR_hashAdd(dispatcher->handler, handler_list_hv);
	}

	TR_listPut(handler_list, current_handler);
}

void
TR_eventDispatcherRegisterHandler(
		TR_EventDispatcher this, TR_EventHandler handler)
{
	void * cb_data[] = { this, handler };

	TR_hashEach(
			TR_CLASSVARS(TR_EventHandler, TR_GET_CLASS(handler))->event_methods,
			cb_data,
			doRegister);
	TR_eventHandlerSetDispatcher(handler, this);
}

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