From a1824acc4d83d90bf4fd3c7d1f2474ea1a98f40f Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Mon, 27 Jun 2011 00:16:07 +0300 Subject: [PATCH] gobex: Add g_obex_packet_set_data for non-header data --- gobex/gobex.c | 44 ++++++++++++++++++++++++++++++-------------- gobex/gobex.h | 3 ++- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/gobex/gobex.c b/gobex/gobex.c index b7a825de4..3874f1be2 100644 --- a/gobex/gobex.c +++ b/gobex/gobex.c @@ -368,6 +368,30 @@ gboolean g_obex_packet_add_header(GObexPacket *pkt, GObexHeader *header) return TRUE; } +gboolean g_obex_packet_set_data(GObexPacket *pkt, const void *data, size_t len, + GObexDataPolicy data_policy) +{ + if (pkt->data.buf || pkt->data.buf_ref) + return FALSE; + + pkt->data_policy = data_policy; + pkt->data_len = len; + + switch (data_policy) { + case G_OBEX_DATA_COPY: + pkt->data.buf = g_memdup(data, len); + break; + case G_OBEX_DATA_REF: + pkt->data.buf_ref = data; + break; + case G_OBEX_DATA_INHERIT: + pkt->data.buf = (void *) data; + break; + } + + return TRUE; +} + GObexPacket *g_obex_packet_new(guint8 opcode) { GObexPacket *pkt; @@ -462,27 +486,19 @@ GObexPacket *g_obex_packet_decode(const void *data, size_t len, pkt = g_obex_packet_new(opcode); - pkt->data_policy = data_policy; - if (header_offset == 0) goto headers; if (3 + header_offset < (ssize_t) len) goto failed; - pkt->data_len = header_offset; - switch (data_policy) { - case G_OBEX_DATA_COPY: - pkt->data.buf = g_malloc(header_offset); - buf = get_bytes(pkt->data.buf, buf, header_offset); - break; - case G_OBEX_DATA_REF: - pkt->data.buf_ref = buf; - buf += header_offset; - break; - default: + if (data_policy == G_OBEX_DATA_INHERIT) goto failed; - } + + if (!g_obex_packet_set_data(pkt, buf, header_offset, data_policy)) + goto failed; + + buf += header_offset; headers: if (!parse_headers(pkt, buf, len - (buf - (guint8 *) data), diff --git a/gobex/gobex.h b/gobex/gobex.h index 2b52ef2c9..7b736cae5 100644 --- a/gobex/gobex.h +++ b/gobex/gobex.h @@ -84,7 +84,8 @@ GObexHeader *g_obex_header_decode(const void *data, size_t len, void g_obex_header_free(GObexHeader *header); gboolean g_obex_packet_add_header(GObexPacket *req, GObexHeader *header); - +gboolean g_obex_packet_set_data(GObexPacket *pkt, const void *data, size_t len, + GObexDataPolicy data_policy); GObexPacket *g_obex_packet_new(guint8 opcode); void g_obex_packet_free(GObexPacket *req); -- 2.47.3