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
committerJohan Hedberg <johan.hedberg@intel.com>2011-07-16 17:50:43 +0300
commit4d2b05fe3e1911cb3e6448255520c33bb57ad108 (patch)
tree396ff7af3fa383ac35ae9a539ea32fe35bdaa0a3 /gobex/gobex-header.c
parente8710c0c79a00037c6eb04a33897c8d0e3131d62 (diff)
downloadobexd-4d2b05fe3e1911cb3e6448255520c33bb57ad108.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 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;