mirror of
https://gitlab.freedesktop.org/dbus/dbus.git
synced 2025-12-28 01:30:09 +01:00
* dbus/dbus-connection.c (dbus_connection_flush): don't spin on the connection if it's disconnected * bus/activation.c (bus_activation_service_created): use new transaction features to roll back removal of pending activation if we don't successfully create the service after all. Don't remove pending activation if the function fails. * dbus/dbus-list.c (_dbus_list_insert_before_link) (_dbus_list_insert_after_link): new code to facilitate services.c fixes * dbus/dbus-hash.c (_dbus_hash_table_insert_string_preallocated): new functionality, so we can preallocate the ability to insert into a hash table. * bus/connection.c (bus_transaction_add_cancel_hook): new function allowing us to put custom hooks in a transaction to be used for cancelling said transaction * doc/dbus-specification.sgml: add some discussion of secondary service owners, and disallow zero-length service names * bus/services.c (bus_registry_acquire_service): new function, splits out part of bus_driver_handle_acquire_service() and fixes a bug where we didn't remove the service doing the acquiring from the secondary queue if we failed to remove the current owner from the front of the queue.
161 lines
3.8 KiB
C
161 lines
3.8 KiB
C
|
|
#include "test-utils.h"
|
|
|
|
static DBusLoop *loop;
|
|
static dbus_bool_t already_quit = FALSE;
|
|
|
|
static void
|
|
quit (void)
|
|
{
|
|
if (!already_quit)
|
|
{
|
|
_dbus_loop_quit (loop);
|
|
already_quit = TRUE;
|
|
}
|
|
}
|
|
|
|
static void
|
|
die (const char *message)
|
|
{
|
|
fprintf (stderr, "*** %s", message);
|
|
exit (1);
|
|
}
|
|
|
|
static DBusHandlerResult
|
|
handle_echo (DBusConnection *connection,
|
|
DBusMessage *message)
|
|
{
|
|
DBusError error;
|
|
DBusMessage *reply;
|
|
DBusMessageIter iter;
|
|
char *s;
|
|
|
|
dbus_error_init (&error);
|
|
|
|
if (!dbus_message_get_args (message,
|
|
&error,
|
|
DBUS_TYPE_STRING, &s,
|
|
DBUS_TYPE_INVALID))
|
|
{
|
|
reply = dbus_message_new_error_reply (message,
|
|
error.name,
|
|
error.message);
|
|
|
|
if (reply == NULL)
|
|
die ("No memory\n");
|
|
|
|
if (!dbus_connection_send (connection, reply, NULL))
|
|
die ("No memory\n");
|
|
|
|
dbus_message_unref (reply);
|
|
|
|
return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
|
|
}
|
|
|
|
reply = dbus_message_new_reply (message);
|
|
if (reply == NULL)
|
|
die ("No memory\n");
|
|
|
|
dbus_message_append_iter_init (message, &iter);
|
|
|
|
if (!dbus_message_iter_append_string (&iter, s))
|
|
die ("No memory");
|
|
|
|
if (!dbus_connection_send (connection, reply, NULL))
|
|
die ("No memory\n");
|
|
|
|
dbus_free (s);
|
|
|
|
dbus_message_unref (reply);
|
|
|
|
return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
|
|
}
|
|
|
|
static DBusHandlerResult
|
|
filter_func (DBusMessageHandler *handler,
|
|
DBusConnection *connection,
|
|
DBusMessage *message,
|
|
void *user_data)
|
|
{
|
|
if (dbus_message_name_is (message, "org.freedesktop.DBus.TestSuiteEcho"))
|
|
return handle_echo (connection, message);
|
|
else if (dbus_message_name_is (message, "org.freedesktop.DBus.TestSuiteExit") ||
|
|
dbus_message_name_is (message, DBUS_MESSAGE_LOCAL_DISCONNECT))
|
|
{
|
|
dbus_connection_disconnect (connection);
|
|
quit ();
|
|
return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
|
|
}
|
|
else
|
|
{
|
|
return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
|
|
}
|
|
}
|
|
|
|
int
|
|
main (int argc,
|
|
char **argv)
|
|
{
|
|
DBusConnection *connection;
|
|
DBusError error;
|
|
DBusMessageHandler *handler;
|
|
const char *to_handle[] = {
|
|
"org.freedesktop.DBus.TestSuiteEcho",
|
|
"org.freedesktop.DBus.TestSuiteExit",
|
|
DBUS_MESSAGE_LOCAL_DISCONNECT,
|
|
};
|
|
int result;
|
|
|
|
dbus_error_init (&error);
|
|
connection = dbus_bus_get (DBUS_BUS_ACTIVATION, &error);
|
|
if (connection == NULL)
|
|
{
|
|
fprintf (stderr, "*** Failed to open connection to activating message bus: %s\n",
|
|
error.message);
|
|
dbus_error_free (&error);
|
|
return 1;
|
|
}
|
|
|
|
loop = _dbus_loop_new ();
|
|
if (loop == NULL)
|
|
die ("No memory\n");
|
|
|
|
if (!test_connection_setup (loop, connection))
|
|
die ("No memory\n");
|
|
|
|
handler = dbus_message_handler_new (filter_func, NULL, NULL);
|
|
if (handler == NULL)
|
|
die ("No memory");
|
|
|
|
if (!dbus_connection_register_handler (connection, handler, to_handle,
|
|
_DBUS_N_ELEMENTS (to_handle)))
|
|
die ("No memory");
|
|
|
|
result = dbus_bus_acquire_service (connection, "org.freedesktop.DBus.TestSuiteEchoService",
|
|
0, &error);
|
|
if (dbus_error_is_set (&error))
|
|
{
|
|
fprintf (stderr, "*** Failed to acquire service: %s\n",
|
|
error.message);
|
|
dbus_error_free (&error);
|
|
exit (1);
|
|
}
|
|
|
|
_dbus_verbose ("*** Test service entering main loop\n");
|
|
_dbus_loop_run (loop);
|
|
|
|
test_connection_shutdown (loop, connection);
|
|
|
|
dbus_connection_unref (connection);
|
|
|
|
dbus_message_handler_unref (handler);
|
|
|
|
_dbus_loop_unref (loop);
|
|
loop = NULL;
|
|
|
|
dbus_shutdown ();
|
|
|
|
_dbus_verbose ("*** Test service exiting\n");
|
|
|
|
return 0;
|
|
}
|