qofclass.c

00001 /********************************************************************\
00002  * qofclass.c -- provide QOF parameterized data objects             *
00003  * Copyright (C) 2002 Derek Atkins <warlord@MIT.EDU>                *
00004  *                                                                  *
00005  * This program is free software; you can redistribute it and/or    *
00006  * modify it under the terms of the GNU General Public License as   *
00007  * published by the Free Software Foundation; either version 2 of   *
00008  * the License, or (at your option) any later version.              *
00009  *                                                                  *
00010  * This program is distributed in the hope that it will be useful,  *
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
00013  * GNU General Public License for more details.                     *
00014  *                                                                  *
00015  * You should have received a copy of the GNU General Public License*
00016  * along with this program; if not, contact:                        *
00017  *                                                                  *
00018  * Free Software Foundation           Voice:  +1-617-542-5942       *
00019  * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
00020  * Boston, MA  02110-1301,  USA       gnu@gnu.org                   *
00021  *                                                                  *
00022 \********************************************************************/
00023 
00024 #include "config.h"
00025 
00026 #include <glib.h>
00027 
00028 #include "qof.h"
00029 #include "qofclass-p.h"
00030 
00031 static QofLogModule log_module = QOF_MOD_CLASS;
00032 
00033 static GHashTable *classTable = NULL;
00034 static GHashTable *sortTable = NULL;
00035 static gboolean initialized = FALSE;
00036 
00037 static gboolean
00038 clear_table (gpointer key __attribute__ ((unused)), gpointer value, 
00039              gpointer user_data __attribute__ ((unused)))
00040 {
00041     g_hash_table_destroy (value);
00042     return TRUE;
00043 }
00044 
00045 /* *******************************************************************/
00046 /* PRIVATE FUNCTIONS */
00047 
00048 static gboolean
00049 check_init (void)
00050 {
00051     if (initialized)
00052         return TRUE;
00053 
00054     PERR ("You must call qof_class_init() before using qof_class.");
00055     return FALSE;
00056 }
00057 
00058 void
00059 qof_class_init (void)
00060 {
00061     if (initialized)
00062         return;
00063     initialized = TRUE;
00064 
00065     classTable = g_hash_table_new (g_str_hash, g_str_equal);
00066     sortTable = g_hash_table_new (g_str_hash, g_str_equal);
00067 }
00068 
00069 void
00070 qof_class_shutdown (void)
00071 {
00072     if (!initialized)
00073         return;
00074     initialized = FALSE;
00075 
00076     g_hash_table_foreach_remove (classTable, clear_table, NULL);
00077     g_hash_table_destroy (classTable);
00078     g_hash_table_destroy (sortTable);
00079 }
00080 
00081 QofSortFunc
00082 qof_class_get_default_sort (QofIdTypeConst obj_name)
00083 {
00084     if (!obj_name)
00085         return NULL;
00086     return g_hash_table_lookup (sortTable, obj_name);
00087 }
00088 
00089 /* *******************************************************************/
00090 /* PUBLISHED API FUNCTIONS */
00091 
00092 void
00093 qof_class_register (QofIdTypeConst obj_name,
00094     QofSortFunc default_sort_function, const QofParam * params)
00095 {
00096     GHashTable *ht;
00097     int i;
00098 
00099     if (!obj_name)
00100         return;
00101     if (!check_init ())
00102         return;
00103 
00104     if (default_sort_function)
00105     {
00106         g_hash_table_insert (sortTable, (gchar *) obj_name,
00107             default_sort_function);
00108     }
00109 
00110     ht = g_hash_table_lookup (classTable, obj_name);
00111 
00112     /* If it doesn't already exist, create a new table for this object */
00113     if (!ht)
00114     {
00115         ht = g_hash_table_new (g_str_hash, g_str_equal);
00116         g_hash_table_insert (classTable, (gchar *) obj_name, ht);
00117     }
00118 
00119     /* At least right now, we allow dummy, parameterless objects,
00120      * for testing purposes.  Although I suppose that should be
00121      * an error..  */
00122     /* Now insert all the parameters */
00123     if (params)
00124     {
00125         for (i = 0; params[i].param_name; i++)
00126             g_hash_table_insert (ht,
00127                 (char *) params[i].param_name, (gpointer) & (params[i]));
00128     }
00129 }
00130 
00131 gboolean
00132 qof_class_is_registered (QofIdTypeConst obj_name)
00133 {
00134     if (!obj_name)
00135         return FALSE;
00136     if (!check_init ())
00137         return FALSE;
00138 
00139     if (g_hash_table_lookup (classTable, obj_name))
00140         return TRUE;
00141 
00142     return FALSE;
00143 }
00144 
00145 const QofParam *
00146 qof_class_get_parameter (QofIdTypeConst obj_name, const gchar *parameter)
00147 {
00148     GHashTable *ht;
00149 
00150     g_return_val_if_fail (obj_name, NULL);
00151     g_return_val_if_fail (parameter, NULL);
00152     if (!check_init ())
00153         return NULL;
00154 
00155     ht = g_hash_table_lookup (classTable, obj_name);
00156     if (!ht)
00157     {
00158         PWARN ("no object of type %s", obj_name);
00159         return NULL;
00160     }
00161 
00162     return (g_hash_table_lookup (ht, parameter));
00163 }
00164 
00165 QofAccessFunc
00166 qof_class_get_parameter_getter (QofIdTypeConst obj_name,
00167     const gchar *parameter)
00168 {
00169     const QofParam *prm;
00170 
00171     g_return_val_if_fail (obj_name, NULL);
00172     g_return_val_if_fail (parameter, NULL);
00173 
00174     prm = qof_class_get_parameter (obj_name, parameter);
00175     if (prm)
00176         return prm->param_getfcn;
00177 
00178     return NULL;
00179 }
00180 
00181 QofSetterFunc
00182 qof_class_get_parameter_setter (QofIdTypeConst obj_name,
00183     const gchar *parameter)
00184 {
00185     const QofParam *prm;
00186 
00187     g_return_val_if_fail (obj_name, NULL);
00188     g_return_val_if_fail (parameter, NULL);
00189 
00190     prm = qof_class_get_parameter (obj_name, parameter);
00191     if (prm)
00192         return prm->param_setfcn;
00193 
00194     return NULL;
00195 }
00196 
00197 QofType
00198 qof_class_get_parameter_type (QofIdTypeConst obj_name,
00199     const gchar *param_name)
00200 {
00201     const QofParam *prm;
00202 
00203     if (!obj_name || !param_name)
00204         return NULL;
00205 
00206     prm = qof_class_get_parameter (obj_name, param_name);
00207     if (!prm)
00208         return NULL;
00209 
00210     return (prm->param_type);
00211 }
00212 
00213 /* ================================================================ */
00214 
00215 struct class_iterate
00216 {
00217     QofClassForeachCB fcn;
00218     gpointer data;
00219 };
00220 
00221 static void
00222 class_foreach_cb (gpointer key __attribute__ ((unused)), 
00223                   gpointer item __attribute__ ((unused)), 
00224                   gpointer arg)
00225 {
00226     struct class_iterate *qiter = arg;
00227     QofIdTypeConst id = key;
00228 
00229     qiter->fcn (id, qiter->data);
00230 }
00231 
00232 void
00233 qof_class_foreach (QofClassForeachCB cb, gpointer user_data)
00234 {
00235     struct class_iterate qiter;
00236 
00237     if (!cb)
00238         return;
00239     if (!classTable)
00240         return;
00241 
00242     qiter.fcn = cb;
00243     qiter.data = user_data;
00244 
00245     g_hash_table_foreach (classTable, class_foreach_cb, &qiter);
00246 }
00247 
00248 /* ================================================================ */
00249 
00250 struct parm_iterate
00251 {
00252     QofParamForeachCB fcn;
00253     gpointer data;
00254 };
00255 
00256 static void
00257 param_foreach_cb (gpointer key __attribute__ ((unused)), 
00258                   gpointer item, gpointer arg)
00259 {
00260     struct parm_iterate *qiter = arg;
00261     QofParam *parm = item;
00262 
00263     qiter->fcn (parm, qiter->data);
00264 }
00265 
00266 void
00267 qof_class_param_foreach (QofIdTypeConst obj_name,
00268     QofParamForeachCB cb, gpointer user_data)
00269 {
00270     struct parm_iterate qiter;
00271     GHashTable *param_ht;
00272 
00273     if (!obj_name || !cb)
00274         return;
00275     if (!classTable)
00276         return;
00277     param_ht = g_hash_table_lookup (classTable, obj_name);
00278     if (!param_ht)
00279         return;
00280 
00281     qiter.fcn = cb;
00282     qiter.data = user_data;
00283 
00284     g_hash_table_foreach (param_ht, param_foreach_cb, &qiter);
00285 }
00286 
00287 struct param_ref_list
00288 {
00289     GList *list;
00290 };
00291 
00292 static void
00293 find_reference_param_cb (QofParam * param, gpointer user_data)
00294 {
00295     struct param_ref_list *b;
00296 
00297     b = (struct param_ref_list *) user_data;
00298     if ((param->param_getfcn == NULL) || (param->param_setfcn == NULL))
00299         return;
00300     if (0 == safe_strcmp (param->param_type, QOF_TYPE_STRING))
00301         return;
00302     if (0 == safe_strcmp (param->param_type, QOF_TYPE_NUMERIC))
00303         return;
00304     if (0 == safe_strcmp (param->param_type, QOF_TYPE_TIME))
00305         return;
00306 #ifndef QOF_DISABLE_DEPRECATED
00307     if (0 == safe_strcmp (param->param_type, QOF_TYPE_DATE))
00308         return;
00309 #endif
00310     if (0 == safe_strcmp (param->param_type, QOF_TYPE_CHAR))
00311         return;
00312     if (0 == safe_strcmp (param->param_type, QOF_TYPE_DEBCRED))
00313         return;
00314     if (0 == safe_strcmp (param->param_type, QOF_TYPE_GUID))
00315         return;
00316     if (0 == safe_strcmp (param->param_type, QOF_TYPE_INT32))
00317         return;
00318     if (0 == safe_strcmp (param->param_type, QOF_TYPE_INT64))
00319         return;
00320     if (0 == safe_strcmp (param->param_type, QOF_TYPE_DOUBLE))
00321         return;
00322     if (0 == safe_strcmp (param->param_type, QOF_TYPE_KVP))
00323         return;
00324     if (0 == safe_strcmp (param->param_type, QOF_TYPE_BOOLEAN))
00325         return;
00326     if (0 == safe_strcmp (param->param_type, QOF_ID_BOOK))
00327         return;
00328     b->list = g_list_append (b->list, param);
00329 }
00330 
00331 GList *
00332 qof_class_get_referenceList (QofIdTypeConst type)
00333 {
00334     GList *ref_list;
00335     struct param_ref_list b;
00336 
00337     ref_list = NULL;
00338     b.list = NULL;
00339     qof_class_param_foreach (type, find_reference_param_cb, &b);
00340     ref_list = g_list_copy (b.list);
00341     return ref_list;
00342 }
00343 
00344 
00345 /* ============================= END OF FILE ======================== */

Generated on Thu Jan 31 22:50:25 2008 for QOF by  doxygen 1.5.4