diff options
author | Johan Hedberg <johan.hedberg@intel.com> | 2011-07-06 17:30:38 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2012-12-04 22:22:00 +0100 |
commit | 98703e92d1bcfe6c5d0129dad14697ad649997d2 (patch) | |
tree | 64955fb37e2a0ada07cb9fcebf9057322b8f2647 /gobex/gobex-transfer.c | |
parent | 6abdccbf94dd16c3c9d4619fd969826a02564105 (diff) | |
download | bluez-98703e92d1bcfe6c5d0129dad14697ad649997d2.tar.gz |
gobex: Add g_obex_get_rsp
Diffstat (limited to 'gobex/gobex-transfer.c')
-rw-r--r-- | gobex/gobex-transfer.c | 68 |
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; +} |