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);
102 bus_driver_send_service_created (service->name);
108 bus_service_add_owner (BusService *service,
109 DBusConnection *owner)
111 if (!_dbus_list_append (&service->owners,
115 if (!bus_connection_add_owned_service (owner, service))
117 _dbus_list_remove_last (&service->owners, owner);
121 /* Send service acquired message */
122 if (bus_service_get_primary_owner (service) == owner)
123 bus_driver_send_service_acquired (owner, service->name);
129 bus_service_remove_owner (BusService *service,
130 DBusConnection *owner)
132 /* Send service lost message */
133 if (bus_service_get_primary_owner (service) == owner)
134 bus_driver_send_service_lost (owner, service->name);
136 _dbus_list_remove_last (&service->owners, owner);
137 bus_connection_remove_owned_service (owner, service);
139 if (service->owners == NULL)
142 bus_driver_send_service_deleted (service->name);
144 _dbus_hash_table_remove_string (service_hash, service->name);
146 dbus_free (service->name);
147 _dbus_mem_pool_dealloc (service_pool, service);
151 /* Send service acquired to the new owner */
152 bus_driver_send_service_acquired (bus_service_get_primary_owner (service),
158 bus_service_get_primary_owner (BusService *service)
160 return _dbus_list_get_first (&service->owners);
164 bus_service_get_name (BusService *service)
166 return service->name;
170 bus_service_foreach (BusServiceForeachFunction function,
175 if (service_hash == NULL)
178 _dbus_hash_iter_init (service_hash, &iter);
179 while (_dbus_hash_iter_next (&iter))
181 BusService *service = _dbus_hash_iter_get_value (&iter);
183 (* function) (service, data);
188 bus_services_list (int *array_len)
194 len = _dbus_hash_table_get_n_entries (service_hash);
195 retval = dbus_new (char *, len);
200 _dbus_hash_iter_init (service_hash, &iter);
202 while (_dbus_hash_iter_next (&iter))
204 BusService *service = _dbus_hash_iter_get_value (&iter);
206 retval[i] = _dbus_strdup (service->name);
207 if (retval[i] == NULL)
219 for (j = 0; j < i; j++)
220 dbus_free (retval[i]);
227 bus_service_set_prohibit_replacement (BusService *service,
228 dbus_bool_t prohibit_replacement)
230 _dbus_assert (service->owners == NULL);
232 service->prohibit_replacement = prohibit_replacement != FALSE;
236 bus_service_get_prohibit_replacement (BusService *service)
238 return service->prohibit_replacement;
242 bus_service_has_owner (BusService *service,
243 DBusConnection *owner)
247 link = _dbus_list_get_first_link (&service->owners);
251 if (link->data == owner)
254 link = _dbus_list_get_next_link (&service->owners, link);