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 46 of file qofgobj.c.

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

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 218 of file qofgobj.c.

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

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 87 of file qofgobj.c.

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


Generated on Fri May 12 18:00:36 2006 for QOF by  doxygen 1.4.4