diff options
Diffstat (limited to 'navit/binding')
-rw-r--r-- | navit/binding/dbus/CMakeLists.txt | 8 | ||||
-rw-r--r-- | navit/binding/dbus/binding_dbus.c | 3499 | ||||
-rwxr-xr-x | navit/binding/dbus/eval.py | 12 | ||||
-rw-r--r-- | navit/binding/dbus/navit.introspect | 4 | ||||
-rwxr-xr-x | navit/binding/dbus/test.py | 12 | ||||
-rw-r--r-- | navit/binding/python/attr.c | 89 | ||||
-rw-r--r-- | navit/binding/python/binding_python.c | 374 | ||||
-rw-r--r-- | navit/binding/python/config.c | 50 | ||||
-rw-r--r-- | navit/binding/python/navigation.c | 60 | ||||
-rw-r--r-- | navit/binding/python/navit.c | 158 | ||||
-rw-r--r-- | navit/binding/python/pcoord.c | 77 | ||||
-rw-r--r-- | navit/binding/python/route.c | 60 | ||||
-rw-r--r-- | navit/binding/python/startup.py | 12 | ||||
-rw-r--r-- | navit/binding/python/template.c | 83 | ||||
-rw-r--r-- | navit/binding/win32/CMakeLists.txt | 6 | ||||
-rw-r--r-- | navit/binding/win32/binding_win32.c | 131 | ||||
-rw-r--r-- | navit/binding/win32/tell_navit.c | 263 |
17 files changed, 2399 insertions, 2499 deletions
diff --git a/navit/binding/dbus/CMakeLists.txt b/navit/binding/dbus/CMakeLists.txt index 6f081ab09..b6378da14 100644 --- a/navit/binding/dbus/CMakeLists.txt +++ b/navit/binding/dbus/CMakeLists.txt @@ -1,10 +1,10 @@ -module_add_library(binding_dbus binding_dbus.c) +module_add_library(binding_dbus binding_dbus.c) set(bindir ${CMAKE_INSTALL_PREFIX}/${BIN_DIR}) configure_file ( - "${CMAKE_CURRENT_SOURCE_DIR}/org.navit_project.navit.service.in" - "${CMAKE_CURRENT_BINARY_DIR}/org.navit_project.navit.service" -) + "${CMAKE_CURRENT_SOURCE_DIR}/org.navit_project.navit.service.in" + "${CMAKE_CURRENT_BINARY_DIR}/org.navit_project.navit.service" + ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/org.navit_project.navit.service DESTINATION ${CMAKE_INSTALL_PREFIX}/share/dbus-1/services/) diff --git a/navit/binding/dbus/binding_dbus.c b/navit/binding/dbus/binding_dbus.c index 97b48f9c4..aa776db10 100644 --- a/navit/binding/dbus/binding_dbus.c +++ b/navit/binding/dbus/binding_dbus.c @@ -52,6 +52,7 @@ #include "util.h" #include "transform.h" #include "event.h" +#include "traffic.h" static DBusConnection *connection; static dbus_uint32_t dbus_serial; @@ -76,367 +77,334 @@ GHashTable *object_hash_rev; GHashTable *object_count; struct dbus_callback { - struct callback *callback; - char *signal; + struct callback *callback; + char *signal; }; -static char * -object_new(char *type, void *object) -{ - int id; - char *ret; - dbg(lvl_debug,"enter %s\n", type); - if ((ret=g_hash_table_lookup(object_hash_rev, object))) - return ret; - id=GPOINTER_TO_INT(g_hash_table_lookup(object_count, type)); - g_hash_table_insert(object_count, type, GINT_TO_POINTER((id+1))); - ret=g_strdup_printf("%s/%s/%d", object_path, type, id); - g_hash_table_insert(object_hash, ret, object); - g_hash_table_insert(object_hash_rev, object, ret); - dbg(lvl_debug,"return %s\n", ret); - return (ret); -} - -static void * -object_get(const char *path) -{ - return g_hash_table_lookup(object_hash, path); -} - -static void -object_destroy(const char *path, void *object) -{ - if (!path && !object) - return; - if (!object) - object=g_hash_table_lookup(object_hash, path); - if (!path) - path=g_hash_table_lookup(object_hash_rev, object); - g_hash_table_remove(object_hash, path); - g_hash_table_remove(object_hash_rev, object); -} - -static void * -resolve_object(const char *opath, char *type) -{ - char *prefix; - const char *oprefix; - void *ret=NULL; - char *def_navit="/default_navit"; - char *def_gui="/default_gui"; - char *def_graphics="/default_graphics"; - char *def_vehicle="/default_vehicle"; - char *def_vehicleprofile="/default_vehicleprofile"; - char *def_mapset="/default_mapset"; - char *def_map="/default_map"; - char *def_navigation="/default_navigation"; - char *def_route="/default_route"; - char *def_tracking="/default_tracking"; - struct attr attr; - - if (strncmp(opath, object_path, strlen(object_path))) { - dbg(lvl_error,"wrong object path %s\n",opath); - return NULL; - } - prefix=g_strdup_printf("%s/%s/", object_path, type); - if (!strncmp(prefix, opath, strlen(prefix))) { - ret=object_get(opath); - g_free(prefix); - return ret; - } - g_free(prefix); - oprefix=opath+strlen(object_path); - if (!strncmp(oprefix,def_navit,strlen(def_navit))) { - oprefix+=strlen(def_navit); - struct attr navit; - if (!config_get_attr(config, attr_navit, &navit, NULL)) - return NULL; - if (!oprefix[0]) { - dbg(lvl_debug,"default_navit\n"); - return navit.u.navit; - } - if (!strncmp(oprefix,def_graphics,strlen(def_graphics))) { - if (navit_get_attr(navit.u.navit, attr_graphics, &attr, NULL)) { - return attr.u.graphics; - } - return NULL; - } - if (!strncmp(oprefix,def_gui,strlen(def_gui))) { - if (navit_get_attr(navit.u.navit, attr_gui, &attr, NULL)) { - return attr.u.gui; - } - return NULL; - } - if (!strncmp(oprefix,def_vehicleprofile,strlen(def_vehicleprofile))) { - if (navit_get_attr(navit.u.navit, attr_vehicleprofile, &attr, NULL)) { - return attr.u.vehicleprofile; - } - return NULL; - } - if (!strncmp(oprefix,def_vehicle,strlen(def_vehicle))) { - if (navit_get_attr(navit.u.navit, attr_vehicle, &attr, NULL)) { - return attr.u.vehicle; - } - return NULL; - } - if (!strncmp(oprefix,def_mapset,strlen(def_mapset))) { - oprefix+=strlen(def_mapset); - if (navit_get_attr(navit.u.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; - } - if (!strncmp(oprefix,def_navigation,strlen(def_navigation))) { - if (navit_get_attr(navit.u.navit, attr_navigation, &attr, NULL)) { - return attr.u.navigation; - } - return NULL; - } - if (!strncmp(oprefix,def_route,strlen(def_route))) { - oprefix+=strlen(def_route); - if (navit_get_attr(navit.u.navit, attr_route, &attr, NULL)) { - return attr.u.route; - } - return NULL; - } - if (!strncmp(oprefix,def_tracking,strlen(def_tracking))) { - if (navit_get_attr(navit.u.navit, attr_trackingo, &attr, NULL)) { - return attr.u.tracking; - } - return NULL; - } - } - return NULL; -} - -static void * -object_get_from_message_arg(DBusMessageIter *iter, char *type) -{ - char *opath; - - if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_OBJECT_PATH) - return NULL; - dbus_message_iter_get_basic(iter, &opath); - dbus_message_iter_next(iter); - return resolve_object(opath, type); -} - -static void * -object_get_from_message(DBusMessage *message, char *type) -{ - return resolve_object(dbus_message_get_path(message), type); -} - -static enum attr_type -attr_type_get_from_message(DBusMessageIter *iter) -{ - char *attr_type; - - if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_STRING) - return attr_none; - dbus_message_iter_get_basic(iter, &attr_type); - dbus_message_iter_next(iter); - return attr_from_name(attr_type); -} - -static void -encode_variant_string(DBusMessageIter *iter, char *str) -{ - DBusMessageIter variant; - dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, DBUS_TYPE_STRING_AS_STRING, &variant); - dbus_message_iter_append_basic(&variant, DBUS_TYPE_STRING, &str); - dbus_message_iter_close_container(iter, &variant); -} - -static void -encode_dict_string_variant_string(DBusMessageIter *iter, char *key, char *value) -{ - DBusMessageIter dict; - dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict); - dbus_message_iter_append_basic(&dict, DBUS_TYPE_STRING, &key); - encode_variant_string(&dict, value); - dbus_message_iter_close_container(iter, &dict); -} - -static int -encode_attr(DBusMessageIter *iter1, struct attr *attr) -{ - char *name=attr_to_name(attr->type); - DBusMessageIter iter2,iter3; - dbus_message_iter_append_basic(iter1, DBUS_TYPE_STRING, &name); - if (attr->type >= attr_type_int_begin && attr->type < attr_type_boolean_begin) { - dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, DBUS_TYPE_INT32_AS_STRING, &iter2); - dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &attr->u.num); - dbus_message_iter_close_container(iter1, &iter2); - } - if (attr->type >= attr_type_boolean_begin && attr->type <= attr_type_int_end) { - dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, DBUS_TYPE_BOOLEAN_AS_STRING, &iter2); - dbus_message_iter_append_basic(&iter2, DBUS_TYPE_BOOLEAN, &attr->u.num); - dbus_message_iter_close_container(iter1, &iter2); - } - if (attr->type >= attr_type_string_begin && attr->type <= attr_type_string_end) { - encode_variant_string(iter1, attr->u.str); - } - if ((attr->type >= attr_type_item_type_begin && attr->type <= attr_type_item_type_end) || attr->type == attr_item_type) { - encode_variant_string(iter1, item_to_name(attr->u.item_type)); - } - if (attr->type >= attr_type_pcoord_begin && attr->type <= attr_type_pcoord_end) { - dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, "ai", &iter2); - dbus_message_iter_open_container(&iter2, DBUS_TYPE_ARRAY, "i", &iter3); - if (attr->u.pcoord) { - dbus_message_iter_append_basic(&iter3, DBUS_TYPE_INT32, &attr->u.pcoord->pro); - dbus_message_iter_append_basic(&iter3, DBUS_TYPE_INT32, &attr->u.pcoord->x); - dbus_message_iter_append_basic(&iter3, DBUS_TYPE_INT32, &attr->u.pcoord->y); - } - dbus_message_iter_close_container(&iter2, &iter3); - dbus_message_iter_close_container(iter1, &iter2); - } - if (attr->type >= attr_type_object_begin && attr->type <= attr_type_object_end) { - char *object=object_new(attr_to_name(attr->type), attr->u.data); - dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter2); - dbus_message_iter_append_basic(&iter2, DBUS_TYPE_OBJECT_PATH, &object); - dbus_message_iter_close_container(iter1, &iter2); - } - if (attr->type == attr_item_types) { - char *str=attr_to_text(attr,NULL,0); - encode_variant_string(iter1, str); - g_free(str); - } - return 1; -} - - -static DBusHandlerResult -empty_reply(DBusConnection *connection, DBusMessage *message) -{ - DBusMessage *reply; - - reply = dbus_message_new_method_return(message); - dbus_connection_send (connection, reply, NULL); - dbus_message_unref (reply); - - return DBUS_HANDLER_RESULT_HANDLED; -} - - -static DBusHandlerResult -dbus_error(DBusConnection *connection, DBusMessage *message, char *error, char *msg) -{ - DBusMessage *reply; - - reply = dbus_message_new_error(message, error, msg); - dbus_connection_send (connection, reply, NULL); - dbus_message_unref (reply); - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult -dbus_error_invalid_attr_type(DBusConnection *connection, DBusMessage *message) -{ - return dbus_error(connection, message, DBUS_ERROR_INVALID_ARGS, "attribute type invalid"); -} - -static DBusHandlerResult -dbus_error_invalid_parameter(DBusConnection *connection, DBusMessage *message) -{ - return dbus_error(connection, message, DBUS_ERROR_INVALID_ARGS, "parameter invalid"); -} - -static DBusHandlerResult -dbus_error_invalid_object_path(DBusConnection *connection, DBusMessage *message) -{ - return dbus_error(connection, message, DBUS_ERROR_BAD_ADDRESS, "object path invalid"); -} - -static DBusHandlerResult -dbus_error_invalid_object_path_parameter(DBusConnection *connection, DBusMessage *message) -{ - return dbus_error(connection, message, DBUS_ERROR_BAD_ADDRESS, "object path parameter invalid"); -} - -static DBusHandlerResult -dbus_error_navigation_not_configured(DBusConnection *connection, DBusMessage *message) -{ - return dbus_error(connection, message, DBUS_ERROR_FAILED, "navigation is not configured (no <navigation> element in config file?)"); -} - -static DBusHandlerResult -dbus_error_no_data_available(DBusConnection *connection, DBusMessage *message) -{ +static char *object_new(char *type, void *object) { + int id; + char *ret; + dbg(lvl_debug,"enter %s", type); + if ((ret=g_hash_table_lookup(object_hash_rev, object))) + return ret; + id=GPOINTER_TO_INT(g_hash_table_lookup(object_count, type)); + g_hash_table_insert(object_count, type, GINT_TO_POINTER((id+1))); + ret=g_strdup_printf("%s/%s/%d", object_path, type, id); + g_hash_table_insert(object_hash, ret, object); + g_hash_table_insert(object_hash_rev, object, ret); + dbg(lvl_debug,"return %s", ret); + return (ret); +} + +static void *object_get(const char *path) { + return g_hash_table_lookup(object_hash, path); +} + +static void object_destroy(const char *path, void *object) { + if (!path && !object) + return; + if (!object) + object=g_hash_table_lookup(object_hash, path); + if (!path) + path=g_hash_table_lookup(object_hash_rev, object); + g_hash_table_remove(object_hash, path); + g_hash_table_remove(object_hash_rev, object); +} + +static void *resolve_object(const char *opath, char *type) { + char *prefix; + const char *oprefix; + void *ret=NULL; + char *def_navit="/default_navit"; + char *def_gui="/default_gui"; + char *def_graphics="/default_graphics"; + char *def_vehicle="/default_vehicle"; + char *def_vehicleprofile="/default_vehicleprofile"; + char *def_mapset="/default_mapset"; + char *def_map="/default_map"; + char *def_navigation="/default_navigation"; + char *def_route="/default_route"; + char *def_tracking="/default_tracking"; + struct attr attr; + + if (strncmp(opath, object_path, strlen(object_path))) { + dbg(lvl_error,"wrong object path %s",opath); + return NULL; + } + prefix=g_strdup_printf("%s/%s/", object_path, type); + if (!strncmp(prefix, opath, strlen(prefix))) { + ret=object_get(opath); + g_free(prefix); + return ret; + } + g_free(prefix); + oprefix=opath+strlen(object_path); + if (!strncmp(oprefix,def_navit,strlen(def_navit))) { + oprefix+=strlen(def_navit); + struct attr navit; + if (!config_get_attr(config, attr_navit, &navit, NULL)) + return NULL; + if (!oprefix[0]) { + dbg(lvl_debug,"default_navit"); + return navit.u.navit; + } + if (!strncmp(oprefix,def_graphics,strlen(def_graphics))) { + if (navit_get_attr(navit.u.navit, attr_graphics, &attr, NULL)) { + return attr.u.graphics; + } + return NULL; + } + if (!strncmp(oprefix,def_gui,strlen(def_gui))) { + if (navit_get_attr(navit.u.navit, attr_gui, &attr, NULL)) { + return attr.u.gui; + } + return NULL; + } + if (!strncmp(oprefix,def_vehicleprofile,strlen(def_vehicleprofile))) { + if (navit_get_attr(navit.u.navit, attr_vehicleprofile, &attr, NULL)) { + return attr.u.vehicleprofile; + } + return NULL; + } + if (!strncmp(oprefix,def_vehicle,strlen(def_vehicle))) { + if (navit_get_attr(navit.u.navit, attr_vehicle, &attr, NULL)) { + return attr.u.vehicle; + } + return NULL; + } + if (!strncmp(oprefix,def_mapset,strlen(def_mapset))) { + oprefix+=strlen(def_mapset); + if (navit_get_attr(navit.u.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; + } + if (!strncmp(oprefix,def_navigation,strlen(def_navigation))) { + if (navit_get_attr(navit.u.navit, attr_navigation, &attr, NULL)) { + return attr.u.navigation; + } + return NULL; + } + if (!strncmp(oprefix,def_route,strlen(def_route))) { + oprefix+=strlen(def_route); + if (navit_get_attr(navit.u.navit, attr_route, &attr, NULL)) { + return attr.u.route; + } + return NULL; + } + if (!strncmp(oprefix,def_tracking,strlen(def_tracking))) { + if (navit_get_attr(navit.u.navit, attr_trackingo, &attr, NULL)) { + return attr.u.tracking; + } + return NULL; + } + } + return NULL; +} + +static void *object_get_from_message_arg(DBusMessageIter *iter, char *type) { + char *opath; + + if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_OBJECT_PATH) + return NULL; + dbus_message_iter_get_basic(iter, &opath); + dbus_message_iter_next(iter); + return resolve_object(opath, type); +} + +static void *object_get_from_message(DBusMessage *message, char *type) { + return resolve_object(dbus_message_get_path(message), type); +} + +static enum attr_type attr_type_get_from_message(DBusMessageIter *iter) { + char *attr_type; + + if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_STRING) + return attr_none; + dbus_message_iter_get_basic(iter, &attr_type); + dbus_message_iter_next(iter); + return attr_from_name(attr_type); +} + +static void encode_variant_string(DBusMessageIter *iter, char *str) { + DBusMessageIter variant; + dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, DBUS_TYPE_STRING_AS_STRING, &variant); + dbus_message_iter_append_basic(&variant, DBUS_TYPE_STRING, &str); + dbus_message_iter_close_container(iter, &variant); +} + +static void encode_dict_string_variant_string(DBusMessageIter *iter, char *key, char *value) { + DBusMessageIter dict; + dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict); + dbus_message_iter_append_basic(&dict, DBUS_TYPE_STRING, &key); + encode_variant_string(&dict, value); + dbus_message_iter_close_container(iter, &dict); +} + +static int encode_attr(DBusMessageIter *iter1, struct attr *attr) { + char *name=attr_to_name(attr->type); + DBusMessageIter iter2,iter3; + dbus_message_iter_append_basic(iter1, DBUS_TYPE_STRING, &name); + if (attr->type >= attr_type_int_begin && attr->type < attr_type_boolean_begin) { + dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, DBUS_TYPE_INT32_AS_STRING, &iter2); + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &attr->u.num); + dbus_message_iter_close_container(iter1, &iter2); + } + if (attr->type >= attr_type_boolean_begin && attr->type <= attr_type_int_end) { + dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, DBUS_TYPE_BOOLEAN_AS_STRING, &iter2); + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_BOOLEAN, &attr->u.num); + dbus_message_iter_close_container(iter1, &iter2); + } + if (attr->type >= attr_type_string_begin && attr->type <= attr_type_string_end) { + encode_variant_string(iter1, attr->u.str); + } + if ((attr->type >= attr_type_item_type_begin && attr->type <= attr_type_item_type_end) + || attr->type == attr_item_type) { + encode_variant_string(iter1, item_to_name(attr->u.item_type)); + } + if (attr->type >= attr_type_pcoord_begin && attr->type <= attr_type_pcoord_end) { + dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, "ai", &iter2); + dbus_message_iter_open_container(&iter2, DBUS_TYPE_ARRAY, "i", &iter3); + if (attr->u.pcoord) { + dbus_message_iter_append_basic(&iter3, DBUS_TYPE_INT32, &attr->u.pcoord->pro); + dbus_message_iter_append_basic(&iter3, DBUS_TYPE_INT32, &attr->u.pcoord->x); + dbus_message_iter_append_basic(&iter3, DBUS_TYPE_INT32, &attr->u.pcoord->y); + } + dbus_message_iter_close_container(&iter2, &iter3); + dbus_message_iter_close_container(iter1, &iter2); + } + if (attr->type >= attr_type_object_begin && attr->type <= attr_type_object_end) { + char *object=object_new(attr_to_name(attr->type), attr->u.data); + dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter2); + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_OBJECT_PATH, &object); + dbus_message_iter_close_container(iter1, &iter2); + } + if (attr->type == attr_item_types) { + char *str=attr_to_text(attr,NULL,0); + encode_variant_string(iter1, str); + g_free(str); + } + return 1; +} + + +static DBusHandlerResult empty_reply(DBusConnection *connection, DBusMessage *message) { + DBusMessage *reply; + + reply = dbus_message_new_method_return(message); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + + return DBUS_HANDLER_RESULT_HANDLED; +} + + +static DBusHandlerResult dbus_error(DBusConnection *connection, DBusMessage *message, char *error, char *msg) { + DBusMessage *reply; + + reply = dbus_message_new_error(message, error, msg); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + return DBUS_HANDLER_RESULT_HANDLED; +} + +static DBusHandlerResult dbus_error_invalid_attr_type(DBusConnection *connection, DBusMessage *message) { + return dbus_error(connection, message, DBUS_ERROR_INVALID_ARGS, "attribute type invalid"); +} + +static DBusHandlerResult dbus_error_invalid_parameter(DBusConnection *connection, DBusMessage *message) { + return dbus_error(connection, message, DBUS_ERROR_INVALID_ARGS, "parameter invalid"); +} + +static DBusHandlerResult dbus_error_invalid_object_path(DBusConnection *connection, DBusMessage *message) { + return dbus_error(connection, message, DBUS_ERROR_BAD_ADDRESS, "object path invalid"); +} + +static DBusHandlerResult dbus_error_invalid_object_path_parameter(DBusConnection *connection, DBusMessage *message) { + return dbus_error(connection, message, DBUS_ERROR_BAD_ADDRESS, "object path parameter invalid"); +} + +static DBusHandlerResult dbus_error_navigation_not_configured(DBusConnection *connection, DBusMessage *message) { + return dbus_error(connection, message, DBUS_ERROR_FAILED, + "navigation is not configured (no <navigation> element in config file?)"); +} + +static DBusHandlerResult dbus_error_traffic_not_configured(DBusConnection *connection, DBusMessage *message) { + return dbus_error(connection, message, DBUS_ERROR_FAILED, + "traffic is not configured (no <traffic> element in config file?)"); +} + +static DBusHandlerResult dbus_error_no_data_available(DBusConnection *connection, DBusMessage *message) { #if 1 - return dbus_error(connection, message, DBUS_ERROR_FILE_NOT_FOUND, "no data available"); + return dbus_error(connection, message, DBUS_ERROR_FILE_NOT_FOUND, "no data available"); #else - return empty_reply(connection, message); + return empty_reply(connection, message); #endif } #if 0 -static void -dbus_dump_iter(char *prefix, DBusMessageIter *iter) -{ - char *prefixr,*vals; - int arg,vali; - DBusMessageIter iterr; - while ((arg=dbus_message_iter_get_arg_type(iter)) != DBUS_TYPE_INVALID) { - switch (arg) { - case DBUS_TYPE_INT32: - dbus_message_iter_get_basic(iter, &vali); - dbg(lvl_debug,"%sDBUS_TYPE_INT32: %d\n",prefix,vali); - break; - case DBUS_TYPE_STRING: - dbus_message_iter_get_basic(iter, &vals); - dbg(lvl_debug,"%sDBUS_TYPE_STRING: %s\n",prefix,vals); - break; - case DBUS_TYPE_STRUCT: - dbg(lvl_debug,"%sDBUS_TYPE_STRUCT:\n",prefix); - prefixr=g_strdup_printf("%s ",prefix); - dbus_message_iter_recurse(iter, &iterr); - dbus_dump_iter(prefixr, &iterr); - g_free(prefixr); - break; - case DBUS_TYPE_VARIANT: - dbg(lvl_debug,"%sDBUS_TYPE_VARIANT:\n",prefix); - prefixr=g_strdup_printf("%s ",prefix); - dbus_message_iter_recurse(iter, &iterr); - dbus_dump_iter(prefixr, &iterr); - g_free(prefixr); - break; - case DBUS_TYPE_DICT_ENTRY: - dbg(lvl_debug,"%sDBUS_TYPE_DICT_ENTRY:\n",prefix); - prefixr=g_strdup_printf("%s ",prefix); - dbus_message_iter_recurse(iter, &iterr); - dbus_dump_iter(prefixr, &iterr); - g_free(prefixr); - break; - case DBUS_TYPE_ARRAY: - dbg(lvl_debug,"%sDBUS_TYPE_ARRAY:\n",prefix); - prefixr=g_strdup_printf("%s ",prefix); - dbus_message_iter_recurse(iter, &iterr); - dbus_dump_iter(prefixr, &iterr); - g_free(prefixr); - break; - default: - dbg(lvl_debug,"%c\n",arg); - } - dbus_message_iter_next(iter); - } -} - -static void -dbus_dump(DBusMessage *message) -{ - DBusMessageIter iter; - - dbus_message_iter_init(message, &iter); - dbus_dump_iter("",&iter); +static void dbus_dump_iter(char *prefix, DBusMessageIter *iter) { + char *prefixr,*vals; + int arg,vali; + DBusMessageIter iterr; + while ((arg=dbus_message_iter_get_arg_type(iter)) != DBUS_TYPE_INVALID) { + switch (arg) { + case DBUS_TYPE_INT32: + dbus_message_iter_get_basic(iter, &vali); + dbg(lvl_debug,"%sDBUS_TYPE_INT32: %d",prefix,vali); + break; + case DBUS_TYPE_STRING: + dbus_message_iter_get_basic(iter, &vals); + dbg(lvl_debug,"%sDBUS_TYPE_STRING: %s",prefix,vals); + break; + case DBUS_TYPE_STRUCT: + dbg(lvl_debug,"%sDBUS_TYPE_STRUCT:",prefix); + prefixr=g_strdup_printf("%s ",prefix); + dbus_message_iter_recurse(iter, &iterr); + dbus_dump_iter(prefixr, &iterr); + g_free(prefixr); + break; + case DBUS_TYPE_VARIANT: + dbg(lvl_debug,"%sDBUS_TYPE_VARIANT:",prefix); + prefixr=g_strdup_printf("%s ",prefix); + dbus_message_iter_recurse(iter, &iterr); + dbus_dump_iter(prefixr, &iterr); + g_free(prefixr); + break; + case DBUS_TYPE_DICT_ENTRY: + dbg(lvl_debug,"%sDBUS_TYPE_DICT_ENTRY:",prefix); + prefixr=g_strdup_printf("%s ",prefix); + dbus_message_iter_recurse(iter, &iterr); + dbus_dump_iter(prefixr, &iterr); + g_free(prefixr); + break; + case DBUS_TYPE_ARRAY: + dbg(lvl_debug,"%sDBUS_TYPE_ARRAY:",prefix); + prefixr=g_strdup_printf("%s ",prefix); + dbus_message_iter_recurse(iter, &iterr); + dbus_dump_iter(prefixr, &iterr); + g_free(prefixr); + break; + default: + dbg(lvl_debug,"%c",arg); + } + dbus_message_iter_next(iter); + } +} + +static void dbus_dump(DBusMessage *message) { + DBusMessageIter iter; + + dbus_message_iter_init(message, &iter); + dbus_dump_iter("",&iter); } #endif @@ -449,9 +417,7 @@ dbus_dump(DBusMessage *message) * @param pc Pointer where the data should get stored * @returns Returns 1 when everything went right, otherwise 0 */ -static int -pcoord_get_from_message(DBusMessage *message, DBusMessageIter *iter, struct pcoord *pc) -{ +static int pcoord_get_from_message(DBusMessage *message, DBusMessageIter *iter, struct pcoord *pc) { if(!strcmp(dbus_message_iter_get_signature(iter), "s")) { char *coordstring; @@ -495,652 +461,583 @@ pcoord_get_from_message(DBusMessage *message, DBusMessageIter *iter, struct pcoo } -static void -pcoord_encode(DBusMessageIter *iter, struct pcoord *pc) -{ - DBusMessageIter iter2; - dbus_message_iter_open_container(iter,DBUS_TYPE_STRUCT,NULL,&iter2); - if (pc) { - dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &pc->pro); - dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &pc->x); - dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &pc->y); - } else { - int n=0; - dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &n); - dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &n); - dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &n); - } - dbus_message_iter_close_container(iter, &iter2); -} - -static enum attr_type -decode_attr_type_from_iter(DBusMessageIter *iter) -{ - char *attr_type; - enum attr_type ret; - - if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_STRING) - return attr_none; - dbus_message_iter_get_basic(iter, &attr_type); - dbus_message_iter_next(iter); - ret=attr_from_name(attr_type); - dbg(lvl_debug, "attr value: 0x%x string: %s\n", ret, attr_type); - return ret; -} - -static int -decode_attr_from_iter(DBusMessageIter *iter, struct attr *attr) -{ - DBusMessageIter iterattr, iterstruct; - int ret=1; - double d; - - attr->type=decode_attr_type_from_iter(iter); - if (attr->type == attr_none) - return 0; - - dbus_message_iter_recurse(iter, &iterattr); - dbus_message_iter_next(iter); - dbg(lvl_debug, "seems valid. signature: %s\n", dbus_message_iter_get_signature(&iterattr)); - - if (attr->type >= attr_type_item_begin && attr->type <= attr_type_item_end) - return 0; - - if (attr->type >= attr_type_int_begin && attr->type <= attr_type_boolean_begin) { - if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_INT32) { - int val; - dbus_message_iter_get_basic(&iterattr, &val); - attr->u.num=val; - return 1; - } - return 0; - } - if(attr->type >= attr_type_boolean_begin && attr->type <= attr_type_int_end) { - if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_BOOLEAN) { - int val; - dbus_message_iter_get_basic(&iterattr, &val); - attr->u.num=val; - return 1; - } - return 0; +static void pcoord_encode(DBusMessageIter *iter, struct pcoord *pc) { + DBusMessageIter iter2; + dbus_message_iter_open_container(iter,DBUS_TYPE_STRUCT,NULL,&iter2); + if (pc) { + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &pc->pro); + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &pc->x); + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &pc->y); + } else { + int n=0; + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &n); + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &n); + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &n); + } + dbus_message_iter_close_container(iter, &iter2); +} + +static enum attr_type decode_attr_type_from_iter(DBusMessageIter *iter) { + char *attr_type; + enum attr_type ret; + + if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_STRING) + return attr_none; + dbus_message_iter_get_basic(iter, &attr_type); + dbus_message_iter_next(iter); + ret=attr_from_name(attr_type); + dbg(lvl_debug, "attr value: 0x%x string: %s", ret, attr_type); + return ret; +} + +static int decode_attr_from_iter(DBusMessageIter *iter, struct attr *attr) { + DBusMessageIter iterattr, iterstruct; + int ret=1; + double d; + + attr->type=decode_attr_type_from_iter(iter); + if (attr->type == attr_none) + return 0; + + dbus_message_iter_recurse(iter, &iterattr); + dbus_message_iter_next(iter); + dbg(lvl_debug, "seems valid. signature: %s", dbus_message_iter_get_signature(&iterattr)); + + if (attr->type >= attr_type_item_begin && attr->type <= attr_type_item_end) + return 0; + + if (attr->type >= attr_type_int_begin && attr->type <= attr_type_boolean_begin) { + if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_INT32) { + int val; + dbus_message_iter_get_basic(&iterattr, &val); + attr->u.num=val; + return 1; + } + return 0; + } + if(attr->type >= attr_type_boolean_begin && attr->type <= attr_type_int_end) { + if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_BOOLEAN) { + int val; + dbus_message_iter_get_basic(&iterattr, &val); + attr->u.num=val; + return 1; + } + 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); + dbus_message_iter_get_basic(&iterattr, attr->u.numd); + return 1; } - 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_object_begin && attr->type <= attr_type_object_end) { + if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_OBJECT_PATH) { + char *obj; + dbus_message_iter_get_basic(&iterattr, &obj); + attr->u.data=object_get(obj); + if (attr->u.data) { + return 1; + } + } + return 0; + } + if(attr->type >= attr_type_coord_geo_begin && attr->type <= attr_type_coord_geo_end) { + if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_STRUCT) { + attr->u.coord_geo=g_new(typeof(*attr->u.coord_geo),1); + dbus_message_iter_recurse(&iterattr, &iterstruct); + if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_DOUBLE) { + dbus_message_iter_get_basic(&iterstruct, &d); + dbus_message_iter_next(&iterstruct); + attr->u.coord_geo->lng=d; + } else + ret=0; + if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_DOUBLE) { + dbus_message_iter_get_basic(&iterstruct, &d); + attr->u.coord_geo->lat=d; + } else + ret=0; + if (!ret) { + g_free(attr->u.coord_geo); + attr->u.coord_geo=NULL; + } + return ret; + } + } + if(attr->type >= attr_type_pcoord_begin && attr->type <= attr_type_pcoord_end) { + int i; + if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_STRUCT) { + attr->u.pcoord=g_new(typeof(*attr->u.pcoord),1); + dbus_message_iter_recurse(&iterattr, &iterstruct); + if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_INT32) { + dbus_message_iter_get_basic(&iterstruct, &i); + dbus_message_iter_next(&iterstruct); + attr->u.pcoord->pro=i; + } else + ret=0; + if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_INT32) { + dbus_message_iter_get_basic(&iterstruct, &i); + dbus_message_iter_next(&iterstruct); + attr->u.pcoord->x=i; + } else + ret=0; + if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_INT32) { + dbus_message_iter_get_basic(&iterstruct, &i); + attr->u.pcoord->y=i; + } else + ret=0; + if (!ret) { + g_free(attr->u.pcoord); + attr->u.pcoord=NULL; + } + return ret; } - 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); - dbus_message_iter_get_basic(&iterattr, attr->u.numd); - return 1; - } - } - if(attr->type >= attr_type_object_begin && attr->type <= attr_type_object_end) { - if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_OBJECT_PATH) { - char *obj; - dbus_message_iter_get_basic(&iterattr, &obj); - attr->u.data=object_get(obj); - if (attr->u.data) { - return 1; - } - } - return 0; - } - if(attr->type >= attr_type_coord_geo_begin && attr->type <= attr_type_coord_geo_end) { - if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_STRUCT) { - attr->u.coord_geo=g_new(typeof(*attr->u.coord_geo),1); - dbus_message_iter_recurse(&iterattr, &iterstruct); - if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_DOUBLE) { - dbus_message_iter_get_basic(&iterstruct, &d); - dbus_message_iter_next(&iterstruct); - attr->u.coord_geo->lng=d; - } else - ret=0; - if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_DOUBLE) { - dbus_message_iter_get_basic(&iterstruct, &d); - attr->u.coord_geo->lat=d; - } else - ret=0; - if (!ret) { - g_free(attr->u.coord_geo); - attr->u.coord_geo=NULL; - } - return ret; - } - } - if(attr->type >= attr_type_pcoord_begin && attr->type <= attr_type_pcoord_end) { - int i; - if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_STRUCT) { - attr->u.pcoord=g_new(typeof(*attr->u.pcoord),1); - dbus_message_iter_recurse(&iterattr, &iterstruct); - if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_INT32) { - dbus_message_iter_get_basic(&iterstruct, &i); - dbus_message_iter_next(&iterstruct); - attr->u.pcoord->pro=i; - } else - ret=0; - if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_INT32) { - dbus_message_iter_get_basic(&iterstruct, &i); - dbus_message_iter_next(&iterstruct); - attr->u.pcoord->x=i; - } else - ret=0; - if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_INT32) { - dbus_message_iter_get_basic(&iterstruct, &i); - attr->u.pcoord->y=i; - } else - ret=0; - if (!ret) { - g_free(attr->u.pcoord); - attr->u.pcoord=NULL; - } - return ret; - } - } - if (attr->type == attr_callback) { - struct dbus_callback *callback=object_get_from_message_arg(&iterattr, "callback"); - if (callback) { - attr->u.callback=callback->callback; - return 1; - } - } - return 0; -} - -static int -decode_attr(DBusMessage *message, struct attr *attr) -{ - DBusMessageIter iter; - - dbus_message_iter_init(message, &iter); - return decode_attr_from_iter(&iter, attr); -} - -static void -destroy_attr(struct attr *attr) -{ - if(attr->type > attr_type_double_begin && attr->type < attr_type_double_end) { - g_free(attr->u.numd); - } -} - -static char * -get_iter_name(char *type) -{ - return g_strdup_printf("%s_attr_iter",type); -} - -static DBusHandlerResult -request_attr_iter(DBusConnection *connection, DBusMessage *message, char *type, struct attr_iter *(*func)(void)) -{ - DBusMessage *reply; - char *iter_name; - char *opath; - struct attr_iter *attr_iter; - - attr_iter=(*func)(); - iter_name=get_iter_name(type); - opath=object_new(iter_name,attr_iter); - g_free(iter_name); - reply = dbus_message_new_method_return(message); - dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); - dbus_connection_send (connection, reply, NULL); - dbus_message_unref (reply); - - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult -request_attr_iter_destroy(DBusConnection *connection, DBusMessage *message, char *type, void (*func)(struct attr_iter *)) -{ - struct attr_iter *attr_iter; - DBusMessageIter iter; - char *iter_name; - - dbus_message_iter_init(message, &iter); - iter_name=get_iter_name(type); - attr_iter=object_get_from_message_arg(&iter, iter_name); - g_free(iter_name); - if (! attr_iter) - return dbus_error_invalid_object_path_parameter(connection, message); - object_destroy(NULL, attr_iter); - func(attr_iter); - - return empty_reply(connection, message); -} - -static DBusHandlerResult -request_destroy(DBusConnection *connection, DBusMessage *message, char *type, void *data, void (*func)(void *)) -{ - if (!data) - data=object_get_from_message(message, type); - if (!data) - return dbus_error_invalid_object_path(connection, message); - object_destroy(NULL, data); - func(data); - - return empty_reply(connection, message); -} - - -static DBusHandlerResult -request_dup(DBusConnection *connection, DBusMessage *message, char *type, void *data, void *(*func)(void *)) -{ - DBusMessage *reply; - char *opath; - void *obj; - if (!data) - data=object_get_from_message(message, type); - if (!data) - return dbus_error_invalid_object_path(connection, message); - obj=func(data); - opath=object_new(type,obj); - reply = dbus_message_new_method_return(message); - dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); - dbus_connection_send (connection, reply, NULL); - dbus_message_unref (reply); - - return DBUS_HANDLER_RESULT_HANDLED; -} - - -static DBusHandlerResult -request_get_attr(DBusConnection *connection, DBusMessage *message, char *type, void *data, int (*func)(void *data, enum attr_type type, struct attr *attr, struct attr_iter *iter)) -{ - DBusMessage *reply; - DBusMessageIter iter; - struct attr attr; - enum attr_type attr_type; - struct attr_iter *attr_iter; - char *iter_name; - - if (! data) - data = object_get_from_message(message, type); - if (! data) - return dbus_error_invalid_object_path(connection, message); - - dbus_message_iter_init(message, &iter); - attr_type=attr_type_get_from_message(&iter); - if (attr_type == attr_none) - return dbus_error_invalid_attr_type(connection, message); - iter_name=get_iter_name(type); - attr_iter=object_get_from_message_arg(&iter, iter_name); - g_free(iter_name); - if (func(data, attr_type, &attr, attr_iter)) { - DBusMessageIter iter1; - reply = dbus_message_new_method_return(message); - dbus_message_iter_init_append(reply, &iter1); - encode_attr(&iter1, &attr); - dbus_connection_send (connection, reply, NULL); - dbus_message_unref (reply); - return DBUS_HANDLER_RESULT_HANDLED; - } - return dbus_error_no_data_available(connection, message); - -} - -static DBusHandlerResult -request_command(DBusConnection *connection, DBusMessage *message, char *type, void *data, int (*func)(void *data, enum attr_type type, struct attr *attr, struct attr_iter *iter)) -{ - DBusMessageIter iter; - struct attr attr; - char *command; - - if (! data) - data = object_get_from_message(message, type); - if (! data) - return dbus_error_invalid_object_path(connection, message); - - dbus_message_iter_init(message, &iter); - if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) - return dbus_error_invalid_parameter(connection, message); - dbus_message_iter_get_basic(&iter, &command); - dbus_message_iter_next(&iter); - if (func(data, attr_callback_list, &attr, NULL)) { - int valid=0; - callback_list_call_attr_4(attr.u.callback_list, attr_command, command, NULL, NULL, &valid); - } - return empty_reply(connection, message); - -} - -static DBusHandlerResult -request_set_add_remove_attr(DBusConnection *connection, DBusMessage *message, char *type, void *data, int (*func)(void *data, struct attr *attr)) -{ - struct attr attr; - int ret; - - if (! data) - data = object_get_from_message(message, type); - if (! data) - return dbus_error_invalid_object_path(connection, message); - - if (decode_attr(message, &attr)) { - ret=(*func)(data, &attr); - destroy_attr(&attr); - if (ret) - return empty_reply(connection, message); - dbg(lvl_error,"failed to set/add/remove attr\n"); - } else { - dbg(lvl_error,"failed to decode attr\n"); - } - return dbus_error_invalid_parameter(connection, message); + } + if (attr->type == attr_callback) { + struct dbus_callback *callback=object_get_from_message_arg(&iterattr, "callback"); + if (callback) { + attr->u.callback=callback->callback; + return 1; + } + } + return 0; +} + +static int decode_attr(DBusMessage *message, struct attr *attr) { + DBusMessageIter iter; + + dbus_message_iter_init(message, &iter); + return decode_attr_from_iter(&iter, attr); +} + +static void destroy_attr(struct attr *attr) { + if(attr->type > attr_type_double_begin && attr->type < attr_type_double_end) { + g_free(attr->u.numd); + } +} + +static char *get_iter_name(char *type) { + return g_strdup_printf("%s_attr_iter",type); +} + +static DBusHandlerResult request_attr_iter(DBusConnection *connection, DBusMessage *message, char *type, + struct attr_iter *(*func)(void)) { + DBusMessage *reply; + char *iter_name; + char *opath; + struct attr_iter *attr_iter; + + attr_iter=(*func)(); + iter_name=get_iter_name(type); + opath=object_new(iter_name,attr_iter); + g_free(iter_name); + reply = dbus_message_new_method_return(message); + dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + + return DBUS_HANDLER_RESULT_HANDLED; +} + +static DBusHandlerResult request_attr_iter_destroy(DBusConnection *connection, DBusMessage *message, char *type, + void (*func)(struct attr_iter *)) { + struct attr_iter *attr_iter; + DBusMessageIter iter; + char *iter_name; + + dbus_message_iter_init(message, &iter); + iter_name=get_iter_name(type); + attr_iter=object_get_from_message_arg(&iter, iter_name); + g_free(iter_name); + if (! attr_iter) + return dbus_error_invalid_object_path_parameter(connection, message); + object_destroy(NULL, attr_iter); + func(attr_iter); + + return empty_reply(connection, message); +} + +static DBusHandlerResult request_destroy(DBusConnection *connection, DBusMessage *message, char *type, void *data, + void (*func)(void *)) { + if (!data) + data=object_get_from_message(message, type); + if (!data) + return dbus_error_invalid_object_path(connection, message); + object_destroy(NULL, data); + func(data); + + return empty_reply(connection, message); +} + + +static DBusHandlerResult request_dup(DBusConnection *connection, DBusMessage *message, char *type, void *data, + void *(*func)(void *)) { + DBusMessage *reply; + char *opath; + void *obj; + if (!data) + data=object_get_from_message(message, type); + if (!data) + return dbus_error_invalid_object_path(connection, message); + obj=func(data); + opath=object_new(type,obj); + reply = dbus_message_new_method_return(message); + dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + + return DBUS_HANDLER_RESULT_HANDLED; +} + + +static DBusHandlerResult request_get_attr(DBusConnection *connection, DBusMessage *message, char *type, void *data, + int (*func)(void *data, enum attr_type type, struct attr *attr, struct attr_iter *iter)) { + DBusMessage *reply; + DBusMessageIter iter; + struct attr attr; + enum attr_type attr_type; + struct attr_iter *attr_iter; + char *iter_name; + + if (! data) + data = object_get_from_message(message, type); + if (! data) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + attr_type=attr_type_get_from_message(&iter); + if (attr_type == attr_none) + return dbus_error_invalid_attr_type(connection, message); + iter_name=get_iter_name(type); + attr_iter=object_get_from_message_arg(&iter, iter_name); + g_free(iter_name); + if (func(data, attr_type, &attr, attr_iter)) { + DBusMessageIter iter1; + reply = dbus_message_new_method_return(message); + dbus_message_iter_init_append(reply, &iter1); + encode_attr(&iter1, &attr); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + return DBUS_HANDLER_RESULT_HANDLED; + } + return dbus_error_no_data_available(connection, message); + +} + +static DBusHandlerResult request_command(DBusConnection *connection, DBusMessage *message, char *type, void *data, + int (*func)(void *data, enum attr_type type, struct attr *attr, struct attr_iter *iter)) { + DBusMessageIter iter; + struct attr attr; + char *command; + + if (! data) + data = object_get_from_message(message, type); + if (! data) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) + return dbus_error_invalid_parameter(connection, message); + dbus_message_iter_get_basic(&iter, &command); + dbus_message_iter_next(&iter); + if (func(data, attr_callback_list, &attr, NULL)) { + int valid=0; + callback_list_call_attr_4(attr.u.callback_list, attr_command, command, NULL, NULL, &valid); + } + return empty_reply(connection, message); + +} + +static DBusHandlerResult request_set_add_remove_attr(DBusConnection *connection, DBusMessage *message, char *type, + void *data, int (*func)(void *data, struct attr *attr)) { + struct attr attr; + int ret; + + if (! data) + data = object_get_from_message(message, type); + if (! data) + return dbus_error_invalid_object_path(connection, message); + + if (decode_attr(message, &attr)) { + ret=(*func)(data, &attr); + destroy_attr(&attr); + if (ret) + return empty_reply(connection, message); + dbg(lvl_error,"failed to set/add/remove attr"); + } else { + dbg(lvl_error,"failed to decode attr"); + } + return dbus_error_invalid_parameter(connection, message); } /* callback */ -static void -dbus_callback_emit_signal(struct dbus_callback *dbus_callback) -{ - DBusMessage* msg; - msg = dbus_message_new_signal(object_path, service_name, dbus_callback->signal); - if (msg) { - dbus_connection_send(connection, msg, &dbus_serial); - dbus_connection_flush(connection); - dbus_message_unref(msg); - } -} - -static void -request_callback_destroy_do(struct dbus_callback *data) -{ - callback_destroy(data->callback); - g_free(data->signal); - g_free(data); -} - -static DBusHandlerResult -request_callback_destroy(DBusConnection *connection, DBusMessage *message) -{ - return request_destroy(connection, message, "callback", NULL, (void (*)(void *)) request_callback_destroy_do); -} - -static DBusHandlerResult -request_callback_new(DBusConnection *connection, DBusMessage *message) -{ - DBusMessageIter iter; - DBusMessage *reply; - struct dbus_callback *callback; - char *signal,*opath; - enum attr_type type; - - dbus_message_iter_init(message, &iter); - if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) - return dbus_error_invalid_parameter(connection, message); - dbus_message_iter_get_basic(&iter, &signal); - dbus_message_iter_next(&iter); - callback=g_new0(struct dbus_callback, 1); - callback->signal=g_strdup(signal); - - if (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_STRING) { - type=attr_type_get_from_message(&iter); - callback->callback=callback_new_attr_1(callback_cast(dbus_callback_emit_signal), type, callback); - } else - callback->callback=callback_new_1(callback_cast(dbus_callback_emit_signal), callback); - opath=object_new("callback", callback); - reply = dbus_message_new_method_return(message); - dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); - dbus_connection_send (connection, reply, NULL); - dbus_message_unref (reply); - return DBUS_HANDLER_RESULT_HANDLED; +static void dbus_callback_emit_signal(struct dbus_callback *dbus_callback) { + DBusMessage* msg; + msg = dbus_message_new_signal(object_path, service_name, dbus_callback->signal); + if (msg) { + dbus_connection_send(connection, msg, &dbus_serial); + dbus_connection_flush(connection); + dbus_message_unref(msg); + } +} + +static void request_callback_destroy_do(struct dbus_callback *data) { + callback_destroy(data->callback); + g_free(data->signal); + g_free(data); +} + +static DBusHandlerResult request_callback_destroy(DBusConnection *connection, DBusMessage *message) { + return request_destroy(connection, message, "callback", NULL, (void (*)(void *)) request_callback_destroy_do); +} + +static DBusHandlerResult request_callback_new(DBusConnection *connection, DBusMessage *message) { + DBusMessageIter iter; + DBusMessage *reply; + struct dbus_callback *callback; + char *signal,*opath; + enum attr_type type; + + dbus_message_iter_init(message, &iter); + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) + return dbus_error_invalid_parameter(connection, message); + dbus_message_iter_get_basic(&iter, &signal); + dbus_message_iter_next(&iter); + callback=g_new0(struct dbus_callback, 1); + callback->signal=g_strdup(signal); + + if (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_STRING) { + type=attr_type_get_from_message(&iter); + callback->callback=callback_new_attr_1(callback_cast(dbus_callback_emit_signal), type, callback); + } else + callback->callback=callback_new_1(callback_cast(dbus_callback_emit_signal), callback); + opath=object_new("callback", callback); + reply = dbus_message_new_method_return(message); + dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + return DBUS_HANDLER_RESULT_HANDLED; } /* config */ -static DBusHandlerResult -request_config_get_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_get_attr(connection, message, "config", config, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))config_get_attr); +static DBusHandlerResult request_config_get_attr(DBusConnection *connection, DBusMessage *message) { + return request_get_attr(connection, message, "config", config, (int (*)(void *, enum attr_type, struct attr *, + struct attr_iter *))config_get_attr); } -static DBusHandlerResult -request_config_attr_iter(DBusConnection *connection, DBusMessage *message) -{ - return request_attr_iter(connection, message, "config", (struct attr_iter * (*)(void))config_attr_iter_new); +static DBusHandlerResult request_config_attr_iter(DBusConnection *connection, DBusMessage *message) { + return request_attr_iter(connection, message, "config", (struct attr_iter * (*)(void))config_attr_iter_new); } -static DBusHandlerResult -request_config_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) -{ - return request_attr_iter_destroy(connection, message, "config", (void (*)(struct attr_iter *))config_attr_iter_destroy); +static DBusHandlerResult request_config_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) { + return request_attr_iter_destroy(connection, message, "config", (void (*)(struct attr_iter *))config_attr_iter_destroy); } /* graphics */ -static DBusHandlerResult -request_graphics_get_data(DBusConnection *connection, DBusMessage *message) -{ - struct graphics *graphics; - char *data; - struct graphics_data_image *image; - DBusMessage *reply; - - graphics = object_get_from_message(message, "graphics"); - if (! graphics) - return dbus_error_invalid_object_path(connection, message); - - if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &data, DBUS_TYPE_INVALID)) - return dbus_error_invalid_parameter(connection, message); - image=graphics_get_data(graphics, data); - if (image) { - DBusMessageIter iter1,iter2; - reply = dbus_message_new_method_return(message); +static DBusHandlerResult request_graphics_get_data(DBusConnection *connection, DBusMessage *message) { + struct graphics *graphics; + char *data; + struct graphics_data_image *image; + DBusMessage *reply; + + graphics = object_get_from_message(message, "graphics"); + if (! graphics) + return dbus_error_invalid_object_path(connection, message); + + if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &data, DBUS_TYPE_INVALID)) + return dbus_error_invalid_parameter(connection, message); + image=graphics_get_data(graphics, data); + if (image) { + DBusMessageIter iter1,iter2; + reply = dbus_message_new_method_return(message); #if 0 - dbus_message_append_args(reply, DBUS_TYPE_STRING, &result, DBUS_TYPE_INVALID); + dbus_message_append_args(reply, DBUS_TYPE_STRING, &result, DBUS_TYPE_INVALID); #endif - dbus_message_iter_init_append(reply, &iter1); - dbus_message_iter_open_container(&iter1, DBUS_TYPE_ARRAY, "y", &iter2); - if (image->data && image->size) - dbus_message_iter_append_fixed_array(&iter2, DBUS_TYPE_BYTE, &image->data, image->size); - dbus_message_iter_close_container(&iter1, &iter2); - dbus_connection_send (connection, reply, NULL); - dbus_message_unref (reply); - return DBUS_HANDLER_RESULT_HANDLED; - } - return dbus_error_no_data_available(connection, message); + dbus_message_iter_init_append(reply, &iter1); + dbus_message_iter_open_container(&iter1, DBUS_TYPE_ARRAY, "y", &iter2); + if (image->data && image->size) + dbus_message_iter_append_fixed_array(&iter2, DBUS_TYPE_BYTE, &image->data, image->size); + dbus_message_iter_close_container(&iter1, &iter2); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + return DBUS_HANDLER_RESULT_HANDLED; + } + return dbus_error_no_data_available(connection, message); } /* gui */ -static DBusHandlerResult -request_gui_get_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_get_attr(connection, message, "gui", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))gui_get_attr); +static DBusHandlerResult request_gui_get_attr(DBusConnection *connection, DBusMessage *message) { + return request_get_attr(connection, message, "gui", NULL, (int (*)(void *, enum attr_type, struct attr *, + struct attr_iter *))gui_get_attr); } -static DBusHandlerResult -request_gui_command(DBusConnection *connection, DBusMessage *message) -{ - return request_command(connection, message, "gui", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))gui_get_attr); +static DBusHandlerResult request_gui_command(DBusConnection *connection, DBusMessage *message) { + return request_command(connection, message, "gui", NULL, (int (*)(void *, enum attr_type, struct attr *, + struct attr_iter *))gui_get_attr); } -static DBusHandlerResult -request_graphics_set_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_set_add_remove_attr(connection, message, "graphics", NULL, (int (*)(void *, struct attr *))graphics_set_attr); +static DBusHandlerResult request_graphics_set_attr(DBusConnection *connection, DBusMessage *message) { + return request_set_add_remove_attr(connection, message, "graphics", NULL, (int (*)(void *, + struct attr *))graphics_set_attr); } /* layout */ -static DBusHandlerResult -request_layout_get_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_get_attr(connection, message, "layout", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))layout_get_attr); +static DBusHandlerResult request_layout_get_attr(DBusConnection *connection, DBusMessage *message) { + return request_get_attr(connection, message, "layout", NULL, (int (*)(void *, enum attr_type, struct attr *, + struct attr_iter *))layout_get_attr); } /* map */ -static DBusHandlerResult -request_map_get_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_get_attr(connection, message, "map", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))map_get_attr); +static DBusHandlerResult request_map_get_attr(DBusConnection *connection, DBusMessage *message) { + return request_get_attr(connection, message, "map", NULL, (int (*)(void *, enum attr_type, struct attr *, + struct attr_iter *))map_get_attr); } -static DBusHandlerResult -request_map_set_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_set_add_remove_attr(connection, message, "map", NULL, (int (*)(void *, struct attr *))map_set_attr); +static DBusHandlerResult request_map_set_attr(DBusConnection *connection, DBusMessage *message) { + return request_set_add_remove_attr(connection, message, "map", NULL, (int (*)(void *, struct attr *))map_set_attr); } -static DBusHandlerResult -request_map_dump(DBusConnection *connection, DBusMessage *message) -{ - DBusMessageIter iter; - struct map *map; - - map=object_get_from_message(message, "map"); - if (! map) - return dbus_error_invalid_object_path(connection, message); - - dbus_message_iter_init(message, &iter); - if(!strcmp(dbus_message_iter_get_signature(&iter), "s")) { - char *file; - FILE *f; - dbus_message_iter_get_basic(&iter, &file); - /* dbg(0,"File '%s'\n",file); */ - f=fopen(file,"w"); - map_dump_filedesc(map,f); - fclose(f); - return empty_reply(connection, message); - } - return dbus_error_invalid_parameter(connection, message); +static DBusHandlerResult request_map_dump(DBusConnection *connection, DBusMessage *message) { + DBusMessageIter iter; + struct map *map; + + map=object_get_from_message(message, "map"); + if (! map) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + if(!strcmp(dbus_message_iter_get_signature(&iter), "s")) { + char *file; + FILE *f; + dbus_message_iter_get_basic(&iter, &file); + /* dbg(0,"File '%s'",file); */ + f=fopen(file,"w"); + map_dump_filedesc(map,f); + fclose(f); + return empty_reply(connection, message); + } + return dbus_error_invalid_parameter(connection, message); } /* mapset */ -static DBusHandlerResult -request_mapset_attr_iter(DBusConnection *connection, DBusMessage *message) -{ - return request_attr_iter(connection, message, "mapset", (struct attr_iter * (*)(void))mapset_attr_iter_new); +static DBusHandlerResult request_mapset_attr_iter(DBusConnection *connection, DBusMessage *message) { + return request_attr_iter(connection, message, "mapset", (struct attr_iter * (*)(void))mapset_attr_iter_new); } -static DBusHandlerResult -request_mapset_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) -{ - return request_attr_iter_destroy(connection, message, "mapset", (void (*)(struct attr_iter *))mapset_attr_iter_destroy); +static DBusHandlerResult request_mapset_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) { + return request_attr_iter_destroy(connection, message, "mapset", (void (*)(struct attr_iter *))mapset_attr_iter_destroy); } -static DBusHandlerResult -request_mapset_get_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_get_attr(connection, message, "mapset", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))mapset_get_attr); +static DBusHandlerResult request_mapset_get_attr(DBusConnection *connection, DBusMessage *message) { + return request_get_attr(connection, message, "mapset", NULL, (int (*)(void *, enum attr_type, struct attr *, + struct attr_iter *))mapset_get_attr); } /* navigation */ -static DBusHandlerResult -request_navigation_get_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_get_attr(connection, message, "navigation", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))navigation_get_attr); +static DBusHandlerResult request_navigation_get_attr(DBusConnection *connection, DBusMessage *message) { + return request_get_attr(connection, message, "navigation", NULL, (int (*)(void *, enum attr_type, struct attr *, + struct attr_iter *))navigation_get_attr); } /* osd */ -static DBusHandlerResult -request_osd_get_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_get_attr(connection, message, "osd", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))osd_get_attr); +static DBusHandlerResult request_osd_get_attr(DBusConnection *connection, DBusMessage *message) { + return request_get_attr(connection, message, "osd", NULL, (int (*)(void *, enum attr_type, struct attr *, + struct attr_iter *))osd_get_attr); } -static DBusHandlerResult -request_osd_set_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_set_add_remove_attr(connection, message, "osd", NULL, (int (*)(void *, struct attr *))osd_set_attr); +static DBusHandlerResult request_osd_set_attr(DBusConnection *connection, DBusMessage *message) { + return request_set_add_remove_attr(connection, message, "osd", NULL, (int (*)(void *, struct attr *))osd_set_attr); } /* roadprofile */ -static DBusHandlerResult -request_roadprofile_get_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_get_attr(connection, message, "roadprofile", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))roadprofile_get_attr); +static DBusHandlerResult request_roadprofile_get_attr(DBusConnection *connection, DBusMessage *message) { + return request_get_attr(connection, message, "roadprofile", NULL, (int (*)(void *, enum attr_type, struct attr *, + struct attr_iter *))roadprofile_get_attr); } -static DBusHandlerResult -request_roadprofile_set_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_set_add_remove_attr(connection, message, "roadprofile", NULL, (int (*)(void *, struct attr *))roadprofile_set_attr); +static DBusHandlerResult request_roadprofile_set_attr(DBusConnection *connection, DBusMessage *message) { + return request_set_add_remove_attr(connection, message, "roadprofile", NULL, (int (*)(void *, + struct attr *))roadprofile_set_attr); } -static DBusHandlerResult -request_roadprofile_attr_iter(DBusConnection *connection, DBusMessage *message) -{ - return request_attr_iter(connection, message, "roadprofile", (struct attr_iter * (*)(void))roadprofile_attr_iter_new); +static DBusHandlerResult request_roadprofile_attr_iter(DBusConnection *connection, DBusMessage *message) { + return request_attr_iter(connection, message, "roadprofile", (struct attr_iter * (*)(void))roadprofile_attr_iter_new); } -static DBusHandlerResult -request_roadprofile_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) -{ - return request_attr_iter_destroy(connection, message, "roadprofile", (void (*)(struct attr_iter *))roadprofile_attr_iter_destroy); +static DBusHandlerResult request_roadprofile_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) { + return request_attr_iter_destroy(connection, message, "roadprofile", + (void (*)(struct attr_iter *))roadprofile_attr_iter_destroy); } /* route */ -static DBusHandlerResult -request_route_get_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_get_attr(connection, message, "route", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))route_get_attr); +static DBusHandlerResult request_route_get_attr(DBusConnection *connection, DBusMessage *message) { + return request_get_attr(connection, message, "route", NULL, (int (*)(void *, enum attr_type, struct attr *, + struct attr_iter *))route_get_attr); } -static DBusHandlerResult -request_route_set_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_set_add_remove_attr(connection, message, "route", NULL, (int (*)(void *, struct attr *))route_set_attr); +static DBusHandlerResult request_route_set_attr(DBusConnection *connection, DBusMessage *message) { + return request_set_add_remove_attr(connection, message, "route", NULL, (int (*)(void *, struct attr *))route_set_attr); } -static DBusHandlerResult -request_route_add_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_set_add_remove_attr(connection, message, "route", NULL, (int (*)(void *, struct attr *))route_add_attr); +static DBusHandlerResult request_route_add_attr(DBusConnection *connection, DBusMessage *message) { + return request_set_add_remove_attr(connection, message, "route", NULL, (int (*)(void *, struct attr *))route_add_attr); } -static DBusHandlerResult -request_route_remove_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_set_add_remove_attr(connection, message, "route", NULL, (int (*)(void *, struct attr *))route_remove_attr); +static DBusHandlerResult request_route_remove_attr(DBusConnection *connection, DBusMessage *message) { + return request_set_add_remove_attr(connection, message, "route", NULL, (int (*)(void *, + struct attr *))route_remove_attr); } -static DBusHandlerResult -request_route_destroy(DBusConnection *connection, DBusMessage *message) -{ - return request_destroy(connection, message, "route", NULL, (void (*)(void *)) route_destroy); +static DBusHandlerResult request_route_destroy(DBusConnection *connection, DBusMessage *message) { + return request_destroy(connection, message, "route", NULL, (void (*)(void *)) route_destroy); } -static DBusHandlerResult -request_route_dup(DBusConnection *connection, DBusMessage *message) -{ - return request_dup(connection, message, "route", NULL, (void *(*)(void *)) route_dup); +static DBusHandlerResult request_route_dup(DBusConnection *connection, DBusMessage *message) { + return request_dup(connection, message, "route", NULL, (void *(*)(void *)) route_dup); } /* navit */ -static DBusHandlerResult -request_navit_draw(DBusConnection *connection, DBusMessage *message) -{ - struct navit *navit; +static DBusHandlerResult request_navit_draw(DBusConnection *connection, DBusMessage *message) { + struct navit *navit; - navit=object_get_from_message(message, "navit"); - if (! navit) - return dbus_error_invalid_object_path(connection, message); + navit=object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); - navit_draw(navit); + navit_draw(navit); - return empty_reply(connection, message); + return empty_reply(connection, message); } @@ -1152,33 +1049,31 @@ request_navit_draw(DBusConnection *connection, DBusMessage *message) * @param p Pointer where the data should get stored * @returns Returns 1 when everything went right, otherwise 0 */ -static int -point_get_from_message(DBusMessage *message, DBusMessageIter *iter, struct point *p) -{ - DBusMessageIter iter2; +static int point_get_from_message(DBusMessage *message, DBusMessageIter *iter, struct point *p) { + DBusMessageIter iter2; - dbg(lvl_debug,"%s\n", dbus_message_iter_get_signature(iter)); + dbg(lvl_debug,"%s", dbus_message_iter_get_signature(iter)); - dbus_message_iter_recurse(iter, &iter2); + dbus_message_iter_recurse(iter, &iter2); - if (dbus_message_iter_get_arg_type(&iter2) != DBUS_TYPE_INT32) - return 0; - dbus_message_iter_get_basic(&iter2, &p->x); + if (dbus_message_iter_get_arg_type(&iter2) != DBUS_TYPE_INT32) + return 0; + dbus_message_iter_get_basic(&iter2, &p->x); - dbus_message_iter_next(&iter2); + dbus_message_iter_next(&iter2); - if (dbus_message_iter_get_arg_type(&iter2) != DBUS_TYPE_INT32) - return 0; - dbus_message_iter_get_basic(&iter2, &p->y); + if (dbus_message_iter_get_arg_type(&iter2) != DBUS_TYPE_INT32) + return 0; + dbus_message_iter_get_basic(&iter2, &p->y); - dbg(lvl_debug, " x -> %x y -> %x\n", p->x, p->y); + dbg(lvl_debug, " x -> %x y -> %x", p->x, p->y); - dbus_message_iter_next(&iter2); + dbus_message_iter_next(&iter2); - if (dbus_message_iter_get_arg_type(&iter2) != DBUS_TYPE_INVALID) - return 0; + if (dbus_message_iter_get_arg_type(&iter2) != DBUS_TYPE_INVALID) + return 0; - return 1; + return 1; } /** @@ -1188,20 +1083,18 @@ point_get_from_message(DBusMessage *message, DBusMessageIter *iter, struct point * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED */ -static DBusHandlerResult -request_navit_add_message(DBusConnection *connection, DBusMessage *message) -{ - struct navit *navit; - char *usermessage; +static DBusHandlerResult request_navit_add_message(DBusConnection *connection, DBusMessage *message) { + struct navit *navit; + char *usermessage; DBusMessageIter iter; - navit=object_get_from_message(message, "navit"); - if (! navit) - return dbus_error_invalid_object_path(connection, message); + navit=object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); - dbus_message_iter_init(message, &iter); - dbus_message_iter_get_basic(&iter, &usermessage); + dbus_message_iter_init(message, &iter); + dbus_message_iter_get_basic(&iter, &usermessage); navit_add_message(navit, usermessage); @@ -1216,24 +1109,22 @@ request_navit_add_message(DBusConnection *connection, DBusMessage *message) * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED */ -static DBusHandlerResult -request_navit_set_center(DBusConnection *connection, DBusMessage *message) -{ - struct pcoord pc; - struct navit *navit; - DBusMessageIter iter; +static DBusHandlerResult request_navit_set_center(DBusConnection *connection, DBusMessage *message) { + struct pcoord pc; + struct navit *navit; + DBusMessageIter iter; - navit=object_get_from_message(message, "navit"); - if (! navit) - return dbus_error_invalid_object_path(connection, message); + navit=object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); - dbus_message_iter_init(message, &iter); + dbus_message_iter_init(message, &iter); - if (!pcoord_get_from_message(message, &iter, &pc)) - return dbus_error_invalid_parameter(connection, message); + if (!pcoord_get_from_message(message, &iter, &pc)) + return dbus_error_invalid_parameter(connection, message); - navit_set_center(navit, &pc, 0); - return empty_reply(connection, message); + navit_set_center(navit, &pc, 0); + return empty_reply(connection, message); } /** @@ -1242,23 +1133,21 @@ request_navit_set_center(DBusConnection *connection, DBusMessage *message) * @param message The DBusMessage containing the x and y value * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED */ -static DBusHandlerResult -request_navit_set_center_screen(DBusConnection *connection, DBusMessage *message) -{ - struct point p; - struct navit *navit; - DBusMessageIter iter; +static DBusHandlerResult request_navit_set_center_screen(DBusConnection *connection, DBusMessage *message) { + struct point p; + struct navit *navit; + DBusMessageIter iter; - navit=object_get_from_message(message, "navit"); - if (! navit) - return dbus_error_invalid_object_path(connection, message); + navit=object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); - dbus_message_iter_init(message, &iter); + dbus_message_iter_init(message, &iter); - if (!point_get_from_message(message, &iter, &p)) - return dbus_error_invalid_parameter(connection, message); - navit_set_center_screen(navit, &p, 0); - return empty_reply(connection, message); + if (!point_get_from_message(message, &iter, &p)) + return dbus_error_invalid_parameter(connection, message); + navit_set_center_screen(navit, &p, 0); + return empty_reply(connection, message); } /** @@ -1267,28 +1156,26 @@ request_navit_set_center_screen(DBusConnection *connection, DBusMessage *message * @param message The DBusMessage containing the name of the layout * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED */ -static DBusHandlerResult -request_navit_set_layout(DBusConnection *connection, DBusMessage *message) -{ - char *new_layout_name; - struct navit *navit; - struct attr attr; - struct attr_iter *iter; - - navit=object_get_from_message(message, "navit"); - if (! navit) - return dbus_error_invalid_object_path(connection, message); - - if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &new_layout_name, DBUS_TYPE_INVALID)) - return dbus_error_invalid_parameter(connection, message); - - iter=navit_attr_iter_new(); - while(navit_get_attr(navit, attr_layout, &attr, iter)) { - if (strcmp(attr.u.layout->name, new_layout_name) == 0) { - navit_set_attr(navit, &attr); - } - } - return empty_reply(connection, message); +static DBusHandlerResult request_navit_set_layout(DBusConnection *connection, DBusMessage *message) { + char *new_layout_name; + struct navit *navit; + struct attr attr; + struct attr_iter *iter; + + navit=object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &new_layout_name, DBUS_TYPE_INVALID)) + return dbus_error_invalid_parameter(connection, message); + + iter=navit_attr_iter_new(); + while(navit_get_attr(navit, attr_layout, &attr, iter)) { + if (strcmp(attr.u.layout->name, new_layout_name) == 0) { + navit_set_attr(navit, &attr); + } + } + return empty_reply(connection, message); } /** @@ -1297,142 +1184,322 @@ request_navit_set_layout(DBusConnection *connection, DBusMessage *message) * @param message The DBusMessage * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED */ -static DBusHandlerResult -request_navit_quit(DBusConnection *connection, DBusMessage *message) -{ - dbg(lvl_debug,"Got a quit request from DBUS\n"); - struct attr navit; - navit.type=attr_navit; - struct navit *nav; - nav = object_get_from_message(message, "navit"); - if (! nav) - return dbus_error_invalid_object_path(connection, message); - navit.u.navit=nav; - config_remove_attr(config, &navit); - - struct callback *callback; - callback=callback_new_1(callback_cast(event_main_loop_quit), NULL); - event_add_timeout(1000, 1, callback); - return empty_reply(connection, message); +static DBusHandlerResult request_navit_quit(DBusConnection *connection, DBusMessage *message) { + dbg(lvl_debug,"Got a quit request from DBUS"); + struct attr navit; + navit.type=attr_navit; + struct navit *nav; + nav = object_get_from_message(message, "navit"); + if (! nav) + return dbus_error_invalid_object_path(connection, message); + navit.u.navit=nav; + config_remove_attr(config, &navit); + + struct callback *callback; + callback=callback_new_1(callback_cast(event_main_loop_quit), NULL); + event_add_timeout(1000, 1, callback); + return empty_reply(connection, message); } -static DBusHandlerResult -request_navit_zoom(DBusConnection *connection, DBusMessage *message) -{ - int factor; - struct point p, *pp=NULL; - struct navit *navit; - DBusMessageIter iter; - - navit = object_get_from_message(message, "navit"); - if (! navit) - return dbus_error_invalid_object_path(connection, message); +/** + * @brief Exports currently active traffic distortions as a GPX file. + * + * @param connection The DBusConnection object through which a message arrived + * @param message The DBusMessage including the `filename` parameter + * @returns An empty reply if everything went right, otherwise `DBUS_HANDLER_RESULT_NOT_YET_HANDLED` + */ +static DBusHandlerResult request_navit_traffic_export_gpx(DBusConnection *connection, DBusMessage *message) { + char * filename; + struct navit * navit; + DBusMessageIter iter; + struct attr attr; + struct attr_iter * a_iter; + struct traffic * traffic = NULL; + FILE *fp; + struct traffic_message ** messages; + struct traffic_message ** curr_msg; + char * wpt_types[] = {"from", "at", "via", "not_via", "to"}; + struct traffic_point * wpts[5]; + int i; + struct item ** items; + struct item ** curr_itm; + int dir, lastdir = 0; + struct coord c, c_last; + struct coord_geo g; + + char *header = "<?xml version='1.0' encoding='UTF-8'?>\n" + "<gpx version='1.1' creator='Navit http://navit.sourceforge.net'\n" + " xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'\n" + " xmlns:navit='http://www.navit-project.org/schema/navit'\n" + " xmlns='http://www.topografix.com/GPX/1/1'\n" + " xsi:schemaLocation='http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd'>\n"; + char *trailer = "</gpx>\n"; + + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + + dbus_message_iter_get_basic(&iter, &filename); + + a_iter = navit_attr_iter_new(); + if (navit_get_attr(navit, attr_traffic, &attr, a_iter)) + traffic = (struct traffic *) attr.u.navit_object; + navit_attr_iter_destroy(a_iter); + + if (!traffic) + return dbus_error_traffic_not_configured(connection, message); + + dbg(lvl_debug,"Dumping traffic distortions from dbus to %s", filename); + + fp = fopen(filename, "w"); + if (!fp) { + return dbus_error(connection, message, DBUS_ERROR_FAILED, + "could not open file for writing"); + } - dbus_message_iter_init(message, &iter); - dbg(lvl_debug,"%s\n", dbus_message_iter_get_signature(&iter)); + fprintf(fp, "%s", header); + + messages = traffic_get_stored_messages(traffic); + + for (curr_msg = messages; *curr_msg; curr_msg++) { + if (!(*curr_msg)->location) + continue; + wpts[0] = (*curr_msg)->location->from; + wpts[1] = (*curr_msg)->location->at; + wpts[2] = (*curr_msg)->location->via; + wpts[3] = (*curr_msg)->location->not_via; + wpts[4] = (*curr_msg)->location->to; + for (i = 0; i <= 4; i++) { + if (!wpts[i]) + continue; + fprintf(fp, "<wpt lon='%4.16f' lat='%4.16f'><type>%s</type><name>%s</name></wpt>\n", + wpts[i]->coord.lng, wpts[i]->coord.lat, wpt_types[i], (*curr_msg)->id); + } + } - dbus_message_iter_get_basic(&iter, &factor); + for (curr_msg = messages; *curr_msg; curr_msg++) { + items = traffic_message_get_items(*curr_msg); + for (curr_itm = items; *curr_itm; curr_itm++) { + /* + * Don’t blindly copy this code unless you know what you are doing. + * It is based on various assumptions which hold true for traffic map items, but not necessarily for items + * obtained from other maps. + */ + item_coord_rewind(*curr_itm); + item_coord_get(*curr_itm, &c, 1); + item_attr_rewind(*curr_itm); + if (item_attr_get(*curr_itm, attr_flags, &attr)) { + if (attr.u.num & AF_ONEWAY) + dir = 1; + else if (attr.u.num & AF_ONEWAYREV) + dir = -1; + else + dir = 0; + } else + dir = 0; + if ((curr_itm == items) || (c.x != c_last.x) || (c.y != c_last.y) || lastdir != dir) { + /* + * Start a new route for the first item, or if the last point of the previous item does not coincide + * with the first point of the current one. This includes closing the previous route (if any) and + * adding the first point. + */ + if (curr_itm != items) + fprintf(fp, "</rte>\n"); + fprintf(fp, "<rte><type>%s</type><name>%s</name>\n", + dir ? (dir > 0 ? "forward" : "backward") : "bidirectional", (*curr_msg)->id); + transform_to_geo(projection_mg, &c, &g); + fprintf(fp,"<rtept lon='%4.16f' lat='%4.16f'></rtept>\n", g.lng, g.lat); + } + while (item_coord_get(*curr_itm, &c, 1)) { + transform_to_geo(projection_mg, &c, &g); + fprintf(fp,"<rtept lon='%4.16f' lat='%4.16f'></rtept>\n", g.lng, g.lat); + } + c_last.x = c.x; + c_last.y = c.y; + lastdir = dir; + } + if (curr_itm != items) + fprintf(fp, "</rte>\n"); + g_free(items); + } - if (dbus_message_iter_has_next(&iter)) - { - dbus_message_iter_next(&iter); - if (!point_get_from_message(message, &iter, &p)) - return dbus_error_invalid_parameter(connection, message); - pp=&p; - } + fprintf(fp,"%s",trailer); - if (factor > 1) - navit_zoom_in(navit, factor, pp); - else if (factor < -1) - navit_zoom_out(navit, 0-factor, pp); + fclose(fp); - return empty_reply(connection, message); + g_free(messages); + return empty_reply(connection, message); } /** - * @brief Exports the current route as a GPX file + * @brief Injects a traffic feed. + * * @param connection The DBusConnection object through which a message arrived - * @param message The DBusMessage including the 'filename' parameter - * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED + * @param message The DBusMessage including the `filename` parameter + * @returns An empty reply if everything went right, otherwise `DBUS_HANDLER_RESULT_NOT_YET_HANDLED` */ -static DBusHandlerResult -request_navit_zoom_to_route(DBusConnection *connection, DBusMessage *message) -{ - struct navit *navit; - DBusMessageIter iter; +static DBusHandlerResult request_navit_traffic_inject(DBusConnection *connection, DBusMessage *message) { + char * filename; + struct navit *navit; + DBusMessageIter iter; + struct attr * attr; + struct attr_iter * a_iter; + struct traffic * traffic = NULL; + struct traffic_message ** messages; + + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); - navit = object_get_from_message(message, "navit"); - if (! navit) - return dbus_error_invalid_object_path(connection, message); + dbus_message_iter_get_basic(&iter, &filename); - dbus_message_iter_init(message, &iter); - dbg(lvl_debug,"%s\n", dbus_message_iter_get_signature(&iter)); + attr = g_new0(struct attr, 1); + a_iter = navit_attr_iter_new(); + if (navit_get_attr(navit, attr_traffic, attr, a_iter)) + traffic = (struct traffic *) attr->u.navit_object; + navit_attr_iter_destroy(a_iter); + g_free(attr); - navit_zoom_to_route(navit,0); + if (!traffic) + return dbus_error_traffic_not_configured(connection, message); - return empty_reply(connection, message); + dbg(lvl_debug, "Processing traffic feed from file %s", filename); + messages = traffic_get_messages_from_xml_file(traffic, filename); + if (messages) { + dbg(lvl_debug, "got messages from file %s, processing", filename); + traffic_process_messages(traffic, messages); + g_free(messages); + } + + return empty_reply(connection, message); } -static DBusHandlerResult -request_navit_route_export_gpx(DBusConnection *connection, DBusMessage *message) -{ - char * filename; - struct navit *navit; - DBusMessageIter iter; +static DBusHandlerResult request_navit_zoom(DBusConnection *connection, DBusMessage *message) { + int factor; + struct point p, *pp=NULL; + struct navit *navit; + DBusMessageIter iter; + + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + dbg(lvl_debug,"%s", dbus_message_iter_get_signature(&iter)); + + dbus_message_iter_get_basic(&iter, &factor); + + if (dbus_message_iter_has_next(&iter)) { + dbus_message_iter_next(&iter); + if (!point_get_from_message(message, &iter, &p)) + return dbus_error_invalid_parameter(connection, message); + pp=&p; + } + + if (factor > 1) + navit_zoom_in(navit, factor, pp); + else if (factor < -1) + navit_zoom_out(navit, 0-factor, pp); + + return empty_reply(connection, message); + +} + +static DBusHandlerResult request_navit_zoom_to_route(DBusConnection *connection, DBusMessage *message) { + struct navit *navit; + DBusMessageIter iter; + + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + dbg(lvl_debug,"%s", dbus_message_iter_get_signature(&iter)); + + navit_zoom_to_route(navit,0); + + return empty_reply(connection, message); + +} + +/** + * @brief Exports the current route as a GPX file. + * + * @param connection The DBusConnection object through which a message arrived + * @param message The DBusMessage including the `filename` parameter + * @returns An empty reply if everything went right, otherwise `DBUS_HANDLER_RESULT_NOT_YET_HANDLED` + */ +static DBusHandlerResult request_navit_route_export_gpx(DBusConnection *connection, DBusMessage *message) { + char * filename; + struct navit *navit; + DBusMessageIter iter; + + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); - navit = object_get_from_message(message, "navit"); - if (! navit) - return dbus_error_invalid_object_path(connection, message); + dbus_message_iter_init(message, &iter); - dbus_message_iter_init(message, &iter); + dbus_message_iter_get_basic(&iter, &filename); - dbus_message_iter_get_basic(&iter, &filename); + struct navigation *nav = navit_get_navigation(navit); + if(!nav) { + return dbus_error_navigation_not_configured(connection, message); + } - struct navigation *nav = navit_get_navigation(navit); - if(!nav) { - return dbus_error_navigation_not_configured(connection, message); + dbg(lvl_debug,"Dumping route from dbus to %s", filename); + + struct map * map=NULL; + struct map_rect * mr=NULL; + struct item *item = NULL; + struct attr attr; + struct coord c; + struct coord_geo g; + + char *header = "<?xml version='1.0' encoding='UTF-8'?>\n" + "<gpx version='1.1' creator='Navit http://navit.sourceforge.net'\n" + " xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'\n" + " xmlns:navit='http://www.navit-project.org/schema/navit'\n" + " xmlns='http://www.topografix.com/GPX/1/1'\n" + " xsi:schemaLocation='http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd'>\n" + "<rte>\n"; + char *trailer = "</rte>\n</gpx>\n"; + + map = navigation_get_map(nav); + if(map) + mr = map_rect_new(map,NULL); + + FILE *fp; + fp = fopen(filename,"w"); + if (!fp) { + map_rect_destroy(mr); + return dbus_error(connection, message, DBUS_ERROR_FAILED, + "could not open file for writing"); + } + + fprintf(fp, "%s", header); + + while((item = map_rect_get_item(mr))) { + if(item_attr_get(item,attr_navigation_long,&attr)) { + item_coord_get(item, &c, 1); + transform_to_geo (projection_mg, &c, &g); + fprintf(fp,"<rtept lon='%4.16f' lat='%4.16f'><type>%s</type><name>%s</name></rtept>\n",g.lng, g.lat, + item_to_name(item->type), map_convert_string_tmp(item->map,attr.u.str)); } + } + fprintf(fp,"%s",trailer); - dbg(lvl_debug,"Dumping route from dbus to %s\n", filename); - - struct map * map=NULL; - struct map_rect * mr=NULL; - struct item *item = NULL; - struct attr attr; - struct coord c; - struct coord_geo g; - - char *header = "<?xml version='1.0' encoding='UTF-8'?>\n" - "<gpx version='1.1' creator='Navit http://navit.sourceforge.net'\n" - " xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'\n" - " xmlns:navit='http://www.navit-project.org/schema/navit'\n" - " xmlns='http://www.topografix.com/GPX/1/1'\n" - " xsi:schemaLocation='http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd'>\n" - "<rte>\n"; - char *trailer = "</rte>\n</gpx>\n"; - - map = navigation_get_map(nav); - if(map) - mr = map_rect_new(map,NULL); - - FILE *fp; - fp = fopen(filename,"w"); - fprintf(fp, "%s", header); - - while((item = map_rect_get_item(mr))) { - if(item_attr_get(item,attr_navigation_long,&attr)) { - item_coord_get(item, &c, 1); - transform_to_geo (projection_mg, &c, &g); - fprintf(fp,"<rtept lon='%4.16f' lat='%4.16f'><type>%s</type><name>%s</name></rtept>\n",g.lng, g.lat, item_to_name(item->type), map_convert_string_tmp(item->map,attr.u.str)); - } - } - fprintf(fp,"%s",trailer); - - fclose(fp); - - return empty_reply(connection, message); + fclose(fp); + + map_rect_destroy(mr); + + return empty_reply(connection, message); } /** @@ -1441,627 +1508,589 @@ request_navit_route_export_gpx(DBusConnection *connection, DBusMessage *message) * @param message The DBusMessage including the 'filename' parameter * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED */ -static DBusHandlerResult -request_navit_route_export_geojson(DBusConnection *connection, DBusMessage *message) -{ - char * filename; - struct point p; - struct navit *navit; - DBusMessageIter iter; - - navit = object_get_from_message(message, "navit"); - if (! navit) - return dbus_error_invalid_object_path(connection, message); - - dbus_message_iter_init(message, &iter); - - dbus_message_iter_get_basic(&iter, &filename); - - if (dbus_message_iter_has_next(&iter)) - { - dbus_message_iter_next(&iter); - if (!point_get_from_message(message, &iter, &p)) - return dbus_error_invalid_parameter(connection, message); - } +static DBusHandlerResult request_navit_route_export_geojson(DBusConnection *connection, DBusMessage *message) { + char * filename; + struct point p; + struct navit *navit; + DBusMessageIter iter; - dbg(lvl_debug,"Dumping route from dbus to %s\n", filename); - - struct map * map=NULL; - struct navigation * nav = NULL; - struct map_rect * mr=NULL; - struct item *item = NULL; - struct attr attr; - struct coord c; - struct coord_geo g; - - char *header = "{\n" -" \"type\": \"FeatureCollection\",\n" -" \"features\": [\n" -" {\n" -" \"type\": \"Feature\",\n" -" \"properties\": {\n" -" \"name\": \"Navit route export\",\n" -" \"stroke\": \"red\",\n" -" \"stroke-width\": \"5px\"\n" -" },\n" -" \"geometry\": {\n" -" \"type\": \"LineString\",\n" -" \"coordinates\": [\n"; - - nav = navit_get_navigation(navit); - if(!nav) { - return dbus_error_navigation_not_configured(connection, message); - } - map = navigation_get_map(nav); - if(map) - mr = map_rect_new(map,NULL); - - FILE *fp; - fp = fopen(filename,"w"); - fprintf(fp, "%s", header); - int is_first=1; - char * instructions; - instructions=g_strdup(""); - while((item = map_rect_get_item(mr))) { - if(item_attr_get(item,attr_navigation_long,&attr)) { - item_coord_get(item, &c, 1); - transform_to_geo (projection_mg, &c, &g); - if(!is_first){ - fprintf(fp,",\n"); - instructions=g_strconcat_printf(instructions,",\n"); - } - fprintf(fp,"[ %4.16f, %4.16f ]",g.lng, g.lat); - instructions=g_strconcat_printf(instructions, g_strdup_printf(" { \"type\": \"Feature\", \"properties\": { \"Instruction\": \"%s\", \"name\": \"\" }, \"geometry\": { \"type\": \"Point\", \"coordinates\": [ %4.16f, %4.16f ] } }", map_convert_string_tmp(item->map,attr.u.str), g.lng, g.lat)); - /* fprintf(fp,"<rtept lon='%4.16f' lat='%4.16f'><type>%s</type><name>%s</name></rtept>\n",g.lng, g.lat, item_to_name(item->type), map_convert_string_tmp(item->map,attr.u.str)); */ - is_first=0; - } + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + + dbus_message_iter_get_basic(&iter, &filename); + + if (dbus_message_iter_has_next(&iter)) { + dbus_message_iter_next(&iter); + if (!point_get_from_message(message, &iter, &p)) + return dbus_error_invalid_parameter(connection, message); + } + + dbg(lvl_debug,"Dumping route from dbus to %s", filename); + + struct map * map=NULL; + struct navigation * nav = NULL; + struct map_rect * mr=NULL; + struct item *item = NULL; + struct attr attr; + struct coord c; + struct coord_geo g; + + char *header = "{\n" + " \"type\": \"FeatureCollection\",\n" + " \"features\": [\n" + " {\n" + " \"type\": \"Feature\",\n" + " \"properties\": {\n" + " \"name\": \"Navit route export\",\n" + " \"stroke\": \"red\",\n" + " \"stroke-width\": \"5px\"\n" + " },\n" + " \"geometry\": {\n" + " \"type\": \"LineString\",\n" + " \"coordinates\": [\n"; + + nav = navit_get_navigation(navit); + if(!nav) { + return dbus_error_navigation_not_configured(connection, message); + } + map = navigation_get_map(nav); + if(map) + mr = map_rect_new(map,NULL); + + FILE *fp; + fp = fopen(filename,"w"); + if (!fp) { + return dbus_error(connection, message, DBUS_ERROR_FAILED, + "could not open file for writing"); + } + + fprintf(fp, "%s", header); + int is_first=1; + char * instructions; + instructions=g_strdup(""); + while((item = map_rect_get_item(mr))) { + if(item_attr_get(item,attr_navigation_long,&attr)) { + item_coord_get(item, &c, 1); + transform_to_geo (projection_mg, &c, &g); + if(!is_first) { + fprintf(fp,",\n"); + instructions=g_strconcat_printf(instructions,",\n"); + } + fprintf(fp,"[ %4.16f, %4.16f ]",g.lng, g.lat); + instructions=g_strconcat_printf(instructions, + g_strdup_printf(" { \"type\": \"Feature\", \"properties\": { \"Instruction\": \"%s\", \"name\": \"\" }, \"geometry\": { \"type\": \"Point\", \"coordinates\": [ %4.16f, %4.16f ] } }", + map_convert_string_tmp(item->map,attr.u.str), g.lng, g.lat)); + /* fprintf(fp,"<rtept lon='%4.16f' lat='%4.16f'><type>%s</type><name>%s</name></rtept>\n",g.lng, g.lat, item_to_name(item->type), map_convert_string_tmp(item->map,attr.u.str)); */ + is_first=0; } + } - fprintf(fp," ]}\n },\n%s ]\n }\n",instructions); + fprintf(fp," ]}\n },\n%s ]\n }\n",instructions); - fclose(fp); + fclose(fp); - return empty_reply(connection, message); + return empty_reply(connection, message); } -static DBusHandlerResult -request_navit_block(DBusConnection *connection, DBusMessage *message) -{ - int mode; - struct navit *navit; - DBusMessageIter iter; +static DBusHandlerResult request_navit_block(DBusConnection *connection, DBusMessage *message) { + int mode; + struct navit *navit; + DBusMessageIter iter; - navit = object_get_from_message(message, "navit"); - if (! navit) - return dbus_error_invalid_object_path(connection, message); + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); - dbus_message_iter_init(message, &iter); + dbus_message_iter_init(message, &iter); - dbus_message_iter_get_basic(&iter, &mode); + dbus_message_iter_get_basic(&iter, &mode); - navit_block(navit, mode); - return empty_reply(connection, message); + navit_block(navit, mode); + return empty_reply(connection, message); } -static DBusHandlerResult -request_navit_resize(DBusConnection *connection, DBusMessage *message) -{ - struct navit *navit; - int w, h; - DBusMessageIter iter; +static DBusHandlerResult request_navit_resize(DBusConnection *connection, DBusMessage *message) { + struct navit *navit; + int w, h; + DBusMessageIter iter; - navit = object_get_from_message(message, "navit"); - if (! navit) - return dbus_error_invalid_object_path(connection, message); + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); - dbus_message_iter_init(message, &iter); - dbg(lvl_debug,"%s\n", dbus_message_iter_get_signature(&iter)); + dbus_message_iter_init(message, &iter); + dbg(lvl_debug,"%s", dbus_message_iter_get_signature(&iter)); - if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) - return dbus_error_invalid_parameter(connection, message); - dbus_message_iter_get_basic(&iter, &w); + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) + return dbus_error_invalid_parameter(connection, message); + dbus_message_iter_get_basic(&iter, &w); - dbus_message_iter_next(&iter); + dbus_message_iter_next(&iter); - if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) - return dbus_error_invalid_parameter(connection, message); - dbus_message_iter_get_basic(&iter, &h); + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) + return dbus_error_invalid_parameter(connection, message); + dbus_message_iter_get_basic(&iter, &h); - dbg(lvl_debug, " w -> %i h -> %i\n", w, h); + dbg(lvl_debug, " w -> %i h -> %i", w, h); - navit_handle_resize(navit, w, h); + navit_handle_resize(navit, w, h); - return empty_reply(connection, message); + return empty_reply(connection, message); } -static DBusHandlerResult -request_navit_get_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_get_attr(connection, message, "navit", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))navit_get_attr); +static DBusHandlerResult request_navit_get_attr(DBusConnection *connection, DBusMessage *message) { + return request_get_attr(connection, message, "navit", NULL, (int (*)(void *, enum attr_type, struct attr *, + struct attr_iter *))navit_get_attr); } -static DBusHandlerResult -request_navit_attr_iter(DBusConnection *connection, DBusMessage *message) -{ - DBusMessage *reply; - struct attr_iter *attr_iter=navit_attr_iter_new(); - char *opath=object_new("navit_attr_iter",attr_iter); - reply = dbus_message_new_method_return(message); - dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); - dbus_connection_send (connection, reply, NULL); - dbus_message_unref (reply); +static DBusHandlerResult request_navit_attr_iter(DBusConnection *connection, DBusMessage *message) { + DBusMessage *reply; + struct attr_iter *attr_iter=navit_attr_iter_new(); + char *opath=object_new("navit_attr_iter",attr_iter); + reply = dbus_message_new_method_return(message); + dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); - return DBUS_HANDLER_RESULT_HANDLED; + return DBUS_HANDLER_RESULT_HANDLED; } -static DBusHandlerResult -request_navit_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) -{ - struct attr_iter *attr_iter; - DBusMessageIter iter; +static DBusHandlerResult request_navit_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) { + struct attr_iter *attr_iter; + DBusMessageIter iter; - dbus_message_iter_init(message, &iter); - attr_iter=object_get_from_message_arg(&iter, "navit_attr_iter"); - if (! attr_iter) - return dbus_error_invalid_object_path_parameter(connection, message); - navit_attr_iter_destroy(attr_iter); + dbus_message_iter_init(message, &iter); + attr_iter=object_get_from_message_arg(&iter, "navit_attr_iter"); + if (! attr_iter) + return dbus_error_invalid_object_path_parameter(connection, message); + navit_attr_iter_destroy(attr_iter); - return empty_reply(connection, message); + return empty_reply(connection, message); } -static DBusHandlerResult -request_navit_set_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_set_add_remove_attr(connection, message, "navit", NULL, (int (*)(void *, struct attr *))navit_set_attr); +static DBusHandlerResult request_navit_set_attr(DBusConnection *connection, DBusMessage *message) { + return request_set_add_remove_attr(connection, message, "navit", NULL, (int (*)(void *, struct attr *))navit_set_attr); } -static DBusHandlerResult -request_navit_add_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_set_add_remove_attr(connection, message, "navit", NULL, (int (*)(void *, struct attr *))navit_add_attr); +static DBusHandlerResult request_navit_add_attr(DBusConnection *connection, DBusMessage *message) { + return request_set_add_remove_attr(connection, message, "navit", NULL, (int (*)(void *, struct attr *))navit_add_attr); } -static DBusHandlerResult -request_navit_remove_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_set_add_remove_attr(connection, message, "navit", NULL, (int (*)(void *, struct attr *))navit_remove_attr); +static DBusHandlerResult request_navit_remove_attr(DBusConnection *connection, DBusMessage *message) { + return request_set_add_remove_attr(connection, message, "navit", NULL, (int (*)(void *, + struct attr *))navit_remove_attr); } -static DBusHandlerResult -request_navit_set_position(DBusConnection *connection, DBusMessage *message) -{ - struct pcoord pc; - struct navit *navit; - DBusMessageIter iter; +static DBusHandlerResult request_navit_set_position(DBusConnection *connection, DBusMessage *message) { + struct pcoord pc; + struct navit *navit; + DBusMessageIter iter; - navit = object_get_from_message(message, "navit"); - if (! navit) - return dbus_error_invalid_object_path(connection, message); + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); - dbus_message_iter_init(message, &iter); - if (!pcoord_get_from_message(message, &iter, &pc)) - return dbus_error_invalid_parameter(connection, message); + dbus_message_iter_init(message, &iter); + if (!pcoord_get_from_message(message, &iter, &pc)) + return dbus_error_invalid_parameter(connection, message); - navit_set_position(navit, &pc); - return empty_reply(connection, message); + navit_set_position(navit, &pc); + return empty_reply(connection, message); } -static DBusHandlerResult -request_navit_set_destination(DBusConnection *connection, DBusMessage *message) -{ - struct pcoord pc; - struct navit *navit; - DBusMessageIter iter; - char *description; +static DBusHandlerResult request_navit_set_destination(DBusConnection *connection, DBusMessage *message) { + struct pcoord pc; + struct navit *navit; + DBusMessageIter iter; + char *description; - navit = object_get_from_message(message, "navit"); - if (! navit) - return dbus_error_invalid_object_path(connection, message); + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); - dbus_message_iter_init(message, &iter); - if (!pcoord_get_from_message(message, &iter, &pc)) - return dbus_error_invalid_parameter(connection, message); + dbus_message_iter_init(message, &iter); + if (!pcoord_get_from_message(message, &iter, &pc)) + return dbus_error_invalid_parameter(connection, message); - dbus_message_iter_next(&iter); - dbus_message_iter_get_basic(&iter, &description); - dbg(lvl_debug, " destination -> %s\n", description); + dbus_message_iter_next(&iter); + dbus_message_iter_get_basic(&iter, &description); + dbg(lvl_debug, " destination -> %s", description); - navit_set_destination(navit, &pc, description, 1); - return empty_reply(connection, message); + navit_set_destination(navit, &pc, description, 1); + return empty_reply(connection, message); } -static DBusHandlerResult -request_navit_clear_destination(DBusConnection *connection, DBusMessage *message) -{ - struct navit *navit; +static DBusHandlerResult request_navit_clear_destination(DBusConnection *connection, DBusMessage *message) { + struct navit *navit; - navit = object_get_from_message(message, "navit"); - if (! navit) - return dbus_error_invalid_object_path(connection, message); - navit_set_destination(navit, NULL, NULL, 0); - return empty_reply(connection, message); + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + navit_set_destination(navit, NULL, NULL, 0); + return empty_reply(connection, message); } -static DBusHandlerResult -request_navit_evaluate(DBusConnection *connection, DBusMessage *message) -{ - struct navit *navit; - char *command; - char *result; - struct attr attr; - DBusMessage *reply; - int error; +static DBusHandlerResult request_navit_evaluate(DBusConnection *connection, DBusMessage *message) { + struct navit *navit; + char *command; + char *result; + struct attr attr; + DBusMessage *reply; + int error; + + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + attr.type=attr_navit; + attr.u.navit=navit; + if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &command, DBUS_TYPE_INVALID)) + return dbus_error_invalid_parameter(connection, message); + result=command_evaluate_to_string(&attr, command, &error); + reply = dbus_message_new_method_return(message); + if (error) + dbus_message_append_args(reply, DBUS_TYPE_INT32, &error, DBUS_TYPE_INVALID); + else if (result) + dbus_message_append_args(reply, DBUS_TYPE_STRING, &result, DBUS_TYPE_INVALID); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + return DBUS_HANDLER_RESULT_HANDLED; +} - navit = object_get_from_message(message, "navit"); - if (! navit) - return dbus_error_invalid_object_path(connection, message); +/* search_list */ - attr.type=attr_navit; - attr.u.navit=navit; - if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &command, DBUS_TYPE_INVALID)) - return dbus_error_invalid_parameter(connection, message); - result=command_evaluate_to_string(&attr, command, &error); - reply = dbus_message_new_method_return(message); - if (error) - dbus_message_append_args(reply, DBUS_TYPE_INT32, &error, DBUS_TYPE_INVALID); - else if (result) - dbus_message_append_args(reply, DBUS_TYPE_STRING, &result, DBUS_TYPE_INVALID); - dbus_connection_send (connection, reply, NULL); - dbus_message_unref (reply); - return DBUS_HANDLER_RESULT_HANDLED; +static DBusHandlerResult request_search_list_destroy(DBusConnection *connection, DBusMessage *message) { + return request_destroy(connection, message, "search_list", NULL, (void (*)(void *)) search_list_destroy); +} + +static void request_search_list_common(struct search_list_common *slc, DBusMessageIter *iter4) { + if (slc->postal) + encode_dict_string_variant_string(iter4, "postal", slc->postal); + if (slc->postal_mask) + encode_dict_string_variant_string(iter4, "postal_mask", slc->postal_mask); +} + +static DBusHandlerResult request_search_list_get_result(DBusConnection *connection, DBusMessage *message) { + struct search_list *search_list; + struct search_list_result *result; + DBusMessage *reply; + DBusMessageIter iter,iter2,iter3,iter4; + char *country="country"; + char *town="town"; + char *street="street"; + char *house_number="housenumber"; + + search_list = object_get_from_message(message, "search_list"); + if (! search_list) + return dbus_error_invalid_object_path(connection, message); + result=search_list_get_result(search_list); + if (!result) + return dbus_error_no_data_available(connection, message); + reply = dbus_message_new_method_return(message); + dbus_message_iter_init_append(reply, &iter); + dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &result->id); + pcoord_encode(&iter, result->c); + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sa{sv}}", &iter2); + if (result->country && (result->country->car || result->country->iso2 || result->country->iso3 + || result->country->name)) { + dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); + dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &country); + dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); + if (result->country->car) + encode_dict_string_variant_string(&iter4, "car", result->country->car); + if (result->country->iso2) + encode_dict_string_variant_string(&iter4, "iso2", result->country->iso2); + if (result->country->iso3) + encode_dict_string_variant_string(&iter4, "iso3", result->country->iso3); + if (result->country->name) + encode_dict_string_variant_string(&iter4, "name", result->country->name); + dbus_message_iter_close_container(&iter3, &iter4); + dbus_message_iter_close_container(&iter2, &iter3); + } + if (result->town && (result->town->common.district_name || result->town->common.town_name)) { + dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); + dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &town); + dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); + request_search_list_common(&result->town->common,&iter4); + if (result->town->common.district_name) + encode_dict_string_variant_string(&iter4, "district", result->town->common.district_name); + if (result->town->common.town_name) + encode_dict_string_variant_string(&iter4, "name", result->town->common.town_name); + dbus_message_iter_close_container(&iter3, &iter4); + dbus_message_iter_close_container(&iter2, &iter3); + } + if (result->street && result->street->name) { + dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); + dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &street); + dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); + request_search_list_common(&result->street->common,&iter4); + if (result->street->name) + encode_dict_string_variant_string(&iter4, "name", result->street->name); + dbus_message_iter_close_container(&iter3, &iter4); + dbus_message_iter_close_container(&iter2, &iter3); + } + if (result->house_number && result->house_number->house_number) { + dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); + dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &house_number); + dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); + request_search_list_common(&result->house_number->common,&iter4); + encode_dict_string_variant_string(&iter4, "name", result->house_number->house_number); + dbus_message_iter_close_container(&iter3, &iter4); + dbus_message_iter_close_container(&iter2, &iter3); + } + dbus_message_iter_close_container(&iter, &iter2); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + return DBUS_HANDLER_RESULT_HANDLED; } -/* search_list */ +static DBusHandlerResult request_search_list_new(DBusConnection *connection, DBusMessage *message) { + DBusMessageIter iter; + DBusMessage *reply; + struct mapset *mapset; + struct search_list *search_list; + char *opath; + + dbus_message_iter_init(message, &iter); + mapset=object_get_from_message_arg(&iter, "mapset"); + if (! mapset) + return dbus_error_invalid_object_path_parameter(connection, message); + search_list=search_list_new(mapset); + opath=object_new("search_list", search_list); + reply = dbus_message_new_method_return(message); + dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + return DBUS_HANDLER_RESULT_HANDLED; +} + +static DBusHandlerResult request_search_list_search(DBusConnection *connection, DBusMessage *message) { + DBusMessageIter iter; + struct search_list *search_list; + struct attr attr; + int partial; + + search_list = object_get_from_message(message, "search_list"); + if (! search_list) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + if (!decode_attr_from_iter(&iter, &attr)) + return dbus_error_invalid_parameter(connection, message); + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) + return dbus_error_invalid_parameter(connection, message); + dbus_message_iter_get_basic(&iter, &partial); + search_list_search(search_list, &attr, partial); + return empty_reply(connection, message); +} -static DBusHandlerResult -request_search_list_destroy(DBusConnection *connection, DBusMessage *message) -{ - return request_destroy(connection, message, "search_list", NULL, (void (*)(void *)) search_list_destroy); -} - -static void -request_search_list_common(struct search_list_common *slc, DBusMessageIter *iter4) -{ - if (slc->postal) - encode_dict_string_variant_string(iter4, "postal", slc->postal); - if (slc->postal_mask) - encode_dict_string_variant_string(iter4, "postal_mask", slc->postal_mask); -} - -static DBusHandlerResult -request_search_list_get_result(DBusConnection *connection, DBusMessage *message) -{ - struct search_list *search_list; - struct search_list_result *result; - DBusMessage *reply; - DBusMessageIter iter,iter2,iter3,iter4; - char *country="country"; - char *town="town"; - char *street="street"; - char *house_number="housenumber"; - - search_list = object_get_from_message(message, "search_list"); - if (! search_list) - return dbus_error_invalid_object_path(connection, message); - result=search_list_get_result(search_list); - if (!result) - return dbus_error_no_data_available(connection, message); - reply = dbus_message_new_method_return(message); - dbus_message_iter_init_append(reply, &iter); - dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &result->id); - pcoord_encode(&iter, result->c); - dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sa{sv}}", &iter2); - if (result->country && (result->country->car || result->country->iso2 || result->country->iso3 || result->country->name)) { - dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); - dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &country); - dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); - if (result->country->car) - encode_dict_string_variant_string(&iter4, "car", result->country->car); - if (result->country->iso2) - encode_dict_string_variant_string(&iter4, "iso2", result->country->iso2); - if (result->country->iso3) - encode_dict_string_variant_string(&iter4, "iso3", result->country->iso3); - if (result->country->name) - encode_dict_string_variant_string(&iter4, "name", result->country->name); - dbus_message_iter_close_container(&iter3, &iter4); - dbus_message_iter_close_container(&iter2, &iter3); - } - if (result->town && (result->town->common.district_name || result->town->common.town_name)) { - dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); - dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &town); - dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); - request_search_list_common(&result->town->common,&iter4); - if (result->town->common.district_name) - encode_dict_string_variant_string(&iter4, "district", result->town->common.district_name); - if (result->town->common.town_name) - encode_dict_string_variant_string(&iter4, "name", result->town->common.town_name); - dbus_message_iter_close_container(&iter3, &iter4); - dbus_message_iter_close_container(&iter2, &iter3); - } - if (result->street && result->street->name) { - dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); - dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &street); - dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); - request_search_list_common(&result->street->common,&iter4); - if (result->street->name) - encode_dict_string_variant_string(&iter4, "name", result->street->name); - dbus_message_iter_close_container(&iter3, &iter4); - dbus_message_iter_close_container(&iter2, &iter3); - } - if (result->house_number && result->house_number->house_number) { - dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); - dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &house_number); - dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); - request_search_list_common(&result->house_number->common,&iter4); - encode_dict_string_variant_string(&iter4, "name", result->house_number->house_number); - dbus_message_iter_close_container(&iter3, &iter4); - dbus_message_iter_close_container(&iter2, &iter3); - } - dbus_message_iter_close_container(&iter, &iter2); - dbus_connection_send (connection, reply, NULL); - dbus_message_unref (reply); - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult -request_search_list_new(DBusConnection *connection, DBusMessage *message) -{ - DBusMessageIter iter; - DBusMessage *reply; - struct mapset *mapset; - struct search_list *search_list; - char *opath; - - dbus_message_iter_init(message, &iter); - mapset=object_get_from_message_arg(&iter, "mapset"); - if (! mapset) - return dbus_error_invalid_object_path_parameter(connection, message); - search_list=search_list_new(mapset); - opath=object_new("search_list", search_list); - reply = dbus_message_new_method_return(message); - dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); - dbus_connection_send (connection, reply, NULL); - dbus_message_unref (reply); - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult -request_search_list_search(DBusConnection *connection, DBusMessage *message) -{ - DBusMessageIter iter; - struct search_list *search_list; - struct attr attr; - int partial; - - search_list = object_get_from_message(message, "search_list"); - if (! search_list) - return dbus_error_invalid_object_path(connection, message); - - dbus_message_iter_init(message, &iter); - if (!decode_attr_from_iter(&iter, &attr)) - return dbus_error_invalid_parameter(connection, message); - if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) - return dbus_error_invalid_parameter(connection, message); - dbus_message_iter_get_basic(&iter, &partial); - search_list_search(search_list, &attr, partial); - return empty_reply(connection, message); -} - -static DBusHandlerResult -request_search_list_select(DBusConnection *connection, DBusMessage *message) -{ - DBusMessageIter iter; - struct search_list *search_list; - int id, mode; - enum attr_type attr_type; - - search_list = object_get_from_message(message, "search_list"); - if (! search_list) - return dbus_error_invalid_object_path(connection, message); - - dbus_message_iter_init(message, &iter); - attr_type=decode_attr_type_from_iter(&iter); - if (attr_type == attr_none) - return dbus_error_invalid_parameter(connection, message); - if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) - return dbus_error_invalid_parameter(connection, message); - dbus_message_iter_get_basic(&iter, &id); - if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) - return dbus_error_invalid_parameter(connection, message); - dbus_message_iter_get_basic(&iter, &mode); - search_list_select(search_list, attr_type, id, mode); - return empty_reply(connection, message); +static DBusHandlerResult request_search_list_select(DBusConnection *connection, DBusMessage *message) { + DBusMessageIter iter; + struct search_list *search_list; + int id, mode; + enum attr_type attr_type; + + search_list = object_get_from_message(message, "search_list"); + if (! search_list) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + attr_type=decode_attr_type_from_iter(&iter); + if (attr_type == attr_none) + return dbus_error_invalid_parameter(connection, message); + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) + return dbus_error_invalid_parameter(connection, message); + dbus_message_iter_get_basic(&iter, &id); + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) + return dbus_error_invalid_parameter(connection, message); + dbus_message_iter_get_basic(&iter, &mode); + search_list_select(search_list, attr_type, id, mode); + return empty_reply(connection, message); } /* tracking */ -static DBusHandlerResult -request_tracking_get_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_get_attr(connection, message, "tracking", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))tracking_get_attr); +static DBusHandlerResult request_tracking_get_attr(DBusConnection *connection, DBusMessage *message) { + return request_get_attr(connection, message, "tracking", NULL, (int (*)(void *, enum attr_type, struct attr *, + struct attr_iter *))tracking_get_attr); } /* vehicle */ -static DBusHandlerResult -request_vehicle_set_attr(DBusConnection *connection, DBusMessage *message) -{ - struct vehicle *vehicle; - struct attr attr; - int ret; - - vehicle = object_get_from_message(message, "vehicle"); - if (! vehicle) - return dbus_error_invalid_object_path(connection, message); - if (decode_attr(message, &attr)) { - ret=vehicle_set_attr(vehicle, &attr); - destroy_attr(&attr); - if (ret) - return empty_reply(connection, message); - } - return dbus_error_invalid_parameter(connection, message); +static DBusHandlerResult request_vehicle_set_attr(DBusConnection *connection, DBusMessage *message) { + struct vehicle *vehicle; + struct attr attr; + int ret; + + vehicle = object_get_from_message(message, "vehicle"); + if (! vehicle) + return dbus_error_invalid_object_path(connection, message); + if (decode_attr(message, &attr)) { + ret=vehicle_set_attr(vehicle, &attr); + destroy_attr(&attr); + if (ret) + return empty_reply(connection, message); + } + return dbus_error_invalid_parameter(connection, message); } /* vehicleprofile */ -static DBusHandlerResult -request_vehicleprofile_get_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_get_attr(connection, message, "vehicleprofile", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))vehicleprofile_get_attr); +static DBusHandlerResult request_vehicleprofile_get_attr(DBusConnection *connection, DBusMessage *message) { + return request_get_attr(connection, message, "vehicleprofile", NULL, (int (*)(void *, enum attr_type, struct attr *, + struct attr_iter *))vehicleprofile_get_attr); } -static DBusHandlerResult -request_vehicleprofile_set_attr(DBusConnection *connection, DBusMessage *message) -{ - return request_set_add_remove_attr(connection, message, "vehicleprofile", NULL, (int (*)(void *, struct attr *))vehicleprofile_set_attr); +static DBusHandlerResult request_vehicleprofile_set_attr(DBusConnection *connection, DBusMessage *message) { + return request_set_add_remove_attr(connection, message, "vehicleprofile", NULL, (int (*)(void *, + struct attr *))vehicleprofile_set_attr); } -static DBusHandlerResult -request_vehicleprofile_attr_iter(DBusConnection *connection, DBusMessage *message) -{ - return request_attr_iter(connection, message, "vehicleprofile", (struct attr_iter * (*)(void))vehicleprofile_attr_iter_new); +static DBusHandlerResult request_vehicleprofile_attr_iter(DBusConnection *connection, DBusMessage *message) { + return request_attr_iter(connection, message, "vehicleprofile", + (struct attr_iter * (*)(void))vehicleprofile_attr_iter_new); } -static DBusHandlerResult -request_vehicleprofile_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) -{ - return request_attr_iter_destroy(connection, message, "vehicleprofile", (void (*)(struct attr_iter *))vehicleprofile_attr_iter_destroy); +static DBusHandlerResult request_vehicleprofile_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) { + return request_attr_iter_destroy(connection, message, "vehicleprofile", + (void (*)(struct attr_iter *))vehicleprofile_attr_iter_destroy); } struct dbus_method { - char *path; - char *method; - char *signature; + char *path; + char *method; + char *signature; char *signature_name; char *response; char *response_name; - DBusHandlerResult(*func)(DBusConnection *connection, DBusMessage *message); + DBusHandlerResult(*func)(DBusConnection *connection, DBusMessage *message); } dbus_methods[] = { - {"", "attr_iter", "", "", "o", "attr_iter", request_config_attr_iter}, - {"", "attr_iter_destroy", "o", "attr_iter", "", "", request_config_attr_iter_destroy}, - {"", "get_attr", "s", "attrname", "sv", "attrname,value",request_config_get_attr}, - {"", "get_attr_wi", "so", "attrname,attr_iter", "sv", "attrname,value",request_config_get_attr}, - {"", "callback_new", "s", "signalname", "o", "callback",request_callback_new}, - {"", "callback_attr_new", "ss", "signalname,attribute", "o", "callback",request_callback_new}, - {"", "search_list_new", "o", "mapset", "o", "search",request_search_list_new}, - {".callback","destroy", "", "", "", "", request_callback_destroy}, - {".graphics","get_data", "s", "type", "ay", "data", request_graphics_get_data}, - {".graphics","set_attr", "sv", "attribute,value", "", "", request_graphics_set_attr}, - {".gui", "get_attr", "s", "attribute", "sv", "attrname,value", request_gui_get_attr}, - {".gui", "command_parameter", "sa{sa{sv}}","command,parameter", "a{sa{sv}}", "return", request_gui_command}, - {".gui", "command", "s", "command", "a{sa{sv}}", "return", request_gui_command}, - {".navit", "draw", "", "", "", "", request_navit_draw}, - {".navit", "add_message", "s", "message", "", "", request_navit_add_message}, - {".navit", "set_center_by_string","s", "(coordinates)", "", "", request_navit_set_center}, - {".navit", "set_center", "(is)", "(projection,coordinates)", "", "", request_navit_set_center}, - {".navit", "set_center", "(iii)", "(projection,longitude,latitude)", "", "", request_navit_set_center}, - {".navit", "set_center_screen", "(ii)", "(pixel_x,pixel_y)", "", "", request_navit_set_center_screen}, - {".navit", "set_layout", "s", "layoutname", "", "", request_navit_set_layout}, - {".navit", "zoom", "i(ii)", "factor(pixel_x,pixel_y)", "", "", request_navit_zoom}, - {".navit", "zoom", "i", "factor", "", "", request_navit_zoom}, - {".navit", "zoom_to_route", "", "", "", "", request_navit_zoom_to_route}, - {".navit", "quit", "", "", "", "", request_navit_quit}, - {".navit", "export_as_gpx", "s", "filename", "", "", request_navit_route_export_gpx}, - {".navit", "export_as_geojson", "s", "filename", "", "", request_navit_route_export_geojson}, - {".navit", "block", "i", "mode", "", "", request_navit_block}, - {".navit", "resize", "ii", "upperleft,lowerright", "", "", request_navit_resize}, - {".navit", "attr_iter", "", "", "o", "attr_iter", request_navit_attr_iter}, - {".navit", "attr_iter_destroy", "o", "attr_iter", "", "", request_navit_attr_iter_destroy}, - {".navit", "get_attr", "s", "attribute", "sv", "attrname,value", request_navit_get_attr}, - {".navit", "get_attr_wi", "so", "attribute,attr_iter", "sv", "attrname,value", request_navit_get_attr}, - {".navit", "set_attr", "sv", "attribute,value", "", "", request_navit_set_attr}, - {".navit", "add_attr", "sv", "attribute,value", "", "", request_navit_add_attr}, - {".navit", "remove_attr", "sv", "attribute,value", "", "", request_navit_remove_attr}, - {".navit", "set_position", "s", "(coordinates)", "", "", request_navit_set_position}, - {".navit", "set_position", "(is)", "(projection,coordinated)", "", "", request_navit_set_position}, - {".navit", "set_position", "(iii)", "(projection,longitude,latitude)", "", "", request_navit_set_position}, - {".navit", "set_destination", "ss", "coordinates,comment", "", "", request_navit_set_destination}, - {".navit", "set_destination", "(is)s", "(projection,coordinates)comment", "", "", request_navit_set_destination}, - {".navit", "set_destination", "(iii)s", "(projection,longitude,latitude)comment", "", "", request_navit_set_destination}, - {".navit", "clear_destination", "", "", "", "", request_navit_clear_destination}, - {".navit", "evaluate", "s", "command", "s", "", request_navit_evaluate}, - {".layout", "get_attr", "s", "attribute", "sv", "attrname,value", request_layout_get_attr}, - {".map", "get_attr", "s", "attribute", "sv", "attrname,value", request_map_get_attr}, - {".map", "set_attr", "sv", "attribute,value", "", "", request_map_set_attr}, - {".map", "dump", "s", "file", "", "", request_map_dump}, - {".mapset", "attr_iter", "", "", "o", "attr_iter", request_mapset_attr_iter}, - {".mapset", "attr_iter_destroy", "o", "attr_iter", "", "", request_mapset_attr_iter_destroy}, - {".mapset", "get_attr", "s", "attribute", "sv", "attrname,value", request_mapset_get_attr}, - {".mapset", "get_attr_wi", "so", "attribute,attr_iter", "sv", "attrname,value", request_mapset_get_attr}, - {".navigation","get_attr", "s", "attribute", "", "", request_navigation_get_attr}, - {".osd", "get_attr", "s", "attribute", "sv", "attrname,value", request_osd_get_attr}, - {".osd", "set_attr", "sv", "attribute,value", "", "", request_osd_set_attr}, - {".roadprofile", "get_attr", "s", "attribute", "sv", "attrname,value", request_roadprofile_get_attr}, - {".roadprofile", "get_attr_wi", "so", "attribute,attr_iter", "", "", request_roadprofile_get_attr}, - {".roadprofile", "set_attr", "sv", "attribute,value", "", "", request_roadprofile_set_attr}, - {".roadprofile", "attr_iter", "", "", "o", "attr_iter", request_roadprofile_attr_iter}, - {".roadprofile", "attr_iter_destroy","o", "attr_iter", "", "", request_roadprofile_attr_iter_destroy}, - {".route", "get_attr", "s", "attribute", "sv", "attrname,value", request_route_get_attr}, - {".route", "set_attr", "sv", "attribute,value", "", "", request_route_set_attr}, - {".route", "add_attr", "sv", "attribute,value", "", "", request_route_add_attr}, - {".route", "remove_attr", "sv", "attribute,value", "", "", request_route_remove_attr}, - {".route", "destroy", "", "", "", "", request_route_destroy}, - {".route", "dup", "", "", "", "", request_route_dup}, - {".search_list","destroy", "", "", "", "", request_search_list_destroy}, - {".search_list","destroy", "", "", "", "", request_search_list_destroy}, - {".search_list","destroy", "", "", "", "", request_search_list_destroy}, - {".search_list","get_result", "", "", "i(iii)a{sa{sv}}", "id,coord,dict", request_search_list_get_result}, - {".search_list","search", "svi", "attribute,value,partial", "", "", request_search_list_search}, - {".search_list","select", "sii", "attribute_type,id,mode", "", "", request_search_list_select}, - {".tracking","get_attr", "s", "attribute", "", "", request_tracking_get_attr}, - {".vehicle","set_attr", "sv", "attribute,value", "", "", request_vehicle_set_attr}, - {".vehicleprofile","get_attr", "s", "attribute", "", "", request_vehicleprofile_get_attr}, - {".vehicleprofile","get_attr_wi", "so", "attribute,attr_iter", "", "", request_vehicleprofile_get_attr}, - {".vehicleprofile","set_attr", "sv", "attribute,value", "", "", request_vehicleprofile_set_attr}, - {".vehicleprofile","attr_iter", "", "", "o", "attr_iter", request_vehicleprofile_attr_iter}, - {".vehicleprofile","attr_iter_destroy","o", "attr_iter", "", "", request_vehicleprofile_attr_iter_destroy}, + {"", "attr_iter", "", "", "o", "attr_iter", request_config_attr_iter}, + {"", "attr_iter_destroy", "o", "attr_iter", "", "", request_config_attr_iter_destroy}, + {"", "get_attr", "s", "attrname", "sv", "attrname,value",request_config_get_attr}, + {"", "get_attr_wi", "so", "attrname,attr_iter", "sv", "attrname,value",request_config_get_attr}, + {"", "callback_new", "s", "signalname", "o", "callback",request_callback_new}, + {"", "callback_attr_new", "ss", "signalname,attribute", "o", "callback",request_callback_new}, + {"", "search_list_new", "o", "mapset", "o", "search",request_search_list_new}, + {".callback","destroy", "", "", "", "", request_callback_destroy}, + {".graphics","get_data", "s", "type", "ay", "data", request_graphics_get_data}, + {".graphics","set_attr", "sv", "attribute,value", "", "", request_graphics_set_attr}, + {".gui", "get_attr", "s", "attribute", "sv", "attrname,value", request_gui_get_attr}, + {".gui", "command_parameter", "sa{sa{sv}}","command,parameter", "a{sa{sv}}", "return", request_gui_command}, + {".gui", "command", "s", "command", "a{sa{sv}}", "return", request_gui_command}, + {".navit", "draw", "", "", "", "", request_navit_draw}, + {".navit", "add_message", "s", "message", "", "", request_navit_add_message}, + {".navit", "set_center_by_string","s", "(coordinates)", "", "", request_navit_set_center}, + {".navit", "set_center", "(is)", "(projection,coordinates)", "", "", request_navit_set_center}, + {".navit", "set_center", "(iii)", "(projection,longitude,latitude)", "", "", request_navit_set_center}, + {".navit", "set_center_screen", "(ii)", "(pixel_x,pixel_y)", "", "", request_navit_set_center_screen}, + {".navit", "set_layout", "s", "layoutname", "", "", request_navit_set_layout}, + {".navit", "traffic_export", "s", "filename", "", "", request_navit_traffic_export_gpx}, + {".navit", "traffic_inject", "s", "filename", "", "", request_navit_traffic_inject}, + {".navit", "zoom", "i(ii)", "factor(pixel_x,pixel_y)", "", "", request_navit_zoom}, + {".navit", "zoom", "i", "factor", "", "", request_navit_zoom}, + {".navit", "zoom_to_route", "", "", "", "", request_navit_zoom_to_route}, + {".navit", "quit", "", "", "", "", request_navit_quit}, + {".navit", "export_as_gpx", "s", "filename", "", "", request_navit_route_export_gpx}, + {".navit", "export_as_geojson", "s", "filename", "", "", request_navit_route_export_geojson}, + {".navit", "block", "i", "mode", "", "", request_navit_block}, + {".navit", "resize", "ii", "upperleft,lowerright", "", "", request_navit_resize}, + {".navit", "attr_iter", "", "", "o", "attr_iter", request_navit_attr_iter}, + {".navit", "attr_iter_destroy", "o", "attr_iter", "", "", request_navit_attr_iter_destroy}, + {".navit", "get_attr", "s", "attribute", "sv", "attrname,value", request_navit_get_attr}, + {".navit", "get_attr_wi", "so", "attribute,attr_iter", "sv", "attrname,value", request_navit_get_attr}, + {".navit", "set_attr", "sv", "attribute,value", "", "", request_navit_set_attr}, + {".navit", "add_attr", "sv", "attribute,value", "", "", request_navit_add_attr}, + {".navit", "remove_attr", "sv", "attribute,value", "", "", request_navit_remove_attr}, + {".navit", "set_position", "s", "(coordinates)", "", "", request_navit_set_position}, + {".navit", "set_position", "(is)", "(projection,coordinated)", "", "", request_navit_set_position}, + {".navit", "set_position", "(iii)", "(projection,longitude,latitude)", "", "", request_navit_set_position}, + {".navit", "set_destination", "ss", "coordinates,comment", "", "", request_navit_set_destination}, + {".navit", "set_destination", "(is)s", "(projection,coordinates)comment", "", "", request_navit_set_destination}, + {".navit", "set_destination", "(iii)s", "(projection,longitude,latitude)comment", "", "", request_navit_set_destination}, + {".navit", "clear_destination", "", "", "", "", request_navit_clear_destination}, + {".navit", "evaluate", "s", "command", "s", "", request_navit_evaluate}, + {".layout", "get_attr", "s", "attribute", "sv", "attrname,value", request_layout_get_attr}, + {".map", "get_attr", "s", "attribute", "sv", "attrname,value", request_map_get_attr}, + {".map", "set_attr", "sv", "attribute,value", "", "", request_map_set_attr}, + {".map", "dump", "s", "file", "", "", request_map_dump}, + {".mapset", "attr_iter", "", "", "o", "attr_iter", request_mapset_attr_iter}, + {".mapset", "attr_iter_destroy", "o", "attr_iter", "", "", request_mapset_attr_iter_destroy}, + {".mapset", "get_attr", "s", "attribute", "sv", "attrname,value", request_mapset_get_attr}, + {".mapset", "get_attr_wi", "so", "attribute,attr_iter", "sv", "attrname,value", request_mapset_get_attr}, + {".navigation","get_attr", "s", "attribute", "", "", request_navigation_get_attr}, + {".osd", "get_attr", "s", "attribute", "sv", "attrname,value", request_osd_get_attr}, + {".osd", "set_attr", "sv", "attribute,value", "", "", request_osd_set_attr}, + {".roadprofile", "get_attr", "s", "attribute", "sv", "attrname,value", request_roadprofile_get_attr}, + {".roadprofile", "get_attr_wi", "so", "attribute,attr_iter", "", "", request_roadprofile_get_attr}, + {".roadprofile", "set_attr", "sv", "attribute,value", "", "", request_roadprofile_set_attr}, + {".roadprofile", "attr_iter", "", "", "o", "attr_iter", request_roadprofile_attr_iter}, + {".roadprofile", "attr_iter_destroy","o", "attr_iter", "", "", request_roadprofile_attr_iter_destroy}, + {".route", "get_attr", "s", "attribute", "sv", "attrname,value", request_route_get_attr}, + {".route", "set_attr", "sv", "attribute,value", "", "", request_route_set_attr}, + {".route", "add_attr", "sv", "attribute,value", "", "", request_route_add_attr}, + {".route", "remove_attr", "sv", "attribute,value", "", "", request_route_remove_attr}, + {".route", "destroy", "", "", "", "", request_route_destroy}, + {".route", "dup", "", "", "", "", request_route_dup}, + {".search_list","destroy", "", "", "", "", request_search_list_destroy}, + {".search_list","destroy", "", "", "", "", request_search_list_destroy}, + {".search_list","destroy", "", "", "", "", request_search_list_destroy}, + {".search_list","get_result", "", "", "i(iii)a{sa{sv}}", "id,coord,dict", request_search_list_get_result}, + {".search_list","search", "svi", "attribute,value,partial", "", "", request_search_list_search}, + {".search_list","select", "sii", "attribute_type,id,mode", "", "", request_search_list_select}, + {".tracking","get_attr", "s", "attribute", "", "", request_tracking_get_attr}, + {".vehicle","set_attr", "sv", "attribute,value", "", "", request_vehicle_set_attr}, + {".vehicleprofile","get_attr", "s", "attribute", "", "", request_vehicleprofile_get_attr}, + {".vehicleprofile","get_attr_wi", "so", "attribute,attr_iter", "", "", request_vehicleprofile_get_attr}, + {".vehicleprofile","set_attr", "sv", "attribute,value", "", "", request_vehicleprofile_set_attr}, + {".vehicleprofile","attr_iter", "", "", "o", "attr_iter", request_vehicleprofile_attr_iter}, + {".vehicleprofile","attr_iter_destroy","o", "attr_iter", "", "", request_vehicleprofile_attr_iter_destroy}, }; -static char * -introspect_path(const char *object) -{ - char *ret; - int i; - char *def=".default_"; - int def_len=strlen(def); - if (strncmp(object, object_path, strlen(object_path))) - return NULL; - ret=g_strdup(object+strlen(object_path)); - dbg(lvl_debug,"path=%s\n",ret); - for (i = strlen(ret)-1 ; i >= 0 ; i--) { - if (ret[i] == '/' || (ret[i] >= '0' && ret[i] <= '9')) - ret[i]='\0'; - else - break; - } - for (i = 0 ; i < strlen(ret); i++) - if (ret[i] == '/') - ret[i]='.'; - - for (i = strlen(ret)-1 ; i >= 0 ; i--) { - if (!strncmp(ret+i, def, def_len)) { - memmove(ret+1,ret+i+def_len,strlen(ret+i+def_len)+1); - break; - } - } - return ret; -} - -static char * -generate_navitintrospectxml(const char *object) -{ +static char *introspect_path(const char *object) { + char *ret; + int i; + char *def=".default_"; + int def_len=strlen(def); + if (strncmp(object, object_path, strlen(object_path))) + return NULL; + ret=g_strdup(object+strlen(object_path)); + dbg(lvl_debug,"path=%s",ret); + for (i = strlen(ret)-1 ; i >= 0 ; i--) { + if (ret[i] == '/' || (ret[i] >= '0' && ret[i] <= '9')) + ret[i]='\0'; + else + break; + } + for (i = 0 ; i < strlen(ret); i++) + if (ret[i] == '/') + ret[i]='.'; + + for (i = strlen(ret)-1 ; i >= 0 ; i--) { + if (!strncmp(ret+i, def, def_len)) { + memmove(ret+1,ret+i+def_len,strlen(ret+i+def_len)+1); + break; + } + } + return ret; +} + +static char *generate_navitintrospectxml(const char *object) { int i,methods_size,n=0; char *navitintrospectxml; char *path=introspect_path(object); if (!path) - return NULL; - dbg(lvl_debug,"path=%s\n",path); + return NULL; + dbg(lvl_debug,"path=%s",path); // write header and make navit introspectable navitintrospectxml = g_strdup_printf("%s%s%s\n", navitintrospectxml_head1, object, navitintrospectxml_head2); @@ -2069,22 +2098,25 @@ generate_navitintrospectxml(const char *object) methods_size=sizeof(dbus_methods)/sizeof(struct dbus_method); for (i = 0 ; i < methods_size ; i++) { // start new interface if it's the first method or it changed - if (strcmp(dbus_methods[i].path, path)) - continue; + if (strcmp(dbus_methods[i].path, path)) + continue; if ((n == 0) || strcmp(dbus_methods[i-1].path, dbus_methods[i].path)) - navitintrospectxml = g_strconcat_printf(navitintrospectxml, " <interface name=\"%s%s\">\n", service_name, dbus_methods[i].path); - n++; + navitintrospectxml = g_strconcat_printf(navitintrospectxml, " <interface name=\"%s%s\">\n", service_name, + dbus_methods[i].path); + n++; // start the new method navitintrospectxml = g_strconcat_printf(navitintrospectxml, " <method name=\"%s\">\n", dbus_methods[i].method); // set input signature if existent if (strcmp(dbus_methods[i].signature, "")) - navitintrospectxml = g_strconcat_printf(navitintrospectxml, " <arg direction=\"in\" name=\"%s\" type=\"%s\" />\n", dbus_methods[i].signature_name, dbus_methods[i].signature); + navitintrospectxml = g_strconcat_printf(navitintrospectxml, " <arg direction=\"in\" name=\"%s\" type=\"%s\" />\n", + dbus_methods[i].signature_name, dbus_methods[i].signature); // set response signature if existent if (strcmp(dbus_methods[i].response, "")) - navitintrospectxml = g_strconcat_printf(navitintrospectxml, " <arg direction=\"out\" name=\"%s\" type=\"%s\" />\n", dbus_methods[i].response_name, dbus_methods[i].response); + navitintrospectxml = g_strconcat_printf(navitintrospectxml, " <arg direction=\"out\" name=\"%s\" type=\"%s\" />\n", + dbus_methods[i].response_name, dbus_methods[i].response); // close the method navitintrospectxml = g_strconcat_printf(navitintrospectxml, " </method>\n"); @@ -2099,141 +2131,136 @@ generate_navitintrospectxml(const char *object) return navitintrospectxml; } -static DBusHandlerResult -navit_handler_func(DBusConnection *connection, DBusMessage *message, void *user_data) -{ - int i; - char *path; - dbg(lvl_debug,"type=%s interface=%s path=%s member=%s signature=%s\n", dbus_message_type_to_string(dbus_message_get_type(message)), dbus_message_get_interface(message), dbus_message_get_path(message), dbus_message_get_member(message), dbus_message_get_signature(message)); - if (dbus_message_is_method_call (message, "org.freedesktop.DBus.Introspectable", "Introspect")) { - DBusMessage *reply; - char *navitintrospectxml = generate_navitintrospectxml(dbus_message_get_path(message)); - dbg(lvl_debug,"Introspect %s:Result:%s\n",dbus_message_get_path(message), navitintrospectxml); - if (navitintrospectxml) { - reply = dbus_message_new_method_return(message); - dbus_message_append_args(reply, DBUS_TYPE_STRING, &navitintrospectxml, DBUS_TYPE_INVALID); - dbus_connection_send (connection, reply, NULL); - dbus_message_unref (reply); - g_free(navitintrospectxml); - return DBUS_HANDLER_RESULT_HANDLED; - } - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - } +static DBusHandlerResult navit_handler_func(DBusConnection *connection, DBusMessage *message, void *user_data) { + int i; + char *path; + dbg(lvl_debug,"type=%s interface=%s path=%s member=%s signature=%s", + dbus_message_type_to_string(dbus_message_get_type(message)), dbus_message_get_interface(message), + dbus_message_get_path(message), dbus_message_get_member(message), dbus_message_get_signature(message)); + if (dbus_message_is_method_call (message, "org.freedesktop.DBus.Introspectable", "Introspect")) { + DBusMessage *reply; + char *navitintrospectxml = generate_navitintrospectxml(dbus_message_get_path(message)); + dbg(lvl_debug,"Introspect %s:Result:%s",dbus_message_get_path(message), navitintrospectxml); + if (navitintrospectxml) { + reply = dbus_message_new_method_return(message); + dbus_message_append_args(reply, DBUS_TYPE_STRING, &navitintrospectxml, DBUS_TYPE_INVALID); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + g_free(navitintrospectxml); + return DBUS_HANDLER_RESULT_HANDLED; + } + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } for (i = 0 ; i < sizeof(dbus_methods)/sizeof(struct dbus_method) ; i++) { - path=g_strdup_printf("%s%s", service_name, dbus_methods[i].path); - if (dbus_message_is_method_call(message, path, dbus_methods[i].method) && - dbus_message_has_signature(message, dbus_methods[i].signature)) { - g_free(path); - return dbus_methods[i].func(connection, message); - } - g_free(path); - } - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + path=g_strdup_printf("%s%s", service_name, dbus_methods[i].path); + if (dbus_message_is_method_call(message, path, dbus_methods[i].method) && + dbus_message_has_signature(message, dbus_methods[i].signature)) { + g_free(path); + return dbus_methods[i].func(connection, message); + } + g_free(path); + } + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } static DBusObjectPathVTable dbus_navit_vtable = { - NULL, - navit_handler_func, - NULL + NULL, + navit_handler_func, + NULL }; #if 0 -DBusHandlerResult -filter(DBusConnection *connection, DBusMessage *message, void *user_data) -{ - dbg(lvl_debug,"type=%s interface=%s path=%s member=%s signature=%s\n", dbus_message_type_to_string(dbus_message_get_type(message)), dbus_message_get_interface(message), dbus_message_get_path(message), dbus_message_get_member(message), dbus_message_get_signature(message)); - if (dbus_message_is_signal(message, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) { - } - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +DBusHandlerResult filter(DBusConnection *connection, DBusMessage *message, void *user_data) { + dbg(lvl_debug,"type=%s interface=%s path=%s member=%s signature=%s", + dbus_message_type_to_string(dbus_message_get_type(message)), dbus_message_get_interface(message), + dbus_message_get_path(message), dbus_message_get_member(message), dbus_message_get_signature(message)); + if (dbus_message_is_signal(message, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) { + } + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } #endif -static int -dbus_cmd_send_signal(struct navit *navit, char *command, struct attr **in, struct attr ***out) -{ - DBusMessage* msg; - char *opath=object_new("navit",navit); - char *interface=g_strdup_printf("%s%s", service_name, ".navit"); - dbg(lvl_debug,"enter %s %s %s\n",opath,command,interface); - msg = dbus_message_new_signal(opath, interface, "signal"); - if (msg) { - DBusMessageIter iter1,iter2,iter3; - dbus_message_iter_init_append(msg, &iter1); - dbus_message_iter_open_container(&iter1, DBUS_TYPE_ARRAY, "{sv}", &iter2); - if (in) { - while (*in) { - dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); - encode_attr(&iter3, *in); - dbus_message_iter_close_container(&iter2, &iter3); - in++; - } - } - dbus_message_iter_close_container(&iter1, &iter2); - dbus_connection_send(connection, msg, &dbus_serial); - dbus_connection_flush(connection); - dbus_message_unref(msg); - } - g_free(interface); - return 0; +static int dbus_cmd_send_signal(struct navit *navit, char *command, struct attr **in, struct attr ***out) { + DBusMessage* msg; + char *opath=object_new("navit",navit); + char *interface=g_strdup_printf("%s%s", service_name, ".navit"); + dbg(lvl_debug,"enter %s %s %s",opath,command,interface); + msg = dbus_message_new_signal(opath, interface, "signal"); + if (msg) { + DBusMessageIter iter1,iter2,iter3; + dbus_message_iter_init_append(msg, &iter1); + dbus_message_iter_open_container(&iter1, DBUS_TYPE_ARRAY, "{sv}", &iter2); + if (in) { + while (*in) { + dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); + encode_attr(&iter3, *in); + dbus_message_iter_close_container(&iter2, &iter3); + in++; + } + } + dbus_message_iter_close_container(&iter1, &iter2); + dbus_connection_send(connection, msg, &dbus_serial); + dbus_connection_flush(connection); + dbus_message_unref(msg); + } + g_free(interface); + return 0; } static struct command_table commands[] = { - {"dbus_send_signal",command_cast(dbus_cmd_send_signal)}, + {"dbus_send_signal",command_cast(dbus_cmd_send_signal)}, }; -static void -dbus_main_navit(struct navit *navit, int added) -{ - struct attr attr; - if (added==1) { - DBusMessage* msg; - char *opath=object_new("navit",navit); - char *interface=g_strdup_printf("%s%s", service_name, ".navit"); - command_add_table_attr(commands, sizeof(commands)/sizeof(struct command_table), navit, &attr); - navit_add_attr(navit, &attr); - msg = dbus_message_new_signal(opath, interface, "startup"); - dbus_connection_send(connection, msg, &dbus_serial); - dbus_connection_flush(connection); - dbus_message_unref(msg); - g_free(interface); - } -} - -void plugin_init(void) -{ - DBusError error; - - struct attr callback; - object_hash=g_hash_table_new(g_str_hash, g_str_equal); - object_hash_rev=g_hash_table_new(NULL, NULL); - object_count=g_hash_table_new(g_str_hash, g_str_equal); - dbg(lvl_debug,"enter\n"); - dbus_error_init(&error); +static void dbus_main_navit(struct navit *navit, int added) { + struct attr attr; + if (added==1) { + DBusMessage* msg; + char *opath=object_new("navit",navit); + char *interface=g_strdup_printf("%s%s", service_name, ".navit"); + command_add_table_attr(commands, sizeof(commands)/sizeof(struct command_table), navit, &attr); + navit_add_attr(navit, &attr); + msg = dbus_message_new_signal(opath, interface, "startup"); + dbus_connection_send(connection, msg, &dbus_serial); + dbus_connection_flush(connection); + dbus_message_unref(msg); + g_free(interface); + } +} + +void plugin_init(void) { + DBusError error; + + struct attr callback; + object_hash=g_hash_table_new(g_str_hash, g_str_equal); + object_hash_rev=g_hash_table_new(NULL, NULL); + object_count=g_hash_table_new(g_str_hash, g_str_equal); + dbg(lvl_debug,"enter"); + dbus_error_init(&error); #ifdef DBUS_USE_SYSTEM_BUS - connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error); + connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error); #else - connection = dbus_bus_get(DBUS_BUS_SESSION, &error); + connection = dbus_bus_get(DBUS_BUS_SESSION, &error); #endif - if (!connection) { - dbg(lvl_error,"Failed to open connection to session message bus: %s\n", error.message); - dbus_error_free(&error); - return; - } - dbus_connection_setup_with_g_main(connection, NULL); + if (!connection) { + dbg(lvl_error,"Failed to open connection to session message bus: %s", error.message); + dbus_error_free(&error); + return; + } + dbus_connection_setup_with_g_main(connection, NULL); #if 0 - dbus_connection_add_filter(connection, filter, NULL, NULL); - dbus_bus_add_match(connection, "type='signal',""interface='" DBUS_INTERFACE_DBUS "'", &error); + dbus_connection_add_filter(connection, filter, NULL, NULL); + dbus_bus_add_match(connection, "type='signal',""interface='" DBUS_INTERFACE_DBUS "'", &error); #endif - dbus_connection_register_fallback(connection, object_path, &dbus_navit_vtable, NULL); - dbus_bus_request_name(connection, service_name, 0, &error); - if (dbus_error_is_set(&error)) { - dbg(lvl_error,"Failed to request name: %s", error.message); - dbus_error_free (&error); - } - callback.type=attr_callback; - callback.u.callback=callback_new_attr_0(callback_cast(dbus_main_navit),attr_navit); - config_add_attr(config, &callback); + dbus_connection_register_fallback(connection, object_path, &dbus_navit_vtable, NULL); + dbus_bus_request_name(connection, service_name, 0, &error); + if (dbus_error_is_set(&error)) { + dbg(lvl_error,"Failed to request name: %s", error.message); + dbus_error_free (&error); + } + callback.type=attr_callback; + callback.u.callback=callback_new_attr_0(callback_cast(dbus_main_navit),attr_navit); + config_add_attr(config, &callback); } diff --git a/navit/binding/dbus/eval.py b/navit/binding/dbus/eval.py index a2e1926fd..ecb1d9583 100755 --- a/navit/binding/dbus/eval.py +++ b/navit/binding/dbus/eval.py @@ -4,9 +4,9 @@ import sys bus = dbus.SessionBus() conn = bus.get_object('org.navit_project.navit', '/org/navit_project/navit') -iface = dbus.Interface(conn, dbus_interface='org.navit_project.navit'); -iter=iface.attr_iter(); -navit=bus.get_object('org.navit_project.navit', conn.get_attr_wi('navit',iter)[1]); -iface.attr_iter_destroy(iter); -navit_iface = dbus.Interface(navit, dbus_interface='org.navit_project.navit.navit'); -print navit_iface.evaluate(sys.argv[1]); +iface = dbus.Interface(conn, dbus_interface='org.navit_project.navit') +_iter=iface.attr_iter() +navit=bus.get_object('org.navit_project.navit', conn.get_attr_wi('navit',_iter)[1]) +iface.attr_iter_destroy(_iter) +navit_iface = dbus.Interface(navit, dbus_interface='org.navit_project.navit.navit') +print navit_iface.evaluate(sys.argv[1]) diff --git a/navit/binding/dbus/navit.introspect b/navit/binding/dbus/navit.introspect index 9366c0cb3..9530a7b27 100644 --- a/navit/binding/dbus/navit.introspect +++ b/navit/binding/dbus/navit.introspect @@ -6,7 +6,7 @@ <arg direction="out" type="s" /> </method> </interface> - + <interface name="org.navit_project.navit"> <method name="get_navit"> <arg name="iter" type="o" direction="in"/> @@ -19,7 +19,7 @@ <arg name="iter" type="o" direction="in"/> </method> </interface> - + <interface name="org.navit_project.navit.navit"> <method name="zoom"> <arg type="i" direction="in" /> diff --git a/navit/binding/dbus/test.py b/navit/binding/dbus/test.py index 740f000e6..98a04b5a6 100755 --- a/navit/binding/dbus/test.py +++ b/navit/binding/dbus/test.py @@ -3,9 +3,9 @@ import dbus bus = dbus.SessionBus() conn = bus.get_object('org.navit_project.navit', '/org/navit_project/navit') -iface = dbus.Interface(conn, dbus_interface='org.navit_project.navit'); -iter=iface.attr_iter(); -navit=bus.get_object('org.navit_project.navit', conn.get_attr_wi("navit",iter)[1]); -iface.attr_iter_destroy(iter); -navit_iface = dbus.Interface(navit, dbus_interface='org.navit_project.navit.navit'); -navit_iface.set_center((1,0x138a4a,0x5d773f)); +iface = dbus.Interface(conn, dbus_interface='org.navit_project.navit') +_iter=iface.attr_iter() +navit=bus.get_object('org.navit_project.navit', conn.get_attr_wi("navit",_iter)[1]) +iface.attr_iter_destroy(_iter) +navit_iface = dbus.Interface(navit, dbus_interface='org.navit_project.navit.navit') +navit_iface.set_center((1,0x138a4a,0x5d773f)) diff --git a/navit/binding/python/attr.c b/navit/binding/python/attr.c index 2d5ed92b6..f9ba18d47 100644 --- a/navit/binding/python/attr.c +++ b/navit/binding/python/attr.c @@ -22,78 +22,67 @@ #include "attr.h" typedef struct { - PyObject_HEAD - int ref; - struct attr *attr; + PyObject_HEAD + int ref; + struct attr *attr; } attrObject; -static PyObject * -attr_func(attrObject *self, PyObject *args) -{ - const char *file; - int ret; - if (!PyArg_ParseTuple(args, "s", &file)) - return NULL; - ret=0; - return Py_BuildValue("i",ret); +static PyObject *attr_func(attrObject *self, PyObject *args) { + const char *file; + int ret; + if (!PyArg_ParseTuple(args, "s", &file)) + return NULL; + ret=0; + return Py_BuildValue("i",ret); } static PyMethodDef attr_methods[] = { - {"func", (PyCFunction) attr_func, METH_VARARGS }, - {NULL, NULL }, + {"func", (PyCFunction) attr_func, METH_VARARGS }, + {NULL, NULL }, }; -static PyObject * -attr_getattr_py(PyObject *self, char *name) -{ - return Py_FindMethod(attr_methods, self, name); +static PyObject *attr_getattr_py(PyObject *self, char *name) { + return Py_FindMethod(attr_methods, self, name); } -static void -attr_destroy_py(attrObject *self) -{ - if (! self->ref) - attr_free(self->attr); +static void attr_destroy_py(attrObject *self) { + if (! self->ref) + attr_free(self->attr); } PyTypeObject attr_Type = { - Obj_HEAD - .tp_name="attr", - .tp_basicsize=sizeof(attrObject), - .tp_dealloc=(destructor)attr_destroy_py, - .tp_getattr=attr_getattr_py, + Obj_HEAD + .tp_name="attr", + .tp_basicsize=sizeof(attrObject), + .tp_dealloc=(destructor)attr_destroy_py, + .tp_getattr=attr_getattr_py, }; struct attr * -attr_py_get(PyObject *self) -{ - return ((attrObject *)self)->attr; +attr_py_get(PyObject *self) { + return ((attrObject *)self)->attr; } -PyObject * -attr_new_py(PyObject *self, PyObject *args) -{ - attrObject *ret; - const char *name,*value; - if (!PyArg_ParseTuple(args, "ss", &name, &value)) - return NULL; - ret=PyObject_NEW(attrObject, &attr_Type); - ret->attr=attr_new_from_text(name, value); - ret->ref=0; - return (PyObject *)ret; +PyObject *attr_new_py(PyObject *self, PyObject *args) { + attrObject *ret; + const char *name,*value; + if (!PyArg_ParseTuple(args, "ss", &name, &value)) + return NULL; + ret=PyObject_NEW(attrObject, &attr_Type); + ret->attr=attr_new_from_text(name, value); + ret->ref=0; + return (PyObject *)ret; } -PyObject * -attr_new_py_ref(struct attr *attr) -{ - attrObject *ret; +PyObject *attr_new_py_ref(struct attr *attr) { + attrObject *ret; - ret=PyObject_NEW(attrObject, &attr_Type); - ret->ref=1; - ret->attr=attr; - return (PyObject *)ret; + ret=PyObject_NEW(attrObject, &attr_Type); + ret->ref=1; + ret->attr=attr; + return (PyObject *)ret; } diff --git a/navit/binding/python/binding_python.c b/navit/binding/python/binding_python.c index 51d84fe10..6a3fe5197 100644 --- a/navit/binding/python/binding_python.c +++ b/navit/binding/python/binding_python.c @@ -42,66 +42,62 @@ /* *** coord *** */ typedef struct { - PyObject_HEAD - struct coord *c; + PyObject_HEAD + struct coord *c; } coordObject; static void coord_destroy_py(coordObject *self); PyTypeObject coord_Type = { - Obj_HEAD - .tp_name="coord", - .tp_basicsize=sizeof(coordObject), - .tp_dealloc=(destructor)coord_destroy_py, + Obj_HEAD + .tp_name="coord", + .tp_basicsize=sizeof(coordObject), + .tp_dealloc=(destructor)coord_destroy_py, }; /* *** map *** */ typedef struct { - PyObject_HEAD - int ref; - struct map *m; + PyObject_HEAD + int ref; + struct map *m; } mapObject; static void map_destroy_py(mapObject *self); static PyObject *map_getattr_py(PyObject *self, char *name); PyTypeObject map_Type = { - Obj_HEAD - .tp_name="map", - .tp_basicsize=sizeof(mapObject), - .tp_dealloc=(destructor)map_destroy_py, - .tp_getattr=map_getattr_py, + Obj_HEAD + .tp_name="map", + .tp_basicsize=sizeof(mapObject), + .tp_dealloc=(destructor)map_destroy_py, + .tp_getattr=map_getattr_py, }; /* *** IMPLEMENTATIONS *** */ /* *** coord *** */ -static PyObject * -coord_new_py(PyObject *self, PyObject *args) -{ - coordObject *ret; - int x,y; - if (!PyArg_ParseTuple(args, "ii:navit.coord",&x,&y)) - return NULL; - ret=PyObject_NEW(coordObject, &coord_Type); - ret->c=coord_new(x,y); - return (PyObject *)ret; +static PyObject *coord_new_py(PyObject *self, PyObject *args) { + coordObject *ret; + int x,y; + if (!PyArg_ParseTuple(args, "ii:navit.coord",&x,&y)) + return NULL; + ret=PyObject_NEW(coordObject, &coord_Type); + ret->c=coord_new(x,y); + return (PyObject *)ret; } -static void -coord_destroy_py(coordObject *self) -{ - coord_destroy(self->c); +static void coord_destroy_py(coordObject *self) { + coord_destroy(self->c); } /* *** coord_rect *** */ typedef struct { - PyObject_HEAD - struct coord_rect *r; + PyObject_HEAD + struct coord_rect *r; } coord_rectObject; @@ -109,38 +105,34 @@ static void coord_rect_destroy_py(coord_rectObject *self); PyTypeObject coord_rect_Type = { #if defined(MS_WINDOWS) || defined(__CYGWIN__) - PyObject_HEAD_INIT(NULL); + PyObject_HEAD_INIT(NULL); #else - PyObject_HEAD_INIT(&PyType_Type) + PyObject_HEAD_INIT(&PyType_Type) #endif - .tp_name="coord_rect", - .tp_basicsize=sizeof(coord_rectObject), - .tp_dealloc=(destructor)coord_rect_destroy_py, + .tp_name="coord_rect", + .tp_basicsize=sizeof(coord_rectObject), + .tp_dealloc=(destructor)coord_rect_destroy_py, }; -static PyObject * -coord_rect_new_py(PyObject *self, PyObject *args) -{ - coord_rectObject *ret; - coordObject *lu,*rd; - if (!PyArg_ParseTuple(args, "O!O!:navit.coord_rect_rect",&coord_Type,&lu,&coord_Type,&rd)) - return NULL; - ret=PyObject_NEW(coord_rectObject, &coord_rect_Type); - ret->r=coord_rect_new(lu->c,rd->c); - return (PyObject *)ret; +static PyObject *coord_rect_new_py(PyObject *self, PyObject *args) { + coord_rectObject *ret; + coordObject *lu,*rd; + if (!PyArg_ParseTuple(args, "O!O!:navit.coord_rect_rect",&coord_Type,&lu,&coord_Type,&rd)) + return NULL; + ret=PyObject_NEW(coord_rectObject, &coord_rect_Type); + ret->r=coord_rect_new(lu->c,rd->c); + return (PyObject *)ret; } -static void -coord_rect_destroy_py(coord_rectObject *self) -{ - coord_rect_destroy(self->r); +static void coord_rect_destroy_py(coord_rectObject *self) { + coord_rect_destroy(self->r); } /* *** map_rect *** */ typedef struct { - PyObject_HEAD - struct map_rect *mr; + PyObject_HEAD + struct map_rect *mr; } map_rectObject; @@ -148,110 +140,94 @@ static void map_rect_destroy_py(map_rectObject *self); PyTypeObject map_rect_Type = { #if defined(MS_WINDOWS) || defined(__CYGWIN__) - PyObject_HEAD_INIT(NULL); + PyObject_HEAD_INIT(NULL); #else - PyObject_HEAD_INIT(&PyType_Type) + PyObject_HEAD_INIT(&PyType_Type) #endif - .tp_name="map_rect", - .tp_basicsize=sizeof(map_rectObject), - .tp_dealloc=(destructor)map_rect_destroy_py, + .tp_name="map_rect", + .tp_basicsize=sizeof(map_rectObject), + .tp_dealloc=(destructor)map_rect_destroy_py, }; -static PyObject * -map_rect_new_py(mapObject *self, PyObject *args) -{ - map_rectObject *ret; - coord_rectObject *r; - if (!PyArg_ParseTuple(args, "O!:navit.map_rect_rect",&coord_rect_Type,&r)) - return NULL; - ret=PyObject_NEW(map_rectObject, &map_rect_Type); - ret->mr=map_rect_new(self->m, NULL); - return (PyObject *)ret; +static PyObject *map_rect_new_py(mapObject *self, PyObject *args) { + map_rectObject *ret; + coord_rectObject *r; + if (!PyArg_ParseTuple(args, "O!:navit.map_rect_rect",&coord_rect_Type,&r)) + return NULL; + ret=PyObject_NEW(map_rectObject, &map_rect_Type); + ret->mr=map_rect_new(self->m, NULL); + return (PyObject *)ret; } -static void -map_rect_destroy_py(map_rectObject *self) -{ - map_rect_destroy(self->mr); +static void map_rect_destroy_py(map_rectObject *self) { + map_rect_destroy(self->mr); } /* *** map *** */ -static PyObject * -map_dump_file_py(mapObject *self, PyObject *args) -{ - const char *s; - if (!PyArg_ParseTuple(args, "s",&s)) - return NULL; - map_dump_file(self->m, s); - Py_RETURN_NONE; +static PyObject *map_dump_file_py(mapObject *self, PyObject *args) { + const char *s; + if (!PyArg_ParseTuple(args, "s",&s)) + return NULL; + map_dump_file(self->m, s); + Py_RETURN_NONE; } -static PyObject * -map_set_attr_py(mapObject *self, PyObject *args) -{ - PyObject *attr; - if (!PyArg_ParseTuple(args, "O!", &attr_Type, &attr)) - return NULL; - map_set_attr(self->m, attr_py_get(attr)); - Py_RETURN_NONE; +static PyObject *map_set_attr_py(mapObject *self, PyObject *args) { + PyObject *attr; + if (!PyArg_ParseTuple(args, "O!", &attr_Type, &attr)) + return NULL; + map_set_attr(self->m, attr_py_get(attr)); + Py_RETURN_NONE; } static PyMethodDef map_methods[] = { - {"dump_file", (PyCFunction) map_dump_file_py, METH_VARARGS }, - {"map_rect_new", (PyCFunction) map_rect_new_py, METH_VARARGS }, - {"set_attr", (PyCFunction) map_set_attr_py, METH_VARARGS }, - {NULL, NULL }, + {"dump_file", (PyCFunction) map_dump_file_py, METH_VARARGS }, + {"map_rect_new", (PyCFunction) map_rect_new_py, METH_VARARGS }, + {"set_attr", (PyCFunction) map_set_attr_py, METH_VARARGS }, + {NULL, NULL }, }; -static PyObject * -map_getattr_py(PyObject *self, char *name) -{ - return Py_FindMethod(map_methods, self, name); +static PyObject *map_getattr_py(PyObject *self, char *name) { + return Py_FindMethod(map_methods, self, name); } -static PyObject * -map_new_py(PyObject *self, PyObject *args) -{ - mapObject *ret; - char *type, *filename; - - if (!PyArg_ParseTuple(args, "ss:navit.map", &type, &filename)) - return NULL; - ret=PyObject_NEW(mapObject, &map_Type); - ret->m=map_new(NULL,NULL); - ret->ref=0; - return (PyObject *)ret; +static PyObject *map_new_py(PyObject *self, PyObject *args) { + mapObject *ret; + char *type, *filename; + + if (!PyArg_ParseTuple(args, "ss:navit.map", &type, &filename)) + return NULL; + ret=PyObject_NEW(mapObject, &map_Type); + ret->m=map_new(NULL,NULL); + ret->ref=0; + return (PyObject *)ret; } -PyObject * -map_py_ref(struct map *map) -{ - mapObject *ret; - ret=PyObject_NEW(mapObject, &map_Type); - ret->m=map; - ret->ref=1; - return (PyObject *)ret; +PyObject *map_py_ref(struct map *map) { + mapObject *ret; + ret=PyObject_NEW(mapObject, &map_Type); + ret->m=map; + ret->ref=1; + return (PyObject *)ret; } -static void -map_destroy_py(mapObject *self) -{ - if (!self->ref) - map_destroy(self->m); +static void map_destroy_py(mapObject *self) { + if (!self->ref) + map_destroy(self->m); } /* *** mapset *** */ typedef struct { - PyObject_HEAD - struct mapset *ms; + PyObject_HEAD + struct mapset *ms; } mapsetObject; @@ -260,111 +236,99 @@ static PyObject *mapset_getattr_py(PyObject *self, char *name); PyTypeObject mapset_Type = { #if defined(MS_WINDOWS) || defined(__CYGWIN__) - PyObject_HEAD_INIT(NULL); + PyObject_HEAD_INIT(NULL); #else - PyObject_HEAD_INIT(&PyType_Type) + PyObject_HEAD_INIT(&PyType_Type) #endif - .tp_name="mapset", - .tp_basicsize=sizeof(mapsetObject), - .tp_dealloc=(destructor)mapset_destroy_py, - .tp_getattr=mapset_getattr_py, + .tp_name="mapset", + .tp_basicsize=sizeof(mapsetObject), + .tp_dealloc=(destructor)mapset_destroy_py, + .tp_getattr=mapset_getattr_py, }; -static PyObject * -mapset_add_py(mapsetObject *self, PyObject *args) -{ - mapObject *map; - if (!PyArg_ParseTuple(args, "O:navit.mapset", &map)) - return NULL; - Py_INCREF(map); - mapset_add_attr(self->ms, &(struct attr){attr_map,.u.map=map->m}); - return Py_BuildValue(""); +static PyObject *mapset_add_py(mapsetObject *self, PyObject *args) { + mapObject *map; + if (!PyArg_ParseTuple(args, "O:navit.mapset", &map)) + return NULL; + Py_INCREF(map); + mapset_add_attr(self->ms, &(struct attr) { + attr_map,.u.map=map->m + }); + return Py_BuildValue(""); } static PyMethodDef mapset_methods[] = { - {"add", (PyCFunction) mapset_add_py, METH_VARARGS }, - {NULL, NULL }, + {"add", (PyCFunction) mapset_add_py, METH_VARARGS }, + {NULL, NULL }, }; -static PyObject * -mapset_getattr_py(PyObject *self, char *name) -{ - return Py_FindMethod(mapset_methods, self, name); +static PyObject *mapset_getattr_py(PyObject *self, char *name) { + return Py_FindMethod(mapset_methods, self, name); } -static PyObject * -mapset_new_py(PyObject *self, PyObject *args) -{ - mapsetObject *ret; - if (!PyArg_ParseTuple(args, ":navit.mapset")) - return NULL; - ret=PyObject_NEW(mapsetObject, &mapset_Type); - ret->ms=mapset_new(NULL,NULL); - return (PyObject *)ret; +static PyObject *mapset_new_py(PyObject *self, PyObject *args) { + mapsetObject *ret; + if (!PyArg_ParseTuple(args, ":navit.mapset")) + return NULL; + ret=PyObject_NEW(mapsetObject, &mapset_Type); + ret->ms=mapset_new(NULL,NULL); + return (PyObject *)ret; } -static void -mapset_destroy_py(mapsetObject *self) -{ - mapset_destroy(self->ms); +static void mapset_destroy_py(mapsetObject *self) { + mapset_destroy(self->ms); } -static PyObject * -config_load_py(PyObject *self, PyObject *args) -{ - const char *file; - int ret; - xmlerror *error; - if (!PyArg_ParseTuple(args, "s", &file)) - return NULL; - ret=config_load(file, &error); - return Py_BuildValue("i",ret); +static PyObject *config_load_py(PyObject *self, PyObject *args) { + const char *file; + int ret; + xmlerror *error; + if (!PyArg_ParseTuple(args, "s", &file)) + return NULL; + ret=config_load(file, &error); + return Py_BuildValue("i",ret); } -static PyMethodDef navitMethods[]={ - {"attr", attr_new_py, METH_VARARGS}, - {"coord", coord_new_py, METH_VARARGS, "Create a new coordinate point."}, - {"coord_rect", coord_rect_new_py, METH_VARARGS, "Create a new coordinate rectangle."}, - {"map", map_new_py, METH_VARARGS, "Create a new map."}, - {"mapset", mapset_new_py, METH_VARARGS, "Create a new mapset."}, - {"config_load", config_load_py, METH_VARARGS, "Load a config"}, - {"config", config_py, METH_VARARGS, "Get Config Object"}, - {"pcoord", pcoord_py, METH_VARARGS}, - {NULL, NULL, 0, NULL} +static PyMethodDef navitMethods[]= { + {"attr", attr_new_py, METH_VARARGS}, + {"coord", coord_new_py, METH_VARARGS, "Create a new coordinate point."}, + {"coord_rect", coord_rect_new_py, METH_VARARGS, "Create a new coordinate rectangle."}, + {"map", map_new_py, METH_VARARGS, "Create a new map."}, + {"mapset", mapset_new_py, METH_VARARGS, "Create a new mapset."}, + {"config_load", config_load_py, METH_VARARGS, "Load a config"}, + {"config", config_py, METH_VARARGS, "Get Config Object"}, + {"pcoord", pcoord_py, METH_VARARGS}, + {NULL, NULL, 0, NULL} }; -PyObject * -python_object_from_attr(struct attr *attr) -{ - switch (attr->type) { - case attr_navigation: - return navigation_py_ref(attr->u.navigation); - case attr_route: - return route_py_ref(attr->u.route); - default: - return NULL; - } - return NULL; +PyObject *python_object_from_attr(struct attr *attr) { + switch (attr->type) { + case attr_navigation: + return navigation_py_ref(attr->u.navigation); + case attr_route: + return route_py_ref(attr->u.route); + default: + return NULL; + } + return NULL; } -void -plugin_init(void) -{ - int fd,size; - char buffer[65536]; - - Py_Initialize(); - Py_InitModule("navit", navitMethods); - fd=open("startup.py",O_RDONLY); - if (fd >= 0) { - size=read(fd, buffer, 65535); - if (size > 0) { - buffer[size]='\0'; - PyRun_SimpleString(buffer); - } - } - - Py_Finalize(); +void plugin_init(void) { + int fd,size; + char buffer[65536]; + + Py_Initialize(); + Py_InitModule("navit", navitMethods); + fd=open("startup.py",O_RDONLY); + if (fd >= 0) { + size=read(fd, buffer, 65535); + if (size > 0) { + buffer[size]='\0'; + PyRun_SimpleString(buffer); + } + } + + Py_Finalize(); } diff --git a/navit/binding/python/config.c b/navit/binding/python/config.c index c3f04c4df..5115844a8 100644 --- a/navit/binding/python/config.c +++ b/navit/binding/python/config.c @@ -22,52 +22,44 @@ #include "config_.h" typedef struct { - PyObject_HEAD + PyObject_HEAD } configObject; -static PyObject * -config_navit(PyObject *self, PyObject *args) -{ - struct attr navit; - if (config_get_attr(config, attr_navit, &navit, NULL)) - return navit_py_ref(navit.u.navit); - return NULL; +static PyObject *config_navit(PyObject *self, PyObject *args) { + struct attr navit; + if (config_get_attr(config, attr_navit, &navit, NULL)) + return navit_py_ref(navit.u.navit); + return NULL; } static PyMethodDef config_methods[] = { - {"navit", (PyCFunction) config_navit, METH_VARARGS }, - {NULL, NULL }, + {"navit", (PyCFunction) config_navit, METH_VARARGS }, + {NULL, NULL }, }; -static PyObject * -config_getattr_py(PyObject *self, char *name) -{ - return Py_FindMethod(config_methods, self, name); +static PyObject *config_getattr_py(PyObject *self, char *name) { + return Py_FindMethod(config_methods, self, name); } -static void -config_destroy_py(configObject *self) -{ +static void config_destroy_py(configObject *self) { } PyTypeObject config_Type = { - Obj_HEAD - .tp_name="config", - .tp_basicsize=sizeof(configObject), - .tp_dealloc=(destructor)config_destroy_py, - .tp_getattr=config_getattr_py, + Obj_HEAD + .tp_name="config", + .tp_basicsize=sizeof(configObject), + .tp_dealloc=(destructor)config_destroy_py, + .tp_getattr=config_getattr_py, }; -PyObject * -config_py(PyObject *self, PyObject *args) -{ - configObject *ret; +PyObject *config_py(PyObject *self, PyObject *args) { + configObject *ret; - dbg(lvl_debug,"enter\n"); - ret=PyObject_NEW(configObject, &config_Type); - return (PyObject *)ret; + dbg(lvl_debug,"enter"); + ret=PyObject_NEW(configObject, &config_Type); + return (PyObject *)ret; } diff --git a/navit/binding/python/navigation.c b/navit/binding/python/navigation.c index 75a421d52..b5030b731 100644 --- a/navit/binding/python/navigation.c +++ b/navit/binding/python/navigation.c @@ -21,62 +21,52 @@ #include "navigation.h" typedef struct { - PyObject_HEAD - struct navigation *navigation; + PyObject_HEAD + struct navigation *navigation; } navigationObject; -static PyObject * -navigation_get_map_py(navigationObject *self, PyObject *args) -{ - if (!PyArg_ParseTuple(args, "")) - return NULL; - return map_py_ref(navigation_get_map(self->navigation)); +static PyObject *navigation_get_map_py(navigationObject *self, PyObject *args) { + if (!PyArg_ParseTuple(args, "")) + return NULL; + return map_py_ref(navigation_get_map(self->navigation)); } static PyMethodDef navigation_methods[] = { - {"get_map", (PyCFunction) navigation_get_map_py, METH_VARARGS }, - {NULL, NULL }, + {"get_map", (PyCFunction) navigation_get_map_py, METH_VARARGS }, + {NULL, NULL }, }; -static PyObject * -navigation_getattr_py(PyObject *self, char *name) -{ - return Py_FindMethod(navigation_methods, self, name); +static PyObject *navigation_getattr_py(PyObject *self, char *name) { + return Py_FindMethod(navigation_methods, self, name); } -static void -navigation_destroy_py(navigationObject *self) -{ +static void navigation_destroy_py(navigationObject *self) { } PyTypeObject navigation_Type = { - Obj_HEAD - .tp_name="navigation", - .tp_basicsize=sizeof(navigationObject), - .tp_dealloc=(destructor)navigation_destroy_py, - .tp_getattr=navigation_getattr_py, + Obj_HEAD + .tp_name="navigation", + .tp_basicsize=sizeof(navigationObject), + .tp_dealloc=(destructor)navigation_destroy_py, + .tp_getattr=navigation_getattr_py, }; -PyObject * -navigation_py(PyObject *self, PyObject *args) -{ - navigationObject *ret; +PyObject *navigation_py(PyObject *self, PyObject *args) { + navigationObject *ret; - ret=PyObject_NEW(navigationObject, &navigation_Type); - return (PyObject *)ret; + ret=PyObject_NEW(navigationObject, &navigation_Type); + return (PyObject *)ret; } -PyObject * -navigation_py_ref(struct navigation *navigation) -{ - navigationObject *ret; +PyObject *navigation_py_ref(struct navigation *navigation) { + navigationObject *ret; - ret=PyObject_NEW(navigationObject, &navigation_Type); - ret->navigation=navigation; - return (PyObject *)ret; + ret=PyObject_NEW(navigationObject, &navigation_Type); + ret->navigation=navigation; + return (PyObject *)ret; } diff --git a/navit/binding/python/navit.c b/navit/binding/python/navit.c index 2fde44cbe..38248b74b 100644 --- a/navit/binding/python/navit.c +++ b/navit/binding/python/navit.c @@ -22,125 +22,105 @@ #include "navit.h" typedef struct { - PyObject_HEAD - struct navit *navit; + PyObject_HEAD + struct navit *navit; } navitObject; -static PyObject * -navit_set_attr_py(navitObject *self, PyObject *args) -{ - PyObject *attr; - if (!PyArg_ParseTuple(args, "O!", &attr_Type, &attr)) - return NULL; - navit_set_attr(self->navit, attr_py_get(attr)); - Py_RETURN_NONE; +static PyObject *navit_set_attr_py(navitObject *self, PyObject *args) { + PyObject *attr; + if (!PyArg_ParseTuple(args, "O!", &attr_Type, &attr)) + return NULL; + navit_set_attr(self->navit, attr_py_get(attr)); + Py_RETURN_NONE; } -static PyObject * -navit_get_attr_py(navitObject *self, PyObject *args) -{ - char *name; - struct attr attr; - if (!PyArg_ParseTuple(args, "s", &name)) - return NULL; - if (!navit_get_attr(self->navit, attr_from_name(name), &attr, NULL)) { - dbg(lvl_error,"get_attr not ok\n"); - Py_RETURN_NONE; - } - dbg(lvl_debug,"get_attr ok\n"); - return python_object_from_attr(&attr); +static PyObject *navit_get_attr_py(navitObject *self, PyObject *args) { + char *name; + struct attr attr; + if (!PyArg_ParseTuple(args, "s", &name)) + return NULL; + if (!navit_get_attr(self->navit, attr_from_name(name), &attr, NULL)) { + dbg(lvl_error,"get_attr not ok"); + Py_RETURN_NONE; + } + dbg(lvl_debug,"get_attr ok"); + return python_object_from_attr(&attr); } -static PyObject * -navit_set_center_py(navitObject *self, PyObject *args) -{ - PyObject *pcoord; - if (!PyArg_ParseTuple(args, "O!", &pcoord_Type, &pcoord)) - return NULL; - navit_set_center(self->navit, pcoord_py_get(pcoord), 0); - Py_RETURN_NONE; +static PyObject *navit_set_center_py(navitObject *self, PyObject *args) { + PyObject *pcoord; + if (!PyArg_ParseTuple(args, "O!", &pcoord_Type, &pcoord)) + return NULL; + navit_set_center(self->navit, pcoord_py_get(pcoord), 0); + Py_RETURN_NONE; } -static PyObject * -navit_set_destination_py(navitObject *self, PyObject *args) -{ - PyObject *pcoord; - const char *description; - int async; - if (!PyArg_ParseTuple(args, "O!si", &pcoord_Type, &pcoord, &description, &async)) - return NULL; - navit_set_destination(self->navit, pcoord_py_get(pcoord), description, async); - Py_RETURN_NONE; +static PyObject *navit_set_destination_py(navitObject *self, PyObject *args) { + PyObject *pcoord; + const char *description; + int async; + if (!PyArg_ParseTuple(args, "O!si", &pcoord_Type, &pcoord, &description, &async)) + return NULL; + navit_set_destination(self->navit, pcoord_py_get(pcoord), description, async); + Py_RETURN_NONE; } -static PyObject * -navit_set_position_py(navitObject *self, PyObject *args) -{ - PyObject *pcoord; - if (!PyArg_ParseTuple(args, "O!", &pcoord_Type, &pcoord)) - return NULL; - navit_set_position(self->navit, pcoord_py_get(pcoord)); - Py_RETURN_NONE; +static PyObject *navit_set_position_py(navitObject *self, PyObject *args) { + PyObject *pcoord; + if (!PyArg_ParseTuple(args, "O!", &pcoord_Type, &pcoord)) + return NULL; + navit_set_position(self->navit, pcoord_py_get(pcoord)); + Py_RETURN_NONE; } -static PyObject * -navit_zoom_to_route_py(navitObject *self, PyObject *args) -{ - if (!PyArg_ParseTuple(args, "")) - return NULL; - navit_zoom_to_route(self->navit,0); - Py_RETURN_NONE; +static PyObject *navit_zoom_to_route_py(navitObject *self, PyObject *args) { + if (!PyArg_ParseTuple(args, "")) + return NULL; + navit_zoom_to_route(self->navit,0); + Py_RETURN_NONE; } static PyMethodDef navit_methods[] = { - {"set_attr", (PyCFunction) navit_set_attr_py, METH_VARARGS }, - {"get_attr", (PyCFunction) navit_get_attr_py, METH_VARARGS }, - {"set_center", (PyCFunction) navit_set_center_py, METH_VARARGS }, - {"set_destination", (PyCFunction) navit_set_destination_py, METH_VARARGS }, - {"set_position", (PyCFunction) navit_set_position_py, METH_VARARGS }, - {"zoom_to_route", (PyCFunction) navit_zoom_to_route_py, METH_VARARGS }, - {NULL, NULL }, + {"set_attr", (PyCFunction) navit_set_attr_py, METH_VARARGS }, + {"get_attr", (PyCFunction) navit_get_attr_py, METH_VARARGS }, + {"set_center", (PyCFunction) navit_set_center_py, METH_VARARGS }, + {"set_destination", (PyCFunction) navit_set_destination_py, METH_VARARGS }, + {"set_position", (PyCFunction) navit_set_position_py, METH_VARARGS }, + {"zoom_to_route", (PyCFunction) navit_zoom_to_route_py, METH_VARARGS }, + {NULL, NULL }, }; -static PyObject * -navit_getattr_py(PyObject *self, char *name) -{ - return Py_FindMethod(navit_methods, self, name); +static PyObject *navit_getattr_py(PyObject *self, char *name) { + return Py_FindMethod(navit_methods, self, name); } -static void -navit_destroy_py(navitObject *self) -{ +static void navit_destroy_py(navitObject *self) { } PyTypeObject navit_Type = { - Obj_HEAD - .tp_name="navit", - .tp_basicsize=sizeof(navitObject), - .tp_dealloc=(destructor)navit_destroy_py, - .tp_getattr=navit_getattr_py, + Obj_HEAD + .tp_name="navit", + .tp_basicsize=sizeof(navitObject), + .tp_dealloc=(destructor)navit_destroy_py, + .tp_getattr=navit_getattr_py, }; -PyObject * -navit_py(PyObject *self, PyObject *args) -{ - navitObject *ret; +PyObject *navit_py(PyObject *self, PyObject *args) { + navitObject *ret; - dbg(lvl_debug,"enter\n"); - ret=PyObject_NEW(navitObject, &navit_Type); - return (PyObject *)ret; + dbg(lvl_debug,"enter"); + ret=PyObject_NEW(navitObject, &navit_Type); + return (PyObject *)ret; } -PyObject * -navit_py_ref(struct navit *navit) -{ - dbg(lvl_debug,"navit=%p\n", navit); - navitObject *ret=PyObject_NEW(navitObject, &navit_Type); - ret->navit=navit; - return (PyObject *)ret; +PyObject *navit_py_ref(struct navit *navit) { + dbg(lvl_debug,"navit=%p", navit); + navitObject *ret=PyObject_NEW(navitObject, &navit_Type); + ret->navit=navit; + return (PyObject *)ret; } diff --git a/navit/binding/python/pcoord.c b/navit/binding/python/pcoord.c index 4fe734a70..0c8d959fe 100644 --- a/navit/binding/python/pcoord.c +++ b/navit/binding/python/pcoord.c @@ -21,68 +21,59 @@ #include "coord.h" typedef struct { - PyObject_HEAD - struct pcoord pc; + PyObject_HEAD + struct pcoord pc; } pcoordObject; -static PyObject * -pcoord_func(pcoordObject *self, PyObject *args) -{ - const char *file; - int ret=0; - if (!PyArg_ParseTuple(args, "s", &file)) - return NULL; - return Py_BuildValue("i",ret); +static PyObject *pcoord_func(pcoordObject *self, PyObject *args) { + const char *file; + int ret=0; + if (!PyArg_ParseTuple(args, "s", &file)) + return NULL; + return Py_BuildValue("i",ret); } static PyMethodDef pcoord_methods[] = { - {"func", (PyCFunction) pcoord_func, METH_VARARGS }, - {NULL, NULL }, + {"func", (PyCFunction) pcoord_func, METH_VARARGS }, + {NULL, NULL }, }; -static PyObject * -pcoord_getattr_py(PyObject *self, char *name) -{ - return Py_FindMethod(pcoord_methods, self, name); +static PyObject *pcoord_getattr_py(PyObject *self, char *name) { + return Py_FindMethod(pcoord_methods, self, name); } -static void -pcoord_destroy_py(pcoordObject *self) -{ +static void pcoord_destroy_py(pcoordObject *self) { } PyTypeObject pcoord_Type = { - Obj_HEAD - .tp_name="pcoord", - .tp_basicsize=sizeof(pcoordObject), - .tp_dealloc=(destructor)pcoord_destroy_py, - .tp_getattr=pcoord_getattr_py, + Obj_HEAD + .tp_name="pcoord", + .tp_basicsize=sizeof(pcoordObject), + .tp_dealloc=(destructor)pcoord_destroy_py, + .tp_getattr=pcoord_getattr_py, }; -PyObject * -pcoord_py(PyObject *self, PyObject *args) -{ - pcoordObject *ret; - const char *str; - enum projection pro; - struct coord c; - if (!PyArg_ParseTuple(args, "si", &str, &pro)) - return NULL; - ret=PyObject_NEW(pcoordObject, &pcoord_Type); - coord_parse(str, pro, &c); - ret->pc.pro=pro; - ret->pc.x=c.x; - ret->pc.y=c.y; - dbg(lvl_debug,"0x%x,0x%x\n", c.x, c.y); - return (PyObject *)ret; +PyObject *pcoord_py(PyObject *self, PyObject *args) { + pcoordObject *ret; + const char *str; + enum projection pro; + struct coord c; + if (!PyArg_ParseTuple(args, "si", &str, &pro)) + return NULL; + ret=PyObject_NEW(pcoordObject, &pcoord_Type); + coord_parse(str, pro, &c); + ret->pc.pro=pro; + ret->pc.x=c.x; + ret->pc.y=c.y; + dbg(lvl_debug,"0x%x,0x%x", c.x, c.y); + return (PyObject *)ret; } struct pcoord * -pcoord_py_get(PyObject *self) -{ - return &((pcoordObject *)self)->pc; +pcoord_py_get(PyObject *self) { + return &((pcoordObject *)self)->pc; } diff --git a/navit/binding/python/route.c b/navit/binding/python/route.c index dfbd08cf9..3aaff8157 100644 --- a/navit/binding/python/route.c +++ b/navit/binding/python/route.c @@ -23,62 +23,52 @@ #include "route.h" typedef struct { - PyObject_HEAD - struct route *route; + PyObject_HEAD + struct route *route; } routeObject; -static PyObject * -route_get_map_py(routeObject *self, PyObject *args) -{ - if (!PyArg_ParseTuple(args, "")) - return NULL; - return map_py_ref(route_get_map(self->route)); +static PyObject *route_get_map_py(routeObject *self, PyObject *args) { + if (!PyArg_ParseTuple(args, "")) + return NULL; + return map_py_ref(route_get_map(self->route)); } static PyMethodDef route_methods[] = { - {"get_map", (PyCFunction) route_get_map_py, METH_VARARGS }, - {NULL, NULL }, + {"get_map", (PyCFunction) route_get_map_py, METH_VARARGS }, + {NULL, NULL }, }; -static PyObject * -route_getattr_py(PyObject *self, char *name) -{ - return Py_FindMethod(route_methods, self, name); +static PyObject *route_getattr_py(PyObject *self, char *name) { + return Py_FindMethod(route_methods, self, name); } -static void -route_destroy_py(routeObject *self) -{ +static void route_destroy_py(routeObject *self) { } PyTypeObject route_Type = { - Obj_HEAD - .tp_name="route", - .tp_basicsize=sizeof(routeObject), - .tp_dealloc=(destructor)route_destroy_py, - .tp_getattr=route_getattr_py, + Obj_HEAD + .tp_name="route", + .tp_basicsize=sizeof(routeObject), + .tp_dealloc=(destructor)route_destroy_py, + .tp_getattr=route_getattr_py, }; -PyObject * -route_py(PyObject *self, PyObject *args) -{ - routeObject *ret; +PyObject *route_py(PyObject *self, PyObject *args) { + routeObject *ret; - ret=PyObject_NEW(routeObject, &route_Type); - return (PyObject *)ret; + ret=PyObject_NEW(routeObject, &route_Type); + return (PyObject *)ret; } -PyObject * -route_py_ref(struct route *route) -{ - routeObject *ret; +PyObject *route_py_ref(struct route *route) { + routeObject *ret; - ret=PyObject_NEW(routeObject, &route_Type); - ret->route=route; - return (PyObject *)ret; + ret=PyObject_NEW(routeObject, &route_Type); + ret->route=route; + return (PyObject *)ret; } diff --git a/navit/binding/python/startup.py b/navit/binding/python/startup.py index f8e801551..272a78a2f 100644 --- a/navit/binding/python/startup.py +++ b/navit/binding/python/startup.py @@ -1,8 +1,8 @@ import navit navit.config_load("navit.xml.local") -pos=navit.pcoord("5023.7493 N 00730.2898 E",1); -dest=navit.pcoord("5023.6604 N 00729.8500 E",1); -inst=navit.config().navit(); -inst.set_position(pos); -inst.set_destination(dest,"Test"); -inst.set_center(pos); +pos=navit.pcoord("5023.7493 N 00730.2898 E",1) +dest=navit.pcoord("5023.6604 N 00729.8500 E",1) +inst=navit.config().navit() +inst.set_position(pos) +inst.set_destination(dest,"Test") +inst.set_center(pos) diff --git a/navit/binding/python/template.c b/navit/binding/python/template.c index 088cb5ee3..69a3e7265 100644 --- a/navit/binding/python/template.c +++ b/navit/binding/python/template.c @@ -21,76 +21,65 @@ #include "template.h" typedef struct { - PyObject_HEAD - int ref; - struct template *template; + PyObject_HEAD + int ref; + struct template *template; } templateObject; -static PyObject * -template_func(templateObject *self, PyObject *args) -{ - const char *file; - int ret; - if (!PyArg_ParseTuple(args, "s", &file)) - return NULL; - ret=0; - return Py_BuildValue("i",ret); +static PyObject *template_func(templateObject *self, PyObject *args) { + const char *file; + int ret; + if (!PyArg_ParseTuple(args, "s", &file)) + return NULL; + ret=0; + return Py_BuildValue("i",ret); } static PyMethodDef template_methods[] = { - {"func", (PyCFunction) template_func, METH_VARARGS }, - {NULL, NULL }, + {"func", (PyCFunction) template_func, METH_VARARGS }, + {NULL, NULL }, }; -static PyObject * -template_getattr_py(PyObject *self, char *name) -{ - return Py_FindMethod(template_methods, self, name); +static PyObject *template_getattr_py(PyObject *self, char *name) { + return Py_FindMethod(template_methods, self, name); } -static void -template_destroy_py(templateObject *self) -{ - if (! self->ref) - template_destroy(self->template); +static void template_destroy_py(templateObject *self) { + if (! self->ref) + template_destroy(self->template); } PyTypeObject template_Type = { - Obj_HEAD - .tp_name="template", - .tp_basicsize=sizeof(templateObject), - .tp_dealloc=(destructor)template_destroy_py, - .tp_getattr=template_getattr_py, + Obj_HEAD + .tp_name="template", + .tp_basicsize=sizeof(templateObject), + .tp_dealloc=(destructor)template_destroy_py, + .tp_getattr=template_getattr_py, }; struct template * -template_py_get(PyObject *self) -{ - return ((templateObject *)self)->template; +template_py_get(PyObject *self) { + return ((templateObject *)self)->template; } -PyObject * -template_new_py(PyObject *self, PyObject *args) -{ - templateObject *ret; +PyObject *template_new_py(PyObject *self, PyObject *args) { + templateObject *ret; - ret=PyObject_NEW(templateObject, &template_Type); - ret->template=template_new(); - ret->ref=0; - return (PyObject *)ret; + ret=PyObject_NEW(templateObject, &template_Type); + ret->template=template_new(); + ret->ref=0; + return (PyObject *)ret; } -PyObject * -template_new_py_ref(struct template *template) -{ - templateObject *ret; +PyObject *template_new_py_ref(struct template *template) { + templateObject *ret; - ret=PyObject_NEW(templateObject, &template_Type); - ret->ref=1; - ret->template=template; - return (PyObject *)ret; + ret=PyObject_NEW(templateObject, &template_Type); + ret->ref=1; + ret->template=template; + return (PyObject *)ret; } diff --git a/navit/binding/win32/CMakeLists.txt b/navit/binding/win32/CMakeLists.txt index 792a8ff43..37f81aec7 100644 --- a/navit/binding/win32/CMakeLists.txt +++ b/navit/binding/win32/CMakeLists.txt @@ -1,9 +1,9 @@ if (USE_LIBGNUINTL AND NOT HAVE_GLIB) - ADD_DEPENDENCIES(support_glib intl_cmake) + ADD_DEPENDENCIES(support_glib support_gettext_intl) endif() -module_add_library(binding_win32 binding_win32.c) +module_add_library(binding_win32 binding_win32.c) add_executable(tell_navit tell_navit.c) -target_link_libraries(tell_navit ${MODULES_NAME} ${NAVIT_SUPPORT_LIBS} fib ${NAVIT_LIBS} ) +target_link_libraries(tell_navit ${MODULES_NAME} ${NAVIT_SUPPORT_LIBS} fib ${NAVIT_LIBS} ) install(TARGETS tell_navit DESTINATION ${BIN_DIR} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) diff --git a/navit/binding/win32/binding_win32.c b/navit/binding/win32/binding_win32.c index c6d3295cc..6ff0af9c0 100644 --- a/navit/binding/win32/binding_win32.c +++ b/navit/binding/win32/binding_win32.c @@ -49,97 +49,90 @@ #include "binding_win32.h" struct win32_binding_private { - struct navit* navit; + struct navit* navit; }; /* TODO: do something meaningful here - * + * */ -static int -win32_cmd_send_signal(struct navit *navit, char *command, struct attr **in, struct attr ***out) -{ - dbg(lvl_error,"this function is a stub\n"); - if (in) { - while (*in) { - dbg(lvl_debug,"another attribute to be sent\n"); - in++; - } - } - return 0; +static int win32_cmd_send_signal(struct navit *navit, char *command, struct attr **in, struct attr ***out) { + dbg(lvl_error,"this function is a stub"); + if (in) { + while (*in) { + dbg(lvl_debug,"another attribute to be sent"); + in++; + } + } + return 0; } static struct command_table commands[] = { - {"win32_send",command_cast(win32_cmd_send_signal)}, + {"win32_send",command_cast(win32_cmd_send_signal)}, }; -static void -win32_wm_copydata(struct win32_binding_private *this, int *hwndSender, COPYDATASTRUCT *cpd) -{ - struct attr navit; - struct navit_binding_w32_msg *msg; - navit.type=attr_navit; - navit.u.navit=this->navit; - if(cpd->dwData!=NAVIT_BINDING_W32_DWDATA) { - dbg(lvl_error,"COPYDATA message came with wrong DWDATA value, expected %d, got %d.\n",NAVIT_BINDING_W32_DWDATA,cpd->dwData); - return; - } - if(cpd->cbData<sizeof(*msg)) { - dbg(lvl_error,"COPYDATA message too short, expected >=%d, got %d.\n",sizeof(*msg),cpd->cbData); - return; - } - msg=cpd->lpData; - if(cpd->dwData!=NAVIT_BINDING_W32_VERSION) { - dbg(lvl_error,"Got request with wrong version number, expected %d, got %d.\n",NAVIT_BINDING_W32_VERSION,msg->version); - return; - } - if(strcmp(NAVIT_BINDING_W32_MAGIC,msg->magic)) { - dbg(lvl_error,"Got request with wrong MAGIC, expected %s, got %*s.\n",NAVIT_BINDING_W32_MAGIC, msg->magic,sizeof(msg->magic)); - return; - } - dbg(lvl_debug,"Running command %s\n", msg->text); - command_evaluate(&navit, msg->text); +static void win32_wm_copydata(struct win32_binding_private *this, int *hwndSender, COPYDATASTRUCT *cpd) { + struct attr navit; + struct navit_binding_w32_msg *msg; + navit.type=attr_navit; + navit.u.navit=this->navit; + if(cpd->dwData!=NAVIT_BINDING_W32_DWDATA) { + dbg(lvl_error,"COPYDATA message came with wrong DWDATA value, expected %d, got %d.",NAVIT_BINDING_W32_DWDATA, + cpd->dwData); + return; + } + if(cpd->cbData<sizeof(*msg)) { + dbg(lvl_error,"COPYDATA message too short, expected >=%d, got %d.",sizeof(*msg),cpd->cbData); + return; + } + msg=cpd->lpData; + if(cpd->dwData!=NAVIT_BINDING_W32_VERSION) { + dbg(lvl_error,"Got request with wrong version number, expected %d, got %d.",NAVIT_BINDING_W32_VERSION,msg->version); + return; + } + if(strcmp(NAVIT_BINDING_W32_MAGIC,msg->magic)) { + dbg(lvl_error,"Got request with wrong MAGIC, expected %s, got %*s.",NAVIT_BINDING_W32_MAGIC, msg->magic, + sizeof(msg->magic)); + return; + } + dbg(lvl_debug,"Running command %s", msg->text); + command_evaluate(&navit, msg->text); } -static void -win32_cb_graphics_ready(struct win32_binding_private *this, struct navit *navit) -{ - struct graphics *gra; - struct callback *gcb; +static void win32_cb_graphics_ready(struct win32_binding_private *this, struct navit *navit) { + struct graphics *gra; + struct callback *gcb; - gcb=callback_new_attr_1(callback_cast(win32_wm_copydata),attr_wm_copydata, this); - gra=navit_get_graphics(navit); - dbg_assert(gra); - graphics_add_callback(gra, gcb); + gcb=callback_new_attr_1(callback_cast(win32_wm_copydata),attr_wm_copydata, this); + gra=navit_get_graphics(navit); + dbg_assert(gra); + graphics_add_callback(gra, gcb); } -static void -win32_main_navit(struct win32_binding_private *this, struct navit *navit, int added) -{ - struct attr attr; - dbg(lvl_debug,"enter\n"); - if (added==1) { - dbg(lvl_debug,"enter2\n"); - this->navit=navit; - command_add_table_attr(commands, sizeof(commands)/sizeof(struct command_table), navit, &attr); - navit_add_attr(navit, &attr); - navit_add_callback(navit,callback_new_attr_1(callback_cast(win32_cb_graphics_ready),attr_graphics_ready, this)); - } +static void win32_main_navit(struct win32_binding_private *this, struct navit *navit, int added) { + struct attr attr; + dbg(lvl_debug,"enter"); + if (added==1) { + dbg(lvl_debug,"enter2"); + this->navit=navit; + command_add_table_attr(commands, sizeof(commands)/sizeof(struct command_table), navit, &attr); + navit_add_attr(navit, &attr); + navit_add_callback(navit,callback_new_attr_1(callback_cast(win32_cb_graphics_ready),attr_graphics_ready, this)); + } } -void plugin_init(void) -{ - struct attr callback; - struct win32_binding_private *this=g_new0(struct win32_binding_private,1); - dbg(lvl_debug,"enter\n"); - callback.type=attr_callback; - callback.u.callback=callback_new_attr_1(callback_cast(win32_main_navit),attr_navit,this); - config_add_attr(config, &callback); +void plugin_init(void) { + struct attr callback; + struct win32_binding_private *this=g_new0(struct win32_binding_private,1); + dbg(lvl_debug,"enter"); + callback.type=attr_callback; + callback.u.callback=callback_new_attr_1(callback_cast(win32_main_navit),attr_navit,this); + config_add_attr(config, &callback); } diff --git a/navit/binding/win32/tell_navit.c b/navit/binding/win32/tell_navit.c index e06f73258..f99319f92 100644 --- a/navit/binding/win32/tell_navit.c +++ b/navit/binding/win32/tell_navit.c @@ -29,151 +29,146 @@ #include <glib.h> #include "binding_win32.h" -static LRESULT CALLBACK message_handler( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) -{ - switch(uMsg) { - case WM_CREATE: - return 0; - } - return TRUE; +static LRESULT CALLBACK message_handler( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { + switch(uMsg) { + case WM_CREATE: + return 0; + } + return TRUE; } int errormode=1; -void err(char *fmt, ...) -{ - va_list ap; - char buf[1024]; +void err(char *fmt, ...) { + va_list ap; + char buf[1024]; #if defined HAVE_API_WIN32_CE #define vsnprintf _vsnprintf #endif - va_start(ap, fmt); - vsnprintf(buf, sizeof(buf), fmt, ap); - va_end(ap); - switch(errormode) { - case 0: /* be silent */ - break; - case 1: - MessageBox(NULL, buf, "tell_navit", MB_ICONERROR|MB_OK); - break; - case 2: - fprintf(stderr,"%s",buf); - break; - } + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + switch(errormode) { + case 0: /* be silent */ + break; + case 1: + MessageBox(NULL, buf, "tell_navit", MB_ICONERROR|MB_OK); + break; + case 2: + fprintf(stderr,"%s",buf); + break; + } } -void print_usage(void) -{ - err( - "tell_navit usage:\n" - "tell_navit [options] navit_command\n" - "\t-h this help\n" - "\t-e <way>: set way to report error messages:\n" - "\t\t0 - suppress messages\n" - "\t\t1 - use messagebox (default)\n" - "\t\t2 - print to stderr\n" - ); +void print_usage(void) { + err( + "tell_navit usage:\n" + "tell_navit [options] navit_command\n" + "\t-h this help\n" + "\t-e <way>: set way to report error messages:\n" + "\t\t0 - suppress messages\n" + "\t\t1 - use messagebox (default)\n" + "\t\t2 - print to stderr\n" + ); } -int main(int argc, char **argv) -{ - HWND navitWindow; - COPYDATASTRUCT cd; - char opt; - - TCHAR *g_szClassName = TEXT("TellNavitWND"); - WNDCLASS wc; - HWND hwnd; - HWND hWndParent=NULL; - - - if(argc>0) { - while((opt = getopt(argc, argv, ":hvc:d:e:s:")) != -1) { - switch(opt){ - case 'h': - print_usage(); - exit(0); - break; - case 'e': - errormode=atoi(optarg); - break; - default: - err("Unknown option %c\n", opt); - exit(1); - break; - } - } - } else { - print_usage(); - exit(1); - } - if(optind==argc) { - err("Navit command to execute is needed."); - exit(1); - } - - - memset(&wc, 0 , sizeof(WNDCLASS)); - wc.lpfnWndProc = message_handler; - wc.hInstance = GetModuleHandle(NULL); - wc.lpszClassName = g_szClassName; - - if (!RegisterClass(&wc)) - { - err(TEXT("Window class registration failed\n")); - return 1; - } else { - hwnd = CreateWindow( - g_szClassName, - TEXT("Tell Navit"), - 0, - 0, - 0, - 0, - 0, - hWndParent, - NULL, - GetModuleHandle(NULL), - NULL); - if(!hwnd) { - err(TEXT("Can't create hidden window\n")); - UnregisterClass(g_szClassName,NULL); - return 1; - } - } - - navitWindow=FindWindow( TEXT("NAVGRA"), NULL ); - if(!navitWindow) { - err(TEXT("Navit window not found\n")); - DestroyWindow(hwnd); - UnregisterClass(g_szClassName,NULL); - return 1; - } else { - int rv; - char *command=g_strjoinv(" ",argv+optind); - struct navit_binding_w32_msg *msg; - int sz=sizeof(*msg)+strlen(command); - - cd.dwData=NAVIT_BINDING_W32_DWDATA; - msg=g_malloc0(sz); - msg->version=NAVIT_BINDING_W32_VERSION; - g_strlcpy(msg->magic,NAVIT_BINDING_W32_MAGIC,sizeof(msg->magic)); - g_strlcpy(msg->text,command,sz-sizeof(*msg)+1); - cd.cbData=sz; - cd.lpData=msg; - rv=SendMessage( navitWindow, WM_COPYDATA, (WPARAM)hwnd, (LPARAM) (LPVOID) &cd ); - g_free(command); - g_free(msg); - if(rv!=0) { - err(TEXT("Error %d sending message, SendMessage return value is %d\n"), GetLastError(), rv); - DestroyWindow(hwnd); - UnregisterClass(g_szClassName,NULL); - return 1; - } - } - DestroyWindow(hwnd); - UnregisterClass(g_szClassName,NULL); - return 0; +int main(int argc, char **argv) { + HWND navitWindow; + COPYDATASTRUCT cd; + char opt; + + TCHAR *g_szClassName = TEXT("TellNavitWND"); + WNDCLASS wc; + HWND hwnd; + HWND hWndParent=NULL; + + + if(argc>0) { + while((opt = getopt(argc, argv, ":hvc:d:e:s:")) != -1) { + switch(opt) { + case 'h': + print_usage(); + exit(0); + break; + case 'e': + errormode=atoi(optarg); + break; + default: + err("Unknown option %c\n", opt); + exit(1); + break; + } + } + } else { + print_usage(); + exit(1); + } + if(optind==argc) { + err("Navit command to execute is needed."); + exit(1); + } + + + memset(&wc, 0, sizeof(WNDCLASS)); + wc.lpfnWndProc = message_handler; + wc.hInstance = GetModuleHandle(NULL); + wc.lpszClassName = g_szClassName; + + if (!RegisterClass(&wc)) { + err(TEXT("Window class registration failed\n")); + return 1; + } else { + hwnd = CreateWindow( + g_szClassName, + TEXT("Tell Navit"), + 0, + 0, + 0, + 0, + 0, + hWndParent, + NULL, + GetModuleHandle(NULL), + NULL); + if(!hwnd) { + err(TEXT("Can't create hidden window\n")); + UnregisterClass(g_szClassName,NULL); + return 1; + } + } + + navitWindow=FindWindow( TEXT("NAVGRA"), NULL ); + if(!navitWindow) { + err(TEXT("Navit window not found\n")); + DestroyWindow(hwnd); + UnregisterClass(g_szClassName,NULL); + return 1; + } else { + int rv; + char *command=g_strjoinv(" ",argv+optind); + struct navit_binding_w32_msg *msg; + int sz=sizeof(*msg)+strlen(command); + + cd.dwData=NAVIT_BINDING_W32_DWDATA; + msg=g_malloc0(sz); + msg->version=NAVIT_BINDING_W32_VERSION; + g_strlcpy(msg->magic,NAVIT_BINDING_W32_MAGIC,sizeof(msg->magic)); + g_strlcpy(msg->text,command,sz-sizeof(*msg)+1); + cd.cbData=sz; + cd.lpData=msg; + rv=SendMessage( navitWindow, WM_COPYDATA, (WPARAM)hwnd, (LPARAM) (LPVOID) &cd ); + g_free(command); + g_free(msg); + if(rv!=0) { + err(TEXT("Error %d sending message, SendMessage return value is %d\n"), GetLastError(), rv); + DestroyWindow(hwnd); + UnregisterClass(g_szClassName,NULL); + return 1; + } + } + DestroyWindow(hwnd); + UnregisterClass(g_szClassName,NULL); + return 0; } |