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 *) |
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 }
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 }