1 /* -*- mode: C; c-file-style: "gnu" -*- */
2 /* services.c Service management
4 * Copyright (C) 2003 Red Hat, Inc.
5 * Copyright (C) 2003 CodeFactory AB
7 * Licensed under the Academic Free License version 1.2
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 #include "connection.h"
27 #include <dbus/dbus-hash.h>
28 #include <dbus/dbus-list.h>
29 #include <dbus/dbus-mempool.h>
36 unsigned int prohibit_replacement:1;
39 static DBusHashTable *service_hash = NULL;
40 static DBusMemPool *service_pool = NULL;
43 bus_service_lookup (const DBusString *service_name,
44 dbus_bool_t create_if_not_found)
49 if (service_hash == NULL)
51 service_hash = _dbus_hash_table_new (DBUS_HASH_STRING,
53 service_pool = _dbus_mem_pool_new (sizeof (BusService),
56 if (service_hash == NULL || service_pool == NULL)
60 _dbus_hash_table_unref (service_hash);
65 _dbus_mem_pool_free (service_pool);
72 _dbus_string_get_const_data (service_name, &c_name);
74 service = _dbus_hash_table_lookup_string (service_hash,
79 if (!create_if_not_found)
82 service = _dbus_mem_pool_alloc (service_pool);
86 service->name = _dbus_strdup (c_name);
87 if (service->name == NULL)
89 _dbus_mem_pool_dealloc (service_pool, service);
93 if (!_dbus_hash_table_insert_string (service_hash,
97 dbus_free (service->name);
98 _dbus_mem_pool_dealloc (service_pool, service);
106 bus_service_add_owner (BusService *service,
107 DBusConnection *owner)
109 if (!_dbus_list_append (&service->owners,
113 if (!bus_connection_add_owned_service (owner, service))
115 _dbus_list_remove_last (&service->owners, owner);
119 /* Send service acquired message */
120 if (bus_service_get_primary_owner (service) == owner)
121 bus_driver_send_service_acquired (owner, service->name);
127 bus_service_remove_owner (BusService *service,
128 DBusConnection *owner)
130 /* Send service lost message */
131 if (bus_service_get_primary_owner (service) == owner)
132 bus_driver_send_service_lost (owner, service->name);
134 _dbus_list_remove_last (&service->owners, owner);
135 bus_connection_remove_owned_service (owner, service);
137 if (service->owners == NULL)
140 bus_driver_send_service_deleted (service->name);
142 _dbus_hash_table_remove_string (service_hash, service->name);
144 dbus_free (service->name);
145 _dbus_mem_pool_dealloc (service_pool, service);
149 /* Send service acquired to the new owner */
150 bus_driver_send_service_acquired (bus_service_get_primary_owner (service),
156 bus_service_get_primary_owner (BusService *service)
158 return _dbus_list_get_first (&service->owners);
162 bus_service_get_name (BusService *service)
164 return service->name;
168 bus_service_foreach (BusServiceForeachFunction function,
173 if (service_hash == NULL)
176 _dbus_hash_iter_init (service_hash, &iter);
177 while (_dbus_hash_iter_next (&iter))
179 BusService *service = _dbus_hash_iter_get_value (&iter);
181 (* function) (service, data);
186 bus_services_list (int *array_len)
192 len = _dbus_hash_table_get_n_entries (service_hash);
193 retval = dbus_new (char *, len);
198 _dbus_hash_iter_init (service_hash, &iter);
200 while (_dbus_hash_iter_next (&iter))
202 BusService *service = _dbus_hash_iter_get_value (&iter);
204 retval[i] = _dbus_strdup (service->name);
205 if (retval[i] == NULL)
217 for (j = 0; j < i; j++)
218 dbus_free (retval[i]);
225 bus_service_set_prohibit_replacement (BusService *service,
226 dbus_bool_t prohibit_replacement)
228 _dbus_assert (service->owners == NULL);
230 service->prohibit_replacement = prohibit_replacement != FALSE;
234 bus_service_get_prohibit_replacement (BusService *service)
236 return service->prohibit_replacement;
240 bus_service_has_owner (BusService *service,
241 DBusConnection *owner)
245 link = _dbus_list_get_first_link (&service->owners);
249 if (link->data == owner)
252 link = _dbus_list_get_next_link (&service->owners, link);