summaryrefslogtreecommitdiff
path: root/qpid/extras/dispatch/src/message.c
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 /qpid/extras/dispatch/src/message.c
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
Diffstat (limited to 'qpid/extras/dispatch/src/message.c')
-rw-r--r--qpid/extras/dispatch/src/message.c42
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);