2
* @file geis_dbus_announcer.c
3
* @brief Implementation of the GEIS DBus announcer.
7
* Copyright 2011 Canonical Ltd.
9
* This library is free software; you can redistribute it and/or modify it under
10
* the terms of the GNU Lesser General Public License as published by the Free
11
* Software Foundation; either version 3 of the License, or (at your option) any
14
* This library is distributed in the hope that it will be useful, but WITHOUT
15
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
19
* You should have received a copy of the GNU General Public License
20
* along with this program. If not, see <http://www.gnu.org/licenses/>.
22
#include "geis_config.h"
23
#include "geis_dbus_announcer.h"
25
#include <dbus/dbus.h>
26
#include "geis_dbus.h"
31
struct GeisDBusAnnouncer
33
GeisDBusServer server;
34
DBusConnection *session_bus;
38
static void _unregister_messages(DBusConnection*, void*);
39
static DBusHandlerResult _dbus_messages(DBusConnection*, DBusMessage*, void*);
40
static DBusHandlerResult _geis_messages(DBusConnection*, DBusMessage*, void*);
42
static struct DBusObjectPathVTable _dbus_message_vtbl =
49
static struct DBusObjectPathVTable _geis_message_vtbl =
58
_unregister_messages(DBusConnection *connection GEIS_UNUSED,
59
void *user_data GEIS_UNUSED)
66
* Processes DBus metamessages.
68
static DBusHandlerResult
69
_dbus_messages(DBusConnection *connection GEIS_UNUSED,
71
void *user_data GEIS_UNUSED)
73
DBusHandlerResult result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
75
fprintf(stderr, "%s() begins\n", __FUNCTION__);
76
if (dbus_message_is_signal(message,
80
fprintf(stderr, "%s() .. name acquired!\n", __FUNCTION__);
83
fprintf(stderr, "%s() ends\n", __FUNCTION__);
89
* Processes GEIS messages.
91
static DBusHandlerResult
92
_geis_messages(DBusConnection *connection,
96
DBusHandlerResult result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
97
GeisDBusAnnouncer announcer = (GeisDBusAnnouncer)user_data;
99
fprintf(stderr, "%s begins\n", __FUNCTION__);
100
if (dbus_message_is_method_call(message,
101
GEIS_DBUS_SERVICE_INTERFACE,
102
GEIS_DBUS_GET_SERVER_ADDRESS))
104
char *server_addr = geis_dbus_server_address(announcer->server);
105
DBusMessage *reply = dbus_message_new_method_return(message);
106
dbus_message_append_args(reply,
107
DBUS_TYPE_STRING, &server_addr,
109
dbus_connection_send(connection, reply, NULL);
110
dbus_message_unref(reply);
111
dbus_free(server_addr);
112
result = DBUS_HANDLER_RESULT_HANDLED;
115
fprintf(stderr, "%s ends\n", __FUNCTION__);
121
* Adds the announcer watches to the dispatcher watch list.
124
_announcer_add_watch(DBusWatch *watch, void *data)
126
dbus_bool_t status = TRUE;
127
int fd = dbus_watch_get_unix_fd(watch);
128
dbus_bool_t is_enabled = dbus_watch_get_enabled(watch);
129
unsigned int flags = dbus_watch_get_flags(watch);
130
GeisDBusAnnouncer announcer = (GeisDBusAnnouncer)data;
132
fprintf(stdout, "%s() watch=%p fd=%d is_enabled=%d flags=%d\n",
133
__FUNCTION__, (void *)watch, fd, is_enabled, flags);
135
geis_dbus_dispatcher_register(geis_dbus_server_dispatcher(announcer->server),
136
announcer->session_bus,
143
* Toggles the enabled/disabled status of the announcer watches.
146
_announcer_toggle_watch(DBusWatch *watch, void *data)
148
int fd = dbus_watch_get_unix_fd(watch);
149
dbus_bool_t is_enabled = dbus_watch_get_enabled(watch);
150
GeisDBusAnnouncer announcer = (GeisDBusAnnouncer)data;
152
fprintf(stdout, "%s watch=%p fd=%d is_enabled=%d\n",
153
__FUNCTION__, (void *)watch, fd, is_enabled);
154
geis_dbus_dispatcher_toggle_watch(geis_dbus_server_dispatcher(announcer->server),
160
* Removes the announcer watches from the dispatcher watch list.
163
_announcer_remove_watch(DBusWatch *watch, void *data)
165
int fd = dbus_watch_get_unix_fd(watch);
166
unsigned int flags = dbus_watch_get_flags(watch);
167
GeisDBusAnnouncer announcer = (GeisDBusAnnouncer)data;
169
fprintf(stdout, "%s fd=%d flags=%d\n", __FUNCTION__, fd, flags);
170
geis_dbus_dispatcher_unregister(geis_dbus_server_dispatcher(announcer->server),
176
* Creates a new GeisDBusAnouncer object.
179
geis_dbus_announcer_new(GeisDBusServer server)
182
GeisDBusAnnouncer announcer = NULL;
184
fprintf(stderr, "%s begins\n", __FUNCTION__);
185
announcer = calloc(1, sizeof(struct GeisDBusAnnouncer));
189
announcer->server = server;
191
dbus_error_init(&error);
192
announcer->session_bus = dbus_bus_get(DBUS_BUS_SESSION, &error);
193
if (!announcer->session_bus || dbus_error_is_set(&error))
196
sprintf(msg, "error %s connecting to session bus: %s",
197
error.name, error.message);
198
fprintf(stderr, "%s: %s\n", __FUNCTION__, msg);
202
dbus_connection_set_watch_functions(announcer->session_bus,
203
_announcer_add_watch,
204
_announcer_remove_watch,
205
_announcer_toggle_watch,
208
dbus_connection_register_object_path(announcer->session_bus,
213
dbus_connection_register_object_path(announcer->session_bus,
214
GEIS_DBUS_SERVICE_PATH,
218
dbus_bus_request_name(announcer->session_bus,
219
GEIS_DBUS_SERVICE_INTERFACE,
220
DBUS_NAME_FLAG_REPLACE_EXISTING,
222
if (dbus_error_is_set(&error))
224
fprintf(stderr, "error requesting Server name\n");
229
dbus_error_free(&error);
231
fprintf(stderr, "%s ends\n", __FUNCTION__);
237
* Destroys a %GeisDBusAnnouncer object.
240
geis_dbus_announcer_delete(GeisDBusAnnouncer announcer)
242
fprintf(stderr, "%s() begins\n", __FUNCTION__);
245
fprintf(stderr, "%s() freeing announcer\n", __FUNCTION__);
246
if (announcer->session_bus)
248
fprintf(stderr, "%s() unreffing session bus\n", __FUNCTION__);
249
dbus_connection_unref(announcer->session_bus);
251
fprintf(stderr, "%s() freeing announcer\n", __FUNCTION__);
254
fprintf(stderr, "%s() ends\n", __FUNCTION__);