connection: hook UnknownObject and UnknownInterface up where appropriate
authorLennart Poettering <lennart@poettering.net>
Thu, 10 Mar 2011 03:10:31 +0000 (04:10 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 11 Mar 2011 22:08:25 +0000 (23:08 +0100)
This makes use of UnknownInterface and UnknownObject where appropriate
in the D-Bus core.

Bug: https://bugs.freedesktop.org/show_bug.cgi?id=34527
Reviewed-By: Simon McVittie <simon.mcvittie@collabora.co.uk>
bus/driver.c
dbus/dbus-connection.c
dbus/dbus-object-tree.c
dbus/dbus-object-tree.h

index 1e9573e..425a3d5 100644 (file)
@@ -1921,6 +1921,7 @@ bus_driver_handle_message (DBusConnection *connection,
   const char *name, *sender, *interface;
   const InterfaceHandler *ih;
   const MessageHandler *mh;
+  dbus_bool_t found_interface = FALSE;
 
   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
 
@@ -1957,6 +1958,8 @@ bus_driver_handle_message (DBusConnection *connection,
       if (interface != NULL && strcmp (interface, ih->name) != 0)
         continue;
 
+      found_interface = TRUE;
+
       for (mh = ih->message_handlers; mh->name != NULL; mh++)
         {
           if (strcmp (mh->name, name) != 0)
@@ -1998,7 +2001,7 @@ bus_driver_handle_message (DBusConnection *connection,
   _dbus_verbose ("No driver handler for message \"%s\"\n",
                  name);
 
-  dbus_set_error (error, DBUS_ERROR_UNKNOWN_METHOD,
+  dbus_set_error (error, found_interface ? DBUS_ERROR_UNKNOWN_METHOD : DBUS_ERROR_UNKNOWN_INTERFACE,
                   "%s does not understand message %s",
                   DBUS_SERVICE_DBUS, name);
 
index 526a716..4a76af7 100644 (file)
@@ -4523,6 +4523,7 @@ dbus_connection_dispatch (DBusConnection *connection)
   DBusPendingCall *pending;
   dbus_int32_t reply_serial;
   DBusDispatchStatus status;
+  dbus_bool_t found_object;
 
   _dbus_return_val_if_fail (connection != NULL, DBUS_DISPATCH_COMPLETE);
 
@@ -4687,7 +4688,8 @@ dbus_connection_dispatch (DBusConnection *connection)
 
   HAVE_LOCK_CHECK (connection);
   result = _dbus_object_tree_dispatch_and_unlock (connection->objects,
-                                                  message);
+                                                  message,
+                                                  &found_object);
   
   CONNECTION_LOCK (connection);
 
@@ -4726,7 +4728,7 @@ dbus_connection_dispatch (DBusConnection *connection)
         }
       
       reply = dbus_message_new_error (message,
-                                      DBUS_ERROR_UNKNOWN_METHOD,
+                                      found_object ? DBUS_ERROR_UNKNOWN_METHOD : DBUS_ERROR_UNKNOWN_OBJECT,
                                       _dbus_string_get_const_data (&str));
       _dbus_string_free (&str);
 
index 28cfc8b..989e5d8 100644 (file)
@@ -745,7 +745,8 @@ handle_default_introspect_and_unlock (DBusObjectTree          *tree,
  */
 DBusHandlerResult
 _dbus_object_tree_dispatch_and_unlock (DBusObjectTree          *tree,
-                                       DBusMessage             *message)
+                                       DBusMessage             *message,
+                                       dbus_bool_t             *found_object)
 {
   char **path;
   dbus_bool_t exact_match;
@@ -791,6 +792,9 @@ _dbus_object_tree_dispatch_and_unlock (DBusObjectTree          *tree,
   /* Find the deepest path that covers the path in the message */
   subtree = find_handler (tree, (const char**) path, &exact_match);
   
+  if (found_object)
+    *found_object = !!subtree;
+
   /* Build a list of all paths that cover the path in the message */
 
   list = NULL;
@@ -1382,7 +1386,7 @@ do_test_dispatch (DBusObjectTree *tree,
       ++j;
     }
 
-  result = _dbus_object_tree_dispatch_and_unlock (tree, message);
+  result = _dbus_object_tree_dispatch_and_unlock (tree, message, NULL);
   if (result == DBUS_HANDLER_RESULT_NEED_MEMORY)
     goto oom;
 
index 022dd93..5576c25 100644 (file)
@@ -42,7 +42,8 @@ dbus_bool_t       _dbus_object_tree_register               (DBusObjectTree
 void              _dbus_object_tree_unregister_and_unlock  (DBusObjectTree              *tree,
                                                             const char                 **path);
 DBusHandlerResult _dbus_object_tree_dispatch_and_unlock    (DBusObjectTree              *tree,
-                                                            DBusMessage                 *message);
+                                                            DBusMessage                 *message,
+                                                            dbus_bool_t                 *found_object);
 void*             _dbus_object_tree_get_user_data_unlocked (DBusObjectTree              *tree,
                                                             const char                 **path);
 void              _dbus_object_tree_free_all_unlocked      (DBusObjectTree              *tree);