From 41f52c96d651003b3d0a266a582d401228a8368e Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Sun, 30 Jan 2005 05:18:44 +0000 Subject: 2005-01-30 Havoc Pennington dbus-viewer introspected and displayed the bus driver * dbus/dbus-object-tree.c (object_tree_test_iteration): add tests for a handler registered on "/" * dbus/dbus-object-tree.c (_dbus_decompose_path): fix to handle path "/" properly (run_decompose_tests): add tests for path decomposition * glib/dbus-gutils.c (_dbus_gutils_split_path): fix to handle "/" properly * glib/dbus-gobject.c (handle_introspect): fix quotes * test/glib/run-test.sh: support launching the bus, then running dbus-viewer * test/glib/test-service-glib.c (main): put in a trivial gobject subclass and register it on the connection * bus/driver.c (bus_driver_handle_introspect): implement introspection of the bus driver service * dbus/dbus-protocol.h: add #defines for the XML namespace, identifiers, doctype decl * bus/driver.c (bus_driver_handle_get_service_owner): handle attempts to get owner of DBUS_SERVICE_ORG_FREEDESKTOP_DBUS by returning the service unchanged. (bus_driver_handle_message): remove old check for reply_serial in method calls, now the message type deals with that (bus_driver_handle_message): handle NULL interface * glib/dbus-gproxy.c (dbus_g_proxy_get_bus_name): new function * glib/dbus-gloader-expat.c (description_load_from_string): allow -1 for len * tools/dbus-viewer.c: add support for introspecting a service on a bus * glib/dbus-gproxy.c (dbus_g_pending_call_ref): add (dbus_g_pending_call_unref): add --- bus/driver.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 111 insertions(+), 23 deletions(-) (limited to 'bus') diff --git a/bus/driver.c b/bus/driver.c index 3a9e555d..58b8fcbf 100644 --- a/bus/driver.c +++ b/bus/driver.c @@ -792,24 +792,34 @@ bus_driver_handle_get_service_owner (DBusConnection *connection, _dbus_string_init_const (&str, text); service = bus_registry_lookup (registry, &str); - if (service == NULL) + if (service == NULL && + _dbus_string_equal_c_str (&str, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS)) + { + /* ORG_FREEDESKTOP_DBUS owns itself */ + base_name = DBUS_SERVICE_ORG_FREEDESKTOP_DBUS; + } + else if (service == NULL) { dbus_set_error (error, - DBUS_ERROR_NAME_HAS_NO_OWNER, - "Could not get owner of name '%s': no such name", text); + DBUS_ERROR_NAME_HAS_NO_OWNER, + "Could not get owner of name '%s': no such name", text); goto failed; } - - base_name = bus_connection_get_name (bus_service_get_primary_owner (service)); - if (base_name == NULL) + else { - /* FIXME - how is this error possible? */ - dbus_set_error (error, - DBUS_ERROR_FAILED, - "Could not determine unique name for '%s'", text); - goto failed; + base_name = bus_connection_get_name (bus_service_get_primary_owner (service)); + if (base_name == NULL) + { + /* FIXME - how is this error possible? */ + dbus_set_error (error, + DBUS_ERROR_FAILED, + "Could not determine unique name for '%s'", text); + goto failed; + } + _dbus_assert (*base_name == ':'); } - _dbus_assert (*base_name == ':'); + + _dbus_assert (base_name != NULL); reply = dbus_message_new_method_return (message); if (reply == NULL) @@ -1040,13 +1050,89 @@ struct { "ReloadConfig", bus_driver_handle_reload_config } }; +static dbus_bool_t +bus_driver_handle_introspect (DBusConnection *connection, + BusTransaction *transaction, + DBusMessage *message, + DBusError *error) +{ + DBusString xml; + DBusMessage *reply; + const char *v_STRING; + + _dbus_verbose ("Introspect() on bus driver\n"); + + _DBUS_ASSERT_ERROR_IS_CLEAR (error); + + reply = NULL; + + if (! dbus_message_get_args (message, error, + DBUS_TYPE_INVALID)) + { + _DBUS_ASSERT_ERROR_IS_SET (error); + return FALSE; + } + + if (!_dbus_string_init (&xml)) + { + BUS_SET_OOM (error); + return FALSE; + } + + if (!_dbus_string_append (&xml, DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE)) + goto oom; + if (!_dbus_string_append (&xml, "\n")) + goto oom; + if (!_dbus_string_append (&xml, " \n")) + goto oom; + if (!_dbus_string_append (&xml, " \n")) + goto oom; + if (!_dbus_string_append (&xml, " \n")) + goto oom; + if (!_dbus_string_append (&xml, " \n")) + goto oom; + if (!_dbus_string_append (&xml, " \n")) + goto oom; + + if (!_dbus_string_append (&xml, "\n")) + goto oom; + + reply = dbus_message_new_method_return (message); + if (reply == NULL) + goto oom; + + v_STRING = _dbus_string_get_const_data (&xml); + if (! dbus_message_append_args (reply, + DBUS_TYPE_STRING, &v_STRING, + DBUS_TYPE_INVALID)) + goto oom; + + if (! bus_transaction_send_from_driver (transaction, connection, reply)) + goto oom; + + dbus_message_unref (reply); + _dbus_string_free (&xml); + + return TRUE; + + oom: + BUS_SET_OOM (error); + + if (reply) + dbus_message_unref (reply); + + _dbus_string_free (&xml); + + return FALSE; +} + dbus_bool_t bus_driver_handle_message (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, DBusError *error) { - const char *name, *sender; + const char *name, *sender, *interface; int i; _DBUS_ASSERT_ERROR_IS_CLEAR (error); @@ -1057,17 +1143,25 @@ bus_driver_handle_message (DBusConnection *connection, return TRUE; /* we just ignore this */ } - _dbus_assert (dbus_message_get_interface (message) != NULL); + if (dbus_message_is_method_call (message, + DBUS_INTERFACE_ORG_FREEDESKTOP_INTROSPECTABLE, + "Introspect")) + return bus_driver_handle_introspect (connection, transaction, message, error); + + interface = dbus_message_get_interface (message); + if (interface == NULL) + interface = DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS; + _dbus_assert (dbus_message_get_member (message) != NULL); - + name = dbus_message_get_member (message); sender = dbus_message_get_sender (message); - if (strcmp (dbus_message_get_interface (message), + if (strcmp (interface, DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS) != 0) { _dbus_verbose ("Driver got message to unknown interface \"%s\"\n", - dbus_message_get_interface (message)); + interface); goto unknown; } @@ -1076,12 +1170,6 @@ bus_driver_handle_message (DBusConnection *connection, /* security checks should have kept this from getting here */ _dbus_assert (sender != NULL || strcmp (name, "Hello") == 0); - - if (dbus_message_get_reply_serial (message) != 0) - { - _dbus_verbose ("Client sent a reply to the bus driver, ignoring it\n"); - return TRUE; - } i = 0; while (i < _DBUS_N_ELEMENTS (message_handlers)) -- cgit