summaryrefslogtreecommitdiffstats
path: root/dbus/dbus-transport-debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'dbus/dbus-transport-debug.c')
-rw-r--r--dbus/dbus-transport-debug.c312
1 files changed, 312 insertions, 0 deletions
diff --git a/dbus/dbus-transport-debug.c b/dbus/dbus-transport-debug.c
new file mode 100644
index 00000000..3277094f
--- /dev/null
+++ b/dbus/dbus-transport-debug.c
@@ -0,0 +1,312 @@
+/* -*- mode: C; c-file-style: "gnu" -*- */
+/* dbus-transport-debug.c In-proc debug subclass of DBusTransport
+ *
+ * Copyright (C) 2003 CodeFactory AB
+ *
+ * Licensed under the Academic Free License version 1.2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "dbus-internals.h"
+#include "dbus-connection-internal.h"
+#include "dbus-transport-protected.h"
+#include "dbus-transport-debug.h"
+#include "dbus-server-debug.h"
+#include "dbus-list.h"
+
+#ifdef DBUS_BUILD_TESTS
+
+
+#define DEFAULT_INTERVAL 10
+
+typedef struct DBusTransportDebug DBusTransportDebug;
+
+struct DBusTransportDebug
+{
+ DBusTransport base; /**< Parent instance */
+
+ DBusTimeout *write_timeout;
+ DBusTimeout *read_timeout;
+
+ DBusTransport *other_end;
+};
+
+static void
+debug_finalize (DBusTransport *transport)
+{
+ _dbus_transport_finalize_base (transport);
+
+ dbus_free (transport);
+}
+
+static void
+do_reading (DBusTransport *transport)
+{
+ printf ("in do reading!\n");
+
+ if (transport->disconnected)
+ return;
+
+ /* Now dispatch the messages */
+ while (dbus_connection_dispatch_message (transport->connection));
+}
+
+static void
+check_read_timeout (DBusTransport *transport)
+{
+ DBusTransportDebug *debug_transport = (DBusTransportDebug*) transport;
+ dbus_bool_t need_read_timeout;
+
+ if (transport->connection == NULL)
+ return;
+
+ _dbus_transport_ref (transport);
+
+ need_read_timeout = dbus_connection_get_n_messages (transport->connection) > 0;
+
+ if (transport->disconnected)
+ need_read_timeout = FALSE;
+
+ if (need_read_timeout &&
+ debug_transport->read_timeout == NULL)
+ {
+ debug_transport->read_timeout =
+ _dbus_timeout_new (DEFAULT_INTERVAL, (DBusTimeoutHandler)do_reading,
+ transport, NULL);
+
+ if (debug_transport->read_timeout == NULL)
+ goto out;
+
+ if (!_dbus_connection_add_timeout (transport->connection,
+ debug_transport->read_timeout))
+ {
+ _dbus_timeout_unref (debug_transport->read_timeout);
+ debug_transport->read_timeout = NULL;
+
+ goto out;
+ }
+ }
+ else if (!need_read_timeout &&
+ debug_transport->read_timeout != NULL)
+ {
+ _dbus_connection_remove_timeout (transport->connection,
+ debug_transport->read_timeout);
+ _dbus_timeout_unref (debug_transport->read_timeout);
+ debug_transport->read_timeout = NULL;
+ }
+
+ out:
+ _dbus_transport_unref (transport);
+}
+
+static void
+do_writing (DBusTransport *transport)
+{
+ if (transport->disconnected)
+ return;
+
+ while (!transport->disconnected &&
+ _dbus_connection_have_messages_to_send (transport->connection))
+ {
+ DBusMessage *message, *copy;
+
+ message = _dbus_connection_get_message_to_send (transport->connection);
+ _dbus_message_lock (message);
+
+ copy = dbus_message_new_from_message (message);
+
+ _dbus_connection_message_sent (transport->connection,
+ message);
+
+ _dbus_connection_queue_received_message (((DBusTransportDebug *)transport)->other_end->connection,
+ copy);
+
+ }
+
+ check_read_timeout (((DBusTransportDebug *)transport)->other_end);
+}
+
+static void
+check_write_timeout (DBusTransport *transport)
+{
+ DBusTransportDebug *debug_transport = (DBusTransportDebug *)transport;
+ dbus_bool_t need_write_timeout;
+
+ if (transport->connection == NULL)
+ return;
+
+ _dbus_transport_ref (transport);
+
+ need_write_timeout = transport->messages_need_sending;
+
+ if (transport->disconnected)
+ need_write_timeout = FALSE;
+
+ if (need_write_timeout &&
+ debug_transport->write_timeout == NULL)
+ {
+ debug_transport->write_timeout =
+ _dbus_timeout_new (DEFAULT_INTERVAL, (DBusTimeoutHandler)do_writing,
+ transport, NULL);
+
+ if (debug_transport->write_timeout == NULL)
+ goto out;
+
+ if (!_dbus_connection_add_timeout (transport->connection,
+ debug_transport->write_timeout))
+ {
+ _dbus_timeout_unref (debug_transport->write_timeout);
+ debug_transport->write_timeout = NULL;
+ }
+ }
+ else if (!need_write_timeout &&
+ debug_transport->write_timeout != NULL)
+ {
+ _dbus_connection_remove_timeout (transport->connection,
+ debug_transport->write_timeout);
+ _dbus_timeout_unref (debug_transport->write_timeout);
+ debug_transport->write_timeout = NULL;
+ }
+
+ out:
+ _dbus_transport_unref (transport);
+}
+
+static void
+debug_handle_watch (DBusTransport *transport,
+ DBusWatch *watch,
+ unsigned int flags)
+{
+}
+
+static void
+debug_disconnect (DBusTransport *transport)
+{
+}
+
+static void
+debug_connection_set (DBusTransport *transport)
+{
+}
+
+static void
+debug_messages_pending (DBusTransport *transport,
+ int messages_pending)
+{
+ check_write_timeout (transport);
+ printf ("messages pending!: %d\n", messages_pending);
+}
+
+static void
+debug_do_iteration (DBusTransport *transport,
+ unsigned int flags,
+ int timeout_milliseconds)
+{
+ printf ("do iteration: %d %d!!\n", transport->is_server,
+ flags);
+}
+
+static void
+debug_live_messages_changed (DBusTransport *transport)
+{
+}
+
+static DBusTransportVTable debug_vtable = {
+ debug_finalize,
+ debug_handle_watch,
+ debug_disconnect,
+ debug_connection_set,
+ debug_messages_pending,
+ debug_do_iteration,
+ debug_live_messages_changed
+};
+
+DBusTransport*
+_dbus_transport_debug_server_new (DBusTransport *client)
+{
+ DBusTransportDebug *debug_transport;
+
+ debug_transport = dbus_new0 (DBusTransportDebug, 1);
+
+ if (debug_transport == NULL)
+ return NULL;
+
+ if (!_dbus_transport_init_base (&debug_transport->base,
+ &debug_vtable,
+ TRUE))
+ {
+ dbus_free (debug_transport);
+ return NULL;
+ }
+
+ debug_transport->base.authenticated = TRUE;
+
+ /* Connect the two transports */
+ debug_transport->other_end = client;
+ ((DBusTransportDebug *)client)->other_end = (DBusTransport *)debug_transport;
+
+ return (DBusTransport *)debug_transport;
+}
+
+DBusTransport*
+_dbus_transport_debug_client_new (const char *server_name,
+ DBusResultCode *result)
+{
+ DBusServer *debug_server;
+ DBusTransportDebug *debug_transport;
+
+ debug_server = _dbus_server_debug_lookup (server_name);
+
+ if (!debug_server)
+ {
+ dbus_set_result (result, DBUS_RESULT_NO_SERVER);
+ return NULL;
+ }
+
+ debug_transport = dbus_new0 (DBusTransportDebug, 1);
+ if (debug_transport == NULL)
+ {
+ dbus_set_result (result, DBUS_RESULT_NO_MEMORY);
+ return NULL;
+ }
+
+ if (!_dbus_transport_init_base (&debug_transport->base,
+ &debug_vtable,
+ FALSE))
+ {
+ dbus_free (debug_transport);
+ dbus_set_result (result, DBUS_RESULT_NO_MEMORY);
+ return NULL;
+ }
+
+ if (!_dbus_server_debug_accept_transport (debug_server, (DBusTransport *)debug_transport))
+ {
+ _dbus_transport_finalize_base (&debug_transport->base);
+
+ dbus_free (debug_transport);
+ dbus_set_result (result, DBUS_RESULT_IO_ERROR);
+ return NULL;
+
+ }
+
+ /* FIXME: Prolly wrong to do this. */
+ debug_transport->base.authenticated = TRUE;
+
+ return (DBusTransport *)debug_transport;
+}
+
+#endif /* DBUS_BUILD_TESTS */