153a5a1b3Sopenharmony_ci/*** 253a5a1b3Sopenharmony_ci This file is part of PulseAudio. 353a5a1b3Sopenharmony_ci 453a5a1b3Sopenharmony_ci Copyright 2004-2006, 2009 Lennart Poettering 553a5a1b3Sopenharmony_ci Copyright 2006 Shams E. King 653a5a1b3Sopenharmony_ci 753a5a1b3Sopenharmony_ci PulseAudio is free software; you can redistribute it and/or modify 853a5a1b3Sopenharmony_ci it under the terms of the GNU Lesser General Public License as published 953a5a1b3Sopenharmony_ci by the Free Software Foundation; either version 2.1 of the License, 1053a5a1b3Sopenharmony_ci or (at your option) any later version. 1153a5a1b3Sopenharmony_ci 1253a5a1b3Sopenharmony_ci PulseAudio is distributed in the hope that it will be useful, but 1353a5a1b3Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 1453a5a1b3Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1553a5a1b3Sopenharmony_ci General Public License for more details. 1653a5a1b3Sopenharmony_ci 1753a5a1b3Sopenharmony_ci You should have received a copy of the GNU Lesser General Public License 1853a5a1b3Sopenharmony_ci along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 1953a5a1b3Sopenharmony_ci***/ 2053a5a1b3Sopenharmony_ci 2153a5a1b3Sopenharmony_ci#ifdef HAVE_CONFIG_H 2253a5a1b3Sopenharmony_ci#include <config.h> 2353a5a1b3Sopenharmony_ci#endif 2453a5a1b3Sopenharmony_ci 2553a5a1b3Sopenharmony_ci#include <pulse/xmalloc.h> 2653a5a1b3Sopenharmony_ci 2753a5a1b3Sopenharmony_ci#include <pulsecore/shared.h> 2853a5a1b3Sopenharmony_ci 2953a5a1b3Sopenharmony_ci#include "dbus-shared.h" 3053a5a1b3Sopenharmony_ci 3153a5a1b3Sopenharmony_cistruct pa_dbus_connection { 3253a5a1b3Sopenharmony_ci PA_REFCNT_DECLARE; 3353a5a1b3Sopenharmony_ci 3453a5a1b3Sopenharmony_ci pa_dbus_wrap_connection *connection; 3553a5a1b3Sopenharmony_ci pa_core *core; 3653a5a1b3Sopenharmony_ci const char *property_name; 3753a5a1b3Sopenharmony_ci}; 3853a5a1b3Sopenharmony_ci 3953a5a1b3Sopenharmony_cistatic pa_dbus_connection* dbus_connection_new(pa_core *c, pa_dbus_wrap_connection *conn, const char *name) { 4053a5a1b3Sopenharmony_ci pa_dbus_connection *pconn; 4153a5a1b3Sopenharmony_ci 4253a5a1b3Sopenharmony_ci pconn = pa_xnew(pa_dbus_connection, 1); 4353a5a1b3Sopenharmony_ci PA_REFCNT_INIT(pconn); 4453a5a1b3Sopenharmony_ci pconn->core = c; 4553a5a1b3Sopenharmony_ci pconn->property_name = name; 4653a5a1b3Sopenharmony_ci pconn->connection = conn; 4753a5a1b3Sopenharmony_ci 4853a5a1b3Sopenharmony_ci pa_assert_se(pa_shared_set(c, name, pconn) >= 0); 4953a5a1b3Sopenharmony_ci 5053a5a1b3Sopenharmony_ci return pconn; 5153a5a1b3Sopenharmony_ci} 5253a5a1b3Sopenharmony_ci 5353a5a1b3Sopenharmony_cipa_dbus_connection* pa_dbus_bus_get(pa_core *c, DBusBusType type, DBusError *error) { 5453a5a1b3Sopenharmony_ci 5553a5a1b3Sopenharmony_ci static const char *const prop_name[] = { 5653a5a1b3Sopenharmony_ci [DBUS_BUS_SESSION] = "dbus-connection-session", 5753a5a1b3Sopenharmony_ci [DBUS_BUS_SYSTEM] = "dbus-connection-system", 5853a5a1b3Sopenharmony_ci [DBUS_BUS_STARTER] = "dbus-connection-starter" 5953a5a1b3Sopenharmony_ci }; 6053a5a1b3Sopenharmony_ci pa_dbus_wrap_connection *conn; 6153a5a1b3Sopenharmony_ci pa_dbus_connection *pconn; 6253a5a1b3Sopenharmony_ci 6353a5a1b3Sopenharmony_ci pa_assert(type == DBUS_BUS_SYSTEM || type == DBUS_BUS_SESSION || type == DBUS_BUS_STARTER); 6453a5a1b3Sopenharmony_ci 6553a5a1b3Sopenharmony_ci if ((pconn = pa_shared_get(c, prop_name[type]))) 6653a5a1b3Sopenharmony_ci return pa_dbus_connection_ref(pconn); 6753a5a1b3Sopenharmony_ci 6853a5a1b3Sopenharmony_ci if (!(conn = pa_dbus_wrap_connection_new(c->mainloop, true, type, error))) 6953a5a1b3Sopenharmony_ci return NULL; 7053a5a1b3Sopenharmony_ci 7153a5a1b3Sopenharmony_ci return dbus_connection_new(c, conn, prop_name[type]); 7253a5a1b3Sopenharmony_ci} 7353a5a1b3Sopenharmony_ci 7453a5a1b3Sopenharmony_ciDBusConnection* pa_dbus_connection_get(pa_dbus_connection *c) { 7553a5a1b3Sopenharmony_ci pa_assert(c); 7653a5a1b3Sopenharmony_ci pa_assert(PA_REFCNT_VALUE(c) > 0); 7753a5a1b3Sopenharmony_ci pa_assert(c->connection); 7853a5a1b3Sopenharmony_ci 7953a5a1b3Sopenharmony_ci return pa_dbus_wrap_connection_get(c->connection); 8053a5a1b3Sopenharmony_ci} 8153a5a1b3Sopenharmony_ci 8253a5a1b3Sopenharmony_civoid pa_dbus_connection_unref(pa_dbus_connection *c) { 8353a5a1b3Sopenharmony_ci pa_assert(c); 8453a5a1b3Sopenharmony_ci pa_assert(PA_REFCNT_VALUE(c) > 0); 8553a5a1b3Sopenharmony_ci 8653a5a1b3Sopenharmony_ci if (PA_REFCNT_DEC(c) > 0) 8753a5a1b3Sopenharmony_ci return; 8853a5a1b3Sopenharmony_ci 8953a5a1b3Sopenharmony_ci pa_dbus_wrap_connection_free(c->connection); 9053a5a1b3Sopenharmony_ci 9153a5a1b3Sopenharmony_ci pa_assert_se(pa_shared_remove(c->core, c->property_name) >= 0); 9253a5a1b3Sopenharmony_ci pa_xfree(c); 9353a5a1b3Sopenharmony_ci} 9453a5a1b3Sopenharmony_ci 9553a5a1b3Sopenharmony_cipa_dbus_connection* pa_dbus_connection_ref(pa_dbus_connection *c) { 9653a5a1b3Sopenharmony_ci pa_assert(c); 9753a5a1b3Sopenharmony_ci pa_assert(PA_REFCNT_VALUE(c) > 0); 9853a5a1b3Sopenharmony_ci 9953a5a1b3Sopenharmony_ci PA_REFCNT_INC(c); 10053a5a1b3Sopenharmony_ci 10153a5a1b3Sopenharmony_ci return c; 10253a5a1b3Sopenharmony_ci} 103