diff options
author | martin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2013-01-20 15:01:00 +0000 |
---|---|---|
committer | martin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2013-01-20 15:01:00 +0000 |
commit | af57165504eedecdefcd49c8123814626f4f0dde (patch) | |
tree | e61e6c3c6e55eac189a4437b01cb0fbc10f9e2e1 /navit/xmlconfig.c | |
parent | 275a394a7cda4c24b85038d66de4a09bfd4effcf (diff) | |
download | navit-af57165504eedecdefcd49c8123814626f4f0dde.tar.gz |
Fix:Core:Improved config object handling
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@5344 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/xmlconfig.c')
-rw-r--r-- | navit/xmlconfig.c | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/navit/xmlconfig.c b/navit/xmlconfig.c index 4cca8f34d..b6571d85c 100644 --- a/navit/xmlconfig.c +++ b/navit/xmlconfig.c @@ -51,6 +51,7 @@ #include "announcement.h" #include "vehicleprofile.h" #include "roadprofile.h" +#include "callback.h" #include "config_.h" #if (defined __MINGW32__) || (defined _MSC_VER) @@ -246,7 +247,6 @@ static struct object_func object_funcs[] = { { attr_announcement,NEW(announcement_new), GET(announcement_get_attr), NULL, NULL, SET(announcement_set_attr), ADD(announcement_add_attr) }, { attr_arrows, NEW(arrows_new)}, { attr_circle, NEW(circle_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, - { attr_config, NEW(config_new), GET(config_get_attr), ITERN(config_attr_iter_new), ITERD(config_attr_iter_destroy), SET(config_set_attr), ADD(config_add_attr), REMOVE(config_remove_attr), NULL, DESTROY(config_destroy)}, { attr_coord, NEW(coord_new_from_attrs)}, { attr_cursor, NEW(cursor_new), NULL, NULL, NULL, NULL, ADD(cursor_add_attr)}, { attr_debug, NEW(debug_new)}, @@ -273,6 +273,8 @@ object_func_lookup(enum attr_type type) { int i; switch (type) { + case attr_config: + return &config_func; case attr_layer: return &layer_func; case attr_layout: @@ -1245,3 +1247,73 @@ navit_object_unref(struct navit_object *obj) obj->func->destroy(obj); } } + +struct attr_iter { + void *last; +}; + +struct attr_iter * +navit_object_attr_iter_new(void) +{ + return g_new0(struct attr_iter, 1); +} + +void +navit_object_attr_iter_destroy(struct attr_iter *iter) +{ + g_free(iter); +} + +int +navit_object_get_attr(struct navit_object *obj, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + return attr_generic_get_attr(obj->attrs, NULL, type, attr, iter); +} + +int +navit_object_set_attr(struct navit_object *obj, struct attr *attr) +{ + obj->attrs=attr_generic_set_attr(obj->attrs, attr); + if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) + callback_list_call_attr_2(obj->attrs[0]->u.callback_list, attr->type, attr->u.data, 0); + return 1; +} + +int +navit_object_add_attr(struct navit_object *obj, struct attr *attr) +{ + if (attr->type == attr_callback) { + struct callback_list *cbl; + if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) + cbl=obj->attrs[0]->u.callback_list; + else { + struct attr attr; + cbl=callback_list_new(); + attr.type=attr_callback_list; + attr.u.callback_list=cbl; + obj->attrs=attr_generic_prepend_attr(obj->attrs, &attr); + } + callback_list_add(cbl, attr->u.callback); + return 1; + } + obj->attrs=attr_generic_add_attr(obj->attrs, attr); + if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) + callback_list_call_attr_2(obj->attrs[0]->u.callback_list, attr->type, attr->u.data, 1); + return 1; +} + +int +navit_object_remove_attr(struct navit_object *obj, struct attr *attr) +{ + if (attr->type == attr_callback) { + if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) { + callback_list_remove(obj->attrs[0]->u.callback_list, attr->u.callback); + return 1; + } else + return 0; + } + obj->attrs=attr_generic_remove_attr(obj->attrs, attr); + if (obj->attrs && obj->attrs[0] && obj->attrs[0]->type == attr_callback_list) + callback_list_call_attr_2(obj->attrs[0]->u.callback_list, attr->type, attr->u.data, -1); + return 1; +} |