From: <mar...@us...> - 2013-01-20 15:01:07
|
Revision: 5344 http://navit.svn.sourceforge.net/navit/?rev=5344&view=rev Author: martin-s Date: 2013-01-20 15:01:00 +0000 (Sun, 20 Jan 2013) Log Message: ----------- Fix:Core:Improved config object handling Modified Paths: -------------- trunk/navit/navit/attr.c trunk/navit/navit/attr.h trunk/navit/navit/config_.c trunk/navit/navit/xmlconfig.c trunk/navit/navit/xmlconfig.h Modified: trunk/navit/navit/attr.c =================================================================== --- trunk/navit/navit/attr.c 2013-01-20 10:21:32 UTC (rev 5343) +++ trunk/navit/navit/attr.c 2013-01-20 15:01:00 UTC (rev 5344) @@ -462,6 +462,24 @@ } struct attr ** +attr_generic_prepend_attr(struct attr **attrs, struct attr *attr) +{ + struct attr **curr=attrs; + int i,count=0; + while (curr && *curr) { + curr++; + count++; + } + curr=g_new0(struct attr *, count+2); + for (i = 0 ; i < count ; i++) + curr[i+1]=attrs[i]; + curr[0]=attr_dup(attr); + curr[count+1]=NULL; + g_free(attrs); + return curr; +} + +struct attr ** attr_generic_remove_attr(struct attr **attrs, struct attr *attr) { struct attr **curr=attrs; Modified: trunk/navit/navit/attr.h =================================================================== --- trunk/navit/navit/attr.h 2013-01-20 10:21:32 UTC (rev 5343) +++ trunk/navit/navit/attr.h 2013-01-20 15:01:00 UTC (rev 5344) @@ -180,6 +180,7 @@ int attr_generic_get_attr(struct attr **attrs, struct attr **def_attrs, enum attr_type type, struct attr *attr, struct attr_iter *iter); struct attr **attr_generic_set_attr(struct attr **attrs, struct attr *attr); struct attr **attr_generic_add_attr(struct attr **attrs, struct attr *attr); +struct attr **attr_generic_prepend_attr(struct attr **attrs, struct attr *attr); struct attr **attr_generic_remove_attr(struct attr **attrs, struct attr *attr); enum attr_type attr_type_begin(enum attr_type type); int attr_data_size(struct attr *attr); Modified: trunk/navit/navit/config_.c =================================================================== --- trunk/navit/navit/config_.c 2013-01-20 10:21:32 UTC (rev 5343) +++ trunk/navit/navit/config_.c 2013-01-20 15:01:00 UTC (rev 5344) @@ -22,6 +22,7 @@ #include <signal.h> #include "debug.h" #include "item.h" +#include "xmlconfig.h" #include "callback.h" #include "navit.h" #include "config_.h" @@ -30,8 +31,7 @@ #endif struct config { - struct attr **attrs; - struct callback_list *cbl; + NAVIT_OBJECT } *config; struct config * @@ -52,7 +52,6 @@ config_destroy(struct config *this_) { attr_list_free(this_->attrs); - callback_list_destroy(this_->cbl); g_free(config); exit(0); } @@ -68,7 +67,6 @@ config_new_int(void) { config=g_new0(struct config, 1); - config->cbl=callback_list_new(); #ifndef HAVE_API_WIN32_CE signal(SIGTERM, config_terminate); #ifndef HAVE_API_WIN32 @@ -102,7 +100,10 @@ int config_set_attr(struct config *this_, struct attr *attr) { - return config_set_attr_int(this_, attr); + if (config_set_attr_int(this_, attr)) + return navit_object_set_attr((struct navit_object *)this_, attr); + else + return 0; } int @@ -112,39 +113,25 @@ config_new_int(); this_=config; } - switch (attr->type) { - case attr_callback: - callback_list_add(this_->cbl, attr->u.callback); - default: - this_->attrs=attr_generic_add_attr(this_->attrs, attr); - } - callback_list_call_attr_2(this_->cbl, attr->type, attr->u.data, 1); - return 1; + return navit_object_add_attr((struct navit_object *)this_, attr); } int config_remove_attr(struct config *this_, struct attr *attr) { - switch (attr->type) { - case attr_callback: - callback_list_remove(this_->cbl, attr->u.callback); - default: - this_->attrs=attr_generic_remove_attr(this_->attrs, attr); - } - callback_list_call_attr_2(this_->cbl, attr->type, attr->u.data, -1); - return 1; + return navit_object_remove_attr((struct navit_object *)this_, attr); } struct attr_iter * config_attr_iter_new() { - return g_new0(struct attr_iter, 1); + return navit_object_attr_iter_new(); } void config_attr_iter_destroy(struct attr_iter *iter) { - g_free(iter); + navit_object_attr_iter_destroy(iter); } @@ -161,6 +148,8 @@ } if (!config) config_new_int(); + config->func=&config_func; + navit_object_ref((struct navit_object *)config); config->attrs=attr_list_dup(attrs); while (*attrs) { if (!config_set_attr_int(config,*attrs)) { @@ -174,3 +163,19 @@ configured=1; return config; } + +struct object_func config_func = { + attr_config, + (object_func_new)config_new, + (object_func_get_attr)navit_object_get_attr, + (object_func_iter_new)navit_object_attr_iter_new, + (object_func_iter_destroy)navit_object_attr_iter_destroy, + (object_func_set_attr)config_set_attr, + (object_func_add_attr)config_add_attr, + (object_func_remove_attr)navit_object_remove_attr, + (object_func_init)NULL, + (object_func_destroy)NULL, + (object_func_dup)NULL, + (object_func_ref)navit_object_ref, + (object_func_unref)navit_object_unref, +}; Modified: trunk/navit/navit/xmlconfig.c =================================================================== --- trunk/navit/navit/xmlconfig.c 2013-01-20 10:21:32 UTC (rev 5343) +++ trunk/navit/navit/xmlconfig.c 2013-01-20 15:01:00 UTC (rev 5344) @@ -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 @@ { 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 @@ { int i; switch (type) { + case attr_config: + return &config_func; case attr_layer: return &layer_func; case attr_layout: @@ -1245,3 +1247,73 @@ 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; +} Modified: trunk/navit/navit/xmlconfig.h =================================================================== --- trunk/navit/navit/xmlconfig.h 2013-01-20 10:21:32 UTC (rev 5343) +++ trunk/navit/navit/xmlconfig.h 2013-01-20 15:01:00 UTC (rev 5344) @@ -54,9 +54,9 @@ void *(*unref)(void *); }; -extern struct object_func map_func, mapset_func, navit_func, tracking_func, vehicle_func, maps_func, layout_func, vehicleprofile_func, layer_func; +extern struct object_func map_func, mapset_func, navit_func, tracking_func, vehicle_func, maps_func, layout_func, vehicleprofile_func, layer_func, config_func; -#define HAS_OBJECT_FUNC(x) ((x) == attr_map || (x) == attr_mapset || (x) == attr_navit || (x) == attr_trackingo || (x) == attr_vehicle || (x) == attr_maps || (x) == attr_layout || (x) == attr_vehicleprofile || (x) == attr_layer) +#define HAS_OBJECT_FUNC(x) ((x) == attr_map || (x) == attr_mapset || (x) == attr_navit || (x) == attr_trackingo || (x) == attr_vehicle || (x) == attr_maps || (x) == attr_layout || (x) == attr_vehicleprofile || (x) == attr_layer || (x) == attr_config) #define NAVIT_OBJECT struct object_func *func; int refcount; struct attr **attrs; struct navit_object { @@ -65,6 +65,12 @@ struct navit_object *navit_object_ref(struct navit_object *obj); void navit_object_unref(struct navit_object *obj); +struct attr_iter * navit_object_attr_iter_new(void); +void navit_object_attr_iter_destroy(struct attr_iter *iter); +int navit_object_get_attr(struct navit_object *obj, enum attr_type type, struct attr *attr, struct attr_iter *iter); +int navit_object_set_attr(struct navit_object *obj, struct attr *attr); +int navit_object_add_attr(struct navit_object *obj, struct attr *attr); +int navit_object_remove_attr(struct navit_object *obj, struct attr *attr); typedef GError xmlerror; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |