diff options
author | Anders Carlsson <andersca@codefactory.se> | 2003-01-28 14:26:49 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@codefactory.se> | 2003-01-28 14:26:49 +0000 |
commit | dec1fa3bd5f106ba5b2c749372231e3dd4bf9e7b (patch) | |
tree | 9a579d3d5b908ee5712249b4de696b89a72ffca7 /dbus/dbus-server-debug.c | |
parent | bec3c093cab742a953e39f1726c37345873990dc (diff) |
2003-01-28 Anders Carlsson <set EMAIL_ADDRESS environment variable>
* dbus/dbus-connection-internal.h:
* dbus/dbus-connection.c: (_dbus_connection_add_timeout),
(_dbus_connection_remove_timeout):
Add functions for adding and removing timeouts.
* dbus/dbus-message.c: (dbus_message_new_from_message):
Add new function that takes a message and creates an exact
copy of it, but with the refcount set to 1.
(check_message_handling):
Fix build error.
* dbus/dbus-server-protected.h:
* dbus/dbus-server.c: (_dbus_server_init_base),
(_dbus_server_finalize_base), (_dbus_server_add_timeout),
(dbus_server_set_timeout_functions):
(_dbus_server_remove_timeout):
New functions so that a server can add and remove timeouts.
(dbus_server_listen):
Add commented out call to dbus_server_debug_new.
* dbus/dbus-timeout.c: (_dbus_timeout_new):
Actually set the handler, doh.
* dbus/dbus-transport.c: (_dbus_transport_open):
Add commented out call to dbus_transport_debug_client_new.
* dbus/Makefile.am:
Add dbus-transport-debug.[ch] and dbus-server-debug.[ch]
Diffstat (limited to 'dbus/dbus-server-debug.c')
-rw-r--r-- | dbus/dbus-server-debug.c | 222 |
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 */ + |