diff options
| author | Ted Ross <tross@apache.org> | 2013-02-28 22:28:41 +0000 |
|---|---|---|
| committer | Ted Ross <tross@apache.org> | 2013-02-28 22:28:41 +0000 |
| commit | 6df331f948acb5e04461f0bb3edd7e6e616aa996 (patch) | |
| tree | d438482af5cb3c67cbc689e7843b8549904b0698 | |
| parent | 814d2a1f90622cfa7f5a6ccf6dce25f9b6788368 (diff) | |
| download | qpid-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.h | 3 | ||||
| -rw-r--r-- | qpid/extras/dispatch/src/message.c | 42 | ||||
| -rw-r--r-- | qpid/extras/dispatch/tests/message_test.c | 10 |
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); |
