Add:binding_dbus:Add support for setting map attributes
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Sun, 25 Oct 2009 18:23:25 +0000 (18:23 +0000)
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Sun, 25 Oct 2009 18:23:25 +0000 (18:23 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@2691 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/navit/binding/dbus/binding_dbus.c
navit/navit/map/filter/filter.c

index 3f7c59d..73c8cee 100644 (file)
@@ -35,6 +35,8 @@
 #include "command.h"
 #include "graphics.h"
 #include "vehicle.h"
+#include "map.h"
+#include "mapset.h"
 #include "util.h"
 
 
@@ -87,6 +89,8 @@ resolve_object(const char *opath, char *type)
        char *def_navit="/default_navit";
        char *def_graphics="/default_graphics";
        char *def_vehicle="/default_vehicle";
+       char *def_mapset="/default_mapset";
+       char *def_map="/default_map";
        struct attr attr;
 
        if (strncmp(opath, object_path, strlen(object_path))) {
@@ -120,6 +124,21 @@ resolve_object(const char *opath, char *type)
                        }
                        return NULL;
                }
+               if (!strncmp(oprefix,def_mapset,strlen(def_mapset))) {
+                       oprefix+=strlen(def_mapset);
+                       if (navit_get_attr(navit, attr_mapset, &attr, NULL)) {
+                               if (!oprefix[0]) {
+                                       return attr.u.mapset;
+                               }       
+                               if (!strncmp(oprefix,def_map,strlen(def_map))) {
+                                       if (mapset_get_attr(attr.u.mapset, attr_map, &attr, NULL)) {
+                                               return attr.u.map;
+                                       }
+                                       return NULL;
+                               }
+                       }
+                       return NULL;
+               }
        }
        return NULL;
 }
@@ -629,6 +648,13 @@ decode_attr(DBusMessage *message, struct attr *attr)
                }
                return 0;
         }
+       if(attr->type > attr_type_string_begin && attr->type < attr_type_string_end) {
+               if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_STRING) {
+                       dbus_message_iter_get_basic(&iterattr, &attr->u.str);
+                       return 1;
+               }
+               return 0;
+        }
        if(attr->type > attr_type_double_begin && attr->type < attr_type_double_end) {
                if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_DOUBLE) {
                        attr->u.numd=g_new(typeof(*attr->u.numd),1);
@@ -729,6 +755,25 @@ request_vehicle_set_attr(DBusConnection *connection, DBusMessage *message)
 }
 
 static DBusHandlerResult
+request_map_set_attr(DBusConnection *connection, DBusMessage *message)
+{
+       struct map *map;
+       struct attr attr;
+       int ret;
+       
+       map = object_get_from_message(message, "map");
+       if (! map)
+               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+       if (decode_attr(message, &attr)) {
+               ret=map_set_attr(map, &attr);
+               destroy_attr(&attr);
+               if (ret)        
+                       return empty_reply(connection, message);
+       }
+       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+}
+
+static DBusHandlerResult
 request_navit_set_position(DBusConnection *connection, DBusMessage *message)
 {
        struct pcoord pc;
@@ -867,6 +912,7 @@ struct dbus_method {
        {".graphics","get_data",           "s",       "type",                                    "ay",  "data", request_graphics_get_data},
        {".graphics","set_attr",           "sv",      "attribute,value",                         "",   "",      request_graphics_set_attr},
        {".vehicle","set_attr",           "sv",      "attribute,value",                         "",   "",      request_vehicle_set_attr},
+       {".map","set_attr",           "sv",      "attribute,value",                         "",   "",      request_map_set_attr},
 #if 0
     {".navit",  "toggle_announcer",    "",        "",                                        "",   "",      request_navit_toggle_announcer},
        {".navit",  "toggle_announcer",    "i",       "",                                        "",   "",      request_navit_toggle_announcer},
index 6bb3431..5b82b9c 100644 (file)
@@ -80,6 +80,8 @@ filter_type(struct map_priv *m, enum item_type type)
                }
                if (old) {
                        new=filter->new;
+                       if (!new)
+                               return type;
                        while (new) {
                                struct filter_entry *entry=new->data;
                                count+=entry->last-entry->first+1;
@@ -97,7 +99,7 @@ filter_type(struct map_priv *m, enum item_type type)
                }
                filters=g_list_next(filters);
        }
-       return type_none;
+       return type;
 }
 
 static void
@@ -281,6 +283,19 @@ map_filter_destroy(struct map_priv *m)
        g_free(m);
 }
 
+static int
+map_filter_set_attr(struct map_priv *m, struct attr *attr)
+{
+       switch (attr->type) {
+       case attr_filter:
+               parse_filters(m,attr->u.str);
+               return 1;       
+       default:
+               return 0;
+       }
+}
+
+
 static struct map_methods map_methods_filter = {
        projection_mg,
        "utf-8",
@@ -291,7 +306,10 @@ static struct map_methods map_methods_filter = {
        map_filter_rect_get_item_byid,
        map_filter_search_new,
        map_filter_search_destroy,
-       map_filter_search_get_item
+       map_filter_search_get_item,
+       NULL,
+       NULL,
+       map_filter_set_attr,
 };