From e8c9e63941c89ee4b69d9b134b667fe435be389c Mon Sep 17 00:00:00 2001 From: singesang Date: Tue, 14 Oct 2008 22:38:15 +0000 Subject: [PATCH] Added function that generates the xml when navit gets introspected git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@1470 ffa7fe5e-494d-0410-b361-a75ebd5db220 --- navit/navit/binding/dbus/binding_dbus.c | 91 +++++++++++++++++++++++++-------- 1 file changed, 70 insertions(+), 21 deletions(-) diff --git a/navit/navit/binding/dbus/binding_dbus.c b/navit/navit/binding/dbus/binding_dbus.c index b22b183..e46b1e4 100644 --- a/navit/navit/binding/dbus/binding_dbus.c +++ b/navit/navit/binding/dbus/binding_dbus.c @@ -36,8 +36,20 @@ static DBusConnection *connection; -static char *service_name="org.navit_project.navit"; -static char *object_path="/org/navit_project/navit"; +static char *service_name = "org.navit_project.navit"; +static char *object_path = "/org/navit_project/navit"; +char *navitintrospectxml_head1 = "\n" + "\n" + " \n" + " \n" + " \n" + " \n" + " \n"; + + GHashTable *object_hash; GHashTable *object_count; @@ -422,44 +434,81 @@ struct dbus_method { char *path; char *method; char *signature; + char *response; DBusHandlerResult(*func)(DBusConnection *connection, DBusMessage *message); } dbus_methods[] = { - {"", "iter", "", request_main_iter}, - {"", "iter_destroy", "o", request_main_iter_destroy}, - {"", "get_navit", "o", request_main_get_navit}, - {".navit", "set_center", "(iii)", request_navit_set_center}, - {".navit", "set_center_screen", "(ii)", request_navit_set_center_screen}, - {".navit", "set_layout", "s", request_navit_set_layout}, - {".navit", "zoom", "i(ii)", request_navit_zoom}, - {".navit", "zoom", "i", request_navit_zoom}, - {".navit", "resize", "ii", request_navit_resize}, - {".navit", "set_position", "(iii)", request_navit_set_position}, - {".navit", "set_destination", "(iii)s", request_navit_set_destination}, + {"", "iter", "", "o", request_main_iter}, + {"", "iter_destroy", "o", "", request_main_iter_destroy}, + {"", "get_navit", "o", "o", request_main_get_navit}, + {".navit", "set_center", "(iii)", "", request_navit_set_center}, + {".navit", "set_center_screen", "(ii)", "", request_navit_set_center_screen}, + {".navit", "set_layout", "s", "", request_navit_set_layout}, + {".navit", "zoom", "i(ii)", "", request_navit_zoom}, + {".navit", "zoom", "i", "", request_navit_zoom}, + {".navit", "resize", "ii", "", request_navit_resize}, + {".navit", "set_position", "(iii)", "", request_navit_set_position}, + {".navit", "set_destination", "(iii)s", "", request_navit_set_destination}, }; +static char * +generate_navitintrospectxml(void) +{ + int i; + char *navitintrospectxml; + + // write header and make navit introspectable + navitintrospectxml = g_strdup_printf("%s%s%s\n", navitintrospectxml_head1, object_path, navitintrospectxml_head2); + + for (i = 0 ; i < sizeof(dbus_methods)/sizeof(struct dbus_method) ; i++) { + // start new interface if it's the first method or it changed + if ((i == 0) || strcmp(dbus_methods[i-1].path, dbus_methods[i].path)) + navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n", service_name, dbus_methods[i].path); + + // start the new method + navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n", dbus_methods[i].method); + + // set input signature if existent + if (strcmp(dbus_methods[i].signature, "")) + navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n", dbus_methods[i].signature); + + // set response signature if existent + if (strcmp(dbus_methods[i].response, "")) + navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n", dbus_methods[i].response); + + // close the method + navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n"); + + // close the interface if we reached the last method or the interface changes + if ((sizeof(dbus_methods)/sizeof(struct dbus_method) == (i+1)) || strcmp(dbus_methods[i+1].path, dbus_methods[i].path)) + navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n\n"); + } + // close the "mother tag" + navitintrospectxml = g_strconcat_printf(navitintrospectxml, "\n"); + + return navitintrospectxml; +} + static DBusHandlerResult navit_handler_func(DBusConnection *connection, DBusMessage *message, void *user_data) { int i; char *path; dbg(0,"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 0 if (dbus_message_is_method_call (message, "org.freedesktop.DBus.Introspectable", "Introspect")) { DBusMessage *reply; - gchar *idata; dbg(0,"Introspect\n"); if (! strcmp(dbus_message_get_path(message), object_path)) { - g_file_get_contents("binding/dbus/navit.introspect", &idata, NULL, NULL); + char *navitintrospectxml = generate_navitintrospectxml(); reply = dbus_message_new_method_return(message); - dbus_message_append_args(reply, DBUS_TYPE_STRING, &idata, DBUS_TYPE_INVALID); + dbus_message_append_args(reply, DBUS_TYPE_STRING, &navitintrospectxml, DBUS_TYPE_INVALID); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); - g_free(idata); + g_free(navitintrospectxml); return DBUS_HANDLER_RESULT_HANDLED; } } -#endif - for (i = 0 ; i < sizeof(dbus_methods)/sizeof(struct dbus_method) ; i++) { + + 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)) { @@ -492,7 +541,7 @@ void plugin_init(void) { DBusError error; - object_hash=g_hash_table_new(g_str_hash, g_str_equal); + object_hash=g_hash_table_new(g_str_hash, g_str_equal); object_count=g_hash_table_new(g_str_hash, g_str_equal); dbg(0,"enter 1\n"); dbus_error_init(&error); -- 2.7.4