[Gnucash-changes] add a foreach function to itereate over all registered classes.

Linas Vepstas linas at cvs.gnucash.org
Sun Jun 20 12:03:44 EDT 2004


Log Message:
-----------
add a foreach function to itereate over all registered classes.

Modified Files:
--------------
    gnucash/src/engine:
        qofclass.c
        qofclass.h

Revision Data
-------------
Index: qofclass.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qofclass.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -Lsrc/engine/qofclass.h -Lsrc/engine/qofclass.h -u -r1.9 -r1.10
--- src/engine/qofclass.h
+++ src/engine/qofclass.h
@@ -195,11 +195,19 @@
 QofSetterFunc qof_class_get_parameter_setter (QofIdTypeConst obj_name,
                                               const char *parameter);
 
+/** Type definition for the class callback function. */
+typedef void (*QofClassForeachCB) (QofIdTypeConst, gpointer);
+
+/** Call the callback once for each object class that is registered
+ *  with the system.  The 'user_data' is passed back to the callback.
+ */
+void qof_class_foreach (QofClassForeachCB, gpointer user_data);
+
 /** Type definition for the paramter callback function. */
 typedef void (*QofParamForeachCB) (QofParam *, gpointer user_data);
 
 /** Call the callback once for each parameter on the indicated 
- *  object class.  The 'user_data' is passed back to teh callback.
+ *  object class.  The 'user_data' is passed back to the callback.
  */
 void qof_class_param_foreach (QofIdTypeConst obj_name,
                               QofParamForeachCB, gpointer user_data);
Index: qofclass.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qofclass.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -Lsrc/engine/qofclass.c -Lsrc/engine/qofclass.c -u -r1.4 -r1.5
--- src/engine/qofclass.c
+++ src/engine/qofclass.c
@@ -33,7 +33,7 @@
 
 static short module = MOD_QUERY;
 
-static GHashTable *paramTable = NULL;
+static GHashTable *classTable = NULL;
 static GHashTable *sortTable = NULL;
 static gboolean initialized = FALSE;
 
@@ -61,13 +61,13 @@
     g_hash_table_insert (sortTable, (char *)obj_name, default_sort_function);
   }
 
-  ht = g_hash_table_lookup (paramTable, obj_name);
+  ht = g_hash_table_lookup (classTable, obj_name);
 
   /* If it doesn't already exist, create a new table for this object */
   if (!ht) 
   {
     ht = g_hash_table_new (g_str_hash, g_str_equal);
-    g_hash_table_insert (paramTable, (char *)obj_name, ht);
+    g_hash_table_insert (classTable, (char *)obj_name, ht);
   }
 
   /* At least right now, we allow dummy, paramterless objects, 
@@ -89,7 +89,7 @@
   if (initialized) return;
   initialized = TRUE;
 
-  paramTable = g_hash_table_new (g_str_hash, g_str_equal);
+  classTable = g_hash_table_new (g_str_hash, g_str_equal);
   sortTable = g_hash_table_new (g_str_hash, g_str_equal);
 }
 
@@ -99,8 +99,8 @@
   if (!initialized) return;
   initialized = FALSE;
 
-  g_hash_table_foreach_remove (paramTable, clear_table, NULL);
-  g_hash_table_destroy (paramTable);
+  g_hash_table_foreach_remove (classTable, clear_table, NULL);
+  g_hash_table_destroy (classTable);
   g_hash_table_destroy (sortTable);
 }
 
@@ -109,7 +109,7 @@
 {
   if (!obj_name) return FALSE;
 
-  if (g_hash_table_lookup (paramTable, obj_name)) return TRUE;
+  if (g_hash_table_lookup (classTable, obj_name)) return TRUE;
 
   return FALSE;
 }
@@ -123,7 +123,7 @@
   g_return_val_if_fail (obj_name, NULL);
   g_return_val_if_fail (parameter, NULL);
 
-  ht = g_hash_table_lookup (paramTable, obj_name);
+  ht = g_hash_table_lookup (classTable, obj_name);
   if (!ht)
   {
     PERR ("no object of type %s", obj_name);
@@ -188,36 +188,66 @@
 
 /* ================================================================ */
 
-struct _iterate {
+struct class_iterate {
+  QofClassForeachCB   fcn;
+  gpointer            data;
+};
+
+static void 
+class_foreach_cb (gpointer key, gpointer item, gpointer arg)
+{
+  struct class_iterate *iter = arg;
+  QofIdTypeConst id = key;
+ 
+  iter->fcn (id, iter->data);
+}
+
+void
+qof_class_foreach (QofClassForeachCB cb, gpointer user_data)
+{
+  struct class_iterate iter;
+
+  if (!cb) return;
+  if (!classTable) return;
+
+  iter.fcn = cb;
+  iter.data = user_data;
+
+  g_hash_table_foreach (classTable, class_foreach_cb, &iter);
+}
+
+/* ================================================================ */
+
+struct parm_iterate {
   QofParamForeachCB   fcn;
-  gpointer                data;
+  gpointer            data;
 };
-                                                                                
+
 static void 
-foreach_cb (gpointer key, gpointer item, gpointer arg)
+param_foreach_cb (gpointer key, gpointer item, gpointer arg)
 {
-  struct _iterate *iter = arg;
+  struct parm_iterate *iter = arg;
   QofParam *parm = item;
-                                                                                
+
   iter->fcn (parm, iter->data);
 }
 
-
 void
 qof_class_param_foreach (QofIdTypeConst obj_name,
                          QofParamForeachCB cb, gpointer user_data)
 {
-  struct _iterate iter;
+  struct parm_iterate iter;
   GHashTable *param_ht;
 
   if (!obj_name || !cb) return;
-  param_ht = g_hash_table_lookup (paramTable, obj_name);
+  if (!classTable) return;
+  param_ht = g_hash_table_lookup (classTable, obj_name);
   if (!param_ht) return;
 
   iter.fcn = cb;
   iter.data = user_data;
 
-  g_hash_table_foreach (param_ht, foreach_cb, &iter);
+  g_hash_table_foreach (param_ht, param_foreach_cb, &iter);
 }
 
 /* ============================= END OF FILE ======================== */


More information about the gnucash-changes mailing list