5
* Copyright (C) 2007-2008 Intel Corporation
6
* Copyright (C) 2007-2009 Marcel Holtmann <marcel@holtmann.org>
5
* Copyright (C) 2007-2010 Intel Corporation
6
* Copyright (C) 2007-2010 Marcel Holtmann <marcel@holtmann.org>
9
9
* This program is free software; you can redistribute it and/or modify
118
static struct synce_context *find_context_by_conn_obj(const char *path)
122
for (l = context_list; l != NULL; l = l->next) {
123
struct synce_context *context = l->data;
125
if (strcmp(context->conn_obj, path) == 0)
132
119
static void append_dict_entry(DBusMessageIter *dict, const char *key,
133
120
int type, void *val)
141
128
dbus_message_iter_close_container(dict, &entry);
144
static void handle_connection_reply_signal(DBusMessage *msg,
145
const char *obj_path, void *data)
131
static gboolean reply_signal(DBusConnection *conn, DBusMessage *msg,
147
134
struct synce_context *context = data;
148
135
struct obex_session *os = context->os;
136
const char *path = dbus_message_get_path(msg);
149
137
DBusMessageIter iter, array_iter;
153
if (strcmp(context->conn_obj, obj_path) != 0)
141
if (strcmp(context->conn_obj, path) != 0)
156
144
dbus_message_iter_init(msg, &iter);
159
147
dbus_message_iter_get_fixed_array(&array_iter, &value, &length);
164
152
os->buf = g_malloc(length);
165
153
memcpy(os->buf, value, length);
167
155
os->finished = TRUE;
168
156
context->reply_received = TRUE;
169
157
OBEX_ResumeRequest(os->obex);
172
static void handle_connection_abort_signal(DBusMessage *msg,
173
const char *obj_path, void *data)
162
static gboolean abort_signal(DBusConnection *conn, DBusMessage *msg,
175
165
struct synce_context *context = data;
176
166
struct obex_session *os = context->os;
179
169
os->finished = TRUE;
180
170
OBEX_ResumeRequest(os->obex);
181
171
OBEX_TransportDisconnect(os->obex);
184
static DBusHandlerResult signal_filter(DBusConnection *conn,
185
DBusMessage *msg, void *data)
187
const char *path = dbus_message_get_path(msg);
188
struct synce_context *context;
190
if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
191
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
193
context = find_context_by_conn_obj(path);
195
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
197
if (dbus_message_is_signal(msg, SYNCE_CONN_INTERFACE, "Reply")) {
198
debug("Reply signal is received.");
199
handle_connection_reply_signal(msg, path, context);
200
} else if (dbus_message_is_signal(msg, SYNCE_CONN_INTERFACE, "Abort")) {
201
debug("Abort signal is received.");
202
handle_connection_abort_signal(msg, path, context);
205
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
208
176
static void connect_cb(DBusPendingCall *call, void *user_data)
210
static gboolean signal_filter_added = FALSE;
211
178
struct callback_data *cb_data = user_data;
212
179
obex_t *obex = cb_data->obex;
213
180
obex_object_t *obj = cb_data->obj;
240
207
debug("Got conn object %s from syncevolution", path);
241
208
context->conn_obj = g_strdup(path);
243
/* add signal filter */
244
if (!signal_filter_added) {
245
if (!dbus_connection_add_filter(conn, signal_filter,
247
error("Can't add signal filter");
248
dbus_message_unref(reply);
252
signal_filter_added = TRUE;
210
context->reply_watch = g_dbus_add_signal_watch(conn, NULL, path,
211
SYNCE_CONN_INTERFACE, "Reply",
212
reply_signal, context, NULL);
255
snprintf(match_string, sizeof(match_string), "type=signal,interface=%s,"
256
"path=%s", SYNCE_CONN_INTERFACE, context->conn_obj);
257
dbus_bus_add_match(conn, match_string, NULL);
258
dbus_connection_flush(conn);
214
context->abort_watch = g_dbus_add_signal_watch(conn, NULL, path,
215
SYNCE_CONN_INTERFACE, "Abort",
216
abort_signal, context, NULL);
260
218
dbus_message_unref(reply);
311
269
struct callback_data *cb_data;
312
270
struct synce_context *context;
314
conn = dbus_bus_get(DBUS_BUS_SESSION, NULL);
272
conn = obex_dbus_get_connection();
507
465
dbus_pending_call_unref(call);
510
snprintf(match_string, sizeof(match_string),
511
"type=signal,interface=%s,path=%s",
512
SYNCE_CONN_INTERFACE, context->conn_obj);
513
dbus_bus_remove_match(context->dbus_conn, match_string, NULL);
468
g_dbus_remove_watch(context->dbus_conn, context->reply_watch);
469
context->reply_watch = 0;
470
g_dbus_remove_watch(context->dbus_conn, context->abort_watch);
471
context->abort_watch = 0;
514
473
g_free(context->conn_obj);
515
474
context->conn_obj = NULL;