[Opensim-dev] [Opensim-commits] r8496 - in trunk/OpenSim/Region: CoreModules/Avatar/InstantMessage Framework/Interfaces
Justin Clark-Casey
jjustincc at googlemail.com
Thu Feb 19 16:34:43 UTC 2009
Melanie wrote:
> I see an issue there.
>
> Currently we use simple events. AN event calls all it's handlers in
> no particular order, and if the handler is defined as having a
> return value, the value returned from the event invocation is the
> return value of the last handler, whichever that happened to be.
> There are no guarantees as to which handler runs first, although I
> know that both current implementations call the handler in the order
> they were registered. This behavior can not be depended upon.
Ah good point. I didn't realize that preserving registration order as call order wasn't part of the standard.
>
> So, to make this work with return values, it would require a huge
> code mess (like Scene.Permissions), with a boatload of code written
> for each event, or, if it's done through generics or dictionaries, a
> severe performance hit.
>
> Therefore, despite my prior +1 to the concept as such, it's not
> doable in that way. There has to be a way, there always is. It just
> needs to be found.
>
> I think it could be done by creating a new class, ModuleEvent<T>. T
> would be the delegate type, so you would instantiate the class in
> EventManager like so:
>
> public delegate bool DoSomethingDelegate(whatever parms);
>
> public static ModuleEvent<DoSomethingDelegate> DoSomething;
>
> and used like so:
>
> DoSomething.AddHandler(T);
> DoSomething.RemoveHandler(T);
>
> DoSomething.Handler(whatever parms);
>
> where Handler is public T Handler {get;}
>
> Would that be feasible?
>
> The point is to reduce implementing a new event to adding 2 lines,
> rather than 20.
>
> This intrigues me, I'm going to try that :)
Sounds like a good thing to explore :)
>
> Melanie
>
>
> Justin Clark-Casey wrote:
>> mw at opensimulator.org wrote:
>>> Author: mw
>>> Date: 2009-02-19 04:38:17 -0800 (Thu, 19 Feb 2009)
>>> New Revision: 8496
>>>
>>> Modified:
>>> trunk/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
>>> trunk/OpenSim/Region/Framework/Interfaces/IMessageTransferModule.cs
>>> Log:
>>> reverted last revision, until we decide how to handle capturing IM's
>> mw, was this in support of the jabber/xmpp bridge that you've coded?
>>
>> If so, I encountered a similar problem while doing the parallel selves message bridge. My 'solution' was to entirely
>> replace the MessageTransfer (and chat) modules, which is just nasty.
>>
>> My thoughts for a long term solution were to
>>
>> a) Make some event calls such as those on EventManager.OnIncomingInstantMessage require a boolean to be returned by each
>> call (which I believe is possible in c#). This boolean would signal that the message has already been completely
>> handled, and that it shouldn't be passed on to other modules.
>>
>> b) Define an 'order' in which modules are loaded in some config file.
>>
>> With these two things, an xmpp bridge module could be loaded before the 'ordinary' im module. If it gets an incoming im
>> which it can handle, then it handles it and returns true (to signal that it shouldn't be passed on to any other module).
>> If it can't handle it then it simply returns false and the message goes through to the next module on the list (in
>> this case, the 'ordinary' module).
>>
>> I like this solution because I think that it allows composibility - you can load lots of different
>> OnIncomingInstantMessage handling modules without any of them having to be aware of any other.
>>
>> What do you (or others) think? Are there better approaches?
>>
>
> _______________________________________________
> Opensim-dev mailing list
> Opensim-dev at lists.berlios.de
> https://lists.berlios.de/mailman/listinfo/opensim-dev
>
--
justincc
Justin Clark-Casey
http://justincc.wordpress.com
More information about the Opensim-dev
mailing list