summaryrefslogtreecommitdiff
path: root/obexd/client/transfer.c
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2012-09-12 14:28:31 +0300
committerMarcel Holtmann <marcel@holtmann.org>2012-12-04 22:49:05 +0100
commit36d387af615a9f21c42c503c10f22cf41559313c (patch)
tree7c6622558e922554e9c0e3f9f1b645fae7584393 /obexd/client/transfer.c
parentd1db67a33b2fe272cf50b540140551896e07ae46 (diff)
downloadbluez-36d387af615a9f21c42c503c10f22cf41559313c.tar.gz
obexd: Avoid extra copies while passing apparam to transfer
By passing directly the reference to GObexApparam it is no longer necessary to use intermediate buffers to pass data around.
Diffstat (limited to 'obexd/client/transfer.c')
-rw-r--r--obexd/client/transfer.c69
1 files changed, 23 insertions, 46 deletions
diff --git a/obexd/client/transfer.c b/obexd/client/transfer.c
index e9fabfb01..bd5277b5d 100644
--- a/obexd/client/transfer.c
+++ b/obexd/client/transfer.c
@@ -57,15 +57,10 @@ struct transfer_callback {
void *data;
};
-struct obc_transfer_params {
- void *data;
- size_t size;
-};
-
struct obc_transfer {
GObex *obex;
+ GObexApparam *apparam;
guint8 op;
- struct obc_transfer_params *params;
struct transfer_callback *callback;
DBusConnection *conn;
DBusMessage *msg;
@@ -273,10 +268,8 @@ static void obc_transfer_free(struct obc_transfer *transfer)
if (transfer->fd > 0)
close(transfer->fd);
- if (transfer->params != NULL) {
- g_free(transfer->params->data);
- g_free(transfer->params);
- }
+ if (transfer->apparam != NULL)
+ g_obex_apparam_free(transfer->apparam);
if (transfer->conn)
dbus_connection_unref(transfer->conn);
@@ -529,6 +522,7 @@ static void get_xfer_progress_first(GObex *obex, GError *err, GObexPacket *rsp,
struct obc_transfer *transfer = user_data;
GObexPacket *req;
GObexHeader *hdr;
+ GObexApparam *apparam;
const guint8 *buf;
gsize len;
guint8 rspcode;
@@ -550,17 +544,9 @@ static void get_xfer_progress_first(GObex *obex, GError *err, GObexPacket *rsp,
hdr = g_obex_packet_get_header(rsp, G_OBEX_HDR_APPARAM);
if (hdr) {
- g_obex_header_get_bytes(hdr, &buf, &len);
- if (len != 0) {
- if (transfer->params == NULL)
- transfer->params =
- g_new0(struct obc_transfer_params, 1);
- else
- g_free(transfer->params->data);
-
- transfer->params->data = g_memdup(buf, len);
- transfer->params->size = len;
- }
+ apparam = g_obex_header_get_apparam(hdr);
+ if (apparam != NULL)
+ obc_transfer_set_apparam(transfer, apparam);
}
hdr = g_obex_packet_get_body(rsp);
@@ -642,6 +628,7 @@ static gboolean report_progress(gpointer data)
static gboolean transfer_start_get(struct obc_transfer *transfer, GError **err)
{
GObexPacket *req;
+ GObexHeader *hdr;
if (transfer->xfer > 0) {
g_set_error(err, OBC_TRANSFER_ERROR, -EALREADY,
@@ -659,10 +646,10 @@ static gboolean transfer_start_get(struct obc_transfer *transfer, GError **err)
g_obex_packet_add_bytes(req, G_OBEX_HDR_TYPE, transfer->type,
strlen(transfer->type) + 1);
- if (transfer->params != NULL)
- g_obex_packet_add_bytes(req, G_OBEX_HDR_APPARAM,
- transfer->params->data,
- transfer->params->size);
+ if (transfer->apparam != NULL) {
+ hdr = g_obex_header_new_apparam(transfer->apparam);
+ g_obex_packet_add_header(req, hdr);
+ }
transfer->xfer = g_obex_send_req(transfer->obex, req,
FIRST_PACKET_TIMEOUT,
@@ -683,6 +670,7 @@ static gboolean transfer_start_get(struct obc_transfer *transfer, GError **err)
static gboolean transfer_start_put(struct obc_transfer *transfer, GError **err)
{
GObexPacket *req;
+ GObexHeader *hdr;
if (transfer->xfer > 0) {
g_set_error(err, OBC_TRANSFER_ERROR, -EALREADY,
@@ -703,10 +691,10 @@ static gboolean transfer_start_put(struct obc_transfer *transfer, GError **err)
if (transfer->size < UINT32_MAX)
g_obex_packet_add_uint32(req, G_OBEX_HDR_LENGTH, transfer->size);
- if (transfer->params != NULL)
- g_obex_packet_add_bytes(req, G_OBEX_HDR_APPARAM,
- transfer->params->data,
- transfer->params->size);
+ if (transfer->apparam != NULL) {
+ hdr = g_obex_header_new_apparam(transfer->apparam);
+ g_obex_packet_add_header(req, hdr);
+ }
transfer->xfer = g_obex_put_req_pkt(transfer->obex, req,
put_xfer_progress, xfer_complete,
@@ -744,31 +732,20 @@ guint8 obc_transfer_get_operation(struct obc_transfer *transfer)
return transfer->op;
}
-void obc_transfer_set_params(struct obc_transfer *transfer,
- const void *data, size_t size)
+void obc_transfer_set_apparam(struct obc_transfer *transfer, void *data)
{
- if (transfer->params != NULL) {
- g_free(transfer->params->data);
- g_free(transfer->params);
- }
+ if (transfer->apparam != NULL)
+ g_obex_apparam_free(transfer->apparam);
if (data == NULL)
return;
- transfer->params = g_new0(struct obc_transfer_params, 1);
- transfer->params->data = g_memdup(data, size);
- transfer->params->size = size;
+ transfer->apparam = data;
}
-const void *obc_transfer_get_params(struct obc_transfer *transfer, size_t *size)
+void *obc_transfer_get_apparam(struct obc_transfer *transfer)
{
- if (transfer->params == NULL)
- return NULL;
-
- if (size != NULL)
- *size = transfer->params->size;
-
- return transfer->params->data;
+ return transfer->apparam;
}
int obc_transfer_get_contents(struct obc_transfer *transfer, char **contents,