summaryrefslogtreecommitdiff
path: root/gobex/gobex-header.c
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2011-06-30 22:57:51 +0300
committerMarcel Holtmann <marcel@holtmann.org>2012-12-04 22:21:58 +0100
commitad811dd51eaee735446d7b53a37cdc1c3d029717 (patch)
treed34ac4cc8fd5f2df4db7ed5ed3cf08584f5fe316 /gobex/gobex-header.c
parenta14e52b4712a0457fe79e41608f876f77b04f3c1 (diff)
downloadbluez-ad811dd51eaee735446d7b53a37cdc1c3d029717.tar.gz
gobex: Add support for on-demand headers
Diffstat (limited to 'gobex/gobex-header.c')
-rw-r--r--gobex/gobex-header.c38
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;