Diff between 55b393abb056d2c0050276697b258189ac990a06 and 0302f8623031f6d07336985a7801a0ec48a612a2

Changed Files

File Additions Deletions Status
gobex/gobex.c +60 -0 modified
gobex/gobex.h +7 -0 modified
unit/test-gobex.c +93 -10 modified

Full Patch

diff --git a/gobex/gobex.c b/gobex/gobex.c
index 9232bf7..e778cdb 100644
--- a/gobex/gobex.c
+++ b/gobex/gobex.c
@@ -309,6 +309,52 @@ void g_obex_header_free(GObexHeader *header)
 	g_free(header);
 }
 
+gboolean g_obex_header_get_unicode(GObexHeader *header, const char **str)
+{
+	if (G_OBEX_HDR_TYPE(header->id) != G_OBEX_HDR_TYPE_UNICODE)
+		return FALSE;
+
+	*str = header->v.string;
+
+	return TRUE;
+}
+
+gboolean g_obex_header_get_bytes(GObexHeader *header, const guint8 **val,
+								size_t *len)
+{
+	if (G_OBEX_HDR_TYPE(header->id) != G_OBEX_HDR_TYPE_BYTES)
+		return FALSE;
+
+	*len = header->vlen;
+
+	if (header->extdata)
+		*val = header->v.extdata;
+	else
+		*val = header->v.data;
+
+	return TRUE;
+}
+
+gboolean g_obex_header_get_uint8(GObexHeader *header, guint8 *val)
+{
+	if (G_OBEX_HDR_TYPE(header->id) != G_OBEX_HDR_TYPE_UINT8)
+		return FALSE;
+
+	*val = header->v.u8;
+
+	return TRUE;
+}
+
+gboolean g_obex_header_get_uint32(GObexHeader *header, guint32 *val)
+{
+	if (G_OBEX_HDR_TYPE(header->id) != G_OBEX_HDR_TYPE_UINT32)
+		return FALSE;
+
+	*val = header->v.u32;
+
+	return TRUE;
+}
+
 GObexHeader *g_obex_header_new_unicode(guint8 id, const char *str)
 {
 	GObexHeader *header;
@@ -394,6 +440,20 @@ GObexHeader *g_obex_header_new_uint32(guint8 id, guint32 val)
 	return header;
 }
 
+GObexHeader *g_obex_packet_get_header(GObexPacket *pkt, guint8 id)
+{
+	GSList *l;
+
+	for (l = pkt->headers; l != NULL; l = g_slist_next(l)) {
+		GObexHeader *hdr = l->data;
+
+		if (hdr->id == id)
+			return hdr;
+	}
+
+	return NULL;
+}
+
 guint g_obex_packet_set_response_function(GObexPacket *pkt,
 							GObexResponseFunc func,
 							gpointer user_data)
