To put it differently, a QOF class is a set of parameter getters and setters that are associated with an object type. Given a pointer to some thing, the setters and getters can be used to get and set values out of that thing. Note that the pointer to "some thing" need not be a pointer to a QOF Entity or Instance (although QOF classes are more interesting when used with Entities/Instances). What "some thing" is defined entirely by the programmer declaring a new QOF Class.
Because a QOF Class associates getters and setters with a type, one can then ask, at run time, what parameters are associated with a given type, even if those parameters were not known at compile time. Thus, a QOF Class is sort-of like a DynAny implementation. QOF classes can be used to provide "object introspection", i.e. asking object to describe itself.
The QOF Query subsystem depends on QOF classes having been declared; the Query uses the getters to get values associated with particular instances.
A QofAccessFunc or QofSetterFunc do not need to be public functions, if you need to add functions to an object with an established API, define the additional QOF routines as static. Only the register routine needs to be public.
Files | |
| file | qofclass.h |
| API for registering paramters on objects. | |
Data Structures | |
| struct | _QofParam |
Core types | |
| Core data types for objects that can be used in parameters. Note that QofIdTypes may also be used and will create a single reference between two known objects. | |
| #define | QOF_TYPE_STRING "string" |
| #define | QOF_TYPE_DATE "date" |
| #define | QOF_TYPE_NUMERIC "numeric" |
| #define | QOF_TYPE_DEBCRED "debcred" |
| #define | QOF_TYPE_GUID "guid" |
| #define | QOF_TYPE_INT32 "gint32" |
| #define | QOF_TYPE_INT64 "gint64" |
| #define | QOF_TYPE_DOUBLE "double" |
| #define | QOF_TYPE_BOOLEAN "boolean" |
| #define | QOF_TYPE_KVP "kvp" |
| #define | QOF_TYPE_CHAR "character" |
| #define | QOF_TYPE_COLLECT "collection" |
Defines | |
| #define | QOF_MOD_CLASS "qof-class" |
Typedefs | |
| typedef const char * | QofType |
| typedef _QofParam | QofParam |
| typedef gpointer(* | QofAccessFunc )(gpointer object, const QofParam *param) |
| typedef void(* | QofSetterFunc )(gpointer, gpointer) |
| typedef int(* | QofSortFunc )(gpointer, gpointer) |
| typedef void(* | QofClassForeachCB )(QofIdTypeConst, gpointer) |
| typedef void(* | QofParamForeachCB )(QofParam *, gpointer user_data) |
Functions | |
| void | qof_class_register (QofIdTypeConst obj_name, QofSortFunc default_sort_fcn, const QofParam *params) |
| gboolean | qof_class_is_registered (QofIdTypeConst obj_name) |
| QofType | qof_class_get_parameter_type (QofIdTypeConst obj_name, const char *param_name) |
| const QofParam * | qof_class_get_parameter (QofIdTypeConst obj_name, const char *parameter) |
| QofAccessFunc | qof_class_get_parameter_getter (QofIdTypeConst obj_name, const char *parameter) |
| QofSetterFunc | qof_class_get_parameter_setter (QofIdTypeConst obj_name, const char *parameter) |
| void | qof_class_foreach (QofClassForeachCB, gpointer user_data) |
| void | qof_class_param_foreach (QofIdTypeConst obj_name, QofParamForeachCB, gpointer user_data) |
| GList * | qof_class_get_referenceList (QofIdTypeConst type) |
| List of the parameters that could be references. | |
|
|
secondary collections are used for one-to-many references between entities and are implemented using QofCollection. These are NOT the same as the main collections in the QofBook.
QOF_TYPE_COLLECT has two functions, both related to one-to-many links:
If the set function can handle it, it could also be used for true one-to-many links: one object linked to many entities of many types. n.b. Always subject to each collection holding only one type at runtime. (otherwise use books). Definition at line 96 of file qofclass.h. |
|
|
The QofAccessFunc defines an arbitrary function pointer for access functions. This is needed because C doesn't have templates, so we just cast a lot. Real functions must be of the form: param_type getter_func (object_type *self); or param_type getter_func (object_type *self, QofParam *param); The additional argument 'param' allows generic getter functions to be implemented, because this argument provides for a way to identify the expected getter_func return type at runtime. It also provides a place for the user to hang additional user-defined data. Definition at line 145 of file qofclass.h. |
|
|
Type definition for the class callback function. Definition at line 241 of file qofclass.h. |
|
|
Type definition for the paramter callback function. Definition at line 249 of file qofclass.h. |
|
|
The QofSetterFunc defines an function pointer for parameter setters. Real functions must be of the form: void setter_func (object_type *self, param_type *param); Definition at line 152 of file qofclass.h. |
|
|
This function is the default sort function for a particular object type Definition at line 181 of file qofclass.h. |
|
|
Type of Paramters (String, Date, Numeric, GUID, etc.) Definition at line 126 of file qofclass.h. |
|
||||||||||||
|
Call the callback once for each object class that is registered with the system. The 'user_data' is passed back to the callback. Definition at line 206 of file qofclass.c. 00207 { 00208 struct class_iterate iter; 00209 00210 if (!cb) return; 00211 if (!classTable) return; 00212 00213 iter.fcn = cb; 00214 iter.data = user_data; 00215 00216 g_hash_table_foreach (classTable, class_foreach_cb, &iter); 00217 }
|
|
||||||||||||
|
Return the registered Parameter Definition for the requested parameter Definition at line 118 of file qofclass.c. 00120 { 00121 GHashTable *ht; 00122 00123 g_return_val_if_fail (obj_name, NULL); 00124 g_return_val_if_fail (parameter, NULL); 00125 00126 ht = g_hash_table_lookup (classTable, obj_name); 00127 if (!ht) 00128 { 00129 PWARN ("no object of type %s", obj_name); 00130 return NULL; 00131 } 00132 00133 return (g_hash_table_lookup (ht, parameter)); 00134 }
|
|
||||||||||||
|
Return the object's parameter getter function Definition at line 137 of file qofclass.c. 00139 { 00140 const QofParam *prm; 00141 00142 g_return_val_if_fail (obj_name, NULL); 00143 g_return_val_if_fail (parameter, NULL); 00144 00145 prm = qof_class_get_parameter (obj_name, parameter); 00146 if (prm) 00147 return prm->param_getfcn; 00148 00149 return NULL; 00150 }
|
|
||||||||||||
|
Return the object's parameter setter function Definition at line 153 of file qofclass.c. 00155 { 00156 const QofParam *prm; 00157 00158 g_return_val_if_fail (obj_name, NULL); 00159 g_return_val_if_fail (parameter, NULL); 00160 00161 prm = qof_class_get_parameter (obj_name, parameter); 00162 if (prm) 00163 return prm->param_setfcn; 00164 00165 return NULL; 00166 }
|
|
||||||||||||
|
Return the core datatype of the specified object's parameter Definition at line 169 of file qofclass.c. 00171 { 00172 const QofParam *prm; 00173 00174 if (!obj_name || !param_name) return NULL; 00175 00176 prm = qof_class_get_parameter (obj_name, param_name); 00177 if (!prm) return NULL; 00178 00179 return (prm->param_type); 00180 }
|
|
|
List of the parameters that could be references. Simple check to return a GList of all parameters of this object type that are not known QOF data types. Used for partial QofBook support, see QofEntityReference Definition at line 281 of file qofclass.c. 00282 { 00283 GList *ref_list; 00284 struct param_ref_list b; 00285 00286 ref_list = NULL; 00287 b.list = NULL; 00288 qof_class_param_foreach(type, find_reference_param_cb, &b); 00289 ref_list = g_list_copy(b.list); 00290 return ref_list; 00291 }
|
|
|
Return true if the the indicated type is registered, else return FALSE. Definition at line 108 of file qofclass.c. 00109 { 00110 if (!obj_name) return FALSE; 00111 00112 if (g_hash_table_lookup (classTable, obj_name)) return TRUE; 00113 00114 return FALSE; 00115 }
|
|
||||||||||||||||
|
Call the callback once for each parameter on the indicated object class. The 'user_data' is passed back to the callback. Definition at line 236 of file qofclass.c. 00238 { 00239 struct parm_iterate iter; 00240 GHashTable *param_ht; 00241 00242 if (!obj_name || !cb) return; 00243 if (!classTable) return; 00244 param_ht = g_hash_table_lookup (classTable, obj_name); 00245 if (!param_ht) return; 00246 00247 iter.fcn = cb; 00248 iter.data = user_data; 00249 00250 g_hash_table_foreach (param_ht, param_foreach_cb, &iter); 00251 }
|
|
||||||||||||||||
|
This function registers a new object class with the Qof subsystem. In particular, it registers the set of setters and getters for controlling the object. The getters are typically used by the query subsystem to query type specific data. Note that there is no particular requirement for there to be a setter for every getter or even vice-versa, nor is there any requirement for these to map 'cleanly' or orthogonally to the underlying object. The parameters are really just a set of value setting and getting routines. The "params" argument must be a NULL-terminated array of QofParam. It may be NULL if there are no parameters to be registered. Definition at line 50 of file qofclass.c. 00053 { 00054 GHashTable *ht; 00055 int i; 00056 00057 if (!obj_name) return; 00058 00059 if (default_sort_function) 00060 { 00061 g_hash_table_insert (sortTable, (char *)obj_name, default_sort_function); 00062 } 00063 00064 ht = g_hash_table_lookup (classTable, obj_name); 00065 00066 /* If it doesn't already exist, create a new table for this object */ 00067 if (!ht) 00068 { 00069 ht = g_hash_table_new (g_str_hash, g_str_equal); 00070 g_hash_table_insert (classTable, (char *)obj_name, ht); 00071 } 00072 00073 /* At least right now, we allow dummy, parameterless objects, 00074 * for testing purposes. Although I suppose that should be 00075 * an error.. */ 00076 /* Now insert all the parameters */ 00077 if (params) 00078 { 00079 for (i = 0; params[i].param_name; i++) 00080 g_hash_table_insert (ht, 00081 (char *)params[i].param_name, 00082 (gpointer)&(params[i])); 00083 } 00084 }
|
1.4.5