{
Summary:
System events
## $Id: events.pas,v 1.4 2004/04/10 22:24:03 druid Exp $
}
unit events;
interface
uses
dtypes;
type
GEventHandlerFunc = function(const eventname : string; eventobject : TObject) : boolean;
var
eventList : GHashTable;
procedure registerEvent(const name : string);
procedure unregisterEvent(const name : string);
procedure registerEventHandler(const name : string; handler_func : GEventHandlerFunc);
procedure unregisterEventHandler(const name : string; handler_func : GEventHandlerFunc);
procedure raiseEvent(const name : string; eventobject : TObject);
procedure initEvents();
procedure cleanupEvents();
implementation
uses
SysUtils;
type
GEventHandler = class
func : GEventHandlerFunc;
node : GListNode;
end;
procedure registerEvent(const name : string);
var
list : GDLinkedList;
begin
list := GDLinkedList.Create();
eventList[name] := list;
end;
procedure unregisterEvent(const name : string);
var
list : GDLinkedList;
begin
list := GDLinkedList(eventList[name]);
if (list <> nil) then
begin
list.clear();
list.Free();
eventList.remove(name);
end;
end;
procedure registerEventHandler(const name : string; handler_func : GEventHandlerFunc);
var
handler : GEventHandler;
list : GDLinkedList;
begin
list := GDLinkedList(eventList[name]);
if (list = nil) then
raise Exception.Create('Unknown event ' + name)
else
begin
handler := GEventHandler.Create();
handler.func := handler_func;
handler.node := list.insertLast(handler);
end;
end;
procedure unregisterEventHandler(const name : string; handler_func : GEventHandlerFunc);
var
handler : GEventHandler;
list : GDLinkedList;
iterator : GIterator;
found : boolean;
begin
list := GDLinkedList(eventList[name]);
if (list = nil) then
raise Exception.Create('Unknown event ' + name)
else
begin
iterator := list.iterator();
found := false;
while (iterator.hasNext()) do
begin
handler := GEventHandler(iterator.next());
if (@handler.func = @handler_func) then
begin
list.remove(handler.node);
handler.Free();
found := true;
break;
end;
end;
iterator.Free();
if (not found) then
raise Exception.Create('Event handler not found for "' + name + '"');
end;
end;
procedure raiseEvent(const name : string; eventobject : TObject);
var
list : GDLinkedList;
iterator : GIterator;
handler : GEventHandler;
begin
list := GDLinkedList(eventList[name]);
if (list = nil) then
raise Exception.Create('Unknown event ' + name)
else
begin
iterator := list.iterator();
while (iterator.hasNext()) do
begin
handler := GEventHandler(iterator.next());
handler.func(name, eventobject);
end;
iterator.Free();
end;
end;
procedure initEvents();
begin
eventList := GHashTable.Create(128);
// default events
registerEvent('char-login');
registerEvent('char-logout');
registerEvent('char-look-char');
registerEvent('char-look-object');
registerEvent('char-look-room');
registerEvent('mud-boot');
registerEvent('mud-shutdown');
registerEvent('room-enter');
registerEvent('room-leave');
end;
procedure cleanupEvents();
begin
eventList.clear();
eventList.Free();
end;
end.