Fix:maptool:Another name for faroe islands
[navit-package] / navit / vehicleprofile.c
index 7d3f781..e887200 100644 (file)
 
 #include <glib.h>
 #include <string.h>
+#include <stdlib.h>
 #include "debug.h"
 #include "item.h"
+#include "roadprofile.h"
 #include "vehicleprofile.h"
 
-struct vehicleprofile {
-       struct attr **attrs;
-};
+static void
+vehicleprofile_set_attr_do(struct vehicleprofile *this_, struct attr *attr)
+{
+       dbg(1,"%s:%d\n", attr_to_name(attr->type), attr->u.num);
+       switch (attr->type) {
+       case attr_flags:
+               this_->flags=attr->u.num;
+               break;
+       case attr_flags_forward_mask:
+               this_->flags_forward_mask=attr->u.num;
+               break;
+       case attr_flags_reverse_mask:
+               this_->flags_reverse_mask=attr->u.num;
+               break;
+       case attr_maxspeed_handling:
+               this_->maxspeed_handling=attr->u.num;
+               break;
+       case attr_route_mode:
+               this_->mode=attr->u.num;
+               break;
+       case attr_name:
+               if(this_->name)
+                       g_free(this_->name);
+               /* previously used strdupn not available on win32 */
+               this_->name = g_strdup(attr->u.str);
+               break;
+       default:
+               break;
+       }
+}
 
 struct vehicleprofile *
 vehicleprofile_new(struct attr *parent, struct attr **attrs)
 {
        struct vehicleprofile *this_;
-       struct attr *type_attr;
+       struct attr **attr, *type_attr;
        if (! (type_attr=attr_search(attrs, NULL, attr_name))) {
                return NULL;
        }
        this_=g_new0(struct vehicleprofile, 1);
        this_->attrs=attr_list_dup(attrs);
+       this_->roadprofile_hash=g_hash_table_new(NULL, NULL);
+       for (attr=attrs;*attr; attr++)
+               vehicleprofile_set_attr_do(this_, *attr);
        return this_;
 }
 
@@ -49,6 +81,7 @@ vehicleprofile_get_attr(struct vehicleprofile *this_, enum attr_type type, struc
 int
 vehicleprofile_set_attr(struct vehicleprofile *this_, struct attr *attr)
 {
+       vehicleprofile_set_attr_do(this_, attr);
        this_->attrs=attr_generic_set_attr(this_->attrs, attr);
        return 1;
 }
@@ -57,6 +90,20 @@ int
 vehicleprofile_add_attr(struct vehicleprofile *this_, struct attr *attr)
 {
        this_->attrs=attr_generic_add_attr(this_->attrs, attr);
+       struct attr item_types_attr;
+       switch (attr->type) {
+       case attr_roadprofile:
+               if (roadprofile_get_attr(attr->u.roadprofile, attr_item_types, &item_types_attr, NULL)) {
+                       enum item_type *types=item_types_attr.u.item_types;
+                       while (*types != type_none) {
+                               g_hash_table_insert(this_->roadprofile_hash, (void *)(long)(*types), attr->u.roadprofile);
+                               types++;
+                       }
+               }
+               break;
+       default:
+               break;
+       }
        return 1;
 }
 
@@ -67,3 +114,14 @@ vehicleprofile_remove_attr(struct vehicleprofile *this_, struct attr *attr)
        return 1;
 }
 
+struct roadprofile *
+vehicleprofile_get_roadprofile(struct vehicleprofile *this_, enum item_type type)
+{
+       return g_hash_table_lookup(this_->roadprofile_hash, (void *)(long)type);
+}
+
+char *
+vehicleprofile_get_name(struct vehicleprofile *this_)
+{
+    return this_->name;
+}