[QOF-devel] Outline of new qofevent support

Derek Atkins warlord at MIT.EDU
Sat Feb 25 16:07:18 EST 2006


Quoting Neil Williams <linux at codehelp.co.uk>:

> On Tuesday 21 February 2006 5:07 am, Derek Atkins wrote:
>> Actually, I just thought of something..  I'd like to have events that
>> have both subject AND object..  Right now we just have a Subject +
>> Verb (QofEntity + QofEventId).  I'd like to add an object, too, so we
>> could have an event Subject + Verb + Object (QofEntity + QofEventId +
>> gpointer).
>
> OK. QOF can do that.

Well, QOF would need to be modified.. but yeah.. ;)

>> The generator and consumer of the QofEventId need to
>> agree on what the object of the event is.
>
> Absolutely. This would almost certainly mean a different QofEventId for each
> type of object used and expected. That can't be resolved by QOF, it needs to
> be stated in the docs and left to the user to ensure it actually happens that
> way.

Well, maybe.   It would mean defining that a particular QofEventId when
applied to a particular QofEntityId would (or would not) imply a particular
type of argument in the callback.  Nothing says that QOF_EVENT_FOO when
applied to QofTypeFoo implies an argument of X and when applied to a 
QofTypeBar
implies an argument of Y.

Admittedly, it would be nice to standardize, but in the grand scheme of
things it's just a contract between the event generator and the event
consumer.

> Do you actually want a gpointer or would a QofEntity be a better choice?

I don't know.  I think passing gpointer is more general..  However all
the uses I have in mind only require a QofEntity (actually a QofInstance).

>> Could we add a second set of APIs that parallel the existing set
>> that let me pass an extra object back to the event handler?
>
> ... object, rather than argument, yes?

*shrugs*   The Name is unimportant to me...

>> I'd propose:
>>
>>   typedef void (*QofEventHandlerWithArg)(QofEntity*, QofEventId, gpointer);
>
> WithArg infers non-objects being passed (like a GHashTable or GList, an
> arbitrary struct / iterator, some arbitrary const gchar* or other weird bits
> of memory) - was this your intention or would this be a better, clearer, name
> base?

Actually, yes, this was my intention -- it's closer to the way g_signal
works -- g_signal lets you pass any kind of arguments back to the caller.
Indeed, you can even define signals with MULTIPLE callback arguments!
So, leaving it as a gpointer leaves it a little closer to where we'll
get to be eventually with qof2.

> QofEventHandlerWithObject
>
> Your use case certainly centres on an item that is more of an Object 
> than some
> arbitrary argument.
>
> I prefer the idea of restricting it to objects - or more precisely, a
> QofEntity.

Why this restriction?

> Maybe even use QofEventHandlerWithEntity
>
>>   void qof_event_add_handler_with_arg(QofEventHandlerWithArg);
>
> qof_event_register_handler_with_object
> or qof_event_register_handler_with_entity
> and ditto below:
>
>>   void qof_event_del_handler_with_arg(QofEventHandlerWithArg);
>
> qof_event_unregister_handler_with_object
>
>>   void qof_event_with_arg(QofEntity*, QofEventId, gpointer);
>
> qof_event_gen_with_object ?
>
>> I admit this would be a LOT easier if QOF were based on gobject and we
>> used g_signal...  Mea Culpa.
>
> Issue postponed until closer to libqof2 which in turn is certainly after G2.
>
>> What do you think?
>
> Do you need this for QOF 0.6.2 (which otherwise could be released 
> tomorrow) or
> 0.6.3 which is a likely release in the first week of April (coinciding
> possibly with 1.9.3)? (i.e. as this is something you've just recently thought
> up, is the idea due to an immediate need, educated foresight or wishlist?)
>
> (I'd like QOF to have a 5-6 week release cycle during the life of gnucash
> 1.9.x and probably beyond during the life of libqof1. There are a lot of
> issues to resolve in libqof1 and I'm tackling them one at a time. I want each
> release to only have one new format added with it's old format being
> deprecated.)

I have an immediate use for it..  I'd like to set up an event handler that
gets called whenever we add a new transaction into a particular account..
The idea is that I can attach this handler to the A/R account and whenever
a new transaction appears (or changes) I can perform business-level processing
on the transaction.  For example, I can tell whether the transaction is tied
to an invoice/lot or not, and if not I can try to figure it out or maybe
ask the user for help...

So, yes, this is something I'd like to see in 0.6.2.

-derek

-- 
       Derek Atkins, SB '93 MIT EE, SM '95 MIT Media Laboratory
       Member, MIT Student Information Processing Board  (SIPB)
       URL: http://web.mit.edu/warlord/    PP-ASEL-IA     N1NWH
       warlord at MIT.EDU                        PGP key available



More information about the gnucash-devel mailing list