00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "config.h"
00024 #include <glib.h>
00025 #include "qof.h"
00026 #include "qofgobj.h"
00027
00028 static QofLogModule log_module = QOF_MOD_QUERY;
00029
00030 static gboolean initialized = FALSE;
00031 static GSList *paramList = NULL;
00032 static GSList *classList = NULL;
00033
00034
00035
00036 #if 0
00037 static gboolean
00038 clear_table (gpointer key, gpointer value, gpointer user_data)
00039 {
00040 g_slist_free (value);
00041 return TRUE;
00042 }
00043 #endif
00044
00045 void
00046 qof_gobject_init(void)
00047 {
00048 if (initialized) return;
00049 initialized = TRUE;
00050
00051
00052
00053
00054 qof_object_initialize();
00055 qof_query_init ();
00056 }
00057
00058 void
00059 qof_gobject_shutdown (void)
00060 {
00061 GSList *n;
00062
00063 if (!initialized) return;
00064 initialized = FALSE;
00065
00066
00067 for (n = paramList; n; n = n->next) g_free(n->data);
00068 g_slist_free (paramList);
00069
00070 for (n = classList; n; n = n->next) g_free(n->data);
00071 g_slist_free (classList);
00072
00073 #if 0
00074
00075
00076
00077 g_hash_table_foreach_remove (gobjectParamTable, clear_table, NULL);
00078 g_hash_table_destroy (gobjectParamTable);
00079 #endif
00080 }
00081
00082
00083
00084 #define GOBJECT_TABLE "GobjectTable"
00085
00086 void
00087 qof_gobject_register_instance (QofBook *book, QofType type, GObject *gob)
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 }
00100
00101
00102
00103 static gpointer
00104 qof_gobject_getter (gpointer data, QofParam *getter)
00105 {
00106 GObject *gob = data;
00107 const char *str;
00108
00109 GParamSpec *gps = getter->param_userdata;
00110
00111
00112
00113
00114 if (G_IS_PARAM_SPEC_STRING(gps))
00115 {
00116 GValue gval = {G_TYPE_INVALID};
00117 g_value_init (&gval, G_TYPE_STRING);
00118 g_object_get_property (gob, getter->param_name, &gval);
00119
00120 str = g_value_get_string (&gval);
00121 return (gpointer) str;
00122 }
00123 else if (G_IS_PARAM_SPEC_INT(gps))
00124 {
00125 long ival;
00126
00127 GValue gval = {G_TYPE_INVALID};
00128 g_value_init (&gval, G_TYPE_INT);
00129 g_object_get_property (gob, getter->param_name, &gval);
00130
00131 ival = g_value_get_int (&gval);
00132 return (gpointer) ival;
00133 }
00134 else if (G_IS_PARAM_SPEC_UINT(gps))
00135 {
00136 long ival;
00137 GValue gval = {G_TYPE_INVALID};
00138 g_value_init (&gval, G_TYPE_UINT);
00139 g_object_get_property (gob, getter->param_name, &gval);
00140
00141 ival = g_value_get_uint (&gval);
00142 return (gpointer) ival;
00143 }
00144 else if (G_IS_PARAM_SPEC_BOOLEAN(gps))
00145 {
00146 gboolean ival;
00147
00148 GValue gval = {G_TYPE_INVALID};
00149 g_value_init (&gval, G_TYPE_BOOLEAN);
00150 g_object_get_property (gob, getter->param_name, &gval);
00151
00152 ival = g_value_get_boolean (&gval);
00153 return GINT_TO_POINTER( ival);
00154 }
00155
00156 PWARN ("unhandled parameter type %s for paramter %s",
00157 G_PARAM_SPEC_TYPE_NAME(gps), getter->param_name);
00158 return NULL;
00159 }
00160
00161 static double
00162 qof_gobject_double_getter (gpointer data, QofParam *getter)
00163 {
00164 GObject *gob = data;
00165 double fval;
00166
00167 GParamSpec *gps = getter->param_userdata;
00168
00169
00170
00171
00172 if (G_IS_PARAM_SPEC_FLOAT(gps))
00173 {
00174 GValue gval = {G_TYPE_INVALID};
00175 g_value_init (&gval, G_TYPE_FLOAT);
00176 g_object_get_property (gob, getter->param_name, &gval);
00177
00178 fval = g_value_get_float (&gval);
00179 return fval;
00180 }
00181 else if (G_IS_PARAM_SPEC_DOUBLE(gps))
00182 {
00183 GValue gval = {G_TYPE_INVALID};
00184 g_value_init (&gval, G_TYPE_DOUBLE);
00185 g_object_get_property (gob, getter->param_name, &gval);
00186
00187 fval = g_value_get_double (&gval);
00188 return fval;
00189 }
00190
00191 PWARN ("unhandled parameter type %s for paramter %s",
00192 G_PARAM_SPEC_TYPE_NAME(gps), getter->param_name);
00193 return 0.0;
00194 }
00195
00196
00197
00198
00199
00200 static void
00201 qof_gobject_foreach (QofCollection *coll, QofInstanceForeachCB cb, gpointer ud)
00202 {
00203 GSList *n;
00204 n = qof_collection_get_data (coll);
00205 for (; n; n = n->next)
00206 {
00207 cb (n->data, ud);
00208 }
00209 }
00210
00211
00212
00213 void
00214 qof_gobject_register (QofType e_type, GObjectClass *obclass)
00215 {
00216 int i;
00217 int j;
00218 QofParam *qof_param_list, *qpar;
00219 QofObject *class_def;
00220 GParamSpec **prop_list, *gparam;
00221 guint n_props;
00222
00223
00224 prop_list = g_object_class_list_properties (obclass, &n_props);
00225
00226 qof_param_list = g_new0 (QofParam, n_props);
00227 paramList = g_slist_prepend (paramList, qof_param_list);
00228
00229 PINFO ("object %s has %d props", e_type, n_props);
00230 j = 0;
00231 for (i = 0; i < n_props; i++)
00232 {
00233 gparam = prop_list[i];
00234 qpar = &qof_param_list[j];
00235
00236 PINFO ("param %d %s is type %s",
00237 i, gparam->name, G_PARAM_SPEC_TYPE_NAME(gparam));
00238
00239 qpar->param_name = g_param_spec_get_name (gparam);
00240 qpar->param_getfcn = (QofAccessFunc)qof_gobject_getter;
00241 qpar->param_setfcn = NULL;
00242 qpar->param_userdata = gparam;
00243 if ((G_IS_PARAM_SPEC_INT(gparam)) ||
00244 (G_IS_PARAM_SPEC_UINT(gparam)) ||
00245 (G_IS_PARAM_SPEC_ENUM(gparam)) ||
00246 (G_IS_PARAM_SPEC_FLAGS(gparam)))
00247 {
00248 qpar->param_type = QOF_TYPE_INT32;
00249 j++;
00250 }
00251 else if ((G_IS_PARAM_SPEC_INT64(gparam)) ||
00252 (G_IS_PARAM_SPEC_UINT64(gparam)))
00253 {
00254 qpar->param_type = QOF_TYPE_INT64;
00255 j++;
00256 }
00257 else if (G_IS_PARAM_SPEC_BOOLEAN(gparam))
00258 {
00259 qpar->param_type = QOF_TYPE_BOOLEAN;
00260 j++;
00261 }
00262 else if (G_IS_PARAM_SPEC_STRING(gparam))
00263 {
00264 qpar->param_type = QOF_TYPE_STRING;
00265 j++;
00266 }
00267 else if ((G_IS_PARAM_SPEC_POINTER(gparam)) ||
00268 (G_IS_PARAM_SPEC_OBJECT(gparam)))
00269 {
00270
00271 }
00272 else if ((G_IS_PARAM_SPEC_FLOAT(gparam)) ||
00273 (G_IS_PARAM_SPEC_DOUBLE(gparam)))
00274 {
00275 qpar->param_getfcn = (QofAccessFunc) qof_gobject_double_getter;
00276 qpar->param_type = QOF_TYPE_DOUBLE;
00277 j++;
00278 }
00279 else if (G_IS_PARAM_SPEC_CHAR(gparam))
00280 {
00281 qpar->param_type = QOF_TYPE_CHAR;
00282 j++;
00283 }
00284 else
00285 {
00286 PWARN ("Unknown/unhandled parameter type %s on %s:%s\n",
00287 G_PARAM_SPEC_TYPE_NAME(gparam), e_type, qpar->param_name);
00288 }
00289 }
00290
00291
00292 qof_param_list[j].param_type = NULL;
00293
00294 qof_class_register (e_type, NULL, qof_param_list);
00295
00296
00297
00298 class_def = g_new0 (QofObject, 1);
00299 classList = g_slist_prepend (classList, class_def);
00300
00301 class_def->interface_version = QOF_OBJECT_VERSION;
00302 class_def->e_type = e_type;
00303
00304
00305 class_def->type_label = G_OBJECT_CLASS_NAME (obclass);
00306 class_def->create = NULL;
00307 class_def->book_begin = NULL;
00308 class_def->book_end = NULL;
00309 class_def->is_dirty = NULL;
00310 class_def->mark_clean = NULL;
00311 class_def->foreach = qof_gobject_foreach;
00312 class_def->printable = NULL;
00313 class_def->version_cmp = NULL;
00314
00315 qof_object_register (class_def);
00316 }
00317
00318