Diff between 0e858224b19f9b1809bfc48f26e9cb490bb4e860 and 352a739a897f4575c21fd520288574302a54cb8d

Changed Files

File Additions Deletions Status
gobex/gobex.c +17 -6 modified
gobex/gobex.h +8 -2 modified
unit/test-gobex.c +16 -12 modified

Full Patch

diff --git a/gobex/gobex.c b/gobex/gobex.c
index e432eb5..428fbda 100644
--- a/gobex/gobex.c
+++ b/gobex/gobex.c
@@ -140,7 +140,7 @@ size_t g_obex_header_encode(GObexHeader *header, void *buf, size_t buf_len)
 }
 
 GObexHeader *g_obex_header_decode(const void *data, size_t len,
-						gboolean copy, size_t *parsed)
+				GObexDataPolicy data_policy, size_t *parsed)
 {
 	GObexHeader *header;
 	const guint8 *ptr = data;
@@ -186,11 +186,16 @@ GObexHeader *g_obex_header_decode(const void *data, size_t len,
 		header->vlen = hdr_len - 3;
 		header->hlen = hdr_len;
 
-		if (copy)
+		switch (data_policy) {
+		case G_OBEX_DATA_COPY:
 			header->v.data = g_memdup(ptr, header->vlen);
-		else {
+			break;
+		case G_OBEX_DATA_REF:
 			header->extdata = TRUE;
 			header->v.extdata = ptr;
+			break;
+		default:
+			goto failed;
 		}
 
 		*parsed = hdr_len;
@@ -264,7 +269,7 @@ GObexHeader *g_obex_header_unicode(guint8 id, const char *str)
 }
 
 GObexHeader *g_obex_header_bytes(guint8 id, void *data, size_t len,
-							gboolean copy_data)
+						GObexDataPolicy data_policy)
 {
 	GObexHeader *header;
 
@@ -277,11 +282,17 @@ GObexHeader *g_obex_header_bytes(guint8 id, void *data, size_t len,
 	header->vlen = len;
 	header->hlen = len + 3;
 
-	if (copy_data)
+	switch (data_policy) {
+	case G_OBEX_DATA_INHERIT:
+		header->v.data = data;
+		break;
+	case G_OBEX_DATA_COPY:
 		header->v.data = g_memdup(data, len);
-	else {
+		break;
+	case G_OBEX_DATA_REF:
 		header->extdata = TRUE;
 		header->v.extdata = data;
+		break;
 	}
 
 	return header;
diff --git a/gobex/gobex.h b/gobex/gobex.h
index cf79e26..ae34d48 100644
--- a/gobex/gobex.h
+++ b/gobex/gobex.h
@@ -62,19 +62,25 @@
 #define G_OBEX_HDR_ID_SRM		0x97
 #define G_OBEX_HDR_ID_SRM_FLAGS		0x98
 
+typedef enum {
+	G_OBEX_DATA_INHERIT,
+	G_OBEX_DATA_COPY,
+	G_OBEX_DATA_REF,
+} GObexDataPolicy;
+
 typedef struct _GObex GObex;
 typedef struct _GObexRequest GObexRequest;
 typedef struct _GObexHeader GObexHeader;
 
 GObexHeader *g_obex_header_unicode(guint8 id, const char *str);
 GObexHeader *g_obex_header_bytes(guint8 id, void *data, size_t len,
-							gboolean copy_data);
+						GObexDataPolicy data_policy);
 GObexHeader *g_obex_header_uint8(guint8 id, guint8 val);
 GObexHeader *g_obex_header_uint32(guint8 id, guint32 val);
 
 size_t g_obex_header_encode(GObexHeader *header, void *hdr_ptr, size_t buf_len);
 GObexHeader *g_obex_header_decode(const void *data, size_t len,
-						gboolean copy, size_t *parsed);
+				GObexDataPolicy data_policy, size_t *parsed);
 void g_obex_header_free(GObexHeader *header);
 
 gboolean g_obex_request_add_header(GObexRequest *req, GObexHeader *header);
diff --git a/unit/test-gobex.c b/unit/test-gobex.c
index d1fd5f0..8504a7e 100644
--- a/unit/test-gobex.c
+++ b/unit/test-gobex.c
@@ -106,7 +106,7 @@ static void test_header_bytes(void)
 	size_t len;
 
 	header = g_obex_header_bytes(G_OBEX_HDR_ID_BODY, data, sizeof(data),
-									FALSE);
+							G_OBEX_DATA_REF);
 
 	g_assert(header != NULL);
 
@@ -155,7 +155,7 @@ static void parse_and_encode(uint8_t *buf, size_t buf_len)
 	uint8_t encoded[1024];
 	size_t len;
 
-	header = g_obex_header_decode(buf, buf_len, FALSE, &len);
+	header = g_obex_header_decode(buf, buf_len, G_OBEX_DATA_REF, &len);
 	g_assert(header != NULL);
 	g_assert_cmpuint(len, ==, buf_len);
 
@@ -197,7 +197,7 @@ static void test_parse_header_connid(void)
 	size_t parsed;
 
 	header = g_obex_header_decode(hdr_connid, sizeof(hdr_connid),
-							FALSE, &parsed);
+						G_OBEX_DATA_REF, &parsed);
 	g_assert(header != NULL);
 
 	g_assert_cmpuint(parsed, ==, sizeof(hdr_connid));
