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