summaryrefslogtreecommitdiff
path: root/gobex/gobex-transfer.c
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2011-07-06 17:30:38 +0200
committerMarcel Holtmann <marcel@holtmann.org>2012-12-04 22:22:00 +0100
commit98703e92d1bcfe6c5d0129dad14697ad649997d2 (patch)
tree64955fb37e2a0ada07cb9fcebf9057322b8f2647 /gobex/gobex-transfer.c
parent6abdccbf94dd16c3c9d4619fd969826a02564105 (diff)
downloadbluez-98703e92d1bcfe6c5d0129dad14697ad649997d2.tar.gz
gobex: Add g_obex_get_rsp
Diffstat (limited to 'gobex/gobex-transfer.c')
-rw-r--r--gobex/gobex-transfer.c68
1 files changed, 65 insertions, 3 deletions
diff --git a/gobex/gobex-transfer.c b/gobex/gobex-transfer.c
index e41c8e9e6..6fe0e6ba7 100644
--- a/gobex/gobex-transfer.c
+++ b/gobex/gobex-transfer.c
@@ -269,11 +269,11 @@ static void transfer_abort_req(GObex *obex, GObexPacket *req, gpointer user_data
err = g_error_new(G_OBEX_ERROR, G_OBEX_ERROR_CANCELLED,
"Request was aborted");
- transfer_complete(transfer, err);
- g_error_free(err);
-
rsp = g_obex_packet_new(G_OBEX_RSP_SUCCESS, TRUE, NULL);
g_obex_send(obex, rsp, NULL);
+
+ transfer_complete(transfer, err);
+ g_error_free(err);
}
guint g_obex_put_rsp(GObex *obex, GObexPacket *req,
@@ -335,3 +335,65 @@ guint g_obex_get_req(GObex *obex, const char *type, const char *name,
return transfer->id;
}
+
+static gssize get_get_data(void *buf, gsize len, gpointer user_data)
+{
+ struct transfer *transfer = user_data;
+ GObexPacket *req;
+ GError *err = NULL;
+ gssize ret;
+
+ ret = transfer->data_producer(buf, len, transfer->user_data);
+ if (ret >= 0)
+ return ret;
+
+ req = g_obex_packet_new(G_OBEX_RSP_INTERNAL_SERVER_ERROR, TRUE, NULL);
+ g_obex_send(transfer->obex, req, NULL);
+
+ err = g_error_new(G_OBEX_ERROR, G_OBEX_ERROR_CANCELLED,
+ "Data producer function failed");
+ transfer_complete(transfer, err);
+ g_error_free(err);
+
+ return ret;
+}
+
+static void transfer_get_req(GObex *obex, GObexPacket *req, gpointer user_data)
+{
+ struct transfer *transfer = user_data;
+ GError *err = NULL;
+ GObexPacket *rsp;
+
+ rsp = g_obex_packet_new(G_OBEX_RSP_CONTINUE, TRUE, NULL);
+ g_obex_packet_add_body(req, get_get_data, transfer);
+
+ if (!g_obex_send(obex, rsp, &err)) {
+ transfer_complete(transfer, err);
+ g_error_free(err);
+ }
+}
+
+guint g_obex_get_rsp(GObex *obex, GObexPacket *req,
+ GObexDataProducer data_func, GObexFunc complete_func,
+ gpointer user_data, GError **err)
+{
+ struct transfer *transfer;
+ gint id;
+
+ transfer = transfer_new(obex, G_OBEX_OP_GET, complete_func, user_data);
+ transfer->data_producer = data_func;
+
+ transfer_put_req(obex, req, transfer);
+ if (!g_slist_find(transfers, transfer))
+ return 0;
+
+ id = g_obex_add_request_function(obex, G_OBEX_OP_GET, transfer_get_req,
+ transfer);
+ transfer->get_id = id;
+
+ id = g_obex_add_request_function(obex, G_OBEX_OP_ABORT,
+ transfer_abort_req, transfer);
+ transfer->abort_id = id;
+
+ return transfer->id;
+}