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 /qpid/extras/dispatch/src/message.c | |
| 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
Diffstat (limited to 'qpid/extras/dispatch/src/message.c')
| -rw-r--r-- | qpid/extras/dispatch/src/message.c | 42 |
1 files changed, 40 insertions, 2 deletions
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); |
