diff options
Diffstat (limited to 'hald/hald_dbus.c')
-rw-r--r-- | hald/hald_dbus.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/hald/hald_dbus.c b/hald/hald_dbus.c index 3e270af7..a367f728 100644 --- a/hald/hald_dbus.c +++ b/hald/hald_dbus.c @@ -2505,6 +2505,70 @@ device_claim_interface (DBusConnection * connection, DBusMessage * message, dbus } + +static DBusHandlerResult +addon_is_ready (DBusConnection * connection, DBusMessage * message, dbus_bool_t local_interface) +{ + const char *udi; + HalDevice *device; + DBusMessageIter iter; + DBusMessage *reply; + DBusError error; + const char *interface_name; + const char *introspection_xml; + dbus_bool_t res; + + HAL_TRACE (("entering")); + + udi = dbus_message_get_path (message); + + if (!local_interface) { + raise_permission_denied (connection, message, "AddonIsReady: only allowed for helpers"); + return DBUS_HANDLER_RESULT_HANDLED; + } + + HAL_DEBUG (("udi=%s", udi)); + + dbus_error_init (&error); + if (!dbus_message_get_args (message, &error, + DBUS_TYPE_INVALID)) { + raise_syntax (connection, message, "AddonIsReady"); + return DBUS_HANDLER_RESULT_HANDLED; + } + + device = hal_device_store_find (hald_get_gdl (), udi); + if (device == NULL) + device = hal_device_store_find (hald_get_tdl (), udi); + + if (device == NULL) { + raise_no_such_device (connection, message, udi); + return DBUS_HANDLER_RESULT_HANDLED; + } + + if (hal_device_inc_num_ready_addons (device)) { + if (hal_device_are_all_addons_ready (device)) { + manager_send_signal_device_added (device); + } + } + + res = TRUE; + + HAL_INFO (("AddonIsReady on udi '%s'", udi)); + + reply = dbus_message_new_method_return (message); + if (reply == NULL) + DIE (("No memory")); + dbus_message_iter_init_append (reply, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, &res); + + if (!dbus_connection_send (connection, reply, NULL)) + DIE (("No memory")); + + dbus_message_unref (reply); + return DBUS_HANDLER_RESULT_HANDLED; +} + + /* * Create new device in tdl. Return temporary udi. */ @@ -3331,6 +3395,7 @@ do_introspect (DBusConnection *connection, " <method name=\"EmitCondition\">\n" " <arg name=\"condition_name\" direction=\"in\" type=\"s\"/>\n" " <arg name=\"condition_details\" direction=\"in\" type=\"s\"/>\n" + " <arg name=\"rc\" direction=\"out\" type=\"b\"/>\n" " </method>\n" " <method name=\"Rescan\">\n" @@ -3343,6 +3408,11 @@ do_introspect (DBusConnection *connection, " <method name=\"ClaimInterface\">\n" " <arg name=\"interface_name\" direction=\"in\" type=\"s\"/>\n" " <arg name=\"introspection_xml\" direction=\"in\" type=\"s\"/>\n" + " <arg name=\"rc\" direction=\"out\" type=\"b\"/>\n" + " </method>\n" + + " <method name=\"AddonIsReady\">\n" + " <arg name=\"rc\" direction=\"out\" type=\"b\"/>\n" " </method>\n" " </interface>\n"); @@ -3666,6 +3736,10 @@ hald_dbus_filter_handle_methods (DBusConnection *connection, DBusMessage *messag return device_release_interface (connection, message, local_interface); #endif } else if (dbus_message_is_method_call (message, + "org.freedesktop.Hal.Device", + "AddonIsReady")) { + return addon_is_ready (connection, message, local_interface); + } else if (dbus_message_is_method_call (message, "org.freedesktop.DBus.Introspectable", "Introspect")) { return do_introspect (connection, message, local_interface); |