summaryrefslogtreecommitdiffstats
path: root/dbus/dbus-server-debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'dbus/dbus-server-debug.c')
-rw-r--r--dbus/dbus-server-debug.c222
1 files changed, 222 insertions, 0 deletions
diff --git a/dbus/dbus-server-debug.c b/dbus/dbus-server-debug.c
new file mode 100644
index 00000000..b2e8c004
--- /dev/null
+++ b/dbus/dbus-server-debug.c
@@ -0,0 +1,222 @@
+/* -*- mode: C; c-file-style: "gnu" -*- */
+/* dbus-server-debug.h In-proc debug server implementation
+ *
+ * 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-server-debug.h"
+#include "dbus-transport-debug.h"
+#include "dbus-connection-internal.h"
+#include "dbus-hash.h"
+
+#ifdef DBUS_BUILD_TESTS
+
+#define DEFAULT_INTERVAL 10
+
+typedef struct DBusServerDebug DBusServerDebug;
+
+/**
+ * Implementation details of DBusServerDebug. All members
+ * are private.
+ */
+struct DBusServerDebug
+{
+ DBusServer base; /**< Parent class members. */
+
+ char *name; /**< Server name. */
+};
+
+static DBusHashTable *server_hash;
+
+static void
+debug_finalize (DBusServer *server)
+{
+}
+
+static void
+debug_handle_watch (DBusServer *server,
+ DBusWatch *watch,
+ unsigned int flags)
+{
+}
+
+static void
+debug_disconnect (DBusServer *server)
+{
+}
+
+static DBusServerVTable debug_vtable = {
+ debug_finalize,
+ debug_handle_watch,
+ debug_disconnect
+};
+
+DBusServer*
+_dbus_server_debug_lookup (const char *server_name)
+{
+ if (!server_hash)
+ return NULL;
+
+ return _dbus_hash_table_lookup_string (server_hash, server_name);
+}
+
+DBusServer*
+_dbus_server_debug_new (const char *server_name,
+ DBusResultCode *result)
+{
+ DBusServerDebug *debug_server;
+
+ if (!server_hash)
+ {
+ server_hash = _dbus_hash_table_new (DBUS_HASH_STRING, NULL, NULL);
+
+ if (!server_hash)
+ {
+ dbus_set_result (result, DBUS_RESULT_NO_MEMORY);
+ return NULL;
+ }
+ }
+
+ if (_dbus_hash_table_lookup_string (server_hash, server_name) != NULL)
+ {
+ dbus_set_result (result, DBUS_RESULT_ADDRESS_IN_USE);
+ return NULL;
+ }
+
+ debug_server = dbus_new0 (DBusServerDebug, 1);
+
+ if (debug_server == NULL)
+ return NULL;
+
+ debug_server->name = _dbus_strdup (server_name);
+ if (debug_server->name == NULL)
+ {
+ dbus_free (debug_server->name);
+ dbus_free (debug_server);
+
+ dbus_set_result (result, DBUS_RESULT_NO_MEMORY);
+ }
+
+ if (!_dbus_server_init_base (&debug_server->base,
+ &debug_vtable))
+ {
+ dbus_free (debug_server->name);
+ dbus_free (debug_server);
+
+ dbus_set_result (result, DBUS_RESULT_NO_MEMORY);
+
+ return NULL;
+ }
+
+ if (!_dbus_hash_table_insert_string (server_hash,
+ debug_server->name,
+ debug_server))
+ {
+ _dbus_server_finalize_base (&debug_server->base);
+ dbus_free (debug_server->name);
+ dbus_free (debug_server);
+
+ dbus_set_result (result, DBUS_RESULT_NO_MEMORY);
+
+ return NULL;
+ }
+
+ dbus_set_result (result, DBUS_RESULT_SUCCESS);
+
+ return (DBusServer *)debug_server;
+}
+
+typedef struct
+{
+ DBusServer *server;
+ DBusTransport *transport;
+
+} ServerAndTransport;
+
+static void
+handle_new_client (void *data)
+{
+ ServerAndTransport *st = data;
+ DBusTransport *transport;
+ DBusConnection *connection;
+
+ transport = _dbus_transport_debug_server_new (st->transport);
+ if (transport == NULL)
+ {
+ return;
+ }
+
+ connection = _dbus_connection_new_for_transport (transport);
+ _dbus_transport_unref (transport);
+
+ if (connection == NULL)
+ return;
+
+ /* See if someone wants to handle this new connection,
+ * self-referencing for paranoia
+ */
+ if (st->server->new_connection_function)
+ {
+ dbus_server_ref (st->server);
+
+ (* st->server->new_connection_function) (st->server, connection,
+ st->server->new_connection_data);
+ dbus_server_unref (st->server);
+ }
+
+ /* If no one grabbed a reference, the connection will die. */
+ dbus_connection_unref (connection);
+}
+
+dbus_bool_t
+_dbus_server_debug_accept_transport (DBusServer *server,
+ DBusTransport *transport)
+{
+ DBusTimeout *timeout;
+ ServerAndTransport *st;
+
+ st = dbus_new (ServerAndTransport, 1);
+ if (st == NULL)
+ return FALSE;
+
+ st->transport = transport;
+ st->server = server;
+
+ timeout = _dbus_timeout_new (DEFAULT_INTERVAL, handle_new_client, st, dbus_free);
+
+ if (timeout == NULL)
+ {
+ dbus_free (st);
+ return FALSE;
+ }
+
+ if (!_dbus_server_add_timeout (server, timeout))
+ {
+ _dbus_timeout_unref (timeout);
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+#endif /* DBUS_BUILD_TESTS */
+