diff --git a/gobex/gobex.h b/gobex/gobex.h
index 7c60422..8536b49 100644
--- a/gobex/gobex.h
+++ b/gobex/gobex.h
@@ -81,6 +81,12 @@ typedef void (*GObexRequestFunc) (GObex *obex, GObexPacket *req,
 typedef void (*GObexResponseFunc) (GObex *obex, GError *err, GObexPacket *rsp,
 							gpointer user_data);
 
+gboolean g_obex_header_get_unicode(GObexHeader *header, const char **str);
+gboolean g_obex_header_get_bytes(GObexHeader *header, const guint8 **val,
+								size_t *len);
+gboolean g_obex_header_get_uint8(GObexHeader *header, guint8 *val);
+gboolean g_obex_header_get_uint32(GObexHeader *header, guint32 *val);
+
 GObexHeader *g_obex_header_new_unicode(guint8 id, const char *str);
 GObexHeader *g_obex_header_new_bytes(guint8 id, void *data, size_t len,
 						GObexDataPolicy data_policy);
@@ -92,6 +98,7 @@ GObexHeader *g_obex_header_decode(const void *data, size_t len,
 				GObexDataPolicy data_policy, size_t *parsed);
 void g_obex_header_free(GObexHeader *header);
 
+GObexHeader *g_obex_packet_get_header(GObexPacket *pkt, guint8 id);
 guint g_obex_packet_set_response_function(GObexPacket *pkt,
 							GObexResponseFunc func,
 							gpointer user_data);
diff --git a/unit/test-gobex.c b/unit/test-gobex.c
index f2c327a..00ec323 100644
--- a/unit/test-gobex.c
+++ b/unit/test-gobex.c
@@ -71,7 +71,7 @@ static GObex *create_gobex(int fd, GObexTransportType transport_type,
 	return g_obex_new(io, transport_type);
 }
 
-static void dump_bytes(uint8_t *buf, size_t buf_len)
+static void dump_bytes(const uint8_t *buf, size_t buf_len)
 {
 	size_t i;
 
@@ -81,7 +81,8 @@ static void dump_bytes(uint8_t *buf, size_t buf_len)
 	g_printerr("\n");
 }
 
-static void dump_bufs(void *mem1, size_t len1, void *mem2, size_t len2)
+static void dump_bufs(const void *mem1, size_t len1,
+						const void *mem2, size_t len2)
 {
 	g_printerr("\nExpected: ");
 	dump_bytes(mem1, len1);
@@ -89,7 +90,8 @@ static void dump_bufs(void *mem1, size_t len1, void *mem2, size_t len2)
 	dump_bytes(mem2, len2);
 }
 
-static void assert_memequal(void *mem1, size_t len1, void *mem2, size_t len2)
+static void assert_memequal(const void *mem1, size_t len1,
+						const void *mem2, size_t len2)
 {
 	if (len1 == len2 && memcmp(mem1, mem2, len1) == 0)
 		return;
@@ -469,7 +471,29 @@ static void test_decode_pkt(void)
 	g_obex_packet_free(pkt);
 }
 
-static void parse_and_encode(uint8_t *buf, size_t buf_len)
+static void test_decode_pkt_header(void)
+{
+	GObexPacket *pkt;
+	GObexHeader *header;
+	gboolean ret;
+	uint8_t buf[] = { G_OBEX_OP_PUT, 0x00, 0x05,
+					G_OBEX_HDR_ID_ACTION, 0x00 };
+	guint8 val;
+
+	pkt = g_obex_packet_decode(buf, sizeof(buf), 0, G_OBEX_DATA_REF);
+	g_assert(pkt != NULL);
+
+	header = g_obex_packet_get_header(pkt, G_OBEX_HDR_ID_ACTION);
+	g_assert(header != NULL);
+
+	ret = g_obex_header_get_uint8(header, &val);
+	g_assert(ret == TRUE);
+	g_assert(val == 0x00);
+
+	g_obex_packet_free(pkt);
+}
+
+static GObexHeader *parse_and_encode(uint8_t *buf, size_t buf_len)
 {
 	GObexHeader *header;
 	uint8_t encoded[1024];
@@ -483,32 +507,89 @@ static void parse_and_encode(uint8_t *buf, size_t buf_len)
 
 	assert_memequal(buf, buf_len, encoded, len);
 
-	g_obex_header_free(header);
+	return header;
 }
 
 static void test_header_encode_connid(void)
 {
-	parse_and_encode(hdr_connid, sizeof(hdr_connid));
+	GObexHeader *header;
+	gboolean ret;
+	guint32 val;
+
+	header = parse_and_encode(hdr_connid, sizeof(hdr_connid));
+
+	ret = g_obex_header_get_uint32(header, &val);
+
+	g_assert(ret == TRUE);
+	g_assert(val == 0x01020304);
+
+	g_obex_header_free(header);
 }
 
 static void test_header_encode_name_ascii(void)
 {
-	parse_and_encode(hdr_name_ascii, sizeof(hdr_name_ascii));
+	GObexHeader *header;
+	const char *str;
+	gboolean ret;
+
+	header = parse_and_encode(hdr_name_ascii, sizeof(hdr_name_ascii));
+
+	ret = g_obex_header_get_unicode(header, &str);
+
+	g_assert(ret == TRUE);
+	g_assert_cmpstr(str, ==, "foo");
+
+	g_obex_header_free(header);
 }
 
 static void test_header_encode_name_umlaut(void)
 {
-	parse_and_encode(hdr_name_umlaut, sizeof(hdr_name_umlaut));
+	GObexHeader *header;
+	const char *str;
+	gboolean ret;
+
+	header = parse_and_encode(hdr_name_umlaut, sizeof(hdr_name_umlaut));
+
+	ret = g_obex_header_get_unicode(header, &str);
+
+	g_assert(ret == TRUE);
+	g_assert_cmpstr(str, ==, "åäö");
+
+	g_obex_header_free(header);
 }
 
 static void test_header_encode_body(void)
 {
-	parse_and_encode(hdr_body, sizeof(hdr_body));
+	GObexHeader *header;
+	guint8 expected[] = { 1, 2, 3, 4};
+	const guint8 *buf;
+	size_t len;
+	gboolean ret;
+
+	header = parse_and_encode(hdr_body, sizeof(hdr_body));
+
+	ret = g_obex_header_get_bytes(header, &buf, &len);
+
+	g_assert(ret == TRUE);
+	assert_memequal(expected, sizeof(expected), buf, len);
+
+	g_obex_header_free(header);
 }
 
 static void test_header_encode_actionid(void)
 {
-	parse_and_encode(hdr_actionid, sizeof(hdr_actionid));
+	GObexHeader *header;
+	gboolean ret;
+	guint8 val;
+
+	header = parse_and_encode(hdr_actionid, sizeof(hdr_actionid));
+
+	ret = g_obex_header_get_uint8(header, &val);
+
+	g_assert(ret == TRUE);
+	g_assert_cmpuint(val, ==, 0x00);
+
+	g_obex_header_free(header);
 }
 
 static void test_decode_header_connid(void)
@@ -732,6 +813,8 @@ int main(int argc, char *argv[])
 	g_test_add_func("/gobex/test_header_uint32", test_header_uint32);
 
 	g_test_add_func("/gobex/test_decode_pkt", test_decode_pkt);
+	g_test_add_func("/gobex/test_decode_pkt_header",
+						test_decode_pkt_header);
 
 	g_test_add_func("/gobex/test_recv_connect_stream",
 						test_recv_connect_stream);