2
* This file is a part of the Cairo-Dock project
4
* Copyright : (C) see the 'copyright' file.
5
* E-mail : see the 'copyright' file.
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 3
10
* of the License, or (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
23
#include "cairo-dock-log.h"
24
#include "cairo-dock-dbus.h"
26
static DBusGConnection *s_pSessionConnexion = NULL;
27
static DBusGConnection *s_pSystemConnexion = NULL;
28
static DBusGProxy *s_pDBusSessionProxy = NULL;
29
static DBusGProxy *s_pDBusSystemProxy = NULL;
32
DBusGConnection *cairo_dock_get_session_connection (void)
34
if (s_pSessionConnexion == NULL)
36
GError *erreur = NULL;
37
s_pSessionConnexion = dbus_g_bus_get (DBUS_BUS_SESSION, &erreur);
40
cd_warning (erreur->message);
41
g_error_free (erreur);
42
s_pSessionConnexion = NULL;
45
return s_pSessionConnexion;
48
DBusGConnection *cairo_dock_get_system_connection (void)
50
if (s_pSystemConnexion == NULL)
52
GError *erreur = NULL;
53
s_pSystemConnexion = dbus_g_bus_get (DBUS_BUS_SYSTEM, &erreur);
56
cd_warning (erreur->message);
57
g_error_free (erreur);
58
s_pSystemConnexion = NULL;
61
return s_pSystemConnexion;
64
DBusGProxy *cairo_dock_get_main_proxy (void)
66
if (s_pDBusSessionProxy == NULL)
68
s_pDBusSessionProxy = cairo_dock_create_new_session_proxy (DBUS_SERVICE_DBUS,
72
return s_pDBusSessionProxy;
75
DBusGProxy *cairo_dock_get_main_system_proxy (void)
77
if (s_pDBusSystemProxy == NULL)
79
s_pDBusSystemProxy = cairo_dock_create_new_system_proxy (DBUS_SERVICE_DBUS,
83
return s_pDBusSystemProxy;
86
void cairo_dock_register_service_name (const gchar *cServiceName)
88
DBusGProxy *pProxy = cairo_dock_get_main_proxy ();
91
GError *erreur = NULL;
93
org_freedesktop_DBus_request_name (pProxy, cServiceName, 0, &request_ret, &erreur);
96
cd_warning ("Unable to register service: %s", erreur->message);
97
g_error_free (erreur);
102
gboolean cairo_dock_dbus_is_enabled (void)
104
return (cairo_dock_get_session_connection () != NULL && cairo_dock_get_system_connection () != NULL);
108
DBusGProxy *cairo_dock_create_new_session_proxy (const char *name, const char *path, const char *interface)
110
DBusGConnection *pConnection = cairo_dock_get_session_connection ();
111
if (pConnection != NULL)
112
return dbus_g_proxy_new_for_name (
121
DBusGProxy *cairo_dock_create_new_system_proxy (const char *name, const char *path, const char *interface)
123
DBusGConnection *pConnection = cairo_dock_get_system_connection ();
124
if (pConnection != NULL)
125
return dbus_g_proxy_new_for_name (
134
static void _on_detect_application (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer *data)
136
CairoDockOnAppliPresentOnDbus pCallback = data[0];
137
gpointer user_data = data[1];
138
gchar *cName = data[2];
139
gchar **name_list = NULL;
140
gboolean bSuccess = dbus_g_proxy_end_call (proxy,
147
gboolean bPresent = FALSE;
148
cd_message ("detection du service %s ...", cName);
150
for (i = 0; name_list[i] != NULL; i ++)
152
if (strcmp (name_list[i], cName) == 0)
158
g_strfreev (name_list);
162
pCallback (bPresent, user_data);
164
static void _free_detect_application (gpointer *data)
166
cd_debug ("free data\n");
170
static inline DBusGProxyCall *_dbus_detect_application_async (const gchar *cName, DBusGProxy *pProxy, CairoDockOnAppliPresentOnDbus pCallback, gpointer user_data)
172
g_return_val_if_fail (cName != NULL && pProxy != NULL, FALSE);
173
gpointer *data = g_new0 (gpointer, 3);
176
data[2] = g_strdup (cName);
177
DBusGProxyCall* pCall= dbus_g_proxy_begin_call (pProxy, "ListNames",
178
(DBusGProxyCallNotify)_on_detect_application,
180
(GDestroyNotify) _free_detect_application,
185
DBusGProxyCall *cairo_dock_dbus_detect_application_async (const gchar *cName, CairoDockOnAppliPresentOnDbus pCallback, gpointer user_data)
187
cd_message ("%s (%s)", __func__, cName);
188
DBusGProxy *pProxy = cairo_dock_get_main_proxy ();
189
return _dbus_detect_application_async (cName, pProxy, pCallback, user_data);
192
DBusGProxyCall *cairo_dock_dbus_detect_system_application_async (const gchar *cName, CairoDockOnAppliPresentOnDbus pCallback, gpointer user_data)
194
cd_message ("%s (%s)", __func__, cName);
195
DBusGProxy *pProxy = cairo_dock_get_main_system_proxy ();
196
return _dbus_detect_application_async (cName, pProxy, pCallback, user_data);
199
static inline gboolean _dbus_detect_application (const gchar *cName, DBusGProxy *pProxy)
201
g_return_val_if_fail (cName != NULL && pProxy != NULL, FALSE);
203
gchar **name_list = NULL;
204
gboolean bPresent = FALSE;
206
if(dbus_g_proxy_call (pProxy, "ListNames", NULL,
212
cd_message ("detection du service %s ...", cName);
214
for (i = 0; name_list[i] != NULL; i ++)
216
if (strcmp (name_list[i], cName) == 0)
223
g_strfreev (name_list);
227
gboolean cairo_dock_dbus_detect_application (const gchar *cName)
229
cd_message ("%s (%s)", __func__, cName);
230
DBusGProxy *pProxy = cairo_dock_get_main_proxy ();
231
return _dbus_detect_application (cName, pProxy);
234
gboolean cairo_dock_dbus_detect_system_application (const gchar *cName)
236
cd_message ("%s (%s)", __func__, cName);
237
DBusGProxy *pProxy = cairo_dock_get_main_system_proxy ();
238
return _dbus_detect_application (cName, pProxy);
242
gchar **cairo_dock_dbus_get_services (void)
244
DBusGProxy *pProxy = cairo_dock_get_main_proxy ();
245
gchar **name_list = NULL;
246
if(dbus_g_proxy_call (pProxy, "ListNames", NULL,
258
gboolean cairo_dock_dbus_get_boolean (DBusGProxy *pDbusProxy, const gchar *cAccessor)
260
GError *erreur = NULL;
261
gboolean bValue = FALSE;
262
dbus_g_proxy_call (pDbusProxy, cAccessor, &erreur,
264
G_TYPE_BOOLEAN, &bValue,
268
cd_warning (erreur->message);
269
g_error_free (erreur);
274
int cairo_dock_dbus_get_integer (DBusGProxy *pDbusProxy, const gchar *cAccessor)
276
GError *erreur = NULL;
278
dbus_g_proxy_call (pDbusProxy, cAccessor, &erreur,
284
cd_warning (erreur->message);
285
g_error_free (erreur);
291
guint cairo_dock_dbus_get_uinteger (DBusGProxy *pDbusProxy, const gchar *cAccessor)
293
GError *erreur = NULL;
295
dbus_g_proxy_call (pDbusProxy, cAccessor, &erreur,
297
G_TYPE_UINT, &iValue,
301
cd_warning (erreur->message);
302
g_error_free (erreur);
308
gchar *cairo_dock_dbus_get_string (DBusGProxy *pDbusProxy, const gchar *cAccessor)
310
GError *erreur = NULL;
311
gchar *cValue = NULL;
312
dbus_g_proxy_call (pDbusProxy, cAccessor, &erreur,
314
G_TYPE_STRING, &cValue,
318
cd_warning (erreur->message);
319
g_error_free (erreur);
324
guchar *cairo_dock_dbus_get_uchar (DBusGProxy *pDbusProxy, const gchar *cAccessor)
326
GError *erreur = NULL;
327
guchar* uValue = NULL;
329
dbus_g_proxy_call (pDbusProxy, cAccessor, &erreur,
331
G_TYPE_UCHAR, &uValue,
335
cd_warning (erreur->message);
336
g_error_free (erreur);
342
gdouble cairo_dock_dbus_get_double (DBusGProxy *pDbusProxy, const gchar *cAccessor)
344
GError *erreur = NULL;
347
dbus_g_proxy_call (pDbusProxy, cAccessor, &erreur,
349
G_TYPE_DOUBLE, &fValue,
353
cd_warning (erreur->message);
354
g_error_free (erreur);
360
gchar **cairo_dock_dbus_get_string_list (DBusGProxy *pDbusProxy, const gchar *cAccessor)
362
GError *erreur = NULL;
363
gchar **cValues = NULL;
364
dbus_g_proxy_call (pDbusProxy, cAccessor, &erreur,
366
G_TYPE_POINTER, &cValues,
370
cd_warning (erreur->message);
371
g_error_free (erreur);
376
GPtrArray *cairo_dock_dbus_get_array (DBusGProxy *pDbusProxy, const gchar *cAccessor)
378
GError *erreur = NULL;
379
GPtrArray *pArray = NULL;
380
dbus_g_proxy_call (pDbusProxy, cAccessor, &erreur,
382
dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &pArray,
386
cd_warning (erreur->message);
387
g_error_free (erreur);
394
void cairo_dock_dbus_call (DBusGProxy *pDbusProxy, const gchar *cCommand)
396
dbus_g_proxy_call_no_reply (pDbusProxy, cCommand,
402
void cairo_dock_dbus_get_properties (DBusGProxy *pDbusProxy, const gchar *cCommand, const gchar *cInterface, const gchar *cProperty, GValue *vProperties)
406
dbus_g_proxy_call(pDbusProxy, cCommand, &erreur,
407
G_TYPE_STRING, cInterface,
408
G_TYPE_STRING, cProperty,
410
G_TYPE_VALUE, vProperties,
415
cd_warning (erreur->message);
416
g_error_free (erreur);
422
void cairo_dock_dbus_get_property_in_value (DBusGProxy *pDbusProxy, const gchar *cInterface, const gchar *cProperty, GValue *pProperty)
426
dbus_g_proxy_call(pDbusProxy, "Get", &erreur,
427
G_TYPE_STRING, cInterface,
428
G_TYPE_STRING, cProperty,
430
G_TYPE_VALUE, pProperty,
435
cd_warning (erreur->message);
436
g_error_free (erreur);
440
gboolean cairo_dock_dbus_get_property_as_boolean (DBusGProxy *pDbusProxy, const gchar *cInterface, const gchar *cProperty)
442
GValue v = G_VALUE_INIT;
443
cairo_dock_dbus_get_property_in_value (pDbusProxy, cInterface, cProperty, &v);
444
if (G_VALUE_HOLDS_BOOLEAN (&v))
445
return g_value_get_boolean (&v);
450
gint cairo_dock_dbus_get_property_as_int (DBusGProxy *pDbusProxy, const gchar *cInterface, const gchar *cProperty)
452
GValue v = G_VALUE_INIT;
453
cairo_dock_dbus_get_property_in_value (pDbusProxy, cInterface, cProperty, &v);
454
if (G_VALUE_HOLDS_INT (&v))
455
return g_value_get_int (&v);
460
guint cairo_dock_dbus_get_property_as_uint (DBusGProxy *pDbusProxy, const gchar *cInterface, const gchar *cProperty)
462
GValue v = G_VALUE_INIT;
463
cairo_dock_dbus_get_property_in_value (pDbusProxy, cInterface, cProperty, &v);
464
if (G_VALUE_HOLDS_UINT (&v))
465
return g_value_get_uint (&v);
470
guchar cairo_dock_dbus_get_property_as_uchar (DBusGProxy *pDbusProxy, const gchar *cInterface, const gchar *cProperty)
472
GValue v = G_VALUE_INIT;
473
cairo_dock_dbus_get_property_in_value (pDbusProxy, cInterface, cProperty, &v);
474
if (G_VALUE_HOLDS_UCHAR (&v))
475
return g_value_get_uchar (&v);
480
gdouble cairo_dock_dbus_get_property_as_double (DBusGProxy *pDbusProxy, const gchar *cInterface, const gchar *cProperty)
482
GValue v = G_VALUE_INIT;
483
cairo_dock_dbus_get_property_in_value (pDbusProxy, cInterface, cProperty, &v);
484
if (G_VALUE_HOLDS_DOUBLE (&v))
485
return g_value_get_double (&v);
490
gchar *cairo_dock_dbus_get_property_as_string (DBusGProxy *pDbusProxy, const gchar *cInterface, const gchar *cProperty)
492
GValue v = G_VALUE_INIT;
493
cairo_dock_dbus_get_property_in_value (pDbusProxy, cInterface, cProperty, &v);
494
if (G_VALUE_HOLDS_STRING (&v))
496
gchar *s = (gchar*)g_value_get_string (&v); // on recupere directement le contenu de la GValue. Comme on ne libere pas la GValue, la chaine est a liberer soi-meme quand on en n'a plus besoin.
503
gchar *cairo_dock_dbus_get_property_as_object_path (DBusGProxy *pDbusProxy, const gchar *cInterface, const gchar *cProperty)
505
GValue v = G_VALUE_INIT;
506
cairo_dock_dbus_get_property_in_value (pDbusProxy, cInterface, cProperty, &v);
507
if (G_VALUE_HOLDS (&v, DBUS_TYPE_G_OBJECT_PATH))
509
gchar *s = (gchar*)g_value_get_string (&v); // meme remarque.
516
gpointer cairo_dock_dbus_get_property_as_boxed (DBusGProxy *pDbusProxy, const gchar *cInterface, const gchar *cProperty)
518
GValue v = G_VALUE_INIT;
519
cairo_dock_dbus_get_property_in_value (pDbusProxy, cInterface, cProperty, &v);
520
if (G_VALUE_HOLDS_BOXED (&v))
522
gpointer p = g_value_get_boxed (&v); // meme remarque.
529
gchar **cairo_dock_dbus_get_property_as_string_list (DBusGProxy *pDbusProxy, const gchar *cInterface, const gchar *cProperty)
531
GValue v = G_VALUE_INIT;
532
cairo_dock_dbus_get_property_in_value (pDbusProxy, cInterface, cProperty, &v);
533
if (G_VALUE_HOLDS_BOXED(&v))
535
gchar **s = (gchar**)g_value_get_boxed (&v); // meme remarque.
542
GHashTable *cairo_dock_dbus_get_all_properties (DBusGProxy *pDbusProxy, const gchar *cInterface)
545
GHashTable *hProperties = NULL;
547
dbus_g_proxy_call(pDbusProxy, "GetAll", &erreur,
548
G_TYPE_STRING, cInterface,
550
(dbus_g_type_get_map("GHashTable", G_TYPE_STRING, G_TYPE_VALUE)), &hProperties,
555
cd_warning (erreur->message);
556
g_error_free (erreur);
566
void cairo_dock_dbus_set_property (DBusGProxy *pDbusProxy, const gchar *cInterface, const gchar *cProperty, GValue *pProperty)
570
dbus_g_proxy_call(pDbusProxy, "Set", &erreur,
571
G_TYPE_STRING, cInterface,
572
G_TYPE_STRING, cProperty,
573
G_TYPE_VALUE, pProperty,
579
cd_warning (erreur->message);
580
g_error_free (erreur);
584
void cairo_dock_dbus_set_boolean_property (DBusGProxy *pDbusProxy, const gchar *cInterface, const gchar *cProperty, gboolean bValue)
586
GValue v = G_VALUE_INIT;
587
g_value_init (&v, G_TYPE_BOOLEAN);
588
g_value_set_boolean (&v, bValue);
589
cairo_dock_dbus_set_property (pDbusProxy, cInterface, cProperty, &v);