diff options
Diffstat (limited to 'qpid/extras/dispatch/src')
| -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); |
