diff options
author | Richard Hult <richard@imendio.com> | 2004-03-16 18:00:35 +0000 |
---|---|---|
committer | Richard Hult <richard@imendio.com> | 2004-03-16 18:00:35 +0000 |
commit | 93f433a17a0aabff91a0384bf9c4f99c9cf30ae1 (patch) | |
tree | be2ffbc0160abfb63808d994d076faa67e4ff81a /bus/activation.c | |
parent | 24ffe79c80d376b058c2d154b2b5f0ef8fee1c36 (diff) |
2004-03-16 Richard Hult <richard@imendio.com>
* 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.
Diffstat (limited to 'bus/activation.c')
-rw-r--r-- | bus/activation.c | 101 |
1 files changed, 83 insertions, 18 deletions
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; |