1215
1198
g_free(callback);
1201
static void put_xfer_progress(GwObexXfer *xfer, gpointer user_data)
1203
struct session_data *session = user_data;
1207
if (session->buffer_len == 0) {
1208
session->buffer_len = DEFAULT_BUFFER_SIZE;
1209
session->buffer = g_new0(char, DEFAULT_BUFFER_SIZE);
1212
len = read(session->fd, session->buffer + session->filled,
1213
session->buffer_len - session->filled);
1217
if (gw_obex_xfer_write(xfer, session->buffer, session->filled + len,
1218
&written, NULL) == FALSE)
1221
if (gw_obex_xfer_flush(xfer, NULL) == FALSE)
1224
session->filled = (session->filled + len) - written;
1226
memmove(session->buffer, session->buffer + written, session->filled);
1228
session->transferred += written;
1230
agent_notify_progress(session->conn, session->agent_name,
1231
session->agent_path, session->transfer_path,
1232
session->transferred);
1237
agent_notify_complete(session->conn, session->agent_name,
1238
session->agent_path, session->transfer_path);
1240
agent_notify_error(session->conn, session->agent_name,
1241
session->agent_path, session->transfer_path,
1242
"Error sending object");
1244
unregister_transfer(session);
1246
if (session->pending->len > 0) {
1247
gchar *filename = g_ptr_array_index(session->pending, 0);
1248
gchar *basename = g_path_get_basename(filename);
1250
g_ptr_array_remove(session->pending, filename);
1252
session_send(session, filename, basename);
1257
session_unref(session);
1260
static void agent_request_reply(DBusPendingCall *call, gpointer user_data)
1262
struct pending_request *pending = user_data;
1263
struct session_data *session = pending->session;
1264
DBusMessage *reply = dbus_pending_call_steal_reply(call);
1268
dbus_error_init(&derr);
1269
if (dbus_set_error_from_message(&derr, reply)) {
1270
error("Replied with an error: %s, %s",
1271
derr.name, derr.message);
1272
dbus_error_free(&derr);
1276
dbus_message_get_args(reply, NULL,
1277
DBUS_TYPE_STRING, &name,
1281
g_free(session->name);
1282
session->name = g_strdup(name);
1285
if (pending->callback(session, pending->data))
1293
unregister_transfer(session);
1295
session_unref(session);
1297
if (session->pending->len > 0) {
1298
gchar *filename = g_ptr_array_index(session->pending, 0);
1299
gchar *basename = g_path_get_basename(filename);
1301
g_ptr_array_remove(session->pending, filename);
1303
session_send(session, filename, basename);
1311
static void agent_request(DBusConnection *conn, struct session_data *session,
1312
reply_callback_t cb, void *user_data)
1314
DBusMessage *message;
1315
DBusPendingCall *call;
1316
struct pending_request *pending;
1318
if (session->agent_name == NULL || session->agent_path == NULL ||
1319
session->transfer_path == NULL) {
1320
if (cb(session, user_data))
1326
message = dbus_message_new_method_call(session->agent_name,
1327
session->agent_path, AGENT_INTERFACE, "Request");
1329
dbus_message_append_args(message,
1330
DBUS_TYPE_OBJECT_PATH, &session->transfer_path,
1333
if (!dbus_connection_send_with_reply(conn, message, &call, -1)) {
1334
dbus_message_unref(message);
1338
dbus_message_unref(message);
1340
pending = g_new0(struct pending_request, 1);
1341
pending->session = session;
1342
pending->callback = cb;
1343
pending->data = user_data;
1345
dbus_pending_call_set_notify(call, agent_request_reply, pending, NULL);
1346
dbus_pending_call_unref(call);
1351
unregister_transfer(session);
1353
session_unref(session);
1356
static int session_get_reply(struct session_data *session, void *data)
1358
struct get_params *params = data;
1359
struct callback_data *callback;
1362
xfer = gw_obex_get_async_with_apparam(session->obex, session->filename,
1363
params->type, params->apparam, params->apparam_size,
1368
session_unref(session);
1373
callback = g_try_malloc0(sizeof(*callback));
1374
if (callback == NULL) {
1376
session_unref(session);
1377
gw_obex_xfer_free(xfer);
1382
callback->session = session;
1383
callback->func = params->func;
1385
if (params->type == NULL)
1386
gw_obex_xfer_set_callback(xfer, get_xfer_progress, callback);
1388
gw_obex_xfer_set_callback(xfer, get_xfer_listing_progress,
1391
session->xfer = xfer;
1393
agent_notify_progress(session->conn, session->agent_name,
1394
session->agent_path, session->transfer_path, 0);
1218
1401
int session_get(struct session_data *session, const char *type,
1219
1402
const char *filename, const char *targetname,
1220
1403
const guint8 *apparam, gint apparam_size,
1221
1404
session_callback_t func)
1223
struct callback_data *callback;
1406
struct get_params *params;
1225
1407
int err, fd = 0;
1227
1409
if (session->obex == NULL)
1258
1441
session_ref(session);
1260
xfer = gw_obex_get_async_with_apparam(session->obex,
1261
filename, type, apparam, apparam_size, NULL);
1264
session_unref(session);
1268
callback = g_try_malloc0(sizeof(*callback));
1269
if (callback == NULL) {
1271
session_unref(session);
1272
gw_obex_xfer_free(xfer);
1276
callback->session = session;
1277
callback->func = func;
1280
gw_obex_xfer_set_callback(xfer, get_xfer_progress, callback);
1282
gw_obex_xfer_set_callback(xfer, get_xfer_listing_progress,
1285
session->xfer = xfer;
1287
agent_request(session->conn, session->agent_name,
1288
session->agent_path, session->transfer_path);
1290
agent_notify_progress(session->conn, session->agent_name,
1291
session->agent_path, session->transfer_path, 0);
1443
params = g_new0(struct get_params, 1);
1444
params->type = type;
1445
params->apparam = apparam;
1446
params->apparam_size = apparam_size;
1447
params->func = func;
1449
agent_request(session->conn, session, session_get_reply, params);
1461
static void put_xfer_progress(GwObexXfer *xfer, gpointer user_data)
1620
static int session_send_reply(struct session_data *session, void *data)
1463
struct session_data *session = user_data;
1467
if (session->buffer_len == 0) {
1468
session->buffer_len = DEFAULT_BUFFER_SIZE;
1469
session->buffer = g_new0(char, DEFAULT_BUFFER_SIZE);
1472
len = read(session->fd, session->buffer + session->filled,
1473
session->buffer_len - session->filled);
1477
if (gw_obex_xfer_write(xfer, session->buffer, session->filled + len,
1478
&written, NULL) == FALSE)
1481
if (gw_obex_xfer_flush(xfer, NULL) == FALSE)
1484
session->filled = (session->filled + len) - written;
1486
memmove(session->buffer + written, session->buffer, session->filled);
1488
session->transferred += written;
1624
xfer = gw_obex_put_async(session->obex, session->name, NULL,
1625
session->size, -1, NULL);
1629
gw_obex_xfer_set_callback(xfer, put_xfer_progress, session);
1631
session->xfer = xfer;
1490
1633
agent_notify_progress(session->conn, session->agent_name,
1491
session->agent_path, session->transfer_path,
1492
session->transferred);
1497
agent_notify_complete(session->conn, session->agent_name,
1498
session->agent_path, session->transfer_path);
1500
agent_notify_error(session->conn, session->agent_name,
1501
session->agent_path, session->transfer_path,
1502
"Error sending object");
1504
unregister_transfer(session);
1506
if (session->pending->len > 0) {
1507
gchar *filename = g_ptr_array_index(session->pending, 0);
1508
gchar *basename = g_path_get_basename(filename);
1510
g_ptr_array_remove(session->pending, filename);
1512
session_send(session, filename, basename);
1517
session_unref(session);
1634
session->agent_path, session->transfer_path, 0);
1520
1639
int session_send(struct session_data *session, const char *filename,
1521
1640
const char *targetname)
1524
1642
struct stat st;
1527
1645
if (session->obex == NULL)
1528
1646
return -ENOTCONN;
1530
if (session->xfer != NULL) {
1648
if (session->transfer_path != NULL) {
1531
1649
g_ptr_array_add(session->pending, g_strdup(filename));
1653
session->transfer_path = register_transfer(session->conn, session);
1654
if (session->transfer_path == NULL) {
1535
1659
fd = open(filename, O_RDONLY);
1539
1665
if (fstat(fd, &st) < 0) {
1544
session->transfer_path = register_transfer(session->conn, session);
1545
if (session->transfer_path == NULL) {
1550
1671
session->fd = fd;
1556
1677
session_ref(session);
1558
xfer = gw_obex_put_async(session->obex, session->name, NULL,
1559
session->size, -1, NULL);
1563
gw_obex_xfer_set_callback(xfer, put_xfer_progress, session);
1565
session->xfer = xfer;
1567
agent_request(session->conn, session->agent_name,
1568
session->agent_path, session->transfer_path);
1570
agent_notify_progress(session->conn, session->agent_name,
1571
session->agent_path, session->transfer_path, 0);
1679
agent_request(session->conn, session, session_send_reply, NULL);
1684
agent_notify_error(session->conn, session->agent_name,
1685
session->agent_path, session->transfer_path,
1686
"Could not open file for sending");
1576
1691
int session_pull(struct session_data *session,
1711
1846
session->name = g_strdup(targetname);
1712
1847
session->buffer = buf;
1714
xfer = gw_obex_put_async(session->obex, session->name, NULL,
1715
session->size, -1, NULL);
1849
agent_request(session->conn, session, session_put_reply, NULL);
1854
int session_set_agent(struct session_data *session, const char *name,
1857
if (session == NULL)
1860
if (session->agent_name != NULL || session->agent_path != NULL)
1863
session->agent_name = g_strdup(name);
1864
session->agent_path = g_strdup(path);
1866
session->owner_watch = g_dbus_add_disconnect_watch(session->conn,
1867
session->owner, owner_disconnected,
1719
1870
session_ref(session);
1721
gw_obex_xfer_set_callback(xfer, put_buf_xfer_progress, session);
1723
session->xfer = xfer;
1725
agent_request(session->conn, session->agent_name,
1726
session->agent_path, session->transfer_path);
1728
agent_notify_progress(session->conn, session->agent_name,
1729
session->agent_path, session->transfer_path, 0);