00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00030 #include <glib.h>
00031 #include "duifield.h"
00032 #include "duiresolver.h"
00033
00034 struct DuiResolverResolver_s {
00035 DuiResolverFieldFunc resolver_func;
00036 gpointer user_data;
00037 };
00038
00039 typedef struct DuiResolverResolver_s DuiResolverResolver;
00040
00041 struct DuiResolverRealizer_s {
00042 DuiResolverRealizeFunc realize_func;
00043 gpointer user_data;
00044 };
00045
00046 typedef struct DuiResolverRealizer_s DuiResolverRealizer;
00047
00048
00049
00050 DuiResolver *
00051 dui_resolver_new (void)
00052 {
00053 DuiResolver *res;
00054 res = g_new0 (DuiResolver,1);
00055 res->field_list = NULL;
00056 res->resolver_list = NULL;
00057 res->realizer_list = NULL;
00058 return res;
00059 }
00060
00061 void
00062 dui_resolver_destroy (DuiResolver *res)
00063 {
00064 if (!res) return;
00065 g_list_free (res->field_list);
00066 }
00067
00068 void
00069 dui_resolver_add_field (DuiResolver *res , DuiField *fld)
00070 {
00071 if (!res) return;
00072 res->field_list = g_list_prepend (res->field_list, fld);
00073 }
00074
00075 void
00076 dui_resolver_add_resolver (DuiResolver *res,
00077 DuiResolverFieldFunc fn, gpointer ud)
00078 {
00079 DuiResolverResolver *rr;
00080
00081 if (!res) return;
00082 rr = g_new0 (DuiResolverResolver, 1);
00083 rr->resolver_func = fn;
00084 rr->user_data = ud;
00085
00086 res->resolver_list = g_list_prepend (res->resolver_list, rr);
00087 }
00088
00089 void
00090 dui_resolver_remove_resolver (DuiResolver *res,
00091 DuiResolverFieldFunc fn, gpointer ud)
00092 {
00093 GList *n;
00094 if (!res) return;
00095
00096 for (n=res->resolver_list; n; n=n->next)
00097 {
00098 DuiResolverResolver *rr = n->data;
00099 if ((rr->user_data == ud) && (rr->resolver_func == fn))
00100 {
00101 g_free (rr);
00102 res->resolver_list = g_list_delete_link (res->resolver_list, n);
00103 return;
00104 }
00105 }
00106 }
00107
00108 void
00109 dui_resolver_resolve (DuiResolver *res)
00110 {
00111 GList *n, *f;
00112
00113 if (!res) return;
00114
00115 for (n=res->resolver_list; n; n=n->next)
00116 {
00117 DuiResolverResolver *rr = n->data;
00118
00119 for (f= res->field_list; f; f=f->next)
00120 {
00121 DuiField *fld = f->data;
00122 (rr->resolver_func) (fld, rr->user_data);
00123 }
00124 }
00125 }
00126
00127
00128
00129 void
00130 dui_resolver_add_realizer (DuiResolver *res,
00131 DuiResolverRealizeFunc fn, gpointer ud)
00132 {
00133 DuiResolverRealizer *rr;
00134
00135 if (!res) return;
00136 rr = g_new0 (DuiResolverRealizer, 1);
00137 rr->realize_func = fn;
00138 rr->user_data = ud;
00139
00140 res->realizer_list = g_list_prepend (res->realizer_list, rr);
00141 }
00142
00143 void
00144 dui_resolver_realize (DuiResolver *res)
00145 {
00146 GList *n;
00147
00148 if (!res) return;
00149
00150 for (n=res->realizer_list; n; n=n->next)
00151 {
00152 DuiResolverRealizer *rr = n->data;
00153 (rr->realize_func) (rr->user_data);
00154 }
00155 }
00156
00157