1 /* -*- mode: C; c-file-style: "gnu" -*- */
2 /* connection.c Client connections
4 * Copyright (C) 2003 Red Hat, Inc.
6 * Licensed under the Academic Free License version 1.2
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "connection.h"
27 #include <dbus/dbus-list.h>
29 static int connection_data_slot;
30 static DBusList *connections = NULL;
34 DBusList *services_owned;
39 #define BUS_CONNECTION_DATA(connection) (dbus_connection_get_data ((connection), connection_data_slot))
42 connection_disconnect_handler (DBusConnection *connection,
48 _dbus_warn ("Disconnected\n");
50 d = BUS_CONNECTION_DATA (connection);
51 _dbus_assert (d != NULL);
53 /* Drop any service ownership */
54 while ((service = _dbus_list_get_last (&d->services_owned)))
55 bus_service_remove_owner (service, connection);
57 /* Tell bus driver that we want to get off */
58 bus_driver_remove_connection (connection);
60 /* no more watching */
61 dbus_connection_set_watch_functions (connection,
66 dbus_connection_set_data (connection,
70 _dbus_list_remove (&connections, connection);
71 dbus_connection_unref (connection);
75 connection_watch_callback (DBusWatch *watch,
76 unsigned int condition,
79 DBusConnection *connection = data;
81 dbus_connection_handle_watch (connection, watch, condition);
83 while (dbus_connection_dispatch_message (connection));
87 add_connection_watch (DBusWatch *watch,
88 DBusConnection *connection)
90 bus_loop_add_watch (watch, connection_watch_callback, connection,
95 remove_connection_watch (DBusWatch *watch,
96 DBusConnection *connection)
98 bus_loop_remove_watch (watch, connection_watch_callback, connection);
102 free_connection_data (void *data)
104 BusConnectionData *d = data;
106 /* services_owned should be NULL since we should be disconnected */
107 _dbus_assert (d->services_owned == NULL);
115 bus_connection_init (void)
117 connection_data_slot = dbus_connection_allocate_data_slot ();
119 if (connection_data_slot < 0)
126 bus_connection_setup (DBusConnection *connection)
128 BusConnectionData *d;
130 d = dbus_new0 (BusConnectionData, 1);
135 if (!dbus_connection_set_data (connection,
136 connection_data_slot,
137 d, free_connection_data))
143 if (!_dbus_list_append (&connections, connection))
145 /* this will free our data when connection gets finalized */
146 dbus_connection_disconnect (connection);
150 dbus_connection_ref (connection);
152 dbus_connection_set_watch_functions (connection,
153 (DBusAddWatchFunction) add_connection_watch,
154 (DBusRemoveWatchFunction) remove_connection_watch,
158 dbus_connection_set_disconnect_function (connection,
159 connection_disconnect_handler,
162 if (!bus_driver_add_connection (connection))
169 bus_connection_add_owned_service (DBusConnection *connection,
172 BusConnectionData *d;
174 d = BUS_CONNECTION_DATA (connection);
175 _dbus_assert (d != NULL);
177 if (!_dbus_list_append (&d->services_owned,
185 bus_connection_remove_owned_service (DBusConnection *connection,
188 BusConnectionData *d;
190 d = BUS_CONNECTION_DATA (connection);
191 _dbus_assert (d != NULL);
193 _dbus_list_remove_last (&d->services_owned, service);
197 bus_connection_set_name (DBusConnection *connection,
198 const DBusString *name)
201 BusConnectionData *d;
203 d = BUS_CONNECTION_DATA (connection);
204 _dbus_assert (d != NULL);
205 _dbus_assert (d->name == NULL);
207 _dbus_string_get_const_data (name, &c_name);
209 d->name = _dbus_strdup (c_name);
218 bus_connection_get_name (DBusConnection *connection)
220 BusConnectionData *d;
222 d = BUS_CONNECTION_DATA (connection);
223 _dbus_assert (d != NULL);