GLib GObjects
[Object: Dynamic Object Class Framework]


Detailed Description

The API defined in this file allows a user to register any GLib GObject (and any object derived from one, e.g. GTK/Gnome) with the QOF system, as a QOF Object Class. This allows the QOF Query routines to be used to search over collections of GObjects.

XXX Only GObject properties are searchable, data and other hanging off the GObject is not. Fix this. This needs fixing.


Files

file  qofgobj.h
 QOF to GLib GObject mapping.

Functions

void qof_gobject_init (void)
void qof_gobject_shutdown (void)
void qof_gobject_register (QofType type, GObjectClass *obclass)
void qof_gobject_register_instance (QofBook *book, QofType, GObject *)


Function Documentation

void qof_gobject_init void   ) 
 

Initalize and shut down this subsystem.

Definition at line 44 of file qofgobj.c.

00045 {
00046   if (initialized) return;
00047   initialized = TRUE;
00048                                                                                 
00049   // gobjectClassTable = g_hash_table_new (g_str_hash, g_str_equal);
00050 
00051   /* Init the other subsystems that we need */
00052   qof_object_initialize();
00053   qof_query_init ();
00054 }

void qof_gobject_register QofType  type,
GObjectClass *  obclass
 

Register a GObject class with the QOF subsystem. Doing this will make the properties associated with this GObject searchable using the QOF subsystem.

The QofType can be any string you desire, although typically you might want to set it to G_OBJECT_CLASS_NAME() of the object class. Note that this type will become the name of the "table" that is searched by SQL queries: e.g. in order to be able to say "SELECT * FROM MyStuff;" you must first say: qof_gobject_register ("MyStuff", gobj_class);

Definition at line 216 of file qofgobj.c.

00217 {
00218   int i;
00219   int j;
00220   QofParam *qof_param_list, *qpar;
00221   QofObject *class_def;
00222   GParamSpec **prop_list, *gparam;
00223   guint n_props;
00224 
00225   /* Get the GObject properties, convert to QOF properties */
00226   prop_list = g_object_class_list_properties (obclass, &n_props);
00227 
00228   qof_param_list = g_new0 (QofParam, n_props);
00229   paramList = g_slist_prepend (paramList, qof_param_list);
00230 
00231   PINFO ("object %s has %d props", e_type, n_props);
00232   j=0;
00233   for (i=0; i<n_props; i++)
00234   {
00235     gparam = prop_list[i];
00236     qpar = &qof_param_list[j];
00237 
00238     PINFO ("param %d %s is type %s", 
00239           i, gparam->name, G_PARAM_SPEC_TYPE_NAME(gparam));
00240 
00241     qpar->param_name = g_param_spec_get_name (gparam);
00242     qpar->param_getfcn = (QofAccessFunc)qof_gobject_getter;
00243     qpar->param_setfcn = NULL;
00244     qpar->param_userdata = gparam;
00245     if ((G_IS_PARAM_SPEC_INT(gparam))  ||
00246         (G_IS_PARAM_SPEC_UINT(gparam)) ||
00247         (G_IS_PARAM_SPEC_ENUM(gparam)) ||
00248         (G_IS_PARAM_SPEC_FLAGS(gparam)))
00249     {
00250       qpar->param_type = QOF_TYPE_INT32;
00251       j++;
00252     } 
00253     else
00254     if ((G_IS_PARAM_SPEC_INT64(gparam)) ||
00255         (G_IS_PARAM_SPEC_UINT64(gparam)))
00256     {
00257       qpar->param_type = QOF_TYPE_INT64;
00258       j++;
00259     } 
00260     else
00261     if (G_IS_PARAM_SPEC_BOOLEAN(gparam))
00262     {
00263       qpar->param_type = QOF_TYPE_BOOLEAN;
00264       j++;
00265     } 
00266     else
00267     if (G_IS_PARAM_SPEC_STRING(gparam))
00268     {
00269       qpar->param_type = QOF_TYPE_STRING;
00270       j++;
00271     } 
00272     else
00273     if ((G_IS_PARAM_SPEC_POINTER(gparam)) ||
00274         (G_IS_PARAM_SPEC_OBJECT(gparam)))
00275     {
00276       /* No-op, silently ignore.  Someday we should handle this ...  */
00277     } 
00278     else
00279     if ((G_IS_PARAM_SPEC_FLOAT(gparam)) ||
00280         (G_IS_PARAM_SPEC_DOUBLE(gparam)))
00281     {
00282       qpar->param_getfcn = (QofAccessFunc) qof_gobject_double_getter;
00283       qpar->param_type = QOF_TYPE_DOUBLE;
00284       j++;
00285     } 
00286     else
00287     if (G_IS_PARAM_SPEC_CHAR(gparam))
00288     {
00289       qpar->param_type = QOF_TYPE_CHAR;
00290       j++;
00291     } 
00292     else
00293     {
00294       PWARN ("Unknown/unhandled parameter type %s on %s:%s\n", 
00295       G_PARAM_SPEC_TYPE_NAME(gparam), e_type, qpar->param_name);
00296     }
00297   }
00298 
00299   /* NULL-terminated list! */
00300   qof_param_list[j].param_type = NULL;
00301 
00302   qof_class_register (e_type, NULL, qof_param_list);
00303 
00304   /* ------------------------------------------------------ */
00305    /* Now do the class itself */
00306   class_def = g_new0 (QofObject, 1);
00307   classList = g_slist_prepend (classList, class_def);
00308 
00309   class_def->interface_version = QOF_OBJECT_VERSION;
00310   class_def->e_type = e_type;
00311   /* We could let the user specify a "nick" here, but
00312    * the actual class name seems reasonable, e.g. for debugging. */
00313   class_def->type_label = G_OBJECT_CLASS_NAME (obclass);
00314   class_def->create = NULL;
00315   class_def->book_begin = NULL;
00316   class_def->book_end = NULL;
00317   class_def->is_dirty = NULL;
00318   class_def->mark_clean = NULL;
00319   class_def->foreach = qof_gobject_foreach;
00320   class_def->printable = NULL;
00321   class_def->version_cmp = NULL;
00322  
00323   qof_object_register (class_def);
00324 }

void qof_gobject_register_instance QofBook book,
QofType  ,
GObject * 
 

Register an instance of a GObject with the QOF subsystem.

The QofType can be any string you desire, although typically you might want to set it to G_OBJECT_CLASS_NAME() of the object class. Note that this type will become the name of the "table" that is searched by SQL queries: e.g. in order to be able to say "SELECT * FROM MyStuff;" you must first say: qof_gobject_register_instance (book, "MyStuff", obj);

The 'book' argument specifies an anchor point for the collection of all of the registered instances. By working with disjoint books, you can have multiple disjoint searchable sets of objects.

Definition at line 85 of file qofgobj.c.

00086 {
00087   QofCollection *coll;
00088   GSList *instance_list;
00089   
00090   if (!book || !type) return;
00091 
00092   coll = qof_book_get_collection (book, type);
00093 
00094   instance_list = qof_collection_get_data (coll);
00095   instance_list = g_slist_prepend (instance_list, gob);
00096   qof_collection_set_data (coll, instance_list);
00097 }


Generated on Fri Oct 21 15:50:00 2005 for QOF by  doxygen 1.4.5