diff options
author | Johan Hedberg <johan.hedberg@intel.com> | 2011-06-30 22:57:51 +0300 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2012-12-04 22:21:58 +0100 |
commit | ad811dd51eaee735446d7b53a37cdc1c3d029717 (patch) | |
tree | d34ac4cc8fd5f2df4db7ed5ed3cf08584f5fe316 /gobex/gobex-header.c | |
parent | a14e52b4712a0457fe79e41608f876f77b04f3c1 (diff) | |
download | bluez-ad811dd51eaee735446d7b53a37cdc1c3d029717.tar.gz |
gobex: Add support for on-demand headers
Diffstat (limited to 'gobex/gobex-header.c')
-rw-r--r-- | gobex/gobex-header.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/gobex/gobex-header.c b/gobex/gobex-header.c index ff24589f4..0ef5e240f 100644 --- a/gobex/gobex-header.c +++ b/gobex/gobex-header.c @@ -43,6 +43,9 @@ struct _GObexHeader { guint8 u8; guint32 u32; } v; + + GObexHeaderDataFunc get_data; + gpointer get_data_data; }; static glong utf8_to_utf16(gunichar2 **utf16, const char *utf8) { @@ -80,6 +83,20 @@ static const guint8 *get_bytes(void *to, const guint8 *from, gsize count) return (from + count); } +static gsize get_data(GObexHeader *header, guint8 *buf, gsize len) +{ + guint16 u16; + + header->vlen = header->get_data(header, buf + 2, len - 2, + header->get_data_data); + + header->hlen = header->vlen + 3; + u16 = g_htons(header->hlen); + memcpy(buf, &u16, sizeof(u16)); + + return header->hlen; +} + gsize g_obex_header_encode(GObexHeader *header, void *buf, gsize buf_len) { guint8 *ptr = buf; @@ -105,6 +122,9 @@ gsize g_obex_header_encode(GObexHeader *header, void *buf, gsize buf_len) g_free(utf16); break; case G_OBEX_HDR_TYPE_BYTES: + if (header->get_data) + return get_data(header, ptr, buf_len - 1); + u16 = g_htons(header->hlen); ptr = put_bytes(ptr, &u16, sizeof(u16)); if (header->extdata) @@ -362,6 +382,24 @@ GObexHeader *g_obex_header_new_bytes(guint8 id, void *data, gsize len, return header; } +GObexHeader *g_obex_header_new_on_demand(guint8 id, GObexHeaderDataFunc func, + gpointer user_data) +{ + GObexHeader *header; + + if (G_OBEX_HDR_TYPE(id) != G_OBEX_HDR_TYPE_BYTES) + return NULL; + + header = g_new0(GObexHeader, 1); + + header->id = id; + header->hlen = 3; + header->get_data = func; + header->get_data_data = user_data; + + return header; +} + GObexHeader *g_obex_header_new_uint8(guint8 id, guint8 val) { GObexHeader *header; |