#include <dbus/dbus-message.h>
#include <dbus/dbus-transport.h>
#include <dbus/dbus-resources.h>
+#include <dbus/dbus-list.h>
DBUS_BEGIN_DECLS;
DBUS_ITERATION_DO_READING = 1 << 1, /**< Read messages in. */
DBUS_ITERATION_BLOCK = 1 << 2 /**< Block if nothing to do. */
} DBusIterationFlags;
+void _dbus_connection_lock (DBusConnection *connection);
+void _dbus_connection_unlock (DBusConnection *connection);
+void _dbus_connection_ref_unlocked (DBusConnection *connection);
+dbus_bool_t _dbus_connection_queue_received_message (DBusConnection *connection,
+ DBusMessage *message);
+void _dbus_connection_queue_received_message_link (DBusConnection *connection,
+ DBusList *link);
+dbus_bool_t _dbus_connection_have_messages_to_send (DBusConnection *connection);
+DBusMessage* _dbus_connection_get_message_to_send (DBusConnection *connection);
+void _dbus_connection_message_sent (DBusConnection *connection,
+ DBusMessage *message);
+dbus_bool_t _dbus_connection_add_watch (DBusConnection *connection,
+ DBusWatch *watch);
+void _dbus_connection_remove_watch (DBusConnection *connection,
+ DBusWatch *watch);
+void _dbus_connection_toggle_watch (DBusConnection *connection,
+ DBusWatch *watch,
+ dbus_bool_t enabled);
+dbus_bool_t _dbus_connection_add_timeout (DBusConnection *connection,
+ DBusTimeout *timeout);
+void _dbus_connection_remove_timeout (DBusConnection *connection,
+ DBusTimeout *timeout);
+void _dbus_connection_toggle_timeout (DBusConnection *connection,
+ DBusTimeout *timeout,
+ dbus_bool_t enabled);
+DBusConnection* _dbus_connection_new_for_transport (DBusTransport *transport);
+void _dbus_connection_do_iteration (DBusConnection *connection,
+ unsigned int flags,
+ int timeout_milliseconds);
+void _dbus_connection_notify_disconnected (DBusConnection *connection);
+void _dbus_connection_handler_destroyed_locked (DBusConnection *connection,
+ DBusMessageHandler *handler);
+void _dbus_connection_set_connection_counter (DBusConnection *connection,
+ DBusCounter *counter);
+dbus_bool_t _dbus_message_handler_add_connection (DBusMessageHandler *handler,
+ DBusConnection *connection);
+void _dbus_message_handler_remove_connection (DBusMessageHandler *handler,
+ DBusConnection *connection);
+DBusHandlerResult _dbus_message_handler_handle_message (DBusMessageHandler *handler,
+ DBusConnection *connection,
+ DBusMessage *message);
-void _dbus_connection_lock (DBusConnection *connection);
-void _dbus_connection_unlock (DBusConnection *connection);
-
-void _dbus_connection_ref_unlocked (DBusConnection *connection);
-
-dbus_bool_t _dbus_connection_queue_received_message (DBusConnection *connection,
- DBusMessage *message);
-dbus_bool_t _dbus_connection_have_messages_to_send (DBusConnection *connection);
-
-DBusMessage* _dbus_connection_get_message_to_send (DBusConnection *connection);
-void _dbus_connection_message_sent (DBusConnection *connection,
- DBusMessage *message);
-
-dbus_bool_t _dbus_connection_add_watch (DBusConnection *connection,
- DBusWatch *watch);
-void _dbus_connection_remove_watch (DBusConnection *connection,
- DBusWatch *watch);
-void _dbus_connection_toggle_watch (DBusConnection *connection,
- DBusWatch *watch,
- dbus_bool_t enabled);
-dbus_bool_t _dbus_connection_add_timeout (DBusConnection *connection,
- DBusTimeout *timeout);
-void _dbus_connection_remove_timeout (DBusConnection *connection,
- DBusTimeout *timeout);
-void _dbus_connection_toggle_timeout (DBusConnection *connection,
- DBusTimeout *timeout,
- dbus_bool_t enabled);
-DBusConnection* _dbus_connection_new_for_transport (DBusTransport *transport);
-
-void _dbus_connection_do_iteration (DBusConnection *connection,
- unsigned int flags,
- int timeout_milliseconds);
-
-void _dbus_connection_notify_disconnected (DBusConnection *connection);
-
-void _dbus_connection_handler_destroyed_locked (DBusConnection *connection,
- DBusMessageHandler *handler);
-
-
-void _dbus_connection_set_connection_counter (DBusConnection *connection,
- DBusCounter *counter);
-
-dbus_bool_t _dbus_message_handler_add_connection (DBusMessageHandler *handler,
- DBusConnection *connection);
-void _dbus_message_handler_remove_connection (DBusMessageHandler *handler,
- DBusConnection *connection);
-DBusHandlerResult _dbus_message_handler_handle_message (DBusMessageHandler *handler,
- DBusConnection *connection,
- DBusMessage *message);
/**
* Adds a message to the incoming message queue, returning #FALSE
* if there's insufficient memory to queue the message.
+ * Does not take over refcount of the message.
*
* @param connection the connection.
* @param message the message to queue.
dbus_bool_t
_dbus_connection_queue_received_message (DBusConnection *connection,
DBusMessage *message)
+{
+ DBusList *link;
+
+ link = _dbus_list_alloc_link (message);
+ if (link == NULL)
+ return FALSE;
+
+ dbus_message_ref (message);
+ _dbus_connection_queue_received_message_link (connection, link);
+
+ return TRUE;
+}
+
+/**
+ * Adds a message-containing list link to the incoming message queue,
+ * taking ownership of the link and the message's current refcount.
+ * Cannot fail due to lack of memory.
+ *
+ * @param connection the connection.
+ * @param link the message link to queue.
+ */
+void
+_dbus_connection_queue_received_message_link (DBusConnection *connection,
+ DBusList *link)
{
ReplyHandlerData *reply_handler_data;
dbus_int32_t reply_serial;
+ DBusMessage *message;
_dbus_assert (_dbus_transport_get_is_authenticated (connection->transport));
- if (!_dbus_list_append (&connection->incoming_messages,
- message))
- return FALSE;
-
+ _dbus_list_append_link (&connection->incoming_messages,
+ link);
+ message = link->data;
+
/* If this is a reply we're waiting on, remove timeout for it */
reply_serial = dbus_message_get_reply_serial (message);
if (reply_serial != -1)
}
}
- dbus_message_ref (message);
connection->n_incoming += 1;
_dbus_connection_wakeup_mainloop (connection);
message, dbus_message_get_name (message),
connection,
connection->n_incoming);
-
- return TRUE;
}
/**