@@ -211,7 +211,7 @@ static void test_parse_header_name_ascii(void)
 	size_t parsed;
 
 	header = g_obex_header_decode(hdr_name_ascii, sizeof(hdr_name_ascii),
-							FALSE, &parsed);
+						G_OBEX_DATA_REF, &parsed);
 	g_assert(header != NULL);
 
 	g_assert_cmpuint(parsed, ==, sizeof(hdr_name_ascii));
@@ -225,7 +225,7 @@ static void test_parse_header_name_umlaut(void)
 	size_t parsed;
 
 	header = g_obex_header_decode(hdr_name_umlaut, sizeof(hdr_name_umlaut),
-							FALSE, &parsed);
+						G_OBEX_DATA_REF, &parsed);
 	g_assert(header != NULL);
 
 	g_assert_cmpuint(parsed, ==, sizeof(hdr_name_umlaut));
@@ -239,7 +239,7 @@ static void test_parse_header_body(void)
 	size_t parsed;
 
 	header = g_obex_header_decode(hdr_body, sizeof(hdr_body),
-							FALSE, &parsed);
+						G_OBEX_DATA_COPY, &parsed);
 	g_assert(header != NULL);
 
 	g_assert_cmpuint(parsed, ==, sizeof(hdr_body));
@@ -253,7 +253,7 @@ static void test_parse_header_body_extdata(void)
 	size_t parsed;
 
 	header = g_obex_header_decode(hdr_body, sizeof(hdr_body),
-							TRUE, &parsed);
+						G_OBEX_DATA_REF, &parsed);
 	g_assert(header != NULL);
 
 	g_assert_cmpuint(parsed, ==, sizeof(hdr_body));
@@ -267,7 +267,7 @@ static void test_parse_header_actionid(void)
 	size_t parsed;
 
 	header = g_obex_header_decode(hdr_actionid, sizeof(hdr_actionid),
-							FALSE, &parsed);
+						G_OBEX_DATA_REF, &parsed);
 	g_assert(header != NULL);
 
 	g_assert_cmpuint(parsed, ==, sizeof(hdr_actionid));
@@ -291,25 +291,29 @@ static void test_parse_header_multi(void)
 	g_byte_array_append(buf, hdr_actionid, sizeof(hdr_actionid));
 	g_byte_array_append(buf, hdr_body, sizeof(hdr_body));
 
-	header = g_obex_header_decode(buf->data, buf->len, FALSE, &parsed);
+	header = g_obex_header_decode(buf->data, buf->len, G_OBEX_DATA_REF,
+								&parsed);
 	g_assert(header != NULL);
 	g_assert_cmpuint(parsed, ==, sizeof(hdr_connid));
 	g_byte_array_remove_range(buf, 0, parsed);
 	g_obex_header_free(header);
 
-	header = g_obex_header_decode(buf->data, buf->len, FALSE, &parsed);
+	header = g_obex_header_decode(buf->data, buf->len, G_OBEX_DATA_REF,
+								&parsed);
 	g_assert(header != NULL);
 	g_assert_cmpuint(parsed, ==, sizeof(hdr_name_ascii));
 	g_byte_array_remove_range(buf, 0, parsed);
 	g_obex_header_free(header);
 
-	header = g_obex_header_decode(buf->data, buf->len, FALSE, &parsed);
+	header = g_obex_header_decode(buf->data, buf->len, G_OBEX_DATA_REF,
+								&parsed);
 	g_assert(header != NULL);
 	g_assert_cmpuint(parsed, ==, sizeof(hdr_actionid));
 	g_byte_array_remove_range(buf, 0, parsed);
 	g_obex_header_free(header);
 
-	header = g_obex_header_decode(buf->data, buf->len, FALSE, &parsed);
+	header = g_obex_header_decode(buf->data, buf->len, G_OBEX_DATA_REF,
+								&parsed);
 	g_assert(header != NULL);
 	g_assert_cmpuint(parsed, ==, sizeof(hdr_body));
 	g_byte_array_remove_range(buf, 0, parsed);