diff options
author | Johan Hedberg <johan.hedberg@intel.com> | 2011-06-30 22:57:51 +0300 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2011-07-16 17:50:43 +0300 |
commit | 4d2b05fe3e1911cb3e6448255520c33bb57ad108 (patch) | |
tree | 396ff7af3fa383ac35ae9a539ea32fe35bdaa0a3 /gobex/gobex-header.c | |
parent | e8710c0c79a00037c6eb04a33897c8d0e3131d62 (diff) | |
download | obexd-4d2b05fe3e1911cb3e6448255520c33bb57ad108.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 ff24589..0ef5e24 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; |