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 bus_connection_disconnect (DBusConnection *connection)
47 _dbus_warn ("Disconnected\n");
49 d = BUS_CONNECTION_DATA (connection);
50 _dbus_assert (d != NULL);
52 /* Drop any service ownership */
53 while ((service = _dbus_list_get_last (&d->services_owned)))
54 bus_service_remove_owner (service, connection);
56 bus_dispatch_remove_connection (connection);
58 /* no more watching */
59 dbus_connection_set_watch_functions (connection,
64 dbus_connection_set_data (connection,
68 _dbus_list_remove (&connections, connection);
69 dbus_connection_unref (connection);
73 connection_watch_callback (DBusWatch *watch,
74 unsigned int condition,
77 DBusConnection *connection = data;
79 dbus_connection_ref (connection);
81 dbus_connection_handle_watch (connection, watch, condition);
83 while (dbus_connection_dispatch_message (connection));
84 dbus_connection_unref (connection);
88 add_connection_watch (DBusWatch *watch,
89 DBusConnection *connection)
91 bus_loop_add_watch (watch, connection_watch_callback, connection,
96 remove_connection_watch (DBusWatch *watch,
97 DBusConnection *connection)
99 bus_loop_remove_watch (watch, connection_watch_callback, connection);
103 free_connection_data (void *data)
105 BusConnectionData *d = data;
107 /* services_owned should be NULL since we should be disconnected */
108 _dbus_assert (d->services_owned == NULL);
116 bus_connection_init (void)
118 connection_data_slot = dbus_connection_allocate_data_slot ();
120 if (connection_data_slot < 0)
127 bus_connection_setup (DBusConnection *connection)
129 BusConnectionData *d;
131 d = dbus_new0 (BusConnectionData, 1);
136 if (!dbus_connection_set_data (connection,
137 connection_data_slot,
138 d, free_connection_data))
144 if (!_dbus_list_append (&connections, connection))
146 /* this will free our data when connection gets finalized */
147 dbus_connection_disconnect (connection);
151 dbus_connection_ref (connection);
153 dbus_connection_set_watch_functions (connection,
154 (DBusAddWatchFunction) add_connection_watch,
155 (DBusRemoveWatchFunction) remove_connection_watch,
159 /* Setup the connection with the dispatcher */
160 if (!bus_dispatch_add_connection (connection))
167 bus_connection_add_owned_service (DBusConnection *connection,
170 BusConnectionData *d;
172 d = BUS_CONNECTION_DATA (connection);
173 _dbus_assert (d != NULL);
175 if (!_dbus_list_append (&d->services_owned,
183 bus_connection_remove_owned_service (DBusConnection *connection,
186 BusConnectionData *d;
188 d = BUS_CONNECTION_DATA (connection);
189 _dbus_assert (d != NULL);
191 _dbus_list_remove_last (&d->services_owned, service);
195 bus_connection_set_name (DBusConnection *connection,
196 const DBusString *name)
199 BusConnectionData *d;
201 d = BUS_CONNECTION_DATA (connection);
202 _dbus_assert (d != NULL);
203 _dbus_assert (d->name == NULL);
205 _dbus_string_get_const_data (name, &c_name);
207 d->name = _dbus_strdup (c_name);
216 bus_connection_get_name (DBusConnection *connection)
218 BusConnectionData *d;
220 d = BUS_CONNECTION_DATA (connection);
221 _dbus_assert (d != NULL);
227 bus_connection_foreach (BusConnectionForeachFunction function,
230 _dbus_list_foreach (&connections, (DBusForeachFunction)function, data);