From 93f433a17a0aabff91a0384bf9c4f99c9cf30ae1 Mon Sep 17 00:00:00 2001 From: Richard Hult Date: Tue, 16 Mar 2004 18:00:35 +0000 Subject: 2004-03-16 Richard Hult * bus/activation.c: (bus_activation_service_created), (bus_activation_send_pending_auto_activation_messages), (bus_activation_activate_service): * bus/activation.h: * bus/dispatch.c: (bus_dispatch), (check_nonexistent_service_auto_activation), (check_service_auto_activated), (check_segfault_service_auto_activation), (check_existent_service_auto_activation), (bus_dispatch_test): * bus/driver.c: (bus_driver_handle_activate_service): * bus/services.c: (bus_registry_acquire_service): * dbus/dbus-message.c: (dbus_message_set_auto_activation), (dbus_message_get_auto_activation): * dbus/dbus-message.h: * dbus/dbus-protocol.h: Implement auto-activation. --- bus/activation.c | 101 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 83 insertions(+), 18 deletions(-) (limited to 'bus/activation.c') diff --git a/bus/activation.c b/bus/activation.c index e53fa229..e286ba9d 100644 --- a/bus/activation.c +++ b/bus/activation.c @@ -76,6 +76,8 @@ struct BusPendingActivationEntry { DBusMessage *activation_message; DBusConnection *connection; + + dbus_bool_t auto_activation; }; typedef struct @@ -904,30 +906,90 @@ bus_activation_service_created (BusActivation *activation, if (dbus_connection_get_is_connected (entry->connection)) { - message = dbus_message_new_method_return (entry->activation_message); - if (!message) - { - BUS_SET_OOM (error); - goto error; - } - - if (!dbus_message_append_args (message, - DBUS_TYPE_UINT32, DBUS_ACTIVATION_REPLY_ACTIVATED, - DBUS_TYPE_INVALID)) + /* Only send activation replies to regular activation requests. */ + if (!entry->auto_activation) { + message = dbus_message_new_method_return (entry->activation_message); + if (!message) + { + BUS_SET_OOM (error); + goto error; + } + + if (!dbus_message_append_args (message, + DBUS_TYPE_UINT32, DBUS_ACTIVATION_REPLY_ACTIVATED, + DBUS_TYPE_INVALID)) + { + dbus_message_unref (message); + BUS_SET_OOM (error); + goto error; + } + + if (!bus_transaction_send_from_driver (transaction, entry->connection, message)) + { + dbus_message_unref (message); + BUS_SET_OOM (error); + goto error; + } + dbus_message_unref (message); - BUS_SET_OOM (error); - goto error; } - - if (!bus_transaction_send_from_driver (transaction, entry->connection, message)) + } + + link = next; + } + + return TRUE; + + error: + return FALSE; +} + +dbus_bool_t +bus_activation_send_pending_auto_activation_messages (BusActivation *activation, + BusService *service, + BusTransaction *transaction, + DBusError *error) +{ + BusPendingActivation *pending_activation; + DBusList *link; + + _DBUS_ASSERT_ERROR_IS_CLEAR (error); + + /* Check if it's a pending activation */ + pending_activation = _dbus_hash_table_lookup_string (activation->pending_activations, + bus_service_get_name (service)); + + if (!pending_activation) + return TRUE; + + link = _dbus_list_get_first_link (&pending_activation->entries); + while (link != NULL) + { + BusPendingActivationEntry *entry = link->data; + DBusList *next = _dbus_list_get_next_link (&pending_activation->entries, link); + + if (entry->auto_activation && dbus_connection_get_is_connected (entry->connection)) + { + DBusConnection *addressed_recipient; + + addressed_recipient = bus_service_get_primary_owner (service); + + /* Check the security policy, which has the side-effect of adding an + * expected pending reply. + */ + if (!bus_context_check_security_policy (activation->context, transaction, + entry->connection, + addressed_recipient, + addressed_recipient, + entry->activation_message, error)) + goto error; + + if (!bus_transaction_send (transaction, addressed_recipient, entry->activation_message)) { - dbus_message_unref (message); BUS_SET_OOM (error); goto error; } - - dbus_message_unref (message); } link = next; @@ -940,7 +1002,7 @@ bus_activation_service_created (BusActivation *activation, goto error; } - _dbus_hash_table_remove_string (activation->pending_activations, service_name); + _dbus_hash_table_remove_string (activation->pending_activations, bus_service_get_name (service)); return TRUE; @@ -1225,6 +1287,7 @@ dbus_bool_t bus_activation_activate_service (BusActivation *activation, DBusConnection *connection, BusTransaction *transaction, + dbus_bool_t auto_activation, DBusMessage *activation_message, const char *service_name, DBusError *error) @@ -1300,6 +1363,8 @@ bus_activation_activate_service (BusActivation *activation, return FALSE; } + pending_activation_entry->auto_activation = auto_activation; + pending_activation_entry->activation_message = activation_message; dbus_message_ref (activation_message); pending_activation_entry->connection = connection; -- cgit