summaryrefslogtreecommitdiffstats
path: root/bus/driver.c
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2005-01-30 05:18:44 +0000
committerHavoc Pennington <hp@redhat.com>2005-01-30 05:18:44 +0000
commit41f52c96d651003b3d0a266a582d401228a8368e (patch)
tree3b217cef0c0b9db03aa580cb541b7d686732055a /bus/driver.c
parent2922b0e88ba00b0067c23633075629108ad8a496 (diff)
2005-01-30 Havoc Pennington <hp@redhat.com>
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
Diffstat (limited to 'bus/driver.c')
-rw-r--r--bus/driver.c134
1 files changed, 111 insertions, 23 deletions
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, "<node>\n"))
+ goto oom;
+ if (!_dbus_string_append (&xml, " <interface name=\"org.freedesktop.Introspectable\">\n"))
+ goto oom;
+ if (!_dbus_string_append (&xml, " <method name=\"Introspect\">\n"))
+ goto oom;
+ if (!_dbus_string_append (&xml, " <arg name=\"data\" direction=\"out\" type=\"string\"/>\n"))
+ goto oom;
+ if (!_dbus_string_append (&xml, " </method>\n"))
+ goto oom;
+ if (!_dbus_string_append (&xml, " </interface>\n"))
+ goto oom;
+
+ if (!_dbus_string_append (&xml, "</node>\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))