GLib GObjects
[Object: Describing data structure.]


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)
00049         return;
00050     initialized = TRUE;
00051 
00052     // gobjectClassTable = g_hash_table_new (g_str_hash, g_str_equal);
00053 
00054     /* Init the other subsystems that we need */
00055     qof_object_initialize ();
00056     qof_query_init ();
00057 }

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

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

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

00092 {
00093     QofCollection *coll;
00094     GSList *instance_list;
00095 
00096     if (!book || !type)
00097         return;
00098 
00099     coll = qof_book_get_collection (book, type);
00100 
00101     instance_list = qof_collection_get_data (coll);
00102     instance_list = g_slist_prepend (instance_list, gob);
00103     qof_collection_set_data (coll, instance_list);
00104 }


Generated on Sat Apr 21 11:41:21 2007 for QOF by  doxygen 1.5.1