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"
26 #include <dbus/dbus-list.h>
28 static int connection_data_slot;
29 static DBusList *connections = NULL;
33 DBusList *services_owned;
37 #define BUS_CONNECTION_DATA(connection) (dbus_connection_get_data ((connection), connection_data_slot))
40 connection_error_handler (DBusConnection *connection,
41 DBusResultCode error_code,
47 _dbus_warn ("Error on connection: %s\n",
48 dbus_result_to_string (error_code));
50 d = BUS_CONNECTION_DATA (connection);
51 _dbus_assert (d != NULL);
53 /* we don't want to be called again since we're dropping the connection */
54 dbus_connection_set_error_function (connection, NULL, NULL, NULL);
56 /* Drop any service ownership */
57 while ((service = _dbus_list_get_last (&d->services_owned)))
58 bus_service_remove_owner (service, 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);
85 add_connection_watch (DBusWatch *watch,
86 DBusConnection *connection)
88 bus_loop_add_watch (watch, connection_watch_callback, connection,
93 remove_connection_watch (DBusWatch *watch,
94 DBusConnection *connection)
96 bus_loop_remove_watch (watch, connection_watch_callback, connection);
100 free_connection_data (void *data)
102 BusConnectionData *d = data;
104 /* services_owned should be NULL since we should be disconnected */
105 _dbus_assert (d->services_owned == NULL);
111 bus_connection_init (void)
113 connection_data_slot = dbus_connection_allocate_data_slot ();
115 if (connection_data_slot < 0)
122 bus_connection_setup (DBusConnection *connection)
124 BusConnectionData *d;
126 d = dbus_new (BusConnectionData, 1);
130 if (!dbus_connection_set_data (connection,
131 connection_data_slot,
132 d, free_connection_data))
138 if (!_dbus_list_append (&connections, connection))
140 /* this will free our data when connection gets finalized */
141 dbus_connection_disconnect (connection);
145 dbus_connection_ref (connection);
147 dbus_connection_set_watch_functions (connection,
148 (DBusAddWatchFunction) add_connection_watch,
149 (DBusRemoveWatchFunction) remove_connection_watch,
153 dbus_connection_set_error_function (connection,
154 connection_error_handler,
161 bus_connection_add_owned_service (DBusConnection *connection,
164 BusConnectionData *d;
166 d = BUS_CONNECTION_DATA (connection);
167 _dbus_assert (d != NULL);
169 if (!_dbus_list_append (&d->services_owned,
177 bus_connection_remove_owned_service (DBusConnection *connection,
180 BusConnectionData *d;
182 d = BUS_CONNECTION_DATA (connection);
183 _dbus_assert (d != NULL);
185 _dbus_list_remove_last (&d->services_owned, service);