00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "config.h"
00026
00027 #include <glib.h>
00028
00029 #include "qof.h"
00030 #include "qofclass-p.h"
00031
00032 static QofLogModule log_module = QOF_MOD_CLASS;
00033
00034 static GHashTable *classTable = NULL;
00035 static GHashTable *sortTable = NULL;
00036 static gboolean initialized = FALSE;
00037
00038 static gboolean
00039 clear_table (gpointer key __attribute__ ((unused)), gpointer value,
00040 gpointer user_data __attribute__ ((unused)))
00041 {
00042 g_hash_table_destroy (value);
00043 return TRUE;
00044 }
00045
00046
00047
00048
00049 static gboolean
00050 check_init (void)
00051 {
00052 if (initialized)
00053 return TRUE;
00054
00055 PERR ("You must call qof_class_init() before using qof_class.");
00056 return FALSE;
00057 }
00058
00059 void
00060 qof_class_init (void)
00061 {
00062 if (initialized)
00063 return;
00064 initialized = TRUE;
00065
00066 classTable = g_hash_table_new (g_str_hash, g_str_equal);
00067 sortTable = g_hash_table_new (g_str_hash, g_str_equal);
00068 }
00069
00070 void
00071 qof_class_shutdown (void)
00072 {
00073 if (!initialized)
00074 return;
00075 initialized = FALSE;
00076
00077 g_hash_table_foreach_remove (classTable, clear_table, NULL);
00078 g_hash_table_destroy (classTable);
00079 g_hash_table_destroy (sortTable);
00080 }
00081
00082 QofSortFunc
00083 qof_class_get_default_sort (QofIdTypeConst obj_name)
00084 {
00085 if (!obj_name)
00086 return NULL;
00087 return g_hash_table_lookup (sortTable, obj_name);
00088 }
00089
00090
00091
00092
00093 void
00094 qof_class_register (QofIdTypeConst obj_name,
00095 QofSortFunc default_sort_function, const QofParam * params)
00096 {
00097 GHashTable *ht;
00098 int i;
00099
00100 if (!obj_name)
00101 return;
00102 if (!check_init ())
00103 return;
00104
00105 if (default_sort_function)
00106 {
00107 g_hash_table_insert (sortTable, (gchar *) obj_name,
00108 default_sort_function);
00109 }
00110
00111 ht = g_hash_table_lookup (classTable, obj_name);
00112
00113
00114 if (!ht)
00115 {
00116 ht = g_hash_table_new (g_str_hash, g_str_equal);
00117 g_hash_table_insert (classTable, (gchar *) obj_name, ht);
00118 }
00119
00120
00121
00122
00123
00124 if (params)
00125 {
00126 for (i = 0; params[i].param_name; i++)
00127 g_hash_table_insert (ht,
00128 (char *) params[i].param_name, (gpointer) & (params[i]));
00129 }
00130 }
00131
00132 gboolean
00133 qof_class_is_registered (QofIdTypeConst obj_name)
00134 {
00135 if (!obj_name)
00136 return FALSE;
00137 if (!check_init ())
00138 return FALSE;
00139
00140 if (g_hash_table_lookup (classTable, obj_name))
00141 return TRUE;
00142
00143 return FALSE;
00144 }
00145
00146 const QofParam *
00147 qof_class_get_parameter (QofIdTypeConst obj_name, const gchar *parameter)
00148 {
00149 GHashTable *ht;
00150
00151 g_return_val_if_fail (obj_name, NULL);
00152 g_return_val_if_fail (parameter, NULL);
00153 if (!check_init ())
00154 return NULL;
00155
00156 ht = g_hash_table_lookup (classTable, obj_name);
00157 if (!ht)
00158 {
00159 PWARN ("no object of type %s", obj_name);
00160 return NULL;
00161 }
00162
00163 return (g_hash_table_lookup (ht, parameter));
00164 }
00165
00166 QofAccessFunc
00167 qof_class_get_parameter_getter (QofIdTypeConst obj_name,
00168 const gchar *parameter)
00169 {
00170 const QofParam *prm;
00171
00172 g_return_val_if_fail (obj_name, NULL);
00173 g_return_val_if_fail (parameter, NULL);
00174
00175 prm = qof_class_get_parameter (obj_name, parameter);
00176 if (prm)
00177 return prm->param_getfcn;
00178
00179 return NULL;
00180 }
00181
00182 QofSetterFunc
00183 qof_class_get_parameter_setter (QofIdTypeConst obj_name,
00184 const gchar *parameter)
00185 {
00186 const QofParam *prm;
00187
00188 g_return_val_if_fail (obj_name, NULL);
00189 g_return_val_if_fail (parameter, NULL);
00190
00191 prm = qof_class_get_parameter (obj_name, parameter);
00192 if (prm)
00193 return prm->param_setfcn;
00194
00195 return NULL;
00196 }
00197
00198 QofType
00199 qof_class_get_parameter_type (QofIdTypeConst obj_name,
00200 const gchar *param_name)
00201 {
00202 const QofParam *prm;
00203
00204 if (!obj_name || !param_name)
00205 return NULL;
00206
00207 prm = qof_class_get_parameter (obj_name, param_name);
00208 if (!prm)
00209 return NULL;
00210
00211 return (prm->param_type);
00212 }
00213
00214
00215
00216 struct class_iterate
00217 {
00218 QofClassForeachCB fcn;
00219 gpointer data;
00220 };
00221
00222 static void
00223 class_foreach_cb (gpointer key __attribute__ ((unused)),
00224 gpointer item __attribute__ ((unused)),
00225 gpointer arg)
00226 {
00227 struct class_iterate *qiter = arg;
00228 QofIdTypeConst id = key;
00229
00230 qiter->fcn (id, qiter->data);
00231 }
00232
00233 void
00234 qof_class_foreach (QofClassForeachCB cb, gpointer user_data)
00235 {
00236 struct class_iterate qiter;
00237
00238 if (!cb)
00239 return;
00240 if (!classTable)
00241 return;
00242
00243 qiter.fcn = cb;
00244 qiter.data = user_data;
00245
00246 g_hash_table_foreach (classTable, class_foreach_cb, &qiter);
00247 }
00248
00249
00250
00251 struct parm_iterate
00252 {
00253 QofParamForeachCB fcn;
00254 gpointer data;
00255 };
00256
00257 static void
00258 param_foreach_cb (gpointer key __attribute__ ((unused)),
00259 gpointer item, gpointer arg)
00260 {
00261 struct parm_iterate *qiter = arg;
00262 QofParam *parm = item;
00263
00264 qiter->fcn (parm, qiter->data);
00265 }
00266
00267 void
00268 qof_class_param_foreach (QofIdTypeConst obj_name,
00269 QofParamForeachCB cb, gpointer user_data)
00270 {
00271 struct parm_iterate qiter;
00272 GHashTable *param_ht;
00273
00274 if (!obj_name || !cb)
00275 return;
00276 if (!classTable)
00277 return;
00278 param_ht = g_hash_table_lookup (classTable, obj_name);
00279 if (!param_ht)
00280 return;
00281
00282 qiter.fcn = cb;
00283 qiter.data = user_data;
00284
00285 g_hash_table_foreach (param_ht, param_foreach_cb, &qiter);
00286 }
00287
00288 struct param_ref_list
00289 {
00290 GList *list;
00291 };
00292
00293 static void
00294 find_reference_param_cb (QofParam * param, gpointer user_data)
00295 {
00296 struct param_ref_list *b;
00297
00298 b = (struct param_ref_list *) user_data;
00299 if ((param->param_getfcn == NULL) || (param->param_setfcn == NULL))
00300 return;
00301 if (0 == safe_strcmp (param->param_type, QOF_TYPE_STRING))
00302 return;
00303 if (0 == safe_strcmp (param->param_type, QOF_TYPE_NUMERIC))
00304 return;
00305 if (0 == safe_strcmp (param->param_type, QOF_TYPE_TIME))
00306 return;
00307 if (0 == safe_strcmp (param->param_type, QOF_TYPE_CHAR))
00308 return;
00309 if (0 == safe_strcmp (param->param_type, QOF_TYPE_DEBCRED))
00310 return;
00311 if (0 == safe_strcmp (param->param_type, QOF_TYPE_GUID))
00312 return;
00313 if (0 == safe_strcmp (param->param_type, QOF_TYPE_INT32))
00314 return;
00315 if (0 == safe_strcmp (param->param_type, QOF_TYPE_INT64))
00316 return;
00317 if (0 == safe_strcmp (param->param_type, QOF_TYPE_DOUBLE))
00318 return;
00319 if (0 == safe_strcmp (param->param_type, QOF_TYPE_KVP))
00320 return;
00321 if (0 == safe_strcmp (param->param_type, QOF_TYPE_BOOLEAN))
00322 return;
00323 if (0 == safe_strcmp (param->param_type, QOF_ID_BOOK))
00324 return;
00325 b->list = g_list_append (b->list, param);
00326 }
00327
00328 GList *
00329 qof_class_get_referenceList (QofIdTypeConst type)
00330 {
00331 GList *ref_list;
00332 struct param_ref_list b;
00333
00334 ref_list = NULL;
00335 b.list = NULL;
00336 qof_class_param_foreach (type, find_reference_param_cb, &b);
00337 ref_list = g_list_copy (b.list);
00338 return ref_list;
00339 }
00340
00341
00342