Add:Core:Extended attribute system
[profile/ivi/navit.git] / navit / navit / route.c
index da95ad7..2979e1e 100644 (file)
@@ -1020,7 +1020,7 @@ route_segment_data_field_pos(struct route_segment_data *seg, enum attr_type type
 {
        unsigned char *ptr;
        
-       ptr = ((unsigned char*)seg) + sizeof(struct route_graph_segment);
+       ptr = ((unsigned char*)seg) + sizeof(struct route_segment_data);
 
        if (seg->flags & AF_SPEED_LIMIT) {
                if (type == attr_maxspeed) 
@@ -1269,17 +1269,17 @@ static int
 route_path_add_item_from_graph(struct route_path *this, struct route_path *oldpath, struct route_graph_segment *rgs, int dir, struct route_info *pos, struct route_info *dst)
 {
        struct route_path_segment *segment;
-       int i,ccnt = 0, extra=0, ret=1;
+       int i, ccnt, extra=0, ret=1;
        struct coord *c,*cd,ca[2048];
        int offset=1;
        int seg_size,seg_dat_size;
        if (rgs->data.flags & AF_SEGMENTED) 
                offset=RSD_OFFSET(&rgs->data);
 
-       dbg(1,"enter (0x%x,0x%x)\n", rgs->data.item.id_hi, rgs->data.item.id_lo);
-       if (oldpath) {
-               ccnt = (int)item_hash_lookup(oldpath->path_hash, &rgs->data.item);
-               if (ccnt) {
+       dbg(1,"enter (0x%x,0x%x) dir=%d pos=%p dst=%p\n", rgs->data.item.id_hi, rgs->data.item.id_lo, dir, pos, dst);
+       if (oldpath && !pos) {
+               segment=item_hash_lookup(oldpath->path_hash, &rgs->data.item);
+               if (segment && segment->direction == dir) {
                        segment = route_extract_segment_from_path(oldpath, &rgs->data.item, offset);
                        if (segment) 
                                goto linkold;
@@ -1300,9 +1300,9 @@ route_path_add_item_from_graph(struct route_path *this, struct route_path *oldpa
                        }
                } else {
                        extra=1;
-                       dbg(0,"pos dir=%d\n", dir);
-                       dbg(0,"pos pos=%d\n", pos->pos);
-                       dbg(0,"pos count=%d\n", pos->street->count);
+                       dbg(1,"pos dir=%d\n", dir);
+                       dbg(1,"pos pos=%d\n", pos->pos);
+                       dbg(1,"pos count=%d\n", pos->street->count);
                        if (dir > 0) {
                                c=pos->street->c+pos->pos+1;
                                ccnt=pos->street->count-pos->pos-1;
@@ -1313,8 +1313,8 @@ route_path_add_item_from_graph(struct route_path *this, struct route_path *oldpa
                }
        } else  if (dst) {
                extra=1;
-               dbg(0,"dst dir=%d\n", dir);
-               dbg(0,"dst pos=%d\n", dst->pos);
+               dbg(1,"dst dir=%d\n", dir);
+               dbg(1,"dst pos=%d\n", dst->pos);
                if (dir > 0) {
                        c=dst->street->c;
                        ccnt=dst->pos+1;
@@ -1357,7 +1357,7 @@ route_path_add_item_from_graph(struct route_path *this, struct route_path *oldpa
 linkold:
        segment->data->len=rgs->data.len;
        segment->next=NULL;
-       item_hash_insert(this->path_hash,  &rgs->data.item, (void *)ccnt);
+       item_hash_insert(this->path_hash,  &rgs->data.item, segment);
 
        route_path_add_segment(this, segment);
 
@@ -1666,7 +1666,7 @@ route_graph_flood(struct route_graph *this, struct route_info *dst, struct route
        }
        fh_deleteheap(heap);
        callback_call_0(cb);
-       dbg(0,"return\n");
+       dbg(1,"return\n");
 }
 
 /**
@@ -2057,10 +2057,6 @@ route_find_nearest_street(struct mapset *ms, struct pcoord *pc)
        struct coord_geo g;
 
        ret=g_new0(struct route_info, 1);
-       if (!ret) {
-               dbg(0,"Out of memory\n");
-               return ret;
-       }
        mindist = INT_MAX;
 
        h=mapset_open(ms);
@@ -2811,10 +2807,21 @@ route_remove_callback(struct route *this_, struct callback *cb)
        callback_list_remove(this_->cbl, cb);
 }
 
-
+int
+route_get_attr(struct route *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter)
+{
+       switch (type) {
+       case attr_map:
+               attr->u.map=route_get_map(this_);
+               return attr->u.map != NULL;
+       default:
+               return 0;
+       }
+}
 void
 route_init(void)
 {
        plugin_register_map_type("route", route_map_new);
        plugin_register_map_type("route_graph", route_graph_map_new);
 }
+