summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2013-02-28 22:28:41 +0000
committerTed Ross <tross@apache.org>2013-02-28 22:28:41 +0000
commit6df331f948acb5e04461f0bb3edd7e6e616aa996 (patch)
treed438482af5cb3c67cbc689e7843b8549904b0698
parent814d2a1f90622cfa7f5a6ccf6dce25f9b6788368 (diff)
downloadqpid-python-6df331f948acb5e04461f0bb3edd7e6e616aa996.tar.gz
QPID-4613 - Added field accessors for length and copied content to dx_message_t.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1451398 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/extras/dispatch/include/qpid/dispatch/message.h3
-rw-r--r--qpid/extras/dispatch/src/message.c42
-rw-r--r--qpid/extras/dispatch/tests/message_test.c10
3 files changed, 53 insertions, 2 deletions
diff --git a/qpid/extras/dispatch/include/qpid/dispatch/message.h b/qpid/extras/dispatch/include/qpid/dispatch/message.h
index 41983c44a1..4c1b1920b5 100644
--- a/qpid/extras/dispatch/include/qpid/dispatch/message.h
+++ b/qpid/extras/dispatch/include/qpid/dispatch/message.h
@@ -112,6 +112,9 @@ int dx_message_check(dx_message_t *msg, dx_message_depth_t depth);
dx_field_iterator_t *dx_message_field_iterator(dx_message_t *msg, dx_message_field_t field);
dx_iovec_t *dx_message_field_iovec(dx_message_t *msg, dx_message_field_t field);
+ssize_t dx_message_field_length(dx_message_t *msg, dx_message_field_t field);
+ssize_t dx_message_field_copy(dx_message_t *msg, dx_message_field_t field, void *buffer);
+
pn_delivery_t *dx_message_inbound_delivery(dx_message_t *qm);
//
diff --git a/qpid/extras/dispatch/src/message.c b/qpid/extras/dispatch/src/message.c
index f66e79010c..c914c5ca7b 100644
--- a/qpid/extras/dispatch/src/message.c
+++ b/qpid/extras/dispatch/src/message.c
@@ -800,6 +800,8 @@ dx_iovec_t *dx_message_field_iovec(dx_message_t *msg, dx_message_field_t field)
remaining = loc->length;
while (remaining > 0) {
+ if (bufsize > remaining)
+ bufsize = remaining;
dx_iovec_array(iov)[bufcnt].iov_base = base;
dx_iovec_array(iov)[bufcnt].iov_len = bufsize;
bufcnt++;
@@ -808,8 +810,6 @@ dx_iovec_t *dx_message_field_iovec(dx_message_t *msg, dx_message_field_t field)
buf = buf->next;
base = dx_buffer_base(buf);
bufsize = dx_buffer_size(buf);
- if (bufsize > remaining)
- bufsize = remaining;
}
}
@@ -817,6 +817,44 @@ dx_iovec_t *dx_message_field_iovec(dx_message_t *msg, dx_message_field_t field)
}
+ssize_t dx_message_field_length(dx_message_t *msg, dx_message_field_t field)
+{
+ dx_field_location_t *loc = dx_message_field_location(msg, field);
+ if (!loc)
+ return -1;
+
+ return loc->length;
+}
+
+
+ssize_t dx_message_field_copy(dx_message_t *msg, dx_message_field_t field, void *buffer)
+{
+ dx_field_location_t *loc = dx_message_field_location(msg, field);
+ if (!loc)
+ return -1;
+
+ dx_buffer_t *buf = loc->buffer;
+ size_t bufsize = dx_buffer_size(buf) - loc->offset;
+ void *base = dx_buffer_base(buf) + loc->offset;
+ size_t remaining = loc->length;
+
+ while (remaining > 0) {
+ if (bufsize > remaining)
+ bufsize = remaining;
+ memcpy(buffer, base, bufsize);
+ buffer += bufsize;
+ remaining -= bufsize;
+ if (remaining > 0) {
+ buf = buf->next;
+ base = dx_buffer_base(buf);
+ bufsize = dx_buffer_size(buf);
+ }
+ }
+
+ return loc->length;
+}
+
+
void dx_message_compose_1(dx_message_t *msg, const char *to, dx_buffer_list_t *buffers)
{
dx_message_begin_header(msg);
diff --git a/qpid/extras/dispatch/tests/message_test.c b/qpid/extras/dispatch/tests/message_test.c
index 590b7f6ed7..84ec06c0c3 100644
--- a/qpid/extras/dispatch/tests/message_test.c
+++ b/qpid/extras/dispatch/tests/message_test.c
@@ -72,6 +72,16 @@ static char* test_receive_from_messenger(void *context)
if (!dx_field_iterator_equal(iter, (unsigned char*) "test_addr_1"))
return "Mismatched 'to' field contents";
+ ssize_t test_len = dx_message_field_length(msg, DX_FIELD_TO);
+ if (test_len != 11) return "Incorrect field length";
+
+ char test_field[15];
+ test_len = dx_message_field_copy(msg, DX_FIELD_TO, test_field);
+ if (test_len != 11) return "Incorrect length returned from field_copy";
+ test_field[test_len] = '\0';
+ if (strcmp(test_field, "test_addr_1") != 0)
+ return "Incorrect field content returned from field_copy";
+
pn_message_free(pn_msg);
dx_free_message(msg);